Changeset 893e106 for src/AST/Pass.proto.hpp
- Timestamp:
- May 22, 2019, 5:23:02 PM (6 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, cleanup-dtors, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 722c4831
- Parents:
- 76ed81f (diff), ef5ef56 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Pass.proto.hpp
r76ed81f r893e106 107 107 bool * m_prev; 108 108 bool_ref * m_ref; 109 }; 110 111 template<typename pass_t, typename node_t> 112 struct is_valid_previsit { 113 using ret_t = decltype( ((pass_t*)nullptr)->previsit( (const node_t *)nullptr ) ); 114 115 static constexpr bool value = std::is_void< ret_t >::value || 116 std::is_base_of<const node_t, typename std::remove_pointer<ret_t>::type >::value; 109 117 }; 110 118 … … 127 135 static inline auto previsit( pass_t & pass, const node_t * & node, int ) -> decltype( pass.previsit( node ), void() ) { 128 136 static_assert( 129 std::is_base_of<const node_t, typename std::remove_pointer<decltype( pass.previsit( node ) )>::type>::value,130 "Previsit may not change the type of the node. Use postvisit instead."137 is_valid_previsit<pass_t, node_t>::value, 138 "Previsit may not change the type of the node. It must return its paremeter or void." 131 139 ); 132 node = pass.previsit( node ); 133 assert(node); 140 if(std::is_void< decltype( pass.previsit(node) ) >::value) { 141 pass.previsit( node ); 142 } else { 143 node = pass.previsit( node ); 144 assert(node); 145 } 134 146 } 135 147 … … 139 151 // PostVisit : never mutates the passed pointer but may return a different node 140 152 template<typename pass_t, typename node_t> 141 static inline auto postvisit( pass_t & pass, const node_t * node, int ) -> decltype( pass.postvisit( node ), (const node_t *)nullptr ) { 153 static inline auto postvisit( pass_t & pass, const node_t * node, int ) -> 154 decltype( pass.postvisit( node ), node->accept( *(Visitor*)nullptr ) ) 155 { 142 156 return pass.postvisit( node ); 143 157 }
Note: See TracChangeset
for help on using the changeset viewer.