- Timestamp:
- Jun 27, 2019, 5:16:54 PM (6 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 7d0881c
- Parents:
- 6be3b7d6
- Location:
- src/AST
- Files:
-
- 3 added
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified src/AST/Decl.cpp ¶
r6be3b7d6 re0e9a0b 52 52 53 53 const Type * FunctionDecl::get_type() const { return type.get(); } 54 void FunctionDecl::set_type(Type * t) { type = strict_dynamic_cast< FunctionType* >( t ); } 54 void FunctionDecl::set_type( const Type * t ) { 55 type = strict_dynamic_cast< const FunctionType * >( t ); 56 } 55 57 56 58 // --- TypeDecl -
TabularUnified src/AST/Decl.hpp ¶
r6be3b7d6 re0e9a0b 87 87 virtual const Type * get_type() const = 0; 88 88 /// Set type of this declaration. May be verified by subclass 89 virtual void set_type( Type *) = 0;89 virtual void set_type( const Type * ) = 0; 90 90 91 91 const DeclWithType * accept( Visitor & v ) const override = 0; … … 110 110 111 111 const Type* get_type() const override { return type; } 112 void set_type( Type * ty ) override { type = ty; }112 void set_type( const Type * ty ) override { type = ty; } 113 113 114 114 const DeclWithType * accept( Visitor& v ) const override { return v.visit( this ); } … … 132 132 133 133 const Type * get_type() const override; 134 void set_type( Type * t) override;134 void set_type( const Type * t ) override; 135 135 136 136 bool has_body() const { return stmts; } … … 149 149 std::vector<ptr<DeclWithType>> assertions; 150 150 151 NamedTypeDecl( const CodeLocation& loc, const std::string& name, Storage::Classes storage, 152 Type* b, Linkage::Spec spec = Linkage::Cforall ) 151 NamedTypeDecl( 152 const CodeLocation & loc, const std::string & name, Storage::Classes storage, 153 const Type * b, Linkage::Spec spec = Linkage::Cforall ) 153 154 : Decl( loc, name, storage, spec ), base( b ), params(), assertions() {} 154 155 … … 185 186 }; 186 187 187 TypeDecl( const CodeLocation& loc, const std::string& name, Storage::Classes storage, Type* b, 188 TypeVar::Kind k, bool s, Type* i = nullptr ) 188 TypeDecl( 189 const CodeLocation & loc, const std::string & name, Storage::Classes storage, 190 const Type * b, TypeVar::Kind k, bool s, const Type * i = nullptr ) 189 191 : NamedTypeDecl( loc, name, storage, b ), kind( k ), sized( k == TypeVar::Ttype || s ), 190 192 init( i ) {} … … 201 203 TypeDecl * clone() const override { return new TypeDecl{ *this }; } 202 204 MUTATE_FRIEND 203 friend class ParameterizedType; // to allow deep clones204 205 }; 205 206 -
TabularUnified src/AST/Node.cpp ¶
r6be3b7d6 re0e9a0b 56 56 57 57 template< typename node_t, enum ast::Node::ref_type ref_t > 58 void ast::ptr_base<node_t, ref_t>::_check() const { if(node) assert(node->was_ever_strong == false || node->strong_count > 0); } 58 void ast::ptr_base<node_t, ref_t>::_check() const { 59 // if(node) assert(node->was_ever_strong == false || node->strong_count > 0); 60 } 59 61 60 62 template< typename node_t, enum ast::Node::ref_type ref_t > -
TabularUnified src/AST/Node.hpp ¶
r6be3b7d6 re0e9a0b 125 125 } 126 126 127 /// Mutate an entire indexed collection by cloning to accepted value 128 template<typename node_t, typename parent_t, typename coll_t> 129 const node_t * mutate_each( const node_t * node, coll_t parent_t::* field, Visitor & v ) { 130 for ( unsigned i = 0; i < (node->*field).size(); ++i ) { 131 node = mutate_field_index( node, field, i, (node->*field)[i]->accept( v ) ); 132 } 133 return node; 134 } 135 127 136 std::ostream& operator<< ( std::ostream& out, const Node * node ); 128 137 -
TabularUnified src/AST/Pass.hpp ¶
r6be3b7d6 re0e9a0b 35 35 #include "AST/SymbolTable.hpp" 36 36 37 #include "AST/ForallSubstitutionTable.hpp" 38 37 39 // Private prelude header, needed for some of the magic tricks this class pulls off 38 40 #include "AST/Pass.proto.hpp" … … 46 48 // 47 49 // Several additional features are available through inheritance 48 // | WithTypeSubstitution - provides polymorphic const TypeSubstitution * env for the 49 // current expression 50 // | WithStmtsToAdd - provides the ability to insert statements before or after the current 51 // statement by adding new statements into stmtsToAddBefore or 52 // stmtsToAddAfter respectively. 53 // | WithDeclsToAdd - provides the ability to insert declarations before or after the current 54 // declarations by adding new DeclStmt into declsToAddBefore or 55 // declsToAddAfter respectively. 56 // | WithShortCircuiting - provides the ability to skip visiting child nodes; set visit_children 57 // to false in pre{visit,visit} to skip visiting children 58 // | WithGuards - provides the ability to save/restore data like a LIFO stack; to save, 59 // call GuardValue with the variable to save, the variable will 60 // automatically be restored to its previous value after the corresponding 61 // postvisit/postmutate teminates. 62 // | WithVisitorRef - provides an pointer to the templated visitor wrapper 63 // | WithSymbolTable - provides symbol table functionality 50 // | WithTypeSubstitution - provides polymorphic const TypeSubstitution * env for the 51 // current expression 52 // | WithStmtsToAdd - provides the ability to insert statements before or after the current 53 // statement by adding new statements into stmtsToAddBefore or 54 // stmtsToAddAfter respectively. 55 // | WithDeclsToAdd - provides the ability to insert declarations before or after the 56 // current declarations by adding new DeclStmt into declsToAddBefore or 57 // declsToAddAfter respectively. 58 // | WithShortCircuiting - provides the ability to skip visiting child nodes; set visit_children 59 // to false in pre{visit,visit} to skip visiting children 60 // | WithGuards - provides the ability to save/restore data like a LIFO stack; to save, 61 // call GuardValue with the variable to save, the variable will 62 // automatically be restored to its previous value after the 63 // corresponding postvisit/postmutate teminates. 64 // | WithVisitorRef - provides an pointer to the templated visitor wrapper 65 // | WithSymbolTable - provides symbol table functionality 66 // | WithForallSubstitutor - maintains links between TypeInstType and TypeDecl under mutation 64 67 //------------------------------------------------------------------------------------------------- 65 68 template< typename pass_t > … … 201 204 container_t< ptr<node_t> > call_accept( const container_t< ptr<node_t> > & container ); 202 205 206 /// Mutate forall-list, accounting for presence of type substitution map 207 template<typename node_t> 208 void mutate_forall( const node_t *& ); 209 203 210 public: 204 211 /// Logic to call the accept and mutate the parent if needed, delegates call to accept … … 221 228 }; 222 229 230 /// Internal RAII guard for forall substitutions 231 struct guard_forall_subs { 232 guard_forall_subs( Pass<pass_t> & pass, const ParameterizedType * type ) 233 : pass( pass ), type( type ) { __pass::forall::enter(pass.pass, 0, type ); } 234 ~guard_forall_subs() { __pass::forall::leave(pass.pass, 0, type ); } 235 Pass<pass_t> & pass; 236 const ParameterizedType * type; 237 }; 238 223 239 private: 224 240 bool inFunction = false; … … 313 329 SymbolTable symtab; 314 330 }; 331 332 /// Use when the templated visitor needs to keep TypeInstType instances properly linked to TypeDecl 333 struct WithForallSubstitutor { 334 ForallSubstitutionTable subs; 335 }; 336 315 337 } 316 338 -
TabularUnified src/AST/Pass.impl.hpp ¶
r6be3b7d6 re0e9a0b 127 127 , decltype( node->accept(*this) ) 128 128 >::type 129 130 129 { 131 130 __pedantic_pass_assert( __visit_children() ); 132 __pedantic_pass_assert( expr);131 __pedantic_pass_assert( node ); 133 132 134 133 static_assert( !std::is_base_of<ast::Expr, node_t>::value, "ERROR"); … … 323 322 } 324 323 324 325 template< typename pass_t > 326 template< typename node_t > 327 void ast::Pass< pass_t >::mutate_forall( const node_t *& node ) { 328 if ( auto subs = __pass::forall::subs( pass, 0 ) ) { 329 // tracking TypeDecl substitution, full clone 330 if ( node->forall.empty() ) return; 331 332 node_t * mut = mutate( node ); 333 mut->forall = subs->clone( node->forall, *this ); 334 node = mut; 335 } else { 336 // not tracking TypeDecl substitution, just mutate 337 maybe_accept( node, &node_t::forall ); 338 } 339 } 325 340 } 326 341 … … 1667 1682 VISIT_START( node ); 1668 1683 1669 VISIT( 1670 maybe_accept( node, &FunctionType::forall ); 1684 VISIT({ 1685 guard_forall_subs forall_guard { *this, node }; 1686 mutate_forall( node ); 1671 1687 maybe_accept( node, &FunctionType::returns ); 1672 1688 maybe_accept( node, &FunctionType::params ); 1673 )1689 }) 1674 1690 1675 1691 VISIT_END( Type, node ); … … 1686 1702 VISIT({ 1687 1703 guard_symtab guard { *this }; 1688 maybe_accept( node, &StructInstType::forall ); 1704 guard_forall_subs forall_guard { *this, node }; 1705 mutate_forall( node ); 1689 1706 maybe_accept( node, &StructInstType::params ); 1690 1707 }) … … 1699 1716 VISIT_START( node ); 1700 1717 1701 __pass::symtab::add Struct( pass, 0, node->name );1702 1703 {1718 __pass::symtab::addUnion( pass, 0, node->name ); 1719 1720 VISIT({ 1704 1721 guard_symtab guard { *this }; 1705 maybe_accept( node, &UnionInstType::forall ); 1722 guard_forall_subs forall_guard { *this, node }; 1723 mutate_forall( node ); 1706 1724 maybe_accept( node, &UnionInstType::params ); 1707 } 1725 }) 1708 1726 1709 1727 VISIT_END( Type, node ); … … 1716 1734 VISIT_START( node ); 1717 1735 1718 VISIT( 1719 maybe_accept( node, &EnumInstType::forall ); 1736 VISIT({ 1737 guard_forall_subs forall_guard { *this, node }; 1738 mutate_forall( node ); 1720 1739 maybe_accept( node, &EnumInstType::params ); 1721 )1740 }) 1722 1741 1723 1742 VISIT_END( Type, node ); … … 1730 1749 VISIT_START( node ); 1731 1750 1732 VISIT( 1733 maybe_accept( node, &TraitInstType::forall ); 1751 VISIT({ 1752 guard_forall_subs forall_guard { *this, node }; 1753 mutate_forall( node ); 1734 1754 maybe_accept( node, &TraitInstType::params ); 1735 )1755 }) 1736 1756 1737 1757 VISIT_END( Type, node ); … … 1745 1765 1746 1766 VISIT( 1747 maybe_accept( node, &TypeInstType::forall ); 1748 maybe_accept( node, &TypeInstType::params ); 1767 { 1768 guard_forall_subs forall_guard { *this, node }; 1769 mutate_forall( node ); 1770 maybe_accept( node, &TypeInstType::params ); 1771 } 1772 // ensure that base re-bound if doing substitution 1773 __pass::forall::replace( pass, 0, node ); 1749 1774 ) 1750 1775 -
TabularUnified src/AST/Pass.proto.hpp ¶
r6be3b7d6 re0e9a0b 263 263 template<typename pass_t> 264 264 static inline void leave( pass_t &, long ) {} 265 } ;266 267 // Finally certain pass desire an up to date symbol table automatically265 } // namespace scope 266 267 // Certain passes desire an up to date symbol table automatically 268 268 // detect the presence of a member name `symtab` and call all the members appropriately 269 269 namespace symtab { … … 356 356 #undef SYMTAB_FUNC1 357 357 #undef SYMTAB_FUNC2 358 }; 359 }; 360 }; 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 -
TabularUnified src/AST/Type.cpp ¶
r6be3b7d6 re0e9a0b 21 21 22 22 #include "Decl.hpp" 23 #include "ForallSubstitutor.hpp" // for substituteForall 23 24 #include "Init.hpp" 25 #include "Common/utility.h" // for copy, move 24 26 #include "InitTweak/InitTweak.h" // for getPointerBase 25 27 #include "Tuples/Tuples.h" // for isTtype … … 91 93 ); 92 94 95 // --- ParameterizedType 96 97 void ParameterizedType::initWithSub( 98 const ParameterizedType & o, Pass< ForallSubstitutor > & sub 99 ) { 100 forall = sub.pass( o.forall ); 101 } 102 93 103 // --- FunctionType 104 105 FunctionType::FunctionType( const FunctionType & o ) 106 : ParameterizedType( o.qualifiers, copy( o.attributes ) ), returns(), params(), 107 isVarArgs( o.isVarArgs ) { 108 Pass< ForallSubstitutor > sub; 109 initWithSub( o, sub ); // initialize substitution map 110 returns = sub.pass( o.returns ); // apply to return and parameter types 111 params = sub.pass( o.params ); 112 } 94 113 95 114 namespace { … … 107 126 108 127 // --- ReferenceToType 128 129 void ReferenceToType::initWithSub( const ReferenceToType & o, Pass< ForallSubstitutor > & sub ) { 130 ParameterizedType::initWithSub( o, sub ); // initialize substitution 131 params = sub.pass( o.params ); // apply to parameters 132 } 133 134 ReferenceToType::ReferenceToType( const ReferenceToType & o ) 135 : ParameterizedType( o.qualifiers, copy( o.attributes ) ), params(), name( o.name ), 136 hoistType( o.hoistType ) { 137 Pass< ForallSubstitutor > sub; 138 initWithSub( o, sub ); 139 } 140 109 141 std::vector<readonly<Decl>> ReferenceToType::lookup( const std::string& name ) const { 110 142 assertf( aggr(), "Must have aggregate to perform lookup" ); … … 119 151 // --- StructInstType 120 152 121 StructInstType::StructInstType( const StructDecl * b, CV::Qualifiers q,122 std::vector<ptr<Attribute>>&& as )123 : ReferenceToType( b->name, q, std::move(as) ), base( b ) {}153 StructInstType::StructInstType( 154 const StructDecl * b, CV::Qualifiers q, std::vector<ptr<Attribute>>&& as ) 155 : ReferenceToType( b->name, q, move(as) ), base( b ) {} 124 156 125 157 bool StructInstType::isComplete() const { return base ? base->body : false; } … … 127 159 // --- UnionInstType 128 160 129 UnionInstType::UnionInstType( const UnionDecl * b, CV::Qualifiers q,130 std::vector<ptr<Attribute>>&& as )131 : ReferenceToType( b->name, q, std::move(as) ), base( b ) {}161 UnionInstType::UnionInstType( 162 const UnionDecl * b, CV::Qualifiers q, std::vector<ptr<Attribute>>&& as ) 163 : ReferenceToType( b->name, q, move(as) ), base( b ) {} 132 164 133 165 bool UnionInstType::isComplete() const { return base ? base->body : false; } … … 135 167 // --- EnumInstType 136 168 137 EnumInstType::EnumInstType( const EnumDecl * b, CV::Qualifiers q,138 std::vector<ptr<Attribute>>&& as )139 : ReferenceToType( b->name, q, std::move(as) ), base( b ) {}169 EnumInstType::EnumInstType( 170 const EnumDecl * b, CV::Qualifiers q, std::vector<ptr<Attribute>>&& as ) 171 : ReferenceToType( b->name, q, move(as) ), base( b ) {} 140 172 141 173 bool EnumInstType::isComplete() const { return base ? base->body : false; } … … 143 175 // --- TraitInstType 144 176 145 TraitInstType::TraitInstType( const TraitDecl * b, CV::Qualifiers q,146 std::vector<ptr<Attribute>>&& as )147 : ReferenceToType( b->name, q, std::move(as) ), base( b ) {}177 TraitInstType::TraitInstType( 178 const TraitDecl * b, CV::Qualifiers q, std::vector<ptr<Attribute>>&& as ) 179 : ReferenceToType( b->name, q, move(as) ), base( b ) {} 148 180 149 181 // --- TypeInstType 182 183 TypeInstType::TypeInstType( const TypeInstType & o ) 184 : ReferenceToType( o.name, o.qualifiers, copy( o.attributes ) ), base(), kind( o.kind ) { 185 Pass< ForallSubstitutor > sub; 186 initWithSub( o, sub ); // initialize substitution 187 base = sub.pass( o.base ); // apply to base type 188 } 150 189 151 190 void TypeInstType::set_base( const TypeDecl * b ) { … … 159 198 160 199 TupleType::TupleType( std::vector<ptr<Type>> && ts, CV::Qualifiers q ) 161 : Type( q ), types( std::move(ts) ), members() {200 : Type( q ), types( move(ts) ), members() { 162 201 // This constructor is awkward. `TupleType` needs to contain objects so that members can be 163 202 // named, but members without initializer nodes end up getting constructors, which breaks -
TabularUnified src/AST/Type.hpp ¶
r6be3b7d6 re0e9a0b 33 33 34 34 namespace ast { 35 36 template< typename T > class Pass; 37 class ForallSubstitutor; 35 38 36 39 class Type : public Node { … … 266 269 /// Base type for potentially forall-qualified types 267 270 class ParameterizedType : public Type { 271 protected: 272 /// initializes forall with substitutor 273 void initWithSub( const ParameterizedType & o, Pass< ForallSubstitutor > & sub ); 268 274 public: 269 275 using ForallList = std::vector<ptr<TypeDecl>>; … … 278 284 : Type(q, std::move(as)), forall() {} 279 285 280 ParameterizedType( const ParameterizedType & o ) : Type( o ), forall() { 281 // one-level deep clone to avoid weak-reference errors 282 forall.reserve( o.forall.size() ); 283 for ( const TypeDecl * d : o.forall ) { forall.emplace_back( d->clone() ); } 284 } 286 // enforce use of ForallSubstitutor to copy parameterized type 287 ParameterizedType( const ParameterizedType & ) = delete; 285 288 286 289 ParameterizedType( ParameterizedType && ) = default; … … 312 315 : ParameterizedType(q), returns(), params(), isVarArgs(va) {} 313 316 317 FunctionType( const FunctionType & o ); 318 314 319 /// true if either the parameters or return values contain a tttype 315 320 bool isTtype() const; … … 325 330 /// base class for types that refer to types declared elsewhere (aggregates and typedefs) 326 331 class ReferenceToType : public ParameterizedType { 332 protected: 333 /// Initializes forall and parameters based on substitutor 334 void initWithSub( const ReferenceToType & o, Pass< ForallSubstitutor > & sub ); 327 335 public: 328 336 std::vector<ptr<Expr>> params; … … 330 338 bool hoistType = false; 331 339 332 ReferenceToType( const std::string& n, CV::Qualifiers q = {},333 std::vector<ptr<Attribute>> && as = {} )340 ReferenceToType( 341 const std::string& n, CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} ) 334 342 : ParameterizedType(q, std::move(as)), params(), name(n) {} 343 344 ReferenceToType( const ReferenceToType & o ); 335 345 336 346 /// Gets aggregate declaration this type refers to … … 349 359 readonly<StructDecl> base; 350 360 351 StructInstType( const std::string& n, CV::Qualifiers q = {},352 std::vector<ptr<Attribute>> && as = {} )361 StructInstType( 362 const std::string& n, CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} ) 353 363 : ReferenceToType( n, q, std::move(as) ), base() {} 354 StructInstType( const StructDecl * b, CV::Qualifiers q = {}, 355 std::vector<ptr<Attribute>> && as = {} ); 364 365 StructInstType( 366 const StructDecl * b, CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} ); 356 367 357 368 bool isComplete() const override; … … 370 381 readonly<UnionDecl> base; 371 382 372 UnionInstType( const std::string& n, CV::Qualifiers q = {},373 std::vector<ptr<Attribute>> && as = {} )383 UnionInstType( 384 const std::string& n, CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} ) 374 385 : ReferenceToType( n, q, std::move(as) ), base() {} 375 UnionInstType( const UnionDecl * b, CV::Qualifiers q = {}, 376 std::vector<ptr<Attribute>> && as = {} ); 386 387 UnionInstType( 388 const UnionDecl * b, CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} ); 377 389 378 390 bool isComplete() const override; … … 391 403 readonly<EnumDecl> base; 392 404 393 EnumInstType( const std::string& n, CV::Qualifiers q = {},394 std::vector<ptr<Attribute>> && as = {} )405 EnumInstType( 406 const std::string& n, CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} ) 395 407 : ReferenceToType( n, q, std::move(as) ), base() {} 396 EnumInstType( const EnumDecl * b, CV::Qualifiers q = {}, 397 std::vector<ptr<Attribute>> && as = {} ); 408 409 EnumInstType( 410 const EnumDecl * b, CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} ); 398 411 399 412 bool isComplete() const override; … … 412 425 readonly<TraitDecl> base; 413 426 414 TraitInstType( const std::string& n, CV::Qualifiers q = {},415 std::vector<ptr<Attribute>> && as = {} )427 TraitInstType( 428 const std::string& n, CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} ) 416 429 : ReferenceToType( n, q, std::move(as) ), base() {} 417 TraitInstType( const TraitDecl * b, CV::Qualifiers q = {}, 418 std::vector<ptr<Attribute>> && as = {} ); 430 431 TraitInstType( 432 const TraitDecl * b, CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} ); 419 433 420 434 // not meaningful for TraitInstType … … 435 449 TypeVar::Kind kind; 436 450 437 TypeInstType( const std::string& n, const TypeDecl * b, CV::Qualifiers q = {}, 451 TypeInstType( 452 const std::string& n, const TypeDecl * b, CV::Qualifiers q = {}, 438 453 std::vector<ptr<Attribute>> && as = {} ) 439 454 : ReferenceToType( n, q, std::move(as) ), base( b ), kind( b->kind ) {} 440 TypeInstType( const std::string& n, TypeVar::Kind k, CV::Qualifiers q = {}, 455 456 TypeInstType( 457 const std::string& n, TypeVar::Kind k, CV::Qualifiers q = {}, 441 458 std::vector<ptr<Attribute>> && as = {} ) 442 459 : ReferenceToType( n, q, std::move(as) ), base(), kind( k ) {} 460 461 TypeInstType( const TypeInstType & o ); 443 462 444 463 /// sets `base`, updating `kind` correctly -
TabularUnified src/AST/module.mk ¶
r6be3b7d6 re0e9a0b 22 22 AST/DeclReplacer.cpp \ 23 23 AST/Expr.cpp \ 24 AST/ForallSubstitutionTable.cpp \ 24 25 AST/GenericSubstitution.cpp \ 25 26 AST/Init.cpp \
Note: See TracChangeset
for help on using the changeset viewer.