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>
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;
--- /dev/null
+/* { 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);
+}