decl.c (grokvardecl): Don't exempt anonymous types from having linkage for variables that have...

gcc/cp/ChangeLog:
* decl.c (grokvardecl): Don't exempt anonymous types from having
linkage for variables that have linkage other than "C".
gcc/testsuite/ChangeLog:
* g++.dg/lookup/anon2.C: Don't let access checks make it look like
the test passes.
* g++.dg/other/anon3.C: Accept a warning.

From-SVN: r95462
This commit is contained in:
Alexandre Oliva 2005-02-23 18:57:43 +00:00 committed by Alexandre Oliva
parent 61961eff56
commit 6b21174689
5 changed files with 26 additions and 20 deletions

View File

@ -1,3 +1,8 @@
2005-02-23 Alexandre Oliva <aoliva@redhat.com>
* decl.c (grokvardecl): Don't exempt anonymous types from having
linkage for variables that have linkage other than "C".
2005-02-23 Kazu Hirata <kazu@cs.umass.edu>
* cp-objcp-common.h, error.c: Update copyright.

View File

@ -5924,8 +5924,7 @@ grokvardecl (tree type,
declare an entity with linkage.
Only check this for public decls for now. */
tree t1 = TREE_TYPE (decl);
tree t = no_linkage_check (t1, /*relaxed_p=*/false);
tree t = no_linkage_check (TREE_TYPE (decl), /*relaxed_p=*/false);
if (t)
{
if (TYPE_ANONYMOUS_P (t))
@ -5933,29 +5932,22 @@ grokvardecl (tree type,
if (DECL_EXTERN_C_P (decl))
/* Allow this; it's pretty common in C. */
;
else if (same_type_ignoring_top_level_qualifiers_p(t1, t))
/* This is something like "enum { a = 3 } x;", which is
well formed. The enum doesn't have "a name with no
linkage", because it has no name. See closed CWG issue
132.
Note that while this construct is well formed in C++03
it is likely to become ill formed in C++0x. See open
CWG issue 389 and related issues. */
;
else
{
/* It's a typedef referring to an anonymous type. */
pedwarn ("non-local variable %q#D uses anonymous type",
/* DRs 132, 319 and 389 seem to indicate types with
no linkage can only be used to declare extern "C"
entities. Since it's not always an error in the
ISO C++ 90 Standard, we only issue a warning. */
warning ("non-local variable %q#D uses anonymous type",
decl);
if (DECL_ORIGINAL_TYPE (TYPE_NAME (t)))
cp_pedwarn_at ("%q#D does not refer to the unqualified "
"type, so it is not used for linkage",
cp_warning_at ("%q#D does not refer to the unqualified "
"type, so it is not used for linkage",
TYPE_NAME (t));
}
}
else
pedwarn ("non-local variable %q#D uses local type %qT", decl, t);
warning ("non-local variable %q#D uses local type %qT", decl, t);
}
}

View File

@ -1,3 +1,9 @@
2005-02-23 Alexandre Oliva <aoliva@redhat.com>
* g++.dg/lookup/anon2.C: Don't let access checks make it look like
the test passes.
* g++.dg/other/anon3.C: Accept a warning.
2005-02-23 Kazu Hirata <kazu@cs.umass.edu>
* gcc.dg/pr20017.c: Fix a comment typo.

View File

@ -1,6 +1,9 @@
// { dg-do compile }
// { dg-options "" }
class { int i; } a; // { dg-error "private|anonymous type" }
void foo() { a.i; } // { dg-error "context" }
// Make sure we issue a diagnostic if a type with no linkage is used
// to declare a a variable that has linkage.
struct { int i; } a; // { dg-warning "anonymous type" }
void foo() { a.i; }

View File

@ -4,4 +4,4 @@
// { dg-do compile }
enum { a = 3 } x;
enum { a = 3 } x; // { dg-warning "anonymous type" }