12ed42287b9b88a0bb08ab10e95e306da3f294ba9Daniel Dunbar/* Clang supports a very limited subset of -traditional-cpp, basically we only
22ed42287b9b88a0bb08ab10e95e306da3f294ba9Daniel Dunbar * intend to add support for things that people actually rely on when doing
32ed42287b9b88a0bb08ab10e95e306da3f294ba9Daniel Dunbar * things like using /usr/bin/cpp to preprocess non-source files. */
42ed42287b9b88a0bb08ab10e95e306da3f294ba9Daniel Dunbar
52ed42287b9b88a0bb08ab10e95e306da3f294ba9Daniel Dunbar/*
6a601579fa0c87b742797c1249e39cb54ec83083fEli Friedman RUN: %clang_cc1 -traditional-cpp %s -E | FileCheck -strict-whitespace %s
7cf2c2e9588a12a716615850cc5bfacd9b20f68efJordan Rose RUN: %clang_cc1 -traditional-cpp %s -E -C | FileCheck -check-prefix=CHECK-COMMENTS %s
8a601579fa0c87b742797c1249e39cb54ec83083fEli Friedman RUN: %clang_cc1 -traditional-cpp -x c++ %s -E | FileCheck -check-prefix=CHECK-CXX %s
92ed42287b9b88a0bb08ab10e95e306da3f294ba9Daniel Dunbar*/
102ed42287b9b88a0bb08ab10e95e306da3f294ba9Daniel Dunbar
11cf2c2e9588a12a716615850cc5bfacd9b20f68efJordan Rose/* -traditional-cpp should eliminate all C89 comments. */
12cf2c2e9588a12a716615850cc5bfacd9b20f68efJordan Rose/* CHECK-NOT: /*
13cf2c2e9588a12a716615850cc5bfacd9b20f68efJordan Rose * CHECK-COMMENTS: {{^}}/* -traditional-cpp should eliminate all C89 comments. *{{/$}}
14cf2c2e9588a12a716615850cc5bfacd9b20f68efJordan Rose */
15cf2c2e9588a12a716615850cc5bfacd9b20f68efJordan Rose
16a601579fa0c87b742797c1249e39cb54ec83083fEli Friedman/* -traditional-cpp should only eliminate "//" comments in C++ mode. */
176aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose/* CHECK: {{^}}foo // bar{{$}}
18a601579fa0c87b742797c1249e39cb54ec83083fEli Friedman * CHECK-CXX: {{^}}foo {{$}}
192ed42287b9b88a0bb08ab10e95e306da3f294ba9Daniel Dunbar */
202ed42287b9b88a0bb08ab10e95e306da3f294ba9Daniel Dunbarfoo // bar
216aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose
226aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose
236aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose/* The lines in this file contain hard tab characters and trailing whitespace;
246aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose * do not change them! */
256aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose
266aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose/* CHECK: {{^}}	indented!{{$}}
276aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose * CHECK: {{^}}tab	separated	values{{$}}
286aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose */
296aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose	indented!
306aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rosetab	separated	values
316aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose
326aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose#define bracket(x) >>>x<<<
336aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rosebracket(|  spaces  |)
346aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose/* CHECK: {{^}}>>>|  spaces  |<<<{{$}}
356aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose */
366aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose
376aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose/* This is still a preprocessing directive. */
386aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose# define foo bar
396aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rosefoo!
406aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose-
416aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose	foo!	foo!
426aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose/* CHECK: {{^}}bar!{{$}}
436aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose * CHECK: {{^}}	bar!	bar!	{{$}}
446aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose */
456aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose
466aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose/* Deliberately check a leading newline with spaces on that line. */
476aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose
486aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose# define foo bar
496aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rosefoo!
506aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose-
516aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose	foo!	foo!
526aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose/* CHECK: {{^}}bar!{{$}}
536aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose * CHECK: {{^}}	bar!	bar!	{{$}}
546aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose */
556aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose
566aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose/* FIXME: -traditional-cpp should not consider this a preprocessing directive
576aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose * because the # isn't in the first column.
586aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose */
596aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose #define foo2 bar
606aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rosefoo2!
616aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose/* If this were working, both of these checks would be on.
626aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose * CHECK-NOT: {{^}} #define foo2 bar{{$}}
636aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose * CHECK-NOT: {{^}}foo2!{{$}}
646aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose */
656aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose
666aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose/* FIXME: -traditional-cpp should not homogenize whitespace in macros.
676aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose */
686aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose#define bracket2(x) >>>  x  <<<
696aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rosebracket2(spaces)
706aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose/* If this were working, this check would be on.
716aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose * CHECK-NOT: {{^}}>>>  spaces  <<<{{$}}
726aad4a31b35df07fe818f193fcfd3c0197aea467Jordan Rose */
73c7d1ca52ae1f33a105ad1be217304f74a34c45f3Jordan Rose
74c7d1ca52ae1f33a105ad1be217304f74a34c45f3Jordan Rose
75c7d1ca52ae1f33a105ad1be217304f74a34c45f3Jordan Rose/* Check that #if 0 blocks work as expected */
76c7d1ca52ae1f33a105ad1be217304f74a34c45f3Jordan Rose#if 0
77c7d1ca52ae1f33a105ad1be217304f74a34c45f3Jordan Rose#error "this is not an error"
78c7d1ca52ae1f33a105ad1be217304f74a34c45f3Jordan Rose
79c7d1ca52ae1f33a105ad1be217304f74a34c45f3Jordan Rose#if 1
80c7d1ca52ae1f33a105ad1be217304f74a34c45f3Jordan Rosea b c in skipped block
81c7d1ca52ae1f33a105ad1be217304f74a34c45f3Jordan Rose#endif
82c7d1ca52ae1f33a105ad1be217304f74a34c45f3Jordan Rose
83c7d1ca52ae1f33a105ad1be217304f74a34c45f3Jordan Rose/* Comments are whitespace too */
84c7d1ca52ae1f33a105ad1be217304f74a34c45f3Jordan Rose
85c7d1ca52ae1f33a105ad1be217304f74a34c45f3Jordan Rose#endif
86c7d1ca52ae1f33a105ad1be217304f74a34c45f3Jordan Rose/* CHECK-NOT: {{^}}a b c in skipped block{{$}}
87c7d1ca52ae1f33a105ad1be217304f74a34c45f3Jordan Rose * CHECK-NOT: {{^}}/* Comments are whitespace too
88c7d1ca52ae1f33a105ad1be217304f74a34c45f3Jordan Rose */
89693fdfa069b74ffe1f79caa3c9ea8754555d29bdJordan Rose
90693fdfa069b74ffe1f79caa3c9ea8754555d29bdJordan RosePreserve URLs: http://clang.llvm.org
91693fdfa069b74ffe1f79caa3c9ea8754555d29bdJordan Rose/* CHECK: {{^}}Preserve URLs: http://clang.llvm.org{{$}}
92693fdfa069b74ffe1f79caa3c9ea8754555d29bdJordan Rose */
93bd89fdcbe6ad28d5052ec7295d4afefeaf4a4135Richard Smith
94bd89fdcbe6ad28d5052ec7295d4afefeaf4a4135Richard Smith/* The following tests ensure we ignore # and ## in macro bodies */
95bd89fdcbe6ad28d5052ec7295d4afefeaf4a4135Richard Smith
96bd89fdcbe6ad28d5052ec7295d4afefeaf4a4135Richard Smith#define FOO_NO_STRINGIFY(a) test(# a)
97bd89fdcbe6ad28d5052ec7295d4afefeaf4a4135Richard SmithFOO_NO_STRINGIFY(foobar)
98bd89fdcbe6ad28d5052ec7295d4afefeaf4a4135Richard Smith/* CHECK: {{^}}test(# foobar){{$}}
99bd89fdcbe6ad28d5052ec7295d4afefeaf4a4135Richard Smith */
100bd89fdcbe6ad28d5052ec7295d4afefeaf4a4135Richard Smith
101bd89fdcbe6ad28d5052ec7295d4afefeaf4a4135Richard Smith#define FOO_NO_PASTE(a, b) test(b##a)
102bd89fdcbe6ad28d5052ec7295d4afefeaf4a4135Richard SmithFOO_NO_PASTE(foo,bar)
103bd89fdcbe6ad28d5052ec7295d4afefeaf4a4135Richard Smith/* CHECK {{^}}test(bar##foo){{$}}
104bd89fdcbe6ad28d5052ec7295d4afefeaf4a4135Richard Smith */
105bd89fdcbe6ad28d5052ec7295d4afefeaf4a4135Richard Smith
106bd89fdcbe6ad28d5052ec7295d4afefeaf4a4135Richard Smith#define BAR_NO_STRINGIFY(a) test(#a)
107bd89fdcbe6ad28d5052ec7295d4afefeaf4a4135Richard SmithBAR_NO_STRINGIFY(foobar)
108bd89fdcbe6ad28d5052ec7295d4afefeaf4a4135Richard Smith/* CHECK: {{^}}test(#foobar){{$}}
109bd89fdcbe6ad28d5052ec7295d4afefeaf4a4135Richard Smith */
110