Changes in src/AST/Pass.impl.hpp [c6c682cf:954c954]
- File:
-
- 1 edited
-
src/AST/Pass.impl.hpp (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Pass.impl.hpp
rc6c682cf r954c954 167 167 __pedantic_pass_assert( stmt ); 168 168 169 return stmt->accept( *this );170 }171 172 template< typename core_t >173 const ast::Stmt * ast::Pass< core_t >::call_accept_as_compound( const ast::Stmt * stmt ) {174 __pedantic_pass_assert( __visit_children() );175 __pedantic_pass_assert( stmt );176 177 169 // add a few useful symbols to the scope 178 170 using __pass::empty; … … 332 324 333 325 auto new_val = call_accept( old_val ); 334 335 static_assert( !std::is_same<const ast::Node *, decltype(new_val)>::value || std::is_same<int, decltype(old_val)>::value, "ERROR");336 337 if( __pass::differs(old_val, new_val) ) {338 auto new_parent = __pass::mutate<core_t>(parent);339 new_parent->*child = new_val;340 parent = new_parent;341 }342 }343 344 template< typename core_t >345 template<typename node_t, typename parent_t, typename child_t>346 void ast::Pass< core_t >::maybe_accept_as_compound(347 const node_t * & parent,348 child_t parent_t::*child349 ) {350 static_assert( std::is_base_of<parent_t, node_t>::value, "Error deducing member object" );351 352 if(__pass::skip(parent->*child)) return;353 const auto & old_val = __pass::get(parent->*child, 0);354 355 static_assert( !std::is_same<const ast::Node * &, decltype(old_val)>::value, "ERROR");356 357 auto new_val = call_accept_as_compound( old_val );358 326 359 327 static_assert( !std::is_same<const ast::Node *, decltype(new_val)>::value || std::is_same<int, decltype(old_val)>::value, "ERROR"); … … 502 470 // foralls are still in function type 503 471 maybe_accept( node, &FunctionDecl::type ); 504 // First remember that we are now within a function. 472 // function body needs to have the same scope as parameters - CompoundStmt will not enter 473 // a new scope if inFunction is true 505 474 ValueGuard< bool > oldInFunction( inFunction ); 506 475 inFunction = true; 507 // The function body needs to have the same scope as parameters.508 // A CompoundStmt will not enter a new scope if atFunctionTop is true.509 ValueGuard< bool > oldAtFunctionTop( atFunctionTop );510 atFunctionTop = true;511 476 maybe_accept( node, &FunctionDecl::stmts ); 512 477 maybe_accept( node, &FunctionDecl::attributes ); … … 675 640 VISIT_START( node ); 676 641 VISIT({ 677 // Do not enter (or leave) a new scope if atFunctionTop. Remember to save the result.678 auto guard1 = makeFuncGuard( [this, enterScope = !this->atFunctionTop]() {679 if ( enterScope) __pass::symtab::enter(core, 0);680 }, [this, leaveScope = !this->atFunctionTop]() {681 if ( leaveScope) __pass::symtab::leave(core, 0);642 // do not enter a new scope if inFunction is true - needs to check old state before the assignment 643 auto guard1 = makeFuncGuard( [this, inFunctionCpy = this->inFunction]() { 644 if ( ! inFunctionCpy ) __pass::symtab::enter(core, 0); 645 }, [this, inFunctionCpy = this->inFunction]() { 646 if ( ! inFunctionCpy ) __pass::symtab::leave(core, 0); 682 647 }); 683 648 ValueGuard< bool > guard2( inFunction ); … … 738 703 maybe_accept( node, &IfStmt::inits ); 739 704 maybe_accept( node, &IfStmt::cond ); 740 maybe_accept _as_compound( node, &IfStmt::thenPart );741 maybe_accept _as_compound( node, &IfStmt::elsePart );705 maybe_accept( node, &IfStmt::thenPart ); 706 maybe_accept( node, &IfStmt::elsePart ); 742 707 }) 743 708 … … 756 721 maybe_accept( node, &WhileStmt::inits ); 757 722 maybe_accept( node, &WhileStmt::cond ); 758 maybe_accept _as_compound( node, &WhileStmt::body );723 maybe_accept( node, &WhileStmt::body ); 759 724 }) 760 725 … … 771 736 // for statements introduce a level of scope (for the initialization) 772 737 guard_symtab guard { *this }; 773 // xxx - old ast does not create WithStmtsToAdd scope for loop inits. should revisit this later.774 738 maybe_accept( node, &ForStmt::inits ); 775 739 maybe_accept( node, &ForStmt::cond ); 776 740 maybe_accept( node, &ForStmt::inc ); 777 maybe_accept _as_compound( node, &ForStmt::body );741 maybe_accept( node, &ForStmt::body ); 778 742 }) 779 743 … … 870 834 maybe_accept( node, &CatchStmt::decl ); 871 835 maybe_accept( node, &CatchStmt::cond ); 872 maybe_accept _as_compound( node, &CatchStmt::body );836 maybe_accept( node, &CatchStmt::body ); 873 837 }) 874 838
Note:
See TracChangeset
for help on using the changeset viewer.