Changeset ac1ed49 for src/ResolvExpr
- Timestamp:
- Feb 25, 2016, 5:14:15 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, string, with_gc
- Children:
- 33e6a2cc, 90c3b1c, c14cff1
- Parents:
- 41a2620 (diff), 44b7088 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- src/ResolvExpr
- Files:
-
- 1 added
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified src/ResolvExpr/AdjustExprType.cc ¶
r41a2620 rac1ed49 36 36 virtual Type* mutate( TypeInstType *aggregateUseType ); 37 37 virtual Type* mutate( TupleType *tupleType ); 38 virtual Type* mutate( VarArgsType *varArgsType ); 38 39 39 40 const TypeEnvironment &env; … … 111 112 return tupleType; 112 113 } 114 115 Type *AdjustExprType::mutate( VarArgsType *varArgsType ) { 116 return varArgsType; 117 } 113 118 } // namespace ResolvExpr 114 119 -
TabularUnified src/ResolvExpr/AlternativeFinder.cc ¶
r41a2620 rac1ed49 572 572 573 573 AltList candidates; 574 SemanticError errors; 574 575 575 576 for ( AltList::const_iterator func = funcFinder.alternatives.begin(); func != funcFinder.alternatives.end(); ++func ) { 576 PRINT( 577 std::cerr << "working on alternative: " << std::endl; 578 func->print( std::cerr, 8 ); 579 ) 580 // check if the type is pointer to function 581 PointerType *pointer; 582 if ( func->expr->get_results().size() == 1 && ( pointer = dynamic_cast< PointerType* >( func->expr->get_results().front() ) ) ) { 583 if ( FunctionType *function = dynamic_cast< FunctionType* >( pointer->get_base() ) ) { 584 for ( std::list< AltList >::iterator actualAlt = possibilities.begin(); actualAlt != possibilities.end(); ++actualAlt ) { 585 // XXX 586 //Designators::check_alternative( function, *actualAlt ); 587 makeFunctionAlternatives( *func, function, *actualAlt, std::back_inserter( candidates ) ); 588 } 589 } else if ( TypeInstType *typeInst = dynamic_cast< TypeInstType* >( pointer->get_base() ) ) { 590 EqvClass eqvClass; 591 if ( func->env.lookup( typeInst->get_name(), eqvClass ) && eqvClass.type ) { 592 if ( FunctionType *function = dynamic_cast< FunctionType* >( eqvClass.type ) ) { 593 for ( std::list< AltList >::iterator actualAlt = possibilities.begin(); actualAlt != possibilities.end(); ++actualAlt ) { 594 makeFunctionAlternatives( *func, function, *actualAlt, std::back_inserter( candidates ) ); 595 } // for 577 try { 578 PRINT( 579 std::cerr << "working on alternative: " << std::endl; 580 func->print( std::cerr, 8 ); 581 ) 582 // check if the type is pointer to function 583 PointerType *pointer; 584 if ( func->expr->get_results().size() == 1 && ( pointer = dynamic_cast< PointerType* >( func->expr->get_results().front() ) ) ) { 585 if ( FunctionType *function = dynamic_cast< FunctionType* >( pointer->get_base() ) ) { 586 for ( std::list< AltList >::iterator actualAlt = possibilities.begin(); actualAlt != possibilities.end(); ++actualAlt ) { 587 // XXX 588 //Designators::check_alternative( function, *actualAlt ); 589 makeFunctionAlternatives( *func, function, *actualAlt, std::back_inserter( candidates ) ); 590 } 591 } else if ( TypeInstType *typeInst = dynamic_cast< TypeInstType* >( pointer->get_base() ) ) { 592 EqvClass eqvClass; 593 if ( func->env.lookup( typeInst->get_name(), eqvClass ) && eqvClass.type ) { 594 if ( FunctionType *function = dynamic_cast< FunctionType* >( eqvClass.type ) ) { 595 for ( std::list< AltList >::iterator actualAlt = possibilities.begin(); actualAlt != possibilities.end(); ++actualAlt ) { 596 makeFunctionAlternatives( *func, function, *actualAlt, std::back_inserter( candidates ) ); 597 } // for 598 } // if 596 599 } // if 597 600 } // if 601 } else { 602 // seek a function operator that's compatible 603 if ( ! doneInit ) { 604 doneInit = true; 605 NameExpr *opExpr = new NameExpr( "?()" ); 606 try { 607 funcOpFinder.findWithAdjustment( opExpr ); 608 } catch( SemanticError &e ) { 609 // it's ok if there aren't any defined function ops 610 } 611 PRINT( 612 std::cerr << "known function ops:" << std::endl; 613 printAlts( funcOpFinder.alternatives, std::cerr, 8 ); 614 ) 615 } 616 617 for ( AltList::const_iterator funcOp = funcOpFinder.alternatives.begin(); funcOp != funcOpFinder.alternatives.end(); ++funcOp ) { 618 // check if the type is pointer to function 619 PointerType *pointer; 620 if ( funcOp->expr->get_results().size() == 1 621 && ( pointer = dynamic_cast< PointerType* >( funcOp->expr->get_results().front() ) ) ) { 622 if ( FunctionType *function = dynamic_cast< FunctionType* >( pointer->get_base() ) ) { 623 for ( std::list< AltList >::iterator actualAlt = possibilities.begin(); actualAlt != possibilities.end(); ++actualAlt ) { 624 AltList currentAlt; 625 currentAlt.push_back( *func ); 626 currentAlt.insert( currentAlt.end(), actualAlt->begin(), actualAlt->end() ); 627 makeFunctionAlternatives( *funcOp, function, currentAlt, std::back_inserter( candidates ) ); 628 } // for 629 } // if 630 } // if 631 } // for 598 632 } // if 599 } else { 600 // seek a function operator that's compatible 601 if ( ! doneInit ) { 602 doneInit = true; 603 NameExpr *opExpr = new NameExpr( "?()" ); 604 try { 605 funcOpFinder.findWithAdjustment( opExpr ); 606 } catch( SemanticError &e ) { 607 // it's ok if there aren't any defined function ops 608 } 609 PRINT( 610 std::cerr << "known function ops:" << std::endl; 611 printAlts( funcOpFinder.alternatives, std::cerr, 8 ); 612 ) 613 } 614 615 for ( AltList::const_iterator funcOp = funcOpFinder.alternatives.begin(); funcOp != funcOpFinder.alternatives.end(); ++funcOp ) { 616 // check if the type is pointer to function 617 PointerType *pointer; 618 if ( funcOp->expr->get_results().size() == 1 619 && ( pointer = dynamic_cast< PointerType* >( funcOp->expr->get_results().front() ) ) ) { 620 if ( FunctionType *function = dynamic_cast< FunctionType* >( pointer->get_base() ) ) { 621 for ( std::list< AltList >::iterator actualAlt = possibilities.begin(); actualAlt != possibilities.end(); ++actualAlt ) { 622 AltList currentAlt; 623 currentAlt.push_back( *func ); 624 currentAlt.insert( currentAlt.end(), actualAlt->begin(), actualAlt->end() ); 625 makeFunctionAlternatives( *funcOp, function, currentAlt, std::back_inserter( candidates ) ); 626 } // for 627 } // if 628 } // if 629 } // for 630 } // if 631 } // for 633 } catch ( SemanticError &e ) { 634 errors.append( e ); 635 } 636 } // for 637 638 // Implement SFINAE; resolution errors are only errors if there aren't any non-erroneous resolutions 639 if ( candidates.empty() && ! errors.isEmpty() ) { throw errors; } 632 640 633 641 for ( AltList::iterator withFunc = candidates.begin(); withFunc != candidates.end(); ++withFunc ) { -
TabularUnified src/ResolvExpr/CommonType.cc ¶
r41a2620 rac1ed49 38 38 virtual void visit( TypeInstType *aggregateUseType ); 39 39 virtual void visit( TupleType *tupleType ); 40 virtual void visit( VarArgsType *varArgsType ); 40 41 41 42 template< typename RefType > void handleRefType( RefType *inst, Type *other ); … … 213 214 void CommonType::visit( TupleType *tupleType ) { 214 215 } 216 217 void CommonType::visit( VarArgsType *varArgsType ) { 218 } 215 219 } // namespace ResolvExpr 216 220 -
TabularUnified src/ResolvExpr/ConversionCost.cc ¶
r41a2620 rac1ed49 247 247 } // if 248 248 } 249 250 void ConversionCost::visit(VarArgsType *varArgsType) { 251 if ( VarArgsType *destAsVarArgs = dynamic_cast< VarArgsType* >( dest ) ) { 252 cost = Cost::zero; 253 } 254 } 249 255 } // namespace ResolvExpr 250 256 -
TabularUnified src/ResolvExpr/ConversionCost.h ¶
r41a2620 rac1ed49 40 40 virtual void visit(TypeInstType *aggregateUseType); 41 41 virtual void visit(TupleType *tupleType); 42 virtual void visit(VarArgsType *varArgsType); 42 43 protected: 43 44 Type *dest; -
TabularUnified src/ResolvExpr/PtrsAssignable.cc ¶
r41a2620 rac1ed49 38 38 virtual void visit( TypeInstType *inst ); 39 39 virtual void visit( TupleType *tupleType ); 40 virtual void visit( VarArgsType *varArgsType ); 40 41 private: 41 42 Type *dest; … … 137 138 /// } 138 139 } 140 141 void PtrsAssignable::visit( VarArgsType *varArgsType ) { 142 } 139 143 } // namespace ResolvExpr 140 144 -
TabularUnified src/ResolvExpr/PtrsCastable.cc ¶
r41a2620 rac1ed49 39 39 virtual void visit(TypeInstType *inst); 40 40 virtual void visit(TupleType *tupleType); 41 virtual void visit(VarArgsType *varArgsType); 41 42 private: 42 43 Type *dest; … … 139 140 result = objectCast( dest, env, indexer ); 140 141 } 142 143 void PtrsCastable::visit(VarArgsType *varArgsType) { 144 result = objectCast( dest, env, indexer ); 145 } 141 146 } // namespace ResolvExpr 142 147 -
TabularUnified src/ResolvExpr/RenameVars.cc ¶
r41a2620 rac1ed49 113 113 } 114 114 115 void RenameVars::visit( VarArgsType *varArgsType ) { 116 typeBefore( varArgsType ); 117 typeAfter( varArgsType ); 118 } 119 115 120 void RenameVars::typeBefore( Type *type ) { 116 121 if ( ! type->get_forall().empty() ) { -
TabularUnified src/ResolvExpr/RenameVars.h ¶
r41a2620 rac1ed49 43 43 virtual void visit( TypeInstType *aggregateUseType ); 44 44 virtual void visit( TupleType *tupleType ); 45 virtual void visit( VarArgsType *varArgsType ); 45 46 46 47 void typeBefore( Type *type ); -
TabularUnified src/ResolvExpr/Unify.cc ¶
r41a2620 rac1ed49 59 59 virtual void visit(TypeInstType *aggregateUseType); 60 60 virtual void visit(TupleType *tupleType); 61 virtual void visit(VarArgsType *varArgsType); 61 62 62 63 template< typename RefType > void handleRefType( RefType *inst, Type *other ); … … 583 584 } 584 585 586 void Unify::visit(VarArgsType *varArgsType) { 587 result = dynamic_cast< VarArgsType* >( type2 ); 588 } 589 585 590 } // namespace ResolvExpr 586 591
Note: See TracChangeset
for help on using the changeset viewer.