Changes in src/AST/Expr.hpp [20a5977:9b4f329]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Expr.hpp
r20a5977 r9b4f329 28 28 29 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 node_t * mutate(const node_t * node); 31 32 class ConverterOldToNew; 30 #define MUTATE_FRIEND template<typename node_t> friend auto mutate(const node_t * node); 33 31 34 32 namespace ast { … … 108 106 case Params: assert(!"Cannot return to resnSlots from Params"); 109 107 } 110 return *((ResnSlots*)nullptr);111 }112 113 const ResnSlots& resnSlotsConst() const {114 if (mode == Slots) {115 return data.resnSlots;116 }117 assert(!"Mode was not already resnSlots");118 return *((ResnSlots*)nullptr);119 108 } 120 109 … … 125 114 case Params: return data.inferParams; 126 115 } 127 return *((InferredParams*)nullptr);128 }129 130 const InferredParams& inferParamsConst() const {131 if (mode == Params) {132 return data.inferParams;133 }134 assert(!"Mode was not already Params");135 return *((InferredParams*)nullptr);136 116 } 137 117 }; … … 153 133 }; 154 134 155 /// The application of a function to a set of parameters. 135 /// The application of a function to a set of parameters. 156 136 /// Post-resolver form of `UntypedExpr` 157 137 class ApplicationExpr final : public Expr { … … 238 218 GeneratedFlag isGenerated; 239 219 240 CastExpr( const CodeLocation & loc, const Expr * a, const Type * to, 220 CastExpr( const CodeLocation & loc, const Expr * a, const Type * to, 241 221 GeneratedFlag g = GeneratedCast ) : Expr( loc, to ), arg( a ), isGenerated( g ) {} 242 222 /// Cast-to-void … … 331 311 unsigned long long ival; 332 312 double dval; 333 313 334 314 Val( unsigned long long i ) : ival( i ) {} 335 315 Val( double d ) : dval( d ) {} … … 337 317 public: 338 318 std::string rep; 339 enum Kind { Integer, FloatingPoint, String } kind; 340 341 ConstantExpr( 342 const CodeLocation & loc, const Type * ty, const std::string & r, unsigned long long v, 343 Kind k = Integer ) 344 : Expr( loc, ty ), val( v ), rep( r ), kind( k ) {} 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 ) {} 345 323 ConstantExpr( const CodeLocation & loc, const Type * ty, const std::string & r, double v ) 346 : Expr( loc, ty ), val( v ), rep( r ) , kind( FloatingPoint ){}347 324 : Expr( loc, ty ), val( v ), rep( r ) {} 325 348 326 /// Gets the value of this constant as an integer 349 327 long long int intValue() const; … … 486 464 ptr<Expr> arg2; 487 465 488 CommaExpr( const CodeLocation & loc, const Expr * a1, const Expr * a2 ) 466 CommaExpr( const CodeLocation & loc, const Expr * a1, const Expr * a2 ) 489 467 : Expr( loc ), arg1( a1 ), arg2( a2 ) {} 490 468 … … 525 503 }; 526 504 527 /// The application of a function to a set of parameters, along with a set of copy constructor 505 /// The application of a function to a set of parameters, along with a set of copy constructor 528 506 /// calls, one for each argument 529 507 class ImplicitCopyCtorExpr final : public Expr { … … 532 510 std::vector<ptr<ObjectDecl>> tempDecls; 533 511 std::vector<ptr<ObjectDecl>> returnDecls; 534 std::vector<ptr< Expr>> dtors;512 std::vector<ptr<ObjectDecl>> dtors; 535 513 536 514 ImplicitCopyCtorExpr( const CodeLocation& loc, const ApplicationExpr * call ) … … 625 603 }; 626 604 627 /// A multiple- or mass-assignment operation, or a tuple ctor/dtor expression. 628 /// multiple-assignment: both sides of the assignment have tuple type, 605 /// A multiple- or mass-assignment operation, or a tuple ctor/dtor expression. 606 /// multiple-assignment: both sides of the assignment have tuple type, 629 607 /// e.g. `[a, b, c] = [d, e, f];` 630 608 /// mass-assignment: left-hand side has tuple type and right-hand side does not: … … 634 612 ptr<StmtExpr> stmtExpr; 635 613 636 TupleAssignExpr( 637 const CodeLocation & loc, std::vector<ptr<Expr>> && assigns, 614 TupleAssignExpr( 615 const CodeLocation & loc, std::vector<ptr<Expr>> && assigns, 638 616 std::vector<ptr<ObjectDecl>> && tempDecls ); 639 640 const Expr * accept( Visitor & v ) const override { return v.visit( this ); } 641 642 friend class ::ConverterOldToNew; 643 617 618 const Expr * accept( Visitor & v ) const override { return v.visit( this ); } 644 619 private: 645 620 TupleAssignExpr * clone() const override { return new TupleAssignExpr{ *this }; } 646 TupleAssignExpr( const CodeLocation & loc, const Type * result, const StmtExpr * s );647 648 621 MUTATE_FRIEND 649 622 }; … … 781 754 }; 782 755 783 756 //================================================================================================= 757 /// This disgusting and giant piece of boiler-plate is here to solve a cyclic dependency 758 /// remove only if there is a better solution 759 /// The problem is that ast::ptr< ... > uses increment/decrement which won't work well with 760 /// forward declarations 761 inline void increment( const class Expr * node, Node::ref_type ref ) { node->increment(ref); } 762 inline void decrement( const class Expr * node, Node::ref_type ref ) { node->decrement(ref); } 763 inline void increment( const class ApplicationExpr * node, Node::ref_type ref ) { node->increment(ref); } 764 inline void decrement( const class ApplicationExpr * node, Node::ref_type ref ) { node->decrement(ref); } 765 inline void increment( const class UntypedExpr * node, Node::ref_type ref ) { node->increment(ref); } 766 inline void decrement( const class UntypedExpr * node, Node::ref_type ref ) { node->decrement(ref); } 767 inline void increment( const class NameExpr * node, Node::ref_type ref ) { node->increment(ref); } 768 inline void decrement( const class NameExpr * node, Node::ref_type ref ) { node->decrement(ref); } 769 inline void increment( const class AddressExpr * node, Node::ref_type ref ) { node->increment(ref); } 770 inline void decrement( const class AddressExpr * node, Node::ref_type ref ) { node->decrement(ref); } 771 inline void increment( const class LabelAddressExpr * node, Node::ref_type ref ) { node->increment(ref); } 772 inline void decrement( const class LabelAddressExpr * node, Node::ref_type ref ) { node->decrement(ref); } 773 inline void increment( const class CastExpr * node, Node::ref_type ref ) { node->increment(ref); } 774 inline void decrement( const class CastExpr * node, Node::ref_type ref ) { node->decrement(ref); } 775 inline void increment( const class KeywordCastExpr * node, Node::ref_type ref ) { node->increment(ref); } 776 inline void decrement( const class KeywordCastExpr * node, Node::ref_type ref ) { node->decrement(ref); } 777 inline void increment( const class VirtualCastExpr * node, Node::ref_type ref ) { node->increment(ref); } 778 inline void decrement( const class VirtualCastExpr * node, Node::ref_type ref ) { node->decrement(ref); } 779 inline void increment( const class MemberExpr * node, Node::ref_type ref ) { node->increment(ref); } 780 inline void decrement( const class MemberExpr * node, Node::ref_type ref ) { node->decrement(ref); } 781 inline void increment( const class UntypedMemberExpr * node, Node::ref_type ref ) { node->increment(ref); } 782 inline void decrement( const class UntypedMemberExpr * node, Node::ref_type ref ) { node->decrement(ref); } 783 inline void increment( const class VariableExpr * node, Node::ref_type ref ) { node->increment(ref); } 784 inline void decrement( const class VariableExpr * node, Node::ref_type ref ) { node->decrement(ref); } 785 inline void increment( const class ConstantExpr * node, Node::ref_type ref ) { node->increment(ref); } 786 inline void decrement( const class ConstantExpr * node, Node::ref_type ref ) { node->decrement(ref); } 787 inline void increment( const class SizeofExpr * node, Node::ref_type ref ) { node->increment(ref); } 788 inline void decrement( const class SizeofExpr * node, Node::ref_type ref ) { node->decrement(ref); } 789 inline void increment( const class AlignofExpr * node, Node::ref_type ref ) { node->increment(ref); } 790 inline void decrement( const class AlignofExpr * node, Node::ref_type ref ) { node->decrement(ref); } 791 inline void increment( const class UntypedOffsetofExpr * node, Node::ref_type ref ) { node->increment(ref); } 792 inline void decrement( const class UntypedOffsetofExpr * node, Node::ref_type ref ) { node->decrement(ref); } 793 inline void increment( const class OffsetofExpr * node, Node::ref_type ref ) { node->increment(ref); } 794 inline void decrement( const class OffsetofExpr * node, Node::ref_type ref ) { node->decrement(ref); } 795 inline void increment( const class OffsetPackExpr * node, Node::ref_type ref ) { node->increment(ref); } 796 inline void decrement( const class OffsetPackExpr * node, Node::ref_type ref ) { node->decrement(ref); } 797 inline void increment( const class LogicalExpr * node, Node::ref_type ref ) { node->increment(ref); } 798 inline void decrement( const class LogicalExpr * node, Node::ref_type ref ) { node->decrement(ref); } 799 inline void increment( const class ConditionalExpr * node, Node::ref_type ref ) { node->increment(ref); } 800 inline void decrement( const class ConditionalExpr * node, Node::ref_type ref ) { node->decrement(ref); } 801 inline void increment( const class CommaExpr * node, Node::ref_type ref ) { node->increment(ref); } 802 inline void decrement( const class CommaExpr * node, Node::ref_type ref ) { node->decrement(ref); } 803 inline void increment( const class TypeExpr * node, Node::ref_type ref ) { node->increment(ref); } 804 inline void decrement( const class TypeExpr * node, Node::ref_type ref ) { node->decrement(ref); } 805 inline void increment( const class AsmExpr * node, Node::ref_type ref ) { node->increment(ref); } 806 inline void decrement( const class AsmExpr * node, Node::ref_type ref ) { node->decrement(ref); } 807 inline void increment( const class ImplicitCopyCtorExpr * node, Node::ref_type ref ) { node->increment(ref); } 808 inline void decrement( const class ImplicitCopyCtorExpr * node, Node::ref_type ref ) { node->decrement(ref); } 809 inline void increment( const class ConstructorExpr * node, Node::ref_type ref ) { node->increment(ref); } 810 inline void decrement( const class ConstructorExpr * node, Node::ref_type ref ) { node->decrement(ref); } 811 inline void increment( const class CompoundLiteralExpr * node, Node::ref_type ref ) { node->increment(ref); } 812 inline void decrement( const class CompoundLiteralExpr * node, Node::ref_type ref ) { node->decrement(ref); } 813 inline void increment( const class RangeExpr * node, Node::ref_type ref ) { node->increment(ref); } 814 inline void decrement( const class RangeExpr * node, Node::ref_type ref ) { node->decrement(ref); } 815 inline void increment( const class UntypedTupleExpr * node, Node::ref_type ref ) { node->increment(ref); } 816 inline void decrement( const class UntypedTupleExpr * node, Node::ref_type ref ) { node->decrement(ref); } 817 inline void increment( const class TupleExpr * node, Node::ref_type ref ) { node->increment(ref); } 818 inline void decrement( const class TupleExpr * node, Node::ref_type ref ) { node->decrement(ref); } 819 inline void increment( const class TupleIndexExpr * node, Node::ref_type ref ) { node->increment(ref); } 820 inline void decrement( const class TupleIndexExpr * node, Node::ref_type ref ) { node->decrement(ref); } 821 inline void increment( const class TupleAssignExpr * node, Node::ref_type ref ) { node->increment(ref); } 822 inline void decrement( const class TupleAssignExpr * node, Node::ref_type ref ) { node->decrement(ref); } 823 inline void increment( const class StmtExpr * node, Node::ref_type ref ) { node->increment(ref); } 824 inline void decrement( const class StmtExpr * node, Node::ref_type ref ) { node->decrement(ref); } 825 inline void increment( const class UniqueExpr * node, Node::ref_type ref ) { node->increment(ref); } 826 inline void decrement( const class UniqueExpr * node, Node::ref_type ref ) { node->decrement(ref); } 827 inline void increment( const class UntypedInitExpr * node, Node::ref_type ref ) { node->increment(ref); } 828 inline void decrement( const class UntypedInitExpr * node, Node::ref_type ref ) { node->decrement(ref); } 829 inline void increment( const class InitExpr * node, Node::ref_type ref ) { node->increment(ref); } 830 inline void decrement( const class InitExpr * node, Node::ref_type ref ) { node->decrement(ref); } 831 inline void increment( const class DeletedExpr * node, Node::ref_type ref ) { node->increment(ref); } 832 inline void decrement( const class DeletedExpr * node, Node::ref_type ref ) { node->decrement(ref); } 833 inline void increment( const class DefaultArgExpr * node, Node::ref_type ref ) { node->increment(ref); } 834 inline void decrement( const class DefaultArgExpr * node, Node::ref_type ref ) { node->decrement(ref); } 835 inline void increment( const class GenericExpr * node, Node::ref_type ref ) { node->increment(ref); } 836 inline void decrement( const class GenericExpr * node, Node::ref_type ref ) { node->decrement(ref); } 784 837 } 785 838
Note:
See TracChangeset
for help on using the changeset viewer.