Commit 92eca640 by Mark Mitchell Committed by Jason Merrill

decl.c (duplicate_decls): Handle template specializations correctly.

Mon Oct 20 11:44:20 1997  Mark Mitchell  <mmitchell@usa.net>

	* decl.c (duplicate_decls): Handle template specializations
	correctly.
	* error.c (dump_function_name): Fix printing of specializations of
	member functions that are not member templates.
	* cp-tree.h (processing_specialization): Make global.
	* pt.c (processing_specialization): Likewise.
	* lex.c (cons_up_default_function): Save and restore
	processing_specialization to avoid confusion.

From-SVN: r16101
parent a6967cc0
Mon Oct 20 11:44:20 1997 Mark Mitchell <mmitchell@usa.net>
* decl.c (duplicate_decls): Handle template specializations
correctly.
* error.c (dump_function_name): Fix printing of specializations of
member functions that are not member templates.
* cp-tree.h (processing_specialization): Make global.
* pt.c (processing_specialization): Likewise.
* lex.c (cons_up_default_function): Save and restore
processing_specialization to avoid confusion.
Mon Oct 20 10:52:22 1997 Jason Merrill <jason@yorick.cygnus.com> Mon Oct 20 10:52:22 1997 Jason Merrill <jason@yorick.cygnus.com>
* decl.c (init_decl_processing): Give null_node unknown* type. * decl.c (init_decl_processing): Give null_node unknown* type.
......
...@@ -2093,7 +2093,7 @@ finish_struct_methods (t, fn_fields, nonprivate_method) ...@@ -2093,7 +2093,7 @@ finish_struct_methods (t, fn_fields, nonprivate_method)
tree f; tree f;
tree spec_args; tree spec_args;
/* If there is a template, and t uses template parms, wer /* If there is a template, and t uses template parms, we
are dealing with a specialization of a member are dealing with a specialization of a member
template in a template class, and we must grab the template in a template class, and we must grab the
template, rather than the function. */ template, rather than the function. */
......
...@@ -2352,6 +2352,7 @@ extern tree most_specialized_class PROTO((tree, tree)); ...@@ -2352,6 +2352,7 @@ extern tree most_specialized_class PROTO((tree, tree));
extern int more_specialized_class PROTO((tree, tree)); extern int more_specialized_class PROTO((tree, tree));
extern void do_pushlevel PROTO((void)); extern void do_pushlevel PROTO((void));
extern int is_member_template PROTO((tree)); extern int is_member_template PROTO((tree));
extern int processing_specialization;
/* in repo.c */ /* in repo.c */
extern void repo_template_used PROTO((tree)); extern void repo_template_used PROTO((tree));
......
...@@ -2866,6 +2866,9 @@ duplicate_decls (newdecl, olddecl) ...@@ -2866,6 +2866,9 @@ duplicate_decls (newdecl, olddecl)
if (TREE_CODE (newdecl) == FUNCTION_DECL) if (TREE_CODE (newdecl) == FUNCTION_DECL)
{ {
if (DECL_TEMPLATE_INSTANTIATION (olddecl) &&
!DECL_TEMPLATE_INSTANTIATION (newdecl))
DECL_USE_TEMPLATE (olddecl) = DECL_USE_TEMPLATE (newdecl);
DECL_THIS_INLINE (newdecl) |= DECL_THIS_INLINE (olddecl); DECL_THIS_INLINE (newdecl) |= DECL_THIS_INLINE (olddecl);
/* If either decl says `inline', this fn is inline, unless its /* If either decl says `inline', this fn is inline, unless its
......
...@@ -925,7 +925,8 @@ dump_function_name (t) ...@@ -925,7 +925,8 @@ dump_function_name (t)
else else
dump_decl (name, 0); dump_decl (name, 0);
if (DECL_TEMPLATE_SPECIALIZATION (t) || DECL_IMPLICIT_INSTANTIATION (t)) if ((DECL_TEMPLATE_SPECIALIZATION (t) || DECL_IMPLICIT_INSTANTIATION (t))
&& (DECL_CLASS_CONTEXT (t) == NULL_TREE || is_member_template (t)))
{ {
tree args = DECL_TEMPLATE_INFO (t) tree args = DECL_TEMPLATE_INFO (t)
? DECL_TI_ARGS (t) : NULL_TREE; ? DECL_TI_ARGS (t) : NULL_TREE;
......
...@@ -1988,10 +1988,16 @@ cons_up_default_function (type, full_name, kind) ...@@ -1988,10 +1988,16 @@ cons_up_default_function (type, full_name, kind)
{ {
tree declarator = make_call_declarator (name, args, NULL_TREE, NULL_TREE); tree declarator = make_call_declarator (name, args, NULL_TREE, NULL_TREE);
int saved_processing_specialization;
if (retref) if (retref)
declarator = build_parse_node (ADDR_EXPR, declarator); declarator = build_parse_node (ADDR_EXPR, declarator);
/* The following is in case we're generating the default
implementation in the midst of handling a specialization. */
saved_processing_specialization = processing_specialization;
processing_specialization = 0;
fn = grokfield (declarator, declspecs, NULL_TREE, NULL_TREE, NULL_TREE); fn = grokfield (declarator, declspecs, NULL_TREE, NULL_TREE, NULL_TREE);
processing_specialization = saved_processing_specialization;
} }
if (fn == void_type_node) if (fn == void_type_node)
......
...@@ -60,7 +60,7 @@ static tree *maybe_template_tail = &maybe_templates; ...@@ -60,7 +60,7 @@ static tree *maybe_template_tail = &maybe_templates;
int minimal_parse_mode; int minimal_parse_mode;
static int processing_specialization; int processing_specialization;
static int template_header_count; static int template_header_count;
#define obstack_chunk_alloc xmalloc #define obstack_chunk_alloc xmalloc
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment