------- Comment #30 from spark at gcc dot gnu dot org 2007-06-25 18:13 -------
The following patch will essentially disable the warning
for template instantiations in the anonymous namespace.
Index: gcc/cp/decl2.c
===================================================================
--- gcc/cp/decl2.c (revision 125999)
+++ gcc/cp/decl2.c (working copy)
@@ -1850,7 +1850,9 @@ constrain_class_visibility (tree type)
if (subvis == VISIBILITY_ANON)
{
if (strcmp (main_input_filename,
- DECL_SOURCE_FILE (TYPE_MAIN_DECL (ftype))))
+ DECL_SOURCE_FILE (TYPE_MAIN_DECL (ftype)))
+ && !(CLASS_TYPE_P (ftype)
+ && CLASSTYPE_USE_TEMPLATE (ftype)))
warning (0, "\
%qT has a field %qD whose type uses the anonymous namespace",
type, t);
@@ -1871,7 +1873,9 @@ constrain_class_visibility (tree type)
if (subvis == VISIBILITY_ANON)
{
if (strcmp (main_input_filename,
- DECL_SOURCE_FILE (TYPE_MAIN_DECL (TREE_TYPE (t)))))
+ DECL_SOURCE_FILE (TYPE_MAIN_DECL (TREE_TYPE (t))))
+ && !(CLASS_TYPE_P (TREE_TYPE (t))
+ && CLASSTYPE_USE_TEMPLATE (TREE_TYPE (t))))
warning (0, "\
%qT has a base %qT whose type uses the anonymous namespace",
type, TREE_TYPE (t));
I don't know whether it's possible to do this warning
accurately, as I can't figure out
how to recover where the template instantiation has happened
at this point in compilation.
DECL_SOURCE_FILE (TYPE_MAIN_DECL (ftype))
points to the source file of the declaration of the template itself,
not where the template instantiation happened.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29365