2
0
mirror of git://gcc.gnu.org/git/gcc.git synced 2025-01-27 16:34:30 +08:00

re PR c++/20157 (Internal compiler error on invalid code)

PR c++/20157
	* pt.c (determine_specialization): Reject non-specializations.

	PR c++/20157
	* g++.dg/template/error18.C: New test.

From-SVN: r96414
This commit is contained in:
Mark Mitchell 2005-03-14 03:54:21 +00:00 committed by Mark Mitchell
parent 1b28cd0697
commit 98f99d7f7c
4 changed files with 31 additions and 2 deletions
gcc
cp
testsuite
ChangeLog
g++.dg/template

View File

@ -1,3 +1,8 @@
2005-03-13 Mark Mitchell <mark@codesourcery.com>
PR c++/20157
* pt.c (determine_specialization): Reject non-specializations.
2005-03-11 Per Bothner <per@bothner.com>
* cp-tree.h (struct cp_declarator): New id_loc field.

View File

@ -1353,8 +1353,8 @@ determine_specialization (tree template_id,
/* Count the number of template headers specified for this
specialization. */
header_count = 0;
for (b = current_binding_level;
b->kind == sk_template_parms || b->kind == sk_template_spec;
for (b = current_binding_level;
b->kind == sk_template_parms;
b = b->level_chain)
++header_count;
@ -1423,6 +1423,14 @@ determine_specialization (tree template_id,
if (header_count && header_count != template_count + 1)
continue;
/* Check that the number of template arguments at the
innermost level for DECL is the same as for FN. */
if (current_binding_level->kind == sk_template_parms
&& !current_binding_level->explicit_spec_p
&& (TREE_VEC_LENGTH (DECL_INNERMOST_TEMPLATE_PARMS (fn))
!= TREE_VEC_LENGTH (TREE_VALUE (current_template_parms))))
continue;
/* See whether this function might be a specialization of this
template. */
targs = get_bindings (fn, decl, explicit_targs);

View File

@ -1,3 +1,8 @@
2005-03-13 Mark Mitchell <mark@codesourcery.com>
PR c++/20157
* g++.dg/template/error18.C: New test.
2005-03-09 Ben Elliston <bje@au.ibm.com>
PR debug/16792

View File

@ -0,0 +1,11 @@
// PR c++/20157
template<typename AT>
struct A{
template<typename T>
void function(T);
};
template<>
template<typename ABC,typename DEF>
void A<int>::function(ABC); // { dg-error "" }