[llvm-branch-commits] [clang-tools-extra] 53671fc - [clang-tidy] Fix crash when diagnostic is emit with invalid location
Tobias Hieta via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Aug 15 02:09:30 PDT 2023
Author: Piotr Zegar
Date: 2023-08-15T11:08:15+02:00
New Revision: 53671fcffc9cb76e21b1396bd115f9a3e420eb47
URL: https://github.com/llvm/llvm-project/commit/53671fcffc9cb76e21b1396bd115f9a3e420eb47
DIFF: https://github.com/llvm/llvm-project/commit/53671fcffc9cb76e21b1396bd115f9a3e420eb47.diff
LOG: [clang-tidy] Fix crash when diagnostic is emit with invalid location
Fix crash when diagnostic is emit with invalid location,
but with attached valid ranges. Diagnostic can contain
invalid location, but SourceManager attached to it still
can be valid, use it in such case or fallback to known
SourceManager.
Fixes: #64602
Reviewed By: aaron.ballman
Differential Revision: https://reviews.llvm.org/D157649
(cherry picked from commit efd44f80a5a8194b9fe26ff3244ce702cd8dab73)
Added:
Modified:
clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
clang-tools-extra/test/clang-tidy/infrastructure/diagnostic.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
index 57bd643c00139a..16200a57ee12b4 100644
--- a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
+++ b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
@@ -436,8 +436,11 @@ void ClangTidyDiagnosticConsumer::HandleDiagnostic(
SmallString<100> Message;
Info.FormatDiagnostic(Message);
FullSourceLoc Loc;
- if (Info.getLocation().isValid() && Info.hasSourceManager())
+ if (Info.hasSourceManager())
Loc = FullSourceLoc(Info.getLocation(), Info.getSourceManager());
+ else if (Context.DiagEngine->hasSourceManager())
+ Loc = FullSourceLoc(Info.getLocation(),
+ Context.DiagEngine->getSourceManager());
Converter.emitDiagnostic(Loc, DiagLevel, Message, Info.getRanges(),
Info.getFixItHints());
}
diff --git a/clang-tools-extra/test/clang-tidy/infrastructure/diagnostic.cpp b/clang-tools-extra/test/clang-tidy/infrastructure/diagnostic.cpp
index c87496292b9db2..547f634a101c58 100644
--- a/clang-tools-extra/test/clang-tidy/infrastructure/diagnostic.cpp
+++ b/clang-tools-extra/test/clang-tidy/infrastructure/diagnostic.cpp
@@ -25,6 +25,7 @@
// RUN: not clang-tidy -checks='-*,modernize-use-override' %T/diagnostics/input.cpp -- -DCOMPILATION_ERROR 2>&1 | FileCheck -check-prefix=CHECK6 -implicit-check-not='{{warning:|error:}}' %s
// RUN: clang-tidy -checks='-*,modernize-use-override,clang-diagnostic-macro-redefined' %s -- -DMACRO_FROM_COMMAND_LINE -std=c++20 | FileCheck -check-prefix=CHECK4 -implicit-check-not='{{warning:|error:}}' %s
// RUN: clang-tidy -checks='-*,modernize-use-override,clang-diagnostic-macro-redefined,clang-diagnostic-literal-conversion' %s -- -DMACRO_FROM_COMMAND_LINE -std=c++20 -Wno-macro-redefined | FileCheck --check-prefix=CHECK7 -implicit-check-not='{{warning:|error:}}' %s
+// RUN: not clang-tidy -checks='-*,modernize-use-override' %s -- -std=c++20 -DPR64602 | FileCheck -check-prefix=CHECK8 -implicit-check-not='{{warning:|error:}}' %s
// CHECK1: error: no input files [clang-diagnostic-error]
// CHECK1: error: no such file or directory: '{{.*}}nonexistent.cpp' [clang-diagnostic-error]
@@ -54,3 +55,18 @@ void f(int a) {
// CHECK6: :[[@LINE-1]]:3: error: cannot take the address of an rvalue of type 'int' [clang-diagnostic-error]
}
#endif
+
+#ifdef PR64602 // Should not crash
+template <class T = void>
+struct S
+{
+ auto foo(auto);
+};
+
+template <>
+auto S<>::foo(auto)
+{
+ return 1;
+}
+// CHECK8: error: template parameter list matching the non-templated nested type 'S<>' should be empty ('template<>') [clang-diagnostic-error]
+#endif
More information about the llvm-branch-commits
mailing list