Changes in src/AST/Expr.hpp [23f99e1:f3cc5b6]
- File:
-
- 1 edited
-
src/AST/Expr.hpp (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Expr.hpp
r23f99e1 rf3cc5b6 18 18 #include <cassert> 19 19 #include <map> 20 #include <string> 20 21 #include <utility> // for move 21 22 #include <vector> 22 23 23 24 #include "Fwd.hpp" // for UniqueId 25 #include "Label.hpp" 24 26 #include "ParseNode.hpp" 25 #include "Type.hpp" // for ptr<Type> 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); 26 31 27 32 namespace ast { … … 117 122 bool extension = false; 118 123 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; 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; 124 130 private: 125 131 Expr * clone() const override = 0; 126 }; 127 132 MUTATE_FRIEND 133 }; 134 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_FRIEND 148 }; 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 expression 160 static UntypedExpr * createDeref( const CodeLocation & loc, Expr * arg ); 161 /// Creates a new assignment expression 162 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_FRIEND 168 }; 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_FRIEND 182 }; 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_FRIEND 195 }; 196 197 /// GCC &&label 198 /// https://gcc.gnu.org/onlinedocs/gcc-3.4.2/gcc/Labels-as-Values.html 199 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_FRIEND 209 }; 210 211 /// Whether a cast existed in the program source or not 212 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-void 223 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_FRIEND 229 }; 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 type 241 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_FRIEND 247 }; 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_FRIEND 261 }; 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_FRIEND 276 }; 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_FRIEND 290 }; 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 function 300 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_FRIEND 306 }; 307 308 /// A compile-time constant 309 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 integer 327 long long int intValue() const; 328 /// Gets the value of this constant as floating point 329 double floatValue() const; 330 331 /// generates a boolean constant of the given bool 332 static ConstantExpr * from_bool( const CodeLocation & loc, bool b ); 333 /// generates a char constant of the given char 334 static ConstantExpr * from_char( const CodeLocation & loc, char c ); 335 /// generates an integer constant of the given int 336 static ConstantExpr * from_int( const CodeLocation & loc, int i ); 337 /// generates an integer constant of the given unsigned long int 338 static ConstantExpr * from_ulong( const CodeLocation & loc, unsigned long i ); 339 /// generates a floating point constant of the given double 340 static ConstantExpr * from_double( const CodeLocation & loc, double d ); 341 /// generates an array of chars constant of the given string 342 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_FRIEND 350 }; 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_t 361 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_FRIEND 366 }; 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_t 377 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_FRIEND 382 }; 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_FRIEND 397 }; 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_FRIEND 411 }; 412 413 /// a pack of field-offsets for a generic type 414 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_FRIEND 424 }; 425 426 /// Variants of short-circuiting logical expression 427 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_FRIEND 442 }; 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_FRIEND 458 }; 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_FRIEND 473 }; 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_FRIEND 486 }; 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-Constraints 490 class AsmExpr final : public Expr { 491 public: 492 ptr<Expr> inout; 493 ptr<Expr> constraint; 494 }; 128 495 129 496 //================================================================================================= … … 134 501 inline void increment( const class Expr * node, Node::ref_type ref ) { node->increment(ref); } 135 502 inline void decrement( const class Expr * 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); } 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); } 182 547 // inline void increment( const class ImplicitCopyCtorExpr * node, Node::ref_type ref ) { node->increment(ref); } 183 548 // inline void decrement( const class ImplicitCopyCtorExpr * node, Node::ref_type ref ) { node->decrement(ref); } … … 214 579 } 215 580 581 #undef MUTATE_FRIEND 582 216 583 // Local Variables: // 217 584 // tab-width: 4 //
Note:
See TracChangeset
for help on using the changeset viewer.