Changeset dc58e5d for src/ResolvExpr


Ignore:
Timestamp:
Apr 15, 2024, 12:24:36 PM (3 months ago)
Author:
JiadaL <j82liang@…>
Branches:
master
Children:
fb2e916
Parents:
af746cc (diff), 7a36848 (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.
Message:

Small cleanup

Location:
src/ResolvExpr
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/CandidateFinder.cpp

    raf746cc rdc58e5d  
    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
     
    15141513        void Finder::postvisit( const ast::LogicalExpr * logicalExpr ) {
    15151514                CandidateFinder finder1( context, tenv );
    1516                 ast::ptr<ast::Expr> arg1 = notZeroExpr( logicalExpr->arg1 );
     1515                ast::ptr<ast::Expr> arg1 = createCondExpr( logicalExpr->arg1 );
    15171516                finder1.find( arg1, ResolveMode::withAdjustment() );
    15181517                if ( finder1.candidates.empty() ) return;
    15191518
    15201519                CandidateFinder finder2( context, tenv );
    1521                 ast::ptr<ast::Expr> arg2 = notZeroExpr( logicalExpr->arg2 );
     1520                ast::ptr<ast::Expr> arg2 = createCondExpr( logicalExpr->arg2 );
    15221521                finder2.find( arg2, ResolveMode::withAdjustment() );
    15231522                if ( finder2.candidates.empty() ) return;
     
    15451544        void Finder::postvisit( const ast::ConditionalExpr * conditionalExpr ) {
    15461545                // candidates for condition
    1547                 ast::ptr<ast::Expr> arg1 = notZeroExpr( conditionalExpr->arg1 );
     1546                ast::ptr<ast::Expr> arg1 = createCondExpr( conditionalExpr->arg1 );
    15481547                CandidateFinder finder1( context, tenv );
    15491548                finder1.find( arg1, ResolveMode::withAdjustment() );
     
    21662165                CandidateRef & choice = winners.front();
    21672166                return choice->expr;
    2168                 // return std::move( choice->expr.get() );
     2167}
     2168
     2169const ast::Expr * createCondExpr( const ast::Expr * expr ) {
     2170        assert( expr );
     2171        return new ast::CastExpr( expr->location,
     2172                ast::UntypedExpr::createCall( expr->location,
     2173                        "?!=?",
     2174                        {
     2175                                expr,
     2176                                new ast::ConstantExpr( expr->location,
     2177                                        new ast::ZeroType(), "0", std::make_optional( 0ull )
     2178                                ),
     2179                        }
     2180                ),
     2181                new ast::BasicType( ast::BasicType::SignedInt )
     2182        );
    21692183}
    21702184
  • src/ResolvExpr/CandidateFinder.hpp

    raf746cc rdc58e5d  
    7272const ast::Expr * getValueEnumCall(const ast::Expr * expr,
    7373        const ResolvExpr::ResolveContext & context, const ast::TypeEnvironment & env );
     74/// Wrap an expression to convert the result to a conditional result.
     75const ast::Expr * createCondExpr( const ast::Expr * expr );
    7476
    7577} // namespace ResolvExpr
  • src/ResolvExpr/Resolver.cc

    raf746cc rdc58e5d  
    340340        }
    341341
     342        ast::ptr< ast::Expr > findCondExpression(
     343                const ast::Expr * untyped, const ResolveContext & context
     344        ) {
     345                if ( nullptr == untyped ) return untyped;
     346                ast::ptr<ast::Expr> condExpr = createCondExpr( untyped );
     347                return findIntegralExpression( condExpr, context );
     348        }
     349
    342350        /// check if a type is a character type
    343351        bool isCharType( const ast::Type * t ) {
     
    356364                return it != end;
    357365        }
    358 }
     366} // anonymous namespace
    359367
    360368class Resolver final
     
    729737const ast::IfStmt * Resolver::previsit( const ast::IfStmt * ifStmt ) {
    730738        return ast::mutate_field(
    731                 ifStmt, &ast::IfStmt::cond, findIntegralExpression( ifStmt->cond, context ) );
     739                ifStmt, &ast::IfStmt::cond, findCondExpression( ifStmt->cond, context ) );
    732740}
    733741
    734742const ast::WhileDoStmt * Resolver::previsit( const ast::WhileDoStmt * whileDoStmt ) {
    735743        return ast::mutate_field(
    736                 whileDoStmt, &ast::WhileDoStmt::cond, findIntegralExpression( whileDoStmt->cond, context ) );
     744                whileDoStmt, &ast::WhileDoStmt::cond, findCondExpression( whileDoStmt->cond, context ) );
    737745}
    738746
     
    740748        if ( forStmt->cond ) {
    741749                forStmt = ast::mutate_field(
    742                         forStmt, &ast::ForStmt::cond, findIntegralExpression( forStmt->cond, context ) );
     750                        forStmt, &ast::ForStmt::cond, findCondExpression( forStmt->cond, context ) );
    743751        }
    744752
     
    10751083
    10761084                // Resolve the conditions as if it were an IfStmt, statements normally
    1077                 clause2->when_cond = findSingleExpression( clause.when_cond, context );
     1085                clause2->when_cond = findCondExpression( clause.when_cond, context );
    10781086                clause2->stmt = clause.stmt->accept( *visitor );
    10791087
     
    10891097                        new ast::BasicType{ ast::BasicType::LongLongUnsignedInt };
    10901098                auto timeout_time = findSingleExpression( stmt->timeout_time, target, context );
    1091                 auto timeout_cond = findSingleExpression( stmt->timeout_cond, context );
     1099                auto timeout_cond = findCondExpression( stmt->timeout_cond, context );
    10921100                auto timeout_stmt = stmt->timeout_stmt->accept( *visitor );
    10931101
     
    11021110        if ( stmt->else_stmt ) {
    11031111                // resolve the condition like IfStmt, stmts normally
    1104                 auto else_cond = findSingleExpression( stmt->else_cond, context );
     1112                auto else_cond = findCondExpression( stmt->else_cond, context );
    11051113                auto else_stmt = stmt->else_stmt->accept( *visitor );
    11061114
Note: See TracChangeset for help on using the changeset viewer.