PR c++/80043 - ICE with -fpermissive
authorJason Merrill <jason@redhat.com>
Wed, 15 Mar 2017 21:32:43 +0000 (17:32 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 15 Mar 2017 21:32:43 +0000 (17:32 -0400)
* typeck.c (convert_for_assignment): Handle instantiate_type
not giving an error.

From-SVN: r246180

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

index aa74b007628d358ee7fa7355cf9e9c6f7a1ed514..e5fa93aefb34c949ce5e73ad19d06700d8aa3927 100644 (file)
@@ -1,3 +1,9 @@
+2017-03-15  Jason Merrill  <jason@redhat.com>
+
+       PR c++/80043 - ICE with -fpermissive
+       * typeck.c (convert_for_assignment): Handle instantiate_type
+       not giving an error.
+
 2017-03-14  Nathan Sidwell  <nathan@acm.org>
 
        PR c++/79393 DR 1658 workaround
index d1111248dc70ab7d08ccebc280f4c3f342f03d27..4e9a1c0b6e768d3d1f777f800b917528a350241f 100644 (file)
@@ -8486,7 +8486,12 @@ convert_for_assignment (tree type, tree rhs,
                 overloaded function.  Call instantiate_type to get error
                 messages.  */
              if (rhstype == unknown_type_node)
-               instantiate_type (type, rhs, tf_warning_or_error);
+               {
+                 tree r = instantiate_type (type, rhs, tf_warning_or_error);
+                 /* -fpermissive might allow this.  */
+                 if (!seen_error ())
+                   return r;
+               }
              else if (fndecl)
                error ("cannot convert %qT to %qT for argument %qP to %qD",
                       rhstype, type, parmnum, fndecl);
diff --git a/gcc/testsuite/g++.dg/parse/ptrmem7.C b/gcc/testsuite/g++.dg/parse/ptrmem7.C
new file mode 100644 (file)
index 0000000..37b2689
--- /dev/null
@@ -0,0 +1,16 @@
+// PR c++/80043
+// { dg-options -fpermissive }
+
+struct A
+{
+  template<int> void foo()
+  {
+    void (A::* fp)();
+    fp = A::foo<0>;            // { dg-warning "assuming pointer to member" }
+  }
+};
+
+void bar()
+{
+  A().foo<0>();
+}