xref: /llvm-project/clang/test/Lexer/final-macro.c (revision 3e7ad1f2b2c0a753749eaba88d369d6032a50764)
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