r203293 - [C++11] Revert uses of lambdas with array_pod_sort.

Benjamin Kramer benny.kra at gmail.com
Fri Mar 7 14:16:58 PST 2014


On 07.03.2014, at 23:04, Jordan Rose <jordan_rose at apple.com> wrote:

> That's...unfortunate. What are the details here?

Seems to be a bug in GCC 4.7

#include <vector>
#include <cstdlib>

template <class IteratorTy>
inline void array_pod_sort(
    IteratorTy Start, IteratorTy End,
    int (*Compare)(
        const typename std::iterator_traits<IteratorTy>::value_type *,
        const typename std::iterator_traits<IteratorTy>::value_type *)) {
}

void foo(std::vector<int> &V) {
  array_pod_sort(V.begin(), V.end(),
                 [](const int *a, const int *b) { return 0; });
}

GCC 4.7 errors, 4.8 (and Clang) have no issue with it. The +[] trick to get a function pointer seems to work though.

- Ben

> 
> 
> On Mar 7, 2014, at 13:51, Benjamin Kramer <benny.kra at googlemail.com> wrote:
> 
>> Author: d0k
>> Date: Fri Mar  7 15:51:58 2014
>> New Revision: 203293
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=203293&view=rev
>> Log:
>> [C++11] Revert uses of lambdas with array_pod_sort.
>> 
>> Looks like GCC implements the lambda->function pointer conversion differently.
>> 
>> Modified:
>>   cfe/trunk/lib/Analysis/ReachableCode.cpp
>>   cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp
>>   cfe/trunk/lib/StaticAnalyzer/Checkers/DebugCheckers.cpp
>>   cfe/trunk/tools/libclang/CIndex.cpp
>> 
>> Modified: cfe/trunk/lib/Analysis/ReachableCode.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/ReachableCode.cpp?rev=203293&r1=203292&r2=203293&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Analysis/ReachableCode.cpp (original)
>> +++ cfe/trunk/lib/Analysis/ReachableCode.cpp Fri Mar  7 15:51:58 2014
>> @@ -400,6 +400,15 @@ const Stmt *DeadCodeScan::findDeadCode(c
>>  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(con
>>  // 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;
>> 
>> Modified: cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp?rev=203293&r1=203292&r2=203293&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp (original)
>> +++ cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp Fri Mar  7 15:51:58 2014
>> @@ -678,6 +678,11 @@ static void PrintPreprocessedTokens(Prep
>>  }
>> }
>> 
>> +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 &
>>  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;
>> 
>> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/DebugCheckers.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/DebugCheckers.cpp?rev=203293&r1=203292&r2=203293&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/StaticAnalyzer/Checkers/DebugCheckers.cpp (original)
>> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/DebugCheckers.cpp Fri Mar  7 15:51:58 2014
>> @@ -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)
>> 
>> Modified: cfe/trunk/tools/libclang/CIndex.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=203293&r1=203292&r2=203293&view=diff
>> ==============================================================================
>> --- cfe/trunk/tools/libclang/CIndex.cpp (original)
>> +++ cfe/trunk/tools/libclang/CIndex.cpp Fri Mar  7 15:51:58 2014
>> @@ -762,6 +762,12 @@ bool CursorVisitor::VisitDeclaratorDecl(
>>  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(Fu
>>      }
>> 
>>      // 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];
>> 
>> 
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
> 





More information about the cfe-commits mailing list