view gcc/testsuite/g++.dg/warn/Wredundant-tags.C @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
line wrap: on
line source

/* PR c++/61339 - add mismatch between struct and class
   Test to verify that -Wredundant-tags is issued for references to class
   types that use the class-key even though they don't need to.
   { dg-do compile }
   { dg-options "-Wredundant-tags" } */

struct A;

extern A *pa;
extern struct A *pa;        // { dg-warning "redundant class-key 'struct' in reference to 'struct A'" }

extern A aa[];
extern struct A aa[];       // { dg-warning "redundant class-key 'struct' in reference to 'struct A'" }

void func (A*);
void func (struct A*);      // { dg-warning "redundant class-key 'struct' in reference to 'struct A'" }

int A;

extern struct A *pa;
extern struct A aa[];
void func (struct A*);


class B;

extern B *pb;
extern class B *pb;         // { dg-warning "redundant class-key 'class' in reference to 'class B'" }

extern B ab[];
extern class B ab[];        // { dg-warning "redundant class-key 'class' in reference to 'class B'" }

void func (B*);
void func (class B*);       // { dg-warning "redundant class-key 'class' in reference to 'class B'" }

int B;

extern class B *pb;
extern class B ab[];
void func (class B*);


enum C { c0 };

extern C *pc;
extern enum C *pc;          // { dg-warning "redundant enum-key 'enum' in reference to 'enum C'" }

extern C ac[];
extern enum C ac[];         // { dg-warning "redundant enum-key 'enum' in reference to 'enum C'" }

void func (C*);
void func (enum C*);        // { dg-warning "redundant enum-key 'enum' in reference to 'enum C'" }

int C;

extern enum C *pc;
extern enum C ac[];
void func (enum C*);


#if __cplusplus > 199711L

enum class D1 { d1 };
enum struct D2 { d2 };

#else

enum D1 { d1 };
enum D2 { d2 };

#endif

extern D1 *pd1;
extern D2 *pd2;
extern enum D1 *pd1;        // { dg-warning "redundant enum-key 'enum' in reference to 'enum class D1'" "C++ 11 and above" { target c++11 } }
                            // { dg-warning "redundant enum-key 'enum' in reference to 'enum D1'" "C++ 98" { target c++98_only } .-1 }

extern enum D2 *pd2;        // { dg-warning "redundant enum-key 'enum' in reference to 'enum class D2'" "C++ 11 and above" { target c++11 } }
                            // { dg-warning "redundant enum-key 'enum' in reference to 'enum D2'" "C++ 98" { target c++98_only } .-1 }

extern D1 ad1[];
extern D2 ad2[];

#if __cplusplus > 199711L
extern enum class D1 ad1[]; // { dg-warning "redundant enum-key 'enum class' in reference to 'enum class D1'" "C++ 11 and above" { target c++11 } }
                            // { dg-warning "elaborated-type-specifier for a scoped enum must not use the 'class' keyword" "C++ 11 and above" { target c++11 } .-1 }
/* The pretty printer cannot differentiate between enum class and enum struct
   because the C++ front-end doesn't encode it so allow for both in the text
   of the warning below.  */
extern enum struct D2 ad2[]; // { dg-warning "redundant enum-key 'enum struct' in reference to 'enum \(class|struct\) D2'" "C++ 11 and above" { target c++11 } }
                            // { dg-warning "elaborated-type-specifier for a scoped enum must not use the 'struct' keyword" "C++ 11 and above" { target c++11 } .-1 }
#else
extern enum D1 ad1[];       // { dg-warning "redundant enum-key 'enum' in reference to 'enum D1'" "C++ 98" { target c++98_only } }
#endif

void func (D1*);
void func (enum D1*);       // { dg-warning "redundant enum-key 'enum' in reference to 'enum " }

void func (D2*);
void func (enum D2*);       // { dg-warning "redundant enum-key 'enum' in reference to 'enum " }

int D1, D2;

extern enum D1 *pd1;
extern enum D1 ad1[];
void func (enum D1*);

extern enum D2 *pd2;
extern enum D2 ad2[];
void func (enum D2*);


union U;

extern U *pu;
extern union U *pu;         // { dg-warning "redundant class-key 'union' in reference to 'union U'" }

extern U au[];
extern union U au[];        // { dg-warning "redundant class-key 'union' in reference to 'union U'" }

void func (U*);
void func (union U*);       // { dg-warning "redundant class-key 'union' in reference to 'union U'" }

int U;

extern union U *pu;
extern union U au[];
void func (union U*);