From: Mark Mitchell Date: Fri, 14 Jan 2000 05:45:52 +0000 (+0000) Subject: pt.c (tsubst_friend_function): Improve comment. X-Git-Tag: prereleases/libstdc++-2.92~8736 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1c2278974cfa5e22ffcde5c13f9cce92225bf812;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5407636a8816..d9cb4fe11af9 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 173cbfaa7d3d..379ad8314079 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 eb0ffd1ad58f..67670fa6cb90 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 000000000000..da66d7543b35 --- /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; +} +