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:
parent
1b28cd0697
commit
98f99d7f7c
@ -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.
|
||||
|
12
gcc/cp/pt.c
12
gcc/cp/pt.c
@ -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);
|
||||
|
@ -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
|
||||
|
11
gcc/testsuite/g++.dg/template/error18.C
Normal file
11
gcc/testsuite/g++.dg/template/error18.C
Normal 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 "" }
|
Loading…
Reference in New Issue
Block a user