Changes in src/ResolvExpr/Resolver.cc [7ff3e522:57e0289]
- File:
-
- 1 edited
-
src/ResolvExpr/Resolver.cc (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/Resolver.cc
r7ff3e522 r57e0289 38 38 #include "Common/PassVisitor.h" // for PassVisitor 39 39 #include "Common/SemanticError.h" // for SemanticError 40 #include "Common/Stats/ResolveTime.h" // for ResolveTime::start(), ResolveTime::stop() 40 41 #include "Common/utility.h" // for ValueGuard, group_iterate 41 42 #include "InitTweak/GenInit.h" … … 965 966 /// Finds deleted expressions in an expression tree 966 967 struct DeleteFinder_new final : public ast::WithShortCircuiting { 967 const ast::DeletedExpr * delExpr= nullptr;968 const ast::DeletedExpr * result = nullptr; 968 969 969 970 void previsit( const ast::DeletedExpr * expr ) { 970 if ( delExpr) { visit_children = false; }971 else { delExpr= expr; }971 if ( result ) { visit_children = false; } 972 else { result = expr; } 972 973 } 973 974 974 975 void previsit( const ast::Expr * ) { 975 if ( delExpr) { visit_children = false; }976 if ( result ) { visit_children = false; } 976 977 } 977 978 }; … … 980 981 /// Check if this expression is or includes a deleted expression 981 982 const ast::DeletedExpr * findDeletedExpr( const ast::Expr * expr ) { 982 ast::Pass<DeleteFinder_new> finder; 983 expr->accept( finder ); 984 return finder.core.delExpr; 983 return ast::Pass<DeleteFinder_new>::read( expr ); 985 984 } 986 985 … … 1171 1170 const ast::Expr * untyped, const ast::SymbolTable & symtab 1172 1171 ) { 1173 return findKindExpression( untyped, symtab ); 1172 Stats::ResolveTime::start( untyped ); 1173 auto res = findKindExpression( untyped, symtab ); 1174 Stats::ResolveTime::stop(); 1175 return res; 1174 1176 } 1175 1177 } // anonymous namespace … … 1261 1263 const ast::ThrowStmt * previsit( const ast::ThrowStmt * ); 1262 1264 const ast::CatchStmt * previsit( const ast::CatchStmt * ); 1265 const ast::CatchStmt * postvisit( const ast::CatchStmt * ); 1263 1266 const ast::WaitForStmt * previsit( const ast::WaitForStmt * ); 1264 1267 … … 1493 1496 1494 1497 const ast::CatchStmt * Resolver_new::previsit( const ast::CatchStmt * catchStmt ) { 1495 // TODO: This will need a fix for the decl/cond scoping problem. 1498 // Until we are very sure this invarent (ifs that move between passes have thenPart) 1499 // holds, check it. This allows a check for when to decode the mangling. 1500 if ( auto ifStmt = catchStmt->body.as<ast::IfStmt>() ) { 1501 assert( ifStmt->thenPart ); 1502 } 1503 // Encode the catchStmt so the condition can see the declaration. 1496 1504 if ( catchStmt->cond ) { 1497 ast::ptr< ast::Type > boolType = new ast::BasicType{ ast::BasicType::Bool }; 1498 catchStmt = ast::mutate_field( 1499 catchStmt, &ast::CatchStmt::cond, 1500 findSingleExpression( catchStmt->cond, boolType, symtab ) ); 1505 ast::CatchStmt * stmt = mutate( catchStmt ); 1506 stmt->body = new ast::IfStmt( stmt->location, stmt->cond, nullptr, stmt->body ); 1507 stmt->cond = nullptr; 1508 return stmt; 1509 } 1510 return catchStmt; 1511 } 1512 1513 const ast::CatchStmt * Resolver_new::postvisit( const ast::CatchStmt * catchStmt ) { 1514 // Decode the catchStmt so everything is stored properly. 1515 const ast::IfStmt * ifStmt = catchStmt->body.as<ast::IfStmt>(); 1516 if ( nullptr != ifStmt && nullptr == ifStmt->thenPart ) { 1517 assert( ifStmt->cond ); 1518 assert( ifStmt->elsePart ); 1519 ast::CatchStmt * stmt = ast::mutate( catchStmt ); 1520 stmt->cond = ifStmt->cond; 1521 stmt->body = ifStmt->elsePart; 1522 // ifStmt should be implicately deleted here. 1523 return stmt; 1501 1524 } 1502 1525 return catchStmt;
Note:
See TracChangeset
for help on using the changeset viewer.