- File:
-
- 1 edited
-
src/ResolvExpr/CandidateFinder.cpp (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/CandidateFinder.cpp
rfc1a3e2 r7a780ad 513 513 // add new result 514 514 assert( common ); 515 // auto attrType = common.as<ast::EnumAttrType>(); 516 // if ( attrType && ( attrType->attr == ast::EnumAttribute::Value ) ) { 517 // auto callExpr = new ast::UntypedExpr( 518 // expr->location, new ast::NameExpr( expr->location, "valueE"), {expr} ); 519 // CandidateFinder finder( context, env ); 520 // finder.find( callExpr ); 521 // CandidateList winners = findMinCost( finder.candidates ); 522 // if (winners.size() != 1) { 523 // SemanticError( callExpr, "Ambiguous expression in valueE" ); 524 // } 525 // CandidateRef & choice = winners.front(); 526 // choice->expr = referenceToRvalueConversion( choice->expr, choice->cost ); 527 528 // results.emplace_back( 529 // i, choice->expr, 530 // std::move( env ), std::move( need ), std::move( have ), std::move( open ), 531 // nextArg + 1, nTuples, expl.cost, expl.exprs.size() == 1 ? 0 : 1, j ); 532 // } else { 515 533 results.emplace_back( 516 534 i, expr, std::move( env ), std::move( need ), std::move( have ), std::move( open ), … … 903 921 CandidateList winners = findMinCost( finder.candidates ); 904 922 if (winners.size() != 1) { 905 SemanticError( callExpr, "Ambiguous expression in valueE ..." );923 SemanticError( callExpr, "Ambiguous expression in valueE" ); 906 924 } 907 925 CandidateRef & choice = winners.front(); 908 choice->cost.incVar();926 // choice->cost.incSafe(); 909 927 candidates.emplace_back( std::move(choice) ); 910 928 } … … 1412 1430 } 1413 1431 1414 void Finder::postvisit(const ast::VariableExpr *variableExpr) {1415 // not sufficient to just pass `variableExpr` here, type might have changed1416 1417 auto cand = new Candidate(variableExpr, tenv);1418 candidates.emplace_back(cand);1419 }1432 void Finder::postvisit(const ast::VariableExpr *variableExpr) { 1433 // not sufficient to just pass `variableExpr` here, type might have changed 1434 1435 auto cand = new Candidate(variableExpr, tenv); 1436 candidates.emplace_back(cand); 1437 } 1420 1438 1421 1439 void Finder::postvisit( const ast::ConstantExpr * constantExpr ) { … … 1782 1800 CandidateList winners = findMinCost( finder.candidates ); 1783 1801 if (winners.size() != 1) { 1784 SemanticError( callExpr, "Ambiguous expression in valueE ..." );1802 SemanticError( callExpr, "Ambiguous expression in valueE" ); 1785 1803 } 1786 1804 CandidateRef & choice = winners.front(); … … 2132 2150 } 2133 2151 2134 // get the valueE(...) ApplicationExpr that returns the enum value 2135 const ast::Expr * getValueEnumCall( 2136 const ast::Expr * expr, 2137 const ResolvExpr::ResolveContext & context, const ast::TypeEnvironment & env ) { 2138 auto callExpr = new ast::UntypedExpr( 2139 expr->location, new ast::NameExpr( expr->location, "valueE"), {expr} ); 2140 CandidateFinder finder( context, env ); 2141 finder.find( callExpr ); 2142 CandidateList winners = findMinCost( finder.candidates ); 2143 if (winners.size() != 1) { 2144 SemanticError( callExpr, "Ambiguous expression in valueE..." ); 2145 } 2146 CandidateRef & choice = winners.front(); 2147 return choice->expr; 2152 const ast::Expr * getValueEnumCall( const ast::Expr * expr, 2153 const ResolveContext & context, const ast::TypeEnvironment & env ) { 2154 auto callExpr = new ast::UntypedExpr( 2155 expr->location, new ast::NameExpr( expr->location, "valueE"), {expr} ); 2156 CandidateFinder finder( context, env ); 2157 finder.find( callExpr ); 2158 CandidateList winners = findMinCost( finder.candidates ); 2159 if (winners.size() != 1) { 2160 SemanticError( callExpr, "Ambiguous expression in valueE" ); 2161 } 2162 CandidateRef & choice = winners.front(); 2163 return choice->expr; 2148 2164 } 2149 2165
Note:
See TracChangeset
for help on using the changeset viewer.