- File:
-
- 1 edited
-
src/ResolvExpr/CandidateFinder.cpp (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/CandidateFinder.cpp
racb33f15 rc92bdcc 17 17 18 18 #include <deque> 19 #include <iterator> // for back_inserter19 #include <iterator> // for back_inserter 20 20 #include <sstream> 21 21 #include <string> … … 25 25 #include "AdjustExprType.hpp" 26 26 #include "Candidate.hpp" 27 #include "CastCost.hpp" // for castCost27 #include "CastCost.hpp" // for castCost 28 28 #include "CompilationState.hpp" 29 #include "ConversionCost.h " // for conversionCast30 #include "Cost.h "29 #include "ConversionCost.hpp" // for conversionCast 30 #include "Cost.hpp" 31 31 #include "ExplodedArg.hpp" 32 32 #include "PolyCost.hpp" 33 #include "RenameVars.h " // for renameTyVars34 #include "Resolver.h "35 #include "ResolveTypeof.h "33 #include "RenameVars.hpp" // for renameTyVars 34 #include "Resolver.hpp" 35 #include "ResolveTypeof.hpp" 36 36 #include "SatisfyAssertions.hpp" 37 37 #include "SpecCost.hpp" 38 #include " typeops.h" // for combos39 #include "Unify.h "40 #include "WidenMode.h "38 #include "Typeops.hpp" // for combos 39 #include "Unify.hpp" 40 #include "WidenMode.hpp" 41 41 #include "AST/Expr.hpp" 42 42 #include "AST/Node.hpp" … … 45 45 #include "AST/SymbolTable.hpp" 46 46 #include "AST/Type.hpp" 47 #include "Common/ utility.h" // for move, copy48 #include "SymTab/Mangler.h "49 #include "Tuples/Tuples.h " // for handleTupleAssignment50 #include "InitTweak/InitTweak.h " // for getPointerBase51 52 #include "Common/Stats/Counter.h "47 #include "Common/Utility.hpp" // for move, copy 48 #include "SymTab/Mangler.hpp" 49 #include "Tuples/Tuples.hpp" // for handleTupleAssignment 50 #include "InitTweak/InitTweak.hpp" // for getPointerBase 51 52 #include "Common/Stats/Counter.hpp" 53 53 54 54 #include "AST/Inspect.hpp" // for getFunctionName … … 906 906 } 907 907 CandidateRef & choice = winners.front(); 908 choice->cost = Cost::unsafe;908 choice->cost.incSafe(); 909 909 candidates.emplace_back( std::move(choice) ); 910 910 } … … 955 955 956 956 CandidateFinder funcFinder( context, tenv ); 957 std::string funcName;958 957 if (auto nameExpr = untypedExpr->func.as<ast::NameExpr>()) { 959 funcName = nameExpr->name;960 958 auto kind = ast::SymbolTable::getSpecialFunctionKind(nameExpr->name); 961 959 if (kind != ast::SymbolTable::SpecialFunctionKind::NUMBER_OF_KINDS) { … … 1021 1019 CandidateList found; 1022 1020 SemanticErrorException errors; 1023 1024 1021 for ( CandidateRef & func : funcFinder ) { 1025 1022 try { … … 1096 1093 Cost cvtCost = computeApplicationConversionCost( withFunc, symtab ); 1097 1094 1098 if (funcName == "?|?") {1099 1095 PRINT( 1100 1096 auto appExpr = withFunc->expr.strict_as< ast::ApplicationExpr >(); … … 1112 1108 std::cerr << "cost of conversion is:" << cvtCost << std::endl; 1113 1109 ) 1114 } 1110 1115 1111 if ( cvtCost != Cost::infinity ) { 1116 1112 withFunc->cvtCost = cvtCost; … … 1778 1774 matches.clear(); 1779 1775 } 1780 CandidateRef newCand = std::make_shared<Candidate>( 1781 new ast::InitExpr{ 1782 initExpr->location, 1783 restructureCast( cand->expr, toType ), 1784 initAlt.designation }, 1785 std::move(env), std::move( open ), std::move( need ), cand->cost + thisCost ); 1786 // currently assertions are always resolved immediately so this should have no effect. 1787 // if this somehow changes in the future (e.g. delayed by indeterminate return type) 1788 // we may need to revisit the logic. 1789 inferParameters( newCand, matches ); 1776 // ambiguous case, still output candidates to print in error message 1777 if ( cand->cost == minExprCost && thisCost == minCastCost ) { 1778 auto commonAsEnumAttr = common.as<ast::EnumAttrType>(); 1779 if ( commonAsEnumAttr && commonAsEnumAttr->attr == ast::EnumAttribute::Value ) { 1780 auto callExpr = new ast::UntypedExpr( 1781 cand->expr->location, new ast::NameExpr( cand->expr->location, "valueE"), {cand->expr} ); 1782 CandidateFinder finder( context, env ); 1783 finder.find( callExpr ); 1784 CandidateList winners = findMinCost( finder.candidates ); 1785 if (winners.size() != 1) { 1786 SemanticError( callExpr, "Ambiguous expression in valueE..." ); 1787 } 1788 CandidateRef & choice = winners.front(); 1789 // assert( valueCall->result ); 1790 CandidateRef newCand = std::make_shared<Candidate>( 1791 new ast::InitExpr{ 1792 initExpr->location, 1793 // restructureCast( cand->expr, toType ), 1794 choice->expr, 1795 initAlt.designation }, 1796 std::move(env), std::move( open ), std::move( need ), cand->cost + thisCost ); 1797 inferParameters( newCand, matches ); 1798 } else { 1799 CandidateRef newCand = std::make_shared<Candidate>( 1800 new ast::InitExpr{ 1801 initExpr->location, 1802 restructureCast( cand->expr, toType ), 1803 initAlt.designation }, 1804 std::move(env), std::move( open ), std::move( need ), cand->cost + thisCost ); 1805 // currently assertions are always resolved immediately so this should have no effect. 1806 // if this somehow changes in the future (e.g. delayed by indeterminate return type) 1807 // we may need to revisit the logic. 1808 inferParameters( newCand, matches ); 1809 } 1810 } 1790 1811 } 1791 1812 }
Note:
See TracChangeset
for help on using the changeset viewer.