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
This commit is contained in:
Jakub Jelinek 2007-11-27 08:12:10 +01:00
parent 381d3db6b8
commit ce41114b00
4 changed files with 57 additions and 5 deletions

View File

@ -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.

View File

@ -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;

View File

@ -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>

View File

@ -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" }
}