mirror of git://gcc.gnu.org/git/gcc.git
re PR c++/55877 (Anon visibility issues)
PR c++/55877 * decl.c (reset_type_linkage, bt_reset_linkage): New. (grokdeclarator): Use reset_type_linkage. * name-lookup.c (binding_table_foreach): Handle null table. * tree.c (decl_anon_ns_mem_p): Check TYPE_MAIN_DECL, not TYPE_NAME. From-SVN: r194910
This commit is contained in:
parent
1582c67762
commit
82f2836c6e
|
|
@ -1,3 +1,11 @@
|
||||||
|
2013-01-04 Jason Merrill <jason@redhat.com>
|
||||||
|
|
||||||
|
PR c++/55877
|
||||||
|
* decl.c (reset_type_linkage, bt_reset_linkage): New.
|
||||||
|
(grokdeclarator): Use reset_type_linkage.
|
||||||
|
* name-lookup.c (binding_table_foreach): Handle null table.
|
||||||
|
* tree.c (decl_anon_ns_mem_p): Check TYPE_MAIN_DECL, not TYPE_NAME.
|
||||||
|
|
||||||
2013-01-04 Paolo Carlini <paolo.carlini@oracle.com>
|
2013-01-04 Paolo Carlini <paolo.carlini@oracle.com>
|
||||||
|
|
||||||
PR c++/54526 (again)
|
PR c++/54526 (again)
|
||||||
|
|
|
||||||
|
|
@ -8513,6 +8513,23 @@ check_var_type (tree identifier, tree type)
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Functions for adjusting the visibility of a tagged type and its nested
|
||||||
|
types when it gets a name for linkage purposes from a typedef. */
|
||||||
|
|
||||||
|
static void bt_reset_linkage (binding_entry, void *);
|
||||||
|
static void
|
||||||
|
reset_type_linkage (tree type)
|
||||||
|
{
|
||||||
|
set_linkage_according_to_type (type, TYPE_MAIN_DECL (type));
|
||||||
|
if (CLASS_TYPE_P (type))
|
||||||
|
binding_table_foreach (CLASSTYPE_NESTED_UTDS (type), bt_reset_linkage, NULL);
|
||||||
|
}
|
||||||
|
static void
|
||||||
|
bt_reset_linkage (binding_entry b, void */*data*/)
|
||||||
|
{
|
||||||
|
reset_type_linkage (b->type);
|
||||||
|
}
|
||||||
|
|
||||||
/* Given declspecs and a declarator (abstract or otherwise), determine
|
/* Given declspecs and a declarator (abstract or otherwise), determine
|
||||||
the name and type of the object declared and construct a DECL node
|
the name and type of the object declared and construct a DECL node
|
||||||
for it.
|
for it.
|
||||||
|
|
@ -10053,8 +10070,7 @@ grokdeclarator (const cp_declarator *declarator,
|
||||||
= TYPE_IDENTIFIER (type);
|
= TYPE_IDENTIFIER (type);
|
||||||
|
|
||||||
/* Adjust linkage now that we aren't anonymous anymore. */
|
/* Adjust linkage now that we aren't anonymous anymore. */
|
||||||
set_linkage_according_to_type (type, TYPE_MAIN_DECL (type));
|
reset_type_linkage (type);
|
||||||
determine_visibility (TYPE_MAIN_DECL (type));
|
|
||||||
|
|
||||||
/* FIXME remangle member functions; member functions of a
|
/* FIXME remangle member functions; member functions of a
|
||||||
type with external linkage have external linkage. */
|
type with external linkage have external linkage. */
|
||||||
|
|
|
||||||
|
|
@ -251,9 +251,13 @@ binding_table_find (binding_table table, tree name)
|
||||||
void
|
void
|
||||||
binding_table_foreach (binding_table table, bt_foreach_proc proc, void *data)
|
binding_table_foreach (binding_table table, bt_foreach_proc proc, void *data)
|
||||||
{
|
{
|
||||||
const size_t chain_count = table->chain_count;
|
size_t chain_count;
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
|
if (!table)
|
||||||
|
return;
|
||||||
|
|
||||||
|
chain_count = table->chain_count;
|
||||||
for (i = 0; i < chain_count; ++i)
|
for (i = 0; i < chain_count; ++i)
|
||||||
{
|
{
|
||||||
binding_entry entry = table->chain[i];
|
binding_entry entry = table->chain[i];
|
||||||
|
|
|
||||||
|
|
@ -2404,7 +2404,7 @@ decl_anon_ns_mem_p (const_tree decl)
|
||||||
/* Classes and namespaces inside anonymous namespaces have
|
/* Classes and namespaces inside anonymous namespaces have
|
||||||
TREE_PUBLIC == 0, so we can shortcut the search. */
|
TREE_PUBLIC == 0, so we can shortcut the search. */
|
||||||
else if (TYPE_P (decl))
|
else if (TYPE_P (decl))
|
||||||
return (TREE_PUBLIC (TYPE_NAME (decl)) == 0);
|
return (TREE_PUBLIC (TYPE_MAIN_DECL (decl)) == 0);
|
||||||
else if (TREE_CODE (decl) == NAMESPACE_DECL)
|
else if (TREE_CODE (decl) == NAMESPACE_DECL)
|
||||||
return (TREE_PUBLIC (decl) == 0);
|
return (TREE_PUBLIC (decl) == 0);
|
||||||
else
|
else
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
// PR c++/55877
|
||||||
|
// { dg-final { scan-assembler-not "\\.local" } }
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
typedef enum { X, Y } A;
|
||||||
|
typedef struct { } B;
|
||||||
|
struct C { };
|
||||||
|
} D;
|
||||||
|
|
||||||
|
D d;
|
||||||
|
D::A a;
|
||||||
|
D::B b;
|
||||||
|
D::C c;
|
||||||
Loading…
Reference in New Issue