Ignore:
File:
1 edited

Legend:

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

    r396b830 r0e42794  
    263263                template<typename pass_t>
    264264                static inline void leave( pass_t &, long ) {}
    265         } // namespace scope
    266 
    267         // Certain passes desire an up to date symbol table automatically
     265        };
     266
     267        // Finally certain pass desire an up to date symbol table automatically
    268268        // detect the presence of a member name `symtab` and call all the members appropriately
    269269        namespace symtab {
    270270                // Some simple scoping rules
    271271                template<typename pass_t>
    272                 static inline auto enter( pass_t & pass, int ) -> decltype( pass.symtab, void() ) {
     272                static inline auto enter( pass_t & pass, int ) -> decltype( pass.symtab.enterScope(), void() ) {
    273273                        pass.symtab.enterScope();
    274274                }
     
    278278
    279279                template<typename pass_t>
    280                 static inline auto leave( pass_t & pass, int ) -> decltype( pass.symtab, void() ) {
     280                static inline auto leave( pass_t & pass, int ) -> decltype( pass.symtab.leaveScope(), void() ) {
    281281                        pass.symtab.leaveScope();
    282282                }
     
    311311                SYMTAB_FUNC1( addUnion  , const UnionDecl *     );
    312312                SYMTAB_FUNC1( addTrait  , const TraitDecl *     );
    313                 SYMTAB_FUNC2( addWith   , const std::vector< ptr<Expr> > &, const Decl * );
     313                SYMTAB_FUNC2( addWith   , const std::vector< ptr<Expr> > &, const Node * );
    314314
    315315                // A few extra functions have more complicated behaviour, they are hand written
     
    356356                #undef SYMTAB_FUNC1
    357357                #undef SYMTAB_FUNC2
    358         } // namespace symtab
    359 
    360         // Some passes need to mutate TypeDecl and properly update their pointing TypeInstType.
    361         // Detect the presence of a member name `subs` and call all members appropriately
    362         namespace forall {
    363                 // Some simple scoping rules
    364                 template<typename pass_t>
    365                 static inline auto enter( pass_t & pass, int, const ast::ParameterizedType * type )
    366                 -> decltype( pass.subs, void() ) {
    367                         if ( ! type->forall.empty() ) pass.subs.beginScope();
    368                 }
    369 
    370                 template<typename pass_t>
    371                 static inline auto enter( pass_t &, long, const ast::ParameterizedType * ) {}
    372 
    373                 template<typename pass_t>
    374                 static inline auto leave( pass_t & pass, int, const ast::ParameterizedType * type )
    375                 -> decltype( pass.subs, void() ) {
    376                         if ( ! type->forall.empty() ) { pass.subs.endScope(); }
    377                 }
    378 
    379                 template<typename pass_t>
    380                 static inline auto leave( pass_t &, long, const ast::ParameterizedType * ) {}
    381 
    382                 // Get the substitution table, if present
    383                 template<typename pass_t>
    384                 static inline auto subs( pass_t & pass, int ) -> decltype( &pass.subs ) {
    385                         return &pass.subs;
    386                 }
    387 
    388                 template<typename pass_t>
    389                 static inline ast::ForallSubstitutionTable * subs( pass_t &, long ) { return nullptr; }
    390 
    391                 // Replaces a TypeInstType's base TypeDecl according to the table
    392                 template<typename pass_t>
    393                 static inline auto replace( pass_t & pass, int, const ast::TypeInstType *& inst )
    394                 -> decltype( pass.subs, void() ) {
    395                         inst = ast::mutate_field(
    396                                 inst, &ast::TypeInstType::base, pass.subs.replace( inst->base ) );
    397                 }
    398 
    399                 template<typename pass_t>
    400                 static inline auto replace( pass_t &, long, const ast::TypeInstType *& ) {}
    401 
    402         } // namespace forall
    403 } // namespace __pass
    404 } // namespace ast
     358        };
     359};
     360};
Note: See TracChangeset for help on using the changeset viewer.