Changes in src/AST/Print.cpp [257a8f5:71806e0]
- File:
-
- 1 edited
-
src/AST/Print.cpp (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Print.cpp
r257a8f5 r71806e0 29 29 namespace ast { 30 30 31 namespace { 32 33 template<typename C, typename... T> 34 constexpr array<C, sizeof...(T)> make_array( T&&... values ) { 35 return array<C, sizeof...(T)>{ std::forward<T>( values )... }; 36 } 37 38 namespace Names { 39 static constexpr auto FuncSpecifiers = make_array<const char*>( 40 "inline", "_Noreturn", "fortran" 41 ); 42 43 static constexpr auto StorageClasses = make_array<const char*>( 44 "extern", "static", "auto", "register", "__thread", "_Thread_local" 45 ); 46 47 static constexpr auto Qualifiers = make_array<const char*>( 48 "const", "restrict", "volatile", "mutex", "_Atomic" 49 ); 50 } 51 52 template<typename bits_t, size_t N> 53 void print( ostream & os, const bits_t & bits, 54 const array<const char *, N> & names ) { 55 if ( !bits.any() ) return; 56 for ( size_t i = 0 ; i < N ; i += 1 ) { 57 if ( bits[i] ) { 58 os << names[i] << ' '; 59 } 60 } 31 template <typename C, typename... T> 32 constexpr array<C,sizeof...(T)> make_array(T&&... values) 33 { 34 return array<C,sizeof...(T)>{ 35 std::forward<T>(values)... 36 }; 61 37 } 62 38 … … 104 80 static const char* Names[]; 105 81 82 struct Names { 83 static constexpr auto FuncSpecifiers = make_array<const char*>( 84 "inline", "_Noreturn", "fortran" 85 ); 86 87 static constexpr auto StorageClasses = make_array<const char*>( 88 "extern", "static", "auto", "register", "__thread", "_Thread_local" 89 ); 90 91 static constexpr auto Qualifiers = make_array<const char*>( 92 "const", "restrict", "volatile", "mutex", "_Atomic" 93 ); 94 }; 95 96 template<typename storage_t, size_t N> 97 void print(const storage_t & storage, const array<const char *, N> & Names ) { 98 if ( storage.any() ) { 99 for ( size_t i = 0; i < Names.size(); i += 1 ) { 100 if ( storage[i] ) { 101 os << Names[i] << ' '; 102 } 103 } 104 } 105 } 106 107 void print( const ast::Function::Specs & specs ) { 108 print(specs, Names::FuncSpecifiers); 109 } 110 111 void print( const ast::Storage::Classes & storage ) { 112 print(storage, Names::StorageClasses); 113 } 114 115 void print( const ast::CV::Qualifiers & qualifiers ) { 116 print(qualifiers, Names::Qualifiers); 117 } 118 106 119 void print( const std::vector<ast::Label> & labels ) { 107 120 if ( labels.empty() ) return; … … 217 230 } 218 231 219 ast::print( os,node->storage );232 print( node->storage ); 220 233 os << node->typeString(); 221 234 … … 259 272 260 273 void preprint( const ast::Type * node ) { 261 ast::print( os,node->qualifiers );274 print( node->qualifiers ); 262 275 } 263 276 … … 265 278 print( node->forall ); 266 279 print( node->assertions ); 267 ast::print( os,node->qualifiers );280 print( node->qualifiers ); 268 281 } 269 282 270 283 void preprint( const ast::BaseInstType * node ) { 271 284 print( node->attributes ); 272 ast::print( os,node->qualifiers );285 print( node->qualifiers ); 273 286 } 274 287 … … 281 294 } 282 295 283 ast::print( os,node->storage );296 print( node->storage ); 284 297 285 298 if ( node->type ) { … … 325 338 if ( ! short_mode ) printAll( node->attributes ); 326 339 327 ast::print( os, node->storage ); 328 ast::print( os, node->funcSpec ); 340 print( node->storage ); 341 print( node->funcSpec ); 342 343 329 344 330 345 if ( node->type && node->isTypeFixed ) { … … 1612 1627 }; 1613 1628 1614 } // namespace1615 1616 1629 void print( ostream & os, const ast::Node * node, Indenter indent ) { 1617 1630 Printer printer { os, indent, false }; … … 1624 1637 } 1625 1638 1626 void print( ostream & os, Function::Specs specs ) { 1627 print( os, specs, Names::FuncSpecifiers ); 1639 // Annoyingly these needed to be defined out of line to avoid undefined references. 1640 // The size here needs to be explicit but at least the compiler will produce an error 1641 // if the wrong size is specified 1642 constexpr array<const char*, 3> Printer::Names::FuncSpecifiers; 1643 constexpr array<const char*, 6> Printer::Names::StorageClasses; 1644 constexpr array<const char*, 5> Printer::Names::Qualifiers; 1628 1645 } 1629 1630 void print( ostream & os, Storage::Classes storage ) {1631 print( os, storage, Names::StorageClasses );1632 }1633 1634 void print( ostream & os, CV::Qualifiers qualifiers ) {1635 print( os, qualifiers, Names::Qualifiers );1636 }1637 1638 } // namespace ast
Note:
See TracChangeset
for help on using the changeset viewer.