pt.c (maybe_process_partial_specialization): Complain about specialization in wrong namespace.

* pt.c (maybe_process_partial_specialization): Complain about
	specialization in wrong namespace.
	* tree.c (decl_namespace_context): New fn.
g++.pt/explicit73.C
	* decl2.c (arg_assoc_type): Handle TEMPLATE_TEMPLATE_PARM.
	* pt.c (coerce_template_template_parms): Handle nested
	template template parameters.
g++.pt/nttp[12].C

From-SVN: r25072
This commit is contained in:
Jason Merrill 1999-02-07 10:44:12 -05:00
parent 561cb39b35
commit 700466c28c
5 changed files with 48 additions and 2 deletions

View File

@ -1,3 +1,15 @@
1999-02-07 Jason Merrill <jason@yorick.cygnus.com>
* pt.c (maybe_process_partial_specialization): Complain about
specialization in wrong namespace.
* tree.c (decl_namespace_context): New fn.
1999-02-06 Kriang Lerdsuwanakij <lerdsuwa@scf-fs.usc.edu>
* decl2.c (arg_assoc_type): Handle TEMPLATE_TEMPLATE_PARM.
* pt.c (coerce_template_template_parms): Handle nested
template template parameters.
Sat Feb 6 18:08:40 1999 Jeffrey A Law (law@cygnus.com)
* typeck2.c: Update email addrsses.

View File

@ -3288,6 +3288,7 @@ extern tree break_out_target_exprs PROTO((tree));
extern tree get_type_decl PROTO((tree));
extern tree vec_binfo_member PROTO((tree, tree));
extern tree hack_decl_function_context PROTO((tree));
extern tree decl_namespace_context PROTO((tree));
extern tree lvalue_type PROTO((tree));
extern tree error_type PROTO((tree));
extern tree make_temp_vec PROTO((int));

View File

@ -4483,6 +4483,7 @@ arg_assoc_type (k, type)
/* Associate the return type. */
return arg_assoc_type (k, TREE_TYPE (type));
case TEMPLATE_TYPE_PARM:
case TEMPLATE_TEMPLATE_PARM:
return 0;
case LANG_TYPE:
if (type == unknown_type_node)

View File

@ -672,6 +672,13 @@ maybe_process_partial_specialization (type)
if (CLASSTYPE_IMPLICIT_INSTANTIATION (type)
&& TYPE_SIZE (type) == NULL_TREE)
{
if (current_namespace
!= decl_namespace_context (CLASSTYPE_TI_TEMPLATE (type)))
{
cp_pedwarn ("specializing `%#T' in different namespace", type);
cp_pedwarn_at (" from definition of `%#D'",
CLASSTYPE_TI_TEMPLATE (type));
}
SET_CLASSTYPE_TEMPLATE_SPECIALIZATION (type);
if (processing_template_decl)
push_template_decl (TYPE_MAIN_DECL (type));
@ -2804,8 +2811,15 @@ coerce_template_template_parms (parm_parms, arg_parms, in_decl, outer_args)
/* We encounter instantiations of templates like
template <template <template <class> class> class TT>
class C; */
sorry ("nested template template parameter");
return 0;
{
tree parmparm = DECL_INNERMOST_TEMPLATE_PARMS (parm);
tree argparm = DECL_INNERMOST_TEMPLATE_PARMS (arg);
if (!coerce_template_template_parms (parmparm, argparm,
in_decl, outer_args))
return 0;
}
break;
case PARM_DECL:
/* The tsubst call is used to handle cases such as

View File

@ -2384,6 +2384,24 @@ hack_decl_function_context (decl)
return decl_function_context (decl);
}
/* Returns the namespace that contains DECL, whether directly or
indirectly. */
tree
decl_namespace_context (decl)
tree decl;
{
while (1)
{
if (TREE_CODE (decl) == NAMESPACE_DECL)
return decl;
else if (TYPE_P (decl))
decl = CP_DECL_CONTEXT (TYPE_MAIN_DECL (decl));
else
decl = CP_DECL_CONTEXT (decl);
}
}
/* Return truthvalue of whether T1 is the same tree structure as T2.
Return 1 if they are the same.
Return 0 if they are understandably different.