re PR c++/86184 (Conditional expression with omitted operand cannot use rvalue of...
authorMarek Polacek <polacek@redhat.com>
Fri, 29 Jun 2018 15:25:14 +0000 (15:25 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Fri, 29 Jun 2018 15:25:14 +0000 (15:25 +0000)
PR c++/86184
* tree.c (cp_save_expr): Don't call save_expr for TARGET_EXPRs.

* g++.dg/ext/cond3.C: New test.

From-SVN: r262254

gcc/cp/ChangeLog
gcc/cp/tree.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/cond3.C [new file with mode: 0644]

index 906f0b41678d4b978a231d5e537c443018876fbc..556b154b14e99bd659b7946e2cc5bd5c3eb992c5 100644 (file)
@@ -1,3 +1,8 @@
+2018-06-29  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/86184
+       * tree.c (cp_save_expr): Don't call save_expr for TARGET_EXPRs.
+
 2018-06-28  David Malcolm  <dmalcolm@redhat.com>
 
        * parser.c (cp_parser_error_1): After issuing a conflict marker
index e7bd79b6276b7d30c5269f15d02332cf3cc68407..361248d4b52b37f38d225b844f71b122ace7fdec 100644 (file)
@@ -4918,6 +4918,11 @@ cp_save_expr (tree expr)
      tree codes.  */
   if (processing_template_decl)
     return expr;
+
+  /* TARGET_EXPRs are only expanded once.  */
+  if (TREE_CODE (expr) == TARGET_EXPR)
+    return expr;
+
   return save_expr (expr);
 }
 
index 9072c6d5dd638714e2aa85d7ab3e587876017f28..cc71d594739e9814f4f3914b61d7e844a539cea4 100644 (file)
@@ -1,3 +1,8 @@
+2018-06-29  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/86184
+       * g++.dg/ext/cond3.C: New test.
+
 2018-06-29  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * gcc.target/arm/arm-soft-strd-even.c: New test.
diff --git a/gcc/testsuite/g++.dg/ext/cond3.C b/gcc/testsuite/g++.dg/ext/cond3.C
new file mode 100644 (file)
index 0000000..6390dc4
--- /dev/null
@@ -0,0 +1,20 @@
+// PR c++/86184
+// { dg-do run }
+// { dg-options "" }
+
+int j;
+struct X {
+  X() { j++; }
+  operator bool() { return true; }
+};
+
+/* Only create X once.  */
+bool b = X() ?: false;
+bool b2 = X() ? X() : false;
+
+int
+main ()
+{
+  if (j != 3)
+    __builtin_abort ();
+}