- File:
-
- 1 edited
-
src/ResolvExpr/AlternativeFinder.cc (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/AlternativeFinder.cc
rb6d6e97 r33a25f9 144 144 expr->get_result()->accept( global_renamer ); 145 145 } 146 147 void referenceToRvalueConversion( Expression *& expr ) { 148 if ( dynamic_cast< ReferenceType * >( expr->get_result() ) ) { 149 // cast away reference from expr 150 expr = new CastExpr( expr, expr->get_result()->stripReferences()->clone() ); 151 } 152 } 146 153 } // namespace 147 148 void referenceToRvalueConversion( Expression *& expr ) {149 if ( dynamic_cast< ReferenceType * >( expr->get_result() ) ) {150 // cast away reference from expr151 expr = new CastExpr( expr, expr->get_result()->stripReferences()->clone() );152 }153 }154 154 155 155 template< typename InputIterator, typename OutputIterator > … … 174 174 } 175 175 176 void AlternativeFinder::find( Expression *expr, bool adjust, bool prune , bool failFast) {176 void AlternativeFinder::find( Expression *expr, bool adjust, bool prune ) { 177 177 expr->accept( *this ); 178 if ( failFast &&alternatives.empty() ) {178 if ( alternatives.empty() ) { 179 179 throw SemanticError( "No reasonable alternatives for expression ", expr ); 180 180 } … … 191 191 AltList::iterator oldBegin = alternatives.begin(); 192 192 pruneAlternatives( alternatives.begin(), alternatives.end(), front_inserter( alternatives ) ); 193 if ( failFast &&alternatives.begin() == oldBegin ) {193 if ( alternatives.begin() == oldBegin ) { 194 194 std::ostringstream stream; 195 195 AltList winners; … … 214 214 } 215 215 216 void AlternativeFinder::findWithAdjustment( Expression *expr ) { 217 find( expr, true ); 218 } 219 220 void AlternativeFinder::findWithoutPrune( Expression * expr ) { 221 find( expr, true, false ); 222 } 223 224 void AlternativeFinder::maybeFind( Expression * expr ) { 225 find( expr, true, true, false ); 216 void AlternativeFinder::findWithAdjustment( Expression *expr, bool prune ) { 217 find( expr, true, prune ); 226 218 } 227 219 … … 722 714 723 715 // find function operators 724 static NameExpr *opExpr = new NameExpr( "?()" );725 716 AlternativeFinder funcOpFinder( indexer, env ); 726 // it's ok if there aren't any defined function ops 727 funcOpFinder.maybeFind( opExpr); 717 NameExpr *opExpr = new NameExpr( "?()" ); 718 try { 719 funcOpFinder.findWithAdjustment( opExpr ); 720 } catch( SemanticError &e ) { 721 // it's ok if there aren't any defined function ops 722 } 728 723 PRINT( 729 724 std::cerr << "known function ops:" << std::endl; … … 933 928 AlternativeFinder finder( indexer, env ); 934 929 // don't prune here, since it's guaranteed all alternatives will have the same type 935 finder.findWithoutPrune( castExpr->get_arg() ); 930 // (giving the alternatives different types is half of the point of ConstructorExpr nodes) 931 finder.findWithAdjustment( castExpr->get_arg(), false ); 936 932 for ( Alternative & alt : finder.alternatives ) { 937 933 alternatives.push_back( Alternative( … … 1230 1226 // don't prune here, since it's guaranteed all alternatives will have the same type 1231 1227 // (giving the alternatives different types is half of the point of ConstructorExpr nodes) 1232 finder.findWith outPrune( ctorExpr->get_callExpr());1228 finder.findWithAdjustment( ctorExpr->get_callExpr(), false ); 1233 1229 for ( Alternative & alt : finder.alternatives ) { 1234 1230 alternatives.push_back( Alternative( new ConstructorExpr( alt.expr->clone() ), alt.env, alt.cost ) );
Note:
See TracChangeset
for help on using the changeset viewer.