From: Richard Biener Date: Mon, 4 Dec 2023 13:03:37 +0000 (+0100) Subject: c/89270 - honor registered_builtin_types in type_for_size X-Git-Tag: basepoints/gcc-15~4005 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4dd02d62abd76a69f65d9f3fed6febeed53fc90a;p=thirdparty%2Fgcc.git c/89270 - honor registered_builtin_types in type_for_size The following fixes the intermediate conversions inserted by convert_to_integer when facing address-spaces and converts to their effective [u]intptr_t when they are registered_builtin_types by considering those also from c_common_type_for_size and not only from c_common_type_for_mode. PR c/89270 gcc/c-family/ * c-common.cc (c_common_type_for_size): Consider registered_builtin_types. gcc/testsuite/ * gcc.target/avr/pr89270.c: New testcase. --- diff --git a/gcc/c-family/c-common.cc b/gcc/c-family/c-common.cc index b2b70c993388..d175054dddb1 100644 --- a/gcc/c-family/c-common.cc +++ b/gcc/c-family/c-common.cc @@ -2362,6 +2362,15 @@ c_common_type_for_size (unsigned int bits, int unsignedp) return (unsignedp ? widest_unsigned_literal_type_node : widest_integer_literal_type_node); + for (tree t = registered_builtin_types; t; t = TREE_CHAIN (t)) + { + tree type = TREE_VALUE (t); + if (TREE_CODE (type) == INTEGER_TYPE + && bits == TYPE_PRECISION (type) + && !!unsignedp == !!TYPE_UNSIGNED (type)) + return type; + } + if (bits <= TYPE_PRECISION (intQI_type_node)) return unsignedp ? unsigned_intQI_type_node : intQI_type_node; diff --git a/gcc/testsuite/gcc.target/avr/pr89270.c b/gcc/testsuite/gcc.target/avr/pr89270.c new file mode 100644 index 000000000000..2b6e4a8aa5be --- /dev/null +++ b/gcc/testsuite/gcc.target/avr/pr89270.c @@ -0,0 +1,7 @@ +/* { dg-do compile } */ + +void test() +{ + extern const unsigned char __memx __data_load_end; + __uint24 top=(__uint24)&__data_load_end; +}