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