Changeset 6ccfb7f
- Timestamp:
- Aug 25, 2017, 1:51:22 PM (7 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 62a05d1
- Parents:
- 07516b56
- git-author:
- Rob Schluntz <rschlunt@…> (08/25/17 13:51:12)
- git-committer:
- Rob Schluntz <rschlunt@…> (08/25/17 13:51:22)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/AlternativeFinder.cc
r07516b56 r6ccfb7f 698 698 699 699 void AlternativeFinder::visit( UntypedExpr *untypedExpr ) { 700 bool doneInit = false;701 AlternativeFinder funcOpFinder( indexer, env );702 703 AlternativeFinder funcFinder( indexer, env );704 705 700 { 706 701 std::string fname = InitTweak::getFunctionName( untypedExpr ); … … 715 710 } 716 711 712 AlternativeFinder funcFinder( indexer, env ); 717 713 funcFinder.findWithAdjustment( untypedExpr->get_function() ); 714 // if there are no function alternatives, then proceeding is a waste of time. 715 if ( funcFinder.alternatives.empty() ) return; 716 718 717 std::list< AlternativeFinder > argAlternatives; 719 718 findSubExprs( untypedExpr->begin_args(), untypedExpr->end_args(), back_inserter( argAlternatives ) ); … … 725 724 // if not tuple assignment, assignment is taken care of as a normal function call 726 725 Tuples::handleTupleAssignment( *this, untypedExpr, possibilities ); 726 727 // find function operators 728 AlternativeFinder funcOpFinder( indexer, env ); 729 NameExpr *opExpr = new NameExpr( "?()" ); 730 try { 731 funcOpFinder.findWithAdjustment( opExpr ); 732 } catch( SemanticError &e ) { 733 // it's ok if there aren't any defined function ops 734 } 735 PRINT( 736 std::cerr << "known function ops:" << std::endl; 737 printAlts( funcOpFinder.alternatives, std::cerr, 8 ); 738 ) 727 739 728 740 AltList candidates; … … 754 766 } // if 755 767 } // if 756 } else { 757 // seek a function operator that's compatible 758 if ( ! doneInit ) { 759 doneInit = true; 760 NameExpr *opExpr = new NameExpr( "?()" ); 761 try { 762 funcOpFinder.findWithAdjustment( opExpr ); 763 } catch( SemanticError &e ) { 764 // it's ok if there aren't any defined function ops 765 } 766 PRINT( 767 std::cerr << "known function ops:" << std::endl; 768 printAlts( funcOpFinder.alternatives, std::cerr, 8 ); 769 ) 770 } 771 772 for ( AltList::iterator funcOp = funcOpFinder.alternatives.begin(); funcOp != funcOpFinder.alternatives.end(); ++funcOp ) { 773 // check if the type is pointer to function 774 if ( PointerType *pointer = dynamic_cast< PointerType* >( funcOp->expr->get_result()->stripReferences() ) ) { 775 if ( FunctionType *function = dynamic_cast< FunctionType* >( pointer->get_base() ) ) { 776 referenceToRvalueConversion( funcOp->expr ); 777 for ( std::list< AltList >::iterator actualAlt = possibilities.begin(); actualAlt != possibilities.end(); ++actualAlt ) { 778 AltList currentAlt; 779 currentAlt.push_back( *func ); 780 currentAlt.insert( currentAlt.end(), actualAlt->begin(), actualAlt->end() ); 781 makeFunctionAlternatives( *funcOp, function, currentAlt, std::back_inserter( candidates ) ); 782 } // for 783 } // if 768 } 769 770 // try each function operator ?() with the current function alternative and each of the argument combinations 771 for ( AltList::iterator funcOp = funcOpFinder.alternatives.begin(); funcOp != funcOpFinder.alternatives.end(); ++funcOp ) { 772 // check if the type is pointer to function 773 if ( PointerType *pointer = dynamic_cast< PointerType* >( funcOp->expr->get_result()->stripReferences() ) ) { 774 if ( FunctionType *function = dynamic_cast< FunctionType* >( pointer->get_base() ) ) { 775 referenceToRvalueConversion( funcOp->expr ); 776 for ( std::list< AltList >::iterator actualAlt = possibilities.begin(); actualAlt != possibilities.end(); ++actualAlt ) { 777 AltList currentAlt; 778 currentAlt.push_back( *func ); 779 currentAlt.insert( currentAlt.end(), actualAlt->begin(), actualAlt->end() ); 780 makeFunctionAlternatives( *funcOp, function, currentAlt, std::back_inserter( candidates ) ); 781 } // for 784 782 } // if 785 } // for786 } // if783 } // if 784 } // for 787 785 } catch ( SemanticError &e ) { 788 786 errors.append( e );
Note: See TracChangeset
for help on using the changeset viewer.