Changes in src/AST/Expr.hpp [f3cc5b6:23f99e1]
- File:
-
- 1 edited
-
src/AST/Expr.hpp (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Expr.hpp
rf3cc5b6 r23f99e1 18 18 #include <cassert> 19 19 #include <map> 20 #include <string>21 20 #include <utility> // for move 22 21 #include <vector> 23 22 24 23 #include "Fwd.hpp" // for UniqueId 25 #include "Label.hpp"26 24 #include "ParseNode.hpp" 27 #include "Visitor.hpp" 28 29 // Must be included in *all* AST classes; should be #undef'd at the end of the file 30 #define MUTATE_FRIEND template<typename node_t> friend auto mutate(const node_t * node); 25 #include "Type.hpp" // for ptr<Type> 31 26 32 27 namespace ast { … … 122 117 bool extension = false; 123 118 124 Expr( const CodeLocation & loc, const Type * res = nullptr ) 125 : ParseNode( loc ), result( res ), env(), inferred() {} 126 127 Expr * set_extension( bool ex ) { extension = ex; return this; } 128 129 virtual const Expr * accept( Visitor & v ) const override = 0; 119 Expr(const CodeLocation& loc ) : ParseNode( loc ), result(), env(), inferred() {} 120 121 Expr* set_extension( bool ex ) { extension = ex; return this; } 122 123 const Expr * accept( Visitor& v ) const override = 0; 130 124 private: 131 125 Expr * clone() const override = 0; 132 MUTATE_FRIEND133 126 }; 134 127 135 /// The application of a function to a set of parameters.136 /// Post-resolver form of `UntypedExpr`137 class ApplicationExpr final : public Expr {138 public:139 ptr<Expr> func;140 std::vector<ptr<Expr>> args;141 142 ApplicationExpr( const CodeLocation & loc, const Expr * f, std::vector<ptr<Expr>> && as = {} );143 144 const Expr * accept( Visitor & v ) const override { return v.visit( this ); }145 private:146 ApplicationExpr * clone() const override { return new ApplicationExpr{ *this }; }147 MUTATE_FRIEND148 };149 150 /// The application of a function to a set of parameters, pre-overload resolution.151 class UntypedExpr final : public Expr {152 public:153 ptr<Expr> func;154 std::vector<ptr<Expr>> args;155 156 UntypedExpr( const CodeLocation & loc, const Expr * f, std::vector<ptr<Expr>> && as = {} )157 : Expr( loc ), func( f ), args( std::move(as) ) {}158 159 /// Creates a new dereference expression160 static UntypedExpr * createDeref( const CodeLocation & loc, Expr * arg );161 /// Creates a new assignment expression162 static UntypedExpr * createAssign( const CodeLocation & loc, Expr * lhs, Expr * rhs );163 164 const Expr * accept( Visitor & v ) const override { return v.visit( this ); }165 private:166 UntypedExpr * clone() const override { return new UntypedExpr{ *this }; }167 MUTATE_FRIEND168 };169 170 /// A name whose name is as-yet undetermined.171 /// May also be used to avoid name mangling in codegen phase.172 class NameExpr final : public Expr {173 public:174 std::string name;175 176 NameExpr( const CodeLocation & loc, const std::string & n ) : Expr( loc ), name( n ) {}177 178 const Expr * accept( Visitor & v ) const override { return v.visit( this ); }179 private:180 NameExpr * clone() const override { return new NameExpr{ *this }; }181 MUTATE_FRIEND182 };183 184 /// Address-of expression `&e`185 class AddressExpr final : public Expr {186 public:187 ptr<Expr> arg;188 189 AddressExpr( const CodeLocation & loc, const Expr * a );190 191 const Expr * accept( Visitor & v ) const override { return v.visit( this ); }192 private:193 AddressExpr * clone() const override { return new AddressExpr{ *this }; }194 MUTATE_FRIEND195 };196 197 /// GCC &&label198 /// https://gcc.gnu.org/onlinedocs/gcc-3.4.2/gcc/Labels-as-Values.html199 class LabelAddressExpr final : public Expr {200 public:201 Label arg;202 203 LabelAddressExpr( const CodeLocation & loc, Label && a );204 205 const Expr * accept( Visitor & v ) const override { return v.visit( this ); }206 private:207 LabelAddressExpr * clone() const override { return new LabelAddressExpr{ *this }; }208 MUTATE_FRIEND209 };210 211 /// Whether a cast existed in the program source or not212 enum GeneratedFlag { ExplicitCast, GeneratedCast };213 214 /// A type cast, e.g. `(int)e`215 class CastExpr final : public Expr {216 public:217 ptr<Expr> arg;218 GeneratedFlag isGenerated;219 220 CastExpr( const CodeLocation & loc, const Expr * a, const Type * to,221 GeneratedFlag g = GeneratedCast ) : Expr( loc, to ), arg( a ), isGenerated( g ) {}222 /// Cast-to-void223 CastExpr( const CodeLocation & loc, const Expr * a, GeneratedFlag g = GeneratedCast );224 225 const Expr * accept( Visitor & v ) const override { return v.visit( this ); }226 private:227 CastExpr * clone() const override { return new CastExpr{ *this }; }228 MUTATE_FRIEND229 };230 231 /// A cast to "keyword types", e.g. `(thread &)t`232 class KeywordCastExpr final : public Expr {233 public:234 ptr<Expr> arg;235 enum Target { Coroutine, Thread, Monitor, NUMBER_OF_TARGETS } target;236 237 KeywordCastExpr( const CodeLocation & loc, const Expr * a, Target t )238 : Expr( loc ), arg( a ), target( t ) {}239 240 /// Get a name for the target type241 const std::string& targetString() const;242 243 const Expr * accept( Visitor & v ) const override { return v.visit( this ); }244 private:245 KeywordCastExpr * clone() const override { return new KeywordCastExpr{ *this }; }246 MUTATE_FRIEND247 };248 249 /// A virtual dynamic cast, e.g. `(virtual exception)e`250 class VirtualCastExpr final : public Expr {251 public:252 ptr<Expr> arg;253 254 VirtualCastExpr( const CodeLocation & loc, const Expr * a, const Type * to )255 : Expr( loc, to ), arg( a ) {}256 257 const Expr * accept( Visitor & v ) const override { return v.visit( this ); }258 private:259 VirtualCastExpr * clone() const override { return new VirtualCastExpr{ *this }; }260 MUTATE_FRIEND261 };262 263 /// A member selection operation before expression resolution, e.g. `q.p`264 class UntypedMemberExpr final : public Expr {265 public:266 ptr<Expr> member;267 ptr<Expr> aggregate;268 269 UntypedMemberExpr( const CodeLocation & loc, const Expr * mem, const Expr * agg )270 : Expr( loc ), member( mem ), aggregate( agg ) { assert( aggregate ); }271 272 const Expr * accept( Visitor & v ) const override { return v.visit( this ); }273 private:274 UntypedMemberExpr * clone() const override { return new UntypedMemberExpr{ *this }; }275 MUTATE_FRIEND276 };277 278 /// A member selection operation after expression resolution, e.g. `q.p`279 class MemberExpr final : public Expr {280 public:281 readonly<DeclWithType> member;282 ptr<Expr> aggregate;283 284 MemberExpr( const CodeLocation & loc, const DeclWithType * mem, const Expr * agg );285 286 const Expr * accept( Visitor & v ) const override { return v.visit( this ); }287 private:288 MemberExpr * clone() const override { return new MemberExpr{ *this }; }289 MUTATE_FRIEND290 };291 292 /// A reference to a named variable.293 class VariableExpr final : public Expr {294 public:295 readonly<DeclWithType> var;296 297 VariableExpr( const CodeLocation & loc, const DeclWithType * v );298 299 /// generates a function pointer for a given function300 static VariableExpr * functionPointer( const CodeLocation & loc, const FunctionDecl * decl );301 302 const Expr * accept( Visitor & v ) const override { return v.visit( this ); }303 private:304 VariableExpr * clone() const override { return new VariableExpr{ *this }; }305 MUTATE_FRIEND306 };307 308 /// A compile-time constant309 class ConstantExpr final : public Expr {310 union Val {311 unsigned long long ival;312 double dval;313 314 Val( unsigned long long i ) : ival( i ) {}315 Val( double d ) : dval( d ) {}316 } val;317 public:318 std::string rep;319 320 ConstantExpr(321 const CodeLocation & loc, const Type * ty, const std::string & r, unsigned long long v )322 : Expr( loc, ty ), val( v ), rep( r ) {}323 ConstantExpr( const CodeLocation & loc, const Type * ty, const std::string & r, double v )324 : Expr( loc, ty ), val( v ), rep( r ) {}325 326 /// Gets the value of this constant as an integer327 long long int intValue() const;328 /// Gets the value of this constant as floating point329 double floatValue() const;330 331 /// generates a boolean constant of the given bool332 static ConstantExpr * from_bool( const CodeLocation & loc, bool b );333 /// generates a char constant of the given char334 static ConstantExpr * from_char( const CodeLocation & loc, char c );335 /// generates an integer constant of the given int336 static ConstantExpr * from_int( const CodeLocation & loc, int i );337 /// generates an integer constant of the given unsigned long int338 static ConstantExpr * from_ulong( const CodeLocation & loc, unsigned long i );339 /// generates a floating point constant of the given double340 static ConstantExpr * from_double( const CodeLocation & loc, double d );341 /// generates an array of chars constant of the given string342 static ConstantExpr * from_string( const CodeLocation & loc, const std::string & s );343 /// generates a null pointer value for the given type. void * if omitted.344 static ConstantExpr * null( const CodeLocation & loc, const Type * ptrType = nullptr );345 346 const Expr * accept( Visitor & v ) const override { return v.visit( this ); }347 private:348 ConstantExpr * clone() const override { return new ConstantExpr{ *this }; }349 MUTATE_FRIEND350 };351 352 /// sizeof expression, e.g. `sizeof(int)`, `sizeof 3+4`353 class SizeofExpr final : public Expr {354 public:355 ptr<Expr> expr;356 ptr<Type> type;357 358 SizeofExpr( const CodeLocation & loc, const Expr * e );359 SizeofExpr( const CodeLocation & loc, const Type * t );360 // deliberately no disambiguating overload for nullptr_t361 362 const Expr * accept( Visitor & v ) const override { return v.visit( this ); }363 private:364 SizeofExpr * clone() const override { return new SizeofExpr{ *this }; }365 MUTATE_FRIEND366 };367 368 /// alignof expression, e.g. `alignof(int)`, `alignof 3+4`369 class AlignofExpr final : public Expr {370 public:371 ptr<Expr> expr;372 ptr<Type> type;373 374 AlignofExpr( const CodeLocation & loc, const Expr * e );375 AlignofExpr( const CodeLocation & loc, const Type * t );376 // deliberately no disambiguating overload for nullptr_t377 378 const Expr * accept( Visitor & v ) const override { return v.visit( this ); }379 private:380 AlignofExpr * clone() const override { return new AlignofExpr{ *this }; }381 MUTATE_FRIEND382 };383 384 /// offsetof expression before resolver determines field, e.g. `offsetof(MyStruct, myfield)`385 class UntypedOffsetofExpr final : public Expr {386 public:387 ptr<Type> type;388 std::string member;389 390 UntypedOffsetofExpr( const CodeLocation & loc, const Type * ty, const std::string & mem )391 : Expr( loc ), type( ty ), member( mem ) {}392 393 const Expr * accept( Visitor & v ) const override { return v.visit( this ); }394 private:395 UntypedOffsetofExpr * clone() const override { return new UntypedOffsetofExpr{ *this }; }396 MUTATE_FRIEND397 };398 399 /// offsetof expression after resolver determines field, e.g. `offsetof(MyStruct, myfield)`400 class OffsetofExpr final : public Expr {401 public:402 ptr<Type> type;403 readonly<DeclWithType> member;404 405 OffsetofExpr( const CodeLocation & loc, const Type * ty, const DeclWithType * mem );406 407 const Expr * accept( Visitor & v ) const override { return v.visit( this ); }408 private:409 OffsetofExpr * clone() const override { return new OffsetofExpr{ *this }; }410 MUTATE_FRIEND411 };412 413 /// a pack of field-offsets for a generic type414 class OffsetPackExpr final : public Expr {415 public:416 ptr<StructInstType> type;417 418 OffsetPackExpr( const CodeLocation & loc, const StructInstType * ty );419 420 const Expr * accept( Visitor & v ) const override { return v.visit( this ); }421 private:422 OffsetPackExpr * clone() const override { return new OffsetPackExpr{ *this }; }423 MUTATE_FRIEND424 };425 426 /// Variants of short-circuiting logical expression427 enum LogicalFlag { OrExpr, AndExpr };428 429 /// Short-circuiting boolean expression (`&&` or `||`)430 class LogicalExpr final : public Expr {431 public:432 ptr<Expr> arg1;433 ptr<Expr> arg2;434 LogicalFlag isAnd;435 436 LogicalExpr( const CodeLocation & loc, const Expr * a1, const Expr * a2, LogicalFlag ia );437 438 const Expr * accept( Visitor & v ) const override { return v.visit( this ); }439 private:440 LogicalExpr * clone() const override { return new LogicalExpr{ *this }; }441 MUTATE_FRIEND442 };443 444 /// Three-argument conditional e.g. `p ? a : b`445 class ConditionalExpr final : public Expr {446 public:447 ptr<Expr> arg1;448 ptr<Expr> arg2;449 ptr<Expr> arg3;450 451 ConditionalExpr( const CodeLocation & loc, const Expr * a1, const Expr * a2, const Expr * a3 )452 : Expr( loc ), arg1( a1 ), arg2( a2 ), arg3( a3 ) {}453 454 const Expr * accept( Visitor & v ) const override { return v.visit( this ); }455 private:456 ConditionalExpr * clone() const override { return new ConditionalExpr{ *this }; }457 MUTATE_FRIEND458 };459 460 /// Comma expression e.g. `( a , b )`461 class CommaExpr final : public Expr {462 public:463 ptr<Expr> arg1;464 ptr<Expr> arg2;465 466 CommaExpr( const CodeLocation & loc, const Expr * a1, const Expr * a2 )467 : Expr( loc ), arg1( a1 ), arg2( a2 ) {}468 469 const Expr * accept( Visitor & v ) const override { return v.visit( this ); }470 private:471 CommaExpr * clone() const override { return new CommaExpr{ *this }; }472 MUTATE_FRIEND473 };474 475 /// A type used as an expression (e.g. a type generator parameter)476 class TypeExpr final : public Expr {477 public:478 ptr<Type> type;479 480 TypeExpr( const CodeLocation & loc, const Type * t ) : Expr(loc), type(t) {}481 482 const Expr * accept( Visitor & v ) const override { return v.visit( this ); }483 private:484 TypeExpr * clone() const override { return new TypeExpr{ *this }; }485 MUTATE_FRIEND486 };487 488 /// A GCC "asm constraint operand" used in an asm statement, e.g. `[output] "=f" (result)`.489 /// https://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Machine-Constraints.html#Machine-Constraints490 class AsmExpr final : public Expr {491 public:492 ptr<Expr> inout;493 ptr<Expr> constraint;494 };495 128 496 129 //================================================================================================= … … 501 134 inline void increment( const class Expr * node, Node::ref_type ref ) { node->increment(ref); } 502 135 inline void decrement( const class Expr * node, Node::ref_type ref ) { node->decrement(ref); } 503 inline void increment( const class ApplicationExpr * node, Node::ref_type ref ) { node->increment(ref); } 504 inline void decrement( const class ApplicationExpr * node, Node::ref_type ref ) { node->decrement(ref); } 505 inline void increment( const class UntypedExpr * node, Node::ref_type ref ) { node->increment(ref); } 506 inline void decrement( const class UntypedExpr * node, Node::ref_type ref ) { node->decrement(ref); } 507 inline void increment( const class NameExpr * node, Node::ref_type ref ) { node->increment(ref); } 508 inline void decrement( const class NameExpr * node, Node::ref_type ref ) { node->decrement(ref); } 509 inline void increment( const class AddressExpr * node, Node::ref_type ref ) { node->increment(ref); } 510 inline void decrement( const class AddressExpr * node, Node::ref_type ref ) { node->decrement(ref); } 511 inline void increment( const class LabelAddressExpr * node, Node::ref_type ref ) { node->increment(ref); } 512 inline void decrement( const class LabelAddressExpr * node, Node::ref_type ref ) { node->decrement(ref); } 513 inline void increment( const class CastExpr * node, Node::ref_type ref ) { node->increment(ref); } 514 inline void decrement( const class CastExpr * node, Node::ref_type ref ) { node->decrement(ref); } 515 inline void increment( const class KeywordCastExpr * node, Node::ref_type ref ) { node->increment(ref); } 516 inline void decrement( const class KeywordCastExpr * node, Node::ref_type ref ) { node->decrement(ref); } 517 inline void increment( const class VirtualCastExpr * node, Node::ref_type ref ) { node->increment(ref); } 518 inline void decrement( const class VirtualCastExpr * node, Node::ref_type ref ) { node->decrement(ref); } 519 inline void increment( const class MemberExpr * node, Node::ref_type ref ) { node->increment(ref); } 520 inline void decrement( const class MemberExpr * node, Node::ref_type ref ) { node->decrement(ref); } 521 inline void increment( const class UntypedMemberExpr * node, Node::ref_type ref ) { node->increment(ref); } 522 inline void decrement( const class UntypedMemberExpr * node, Node::ref_type ref ) { node->decrement(ref); } 523 inline void increment( const class VariableExpr * node, Node::ref_type ref ) { node->increment(ref); } 524 inline void decrement( const class VariableExpr * node, Node::ref_type ref ) { node->decrement(ref); } 525 inline void increment( const class ConstantExpr * node, Node::ref_type ref ) { node->increment(ref); } 526 inline void decrement( const class ConstantExpr * node, Node::ref_type ref ) { node->decrement(ref); } 527 inline void increment( const class SizeofExpr * node, Node::ref_type ref ) { node->increment(ref); } 528 inline void decrement( const class SizeofExpr * node, Node::ref_type ref ) { node->decrement(ref); } 529 inline void increment( const class AlignofExpr * node, Node::ref_type ref ) { node->increment(ref); } 530 inline void decrement( const class AlignofExpr * node, Node::ref_type ref ) { node->decrement(ref); } 531 inline void increment( const class UntypedOffsetofExpr * node, Node::ref_type ref ) { node->increment(ref); } 532 inline void decrement( const class UntypedOffsetofExpr * node, Node::ref_type ref ) { node->decrement(ref); } 533 inline void increment( const class OffsetofExpr * node, Node::ref_type ref ) { node->increment(ref); } 534 inline void decrement( const class OffsetofExpr * node, Node::ref_type ref ) { node->decrement(ref); } 535 inline void increment( const class OffsetPackExpr * node, Node::ref_type ref ) { node->increment(ref); } 536 inline void decrement( const class OffsetPackExpr * node, Node::ref_type ref ) { node->decrement(ref); } 537 inline void increment( const class LogicalExpr * node, Node::ref_type ref ) { node->increment(ref); } 538 inline void decrement( const class LogicalExpr * node, Node::ref_type ref ) { node->decrement(ref); } 539 inline void increment( const class ConditionalExpr * node, Node::ref_type ref ) { node->increment(ref); } 540 inline void decrement( const class ConditionalExpr * node, Node::ref_type ref ) { node->decrement(ref); } 541 inline void increment( const class CommaExpr * node, Node::ref_type ref ) { node->increment(ref); } 542 inline void decrement( const class CommaExpr * node, Node::ref_type ref ) { node->decrement(ref); } 543 inline void increment( const class TypeExpr * node, Node::ref_type ref ) { node->increment(ref); } 544 inline void decrement( const class TypeExpr * node, Node::ref_type ref ) { node->decrement(ref); } 545 inline void increment( const class AsmExpr * node, Node::ref_type ref ) { node->increment(ref); } 546 inline void decrement( const class AsmExpr * node, Node::ref_type ref ) { node->decrement(ref); } 136 // inline void increment( const class ApplicationExpr * node, Node::ref_type ref ) { node->increment(ref); } 137 // inline void decrement( const class ApplicationExpr * node, Node::ref_type ref ) { node->decrement(ref); } 138 // inline void increment( const class UntypedExpr * node, Node::ref_type ref ) { node->increment(ref); } 139 // inline void decrement( const class UntypedExpr * node, Node::ref_type ref ) { node->decrement(ref); } 140 // inline void increment( const class NameExpr * node, Node::ref_type ref ) { node->increment(ref); } 141 // inline void decrement( const class NameExpr * node, Node::ref_type ref ) { node->decrement(ref); } 142 // inline void increment( const class AddressExpr * node, Node::ref_type ref ) { node->increment(ref); } 143 // inline void decrement( const class AddressExpr * node, Node::ref_type ref ) { node->decrement(ref); } 144 // inline void increment( const class LabelAddressExpr * node, Node::ref_type ref ) { node->increment(ref); } 145 // inline void decrement( const class LabelAddressExpr * node, Node::ref_type ref ) { node->decrement(ref); } 146 // inline void increment( const class CastExpr * node, Node::ref_type ref ) { node->increment(ref); } 147 // inline void decrement( const class CastExpr * node, Node::ref_type ref ) { node->decrement(ref); } 148 // inline void increment( const class KeywordCastExpr * node, Node::ref_type ref ) { node->increment(ref); } 149 // inline void decrement( const class KeywordCastExpr * node, Node::ref_type ref ) { node->decrement(ref); } 150 // inline void increment( const class VirtualCastExpr * node, Node::ref_type ref ) { node->increment(ref); } 151 // inline void decrement( const class VirtualCastExpr * node, Node::ref_type ref ) { node->decrement(ref); } 152 // inline void increment( const class MemberExpr * node, Node::ref_type ref ) { node->increment(ref); } 153 // inline void decrement( const class MemberExpr * node, Node::ref_type ref ) { node->decrement(ref); } 154 // inline void increment( const class UntypedMemberExpr * node, Node::ref_type ref ) { node->increment(ref); } 155 // inline void decrement( const class UntypedMemberExpr * node, Node::ref_type ref ) { node->decrement(ref); } 156 // inline void increment( const class VariableExpr * node, Node::ref_type ref ) { node->increment(ref); } 157 // inline void decrement( const class VariableExpr * node, Node::ref_type ref ) { node->decrement(ref); } 158 // inline void increment( const class ConstantExpr * node, Node::ref_type ref ) { node->increment(ref); } 159 // inline void decrement( const class ConstantExpr * node, Node::ref_type ref ) { node->decrement(ref); } 160 // inline void increment( const class SizeofExpr * node, Node::ref_type ref ) { node->increment(ref); } 161 // inline void decrement( const class SizeofExpr * node, Node::ref_type ref ) { node->decrement(ref); } 162 // inline void increment( const class AlignofExpr * node, Node::ref_type ref ) { node->increment(ref); } 163 // inline void decrement( const class AlignofExpr * node, Node::ref_type ref ) { node->decrement(ref); } 164 // inline void increment( const class UntypedOffsetofExpr * node, Node::ref_type ref ) { node->increment(ref); } 165 // inline void decrement( const class UntypedOffsetofExpr * node, Node::ref_type ref ) { node->decrement(ref); } 166 // inline void increment( const class OffsetofExpr * node, Node::ref_type ref ) { node->increment(ref); } 167 // inline void decrement( const class OffsetofExpr * node, Node::ref_type ref ) { node->decrement(ref); } 168 // inline void increment( const class OffsetPackExpr * node, Node::ref_type ref ) { node->increment(ref); } 169 // inline void decrement( const class OffsetPackExpr * node, Node::ref_type ref ) { node->decrement(ref); } 170 // inline void increment( const class AttrExpr * node, Node::ref_type ref ) { node->increment(ref); } 171 // inline void decrement( const class AttrExpr * node, Node::ref_type ref ) { node->decrement(ref); } 172 // inline void increment( const class LogicalExpr * node, Node::ref_type ref ) { node->increment(ref); } 173 // inline void decrement( const class LogicalExpr * node, Node::ref_type ref ) { node->decrement(ref); } 174 // inline void increment( const class ConditionalExpr * node, Node::ref_type ref ) { node->increment(ref); } 175 // inline void decrement( const class ConditionalExpr * node, Node::ref_type ref ) { node->decrement(ref); } 176 // inline void increment( const class CommaExpr * node, Node::ref_type ref ) { node->increment(ref); } 177 // inline void decrement( const class CommaExpr * node, Node::ref_type ref ) { node->decrement(ref); } 178 // inline void increment( const class TypeExpr * node, Node::ref_type ref ) { node->increment(ref); } 179 // inline void decrement( const class TypeExpr * node, Node::ref_type ref ) { node->decrement(ref); } 180 // inline void increment( const class AsmExpr * node, Node::ref_type ref ) { node->increment(ref); } 181 // inline void decrement( const class AsmExpr * node, Node::ref_type ref ) { node->decrement(ref); } 547 182 // inline void increment( const class ImplicitCopyCtorExpr * node, Node::ref_type ref ) { node->increment(ref); } 548 183 // inline void decrement( const class ImplicitCopyCtorExpr * node, Node::ref_type ref ) { node->decrement(ref); } … … 579 214 } 580 215 581 #undef MUTATE_FRIEND582 583 216 // Local Variables: // 584 217 // tab-width: 4 //
Note:
See TracChangeset
for help on using the changeset viewer.