[cfe-commits] r150549 - in /cfe/trunk: include/clang-c/Index.h include/clang/AST/RecursiveASTVisitor.h test/Index/cxx11-lambdas.cpp tools/libclang/CIndex.cpp tools/libclang/CXCursor.cpp tools/libclang/CXCursor.h tools/libclang/CXType.cpp tools/li

Chad Rosier mcrosier at apple.com
Tue Feb 14 18:15:05 PST 2012


Thanks, Richard!

On Feb 14, 2012, at 6:11 PM, Richard Smith wrote:

> Fixed in r150555.
> 
> On Tue, Feb 14, 2012 at 5:57 PM, Douglas Gregor <dgregor at apple.com> wrote:
> Sorry, I won't be back at a computer for a few more hours. Can you either apply the obvious fix or revert? 
> 
> Sent from my iPhone
> 
> On Feb 14, 2012, at 5:57 PM, Chad Rosier <mcrosier at apple.com> wrote:
> 
>> Hi Doug,
>> This commit is causing failures on our internal buildbots with the following error:
>> llvm[4]: Compiling IndexingContext.cpp for Release+Asserts build (PIC)
>> /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin10-gcc42-RA/llvm/tools/clang/tools/libclang/IndexBody.cpp:109:18: error: no member named 'indexFunctionLocalSymbols' in 'clang::cxindex::IndexingContext'; did you mean 'shouldIndexFunctionLocalSymbols'?
>>     if (IndexCtx.indexFunctionLocalSymbols())
>>                  ^~~~~~~~~~~~~~~~~~~~~~~~~
>>                  shouldIndexFunctionLocalSymbols
>> /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin10-gcc42-RA/llvm/tools/clang/tools/libclang/IndexingContext.h:329:8: note: 'shouldIndexFunctionLocalSymbols' declared here
>>   bool shouldIndexFunctionLocalSymbols() const {
>>        ^
>> 1 error generated.
>> make[4]: *** [/Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin10-gcc42-RA/clang-build/tools/clang/tools/libclang/Release+Asserts/IndexBody.o] Error 1
>> See also:
>> http://smooshlab.apple.com:8013/builders/clang-x86_64-darwin10-gcc42-RA/builds/11827
>> 
>> Chad
>> 
>> On Feb 14, 2012, at 4:54 PM, Douglas Gregor wrote:
>> 
>>> Author: dgregor
>>> Date: Tue Feb 14 18:54:55 2012
>>> New Revision: 150549
>>> 
>>> URL: http://llvm.org/viewvc/llvm-project?rev=150549&view=rev
>>> Log:
>>> Implement indexing support for lambdas in libclang (both kinds), as
>>> well as improving the RecursiveASTVisitor's walk of lambda
>>> expressions.
>>> 
>>> Added:
>>>    cfe/trunk/test/Index/cxx11-lambdas.cpp
>>> Modified:
>>>    cfe/trunk/include/clang-c/Index.h
>>>    cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
>>>    cfe/trunk/tools/libclang/CIndex.cpp
>>>    cfe/trunk/tools/libclang/CXCursor.cpp
>>>    cfe/trunk/tools/libclang/CXCursor.h
>>>    cfe/trunk/tools/libclang/CXType.cpp
>>>    cfe/trunk/tools/libclang/CursorVisitor.h
>>>    cfe/trunk/tools/libclang/IndexBody.cpp
>>>    cfe/trunk/tools/libclang/IndexingContext.cpp
>>> 
>>> Modified: cfe/trunk/include/clang-c/Index.h
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang-c/Index.h?rev=150549&r1=150548&r2=150549&view=diff
>>> ==============================================================================
>>> --- cfe/trunk/include/clang-c/Index.h (original)
>>> +++ cfe/trunk/include/clang-c/Index.h Tue Feb 14 18:54:55 2012
>>> @@ -1500,7 +1500,13 @@
>>>    */
>>>   CXCursor_OverloadedDeclRef             = 49,
>>> 
>>> -  CXCursor_LastRef                       = CXCursor_OverloadedDeclRef,
>>> +  /**
>>> +   * \brief A reference to a variable that occurs in some non-expression 
>>> +   * context, e.g., a C++ lambda capture list.
>>> +   */
>>> +  CXCursor_VariableRef                   = 50,
>>> +  
>>> +  CXCursor_LastRef                       = CXCursor_VariableRef,
>>> 
>>>   /* Error conditions */
>>>   CXCursor_FirstInvalid                  = 70,
>>> @@ -1746,7 +1752,21 @@
>>>    */
>>>   CXCursor_SizeOfPackExpr                = 143,
>>> 
>>> -  CXCursor_LastExpr                      = CXCursor_SizeOfPackExpr,
>>> +  /* \brief Represents a C++ lambda expression that produces a local function
>>> +   * object.
>>> +   *
>>> +   * \code
>>> +   * void abssort(float *x, unsigned N) {
>>> +   *   std::sort(x, x + N,
>>> +   *             [](float a, float b) {
>>> +   *               return std::abs(a) < std::abs(b);
>>> +   *             });
>>> +   * }
>>> +   * \endcode
>>> +   */
>>> +  CXCursor_LambdaExpr                    = 144,
>>> +  
>>> +  CXCursor_LastExpr                      = CXCursor_LambdaExpr,
>>> 
>>>   /* Statements */
>>>   CXCursor_FirstStmt                     = 200,
>>> 
>>> Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=150549&r1=150548&r2=150549&view=diff
>>> ==============================================================================
>>> --- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original)
>>> +++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Tue Feb 14 18:54:55 2012
>>> @@ -228,6 +228,11 @@
>>>   /// \returns false if the visitation was terminated early, true otherwise.
>>>   bool TraverseConstructorInitializer(CXXCtorInitializer *Init);
>>> 
>>> +  /// \brief Recursively visit a lambda capture.
>>> +  ///
>>> +  /// \returns false if the visitation was terminated early, true otherwise.
>>> +  bool TraverseLambdaCapture(LambdaExpr::Capture C);
>>> +  
>>>   // ---- Methods on Stmts ----
>>> 
>>>   // Declare Traverse*() for all concrete Stmt classes.
>>> @@ -675,6 +680,10 @@
>>>   return true;
>>> }
>>> 
>>> +template<typename Derived>
>>> +bool RecursiveASTVisitor<Derived>::TraverseLambdaCapture(LambdaExpr::Capture C){
>>> +  return true;
>>> +}
>>> 
>>> // ----------------- Type traversal -----------------
>>> 
>>> @@ -1953,9 +1962,36 @@
>>>     TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
>>>   })
>>> 
>>> -DEF_TRAVERSE_STMT(LambdaExpr, {
>>> -    TRY_TO(TraverseStmt(S->getBody()));
>>> -  })
>>> +// Walk only the visible parts of lambda expressions.  
>>> +template<typename Derived>
>>> +bool RecursiveASTVisitor<Derived>::TraverseLambdaExpr(LambdaExpr *S) {
>>> +  for (LambdaExpr::capture_iterator C = S->explicit_capture_begin(),
>>> +                                 CEnd = S->explicit_capture_end();
>>> +       C != CEnd; ++C) {
>>> +    TRY_TO(TraverseLambdaCapture(*C));
>>> +  }
>>> +
>>> +  if (S->hasExplicitParameters() || S->hasExplicitResultType()) {
>>> +    TypeLoc TL = S->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
>>> +    if (S->hasExplicitParameters() && S->hasExplicitResultType()) {
>>> +      // Visit the whole type.
>>> +      TRY_TO(TraverseTypeLoc(TL));
>>> +    } else if (isa<FunctionProtoTypeLoc>(TL)) {
>>> +      FunctionProtoTypeLoc Proto = cast<FunctionProtoTypeLoc>(TL);
>>> +      if (S->hasExplicitParameters()) {
>>> +        // Visit parameters.
>>> +        for (unsigned I = 0, N = Proto.getNumArgs(); I != N; ++I) {
>>> +          TRY_TO(TraverseDecl(Proto.getArg(I)));
>>> +        }
>>> +      } else {
>>> +        TRY_TO(TraverseTypeLoc(Proto.getResultLoc()));
>>> +      }        
>>> +    }
>>> +  }
>>> +
>>> +  TRY_TO(TraverseStmt(S->getBody()));
>>> +  return true;
>>> +}
>>> 
>>> DEF_TRAVERSE_STMT(CXXUnresolvedConstructExpr, {
>>>     // This is called for code like 'T()', where T is a template argument.
>>> 
>>> Added: cfe/trunk/test/Index/cxx11-lambdas.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/cxx11-lambdas.cpp?rev=150549&view=auto
>>> ==============================================================================
>>> --- cfe/trunk/test/Index/cxx11-lambdas.cpp (added)
>>> +++ cfe/trunk/test/Index/cxx11-lambdas.cpp Tue Feb 14 18:54:55 2012
>>> @@ -0,0 +1,33 @@
>>> +// Test is line- and column-sensitive; see below.
>>> +
>>> +typedef int Integer;
>>> +struct X {
>>> +  void f() {
>>> +    int localA, localB;
>>> +    auto lambda = [&localA, localB] (Integer x) -> Integer {
>>> +      return localA + localB + x;
>>> +    };
>>> +  }
>>> +};
>>> +
>>> +// RUN: c-index-test -test-load-source all -std=c++11 %s | FileCheck -check-prefix=CHECK-LOAD %s
>>> +// CHECK-LOAD: cxx11-lambdas.cpp:7:19: LambdaExpr= Extent=[7:19 - 9:6]
>>> +// CHECK-LOAD: cxx11-lambdas.cpp:7:21: VariableRef=localA:6:9 Extent=[7:21 - 7:27]
>>> +// CHECK-LOAD: cxx11-lambdas.cpp:7:29: VariableRef=localB:6:17 Extent=[7:29 - 7:35]
>>> +// CHECK-LOAD: cxx11-lambdas.cpp:7:52: TypeRef=Integer:3:13 Extent=[7:52 - 7:59]
>>> +// CHECK-LOAD: cxx11-lambdas.cpp:7:46: ParmDecl=x:7:46 (Definition) Extent=[7:38 - 7:47]
>>> +// CHECK-LOAD: cxx11-lambdas.cpp:7:38: TypeRef=Integer:3:13 Extent=[7:38 - 7:45]
>>> +// CHECK-LOAD: cxx11-lambdas.cpp:7:60: CompoundStmt= Extent=[7:60 - 9:6]
>>> +// CHECK-LOAD: cxx11-lambdas.cpp:8:7: ReturnStmt= Extent=[8:7 - 8:33]
>>> +// CHECK-LOAD: cxx11-lambdas.cpp:8:14: DeclRefExpr=localA:6:9 Extent=[8:14 - 8:20]
>>> +// CHECK-LOAD: cxx11-lambdas.cpp:8:23: DeclRefExpr=localB:6:17 Extent=[8:23 - 8:29]
>>> +// CHECK-LOAD: cxx11-lambdas.cpp:8:32: DeclRefExpr=x:7:46 Extent=[8:32 - 8:33]
>>> +
>>> +// RUN: env CINDEXTEST_INDEXLOCALSYMBOLS=1 c-index-test -index-file -std=c++11 %s | FileCheck -check-prefix=CHECK-INDEX %s
>>> +// CHECK-INDEX: [indexEntityReference]: kind: variable | name: localA | USR: c:cxx11-lambdas.cpp at 100@S at X@F at f#@localA | lang: C | cursor: VariableRef=localA:6:9 | loc: 7:21
>>> +// CHECK-INDEX: [indexEntityReference]: kind: variable | name: localB | USR: c:cxx11-lambdas.cpp at 100@S at X@F at f#@localB | lang: C | cursor: VariableRef=localB:6:17 | loc: 7:29
>>> +// CHECK-INDEX: [indexEntityReference]: kind: typedef | name: Integer | USR: c:cxx11-lambdas.cpp at 51@T at Integer | lang: C | cursor: TypeRef=Integer:3:13 | loc: 7:52
>>> +// CHECK-INDEX: [indexEntityReference]: kind: typedef | name: Integer | USR: c:cxx11-lambdas.cpp at 51@T at Integer | lang: C | cursor: TypeRef=Integer:3:13 | loc: 7:38
>>> +// CHECK-INDEX: [indexEntityReference]: kind: variable | name: localA | USR: c:cxx11-lambdas.cpp at 100@S at X@F at f#@localA | lang: C | cursor: DeclRefExpr=localA:6:9 | loc: 8:14
>>> +// CHECK-INDEX: [indexEntityReference]: kind: variable | name: localB | USR: c:cxx11-lambdas.cpp at 100@S at X@F at f#@localB | lang: C | cursor: DeclRefExpr=localB:6:17 | loc: 8:23
>>> +// CHECK-INDEX: [indexEntityReference]: kind: variable | name: x | USR: c:cxx11-lambdas.cpp at 157@S at X@F at f#@Ca at F@operator()#I#1 at x | lang: C | cursor: DeclRefExpr=x:7:46 | loc: 8:32
>>> 
>>> Modified: cfe/trunk/tools/libclang/CIndex.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=150549&r1=150548&r2=150549&view=diff
>>> ==============================================================================
>>> --- cfe/trunk/tools/libclang/CIndex.cpp (original)
>>> +++ cfe/trunk/tools/libclang/CIndex.cpp Tue Feb 14 18:54:55 2012
>>> @@ -1615,6 +1615,7 @@
>>> DEF_JOB(ExplicitTemplateArgsVisit, ASTTemplateArgumentListInfo, 
>>>         ExplicitTemplateArgsVisitKind)
>>> DEF_JOB(SizeOfPackExprParts, SizeOfPackExpr, SizeOfPackExprPartsKind)
>>> +DEF_JOB(LambdaExprParts, LambdaExpr, LambdaExprPartsKind)
>>> #undef DEF_JOB
>>> 
>>> class DeclVisit : public VisitorJob {
>>> @@ -1761,6 +1762,7 @@
>>>   void VisitSizeOfPackExpr(SizeOfPackExpr *E);
>>>   void VisitPseudoObjectExpr(PseudoObjectExpr *E);
>>>   void VisitOpaqueValueExpr(OpaqueValueExpr *E);
>>> +  void VisitLambdaExpr(LambdaExpr *E);
>>> 
>>> private:
>>>   void AddDeclarationNameInfo(Stmt *S);
>>> @@ -2081,6 +2083,10 @@
>>>   if (Expr *SourceExpr = E->getSourceExpr())
>>>     return Visit(SourceExpr);
>>> }
>>> +void EnqueueVisitor::VisitLambdaExpr(LambdaExpr *E) {
>>> +  AddStmt(E->getBody());
>>> +  WL.push_back(LambdaExprParts(E, Parent));
>>> +}
>>> void EnqueueVisitor::VisitPseudoObjectExpr(PseudoObjectExpr *E) {
>>>   // Treat the expression like its syn
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
> 
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20120214/1b64038f/attachment.html>


More information about the cfe-commits mailing list