aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@gcc.gnu.org>2007-11-27 08:12:10 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2007-11-27 08:12:10 +0100
commitce41114b00a852a221f93a0a18c8ad03a426ee79 (patch)
tree7a48f012d201d5c3e2811119bc9e0d3829101f41 /gcc
parent381d3db6b824cbb126adc5aa50bfd9a52b2b4c32 (diff)
downloadgcc-ce41114b00a852a221f93a0a18c8ad03a426ee79.zip
gcc-ce41114b00a852a221f93a0a18c8ad03a426ee79.tar.gz
gcc-ce41114b00a852a221f93a0a18c8ad03a426ee79.tar.bz2
re PR c++/34213 (static member function in anonymous namespace can't be used as template argument)
PR c++/34213 * tree.c (decl_linkage): Static data members and static member functions in anonymous ns classes are lk_external. * g++.dg/ext/visibility/anon8.C: New test. From-SVN: r130463
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/tree.c14
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/ext/visibility/anon8.C33
4 files changed, 57 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 293238e..37e7a3c 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,6 +1,12 @@
+2007-11-27 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/34213
+ * tree.c (decl_linkage): Static data members and static member
+ functions in anonymous ns classes are lk_external.
+
2007-11-26 Andreas Krebbel <krebbel1@de.ibm.com>
- PR 34081/C++
+ PR c++/34081
* decl.c (start_preparsed_function): Pass
processing_template_decl for the new allocate_struct_function
parameter.
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index 252195d..6ae0568 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -2526,10 +2526,18 @@ decl_linkage (tree decl)
/* Members of the anonymous namespace also have TREE_PUBLIC unset, but
are considered to have external linkage for language purposes. DECLs
really meant to have internal linkage have DECL_THIS_STATIC set. */
- if (TREE_CODE (decl) == TYPE_DECL
- || ((TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == FUNCTION_DECL)
- && !DECL_THIS_STATIC (decl)))
+ if (TREE_CODE (decl) == TYPE_DECL)
return lk_external;
+ if (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == FUNCTION_DECL)
+ {
+ if (!DECL_THIS_STATIC (decl))
+ return lk_external;
+
+ /* Static data members and static member functions from classes
+ in anonymous namespace also don't have TREE_PUBLIC set. */
+ if (DECL_CLASS_CONTEXT (decl))
+ return lk_external;
+ }
/* Everything else has internal linkage. */
return lk_internal;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5363cf2..10ce3a5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-11-27 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/34213
+ * g++.dg/ext/visibility/anon8.C: New test.
+
2007-11-13 Michael Meissner <michael.meissner@amd.com>
PR target/34077
@@ -22,7 +27,7 @@
2007-11-26 Andreas Krebbel <krebbel1@de.ibm.com>
- PR 34081/C++
+ PR c++/34081
* g++.dg/template/dependent-expr6.C: New testcase.
2007-11-26 Uros Bizjak <ubizjak@gmail.com>
diff --git a/gcc/testsuite/g++.dg/ext/visibility/anon8.C b/gcc/testsuite/g++.dg/ext/visibility/anon8.C
new file mode 100644
index 0000000..827cc22
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/visibility/anon8.C
@@ -0,0 +1,33 @@
+// PR c++/34213
+// { dg-do compile }
+
+template <void (*fn) ()>
+void call ()
+{
+ fn ();
+}
+
+namespace
+{
+ struct B1
+ {
+ static void fn1 () {}
+ static void fn4 ();
+ };
+ void fn3 () {}
+ void B1::fn4 () {}
+ static void fn5 () {}
+}
+
+int main ()
+{
+ struct B2
+ {
+ static void fn2 () {}
+ };
+ call<&B1::fn1> ();
+ call<&B2::fn2> (); // { dg-error "not external linkage|no matching" }
+ call<&fn3> ();
+ call<&B1::fn4> ();
+ call<&fn5> (); // { dg-error "not external linkage|no matching" }
+}