aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@gcc.gnu.org>2019-12-07 00:43:45 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2019-12-07 00:43:45 +0100
commitbeefe639b25eb9855a12b1d1436bbbc6b88ac78e (patch)
treeb5b39b907c3380d8566db4059d20e12d8d43ca0d /gcc
parent1cd4fe3d4302f0db3dd38c720c69f0c51137ff13 (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/cp/call.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/ext/temp-extend1.C43
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 ();
+}