re PR c++/92831 (CWG1299 extend_ref_init_temps_1 punts on COND_EXPRs)
authorJakub Jelinek <jakub@gcc.gnu.org>
Fri, 6 Dec 2019 23:43:45 +0000 (00:43 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 6 Dec 2019 23:43:45 +0000 (00:43 +0100)
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

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/temp-extend1.C [new file with mode: 0644]

index b4bdb894ecf91640e20d6292ccb001a54c7a6c3d..5cb63da5a882181e6f1671b0f187325c9f9297e9 100644 (file)
@@ -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
index af36f5f919efbb32035800a89fb2451f4c760cb8..ce942977f45e350e12418edba44739b75e2265b5 100644 (file)
@@ -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);
index 3c59ce91f1a688e46d028c8b48243fd4d0ebe4c6..460cff00dd15a47bac54d37c8b9aeb8829bdf0da 100644 (file)
@@ -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 (file)
index 0000000..7df9ca5
--- /dev/null
@@ -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 ();
+}