clang-tools
11.0.0
clang-tools-extra
clang-tidy
cppcoreguidelines
SpecialMemberFunctionsCheck.h
Go to the documentation of this file.
1
//===--- SpecialMemberFunctionsCheck.h - clang-tidy--------------*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
9
#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CPPCOREGUIDELINES_SPECIAL_MEMBER_FUNCTIONS_H
10
#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CPPCOREGUIDELINES_SPECIAL_MEMBER_FUNCTIONS_H
11
12
#include "../ClangTidyCheck.h"
13
14
#include "llvm/ADT/DenseMapInfo.h"
15
16
namespace
clang
{
17
namespace
tidy {
18
namespace
cppcoreguidelines {
19
20
/// Checks for classes where some, but not all, of the special member functions
21
/// are defined.
22
///
23
/// For the user-facing documentation see:
24
/// http://clang.llvm.org/extra/clang-tidy/checks/cppcoreguidelines-special-member-functions.html
25
class
SpecialMemberFunctionsCheck
:
public
ClangTidyCheck
{
26
public
:
27
SpecialMemberFunctionsCheck
(StringRef
Name
,
ClangTidyContext
*Context);
28
bool
isLanguageVersionSupported
(
const
LangOptions &LangOpts)
const override
{
29
return
LangOpts.CPlusPlus;
30
}
31
void
storeOptions
(
ClangTidyOptions::OptionMap
&Opts)
override
;
32
void
registerMatchers
(ast_matchers::MatchFinder *Finder)
override
;
33
void
check
(
const
ast_matchers::MatchFinder::MatchResult &Result)
override
;
34
void
onEndOfTranslationUnit
()
override
;
35
36
enum class
SpecialMemberFunctionKind
: uint8_t {
37
Destructor
,
38
DefaultDestructor
,
39
NonDefaultDestructor
,
40
CopyConstructor
,
41
CopyAssignment
,
42
MoveConstructor
,
43
MoveAssignment
44
};
45
46
struct
SpecialMemberFunctionData
{
47
SpecialMemberFunctionKind
FunctionKind
;
48
bool
IsDeleted
;
49
50
bool
operator==
(
const
SpecialMemberFunctionData
&Other) {
51
return
(Other.
FunctionKind
==
FunctionKind
) &&
52
(Other.
IsDeleted
==
IsDeleted
);
53
}
54
};
55
56
using
ClassDefId
= std::pair<SourceLocation, std::string>;
57
58
using
ClassDefiningSpecialMembersMap
=
59
llvm::DenseMap<
ClassDefId
,
60
llvm::SmallVector<SpecialMemberFunctionData, 5>>;
61
62
private
:
63
void
checkForMissingMembers(
64
const
ClassDefId
&ID,
65
llvm::ArrayRef<SpecialMemberFunctionData> DefinedSpecialMembers);
66
67
const
bool
AllowMissingMoveFunctions;
68
const
bool
AllowSoleDefaultDtor;
69
const
bool
AllowMissingMoveFunctionsWhenCopyIsDeleted;
70
ClassDefiningSpecialMembersMap
ClassWithSpecialMembers;
71
};
72
73
}
// namespace cppcoreguidelines
74
}
// namespace tidy
75
}
// namespace clang
76
77
namespace
llvm
{
78
/// Specialisation of DenseMapInfo to allow ClassDefId objects in DenseMaps
79
/// FIXME: Move this to the corresponding cpp file as is done for
80
/// clang-tidy/readability/IdentifierNamingCheck.cpp.
81
template
<>
82
struct
DenseMapInfo<
83
clang
::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::ClassDefId> {
84
using
ClassDefId
=
85
clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::ClassDefId
;
86
87
static
inline
ClassDefId
getEmptyKey
() {
88
return
ClassDefId
(
89
clang::SourceLocation::getFromRawEncoding(static_cast<unsigned>(-1)),
90
"EMPTY"
);
91
}
92
93
static
inline
ClassDefId
getTombstoneKey
() {
94
return
ClassDefId
(
95
clang::SourceLocation::getFromRawEncoding(static_cast<unsigned>(-2)),
96
"TOMBSTONE"
);
97
}
98
99
static
unsigned
getHashValue
(
ClassDefId
Val) {
100
assert(Val != getEmptyKey() &&
"Cannot hash the empty key!"
);
101
assert(Val != getTombstoneKey() &&
"Cannot hash the tombstone key!"
);
102
103
std::hash<ClassDefId::second_type> SecondHash;
104
return
Val.first.getRawEncoding() + SecondHash(Val.second);
105
}
106
107
static
bool
isEqual
(
const
ClassDefId
&LHS,
const
ClassDefId
&RHS) {
108
if
(RHS == getEmptyKey())
109
return
LHS == getEmptyKey();
110
if
(RHS == getTombstoneKey())
111
return
LHS == getTombstoneKey();
112
return
LHS == RHS;
113
}
114
};
115
116
}
// namespace llvm
117
118
#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CPPCOREGUIDELINES_SPECIAL_MEMBER_FUNCTIONS_H
clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::storeOptions
void storeOptions(ClangTidyOptions::OptionMap &Opts) override
Should store all options supported by this check with their current values or default values for opti...
Definition:
SpecialMemberFunctionsCheck.cpp:32
clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::SpecialMemberFunctionData
Definition:
SpecialMemberFunctionsCheck.h:46
clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::ClassDefId
std::pair< SourceLocation, std::string > ClassDefId
Definition:
SpecialMemberFunctionsCheck.h:56
llvm
Some operations such as code completion produce a set of candidates.
Definition:
YAMLGenerator.cpp:28
clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::SpecialMemberFunctionData::FunctionKind
SpecialMemberFunctionKind FunctionKind
Definition:
SpecialMemberFunctionsCheck.h:47
clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::onEndOfTranslationUnit
void onEndOfTranslationUnit() override
Definition:
SpecialMemberFunctionsCheck.cpp:137
clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck
Checks for classes where some, but not all, of the special member functions are defined.
Definition:
SpecialMemberFunctionsCheck.h:25
clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::registerMatchers
void registerMatchers(ast_matchers::MatchFinder *Finder) override
Override this to register AST matchers with Finder.
Definition:
SpecialMemberFunctionsCheck.cpp:40
clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::SpecialMemberFunctionKind::NonDefaultDestructor
clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::check
void check(const ast_matchers::MatchFinder::MatchResult &Result) override
ClangTidyChecks that register ASTMatchers should do the actual work in here.
Definition:
SpecialMemberFunctionsCheck.cpp:102
clang::tidy::ClangTidyCheck
Base class for all clang-tidy checks.
Definition:
ClangTidyCheck.h:114
llvm::DenseMapInfo< clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::ClassDefId >::getTombstoneKey
static ClassDefId getTombstoneKey()
Definition:
SpecialMemberFunctionsCheck.h:93
llvm::DenseMapInfo< clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::ClassDefId >::getHashValue
static unsigned getHashValue(ClassDefId Val)
Definition:
SpecialMemberFunctionsCheck.h:99
llvm::DenseMapInfo< clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::ClassDefId >::getEmptyKey
static ClassDefId getEmptyKey()
Definition:
SpecialMemberFunctionsCheck.h:87
clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::SpecialMemberFunctionKind::Destructor
clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::ClassDefiningSpecialMembersMap
llvm::DenseMap< ClassDefId, llvm::SmallVector< SpecialMemberFunctionData, 5 > > ClassDefiningSpecialMembersMap
Definition:
SpecialMemberFunctionsCheck.h:60
clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::SpecialMemberFunctionKind::MoveConstructor
clang::tidy::ClangTidyContext
Every ClangTidyCheck reports errors through a DiagnosticsEngine provided by this context.
Definition:
ClangTidyDiagnosticConsumer.h:76
Name
static constexpr llvm::StringLiteral Name
Definition:
UppercaseLiteralSuffixCheck.cpp:27
clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::SpecialMemberFunctionKind::CopyConstructor
clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::SpecialMemberFunctionsCheck
SpecialMemberFunctionsCheck(StringRef Name, ClangTidyContext *Context)
Definition:
SpecialMemberFunctionsCheck.cpp:24
clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::SpecialMemberFunctionData::IsDeleted
bool IsDeleted
Definition:
SpecialMemberFunctionsCheck.h:48
clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::SpecialMemberFunctionKind::DefaultDestructor
clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::isLanguageVersionSupported
bool isLanguageVersionSupported(const LangOptions &LangOpts) const override
Override this to disable registering matchers and PP callbacks if an invalid language version is bein...
Definition:
SpecialMemberFunctionsCheck.h:28
llvm::DenseMapInfo< clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::ClassDefId >::isEqual
static bool isEqual(const ClassDefId &LHS, const ClassDefId &RHS)
Definition:
SpecialMemberFunctionsCheck.h:107
clang
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
Definition:
ApplyReplacements.h:27
clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::SpecialMemberFunctionData::operator==
bool operator==(const SpecialMemberFunctionData &Other)
Definition:
SpecialMemberFunctionsCheck.h:50
llvm::DenseMapInfo< clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::ClassDefId >::ClassDefId
clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::ClassDefId ClassDefId
Definition:
SpecialMemberFunctionsCheck.h:85
clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::SpecialMemberFunctionKind::CopyAssignment
clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::SpecialMemberFunctionKind::MoveAssignment
clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::SpecialMemberFunctionKind
SpecialMemberFunctionKind
Definition:
SpecialMemberFunctionsCheck.h:36
clang::tidy::ClangTidyOptions::OptionMap
std::map< std::string, ClangTidyValue > OptionMap
Definition:
ClangTidyOptions.h:111
Generated on Tue Jul 28 2020 16:14:03 for clang-tools by
1.8.16