Changeset 5b643ea for src/ResolvExpr
- Timestamp:
- Aug 16, 2024, 12:06:25 PM (17 months ago)
- Branches:
- master
- Children:
- afb15cf
- Parents:
- cef5bfc (diff), 8da3cc4d (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - File:
-
- 1 edited
-
src/ResolvExpr/CandidateFinder.cpp (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/CandidateFinder.cpp
rcef5bfc r5b643ea 1241 1241 Cost minCastCost = Cost::infinity; 1242 1242 for ( CandidateRef & cand : finder.candidates ) { 1243 ast::ptr< ast::Type > fromType = cand->expr->result; 1244 assert( fromType ); 1245 fromType = resolveTypeof( fromType, context ); 1246 fromType = adjustExprType( fromType, tenv, symtab ); 1247 1243 1248 ast::AssertionSet need( cand->need.begin(), cand->need.end() ), have; 1244 1249 ast::OpenVarSet open( cand->open ); … … 1250 1255 // subexpression results that are cast directly. The candidate is invalid if it 1251 1256 // has fewer results than there are types to cast to. 1252 int discardedValues = cand->expr->result->size() - toType->size();1257 int discardedValues = fromType->size() - toType->size(); 1253 1258 if ( discardedValues < 0 ) continue; 1254 1259 1255 1260 // unification run for side-effects 1256 unify( toType, cand->expr->result, cand->env, need, have, open );1261 unify( toType, fromType, cand->env, need, have, open ); 1257 1262 Cost thisCost = 1258 1263 (castExpr->isGenerated == ast::GeneratedFlag::GeneratedCast) 1259 ? conversionCost( cand->expr->result, toType, cand->expr->get_lvalue(), symtab, cand->env )1260 : castCost( cand->expr->result, toType, cand->expr->get_lvalue(), symtab, cand->env );1264 ? conversionCost( fromType, toType, cand->expr->get_lvalue(), symtab, cand->env ) 1265 : castCost( fromType, toType, cand->expr->get_lvalue(), symtab, cand->env ); 1261 1266 1262 1267 // Redefine enum cast 1263 auto argAsEnum = cand->expr->result.as<ast::EnumInstType>();1268 auto argAsEnum = fromType.as<ast::EnumInstType>(); 1264 1269 auto toAsEnum = toType.as<ast::EnumInstType>(); 1265 1270 if ( argAsEnum && toAsEnum && argAsEnum->name != toAsEnum->name ) { … … 1272 1277 PRINT( 1273 1278 std::cerr << "working on cast with result: " << toType << std::endl; 1274 std::cerr << "and expr type: " << cand->expr->result<< std::endl;1279 std::cerr << "and expr type: " << fromType << std::endl; 1275 1280 std::cerr << "env: " << cand->env << std::endl; 1276 1281 ) … … 1281 1286 // count one safe conversion for each value that is thrown away 1282 1287 thisCost.incSafe( discardedValues ); 1288 1289 // See Aaron Moss, page 47; this reasoning does not hold since implicit conversions 1290 // can create the same resolution issue. The C intrinsic interpretations are pruned 1291 // immediately for the lowest cost option regardless of result type. Related code in 1292 // postvisit (UntypedExpr). 1293 // Cast expression costs are updated now to use the general rules. 1294 /* 1283 1295 // select first on argument cost, then conversion cost 1284 1296 if ( cand->cost < minExprCost || ( cand->cost == minExprCost && thisCost < minCastCost ) ) { … … 1289 1301 // ambigious case, still output candidates to print in error message 1290 1302 if ( cand->cost == minExprCost && thisCost == minCastCost ) { 1303 */ 1304 cand->cost += thisCost; 1305 if (cand->cost < minExprCost) { 1306 minExprCost = cand->cost; 1307 matches.clear(); 1308 } 1309 if (cand->cost == minExprCost) { 1291 1310 CandidateRef newCand = std::make_shared<Candidate>( 1292 1311 restructureCast( cand->expr, toType, castExpr->isGenerated ), 1293 copy( cand->env ), std::move( open ), std::move( need ), cand->cost + thisCost);1312 copy( cand->env ), std::move( open ), std::move( need ), cand->cost); 1294 1313 // currently assertions are always resolved immediately so this should have no effect. 1295 1314 // if this somehow changes in the future (e.g. delayed by indeterminate return type)
Note:
See TracChangeset
for help on using the changeset viewer.