balazske updated this revision to Diff 321039. balazske added a comment. Existing test moved to Frontend, added new test.
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D95860/new/ https://reviews.llvm.org/D95860 Files: clang/lib/Frontend/DiagnosticRenderer.cpp clang/test/Analysis/copypaste/Inputs/clone-end-in-other-file.inc clang/test/Analysis/copypaste/clone-end-in-other-file.cpp clang/test/Frontend/crash-diagnostic-renderer.cpp Index: clang/test/Frontend/crash-diagnostic-renderer.cpp =================================================================== --- /dev/null +++ clang/test/Frontend/crash-diagnostic-renderer.cpp @@ -0,0 +1,13 @@ +// RUN: %clang_cc1 -verify %s + +// This case reproduces a problem that is shown here: +// https://bugs.llvm.org/show_bug.cgi?id=46540 +// No assertion should happen during printing of diagnostic messages. + +// 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 Index: clang/test/Analysis/copypaste/clone-end-in-other-file.cpp =================================================================== --- /dev/null +++ clang/test/Analysis/copypaste/clone-end-in-other-file.cpp @@ -0,0 +1,14 @@ +// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.clone.CloneChecker -analyzer-config alpha.clone.CloneChecker:MinimumCloneComplexity=0 -verify %s + +// This test should verify that there is no crash if the detected clone range +// starts in a file and ends in a different file. + +void f1(int i) { +#define X \ + while (true) { \ + } + if (i == 10) // expected-warning{{Duplicate code detected}} +#include "Inputs/clone-end-in-other-file.inc" + if (i == 10) // expected-note{{Similar code here}} +#include "Inputs/clone-end-in-other-file.inc" +} Index: clang/test/Analysis/copypaste/Inputs/clone-end-in-other-file.inc =================================================================== --- /dev/null +++ clang/test/Analysis/copypaste/Inputs/clone-end-in-other-file.inc @@ -0,0 +1 @@ +X Index: clang/lib/Frontend/DiagnosticRenderer.cpp =================================================================== --- clang/lib/Frontend/DiagnosticRenderer.cpp +++ clang/lib/Frontend/DiagnosticRenderer.cpp @@ -394,6 +394,9 @@ } } + if (Begin.isInvalid() || End.isInvalid() || BeginFileID != EndFileID) + continue; + // Do the backtracking. SmallVector<FileID, 4> CommonArgExpansions; computeCommonMacroArgExpansionFileIDs(Begin, End, SM, CommonArgExpansions);
Index: clang/test/Frontend/crash-diagnostic-renderer.cpp =================================================================== --- /dev/null +++ clang/test/Frontend/crash-diagnostic-renderer.cpp @@ -0,0 +1,13 @@ +// RUN: %clang_cc1 -verify %s + +// This case reproduces a problem that is shown here: +// https://bugs.llvm.org/show_bug.cgi?id=46540 +// No assertion should happen during printing of diagnostic messages. + +// 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 Index: clang/test/Analysis/copypaste/clone-end-in-other-file.cpp =================================================================== --- /dev/null +++ clang/test/Analysis/copypaste/clone-end-in-other-file.cpp @@ -0,0 +1,14 @@ +// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.clone.CloneChecker -analyzer-config alpha.clone.CloneChecker:MinimumCloneComplexity=0 -verify %s + +// This test should verify that there is no crash if the detected clone range +// starts in a file and ends in a different file. + +void f1(int i) { +#define X \ + while (true) { \ + } + if (i == 10) // expected-warning{{Duplicate code detected}} +#include "Inputs/clone-end-in-other-file.inc" + if (i == 10) // expected-note{{Similar code here}} +#include "Inputs/clone-end-in-other-file.inc" +} Index: clang/test/Analysis/copypaste/Inputs/clone-end-in-other-file.inc =================================================================== --- /dev/null +++ clang/test/Analysis/copypaste/Inputs/clone-end-in-other-file.inc @@ -0,0 +1 @@ +X Index: clang/lib/Frontend/DiagnosticRenderer.cpp =================================================================== --- clang/lib/Frontend/DiagnosticRenderer.cpp +++ clang/lib/Frontend/DiagnosticRenderer.cpp @@ -394,6 +394,9 @@ } } + if (Begin.isInvalid() || End.isInvalid() || BeginFileID != EndFileID) + continue; + // Do the backtracking. SmallVector<FileID, 4> CommonArgExpansions; computeCommonMacroArgExpansionFileIDs(Begin, End, SM, CommonArgExpansions);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits