mirror of
https://github.com/gcc-mirror/gcc.git
synced 2026-05-06 14:59:39 +02:00
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:
@@ -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;
|
||||
|
||||
16
gcc/testsuite/gcc.dg/complex-10.c
Normal file
16
gcc/testsuite/gcc.dg/complex-10.c
Normal 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);
|
||||
}
|
||||
Reference in New Issue
Block a user