ast2firm: Implement casting from complex to real types.
[cparser] / type_t.h
index 48db72a..8e948cf 100644 (file)
--- a/type_t.h
+++ b/type_t.h
@@ -1,21 +1,6 @@
 /*
  * This file is part of cparser.
- * Copyright (C) 2007-2009 Matthias Braun <matze@braunis.de>
- *
- * 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 <matze@braunis.de>
  */
 #ifndef TYPE_T_H
 #define TYPE_T_H
@@ -56,7 +41,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;
@@ -222,13 +207,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));
@@ -286,6 +276,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.