aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@suse.de>2008-02-22 11:02:00 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2008-02-22 11:02:00 +0000
commit54062fc0da3a1009eb0f53e899fb44d8b7b4a177 (patch)
treefb823f930efc33f1a9a8d837229a9125f51c63f5
parent4af63337bebe68e3010849286d45a0341dbb1081 (diff)
downloadgcc-54062fc0da3a1009eb0f53e899fb44d8b7b4a177.zip
gcc-54062fc0da3a1009eb0f53e899fb44d8b7b4a177.tar.gz
gcc-54062fc0da3a1009eb0f53e899fb44d8b7b4a177.tar.bz2
re PR c++/35282 (Template specialization rejected)
/testsuite 2008-02-22 Paolo Carlini <pcarlini@suse.de> PR c++/35282 * g++.dg/template/nontype17.C: Add. /cp 2008-02-22 Paolo Carlini <pcarlini@suse.de> PR c++/35282 Revert: 2008-02-14 Paolo Carlini <pcarlini@suse.de> PR c++/28743 * pt.c (determine_specialization): In case of function templates, when the type of DECL does not match FN there is no match. /testsuite 2008-02-22 Paolo Carlini <pcarlini@suse.de> PR c++/35282 Revert: 2008-02-14 Paolo Carlini <pcarlini@suse.de> PR c++/28743 * g++.dg/template/nontype17.C: New. * g++.dg/template/nontype16.C: Add error. From-SVN: r132543
-rw-r--r--gcc/cp/ChangeLog10
-rw-r--r--gcc/cp/pt.c9
-rw-r--r--gcc/testsuite/ChangeLog15
-rw-r--r--gcc/testsuite/g++.dg/template/nontype16.C2
-rw-r--r--gcc/testsuite/g++.dg/template/nontype17.C6
5 files changed, 35 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index b300db0..19c34ba 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,13 @@
+2008-02-22 Paolo Carlini <pcarlini@suse.de>
+
+ PR c++/35282
+ Revert:
+ 2008-02-14 Paolo Carlini <pcarlini@suse.de>
+
+ PR c++/28743
+ * pt.c (determine_specialization): In case of function templates,
+ when the type of DECL does not match FN there is no match.
+
2008-02-22 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
PR c/19999
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index e45f6da..2a54986 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -1563,9 +1563,12 @@ determine_specialization (tree template_id,
no partial specializations of functions. Therefore, if
the type of DECL does not match FN, there is no
match. */
- if (tsk == tsk_template
- && !compparms (fn_arg_types, decl_arg_types))
- continue;
+ if (tsk == tsk_template)
+ {
+ if (compparms (fn_arg_types, decl_arg_types))
+ candidates = tree_cons (NULL_TREE, fn, candidates);
+ continue;
+ }
/* See whether this function might be a specialization of this
template. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 493effc..053949b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,18 @@
+2008-02-22 Paolo Carlini <pcarlini@suse.de>
+
+ PR c++/35282
+ * g++.dg/template/nontype17.C: Add.
+
+2008-02-22 Paolo Carlini <pcarlini@suse.de>
+
+ PR c++/35282
+ Revert:
+ 2008-02-14 Paolo Carlini <pcarlini@suse.de>
+
+ PR c++/28743
+ * g++.dg/template/nontype17.C: New.
+ * g++.dg/template/nontype16.C: Add error.
+
2008-02-22 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
PR c/19999
diff --git a/gcc/testsuite/g++.dg/template/nontype16.C b/gcc/testsuite/g++.dg/template/nontype16.C
index 4b9f760..36d1e95 100644
--- a/gcc/testsuite/g++.dg/template/nontype16.C
+++ b/gcc/testsuite/g++.dg/template/nontype16.C
@@ -5,5 +5,5 @@ template<int> struct A
template<typename> void foo();
};
-template<> template<struct T> void A<0>::foo() {} // { dg-error "not a valid type|match" }
+template<> template<struct T> void A<0>::foo() {} // { dg-error "not a valid type" }
diff --git a/gcc/testsuite/g++.dg/template/nontype17.C b/gcc/testsuite/g++.dg/template/nontype17.C
index c8f3404..f3a4480 100644
--- a/gcc/testsuite/g++.dg/template/nontype17.C
+++ b/gcc/testsuite/g++.dg/template/nontype17.C
@@ -1,8 +1,8 @@
-// PR c++/28743
+// PR c++/35282
template<int> struct A
{
- template<typename> void foo();
+ template<int> void foo();
};
-template<int> template<typename> void A<0>::foo() {} // { dg-error "match" }
+template<> template<int> void A<0>::foo() {}