diff options
author | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2018-02-28 21:34:56 +0000 |
---|---|---|
committer | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2018-02-28 21:34:56 +0000 |
commit | d391827e8805d50bb3e0bfc0a9d677426d4e24c4 (patch) | |
tree | 2668f1cd597401e161607a163ef4002a44d196f8 | |
parent | 1599c2c21e18508b9f66bb50162540783f715d6a (diff) | |
download | gcc-d391827e8805d50bb3e0bfc0a9d677426d4e24c4.tar.gz |
PR c++/71784 - ICE with ref-qualifier and explicit specialization.
* pt.c (determine_specialization): Check ref-qualifier.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-6-branch@258087 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/pt.c | 20 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/ref-qual18.C | 18 |
3 files changed, 39 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 387740d6104..d30784fbf15 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2018-02-28 Jason Merrill <jason@redhat.com> + + PR c++/71784 - ICE with ref-qualifier and explicit specialization. + * pt.c (determine_specialization): Check ref-qualifier. + 2018-02-26 Jason Merrill <jason@redhat.com> PR c++/84441 - ICE with base initialized from ?: diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 28bb7853198..9dbf17ba4d8 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -2170,10 +2170,17 @@ determine_specialization (tree template_id, that the const qualification is the same. Since get_bindings does not try to merge the "this" parameter, we must do the comparison explicitly. */ - if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn) - && !same_type_p (TREE_VALUE (fn_arg_types), - TREE_VALUE (decl_arg_types))) - continue; + if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn)) + { + if (!same_type_p (TREE_VALUE (fn_arg_types), + TREE_VALUE (decl_arg_types))) + continue; + + /* And the ref-qualification. */ + if (type_memfn_rqual (TREE_TYPE (decl)) + != type_memfn_rqual (TREE_TYPE (fn))) + continue; + } /* Skip the "this" parameter and, for constructors of classes with virtual bases, the VTT parameter. A @@ -2279,6 +2286,11 @@ determine_specialization (tree template_id, decl_arg_types)) continue; + if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn) + && (type_memfn_rqual (TREE_TYPE (decl)) + != type_memfn_rqual (TREE_TYPE (fn)))) + continue; + // If the deduced arguments do not satisfy the constraints, // this is not a candidate. if (flag_concepts && !constraints_satisfied_p (fn)) diff --git a/gcc/testsuite/g++.dg/cpp0x/ref-qual18.C b/gcc/testsuite/g++.dg/cpp0x/ref-qual18.C new file mode 100644 index 00000000000..aaa00b9cfc3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/ref-qual18.C @@ -0,0 +1,18 @@ +// PR c++/71784 +// { dg-do compile { target c++11 } } + +template<typename T> struct A { + template<typename U> void f(U const&) & { } + template<typename U> void f(U const&) && { } +}; + +template void A<int>::f<int>(int const&) &; +template void A<float>::f<int>(int const&) &&; + +template<typename T> struct B { + void f(int const&) & { } + void f(int const&) && { } +}; + +template void B<int>::f(int const&) &; +template void B<float>::f(int const&) &&; |