Skip to content

Commit

Permalink
[clang-tidy] Make MatchesAnyListedNameMatcher cope with unnamed Decl
Browse files Browse the repository at this point in the history
If MatchesAnyListedNameMatcher::NameMatcher::match() is called in
MatchMode::MatchUnqualified mode with a NamedDecl that has no name then
calling NamedDecl::getName() will assert with:
 `Name.isIdentifier() && "Name is not a simple identifier"'

It seems unfair to force all matchers using
matchers::matchesAnyListedName to defend against this, particularly
since test cases are unlikely to provoke the problem. Let's just check
whether the identifier has a name before attempting to use it instead.

Add test case that reproduces the problem to the
use-std-print-custom.cpp lit check.

Reviewed By: PiotrZSL

Differential Revision: https://reviews.llvm.org/D154884
  • Loading branch information
mikecrowe authored and PiotrZSL committed Jul 11, 2023
1 parent 2ce765e commit b389a62
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 3 deletions.
4 changes: 3 additions & 1 deletion clang-tools-extra/clang-tidy/utils/Matchers.h
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,9 @@ class MatchesAnyListedNameMatcher
case MatchMode::MatchFullyQualified:
return Regex.match("::" + ND.getQualifiedNameAsString());
default:
return Regex.match(ND.getName());
if (const IdentifierInfo *II = ND.getIdentifier())
return Regex.match(II->getName());
return false;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
// RUN: [ \
// RUN: { \
// RUN: key: modernize-use-std-print.PrintfLikeFunctions, \
// RUN: value: '::myprintf; mynamespace::myprintf2' \
// RUN: value: 'unqualified_printf;::myprintf; mynamespace::myprintf2' \
// RUN: }, \
// RUN: { \
// RUN: key: modernize-use-std-print.FprintfLikeFunctions, \
Expand All @@ -14,7 +14,7 @@
// RUN: -- -isystem %clang_tidy_headers

#include <cstdio>
#include <string.h>
#include <string>

int myprintf(const char *, ...);
int myfprintf(FILE *fp, const char *, ...);
Expand Down Expand Up @@ -85,3 +85,10 @@ int fprintf_uses_return_value(int i) {
// CHECK-MESSAGES-NOT: [[@LINE-1]]:10: warning: use 'std::println' instead of 'myprintf' [modernize-use-std-print]
// CHECK-FIXES-NOT: std::println(stderr, "return value {}", i);
}

// Ensure that MatchesAnyListedNameMatcher::NameMatcher::match() can cope with a
// NamedDecl that has no name when we're trying to match unqualified_printf.
void no_name(const std::string &in)
{
"A" + in;
}

0 comments on commit b389a62

Please sign in to comment.