| // RUN: %clang_cc1 -Wdeprecated %s -fsyntax-only -verify | 
 |  | 
 | // expected-error@+1{{expected (}} | 
 | #pragma clang deprecated | 
 |  | 
 | // expected-error@+1{{expected identifier}} | 
 | #pragma clang deprecated(4 | 
 |  | 
 | // expected-error@+1{{no macro named 'foo'}} | 
 | #pragma clang deprecated(foo) | 
 |  | 
 | #define bar 1 | 
 | // expected-note@+1{{macro marked 'deprecated' here}}  | 
 | #pragma clang deprecated(bar, "bar is deprecated use 1") | 
 |  | 
 | // expected-warning@+1{{macro 'bar' has been marked as deprecated: bar is deprecated use 1}} | 
 | #if bar | 
 | #endif | 
 |  | 
 | #define foo 1 | 
 | // expected-note@+8{{macro marked 'deprecated' here}}  | 
 | // expected-note@+7{{macro marked 'deprecated' here}}  | 
 | // expected-note@+6{{macro marked 'deprecated' here}}  | 
 | // expected-note@+5{{macro marked 'deprecated' here}}  | 
 | // expected-note@+4{{macro marked 'deprecated' here}}  | 
 | // expected-note@+3{{macro marked 'deprecated' here}}  | 
 | // expected-note@+2{{macro marked 'deprecated' here}}  | 
 | // expected-note@+1{{macro marked 'deprecated' here}}  | 
 | #pragma clang deprecated(foo) | 
 |  | 
 | // expected-error@+1{{expected )}} | 
 | #pragma clang deprecated(foo | 
 |  | 
 | // expected-warning@+1{{macro 'foo' has been marked as deprecated}} | 
 | #if foo | 
 | #endif | 
 |  | 
 | // expected-warning@+1{{macro 'foo' has been marked as deprecated}} | 
 | #if defined(foo) | 
 | #endif | 
 |  | 
 | // expected-warning@+1{{macro 'foo' has been marked as deprecated}} | 
 | #ifdef foo | 
 | #endif | 
 |  | 
 | // expected-warning@+1{{macro 'foo' has been marked as deprecated}} | 
 | #ifndef foo | 
 | #endif | 
 |  | 
 | int main(int argc, char** argv) { | 
 | // expected-error@+1{{no macro named 'main'}} | 
 | #pragma clang deprecated(main) | 
 |  | 
 |   // expected-warning@+1{{macro 'foo' has been marked as deprecated}} | 
 |   return foo; | 
 | } | 
 |  | 
 | #define frobble 1 | 
 | #pragma clang deprecated(frobble) | 
 |  | 
 | // not-expected-warning@+1{{macro 'frobble' has been marked as deprecated}} | 
 | #undef frobble // Expect no diagnostics here | 
 |  | 
 | // not-expected-warning@+1{{macro 'frobble' has been marked as deprecated}} | 
 | #define frobble 1 // How about here given that this was undefined? | 
 |  | 
 | // not-expected-warning@+1{{macro 'frobble' has been marked as deprecated}} | 
 | #if defined(frobble) | 
 | #endif | 
 |  | 
 | // Test that we diagnose on #elif. | 
 | #if 0 | 
 | #elif foo | 
 | // expected-warning@-1{{macro 'foo' has been marked as deprecated}} | 
 | #endif | 
 |  | 
 |  | 
 | // Test that we diagnose on #elifdef. | 
 | #ifdef baz | 
 | #elifdef foo | 
 | // expected-warning@-1{{macro 'foo' has been marked as deprecated}} | 
 | // expected-warning@-2{{use of a '#elifdef' directive is a C23 extension}} | 
 | #endif | 
 |  | 
 | // Test that we diagnose on #elifndef. | 
 | #ifdef baz | 
 | #elifndef foo | 
 | #endif | 
 | // expected-warning@-2{{macro 'foo' has been marked as deprecated}} | 
 | // expected-warning@-3{{use of a '#elifndef' directive is a C23 extension}} | 
 |  | 
 | // FIXME: These cases are currently not handled because clang doesn't expand | 
 | // conditions on skipped #elif* blocks. See the FIXME notes in | 
 | // Preprocessor::SkipExcludedConditionalBlock. | 
 |  | 
 | #ifdef frobble | 
 | // not-expected-warning@+2{{macro 'foo' has been marked as deprecated}} | 
 | // expected-warning@+1{{use of a '#elifndef' directive is a C23 extension}} | 
 | #elifndef foo | 
 | #endif | 
 |  | 
 | #ifdef frobble | 
 | // not-expected-warning@+2{{macro 'foo' has been marked as deprecated}} | 
 | // expected-warning@+1{{use of a '#elifdef' directive is a C23 extension}} | 
 | #elifdef foo | 
 | #endif | 
 |  | 
 | #if 1 | 
 | // not-expected-warning@+1{{macro 'foo' has been marked as deprecated}} | 
 | #elif foo | 
 | #endif |