Commit 61172206 by Jason Merrill Committed by Jason Merrill

re PR c++/29365 (Unnecessary anonymous namespace warnings)

        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.

From-SVN: r127711
parent 1840f0c2
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> 2007-08-21 Jakub Jelinek <jakub@redhat.com>
* init.c (build_new_1): Use get_target_expr instead of save_expr. * init.c (build_new_1): Use get_target_expr instead of save_expr.
...@@ -939,7 +947,6 @@ ...@@ -939,7 +947,6 @@
2007-04-16 Seongbae Park <seongbae.park@gmail.com> 2007-04-16 Seongbae Park <seongbae.park@gmail.com>
PR c++/29365 PR c++/29365
* cp/decl2.c (constrain_class_visibility): * cp/decl2.c (constrain_class_visibility):
Do not warn about the use of anonymous namespace in the main input file. Do not warn about the use of anonymous namespace in the main input file.
......
...@@ -4374,6 +4374,7 @@ extern void yyerror (const char *); ...@@ -4374,6 +4374,7 @@ extern void yyerror (const char *);
extern void yyhook (int); extern void yyhook (int);
extern bool cxx_init (void); extern bool cxx_init (void);
extern void cxx_finish (void); extern void cxx_finish (void);
extern bool in_main_input_context (void);
/* in method.c */ /* in method.c */
extern void init_method (void); extern void init_method (void);
...@@ -4465,6 +4466,7 @@ extern tree build_non_dependent_args (tree); ...@@ -4465,6 +4466,7 @@ extern tree build_non_dependent_args (tree);
extern bool reregister_specialization (tree, tree, tree); extern bool reregister_specialization (tree, tree, tree);
extern tree fold_non_dependent_expr (tree); extern tree fold_non_dependent_expr (tree);
extern bool explicit_class_specialization_p (tree); extern bool explicit_class_specialization_p (tree);
extern tree outermost_tinst_level (void);
/* in repo.c */ /* in repo.c */
extern void init_repo (void); extern void init_repo (void);
......
...@@ -1854,8 +1854,7 @@ constrain_class_visibility (tree type) ...@@ -1854,8 +1854,7 @@ constrain_class_visibility (tree type)
if (subvis == VISIBILITY_ANON) if (subvis == VISIBILITY_ANON)
{ {
if (strcmp (main_input_filename, if (!in_main_input_context ())
DECL_SOURCE_FILE (TYPE_MAIN_DECL (ftype))))
warning (0, "\ warning (0, "\
%qT has a field %qD whose type uses the anonymous namespace", %qT has a field %qD whose type uses the anonymous namespace",
type, t); type, t);
...@@ -1875,8 +1874,7 @@ constrain_class_visibility (tree type) ...@@ -1875,8 +1874,7 @@ constrain_class_visibility (tree type)
if (subvis == VISIBILITY_ANON) if (subvis == VISIBILITY_ANON)
{ {
if (strcmp (main_input_filename, if (!in_main_input_context())
DECL_SOURCE_FILE (TYPE_MAIN_DECL (TREE_TYPE (t)))))
warning (0, "\ warning (0, "\
%qT has a base %qT whose type uses the anonymous namespace", %qT has a base %qT whose type uses the anonymous namespace",
type, TREE_TYPE (t)); type, TREE_TYPE (t));
......
...@@ -849,3 +849,18 @@ make_aggr_type (enum tree_code code) ...@@ -849,3 +849,18 @@ make_aggr_type (enum tree_code code)
return t; 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;
}
...@@ -6045,6 +6045,15 @@ reopen_tinst_level (tree level) ...@@ -6045,6 +6045,15 @@ reopen_tinst_level (tree level)
pop_tinst_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 /* DECL is a friend FUNCTION_DECL or TEMPLATE_DECL. ARGS is the
vector of template arguments, as for tsubst. vector of template arguments, as for tsubst.
......
...@@ -13,5 +13,6 @@ class foobar1 ...@@ -13,5 +13,6 @@ class foobar1
good g; good g;
}; };
#line 17 "foo.C"
class foobar : public bad { }; // { dg-warning "uses the anonymous namespace" } class foobar : public bad { }; // { dg-warning "uses the anonymous namespace" }
class foobar2 { bad b; }; // { dg-warning "uses the anonymous namespace" } class foobar2 { bad b; }; // { dg-warning "uses the anonymous namespace" }
...@@ -10,20 +10,20 @@ namespace { ...@@ -10,20 +10,20 @@ namespace {
struct g1 { struct g1 {
good * A; good * A;
}; };
struct b1 { // { dg-warning "uses the anonymous namespace" }
bad * B;
};
struct g2 { struct g2 {
good * A[1]; good * A[1];
}; };
struct b2 { // { dg-warning "uses the anonymous namespace" }
bad * B[1];
};
struct g3 { struct g3 {
good (*A)[1]; 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" } struct b3 { // { dg-warning "uses the anonymous namespace" }
bad (*B)[1]; bad (*B)[1];
}; };
// 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;
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment