1*3e7ad1f2SChris Bieneman // RUN: %clang_cc1 -Wfinal-macro %s -fsyntax-only -isystem %S/Inputs -verify 21e48ef20SChris Bieneman 31e48ef20SChris Bieneman // Test warning production 41e48ef20SChris Bieneman #define Foo 1 51e48ef20SChris Bieneman // expected-note@+1 4{{macro marked 'final' here}} 61e48ef20SChris Bieneman #pragma clang final(Foo) 71e48ef20SChris Bieneman 81e48ef20SChris Bieneman // expected-warning@+2{{macro 'Foo' has been marked as final and should not be redefined}} 91e48ef20SChris Bieneman // expected-note@+1{{previous definition is here}} 101e48ef20SChris Bieneman #define Foo 1 111e48ef20SChris Bieneman 121e48ef20SChris Bieneman // expected-warning@+2{{macro 'Foo' has been marked as final and should not be redefined}} 131e48ef20SChris Bieneman // expected-warning@+1{{'Foo' macro redefined}} 141e48ef20SChris Bieneman #define Foo 2 151e48ef20SChris Bieneman 161e48ef20SChris Bieneman // expected-warning@+1{{redefining builtin macro}} 171e48ef20SChris Bieneman #define __TIME__ 1 181e48ef20SChris Bieneman 191e48ef20SChris Bieneman // expected-warning@+1{{undefining builtin macro}} 201e48ef20SChris Bieneman #undef __TIMESTAMP__ 211e48ef20SChris Bieneman 221e48ef20SChris Bieneman // expected-warning@+1{{macro 'Foo' has been marked as final and should not be undefined}} 231e48ef20SChris Bieneman #undef Foo 241e48ef20SChris Bieneman // expected-warning@+1{{macro 'Foo' has been marked as final and should not be redefined}} 251e48ef20SChris Bieneman #define Foo 3 261e48ef20SChris Bieneman 271e48ef20SChris Bieneman // Test parse errors 281e48ef20SChris Bieneman // expected-error@+1{{expected (}} 291e48ef20SChris Bieneman #pragma clang final 301e48ef20SChris Bieneman 311e48ef20SChris Bieneman // expected-error@+1{{expected )}} 321e48ef20SChris Bieneman #pragma clang final(Foo 331e48ef20SChris Bieneman 341e48ef20SChris Bieneman // expected-error@+1{{no macro named 'Baz'}} 351e48ef20SChris Bieneman #pragma clang final(Baz) 361e48ef20SChris Bieneman 371e48ef20SChris Bieneman // expected-error@+1{{expected identifier}} 381e48ef20SChris Bieneman #pragma clang final(4) 391e48ef20SChris Bieneman 401e48ef20SChris Bieneman // expected-error@+1{{expected (}} 411e48ef20SChris Bieneman #pragma clang final Baz 421e48ef20SChris Bieneman 431e48ef20SChris Bieneman // no diagnostics triggered by these pragmas. 441e48ef20SChris Bieneman #pragma clang deprecated(Foo) 451e48ef20SChris Bieneman #pragma clang restrict_expansion(Foo) 46*3e7ad1f2SChris Bieneman 47*3e7ad1f2SChris Bieneman #define SYSTEM_MACRO Woah 48*3e7ad1f2SChris Bieneman // expected-note@+1 2{{macro marked 'final' here}} 49*3e7ad1f2SChris Bieneman #pragma clang final(SYSTEM_MACRO) 50*3e7ad1f2SChris Bieneman #include <final-macro-system.h> 51