pt.c (tsubst_friend_function): Improve comment.

* pt.c (tsubst_friend_function): Improve comment.
	(instantiate_decl): Avoid crashing when a "nested" function is
	instantiated from the top level.

From-SVN: r31403
This commit is contained in:
Mark Mitchell 2000-01-14 05:45:52 +00:00 committed by Mark Mitchell
parent f1ebdfc52a
commit 1c2278974c
4 changed files with 45 additions and 5 deletions

View File

@ -1,3 +1,12 @@
2000-01-13 Mark Mitchell <mark@codesourcery.com>
* pt.c (tsubst_friend_function): Improve comment.
(instantiate_decl): Avoid crashing when a "nested" function is
instantiated from the top level.
* dump.c (dqeueue_and_dump): Dump
DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION.
2000-01-13 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* call.c: If GATHER_STATISTICS, declare `n_build_method_call'.

View File

@ -1,5 +1,5 @@
/* Tree-dumping functionality for intermediate representation.
Copyright (C) 1999 Free Software Foundation, Inc.
Copyright (C) 1999, 2000 Free Software Foundation, Inc.
Written by Mark Mitchell <mark@codesourcery.com>
This file is part of GNU CC.
@ -585,6 +585,8 @@ dequeue_and_dump (di)
dump_string (di, "global fini");
dump_int (di, "prio", GLOBAL_INIT_PRIORITY (t));
}
if (DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t))
dump_string (di, "pseudo tmpl");
dump_child ("body", DECL_SAVED_TREE (t));
}

View File

@ -4466,8 +4466,8 @@ tsubst_friend_function (decl, args)
}
/* Inside pushdecl_namespace_level, we will push into the
current namespace. However, the friend function should
tyically go into the namespace of the template. */
current namespace. However, the friend function should go
into the namespace of the template. */
ns = decl_namespace_context (new_friend);
push_nested_namespace (ns);
old_decl = pushdecl_namespace_level (new_friend);
@ -9559,7 +9559,7 @@ instantiate_decl (d)
&& ! DECL_NEEDED_P (d)
/* If the function that caused us to be instantiated is needed, we
will be needed, too. */
&& (! nested || ! DECL_NEEDED_P (old_fn)))
&& (! nested || (old_fn && ! DECL_NEEDED_P (old_fn))))
DECL_DEFER_OUTPUT (d) = 1;
/* We're now committed to instantiating this template. Mark it as

View File

@ -0,0 +1,29 @@
// Build don't link:
// Origin: Mark Mitchell <mark@codesourcery.com>
template <class T>
int g (T);
int j = g (3);
template <class T>
inline T f (T)
{
return 2;
}
template <class T>
struct S
{
static const int i;
};
template <class T>
const int S<T>::i = f (3);
template <class T>
int g (T)
{
return S<double>::i;
}