From 53671fcffc9cb76e21b1396bd115f9a3e420eb47 Mon Sep 17 00:00:00 2001 From: Piotr Zegar Date: Fri, 11 Aug 2023 15:25:43 +0000 Subject: [PATCH] [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) --- .../clang-tidy/ClangTidyDiagnosticConsumer.cpp | 5 ++++- .../test/clang-tidy/infrastructure/diagnostic.cpp | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp index 57bd643c..16200a5 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 c874962..547f634 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 +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 -- 2.7.4