Changes in src/AST/Pass.impl.hpp [e67991f:c570806]
- File:
-
- 1 edited
-
src/AST/Pass.impl.hpp (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Pass.impl.hpp
re67991f rc570806 127 127 , decltype( node->accept(*this) ) 128 128 >::type 129 130 129 { 131 130 __pedantic_pass_assert( __visit_children() ); 132 __pedantic_pass_assert( expr);131 __pedantic_pass_assert( node ); 133 132 134 133 static_assert( !std::is_base_of<ast::Expr, node_t>::value, "ERROR"); … … 323 322 } 324 323 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 } 325 340 } 326 341 … … 429 444 guard_symtab guard { *this }; 430 445 // implicit add __func__ identifier as specified in the C manual 6.4.2.2 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 ) ),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 }, 435 450 nullptr, VariableLen, DynamicDim 436 )437 );438 __pass::symtab::addId( pass, 0, &func );451 } 452 } }; 453 __pass::symtab::addId( pass, 0, func ); 439 454 VISIT( 440 455 maybe_accept( node, &FunctionDecl::type ); … … 610 625 VISIT({ 611 626 // do not enter a new scope if inFunction is true - needs to check old state before the assignment 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);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); 616 631 }); 617 632 ValueGuard< bool > guard2( inFunction ); … … 938 953 // For now this isn't visited, it is unclear if this causes problem 939 954 // if all tests are known to pass, remove this code 940 //VISIT(941 //maybe_accept( node, &ImplicitCtorDtorStmt::callStmt );942 //)955 VISIT( 956 maybe_accept( node, &ImplicitCtorDtorStmt::callStmt ); 957 ) 943 958 944 959 VISIT_END( Stmt, node ); … … 1667 1682 VISIT_START( node ); 1668 1683 1669 VISIT( 1670 maybe_accept( node, &FunctionType::forall ); 1684 VISIT({ 1685 guard_forall_subs forall_guard { *this, node }; 1686 mutate_forall( node ); 1671 1687 maybe_accept( node, &FunctionType::returns ); 1672 1688 maybe_accept( node, &FunctionType::params ); 1673 )1689 }) 1674 1690 1675 1691 VISIT_END( Type, node ); … … 1686 1702 VISIT({ 1687 1703 guard_symtab guard { *this }; 1688 maybe_accept( node, &StructInstType::forall ); 1704 guard_forall_subs forall_guard { *this, node }; 1705 mutate_forall( node ); 1689 1706 maybe_accept( node, &StructInstType::params ); 1690 1707 }) … … 1699 1716 VISIT_START( node ); 1700 1717 1701 __pass::symtab::add Struct( pass, 0, node->name );1702 1703 {1718 __pass::symtab::addUnion( pass, 0, node->name ); 1719 1720 VISIT({ 1704 1721 guard_symtab guard { *this }; 1705 maybe_accept( node, &UnionInstType::forall ); 1722 guard_forall_subs forall_guard { *this, node }; 1723 mutate_forall( node ); 1706 1724 maybe_accept( node, &UnionInstType::params ); 1707 } 1725 }) 1708 1726 1709 1727 VISIT_END( Type, node ); … … 1716 1734 VISIT_START( node ); 1717 1735 1718 VISIT( 1719 maybe_accept( node, &EnumInstType::forall ); 1736 VISIT({ 1737 guard_forall_subs forall_guard { *this, node }; 1738 mutate_forall( node ); 1720 1739 maybe_accept( node, &EnumInstType::params ); 1721 )1740 }) 1722 1741 1723 1742 VISIT_END( Type, node ); … … 1730 1749 VISIT_START( node ); 1731 1750 1732 VISIT( 1733 maybe_accept( node, &TraitInstType::forall ); 1751 VISIT({ 1752 guard_forall_subs forall_guard { *this, node }; 1753 mutate_forall( node ); 1734 1754 maybe_accept( node, &TraitInstType::params ); 1735 )1755 }) 1736 1756 1737 1757 VISIT_END( Type, node ); … … 1745 1765 1746 1766 VISIT( 1747 maybe_accept( node, &TypeInstType::forall ); 1748 maybe_accept( node, &TypeInstType::params ); 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 ); 1749 1774 ) 1750 1775 … … 1895 1920 guard_symtab guard { *this }; 1896 1921 auto new_node = p.second->accept( *this ); 1897 if (new_node != p.second) mutated = false;1922 if (new_node != p.second) mutated = true; 1898 1923 new_map.insert({ p.first, new_node }); 1899 1924 } … … 1911 1936 guard_symtab guard { *this }; 1912 1937 auto new_node = p.second->accept( *this ); 1913 if (new_node != p.second) mutated = false;1938 if (new_node != p.second) mutated = true; 1914 1939 new_map.insert({ p.first, new_node }); 1915 1940 }
Note:
See TracChangeset
for help on using the changeset viewer.