re PR c++/14479 (enum definition in template class with template methods causes error.)
PR c++/14479 PR c++/19487 * pt.c (maybe_check_template_type): Remove. * cp-tree.h (maybe_check_template_type): Remove prototype. * name-lookup.c (maybe_process_template_type_declaration): Don't use maybe_check_template_type. * g++.dg/template/enum5.C: New test. From-SVN: r94941
This commit is contained in:
parent
537677ba9d
commit
d32707707a
@ -1,3 +1,12 @@
|
||||
2005-02-12 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
|
||||
|
||||
PR c++/14479
|
||||
PR c++/19487
|
||||
* pt.c (maybe_check_template_type): Remove.
|
||||
* cp-tree.h (maybe_check_template_type): Remove prototype.
|
||||
* name-lookup.c (maybe_process_template_type_declaration): Don't
|
||||
use maybe_check_template_type.
|
||||
|
||||
2005-02-11 Richard Henderson <rth@redhat.com>
|
||||
|
||||
PR c++/19632
|
||||
|
@ -4010,7 +4010,6 @@ extern int is_specialization_of (tree, tree);
|
||||
extern bool is_specialization_of_friend (tree, tree);
|
||||
extern int comp_template_args (tree, tree);
|
||||
extern void maybe_process_partial_specialization (tree);
|
||||
extern void maybe_check_template_type (tree);
|
||||
extern tree most_specialized_instantiation (tree);
|
||||
extern void print_candidates (tree);
|
||||
extern void instantiate_pending_templates (int);
|
||||
|
@ -4514,8 +4514,6 @@ maybe_process_template_type_declaration (tree type, int globalize,
|
||||
;
|
||||
else
|
||||
{
|
||||
maybe_check_template_type (type);
|
||||
|
||||
gcc_assert (IS_AGGR_TYPE (type) || TREE_CODE (type) == ENUMERAL_TYPE);
|
||||
|
||||
if (processing_template_decl)
|
||||
|
43
gcc/cp/pt.c
43
gcc/cp/pt.c
@ -2101,49 +2101,6 @@ check_explicit_specialization (tree declarator,
|
||||
return decl;
|
||||
}
|
||||
|
||||
/* TYPE is being declared. Verify that the use of template headers
|
||||
and such is reasonable. Issue error messages if not. */
|
||||
|
||||
void
|
||||
maybe_check_template_type (tree type)
|
||||
{
|
||||
if (template_header_count)
|
||||
{
|
||||
/* We are in the scope of some `template <...>' header. */
|
||||
|
||||
int context_depth
|
||||
= template_class_depth_real (TYPE_CONTEXT (type),
|
||||
/*count_specializations=*/1);
|
||||
|
||||
if (template_header_count <= context_depth)
|
||||
/* This is OK; the template headers are for the context. We
|
||||
are actually too lenient here; like
|
||||
check_explicit_specialization we should consider the number
|
||||
of template types included in the actual declaration. For
|
||||
example,
|
||||
|
||||
template <class T> struct S {
|
||||
template <class U> template <class V>
|
||||
struct I {};
|
||||
};
|
||||
|
||||
is invalid, but:
|
||||
|
||||
template <class T> struct S {
|
||||
template <class U> struct I;
|
||||
};
|
||||
|
||||
template <class T> template <class U.
|
||||
struct S<T>::I {};
|
||||
|
||||
is not. */
|
||||
;
|
||||
else if (template_header_count > context_depth + 1)
|
||||
/* There are two many template parameter lists. */
|
||||
error ("too many template parameter lists in declaration of %qT", type);
|
||||
}
|
||||
}
|
||||
|
||||
/* Returns 1 iff PARMS1 and PARMS2 are identical sets of template
|
||||
parameters. These are represented in the same format used for
|
||||
DECL_TEMPLATE_PARMS. */
|
||||
|
@ -1,3 +1,9 @@
|
||||
2005-02-12 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
|
||||
|
||||
PR c++/14479
|
||||
PR c++/19487
|
||||
* g++.dg/template/enum5.C: New test.
|
||||
|
||||
2005-02-12 Ira Rosen <irar@il.ibm.com>
|
||||
|
||||
* gcc.dg/vect/vect-97.c: New test.
|
||||
|
16
gcc/testsuite/g++.dg/template/enum5.C
Normal file
16
gcc/testsuite/g++.dg/template/enum5.C
Normal file
@ -0,0 +1,16 @@
|
||||
// { dg-do compile }
|
||||
|
||||
// Origin: robertk@mathematik.uni-freiburg.de
|
||||
// Wolfgang Bangerth <bangerth@ticam.utexas.edu>
|
||||
|
||||
// PR c++/14479: Template header check for enum
|
||||
|
||||
template <int dim>
|
||||
struct X {
|
||||
enum { dimension = dim };
|
||||
template<int d> void bar ();
|
||||
};
|
||||
|
||||
template <>
|
||||
template <>
|
||||
void X<0>::bar<0> () {}
|
Loading…
Reference in New Issue
Block a user