1 | //===--- ReservedIdentifierCheck.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_BUGPRONE_RESERVEDIDENTIFIERCHECK_H |
10 | #define |
11 | |
12 | #include "../utils/RenamerClangTidyCheck.h" |
13 | #include <optional> |
14 | #include <string> |
15 | #include <vector> |
16 | |
17 | namespace clang::tidy::bugprone { |
18 | |
19 | /// Checks for usages of identifiers reserved for use by the implementation. |
20 | /// |
21 | /// The C and C++ standards both reserve the following names for such use: |
22 | /// * identifiers that begin with an underscore followed by an uppercase letter; |
23 | /// * identifiers in the global namespace that begin with an underscore. |
24 | /// |
25 | /// The C standard additionally reserves names beginning with a double |
26 | /// underscore, while the C++ standard strengthens this to reserve names with a |
27 | /// double underscore occurring anywhere. |
28 | /// |
29 | /// For the user-facing documentation see: |
30 | /// http://clang.llvm.org/extra/clang-tidy/checks/bugprone/reserved-identifier.html |
31 | class ReservedIdentifierCheck final : public RenamerClangTidyCheck { |
32 | const bool Invert; |
33 | const std::vector<StringRef> AllowedIdentifiersRaw; |
34 | const llvm::SmallVector<llvm::Regex> AllowedIdentifiers; |
35 | |
36 | public: |
37 | ReservedIdentifierCheck(StringRef Name, ClangTidyContext *Context); |
38 | |
39 | void storeOptions(ClangTidyOptions::OptionMap &Opts) override; |
40 | |
41 | private: |
42 | std::optional<FailureInfo> |
43 | getDeclFailureInfo(const NamedDecl *Decl, |
44 | const SourceManager &SM) const override; |
45 | std::optional<FailureInfo> |
46 | getMacroFailureInfo(const Token &MacroNameTok, |
47 | const SourceManager &SM) const override; |
48 | DiagInfo getDiagInfo(const NamingCheckId &ID, |
49 | const NamingCheckFailure &Failure) const override; |
50 | llvm::SmallVector<llvm::Regex> parseAllowedIdentifiers() const; |
51 | }; |
52 | |
53 | } // namespace clang::tidy::bugprone |
54 | |
55 | #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_RESERVEDIDENTIFIERCHECK_H |
56 | |