Changeset 379b6ea
- Timestamp:
- Mar 26, 2025, 9:42:02 AM (6 months ago)
- Branches:
- master
- Children:
- 30bf6bf, b1c220a
- Parents:
- 8ef0bf7 (diff), 446dde5 (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. - Location:
- src
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Expr.cpp
r8ef0bf7 r379b6ea 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 -
src/AST/Expr.hpp
r8ef0bf7 r379b6ea 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; -
src/AST/Pass.impl.hpp
r8ef0bf7 r379b6ea 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 -
src/AST/Print.cpp
r8ef0bf7 r379b6ea 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 ); -
src/InitTweak/FixInit.cpp
r8ef0bf7 r379b6ea 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.