From 5e5932dca5cb39bf1ba5eb83d02cfda8bcb70183 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 16 Jun 2017 22:33:43 -0400 Subject: [PATCH] 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: r249329 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/typeck.c | 5 +++-- gcc/testsuite/g++.dg/template/ptrmem31.C | 23 +++++++++++++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/ptrmem31.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 664fa4f1224..8a5ec57fccb 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +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. + PR c++/80465 - ICE with generic lambda with noexcept-specifier. * lambda.c (maybe_add_lambda_conv_op): Keep processing_template_decl set longer for a generic lambda. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 7aee0d6f0ac..0bcf6d0ac97 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -8499,9 +8499,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 %qT to %qT 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 >; +}