PR c++/80639 - ICE with invalid PMF initialization.
authorJason Merrill <jason@redhat.com>
Sat, 17 Jun 2017 02:27:33 +0000 (22:27 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Sat, 17 Jun 2017 02:27:33 +0000 (22:27 -0400)
PR c++/80043 - ICE with -fpermissive
* typeck.c (convert_for_assignment): Recurse when instantiate_type
returns without an error.

From-SVN: r249317

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

index ce1e8d09c77b8029b8f5f62d0f6c4a2daa0729bd..a2144c2113267366b73581a800cf8a0720f7217e 100644 (file)
@@ -1,3 +1,10 @@
+2017-06-16  Jason Merrill  <jason@redhat.com>
+
+       PR c++/80639 - ICE with invalid PMF initialization.
+       PR c++/80043 - ICE with -fpermissive
+       * typeck.c (convert_for_assignment): Recurse when instantiate_type
+       returns without an error.
+
 2017-06-16  Nathan Sidwell  <nathan@acm.org>
 
        * pt.c (tsubst_baselink): Fix & clarify formatting.
index 05b4fbb79d31009e27b36bf3cf99bc4b50e07408..0f22e649edd3657477edcf2107502334b57fd336 100644 (file)
@@ -8590,9 +8590,10 @@ convert_for_assignment (tree type, tree rhs,
              if (rhstype == unknown_type_node)
                {
                  tree r = instantiate_type (type, rhs, tf_warning_or_error);
-                 /* -fpermissive might allow this.  */
+                 /* -fpermissive might allow this; recurse.  */
                  if (!seen_error ())
-                   return r;
+                   return convert_for_assignment (type, r, errtype, fndecl,
+                                                  parmnum, complain, flags);
                }
              else if (fndecl)
                error ("cannot convert %qH to %qI for argument %qP to %qD",
diff --git a/gcc/testsuite/g++.dg/template/ptrmem31.C b/gcc/testsuite/g++.dg/template/ptrmem31.C
new file mode 100644 (file)
index 0000000..5c66b72
--- /dev/null
@@ -0,0 +1,23 @@
+// PR c++/80639
+// { dg-do compile { target c++14 } }
+
+template < typename > struct A;
+
+struct B
+{ 
+  template < int > void m ();
+  template < int > struct K { static void n (); };
+  void p () { K < 0 >::n (); }
+};
+
+template <> struct A < B >
+{ 
+  using T = void (A::*)();
+  template < int u > static constexpr T h = &B::m < u >; // { dg-error "cannot convert" }
+};
+
+template < int v > void B::K < v >::n ()
+{ 
+  using S = A < B >;
+  S::h < 0 >;
+}