From f1d5d4597f9ca2aead1cd3bad805f9def94f2e7d Mon Sep 17 00:00:00 2001
From: Benjamin Kramer <benny.kra@googlemail.com>
Date: Fri, 7 Mar 2014 21:51:58 +0000
Subject: [PATCH] [C++11] Revert uses of lambdas with array_pod_sort.

Looks like GCC implements the lambda->function pointer conversion differently.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203293 91177308-0d34-0410-b5e6-96231b3b80d8
---
 lib/Analysis/ReachableCode.cpp                | 17 ++++++++++-------
 lib/Frontend/PrintPreprocessedOutput.cpp      | 11 ++++++-----
 lib/StaticAnalyzer/Checkers/DebugCheckers.cpp | 11 ++++++-----
 tools/libclang/CIndex.cpp                     | 15 +++++++++------
 4 files changed, 31 insertions(+), 23 deletions(-)

diff --git a/lib/Analysis/ReachableCode.cpp b/lib/Analysis/ReachableCode.cpp
index 1e5aa1224ba..47f8f2b90cd 100644
--- a/lib/Analysis/ReachableCode.cpp
+++ b/lib/Analysis/ReachableCode.cpp
@@ -400,6 +400,15 @@ const Stmt *DeadCodeScan::findDeadCode(const clang::CFGBlock *Block) {
   return 0;
 }
 
+static int SrcCmp(const std::pair<const CFGBlock *, const Stmt *> *p1,
+                  const std::pair<const CFGBlock *, const Stmt *> *p2) {
+  if (p1->second->getLocStart() < p2->second->getLocStart())
+    return -1;
+  if (p2->second->getLocStart() < p1->second->getLocStart())
+    return 1;
+  return 0;
+}
+
 unsigned DeadCodeScan::scanBackwards(const clang::CFGBlock *Start,
                                      clang::reachable_code::Callback &CB) {
 
@@ -448,13 +457,7 @@ unsigned DeadCodeScan::scanBackwards(const clang::CFGBlock *Start,
   // If we didn't find a dead root, then report the dead code with the
   // earliest location.
   if (!DeferredLocs.empty()) {
-    llvm::array_pod_sort(DeferredLocs.begin(), DeferredLocs.end(),
-                         [](const DeferredLocsTy::value_type *p1,
-                            const DeferredLocsTy::value_type *p2) {
-      if (p1->second->getLocStart() != p2->second->getLocStart())
-        return p1->second->getLocStart() < p2->second->getLocStart() ? -1 : 1;
-      return 0;
-    });
+    llvm::array_pod_sort(DeferredLocs.begin(), DeferredLocs.end(), SrcCmp);
     for (DeferredLocsTy::iterator I = DeferredLocs.begin(),
          E = DeferredLocs.end(); I != E; ++I) {
       const CFGBlock *Block = I->first;
diff --git a/lib/Frontend/PrintPreprocessedOutput.cpp b/lib/Frontend/PrintPreprocessedOutput.cpp
index 88e3b2212ab..20d7cd3a8c0 100644
--- a/lib/Frontend/PrintPreprocessedOutput.cpp
+++ b/lib/Frontend/PrintPreprocessedOutput.cpp
@@ -678,6 +678,11 @@ static void PrintPreprocessedTokens(Preprocessor &PP, Token &Tok,
   }
 }
 
+typedef std::pair<const IdentifierInfo *, MacroInfo *> id_macro_pair;
+static int MacroIDCompare(const id_macro_pair *LHS, const id_macro_pair *RHS) {
+  return LHS->first->getName().compare(RHS->first->getName());
+}
+
 static void DoPrintMacros(Preprocessor &PP, raw_ostream *OS) {
   // Ignore unknown pragmas.
   PP.AddPragmaHandler(new EmptyPragmaHandler());
@@ -690,17 +695,13 @@ static void DoPrintMacros(Preprocessor &PP, raw_ostream *OS) {
   do PP.Lex(Tok);
   while (Tok.isNot(tok::eof));
 
-  typedef std::pair<const IdentifierInfo *, MacroInfo *> id_macro_pair;
   SmallVector<id_macro_pair, 128> MacrosByID;
   for (Preprocessor::macro_iterator I = PP.macro_begin(), E = PP.macro_end();
        I != E; ++I) {
     if (I->first->hasMacroDefinition())
       MacrosByID.push_back(id_macro_pair(I->first, I->second->getMacroInfo()));
   }
-  llvm::array_pod_sort(MacrosByID.begin(), MacrosByID.end(),
-                       [](const id_macro_pair *LHS, const id_macro_pair *RHS) {
-    return LHS->first->getName().compare(RHS->first->getName());
-  });
+  llvm::array_pod_sort(MacrosByID.begin(), MacrosByID.end(), MacroIDCompare);
 
   for (unsigned i = 0, e = MacrosByID.size(); i != e; ++i) {
     MacroInfo &MI = *MacrosByID[i].second;
diff --git a/lib/StaticAnalyzer/Checkers/DebugCheckers.cpp b/lib/StaticAnalyzer/Checkers/DebugCheckers.cpp
index fbb130bc176..51e7a3d3ce3 100644
--- a/lib/StaticAnalyzer/Checkers/DebugCheckers.cpp
+++ b/lib/StaticAnalyzer/Checkers/DebugCheckers.cpp
@@ -161,6 +161,11 @@ namespace {
 class ConfigDumper : public Checker< check::EndOfTranslationUnit > {
   typedef AnalyzerOptions::ConfigTable Table;
 
+  static int compareEntry(const Table::MapEntryTy *const *LHS,
+                          const Table::MapEntryTy *const *RHS) {
+    return (*LHS)->getKey().compare((*RHS)->getKey());
+  }
+
 public:
   void checkEndOfTranslationUnit(const TranslationUnitDecl *TU,
                                  AnalysisManager& mgr,
@@ -171,11 +176,7 @@ public:
     for (Table::const_iterator I = Config.begin(), E = Config.end(); I != E;
          ++I)
       Keys.push_back(&*I);
-    llvm::array_pod_sort(Keys.begin(), Keys.end(),
-                         [](const Table::MapEntryTy *const *LHS,
-                            const Table::MapEntryTy *const *RHS) {
-      return (*LHS)->getKey().compare((*RHS)->getKey());
-    });
+    llvm::array_pod_sort(Keys.begin(), Keys.end(), compareEntry);
 
     llvm::errs() << "[config]\n";
     for (unsigned I = 0, E = Keys.size(); I != E; ++I)
diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp
index ff0350aafc7..d98acb197fa 100644
--- a/tools/libclang/CIndex.cpp
+++ b/tools/libclang/CIndex.cpp
@@ -762,6 +762,12 @@ bool CursorVisitor::VisitDeclaratorDecl(DeclaratorDecl *DD) {
   return false;
 }
 
+/// \brief Compare two base or member initializers based on their source order.
+static int CompareCXXCtorInitializers(CXXCtorInitializer *const *X,
+                                      CXXCtorInitializer *const *Y) {
+  return (*X)->getSourceOrder() - (*Y)->getSourceOrder();
+}
+
 bool CursorVisitor::VisitFunctionDecl(FunctionDecl *ND) {
   unsigned NumParamList = ND->getNumTemplateParameterLists();
   for (unsigned i = 0; i < NumParamList; i++) {
@@ -816,12 +822,9 @@ bool CursorVisitor::VisitFunctionDecl(FunctionDecl *ND) {
       }
       
       // Sort the initializers in source order
-      llvm::array_pod_sort(
-          WrittenInits.begin(), WrittenInits.end(),
-          [](CXXCtorInitializer *const *X, CXXCtorInitializer *const *Y) {
-            return (*X)->getSourceOrder() - (*Y)->getSourceOrder();
-          });
-
+      llvm::array_pod_sort(WrittenInits.begin(), WrittenInits.end(),
+                           &CompareCXXCtorInitializers);
+      
       // Visit the initializers in source order
       for (unsigned I = 0, N = WrittenInits.size(); I != N; ++I) {
         CXXCtorInitializer *Init = WrittenInits[I];
-- 
GitLab