Message ID | 20231204132429.AB3CA13588@imap2.dmz-prg2.suse.org |
---|---|
State | New |
Headers | show |
Series | c/89270 - honor registered_builtin_types in type_for_size | expand |
On Mon, 4 Dec 2023, Richard Biener wrote: > 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. > > Bootstrap and regtest on x86_64-unknown-linux-gnu, OK? OK, but I also think AVR should define its __int24 type using INT_N in avr-modes.def, which should also serve to avoid this problem.
diff --git a/gcc/c-family/c-common.cc b/gcc/c-family/c-common.cc index b2b70c99338..d175054dddb 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 00000000000..2b6e4a8aa5b --- /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; +}