forked from OSchip/llvm-project
[analyzer][ctu] fix unsortable diagnostics
Summary: In the provided test case the PathDiagnostic compare function was not able to find a difference. Reviewers: xazax.hun, NoQ, dcoughlin, george.karpenkov Reviewed By: george.karpenkov Subscribers: a_sidorin, szepet, rnkovacs, a.sidorin, mikhail.ramalho, cfe-commits Differential Revision: https://reviews.llvm.org/D48474 llvm-svn: 336275
This commit is contained in:
parent
1e4dc2e97d
commit
67676e9c99
|
@ -406,11 +406,15 @@ static bool compareCrossTUSourceLocs(FullSourceLoc XL, FullSourceLoc YL) {
|
|||
std::pair<bool, bool> InSameTU = SM.isInTheSameTranslationUnit(XOffs, YOffs);
|
||||
if (InSameTU.first)
|
||||
return XL.isBeforeInTranslationUnitThan(YL);
|
||||
const FileEntry *XFE = SM.getFileEntryForID(XL.getFileID());
|
||||
const FileEntry *YFE = SM.getFileEntryForID(YL.getFileID());
|
||||
const FileEntry *XFE = SM.getFileEntryForID(XL.getSpellingLoc().getFileID());
|
||||
const FileEntry *YFE = SM.getFileEntryForID(YL.getSpellingLoc().getFileID());
|
||||
if (!XFE || !YFE)
|
||||
return XFE && !YFE;
|
||||
return XFE->getName() < YFE->getName();
|
||||
int NameCmp = XFE->getName().compare(YFE->getName());
|
||||
if (NameCmp != 0)
|
||||
return NameCmp == -1;
|
||||
// Last resort: Compare raw file IDs that are possibly expansions.
|
||||
return XL.getFileID() < YL.getFileID();
|
||||
}
|
||||
|
||||
static bool compare(const PathDiagnostic &X, const PathDiagnostic &Y) {
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
#include "../ctu-hdr.h"
|
||||
|
||||
int callback_to_main(int x);
|
||||
int f(int x) {
|
||||
return x - 1;
|
||||
|
@ -68,3 +70,8 @@ int chf1(int x) {
|
|||
|
||||
typedef struct { int n; } Anonymous;
|
||||
int fun_using_anon_struct(int n) { Anonymous anon; anon.n = n; return anon.n; }
|
||||
|
||||
int other_macro_diag(int x) {
|
||||
MACRODIAG();
|
||||
return x;
|
||||
}
|
||||
|
|
|
@ -12,3 +12,4 @@ c:@F@h_chain#I# ctu-chain.cpp.ast
|
|||
c:@N@chns@S@chcls@F@chf4#I# ctu-chain.cpp.ast
|
||||
c:@N@chns@F@chf2#I# ctu-chain.cpp.ast
|
||||
c:@F@fun_using_anon_struct#I# ctu-other.cpp.ast
|
||||
c:@F@other_macro_diag#I# ctu-other.cpp.ast
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
#define MACRODIAG() clang_analyzer_warnIfReached()
|
||||
|
||||
void clang_analyzer_warnIfReached();
|
|
@ -4,6 +4,8 @@
|
|||
// RUN: cp %S/Inputs/externalFnMap.txt %T/ctudir/
|
||||
// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fsyntax-only -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-config experimental-enable-naive-ctu-analysis=true -analyzer-config ctu-dir=%T/ctudir -verify %s
|
||||
|
||||
#include "ctu-hdr.h"
|
||||
|
||||
void clang_analyzer_eval(int);
|
||||
|
||||
int f(int);
|
||||
|
@ -41,6 +43,7 @@ int chf1(int x);
|
|||
}
|
||||
|
||||
int fun_using_anon_struct(int);
|
||||
int other_macro_diag(int);
|
||||
|
||||
int main() {
|
||||
clang_analyzer_eval(f(3) == 2); // expected-warning{{TRUE}}
|
||||
|
@ -58,4 +61,8 @@ int main() {
|
|||
|
||||
clang_analyzer_eval(chns::chf1(4) == 12); // expected-warning{{TRUE}}
|
||||
clang_analyzer_eval(fun_using_anon_struct(8) == 8); // expected-warning{{TRUE}}
|
||||
|
||||
clang_analyzer_eval(other_macro_diag(1) == 1); // expected-warning{{TRUE}}
|
||||
// expected-warning@Inputs/ctu-other.cpp:75{{REACHABLE}}
|
||||
MACRODIAG(); // expected-warning{{REACHABLE}}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue