Ignore:
File:
1 edited

Legend:

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

    rc570806 r665f432  
    127127                        , decltype( node->accept(*this) )
    128128                >::type
     129
    129130        {
    130131                __pedantic_pass_assert( __visit_children() );
    131                 __pedantic_pass_assert( node );
     132                __pedantic_pass_assert( expr );
    132133
    133134                static_assert( !std::is_base_of<ast::Expr, node_t>::value, "ERROR");
     
    322323        }
    323324
    324 
    325         template< typename pass_t >
    326         template< typename node_t >
    327         void ast::Pass< pass_t >::mutate_forall( const node_t *& node ) {
    328                 if ( auto subs = __pass::forall::subs( pass, 0 ) ) {
    329                         // tracking TypeDecl substitution, full clone
    330                         if ( node->forall.empty() ) return;
    331 
    332                         node_t * mut = mutate( node );
    333                         mut->forall = subs->clone( node->forall, *this );
    334                         node = mut;
    335                 } else {
    336                         // not tracking TypeDecl substitution, just mutate
    337                         maybe_accept( node, &node_t::forall );
    338                 }
    339         }
    340325}
    341326
     
    444429                        guard_symtab guard { *this };
    445430                        // implicit add __func__ identifier as specified in the C manual 6.4.2.2
    446                         static ast::ptr< ast::ObjectDecl > func{ new ast::ObjectDecl{
    447                                 CodeLocation{}, "__func__",
    448                                 new ast::ArrayType{
    449                                         new ast::BasicType{ ast::BasicType::Char, ast::CV::Const },
     431                        static ast::ObjectDecl func(
     432                                node->location, "__func__",
     433                                new ast::ArrayType(
     434                                        new ast::BasicType( ast::BasicType::Char, ast::CV::Qualifiers( ast::CV::Const ) ),
    450435                                        nullptr, VariableLen, DynamicDim
    451                                 }
    452                         } };
    453                         __pass::symtab::addId( pass, 0, func );
     436                                )
     437                        );
     438                        __pass::symtab::addId( pass, 0, &func );
    454439                        VISIT(
    455440                                maybe_accept( node, &FunctionDecl::type );
     
    625610        VISIT({
    626611                // do not enter a new scope if inFunction is true - needs to check old state before the assignment
    627                 auto guard1 = makeFuncGuard( [this, inFunctionCpy = this->inFunction]() {
    628                         if ( ! inFunctionCpy ) __pass::symtab::enter(pass, 0);
    629                 }, [this, inFunctionCpy = this->inFunction]() {
    630                         if ( ! inFunctionCpy ) __pass::symtab::leave(pass, 0);
     612                auto guard1 = makeFuncGuard( [this, inFunction = this->inFunction]() {
     613                        if ( ! inFunction ) __pass::symtab::enter(pass, 0);
     614                }, [this, inFunction = this->inFunction]() {
     615                        if ( ! inFunction ) __pass::symtab::leave(pass, 0);
    631616                });
    632617                ValueGuard< bool > guard2( inFunction );
     
    953938        // For now this isn't visited, it is unclear if this causes problem
    954939        // if all tests are known to pass, remove this code
    955         VISIT(
    956                 maybe_accept( node, &ImplicitCtorDtorStmt::callStmt );
    957         )
     940        // VISIT(
     941        //      maybe_accept( node, &ImplicitCtorDtorStmt::callStmt );
     942        // )
    958943
    959944        VISIT_END( Stmt, node );
     
    13151300                        maybe_accept( node, &AsmExpr::result );
    13161301                }
    1317                 maybe_accept( node, &AsmExpr::inout      );
    13181302                maybe_accept( node, &AsmExpr::constraint );
    13191303                maybe_accept( node, &AsmExpr::operand    );
     
    16821666        VISIT_START( node );
    16831667
    1684         VISIT({
    1685                 guard_forall_subs forall_guard { *this, node };
    1686                 mutate_forall( node );
     1668        VISIT(
     1669                maybe_accept( node, &FunctionType::forall  );
    16871670                maybe_accept( node, &FunctionType::returns );
    16881671                maybe_accept( node, &FunctionType::params  );
    1689         })
     1672        )
    16901673
    16911674        VISIT_END( Type, node );
     
    17021685        VISIT({
    17031686                guard_symtab guard { *this };
    1704                 guard_forall_subs forall_guard { *this, node };
    1705                 mutate_forall( node );
     1687                maybe_accept( node, &StructInstType::forall );
    17061688                maybe_accept( node, &StructInstType::params );
    17071689        })
     
    17161698        VISIT_START( node );
    17171699
    1718         __pass::symtab::addUnion( pass, 0, node->name );
    1719 
    1720         VISIT({
     1700        __pass::symtab::addStruct( pass, 0, node->name );
     1701
     1702        {
    17211703                guard_symtab guard { *this };
    1722                 guard_forall_subs forall_guard { *this, node };
    1723                 mutate_forall( node );
     1704                maybe_accept( node, &UnionInstType::forall );
    17241705                maybe_accept( node, &UnionInstType::params );
    1725         })
     1706        }
    17261707
    17271708        VISIT_END( Type, node );
     
    17341715        VISIT_START( node );
    17351716
    1736         VISIT({
    1737                 guard_forall_subs forall_guard { *this, node };
    1738                 mutate_forall( node );
     1717        VISIT(
     1718                maybe_accept( node, &EnumInstType::forall );
    17391719                maybe_accept( node, &EnumInstType::params );
    1740         })
     1720        )
    17411721
    17421722        VISIT_END( Type, node );
     
    17491729        VISIT_START( node );
    17501730
    1751         VISIT({
    1752                 guard_forall_subs forall_guard { *this, node };
    1753                 mutate_forall( node );
     1731        VISIT(
     1732                maybe_accept( node, &TraitInstType::forall );
    17541733                maybe_accept( node, &TraitInstType::params );
    1755         })
     1734        )
    17561735
    17571736        VISIT_END( Type, node );
     
    17651744
    17661745        VISIT(
    1767                 {
    1768                         guard_forall_subs forall_guard { *this, node };
    1769                         mutate_forall( node );
    1770                         maybe_accept( node, &TypeInstType::params );
    1771                 }
    1772                 // ensure that base re-bound if doing substitution
    1773                 __pass::forall::replace( pass, 0, node );
     1746                maybe_accept( node, &TypeInstType::forall );
     1747                maybe_accept( node, &TypeInstType::params );
    17741748        )
    17751749
     
    19201894                                guard_symtab guard { *this };
    19211895                                auto new_node = p.second->accept( *this );
    1922                                 if (new_node != p.second) mutated = true;
     1896                                if (new_node != p.second) mutated = false;
    19231897                                new_map.insert({ p.first, new_node });
    19241898                        }
     
    19361910                                guard_symtab guard { *this };
    19371911                                auto new_node = p.second->accept( *this );
    1938                                 if (new_node != p.second) mutated = true;
     1912                                if (new_node != p.second) mutated = false;
    19391913                                new_map.insert({ p.first, new_node });
    19401914                        }
Note: See TracChangeset for help on using the changeset viewer.