// RUN: %clang_cc1 -verify -std=c2y -Wall -pedantic %s // RUN: %clang_cc1 -verify -Wall -pedantic %s /* WG14 N3344: Yes * Slay Some Earthly Demons VI * * A 'void' parameter cannot have any qualifiers, storage class specifiers, or * be followed by an ellipsis. * * Note: Clang treats 'register void' as being a DR and rejects it in all * language modes; there's no evidence that this will break users and it's not * clear what the programmer intended if they wrote such code anyway. This * matches GCC's behavior. */ void baz(volatile void); // expected-error {{'void' as parameter must not have type qualifiers}} void bar(const void); // expected-error {{'void' as parameter must not have type qualifiers}} void foo(register void); // expected-error {{invalid storage class specifier in function declarator}} void foop(void register); // expected-error {{invalid storage class specifier in function declarator}} void quux(static void); // expected-error {{invalid storage class specifier in function declarator}} void quobble(auto void); // expected-error {{invalid storage class specifier in function declarator}} void quubble(extern void); // expected-error {{invalid storage class specifier in function declarator}} // FIXME: it's odd that these aren't diagnosed as storage class specifiers. #if __STDC_VERSION__ >= 202311L void quibble(constexpr void); // expected-error {{function parameter cannot be constexpr}} #endif #if __STDC_VERSION__ >= 201112L void quabble(_Thread_local void); // expected-error {{'_Thread_local' is only allowed on variable declarations}} #endif void bing(void, ...); // expected-error {{'void' must be the first and only parameter if specified}} // These declarations are fine. void one(register void *); void two(void register *); void three(register void * (*)[4]);