source: src/SynTree/Type.cc @ 9a1e509

ADTaaron-thesisarm-ehast-experimentalcleanup-dtorsdeferred_resndemanglerenumforall-pointer-decayjacob/cs343-translationjenkins-sandboxnew-astnew-ast-unique-exprnew-envno_listpersistent-indexerpthread-emulationqualifiedEnumresolv-newwith_gc
Last change on this file since 9a1e509 was 0698aa1, checked in by Rob Schluntz <rschlunt@…>, 7 years ago

Add stripReferences, fix createDeref and makeSub to work with reference types

  • Property mode set to 100644
File size: 2.6 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 Mar 17 08:42:47 2017
13// Update Count     : 28
14//
15
16#include "SynTree.h"
17#include "Visitor.h"
18#include "Type.h"
19#include "Declaration.h"
20#include "Attribute.h"
21#include "InitTweak/InitTweak.h"
22#include "Common/utility.h"
23
24using namespace std;
25
26const char *BasicType::typeNames[BasicType::NUMBER_OF_BASIC_TYPES] = {
27        "_Bool",
28        "char",
29        "char",
30        "unsigned char",
31        "short",
32        "short unsigned",
33        "int",
34        "unsigned int",
35        "long int",
36        "long unsigned int",
37        "long long int",
38        "long long unsigned 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};
49
50Type::Type( const Qualifiers &tq, const std::list< Attribute * > & attributes ) : tq( tq ), attributes( attributes ) {}
51
52Type::Type( const Type &other ) : BaseSyntaxNode( other ), tq( other.tq ) {
53        cloneAll( other.forall, forall );
54        cloneAll( other.attributes, attributes );
55}
56
57Type::~Type() {
58        deleteAll( forall );
59        deleteAll( attributes );
60}
61
62// These must remain in the same order as the corresponding bit fields.
63const char * Type::FuncSpecifiersNames[] = { "inline", "fortran", "_Noreturn" };
64const char * Type::StorageClassesNames[] = { "extern", "static", "auto", "register", "_Thread_local" };
65const char * Type::QualifiersNames[] = { "const", "restrict", "volatile", "lvalue", "mutex", "_Atomic" };
66
67Type * Type::stripDeclarator() {
68        Type * type = this;
69        while ( Type * at = InitTweak::getPointerBase( type ) ) {
70                type = at;
71        }
72        return type;
73}
74
75Type * Type::stripReferences() {
76        Type * type = this;
77        while ( ReferenceType * ref = dynamic_cast<ReferenceType *>( type ) ) {
78                type = ref->get_base();
79        }
80        return type;
81}
82
83void Type::print( std::ostream &os, int indent ) const {
84        if ( ! forall.empty() ) {
85                os << "forall" << std::endl;
86                printAll( forall, os, indent + 4 );
87                os << std::string( indent+2, ' ' );
88        } // if
89
90        if ( ! attributes.empty() ) {
91                os << endl << string( indent+2, ' ' ) << "with attributes" << endl;
92                printAll( attributes, os, indent+4 );
93        } // if
94
95        tq.print( os );
96}
97
98std::ostream & operator<<( std::ostream & out, const Type * type ) {
99        if ( type ) {
100                type->print( out );
101        } else {
102                out << "nullptr";
103        } // if
104        return out;
105}
106
107// Local Variables: //
108// tab-width: 4 //
109// mode: c++ //
110// compile-command: "make install" //
111// End: //
Note: See TracBrowser for help on using the repository browser.