Changes in src/AST/Pass.impl.hpp [af746cc:7a780ad]
- File:
-
- 1 edited
-
src/AST/Pass.impl.hpp (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Pass.impl.hpp
raf746cc r7a780ad 109 109 return val; 110 110 } 111 112 //------------------------------113 /// Check if value was mutated, different for pointers and containers114 template<typename lhs_t, typename rhs_t>115 bool differs( const lhs_t * old_val, const rhs_t * new_val ) {116 return old_val != new_val;117 }118 119 template< template <class...> class container_t, typename node_t >120 bool differs( const container_t<ast::ptr< node_t >> &, const container_t<ast::ptr< node_t >> & new_val ) {121 return !new_val.empty();122 }123 111 } 124 112 … … 126 114 template< typename node_t > 127 115 auto ast::Pass< core_t >::call_accept( const node_t * node ) -> 128 typename ast::Pass< core_t >::template generic_call_accept_result<node_t>::type 129 { 116 ast::Pass< core_t >::call_accept_result_t<node_t> { 130 117 __pedantic_pass_assert( __visit_children() ); 131 118 __pedantic_pass_assert( node ); 132 119 133 static_assert( !std::is_base_of<ast::Expr, node_t>::value, "ERROR" );134 static_assert( !std::is_base_of<ast::Stmt, node_t>::value, "ERROR" );135 136 120 auto nval = node->accept( *this ); 137 __pass::result1< 138 typename std::remove_pointer< decltype( node->accept(*this) ) >::type 139 > res; 140 res.differs = nval != node; 141 res.value = nval; 142 return res; 143 } 144 145 template< typename core_t > 146 ast::__pass::template result1<ast::Expr> ast::Pass< core_t >::call_accept( const ast::Expr * expr ) { 147 __pedantic_pass_assert( __visit_children() ); 148 __pedantic_pass_assert( expr ); 149 150 auto nval = expr->accept( *this ); 151 return { nval != expr, nval }; 152 } 153 154 template< typename core_t > 155 ast::__pass::template result1<ast::Stmt> ast::Pass< core_t >::call_accept( const ast::Stmt * stmt ) { 156 __pedantic_pass_assert( __visit_children() ); 157 __pedantic_pass_assert( stmt ); 158 159 const ast::Stmt * nval = stmt->accept( *this ); 160 return { nval != stmt, nval }; 121 return { nval != node, nval }; 161 122 } 162 123 … … 230 191 ast::__pass::template resultNstmt<container_t> ast::Pass< core_t >::call_accept( const container_t< ptr<Stmt> > & statements ) { 231 192 __pedantic_pass_assert( __visit_children() ); 232 if ( statements.empty() ) return {};193 __pedantic_pass_assert( !statements.empty() ); 233 194 234 195 // We are going to aggregate errors for all these statements … … 263 224 const ast::Stmt * new_stmt = stmt->accept( *this ); 264 225 assert( new_stmt ); 265 if ( new_stmt != stmt ) { new_kids.differs = true; }266 226 267 227 // Make sure that it is either adding statements or declartions but not both … … 276 236 // Now add the statement if there is one 277 237 if ( new_stmt != stmt ) { 278 new_kids.values.emplace_back( new_stmt, i, false ); 238 new_kids.differs = true; 239 new_kids.values.emplace_back( new_stmt ); 279 240 } else { 280 new_kids.values.emplace_back( nullptr, i, true);241 new_kids.values.emplace_back( i ); 281 242 } 282 243 … … 298 259 ast::__pass::template resultN<container_t, node_t> ast::Pass< core_t >::call_accept( const container_t< ast::ptr<node_t> > & container ) { 299 260 __pedantic_pass_assert( __visit_children() ); 300 if ( container.empty() ) return {}; 261 __pedantic_pass_assert( !container.empty() ); 262 263 // Collect errors from processing all these nodes. 301 264 SemanticErrorException errors; 302 265 … … 342 305 static_assert( !std::is_same<const ast::Node * &, decltype(old_val)>::value, "ERROR" ); 343 306 344 auto new_val = call_accept( old_val ); 345 346 static_assert( !std::is_same<const ast::Node *, decltype(new_val)>::value /* || std::is_same<int, decltype(old_val)>::value */, "ERROR" ); 347 348 if ( new_val.differs ) { 307 auto result = call_accept( old_val ); 308 if ( result.differs ) { 349 309 auto new_parent = __pass::mutate<core_t>(parent); 350 new_val.apply(new_parent, field);310 result.apply( new_parent, field ); 351 311 parent = new_parent; 352 312 } … … 366 326 static_assert( !std::is_same<const ast::Node * &, decltype(old_val)>::value, "ERROR" ); 367 327 368 auto new_val = call_accept_top( old_val ); 369 370 static_assert( !std::is_same<const ast::Node *, decltype(new_val)>::value /* || std::is_same<int, decltype(old_val)>::value */, "ERROR" ); 371 372 if ( new_val.differs ) { 328 auto result = call_accept_top( old_val ); 329 if ( result.differs ) { 373 330 auto new_parent = __pass::mutate<core_t>(parent); 374 new_val.apply(new_parent, field);331 result.apply( new_parent, field ); 375 332 parent = new_parent; 376 333 } … … 390 347 static_assert( !std::is_same<const ast::Node * &, decltype(old_val)>::value, "ERROR" ); 391 348 392 auto new_val = call_accept_as_compound( old_val ); 393 394 static_assert( !std::is_same<const ast::Node *, decltype(new_val)>::value || std::is_same<int, decltype(old_val)>::value, "ERROR" ); 395 396 if ( new_val.differs ) { 349 auto result = call_accept_as_compound( old_val ); 350 if ( result.differs ) { 397 351 auto new_parent = __pass::mutate<core_t>(parent); 398 new_val.apply( new_parent, child );352 result.apply( new_parent, child ); 399 353 parent = new_parent; 400 354 } … … 452 406 template< typename core_t > 453 407 inline void ast::accept_all( ast::TranslationUnit & unit, ast::Pass< core_t > & visitor ) { 454 if ( auto ptr = __pass::translation _unit::get_cptr( visitor.core, 0 ) ) {408 if ( auto ptr = __pass::translationUnit( visitor.core, 0 ) ) { 455 409 ValueGuard<const TranslationUnit *> guard( *ptr ); 456 410 *ptr = &unit; … … 523 477 CodeLocation{}, "__func__", 524 478 new ast::ArrayType{ 525 new ast::BasicType{ ast::Basic Type::Char, ast::CV::Const },479 new ast::BasicType{ ast::BasicKind::Char, ast::CV::Const }, 526 480 nullptr, VariableLen, DynamicDim 527 481 },
Note:
See TracChangeset
for help on using the changeset viewer.