- File:
-
- 1 edited
-
src/ResolvExpr/CandidateFinder.cpp (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/CandidateFinder.cpp
rab780e6 r0522ebe 46 46 #include "AST/Type.hpp" 47 47 #include "Common/utility.h" // for move, copy 48 #include "Parser/parserutility.h" // for notZeroExpr 48 49 #include "SymTab/Mangler.h" 49 50 #include "Tuples/Tuples.h" // for handleTupleAssignment … … 1017 1018 } 1018 1019 1019 if (argType.as<ast::PointerType>()) funcFinder.otypeKeys.insert(Mangle::Encoding::pointer); 1020 if (argType.as<ast::PointerType>()) funcFinder.otypeKeys.insert(Mangle::Encoding::pointer); 1020 1021 else funcFinder.otypeKeys.insert(Mangle::mangle(argType, Mangle::NoGenericParams | Mangle::Type)); 1021 1022 } … … 1282 1283 restructureCast( cand->expr, toType, castExpr->isGenerated ), 1283 1284 copy( cand->env ), std::move( open ), std::move( need ), cand->cost + thisCost); 1284 // currently assertions are always resolved immediately so this should have no effect. 1285 // currently assertions are always resolved immediately so this should have no effect. 1285 1286 // if this somehow changes in the future (e.g. delayed by indeterminate return type) 1286 1287 // we may need to revisit the logic. … … 1586 1587 void Finder::postvisit( const ast::LogicalExpr * logicalExpr ) { 1587 1588 CandidateFinder finder1( context, tenv ); 1588 ast::ptr<ast::Expr> arg1 = createCondExpr( logicalExpr->arg1 );1589 ast::ptr<ast::Expr> arg1 = notZeroExpr( logicalExpr->arg1 ); 1589 1590 finder1.find( arg1, ResolveMode::withAdjustment() ); 1590 1591 if ( finder1.candidates.empty() ) return; 1591 1592 1592 1593 CandidateFinder finder2( context, tenv ); 1593 ast::ptr<ast::Expr> arg2 = createCondExpr( logicalExpr->arg2 );1594 ast::ptr<ast::Expr> arg2 = notZeroExpr( logicalExpr->arg2 ); 1594 1595 finder2.find( arg2, ResolveMode::withAdjustment() ); 1595 1596 if ( finder2.candidates.empty() ) return; … … 1617 1618 void Finder::postvisit( const ast::ConditionalExpr * conditionalExpr ) { 1618 1619 // candidates for condition 1619 ast::ptr<ast::Expr> arg1 = createCondExpr( conditionalExpr->arg1 );1620 1620 CandidateFinder finder1( context, tenv ); 1621 ast::ptr<ast::Expr> arg1 = notZeroExpr( conditionalExpr->arg1 ); 1621 1622 finder1.find( arg1, ResolveMode::withAdjustment() ); 1622 1623 if ( finder1.candidates.empty() ) return; 1623 1624 1624 1625 // candidates for true result 1625 // FIX ME: resolves and runs arg1 twice when arg2 is missing.1626 ast::Expr const * arg2 = conditionalExpr->arg2;1627 arg2 = arg2 ? arg2 : conditionalExpr->arg1.get();1628 1626 CandidateFinder finder2( context, tenv ); 1629 1627 finder2.allowVoid = true; 1630 finder2.find( arg2, ResolveMode::withAdjustment() );1628 finder2.find( conditionalExpr->arg2, ResolveMode::withAdjustment() ); 1631 1629 if ( finder2.candidates.empty() ) return; 1632 1630 … … 1899 1897 CandidateRef newCand = 1900 1898 std::make_shared<Candidate>( 1901 newExpr, copy( tenv ), ast::OpenVarSet{}, 1899 newExpr, copy( tenv ), ast::OpenVarSet{}, 1902 1900 ast::AssertionSet{}, Cost::zero, cost 1903 1901 ); 1904 1902 1905 1903 if (newCand->expr->env) { 1906 1904 newCand->env.add(*newCand->expr->env); … … 2200 2198 } 2201 2199 2202 const ast::Expr * createCondExpr( const ast::Expr * expr ) {2203 assert( expr );2204 return new ast::CastExpr( expr->location,2205 ast::UntypedExpr::createCall( expr->location,2206 "?!=?",2207 {2208 expr,2209 new ast::ConstantExpr( expr->location,2210 new ast::ZeroType(), "0", std::make_optional( 0ull )2211 ),2212 }2213 ),2214 new ast::BasicType( ast::BasicType::SignedInt )2215 );2216 }2217 2218 2200 } // namespace ResolvExpr 2219 2201
Note:
See TracChangeset
for help on using the changeset viewer.