summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2018-02-28 21:34:56 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2018-02-28 21:34:56 +0000
commitd391827e8805d50bb3e0bfc0a9d677426d4e24c4 (patch)
tree2668f1cd597401e161607a163ef4002a44d196f8
parent1599c2c21e18508b9f66bb50162540783f715d6a (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/cp/pt.c20
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/ref-qual18.C18
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&) &&;