Hi! When looking at constexpr references, I've noticed staticp handles COMPONENT_REFs and ARRAY_REFs (the latter if the index is INTEGER_CST), but not {REAL,IMAG}PART_EXPR. I think that is incorrect and causes rejection of constexpr (for C++) or static const (for C) addresses of __real__ or __imag__ parts of static vars.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2025-08-27 Jakub Jelinek <ja...@redhat.com> PR c++/121678 * tree.cc (staticp): Handle REALPART_EXPR and IMAGPART_EXPR. * g++.dg/ext/pr121678.C: New test. * gcc.dg/pr121678.c: New test. --- gcc/tree.cc.jj 2025-08-23 15:00:05.019777931 +0200 +++ gcc/tree.cc 2025-08-26 17:55:55.786162975 +0200 @@ -3935,6 +3935,10 @@ staticp (tree arg) else return NULL; + case REALPART_EXPR: + case IMAGPART_EXPR: + return staticp (TREE_OPERAND (arg, 0)); + case COMPOUND_LITERAL_EXPR: return TREE_STATIC (COMPOUND_LITERAL_EXPR_DECL (arg)) ? arg : NULL; --- gcc/testsuite/g++.dg/ext/pr121678.C.jj 2025-08-26 18:21:05.593623718 +0200 +++ gcc/testsuite/g++.dg/ext/pr121678.C 2025-08-26 18:21:22.661403914 +0200 @@ -0,0 +1,7 @@ +// PR c++/121678 +// { dg-do compile { target c++11 } } +// { dg-options "" } + +static constexpr _Complex double a = 1.0; +static constexpr double *r = &__real__ a; +static constexpr double *i = &__imag__ a; --- gcc/testsuite/gcc.dg/pr121678.c.jj 2025-08-26 18:20:08.453359588 +0200 +++ gcc/testsuite/gcc.dg/pr121678.c 2025-08-26 18:20:37.667983352 +0200 @@ -0,0 +1,7 @@ +/* PR c++/121678 */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +static const _Complex double a = 1.0; +static const double *const r = &__real__ a; +static const double *const i = &__imag__ a; Jakub