diff options
author | Jason Merrill <jason@gcc.gnu.org> | 1999-02-07 10:44:12 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 1999-02-07 10:44:12 -0500 |
commit | 700466c28c5d8f5a51d2acf69e6a7b8d6a9b90a3 (patch) | |
tree | bbc39d5158cb55376023d1e1dafbfdeb94061479 /gcc | |
parent | 561cb39b358c410673d0f8ffb1f886094c1e36a8 (diff) | |
download | gcc-700466c28c5d8f5a51d2acf69e6a7b8d6a9b90a3.zip gcc-700466c28c5d8f5a51d2acf69e6a7b8d6a9b90a3.tar.gz gcc-700466c28c5d8f5a51d2acf69e6a7b8d6a9b90a3.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 1 | ||||
-rw-r--r-- | gcc/cp/decl2.c | 1 | ||||
-rw-r--r-- | gcc/cp/pt.c | 18 | ||||
-rw-r--r-- | gcc/cp/tree.c | 18 |
5 files changed, 48 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2248d9c..975769f 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 1d7385c..6bed0bcd 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 ba45859..87a2577 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 dd805da..72cf9d0 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 3e5048f..bc5a18e 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. |