From: Jason Merrill Date: Sat, 17 Jun 2017 02:27:33 +0000 (-0400) Subject: PR c++/80639 - ICE with invalid PMF initialization. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b126bff44d96201be452bf3d1b220c515bc0e26a;p=gcc.git 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. From-SVN: r249317 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ce1e8d09c77..a2144c21132 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2017-06-16 Jason Merrill + + 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 * pt.c (tsubst_baselink): Fix & clarify formatting. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 05b4fbb79d3..0f22e649edd 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -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 index 00000000000..5c66b72cb8f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem31.C @@ -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 >; +}