| // RUN: %clang_cc1 -fsyntax-only -verify -Wc++-keyword %s |
| // RUN: %clang_cc1 -fsyntax-only -verify -Wc++-compat %s |
| // RUN: %clang_cc1 -fsyntax-only -verify=good %s |
| // RUN: %clang_cc1 -fsyntax-only -verify=cxx -x c++ -std=c++2c %s |
| // good-no-diagnostics |
| |
| // 'try', 'this' and 'throw' are not tested as identifiers, but are instead |
| // tested as other constructs (otherwise there would be redefinition errors in |
| // C). |
| int catch; // expected-warning {{identifier 'catch' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int class; // expected-warning {{identifier 'class' conflicts with a C++ keyword}} \ |
| cxx-error {{declaration of anonymous class must be a definition}} \ |
| cxx-warning {{declaration does not declare anything}} |
| int const_cast; // expected-warning {{identifier 'const_cast' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int delete; // expected-warning {{identifier 'delete' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int dynamic_cast; // expected-warning {{identifier 'dynamic_cast' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int explicit; // expected-warning {{identifier 'explicit' conflicts with a C++ keyword}} \ |
| cxx-error {{'explicit' can only appear on non-static member functions}} \ |
| cxx-warning {{declaration does not declare anything}} |
| int export; // expected-warning {{identifier 'export' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int friend; // expected-warning {{identifier 'friend' conflicts with a C++ keyword}} \ |
| cxx-error {{'friend' used outside of class}} \ |
| cxx-warning {{declaration does not declare anything}} |
| int mutable; // expected-warning {{identifier 'mutable' conflicts with a C++ keyword}} \ |
| cxx-warning {{declaration does not declare anything}} |
| int namespace; // expected-warning {{identifier 'namespace' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int new; // expected-warning {{identifier 'new' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int operator; // expected-warning {{identifier 'operator' conflicts with a C++ keyword}} \ |
| cxx-error {{expected a type}} |
| int private; // expected-warning {{identifier 'private' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int protected; // expected-warning {{identifier 'protected' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int public; // expected-warning {{identifier 'public' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int reinterpret_cast; // expected-warning {{identifier 'reinterpret_cast' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int static_cast; // expected-warning {{identifier 'static_cast' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int template; // expected-warning {{identifier 'template' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int typename; // expected-warning {{identifier 'typename' conflicts with a C++ keyword}} \ |
| cxx-error {{expected a qualified name after 'typename'}} |
| int typeid; // expected-warning {{identifier 'typeid' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int using; // expected-warning {{identifier 'using' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int virtual; // expected-warning {{identifier 'virtual' conflicts with a C++ keyword}} \ |
| cxx-error {{'virtual' can only appear on non-static member functions}} \ |
| cxx-warning {{declaration does not declare anything}} |
| int wchar_t; // expected-warning {{identifier 'wchar_t' conflicts with a C++ keyword}} \ |
| cxx-error {{cannot combine with previous 'int' declaration specifier}} \ |
| cxx-warning {{declaration does not declare anything}} |
| int char8_t; // expected-warning {{identifier 'char8_t' conflicts with a C++ keyword}} \ |
| cxx-error {{cannot combine with previous 'int' declaration specifier}} \ |
| cxx-warning {{declaration does not declare anything}} |
| int char16_t; // expected-warning {{identifier 'char16_t' conflicts with a C++ keyword}} \ |
| cxx-error {{cannot combine with previous 'int' declaration specifier}} \ |
| cxx-warning {{declaration does not declare anything}} |
| int char32_t; // expected-warning {{identifier 'char32_t' conflicts with a C++ keyword}} \ |
| cxx-error {{cannot combine with previous 'int' declaration specifier}} \ |
| cxx-warning {{declaration does not declare anything}} |
| int noexcept; // expected-warning {{identifier 'noexcept' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int co_await; // expected-warning {{identifier 'co_await' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int co_return; // expected-warning {{identifier 'co_return' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int co_yield; // expected-warning {{identifier 'co_yield' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int consteval; // expected-warning {{identifier 'consteval' conflicts with a C++ keyword}} \ |
| cxx-error {{consteval can only be used in function declarations}} |
| int constinit; // expected-warning {{identifier 'constinit' conflicts with a C++ keyword}} \ |
| cxx-error {{constinit can only be used in variable declarations}} |
| int concept; // expected-warning {{identifier 'concept' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int requires; // expected-warning {{identifier 'requires' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| |
| // Now try the same thing, but as struct members. |
| struct S { |
| int catch; // expected-warning {{identifier 'catch' conflicts with a C++ keyword}} \ |
| cxx-error {{expected member name or ';' after declaration specifiers}} |
| int class; // expected-warning {{identifier 'class' conflicts with a C++ keyword}} \ |
| cxx-error {{declaration of anonymous class must be a definition}} \ |
| cxx-warning {{declaration does not declare anything}} |
| int const_cast; // expected-warning {{identifier 'const_cast' conflicts with a C++ keyword}} \ |
| cxx-error {{expected member name or ';' after declaration specifiers}} |
| int delete; // expected-warning {{identifier 'delete' conflicts with a C++ keyword}} \ |
| cxx-error {{expected member name or ';' after declaration specifiers}} |
| int dynamic_cast; // expected-warning {{identifier 'dynamic_cast' conflicts with a C++ keyword}} \ |
| cxx-error {{expected member name or ';' after declaration specifiers}} |
| int explicit; // expected-warning {{identifier 'explicit' conflicts with a C++ keyword}} \ |
| cxx-error {{'explicit' can only appear on non-static member functions}} \ |
| cxx-warning {{declaration does not declare anything}} |
| int export; // expected-warning {{identifier 'export' conflicts with a C++ keyword}} \ |
| cxx-error {{expected member name or ';' after declaration specifiers}} |
| int friend; // expected-warning {{identifier 'friend' conflicts with a C++ keyword}} \ |
| cxx-error {{'friend' must appear first in a non-function declaration}} |
| int mutable; // expected-warning {{identifier 'mutable' conflicts with a C++ keyword}} \ |
| cxx-warning {{declaration does not declare anything}} |
| int namespace; // expected-warning {{identifier 'namespace' conflicts with a C++ keyword}} \ |
| cxx-error {{expected member name or ';' after declaration specifiers}} |
| int new; // expected-warning {{identifier 'new' conflicts with a C++ keyword}} \ |
| cxx-error {{expected member name or ';' after declaration specifiers}} |
| int operator; // expected-warning {{identifier 'operator' conflicts with a C++ keyword}} \ |
| cxx-error {{expected a type}} |
| int private; // expected-warning {{identifier 'private' conflicts with a C++ keyword}} \ |
| cxx-error {{expected member name or ';' after declaration specifiers}} |
| int protected; // expected-warning {{identifier 'protected' conflicts with a C++ keyword}} \ |
| cxx-error {{expected member name or ';' after declaration specifiers}} |
| int public; // expected-warning {{identifier 'public' conflicts with a C++ keyword}} \ |
| cxx-error {{expected member name or ';' after declaration specifiers}} |
| int reinterpret_cast; // expected-warning {{identifier 'reinterpret_cast' conflicts with a C++ keyword}} \ |
| cxx-error {{expected member name or ';' after declaration specifiers}} |
| int static_cast; // expected-warning {{identifier 'static_cast' conflicts with a C++ keyword}} \ |
| cxx-error {{expected member name or ';' after declaration specifiers}} |
| int template; // expected-warning {{identifier 'template' conflicts with a C++ keyword}} \ |
| cxx-error {{expected member name or ';' after declaration specifiers}} |
| int this; // expected-warning {{identifier 'this' conflicts with a C++ keyword}} \ |
| cxx-error {{expected member name or ';' after declaration specifiers}} |
| int throw; // expected-warning {{identifier 'throw' conflicts with a C++ keyword}} \ |
| cxx-error {{expected member name or ';' after declaration specifiers}} |
| int try; // expected-warning {{identifier 'try' conflicts with a C++ keyword}} \ |
| cxx-error {{expected member name or ';' after declaration specifiers}} |
| int typename; // expected-warning {{identifier 'typename' conflicts with a C++ keyword}} \ |
| cxx-error {{expected a qualified name after 'typename'}} |
| int typeid; // expected-warning {{identifier 'typeid' conflicts with a C++ keyword}} \ |
| cxx-error {{expected member name or ';' after declaration specifiers}} |
| int using; // expected-warning {{identifier 'using' conflicts with a C++ keyword}} \ |
| cxx-error {{expected member name or ';' after declaration specifiers}} |
| int virtual; // expected-warning {{identifier 'virtual' conflicts with a C++ keyword}} \ |
| cxx-error {{'virtual' can only appear on non-static member functions}} \ |
| cxx-warning {{declaration does not declare anything}} |
| int wchar_t; // expected-warning {{identifier 'wchar_t' conflicts with a C++ keyword}} \ |
| cxx-error {{cannot combine with previous 'int' declaration specifier}} \ |
| cxx-warning {{declaration does not declare anything}} |
| int char8_t; // expected-warning {{identifier 'char8_t' conflicts with a C++ keyword}} \ |
| cxx-error {{cannot combine with previous 'int' declaration specifier}} \ |
| cxx-warning {{declaration does not declare anything}} |
| int char16_t; // expected-warning {{identifier 'char16_t' conflicts with a C++ keyword}} \ |
| cxx-error {{cannot combine with previous 'int' declaration specifier}} \ |
| cxx-warning {{declaration does not declare anything}} |
| int char32_t; // expected-warning {{identifier 'char32_t' conflicts with a C++ keyword}} \ |
| cxx-error {{cannot combine with previous 'int' declaration specifier}} \ |
| cxx-warning {{declaration does not declare anything}} |
| int noexcept; // expected-warning {{identifier 'noexcept' conflicts with a C++ keyword}} \ |
| cxx-error {{expected member name or ';' after declaration specifiers}} |
| int co_await; // expected-warning {{identifier 'co_await' conflicts with a C++ keyword}} \ |
| cxx-error {{expected member name or ';' after declaration specifiers}} |
| int co_return; // expected-warning {{identifier 'co_return' conflicts with a C++ keyword}} \ |
| cxx-error {{expected member name or ';' after declaration specifiers}} |
| int co_yield; // expected-warning {{identifier 'co_yield' conflicts with a C++ keyword}} \ |
| cxx-error {{expected member name or ';' after declaration specifiers}} |
| int consteval; // expected-warning {{identifier 'consteval' conflicts with a C++ keyword}} \ |
| cxx-error {{consteval can only be used in function declarations}} |
| int constinit; // expected-warning {{identifier 'constinit' conflicts with a C++ keyword}} \ |
| cxx-error {{constinit can only be used in variable declarations}} |
| int concept; // expected-warning {{identifier 'concept' conflicts with a C++ keyword}} \ |
| cxx-error {{concept declarations may only appear in global or namespace scope}} |
| int requires; // expected-warning {{identifier 'requires' conflicts with a C++ keyword}} \ |
| cxx-error {{expected member name or ';' after declaration specifiers}} \ |
| cxx-error {{trailing requires clause can only be used when declaring a function}} \ |
| cxx-error {{expected expression}} |
| }; |
| |
| // Smoke test that we catch a keyword used as an enumerator. If we diagnose |
| // one, we'll diagnose them all. |
| enum E { |
| throw, // expected-warning {{identifier 'throw' conflicts with a C++ keyword}} \ |
| cxx-error {{expected identifier}} |
| }; |
| |
| // Smoke test that we catch a keyword used as a tag name. |
| struct try { // expected-warning {{identifier 'try' conflicts with a C++ keyword}} \ |
| cxx-error {{declaration of anonymous struct must be a definition}} \ |
| cxx-warning {{declaration does not declare anything}} |
| int x; |
| }; |
| |
| // Smoke test that we catch keyword use in a function name. |
| void this(void); // expected-warning {{identifier 'this' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| |
| // Smoke test that we catch keyword use in function parameters too. |
| void func(int private); // expected-warning {{identifier 'private' conflicts with a C++ keyword}} \ |
| cxx-error {{invalid parameter name: 'private' is a keyword}} |
| |
| // These are conditionally a keyword in C++, so they're intentionally not being |
| // diagnosed as a keyword. |
| int module; |
| int import; |
| int override; |
| int final; |
| |
| // We do not diagnose use of C++ keywords when used as a macro name because |
| // that does not conflict with C++ (the macros will be replaced before the |
| // keyword is seen by the parser). |
| #define this 12 |
| |
| // FIXME: These tests are disabled for C++ because it causes a crash. |
| // See GH114815. |
| #ifndef __cplusplus |
| int decltype; // expected-warning {{identifier 'decltype' conflicts with a C++ keyword}} |
| struct T { |
| int decltype; // expected-warning {{identifier 'decltype' conflicts with a C++ keyword}} |
| }; |
| #endif // __cplusplus |
| |
| // Check alternative operator names. |
| int and; // expected-warning {{identifier 'and' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int and_eq; // expected-warning {{identifier 'and_eq' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int bitand; // expected-warning {{identifier 'bitand' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int bitor; // expected-warning {{identifier 'bitor' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int compl; // expected-warning {{identifier 'compl' conflicts with a C++ keyword}} \ |
| cxx-error {{expected a class name after '~' to name a destructor}} |
| int not; // expected-warning {{identifier 'not' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int not_eq; // expected-warning {{identifier 'not_eq' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int or; // expected-warning {{identifier 'or' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int or_eq; // expected-warning {{identifier 'or_eq' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int xor; // expected-warning {{identifier 'xor' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |
| int xor_eq; // expected-warning {{identifier 'xor_eq' conflicts with a C++ keyword}} \ |
| cxx-error {{expected unqualified-id}} |