Changes in / [379b6ea:8ef0bf7]


Ignore:
Location:
src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • src/AST/Expr.cpp

    r379b6ea r8ef0bf7  
    393393
    394394StmtExpr::StmtExpr( const CodeLocation & loc, const CompoundStmt * ss )
    395 : Expr( loc ), stmts( ss ) { computeResult(); }
     395: Expr( loc ), stmts( ss ), returnDecls(), dtors() { computeResult(); }
    396396
    397397void StmtExpr::computeResult() {
    398398        assert( stmts );
    399399        const std::list<ptr<Stmt>> & body = stmts->kids;
    400         // If there is a tail expression, its result is entire result.
    401         if ( !body.empty() && ( resultExpr = body.back().as<ExprStmt>() ) ) {
    402                 result = resultExpr->expr->result;
    403         // Otherwise, fill in the result with void so there is a result type.
    404         } else {
    405                 result = new VoidType();
    406         }
     400        if ( ! returnDecls.empty() ) {
     401                // prioritize return decl for result type, since if a return decl exists, then the StmtExpr
     402                // is currently in an intermediate state where the body will always give a void result type
     403                result = returnDecls.front()->get_type();
     404        } else if ( ! body.empty() ) {
     405                if ( const ExprStmt * exprStmt = body.back().as< ExprStmt >() ) {
     406                        result = exprStmt->expr->result;
     407                }
     408        }
     409        // ensure a result type exists
     410        if ( ! result ) { result = new VoidType{}; }
    407411}
    408412
  • src/AST/Expr.hpp

    r379b6ea r8ef0bf7  
    782782public:
    783783        ptr<CompoundStmt> stmts;
     784        std::vector<ptr<ObjectDecl>> returnDecls;  ///< return variable(s) for statement expression
     785        std::vector<ptr<Expr>> dtors;              ///< destructor(s) for return variable(s)
    784786
    785787        readonly<ExprStmt> resultExpr;
  • src/AST/Pass.impl.hpp

    r379b6ea r8ef0bf7  
    16971697                }
    16981698                maybe_accept( node, &StmtExpr::stmts       );
     1699                maybe_accept( node, &StmtExpr::returnDecls );
     1700                maybe_accept( node, &StmtExpr::dtors       );
    16991701        }
    17001702
  • src/AST/Print.cpp

    r379b6ea r8ef0bf7  
    14061406                os << "Statement Expression:" << endl << indent;
    14071407                safe_print( node->stmts );
     1408                if ( ! node->returnDecls.empty() ) {
     1409                        os << indent << "... with returnDecls: ";
     1410                        printAll( node->returnDecls );
     1411                }
     1412                if ( ! node->dtors.empty() ) {
     1413                        os << indent << "... with dtors: ";
     1414                        printAll( node->dtors );
     1415                }
    14081416                --indent;
    14091417                postprint( node );
  • src/InitTweak/FixInit.cpp

    r379b6ea r8ef0bf7  
    697697        assert( stmtExpr->result );
    698698        if ( stmtExpr->result->isVoid() ) {
     699                assert( stmtExpr->returnDecls.empty() );
     700                assert( stmtExpr->dtors.empty() );
     701
    699702                return stmtExpr;
    700703        }
     
    744747        // if there is a return decl, add a use as the last statement; will not have return decl on non-constructable returns
    745748        stmts.push_back( new ast::ExprStmt(loc, new ast::VariableExpr(loc, ret ) ) );
     749
     750        assert( stmtExpr->returnDecls.empty() );
     751        assert( stmtExpr->dtors.empty() );
    746752
    747753        return stmtExpr;
Note: See TracChangeset for help on using the changeset viewer.