aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@yorick.cygnus.com>1998-11-19 02:35:15 +0000
committerJason Merrill <jason@gcc.gnu.org>1998-11-18 21:35:15 -0500
commitff350acdf9d740f93559072fc1022d2956e2ba07 (patch)
tree17babc04c34868423191c76101ebe734f1698f7c /gcc
parentc877974e79791c251316548175df8749ed657df9 (diff)
downloadgcc-ff350acdf9d740f93559072fc1022d2956e2ba07.zip
gcc-ff350acdf9d740f93559072fc1022d2956e2ba07.tar.gz
gcc-ff350acdf9d740f93559072fc1022d2956e2ba07.tar.bz2
semantics.c (begin_class_definition): Call maybe_process_partial_specialization before push_template_decl.
* semantics.c (begin_class_definition): Call maybe_process_partial_specialization before push_template_decl. Don't call push_template_decl for a specialization. * search.c (lookup_field): Do return a member template class. * decl2.c (handle_class_head): Handle member template classes. * decl.c (grokdeclarator): A parm type need not be complete. * pt.c (convert_nontype_argument): Fix thinko. From-SVN: r23705
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog12
-rw-r--r--gcc/cp/decl.c2
-rw-r--r--gcc/cp/decl2.c2
-rw-r--r--gcc/cp/pt.c4
-rw-r--r--gcc/cp/search.c5
-rw-r--r--gcc/cp/semantics.c7
6 files changed, 26 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 5f56a03..367be02 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,15 @@
+1998-11-19 Jason Merrill <jason@yorick.cygnus.com>
+
+ * semantics.c (begin_class_definition): Call
+ maybe_process_partial_specialization before push_template_decl.
+ Don't call push_template_decl for a specialization.
+ * search.c (lookup_field): Do return a member template class.
+ * decl2.c (handle_class_head): Handle member template classes.
+
+ * decl.c (grokdeclarator): A parm type need not be complete.
+
+ * pt.c (convert_nontype_argument): Fix thinko.
+
1998-11-18 Mark Mitchell <mark@markmitchell.com>
* cp-tree.h (PTRMEM_CST_CLASS): Fix typo.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 8980c11..a373f1f 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -10530,7 +10530,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
if (decl_context == PARM)
{
- decl = build_decl (PARM_DECL, declarator, complete_type (type));
+ decl = build_decl (PARM_DECL, declarator, type);
bad_specifiers (decl, "parameter", virtualp, quals != NULL_TREE,
inlinep, friendp, raises != NULL_TREE);
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index c2b4a1d..c8ad1fe 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -4946,6 +4946,8 @@ handle_class_head (aggr, scope, id)
{
if (TREE_CODE (id) == TYPE_DECL)
return id;
+ if (DECL_CLASS_TEMPLATE_P (id))
+ return DECL_TEMPLATE_RESULT (id);
if (scope)
cp_error ("`%T' does not have a nested type named `%D'", scope, id);
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 9955835..27e63d7 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -2687,8 +2687,8 @@ convert_nontype_argument (type, expr)
identical) type of the template-argument. The
template-parameter is bound directly to the
template-argument, which must be an lvalue. */
- if (!same_type_p (TYPE_MAIN_VARIANT (expr_type),
- TYPE_MAIN_VARIANT (type))
+ if ((TYPE_MAIN_VARIANT (expr_type)
+ != TYPE_MAIN_VARIANT (type_referred_to))
|| !at_least_as_qualified_p (type_referred_to,
expr_type)
|| !real_lvalue_p (expr))
diff --git a/gcc/cp/search.c b/gcc/cp/search.c
index f9ec9dc..8d507dc 100644
--- a/gcc/cp/search.c
+++ b/gcc/cp/search.c
@@ -1190,6 +1190,11 @@ lookup_field (xbasetype, name, protect, want_type)
&& ! currently_open_class (BINFO_TYPE (rval_binfo))
&& uses_template_parms (type))
{
+ /* We need to return a member template class so we can define partial
+ specializations. Is there a better way? */
+ if (DECL_CLASS_TEMPLATE_P (rval))
+ return rval;
+
/* Don't return a non-type. Actually, we ought to return something
so lookup_name_real can give a warning. */
if (TREE_CODE (rval) != TYPE_DECL)
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 5e3876f..b1278dc 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -1230,11 +1230,12 @@ begin_class_definition (t)
t = make_lang_type (TREE_CODE (t));
pushtag (TYPE_IDENTIFIER (t), t, 0);
}
- if (processing_template_decl && TYPE_CONTEXT (t)
- && TREE_CODE (TYPE_CONTEXT (t)) != NAMESPACE_DECL
+ maybe_process_partial_specialization (t);
+ if (processing_template_decl
+ && ! CLASSTYPE_TEMPLATE_SPECIALIZATION (t)
+ && TYPE_CONTEXT (t) && TYPE_P (TYPE_CONTEXT (t))
&& ! current_class_type)
push_template_decl (TYPE_STUB_DECL (t));
- maybe_process_partial_specialization (t);
pushclass (t, 0);
TYPE_BEING_DEFINED (t) = 1;
/* Reset the interface data, at the earliest possible