r361234 - [libclang] visit c++14 lambda capture init expressions

Nikolai Kosjar via cfe-commits cfe-commits at lists.llvm.org
Tue May 21 02:21:35 PDT 2019


Author: nik
Date: Tue May 21 02:21:35 2019
New Revision: 361234

URL: http://llvm.org/viewvc/llvm-project?rev=361234&view=rev
Log:
[libclang] visit c++14 lambda capture init expressions

Patch by Milian Wolff.

Differential Revision: https://reviews.llvm.org/D60672

Added:
    cfe/trunk/test/Index/cxx14-lambdas.cpp
Modified:
    cfe/trunk/tools/libclang/CIndex.cpp

Added: cfe/trunk/test/Index/cxx14-lambdas.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/cxx14-lambdas.cpp?rev=361234&view=auto
==============================================================================
--- cfe/trunk/test/Index/cxx14-lambdas.cpp (added)
+++ cfe/trunk/test/Index/cxx14-lambdas.cpp Tue May 21 02:21:35 2019
@@ -0,0 +1,38 @@
+// Test is line- and column-sensitive; see below.
+
+typedef int Integer;
+struct X {
+  void f() {
+    int localA, localB;
+    auto lambda = [ptr = &localA, copy = localB] (Integer x) -> Integer {
+      return *ptr + copy + x;
+    };
+  }
+};
+
+// RUN: c-index-test -test-load-source all -std=c++14 %s | FileCheck -check-prefix=CHECK-LOAD %s
+// CHECK-LOAD: cxx14-lambdas.cpp:7:5: DeclStmt= Extent=[7:5 - 9:7]
+// CHECK-LOAD: cxx14-lambdas.cpp:7:10: VarDecl=lambda:7:10 (Definition) Extent=[7:5 - 9:6]
+// CHECK-LOAD: cxx14-lambdas.cpp:7:19: UnexposedExpr= Extent=[7:19 - 9:6]
+// CHECK-LOAD: cxx14-lambdas.cpp:7:19: CallExpr= Extent=[7:19 - 9:6]
+// CHECK-LOAD: cxx14-lambdas.cpp:7:19: UnexposedExpr= Extent=[7:19 - 9:6]
+// CHECK-LOAD: cxx14-lambdas.cpp:7:19: LambdaExpr= Extent=[7:19 - 9:6]
+// CHECK-LOAD: cxx14-lambdas.cpp:7:20: VariableRef=ptr:7:20 Extent=[7:20 - 7:23]
+// CHECK-LOAD: cxx14-lambdas.cpp:7:35: VariableRef=copy:7:35 Extent=[7:35 - 7:39]
+// CHECK-LOAD: cxx14-lambdas.cpp:7:27: DeclRefExpr=localA:6:9 Extent=[7:27 - 7:33]
+// CHECK-LOAD: cxx14-lambdas.cpp:7:42: DeclRefExpr=localB:6:17 Extent=[7:42 - 7:48]
+// CHECK-LOAD: cxx14-lambdas.cpp:7:59: ParmDecl=x:7:59 (Definition) Extent=[7:51 - 7:60]
+// CHECK-LOAD: cxx14-lambdas.cpp:7:51: TypeRef=Integer:3:13 Extent=[7:51 - 7:58]
+// CHECK-LOAD: cxx14-lambdas.cpp:7:65: TypeRef=Integer:3:13 Extent=[7:65 - 7:72]
+// CHECK-LOAD: cxx14-lambdas.cpp:7:73: CompoundStmt= Extent=[7:73 - 9:6]
+// CHECK-LOAD: cxx14-lambdas.cpp:8:7: ReturnStmt= Extent=[8:7 - 8:29]
+
+// RUN: env CINDEXTEST_INDEXLOCALSYMBOLS=1 c-index-test -index-file -std=c++14 %s | FileCheck -check-prefix=CHECK-INDEX %s
+// CHECK-INDEX: [indexEntityReference]: kind: variable | name: ptr | USR: c:cxx14-lambdas.cpp at 139@S at X@F at f#@Sa at F@operator()#I#1 at ptr | lang: C | cursor: VariableRef=ptr:7:20 | loc: 7:20
+// CHECK-INDEX: [indexEntityReference]: kind: variable | name: copy | USR: c:cxx14-lambdas.cpp at 154@S at X@F at f#@Sa at F@operator()#I#1 at copy | lang: C | cursor: VariableRef=copy:7:35 | loc: 7:35
+// CHECK-INDEX: [indexDeclaration]: kind: variable | name: x | USR: c:cxx14-lambdas.cpp at 170@S at X@F at f#@Sa at F@operator()#I#1 at x | lang: C | cursor: ParmDecl=x:7:59 (Definition) | loc: 7:59
+// CHECK-INDEX: [indexEntityReference]: kind: typedef | name: Integer | USR: c:cxx14-lambdas.cpp at T@Integer | lang: C | cursor: TypeRef=Integer:3:13 | loc: 7:51
+// CHECK-INDEX: [indexEntityReference]: kind: typedef | name: Integer | USR: c:cxx14-lambdas.cpp at T@Integer | lang: C | cursor: TypeRef=Integer:3:13 | loc: 7:65
+// CHECK-INDEX: [indexEntityReference]: kind: variable | name: ptr | USR: c:cxx14-lambdas.cpp at 139@S at X@F at f#@Sa at F@operator()#I#1 at ptr | lang: C | cursor: DeclRefExpr=ptr:7:20 | loc: 8:15
+// CHECK-INDEX: [indexEntityReference]: kind: variable | name: copy | USR: c:cxx14-lambdas.cpp at 154@S at X@F at f#@Sa at F@operator()#I#1 at copy | lang: C | cursor: DeclRefExpr=copy:7:35 | loc: 8:21
+// CHECK-INDEX: [indexEntityReference]: kind: variable | name: x | USR: c:cxx14-lambdas.cpp at 170@S at X@F at f#@Sa at F@operator()#I#1 at x | lang: C | cursor: DeclRefExpr=x:7:59 | loc: 8:28

Modified: cfe/trunk/tools/libclang/CIndex.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=361234&r1=361233&r2=361234&view=diff
==============================================================================
--- cfe/trunk/tools/libclang/CIndex.cpp (original)
+++ cfe/trunk/tools/libclang/CIndex.cpp Tue May 21 02:21:35 2019
@@ -3134,12 +3134,11 @@ bool CursorVisitor::RunVisitorWorkList(V
       }
         
       case VisitorJob::LambdaExprPartsKind: {
-        // Visit captures.
+        // Visit non-init captures.
         const LambdaExpr *E = cast<LambdaExprParts>(&LI)->get();
         for (LambdaExpr::capture_iterator C = E->explicit_capture_begin(),
                                        CEnd = E->explicit_capture_end();
              C != CEnd; ++C) {
-          // FIXME: Lambda init-captures.
           if (!C->capturesVariable())
             continue;
 
@@ -3148,6 +3147,11 @@ bool CursorVisitor::RunVisitorWorkList(V
                                           TU)))
             return true;
         }
+        // Visit init captures
+        for (auto InitExpr : E->capture_inits()) {
+          if (Visit(InitExpr))
+            return true;
+        }
         
         TypeLoc TL = E->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
         // Visit parameters and return type, if present.




More information about the cfe-commits mailing list