71 lines
2.3 KiB
C
71 lines
2.3 KiB
C
/* Test typedef redeclaration in C11. */
|
|
/* { dg-do compile } */
|
|
/* { dg-options "-std=c11 -pedantic-errors" } */
|
|
|
|
/* C11 permits typedefs to be redeclared to the same type, but not to
|
|
different-but-compatible types, and not when the type is variably
|
|
modified. */
|
|
|
|
#include <limits.h>
|
|
|
|
typedef int TI;
|
|
typedef int TI2;
|
|
typedef TI2 TI;
|
|
typedef TI TI2;
|
|
|
|
enum e { E1 = 0, E2 = INT_MAX, E3 = -1 };
|
|
typedef enum e TE;
|
|
typedef enum e TE; /* { dg-message "previous declaration" } */
|
|
typedef int TE; /* { dg-error "with different type" } */
|
|
|
|
struct s;
|
|
typedef struct s TS;
|
|
struct s { int i; };
|
|
typedef struct s TS;
|
|
|
|
typedef int IA[];
|
|
typedef TI2 IA[]; /* { dg-message "previous declaration" } */
|
|
typedef int A2[2];
|
|
typedef TI A2[2]; /* { dg-message "previous declaration" } */
|
|
typedef IA A2; /* { dg-error "with different type" } */
|
|
typedef int A3[3];
|
|
typedef A3 IA; /* { dg-error "with different type" } */
|
|
|
|
typedef void F(int);
|
|
typedef void F(TI); /* { dg-message "previous declaration" } */
|
|
typedef void F(enum e); /* { dg-error "with different type" } */
|
|
|
|
typedef int G(void);
|
|
typedef TI G(void); /* { dg-message "previous declaration" } */
|
|
typedef enum e G(void); /* { dg-error "with different type" } */
|
|
|
|
typedef int *P;
|
|
typedef TI *P; /* { dg-message "previous declaration" } */
|
|
typedef enum e *P; /* { dg-error "with different type" } */
|
|
|
|
typedef void F2();
|
|
typedef void F2(); /* { dg-message "previous declaration" } */
|
|
typedef void F2(int); /* { dg-error "with different type" } */
|
|
|
|
void
|
|
f (void)
|
|
{
|
|
int a = 1;
|
|
int b = 2;
|
|
typedef void FN(int (*p)[a]);
|
|
typedef void FN(int (*p)[b]);
|
|
typedef void FN(int (*p)[*]); /* { dg-message "previous declaration" } */
|
|
typedef void FN(int (*p)[1]); /* { dg-error "with different type" } */
|
|
typedef void FN2(int (*p)[a]);
|
|
typedef void FN2(int (*p)[b]);
|
|
typedef void FN2(int (*p)[*]); /* { dg-message "previous declaration" } */
|
|
typedef void FN2(int (*p)[]); /* { dg-error "with different type" } */
|
|
typedef int AV[a]; /* { dg-message "previous declaration" } */
|
|
typedef int AV[b-1]; /* { dg-error "redefinition" } */
|
|
typedef int AAa[a]; /* { dg-message "previous declaration" } */
|
|
typedef int AAb[b-1];
|
|
typedef AAa *VF(void); /* { dg-message "previous declaration" } */
|
|
typedef AAb *VF(void); /* { dg-error "redefinition" } */
|
|
typedef AAa AAa; /* { dg-error "redefinition" } */
|
|
}
|