More missed bits from the big __intN patch
authorDJ Delorie <dj@gcc.gnu.org>
Tue, 14 Oct 2014 20:53:29 +0000 (16:53 -0400)
committerDJ Delorie <dj@gcc.gnu.org>
Tue, 14 Oct 2014 20:53:29 +0000 (16:53 -0400)
From-SVN: r216222

gcc/c/c-decl.c
gcc/cp/typeck.c

index 2900c711b0b904bbef62bd6205e1a4461094e20e..d9941141041ed1fc09a5deabd8a5c2c0f38caf52 100644 (file)
@@ -9711,10 +9711,7 @@ declspecs_add_type (location_t loc, struct c_declspecs *specs,
            case RID_INT_N_2:
            case RID_INT_N_3:
              specs->int_n_idx = i - RID_INT_N_0;
-             if (!in_system_header_at (input_location)
-                 /* As a special exception, allow a type that's used
-                    for __SIZE_TYPE__.  */
-                 && int_n_data[specs->int_n_idx].bitsize != POINTER_SIZE)
+             if (!in_system_header_at (input_location))
                pedwarn (loc, OPT_Wpedantic,
                         "ISO C does not support %<__int%d%> types",
                         int_n_data[specs->int_n_idx].bitsize);
index bc30a0800e1699330505d01156bf825222dba38b..99f4b8830d2b7424b42a49ebc562903e68de1dab 100644 (file)
@@ -365,20 +365,6 @@ cp_common_type (tree t1, tree t2)
                    : long_long_integer_type_node);
          return build_type_attribute_variant (t, attributes);
        }
-      for (i = 0; i < NUM_INT_N_ENTS; i ++)
-       {
-         if (int_n_enabled_p [i]
-             && (same_type_p (TYPE_MAIN_VARIANT (t1),
-                              int_n_trees[i].signed_type)
-                 || same_type_p (TYPE_MAIN_VARIANT (t2),
-                                 int_n_trees[i].signed_type)))
-           {
-             tree t = ((TYPE_UNSIGNED (t1) || TYPE_UNSIGNED (t2))
-                       ? int_n_trees[i].unsigned_type
-                       : int_n_trees[i].signed_type);
-             return build_type_attribute_variant (t, attributes);
-           }
-       }
 
       /* Go through the same procedure, but for longs.  */
       if (same_type_p (TYPE_MAIN_VARIANT (t1), long_unsigned_type_node)
@@ -392,6 +378,26 @@ cp_common_type (tree t1, tree t2)
                    ? long_unsigned_type_node : long_integer_type_node);
          return build_type_attribute_variant (t, attributes);
        }
+
+      /* For __intN types, either the type is __int128 (and is lower
+        priority than the types checked above, but higher than other
+        128-bit types) or it's known to not be the same size as other
+        types (enforced in toplev.c).  Prefer the unsigned type. */
+      for (i = 0; i < NUM_INT_N_ENTS; i ++)
+       {
+         if (int_n_enabled_p [i]
+             && (same_type_p (TYPE_MAIN_VARIANT (t1), int_n_trees[i].signed_type)
+                 || same_type_p (TYPE_MAIN_VARIANT (t2), int_n_trees[i].signed_type)
+                 || same_type_p (TYPE_MAIN_VARIANT (t1), int_n_trees[i].unsigned_type)
+                 || same_type_p (TYPE_MAIN_VARIANT (t2), int_n_trees[i].unsigned_type)))
+           {
+             tree t = ((TYPE_UNSIGNED (t1) || TYPE_UNSIGNED (t2))
+                       ? int_n_trees[i].unsigned_type
+                       : int_n_trees[i].signed_type);
+             return build_type_attribute_variant (t, attributes);
+           }
+       }
+
       /* Otherwise prefer the unsigned one.  */
       if (TYPE_UNSIGNED (t1))
        return build_type_attribute_variant (t1, attributes);