aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/tree.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/pr68978.C39
4 files changed, 55 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d471721..9b8c2ff 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index ae176d0..250fe27 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ceba598..20ac322 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..1904532
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/pr68978.C
@@ -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> ();