source: src/SynTree/Type.h @ dd3576b

ADTast-experimental
Last change on this file since dd3576b was e4f13fe, checked in by Peter A. Buhr <pabuhr@…>, 17 months ago

formatting

  • 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
[1b7b604]11// Last Modified By : Peter A. Buhr
[e4f13fe]12// Last Modified On : Sun Feb 19 22:37:10 2023
13// Update Count     : 176
[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
[8f06277]25#include "Common/Iterate.hpp"// for operator+
26#include "Common/utility.h"  // for toCString
[ea6332d]27#include "Mutator.h"         // for Mutator
28#include "SynTree.h"         // for AST nodes
29#include "Visitor.h"         // for Visitor
[51b7345]30
[138e29e]31class Type : public BaseSyntaxNode {
[c8ffe20b]32  public:
[6f95000]33        // Simulate inheritance because union does not allow it.
[615a096]34        // Bug in g++-4.9 prevents static field in union
35        //static const char * Names[];
[6f95000]36        #define BFCommon( BFType, N ) \
[d6d747d]37                bool operator[]( unsigned int i ) const { return val & (1 << i); } \
38                bool any() const { return val != 0; } \
[6f95000]39                void reset() { val = 0; } \
40                int ffs() { return ::ffs( val ) - 1; } \
41                BFType operator&=( BFType other ) { \
42                        val &= other.val; return *this; \
43                } \
44                BFType operator&( BFType other ) const { \
45                        BFType q = other; \
46                        q &= *this; \
47                        return q; \
48                } \
49                BFType operator|=( BFType other ) { \
50                        val |= other.val; return *this; \
51                } \
52                BFType operator|( BFType other ) const { \
53                        BFType q = other; \
54                        q |= *this; \
55                        return q; \
56                } \
57                BFType operator-=( BFType other ) { \
58                        val &= ~other.val; return *this; \
59                } \
[d6d747d]60                void print( std::ostream & os ) const { \
61                        if ( (*this).any() ) { \
62                                for ( unsigned int i = 0; i < N; i += 1 ) { \
63                                        if ( (*this)[i] ) { \
[615a096]64                                                os << BFType##Names[i] << ' '; \
[d6d747d]65                                        } \
66                                } \
67                        } \
68                }
69
[68fe077a]70        // enum must remain in the same order as the corresponding bit fields.
71
[ddfd945]72        enum { Inline = 1 << 0, Noreturn = 1 << 1, Fortran = 1 << 2, NumFuncSpecifier = 3 };
[615a096]73        static const char * FuncSpecifiersNames[];
[ddfd945]74        union FuncSpecifiers {
75                unsigned int val;
76                struct {
77                        bool is_inline : 1;
78                        bool is_noreturn : 1;
79                        bool is_fortran : 1;
80                };
81                FuncSpecifiers() : val( 0 ) {}
82                FuncSpecifiers( unsigned int val ) : val( val ) {}
[615a096]83                // equality (==, !=) works implicitly on first field "val", relational operations are undefined.
[6f95000]84                BFCommon( FuncSpecifiers, NumFuncSpecifier )
[ddfd945]85        }; // FuncSpecifiers
86
[ed9a1ae]87        enum { Extern = 1 << 0, Static = 1 << 1, Auto = 1 << 2, Register = 1 << 3, ThreadlocalGcc = 1 << 4, ThreadlocalC11 = 1 << 5, NumStorageClass = 6 };
[615a096]88        static const char * StorageClassesNames[];
[68fe077a]89        union StorageClasses {
90                unsigned int val;
91                struct {
92                        bool is_extern : 1;
93                        bool is_static : 1;
94                        bool is_auto : 1;
95                        bool is_register : 1;
[ed9a1ae]96                        bool is_threadlocalGcc : 1;
97                        bool is_threadlocalC11 : 1;
[68fe077a]98                };
99
100                StorageClasses() : val( 0 ) {}
101                StorageClasses( unsigned int val ) : val( val ) {}
[615a096]102                // equality (==, !=) works implicitly on first field "val", relational operations are undefined.
[6f95000]103                BFCommon( StorageClasses, NumStorageClass )
[ed9a1ae]104
105                bool is_threadlocal_any() { return this->is_threadlocalC11 || this->is_threadlocalGcc; }
[68fe077a]106        }; // StorageClasses
107
[b4f8808]108        enum { Const = 1 << 0, Restrict = 1 << 1, Volatile = 1 << 2, Mutex = 1 << 3, Atomic = 1 << 4, NumTypeQualifier = 5 };
[615a096]109        static const char * QualifiersNames[];
[bf4ac09]110        union Qualifiers {
[b4f8808]111                enum { Mask = ~Restrict };
[bf4ac09]112                unsigned int val;
113                struct {
[615a096]114                        bool is_const : 1;
115                        bool is_restrict : 1;
116                        bool is_volatile : 1;
117                        bool is_mutex : 1;
118                        bool is_atomic : 1;
[bf4ac09]119                };
[6e8bd43]120
[bf4ac09]121                Qualifiers() : val( 0 ) {}
122                Qualifiers( unsigned int val ) : val( val ) {}
[615a096]123                // Complex comparisons provide implicit qualifier downcasting, e.g., T downcast to const T.
124                bool operator==( Qualifiers other ) const { return (val & Mask) == (other.val & Mask); }
125                bool operator!=( Qualifiers other ) const { return (val & Mask) != (other.val & Mask); }
[d6d747d]126                bool operator<=( Qualifiers other ) const {
[e4f13fe]127                        return is_const    <= other.is_const        // Any non-const converts to const without cost
128                                && is_volatile <= other.is_volatile             // Any non-volatile converts to volatile without cost
129                                && is_mutex    >= other.is_mutex                // Any mutex converts to non-mutex without cost
130                                && is_atomic   == other.is_atomic;              // No conversion from atomic to non atomic is free
[bf4ac09]131                }
[6f95000]132                bool operator<( Qualifiers other ) const { return *this != other && *this <= other; }
133                bool operator>=( Qualifiers other ) const { return ! (*this < other); }
134                bool operator>( Qualifiers other ) const { return *this != other && *this >= other; }
135                BFCommon( Qualifiers, NumTypeQualifier )
[3315e3d]136
137                Qualifiers unify( Qualifiers const & other ) const {
138                        int or_flags = Mask & (val | other.val);
139                        int and_flags = val & other.val;
140                        return Qualifiers( or_flags | and_flags );
141                }
[bf4ac09]142        }; // Qualifiers
[0dd3a2f]143
[65cdc1e]144        typedef std::list<TypeDecl *> ForallList;
145
146        Qualifiers tq;
147        ForallList forall;
148        std::list< Attribute * > attributes;
149
[f2e40a9f]150        Type( const Qualifiers & tq, const std::list< Attribute * > & attributes );
151        Type( const Type & other );
[0dd3a2f]152        virtual ~Type();
153
[f2e40a9f]154        Qualifiers & get_qualifiers() { return tq; }
[7870799]155        bool get_const() const { return tq.is_const; }
156        bool get_volatile() const { return tq.is_volatile; }
157        bool get_restrict() const { return tq.is_restrict; }
158        bool get_mutex() const { return tq.is_mutex; }
159        bool get_atomic() const { return tq.is_atomic; }
[615a096]160        void set_const( bool newValue ) { tq.is_const = newValue; }
161        void set_volatile( bool newValue ) { tq.is_volatile = newValue; }
162        void set_restrict( bool newValue ) { tq.is_restrict = newValue; }
163        void set_mutex( bool newValue ) { tq.is_mutex = newValue; }
164        void set_atomic( bool newValue ) { tq.is_atomic = newValue; }
[8c49c0e]165
166        ForallList& get_forall() { return forall; }
[0dd3a2f]167
[c0aa336]168        std::list< Attribute * >& get_attributes() { return attributes; }
169        const std::list< Attribute * >& get_attributes() const { return attributes; }
170
[906e24d]171        /// How many elemental types are represented by this type
172        virtual unsigned size() const { return 1; };
173        virtual bool isVoid() const { return size() == 0; }
[7933351]174        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]175
[142cf5d]176        /// return type without outer pointers and arrays
[0698aa1]177        Type * stripDeclarator();
178
179        /// return type without outer references
180        Type * stripReferences();
[85dac33]181        const Type * stripReferences() const;
[6f95000]182
[e6cee92]183        /// return the number of references occuring consecutively on the outermost layer of this type (i.e. do not count references nested within other types)
184        virtual int referenceDepth() const;
185
[4a9ccc3]186        virtual bool isComplete() const { return true; }
187
[0b3b2ae]188        virtual AggregateDecl * getAggr() const { assertf( false, "Non-aggregate type: %s", toCString( this ) ); }
[9bfc9da]189
190        virtual TypeSubstitution genericSubstitution() const;
[373d0b5]191
[1b7b604]192        virtual Type * clone() const = 0;
[f2e40a9f]193        virtual void accept( Visitor & v ) = 0;
[7870799]194        virtual void accept( Visitor & v ) const = 0;
[1b7b604]195        virtual Type * acceptMutator( Mutator & m ) = 0;
[50377a4]196        virtual void print( std::ostream & os, Indenter indent = {} ) const;
[51b7345]197};
198
[65cdc1e]199extern const Type::FuncSpecifiers noFuncSpecifiers;
200extern const Type::StorageClasses noStorageClasses;
201extern const Type::Qualifiers noQualifiers;                     // no qualifiers on constants
[4cb935e]202
[c8ffe20b]203class VoidType : public Type {
204  public:
[f2e40a9f]205        VoidType( const Type::Qualifiers & tq, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
[51b7345]206
[d67cdb7]207        virtual unsigned size() const override { return 0; };
208        virtual bool isComplete() const override { return false; }
[906e24d]209
[1b7b604]210        virtual VoidType * clone() const override { return new VoidType( *this ); }
[d67cdb7]211        virtual void accept( Visitor & v ) override { v.visit( this ); }
[7870799]212        virtual void accept( Visitor & v ) const override { v.visit( this ); }
[1b7b604]213        virtual Type * acceptMutator( Mutator & m ) override { return m.mutate( this ); }
[50377a4]214        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
[51b7345]215};
216
[c8ffe20b]217class BasicType : public Type {
218  public:
[ada4575]219        // GENERATED START, DO NOT EDIT
[6fd1955]220        // GENERATED BY BasicTypes-gen.cc
[cdcddfe1]221        enum Kind {
[e15853c]222                Bool,
[cdcddfe1]223                Char,
224                SignedChar,
225                UnsignedChar,
226                ShortSignedInt,
227                ShortUnsignedInt,
228                SignedInt,
229                UnsignedInt,
230                LongSignedInt,
231                LongUnsignedInt,
232                LongLongSignedInt,
233                LongLongUnsignedInt,
234                SignedInt128,
235                UnsignedInt128,
[e15853c]236                uFloat16,
237                uFloat16Complex,
238                uFloat32,
239                uFloat32Complex,
[cdcddfe1]240                Float,
241                FloatComplex,
[e15853c]242                uFloat32x,
243                uFloat32xComplex,
244                uFloat64,
245                uFloat64Complex,
[cdcddfe1]246                Double,
247                DoubleComplex,
[e15853c]248                uFloat64x,
249                uFloat64xComplex,
250                uuFloat80,
251                uFloat128,
252                uFloat128Complex,
253                uuFloat128,
[cdcddfe1]254                LongDouble,
255                LongDoubleComplex,
[e15853c]256                uFloat128x,
257                uFloat128xComplex,
[0dd3a2f]258                NUMBER_OF_BASIC_TYPES
[65cdc1e]259        } kind;
[ada4575]260        // GENERATED END
[0dd3a2f]261
[1b7b604]262        static const char * typeNames[];                                        // string names for basic types, MUST MATCH with Kind
[0dd3a2f]263
[f2e40a9f]264        BasicType( const Type::Qualifiers & tq, Kind bt, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
[0dd3a2f]265
[85dac33]266        Kind get_kind() const { return kind; }
[0dd3a2f]267        void set_kind( Kind newValue ) { kind = newValue; }
268
[1b7b604]269        virtual BasicType * clone() const override { return new BasicType( *this ); }
[d67cdb7]270        virtual void accept( Visitor & v ) override { v.visit( this ); }
[7870799]271        virtual void accept( Visitor & v ) const override { v.visit( this ); }
[1b7b604]272        virtual Type * acceptMutator( Mutator & m ) override { return m.mutate( this ); }
[50377a4]273        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
[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 ] )
[1b7b604]282        Expression * dimension;
[65cdc1e]283        bool isVarLen;
284        bool isStatic;
285
[1b7b604]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
[1b7b604]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; }
[0dd3a2f]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
[1b7b604]304        virtual PointerType * clone() const override { return new PointerType( * this ); }
[d67cdb7]305        virtual void accept( Visitor & v ) override { v.visit( this ); }
[7870799]306        virtual void accept( Visitor & v ) const override { v.visit( this ); }
[1b7b604]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:
[1b7b604]313        Type * base;
314        Expression * dimension;
[0dd3a2f]315        bool isVarLen;
316        bool isStatic;
[51b7345]317
[1b7b604]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
[1b7b604]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; }
[0dd3a2f]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
[1b7b604]336        virtual ArrayType * clone() const override { return new ArrayType( *this ); }
[d67cdb7]337        virtual void accept( Visitor & v ) override { v.visit( this ); }
[7870799]338        virtual void accept( Visitor & v ) const override { v.visit( this ); }
[1b7b604]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
[1b7b604]351        virtual QualifiedType * clone() const override { return new QualifiedType( *this ); }
[c5d7701]352        virtual void accept( Visitor & v ) override { v.visit( this ); }
[7870799]353        virtual void accept( Visitor & v ) const override { v.visit( this ); }
[1b7b604]354        virtual Type * acceptMutator( Mutator & m ) override { return m.mutate( this ); }
[c5d7701]355        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
356};
357
[ce8c12f]358class ReferenceType : public Type {
359public:
[1b7b604]360        Type * base;
[9236060]361
[1b7b604]362        ReferenceType( const Type::Qualifiers & tq, Type * base, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
[ce8c12f]363        ReferenceType( const ReferenceType & );
364        virtual ~ReferenceType();
365
[1b7b604]366        Type * get_base() { return base; }
367        void set_base( Type * newValue ) { base = newValue; }
[ce8c12f]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
[1b7b604]378        virtual ReferenceType * clone() const override { return new ReferenceType( *this ); }
[d67cdb7]379        virtual void accept( Visitor & v ) override { v.visit( this ); }
[7870799]380        virtual void accept( Visitor & v ) const override { v.visit( this ); }
[1b7b604]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
[1b7b604]408        virtual FunctionType * clone() const override { return new FunctionType( *this ); }
[d67cdb7]409        virtual void accept( Visitor & v ) override { v.visit( this ); }
[7870799]410        virtual void accept( Visitor & v ) const override { v.visit( this ); }
[1b7b604]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:
[1b7b604]417        std::list< Expression * > parameters;
[65cdc1e]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
[1b7b604]431        virtual ReferenceToType * clone() const override = 0;
[d67cdb7]432        virtual void accept( Visitor & v ) override = 0;
[1b7b604]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
[1b7b604]446        StructDecl * baseStruct;
[65cdc1e]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
[1b7b604]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
[1b7b604]469        virtual StructInstType * clone() const override { return new StructInstType( *this ); }
[d67cdb7]470        virtual void accept( Visitor & v ) override { v.visit( this ); }
[7870799]471        virtual void accept( Visitor & v ) const override { v.visit( this ); }
[1b7b604]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
[1b7b604]484        UnionDecl * baseUnion;
[65cdc1e]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
[1b7b604]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
[1b7b604]507        virtual UnionInstType * clone() const override { return new UnionInstType( *this ); }
[d67cdb7]508        virtual void accept( Visitor & v ) override { v.visit( this ); }
[7870799]509        virtual void accept( Visitor & v ) const override { v.visit( this ); }
[1b7b604]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
[1b7b604]522        EnumDecl * baseEnum = nullptr;
[65cdc1e]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
[1b7b604]528        EnumDecl * get_baseEnum() const { return baseEnum; }
529        void set_baseEnum( EnumDecl * newValue ) { baseEnum = newValue; }
[c0aa336]530
[d67cdb7]531        virtual bool isComplete() const override;
[4a9ccc3]532
[2dc6621]533        virtual AggregateDecl * getAggr() const override;
[0b3b2ae]534
[1b7b604]535        virtual EnumInstType * clone() const override { return new EnumInstType( *this ); }
[d67cdb7]536        virtual void accept( Visitor & v ) override { v.visit( this ); }
[7870799]537        virtual void accept( Visitor & v ) const override { v.visit( this ); }
[1b7b604]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
[1b7b604]559        virtual TraitInstType * clone() const override { return new TraitInstType( *this ); }
[d67cdb7]560        virtual void accept( Visitor & v ) override { v.visit( this ); }
[7870799]561        virtual void accept( Visitor & v ) const override { v.visit( this ); }
[1b7b604]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
[1b7b604]572        TypeDecl * baseType;
[65cdc1e]573        bool isFtype;
574
[1b7b604]575        TypeInstType( const Type::Qualifiers & tq, const std::string & name, TypeDecl * baseType, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
[f2e40a9f]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
[1b7b604]580        TypeDecl * get_baseType() const { return baseType; }
581        void set_baseType( TypeDecl * newValue );
[0dd3a2f]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
[1b7b604]587        virtual TypeInstType * clone() const override { return new TypeInstType( *this ); }
[d67cdb7]588        virtual void accept( Visitor & v ) override { v.visit( this ); }
[7870799]589        virtual void accept( Visitor & v ) const override { v.visit( this ); }
[1b7b604]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
[1b7b604]625        virtual TupleType * clone() const override { return new TupleType( *this ); }
[d67cdb7]626        virtual void accept( Visitor & v ) override { v.visit( this ); }
[7870799]627        virtual void accept( Visitor & v ) const override { v.visit( this ); }
[1b7b604]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:
[e4f13fe]634        Expression * expr;              ///< expression to take the type of
635        bool is_basetypeof;             ///< true iff is basetypeof type
[65cdc1e]636
[1b7b604]637        TypeofType( const Type::Qualifiers & tq, Expression * expr, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
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
[1b7b604]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
[1b7b604]648        virtual TypeofType * clone() const override { return new TypeofType( *this ); }
[d67cdb7]649        virtual void accept( Visitor & v ) override { v.visit( this ); }
[7870799]650        virtual void accept( Visitor & v ) const override { v.visit( this ); }
[1b7b604]651        virtual Type * acceptMutator( Mutator & m ) override { return m.mutate( this ); }
[ca69a8a]652        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
653};
654
655class VTableType : public Type {
656public:
[1b7b604]657        Type * base;
[ca69a8a]658
[1b7b604]659        VTableType( const Type::Qualifiers & tq, Type * base,
[ca69a8a]660                const std::list< Attribute * > & attributes = std::list< Attribute * >() );
661        VTableType( const VTableType & );
662        virtual ~VTableType();
663
[1b7b604]664        Type * get_base() { return base; }
665        void set_base( Type * newValue ) { base = newValue; }
[ca69a8a]666
[1b7b604]667        virtual VTableType * clone() const override { return new VTableType( *this ); }
[ca69a8a]668        virtual void accept( Visitor & v ) override { v.visit( this ); }
669        virtual void accept( Visitor & v ) const override { v.visit( this ); }
[1b7b604]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;
[1b7b604]677        Expression * expr;
678        Type * type;
[65cdc1e]679        bool isType;
680
[1b7b604]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; }
[1b7b604]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; }
[0dd3a2f]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
[1b7b604]697        virtual AttrType * clone() const override { return new AttrType( *this ); }
[d67cdb7]698        virtual void accept( Visitor & v ) override { v.visit( this ); }
[7870799]699        virtual void accept( Visitor & v ) const override { v.visit( this ); }
[1b7b604]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
[1b7b604]712        virtual VarArgsType * clone() const override { return new VarArgsType( *this ); }
[d67cdb7]713        virtual void accept( Visitor & v ) override { v.visit( this ); }
[7870799]714        virtual void accept( Visitor & v ) const override { v.visit( this ); }
[1b7b604]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
[1b7b604]725        virtual ZeroType * clone() const override { return new ZeroType( *this ); }
[d67cdb7]726        virtual void accept( Visitor & v ) override { v.visit( this ); }
[7870799]727        virtual void accept( Visitor & v ) const override { v.visit( this ); }
[1b7b604]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
[1b7b604]738        virtual OneType * clone() const override { return new OneType( *this ); }
[d67cdb7]739        virtual void accept( Visitor & v ) override { v.visit( this ); }
[7870799]740        virtual void accept( Visitor & v ) const override { v.visit( this ); }
[1b7b604]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
[1b7b604]749        virtual GlobalScopeType * clone() const override { return new GlobalScopeType( *this ); }
[47498bd]750        virtual void accept( Visitor & v ) override { v.visit( this ); }
[7870799]751        virtual void accept( Visitor & v ) const override { v.visit( this ); }
[1b7b604]752        virtual Type * acceptMutator( Mutator & m ) override { return m.mutate( this ); }
[47498bd]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.