Changeset b9fa85b for src/ResolvExpr
- Timestamp:
- Sep 10, 2020, 10:33:51 AM (4 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 98e8b3b
- Parents:
- 1c01c58
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/Resolver.cc
r1c01c58 rb9fa85b 1259 1259 const ast::ThrowStmt * previsit( const ast::ThrowStmt * ); 1260 1260 const ast::CatchStmt * previsit( const ast::CatchStmt * ); 1261 const ast::CatchStmt * postvisit( const ast::CatchStmt * ); 1261 1262 const ast::WaitForStmt * previsit( const ast::WaitForStmt * ); 1262 1263 … … 1491 1492 1492 1493 const ast::CatchStmt * Resolver_new::previsit( const ast::CatchStmt * catchStmt ) { 1493 // TODO: This will need a fix for the decl/cond scoping problem. 1494 // Until we are very sure this invarent (ifs that move between passes have thenPart) 1495 // holds, check it. This allows a check for when to decode the mangling. 1496 if ( auto ifStmt = catchStmt->body.as<ast::IfStmt>() ) { 1497 assert( ifStmt->thenPart ); 1498 } 1499 // Encode the catchStmt so the condition can see the declaration. 1494 1500 if ( catchStmt->cond ) { 1495 ast::ptr< ast::Type > boolType = new ast::BasicType{ ast::BasicType::Bool }; 1496 catchStmt = ast::mutate_field( 1497 catchStmt, &ast::CatchStmt::cond, 1498 findSingleExpression( catchStmt->cond, boolType, symtab ) ); 1501 ast::CatchStmt * stmt = mutate( catchStmt ); 1502 stmt->body = new ast::IfStmt( stmt->location, stmt->cond, nullptr, stmt->body ); 1503 stmt->cond = nullptr; 1504 return stmt; 1505 } 1506 return catchStmt; 1507 } 1508 1509 const ast::CatchStmt * Resolver_new::postvisit( const ast::CatchStmt * catchStmt ) { 1510 // Decode the catchStmt so everything is stored properly. 1511 const ast::IfStmt * ifStmt = catchStmt->body.as<ast::IfStmt>(); 1512 if ( nullptr != ifStmt && nullptr == ifStmt->thenPart ) { 1513 assert( ifStmt->cond ); 1514 assert( ifStmt->elsePart ); 1515 ast::CatchStmt * stmt = ast::mutate( catchStmt ); 1516 stmt->cond = ifStmt->cond; 1517 stmt->body = ifStmt->elsePart; 1518 // ifStmt should be implicately deleted here. 1519 return stmt; 1499 1520 } 1500 1521 return catchStmt;
Note: See TracChangeset
for help on using the changeset viewer.