source: src/SynTree/Type.cc @ c653b37

ADTaaron-thesisarm-ehast-experimentalcleanup-dtorsdeferred_resndemanglerenumforall-pointer-decayjacob/cs343-translationjenkins-sandboxnew-astnew-ast-unique-exprno_listpersistent-indexerpthread-emulationqualifiedEnum
Last change on this file since c653b37 was c653b37, checked in by Rob Schluntz <rschlunt@…>, 6 years ago

Merge branch 'master' of plg.uwaterloo.ca:/u/cforall/software/cfa/cfa-cc

  • Property mode set to 100644
File size: 4.0 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.cc --
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 : Fri Jun 22 10:17:19 2018
13// Update Count     : 39
14//
15#include "Type.h"
16
17#include "Attribute.h"                // for Attribute
18#include "Common/utility.h"           // for cloneAll, deleteAll, printAll
19#include "InitTweak/InitTweak.h"      // for getPointerBase
20#include "SynTree/BaseSyntaxNode.h"   // for BaseSyntaxNode
21#include "SynTree/Declaration.h"      // for TypeDecl
22#include "SynTree/TypeSubstitution.h" // for TypeSubstitution
23
24using namespace std;
25
26const char *BasicType::typeNames[] = {
27        "_Bool",
28        "char",
29        "signed char",
30        "unsigned char",
31        "signed short int",
32        "unsigned short int",
33        "signed int",
34        "unsigned int",
35        "signed long int",
36        "unsigned long int",
37        "signed long long int",
38        "unsigned long long int",
39        "float",
40        "double",
41        "long double",
42        "float _Complex",
43        "double _Complex",
44        "long double _Complex",
45        "float _Imaginary",
46        "double _Imaginary",
47        "long double _Imaginary",
48        "__int128",
49        "unsigned __int128",
50        "__float80",
51        "__float128"
52};
53static_assert(
54        sizeof(BasicType::typeNames)/sizeof(BasicType::typeNames[0]) == BasicType::NUMBER_OF_BASIC_TYPES,
55        "Each basic type name should have a corresponding kind enum value"
56);
57
58Type::Type( const Qualifiers &tq, const std::list< Attribute * > & attributes ) : tq( tq ), attributes( attributes ) {}
59
60Type::Type( const Type &other ) : BaseSyntaxNode( other ), tq( other.tq ) {
61        cloneAll( other.forall, forall );
62        cloneAll( other.attributes, attributes );
63}
64
65Type::~Type() {
66        deleteAll( forall );
67        deleteAll( attributes );
68}
69
70// These must remain in the same order as the corresponding bit fields.
71const char * Type::FuncSpecifiersNames[] = { "inline", "_Noreturn", "fortran" };
72const char * Type::StorageClassesNames[] = { "extern", "static", "auto", "register", "_Thread_local" };
73const char * Type::QualifiersNames[] = { "const", "restrict", "volatile", "lvalue", "mutex", "_Atomic" };
74
75Type * Type::stripDeclarator() {
76        Type * type, * at;
77        for ( type = this; (at = InitTweak::getPointerBase( type )); type = at );
78        return type;
79}
80
81Type * Type::stripReferences() {
82        Type * type;
83        ReferenceType * ref;
84        for ( type = this; (ref = dynamic_cast<ReferenceType *>( type )); type = ref->base );
85        return type;
86}
87
88int Type::referenceDepth() const { return 0; }
89
90TypeSubstitution Type::genericSubstitution() const { assertf( false, "Non-aggregate type: %s", toCString( this ) ); }
91
92void Type::print( std::ostream &os, Indenter indent ) const {
93        if ( ! forall.empty() ) {
94                os << "forall" << std::endl;
95                printAll( forall, os, indent+1 );
96                os << ++indent;
97        } // if
98
99        if ( ! attributes.empty() ) {
100                os << "with attributes" << endl;
101                printAll( attributes, os, indent+1 );
102        } // if
103
104        tq.print( os );
105}
106
107
108QualifiedType::QualifiedType( const Type::Qualifiers & tq, Type * parent, Type * child ) : Type( tq, {} ), parent( parent ), child( child ) {
109}
110
111QualifiedType::QualifiedType( const QualifiedType & other ) : Type( other ), parent( maybeClone( other.parent ) ), child( maybeClone( other.child ) ) {
112}
113
114QualifiedType::~QualifiedType() {
115        delete parent;
116        delete child;
117}
118
119void QualifiedType::print( std::ostream & os, Indenter indent ) const {
120        os << "Qualified Type: " << endl;
121        os << indent+1;
122        parent->print( os, indent+1 );
123        os << endl << indent+1;
124        child->print( os, indent+1 );
125        os << endl;
126        Type::print( os, indent+1 );
127}
128
129GlobalScopeType::GlobalScopeType() : Type( Type::Qualifiers(), {} ) {}
130
131void GlobalScopeType::print( std::ostream & os, Indenter ) const {
132        os << "Global Scope Type" << endl;
133}
134
135
136// Empty Variable declarations:
137const Type::FuncSpecifiers noFuncSpecifiers;
138const Type::StorageClasses noStorageClasses;
139const Type::Qualifiers noQualifiers;
140
141// Local Variables: //
142// tab-width: 4 //
143// mode: c++ //
144// compile-command: "make install" //
145// End: //
Note: See TracBrowser for help on using the repository browser.