1// RUN: %check_clang_tidy %s cppcoreguidelines-special-member-functions %t -- -config="{CheckOptions: {cppcoreguidelines-special-member-functions.IgnoreMacros: false}}" --
2
3class DefinesDestructor {
4 ~DefinesDestructor();
5};
6// CHECK-MESSAGES: [[@LINE-3]]:7: warning: class 'DefinesDestructor' defines a destructor but does not define a copy constructor, a copy assignment operator, a move constructor or a move assignment operator [cppcoreguidelines-special-member-functions]
7
8class DefinesDefaultedDestructor {
9 ~DefinesDefaultedDestructor() = default;
10};
11// CHECK-MESSAGES: [[@LINE-3]]:7: warning: class 'DefinesDefaultedDestructor' defines a default destructor but does not define a copy constructor, a copy assignment operator, a move constructor or a move assignment operator [cppcoreguidelines-special-member-functions]
12
13class DefinesCopyConstructor {
14 DefinesCopyConstructor(const DefinesCopyConstructor &);
15};
16// CHECK-MESSAGES: [[@LINE-3]]:7: warning: class 'DefinesCopyConstructor' defines a copy constructor but does not define a destructor, a copy assignment operator, a move constructor or a move assignment operator [cppcoreguidelines-special-member-functions]
17
18class DefinesNothing {
19};
20
21class DefinesEverything {
22 DefinesEverything(const DefinesEverything &);
23 DefinesEverything &operator=(const DefinesEverything &);
24 DefinesEverything(DefinesEverything &&);
25 DefinesEverything &operator=(DefinesEverything &&);
26 ~DefinesEverything();
27};
28
29#define DEFINE_DESTRUCTOR_ONLY(ClassName) \
30 class ClassName { \
31 ~ClassName(); \
32 };
33
34#define DEFINE_COPY_CTOR_ONLY(ClassName) \
35 class ClassName { \
36 ClassName(const ClassName &); \
37 };
38
39#define DEFINE_CLASS_WITH_DTOR(ClassName) \
40 class ClassName { \
41 ~ClassName(); \
42 };
43
44DEFINE_DESTRUCTOR_ONLY(MacroDefinedClass1)
45// CHECK-MESSAGES: [[@LINE-1]]:24: warning: class 'MacroDefinedClass1' defines a destructor but does not define a copy constructor, a copy assignment operator, a move constructor or a move assignment operator
46DEFINE_COPY_CTOR_ONLY(MacroDefinedClass2)
47// CHECK-MESSAGES: [[@LINE-1]]:23: warning: class 'MacroDefinedClass2' defines a copy constructor but does not define a destructor, a copy assignment operator, a move constructor or a move assignment operator
48DEFINE_CLASS_WITH_DTOR(MacroDefinedClass3)
49// CHECK-MESSAGES: [[@LINE-1]]:24: warning: class 'MacroDefinedClass3' defines a destructor but does not define a copy constructor, a copy assignment operator, a move constructor or a move assignment operator
50
51// Test partial macro expansion
52#define CLASS_NAME MacroNamedClass
53class CLASS_NAME {
54 ~MacroNamedClass();
55};
56// CHECK-MESSAGES: [[@LINE-3]]:7: warning: class 'MacroNamedClass' defines a destructor but does not define a copy constructor, a copy assignment operator, a move constructor or a move assignment operator
57
58

source code of clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/special-member-functions-macros.cpp