aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2000-05-31 16:39:19 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2000-05-31 16:39:19 +0000
commit6bbf1598b61f9d6dd1f42cb59a9cd51780c65999 (patch)
treeab468350cfdd071d28002d537d6ee3d77b308f12 /gcc
parent1b813bfea4a344623c32da63f0328c9f69083e31 (diff)
downloadgcc-6bbf1598b61f9d6dd1f42cb59a9cd51780c65999.zip
gcc-6bbf1598b61f9d6dd1f42cb59a9cd51780c65999.tar.gz
gcc-6bbf1598b61f9d6dd1f42cb59a9cd51780c65999.tar.bz2
decl.c (build_cp_library_fn): Set DECL_CONTEXT.
* decl.c (build_cp_library_fn): Set DECL_CONTEXT. * method.c (mangle_expression): Adjust test for legal expression operators. * pt.c (instantiate_decl): Save and restore the local specializations list. From-SVN: r34302
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog10
-rw-r--r--gcc/cp/decl.c1
-rw-r--r--gcc/cp/method.c10
-rw-r--r--gcc/cp/pt.c9
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/inline2.C16
5 files changed, 38 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index b451266..6120852 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,13 @@
+2000-05-31 Mark Mitchell <mark@codesourcery.com>
+
+ * decl.c (build_cp_library_fn): Set DECL_CONTEXT.
+
+ * method.c (mangle_expression): Adjust test for legal expression
+ operators.
+
+ * pt.c (instantiate_decl): Save and restore the local
+ specializations list.
+
2000-05-30 Jason Merrill <jason@decepticon.cygnus.com>
* decl.c (grok_reference_init): Pass LOOKUP_ONLYCONVERTING.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index cbee8e6..69f6e74 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -6821,6 +6821,7 @@ build_cp_library_fn (name, operator_code, type)
{
tree fn = build_library_fn_1 (name, operator_code, type);
TREE_NOTHROW (fn) = TYPE_NOTHROW_P (type);
+ DECL_CONTEXT (fn) = FROB_CONTEXT (current_namespace);
set_mangled_name_for_decl (fn);
make_function_rtl (fn);
return fn;
diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index 13d627a..1981e77 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -523,13 +523,11 @@ mangle_expression (value)
const char *name;
name = operator_name_info[TREE_CODE (value)].mangled_name;
- my_friendly_assert (name != NULL, 0);
- if (name[0] != '_' || name[1] != '_')
+ if (name == NULL)
/* On some erroneous inputs, we can get here with VALUE a
- LOOKUP_EXPR. In that case, the NAME will be the
- identifier for "<invalid operator>". We must survive
- this routine in order to issue a sensible error
- message, so we fall through to the case below. */
+ LOOKUP_EXPR. We must survive this routine in order to issue
+ a sensible error message, so we fall through to the case
+ below. */
goto bad_value;
for (i = 0; i < operands; ++i)
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index b64fc72..e414d84 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -9614,8 +9614,13 @@ instantiate_decl (d, defer_ok)
}
else if (TREE_CODE (d) == FUNCTION_DECL)
{
+ htab_t saved_local_specializations;
+
+ /* Save away the current list, in case we are instantiating one
+ template from within the body of another. */
+ saved_local_specializations = local_specializations;
+
/* Set up the list of local specializations. */
- my_friendly_assert (local_specializations == NULL, 20000422);
local_specializations = htab_create (37,
htab_hash_pointer,
htab_eq_pointer,
@@ -9635,7 +9640,7 @@ instantiate_decl (d, defer_ok)
/* We don't need the local specializations any more. */
htab_delete (local_specializations);
- local_specializations = NULL;
+ local_specializations = saved_local_specializations;
/* Finish the function. */
expand_body (finish_function (0));
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/inline2.C b/gcc/testsuite/g++.old-deja/g++.pt/inline2.C
new file mode 100644
index 0000000..fcc1d000
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/inline2.C
@@ -0,0 +1,16 @@
+// Build don't link:
+// Special g++ Options: -O
+// Origin: Mark Mitchell <mitchell@codesourcery.com>
+
+template <class T>
+struct S {
+ inline ~S () {}
+};
+
+template <class T>
+void f ()
+{
+ static S<T> s;
+}
+
+template void f<int>();