diff options
author | Jakub Jelinek <jakub@gcc.gnu.org> | 2019-12-07 00:43:45 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2019-12-07 00:43:45 +0100 |
commit | beefe639b25eb9855a12b1d1436bbbc6b88ac78e (patch) | |
tree | b5b39b907c3380d8566db4059d20e12d8d43ca0d /gcc | |
parent | 1cd4fe3d4302f0db3dd38c720c69f0c51137ff13 (diff) | |
download | gcc-beefe639b25eb9855a12b1d1436bbbc6b88ac78e.zip gcc-beefe639b25eb9855a12b1d1436bbbc6b88ac78e.tar.gz gcc-beefe639b25eb9855a12b1d1436bbbc6b88ac78e.tar.bz2 |
re PR c++/92831 (CWG1299 extend_ref_init_temps_1 punts on COND_EXPRs)
PR c++/92831
* call.c (build_conditional_expr_1): For ?: with omitted middle
operand use cp_stabilize_reference if arg1 is glvalue_p rather than
just if it is lvalue_p.
* g++.dg/ext/temp-extend1.C: New test.
From-SVN: r279069
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/call.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/temp-extend1.C | 43 |
4 files changed, 57 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b4bdb89..5cb63da 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2019-12-07 Jason Merrill <jason@redhat.com> + Jakub Jelinek <jakub@redhat.com> + + PR c++/92831 + * call.c (build_conditional_expr_1): For ?: with omitted middle + operand use cp_stabilize_reference if arg1 is glvalue_p rather than + just if it is lvalue_p. + 2019-12-06 Jakub Jelinek <jakub@redhat.com> * parser.c (cp_parser_diagnose_invalid_type_name): Mention diff --git a/gcc/cp/call.c b/gcc/cp/call.c index af36f5f..ce94297 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -5077,7 +5077,7 @@ build_conditional_expr_1 (const op_location_t &loc, warn_for_omitted_condop (loc, arg1); /* Make sure that lvalues remain lvalues. See g++.oliva/ext1.C. */ - if (lvalue_p (arg1)) + if (glvalue_p (arg1)) arg2 = arg1 = cp_stabilize_reference (arg1); else arg2 = arg1 = cp_save_expr (arg1); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3c59ce9..460cff0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-12-07 Jakub Jelinek <jakub@redhat.com> + + PR c++/92831 + * g++.dg/ext/temp-extend1.C: New test. + 2019-12-06 Marek Polacek <polacek@redhat.com> PR c++/92451 diff --git a/gcc/testsuite/g++.dg/ext/temp-extend1.C b/gcc/testsuite/g++.dg/ext/temp-extend1.C new file mode 100644 index 0000000..7df9ca5 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/temp-extend1.C @@ -0,0 +1,43 @@ +// PR c++/92831 +// { dg-do run { target c++11 } } +// { dg-options "" } + +template<typename T> using id = T; +struct S { S () : s (false) { ++c; } S (bool x) : s (x) { ++c; } ~S () { --c; }; bool s; static int c; }; +int S::c = 0; + +void +foo (int i) +{ + const bool&& a + = id<S[3]>{false, true, false}[i].s + ? id<S[2]>{true, false}[i].s : id<S[4]>{true, false, true, false}[i].s; + if (S::c != (i ? 2 : 4)) + __builtin_abort (); +} + +void +baz (int i) +{ + const bool&& a = id<S[3]>{false, true, false}[i].s + ? : id<S[4]>{true, false, true, false}[i].s; + if (S::c != (i ? 3 : 4)) + __builtin_abort (); +} + +int +main () +{ + foo (0); + if (S::c != 0) + __builtin_abort (); + foo (1); + if (S::c != 0) + __builtin_abort (); + baz (0); + if (S::c != 0) + __builtin_abort (); + baz (1); + if (S::c != 0) + __builtin_abort (); +} |