source: src/SynTree/Type.h @ c36298d

ADTarm-ehast-experimentalenumforall-pointer-decayjacob/cs343-translationjenkins-sandboxnew-astnew-ast-unique-exprpthread-emulationqualifiedEnum
Last change on this file since c36298d was 6fd1955, checked in by Peter A. Buhr <pabuhr@…>, 5 years ago

update GENERATED BY file name

  • Property mode set to 100644
File size: 28.2 KB
RevLine 
[0dd3a2f]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//
[ae63a18]7// Type.h --
[0dd3a2f]8//
9// Author           : Richard C. Bilson
10// Created On       : Mon May 18 07:44:20 2015
[201aeb9]11// Last Modified By : Peter A. Buhr
[ada4575]12// Last Modified On : Thu Feb 14 17:11:24 2019
13// Update Count     : 169
[0dd3a2f]14//
15
[6b0b624]16#pragma once
[51b7345]17
[ea6332d]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
[51b7345]29
[138e29e]30class Type : public BaseSyntaxNode {
[c8ffe20b]31  public:
[6f95000]32        // Simulate inheritance because union does not allow it.
[615a096]33        // Bug in g++-4.9 prevents static field in union
34        //static const char * Names[];
[6f95000]35        #define BFCommon( BFType, N ) \
[d6d747d]36                bool operator[]( unsigned int i ) const { return val & (1 << i); } \
37                bool any() const { return val != 0; } \
[6f95000]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                } \
[d6d747d]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] ) { \
[615a096]63                                                os << BFType##Names[i] << ' '; \
[d6d747d]64                                        } \
65                                } \
66                        } \
67                }
68
[68fe077a]69        // enum must remain in the same order as the corresponding bit fields.
70
[ddfd945]71        enum { Inline = 1 << 0, Noreturn = 1 << 1, Fortran = 1 << 2, NumFuncSpecifier = 3 };
[615a096]72        static const char * FuncSpecifiersNames[];
[ddfd945]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 ) {}
[615a096]82                // equality (==, !=) works implicitly on first field "val", relational operations are undefined.
[6f95000]83                BFCommon( FuncSpecifiers, NumFuncSpecifier )
[ddfd945]84        }; // FuncSpecifiers
85
[68fe077a]86        enum { Extern = 1 << 0, Static = 1 << 1, Auto = 1 << 2, Register = 1 << 3, Threadlocal = 1 << 4, NumStorageClass = 5 };
[615a096]87        static const char * StorageClassesNames[];
[68fe077a]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 ) {}
[615a096]100                // equality (==, !=) works implicitly on first field "val", relational operations are undefined.
[6f95000]101                BFCommon( StorageClasses, NumStorageClass )
[68fe077a]102        }; // StorageClasses
103
[bf4ac09]104        enum { Const = 1 << 0, Restrict = 1 << 1, Volatile = 1 << 2, Lvalue = 1 << 3, Mutex = 1 << 4, Atomic = 1 << 5, NumTypeQualifier = 6 };
[615a096]105        static const char * QualifiersNames[];
[bf4ac09]106        union Qualifiers {
107                enum { Mask = ~(Restrict | Lvalue) };
108                unsigned int val;
109                struct {
[615a096]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;
[bf4ac09]116                };
[6e8bd43]117
[bf4ac09]118                Qualifiers() : val( 0 ) {}
119                Qualifiers( unsigned int val ) : val( val ) {}
[615a096]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); }
[d6d747d]123                bool operator<=( Qualifiers other ) const {
[e04b636]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
[bf4ac09]128                }
[6f95000]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 )
[bf4ac09]133        }; // Qualifiers
[0dd3a2f]134
[65cdc1e]135        typedef std::list<TypeDecl *> ForallList;
136
137        Qualifiers tq;
138        ForallList forall;
139        std::list< Attribute * > attributes;
140
[f2e40a9f]141        Type( const Qualifiers & tq, const std::list< Attribute * > & attributes );
142        Type( const Type & other );
[0dd3a2f]143        virtual ~Type();
144
[f2e40a9f]145        Qualifiers & get_qualifiers() { return tq; }
[615a096]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; }
[8c49c0e]158
159        ForallList& get_forall() { return forall; }
[0dd3a2f]160
[c0aa336]161        std::list< Attribute * >& get_attributes() { return attributes; }
162        const std::list< Attribute * >& get_attributes() const { return attributes; }
163
[906e24d]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; }
[7933351]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; }
[906e24d]168
[142cf5d]169        /// return type without outer pointers and arrays
[0698aa1]170        Type * stripDeclarator();
171
172        /// return type without outer references
173        Type * stripReferences();
[6f95000]174
[e6cee92]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
[4a9ccc3]178        virtual bool isComplete() const { return true; }
179
[0b3b2ae]180        virtual AggregateDecl * getAggr() const { assertf( false, "Non-aggregate type: %s", toCString( this ) ); }
[9bfc9da]181
182        virtual TypeSubstitution genericSubstitution() const;
[373d0b5]183
[0dd3a2f]184        virtual Type *clone() const = 0;
[f2e40a9f]185        virtual void accept( Visitor & v ) = 0;
186        virtual Type *acceptMutator( Mutator & m ) = 0;
[50377a4]187        virtual void print( std::ostream & os, Indenter indent = {} ) const;
[51b7345]188};
189
[65cdc1e]190extern const Type::FuncSpecifiers noFuncSpecifiers;
191extern const Type::StorageClasses noStorageClasses;
192extern const Type::Qualifiers noQualifiers;                     // no qualifiers on constants
[4cb935e]193
[c8ffe20b]194class VoidType : public Type {
195  public:
[f2e40a9f]196        VoidType( const Type::Qualifiers & tq, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
[51b7345]197
[d67cdb7]198        virtual unsigned size() const override { return 0; };
199        virtual bool isComplete() const override { return false; }
[906e24d]200
[d67cdb7]201        virtual VoidType *clone() const override { return new VoidType( *this ); }
202        virtual void accept( Visitor & v ) override { v.visit( this ); }
203        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
[50377a4]204        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
[51b7345]205};
206
[c8ffe20b]207class BasicType : public Type {
208  public:
[ada4575]209        // GENERATED START, DO NOT EDIT
[6fd1955]210        // GENERATED BY BasicTypes-gen.cc
[cdcddfe1]211        enum Kind {
[e15853c]212                Bool,
[cdcddfe1]213                Char,
214                SignedChar,
215                UnsignedChar,
216                ShortSignedInt,
217                ShortUnsignedInt,
218                SignedInt,
219                UnsignedInt,
220                LongSignedInt,
221                LongUnsignedInt,
222                LongLongSignedInt,
223                LongLongUnsignedInt,
224                SignedInt128,
225                UnsignedInt128,
[e15853c]226                uFloat16,
227                uFloat16Complex,
228                uFloat32,
229                uFloat32Complex,
[cdcddfe1]230                Float,
231                FloatComplex,
[e15853c]232                uFloat32x,
233                uFloat32xComplex,
234                uFloat64,
235                uFloat64Complex,
[cdcddfe1]236                Double,
237                DoubleComplex,
[e15853c]238                uFloat64x,
239                uFloat64xComplex,
240                uuFloat80,
241                uFloat128,
242                uFloat128Complex,
243                uuFloat128,
[cdcddfe1]244                LongDouble,
245                LongDoubleComplex,
[e15853c]246                uFloat128x,
247                uFloat128xComplex,
[0dd3a2f]248                NUMBER_OF_BASIC_TYPES
[65cdc1e]249        } kind;
[ada4575]250        // GENERATED END
[0dd3a2f]251
[59db689]252        static const char *typeNames[];                                         // string names for basic types, MUST MATCH with Kind
[0dd3a2f]253
[f2e40a9f]254        BasicType( const Type::Qualifiers & tq, Kind bt, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
[0dd3a2f]255
256        Kind get_kind() { return kind; }
257        void set_kind( Kind newValue ) { kind = newValue; }
258
[d67cdb7]259        virtual BasicType *clone() const override { return new BasicType( *this ); }
260        virtual void accept( Visitor & v ) override { v.visit( this ); }
261        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
[50377a4]262        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
[0dd3a2f]263
264        bool isInteger() const;
[51b7345]265};
266
[c8ffe20b]267class PointerType : public Type {
268  public:
[65cdc1e]269        Type *base;
270
271        // In C99, pointer types can be qualified in many ways e.g., int f( int a[ static 3 ] )
272        Expression *dimension;
273        bool isVarLen;
274        bool isStatic;
275
[f2e40a9f]276        PointerType( const Type::Qualifiers & tq, Type *base, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
277        PointerType( const Type::Qualifiers & tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
[0dd3a2f]278        PointerType( const PointerType& );
279        virtual ~PointerType();
280
281        Type *get_base() { return base; }
282        void set_base( Type *newValue ) { base = newValue; }
283        Expression *get_dimension() { return dimension; }
284        void set_dimension( Expression *newValue ) { dimension = newValue; }
285        bool get_isVarLen() { return isVarLen; }
286        void set_isVarLen( bool newValue ) { isVarLen = newValue; }
287        bool get_isStatic() { return isStatic; }
288        void set_isStatic( bool newValue ) { isStatic = newValue; }
289
[ed8a0d2]290        bool is_array() const { return isStatic || isVarLen || dimension; }
291
[d67cdb7]292        virtual bool isComplete() const override { return ! isVarLen; }
[ce8c12f]293
[d67cdb7]294        virtual PointerType *clone() const override { return new PointerType( *this ); }
295        virtual void accept( Visitor & v ) override { v.visit( this ); }
296        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
[50377a4]297        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
[65cdc1e]298};
[ae63a18]299
[65cdc1e]300class ArrayType : public Type {
301  public:
302        Type *base;
[0dd3a2f]303        Expression *dimension;
304        bool isVarLen;
305        bool isStatic;
[51b7345]306
[f2e40a9f]307        ArrayType( const Type::Qualifiers & tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
[0dd3a2f]308        ArrayType( const ArrayType& );
309        virtual ~ArrayType();
310
311        Type *get_base() { return base; }
312        void set_base( Type *newValue ) { base = newValue; }
313        Expression *get_dimension() { return dimension; }
314        void set_dimension( Expression *newValue ) { dimension = newValue; }
315        bool get_isVarLen() { return isVarLen; }
316        void set_isVarLen( bool newValue ) { isVarLen = newValue; }
317        bool get_isStatic() { return isStatic; }
318        void set_isStatic( bool newValue ) { isStatic = newValue; }
319
[99b7d4fc]320        // array types are complete if they have a dimension expression or are
321        // VLAs ('*' in parameter declaration), and incomplete otherwise.
322        // See 6.7.6.2
323        virtual bool isComplete() const override { return dimension || isVarLen; }
[4a9ccc3]324
[d67cdb7]325        virtual ArrayType *clone() const override { return new ArrayType( *this ); }
326        virtual void accept( Visitor & v ) override { v.visit( this ); }
327        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
[50377a4]328        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
[51b7345]329};
330
[c5d7701]331class QualifiedType : public Type {
332public:
[c194661]333        Type * parent;
334        Type * child;
[c5d7701]335
[c194661]336        QualifiedType( const Type::Qualifiers & tq, Type * parent, Type * child );
[c5d7701]337        QualifiedType( const QualifiedType & tq );
338        virtual ~QualifiedType();
339
340        virtual QualifiedType *clone() const override { return new QualifiedType( *this ); }
341        virtual void accept( Visitor & v ) override { v.visit( this ); }
342        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
343        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
344};
345
[ce8c12f]346class ReferenceType : public Type {
347public:
[9236060]348        Type *base;
349
[ce8c12f]350        ReferenceType( const Type::Qualifiers & tq, Type *base, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
351        ReferenceType( const ReferenceType & );
352        virtual ~ReferenceType();
353
354        Type *get_base() { return base; }
355        void set_base( Type *newValue ) { base = newValue; }
356
[d67cdb7]357        virtual int referenceDepth() const override;
[e6cee92]358
[5ccb10d]359        // Since reference types act like value types, their size is the size of the base.
360        // This makes it simple to cast the empty tuple to a reference type, since casts that increase
361        // the number of values are disallowed.
[d67cdb7]362        virtual unsigned size() const override { return base->size(); }
[5ccb10d]363
[9bfc9da]364        virtual TypeSubstitution genericSubstitution() const override;
365
[d67cdb7]366        virtual ReferenceType *clone() const override { return new ReferenceType( *this ); }
367        virtual void accept( Visitor & v ) override { v.visit( this ); }
368        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
[50377a4]369        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
[ce8c12f]370};
371
[c8ffe20b]372class FunctionType : public Type {
373  public:
[65cdc1e]374        std::list<DeclarationWithType*> returnVals;
375        std::list<DeclarationWithType*> parameters;
376
377        // Does the function accept a variable number of arguments following the arguments specified in the parameters list.
378        // This could be because of
379        // - an ellipsis in a prototype declaration
380        // - an unprototyped declaration
381        bool isVarArgs;
382
[f2e40a9f]383        FunctionType( const Type::Qualifiers & tq, bool isVarArgs, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
[0dd3a2f]384        FunctionType( const FunctionType& );
385        virtual ~FunctionType();
386
[cf16f94]387        std::list<DeclarationWithType*> & get_returnVals() { return returnVals; }
388        std::list<DeclarationWithType*> & get_parameters() { return parameters; }
[8bf784a]389        bool get_isVarArgs() const { return isVarArgs; }
[0dd3a2f]390        void set_isVarArgs( bool newValue ) { isVarArgs = newValue; }
[8bf784a]391        bool isTtype() const;
392
[8aa474a]393        bool isUnprototyped() const { return isVarArgs && parameters.size() == 0; }
394
[d67cdb7]395        virtual FunctionType *clone() const override { return new FunctionType( *this ); }
396        virtual void accept( Visitor & v ) override { v.visit( this ); }
397        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
[50377a4]398        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
[51b7345]399};
400
[c8ffe20b]401class ReferenceToType : public Type {
402  public:
[65cdc1e]403        std::list< Expression* > parameters;
404        std::string name;
405        bool hoistType;
406
[f2e40a9f]407        ReferenceToType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes );
408        ReferenceToType( const ReferenceToType & other );
[0dd3a2f]409        virtual ~ReferenceToType();
410
[f2e40a9f]411        const std::string & get_name() const { return name; }
[0dd3a2f]412        void set_name( std::string newValue ) { name = newValue; }
413        std::list< Expression* >& get_parameters() { return parameters; }
[43c89a7]414        bool get_hoistType() const { return hoistType; }
415        void set_hoistType( bool newValue ) { hoistType = newValue; }
[ae63a18]416
[d67cdb7]417        virtual ReferenceToType *clone() const override = 0;
418        virtual void accept( Visitor & v ) override = 0;
419        virtual Type *acceptMutator( Mutator & m ) override = 0;
[50377a4]420        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
[6013bd7]421
[b3c36f4]422        virtual void lookup( __attribute__((unused)) const std::string & name, __attribute__((unused)) std::list< Declaration* > & foundDecls ) const {}
[c8ffe20b]423  protected:
[0dd3a2f]424        virtual std::string typeString() const = 0;
[51b7345]425};
426
[c8ffe20b]427class StructInstType : public ReferenceToType {
[0dd3a2f]428        typedef ReferenceToType Parent;
[c8ffe20b]429  public:
[65cdc1e]430        // this decl is not "owned" by the struct inst; it is merely a pointer to elsewhere in the tree,
431        // where the structure used in this type is actually defined
432        StructDecl *baseStruct;
433
[f2e40a9f]434        StructInstType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes = std::list< Attribute * >()  ) : Parent( tq, name, attributes ), baseStruct( 0 ) {}
435        StructInstType( const Type::Qualifiers & tq, StructDecl * baseStruct, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
436        StructInstType( const StructInstType & other ) : Parent( other ), baseStruct( other.baseStruct ) {}
[51b7345]437
[0dd3a2f]438        StructDecl *get_baseStruct() const { return baseStruct; }
439        void set_baseStruct( StructDecl *newValue ) { baseStruct = newValue; }
[37a3b8f9]440
[ed94eac]441        /// Accesses generic parameters of base struct (NULL if none such)
[839ccbb]442        std::list<TypeDecl*> * get_baseParameters();
[9bfc9da]443        const std::list<TypeDecl*> * get_baseParameters() const;
[ae63a18]444
[d67cdb7]445        virtual bool isComplete() const override;
[4a9ccc3]446
[0b3b2ae]447        virtual AggregateDecl * getAggr() const override;
[373d0b5]448
[9bfc9da]449        virtual TypeSubstitution genericSubstitution() const override;
450
[37a3b8f9]451        /// Looks up the members of this struct named "name" and places them into "foundDecls".
452        /// Clones declarations into "foundDecls", caller responsible for freeing
[d67cdb7]453        void lookup( const std::string & name, std::list< Declaration* > & foundDecls ) const override;
[51b7345]454
[d67cdb7]455        virtual StructInstType *clone() const override { return new StructInstType( *this ); }
456        virtual void accept( Visitor & v ) override { v.visit( this ); }
457        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
[5d125e4]458
[50377a4]459        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
[c8ffe20b]460  private:
[d67cdb7]461        virtual std::string typeString() const override;
[51b7345]462};
463
[c8ffe20b]464class UnionInstType : public ReferenceToType {
[0dd3a2f]465        typedef ReferenceToType Parent;
[c8ffe20b]466  public:
[65cdc1e]467        // this decl is not "owned" by the union inst; it is merely a pointer to elsewhere in the tree,
468        // where the union used in this type is actually defined
469        UnionDecl *baseUnion;
470
[f2e40a9f]471        UnionInstType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes = std::list< Attribute * >()  ) : Parent( tq, name, attributes ), baseUnion( 0 ) {}
472        UnionInstType( const Type::Qualifiers & tq, UnionDecl * baseUnion, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
473        UnionInstType( const UnionInstType & other ) : Parent( other ), baseUnion( other.baseUnion ) {}
[0dd3a2f]474
475        UnionDecl *get_baseUnion() const { return baseUnion; }
[c0aa336]476        void set_baseUnion( UnionDecl * newValue ) { baseUnion = newValue; }
[37a3b8f9]477
[ed94eac]478        /// Accesses generic parameters of base union (NULL if none such)
[9bfc9da]479        std::list<TypeDecl*> * get_baseParameters();
480        const std::list<TypeDecl*> * get_baseParameters() const;
[ae63a18]481
[d67cdb7]482        virtual bool isComplete() const override;
[4a9ccc3]483
[0b3b2ae]484        virtual AggregateDecl * getAggr() const override;
[373d0b5]485
[9bfc9da]486        virtual TypeSubstitution genericSubstitution() const override;
487
[37a3b8f9]488        /// looks up the members of this union named "name" and places them into "foundDecls"
489        /// Clones declarations into "foundDecls", caller responsible for freeing
[d67cdb7]490        void lookup( const std::string & name, std::list< Declaration* > & foundDecls ) const override;
[0dd3a2f]491
[d67cdb7]492        virtual UnionInstType *clone() const override { return new UnionInstType( *this ); }
493        virtual void accept( Visitor & v ) override { v.visit( this ); }
494        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
[5d125e4]495
[50377a4]496        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
[c8ffe20b]497  private:
[d67cdb7]498        virtual std::string typeString() const override;
[51b7345]499};
500
[c8ffe20b]501class EnumInstType : public ReferenceToType {
[0dd3a2f]502        typedef ReferenceToType Parent;
[c8ffe20b]503  public:
[65cdc1e]504        // this decl is not "owned" by the union inst; it is merely a pointer to elsewhere in the tree,
505        // where the union used in this type is actually defined
506        EnumDecl *baseEnum = nullptr;
507
[f2e40a9f]508        EnumInstType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes = std::list< Attribute * >()  ) : Parent( tq, name, attributes ) {}
509        EnumInstType( const Type::Qualifiers & tq, EnumDecl * baseEnum, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
510        EnumInstType( const EnumInstType & other ) : Parent( other ), baseEnum( other.baseEnum ) {}
[51b7345]511
[c0aa336]512        EnumDecl *get_baseEnum() const { return baseEnum; }
513        void set_baseEnum( EnumDecl *newValue ) { baseEnum = newValue; }
514
[d67cdb7]515        virtual bool isComplete() const override;
[4a9ccc3]516
[2dc6621]517        virtual AggregateDecl * getAggr() const override;
[0b3b2ae]518
[d67cdb7]519        virtual EnumInstType *clone() const override { return new EnumInstType( *this ); }
520        virtual void accept( Visitor & v ) override { v.visit( this ); }
521        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
[6137fbb]522
523        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
[c8ffe20b]524  private:
[d67cdb7]525        virtual std::string typeString() const override;
[51b7345]526};
527
[4040425]528class TraitInstType : public ReferenceToType {
[0dd3a2f]529        typedef ReferenceToType Parent;
[c8ffe20b]530  public:
[be9036d]531        // this decl is not "owned" by the trait inst; it is merely a pointer to elsewhere in the tree,
532        // where the trait used in this type is actually defined
533        TraitDecl * baseTrait = nullptr;
[65cdc1e]534
[be9036d]535        TraitInstType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes = std::list< Attribute * >() ) : Parent( tq, name, attributes ) {}
536        TraitInstType( const Type::Qualifiers & tq, TraitDecl * baseTrait, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
[f2e40a9f]537        TraitInstType( const TraitInstType & other );
[4040425]538        ~TraitInstType();
[51b7345]539
[d67cdb7]540        virtual bool isComplete() const override;
[4a9ccc3]541
[d67cdb7]542        virtual TraitInstType *clone() const override { return new TraitInstType( *this ); }
543        virtual void accept( Visitor & v ) override { v.visit( this ); }
544        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
[c8ffe20b]545  private:
[d67cdb7]546        virtual std::string typeString() const override;
[51b7345]547};
548
[c8ffe20b]549class TypeInstType : public ReferenceToType {
[0dd3a2f]550        typedef ReferenceToType Parent;
[c8ffe20b]551  public:
[65cdc1e]552        // this decl is not "owned" by the type inst; it is merely a pointer to elsewhere in the tree,
553        // where the type used here is actually defined
554        TypeDecl *baseType;
555        bool isFtype;
556
[f2e40a9f]557        TypeInstType( const Type::Qualifiers & tq, const std::string & name, TypeDecl *baseType, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
558        TypeInstType( const Type::Qualifiers & tq, const std::string & name, bool isFtype, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
559        TypeInstType( const TypeInstType & other );
[1e8b02f5]560        ~TypeInstType();
[0dd3a2f]561
562        TypeDecl *get_baseType() const { return baseType; }
563        void set_baseType( TypeDecl *newValue );
564        bool get_isFtype() const { return isFtype; }
565        void set_isFtype( bool newValue ) { isFtype = newValue; }
[ae63a18]566
[d67cdb7]567        virtual bool isComplete() const override;
[4a9ccc3]568
[d67cdb7]569        virtual TypeInstType *clone() const override { return new TypeInstType( *this ); }
570        virtual void accept( Visitor & v ) override { v.visit( this ); }
571        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
[50377a4]572        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
[c8ffe20b]573  private:
[d67cdb7]574        virtual std::string typeString() const override;
[51b7345]575};
576
[c8ffe20b]577class TupleType : public Type {
578  public:
[65cdc1e]579        std::list<Type *> types;
580        std::list<Declaration *> members;
581
[62423350]582        TupleType( const Type::Qualifiers & tq, const std::list< Type * > & types, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
[0dd3a2f]583        TupleType( const TupleType& );
584        virtual ~TupleType();
[51b7345]585
[0362d42]586        typedef std::list<Type*> value_type;
587        typedef value_type::iterator iterator;
588
[62423350]589        std::list<Type *> & get_types() { return types; }
[d67cdb7]590        virtual unsigned size() const override { return types.size(); };
[51b7345]591
[62423350]592        // For now, this is entirely synthetic -- tuple types always have unnamed members.
593        // Eventually, we may allow named tuples, in which case members should subsume types
594        std::list<Declaration *> & get_members() { return members; }
595
[0362d42]596        iterator begin() { return types.begin(); }
597        iterator end() { return types.end(); }
598
[d67cdb7]599        virtual Type * getComponent( unsigned i ) override {
[7933351]600                assertf( i < size(), "TupleType::getComponent: index %d must be less than size %d", i, size() );
601                return *(begin()+i);
602        }
603
[d67cdb7]604        // virtual bool isComplete() const override { return true; } // xxx - not sure if this is right, might need to recursively check complete-ness
[4a9ccc3]605
[d67cdb7]606        virtual TupleType *clone() const override { return new TupleType( *this ); }
607        virtual void accept( Visitor & v ) override { v.visit( this ); }
608        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
[50377a4]609        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
[51b7345]610};
611
[c8ffe20b]612class TypeofType : public Type {
613  public:
[f441c88]614        Expression *expr;    ///< expression to take the type of
615        bool is_basetypeof;  ///< true iff is basetypeof type
[65cdc1e]616
[f441c88]617        TypeofType( const Type::Qualifiers & tq, Expression *expr, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
618        TypeofType( const Type::Qualifiers & tq, Expression *expr, bool is_basetypeof, 
619                const std::list< Attribute * > & attributes = std::list< Attribute * >() );
[0dd3a2f]620        TypeofType( const TypeofType& );
621        virtual ~TypeofType();
[51b7345]622
[0dd3a2f]623        Expression *get_expr() const { return expr; }
624        void set_expr( Expression *newValue ) { expr = newValue; }
[51b7345]625
[d67cdb7]626        virtual bool isComplete() const override { assert( false ); return false; }
[4a9ccc3]627
[d67cdb7]628        virtual TypeofType *clone() const override { return new TypeofType( *this ); }
629        virtual void accept( Visitor & v ) override { v.visit( this ); }
630        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
[50377a4]631        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
[51b7345]632};
633
[c8ffe20b]634class AttrType : public Type {
635  public:
[65cdc1e]636        std::string name;
637        Expression *expr;
638        Type *type;
639        bool isType;
640
[f2e40a9f]641        AttrType( const Type::Qualifiers & tq, const std::string & name, Expression *expr, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
642        AttrType( const Type::Qualifiers & tq, const std::string & name, Type *type, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
[0dd3a2f]643        AttrType( const AttrType& );
644        virtual ~AttrType();
645
[f2e40a9f]646        const std::string & get_name() const { return name; }
647        void set_name( const std::string & newValue ) { name = newValue; }
[0dd3a2f]648        Expression *get_expr() const { return expr; }
649        void set_expr( Expression *newValue ) { expr = newValue; }
650        Type *get_type() const { return type; }
651        void set_type( Type *newValue ) { type = newValue; }
652        bool get_isType() const { return isType; }
653        void set_isType( bool newValue ) { isType = newValue; }
654
[d67cdb7]655        virtual bool isComplete() const override { assert( false ); } // xxx - not sure what to do here
[4a9ccc3]656
[d67cdb7]657        virtual AttrType *clone() const override { return new AttrType( *this ); }
658        virtual void accept( Visitor & v ) override { v.visit( this ); }
659        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
[50377a4]660        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
[51b7345]661};
662
[44b7088]663/// Represents the GCC built-in varargs type
664class VarArgsType : public Type {
[90c3b1c]665  public:
[44b7088]666        VarArgsType();
[c0aa336]667        VarArgsType( Type::Qualifiers tq, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
[44b7088]668
[d67cdb7]669        virtual bool isComplete() const override{ return true; } // xxx - is this right?
[4a9ccc3]670
[d67cdb7]671        virtual VarArgsType *clone() const override { return new VarArgsType( *this ); }
672        virtual void accept( Visitor & v ) override { v.visit( this ); }
673        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
[50377a4]674        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
[44b7088]675};
676
[89e6ffc]677/// Represents a zero constant
678class ZeroType : public Type {
679  public:
680        ZeroType();
[c0aa336]681        ZeroType( Type::Qualifiers tq, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
[89e6ffc]682
[d67cdb7]683        virtual ZeroType *clone() const override { return new ZeroType( *this ); }
684        virtual void accept( Visitor & v ) override { v.visit( this ); }
685        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
[50377a4]686        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
[89e6ffc]687};
688
689/// Represents a one constant
690class OneType : public Type {
691  public:
692        OneType();
[c0aa336]693        OneType( Type::Qualifiers tq, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
[89e6ffc]694
[d67cdb7]695        virtual OneType *clone() const override { return new OneType( *this ); }
696        virtual void accept( Visitor & v ) override { v.visit( this ); }
697        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
[50377a4]698        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
[89e6ffc]699};
700
[47498bd]701class GlobalScopeType : public Type {
702  public:
703        GlobalScopeType();
704
705        virtual GlobalScopeType *clone() const override { return new GlobalScopeType( *this ); }
706        virtual void accept( Visitor & v ) override { v.visit( this ); }
707        virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
708        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
709};
710
[0dd3a2f]711// Local Variables: //
712// tab-width: 4 //
713// mode: c++ //
714// compile-command: "make install" //
715// End: //
Note: See TracBrowser for help on using the repository browser.