blob: c56153aaf71458523a7775bfeeec5976ccf97ecf [file] [log] [blame]
/* PR c++/93804 - exempt extern "C" headers from -Wredundant-tags
Verify that -Wredundant-tags is not issued for redundant class-key
in extern "C" references in a header file.
{ dg-do compile }
{ dg-options "-Wredundant-tags -ftrack-macro-expansion=0" } */
# 1 "Wredundant-tags-4.C"
# 1 "Wredundant-tags-4.h" 1
# line 10
#if __cplusplus >= 201103L
# define enum_struct enum struct
#else
# define enum_struct class
#endif
extern "C" {
class C1 { };
enum E1 { };
enum_struct ES1 { };
struct S1 { enum E1 e1; };
union U1 { enum E1 e1; struct S1 s1; };
/* The warning should be issued for the class-key class even in
an extern "C" block. */
void f0 (class C1); // { dg-warning "\\\[-Wredundant-tags" }
void f1 (enum E1); // { dg-bogus "\\\[-Wredundant-tags" }
/* Ditto for a scoped enum. */
void f2 (enum_struct ES1); // { dg-warning "\\\[-Wredundant-tags" }
// { dg-warning "must not use the 'struct' keyword" "enum struct" { target { c++11 } } .-1 }
void f3 (struct S1); // { dg-bogus "\\\[-Wredundant-tags" }
void f4 (union U1); // { dg-bogus "\\\[-Wredundant-tags" }
inline int
finline1 (class C1) // { dg-warning "\\\[-Wredundant-tags" }
{ return sizeof (class C1); } // { dg-warning "\\\[-Wredundant-tags" }
inline int
finline2 (enum E1) // { dg-bogus "\\\[-Wredundant-tags" }
{ return sizeof (enum E1); } // { dg-bogus "\\\[-Wredundant-tags" }
inline int
finline3 (enum_struct ES1) // { dg-warning "\\\[-Wredundant-tags" }
{ return sizeof (ES1); }
inline int
finline4 (struct S1) // { dg-bogus "\\\[-Wredundant-tags" }
{ return sizeof (struct S1); }
inline int
finline5 (union U1) // { dg-bogus "\\\[-Wredundant-tags" }
{ return sizeof (union U1); }
extern class C1 c1; // { dg-warning "\\\[-Wredundant-tags" }
extern enum E1 e1; // { dg-bogus "\\\[-Wredundant-tags" }
extern enum_struct ES1 es1; // { dg-warning "\\\[-Wredundant-tags" }
extern struct S1 s1; // { dg-bogus "\\\[-Wredundant-tags" }
extern union U1 u1; // { dg-bogus "\\\[-Wredundant-tags" }
namespace N1 {
/* Verify that -Wredundant-tags is issued in a namespace enclosed
in an extern "C" block. (Such code cannot be shared with C.) */
extern class C1 n1c1; // { dg-warning "\\\[-Wredundant-tags" }
extern enum E1 n1e1; // { dg-warning "\\\[-Wredundant-tags" }
extern enum_struct ES1 n1es1; // { dg-warning "\\\[-Wredundant-tags" }
extern struct S1 n1s1; // { dg-warning "\\\[-Wredundant-tags" }
extern union U1 n1u1; // { dg-warning "\\\[-Wredundant-tags" }
}
} // extern "C"
extern "C++" {
class C2 { };
enum E2 { };
enum_struct ES2 { };
struct S2 {
enum E2 e21; // { dg-warning "\\\[-Wredundant-tags" }
E2 e22;
enum_struct ES2 es21; // { dg-warning "\\\[-Wredundant-tags" }
ES2 es22;
};
union U2 { };
void f5 (class C2); // { dg-warning "\\\[-Wredundant-tags" }
void f6 (enum E2); // { dg-warning "\\\[-Wredundant-tags" }
void f7 (enum_struct ES2); // { dg-warning "\\\[-Wredundant-tags" }
void f8 (struct S2); // { dg-warning "\\\[-Wredundant-tags" }
void f9 (union U2); // { dg-warning "\\\[-Wredundant-tags" }
extern class C2 c2; // { dg-warning "\\\[-Wredundant-tags" }
extern enum E2 e2; // { dg-warning "\\\[-Wredundant-tags" }
extern enum_struct ES2 es2; // { dg-warning "\\\[-Wredundant-tags" }
extern struct S2 s2; // { dg-warning "\\\[-Wredundant-tags" }
extern union U2 u2; // { dg-warning "\\\[-Wredundant-tags" }
} // extern "C++"
namespace N {
class C3 { };
enum E3 { };
enum_struct ES3 { };
struct S3 { };
union U3 { };
void f10 (class C3); // { dg-warning "\\\[-Wredundant-tags" }
void f11 (enum E3); // { dg-warning "\\\[-Wredundant-tags" }
void f12 (enum_struct ES3); // { dg-warning "\\\[-Wredundant-tags" }
void f13 (struct S3); // { dg-warning "\\\[-Wredundant-tags" }
void f14 (union U3); // { dg-warning "\\\[-Wredundant-tags" }
extern class C3 c3; // { dg-warning "\\\[-Wredundant-tags" }
extern enum E3 e3; // { dg-warning "\\\[-Wredundant-tags" }
extern enum_struct ES3 es3; // { dg-warning "\\\[-Wredundant-tags" }
extern struct S3 s3; // { dg-warning "\\\[-Wredundant-tags" }
extern union U3 u3; // { dg-warning "\\\[-Wredundant-tags" }
extern "C" {
/* Verify that -Wredundant-tags is issued in an extern "C" block
enclosed within a namespace. (Such code cannot be shared with
C.) */
class C4 { };
enum E4 { };
enum_struct ES4 { };
struct S4 { };
union U4 { };
extern class C4 c4; // { dg-warning "\\\[-Wredundant-tags" }
extern enum E4 e4; // { dg-warning "\\\[-Wredundant-tags" }
extern enum_struct ES4 es4; // { dg-warning "\\\[-Wredundant-tags" }
extern struct S4 s4; // { dg-warning "\\\[-Wredundant-tags" }
extern union U4 u4; // { dg-warning "\\\[-Wredundant-tags" }
}
} // namespace N
// { dg-prune-output "must not use the 'struct' keyword" }