re PR c++/83204 (c++ -std=c++14 ICE in maybe_undo_parenthesized_ref, at cp/semantics...
authorPaolo Carlini <paolo.carlini@oracle.com>
Thu, 8 Feb 2018 09:06:33 +0000 (09:06 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Thu, 8 Feb 2018 09:06:33 +0000 (09:06 +0000)
/cp
2018-02-08  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/83204
* pt.c (tsubst_copy_and_build): Use force_paren_expr for INDIRECT_REF.

/testsuite
2018-02-08  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/83204
* g++.dg/cpp0x/lambda/lambda-ice25.C: New.

From-SVN: r257478

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice25.C [new file with mode: 0644]

index 0b710e9..b898ba1 100644 (file)
@@ -1,3 +1,8 @@
+2018-02-08  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/83204
+       * pt.c (tsubst_copy_and_build): Use force_paren_expr for INDIRECT_REF.
+
 2018-02-07  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/84082
index 0d9e153..a9e4770 100644 (file)
@@ -17224,8 +17224,8 @@ tsubst_copy_and_build (tree t,
          r = build_x_indirect_ref (input_location, r, RO_UNARY_STAR,
                                    complain|decltype_flag);
 
-       if (TREE_CODE (r) == INDIRECT_REF)
-         REF_PARENTHESIZED_P (r) = REF_PARENTHESIZED_P (t);
+       if (REF_PARENTHESIZED_P (t))
+         r = force_paren_expr (r);
 
        RETURN (r);
       }
index 22ec5d1..16f2b1a 100644 (file)
@@ -1,3 +1,8 @@
+2018-02-08  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/83204
+       * g++.dg/cpp0x/lambda/lambda-ice25.C: New.
+
 2018-02-07  Will Schmidt  <will_schmidt@vnet.ibm.com>
 
        * gcc.target/powerpc/vsxcopy.c: Update scan-assembler stanzas.
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice25.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice25.C
new file mode 100644 (file)
index 0000000..1a33fb1
--- /dev/null
@@ -0,0 +1,27 @@
+// PR c++/83204
+// { dg-do compile { target c++11 } }
+
+int rand();
+
+template<typename T>
+struct s
+{
+    int count() { return rand(); }
+};
+
+template<typename v>
+void f(s<v> a)
+{
+    int const x = a.count();
+    int r = 0;
+    auto l = [&](int& r)
+    {
+        for(int y = 0, yend = (x); y < yend; ++y)
+        {
+            r += y;
+        }
+    };
+    l(r);
+}
+
+template void f(s<float>);