summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>1999-02-07 15:44:12 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>1999-02-07 15:44:12 +0000
commit4ee588cca5de310347ca711cc0c27aa78ee29b81 (patch)
treebbc39d5158cb55376023d1e1dafbfdeb94061479
parent962dee4bd440e37c66761ddb9e6857992e03a091 (diff)
downloadgcc-4ee588cca5de310347ca711cc0c27aa78ee29b81.tar.gz
* 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 git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@25072 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog12
-rw-r--r--gcc/cp/cp-tree.h1
-rw-r--r--gcc/cp/decl2.c1
-rw-r--r--gcc/cp/pt.c18
-rw-r--r--gcc/cp/tree.c18
5 files changed, 48 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 2248d9c9f39..975769f4105 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 1d7385c4223..6bed0bcded3 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -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));
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index ba458595f6b..87a25778748 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -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)
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index dd805da3967..72cf9d0b60f 100644
--- a/gcc/cp/pt.c
+++ b/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
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index 3e5048f9f10..bc5a18eba7d 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -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.