Fix PR c++/68978 (bogus error: lvalue required as left operand of assignment)
authorPatrick Palka <ppalka@gcc.gnu.org>
Fri, 18 Dec 2015 23:16:33 +0000 (23:16 +0000)
committerPatrick Palka <ppalka@gcc.gnu.org>
Fri, 18 Dec 2015 23:16:33 +0000 (23:16 +0000)
gcc/cp/ChangeLog:

PR c++/68978
* tree.c (lvalue_kind) [MODOP_EXPR]: New case.

gcc/testsuite/ChangeLog:

PR c++/68978
* g++.dg/template/pr68978.C: New test.

From-SVN: r231841

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

index d471721f21c3cdf7a8eab370de0e221ea838eef6..9b8c2ffc6f49579e3219c69d1251236d4c6bfcac 100644 (file)
@@ -1,3 +1,8 @@
+2015-12-18  Patrick Palka  <ppalka@gcc.gnu.org>
+
+       PR c++/68978
+       * tree.c (lvalue_kind) [MODOP_EXPR]: New case.
+
 2015-12-18  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/67592
index ae176d00f6d84800fda5c7b23b95b3a04e3489d5..250fe274669afcebf7504c84a3c25cd4153d7301 100644 (file)
@@ -185,6 +185,12 @@ lvalue_kind (const_tree ref)
       op2_lvalue_kind = lvalue_kind (TREE_OPERAND (ref, 2));
       break;
 
+    case MODOP_EXPR:
+      /* We expect to see unlowered MODOP_EXPRs only during
+        template processing.  */
+      gcc_assert (processing_template_decl);
+      return clk_ordinary;
+
     case MODIFY_EXPR:
     case TYPEID_EXPR:
       return clk_ordinary;
index ceba598dc4ebb7a50a80b07c781aa014347ae53e..20ac322ae5da00f1e1e81b6ee2cda159fb68a735 100644 (file)
@@ -1,3 +1,8 @@
+2015-12-18  Patrick Palka  <ppalka@gcc.gnu.org>
+
+       PR c++/68978
+       * g++.dg/template/pr68978.C: New test.
+
 2015-12-18  Jakub Jelinek  <jakub@redhat.com>
 
        PR debug/68860
diff --git a/gcc/testsuite/g++.dg/template/pr68978.C b/gcc/testsuite/g++.dg/template/pr68978.C
new file mode 100644 (file)
index 0000000..1904532
--- /dev/null
@@ -0,0 +1,39 @@
+// PR c++/68978
+
+int i = 0, c = 0, radix = 10, max = 0x7fffffff;
+
+template <typename T> int toi_1() {
+  if (max < ((i *= radix) += c))
+    return 0;
+  return i;
+}
+
+template <typename T> int toi_2() {
+  if (max < ((i = radix) = c))
+    return 0;
+  return i;
+}
+
+template <typename T> int toi_3() {
+  if (max < ((i = radix) += c))
+    return 0;
+  return i;
+}
+
+template <typename T> int toi_4() {
+  if (max < ((i += radix) = c))
+    return 0;
+  return i;
+}
+
+template <typename T> int toi_5() {
+  if (max < (((i = radix) += (c += 5)) *= 30))
+    return 0;
+  return i;
+}
+
+int x = toi_1<int> ();
+int y = toi_2<int> ();
+int z = toi_3<int> ();
+int w = toi_4<int> ();
+int r = toi_5<int> ();