build_cxx_call calls convert_from_reference at the end, so if an immediate function returns a reference, we were constant evaluating not just that call, but that call wrapped in an INDIRECT_REF. That unfortunately means it can constant evaluate to something non-addressable, so if code later needs to take its address it will fail. The following patch fixes that by undoing the convert_from_reference wrapping for the cxx_constant_value evaluation and readdding it ad the end. 2021-03-12 Jakub Jelinek <jakub@redhat.com> PR c++/99507 * call.c (build_over_call): For immediate evaluation of functions that return references, undo convert_from_reference effects before calling cxx_constant_value and call convert_from_reference afterwards. * g++.dg/cpp2a/consteval19.C: New test.
7 lines
142 B
C
7 lines
142 B
C
// PR c++/99507
|
|
// { dg-do compile { target c++20 } }
|
|
|
|
constexpr int i{0};
|
|
consteval const int &iref () { return i; }
|
|
const int *a{&iref ()};
|