1*6f8cfccbSAndy Gibbs #ifdef TEST1
2*6f8cfccbSAndy Gibbs // RUN: %clang_cc1 -E %s -DTEST1 | FileCheck -strict-whitespace %s
3022b62e9SChris Lattner 
4022b62e9SChris Lattner #define M(x, y) #x #y
5022b62e9SChris Lattner 
6022b62e9SChris Lattner M( f(1, 2), g((x=y++, y)))
7f78edf52SEdward O'Callaghan // CHECK: "f(1, 2)" "g((x=y++, y))"
8f78edf52SEdward O'Callaghan 
9022b62e9SChris Lattner M( {a=1 , b=2;} ) /* A semicolon is not a comma */
10f78edf52SEdward O'Callaghan // CHECK: "{a=1" "b=2;}"
11f78edf52SEdward O'Callaghan 
12022b62e9SChris Lattner M( <, [ ) /* Passes the arguments < and [ */
13f78edf52SEdward O'Callaghan // CHECK: "<" "["
14f78edf52SEdward O'Callaghan 
15022b62e9SChris Lattner M( (,), (...) ) /* Passes the arguments (,) and (...) */
16f78edf52SEdward O'Callaghan // CHECK: "(,)" "(...)"
17022b62e9SChris Lattner 
18022b62e9SChris Lattner #define START_END(start, end) start c=3; end
19022b62e9SChris Lattner 
20022b62e9SChris Lattner START_END( {a=1 , b=2;} ) /* braces are not parentheses */
21f78edf52SEdward O'Callaghan // CHECK: {a=1 c=3; b=2;}
22022b62e9SChris Lattner 
23022b62e9SChris Lattner /*
24022b62e9SChris Lattner  * To pass a comma token as an argument it is
25022b62e9SChris Lattner  * necessary to write:
26022b62e9SChris Lattner  */
27022b62e9SChris Lattner #define COMMA ,
28022b62e9SChris Lattner 
29022b62e9SChris Lattner M(a COMMA b, (a, b))
30f78edf52SEdward O'Callaghan // CHECK: "a COMMA b" "(a, b)"
31022b62e9SChris Lattner 
32*6f8cfccbSAndy Gibbs #endif
33*6f8cfccbSAndy Gibbs 
34*6f8cfccbSAndy Gibbs #ifdef TEST2
35*6f8cfccbSAndy Gibbs // RUN: %clang_cc1 -fsyntax-only -verify %s -DTEST2
36*6f8cfccbSAndy Gibbs 
37*6f8cfccbSAndy Gibbs #define HASH #
38*6f8cfccbSAndy Gibbs #define INVALID() #
39*6f8cfccbSAndy Gibbs // expected-error@-1{{'#' is not followed by a macro parameter}}
40*6f8cfccbSAndy Gibbs 
41*6f8cfccbSAndy Gibbs #endif
42