From: Benjamin Kramer Date: Fri, 7 Mar 2014 21:51:58 +0000 (+0000) Subject: [C++11] Revert uses of lambdas with array_pod_sort. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f1d5d4597f9ca2aead1cd3bad805f9def94f2e7d;p=clang [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 --- diff --git a/lib/Analysis/ReachableCode.cpp b/lib/Analysis/ReachableCode.cpp index 1e5aa1224b..47f8f2b90c 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 *p1, + const std::pair *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 88e3b2212a..20d7cd3a8c 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 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 id_macro_pair; SmallVector 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 fbb130bc17..51e7a3d3ce 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 ff0350aafc..d98acb197f 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];