Commit 4571259b by Paolo Carlini Committed by Paolo Carlini

re PR c++/28743 (ICE with invalid specialization)

/cp
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-14  Paolo Carlini  <pcarlini@suse.de>

        PR c++/28743
	* g++.dg/template/nontype17.C: New.
        * g++.dg/template/nontype16.C: Add error.

From-SVN: r132316
parent b49326f1
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-13 Jakub Jelinek <jakub@redhat.com> 2008-02-13 Jakub Jelinek <jakub@redhat.com>
Manuel Lopez-Ibanez <manu@gcc.gnu.org> Manuel Lopez-Ibanez <manu@gcc.gnu.org>
......
...@@ -1561,12 +1561,9 @@ determine_specialization (tree template_id, ...@@ -1561,12 +1561,9 @@ determine_specialization (tree template_id,
no partial specializations of functions. Therefore, if no partial specializations of functions. Therefore, if
the type of DECL does not match FN, there is no the type of DECL does not match FN, there is no
match. */ match. */
if (tsk == tsk_template) if (tsk == tsk_template
{ && !compparms (fn_arg_types, decl_arg_types))
if (compparms (fn_arg_types, decl_arg_types)) continue;
candidates = tree_cons (NULL_TREE, fn, candidates);
continue;
}
/* See whether this function might be a specialization of this /* See whether this function might be a specialization of this
template. */ template. */
......
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-13 Jakub Jelinek <jakub@redhat.com> 2008-02-13 Jakub Jelinek <jakub@redhat.com>
PR c++/35138 PR c++/35138
...@@ -5,5 +5,5 @@ template<int> struct A ...@@ -5,5 +5,5 @@ template<int> struct A
template<typename> void foo(); template<typename> void foo();
}; };
template<> template<struct T> void A<0>::foo() {} // { dg-error "not a valid type" } template<> template<struct T> void A<0>::foo() {} // { dg-error "not a valid type|match" }
// PR c++/28743
template<int> struct A
{
template<typename> void foo();
};
template<int> template<typename> void A<0>::foo() {} // { dg-error "match" }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment