diff options
| author | Andrew Pinski <andrew.pinski@oss.qualcomm.com> | 2026-02-12 09:07:10 -0800 |
|---|---|---|
| committer | Andrew Pinski <andrew.pinski@oss.qualcomm.com> | 2026-02-12 15:23:37 -0800 |
| commit | bfeb09e591b2ae629277d4ec6578c24998c77c3b (patch) | |
| tree | 7cd3cd8eae373b06fbb52f4cf2c2daea76d26073 | |
| parent | 12f461009b0e833e4a0404ab348c0fe5b7bbfc75 (diff) | |
| download | gcc-master.zip gcc-master.tar.gz gcc-master.tar.bz2 | |
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>
| -rw-r--r-- | gcc/c-family/c-common.cc | 10 | ||||
| -rw-r--r-- | gcc/testsuite/gcc.dg/complex-10.c | 16 |
2 files changed, 26 insertions, 0 deletions
diff --git a/gcc/c-family/c-common.cc b/gcc/c-family/c-common.cc index 22d5116..5acb221 100644 --- a/gcc/c-family/c-common.cc +++ b/gcc/c-family/c-common.cc @@ -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; diff --git a/gcc/testsuite/gcc.dg/complex-10.c b/gcc/testsuite/gcc.dg/complex-10.c new file mode 100644 index 0000000..b27f91f --- /dev/null +++ b/gcc/testsuite/gcc.dg/complex-10.c @@ -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); +} |
