blob: 1eb0f8dd760cc32a676056765b793903670ec60d [file] [log] [blame]
/* Test C2x storage class specifiers in compound literals: invalid code. */
/* { dg-do compile } */
/* { dg-options "-std=c2x -pedantic-errors" } */
int *p = &(register int) { 0 }; /* { dg-error "file-scope compound literal specifies" } */
int v;
void
f ()
{
int *q = &(thread_local int) { 0 }; /* { dg-error "compound literal implicitly auto and declared" } */
int *pc = &(static int) { v }; /* { dg-error "not constant" } */
int *pt = &(static thread_local int) { v }; /* { dg-error "not constant" } */
&(register int) { 0 }; /* { dg-error "address of register compound literal requested" } */
struct s { int a, b; };
&((register struct s) { 1, 2 }.b); /* { dg-error "address of register compound literal requested" } */
}
int *s = &(static static int) { 0 }; /* { dg-error "duplicate" } */
void
g ()
{
(void) (register register int) { 0 }; /* { dg-error "duplicate" } */
(void) (static static int) { 0 }; /* { dg-error "duplicate" } */
(void) (static thread_local thread_local int) { 0 }; /* { dg-error "duplicate" } */
(void) (static register int) { 0 }; /* { dg-error "multiple storage classes in declaration specifiers" } */
(void) (register static int) { 0 }; /* { dg-error "multiple storage classes in declaration specifiers" } */
(void) (register thread_local int) { 0 }; /* { dg-error "used with" } */
(void) (thread_local register int) { 0 }; /* { dg-error "used with" } */
}
void
h ()
{
/* The following cases are not part of the C2x syntax, but are detected
specially by the parser. */
(static int) 0; /* { dg-error "storage class specifier in cast" } */
sizeof (static int); /* { dg-error "storage class specifier in" } */
alignof (static int); /* { dg-error "storage class specifier in" } */
}
void
bad_scspec ()
{
/* Storage class specifiers not permitted in compound literals result in a
syntax error. */
(typedef int) { 0 }; /* { dg-error "expected" } */
(auto int) { 0 }; /* { dg-error "expected" } */
(extern int) { 0 }; /* { dg-error "expected" } */
}