https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117490
Bug ID: 117490
Summary: Invalid TBAA for structures without tag and identical
definition in C.
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: keinfluegeltier at posteo dot de
Target Milestone: ---
Taken from https://github.com/llvm/llvm-project/issues/115252:
typedef struct {
int i1;
} s1;
typedef struct {
int i1;
} s2_alt;
int f2(s1 *s1p, s2_alt *s2p) {
s1p->i1 = 2;
s2p->i1 = 3;
return s1p->i1 * 3;
}
With -O2 or higher GCC constant-folds the return value to 6.
This is not correct in C. If another translation unit contains
typedef struct {
int i1;
} s3;
then a call
s3 x;
f2(&x, &x);
must return 9.
This is because s3 in the second translation unit is compatible with both s1
and s2_alt in the first translation unit and therefore access through both s1
and s2_alt is not an aliasing violation. See the rules for cross-translation
unit type compatibility of structures without tags in (N3220) ยง6.2.7.
I think in C++ the optimization is valid, because type identity is instead
established by the (first) typedef name.