diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9a7c3cc85ef..6448f7a07d0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2007-04-16 Seongbae Park + + PR c++/29365 + + * cp/decl2.c (constrain_class_visibility): + Do not warn about the use of anonymous namespace in the main input file. + 2007-04-16 Kazu Hirata * config/m68k/m68k.c (m68k_libcall_value, diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index bd078330b0a..54d5aa22939 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -1860,9 +1860,13 @@ constrain_class_visibility (tree type) int subvis = type_visibility (ftype); if (subvis == VISIBILITY_ANON) - warning (0, "\ + { + if (strcmp (main_input_filename, + DECL_SOURCE_FILE (TYPE_MAIN_DECL (ftype)))) + warning (0, "\ %qT has a field %qD whose type uses the anonymous namespace", - type, t); + type, t); + } else if (IS_AGGR_TYPE (ftype) && vis < VISIBILITY_HIDDEN && subvis >= VISIBILITY_HIDDEN) @@ -1877,9 +1881,13 @@ constrain_class_visibility (tree type) int subvis = type_visibility (TREE_TYPE (t)); if (subvis == VISIBILITY_ANON) - warning (0, "\ + { + if (strcmp (main_input_filename, + DECL_SOURCE_FILE (TYPE_MAIN_DECL (TREE_TYPE (t))))) + warning (0, "\ %qT has a base %qT whose type uses the anonymous namespace", - type, TREE_TYPE (t)); + type, TREE_TYPE (t)); + } else if (vis < VISIBILITY_HIDDEN && subvis >= VISIBILITY_HIDDEN) warning (OPT_Wattributes, "\ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2e85f488c81..761a0ae7b50 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2007-04-16 Seongbae Park + + PR c++/29365 + Testcase for c++ anonymous namespace warning + + * g++.dg/warn/anonymous-namespace-1.C: New test + * g++.dg/warn/anonymous-namespace-1.h: New test + 2007-04-14 Andrew Pinski PR testsuite/31578 diff --git a/gcc/testsuite/g++.dg/warn/anonymous-namespace-1.C b/gcc/testsuite/g++.dg/warn/anonymous-namespace-1.C new file mode 100644 index 00000000000..6949f158926 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/anonymous-namespace-1.C @@ -0,0 +1,17 @@ +// Test for the warning of exposing types from an anonymous namespace +// { dg-do compile } + +#include "anonymous-namespace-1.h" + +namespace { + class good { }; +} + +class foo::bar : public good { }; +class foobar1 +{ + good g; +}; + +class foobar : public bad { }; // { dg-warning "uses the anonymous namespace" } +class foobar2 { bad b; }; // { dg-warning "uses the anonymous namespace" } diff --git a/gcc/testsuite/g++.dg/warn/anonymous-namespace-1.h b/gcc/testsuite/g++.dg/warn/anonymous-namespace-1.h new file mode 100644 index 00000000000..0d3e239e404 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/anonymous-namespace-1.h @@ -0,0 +1,7 @@ +class foo { + class bar; +}; + +namespace { + class bad { }; +}