From 9fc444cc61c77936768d85191cad5d0b76491a37 Mon Sep 17 00:00:00 2001 From: Geoffrey Keating Date: Thu, 4 Mar 2004 22:43:03 +0000 Subject: [PATCH] Index: cp/ChangeLog 2004-03-04 Geoffrey Keating * decl.c (grokfndecl): Update old incorrect comment. (grokvardecl): Diagnose C++ variables of type with no linkage. Index: testsuite/ChangeLog 2004-03-04 Geoffrey Keating * g++.old-deja/g++.other/linkage1.C: Expect errors about global variables of a type with no linkage. * g++.old-deja/g++.other/qual1.C: Name class for 'action'. * g++.old-deja/g++.mike/misc13.C: Name enum for 'want'. * g++.old-deja/g++.bugs/900210_01.C: Name enum for 'ep'. * g++.old-deja/g++.bugs/900210_02.C: Likewise. * g++.old-deja/g++.bugs/900210_03.C: Likewise. * g++.old-deja/g++.brendan/bit-fields2.C: Name structure for 's'. * g++.old-deja/g++.brendan/init10.C: Name structure for 'a'. * g++.dg/warn/deprecated.C: Name enum Color. * g++.dg/overload/VLA.C: Name structure for 'b'. * g++.dg/lookup/anon2.C: Expect diagnostic about type linkage. From-SVN: r78939 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/decl.c | 17 ++++++++++++++--- gcc/testsuite/ChangeLog | 15 +++++++++++++++ gcc/testsuite/g++.dg/lookup/anon2.C | 2 +- gcc/testsuite/g++.dg/overload/VLA.C | 2 +- gcc/testsuite/g++.dg/warn/deprecated.C | 2 +- .../g++.old-deja/g++.brendan/bit-fields2.C | 2 +- gcc/testsuite/g++.old-deja/g++.brendan/init10.C | 2 +- gcc/testsuite/g++.old-deja/g++.bugs/900210_01.C | 6 +++--- gcc/testsuite/g++.old-deja/g++.bugs/900210_02.C | 6 +++--- gcc/testsuite/g++.old-deja/g++.bugs/900210_03.C | 4 ++-- gcc/testsuite/g++.old-deja/g++.mike/misc13.C | 2 +- gcc/testsuite/g++.old-deja/g++.other/linkage1.C | 10 +++++----- gcc/testsuite/g++.old-deja/g++.other/qual1.C | 2 +- 14 files changed, 54 insertions(+), 23 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e4f77028077..ff86869629e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2004-03-04 Geoffrey Keating + + * decl.c (grokfndecl): Update old incorrect comment. + (grokvardecl): Diagnose C++ variables of type with no linkage. + 2004-03-01 Mark Mitchell PR c++/14369 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 64aad7207a0..1c0ed25974a 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -5544,8 +5544,7 @@ grokfndecl (tree ctype, } /* Members of anonymous types and local classes have no linkage; make - them internal. */ - /* FIXME what if it gets a name from typedef? */ + them internal. If a typedef is made later, this will be changed. */ if (ctype && (TYPE_ANONYMOUS_P (ctype) || decl_function_context (TYPE_MAIN_DECL (ctype)))) publicp = 0; @@ -5880,7 +5879,19 @@ grokvardecl (tree type, if (t) { if (TYPE_ANONYMOUS_P (t)) - /* Ignore for now; `enum { foo } e' is pretty common. */; + { + if (DECL_EXTERN_C_P (decl)) + /* Allow this; it's pretty common in C. */; + else + { + pedwarn ("non-local variable `%#D' uses anonymous type", + decl); + if (DECL_ORIGINAL_TYPE (TYPE_NAME (t))) + cp_pedwarn_at ("\ +`%#D' does not refer to the unqualified type, so it is not used for linkage", + TYPE_NAME (t)); + } + } else pedwarn ("non-local variable `%#D' uses local type `%T'", decl, t); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 931439d24b5..1b730c64f0d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,18 @@ +2004-03-04 Geoffrey Keating + + * g++.old-deja/g++.other/linkage1.C: Expect errors about + global variables of a type with no linkage. + * g++.old-deja/g++.other/qual1.C: Name class for 'action'. + * g++.old-deja/g++.mike/misc13.C: Name enum for 'want'. + * g++.old-deja/g++.bugs/900210_01.C: Name enum for 'ep'. + * g++.old-deja/g++.bugs/900210_02.C: Likewise. + * g++.old-deja/g++.bugs/900210_03.C: Likewise. + * g++.old-deja/g++.brendan/bit-fields2.C: Name structure for 's'. + * g++.old-deja/g++.brendan/init10.C: Name structure for 'a'. + * g++.dg/warn/deprecated.C: Name enum Color. + * g++.dg/overload/VLA.C: Name structure for 'b'. + * g++.dg/lookup/anon2.C: Expect diagnostic about type linkage. + 2004-03-04 Eric Botcazou * gcc.c-torture/compile/20040304-1.c: New test. diff --git a/gcc/testsuite/g++.dg/lookup/anon2.C b/gcc/testsuite/g++.dg/lookup/anon2.C index b0a7c07af96..4cd64aecb49 100644 --- a/gcc/testsuite/g++.dg/lookup/anon2.C +++ b/gcc/testsuite/g++.dg/lookup/anon2.C @@ -1,6 +1,6 @@ // { dg-do compile } // { dg-options "" } -class { int i; } a; // { dg-error "private" } +class { int i; } a; // { dg-error "private|anonymous type" } void foo() { a.i; } // { dg-error "context" } diff --git a/gcc/testsuite/g++.dg/overload/VLA.C b/gcc/testsuite/g++.dg/overload/VLA.C index 850e19a0054..0c748f50c7d 100644 --- a/gcc/testsuite/g++.dg/overload/VLA.C +++ b/gcc/testsuite/g++.dg/overload/VLA.C @@ -6,7 +6,7 @@ // { dg-do compile } -struct { +struct S { int (*p)[]; } B; diff --git a/gcc/testsuite/g++.dg/warn/deprecated.C b/gcc/testsuite/g++.dg/warn/deprecated.C index 10560705031..aa7a5b09db9 100644 --- a/gcc/testsuite/g++.dg/warn/deprecated.C +++ b/gcc/testsuite/g++.dg/warn/deprecated.C @@ -20,7 +20,7 @@ INT2 f4(void) { return 0; } /* { dg-warning "`INT2' is deprecated" "" } */ int f5(INT2 x); /* { dg-warning "`INT2' is deprecated" "" } */ int f6(INT2 x) __attribute__ ((__deprecated__)); -typedef enum {red, green, blue} Color __attribute__((deprecated)); +typedef enum Color {red, green, blue} Color __attribute__((deprecated)); int g1; int g2 __attribute__ ((deprecated)); diff --git a/gcc/testsuite/g++.old-deja/g++.brendan/bit-fields2.C b/gcc/testsuite/g++.old-deja/g++.brendan/bit-fields2.C index af5703ca3c9..394d035017a 100644 --- a/gcc/testsuite/g++.old-deja/g++.brendan/bit-fields2.C +++ b/gcc/testsuite/g++.old-deja/g++.brendan/bit-fields2.C @@ -1,6 +1,6 @@ // { dg-do assemble } // GROUPS passed bit-fields - struct { + struct S { char c; int i:8; } s; diff --git a/gcc/testsuite/g++.old-deja/g++.brendan/init10.C b/gcc/testsuite/g++.old-deja/g++.brendan/init10.C index 35d214e6fe1..0080420bdcd 100644 --- a/gcc/testsuite/g++.old-deja/g++.brendan/init10.C +++ b/gcc/testsuite/g++.old-deja/g++.brendan/init10.C @@ -1,3 +1,3 @@ // { dg-do assemble } // GROUPS passed initialization -struct { int :0; } a; +struct S { int :0; } a; diff --git a/gcc/testsuite/g++.old-deja/g++.bugs/900210_01.C b/gcc/testsuite/g++.old-deja/g++.bugs/900210_01.C index 31509119eec..5bbac2cba1d 100644 --- a/gcc/testsuite/g++.old-deja/g++.bugs/900210_01.C +++ b/gcc/testsuite/g++.old-deja/g++.bugs/900210_01.C @@ -15,7 +15,7 @@ char c; float f; double d; long double ld; -enum {enum_value_0} e; +enum E {enum_value_0} e; signed int si; signed long sl; @@ -30,8 +30,8 @@ unsigned char uc; void* vp; char* cp; int* ip; -enum {enum_value_1} * ep; -struct { int member; } * sp; +enum E2 {enum_value_1} * ep; +struct S { int member; } * sp; void (*fp) (void); void global_function () diff --git a/gcc/testsuite/g++.old-deja/g++.bugs/900210_02.C b/gcc/testsuite/g++.old-deja/g++.bugs/900210_02.C index 11fc184b506..b2d38cdbef3 100644 --- a/gcc/testsuite/g++.old-deja/g++.bugs/900210_02.C +++ b/gcc/testsuite/g++.old-deja/g++.bugs/900210_02.C @@ -16,7 +16,7 @@ char c; float f; double d; long double ld; -enum {enum_value_0} e; +enum E {enum_value_0} e; signed int si; signed long sl; @@ -31,8 +31,8 @@ unsigned char uc; void* vp; char* cp; int* ip; -enum {enum_value_1} * ep; -struct { int member; } * sp; +enum E2 {enum_value_1} * ep; +struct S { int member; } * sp; void (*fp) (void); void global_function () diff --git a/gcc/testsuite/g++.old-deja/g++.bugs/900210_03.C b/gcc/testsuite/g++.old-deja/g++.bugs/900210_03.C index effebf17770..5f90542759d 100644 --- a/gcc/testsuite/g++.old-deja/g++.bugs/900210_03.C +++ b/gcc/testsuite/g++.old-deja/g++.bugs/900210_03.C @@ -11,8 +11,8 @@ void* vp; char* cp; int* ip; -enum {enum_value_1} * ep; -struct { int member; } * sp; +enum E {enum_value_1} * ep; +struct S { int member; } * sp; void (*fp) (void); void global_function () diff --git a/gcc/testsuite/g++.old-deja/g++.mike/misc13.C b/gcc/testsuite/g++.old-deja/g++.mike/misc13.C index d21a9164132..f85a4f408f6 100644 --- a/gcc/testsuite/g++.old-deja/g++.mike/misc13.C +++ b/gcc/testsuite/g++.old-deja/g++.mike/misc13.C @@ -1,7 +1,7 @@ // { dg-do run } // GROUPS passed vtable extern "C" int printf (const char *, ...); -enum { vf_request, vf_event } want; +enum E { vf_request, vf_event } want; int errs = 0; diff --git a/gcc/testsuite/g++.old-deja/g++.other/linkage1.C b/gcc/testsuite/g++.old-deja/g++.other/linkage1.C index 10ee251346d..5e8ee1b4364 100644 --- a/gcc/testsuite/g++.old-deja/g++.other/linkage1.C +++ b/gcc/testsuite/g++.old-deja/g++.other/linkage1.C @@ -3,13 +3,13 @@ typedef struct { int i; } *p; -void f (p) { } // { dg-error "" } function uses anonymous type -p q; +void f (p) { } // { dg-error "uses anonymous type" } +p q; // { dg-error "uses anonymous type" } int main() { - extern p j; + extern p j; // { dg-error "uses anonymous type" } struct A { int j; }; - extern A a; // { dg-error "" } extern uses local type - extern void f (A); // { dg-error "" } extern uses local type + extern A a; // { dg-error "uses local type" } + extern void f (A); // { dg-error "uses local type" } } diff --git a/gcc/testsuite/g++.old-deja/g++.other/qual1.C b/gcc/testsuite/g++.old-deja/g++.other/qual1.C index 03c38548e94..8040ee29695 100644 --- a/gcc/testsuite/g++.old-deja/g++.other/qual1.C +++ b/gcc/testsuite/g++.old-deja/g++.other/qual1.C @@ -6,7 +6,7 @@ typedef const char *(func_type)(); -class +class C { public: func_type *Function; -- 2.30.2