c: Handle REALPART_EXPR and IMAGPART_EXPR in fold_offsetof [PR105555]

In some cases the C front-end calls into fold_offsetof to fold
an address but that does not handle REALPART_EXPR nor IMAGPART_EXPR so
gcc produces an internal compiler error. For offsetof, REALPART_EXPR/IMAGPART_EXPR
won't show up which is why they were not there before.

Bootstrapped and tested on x86_64-linux-gnu.

	PR c/105555

gcc/c-family/ChangeLog:

	* c-common.cc (fold_offsetof): Handle REALPART_EXPR
	and IMAGPART_EXPR.

gcc/testsuite/ChangeLog:

	* gcc.dg/complex-10.c: New test.

Signed-off-by: Andrew Pinski <andrew.pinski@oss.qualcomm.com>
This commit is contained in:
Andrew Pinski
2026-02-12 09:07:10 -08:00
parent 12f461009b
commit bfeb09e591
2 changed files with 26 additions and 0 deletions

View File

@@ -7232,6 +7232,16 @@ fold_offsetof (tree expr, tree type, enum tree_code ctx)
case ERROR_MARK:
return expr;
case REALPART_EXPR:
return fold_offsetof (TREE_OPERAND (expr, 0), type, code);
case IMAGPART_EXPR:
base = fold_offsetof (TREE_OPERAND (expr, 0), type, code);
if (base == error_mark_node)
return base;
off = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (TREE_OPERAND (expr, 0))));
break;
case VAR_DECL:
error ("cannot apply %<offsetof%> to static data member %qD", expr);
return error_mark_node;

View File

@@ -0,0 +1,16 @@
/* { dg-do compile } */
/* { dg-options "" } */
/* PR c/105555 */
struct C {
__complex int i;
};
struct C p[10];
int *foo1(void) {
return &__real(p->i);
}
int *foo2(void) {
return &__imag(p->i);
}