Changeset 446dde5
- Timestamp:
- Mar 25, 2025, 7:53:02 PM (26 hours ago)
- Branches:
- master
- Children:
- 379b6ea
- Parents:
- d73e667
- Location:
- src
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified src/AST/Expr.cpp ¶
rd73e667 r446dde5 393 393 394 394 StmtExpr::StmtExpr( const CodeLocation & loc, const CompoundStmt * ss ) 395 : Expr( loc ), stmts( ss ) , returnDecls(), dtors(){ computeResult(); }395 : Expr( loc ), stmts( ss ) { computeResult(); } 396 396 397 397 void StmtExpr::computeResult() { 398 398 assert( stmts ); 399 399 const std::list<ptr<Stmt>> & body = stmts->kids; 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{}; } 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 } 411 407 } 412 408 -
TabularUnified src/AST/Expr.hpp ¶
rd73e667 r446dde5 782 782 public: 783 783 ptr<CompoundStmt> stmts; 784 std::vector<ptr<ObjectDecl>> returnDecls; ///< return variable(s) for statement expression785 std::vector<ptr<Expr>> dtors; ///< destructor(s) for return variable(s)786 784 787 785 readonly<ExprStmt> resultExpr; -
TabularUnified src/AST/Pass.impl.hpp ¶
rd73e667 r446dde5 1697 1697 } 1698 1698 maybe_accept( node, &StmtExpr::stmts ); 1699 maybe_accept( node, &StmtExpr::returnDecls );1700 maybe_accept( node, &StmtExpr::dtors );1701 1699 } 1702 1700 -
TabularUnified src/AST/Print.cpp ¶
rd73e667 r446dde5 1406 1406 os << "Statement Expression:" << endl << indent; 1407 1407 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 }1416 1408 --indent; 1417 1409 postprint( node ); -
TabularUnified src/InitTweak/FixInit.cpp ¶
rd73e667 r446dde5 697 697 assert( stmtExpr->result ); 698 698 if ( stmtExpr->result->isVoid() ) { 699 assert( stmtExpr->returnDecls.empty() );700 assert( stmtExpr->dtors.empty() );701 702 699 return stmtExpr; 703 700 } … … 747 744 // if there is a return decl, add a use as the last statement; will not have return decl on non-constructable returns 748 745 stmts.push_back( new ast::ExprStmt(loc, new ast::VariableExpr(loc, ret ) ) ); 749 750 assert( stmtExpr->returnDecls.empty() );751 assert( stmtExpr->dtors.empty() );752 746 753 747 return stmtExpr;
Note: See TracChangeset
for help on using the changeset viewer.