[Bug c++/92831] New: extend_ref_init_temps_1 punts on COND_EXPRs
jakub at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Dec 5 18:28:00 GMT 2019
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92831
Bug ID: 92831
Summary: extend_ref_init_temps_1 punts on COND_EXPRs
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: jakub at gcc dot gnu.org
Target Milestone: ---
http://eel.is/c++draft/class.temporary#6.7
says that even ?: second and third operands need to be handled, but short
testcase modified from the standard one:
template<typename T> using id = T;
int i = 1;
int&& a = id<int[3]>{1, 2, 3}[i]; // temporary array has same
lifetime as a
const int& b = static_cast<const int&>(0); // temporary int has same lifetime
as b
int&& c = cond ? id<int[3]>{1, 2, 3}[i] : static_cast<int&&>(0);
// exactly one of the two
temporaries is lifetime-extended
like:
template<typename T> using id = T;
struct S { S () { s++; } ~S () { s--; } S (int) { s++; } static int s; };
int S::s = 0;
void
bar (bool cond)
{
if (S::s != (cond ? 7 : 5))
__builtin_abort ();
}
void
foo (bool cond)
{
int i = 1;
// temporary array has same lifetime as a
S&& a = id<S[3]>{1, 2, 3}[i];
// temporary S has same lifetime as b
const S& b = static_cast<const S&>(0);
// exactly one of the two temporaries is lifetime-extended
S&& c = cond ? id<S[3]>{1, 2, 3}[i] : static_cast<S&&>(0);
bar (cond);
}
int
main ()
{
foo (true);
foo (false);
}
fails with g++ and succeeds with clang++.
More information about the Gcc-bugs
mailing list