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:
parent
561cb39b35
commit
700466c28c
@ -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.
|
||||
|
@ -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));
|
||||
|
@ -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)
|
||||
|
18
gcc/cp/pt.c
18
gcc/cp/pt.c
@ -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
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user