189a1d03eSRichard // RUN: %check_clang_tidy -format-style=LLVM -check-suffix=DEFAULT %s \
289a1d03eSRichard // RUN:   modernize-replace-disallow-copy-and-assign-macro %t
389a1d03eSRichard 
489a1d03eSRichard // RUN: %check_clang_tidy -format-style=LLVM -check-suffix=DIFFERENT-NAME %s \
589a1d03eSRichard // RUN:  modernize-replace-disallow-copy-and-assign-macro %t \
6*e8a3ddafSNathan James // RUN:  -config="{CheckOptions: { \
7*e8a3ddafSNathan James // RUN:   modernize-replace-disallow-copy-and-assign-macro.MacroName: \
8*e8a3ddafSNathan James // RUN:     MY_MACRO_NAME}}"
989a1d03eSRichard 
1089a1d03eSRichard // RUN: %check_clang_tidy -format-style=LLVM -check-suffix=FINALIZE %s \
1189a1d03eSRichard // RUN:  modernize-replace-disallow-copy-and-assign-macro %t \
12*e8a3ddafSNathan James // RUN:  -config="{CheckOptions: { \
13*e8a3ddafSNathan James // RUN:   modernize-replace-disallow-copy-and-assign-macro.MacroName: \
14*e8a3ddafSNathan James // RUN:     DISALLOW_COPY_AND_ASSIGN_FINALIZE}}"
1589a1d03eSRichard 
1689a1d03eSRichard // RUN: clang-tidy %s -checks="-*,modernize-replace-disallow-copy-and-assign-macro" \
17*e8a3ddafSNathan James // RUN:  -config="{CheckOptions: { \
18*e8a3ddafSNathan James // RUN:    modernize-replace-disallow-copy-and-assign-macro.MacroName: \
19*e8a3ddafSNathan James // RUN:      DISALLOW_COPY_AND_ASSIGN_MORE_AGUMENTS}}" -- -Wno-extra-semi | count 0
2089a1d03eSRichard 
2189a1d03eSRichard // RUN: clang-tidy %s -checks="-*,modernize-replace-disallow-copy-and-assign-macro" \
22*e8a3ddafSNathan James // RUN:  -config="{CheckOptions: { \
23*e8a3ddafSNathan James // RUN:    modernize-replace-disallow-copy-and-assign-macro.MacroName: \
24*e8a3ddafSNathan James // RUN:      DISALLOW_COPY_AND_ASSIGN_NEEDS_PREEXPANSION}}" -- -Wno-extra-semi | count 0
2589a1d03eSRichard 
2689a1d03eSRichard // Note: the last two tests expect no diagnostics, but FileCheck cannot handle
2789a1d03eSRichard // that, hence the use of | count 0.
2889a1d03eSRichard 
2989a1d03eSRichard #define DISALLOW_COPY_AND_ASSIGN(TypeName)
3089a1d03eSRichard 
3189a1d03eSRichard class TestClass1 {
3289a1d03eSRichard private:
3389a1d03eSRichard   DISALLOW_COPY_AND_ASSIGN(TestClass1);
3489a1d03eSRichard };
3589a1d03eSRichard // CHECK-MESSAGES-DEFAULT: :[[@LINE-2]]:3: warning: prefer deleting copy constructor and assignment operator over using macro 'DISALLOW_COPY_AND_ASSIGN' [modernize-replace-disallow-copy-and-assign-macro]
3689a1d03eSRichard // CHECK-FIXES-DEFAULT:      {{^}}  TestClass1(const TestClass1 &) = delete;{{$}}
3789a1d03eSRichard // CHECK-FIXES-DEFAULT-NEXT: {{^}}  const TestClass1 &operator=(const TestClass1 &) = delete;{{$}}
3889a1d03eSRichard 
3989a1d03eSRichard #define MY_MACRO_NAME(TypeName)
4089a1d03eSRichard 
4189a1d03eSRichard class TestClass2 {
4289a1d03eSRichard private:
4389a1d03eSRichard   MY_MACRO_NAME(TestClass2);
4489a1d03eSRichard };
4589a1d03eSRichard // CHECK-MESSAGES-DIFFERENT-NAME: :[[@LINE-2]]:3: warning: prefer deleting copy constructor and assignment operator over using macro 'MY_MACRO_NAME' [modernize-replace-disallow-copy-and-assign-macro]
4689a1d03eSRichard // CHECK-FIXES-DIFFERENT-NAME:      {{^}}  TestClass2(const TestClass2 &) = delete;{{$}}
4789a1d03eSRichard // CHECK-FIXES-DIFFERENT-NAME-NEXT: {{^}}  const TestClass2 &operator=(const TestClass2 &) = delete;{{$}}
4889a1d03eSRichard 
4989a1d03eSRichard #define DISALLOW_COPY_AND_ASSIGN_FINALIZE(TypeName) \
5089a1d03eSRichard   TypeName(const TypeName &) = delete;              \
5189a1d03eSRichard   const TypeName &operator=(const TypeName &) = delete;
5289a1d03eSRichard 
5389a1d03eSRichard class TestClass3 {
5489a1d03eSRichard private:
5589a1d03eSRichard   // Notice, that the macro allows to be used without a semicolon because the
5689a1d03eSRichard   // macro definition already contains one above. Therefore our replacement must
5789a1d03eSRichard   // contain a semicolon at the end.
5889a1d03eSRichard   DISALLOW_COPY_AND_ASSIGN_FINALIZE(TestClass3)
5989a1d03eSRichard };
6089a1d03eSRichard // CHECK-MESSAGES-FINALIZE: :[[@LINE-2]]:3: warning: prefer deleting copy constructor and assignment operator over using macro 'DISALLOW_COPY_AND_ASSIGN_FINALIZE' [modernize-replace-disallow-copy-and-assign-macro]
6189a1d03eSRichard // CHECK-FIXES-FINALIZE:      {{^}}  TestClass3(const TestClass3 &) = delete;{{$}}
6289a1d03eSRichard // CHECK-FIXES-FINALIZE-NEXT: {{^}}  const TestClass3 &operator=(const TestClass3 &) = delete;{{$}}
6389a1d03eSRichard 
6489a1d03eSRichard #define DISALLOW_COPY_AND_ASSIGN_MORE_AGUMENTS(A, B)
6589a1d03eSRichard 
6689a1d03eSRichard class TestClass4 {
6789a1d03eSRichard private:
6889a1d03eSRichard   DISALLOW_COPY_AND_ASSIGN_MORE_AGUMENTS(TestClass4, TestClass4);
6989a1d03eSRichard };
7089a1d03eSRichard // CHECK-MESSAGES-MORE-ARGUMENTS-NOT: warning: prefer deleting copy constructor and assignment operator over using macro 'DISALLOW_COPY_AND_ASSIGN_MORE_AGUMENTS'
7189a1d03eSRichard 
7289a1d03eSRichard #define DISALLOW_COPY_AND_ASSIGN_NEEDS_PREEXPANSION(A)
7389a1d03eSRichard #define TESTCLASS TestClass5
7489a1d03eSRichard 
7589a1d03eSRichard class TestClass5 {
7689a1d03eSRichard private:
7789a1d03eSRichard   DISALLOW_COPY_AND_ASSIGN_NEEDS_PREEXPANSION(TESTCLASS);
7889a1d03eSRichard };
7989a1d03eSRichard // CHECK-MESSAGES-MORE-ARGUMENTS-NOT: warning: prefer deleting copy constructor and assignment operator over using macro 'DISALLOW_COPY_AND_ASSIGN_NEEDS_PREEXPANSION'
80