From 6b2117468998909065f7075541593af7ee9d8268 Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Wed, 23 Feb 2005 18:57:43 +0000 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/decl.c | 26 +++++++++----------------- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/lookup/anon2.C | 7 +++++-- gcc/testsuite/g++.dg/other/anon3.C | 2 +- 5 files changed, 26 insertions(+), 20 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 55b43508db7..c8b31120e3c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2005-02-23 Alexandre Oliva + + * decl.c (grokvardecl): Don't exempt anonymous types from having + linkage for variables that have linkage other than "C". + 2005-02-23 Kazu Hirata * cp-objcp-common.h, error.c: Update copyright. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index a224efc466b..bf0fb20061c 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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); } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 70a750a25cb..408b0c2dae8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2005-02-23 Alexandre Oliva + + * 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 * gcc.dg/pr20017.c: Fix a comment typo. diff --git a/gcc/testsuite/g++.dg/lookup/anon2.C b/gcc/testsuite/g++.dg/lookup/anon2.C index 4cd64aecb49..d556ba0034a 100644 --- a/gcc/testsuite/g++.dg/lookup/anon2.C +++ b/gcc/testsuite/g++.dg/lookup/anon2.C @@ -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; } diff --git a/gcc/testsuite/g++.dg/other/anon3.C b/gcc/testsuite/g++.dg/other/anon3.C index 87cbfb544cd..87116eb8901 100644 --- a/gcc/testsuite/g++.dg/other/anon3.C +++ b/gcc/testsuite/g++.dg/other/anon3.C @@ -4,4 +4,4 @@ // { dg-do compile } -enum { a = 3 } x; +enum { a = 3 } x; // { dg-warning "anonymous type" }