1 | // RUN: %clang_cc1 -verify -fms-extensions -Wmicrosoft %s |
2 | // RUN: not %clang_cc1 -P -E -fms-extensions %s | FileCheck -strict-whitespace %s |
3 | |
4 | // This horrible stuff should preprocess into (other than whitespace): |
5 | // int foo; |
6 | // int bar; |
7 | // int baz; |
8 | |
9 | int foo; |
10 | |
11 | // CHECK: int foo; |
12 | |
13 | #define comment /##/ dead tokens live here |
14 | // expected-warning@+1 {{pasting two '/' tokens}} |
15 | comment This is stupidity |
16 | |
17 | int bar; |
18 | |
19 | // CHECK: int bar; |
20 | |
21 | #define nested(x) int x comment cute little dead tokens... |
22 | |
23 | // expected-warning@+1 {{pasting two '/' tokens}} |
24 | nested(baz) rise of the dead tokens |
25 | |
26 | ; |
27 | |
28 | // CHECK: int baz |
29 | // CHECK: ; |
30 | |
31 | |
32 | // rdar://8197149 - VC++ allows invalid token pastes: (##baz |
33 | #define foo(x) abc(x) |
34 | #define bar(y) foo(##baz(y)) |
35 | bar(q) // expected-warning {{type specifier missing}} expected-error {{invalid preprocessing token}} expected-error {{parameter list without types}} |
36 | |
37 | // CHECK: abc(baz(q)) |
38 | |
39 | |
40 | #define str(x) #x |
41 | #define collapse_spaces(a, b, c, d) str(a ## - ## b ## - ## c ## d) |
42 | collapse_spaces(1a, b2, 3c, d4) // expected-error 4 {{invalid preprocessing token}} expected-error {{expected function body}} |
43 | |
44 | // CHECK: "1a-b2-3cd4" |
45 | |