aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@gcc.gnu.org>2000-11-11 18:50:20 -0500
committerJason Merrill <jason@gcc.gnu.org>2000-11-11 18:50:20 -0500
commit492cca24891e2927d0604e2297ab228950d889a6 (patch)
tree41016f949c7ab976f805d5285478ff31b3f885d3
parent8ee322c99319bb283d6bd298a469482d9eed7004 (diff)
downloadgcc-492cca24891e2927d0604e2297ab228950d889a6.zip
gcc-492cca24891e2927d0604e2297ab228950d889a6.tar.gz
gcc-492cca24891e2927d0604e2297ab228950d889a6.tar.bz2
decl.c (maybe_commonize_var): Set DECL_UNINLINABLE for statics in inlines.
* decl.c (maybe_commonize_var): Set DECL_UNINLINABLE for statics in inlines. From-SVN: r37394
-rw-r--r--gcc/cp/ChangeLog13
-rw-r--r--gcc/cp/decl.c1
-rw-r--r--gcc/testsuite/g++.old-deja/g++.other/comdat1-aux.cc10
-rw-r--r--gcc/testsuite/g++.old-deja/g++.other/comdat1.C24
4 files changed, 44 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index a84276e..12947e1 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2000-11-09 Jason Merrill <jason@redhat.com>
+
+ * decl.c (maybe_commonize_var): Set DECL_UNINLINABLE for statics
+ in inlines.
+
2000-11-10 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* decl.c (grokdeclarator, save_function_data): Use memcpy, not bcopy.
@@ -28,10 +33,10 @@
2000-11-07 Eric Christopher <echristo@redhat.com>
- * decl.c (init_decl_processing): Change definition of
- __wchar_t to wchar_t. Remove artificial declaration of
- wchar_t.
- * lex.c: Change instances of __wchar_t to wchar_t.
+ * decl.c (init_decl_processing): Change definition of
+ __wchar_t to wchar_t. Remove artificial declaration of
+ wchar_t.
+ * lex.c: Change instances of __wchar_t to wchar_t.
2000-11-09 Nathan Sidwell <nathan@codesourcery.com>
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index d23ef2f..0d677fe 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -7655,6 +7655,7 @@ maybe_commonize_var (decl)
inlining of such functions. */
current_function_cannot_inline
= "function with static variable cannot be inline";
+ DECL_UNINLINABLE (current_function_decl) = 1;
/* If flag_weak, we don't need to mess with this, as we can just
make the function weak, and let it refer to its unique local
diff --git a/gcc/testsuite/g++.old-deja/g++.other/comdat1-aux.cc b/gcc/testsuite/g++.old-deja/g++.other/comdat1-aux.cc
new file mode 100644
index 0000000..4f5a73c
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.other/comdat1-aux.cc
@@ -0,0 +1,10 @@
+inline int f ()
+{
+ static int k;
+ return ++k;
+}
+
+int g ()
+{
+ return f();
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.other/comdat1.C b/gcc/testsuite/g++.old-deja/g++.other/comdat1.C
new file mode 100644
index 0000000..5dd43a8
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.other/comdat1.C
@@ -0,0 +1,24 @@
+// Test that statics in inline functions are unified between
+// translation units. Currently we handle this by just suppressing
+// inling and relying on unification of the function itself.
+
+// Special g++ Options: -O
+
+// Additional sources: comdat1-aux.cc
+
+inline int f ()
+{
+ static int i;
+ return ++i;
+}
+
+int g ();
+
+int main ()
+{
+ if (f() != 1
+ || g() != 2
+ || f() != 3)
+ return 1;
+ return 0;
+}