Author: Mike Crowe Date: 2023-07-11T19:22:32Z New Revision: b389a62518ad54ae5a183efa43f8408571b2b8cb
URL: https://github.com/llvm/llvm-project/commit/b389a62518ad54ae5a183efa43f8408571b2b8cb DIFF: https://github.com/llvm/llvm-project/commit/b389a62518ad54ae5a183efa43f8408571b2b8cb.diff LOG: [clang-tidy] Make MatchesAnyListedNameMatcher cope with unnamed Decl 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 Added: Modified: clang-tools-extra/clang-tidy/utils/Matchers.h clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-print-custom.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clang-tidy/utils/Matchers.h b/clang-tools-extra/clang-tidy/utils/Matchers.h index 1e085f59b69ede..b2faf788d687ad 100644 --- a/clang-tools-extra/clang-tidy/utils/Matchers.h +++ b/clang-tools-extra/clang-tidy/utils/Matchers.h @@ -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; } } diff --git a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-print-custom.cpp b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-print-custom.cpp index a8dda40651b7b3..c6077a46b6e000 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-print-custom.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-print-custom.cpp @@ -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, \ @@ -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 *, ...); @@ -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; +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits