source: src/AST/Type.cpp @ bccd70a

ast-experimental
Last change on this file since bccd70a was fac05b3, checked in by Andrew Beach <ajbeach@…>, 15 months ago

Removed members from TupleType?. They were only used in one place, CurrentObject?. That now has a patch to create its own imaginary members.

  • Property mode set to 100644
File size: 5.5 KB
RevLine 
[69bafd2]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.cpp --
8//
9// Author           : Aaron B. Moss
10// Created On       : Mon May 13 15:00:00 2019
[923d25a]11// Last Modified By : Andrew Beach
[fac05b3]12// Last Modified On : Thu Apr  6 15:59:00 2023
13// Update Count     : 7
[69bafd2]14//
15
16#include "Type.hpp"
17
18#include <cassert>
19#include <utility>               // for move
20#include <vector>
21
22#include "Decl.hpp"
23#include "Init.hpp"
[e01eb4a]24#include "Inspect.hpp"
[e0e9a0b]25#include "Common/utility.h"      // for copy, move
[69bafd2]26#include "Tuples/Tuples.h"       // for isTtype
27
28namespace ast {
29
[d76c588]30const Type * Type::getComponent( unsigned i ) const {
[69bafd2]31        assertf( size() == 1 && i == 0, "Type::getComponent was called with size %d and index %d\n", size(), i );
32        return this;
33}
34
[d76c588]35const Type * Type::stripDeclarator() const {
[69bafd2]36        const Type * t;
37        const Type * a;
[e01eb4a]38        for ( t = this; (a = ast::getPointerBase( t )); t = a );
[69bafd2]39        return t;
40}
41
[d76c588]42const Type * Type::stripReferences() const {
[69bafd2]43        const Type * t;
44        const ReferenceType * r;
[acd80b4]45        for ( t = this; (r = dynamic_cast<const ReferenceType *>(t) ); t = r->base );
[69bafd2]46        return t;
47}
48
49// --- BasicType
50
[cfaa2873]51// GENERATED START, DO NOT EDIT
52// GENERATED BY BasicTypes-gen.cc
53const char * BasicType::typeNames[] = {
[69bafd2]54        "_Bool",
55        "char",
56        "signed char",
57        "unsigned char",
58        "signed short int",
59        "unsigned short int",
60        "signed int",
61        "unsigned int",
62        "signed long int",
63        "unsigned long int",
64        "signed long long int",
65        "unsigned long long int",
66        "__int128",
67        "unsigned __int128",
68        "_Float16",
69        "_Float16 _Complex",
70        "_Float32",
71        "_Float32 _Complex",
72        "float",
73        "float _Complex",
74        "_Float32x",
75        "_Float32x _Complex",
76        "_Float64",
77        "_Float64 _Complex",
78        "double",
79        "double _Complex",
80        "_Float64x",
81        "_Float64x _Complex",
82        "__float80",
83        "_Float128",
84        "_Float128 _Complex",
85        "__float128",
86        "long double",
87        "long double _Complex",
88        "_Float128x",
89        "_Float128x _Complex",
90};
[cfaa2873]91// GENERATED END
[69bafd2]92
93// --- FunctionType
94namespace {
[954c954]95        bool containsTtype( const std::vector<ptr<Type>> & l ) {
[69bafd2]96                if ( ! l.empty() ) {
[954c954]97                        return Tuples::isTtype( l.back() );
[69bafd2]98                }
99                return false;
100        }
101}
102
103bool FunctionType::isTtype() const {
[acd80b4]104        return containsTtype( returns ) || containsTtype( params );
[69bafd2]105}
106
[cd59d28]107// --- BaseInstType
108
[98e8b3b]109std::vector<readonly<Decl>> BaseInstType::lookup( const std::string& name ) const {
[69bafd2]110        assertf( aggr(), "Must have aggregate to perform lookup" );
[acd80b4]111
[69bafd2]112        std::vector<readonly<Decl>> found;
113        for ( const Decl * decl : aggr()->members ) {
114                if ( decl->name == name ) { found.emplace_back( decl ); }
115        }
116        return found;
117}
118
[923d25a]119// --- SueInstType (StructInstType, UnionInstType, EnumInstType)
[69bafd2]120
[923d25a]121template<typename decl_t>
122SueInstType<decl_t>::SueInstType(
[cd59d28]123        const base_type * b, CV::Qualifiers q, std::vector<ptr<Attribute>>&& as )
124: BaseInstType( b->name, q, std::move(as) ), base( b ) {}
[69bafd2]125
[3aec25f]126template<typename decl_t>
127SueInstType<decl_t>::SueInstType(
128        const base_type * b, std::vector<ptr<Expr>> && params,
129        CV::Qualifiers q, std::vector<ptr<Attribute>> && as )
130: BaseInstType( b->name, std::move(params), q, std::move(as) ), base( b ) {}
131
[923d25a]132template<typename decl_t>
133bool SueInstType<decl_t>::isComplete() const {
134        return base ? base->body : false;
135}
[69bafd2]136
[923d25a]137template class SueInstType<StructDecl>;
138template class SueInstType<UnionDecl>;
139template class SueInstType<EnumDecl>;
[69bafd2]140
[514a791]141// --- TraitInstType
142
[7ff3e522]143TraitInstType::TraitInstType(
[e0e9a0b]144        const TraitDecl * b, CV::Qualifiers q, std::vector<ptr<Attribute>>&& as )
[09f34a84]145: BaseInstType( b->name, q, std::move(as) ), base( b ) {}
[514a791]146
[cd59d28]147// --- TypeInstType
148
[93c10de]149TypeInstType::TypeInstType( const TypeEnvKey & key )
150: BaseInstType(key.base->name), base(key.base), kind(key.base->kind), formal_usage(key.formal_usage), expr_id(key.expr_id) {}
151
[63d1ebe]152bool TypeInstType::operator==( const TypeInstType & other ) const {
153        return base == other.base
154                && formal_usage == other.formal_usage
155                && expr_id == other.expr_id;
156}
157
[b230091]158TypeInstType::TypeInstType( const TypeDecl * b,
159        CV::Qualifiers q, std::vector<ptr<Attribute>> && as )
[09f34a84]160: BaseInstType( b->name, q, std::move(as) ), base( b ), kind( b->kind ) {}
[b230091]161
[69bafd2]162void TypeInstType::set_base( const TypeDecl * b ) {
163        base = b;
164        kind = b->kind;
165}
166
167bool TypeInstType::isComplete() const { return base->sized; }
168
[93c10de]169std::string TypeEnvKey::typeString() const {
[63d1ebe]170        return std::string("_") + std::to_string(formal_usage)
171                + "_" + std::to_string(expr_id) + "_" + base->name;
172}
173
[93c10de]174bool TypeEnvKey::operator==(
175                const TypeEnvKey & other ) const {
[63d1ebe]176        return base == other.base
177                && formal_usage == other.formal_usage
178                && expr_id == other.expr_id;
179}
180
[93c10de]181bool TypeEnvKey::operator<(
182                const TypeEnvKey & other ) const {
[63d1ebe]183        // TypeEnvKey ordering is an arbitrary total ordering.
184        // It doesn't mean anything but allows for a sorting.
185        if ( base < other.base ) {
186                return true;
187        } else if ( other.base < base ) {
188                return false;
189        } else if ( formal_usage < other.formal_usage ) {
190                return true;
191        } else if ( other.formal_usage < formal_usage ) {
192                return false;
193        } else {
194                return expr_id < other.expr_id;
195        }
196}
197
[69bafd2]198// --- TupleType
199
[acd80b4]200TupleType::TupleType( std::vector<ptr<Type>> && ts, CV::Qualifiers q )
[fac05b3]201: Type( q ), types( std::move(ts) ) {}
[69bafd2]202
[e5c3811]203bool isUnboundType(const Type * type) {
204        if (auto typeInst = dynamic_cast<const TypeInstType *>(type)) {
205                // xxx - look for a type name produced by renameTyVars.
206
207                // TODO: once TypeInstType representation is updated, it should properly check
208                // if the context id is filled. this is a temporary hack for now
[3e5dd913]209                return typeInst->formal_usage > 0;
[e5c3811]210        }
211        return false;
212}
213
[69bafd2]214}
215
216// Local Variables: //
217// tab-width: 4 //
218// mode: c++ //
219// compile-command: "make install" //
220// End: //
Note: See TracBrowser for help on using the repository browser.