source: src/SynTree/Type.h @ e9e9f56

ADTast-experimentalpthread-emulation
Last change on this file since e9e9f56 was 4520b77e, checked in by JiadaL <j82liang@…>, 21 months ago

Merge to Master Sept 19

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