xref: /aosp_15_r20/external/clang/test/Preprocessor/microsoft-ext.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -E -fms-compatibility %s -o %t
2*67e74705SXin Li // RUN: FileCheck %s < %t
3*67e74705SXin Li 
4*67e74705SXin Li # define M2(x, y) x + y
5*67e74705SXin Li # define P(x, y) {x, y}
6*67e74705SXin Li # define M(x, y) M2(x, P(x, y))
7*67e74705SXin Li M(a, b) // CHECK: a + {a, b}
8*67e74705SXin Li 
9*67e74705SXin Li // Regression test for PR13924
10*67e74705SXin Li #define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar)
11*67e74705SXin Li #define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar
12*67e74705SXin Li 
13*67e74705SXin Li #define GMOCK_INTERNAL_COUNT_AND_2_VALUE_PARAMS(p0, p1) P2
14*67e74705SXin Li 
15*67e74705SXin Li #define GMOCK_ACTION_CLASS_(name, value_params)\
16*67e74705SXin Li     GTEST_CONCAT_TOKEN_(name##Action, GMOCK_INTERNAL_COUNT_##value_params)
17*67e74705SXin Li 
18*67e74705SXin Li #define ACTION_TEMPLATE(name, template_params, value_params)\
19*67e74705SXin Li class GMOCK_ACTION_CLASS_(name, value_params) {\
20*67e74705SXin Li }
21*67e74705SXin Li 
22*67e74705SXin Li ACTION_TEMPLATE(InvokeArgument,
23*67e74705SXin Li                 HAS_1_TEMPLATE_PARAMS(int, k),
24*67e74705SXin Li                 AND_2_VALUE_PARAMS(p0, p1));
25*67e74705SXin Li 
26*67e74705SXin Li // This tests compatibility with behaviour needed for type_traits in VS2012
27*67e74705SXin Li // Test based on _VARIADIC_EXPAND_0X macros in xstddef of VS2012
28*67e74705SXin Li #define _COMMA ,
29*67e74705SXin Li 
30*67e74705SXin Li #define MAKER(_arg1, _comma, _arg2)                                            \
31*67e74705SXin Li   void func(_arg1 _comma _arg2) {}
32*67e74705SXin Li #define MAKE_FUNC(_makerP1, _makerP2, _arg1, _comma, _arg2)                    \
33*67e74705SXin Li   _makerP1##_makerP2(_arg1, _comma, _arg2)
34*67e74705SXin Li 
35*67e74705SXin Li MAKE_FUNC(MAK, ER, int a, _COMMA, int b);
36*67e74705SXin Li // CHECK: void func(int a , int b) {}
37*67e74705SXin Li 
38*67e74705SXin Li #define macro(a, b) (a - b)
39*67e74705SXin Li void function(int a);
40*67e74705SXin Li #define COMMA_ELIDER(...) \
41*67e74705SXin Li   macro(x, __VA_ARGS__); \
42*67e74705SXin Li   function(x, __VA_ARGS__);
43*67e74705SXin Li COMMA_ELIDER();
44*67e74705SXin Li // CHECK: (x - );
45*67e74705SXin Li // CHECK: function(x);
46