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:
parent
61961eff56
commit
6b21174689
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -4,4 +4,4 @@
|
|||
|
||||
// { dg-do compile }
|
||||
|
||||
enum { a = 3 } x;
|
||||
enum { a = 3 } x; // { dg-warning "anonymous type" }
|
||||
|
|
Loading…
Reference in New Issue