Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/Resolver.cc

    ra9a259c r52f85e0  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // Resolver.cc --
     7// Resolver.cc -- 
    88//
    99// Author           : Richard C. Bilson
    1010// Created On       : Sun May 17 12:17:01 2015
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Thu Jan 14 16:45:32 2016
    13 // Update Count     : 203
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Tue Feb  9 21:57:52 2016
     13// Update Count     : 179
    1414//
    1515
     
    3333          public:
    3434                Resolver() : SymTab::Indexer( false ), switchType( 0 ) {}
    35 
     35 
    3636                virtual void visit( FunctionDecl *functionDecl );
    3737                virtual void visit( ObjectDecl *functionDecl );
     
    5454                virtual void visit( SingleInit *singleInit );
    5555                virtual void visit( ListInit *listInit );
    56                 virtual void visit( ConstructorInit *ctorInit );
    5756          private:
    5857        typedef std::list< Initializer * >::iterator InitIterator;
     
    6059          void resolveAggrInit( AggregateDecl *, InitIterator &, InitIterator & );
    6160          void resolveSingleAggrInit( Declaration *, InitIterator &, InitIterator & );
    62           void fallbackInit( ConstructorInit * ctorInit );
    6361
    6462                std::list< Type * > functionReturn;
     
    9795                        return newExpr;
    9896                }
    99 
     97 
    10098                Expression *findSingleExpression( Expression *untyped, const SymTab::Indexer &indexer ) {
    10199                        TypeEnvironment env;
     
    128126                        } // if
    129127                }
    130 
     128 
    131129                Expression *findIntegralExpression( Expression *untyped, const SymTab::Indexer &indexer ) {
    132130                        TypeEnvironment env;
     
    161159                        return newExpr;
    162160                }
    163 
    164         }
    165 
     161 
     162        }
     163 
    166164        void Resolver::visit( ObjectDecl *objectDecl ) {
    167165                Type *new_type = resolveTypeof( objectDecl->get_type(), *this );
     
    253251                        forStmt->set_condition( newExpr );
    254252                } // if
    255 
     253               
    256254                if ( forStmt->get_increment() ) {
    257255                        Expression * newExpr = findVoidExpression( forStmt->get_increment(), *this );
     
    267265                delete switchStmt->get_condition();
    268266                switchStmt->set_condition( newExpr );
    269 
     267 
    270268                visitor.Visitor::visit( switchStmt );
    271269        }
     
    309307        bool isCharType( T t ) {
    310308                if ( BasicType * bt = dynamic_cast< BasicType * >( t ) ) {
    311                         return bt->get_kind() == BasicType::Char || bt->get_kind() == BasicType::SignedChar ||
     309                        return bt->get_kind() == BasicType::Char || bt->get_kind() == BasicType::SignedChar || 
    312310                                bt->get_kind() == BasicType::UnsignedChar;
    313311                }
     
    321319                                string n = ne->get_name();
    322320                                if (n == "0") {
    323                                         initContext = new BasicType(Type::Qualifiers(),
     321                                        initContext = new BasicType(Type::Qualifiers(), 
    324322                                                                                                BasicType::SignedInt);
    325323                                } else {
     
    327325                                        initContext = decl->get_type();
    328326                                }
    329                         } else if (ConstantExpr * e =
     327                        } else if (ConstantExpr * e = 
    330328                                           dynamic_cast<ConstantExpr*>(singleInit->get_value())) {
    331329                                Constant *c = e->get_constant();
     
    350348                                                        singleInit->set_value( ce->get_arg() );
    351349                                                        ce->set_arg( NULL );
    352                                                         delete ce;
     350                                                        delete ce;                                                                     
    353351                                                }
    354352                                        }
     
    466464#endif
    467465        }
    468 
    469         // ConstructorInit - fall back on C-style initializer
    470         void Resolver::fallbackInit( ConstructorInit * ctorInit ) {
    471                 // could not find valid constructor, or found an intrinsic constructor
    472                 // fall back on C-style initializer
    473                 delete ctorInit->get_ctor();
    474                 ctorInit->set_ctor( NULL );
    475                 maybeAccept( ctorInit->get_init(), *this );
    476         }
    477 
    478         void Resolver::visit( ConstructorInit *ctorInit ) {
    479                 TypeEnvironment env;
    480                 AlternativeFinder finder( *this, env );
    481                 finder.find( ctorInit->get_ctor() );
    482 
    483                 if ( finder.get_alternatives().size() == 0 ) {
    484                         fallbackInit( ctorInit );
    485                 } else if ( finder.get_alternatives().size() == 1 ) {
    486                         Alternative &choice = finder.get_alternatives().front();
    487                         if ( ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( choice.expr ) ) {
    488                                 if ( VariableExpr * function = dynamic_cast< VariableExpr * > ( appExpr->get_function() ) ) {
    489                                         if ( LinkageSpec::isOverridable( function->get_var()->get_linkage() ) ) {
    490                                                 // if the constructor that was found is intrinsic or autogenerated, reset to C-style
    491                                                 // initializer so that code generation is easy to handle
    492                                                 fallbackInit( ctorInit );
    493                                                 return;
    494                                         }
    495                                 }
    496                         }
    497                         // found a constructor - can get rid of C-style initializer
    498                         Expression *newExpr = choice.expr->clone();
    499                         finishExpr( newExpr, choice.env );
    500                         ctorInit->set_ctor( newExpr );
    501                         delete ctorInit->get_init();
    502                         ctorInit->set_init( NULL );
    503                 } else {
    504                         // too many constructors found
    505                         assert(false);
    506                 }
    507         }
    508466} // namespace ResolvExpr
    509467
Note: See TracChangeset for help on using the changeset viewer.