Changeset f1e012b for src/ResolvExpr/Resolver.cc
- Timestamp:
- Jan 19, 2016, 1:28:25 PM (9 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- ca1c11f
- Parents:
- 71f4e4f
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/Resolver.cc
r71f4e4f rf1e012b 10 10 // Created On : Sun May 17 12:17:01 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Jan 13 16:23:51201613 // Update Count : 18612 // Last Modified On : Thu Jan 14 16:45:32 2016 13 // Update Count : 203 14 14 // 15 15 … … 60 60 void resolveAggrInit( AggregateDecl *, InitIterator &, InitIterator & ); 61 61 void resolveSingleAggrInit( Declaration *, InitIterator &, InitIterator & ); 62 void fallbackInit( ConstructorInit * ctorInit ); 62 63 63 64 std::list< Type * > functionReturn; … … 467 468 } 468 469 470 // ConstructorInit - fall back on C-style initializer 471 void Resolver::fallbackInit( ConstructorInit * ctorInit ) { 472 // could not find valid constructor, or found an intrinsic constructor 473 // fall back on C-style initializer 474 delete ctorInit->get_ctor(); 475 ctorInit->set_ctor( NULL ); 476 maybeAccept( ctorInit->get_init(), *this ); 477 } 478 469 479 void Resolver::visit( ConstructorInit *ctorInit ) { 470 480 TypeEnvironment env; 471 481 AlternativeFinder finder( *this, env ); 472 482 finder.find( ctorInit->get_ctor() ); 483 473 484 if ( finder.get_alternatives().size() == 0 ) { 474 // could not find valid constructor 475 delete ctorInit->get_ctor(); 476 ctorInit->set_ctor( NULL ); 477 478 maybeAccept( ctorInit->get_init(), *this ); 485 fallbackInit( ctorInit ); 479 486 } else if ( finder.get_alternatives().size() == 1 ) { 487 Alternative &choice = finder.get_alternatives().front(); 488 if ( ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( choice.expr ) ) { 489 if ( VariableExpr * function = dynamic_cast< VariableExpr * > ( appExpr->get_function() ) ) { 490 if ( function->get_var()->get_linkage() == LinkageSpec::Intrinsic ) { 491 // if the constructor that was found is intrinsic, reset to C-style 492 // initializer so that code generation is easy to handle 493 fallbackInit( ctorInit ); 494 return; 495 } 496 } 497 } 480 498 // found a constructor - can get rid of C-style initializer 481 Alternative &choice = finder.get_alternatives().front();482 499 Expression *newExpr = choice.expr->clone(); 483 500 finishExpr( newExpr, choice.env );
Note: See TracChangeset
for help on using the changeset viewer.