45 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
| // RUN: %clang_cc1 -verify -fms-extensions -Wmicrosoft %s
 | |
| // RUN: not %clang_cc1 -P -E -fms-extensions %s | FileCheck -strict-whitespace %s
 | |
| 
 | |
| // This horrible stuff should preprocess into (other than whitespace):
 | |
| //   int foo;
 | |
| //   int bar;
 | |
| //   int baz;
 | |
| 
 | |
| int foo;
 | |
| 
 | |
| // CHECK: int foo;
 | |
| 
 | |
| #define comment /##/  dead tokens live here
 | |
| // expected-warning@+1 {{pasting two '/' tokens}}
 | |
| comment This is stupidity
 | |
| 
 | |
| int bar;
 | |
| 
 | |
| // CHECK: int bar;
 | |
| 
 | |
| #define nested(x) int x comment cute little dead tokens...
 | |
| 
 | |
| // expected-warning@+1 {{pasting two '/' tokens}}
 | |
| nested(baz)  rise of the dead tokens
 | |
| 
 | |
| ;
 | |
| 
 | |
| // CHECK: int baz
 | |
| // CHECK: ;
 | |
| 
 | |
| 
 | |
| // rdar://8197149 - VC++ allows invalid token pastes: (##baz
 | |
| #define foo(x) abc(x)
 | |
| #define bar(y) foo(##baz(y))
 | |
| bar(q) // expected-warning {{type specifier missing}} expected-error {{invalid preprocessing token}} expected-error {{parameter list without types}}
 | |
| 
 | |
| // CHECK: abc(baz(q))
 | |
| 
 | |
| 
 | |
| #define str(x) #x
 | |
| #define collapse_spaces(a, b, c, d) str(a ## - ## b ## - ## c ## d)
 | |
| collapse_spaces(1a, b2, 3c, d4) // expected-error 4 {{invalid preprocessing token}} expected-error {{expected function body}}
 | |
| 
 | |
| // CHECK: "1a-b2-3cd4"
 |