Commit 6b211746 by Alexandre Oliva Committed by Alexandre Oliva

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
parent 61961eff
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);
}
}
......
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.
......
// { 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" }
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