]> git.ipfire.org Git - thirdparty/gcc.git/commit
C: allow aliasing of compatible types derived from enumeral types [PR115157]
authorMartin Uecker <uecker@tugraz.at>
Sun, 19 May 2024 21:13:22 +0000 (23:13 +0200)
committerMartin Uecker <uecker@tugraz.at>
Fri, 31 May 2024 05:12:15 +0000 (07:12 +0200)
commit867d1264fe71d4291194373d1a1c409cac97a597
treeb896fb85929496471c245be26c93ad6576266452
parent3a873c0a7bc8183de95a6103b507101a25eed413
C: allow aliasing of compatible types derived from enumeral types [PR115157]

Aliasing of enumeral types with the underlying integer is now allowed
by setting the aliasing set to zero.  But this does not allow aliasing
of derived types which are compatible as required by ISO C.  Instead,
initially set structural equality.  Then set TYPE_CANONICAL and update
pointers and main variants when the type is completed (as done for
structures and unions in C23).

PR tree-optimization/115157
PR tree-optimization/115177

gcc/c/
* c-decl.cc (shadow_tag-warned,parse_xref_tag,start_enum,
finish_enum): Set SET_TYPE_STRUCTURAL_EQUALITY / TYPE_CANONICAL.
* c-objc-common.cc (get_alias_set): Remove special case.
(get_aka_type): Add special case.

gcc/c-family/
* c-attribs.cc (handle_hardbool_attribute): Set TYPE_CANONICAL
for hardbools.

gcc/
* godump.cc (go_output_typedef): Use TYPE_MAIN_VARIANT instead
of TYPE_CANONICAL.

gcc/testsuite/
* gcc.dg/enum-alias-1.c: New test.
* gcc.dg/enum-alias-2.c: New test.
* gcc.dg/enum-alias-3.c: New test.
* gcc.dg/enum-alias-4.c: New test.
gcc/c-family/c-attribs.cc
gcc/c/c-decl.cc
gcc/c/c-objc-common.cc
gcc/godump.cc
gcc/testsuite/gcc.dg/enum-alias-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/enum-alias-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/enum-alias-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/enum-alias-4.c [new file with mode: 0644]