aboutsummaryrefslogtreecommitdiff
path: root/clang-tools-extra/clang-tidy/modernize/UseUsingCheck.cpp
diff options
context:
space:
mode:
authorDa-Viper <57949090+Da-Viper@users.noreply.github.com>2023-12-26 09:27:10 +0000
committerPiotr Zegar <me@piotrzegar.pl>2023-12-26 09:36:07 +0000
commit583a2583bb5f53b7b2cbd3d2043c0b2ac286464f (patch)
tree45ed7f9e155fb747349c5a6fb095884a650d96c2 /clang-tools-extra/clang-tidy/modernize/UseUsingCheck.cpp
parent34621aa81f63812b31d1356030e9d74ce59e56fc (diff)
downloadllvm-583a2583bb5f53b7b2cbd3d2043c0b2ac286464f.zip
llvm-583a2583bb5f53b7b2cbd3d2043c0b2ac286464f.tar.gz
llvm-583a2583bb5f53b7b2cbd3d2043c0b2ac286464f.tar.bz2
[clang-tidy] Don't replace typedefs in extern c scope (#69102)
Added IgnoreExternC option to modernize-use-using check. Fixes #35272
Diffstat (limited to 'clang-tools-extra/clang-tidy/modernize/UseUsingCheck.cpp')
-rw-r--r--clang-tools-extra/clang-tidy/modernize/UseUsingCheck.cpp31
1 files changed, 25 insertions, 6 deletions
diff --git a/clang-tools-extra/clang-tidy/modernize/UseUsingCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseUsingCheck.cpp
index e6293ed..f5fc3ad 100644
--- a/clang-tools-extra/clang-tidy/modernize/UseUsingCheck.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/UseUsingCheck.cpp
@@ -11,26 +11,39 @@
#include "clang/Lex/Lexer.h"
using namespace clang::ast_matchers;
+namespace {
+
+AST_MATCHER(clang::LinkageSpecDecl, isExternCLinkage) {
+ return Node.getLanguage() == clang::LinkageSpecDecl::lang_c;
+}
+} // namespace
namespace clang::tidy::modernize {
+static constexpr llvm::StringLiteral ExternCDeclName = "extern-c-decl";
static constexpr llvm::StringLiteral ParentDeclName = "parent-decl";
static constexpr llvm::StringLiteral TagDeclName = "tag-decl";
static constexpr llvm::StringLiteral TypedefName = "typedef";
UseUsingCheck::UseUsingCheck(StringRef Name, ClangTidyContext *Context)
: ClangTidyCheck(Name, Context),
- IgnoreMacros(Options.getLocalOrGlobal("IgnoreMacros", true)) {}
+ IgnoreMacros(Options.getLocalOrGlobal("IgnoreMacros", true)),
+ IgnoreExternC(Options.get("IgnoreExternC", false)) {}
void UseUsingCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
Options.store(Opts, "IgnoreMacros", IgnoreMacros);
+ Options.store(Opts, "IgnoreExternC", IgnoreExternC);
}
void UseUsingCheck::registerMatchers(MatchFinder *Finder) {
- Finder->addMatcher(typedefDecl(unless(isInstantiated()),
- hasParent(decl().bind(ParentDeclName)))
- .bind(TypedefName),
- this);
+ Finder->addMatcher(
+ typedefDecl(
+ unless(isInstantiated()),
+ optionally(hasAncestor(
+ linkageSpecDecl(isExternCLinkage()).bind(ExternCDeclName))),
+ hasParent(decl().bind(ParentDeclName)))
+ .bind(TypedefName),
+ this);
// This matcher is used to find tag declarations in source code within
// typedefs. They appear in the AST just *prior* to the typedefs.
@@ -70,6 +83,11 @@ void UseUsingCheck::check(const MatchFinder::MatchResult &Result) {
if (MatchedDecl->getLocation().isInvalid())
return;
+ const auto *ExternCDecl =
+ Result.Nodes.getNodeAs<LinkageSpecDecl>(ExternCDeclName);
+ if (ExternCDecl && IgnoreExternC)
+ return;
+
SourceLocation StartLoc = MatchedDecl->getBeginLoc();
if (StartLoc.isMacroID() && IgnoreMacros)
@@ -122,7 +140,8 @@ void UseUsingCheck::check(const MatchFinder::MatchResult &Result) {
Type = FirstTypedefName + Type.substr(FirstTypedefType.size() + 1);
}
if (!ReplaceRange.getEnd().isMacroID()) {
- const SourceLocation::IntTy Offset = MatchedDecl->getFunctionType() ? 0 : Name.size();
+ const SourceLocation::IntTy Offset =
+ MatchedDecl->getFunctionType() ? 0 : Name.size();
LastReplacementEnd = ReplaceRange.getEnd().getLocWithOffset(Offset);
}