summaryrefslogtreecommitdiffstats
path: root/clang/Sema
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2007-09-21 18:15:22 +0000
committerChris Lattner <sabre@nondot.org>2007-09-21 18:15:22 +0000
commit4b2ff02f72986adfcce3b7ac65942d75518abcd2 (patch)
tree8b35a5821a9e1c3b16f430f565a69fd416447e26 /clang/Sema
parentd331c8565f19e0e792e28ffedf0b65366e5d5789 (diff)
downloadbcm5719-llvm-4b2ff02f72986adfcce3b7ac65942d75518abcd2.tar.gz
bcm5719-llvm-4b2ff02f72986adfcce3b7ac65942d75518abcd2.zip
Make case sorting deterministic by not depending on pointer
values. Patch mostly by Gabor Greif for PR1682. llvm-svn: 42203
Diffstat (limited to 'clang/Sema')
-rw-r--r--clang/Sema/SemaStmt.cpp19
1 files changed, 17 insertions, 2 deletions
diff --git a/clang/Sema/SemaStmt.cpp b/clang/Sema/SemaStmt.cpp
index 0522996a55e..653a0ab5b9e 100644
--- a/clang/Sema/SemaStmt.cpp
+++ b/clang/Sema/SemaStmt.cpp
@@ -259,8 +259,23 @@ namespace {
};
}
+/// CmpCaseVals - Comparison predicate for sorting case values.
+///
+static bool CmpCaseVals(const std::pair<llvm::APSInt, CaseStmt*>& lhs,
+ const std::pair<llvm::APSInt, CaseStmt*>& rhs) {
+ if (lhs.first < rhs.first)
+ return true;
+
+ if (lhs.first == rhs.first &&
+ lhs.second->getCaseLoc().getRawEncoding()
+ < rhs.second->getCaseLoc().getRawEncoding())
+ return true;
+ return false;
+}
+
Action::StmtResult
-Sema::ActOnFinishSwitchStmt(SourceLocation SwitchLoc, StmtTy *Switch, ExprTy *Body) {
+Sema::ActOnFinishSwitchStmt(SourceLocation SwitchLoc, StmtTy *Switch,
+ ExprTy *Body) {
Stmt *BodyStmt = (Stmt*)Body;
SwitchStmt *SS = SwitchStack.back();
@@ -335,7 +350,7 @@ Sema::ActOnFinishSwitchStmt(SourceLocation SwitchLoc, StmtTy *Switch, ExprTy *Bo
}
// Sort all the scalar case values so we can easily detect duplicates.
- std::stable_sort(CaseVals.begin(), CaseVals.end());
+ std::stable_sort(CaseVals.begin(), CaseVals.end(), CmpCaseVals);
if (!CaseVals.empty()) {
for (unsigned i = 0, e = CaseVals.size()-1; i != e; ++i) {
OpenPOWER on IntegriCloud