Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/AST/Decl.hpp

    rf3cc5b6 r8a5530c  
    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 auto mutate(const node_t * node);
    34 
    3532namespace ast {
     33
     34class Attribute;
     35class Expr;
     36class Init;
     37class TypeDecl;
    3638
    3739/// Base declaration class
     
    5860private:
    5961        Decl * clone() const override = 0;
    60         MUTATE_FRIEND
    6162};
    6263
     
    9192private:
    9293        DeclWithType * clone() const override = 0;
    93         MUTATE_FRIEND
    9494};
    9595
     
    113113private:
    114114        ObjectDecl * clone() const override { return new ObjectDecl{ *this }; }
    115         MUTATE_FRIEND
     115
     116        /// Must be copied in ALL derived classes
     117        template<typename node_t>
     118        friend auto mutate(const node_t * node);
    116119};
    117120
     
    137140private:
    138141        FunctionDecl * clone() const override { return new FunctionDecl( *this ); }
    139         MUTATE_FRIEND
     142
     143        /// Must be copied in ALL derived classes
     144        template<typename node_t>
     145        friend auto mutate(const node_t * node);
    140146};
    141147
     
    144150public:
    145151        ptr<Type> base;
    146         std::vector<ptr<TypeDecl>> params;
     152        std::vector<ptr<TypeDecl>> parameters;
    147153        std::vector<ptr<DeclWithType>> assertions;
    148154
    149155        NamedTypeDecl( const CodeLocation& loc, const std::string& name, Storage::Classes storage,
    150156                Type* b, Linkage::Spec spec = Linkage::Cforall )
    151         : Decl( loc, name, storage, spec ), base( b ), params(), assertions() {}
     157        : Decl( loc, name, storage, spec ), base( b ), parameters(), assertions() {}
    152158
    153159        /// Produces a name for the kind of alias
     
    156162private:
    157163        NamedTypeDecl* clone() const override = 0;
    158         MUTATE_FRIEND
    159164};
    160165
     
    198203private:
    199204        TypeDecl * clone() const override { return new TypeDecl{ *this }; }
    200         MUTATE_FRIEND
     205
     206        /// Must be copied in ALL derived classes
     207        template<typename node_t>
     208        friend auto mutate(const node_t * node);
    201209};
    202210
     
    213221private:
    214222        TypedefDecl * clone() const override { return new TypedefDecl{ *this }; }
    215         MUTATE_FRIEND
     223
     224        /// Must be copied in ALL derived classes
     225        template<typename node_t>
     226        friend auto mutate(const node_t * node);
    216227};
    217228
     
    220231public:
    221232        std::vector<ptr<Decl>> members;
    222         std::vector<ptr<TypeDecl>> params;
     233        std::vector<ptr<TypeDecl>> parameters;
    223234        std::vector<ptr<Attribute>> attributes;
    224235        bool body = false;
     
    227238        AggregateDecl( const CodeLocation& loc, const std::string& name,
    228239                std::vector<ptr<Attribute>>&& attrs = {}, Linkage::Spec linkage = Linkage::Cforall )
    229         : Decl( loc, name, Storage::Classes{}, linkage ), members(), params(),
     240        : Decl( loc, name, Storage::Classes{}, linkage ), members(), parameters(),
    230241          attributes( std::move(attrs) ) {}
    231242
    232243        AggregateDecl* set_body( bool b ) { body = b; return this; }
    233 
    234 private:
    235         AggregateDecl * clone() const override = 0;
    236         MUTATE_FRIEND
    237244
    238245protected:
     
    258265private:
    259266        StructDecl * clone() const override { return new StructDecl{ *this }; }
    260         MUTATE_FRIEND
     267
     268        /// Must be copied in ALL derived classes
     269        template<typename node_t>
     270        friend auto mutate(const node_t * node);
    261271
    262272        std::string typeString() const override { return "struct"; }
     
    273283private:
    274284        UnionDecl * clone() const override { return new UnionDecl{ *this }; }
    275         MUTATE_FRIEND
     285
     286        /// Must be copied in ALL derived classes
     287        template<typename node_t>
     288        friend auto mutate(const node_t * node);
    276289
    277290        std::string typeString() const override { return "union"; }
     
    291304private:
    292305        EnumDecl * clone() const override { return new EnumDecl{ *this }; }
    293         MUTATE_FRIEND
     306
     307        /// Must be copied in ALL derived classes
     308        template<typename node_t>
     309        friend auto mutate(const node_t * node);
    294310
    295311        std::string typeString() const override { return "enum"; }
     
    309325private:
    310326        TraitDecl * clone() const override { return new TraitDecl{ *this }; }
    311         MUTATE_FRIEND
     327
     328        /// Must be copied in ALL derived classes
     329        template<typename node_t>
     330        friend auto mutate(const node_t * node);
    312331
    313332        std::string typeString() const override { return "trait"; }
     
    324343private:
    325344        AsmDecl *clone() const override { return new AsmDecl( *this ); }
    326         MUTATE_FRIEND
     345
     346        /// Must be copied in ALL derived classes
     347        template<typename node_t>
     348        friend auto mutate(const node_t * node);
    327349};
    328350
     
    338360private:
    339361        StaticAssertDecl * clone() const override { return new StaticAssertDecl( *this ); }
    340         MUTATE_FRIEND
     362
     363        /// Must be copied in ALL derived classes
     364        template<typename node_t>
     365        friend auto mutate(const node_t * node);
    341366};
    342367
     
    377402}
    378403
    379 #undef MUTATE_FRIEND
    380 
    381404// Local Variables: //
    382405// tab-width: 4 //
Note: See TracChangeset for help on using the changeset viewer.