aboutsummaryrefslogtreecommitdiff
path: root/clang-tools-extra/clang-tidy/modernize/UseUsingCheck.cpp
diff options
context:
space:
mode:
authorKarasev Nikita <cc.tapa@gmail.com>2020-02-03 07:53:08 -0500
committerAaron Ballman <aaron@aaronballman.com>2020-02-03 07:54:38 -0500
commit6423ae417e17611c4ee529f5848e839e6d9cb795 (patch)
tree4a9f25920d8102637369e70f735a6e7132144ef8 /clang-tools-extra/clang-tidy/modernize/UseUsingCheck.cpp
parente0ea706a59b9032b7f3590478080adf4f3e1486a (diff)
downloadllvm-6423ae417e17611c4ee529f5848e839e6d9cb795.zip
llvm-6423ae417e17611c4ee529f5848e839e6d9cb795.tar.gz
llvm-6423ae417e17611c4ee529f5848e839e6d9cb795.tar.bz2
Allow modernize-use-using to apply to enumerations as well.
This addresses PR44528.
Diffstat (limited to 'clang-tools-extra/clang-tidy/modernize/UseUsingCheck.cpp')
-rw-r--r--clang-tools-extra/clang-tidy/modernize/UseUsingCheck.cpp24
1 files changed, 14 insertions, 10 deletions
diff --git a/clang-tools-extra/clang-tidy/modernize/UseUsingCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseUsingCheck.cpp
index 164c9fe9..918b484 100644
--- a/clang-tools-extra/clang-tidy/modernize/UseUsingCheck.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/UseUsingCheck.cpp
@@ -25,18 +25,17 @@ void UseUsingCheck::registerMatchers(MatchFinder *Finder) {
return;
Finder->addMatcher(typedefDecl(unless(isInstantiated())).bind("typedef"),
this);
- // This matcher used to find structs defined in source code within typedefs.
+ // This matcher used to find tag declarations in source code within typedefs.
// They appear in the AST just *prior* to the typedefs.
- Finder->addMatcher(cxxRecordDecl(unless(isImplicit())).bind("struct"), this);
+ Finder->addMatcher(tagDecl(unless(isImplicit())).bind("tagdecl"), this);
}
void UseUsingCheck::check(const MatchFinder::MatchResult &Result) {
// Match CXXRecordDecl only to store the range of the last non-implicit full
// declaration, to later check whether it's within the typdef itself.
- const auto *MatchedCxxRecordDecl =
- Result.Nodes.getNodeAs<CXXRecordDecl>("struct");
- if (MatchedCxxRecordDecl) {
- LastCxxDeclRange = MatchedCxxRecordDecl->getSourceRange();
+ const auto *MatchedTagDecl = Result.Nodes.getNodeAs<TagDecl>("tagdecl");
+ if (MatchedTagDecl) {
+ LastTagDeclRange = MatchedTagDecl->getSourceRange();
return;
}
@@ -70,9 +69,13 @@ void UseUsingCheck::check(const MatchFinder::MatchResult &Result) {
// consecutive TypedefDecl nodes whose SourceRanges overlap. Each range starts
// at the "typedef" and then continues *across* previous definitions through
// the end of the current TypedefDecl definition.
+ // But also we need to check that the ranges belong to the same file because
+ // different files may contain overlapping ranges.
std::string Using = "using ";
if (ReplaceRange.getBegin().isMacroID() ||
- ReplaceRange.getBegin() >= LastReplacementEnd) {
+ (Result.SourceManager->getFileID(ReplaceRange.getBegin()) !=
+ Result.SourceManager->getFileID(LastReplacementEnd)) ||
+ (ReplaceRange.getBegin() >= LastReplacementEnd)) {
// This is the first (and possibly the only) TypedefDecl in a typedef. Save
// Type and Name in case we find subsequent TypedefDecl's in this typedef.
FirstTypedefType = Type;
@@ -95,11 +98,12 @@ void UseUsingCheck::check(const MatchFinder::MatchResult &Result) {
auto Diag = diag(ReplaceRange.getBegin(), UseUsingWarning);
- // If typedef contains a full struct/class declaration, extract its full text.
- if (LastCxxDeclRange.isValid() && ReplaceRange.fullyContains(LastCxxDeclRange)) {
+ // If typedef contains a full tag declaration, extract its full text.
+ if (LastTagDeclRange.isValid() &&
+ ReplaceRange.fullyContains(LastTagDeclRange)) {
bool Invalid;
Type = std::string(
- Lexer::getSourceText(CharSourceRange::getTokenRange(LastCxxDeclRange),
+ Lexer::getSourceText(CharSourceRange::getTokenRange(LastTagDeclRange),
*Result.SourceManager, getLangOpts(), &Invalid));
if (Invalid)
return;