Changes in / [be567e9:62315a0]
- Location:
- src
- Files:
-
- 2 deleted
- 21 edited
-
AST/Attribute.hpp (modified) (3 diffs)
-
AST/Convert.cpp (deleted)
-
AST/Convert.hpp (deleted)
-
AST/Decl.hpp (modified) (11 diffs)
-
AST/Expr.hpp (modified) (3 diffs)
-
AST/Fwd.hpp (modified) (2 diffs)
-
AST/Init.hpp (modified) (5 diffs)
-
AST/Label.hpp (modified) (2 diffs)
-
AST/Node.hpp (modified) (5 diffs)
-
AST/Pass.hpp (modified) (7 diffs)
-
AST/Pass.impl.hpp (modified) (19 diffs)
-
AST/Pass.proto.hpp (modified) (2 diffs)
-
AST/Stmt.hpp (modified) (5 diffs)
-
AST/Type.hpp (modified) (2 diffs)
-
AST/Visitor.hpp (modified) (1 diff)
-
AST/porting.md (modified) (2 diffs)
-
Common/PassVisitor.h (modified) (2 diffs)
-
Common/PassVisitor.impl.h (modified) (1 diff)
-
SynTree/Declaration.h (modified) (2 diffs)
-
SynTree/Label.h (modified) (1 diff)
-
SynTree/Mutator.h (modified) (1 diff)
-
SynTree/SynTree.h (modified) (1 diff)
-
SynTree/Visitor.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Attribute.hpp
rbe567e9 r62315a0 19 19 #include <vector> 20 20 21 #include "Fwd.hpp"22 21 #include "Node.hpp" // for ptr 23 22 #include "Visitor.hpp" … … 32 31 std::vector<ptr<Expr>> parameters; 33 32 34 Attribute( const std::string & name = "", std::vector<ptr<Expr>>&& params = {})33 Attribute( const std::string& name = "", std::vector<ptr<Expr>>&& params = {}) 35 34 : name( name ), parameters( params ) {} 36 virtual ~Attribute() = default;37 35 38 36 bool empty() const { return name.empty(); } … … 44 42 bool isValidOnFuncParam() const; 45 43 46 const Attribute * accept( Visitor & v ) constoverride { return v.visit( this ); }44 Attribute* accept( Visitor& v ) override { return v.visit( this ); } 47 45 private: 48 Attribute * clone() const override { return new Attribute{ *this }; } 49 50 /// Must be copied in ALL derived classes 51 template<typename node_t> 52 friend auto mutate(const node_t * node); 46 Attribute* clone() const override { return new Attribute{ *this }; } 53 47 }; 54 48 -
src/AST/Decl.hpp
rbe567e9 r62315a0 57 57 static readonly<Decl> fromId( UniqueId id ); 58 58 59 virtual const Decl * accept( Visitor & v ) constoverride = 0;60 private: 61 virtual Decl * clone() const override = 0;59 virtual Decl* accept( Visitor& v ) override = 0; 60 private: 61 virtual Decl* clone() const override = 0; 62 62 }; 63 63 … … 85 85 86 86 /// Get type of this declaration. May be generated by subclass 87 virtual const Type * get_type() const = 0;87 virtual const Type* get_type() const = 0; 88 88 /// Set type of this declaration. May be verified by subclass 89 89 virtual void set_type(Type*) = 0; 90 90 91 virtual const DeclWithType * accept( Visitor & v ) constoverride = 0;92 private: 93 virtual DeclWithType * clone() const override = 0;91 virtual DeclWithType* accept( Visitor& v ) override = 0; 92 private: 93 virtual DeclWithType* clone() const override = 0; 94 94 }; 95 95 … … 110 110 void set_type( Type* ty ) override { type = ty; } 111 111 112 virtual const DeclWithType * accept( Visitor& v ) const override { return v.visit( this ); } 113 private: 114 virtual ObjectDecl * clone() const override { return new ObjectDecl{ *this }; } 115 116 /// Must be copied in ALL derived classes 117 template<typename node_t> 118 friend auto mutate(const node_t * node); 112 DeclWithType* accept( Visitor& v ) override { return v.visit( this ); } 113 private: 114 ObjectDecl* clone() const override { return new ObjectDecl{ *this }; } 119 115 }; 120 116 … … 170 166 std::string genTypeString() const; 171 167 172 virtual const Decl * accept( Visitor & v ) constoverride { return v.visit( this ); }173 private: 174 virtual TypeDecl* clone() const override { return new TypeDecl{ *this }; }168 Decl* accept( Visitor& v ) override { return v.visit( this ); } 169 private: 170 TypeDecl* clone() const override { return new TypeDecl{ *this }; } 175 171 }; 176 172 … … 184 180 std::string typeString() const override { return "typedef"; } 185 181 186 virtual const Decl * accept( Visitor & v ) constoverride { return v.visit( this ); }187 private: 188 virtual TypedefDecl* clone() const override { return new TypedefDecl{ *this }; }182 Decl* accept( Visitor& v ) override { return v.visit( this ); } 183 private: 184 TypedefDecl* clone() const override { return new TypedefDecl{ *this }; } 189 185 }; 190 186 … … 224 220 bool is_thread() { return kind == DeclarationNode::Thread; } 225 221 226 virtual const Decl * accept( Visitor & v ) constoverride { return v.visit( this ); }227 private: 228 virtual StructDecl* clone() const override { return new StructDecl{ *this }; }222 Decl* accept( Visitor& v ) override { return v.visit( this ); } 223 private: 224 StructDecl* clone() const override { return new StructDecl{ *this }; } 229 225 230 226 std::string typeString() const override { return "struct"; } … … 238 234 : AggregateDecl( loc, name, std::move(attrs), linkage ) {} 239 235 240 virtual const Decl * accept( Visitor& v ) constoverride { return v.visit( this ); }241 private: 242 virtual UnionDecl* clone() const override { return new UnionDecl{ *this }; }236 Decl* accept( Visitor& v ) override { return v.visit( this ); } 237 private: 238 UnionDecl* clone() const override { return new UnionDecl{ *this }; } 243 239 244 240 std::string typeString() const override { return "union"; } … … 255 251 bool valueOf( Decl* enumerator, long long& value ) const; 256 252 257 virtual const Decl * accept( Visitor & v ) constoverride { return v.visit( this ); }258 private: 259 virtual EnumDecl* clone() const override { return new EnumDecl{ *this }; }253 Decl* accept( Visitor& v ) override { return v.visit( this ); } 254 private: 255 EnumDecl* clone() const override { return new EnumDecl{ *this }; } 260 256 261 257 std::string typeString() const override { return "enum"; } … … 272 268 : AggregateDecl( loc, name, std::move(attrs), linkage ) {} 273 269 274 virtual const Decl * accept( Visitor & v ) constoverride { return v.visit( this ); }275 private: 276 virtual TraitDecl* clone() const override { return new TraitDecl{ *this }; }270 Decl* accept( Visitor& v ) override { return v.visit( this ); } 271 private: 272 TraitDecl* clone() const override { return new TraitDecl{ *this }; } 277 273 278 274 std::string typeString() const override { return "trait"; } … … 291 287 inline void increment( const class ObjectDecl * node, Node::ref_type ref ) { node->increment(ref); } 292 288 inline void decrement( const class ObjectDecl * node, Node::ref_type ref ) { node->decrement(ref); } 293 //inline void increment( const class FunctionDecl * node, Node::ref_type ref ) { node->increment(ref); }294 //inline void decrement( const class FunctionDecl * node, Node::ref_type ref ) { node->decrement(ref); }289 inline void increment( const class FunctionDecl * node, Node::ref_type ref ) { node->increment(ref); } 290 inline void decrement( const class FunctionDecl * node, Node::ref_type ref ) { node->decrement(ref); } 295 291 inline void increment( const class AggregateDecl * node, Node::ref_type ref ) { node->increment(ref); } 296 292 inline void decrement( const class AggregateDecl * node, Node::ref_type ref ) { node->decrement(ref); } … … 307 303 inline void increment( const class TypeDecl * node, Node::ref_type ref ) { node->increment(ref); } 308 304 inline void decrement( const class TypeDecl * node, Node::ref_type ref ) { node->decrement(ref); } 309 //inline void increment( const class FtypeDecl * node, Node::ref_type ref ) { node->increment(ref); }310 //inline void decrement( const class FtypeDecl * node, Node::ref_type ref ) { node->decrement(ref); }311 //inline void increment( const class DtypeDecl * node, Node::ref_type ref ) { node->increment(ref); }312 //inline void decrement( const class DtypeDecl * node, Node::ref_type ref ) { node->decrement(ref); }305 inline void increment( const class FtypeDecl * node, Node::ref_type ref ) { node->increment(ref); } 306 inline void decrement( const class FtypeDecl * node, Node::ref_type ref ) { node->decrement(ref); } 307 inline void increment( const class DtypeDecl * node, Node::ref_type ref ) { node->increment(ref); } 308 inline void decrement( const class DtypeDecl * node, Node::ref_type ref ) { node->decrement(ref); } 313 309 inline void increment( const class TypedefDecl * node, Node::ref_type ref ) { node->increment(ref); } 314 310 inline void decrement( const class TypedefDecl * node, Node::ref_type ref ) { node->decrement(ref); } 315 //inline void increment( const class AsmDecl * node, Node::ref_type ref ) { node->increment(ref); }316 //inline void decrement( const class AsmDecl * node, Node::ref_type ref ) { node->decrement(ref); }317 //inline void increment( const class StaticAssertDecl * node, Node::ref_type ref ) { node->increment(ref); }318 //inline void decrement( const class StaticAssertDecl * node, Node::ref_type ref ) { node->decrement(ref); }311 inline void increment( const class AsmDecl * node, Node::ref_type ref ) { node->increment(ref); } 312 inline void decrement( const class AsmDecl * node, Node::ref_type ref ) { node->decrement(ref); } 313 inline void increment( const class StaticAssertDecl * node, Node::ref_type ref ) { node->increment(ref); } 314 inline void decrement( const class StaticAssertDecl * node, Node::ref_type ref ) { node->decrement(ref); } 319 315 320 316 } -
src/AST/Expr.hpp
rbe567e9 r62315a0 27 27 namespace ast { 28 28 29 /// Contains the ID of a declaration and a type that is derived from that declaration, 29 /// Contains the ID of a declaration and a type that is derived from that declaration, 30 30 /// but subject to decay-to-pointer and type parameter renaming 31 31 struct ParamEntry { … … 74 74 case Empty: return; 75 75 case Slots: new(&data.resnSlots) ResnSlots{ std::move(o.data.resnSlots) }; return; 76 case Params: 76 case Params: 77 77 new(&data.inferParams) InferredParams{ std::move(o.data.inferParams) }; return; 78 78 } … … 121 121 Expr* set_extension( bool ex ) { extension = ex; return this; } 122 122 123 virtual const Expr * accept( Visitor& v ) constoverride = 0;123 virtual Expr* accept( Visitor& v ) override = 0; 124 124 private: 125 virtual Expr * clone() const override = 0;125 virtual Expr* clone() const override = 0; 126 126 }; 127 127 128 129 //=================================================================================================130 /// This disgusting and giant piece of boiler-plate is here to solve a cyclic dependency131 /// remove only if there is a better solution132 /// The problem is that ast::ptr< ... > uses increment/decrement which won't work well with133 /// forward declarations134 inline void increment( const class Expr * node, Node::ref_type ref ) { node->increment(ref); }135 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); }182 // inline void increment( const class ImplicitCopyCtorExpr * node, Node::ref_type ref ) { node->increment(ref); }183 // inline void decrement( const class ImplicitCopyCtorExpr * node, Node::ref_type ref ) { node->decrement(ref); }184 // inline void increment( const class ConstructorExpr * node, Node::ref_type ref ) { node->increment(ref); }185 // inline void decrement( const class ConstructorExpr * node, Node::ref_type ref ) { node->decrement(ref); }186 // inline void increment( const class CompoundLiteralExpr * node, Node::ref_type ref ) { node->increment(ref); }187 // inline void decrement( const class CompoundLiteralExpr * node, Node::ref_type ref ) { node->decrement(ref); }188 // inline void increment( const class UntypedValofExpr * node, Node::ref_type ref ) { node->increment(ref); }189 // inline void decrement( const class UntypedValofExpr * node, Node::ref_type ref ) { node->decrement(ref); }190 // inline void increment( const class RangeExpr * node, Node::ref_type ref ) { node->increment(ref); }191 // inline void decrement( const class RangeExpr * node, Node::ref_type ref ) { node->decrement(ref); }192 // inline void increment( const class UntypedTupleExpr * node, Node::ref_type ref ) { node->increment(ref); }193 // inline void decrement( const class UntypedTupleExpr * node, Node::ref_type ref ) { node->decrement(ref); }194 // inline void increment( const class TupleExpr * node, Node::ref_type ref ) { node->increment(ref); }195 // inline void decrement( const class TupleExpr * node, Node::ref_type ref ) { node->decrement(ref); }196 // inline void increment( const class TupleIndexExpr * node, Node::ref_type ref ) { node->increment(ref); }197 // inline void decrement( const class TupleIndexExpr * node, Node::ref_type ref ) { node->decrement(ref); }198 // inline void increment( const class TupleAssignExpr * node, Node::ref_type ref ) { node->increment(ref); }199 // inline void decrement( const class TupleAssignExpr * node, Node::ref_type ref ) { node->decrement(ref); }200 // inline void increment( const class StmtExpr * node, Node::ref_type ref ) { node->increment(ref); }201 // inline void decrement( const class StmtExpr * node, Node::ref_type ref ) { node->decrement(ref); }202 // inline void increment( const class UniqueExpr * node, Node::ref_type ref ) { node->increment(ref); }203 // inline void decrement( const class UniqueExpr * node, Node::ref_type ref ) { node->decrement(ref); }204 // inline void increment( const class UntypedInitExpr * node, Node::ref_type ref ) { node->increment(ref); }205 // inline void decrement( const class UntypedInitExpr * node, Node::ref_type ref ) { node->decrement(ref); }206 // inline void increment( const class InitExpr * node, Node::ref_type ref ) { node->increment(ref); }207 // inline void decrement( const class InitExpr * node, Node::ref_type ref ) { node->decrement(ref); }208 // inline void increment( const class DeletedExpr * node, Node::ref_type ref ) { node->increment(ref); }209 // inline void decrement( const class DeletedExpr * node, Node::ref_type ref ) { node->decrement(ref); }210 // inline void increment( const class DefaultArgExpr * node, Node::ref_type ref ) { node->increment(ref); }211 // inline void decrement( const class DefaultArgExpr * node, Node::ref_type ref ) { node->decrement(ref); }212 // inline void increment( const class GenericExpr * node, Node::ref_type ref ) { node->increment(ref); }213 // inline void decrement( const class GenericExpr * node, Node::ref_type ref ) { node->decrement(ref); }214 128 } 215 129 -
src/AST/Fwd.hpp
rbe567e9 r62315a0 137 137 138 138 class TypeSubstitution; 139 140 std::string toString( const Node * );141 139 142 140 //================================================================================================= … … 357 355 inline void increment( const class Constant *, Node::ref_type ); 358 356 inline void decrement( const class Constant *, Node::ref_type ); 357 inline void increment( const class Label *, Node::ref_type ); 358 inline void decrement( const class Label *, Node::ref_type ); 359 359 inline void increment( const class Attribute *, Node::ref_type ); 360 360 inline void decrement( const class Attribute *, Node::ref_type ); -
src/AST/Init.hpp
rbe567e9 r62315a0 37 37 : ParseNode( loc ), designators( std::move(ds) ) {} 38 38 39 virtual const Designation* accept( Visitor& v ) constoverride { return v.visit( this ); }39 Designation* accept( Visitor& v ) override { return v.visit( this ); } 40 40 private: 41 virtualDesignation* clone() const override { return new Designation{ *this }; }41 Designation* clone() const override { return new Designation{ *this }; } 42 42 }; 43 43 … … 49 49 Init( const CodeLocation& loc, bool mc ) : ParseNode( loc ), maybeConstructed( mc ) {} 50 50 51 virtual const Init * accept( Visitor& v ) constoverride = 0;51 virtual Init* accept( Visitor& v ) override = 0; 52 52 private: 53 virtual const Init* clone() const override = 0;53 virtual Init* clone() const override = 0; 54 54 }; 55 55 … … 63 63 : Init( loc, mc ), value( val ) {} 64 64 65 virtual const Init * accept( Visitor & v ) constoverride { return v.visit( this ); }65 Init* accept( Visitor& v ) override { return v.visit( this ); } 66 66 private: 67 virtual SingleInit * clone() const override { return new SingleInit{ *this }; } 68 69 /// Must be copied in ALL derived classes 70 template<typename node_t> 71 friend auto mutate(const node_t * node); 67 SingleInit* clone() const override { return new SingleInit{ *this }; } 72 68 }; 73 69 … … 91 87 const_iterator end() const { return initializers.end(); } 92 88 93 virtual const Init * accept( Visitor & v ) constoverride { return v.visit( this ); }89 Init* accept( Visitor& v ) override { return v.visit( this ); } 94 90 private: 95 virtual ListInit * clone() const override { return new ListInit{ *this }; } 96 97 /// Must be copied in ALL derived classes 98 template<typename node_t> 99 friend auto mutate(const node_t * node); 91 ListInit* clone() const override { return new ListInit{ *this }; } 100 92 }; 101 93 … … 114 106 : Init( loc, true ), ctor( ctor ), dtor( dtor ), init( init ) {} 115 107 116 virtual const Init * accept( Visitor & v ) constoverride { return v.visit( this ); }108 Init* accept( Visitor& v ) override { return v.visit( this ); } 117 109 private: 118 virtual ConstructorInit * clone() const override { return new ConstructorInit{ *this }; } 119 120 /// Must be copied in ALL derived classes 121 template<typename node_t> 122 friend auto mutate(const node_t * node); 110 ConstructorInit* clone() const override { return new ConstructorInit{ *this }; } 123 111 }; 124 112 -
src/AST/Label.hpp
rbe567e9 r62315a0 35 35 36 36 Label( CodeLocation loc, const std::string& name = "", 37 std::vector<ptr<Attribute>> && attrs = std::vector<ptr<Attribute>>{} )37 const std::vector<ptr<Attribute>>& attrs = std::vector<ptr<Attribute>>{} ) 38 38 : location( loc ), name( name ), attributes( attrs ) {} 39 39 … … 48 48 inline std::ostream& operator<< ( std::ostream& out, const Label& l ) { return out << l.name; } 49 49 50 51 //================================================================================================= 52 /// This disgusting and giant piece of boiler-plate is here to solve a cyclic dependency 53 /// remove only if there is a better solution 54 /// The problem is that ast::ptr< ... > uses increment/decrement which won't work well with 55 /// forward declarations 56 inline void increment( const class Label * node, Node::ref_type ref ) { node->increment( ref ); } 57 inline void decrement( const class Label * node, Node::ref_type ref ) { node->decrement( ref ); } 58 50 59 } 51 60 -
src/AST/Node.hpp
rbe567e9 r62315a0 30 30 // change/share reference counts 31 31 Node() = default; 32 Node(const Node&) : strong_ count(0), weak_count(0) {}33 Node(Node&&) : strong_ count(0), weak_count(0) {}32 Node(const Node&) : strong_ref(0), weak_ref(0) {} 33 Node(Node&&) : strong_ref(0), weak_ref(0) {} 34 34 Node& operator= (const Node&) = delete; 35 35 Node& operator= (Node&&) = delete; 36 36 virtual ~Node() = default; 37 37 38 virtual const Node * accept( Visitor & v ) const= 0;38 virtual Node* accept( Visitor& v ) = 0; 39 39 40 40 /// Types of node references … … 46 46 inline void increment(ref_type ref) const { 47 47 switch (ref) { 48 case ref_type::strong: strong_ count++; break;49 case ref_type::weak : weak_ count++; break;48 case ref_type::strong: strong_ref++; break; 49 case ref_type::weak : weak_ref ++; break; 50 50 } 51 51 } … … 53 53 inline void decrement(ref_type ref) const { 54 54 switch (ref) { 55 case ref_type::strong: strong_ count--; break;56 case ref_type::weak : weak_ count--; break;55 case ref_type::strong: strong_ref--; break; 56 case ref_type::weak : weak_ref --; break; 57 57 } 58 58 59 if(!strong_ count && !weak_count) {59 if(!strong_ref && !weak_ref) { 60 60 delete this; 61 61 } 62 62 } 63 private:64 /// Make a copy of this node; should be overridden in subclass with more precise return type65 virtual const Node * clone() const = 0;66 63 67 /// Must be copied in ALL derived classes68 64 template<typename node_t> 69 65 friend auto mutate(const node_t * node); 70 66 71 mutable size_t strong_count = 0; 72 mutable size_t weak_count = 0; 67 private: 68 /// Make a copy of this node; should be overridden in subclass with more precise return type 69 virtual Node* clone() const = 0; 70 71 mutable size_t strong_ref = 0; 72 mutable size_t weak_ref = 0; 73 73 }; 74 74 … … 100 100 public: 101 101 ptr_base() : node(nullptr) {} 102 ptr_base( const node_t * n ) : node(n) { if( !node ) increment(node,ref_t); }103 ~ptr_base() { if( node ) decrement(node,ref_t); }102 ptr_base( node_t * n ) : node(n) { if( !node ) node->increment(ref_t); } 103 ~ptr_base() { if( node ) node->decrement(ref_t); } 104 104 105 105 template< enum Node::ref_type o_ref_t > 106 106 ptr_base( const ptr_base<node_t, o_ref_t> & o ) : node(o.node) { 107 107 if( !node ) return; 108 increment(node,ref_t);108 node->increment(ref_t); 109 109 } 110 110 111 111 template< enum Node::ref_type o_ref_t > 112 112 ptr_base( ptr_base<node_t, o_ref_t> && o ) : node(o.node) { 113 if( node ) increment(node, ref_t); 114 } 115 116 template<typename o_node_t> 117 ptr_base & operator=( const o_node_t * node ) { 118 assign(strict_dynamic_cast<const node_t *>(node)); 119 return *this; 113 if( node ) node->increment(ref_t); 120 114 } 121 115 … … 145 139 146 140 private: 147 void assign( constnode_t * other ) {148 if( other ) increment(other,ref_t);149 if( node ) decrement(node ,ref_t);141 void assign(node_t * other ) { 142 if( other ) other->increment(ref_t); 143 if( node ) node ->decrement(ref_t); 150 144 node = other; 151 145 } 152 146 153 147 protected: 154 constnode_t * node;148 node_t * node; 155 149 }; 156 150 -
src/AST/Pass.hpp
rbe567e9 r62315a0 23 23 #include "AST/Fwd.hpp" 24 24 #include "AST/Node.hpp" 25 26 #include "AST/Attribute.hpp"27 25 #include "AST/Decl.hpp" 28 #include "AST/Expr.hpp"29 #include "AST/Init.hpp"30 #include "AST/Stmt.hpp"31 32 26 #include "AST/Visitor.hpp" 33 27 … … 85 79 86 80 /// Visit function declarations 87 virtual const ast::DeclWithType * visit( const ast::ObjectDecl * ) override final;88 virtual const ast::DeclWithType * visit( const ast::FunctionDecl * ) override final;89 virtual const ast::Decl * visit( const ast::StructDecl * ) override final;90 virtual const ast::Decl * visit( const ast::UnionDecl * ) override final;91 virtual const ast::Decl * visit( const ast::EnumDecl * ) override final;92 virtual const ast::Decl * visit( const ast::TraitDecl * ) override final;93 virtual const ast::Decl * visit( const ast::TypeDecl * ) override final;94 virtual const ast::Decl * visit( const ast::TypedefDecl * ) override final;95 virtual const ast::AsmDecl * visit( const ast::AsmDecl * ) override final;96 virtual const ast::StaticAssertDecl * visit( const ast::StaticAssertDecl * ) override final;97 virtual const ast::CompoundStmt * visit( const ast::CompoundStmt * ) override final;98 virtual const ast::Stmt * visit( const ast::ExprStmt * ) override final;99 virtual const ast::Stmt * visit( const ast::AsmStmt * ) override final;100 virtual const ast::Stmt * visit( const ast::DirectiveStmt * ) override final;101 virtual const ast::Stmt * visit( const ast::IfStmt * ) override final;102 virtual const ast::Stmt * visit( const ast::WhileStmt * ) override final;103 virtual const ast::Stmt * visit( const ast::ForStmt * ) override final;104 virtual const ast::Stmt * visit( const ast::SwitchStmt * ) override final;105 virtual const ast::Stmt * visit( const ast::CaseStmt * ) override final;106 virtual const ast::Stmt * visit( const ast::BranchStmt * ) override final;107 virtual const ast::Stmt * visit( const ast::ReturnStmt * ) override final;108 virtual const ast::Stmt * visit( const ast::ThrowStmt * ) override final;109 virtual const ast::Stmt * visit( const ast::TryStmt * ) override final;110 virtual const ast::Stmt * visit( const ast::CatchStmt * ) override final;111 virtual const ast::Stmt * visit( const ast::FinallyStmt * ) override final;112 virtual const ast::Stmt * visit( const ast::WaitForStmt * ) override final;113 virtual const ast::Stmt * visit( const ast::WithStmt * ) override final;114 virtual const ast::NullStmt * visit( const ast::NullStmt * ) override final;115 virtual const ast::Stmt * visit( const ast::DeclStmt * ) override final;116 virtual const ast::Stmt * visit( const ast::ImplicitCtorDtorStmt * ) override final;117 virtual const ast::Expr * visit( const ast::ApplicationExpr * ) override final;118 virtual const ast::Expr * visit( const ast::UntypedExpr * ) override final;119 virtual const ast::Expr * visit( const ast::NameExpr * ) override final;120 virtual const ast::Expr * visit( const ast::AddressExpr * ) override final;121 virtual const ast::Expr * visit( const ast::LabelAddressExpr * ) override final;122 virtual const ast::Expr * visit( const ast::CastExpr * ) override final;123 virtual const ast::Expr * visit( const ast::KeywordCastExpr * ) override final;124 virtual const ast::Expr * visit( const ast::VirtualCastExpr * ) override final;125 virtual const ast::Expr * visit( const ast::UntypedMemberExpr * ) override final;126 virtual const ast::Expr * visit( const ast::MemberExpr * ) override final;127 virtual const ast::Expr * visit( const ast::VariableExpr * ) override final;128 virtual const ast::Expr * visit( const ast::ConstantExpr * ) override final;129 virtual const ast::Expr * visit( const ast::SizeofExpr * ) override final;130 virtual const ast::Expr * visit( const ast::AlignofExpr * ) override final;131 virtual const ast::Expr * visit( const ast::UntypedOffsetofExpr * ) override final;132 virtual const ast::Expr * visit( const ast::OffsetofExpr * ) override final;133 virtual const ast::Expr * visit( const ast::OffsetPackExpr * ) override final;134 virtual const ast::Expr * visit( const ast::AttrExpr * ) override final;135 virtual const ast::Expr * visit( const ast::LogicalExpr * ) override final;136 virtual const ast::Expr * visit( const ast::ConditionalExpr * ) override final;137 virtual const ast::Expr * visit( const ast::CommaExpr * ) override final;138 virtual const ast::Expr * visit( const ast::TypeExpr * ) override final;139 virtual const ast::Expr * visit( const ast::AsmExpr * ) override final;140 virtual const ast::Expr * visit( const ast::ImplicitCopyCtorExpr * ) override final;141 virtual const ast::Expr * visit( const ast::ConstructorExpr * ) override final;142 virtual const ast::Expr * visit( const ast::CompoundLiteralExpr * ) override final;143 virtual const ast::Expr * visit( const ast::RangeExpr * ) override final;144 virtual const ast::Expr * visit( const ast::UntypedTupleExpr * ) override final;145 virtual const ast::Expr * visit( const ast::TupleExpr * ) override final;146 virtual const ast::Expr * visit( const ast::TupleIndexExpr * ) override final;147 virtual const ast::Expr * visit( const ast::TupleAssignExpr * ) override final;148 virtual const ast::Expr * visit( const ast::StmtExpr * ) override final;149 virtual const ast::Expr * visit( const ast::UniqueExpr * ) override final;150 virtual const ast::Expr * visit( const ast::UntypedInitExpr * ) override final;151 virtual const ast::Expr * visit( const ast::InitExpr * ) override final;152 virtual const ast::Expr * visit( const ast::DeletedExpr * ) override final;153 virtual const ast::Expr * visit( const ast::DefaultArgExpr * ) override final;154 virtual const ast::Expr * visit( const ast::GenericExpr * ) override final;155 virtual const ast::Type * visit( const ast::VoidType * ) override final;156 virtual const ast::Type * visit( const ast::BasicType * ) override final;157 virtual const ast::Type * visit( const ast::PointerType * ) override final;158 virtual const ast::Type * visit( const ast::ArrayType * ) override final;159 virtual const ast::Type * visit( const ast::ReferenceType * ) override final;160 virtual const ast::Type * visit( const ast::QualifiedType * ) override final;161 virtual const ast::Type * visit( const ast::FunctionType * ) override final;162 virtual const ast::Type * visit( const ast::StructInstType * ) override final;163 virtual const ast::Type * visit( const ast::UnionInstType * ) override final;164 virtual const ast::Type * visit( const ast::EnumInstType * ) override final;165 virtual const ast::Type * visit( const ast::TraitInstType * ) override final;166 virtual const ast::Type * visit( const ast::TypeInstType * ) override final;167 virtual const ast::Type * visit( const ast::TupleType * ) override final;168 virtual const ast::Type * visit( const ast::TypeofType * ) override final;169 virtual const ast::Type * visit( const ast::AttrType * ) override final;170 virtual const ast::Type * visit( const ast::VarArgsType * ) override final;171 virtual const ast::Type * visit( const ast::ZeroType * ) override final;172 virtual const ast::Type * visit( const ast::OneType * ) override final;173 virtual const ast::Type * visit( const ast::GlobalScopeType * ) override final;174 virtual const ast::Designation * visit( const ast::Designation * ) override final;175 virtual const ast::Init * visit( const ast::SingleInit * ) override final;176 virtual const ast::Init * visit( const ast::ListInit * ) override final;177 virtual const ast::Init * visit( const ast::ConstructorInit * ) override final;178 virtual const ast::Constant * visit( const ast::Constant * ) override final;179 virtual const ast::Attribute * visit( const ast::Attribute * ) override final;180 virtual const ast::TypeSubstitution * visit( const ast::TypeSubstitution * ) override final;81 virtual DeclWithType * visit( const ObjectDecl * ) override final; 82 virtual DeclWithType * visit( const FunctionDecl * ) override final; 83 virtual Decl * visit( const StructDecl * ) override final; 84 virtual Decl * visit( const UnionDecl * ) override final; 85 virtual Decl * visit( const EnumDecl * ) override final; 86 virtual Decl * visit( const TraitDecl * ) override final; 87 virtual Decl * visit( const TypeDecl * ) override final; 88 virtual Decl * visit( const TypedefDecl * ) override final; 89 virtual AsmDecl * visit( const AsmDecl * ) override final; 90 virtual StaticAssertDecl * visit( const StaticAssertDecl * ) override final; 91 virtual CompoundStmt * visit( const CompoundStmt * ) override final; 92 virtual Stmt * visit( const ExprStmt * ) override final; 93 virtual Stmt * visit( const AsmStmt * ) override final; 94 virtual Stmt * visit( const DirectiveStmt * ) override final; 95 virtual Stmt * visit( const IfStmt * ) override final; 96 virtual Stmt * visit( const WhileStmt * ) override final; 97 virtual Stmt * visit( const ForStmt * ) override final; 98 virtual Stmt * visit( const SwitchStmt * ) override final; 99 virtual Stmt * visit( const CaseStmt * ) override final; 100 virtual Stmt * visit( const BranchStmt * ) override final; 101 virtual Stmt * visit( const ReturnStmt * ) override final; 102 virtual Stmt * visit( const ThrowStmt * ) override final; 103 virtual Stmt * visit( const TryStmt * ) override final; 104 virtual Stmt * visit( const CatchStmt * ) override final; 105 virtual Stmt * visit( const FinallyStmt * ) override final; 106 virtual Stmt * visit( const WaitForStmt * ) override final; 107 virtual Stmt * visit( const WithStmt * ) override final; 108 virtual NullStmt * visit( const NullStmt * ) override final; 109 virtual Stmt * visit( const DeclStmt * ) override final; 110 virtual Stmt * visit( const ImplicitCtorDtorStmt * ) override final; 111 virtual Expr * visit( const ApplicationExpr * ) override final; 112 virtual Expr * visit( const UntypedExpr * ) override final; 113 virtual Expr * visit( const NameExpr * ) override final; 114 virtual Expr * visit( const AddressExpr * ) override final; 115 virtual Expr * visit( const LabelAddressExpr * ) override final; 116 virtual Expr * visit( const CastExpr * ) override final; 117 virtual Expr * visit( const KeywordCastExpr * ) override final; 118 virtual Expr * visit( const VirtualCastExpr * ) override final; 119 virtual Expr * visit( const UntypedMemberExpr * ) override final; 120 virtual Expr * visit( const MemberExpr * ) override final; 121 virtual Expr * visit( const VariableExpr * ) override final; 122 virtual Expr * visit( const ConstantExpr * ) override final; 123 virtual Expr * visit( const SizeofExpr * ) override final; 124 virtual Expr * visit( const AlignofExpr * ) override final; 125 virtual Expr * visit( const UntypedOffsetofExpr * ) override final; 126 virtual Expr * visit( const OffsetofExpr * ) override final; 127 virtual Expr * visit( const OffsetPackExpr * ) override final; 128 virtual Expr * visit( const AttrExpr * ) override final; 129 virtual Expr * visit( const LogicalExpr * ) override final; 130 virtual Expr * visit( const ConditionalExpr * ) override final; 131 virtual Expr * visit( const CommaExpr * ) override final; 132 virtual Expr * visit( const TypeExpr * ) override final; 133 virtual Expr * visit( const AsmExpr * ) override final; 134 virtual Expr * visit( const ImplicitCopyCtorExpr * ) override final; 135 virtual Expr * visit( const ConstructorExpr * ) override final; 136 virtual Expr * visit( const CompoundLiteralExpr * ) override final; 137 virtual Expr * visit( const RangeExpr * ) override final; 138 virtual Expr * visit( const UntypedTupleExpr * ) override final; 139 virtual Expr * visit( const TupleExpr * ) override final; 140 virtual Expr * visit( const TupleIndexExpr * ) override final; 141 virtual Expr * visit( const TupleAssignExpr * ) override final; 142 virtual Expr * visit( const StmtExpr * ) override final; 143 virtual Expr * visit( const UniqueExpr * ) override final; 144 virtual Expr * visit( const UntypedInitExpr * ) override final; 145 virtual Expr * visit( const InitExpr * ) override final; 146 virtual Expr * visit( const DeletedExpr * ) override final; 147 virtual Expr * visit( const DefaultArgExpr * ) override final; 148 virtual Expr * visit( const GenericExpr * ) override final; 149 virtual Type * visit( const VoidType * ) override final; 150 virtual Type * visit( const BasicType * ) override final; 151 virtual Type * visit( const PointerType * ) override final; 152 virtual Type * visit( const ArrayType * ) override final; 153 virtual Type * visit( const ReferenceType * ) override final; 154 virtual Type * visit( const QualifiedType * ) override final; 155 virtual Type * visit( const FunctionType * ) override final; 156 virtual Type * visit( const StructInstType * ) override final; 157 virtual Type * visit( const UnionInstType * ) override final; 158 virtual Type * visit( const EnumInstType * ) override final; 159 virtual Type * visit( const TraitInstType * ) override final; 160 virtual Type * visit( const TypeInstType * ) override final; 161 virtual Type * visit( const TupleType * ) override final; 162 virtual Type * visit( const TypeofType * ) override final; 163 virtual Type * visit( const AttrType * ) override final; 164 virtual Type * visit( const VarArgsType * ) override final; 165 virtual Type * visit( const ZeroType * ) override final; 166 virtual Type * visit( const OneType * ) override final; 167 virtual Type * visit( const GlobalScopeType * ) override final; 168 virtual Designation * visit( const Designation * ) override final; 169 virtual Init * visit( const SingleInit * ) override final; 170 virtual Init * visit( const ListInit * ) override final; 171 virtual Init * visit( const ConstructorInit * ) override final; 172 virtual Constant * visit( const Constant * ) override final; 173 virtual Attribute * visit( const Attribute * ) override final; 174 virtual TypeSubstitution * visit( const TypeSubstitution * ) override final; 181 175 182 176 friend void acceptAll( std::list< ptr<Decl> > & decls, Pass<pass_t>& visitor ); … … 186 180 187 181 private: 188 const ast::Stmt * call_accept( const ast::Stmt * ); 189 const ast::Expr * call_accept( const ast::Expr * ); 190 191 template< typename node_t > 192 auto call_accept( const node_t * node ) -> decltype( node->accept(*this) ); 193 194 template< template <class...> class container_t > 182 /// Logic to call the accept and mutate the parent if needed, delegates call to accept 183 template<typename parent_t, typename child_t> 184 void maybe_accept(parent_t * & , typename parent_t::child_t *); 185 186 Stmt * call_accept( const Stmt * ); 187 Expr * call_accept( const Expr * ); 188 189 template< template <class> class container_t > 195 190 container_t< ptr<Stmt> > call_accept( const container_t< ptr<Stmt> > & ); 196 191 197 template< template <class ...> class container_t, typename node_t >192 template< template <class> class container_t, typename node_t > 198 193 container_t< ptr<node_t> > call_accept( const container_t< ptr<node_t> > & container ); 199 200 /// Logic to call the accept and mutate the parent if needed, delegates call to accept201 template<typename node_t, typename parent_t, typename child_t>202 void maybe_accept(const node_t * &, child_t parent_t::* child);203 194 204 195 private: … … 219 210 220 211 template<typename pass_t> 221 void accept _all( std::list< ast::ptr<ast::Decl> > &, ast::Pass<pass_t>& visitor );212 void acceptAll( std::list< ptr<Decl> >, Pass<pass_t>& visitor ); 222 213 223 214 //------------------------------------------------------------------------------------------------- 224 215 // PASS ACCESSORIES 225 216 //------------------------------------------------------------------------------------------------- 217 218 template<typename T> 219 using std_list = std::list<T>; 226 220 227 221 /// Keep track of the polymorphic const TypeSubstitution * env for the current expression … … 232 226 /// Used if visitor requires added statements before or after the current node. 233 227 /// The Pass template handles what *before* and *after* means automatically 234 template< template<class ...> class container_t = std::list >228 template< template<class> class container_t = std_list > 235 229 struct WithStmtsToAdd { 236 230 container_t< ptr<Stmt> > stmtsToAddBefore; … … 240 234 /// Used if visitor requires added declarations before or after the current node. 241 235 /// The Pass template handles what *before* and *after* means automatically 242 template< template<class ...> class container_t = std::list >236 template< template<class> class container_t = std_list > 243 237 struct WithDeclsToAdd { 244 238 container_t< ptr<Decl> > declsToAddBefore; … … 292 286 }; 293 287 } 294 295 #include "Common/Stats.h"296 297 extern struct PassVisitorStats {298 size_t depth = 0;299 Stats::Counters::MaxCounter<double> * max = nullptr;300 Stats::Counters::AverageCounter<double> * avg = nullptr;301 } pass_visitor_stats;302 303 #include "AST/Pass.impl.hpp" -
src/AST/Pass.impl.hpp
rbe567e9 r62315a0 16 16 #pragma once 17 17 // IWYU pragma: private, include "AST/Pass.hpp" 18 19 #include <type_traits>20 #include <unordered_map>21 18 22 19 #define VISIT_START( node ) \ … … 29 26 __pass::previsit( pass, node, 0 ); 30 27 31 #define VISIT( code ...) \28 #define VISIT( code ) \ 32 29 /* if this node should visit its children */ \ 33 30 if ( __visit_children() ) { \ … … 38 35 #define VISIT_END( type, node ) \ 39 36 /* call the implementation of the postvisit of this pass */ \ 40 auto __return = __pass::postvisit ( pass, node, 0); \37 auto __return = __pass::postvisit< type * >( node ); \ 41 38 assertf(__return, "post visit should never return null"); \ 42 39 return __return; 43 40 44 41 #ifdef PEDANTIC_PASS_ASSERT 45 #define __pedantic_pass_assert (...) assert (__VA_ARGS__)46 #define __pedantic_pass_assertf(...) assertf(__VA _ARGS__)42 #define __pedantic_pass_assert (...) assert (__VAR_ARGS__) 43 #define __pedantic_pass_assertf(...) assertf(__VAR_ARGS__) 47 44 #else 48 #define __pedantic_pass_assert (...)45 #define __pedantic_pass_assert (...) 49 46 #define __pedantic_pass_assertf(...) 50 47 #endif … … 58 55 } 59 56 60 //------------------------------ 61 template<typename it_t, template <class...> class container_t> 62 static inline void take_all( it_t it, container_t<ast::ptr<ast::Decl>> * decls, bool * mutated = nullptr ) { 57 template<typename it_t, template <class> class container_t> 58 static inline void take_all( it_t it, container_t<ast::ptr<ast::Declaration>> * decls, bool * mutated = nullptr ) { 63 59 if(empty(decls)) return; 64 60 65 std::transform(decls->begin(), decls->end(), it, []( const ast::Decl* decl) -> auto {61 std::transform(decls->begin(), decls->end(), it, [](Declaration * decl) -> auto { 66 62 return new DeclStmt( decl ); 67 63 }); … … 70 66 } 71 67 72 template<typename it_t, template <class ...> class container_t>73 static inline void take_all( it_t it, container_t<ast::ptr<ast::St mt>> * decls, bool * mutated = nullptr ) {68 template<typename it_t, template <class> class container_t> 69 static inline void take_all( it_t it, container_t<ast::ptr<ast::Statement>> * decls, bool * mutated = nullptr ) { 74 70 if(empty(decls)) return; 75 71 … … 79 75 } 80 76 81 //------------------------------82 /// Check if should be skipped, different for pointers and containers83 77 template<typename node_t> 84 bool skip( const ast::ptr<node_t> & val) { 85 return !val; 86 } 87 88 template< template <class...> class container_t, typename node_t > 89 bool skip( const container_t<ast::ptr< node_t >> & val ) { 90 return val.empty(); 91 } 92 93 //------------------------------ 94 /// Get the value to visit, different for pointers and containers 95 template<typename node_t> 96 auto get( const ast::ptr<node_t> & val, int ) -> decltype(val.get()) { 97 return val.get(); 98 } 99 100 template<typename node_t> 101 const node_t & get( const node_t & val, long) { 102 return val; 103 } 104 105 106 //------------------------------ 107 /// Check if value was mutated, different for pointers and containers 108 template<typename lhs_t, typename rhs_t> 109 bool differs( const lhs_t * old_val, const rhs_t * new_val ) { 78 bool differs( const node_t * old_val, const node_t * new_val ) { 110 79 return old_val != new_val; 111 80 } 112 81 113 template< template <class ...> class container_t, typename node_t >114 bool differs( const container_t<ast::ptr< node_t >> &, const container_t<ast::ptr< node_t >> & new_val ) {82 template< template <class> class container_t > 83 bool differs( const container_t<ast::ptr< ast::Statement >> &, const container_t<ast::ptr< ast::Statement >> & new_val ) { 115 84 return !new_val.empty(); 116 85 } 117 86 } 118 87 88 template<typename parent_t, typename child_t> 89 template< typename pass_t > 90 void Pass< pass_t >::maybe_accept( 91 const parent_t * & parent, 92 const typename parent_t::child_t * child 93 ) { 94 const auto & old_val = parent->*child; 95 if(!old_val) return; 96 97 auto new_val = call_accept(old_val); 98 99 if( __pass::differs(old_val, new_val) ) { 100 auto new_parent = mutate(parent); 101 new_parent->*child = new_val; 102 parent = new_parent; 103 } 104 } 105 119 106 template< typename pass_t > 120 107 template< typename node_t > 121 auto Pass< pass_t >::call_accept( const node_t * node ) -> decltype( node->accept(*this) ){108 auto Pass< pass_t >::call_accept( const node_t * node ) { 122 109 __pedantic_pass_assert( __visit_children() ); 123 110 __pedantic_pass_assert( expr ); 124 111 125 static_assert( !std::is_base_of<ast::Expr, node_t>::value, "ERROR");126 static_assert( !std::is_base_of<ast::Stmt, node_t>::value, "ERROR");127 128 112 return node->accept( *this ); 129 113 } 130 114 131 115 template< typename pass_t > 132 constast::Expr * Pass< pass_t >::call_accept( const ast::Expr * expr ) {116 ast::Expr * Pass< pass_t >::call_accept( const ast::Expr * expr ) { 133 117 __pedantic_pass_assert( __visit_children() ); 134 118 __pedantic_pass_assert( expr ); … … 143 127 144 128 template< typename pass_t > 145 const ast::Stmt * Pass< pass_t >::call_accept( const ast::Stmt * stmt ) {129 Stmt * Pass< pass_t >::call_accept( const Stmt * stmt ) { 146 130 __pedantic_pass_assert( __visit_children() ); 147 131 __pedantic_pass_assert( stmt ); … … 157 141 158 142 // These may be modified by subnode but most be restored once we exit this statemnet. 159 ValueGuardPtr< const ast::TypeSubstitution * > __old_env ( __pass::env( pass, 0) );160 ValueGuardPtr< typename std::remove_pointer< decltype(stmts_before) > >__old_decls_before( stmts_before );161 ValueGuardPtr< typename std::remove_pointer< decltype(stmts_after ) > >__old_decls_after ( stmts_after );162 ValueGuardPtr< typename std::remove_pointer< decltype(decls_before) > >__old_stmts_before( decls_before );163 ValueGuardPtr< typename std::remove_pointer< decltype(decls_after ) > >__old_stmts_after ( decls_after );143 ValueGuardPtr< const ast::TypeSubstitution * > __old_env ( __pass::env( pass, 0); ); 144 ValueGuardPtr< typename std::remove_pointer< decltype(stmts_before) > __old_decls_before( stmts_before ); 145 ValueGuardPtr< typename std::remove_pointer< decltype(stmts_after ) > __old_decls_after ( stmts_after ); 146 ValueGuardPtr< typename std::remove_pointer< decltype(decls_before) > __old_stmts_before( decls_before ); 147 ValueGuardPtr< typename std::remove_pointer< decltype(decls_after ) > __old_stmts_after ( decls_after ); 164 148 165 149 // Now is the time to actually visit the node 166 const ast::Stmt * nstmt = stmt->accept( *this );150 ast::Statement * nstmt = stmt->accept( *this ); 167 151 168 152 // If the pass doesn't want to add anything then we are done … … 177 161 178 162 // Create a new Compound Statement to hold the new decls/stmts 179 ast::CompoundStmt * compound = new ast::CompoundStmt( stmt->location );163 ast::CompoundStmt * compound = new ast::CompoundStmt( parent->*child.location ); 180 164 181 165 // Take all the declarations that go before … … 184 168 185 169 // Insert the original declaration 186 compound->kids. emplace_back( nstmt );170 compound->kids.push_back( nstmt ); 187 171 188 172 // Insert all the declarations that go before … … 194 178 195 179 template< typename pass_t > 196 template< template <class ...> class container_t >180 template< template <class> class container_t > 197 181 container_t< ptr<Stmt> > Pass< pass_t >::call_accept( const container_t< ptr<Stmt> > & statements ) { 198 182 __pedantic_pass_assert( __visit_children() ); … … 212 196 213 197 // These may be modified by subnode but most be restored once we exit this statemnet. 214 ValueGuardPtr< typename std::remove_pointer< decltype(stmts_before) > >__old_decls_before( stmts_before );215 ValueGuardPtr< typename std::remove_pointer< decltype(stmts_after ) > >__old_decls_after ( stmts_after );216 ValueGuardPtr< typename std::remove_pointer< decltype(decls_before) > >__old_stmts_before( decls_before );217 ValueGuardPtr< typename std::remove_pointer< decltype(decls_after ) > >__old_stmts_after ( decls_after );198 ValueGuardPtr< typename std::remove_pointer< decltype(stmts_before) > __old_decls_before( stmts_before ); 199 ValueGuardPtr< typename std::remove_pointer< decltype(stmts_after ) > __old_decls_after ( stmts_after ); 200 ValueGuardPtr< typename std::remove_pointer< decltype(decls_before) > __old_stmts_before( decls_before ); 201 ValueGuardPtr< typename std::remove_pointer< decltype(decls_after ) > __old_stmts_after ( decls_after ); 218 202 219 203 // update pass statitistics … … 227 211 try { 228 212 __pedantic_pass_assert( stmt ); 229 const ast::St mt * new_stmt = stmt->accept( *this);213 const ast::Statment * new_stmt = stmt->accept( visitor ); 230 214 assert( new_stmt ); 231 215 if(new_stmt != stmt ) mutated = true; … … 256 240 if ( !errors.isEmpty() ) { throw errors; } 257 241 258 return mutated ? new_kids : container_t< ptr<Stmt> >();259 } 260 261 template< typename pass_t > 262 template< template <class ...> class container_t, typename node_t >242 return mutated ? new_kids : {}; 243 } 244 245 template< typename pass_t > 246 template< template <class> class container_t, typename node_t > 263 247 container_t< ast::ptr<node_t> > Pass< pass_t >::call_accept( const container_t< ast::ptr<node_t> > & container ) { 264 248 __pedantic_pass_assert( __visit_children() ); … … 275 259 try { 276 260 __pedantic_pass_assert( node ); 277 const node_t * new_ stmt= strict_dynamic_cast< const node_t * >( node->accept( *this ) );278 if(new_stmt != node) mutated = true;261 const node_t * new_node = strict_dynamic_cast< const node_t * >( node->accept( *this ) ); 262 if(new_stmt != stmt ) mutated = true; 279 263 280 264 new_kids.emplace_back( new_stmt ); … … 287 271 if ( ! errors.isEmpty() ) { throw errors; } 288 272 289 return mutated ? new_kids : container_t< ast::ptr<node_t> >(); 290 } 291 292 template< typename pass_t > 293 template<typename node_t, typename parent_t, typename child_t> 294 void Pass< pass_t >::maybe_accept( 295 const node_t * & parent, 296 child_t parent_t::*child 297 ) { 298 static_assert( std::is_base_of<parent_t, node_t>::value, "Error deductiing member object" ); 299 300 if(__pass::skip(parent->*child)) return; 301 const auto & old_val = __pass::get(parent->*child, 0); 302 303 static_assert( !std::is_same<const ast::Node * &, decltype(old_val)>::value, "ERROR"); 304 305 auto new_val = call_accept( old_val ); 306 307 static_assert( !std::is_same<const ast::Node *, decltype(new_val)>::value || std::is_same<int, decltype(old_val)>::value, "ERROR"); 308 309 if( __pass::differs(old_val, new_val) ) { 310 auto new_parent = mutate(parent); 311 new_parent->*child = new_val; 312 parent = new_parent; 313 } 314 } 315 273 return mutated ? new_kids : {}; 274 } 316 275 } 317 276 … … 325 284 326 285 template< typename pass_t > 327 inline void ast::accept _all( std::list< ast::ptr<ast::Decl> > & decls, ast::Pass< pass_t > & visitor ) {286 inline void ast::acceptAll( std::list< ast::ptr<ast::Decl> > & decls, ast::Pass< pass_t > & visitor ) { 328 287 // We are going to aggregate errors for all these statements 329 288 SemanticErrorException errors; … … 333 292 334 293 // get the stmts/decls that will need to be spliced in 335 auto decls_before = __pass::declsToAddBefore( visitor.pass, 0);336 auto decls_after = __pass::declsToAddAfter ( visitor.pass, 0);294 auto decls_before = __pass::declsToAddBefore( pass, 0); 295 auto decls_after = __pass::declsToAddAfter ( pass, 0); 337 296 338 297 // update pass statitistics … … 384 343 // ObjectDecl 385 344 template< typename pass_t > 386 constast::DeclWithType * ast::Pass< pass_t >::visit( const ast::ObjectDecl * node ) {345 ast::DeclWithType * ast::Pass< pass_t >::visit( const ast::ObjectDecl * node ) { 387 346 VISIT_START( node ); 388 347 389 348 VISIT( 390 349 { 391 guard_indexerguard { *this };392 maybe_accept( node, &ast::ObjectDecl::type );393 } 394 maybe_accept( node, &ast::ObjectDecl::init );395 maybe_accept( node, &ast::ObjectDecl::bitfieldWidth );396 maybe_accept( node, &ast::ObjectDecl::attributes );350 indexer_guard guard { *this }; 351 maybe_accept( node, ObjectDecl::type ); 352 } 353 maybe_accept( node, ObjectDecl::init ); 354 maybe_accept( node, ObjectDecl::bitfieldWidth ); 355 maybe_accept( node, ObjectDecl::attributes ); 397 356 ) 398 357 399 __pass::indexer:: addId( pass, 0, node );358 __pass::indexer::AddId( pass, 0, node ); 400 359 401 360 VISIT_END( DeclWithType, node ); 402 }403 404 //--------------------------------------------------------------------------405 // SingleInit406 template< typename pass_t >407 const ast::Init * ast::Pass< pass_t >::visit( const ast::SingleInit * node ) {408 VISIT_START( node );409 410 VISIT(411 maybe_accept( node, &SingleInit::value );412 )413 414 VISIT_END( Init, node );415 }416 417 //--------------------------------------------------------------------------418 // ListInit419 template< typename pass_t >420 const ast::Init * ast::Pass< pass_t >::visit( const ast::ListInit * node ) {421 VISIT_START( node );422 423 VISIT(424 maybe_accept( node, &ListInit::designations );425 maybe_accept( node, &ListInit::initializers );426 )427 428 VISIT_END( Init, node );429 }430 431 //--------------------------------------------------------------------------432 // ConstructorInit433 template< typename pass_t >434 const ast::Init * ast::Pass< pass_t >::visit( const ast::ConstructorInit * node ) {435 VISIT_START( node );436 437 VISIT(438 maybe_accept( node, &ConstructorInit::ctor );439 maybe_accept( node, &ConstructorInit::dtor );440 maybe_accept( node, &ConstructorInit::init );441 )442 443 VISIT_END( Init, node );444 361 } 445 362 446 363 //-------------------------------------------------------------------------- 447 364 // Attribute 448 template< typename pass_t >449 const ast::Attribute * ast::Pass< pass_t>::visit( const ast::Attribute * node ) {450 VISIT_START( node);365 template< typename pass_type > 366 ast::Attribute * ast::Pass< pass_type >::visit( const ast::Attribute * node ) { 367 VISIT_START(node); 451 368 452 369 VISIT( 453 maybe_accept( node, &Attribute::parameters );370 maybe_accept( node, ast::Attribute::parameters ); 454 371 ) 455 372 456 VISIT_END( Attribute *, node );373 VISIT_END(ast::Attribute *, node ); 457 374 } 458 375 459 376 //-------------------------------------------------------------------------- 460 377 // TypeSubstitution 461 template< typename pass_t > 462 const ast::TypeSubstitution * ast::Pass< pass_t >::visit( const ast::TypeSubstitution * node ) { 463 VISIT_START( node ); 464 465 VISIT( 466 { 467 bool mutated = false; 468 std::unordered_map< std::string, ast::ptr< ast::Type > > new_map; 469 for ( const auto & p : node->typeEnv ) { 470 guard_indexer guard { *this }; 471 auto new_node = p.second->accept( *this ); 472 if (new_node != p.second) mutated = false; 473 new_map.insert({ p.first, new_node }); 474 } 475 if (mutated) { 476 auto new_node = mutate( node ); 477 new_node->typeEnv.swap( new_map ); 478 node = new_node; 479 } 480 } 481 482 { 483 bool mutated = false; 484 std::unordered_map< std::string, ast::ptr< ast::Expr > > new_map; 485 for ( const auto & p : node->varEnv ) { 486 guard_indexer guard { *this }; 487 auto new_node = p.second->accept( *this ); 488 if (new_node != p.second) mutated = false; 489 new_map.insert({ p.first, new_node }); 490 } 491 if (mutated) { 492 auto new_node = mutate( node ); 493 new_node->varEnv.swap( new_map ); 494 node = new_node; 495 } 496 } 497 ) 498 499 VISIT_END( TypeSubstitution, node ); 378 template< typename pass_type > 379 TypeSubstitution * PassVisitor< pass_type >::mutate( const TypeSubstitution * node ) { 380 MUTATE_START( node ); 381 382 #error this is broken 383 384 for ( auto & p : node->typeEnv ) { 385 indexerScopedMutate( p.second, *this ); 386 } 387 for ( auto & p : node->varEnv ) { 388 indexerScopedMutate( p.second, *this ); 389 } 390 391 MUTATE_END( TypeSubstitution, node ); 500 392 } 501 393 -
src/AST/Pass.proto.hpp
rbe567e9 r62315a0 162 162 163 163 // List of fields and their expected types 164 FIELD_PTR( env, const ast::TypeSubstitution *)164 FIELD_PTR( env, const ast::TypeSubstitution ) 165 165 FIELD_PTR( stmtsToAddBefore, std::list< ast::ptr< ast::Stmt > > ) 166 166 FIELD_PTR( stmtsToAddAfter , std::list< ast::ptr< ast::Stmt > > ) … … 235 235 static inline void func( pass_t &, long, type1, type2 ) {} 236 236 237 INDEXER_FUNC1( addId , constDeclWithType * );238 INDEXER_FUNC1( addType , constNamedTypeDecl * );239 INDEXER_FUNC1( addStruct , constStructDecl * );240 INDEXER_FUNC1( addEnum , constEnumDecl * );241 INDEXER_FUNC1( addUnion , constUnionDecl * );242 INDEXER_FUNC1( addTrait , constTraitDecl * );243 INDEXER_FUNC2( addWith , const std::list< Expression * > &, constNode * );237 INDEXER_FUNC1( addId , DeclWithType * ); 238 INDEXER_FUNC1( addType , NamedTypeDecl * ); 239 INDEXER_FUNC1( addStruct , StructDecl * ); 240 INDEXER_FUNC1( addEnum , EnumDecl * ); 241 INDEXER_FUNC1( addUnion , UnionDecl * ); 242 INDEXER_FUNC1( addTrait , TraitDecl * ); 243 INDEXER_FUNC2( addWith , std::list< Expression * > &, Node * ); 244 244 245 245 // A few extra functions have more complicated behaviour, they are hand written 246 template<typename pass_t>247 static inline auto addStructFwd( pass_t & pass, int, constast::StructDecl * decl ) -> decltype( pass.indexer.addStruct( decl ), void() ) {248 ast::StructDecl * fwd = new ast::StructDecl( decl->location, decl->name );249 fwd->parameters = decl->parameters;250 pass.indexer.addStruct( fwd );251 }252 253 template<typename pass_t>254 static inline void addStructFwd( pass_t &, long, constast::StructDecl * ) {}255 256 template<typename pass_t>257 static inline auto addUnionFwd( pass_t & pass, int, constast::UnionDecl * decl ) -> decltype( pass.indexer.addUnion( decl ), void() ) {258 UnionDecl * fwd = new UnionDecl( decl->location,decl->name );259 fwd->parameters = decl->parameters;260 pass.indexer.addUnion( fwd );261 }262 263 template<typename pass_t>264 static inline void addUnionFwd( pass_t &, long, constast::UnionDecl * ) {}265 266 template<typename pass_t>267 static inline auto addStruct( pass_t & pass, int, const std::string & str ) -> decltype( pass.indexer.addStruct( str ), void() ) {268 if ( ! pass.indexer.lookupStruct( str ) ) {269 pass.indexer.addStruct( str );270 }271 }272 273 template<typename pass_t>274 static inline void addStruct( pass_t &, long, const std::string & ) {}275 276 template<typename pass_t>277 static inline auto addUnion( pass_t & pass, int, const std::string & str ) -> decltype( pass.indexer.addUnion( str ), void() ) {278 if ( ! pass.indexer.lookupUnion( str ) ) {279 pass.indexer.addUnion( str );280 }281 }282 283 template<typename pass_t>284 static inline void addUnion( pass_t &, long, const std::string & ) {}246 // template<typename pass_t> 247 // static inline auto addStructFwd( pass_t & pass, int, ast::StructDecl * decl ) -> decltype( pass.indexer.addStruct( decl ), void() ) { 248 // ast::StructDecl * fwd = new ast::StructDecl( decl->location, decl->name ); 249 // fwd->parameters = decl->parameters; 250 // pass.indexer.addStruct( fwd ); 251 // } 252 253 // template<typename pass_t> 254 // static inline void addStructFwd( pass_t &, long, ast::StructDecl * ) {} 255 256 // template<typename pass_t> 257 // static inline auto addUnionFwd( pass_t & pass, int, ast::UnionDecl * decl ) -> decltype( pass.indexer.addUnion( decl ), void() ) { 258 // UnionDecl * fwd = new UnionDecl( decl->name ); 259 // fwd->parameters = decl->parameters; 260 // pass.indexer.addUnion( fwd ); 261 // } 262 263 // template<typename pass_t> 264 // static inline void addUnionFwd( pass_t &, long, ast::UnionDecl * ) {} 265 266 // template<typename pass_t> 267 // static inline auto addStruct( pass_t & pass, int, const std::string & str ) -> decltype( pass.indexer.addStruct( str ), void() ) { 268 // if ( ! pass.indexer.lookupStruct( str ) ) { 269 // pass.indexer.addStruct( str ); 270 // } 271 // } 272 273 // template<typename pass_t> 274 // static inline void addStruct( pass_t &, long, const std::string & ) {} 275 276 // template<typename pass_t> 277 // static inline auto addUnion( pass_t & pass, int, const std::string & str ) -> decltype( pass.indexer.addUnion( str ), void() ) { 278 // if ( ! pass.indexer.lookupUnion( str ) ) { 279 // pass.indexer.addUnion( str ); 280 // } 281 // } 282 283 // template<typename pass_t> 284 // static inline void addUnion( pass_t &, long, const std::string & ) {} 285 285 286 286 #undef INDEXER_FUNC1 -
src/AST/Stmt.hpp
rbe567e9 r62315a0 40 40 Stmt(const Stmt& o) : ParseNode(o), labels(o.labels) {} 41 41 42 virtual const Stmt* accept( Visitor& v ) constoverride = 0;42 virtual Stmt* accept( Visitor& v ) override = 0; 43 43 private: 44 44 virtual Stmt* clone() const override = 0; … … 59 59 void push_front( Stmt* s ) { kids.emplace_front( s ); } 60 60 61 virtual const CompoundStmt* accept( Visitor& v ) constoverride { return v.visit( this ); }61 CompoundStmt* accept( Visitor& v ) override { return v.visit( this ); } 62 62 private: 63 virtualCompoundStmt* clone() const override { return new CompoundStmt{ *this }; }63 CompoundStmt* clone() const override { return new CompoundStmt{ *this }; } 64 64 }; 65 65 … … 70 70 : Stmt(loc, std::move(labels)) {} 71 71 72 virtual const NullStmt * accept( Visitor& v ) constoverride { return v.visit( this ); }72 NullStmt* accept( Visitor& v ) override { return v.visit( this ); } 73 73 private: 74 virtual NullStmt* clone() const override { return new NullStmt{ *this }; }74 NullStmt* clone() const override { return new NullStmt{ *this }; } 75 75 }; 76 76 … … 82 82 ExprStmt( const CodeLocation& loc, Expr* e ) : Stmt(loc), expr(e) {} 83 83 84 virtual const Stmt * accept( Visitor& v ) constoverride { return v.visit( this ); }84 Stmt* accept( Visitor& v ) override { return v.visit( this ); } 85 85 private: 86 virtual ExprStmt* clone() const override { return new ExprStmt{ *this }; }86 ExprStmt* clone() const override { return new ExprStmt{ *this }; } 87 87 }; 88 88 … … 100 100 inline void increment( const class ExprStmt * node, Node::ref_type ref ) { node->increment( ref ); } 101 101 inline void decrement( const class ExprStmt * node, Node::ref_type ref ) { node->decrement( ref ); } 102 //inline void increment( const class AsmStmt * node, Node::ref_type ref ) { node->increment( ref ); }103 //inline void decrement( const class AsmStmt * node, Node::ref_type ref ) { node->decrement( ref ); }104 //inline void increment( const class DirectiveStmt * node, Node::ref_type ref ) { node->increment( ref ); }105 //inline void decrement( const class DirectiveStmt * node, Node::ref_type ref ) { node->decrement( ref ); }106 //inline void increment( const class IfStmt * node, Node::ref_type ref ) { node->increment( ref ); }107 //inline void decrement( const class IfStmt * node, Node::ref_type ref ) { node->decrement( ref ); }108 //inline void increment( const class WhileStmt * node, Node::ref_type ref ) { node->increment( ref ); }109 //inline void decrement( const class WhileStmt * node, Node::ref_type ref ) { node->decrement( ref ); }110 //inline void increment( const class ForStmt * node, Node::ref_type ref ) { node->increment( ref ); }111 //inline void decrement( const class ForStmt * node, Node::ref_type ref ) { node->decrement( ref ); }112 //inline void increment( const class SwitchStmt * node, Node::ref_type ref ) { node->increment( ref ); }113 //inline void decrement( const class SwitchStmt * node, Node::ref_type ref ) { node->decrement( ref ); }114 //inline void increment( const class CaseStmt * node, Node::ref_type ref ) { node->increment( ref ); }115 //inline void decrement( const class CaseStmt * node, Node::ref_type ref ) { node->decrement( ref ); }116 //inline void increment( const class BranchStmt * node, Node::ref_type ref ) { node->increment( ref ); }117 //inline void decrement( const class BranchStmt * node, Node::ref_type ref ) { node->decrement( ref ); }118 //inline void increment( const class ReturnStmt * node, Node::ref_type ref ) { node->increment( ref ); }119 //inline void decrement( const class ReturnStmt * node, Node::ref_type ref ) { node->decrement( ref ); }120 //inline void increment( const class ThrowStmt * node, Node::ref_type ref ) { node->increment( ref ); }121 //inline void decrement( const class ThrowStmt * node, Node::ref_type ref ) { node->decrement( ref ); }122 //inline void increment( const class TryStmt * node, Node::ref_type ref ) { node->increment( ref ); }123 //inline void decrement( const class TryStmt * node, Node::ref_type ref ) { node->decrement( ref ); }124 //inline void increment( const class CatchStmt * node, Node::ref_type ref ) { node->increment( ref ); }125 //inline void decrement( const class CatchStmt * node, Node::ref_type ref ) { node->decrement( ref ); }126 //inline void increment( const class FinallyStmt * node, Node::ref_type ref ) { node->increment( ref ); }127 //inline void decrement( const class FinallyStmt * node, Node::ref_type ref ) { node->decrement( ref ); }128 //inline void increment( const class WaitForStmt * node, Node::ref_type ref ) { node->increment( ref ); }129 //inline void decrement( const class WaitForStmt * node, Node::ref_type ref ) { node->decrement( ref ); }130 //inline void increment( const class WithStmt * node, Node::ref_type ref ) { node->increment( ref ); }131 //inline void decrement( const class WithStmt * node, Node::ref_type ref ) { node->decrement( ref ); }132 //inline void increment( const class DeclStmt * node, Node::ref_type ref ) { node->increment( ref ); }133 //inline void decrement( const class DeclStmt * node, Node::ref_type ref ) { node->decrement( ref ); }102 inline void increment( const class AsmStmt * node, Node::ref_type ref ) { node->increment( ref ); } 103 inline void decrement( const class AsmStmt * node, Node::ref_type ref ) { node->decrement( ref ); } 104 inline void increment( const class DirectiveStmt * node, Node::ref_type ref ) { node->increment( ref ); } 105 inline void decrement( const class DirectiveStmt * node, Node::ref_type ref ) { node->decrement( ref ); } 106 inline void increment( const class IfStmt * node, Node::ref_type ref ) { node->increment( ref ); } 107 inline void decrement( const class IfStmt * node, Node::ref_type ref ) { node->decrement( ref ); } 108 inline void increment( const class WhileStmt * node, Node::ref_type ref ) { node->increment( ref ); } 109 inline void decrement( const class WhileStmt * node, Node::ref_type ref ) { node->decrement( ref ); } 110 inline void increment( const class ForStmt * node, Node::ref_type ref ) { node->increment( ref ); } 111 inline void decrement( const class ForStmt * node, Node::ref_type ref ) { node->decrement( ref ); } 112 inline void increment( const class SwitchStmt * node, Node::ref_type ref ) { node->increment( ref ); } 113 inline void decrement( const class SwitchStmt * node, Node::ref_type ref ) { node->decrement( ref ); } 114 inline void increment( const class CaseStmt * node, Node::ref_type ref ) { node->increment( ref ); } 115 inline void decrement( const class CaseStmt * node, Node::ref_type ref ) { node->decrement( ref ); } 116 inline void increment( const class BranchStmt * node, Node::ref_type ref ) { node->increment( ref ); } 117 inline void decrement( const class BranchStmt * node, Node::ref_type ref ) { node->decrement( ref ); } 118 inline void increment( const class ReturnStmt * node, Node::ref_type ref ) { node->increment( ref ); } 119 inline void decrement( const class ReturnStmt * node, Node::ref_type ref ) { node->decrement( ref ); } 120 inline void increment( const class ThrowStmt * node, Node::ref_type ref ) { node->increment( ref ); } 121 inline void decrement( const class ThrowStmt * node, Node::ref_type ref ) { node->decrement( ref ); } 122 inline void increment( const class TryStmt * node, Node::ref_type ref ) { node->increment( ref ); } 123 inline void decrement( const class TryStmt * node, Node::ref_type ref ) { node->decrement( ref ); } 124 inline void increment( const class CatchStmt * node, Node::ref_type ref ) { node->increment( ref ); } 125 inline void decrement( const class CatchStmt * node, Node::ref_type ref ) { node->decrement( ref ); } 126 inline void increment( const class FinallyStmt * node, Node::ref_type ref ) { node->increment( ref ); } 127 inline void decrement( const class FinallyStmt * node, Node::ref_type ref ) { node->decrement( ref ); } 128 inline void increment( const class WaitForStmt * node, Node::ref_type ref ) { node->increment( ref ); } 129 inline void decrement( const class WaitForStmt * node, Node::ref_type ref ) { node->decrement( ref ); } 130 inline void increment( const class WithStmt * node, Node::ref_type ref ) { node->increment( ref ); } 131 inline void decrement( const class WithStmt * node, Node::ref_type ref ) { node->decrement( ref ); } 132 inline void increment( const class DeclStmt * node, Node::ref_type ref ) { node->increment( ref ); } 133 inline void decrement( const class DeclStmt * node, Node::ref_type ref ) { node->decrement( ref ); } 134 134 inline void increment( const class NullStmt * node, Node::ref_type ref ) { node->increment( ref ); } 135 135 inline void decrement( const class NullStmt * node, Node::ref_type ref ) { node->decrement( ref ); } 136 //inline void increment( const class ImplicitCtorDtorStmt * node, Node::ref_type ref ) { node->increment( ref ); }137 //inline void decrement( const class ImplicitCtorDtorStmt * node, Node::ref_type ref ) { node->decrement( ref ); }136 inline void increment( const class ImplicitCtorDtorStmt * node, Node::ref_type ref ) { node->increment( ref ); } 137 inline void decrement( const class ImplicitCtorDtorStmt * node, Node::ref_type ref ) { node->decrement( ref ); } 138 138 139 139 } -
src/AST/Type.hpp
rbe567e9 r62315a0 21 21 22 22 class Type : public Node { 23 public: 24 virtual const Type * accept( Visitor & v) const = 0; 23 25 24 }; 26 25 … … 32 31 /// The problem is that ast::ptr< ... > uses increment/decrement which won't work well with 33 32 /// forward declarations 34 inline void increment( const class Type * /*node*/, Node::ref_type /*ref*/ ) { /*node->increment( ref );*/}35 inline void decrement( const class Type * /*node*/, Node::ref_type /*ref*/ ) { /*node->decrement( ref );*/}36 //inline void increment( const class VoidType * node, Node::ref_type ref ) { node->increment( ref ); }37 //inline void decrement( const class VoidType * node, Node::ref_type ref ) { node->decrement( ref ); }38 //inline void increment( const class BasicType * node, Node::ref_type ref ) { node->increment( ref ); }39 //inline void decrement( const class BasicType * node, Node::ref_type ref ) { node->decrement( ref ); }40 //inline void increment( const class PointerType * node, Node::ref_type ref ) { node->increment( ref ); }41 //inline void decrement( const class PointerType * node, Node::ref_type ref ) { node->decrement( ref ); }42 //inline void increment( const class ArrayType * node, Node::ref_type ref ) { node->increment( ref ); }43 //inline void decrement( const class ArrayType * node, Node::ref_type ref ) { node->decrement( ref ); }44 //inline void increment( const class ReferenceType * node, Node::ref_type ref ) { node->increment( ref ); }45 //inline void decrement( const class ReferenceType * node, Node::ref_type ref ) { node->decrement( ref ); }46 //inline void increment( const class QualifiedType * node, Node::ref_type ref ) { node->increment( ref ); }47 //inline void decrement( const class QualifiedType * node, Node::ref_type ref ) { node->decrement( ref ); }48 //inline void increment( const class FunctionType * node, Node::ref_type ref ) { node->increment( ref ); }49 //inline void decrement( const class FunctionType * node, Node::ref_type ref ) { node->decrement( ref ); }50 //inline void increment( const class ReferenceToType * node, Node::ref_type ref ) { node->increment( ref ); }51 //inline void decrement( const class ReferenceToType * node, Node::ref_type ref ) { node->decrement( ref ); }52 //inline void increment( const class StructInstType * node, Node::ref_type ref ) { node->increment( ref ); }53 //inline void decrement( const class StructInstType * node, Node::ref_type ref ) { node->decrement( ref ); }54 //inline void increment( const class UnionInstType * node, Node::ref_type ref ) { node->increment( ref ); }55 //inline void decrement( const class UnionInstType * node, Node::ref_type ref ) { node->decrement( ref ); }56 //inline void increment( const class EnumInstType * node, Node::ref_type ref ) { node->increment( ref ); }57 //inline void decrement( const class EnumInstType * node, Node::ref_type ref ) { node->decrement( ref ); }58 //inline void increment( const class TraitInstType * node, Node::ref_type ref ) { node->increment( ref ); }59 //inline void decrement( const class TraitInstType * node, Node::ref_type ref ) { node->decrement( ref ); }60 //inline void increment( const class TypeInstType * node, Node::ref_type ref ) { node->increment( ref ); }61 //inline void decrement( const class TypeInstType * node, Node::ref_type ref ) { node->decrement( ref ); }62 //inline void increment( const class TupleType * node, Node::ref_type ref ) { node->increment( ref ); }63 //inline void decrement( const class TupleType * node, Node::ref_type ref ) { node->decrement( ref ); }64 //inline void increment( const class TypeofType * node, Node::ref_type ref ) { node->increment( ref ); }65 //inline void decrement( const class TypeofType * node, Node::ref_type ref ) { node->decrement( ref ); }66 //inline void increment( const class AttrType * node, Node::ref_type ref ) { node->increment( ref ); }67 //inline void decrement( const class AttrType * node, Node::ref_type ref ) { node->decrement( ref ); }68 //inline void increment( const class VarArgsType * node, Node::ref_type ref ) { node->increment( ref ); }69 //inline void decrement( const class VarArgsType * node, Node::ref_type ref ) { node->decrement( ref ); }70 //inline void increment( const class ZeroType * node, Node::ref_type ref ) { node->increment( ref ); }71 //inline void decrement( const class ZeroType * node, Node::ref_type ref ) { node->decrement( ref ); }72 //inline void increment( const class OneType * node, Node::ref_type ref ) { node->increment( ref ); }73 //inline void decrement( const class OneType * node, Node::ref_type ref ) { node->decrement( ref ); }74 //inline void increment( const class GlobalScopeType * node, Node::ref_type ref ) { node->increment( ref ); }75 //inline void decrement( const class GlobalScopeType * node, Node::ref_type ref ) { node->decrement( ref ); }33 inline void increment( const class Type * node, Node::ref_type ref ) { node->increment( ref ); } 34 inline void decrement( const class Type * node, Node::ref_type ref ) { node->decrement( ref ); } 35 inline void increment( const class VoidType * node, Node::ref_type ref ) { node->increment( ref ); } 36 inline void decrement( const class VoidType * node, Node::ref_type ref ) { node->decrement( ref ); } 37 inline void increment( const class BasicType * node, Node::ref_type ref ) { node->increment( ref ); } 38 inline void decrement( const class BasicType * node, Node::ref_type ref ) { node->decrement( ref ); } 39 inline void increment( const class PointerType * node, Node::ref_type ref ) { node->increment( ref ); } 40 inline void decrement( const class PointerType * node, Node::ref_type ref ) { node->decrement( ref ); } 41 inline void increment( const class ArrayType * node, Node::ref_type ref ) { node->increment( ref ); } 42 inline void decrement( const class ArrayType * node, Node::ref_type ref ) { node->decrement( ref ); } 43 inline void increment( const class ReferenceType * node, Node::ref_type ref ) { node->increment( ref ); } 44 inline void decrement( const class ReferenceType * node, Node::ref_type ref ) { node->decrement( ref ); } 45 inline void increment( const class QualifiedType * node, Node::ref_type ref ) { node->increment( ref ); } 46 inline void decrement( const class QualifiedType * node, Node::ref_type ref ) { node->decrement( ref ); } 47 inline void increment( const class FunctionType * node, Node::ref_type ref ) { node->increment( ref ); } 48 inline void decrement( const class FunctionType * node, Node::ref_type ref ) { node->decrement( ref ); } 49 inline void increment( const class ReferenceToType * node, Node::ref_type ref ) { node->increment( ref ); } 50 inline void decrement( const class ReferenceToType * node, Node::ref_type ref ) { node->decrement( ref ); } 51 inline void increment( const class StructInstType * node, Node::ref_type ref ) { node->increment( ref ); } 52 inline void decrement( const class StructInstType * node, Node::ref_type ref ) { node->decrement( ref ); } 53 inline void increment( const class UnionInstType * node, Node::ref_type ref ) { node->increment( ref ); } 54 inline void decrement( const class UnionInstType * node, Node::ref_type ref ) { node->decrement( ref ); } 55 inline void increment( const class EnumInstType * node, Node::ref_type ref ) { node->increment( ref ); } 56 inline void decrement( const class EnumInstType * node, Node::ref_type ref ) { node->decrement( ref ); } 57 inline void increment( const class TraitInstType * node, Node::ref_type ref ) { node->increment( ref ); } 58 inline void decrement( const class TraitInstType * node, Node::ref_type ref ) { node->decrement( ref ); } 59 inline void increment( const class TypeInstType * node, Node::ref_type ref ) { node->increment( ref ); } 60 inline void decrement( const class TypeInstType * node, Node::ref_type ref ) { node->decrement( ref ); } 61 inline void increment( const class TupleType * node, Node::ref_type ref ) { node->increment( ref ); } 62 inline void decrement( const class TupleType * node, Node::ref_type ref ) { node->decrement( ref ); } 63 inline void increment( const class TypeofType * node, Node::ref_type ref ) { node->increment( ref ); } 64 inline void decrement( const class TypeofType * node, Node::ref_type ref ) { node->decrement( ref ); } 65 inline void increment( const class AttrType * node, Node::ref_type ref ) { node->increment( ref ); } 66 inline void decrement( const class AttrType * node, Node::ref_type ref ) { node->decrement( ref ); } 67 inline void increment( const class VarArgsType * node, Node::ref_type ref ) { node->increment( ref ); } 68 inline void decrement( const class VarArgsType * node, Node::ref_type ref ) { node->decrement( ref ); } 69 inline void increment( const class ZeroType * node, Node::ref_type ref ) { node->increment( ref ); } 70 inline void decrement( const class ZeroType * node, Node::ref_type ref ) { node->decrement( ref ); } 71 inline void increment( const class OneType * node, Node::ref_type ref ) { node->increment( ref ); } 72 inline void decrement( const class OneType * node, Node::ref_type ref ) { node->decrement( ref ); } 73 inline void increment( const class GlobalScopeType * node, Node::ref_type ref ) { node->increment( ref ); } 74 inline void decrement( const class GlobalScopeType * node, Node::ref_type ref ) { node->decrement( ref ); } 76 75 77 76 } -
src/AST/Visitor.hpp
rbe567e9 r62315a0 22 22 class Visitor { 23 23 public: 24 virtual const ast::DeclWithType * visit( const ast::ObjectDecl * ) = 0;25 virtual const ast::DeclWithType * visit( const ast::FunctionDecl * ) = 0;26 virtual const ast::Decl * visit( const ast::StructDecl * ) = 0;27 virtual const ast::Decl * visit( const ast::UnionDecl * ) = 0;28 virtual const ast::Decl * visit( const ast::EnumDecl * ) = 0;29 virtual const ast::Decl * visit( const ast::TraitDecl * ) = 0;30 virtual const ast::Decl * visit( const ast::TypeDecl * ) = 0;31 virtual const ast::Decl * visit( const ast::TypedefDecl * ) = 0;32 virtual const ast::AsmDecl * visit( const ast::AsmDecl * ) = 0;33 virtual const ast::StaticAssertDecl * visit( const ast::StaticAssertDecl * ) = 0;34 virtual const ast::CompoundStmt * visit( const ast::CompoundStmt * ) = 0;35 virtual const ast::Stmt * visit( const ast::ExprStmt * ) = 0;36 virtual const ast::Stmt * visit( const ast::AsmStmt * ) = 0;37 virtual const ast::Stmt * visit( const ast::DirectiveStmt * ) = 0;38 virtual const ast::Stmt * visit( const ast::IfStmt * ) = 0;39 virtual const ast::Stmt * visit( const ast::WhileStmt * ) = 0;40 virtual const ast::Stmt * visit( const ast::ForStmt * ) = 0;41 virtual const ast::Stmt * visit( const ast::SwitchStmt * ) = 0;42 virtual const ast::Stmt * visit( const ast::CaseStmt * ) = 0;43 virtual const ast::Stmt * visit( const ast::BranchStmt * ) = 0;44 virtual const ast::Stmt * visit( const ast::ReturnStmt * ) = 0;45 virtual const ast::Stmt * visit( const ast::ThrowStmt * ) = 0;46 virtual const ast::Stmt * visit( const ast::TryStmt * ) = 0;47 virtual const ast::Stmt * visit( const ast::CatchStmt * ) = 0;48 virtual const ast::Stmt * visit( const ast::FinallyStmt * ) = 0;49 virtual const ast::Stmt * visit( const ast::WaitForStmt * ) = 0;50 virtual const ast::Stmt * visit( const ast::WithStmt * ) = 0;51 virtual const ast::NullStmt * visit( const ast::NullStmt * ) = 0;52 virtual const ast::Stmt * visit( const ast::DeclStmt * ) = 0;53 virtual const ast::Stmt * visit( const ast::ImplicitCtorDtorStmt * ) = 0;54 virtual const ast::Expr * visit( const ast::ApplicationExpr * ) = 0;55 virtual const ast::Expr * visit( const ast::UntypedExpr * ) = 0;56 virtual const ast::Expr * visit( const ast::NameExpr * ) = 0;57 virtual const ast::Expr * visit( const ast::AddressExpr * ) = 0;58 virtual const ast::Expr * visit( const ast::LabelAddressExpr * ) = 0;59 virtual const ast::Expr * visit( const ast::CastExpr * ) = 0;60 virtual const ast::Expr * visit( const ast::KeywordCastExpr * ) = 0;61 virtual const ast::Expr * visit( const ast::VirtualCastExpr * ) = 0;62 virtual const ast::Expr * visit( const ast::UntypedMemberExpr * ) = 0;63 virtual const ast::Expr * visit( const ast::MemberExpr * ) = 0;64 virtual const ast::Expr * visit( const ast::VariableExpr * ) = 0;65 virtual const ast::Expr * visit( const ast::ConstantExpr * ) = 0;66 virtual const ast::Expr * visit( const ast::SizeofExpr * ) = 0;67 virtual const ast::Expr * visit( const ast::AlignofExpr * ) = 0;68 virtual const ast::Expr * visit( const ast::UntypedOffsetofExpr * ) = 0;69 virtual const ast::Expr * visit( const ast::OffsetofExpr * ) = 0;70 virtual const ast::Expr * visit( const ast::OffsetPackExpr * ) = 0;71 virtual const ast::Expr * visit( const ast::AttrExpr * ) = 0;72 virtual const ast::Expr * visit( const ast::LogicalExpr * ) = 0;73 virtual const ast::Expr * visit( const ast::ConditionalExpr * ) = 0;74 virtual const ast::Expr * visit( const ast::CommaExpr * ) = 0;75 virtual const ast::Expr * visit( const ast::TypeExpr * ) = 0;76 virtual const ast::Expr * visit( const ast::AsmExpr * ) = 0;77 virtual const ast::Expr * visit( const ast::ImplicitCopyCtorExpr * ) = 0;78 virtual const ast::Expr * visit( const ast::ConstructorExpr * ) = 0;79 virtual const ast::Expr * visit( const ast::CompoundLiteralExpr * ) = 0;80 virtual const ast::Expr * visit( const ast::RangeExpr * ) = 0;81 virtual const ast::Expr * visit( const ast::UntypedTupleExpr * ) = 0;82 virtual const ast::Expr * visit( const ast::TupleExpr * ) = 0;83 virtual const ast::Expr * visit( const ast::TupleIndexExpr * ) = 0;84 virtual const ast::Expr * visit( const ast::TupleAssignExpr * ) = 0;85 virtual const ast::Expr * visit( const ast::StmtExpr * ) = 0;86 virtual const ast::Expr * visit( const ast::UniqueExpr * ) = 0;87 virtual const ast::Expr * visit( const ast::UntypedInitExpr * ) = 0;88 virtual const ast::Expr * visit( const ast::InitExpr * ) = 0;89 virtual const ast::Expr * visit( const ast::DeletedExpr * ) = 0;90 virtual const ast::Expr * visit( const ast::DefaultArgExpr * ) = 0;91 virtual const ast::Expr * visit( const ast::GenericExpr * ) = 0;92 virtual const ast::Type * visit( const ast::VoidType * ) = 0;93 virtual const ast::Type * visit( const ast::BasicType * ) = 0;94 virtual const ast::Type * visit( const ast::PointerType * ) = 0;95 virtual const ast::Type * visit( const ast::ArrayType * ) = 0;96 virtual const ast::Type * visit( const ast::ReferenceType * ) = 0;97 virtual const ast::Type * visit( const ast::QualifiedType * ) = 0;98 virtual const ast::Type * visit( const ast::FunctionType * ) = 0;99 virtual const ast::Type * visit( const ast::StructInstType * ) = 0;100 virtual const ast::Type * visit( const ast::UnionInstType * ) = 0;101 virtual const ast::Type * visit( const ast::EnumInstType * ) = 0;102 virtual const ast::Type * visit( const ast::TraitInstType * ) = 0;103 virtual const ast::Type * visit( const ast::TypeInstType * ) = 0;104 virtual const ast::Type * visit( const ast::TupleType * ) = 0;105 virtual const ast::Type * visit( const ast::TypeofType * ) = 0;106 virtual const ast::Type * visit( const ast::AttrType * ) = 0;107 virtual const ast::Type * visit( const ast::VarArgsType * ) = 0;108 virtual const ast::Type * visit( const ast::ZeroType * ) = 0;109 virtual const ast::Type * visit( const ast::OneType * ) = 0;110 virtual const ast::Type * visit( const ast::GlobalScopeType * ) = 0;111 virtual const ast::Designation * visit( const ast::Designation * ) = 0;112 virtual const ast::Init * visit( const ast::SingleInit * ) = 0;113 virtual const ast::Init * visit( const ast::ListInit * ) = 0;114 virtual const ast::Init * visit( const ast::ConstructorInit * ) = 0;115 virtual const ast::Constant * visit( const ast::Constant * ) = 0;116 virtual const ast::Attribute * visit( const ast::Attribute * ) = 0;117 virtual const ast::TypeSubstitution * visit( const ast::TypeSubstitution * ) = 0;24 virtual DeclWithType * visit( const ObjectDecl * ) = 0; 25 virtual DeclWithType * visit( const FunctionDecl * ) = 0; 26 virtual Decl * visit( const StructDecl * ) = 0; 27 virtual Decl * visit( const UnionDecl * ) = 0; 28 virtual Decl * visit( const EnumDecl * ) = 0; 29 virtual Decl * visit( const TraitDecl * ) = 0; 30 virtual Decl * visit( const TypeDecl * ) = 0; 31 virtual Decl * visit( const TypedefDecl * ) = 0; 32 virtual AsmDecl * visit( const AsmDecl * ) = 0; 33 virtual StaticAssertDecl * visit( const StaticAssertDecl * ) = 0; 34 virtual CompoundStmt * visit( const CompoundStmt * ) = 0; 35 virtual Stmt * visit( const ExprStmt * ) = 0; 36 virtual Stmt * visit( const AsmStmt * ) = 0; 37 virtual Stmt * visit( const DirectiveStmt * ) = 0; 38 virtual Stmt * visit( const IfStmt * ) = 0; 39 virtual Stmt * visit( const WhileStmt * ) = 0; 40 virtual Stmt * visit( const ForStmt * ) = 0; 41 virtual Stmt * visit( const SwitchStmt * ) = 0; 42 virtual Stmt * visit( const CaseStmt * ) = 0; 43 virtual Stmt * visit( const BranchStmt * ) = 0; 44 virtual Stmt * visit( const ReturnStmt * ) = 0; 45 virtual Stmt * visit( const ThrowStmt * ) = 0; 46 virtual Stmt * visit( const TryStmt * ) = 0; 47 virtual Stmt * visit( const CatchStmt * ) = 0; 48 virtual Stmt * visit( const FinallyStmt * ) = 0; 49 virtual Stmt * visit( const WaitForStmt * ) = 0; 50 virtual Stmt * visit( const WithStmt * ) = 0; 51 virtual NullStmt * visit( const NullStmt * ) = 0; 52 virtual Stmt * visit( const DeclStmt * ) = 0; 53 virtual Stmt * visit( const ImplicitCtorDtorStmt * ) = 0; 54 virtual Expr * visit( const ApplicationExpr * ) = 0; 55 virtual Expr * visit( const UntypedExpr * ) = 0; 56 virtual Expr * visit( const NameExpr * ) = 0; 57 virtual Expr * visit( const AddressExpr * ) = 0; 58 virtual Expr * visit( const LabelAddressExpr * ) = 0; 59 virtual Expr * visit( const CastExpr * ) = 0; 60 virtual Expr * visit( const KeywordCastExpr * ) = 0; 61 virtual Expr * visit( const VirtualCastExpr * ) = 0; 62 virtual Expr * visit( const UntypedMemberExpr * ) = 0; 63 virtual Expr * visit( const MemberExpr * ) = 0; 64 virtual Expr * visit( const VariableExpr * ) = 0; 65 virtual Expr * visit( const ConstantExpr * ) = 0; 66 virtual Expr * visit( const SizeofExpr * ) = 0; 67 virtual Expr * visit( const AlignofExpr * ) = 0; 68 virtual Expr * visit( const UntypedOffsetofExpr * ) = 0; 69 virtual Expr * visit( const OffsetofExpr * ) = 0; 70 virtual Expr * visit( const OffsetPackExpr * ) = 0; 71 virtual Expr * visit( const AttrExpr * ) = 0; 72 virtual Expr * visit( const LogicalExpr * ) = 0; 73 virtual Expr * visit( const ConditionalExpr * ) = 0; 74 virtual Expr * visit( const CommaExpr * ) = 0; 75 virtual Expr * visit( const TypeExpr * ) = 0; 76 virtual Expr * visit( const AsmExpr * ) = 0; 77 virtual Expr * visit( const ImplicitCopyCtorExpr * ) = 0; 78 virtual Expr * visit( const ConstructorExpr * ) = 0; 79 virtual Expr * visit( const CompoundLiteralExpr * ) = 0; 80 virtual Expr * visit( const RangeExpr * ) = 0; 81 virtual Expr * visit( const UntypedTupleExpr * ) = 0; 82 virtual Expr * visit( const TupleExpr * ) = 0; 83 virtual Expr * visit( const TupleIndexExpr * ) = 0; 84 virtual Expr * visit( const TupleAssignExpr * ) = 0; 85 virtual Expr * visit( const StmtExpr * ) = 0; 86 virtual Expr * visit( const UniqueExpr * ) = 0; 87 virtual Expr * visit( const UntypedInitExpr * ) = 0; 88 virtual Expr * visit( const InitExpr * ) = 0; 89 virtual Expr * visit( const DeletedExpr * ) = 0; 90 virtual Expr * visit( const DefaultArgExpr * ) = 0; 91 virtual Expr * visit( const GenericExpr * ) = 0; 92 virtual Type * visit( const VoidType * ) = 0; 93 virtual Type * visit( const BasicType * ) = 0; 94 virtual Type * visit( const PointerType * ) = 0; 95 virtual Type * visit( const ArrayType * ) = 0; 96 virtual Type * visit( const ReferenceType * ) = 0; 97 virtual Type * visit( const QualifiedType * ) = 0; 98 virtual Type * visit( const FunctionType * ) = 0; 99 virtual Type * visit( const StructInstType * ) = 0; 100 virtual Type * visit( const UnionInstType * ) = 0; 101 virtual Type * visit( const EnumInstType * ) = 0; 102 virtual Type * visit( const TraitInstType * ) = 0; 103 virtual Type * visit( const TypeInstType * ) = 0; 104 virtual Type * visit( const TupleType * ) = 0; 105 virtual Type * visit( const TypeofType * ) = 0; 106 virtual Type * visit( const AttrType * ) = 0; 107 virtual Type * visit( const VarArgsType * ) = 0; 108 virtual Type * visit( const ZeroType * ) = 0; 109 virtual Type * visit( const OneType * ) = 0; 110 virtual Type * visit( const GlobalScopeType * ) = 0; 111 virtual Designation * visit( const Designation * ) = 0; 112 virtual Init * visit( const SingleInit * ) = 0; 113 virtual Init * visit( const ListInit * ) = 0; 114 virtual Init * visit( const ConstructorInit * ) = 0; 115 virtual Constant * visit( const Constant * ) = 0; 116 virtual Attribute * visit( const Attribute * ) = 0; 117 virtual TypeSubstitution * visit( const TypeSubstitution * ) = 0; 118 118 }; 119 119 -
src/AST/porting.md
rbe567e9 r62315a0 10 10 ## Visitors ## 11 11 * `Visitor` and `Mutator` are combined into a single `ast::Visitor` class 12 * Base nodes now override ` const Node * accept( Visitor & v ) const = 0` with, e.g. `const Stmt * accept( Visitor & v ) constoverride = 0`12 * Base nodes now override `Node* accept( Visitor& v ) = 0` with, e.g. `Stmt* accept( Visitor& v ) override = 0` 13 13 * `PassVisitor` is replaced with `ast::Pass` 14 14 … … 26 26 `clone` is private to `Node` now 27 27 * still needs to be overriden to return appropriate type 28 * e.g. `private: virtual Stmt * clone() const override = 0;` 29 * because friendship is not inherited, all implementations of clone need 30 /// Must be copied in ALL derived classes 31 template<typename node_t> 32 friend auto mutate(const node_t * node); 28 * e.g. `private: virtual Stmt* clone() const override = 0;` 33 29 34 30 All leaves of the `Node` inheritance tree are now declared `final` -
src/Common/PassVisitor.h
rbe567e9 r62315a0 155 155 virtual void visit( ConstructorInit * ctorInit ) override final; 156 156 157 virtual void visit( Subrange * subrange ) override final; 158 157 159 virtual void visit( Constant * constant ) override final; 158 160 … … 255 257 virtual Initializer * mutate( ConstructorInit * ctorInit ) override final; 256 258 259 virtual Subrange * mutate( Subrange * subrange ) override final; 260 257 261 virtual Constant * mutate( Constant * constant ) override final; 258 262 -
src/Common/PassVisitor.impl.h
rbe567e9 r62315a0 2712 2712 2713 2713 //-------------------------------------------------------------------------- 2714 // Subrange 2715 template< typename pass_type > 2716 void PassVisitor< pass_type >::visit( Subrange * node ) { 2717 VISIT_START( node ); 2718 2719 VISIT_END( node ); 2720 } 2721 2722 template< typename pass_type > 2723 Subrange * PassVisitor< pass_type >::mutate( Subrange * node ) { 2724 MUTATE_START( node ); 2725 2726 MUTATE_END( Subrange, node ); 2727 } 2728 2729 //-------------------------------------------------------------------------- 2714 2730 // Attribute 2715 2731 template< typename pass_type > -
src/SynTree/Declaration.h
rbe567e9 r62315a0 245 245 virtual void print( std::ostream &os, Indenter indent = {} ) const override; 246 246 247 private: 247 248 Kind kind; 248 249 }; … … 305 306 virtual void accept( Visitor &v ) override { v.visit( this ); } 306 307 virtual Declaration *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 308 private: 307 309 DeclarationNode::Aggregate kind; 308 private:309 310 virtual std::string typeString() const override; 310 311 }; -
src/SynTree/Label.h
rbe567e9 r62315a0 35 35 operator std::string() const { return name; } 36 36 bool empty() { return name.empty(); } 37 37 private: 38 38 std::string name; 39 39 Statement * labelled; -
src/SynTree/Mutator.h
rbe567e9 r62315a0 121 121 virtual Initializer * mutate( ConstructorInit * ctorInit ) = 0 ; 122 122 123 virtual Subrange * mutate( Subrange * subrange ) = 0; 124 123 125 virtual Constant * mutate( Constant * constant ) = 0; 124 126 -
src/SynTree/SynTree.h
rbe567e9 r62315a0 132 132 class ConstructorInit; 133 133 134 class Subrange; 135 134 136 //template <class T> // emulate a union with templates? 135 137 class Constant; -
src/SynTree/Visitor.h
rbe567e9 r62315a0 123 123 virtual void visit( ConstructorInit * ctorInit ) = 0; 124 124 125 virtual void visit( Subrange * subrange ) = 0; 126 125 127 virtual void visit( Constant * constant ) = 0; 126 128
Note:
See TracChangeset
for help on using the changeset viewer.