diff --git a/clang/lib/Frontend/DiagnosticRenderer.cpp b/clang/lib/Frontend/DiagnosticRenderer.cpp --- a/clang/lib/Frontend/DiagnosticRenderer.cpp +++ b/clang/lib/Frontend/DiagnosticRenderer.cpp @@ -394,6 +394,9 @@ } } + if (Begin.isInvalid() || End.isInvalid() || BeginFileID != EndFileID) + continue; + // Do the backtracking. SmallVector CommonArgExpansions; computeCommonMacroArgExpansionFileIDs(Begin, End, SM, CommonArgExpansions); diff --git a/clang/test/Analysis/crash-diagnostic-renderer.cpp b/clang/test/Analysis/crash-diagnostic-renderer.cpp new file mode 100644 --- /dev/null +++ b/clang/test/Analysis/crash-diagnostic-renderer.cpp @@ -0,0 +1,13 @@ +// RUN: %clang_analyze_cc1 -analyzer-checker=core -verify %s + +// This case reproduces a problem that is shown here: +// https://bugs.llvm.org/show_bug.cgi?id=46540 +// No assertion should happen in this case. + +// expected-error@13{{'b' does not refer to a type name in pseudo-destructor expression; expected the name of type 'volatile long'}} +// expected-error@13{{expected ')'}} +// expected-note@13{{to match this '('}} +// expected-error@13{{reference to pseudo-destructor must be called; did you mean to call it with no arguments?}} +// expected-error@13{{cannot initialize a variable of type 'volatile long' with an rvalue of type 'void'}} +// expected-error@13{{expected ';' after top level declarator}} +volatile long a ( a .~b