Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/AST/Decl.hpp

    r87701b6 r10a1225  
    3030#include "Parser/ParseNode.h"  // for DeclarationNode::Aggregate
    3131
     32// Must be included in *all* AST classes; should be #undef'd at the end of the file
     33#define MUTATE_FRIEND template<typename node_t> friend node_t * mutate(const node_t * node);
     34
    3235namespace ast {
    3336
     
    5558private:
    5659        Decl * clone() const override = 0;
     60        MUTATE_FRIEND
    5761};
    5862
     
    8791private:
    8892        DeclWithType * clone() const override = 0;
     93        MUTATE_FRIEND
    8994};
    9095
     
    96101        ptr<Expr> bitfieldWidth;
    97102
    98         ObjectDecl( const CodeLocation& loc, const std::string& name, Type* type, Init* init = nullptr,
    99                 Storage::Classes storage = {}, Linkage::Spec linkage = Linkage::C, Expr* bitWd = nullptr,
    100                 std::vector<ptr<Attribute>>&& attrs = {}, Function::Specs fs = {})
     103        ObjectDecl( const CodeLocation & loc, const std::string & name, const Type * type, Init * init = nullptr,
     104                Storage::Classes storage = {}, Linkage::Spec linkage = Linkage::C, Expr * bitWd = nullptr,
     105                std::vector< ptr<Attribute> > && attrs = {}, Function::Specs fs = {})
    101106        : DeclWithType( loc, name, storage, linkage, std::move(attrs), fs ), type( type ),
    102107          init( init ), bitfieldWidth( bitWd ) {}
     
    108113private:
    109114        ObjectDecl * clone() const override { return new ObjectDecl{ *this }; }
    110 
    111         /// Must be copied in ALL derived classes
    112         template<typename node_t>
    113         friend node_t * mutate(const node_t * node);
     115        MUTATE_FRIEND
    114116};
    115117
     
    135137private:
    136138        FunctionDecl * clone() const override { return new FunctionDecl( *this ); }
    137 
    138         /// Must be copied in ALL derived classes
    139         template<typename node_t>
    140         friend node_t * mutate(const node_t * node);
     139        MUTATE_FRIEND
    141140};
    142141
     
    157156private:
    158157        NamedTypeDecl* clone() const override = 0;
     158        MUTATE_FRIEND
    159159};
    160160
     
    198198private:
    199199        TypeDecl * clone() const override { return new TypeDecl{ *this }; }
    200 
    201         /// Must be copied in ALL derived classes
    202         template<typename node_t>
    203         friend node_t * mutate(const node_t * node);
     200        MUTATE_FRIEND
    204201};
    205202
     
    216213private:
    217214        TypedefDecl * clone() const override { return new TypedefDecl{ *this }; }
    218 
    219         /// Must be copied in ALL derived classes
    220         template<typename node_t>
    221         friend node_t * mutate(const node_t * node);
     215        MUTATE_FRIEND
    222216};
    223217
     
    238232        AggregateDecl* set_body( bool b ) { body = b; return this; }
    239233
     234private:
     235        AggregateDecl * clone() const override = 0;
     236        MUTATE_FRIEND
     237
    240238protected:
    241239        /// Produces a name for the kind of aggregate
     
    260258private:
    261259        StructDecl * clone() const override { return new StructDecl{ *this }; }
    262 
    263         /// Must be copied in ALL derived classes
    264         template<typename node_t>
    265         friend node_t * mutate(const node_t * node);
     260        MUTATE_FRIEND
    266261
    267262        std::string typeString() const override { return "struct"; }
     
    278273private:
    279274        UnionDecl * clone() const override { return new UnionDecl{ *this }; }
    280 
    281         /// Must be copied in ALL derived classes
    282         template<typename node_t>
    283         friend node_t * mutate(const node_t * node);
     275        MUTATE_FRIEND
    284276
    285277        std::string typeString() const override { return "union"; }
     
    299291private:
    300292        EnumDecl * clone() const override { return new EnumDecl{ *this }; }
    301 
    302         /// Must be copied in ALL derived classes
    303         template<typename node_t>
    304         friend node_t * mutate(const node_t * node);
     293        MUTATE_FRIEND
    305294
    306295        std::string typeString() const override { return "enum"; }
     
    320309private:
    321310        TraitDecl * clone() const override { return new TraitDecl{ *this }; }
    322 
    323         /// Must be copied in ALL derived classes
    324         template<typename node_t>
    325         friend node_t * mutate(const node_t * node);
     311        MUTATE_FRIEND
    326312
    327313        std::string typeString() const override { return "trait"; }
     
    338324private:
    339325        AsmDecl *clone() const override { return new AsmDecl( *this ); }
    340 
    341         /// Must be copied in ALL derived classes
    342         template<typename node_t>
    343         friend node_t * mutate(const node_t * node);
     326        MUTATE_FRIEND
    344327};
    345328
     
    355338private:
    356339        StaticAssertDecl * clone() const override { return new StaticAssertDecl( *this ); }
    357 
    358         /// Must be copied in ALL derived classes
    359         template<typename node_t>
    360         friend node_t * mutate(const node_t * node);
     340        MUTATE_FRIEND
    361341};
    362342
    363343}
     344
     345#undef MUTATE_FRIEND
    364346
    365347// Local Variables: //
Note: See TracChangeset for help on using the changeset viewer.