- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/CandidateFinder.cpp
rcdb4eaa 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 } … … 1382 1400 } 1383 1401 } 1384 1402 1385 1403 CandidateRef newCand = std::make_shared<Candidate>( 1386 1404 newExpr, copy( tenv ), ast::OpenVarSet{}, ast::AssertionSet{}, bentConversion? Cost::safe: Cost::zero, … … 1776 1794 auto commonAsEnumAttr = common.as<ast::EnumAttrType>(); 1777 1795 if ( commonAsEnumAttr && commonAsEnumAttr->attr == ast::EnumAttribute::Value ) { 1778 1779 1796 auto callExpr = new ast::UntypedExpr( 1780 1797 cand->expr->location, new ast::NameExpr( cand->expr->location, "valueE"), {cand->expr} ); … … 1783 1800 CandidateList winners = findMinCost( finder.candidates ); 1784 1801 if (winners.size() != 1) { 1785 SemanticError( callExpr, "Ambiguous expression in valueE ..." );1802 SemanticError( callExpr, "Ambiguous expression in valueE" ); 1786 1803 } 1787 1804 CandidateRef & choice = winners.front(); … … 1805 1822 // if this somehow changes in the future (e.g. delayed by indeterminate return type) 1806 1823 // we may need to revisit the logic. 1807 inferParameters( newCand, matches ); 1824 inferParameters( newCand, matches ); 1808 1825 } 1809 } 1810 } 1826 } 1827 } 1811 1828 } 1812 1829 } … … 2133 2150 } 2134 2151 2135 // get the valueE(...) ApplicationExpr that returns the enum value 2136 const ast::Expr * getValueEnumCall( 2137 const ast::Expr * expr, 2138 const ResolvExpr::ResolveContext & context, const ast::TypeEnvironment & env ) { 2139 auto callExpr = new ast::UntypedExpr( 2140 expr->location, new ast::NameExpr( expr->location, "valueE"), {expr} ); 2141 CandidateFinder finder( context, env ); 2142 finder.find( callExpr ); 2143 CandidateList winners = findMinCost( finder.candidates ); 2144 if (winners.size() != 1) { 2145 SemanticError( callExpr, "Ambiguous expression in valueE..." ); 2146 } 2147 CandidateRef & choice = winners.front(); 2148 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; 2149 2164 } 2150 2165 … … 2161 2176 } 2162 2177 ), 2163 new ast::BasicType( ast::Basic Type::SignedInt )2178 new ast::BasicType( ast::BasicKind::SignedInt ) 2164 2179 ); 2165 2180 }
Note:
See TracChangeset
for help on using the changeset viewer.