From 1c2278974cfa5e22ffcde5c13f9cce92225bf812 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Fri, 14 Jan 2000 05:45:52 +0000 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 9 +++++++ gcc/cp/dump.c | 4 ++- gcc/cp/pt.c | 8 +++--- gcc/testsuite/g++.old-deja/g++.pt/crash54.C | 29 +++++++++++++++++++++ 4 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.old-deja/g++.pt/crash54.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5407636a881..d9cb4fe11af 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2000-01-13 Mark Mitchell + + * 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 * call.c: If GATHER_STATISTICS, declare `n_build_method_call'. diff --git a/gcc/cp/dump.c b/gcc/cp/dump.c index 173cbfaa7d3..379ad831407 100644 --- a/gcc/cp/dump.c +++ b/gcc/cp/dump.c @@ -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 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)); } diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index eb0ffd1ad58..67670fa6cb9 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -4465,9 +4465,9 @@ tsubst_friend_function (decl, args) new_friend_result_template_info = NULL_TREE; } - /* Inside pushdecl_namespace_level, we will push into the - current namespace. However, the friend function should - tyically go into the namespace of the template. */ + /* Inside pushdecl_namespace_level, we will push into the + 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 diff --git a/gcc/testsuite/g++.old-deja/g++.pt/crash54.C b/gcc/testsuite/g++.old-deja/g++.pt/crash54.C new file mode 100644 index 00000000000..da66d7543b3 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/crash54.C @@ -0,0 +1,29 @@ +// Build don't link: +// Origin: Mark Mitchell + +template +int g (T); + +int j = g (3); + +template +inline T f (T) +{ + return 2; +} + +template +struct S +{ + static const int i; +}; + +template +const int S::i = f (3); + +template +int g (T) +{ + return S::i; +} +