diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 293238eab30..37e7a3c2bf8 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,6 +1,12 @@ +2007-11-27 Jakub Jelinek + + 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 - 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 252195d3ca8..6ae05686614 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 5363cf2b648..10ce3a5a4c2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-11-27 Jakub Jelinek + + PR c++/34213 + * g++.dg/ext/visibility/anon8.C: New test. + 2007-11-13 Michael Meissner PR target/34077 @@ -22,7 +27,7 @@ 2007-11-26 Andreas Krebbel - PR 34081/C++ + PR c++/34081 * g++.dg/template/dependent-expr6.C: New testcase. 2007-11-26 Uros Bizjak 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 00000000000..827cc221741 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/anon8.C @@ -0,0 +1,33 @@ +// PR c++/34213 +// { dg-do compile } + +template +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" } +}