source: src/SynTree/Type.h @ e1e8408

ADTaaron-thesisarm-ehast-experimentalcleanup-dtorsdeferred_resndemanglerenumforall-pointer-decayjacob/cs343-translationjenkins-sandboxnew-astnew-ast-unique-exprnew-envno_listpersistent-indexerpthread-emulationqualifiedEnumresolv-newwith_gc
Last change on this file since e1e8408 was 6137fbb, checked in by Rob Schluntz <rschlunt@…>, 7 years ago

Print EnumInstType? body flag and other minor cleanup

  • Property mode set to 100644
File size: 25.9 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
7// Type.h --
8//
9// Author           : Richard C. Bilson
10// Created On       : Mon May 18 07:44:20 2015
11// Last Modified By : Peter A. Buhr
12// Last Modified On : Mon Sep 25 14:14:01 2017
13// Update Count     : 154
14//
15
16#pragma once
17
18#include <strings.h>         // for ffs
19#include <cassert>           // for assert, assertf
20#include <list>              // for list, _List_iterator
21#include <ostream>           // for ostream, operator<<, basic_ostream
22#include <string>            // for string
23
24#include "BaseSyntaxNode.h"  // for BaseSyntaxNode
25#include "Common/utility.h"  // for operator+
26#include "Mutator.h"         // for Mutator
27#include "SynTree.h"         // for AST nodes
28#include "Visitor.h"         // for Visitor
29
30class Type : public BaseSyntaxNode {
31  public:
32        // Simulate inheritance because union does not allow it.
33        // Bug in g++-4.9 prevents static field in union
34        //static const char * Names[];
35        #define BFCommon( BFType, N ) \
36                bool operator[]( unsigned int i ) const { return val & (1 << i); } \
37                bool any() const { return val != 0; } \
38                void reset() { val = 0; } \
39                int ffs() { return ::ffs( val ) - 1; } \
40                BFType operator&=( BFType other ) { \
41                        val &= other.val; return *this; \
42                } \
43                BFType operator&( BFType other ) const { \
44                        BFType q = other; \
45                        q &= *this; \
46                        return q; \
47                } \
48                BFType operator|=( BFType other ) { \
49                        val |= other.val; return *this; \
50                } \
51                BFType operator|( BFType other ) const { \
52                        BFType q = other; \
53                        q |= *this; \
54                        return q; \
55                } \
56                BFType operator-=( BFType other ) { \
57                        val &= ~other.val; return *this; \
58                } \
59                void print( std::ostream & os ) const { \
60                        if ( (*this).any() ) { \
61                                for ( unsigned int i = 0; i < N; i += 1 ) { \
62                                        if ( (*this)[i] ) { \
63                                                os << BFType##Names[i] << ' '; \
64                                        } \
65                                } \
66                        } \
67                }
68
69        // enum must remain in the same order as the corresponding bit fields.
70
71        enum { Inline = 1 << 0, Noreturn = 1 << 1, Fortran = 1 << 2, NumFuncSpecifier = 3 };
72        static const char * FuncSpecifiersNames[];
73        union FuncSpecifiers {
74                unsigned int val;
75                struct {
76                        bool is_inline : 1;
77                        bool is_noreturn : 1;
78                        bool is_fortran : 1;
79                };
80                FuncSpecifiers() : val( 0 ) {}
81                FuncSpecifiers( unsigned int val ) : val( val ) {}
82                // equality (==, !=) works implicitly on first field "val", relational operations are undefined.
83                BFCommon( FuncSpecifiers, NumFuncSpecifier )
84        }; // FuncSpecifiers
85
86        enum { Extern = 1 << 0, Static = 1 << 1, Auto = 1 << 2, Register = 1 << 3, Threadlocal = 1 << 4, NumStorageClass = 5 };
87        static const char * StorageClassesNames[];
88        union StorageClasses {
89                unsigned int val;
90                struct {
91                        bool is_extern : 1;
92                        bool is_static : 1;
93                        bool is_auto : 1;
94                        bool is_register : 1;
95                        bool is_threadlocal : 1;
96                };
97
98                StorageClasses() : val( 0 ) {}
99                StorageClasses( unsigned int val ) : val( val ) {}
100                // equality (==, !=) works implicitly on first field "val", relational operations are undefined.
101                BFCommon( StorageClasses, NumStorageClass )
102        }; // StorageClasses
103
104        enum { Const = 1 << 0, Restrict = 1 << 1, Volatile = 1 << 2, Lvalue = 1 << 3, Mutex = 1 << 4, Atomic = 1 << 5, NumTypeQualifier = 6 };
105        static const char * QualifiersNames[];
106        union Qualifiers {
107                enum { Mask = ~(Restrict | Lvalue) };
108                unsigned int val;
109                struct {
110                        bool is_const : 1;
111                        bool is_restrict : 1;
112                        bool is_volatile : 1;
113                        bool is_lvalue : 1;
114                        bool is_mutex : 1;
115                        bool is_atomic : 1;
116                };
117
118                Qualifiers() : val( 0 ) {}
119                Qualifiers( unsigned int val ) : val( val ) {}
120                // Complex comparisons provide implicit qualifier downcasting, e.g., T downcast to const T.
121                bool operator==( Qualifiers other ) const { return (val & Mask) == (other.val & Mask); }
122                bool operator!=( Qualifiers other ) const { return (val & Mask) != (other.val & Mask); }
123                bool operator<=( Qualifiers other ) const {
124                        return is_const    <= other.is_const        //Any non-const converts to const without cost
125                                        && is_volatile <= other.is_volatile     //Any non-volatile converts to volatile without cost
126                                        && is_mutex    >= other.is_mutex        //Any mutex converts to non-mutex without cost
127                                        && is_atomic   == other.is_atomic;      //No conversion from atomic to non atomic is free
128                }
129                bool operator<( Qualifiers other ) const { return *this != other && *this <= other; }
130                bool operator>=( Qualifiers other ) const { return ! (*this < other); }
131                bool operator>( Qualifiers other ) const { return *this != other && *this >= other; }
132                BFCommon( Qualifiers, NumTypeQualifier )
133        }; // Qualifiers
134
135        typedef std::list<TypeDecl *> ForallList;
136
137        Qualifiers tq;
138        ForallList forall;
139        std::list< Attribute * > attributes;
140
141        Type( const Qualifiers & tq, const std::list< Attribute * > & attributes );
142        Type( const Type & other );
143        virtual ~Type();
144
145        Qualifiers & get_qualifiers() { return tq; }
146        bool get_const() { return tq.is_const; }
147        bool get_volatile() { return tq.is_volatile; }
148        bool get_restrict() { return tq.is_restrict; }
149        bool get_lvalue() { return tq.is_lvalue; }
150        bool get_mutex() { return tq.is_mutex; }
151        bool get_atomic() { return tq.is_atomic; }
152        void set_const( bool newValue ) { tq.is_const = newValue; }
153        void set_volatile( bool newValue ) { tq.is_volatile = newValue; }
154        void set_restrict( bool newValue ) { tq.is_restrict = newValue; }
155        void set_lvalue( bool newValue ) { tq.is_lvalue = newValue; }
156        void set_mutex( bool newValue ) { tq.is_mutex = newValue; }
157        void set_atomic( bool newValue ) { tq.is_atomic = newValue; }
158
159        ForallList& get_forall() { return forall; }
160
161        std::list< Attribute * >& get_attributes() { return attributes; }
162        const std::list< Attribute * >& get_attributes() const { return attributes; }
163
164        /// How many elemental types are represented by this type
165        virtual unsigned size() const { return 1; };
166        virtual bool isVoid() const { return size() == 0; }
167        virtual Type * getComponent( unsigned i ) { assertf( size() == 1 && i == 0, "Type::getComponent was called with size %d and index %d\n", size(), i ); return this; }
168
169        /// return type without outer pointers and arrays
170        Type * stripDeclarator();
171
172        /// return type without outer references
173        Type * stripReferences();
174
175        /// return the number of references occuring consecutively on the outermost layer of this type (i.e. do not count references nested within other types)
176        virtual int referenceDepth() const;
177
178        virtual bool isComplete() const { return true; }
179
180        virtual Type *clone() const = 0;
181        virtual void accept( Visitor & v ) = 0;
182        virtual Type *acceptMutator( Mutator & m ) = 0;
183        virtual void print( std::ostream & os, Indenter indent = {} ) const;
184};
185
186extern const Type::FuncSpecifiers noFuncSpecifiers;
187extern const Type::StorageClasses noStorageClasses;
188extern const Type::Qualifiers noQualifiers;                     // no qualifiers on constants
189
190class VoidType : public Type {
191  public:
192        VoidType( const Type::Qualifiers & tq, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
193
194        virtual unsigned size() const override { return 0; };
195        virtual bool isComplete() const override { return false; }
196
197        virtual VoidType *clone() const override { return new VoidType( *this ); }
198        virtual void accept( Visitor & v ) override { v.visit( this ); }
199        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
200        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
201};
202
203class BasicType : public Type {
204  public:
205        enum Kind {
206                Bool,
207                Char,
208                SignedChar,
209                UnsignedChar,
210                ShortSignedInt,
211                ShortUnsignedInt,
212                SignedInt,
213                UnsignedInt,
214                LongSignedInt,
215                LongUnsignedInt,
216                LongLongSignedInt,
217                LongLongUnsignedInt,
218                Float,
219                Double,
220                LongDouble,
221                FloatComplex,
222                DoubleComplex,
223                LongDoubleComplex,
224                FloatImaginary,
225                DoubleImaginary,
226                LongDoubleImaginary,
227                SignedInt128,
228                UnsignedInt128,
229                NUMBER_OF_BASIC_TYPES
230        } kind;
231
232        static const char *typeNames[];                                         // string names for basic types, MUST MATCH with Kind
233
234        BasicType( const Type::Qualifiers & tq, Kind bt, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
235
236        Kind get_kind() { return kind; }
237        void set_kind( Kind newValue ) { kind = newValue; }
238
239        virtual BasicType *clone() const override { return new BasicType( *this ); }
240        virtual void accept( Visitor & v ) override { v.visit( this ); }
241        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
242        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
243
244        bool isInteger() const;
245};
246
247class PointerType : public Type {
248  public:
249        Type *base;
250
251        // In C99, pointer types can be qualified in many ways e.g., int f( int a[ static 3 ] )
252        Expression *dimension;
253        bool isVarLen;
254        bool isStatic;
255
256        PointerType( const Type::Qualifiers & tq, Type *base, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
257        PointerType( const Type::Qualifiers & tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
258        PointerType( const PointerType& );
259        virtual ~PointerType();
260
261        Type *get_base() { return base; }
262        void set_base( Type *newValue ) { base = newValue; }
263        Expression *get_dimension() { return dimension; }
264        void set_dimension( Expression *newValue ) { dimension = newValue; }
265        bool get_isVarLen() { return isVarLen; }
266        void set_isVarLen( bool newValue ) { isVarLen = newValue; }
267        bool get_isStatic() { return isStatic; }
268        void set_isStatic( bool newValue ) { isStatic = newValue; }
269
270        bool is_array() const { return isStatic || isVarLen || dimension; }
271
272        virtual bool isComplete() const override { return ! isVarLen; }
273
274        virtual PointerType *clone() const override { return new PointerType( *this ); }
275        virtual void accept( Visitor & v ) override { v.visit( this ); }
276        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
277        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
278};
279
280class ArrayType : public Type {
281  public:
282        Type *base;
283        Expression *dimension;
284        bool isVarLen;
285        bool isStatic;
286
287        ArrayType( const Type::Qualifiers & tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
288        ArrayType( const ArrayType& );
289        virtual ~ArrayType();
290
291        Type *get_base() { return base; }
292        void set_base( Type *newValue ) { base = newValue; }
293        Expression *get_dimension() { return dimension; }
294        void set_dimension( Expression *newValue ) { dimension = newValue; }
295        bool get_isVarLen() { return isVarLen; }
296        void set_isVarLen( bool newValue ) { isVarLen = newValue; }
297        bool get_isStatic() { return isStatic; }
298        void set_isStatic( bool newValue ) { isStatic = newValue; }
299
300        virtual bool isComplete() const override { return ! isVarLen; }
301
302        virtual ArrayType *clone() const override { return new ArrayType( *this ); }
303        virtual void accept( Visitor & v ) override { v.visit( this ); }
304        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
305        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
306};
307
308class ReferenceType : public Type {
309public:
310        Type *base;
311
312        ReferenceType( const Type::Qualifiers & tq, Type *base, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
313        ReferenceType( const ReferenceType & );
314        virtual ~ReferenceType();
315
316        Type *get_base() { return base; }
317        void set_base( Type *newValue ) { base = newValue; }
318
319        virtual int referenceDepth() const override;
320
321        // Since reference types act like value types, their size is the size of the base.
322        // This makes it simple to cast the empty tuple to a reference type, since casts that increase
323        // the number of values are disallowed.
324        virtual unsigned size() const override { return base->size(); }
325
326        virtual ReferenceType *clone() const override { return new ReferenceType( *this ); }
327        virtual void accept( Visitor & v ) override { v.visit( this ); }
328        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
329        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
330};
331
332class FunctionType : public Type {
333  public:
334        std::list<DeclarationWithType*> returnVals;
335        std::list<DeclarationWithType*> parameters;
336
337        // Does the function accept a variable number of arguments following the arguments specified in the parameters list.
338        // This could be because of
339        // - an ellipsis in a prototype declaration
340        // - an unprototyped declaration
341        bool isVarArgs;
342
343        FunctionType( const Type::Qualifiers & tq, bool isVarArgs, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
344        FunctionType( const FunctionType& );
345        virtual ~FunctionType();
346
347        std::list<DeclarationWithType*> & get_returnVals() { return returnVals; }
348        std::list<DeclarationWithType*> & get_parameters() { return parameters; }
349        bool get_isVarArgs() const { return isVarArgs; }
350        void set_isVarArgs( bool newValue ) { isVarArgs = newValue; }
351        bool isTtype() const;
352
353        virtual FunctionType *clone() const override { return new FunctionType( *this ); }
354        virtual void accept( Visitor & v ) override { v.visit( this ); }
355        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
356        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
357};
358
359class ReferenceToType : public Type {
360  public:
361        std::list< Expression* > parameters;
362        std::string name;
363        bool hoistType;
364
365        ReferenceToType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes );
366        ReferenceToType( const ReferenceToType & other );
367        virtual ~ReferenceToType();
368
369        const std::string & get_name() const { return name; }
370        void set_name( std::string newValue ) { name = newValue; }
371        std::list< Expression* >& get_parameters() { return parameters; }
372        bool get_hoistType() const { return hoistType; }
373        void set_hoistType( bool newValue ) { hoistType = newValue; }
374
375        virtual ReferenceToType *clone() const override = 0;
376        virtual void accept( Visitor & v ) override = 0;
377        virtual Type *acceptMutator( Mutator & m ) override = 0;
378        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
379
380        virtual void lookup( __attribute__((unused)) const std::string & name, __attribute__((unused)) std::list< Declaration* > & foundDecls ) const {}
381  protected:
382        virtual std::string typeString() const = 0;
383};
384
385class StructInstType : public ReferenceToType {
386        typedef ReferenceToType Parent;
387  public:
388        // this decl is not "owned" by the struct inst; it is merely a pointer to elsewhere in the tree,
389        // where the structure used in this type is actually defined
390        StructDecl *baseStruct;
391
392        StructInstType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes = std::list< Attribute * >()  ) : Parent( tq, name, attributes ), baseStruct( 0 ) {}
393        StructInstType( const Type::Qualifiers & tq, StructDecl * baseStruct, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
394        StructInstType( const StructInstType & other ) : Parent( other ), baseStruct( other.baseStruct ) {}
395
396        StructDecl *get_baseStruct() const { return baseStruct; }
397        void set_baseStruct( StructDecl *newValue ) { baseStruct = newValue; }
398
399        /// Accesses generic parameters of base struct (NULL if none such)
400        std::list<TypeDecl*> * get_baseParameters();
401
402        virtual bool isComplete() const override;
403
404        /// Looks up the members of this struct named "name" and places them into "foundDecls".
405        /// Clones declarations into "foundDecls", caller responsible for freeing
406        void lookup( const std::string & name, std::list< Declaration* > & foundDecls ) const override;
407
408        virtual StructInstType *clone() const override { return new StructInstType( *this ); }
409        virtual void accept( Visitor & v ) override { v.visit( this ); }
410        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
411
412        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
413  private:
414        virtual std::string typeString() const override;
415};
416
417class UnionInstType : public ReferenceToType {
418        typedef ReferenceToType Parent;
419  public:
420        // this decl is not "owned" by the union inst; it is merely a pointer to elsewhere in the tree,
421        // where the union used in this type is actually defined
422        UnionDecl *baseUnion;
423
424        UnionInstType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes = std::list< Attribute * >()  ) : Parent( tq, name, attributes ), baseUnion( 0 ) {}
425        UnionInstType( const Type::Qualifiers & tq, UnionDecl * baseUnion, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
426        UnionInstType( const UnionInstType & other ) : Parent( other ), baseUnion( other.baseUnion ) {}
427
428        UnionDecl *get_baseUnion() const { return baseUnion; }
429        void set_baseUnion( UnionDecl * newValue ) { baseUnion = newValue; }
430
431        /// Accesses generic parameters of base union (NULL if none such)
432        std::list< TypeDecl * > * get_baseParameters();
433
434        virtual bool isComplete() const override;
435
436        /// looks up the members of this union named "name" and places them into "foundDecls"
437        /// Clones declarations into "foundDecls", caller responsible for freeing
438        void lookup( const std::string & name, std::list< Declaration* > & foundDecls ) const override;
439
440        virtual UnionInstType *clone() const override { return new UnionInstType( *this ); }
441        virtual void accept( Visitor & v ) override { v.visit( this ); }
442        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
443
444        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
445  private:
446        virtual std::string typeString() const override;
447};
448
449class EnumInstType : public ReferenceToType {
450        typedef ReferenceToType Parent;
451  public:
452        // this decl is not "owned" by the union inst; it is merely a pointer to elsewhere in the tree,
453        // where the union used in this type is actually defined
454        EnumDecl *baseEnum = nullptr;
455
456        EnumInstType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes = std::list< Attribute * >()  ) : Parent( tq, name, attributes ) {}
457        EnumInstType( const Type::Qualifiers & tq, EnumDecl * baseEnum, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
458        EnumInstType( const EnumInstType & other ) : Parent( other ), baseEnum( other.baseEnum ) {}
459
460        EnumDecl *get_baseEnum() const { return baseEnum; }
461        void set_baseEnum( EnumDecl *newValue ) { baseEnum = newValue; }
462
463        virtual bool isComplete() const override;
464
465        virtual EnumInstType *clone() const override { return new EnumInstType( *this ); }
466        virtual void accept( Visitor & v ) override { v.visit( this ); }
467        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
468
469        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
470  private:
471        virtual std::string typeString() const override;
472};
473
474class TraitInstType : public ReferenceToType {
475        typedef ReferenceToType Parent;
476  public:
477        // this decl is not "owned" by the trait inst; it is merely a pointer to elsewhere in the tree,
478        // where the trait used in this type is actually defined
479        TraitDecl * baseTrait = nullptr;
480
481        TraitInstType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes = std::list< Attribute * >() ) : Parent( tq, name, attributes ) {}
482        TraitInstType( const Type::Qualifiers & tq, TraitDecl * baseTrait, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
483        TraitInstType( const TraitInstType & other );
484        ~TraitInstType();
485
486        virtual bool isComplete() const override;
487
488        virtual TraitInstType *clone() const override { return new TraitInstType( *this ); }
489        virtual void accept( Visitor & v ) override { v.visit( this ); }
490        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
491  private:
492        virtual std::string typeString() const override;
493};
494
495class TypeInstType : public ReferenceToType {
496        typedef ReferenceToType Parent;
497  public:
498        // this decl is not "owned" by the type inst; it is merely a pointer to elsewhere in the tree,
499        // where the type used here is actually defined
500        TypeDecl *baseType;
501        bool isFtype;
502
503        TypeInstType( const Type::Qualifiers & tq, const std::string & name, TypeDecl *baseType, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
504        TypeInstType( const Type::Qualifiers & tq, const std::string & name, bool isFtype, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
505        TypeInstType( const TypeInstType & other );
506        ~TypeInstType();
507
508        TypeDecl *get_baseType() const { return baseType; }
509        void set_baseType( TypeDecl *newValue );
510        bool get_isFtype() const { return isFtype; }
511        void set_isFtype( bool newValue ) { isFtype = newValue; }
512
513        virtual bool isComplete() const override;
514
515        virtual TypeInstType *clone() const override { return new TypeInstType( *this ); }
516        virtual void accept( Visitor & v ) override { v.visit( this ); }
517        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
518        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
519  private:
520        virtual std::string typeString() const override;
521};
522
523class TupleType : public Type {
524  public:
525        std::list<Type *> types;
526        std::list<Declaration *> members;
527
528        TupleType( const Type::Qualifiers & tq, const std::list< Type * > & types, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
529        TupleType( const TupleType& );
530        virtual ~TupleType();
531
532        typedef std::list<Type*> value_type;
533        typedef value_type::iterator iterator;
534
535        std::list<Type *> & get_types() { return types; }
536        virtual unsigned size() const override { return types.size(); };
537
538        // For now, this is entirely synthetic -- tuple types always have unnamed members.
539        // Eventually, we may allow named tuples, in which case members should subsume types
540        std::list<Declaration *> & get_members() { return members; }
541
542        iterator begin() { return types.begin(); }
543        iterator end() { return types.end(); }
544
545        virtual Type * getComponent( unsigned i ) override {
546                assertf( i < size(), "TupleType::getComponent: index %d must be less than size %d", i, size() );
547                return *(begin()+i);
548        }
549
550        // virtual bool isComplete() const override { return true; } // xxx - not sure if this is right, might need to recursively check complete-ness
551
552        virtual TupleType *clone() const override { return new TupleType( *this ); }
553        virtual void accept( Visitor & v ) override { v.visit( this ); }
554        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
555        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
556};
557
558class TypeofType : public Type {
559  public:
560        Expression *expr;
561
562        TypeofType( const Type::Qualifiers & tq, Expression *expr, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
563        TypeofType( const TypeofType& );
564        virtual ~TypeofType();
565
566        Expression *get_expr() const { return expr; }
567        void set_expr( Expression *newValue ) { expr = newValue; }
568
569        virtual bool isComplete() const override { assert( false ); return false; }
570
571        virtual TypeofType *clone() const override { return new TypeofType( *this ); }
572        virtual void accept( Visitor & v ) override { v.visit( this ); }
573        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
574        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
575};
576
577class AttrType : public Type {
578  public:
579        std::string name;
580        Expression *expr;
581        Type *type;
582        bool isType;
583
584        AttrType( const Type::Qualifiers & tq, const std::string & name, Expression *expr, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
585        AttrType( const Type::Qualifiers & tq, const std::string & name, Type *type, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
586        AttrType( const AttrType& );
587        virtual ~AttrType();
588
589        const std::string & get_name() const { return name; }
590        void set_name( const std::string & newValue ) { name = newValue; }
591        Expression *get_expr() const { return expr; }
592        void set_expr( Expression *newValue ) { expr = newValue; }
593        Type *get_type() const { return type; }
594        void set_type( Type *newValue ) { type = newValue; }
595        bool get_isType() const { return isType; }
596        void set_isType( bool newValue ) { isType = newValue; }
597
598        virtual bool isComplete() const override { assert( false ); } // xxx - not sure what to do here
599
600        virtual AttrType *clone() const override { return new AttrType( *this ); }
601        virtual void accept( Visitor & v ) override { v.visit( this ); }
602        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
603        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
604};
605
606/// Represents the GCC built-in varargs type
607class VarArgsType : public Type {
608  public:
609        VarArgsType();
610        VarArgsType( Type::Qualifiers tq, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
611
612        virtual bool isComplete() const override{ return true; } // xxx - is this right?
613
614        virtual VarArgsType *clone() const override { return new VarArgsType( *this ); }
615        virtual void accept( Visitor & v ) override { v.visit( this ); }
616        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
617        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
618};
619
620/// Represents a zero constant
621class ZeroType : public Type {
622  public:
623        ZeroType();
624        ZeroType( Type::Qualifiers tq, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
625
626        virtual ZeroType *clone() const override { return new ZeroType( *this ); }
627        virtual void accept( Visitor & v ) override { v.visit( this ); }
628        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
629        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
630};
631
632/// Represents a one constant
633class OneType : public Type {
634  public:
635        OneType();
636        OneType( Type::Qualifiers tq, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
637
638        virtual OneType *clone() const override { return new OneType( *this ); }
639        virtual void accept( Visitor & v ) override { v.visit( this ); }
640        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
641        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
642};
643
644// Local Variables: //
645// tab-width: 4 //
646// mode: c++ //
647// compile-command: "make install" //
648// End: //
Note: See TracBrowser for help on using the repository browser.