Changes in / [2b7f6f0:14d8a9b]
- Location:
- src
- Files:
-
- 5 edited
-
AST/Pass.hpp (modified) (4 diffs)
-
AST/Pass.proto.hpp (modified) (1 diff)
-
ResolvExpr/ConversionCost.cc (modified) (2 diffs)
-
ResolvExpr/ConversionCost.h (modified) (1 diff)
-
ResolvExpr/Resolver.cc (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Pass.hpp
r2b7f6f0 r14d8a9b 67 67 // | WithSymbolTable - provides symbol table functionality 68 68 // | WithForallSubstitutor - maintains links between TypeInstType and TypeDecl under mutation 69 //70 // Other Special Members:71 // | result - Either a method that takes no parameters or a field. If a method (or72 // callable field) get_result calls it, otherwise the value is returned.73 69 //------------------------------------------------------------------------------------------------- 74 70 template< typename core_t > … … 93 89 virtual ~Pass() = default; 94 90 95 /// Storage for the actual pass.96 core_t core;97 98 /// If the core defines a result, call it if possible, otherwise return it.99 inline auto get_result() -> decltype( __pass::get_result( core, '0' ) ) {100 return __pass::get_result( core, '0' );101 }102 103 91 /// Construct and run a pass on a translation unit. 104 92 template< typename... Args > … … 108 96 } 109 97 110 /// Contruct and run a pass on a pointer to extract a value. 111 template< typename node_type, typename... Args > 112 static auto read( node_type const * node, Args&&... args ) { 113 Pass<core_t> visitor( std::forward<Args>( args )... ); 114 node_type const * temp = node->accept( visitor ); 115 assert( temp == node ); 116 return visitor.get_result(); 117 } 118 119 // Versions of the above for older compilers. 98 template< typename... Args > 120 99 static void run( std::list< ptr<Decl> > & decls ) { 121 100 Pass<core_t> visitor; … … 123 102 } 124 103 125 static auto read( Node const * node ) { 126 Pass<core_t> visitor; 127 Node const * temp = node->accept( visitor ); 128 assert( temp == node ); 129 return visitor.get_result(); 130 } 104 /// Storage for the actual pass 105 core_t core; 131 106 132 107 /// Visit function declarations -
src/AST/Pass.proto.hpp
r2b7f6f0 r14d8a9b 421 421 422 422 } // namespace forall 423 424 template<typename core_t>425 static inline auto get_result( core_t & core, char ) -> decltype( core.result() ) {426 return core.result();427 }428 429 template<typename core_t>430 static inline auto get_result( core_t & core, int ) -> decltype( core.result ) {431 return core.result;432 }433 434 template<typename core_t>435 static inline void get_result( core_t &, long ) {}436 423 } // namespace __pass 437 424 } // namespace ast -
src/ResolvExpr/ConversionCost.cc
r2b7f6f0 r14d8a9b 520 520 return convertToReferenceCost( src, refType, srcIsLvalue, symtab, env, localPtrsAssignable ); 521 521 } else { 522 return ast::Pass<ConversionCost_new>::read( src, dst, srcIsLvalue, symtab, env, localConversionCost ); 522 ast::Pass<ConversionCost_new> converter( dst, srcIsLvalue, symtab, env, localConversionCost ); 523 src->accept( converter ); 524 return converter.core.cost; 523 525 } 524 526 } … … 561 563 } 562 564 } else { 563 return ast::Pass<ConversionCost_new>::read( src, dst, srcIsLvalue, symtab, env, localConversionCost ); 565 ast::Pass<ConversionCost_new> converter( dst, srcIsLvalue, symtab, env, localConversionCost ); 566 src->accept( converter ); 567 return converter.core.cost; 564 568 } 565 569 } else { -
src/ResolvExpr/ConversionCost.h
r2b7f6f0 r14d8a9b 88 88 static size_t traceId; 89 89 Cost cost; 90 Cost result() { return cost; }91 90 92 91 ConversionCost_new( const ast::Type * dst, bool srcIsLvalue, const ast::SymbolTable & symtab, -
src/ResolvExpr/Resolver.cc
r2b7f6f0 r14d8a9b 965 965 /// Finds deleted expressions in an expression tree 966 966 struct DeleteFinder_new final : public ast::WithShortCircuiting { 967 const ast::DeletedExpr * result= nullptr;967 const ast::DeletedExpr * delExpr = nullptr; 968 968 969 969 void previsit( const ast::DeletedExpr * expr ) { 970 if ( result) { visit_children = false; }971 else { result= expr; }970 if ( delExpr ) { visit_children = false; } 971 else { delExpr = expr; } 972 972 } 973 973 974 974 void previsit( const ast::Expr * ) { 975 if ( result) { visit_children = false; }975 if ( delExpr ) { visit_children = false; } 976 976 } 977 977 }; … … 980 980 /// Check if this expression is or includes a deleted expression 981 981 const ast::DeletedExpr * findDeletedExpr( const ast::Expr * expr ) { 982 return ast::Pass<DeleteFinder_new>::read( expr ); 982 ast::Pass<DeleteFinder_new> finder; 983 expr->accept( finder ); 984 return finder.core.delExpr; 983 985 } 984 986
Note:
See TracChangeset
for help on using the changeset viewer.