Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/CandidateFinder.cpp

    r0522ebe rab780e6  
    4646#include "AST/Type.hpp"
    4747#include "Common/utility.h"       // for move, copy
    48 #include "Parser/parserutility.h" // for notZeroExpr
    4948#include "SymTab/Mangler.h"
    5049#include "Tuples/Tuples.h"        // for handleTupleAssignment
     
    10181017                                        }
    10191018
    1020                                         if (argType.as<ast::PointerType>()) funcFinder.otypeKeys.insert(Mangle::Encoding::pointer);                                             
     1019                                        if (argType.as<ast::PointerType>()) funcFinder.otypeKeys.insert(Mangle::Encoding::pointer);
    10211020                                        else funcFinder.otypeKeys.insert(Mangle::mangle(argType, Mangle::NoGenericParams | Mangle::Type));
    10221021                                }
     
    12831282                                                restructureCast( cand->expr, toType, castExpr->isGenerated ),
    12841283                                                copy( cand->env ), std::move( open ), std::move( need ), cand->cost + thisCost);
    1285                                         // currently assertions are always resolved immediately so this should have no effect. 
     1284                                        // currently assertions are always resolved immediately so this should have no effect.
    12861285                                        // if this somehow changes in the future (e.g. delayed by indeterminate return type)
    12871286                                        // we may need to revisit the logic.
     
    15871586        void Finder::postvisit( const ast::LogicalExpr * logicalExpr ) {
    15881587                CandidateFinder finder1( context, tenv );
    1589                 ast::ptr<ast::Expr> arg1 = notZeroExpr( logicalExpr->arg1 );
     1588                ast::ptr<ast::Expr> arg1 = createCondExpr( logicalExpr->arg1 );
    15901589                finder1.find( arg1, ResolveMode::withAdjustment() );
    15911590                if ( finder1.candidates.empty() ) return;
    15921591
    15931592                CandidateFinder finder2( context, tenv );
    1594                 ast::ptr<ast::Expr> arg2 = notZeroExpr( logicalExpr->arg2 );
     1593                ast::ptr<ast::Expr> arg2 = createCondExpr( logicalExpr->arg2 );
    15951594                finder2.find( arg2, ResolveMode::withAdjustment() );
    15961595                if ( finder2.candidates.empty() ) return;
     
    16181617        void Finder::postvisit( const ast::ConditionalExpr * conditionalExpr ) {
    16191618                // candidates for condition
     1619                ast::ptr<ast::Expr> arg1 = createCondExpr( conditionalExpr->arg1 );
    16201620                CandidateFinder finder1( context, tenv );
    1621                 ast::ptr<ast::Expr> arg1 = notZeroExpr( conditionalExpr->arg1 );
    16221621                finder1.find( arg1, ResolveMode::withAdjustment() );
    16231622                if ( finder1.candidates.empty() ) return;
    16241623
    16251624                // 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();
    16261628                CandidateFinder finder2( context, tenv );
    16271629                finder2.allowVoid = true;
    1628                 finder2.find( conditionalExpr->arg2, ResolveMode::withAdjustment() );
     1630                finder2.find( arg2, ResolveMode::withAdjustment() );
    16291631                if ( finder2.candidates.empty() ) return;
    16301632
     
    18971899                                        CandidateRef newCand =
    18981900                                                std::make_shared<Candidate>(
    1899                                                         newExpr, copy( tenv ), ast::OpenVarSet{}, 
     1901                                                        newExpr, copy( tenv ), ast::OpenVarSet{},
    19001902                                                        ast::AssertionSet{}, Cost::zero, cost
    19011903                                                );
    1902                                        
     1904
    19031905                                        if (newCand->expr->env) {
    19041906                                                newCand->env.add(*newCand->expr->env);
     
    21982200}
    21992201
     2202const 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
    22002218} // namespace ResolvExpr
    22012219
Note: See TracChangeset for help on using the changeset viewer.