source: src/SynTree/Type.h @ 4eebbcc

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

formatting

  • Property mode set to 100644
File size: 30.7 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
7// Type.h --
8//
9// Author           : Richard C. Bilson
10// Created On       : Mon May 18 07:44:20 2015
11// Last Modified By : Peter A. Buhr
12// Last Modified On : Sun Feb 19 22:37:10 2023
13// Update Count     : 176
14//
15
16#pragma once
17
18#include <strings.h>         // for ffs
19#include <cassert>           // for assert, assertf
20#include <list>              // for list, _List_iterator
21#include <ostream>           // for ostream, operator<<, basic_ostream
22#include <string>            // for string
23
24#include "BaseSyntaxNode.h"  // for BaseSyntaxNode
25#include "Common/Iterate.hpp"// for operator+
26#include "Common/utility.h"  // for toCString
27#include "Mutator.h"         // for Mutator
28#include "SynTree.h"         // for AST nodes
29#include "Visitor.h"         // for Visitor
30
31class Type : public BaseSyntaxNode {
32  public:
33        // Simulate inheritance because union does not allow it.
34        // Bug in g++-4.9 prevents static field in union
35        //static const char * Names[];
36        #define BFCommon( BFType, N ) \
37                bool operator[]( unsigned int i ) const { return val & (1 << i); } \
38                bool any() const { return val != 0; } \
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                } \
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] ) { \
64                                                os << BFType##Names[i] << ' '; \
65                                        } \
66                                } \
67                        } \
68                }
69
70        // enum must remain in the same order as the corresponding bit fields.
71
72        enum { Inline = 1 << 0, Noreturn = 1 << 1, Fortran = 1 << 2, NumFuncSpecifier = 3 };
73        static const char * FuncSpecifiersNames[];
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 ) {}
83                // equality (==, !=) works implicitly on first field "val", relational operations are undefined.
84                BFCommon( FuncSpecifiers, NumFuncSpecifier )
85        }; // FuncSpecifiers
86
87        enum { Extern = 1 << 0, Static = 1 << 1, Auto = 1 << 2, Register = 1 << 3, ThreadlocalGcc = 1 << 4, ThreadlocalC11 = 1 << 5, NumStorageClass = 6 };
88        static const char * StorageClassesNames[];
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;
96                        bool is_threadlocalGcc : 1;
97                        bool is_threadlocalC11 : 1;
98                };
99
100                StorageClasses() : val( 0 ) {}
101                StorageClasses( unsigned int val ) : val( val ) {}
102                // equality (==, !=) works implicitly on first field "val", relational operations are undefined.
103                BFCommon( StorageClasses, NumStorageClass )
104
105                bool is_threadlocal_any() { return this->is_threadlocalC11 || this->is_threadlocalGcc; }
106        }; // StorageClasses
107
108        enum { Const = 1 << 0, Restrict = 1 << 1, Volatile = 1 << 2, Mutex = 1 << 3, Atomic = 1 << 4, NumTypeQualifier = 5 };
109        static const char * QualifiersNames[];
110        union Qualifiers {
111                enum { Mask = ~Restrict };
112                unsigned int val;
113                struct {
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;
119                };
120
121                Qualifiers() : val( 0 ) {}
122                Qualifiers( unsigned int val ) : val( val ) {}
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); }
126                bool operator<=( Qualifiers other ) const {
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
131                }
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 )
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                }
142        }; // Qualifiers
143
144        typedef std::list<TypeDecl *> ForallList;
145
146        Qualifiers tq;
147        ForallList forall;
148        std::list< Attribute * > attributes;
149
150        Type( const Qualifiers & tq, const std::list< Attribute * > & attributes );
151        Type( const Type & other );
152        virtual ~Type();
153
154        Qualifiers & get_qualifiers() { return tq; }
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; }
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; }
165
166        ForallList& get_forall() { return forall; }
167
168        std::list< Attribute * >& get_attributes() { return attributes; }
169        const std::list< Attribute * >& get_attributes() const { return attributes; }
170
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; }
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; }
175
176        /// return type without outer pointers and arrays
177        Type * stripDeclarator();
178
179        /// return type without outer references
180        Type * stripReferences();
181        const Type * stripReferences() const;
182
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
186        virtual bool isComplete() const { return true; }
187
188        virtual AggregateDecl * getAggr() const { assertf( false, "Non-aggregate type: %s", toCString( this ) ); }
189
190        virtual TypeSubstitution genericSubstitution() const;
191
192        virtual Type * clone() const = 0;
193        virtual void accept( Visitor & v ) = 0;
194        virtual void accept( Visitor & v ) const = 0;
195        virtual Type * acceptMutator( Mutator & m ) = 0;
196        virtual void print( std::ostream & os, Indenter indent = {} ) const;
197};
198
199extern const Type::FuncSpecifiers noFuncSpecifiers;
200extern const Type::StorageClasses noStorageClasses;
201extern const Type::Qualifiers noQualifiers;                     // no qualifiers on constants
202
203class VoidType : public Type {
204  public:
205        VoidType( const Type::Qualifiers & tq, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
206
207        virtual unsigned size() const override { return 0; };
208        virtual bool isComplete() const override { return false; }
209
210        virtual VoidType * clone() const override { return new VoidType( *this ); }
211        virtual void accept( Visitor & v ) override { v.visit( this ); }
212        virtual void accept( Visitor & v ) const override { v.visit( this ); }
213        virtual Type * acceptMutator( Mutator & m ) override { return m.mutate( this ); }
214        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
215};
216
217class BasicType : public Type {
218  public:
219        // GENERATED START, DO NOT EDIT
220        // GENERATED BY BasicTypes-gen.cc
221        enum Kind {
222                Bool,
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,
236                uFloat16,
237                uFloat16Complex,
238                uFloat32,
239                uFloat32Complex,
240                Float,
241                FloatComplex,
242                uFloat32x,
243                uFloat32xComplex,
244                uFloat64,
245                uFloat64Complex,
246                Double,
247                DoubleComplex,
248                uFloat64x,
249                uFloat64xComplex,
250                uuFloat80,
251                uFloat128,
252                uFloat128Complex,
253                uuFloat128,
254                LongDouble,
255                LongDoubleComplex,
256                uFloat128x,
257                uFloat128xComplex,
258                NUMBER_OF_BASIC_TYPES
259        } kind;
260        // GENERATED END
261
262        static const char * typeNames[];                                        // string names for basic types, MUST MATCH with Kind
263
264        BasicType( const Type::Qualifiers & tq, Kind bt, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
265
266        Kind get_kind() const { return kind; }
267        void set_kind( Kind newValue ) { kind = newValue; }
268
269        virtual BasicType * clone() const override { return new BasicType( *this ); }
270        virtual void accept( Visitor & v ) override { v.visit( this ); }
271        virtual void accept( Visitor & v ) const override { v.visit( this ); }
272        virtual Type * acceptMutator( Mutator & m ) override { return m.mutate( this ); }
273        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
274        bool isInteger() const;
275};
276
277class PointerType : public Type {
278  public:
279        Type * base;
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
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 * >() );
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
300        bool is_array() const { return isStatic || isVarLen || dimension; }
301
302        virtual bool isComplete() const override { return ! isVarLen; }
303
304        virtual PointerType * clone() const override { return new PointerType( * this ); }
305        virtual void accept( Visitor & v ) override { v.visit( this ); }
306        virtual void accept( Visitor & v ) const override { v.visit( this ); }
307        virtual Type * acceptMutator( Mutator & m ) override { return m.mutate( this ); }
308        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
309};
310
311class ArrayType : public Type {
312  public:
313        Type * base;
314        Expression * dimension;
315        bool isVarLen;
316        bool isStatic;
317
318        ArrayType( const Type::Qualifiers & tq, Type * base, Expression * dimension, bool isVarLen, bool isStatic, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
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
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; }
335
336        virtual ArrayType * clone() const override { return new ArrayType( *this ); }
337        virtual void accept( Visitor & v ) override { v.visit( this ); }
338        virtual void accept( Visitor & v ) const override { v.visit( this ); }
339        virtual Type * acceptMutator( Mutator & m ) override { return m.mutate( this ); }
340        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
341};
342
343class QualifiedType : public Type {
344public:
345        Type * parent;
346        Type * child;
347        QualifiedType( const Type::Qualifiers & tq, Type * parent, Type * child );
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 ); }
353        virtual void accept( Visitor & v ) const override { v.visit( this ); }
354        virtual Type * acceptMutator( Mutator & m ) override { return m.mutate( this ); }
355        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
356};
357
358class ReferenceType : public Type {
359public:
360        Type * base;
361
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
369        virtual int referenceDepth() const override;
370
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.
374        virtual unsigned size() const override { return base->size(); }
375
376        virtual TypeSubstitution genericSubstitution() const override;
377
378        virtual ReferenceType * clone() const override { return new ReferenceType( *this ); }
379        virtual void accept( Visitor & v ) override { v.visit( this ); }
380        virtual void accept( Visitor & v ) const override { v.visit( this ); }
381        virtual Type * acceptMutator( Mutator & m ) override { return m.mutate( this ); }
382        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
383};
384
385class FunctionType : public Type {
386  public:
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
396        FunctionType( const Type::Qualifiers & tq, bool isVarArgs, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
397        FunctionType( const FunctionType& );
398        virtual ~FunctionType();
399
400        std::list<DeclarationWithType*> & get_returnVals() { return returnVals; }
401        std::list<DeclarationWithType*> & get_parameters() { return parameters; }
402        bool get_isVarArgs() const { return isVarArgs; }
403        void set_isVarArgs( bool newValue ) { isVarArgs = newValue; }
404        bool isTtype() const;
405
406        bool isUnprototyped() const { return isVarArgs && parameters.size() == 0; }
407
408        virtual FunctionType * clone() const override { return new FunctionType( *this ); }
409        virtual void accept( Visitor & v ) override { v.visit( this ); }
410        virtual void accept( Visitor & v ) const override { v.visit( this ); }
411        virtual Type * acceptMutator( Mutator & m ) override { return m.mutate( this ); }
412        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
413};
414
415class ReferenceToType : public Type {
416  public:
417        std::list< Expression * > parameters;
418        std::string name;
419        bool hoistType;
420
421        ReferenceToType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes );
422        ReferenceToType( const ReferenceToType & other );
423        virtual ~ReferenceToType();
424
425        const std::string & get_name() const { return name; }
426        void set_name( std::string newValue ) { name = newValue; }
427        std::list< Expression* >& get_parameters() { return parameters; }
428        bool get_hoistType() const { return hoistType; }
429        void set_hoistType( bool newValue ) { hoistType = newValue; }
430
431        virtual ReferenceToType * clone() const override = 0;
432        virtual void accept( Visitor & v ) override = 0;
433        virtual Type * acceptMutator( Mutator & m ) override = 0;
434        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
435
436        virtual void lookup( __attribute__((unused)) const std::string & name, __attribute__((unused)) std::list< Declaration* > & foundDecls ) const {}
437  protected:
438        virtual std::string typeString() const = 0;
439};
440
441class StructInstType : public ReferenceToType {
442        typedef ReferenceToType Parent;
443  public:
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
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 ) {}
451
452        StructDecl * get_baseStruct() const { return baseStruct; }
453        void set_baseStruct( StructDecl * newValue ) { baseStruct = newValue; }
454
455        /// Accesses generic parameters of base struct (NULL if none such)
456        std::list<TypeDecl*> * get_baseParameters();
457        const std::list<TypeDecl*> * get_baseParameters() const;
458
459        virtual bool isComplete() const override;
460
461        virtual AggregateDecl * getAggr() const override;
462
463        virtual TypeSubstitution genericSubstitution() const override;
464
465        /// Looks up the members of this struct named "name" and places them into "foundDecls".
466        /// Clones declarations into "foundDecls", caller responsible for freeing
467        void lookup( const std::string & name, std::list< Declaration* > & foundDecls ) const override;
468
469        virtual StructInstType * clone() const override { return new StructInstType( *this ); }
470        virtual void accept( Visitor & v ) override { v.visit( this ); }
471        virtual void accept( Visitor & v ) const override { v.visit( this ); }
472        virtual Type * acceptMutator( Mutator & m ) override { return m.mutate( this ); }
473
474        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
475  private:
476        virtual std::string typeString() const override;
477};
478
479class UnionInstType : public ReferenceToType {
480        typedef ReferenceToType Parent;
481  public:
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
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 ) {}
489
490        UnionDecl * get_baseUnion() const { return baseUnion; }
491        void set_baseUnion( UnionDecl * newValue ) { baseUnion = newValue; }
492
493        /// Accesses generic parameters of base union (NULL if none such)
494        std::list<TypeDecl*> * get_baseParameters();
495        const std::list<TypeDecl*> * get_baseParameters() const;
496
497        virtual bool isComplete() const override;
498
499        virtual AggregateDecl * getAggr() const override;
500
501        virtual TypeSubstitution genericSubstitution() const override;
502
503        /// looks up the members of this union named "name" and places them into "foundDecls"
504        /// Clones declarations into "foundDecls", caller responsible for freeing
505        void lookup( const std::string & name, std::list< Declaration* > & foundDecls ) const override;
506
507        virtual UnionInstType * clone() const override { return new UnionInstType( *this ); }
508        virtual void accept( Visitor & v ) override { v.visit( this ); }
509        virtual void accept( Visitor & v ) const override { v.visit( this ); }
510        virtual Type * acceptMutator( Mutator & m ) override { return m.mutate( this ); }
511
512        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
513  private:
514        virtual std::string typeString() const override;
515};
516
517class EnumInstType : public ReferenceToType {
518        typedef ReferenceToType Parent;
519  public:
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
522        EnumDecl * baseEnum = nullptr;
523
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 ) {}
527
528        EnumDecl * get_baseEnum() const { return baseEnum; }
529        void set_baseEnum( EnumDecl * newValue ) { baseEnum = newValue; }
530
531        virtual bool isComplete() const override;
532
533        virtual AggregateDecl * getAggr() const override;
534
535        virtual EnumInstType * clone() const override { return new EnumInstType( *this ); }
536        virtual void accept( Visitor & v ) override { v.visit( this ); }
537        virtual void accept( Visitor & v ) const override { v.visit( this ); }
538        virtual Type * acceptMutator( Mutator & m ) override { return m.mutate( this ); }
539
540        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
541  private:
542        virtual std::string typeString() const override;
543};
544
545class TraitInstType : public ReferenceToType {
546        typedef ReferenceToType Parent;
547  public:
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;
551
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 * >() );
554        TraitInstType( const TraitInstType & other );
555        ~TraitInstType();
556
557        virtual bool isComplete() const override;
558
559        virtual TraitInstType * clone() const override { return new TraitInstType( *this ); }
560        virtual void accept( Visitor & v ) override { v.visit( this ); }
561        virtual void accept( Visitor & v ) const override { v.visit( this ); }
562        virtual Type * acceptMutator( Mutator & m ) override { return m.mutate( this ); }
563  private:
564        virtual std::string typeString() const override;
565};
566
567class TypeInstType : public ReferenceToType {
568        typedef ReferenceToType Parent;
569  public:
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
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 );
578        ~TypeInstType();
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; }
584
585        virtual bool isComplete() const override;
586
587        virtual TypeInstType * clone() const override { return new TypeInstType( *this ); }
588        virtual void accept( Visitor & v ) override { v.visit( this ); }
589        virtual void accept( Visitor & v ) const override { v.visit( this ); }
590        virtual Type * acceptMutator( Mutator & m ) override { return m.mutate( this ); }
591        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
592  private:
593        virtual std::string typeString() const override;
594};
595
596class TupleType : public Type {
597  public:
598        std::list<Type *> types;
599        std::list<Declaration *> members;
600
601        TupleType( const Type::Qualifiers & tq, const std::list< Type * > & types, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
602        TupleType( const TupleType& );
603        virtual ~TupleType();
604
605        typedef std::list<Type*> value_type;
606        typedef value_type::iterator iterator;
607
608        std::list<Type *> & get_types() { return types; }
609        virtual unsigned size() const override { return types.size(); };
610
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
615        iterator begin() { return types.begin(); }
616        iterator end() { return types.end(); }
617
618        virtual Type * getComponent( unsigned i ) override {
619                assertf( i < size(), "TupleType::getComponent: index %d must be less than size %d", i, size() );
620                return *(begin()+i);
621        }
622
623        // virtual bool isComplete() const override { return true; } // xxx - not sure if this is right, might need to recursively check complete-ness
624
625        virtual TupleType * clone() const override { return new TupleType( *this ); }
626        virtual void accept( Visitor & v ) override { v.visit( this ); }
627        virtual void accept( Visitor & v ) const override { v.visit( this ); }
628        virtual Type * acceptMutator( Mutator & m ) override { return m.mutate( this ); }
629        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
630};
631
632class TypeofType : public Type {
633  public:
634        Expression * expr;              ///< expression to take the type of
635        bool is_basetypeof;             ///< true iff is basetypeof type
636
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,
639                const std::list< Attribute * > & attributes = std::list< Attribute * >() );
640        TypeofType( const TypeofType& );
641        virtual ~TypeofType();
642
643        Expression * get_expr() const { return expr; }
644        void set_expr( Expression * newValue ) { expr = newValue; }
645
646        virtual bool isComplete() const override { assert( false ); return false; }
647
648        virtual TypeofType * clone() const override { return new TypeofType( *this ); }
649        virtual void accept( Visitor & v ) override { v.visit( this ); }
650        virtual void accept( Visitor & v ) const override { v.visit( this ); }
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 ); }
670        virtual Type * acceptMutator( Mutator & m ) override { return m.mutate( this ); }
671        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
672};
673
674class AttrType : public Type {
675  public:
676        std::string name;
677        Expression * expr;
678        Type * type;
679        bool isType;
680
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 * >()  );
683        AttrType( const AttrType& );
684        virtual ~AttrType();
685
686        const std::string & get_name() const { return name; }
687        void set_name( const std::string & newValue ) { name = newValue; }
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
695        virtual bool isComplete() const override { assert( false ); } // xxx - not sure what to do here
696
697        virtual AttrType * clone() const override { return new AttrType( *this ); }
698        virtual void accept( Visitor & v ) override { v.visit( this ); }
699        virtual void accept( Visitor & v ) const override { v.visit( this ); }
700        virtual Type * acceptMutator( Mutator & m ) override { return m.mutate( this ); }
701        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
702};
703
704/// Represents the GCC built-in varargs type
705class VarArgsType : public Type {
706  public:
707        VarArgsType();
708        VarArgsType( Type::Qualifiers tq, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
709
710        virtual bool isComplete() const override{ return true; } // xxx - is this right?
711
712        virtual VarArgsType * clone() const override { return new VarArgsType( *this ); }
713        virtual void accept( Visitor & v ) override { v.visit( this ); }
714        virtual void accept( Visitor & v ) const override { v.visit( this ); }
715        virtual Type * acceptMutator( Mutator & m ) override { return m.mutate( this ); }
716        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
717};
718
719/// Represents a zero constant
720class ZeroType : public Type {
721  public:
722        ZeroType();
723        ZeroType( Type::Qualifiers tq, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
724
725        virtual ZeroType * clone() const override { return new ZeroType( *this ); }
726        virtual void accept( Visitor & v ) override { v.visit( this ); }
727        virtual void accept( Visitor & v ) const override { v.visit( this ); }
728        virtual Type * acceptMutator( Mutator & m ) override { return m.mutate( this ); }
729        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
730};
731
732/// Represents a one constant
733class OneType : public Type {
734  public:
735        OneType();
736        OneType( Type::Qualifiers tq, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
737
738        virtual OneType * clone() const override { return new OneType( *this ); }
739        virtual void accept( Visitor & v ) override { v.visit( this ); }
740        virtual void accept( Visitor & v ) const override { v.visit( this ); }
741        virtual Type * acceptMutator( Mutator & m ) override { return m.mutate( this ); }
742        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
743};
744
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 ); }
751        virtual void accept( Visitor & v ) const override { v.visit( this ); }
752        virtual Type * acceptMutator( Mutator & m ) override { return m.mutate( this ); }
753        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
754};
755
756
757bool isUnboundType(const Type * type);
758bool isUnboundType(const std::string & tname);
759
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.