X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=type_t.h;h=262fb631d2d1f84c908f8ee5040fa3857063ce7f;hb=7473d9545525216a1276296dbc1759e07972cf96;hp=63b04b1fd88b3dd7c8fcd362803bbe1de307ef21;hpb=1a47a352dc074585e56b11a6e1e693e8ece6b5be;p=cparser diff --git a/type_t.h b/type_t.h index 63b04b1..262fb63 100644 --- a/type_t.h +++ b/type_t.h @@ -1,21 +1,6 @@ /* * This file is part of cparser. - * Copyright (C) 2007-2009 Matthias Braun - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. + * Copyright (C) 2012 Matthias Braun */ #ifndef TYPE_T_H #define TYPE_T_H @@ -25,11 +10,8 @@ #include +#include "ast.h" #include "type.h" -#include "symbol.h" -#include "token_t.h" -#include "ast_t.h" -#include "adt/obst.h" typedef enum type_kind_t { TYPE_ERROR = 1, @@ -56,7 +38,7 @@ struct type_base_t { }; /** - * used for atomic types, complex and imaginary + * used for atomic types, complex and imaginary and as base for enum */ struct atomic_type_t { type_base_t base; @@ -201,7 +183,16 @@ type_t *make_array_type(type_t *element_type, size_t size, type_qualifiers_t qualifiers); function_parameter_t *allocate_parameter(type_t*); +/** + * Duplicates a type. + * + * @param type The type to copy. + * @return A copy of the type. + * + * @note This does not produce a deep copy! + */ type_t *duplicate_type(const type_t *type); + type_t *identify_new_type(type_t *type); static inline bool is_typeref(const type_t *type) @@ -213,13 +204,18 @@ static inline bool is_type_atomic(const type_t *type, atomic_type_kind_t atype) { assert(!is_typeref(type)); - if(type->kind != TYPE_ATOMIC) + if (type->kind != TYPE_ATOMIC) return false; const atomic_type_t *atomic_type = &type->atomic; return atomic_type->akind == atype; } +static inline bool is_type_void(type_t const *const type) +{ + return is_type_atomic(type, ATOMIC_TYPE_VOID); +} + static inline bool is_type_pointer(const type_t *type) { assert(!is_typeref(type)); @@ -277,6 +273,19 @@ static inline unsigned get_akind_rank(atomic_type_kind_t akind) return atomic_type_properties[akind].rank; } +static inline bool is_akind_signed(atomic_type_kind_t akind) +{ + return atomic_type_properties[akind].flags & ATOMIC_TYPE_FLAG_SIGNED; +} + +static inline atomic_type_kind_t get_arithmetic_akind(const type_t *type) +{ + assert(type->kind == TYPE_ATOMIC || type->kind == TYPE_COMPLEX + || type->kind == TYPE_IMAGINARY || type->kind == TYPE_ENUM); + /* note that atomic, complex and enum share atomic_type_t base */ + return type->atomic.akind; +} + /** * Allocate a type node of given kind and initialize all * fields with zero.