From 9edc6e4cf97d207b3c0e12096cc1e733d36a81e1 Mon Sep 17 00:00:00 2001 From: DJ Delorie Date: Tue, 14 Oct 2014 16:53:29 -0400 Subject: [PATCH] More missed bits from the big __intN patch From-SVN: r216222 --- gcc/c/c-decl.c | 5 +---- gcc/cp/typeck.c | 34 ++++++++++++++++++++-------------- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index 2900c711b0b..d9941141041 100644 --- a/gcc/c/c-decl.c +++ b/gcc/c/c-decl.c @@ -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); diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index bc30a0800e1..99f4b8830d2 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -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); -- 2.30.2