Changes in src/ResolvExpr/Resolver.cc [52f85e0:a9a259c]
- File:
-
- 1 edited
-
src/ResolvExpr/Resolver.cc (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/Resolver.cc
r52f85e0 ra9a259c 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Resolver.cc -- 7 // Resolver.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 12:17:01 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : T ue Feb 9 21:57:52 201613 // Update Count : 17911 // Last Modified By : Rob Schluntz 12 // Last Modified On : Thu Jan 14 16:45:32 2016 13 // Update Count : 203 14 14 // 15 15 … … 33 33 public: 34 34 Resolver() : SymTab::Indexer( false ), switchType( 0 ) {} 35 35 36 36 virtual void visit( FunctionDecl *functionDecl ); 37 37 virtual void visit( ObjectDecl *functionDecl ); … … 54 54 virtual void visit( SingleInit *singleInit ); 55 55 virtual void visit( ListInit *listInit ); 56 virtual void visit( ConstructorInit *ctorInit ); 56 57 private: 57 58 typedef std::list< Initializer * >::iterator InitIterator; … … 59 60 void resolveAggrInit( AggregateDecl *, InitIterator &, InitIterator & ); 60 61 void resolveSingleAggrInit( Declaration *, InitIterator &, InitIterator & ); 62 void fallbackInit( ConstructorInit * ctorInit ); 61 63 62 64 std::list< Type * > functionReturn; … … 95 97 return newExpr; 96 98 } 97 99 98 100 Expression *findSingleExpression( Expression *untyped, const SymTab::Indexer &indexer ) { 99 101 TypeEnvironment env; … … 126 128 } // if 127 129 } 128 130 129 131 Expression *findIntegralExpression( Expression *untyped, const SymTab::Indexer &indexer ) { 130 132 TypeEnvironment env; … … 159 161 return newExpr; 160 162 } 161 162 } 163 163 164 } 165 164 166 void Resolver::visit( ObjectDecl *objectDecl ) { 165 167 Type *new_type = resolveTypeof( objectDecl->get_type(), *this ); … … 251 253 forStmt->set_condition( newExpr ); 252 254 } // if 253 255 254 256 if ( forStmt->get_increment() ) { 255 257 Expression * newExpr = findVoidExpression( forStmt->get_increment(), *this ); … … 265 267 delete switchStmt->get_condition(); 266 268 switchStmt->set_condition( newExpr ); 267 269 268 270 visitor.Visitor::visit( switchStmt ); 269 271 } … … 307 309 bool isCharType( T t ) { 308 310 if ( BasicType * bt = dynamic_cast< BasicType * >( t ) ) { 309 return bt->get_kind() == BasicType::Char || bt->get_kind() == BasicType::SignedChar || 311 return bt->get_kind() == BasicType::Char || bt->get_kind() == BasicType::SignedChar || 310 312 bt->get_kind() == BasicType::UnsignedChar; 311 313 } … … 319 321 string n = ne->get_name(); 320 322 if (n == "0") { 321 initContext = new BasicType(Type::Qualifiers(), 323 initContext = new BasicType(Type::Qualifiers(), 322 324 BasicType::SignedInt); 323 325 } else { … … 325 327 initContext = decl->get_type(); 326 328 } 327 } else if (ConstantExpr * e = 329 } else if (ConstantExpr * e = 328 330 dynamic_cast<ConstantExpr*>(singleInit->get_value())) { 329 331 Constant *c = e->get_constant(); … … 348 350 singleInit->set_value( ce->get_arg() ); 349 351 ce->set_arg( NULL ); 350 delete ce; 352 delete ce; 351 353 } 352 354 } … … 464 466 #endif 465 467 } 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 } 466 508 } // namespace ResolvExpr 467 509
Note:
See TracChangeset
for help on using the changeset viewer.