Attempt to make the PathDiagnostic emission order more deterministic by
looking at PathPieces. llvm-svn: 163427
This commit is contained in:
parent
bfd22b4155
commit
334ad6ac13
|
@ -208,6 +208,41 @@ void PathDiagnosticConsumer::HandlePathDiagnostic(PathDiagnostic *D) {
|
|||
|
||||
|
||||
namespace {
|
||||
|
||||
static llvm::Optional<bool> comparePiece(PathDiagnosticPiece &X,
|
||||
PathDiagnosticPiece &Y) {
|
||||
PathDiagnosticPiece::Kind XK = X.getKind(), YK = Y.getKind();
|
||||
if (XK != YK) {
|
||||
return XK < YK;
|
||||
}
|
||||
FullSourceLoc XL = X.getLocation().asLocation();
|
||||
FullSourceLoc YL = Y.getLocation().asLocation();
|
||||
if (XL < YL)
|
||||
return true;
|
||||
if (YL < XL)
|
||||
return false;
|
||||
const std::string &XS = X.getString();
|
||||
const std::string &YS = Y.getString();
|
||||
if (XS != YS)
|
||||
return XS < YS;
|
||||
return llvm::Optional<bool>();
|
||||
}
|
||||
|
||||
static bool comparePathPieces(const PathPieces &X, const PathPieces &Y) {
|
||||
if (X.size() < Y.size())
|
||||
return true;
|
||||
if (X.size() > Y.size())
|
||||
return false;
|
||||
// Compare individual parts of the path.
|
||||
assert(X.size() == Y.size());
|
||||
for (unsigned i = 0, n = X.size(); i < n; ++i) {
|
||||
llvm::Optional<bool> B = comparePiece(*X[i], *Y[i]);
|
||||
if (B.hasValue())
|
||||
return B.getValue();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
struct CompareDiagnostics {
|
||||
// Compare if 'X' is "<" than 'Y'.
|
||||
bool operator()(const PathDiagnostic *X, const PathDiagnostic *Y) const {
|
||||
|
@ -216,7 +251,7 @@ struct CompareDiagnostics {
|
|||
const FullSourceLoc &YLoc = Y->getLocation().asLocation();
|
||||
if (XLoc < YLoc)
|
||||
return true;
|
||||
if (XLoc != YLoc)
|
||||
if (YLoc < XLoc)
|
||||
return false;
|
||||
|
||||
// Next, compare by bug type.
|
||||
|
@ -235,8 +270,8 @@ struct CompareDiagnostics {
|
|||
if (XDesc != YDesc)
|
||||
return false;
|
||||
|
||||
// FIXME: Further refine by comparing PathDiagnosticPieces?
|
||||
return false;
|
||||
// Fall back to comparing path pieces.
|
||||
return comparePathPieces(X->path, Y->path);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1924,7 +1924,6 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) {
|
|||
}
|
||||
|
||||
// CHECK: <plist version="1.0">
|
||||
// CHECK: <dict>
|
||||
// CHECK: <key>diagnostics</key>
|
||||
// CHECK-NEXT: <array>
|
||||
// CHECK-NEXT: <dict>
|
||||
|
@ -12752,10 +12751,44 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) {
|
|||
// CHECK-NEXT: <key>path</key>
|
||||
// CHECK-NEXT: <array>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>kind</key><string>control</string>
|
||||
// CHECK-NEXT: <key>edges</key>
|
||||
// CHECK-NEXT: <array>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>start</key>
|
||||
// CHECK-NEXT: <array>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>838</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>3</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>838</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>3</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: </array>
|
||||
// CHECK-NEXT: <key>end</key>
|
||||
// CHECK-NEXT: <array>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>839</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>3</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>839</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>3</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: </array>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: </array>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>kind</key><string>event</string>
|
||||
// CHECK-NEXT: <key>location</key>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>838</integer>
|
||||
// CHECK-NEXT: <key>line</key><integer>839</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>3</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
|
@ -12763,12 +12796,12 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) {
|
|||
// CHECK-NEXT: <array>
|
||||
// CHECK-NEXT: <array>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>838</integer>
|
||||
// CHECK-NEXT: <key>line</key><integer>839</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>3</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>838</integer>
|
||||
// CHECK-NEXT: <key>line</key><integer>839</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>18</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
|
@ -12776,15 +12809,15 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) {
|
|||
// CHECK-NEXT: </array>
|
||||
// CHECK-NEXT: <key>depth</key><integer>0</integer>
|
||||
// CHECK-NEXT: <key>extended_message</key>
|
||||
// CHECK-NEXT: <string>Calling 'NoCopyString'</string>
|
||||
// CHECK-NEXT: <string>Calling 'noCopyString'</string>
|
||||
// CHECK-NEXT: <key>message</key>
|
||||
// CHECK-NEXT: <string>Calling 'NoCopyString'</string>
|
||||
// CHECK-NEXT: <string>Calling 'noCopyString'</string>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>kind</key><string>event</string>
|
||||
// CHECK-NEXT: <key>location</key>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>833</integer>
|
||||
// CHECK-NEXT: <key>line</key><integer>834</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>1</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
|
@ -12802,12 +12835,12 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) {
|
|||
// CHECK-NEXT: <key>start</key>
|
||||
// CHECK-NEXT: <array>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>833</integer>
|
||||
// CHECK-NEXT: <key>line</key><integer>834</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>1</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>833</integer>
|
||||
// CHECK-NEXT: <key>line</key><integer>834</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>1</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
|
@ -12815,12 +12848,12 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) {
|
|||
// CHECK-NEXT: <key>end</key>
|
||||
// CHECK-NEXT: <array>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>833</integer>
|
||||
// CHECK-NEXT: <key>line</key><integer>834</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>30</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>833</integer>
|
||||
// CHECK-NEXT: <key>line</key><integer>834</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>35</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
|
@ -12836,12 +12869,12 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) {
|
|||
// CHECK-NEXT: <key>start</key>
|
||||
// CHECK-NEXT: <array>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>833</integer>
|
||||
// CHECK-NEXT: <key>line</key><integer>834</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>30</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>833</integer>
|
||||
// CHECK-NEXT: <key>line</key><integer>834</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>35</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
|
@ -12849,12 +12882,12 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) {
|
|||
// CHECK-NEXT: <key>end</key>
|
||||
// CHECK-NEXT: <array>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>833</integer>
|
||||
// CHECK-NEXT: <key>line</key><integer>834</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>37</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>833</integer>
|
||||
// CHECK-NEXT: <key>line</key><integer>834</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>37</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
|
@ -12866,7 +12899,7 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) {
|
|||
// CHECK-NEXT: <key>kind</key><string>event</string>
|
||||
// CHECK-NEXT: <key>location</key>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>833</integer>
|
||||
// CHECK-NEXT: <key>line</key><integer>834</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>37</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
|
@ -12874,12 +12907,12 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) {
|
|||
// CHECK-NEXT: <array>
|
||||
// CHECK-NEXT: <array>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>833</integer>
|
||||
// CHECK-NEXT: <key>line</key><integer>834</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>37</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>833</integer>
|
||||
// CHECK-NEXT: <key>line</key><integer>834</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>59</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
|
@ -12895,7 +12928,7 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) {
|
|||
// CHECK-NEXT: <key>kind</key><string>event</string>
|
||||
// CHECK-NEXT: <key>location</key>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>838</integer>
|
||||
// CHECK-NEXT: <key>line</key><integer>839</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>3</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
|
@ -12903,12 +12936,12 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) {
|
|||
// CHECK-NEXT: <array>
|
||||
// CHECK-NEXT: <array>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>838</integer>
|
||||
// CHECK-NEXT: <key>line</key><integer>839</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>3</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>838</integer>
|
||||
// CHECK-NEXT: <key>line</key><integer>839</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>18</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
|
@ -12916,43 +12949,9 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) {
|
|||
// CHECK-NEXT: </array>
|
||||
// CHECK-NEXT: <key>depth</key><integer>1</integer>
|
||||
// CHECK-NEXT: <key>extended_message</key>
|
||||
// CHECK-NEXT: <string>Returning from 'NoCopyString'</string>
|
||||
// CHECK-NEXT: <string>Returning from 'noCopyString'</string>
|
||||
// CHECK-NEXT: <key>message</key>
|
||||
// CHECK-NEXT: <string>Returning from 'NoCopyString'</string>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>kind</key><string>control</string>
|
||||
// CHECK-NEXT: <key>edges</key>
|
||||
// CHECK-NEXT: <array>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>start</key>
|
||||
// CHECK-NEXT: <array>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>838</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>3</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>838</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>3</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: </array>
|
||||
// CHECK-NEXT: <key>end</key>
|
||||
// CHECK-NEXT: <array>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>839</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>3</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>839</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>3</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: </array>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: </array>
|
||||
// CHECK-NEXT: <string>Returning from 'noCopyString'</string>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>kind</key><string>control</string>
|
||||
|
@ -23804,3 +23803,4 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) {
|
|||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: </array>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: </plist>
|
Loading…
Reference in New Issue