Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/AST/Pass.impl.hpp

    rc6c682cf r954c954  
    167167                __pedantic_pass_assert( stmt );
    168168
    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 
    177169                // add a few useful symbols to the scope
    178170                using __pass::empty;
     
    332324
    333325                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::*child
    349         ) {
    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 );
    358326
    359327                static_assert( !std::is_same<const ast::Node *, decltype(new_val)>::value || std::is_same<int, decltype(old_val)>::value, "ERROR");
     
    502470                                // foralls are still in function type
    503471                                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
    505474                                ValueGuard< bool > oldInFunction( inFunction );
    506475                                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;
    511476                                maybe_accept( node, &FunctionDecl::stmts );
    512477                                maybe_accept( node, &FunctionDecl::attributes );
     
    675640        VISIT_START( node );
    676641        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);
    682647                });
    683648                ValueGuard< bool > guard2( inFunction );
     
    738703                maybe_accept( node, &IfStmt::inits    );
    739704                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 );
    742707        })
    743708
     
    756721                maybe_accept( node, &WhileStmt::inits );
    757722                maybe_accept( node, &WhileStmt::cond  );
    758                 maybe_accept_as_compound( node, &WhileStmt::body  );
     723                maybe_accept( node, &WhileStmt::body  );
    759724        })
    760725
     
    771736                // for statements introduce a level of scope (for the initialization)
    772737                guard_symtab guard { *this };
    773                 // xxx - old ast does not create WithStmtsToAdd scope for loop inits. should revisit this later.
    774738                maybe_accept( node, &ForStmt::inits );
    775739                maybe_accept( node, &ForStmt::cond  );
    776740                maybe_accept( node, &ForStmt::inc   );
    777                 maybe_accept_as_compound( node, &ForStmt::body  );
     741                maybe_accept( node, &ForStmt::body  );
    778742        })
    779743
     
    870834                maybe_accept( node, &CatchStmt::decl );
    871835                maybe_accept( node, &CatchStmt::cond );
    872                 maybe_accept_as_compound( node, &CatchStmt::body );
     836                maybe_accept( node, &CatchStmt::body );
    873837        })
    874838
Note: See TracChangeset for help on using the changeset viewer.