PR c++/29365
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 22 Aug 2007 17:23:37 +0000 (17:23 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 22 Aug 2007 17:23:37 +0000 (17:23 +0000)
        * pt.c (outermost_tinst_level): New function.
        * lex.c (in_main_input_context): New function.
        * decl2.c (constrain_class_visibility): Use it to avoid warning
        about uses of the anonymous namespace in the main input file.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@127711 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/decl2.c
gcc/cp/lex.c
gcc/cp/pt.c
gcc/testsuite/g++.dg/warn/anonymous-namespace-1.C
gcc/testsuite/g++.dg/warn/anonymous-namespace-2.C
gcc/testsuite/g++.dg/warn/anonymous-namespace-3.C [new file with mode: 0644]
gcc/testsuite/g++.dg/warn/anonymous-namespace-3.h [new file with mode: 0644]

index e21bb0f..fa83612 100644 (file)
@@ -1,3 +1,11 @@
+2007-08-22  Jason Merrill  <jason@redhat.com>
+
+       PR c++/29365
+       * pt.c (outermost_tinst_level): New function.
+       * lex.c (in_main_input_context): New function.
+       * decl2.c (constrain_class_visibility): Use it to avoid warning
+       about uses of the anonymous namespace in the main input file.
+
 2007-08-21  Jakub Jelinek  <jakub@redhat.com>
 
        * init.c (build_new_1): Use get_target_expr instead of save_expr.
 2007-04-16  Seongbae Park <seongbae.park@gmail.com>
 
        PR c++/29365
-
        * cp/decl2.c (constrain_class_visibility):
        Do not warn about the use of anonymous namespace in the main input file.
 
index c715cd7..5aea98b 100644 (file)
@@ -4374,6 +4374,7 @@ extern void yyerror                               (const char *);
 extern void yyhook                             (int);
 extern bool cxx_init                           (void);
 extern void cxx_finish                         (void);
+extern bool in_main_input_context              (void);
 
 /* in method.c */
 extern void init_method                                (void);
@@ -4465,6 +4466,7 @@ extern tree build_non_dependent_args              (tree);
 extern bool reregister_specialization          (tree, tree, tree);
 extern tree fold_non_dependent_expr            (tree);
 extern bool explicit_class_specialization_p     (tree);
+extern tree outermost_tinst_level              (void);
 
 /* in repo.c */
 extern void init_repo                          (void);
index 97a03c7..2708e58 100644 (file)
@@ -1854,8 +1854,7 @@ constrain_class_visibility (tree type)
 
        if (subvis == VISIBILITY_ANON)
          {
-           if (strcmp (main_input_filename,
-                       DECL_SOURCE_FILE (TYPE_MAIN_DECL (ftype))))
+           if (!in_main_input_context ())
              warning (0, "\
 %qT has a field %qD whose type uses the anonymous namespace",
                       type, t);
@@ -1875,8 +1874,7 @@ constrain_class_visibility (tree type)
 
       if (subvis == VISIBILITY_ANON)
         {
-         if (strcmp (main_input_filename,
-                     DECL_SOURCE_FILE (TYPE_MAIN_DECL (TREE_TYPE (t)))))
+         if (!in_main_input_context())
            warning (0, "\
 %qT has a base %qT whose type uses the anonymous namespace",
                     type, TREE_TYPE (t));
index 3a2caec..e62887d 100644 (file)
@@ -849,3 +849,18 @@ make_aggr_type (enum tree_code code)
 
   return t;
 }
+
+/* Returns true if we are currently in the main source file, or in a
+   template instantiation started from the main source file.  */
+
+bool
+in_main_input_context (void)
+{
+  tree tl = outermost_tinst_level();
+
+  if (tl)
+    return strcmp (main_input_filename,
+                  LOCATION_FILE (TINST_LOCATION (tl))) == 0;
+  else
+    return strcmp (main_input_filename, input_filename) == 0;
+}
index 3f218e6..b4a9b68 100644 (file)
@@ -6045,6 +6045,15 @@ reopen_tinst_level (tree level)
   pop_tinst_level ();
 }
 
+/* Returns the TINST_LEVEL which gives the original instantiation
+   context.  */
+
+tree
+outermost_tinst_level (void)
+{
+  return tree_last (current_tinst_level);
+}
+
 /* DECL is a friend FUNCTION_DECL or TEMPLATE_DECL.  ARGS is the
    vector of template arguments, as for tsubst.
 
index 6949f15..cf193e0 100644 (file)
@@ -13,5 +13,6 @@ class foobar1
   good g;
 };
 
+#line 17 "foo.C"
 class foobar : public bad { }; // { dg-warning "uses the anonymous namespace" }
 class foobar2 { bad b; }; // { dg-warning "uses the anonymous namespace" }
index 4d87b69..4048f39 100644 (file)
@@ -10,20 +10,20 @@ namespace {
 struct g1 {
     good * A;
 };
-struct b1 { // { dg-warning "uses the anonymous namespace" }
-    bad * B;
-};
-
 struct g2 {
     good * A[1];
 };
-struct b2 { // { dg-warning "uses the anonymous namespace" }
-    bad * B[1];
-};
-
 struct g3 {
     good (*A)[1];
 };
+
+#line 21 "foo.C"
+struct b1 { // { dg-warning "uses the anonymous namespace" }
+    bad * B;
+};
+struct b2 { // { dg-warning "uses the anonymous namespace" }
+    bad * B[1];
+};
 struct b3 { // { dg-warning "uses the anonymous namespace" }
     bad (*B)[1];
 };
diff --git a/gcc/testsuite/g++.dg/warn/anonymous-namespace-3.C b/gcc/testsuite/g++.dg/warn/anonymous-namespace-3.C
new file mode 100644 (file)
index 0000000..fee48b4
--- /dev/null
@@ -0,0 +1,13 @@
+// Test for the warning of exposing types from an anonymous namespace
+// { dg-do compile }
+//
+#include <memory>
+#include "anonymous-namespace-3.h"
+
+struct B { std::auto_ptr<A> p; };
+
+#line 10 "foo.C"
+struct C
+{ // { dg-warning "uses the anonymous namespace" }
+  std::auto_ptr<A> p;
+};
diff --git a/gcc/testsuite/g++.dg/warn/anonymous-namespace-3.h b/gcc/testsuite/g++.dg/warn/anonymous-namespace-3.h
new file mode 100644 (file)
index 0000000..0c7c1f8
--- /dev/null
@@ -0,0 +1 @@
+namespace { struct A; }