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
This commit is contained in:
parent
1840f0c270
commit
6117220672
9 changed files with 59 additions and 13 deletions
|
@ -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.
|
||||
|
@ -939,7 +947,6 @@
|
|||
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.
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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));
|
||||
|
|
15
gcc/cp/lex.c
15
gcc/cp/lex.c
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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" }
|
||||
|
|
|
@ -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 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 g3 {
|
||||
good (*A)[1];
|
||||
};
|
||||
struct b3 { // { dg-warning "uses the anonymous namespace" }
|
||||
bad (*B)[1];
|
||||
};
|
||||
|
|
13
gcc/testsuite/g++.dg/warn/anonymous-namespace-3.C
Normal file
13
gcc/testsuite/g++.dg/warn/anonymous-namespace-3.C
Normal file
|
@ -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;
|
||||
};
|
1
gcc/testsuite/g++.dg/warn/anonymous-namespace-3.h
Normal file
1
gcc/testsuite/g++.dg/warn/anonymous-namespace-3.h
Normal file
|
@ -0,0 +1 @@
|
|||
namespace { struct A; }
|
Loading…
Add table
Reference in a new issue