Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/AST/Init.hpp

    rf3cc5b6 r23f99e1  
    2323#include "Visitor.hpp"
    2424
    25 // Must be included in *all* AST classes; should be #undef'd at the end of the file
    26 #define MUTATE_FRIEND template<typename node_t> friend auto mutate(const node_t * node);
    27 
    2825namespace ast {
    2926
     
    4340private:
    4441        Designation* clone() const override { return new Designation{ *this }; }
    45         MUTATE_FRIEND
    4642};
    47 
    48 /// Flag for whether to construct from initialzier
    49 enum ConstructFlag { DoConstruct, MaybeConstruct };
    5043
    5144/// Object initializer base class
    5245class Init : public ParseNode {
    5346public:
    54         ConstructFlag maybeConstructed;
     47        bool maybeConstructed;
    5548
    56         Init( const CodeLocation& loc, ConstructFlag mc ) : ParseNode( loc ), maybeConstructed( mc ) {}
     49        Init( const CodeLocation& loc, bool mc ) : ParseNode( loc ), maybeConstructed( mc ) {}
    5750
    5851        const Init * accept( Visitor& v ) const override = 0;
    5952private:
    6053        const Init * clone() const override = 0;
    61         MUTATE_FRIEND
    6254};
    6355
     
    6860        ptr<Expr> value;
    6961
    70         SingleInit( const CodeLocation& loc, Expr* val, ConstructFlag mc = DoConstruct )
     62        SingleInit( const CodeLocation& loc, Expr* val, bool mc = false )
    7163        : Init( loc, mc ), value( val ) {}
    7264
     
    7466private:
    7567        SingleInit * clone() const override { return new SingleInit{ *this }; }
    76         MUTATE_FRIEND
     68
     69        /// Must be copied in ALL derived classes
     70        template<typename node_t>
     71        friend auto mutate(const node_t * node);
    7772};
    7873
     
    8782
    8883        ListInit( const CodeLocation& loc, std::vector<ptr<Init>>&& is,
    89                 std::vector<ptr<Designation>>&& ds = {}, ConstructFlag mc = DoConstruct );
     84                std::vector<ptr<Designation>>&& ds = {}, bool mc = false );
    9085
    9186        using iterator = std::vector<ptr<Init>>::iterator;
     
    9994private:
    10095        ListInit * clone() const override { return new ListInit{ *this }; }
    101         MUTATE_FRIEND
     96
     97        /// Must be copied in ALL derived classes
     98        template<typename node_t>
     99        friend auto mutate(const node_t * node);
    102100};
    103101
     
    114112
    115113        ConstructorInit( const CodeLocation& loc, Stmt* ctor, Stmt* dtor, Init* init )
    116         : Init( loc, DoConstruct ), ctor( ctor ), dtor( dtor ), init( init ) {}
     114        : Init( loc, true ), ctor( ctor ), dtor( dtor ), init( init ) {}
    117115
    118116        const Init * accept( Visitor & v ) const override { return v.visit( this ); }
    119117private:
    120118        ConstructorInit * clone() const override { return new ConstructorInit{ *this }; }
    121         MUTATE_FRIEND
     119
     120        /// Must be copied in ALL derived classes
     121        template<typename node_t>
     122        friend auto mutate(const node_t * node);
    122123};
    123124
     
    138139}
    139140
    140 #undef MUTATE_FRIEND
    141 
    142141// Local Variables: //
    143142// tab-width: 4 //
Note: See TracChangeset for help on using the changeset viewer.