<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Aug 18, 2015 at 9:05 PM, Alexey Bataev via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">ABataev created this revision.<br>
ABataev added reviewers: echristo, rjmccall, rsmith.<br>
ABataev added a subscriber: cfe-commits.<br>
<br>
When variables are implicitly captured in lambdas, debug info generated for captured variables points to location where they are used first.  This patch makes debug info to point to capture default location.<br></blockquote><div><br>Not sure if this is the right tradeoff, or if it is, perhaps we should reconsider how our diagnostics work too?<br><br>Currently if you, say, capture a variable by value and that variable doesn't have an accessible copy ctor, the diagnostic points to the first use. Should we change that too?<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
<a href="http://reviews.llvm.org/D12134" rel="noreferrer" target="_blank">http://reviews.llvm.org/D12134</a><br>
<br>
Files:<br>
  lib/Sema/SemaLambda.cpp<br>
  test/CodeGenCXX/debug-lambda-expressions.cpp<br>
<br>
Index: lib/Sema/SemaLambda.cpp<br>
===================================================================<br>
--- lib/Sema/SemaLambda.cpp<br>
+++ lib/Sema/SemaLambda.cpp<br>
@@ -1377,10 +1377,10 @@<br>
 }<br>
<br>
 static ExprResult performLambdaVarCaptureInitialization(<br>
-    Sema &S, LambdaScopeInfo::Capture &Capture,<br>
-    FieldDecl *Field,<br>
+    Sema &S, LambdaScopeInfo::Capture &Capture, FieldDecl *Field,<br>
     SmallVectorImpl<VarDecl *> &ArrayIndexVars,<br>
-    SmallVectorImpl<unsigned> &ArrayIndexStarts) {<br>
+    SmallVectorImpl<unsigned> &ArrayIndexStarts, bool ImplicitCapture,<br>
+    SourceLocation CaptureDefaultLoc) {<br>
   assert(Capture.isVariableCapture() && "not a variable capture");<br>
<br>
   auto *Var = Capture.getVariable();<br>
@@ -1399,7 +1399,10 @@<br>
   //   An entity captured by a lambda-expression is odr-used (3.2) in<br>
   //   the scope containing the lambda-expression.<br>
   ExprResult RefResult = S.BuildDeclarationNameExpr(<br>
-      CXXScopeSpec(), DeclarationNameInfo(Var->getDeclName(), Loc), Var);<br>
+      CXXScopeSpec(),<br>
+      DeclarationNameInfo(Var->getDeclName(),<br>
+                          ImplicitCapture ? CaptureDefaultLoc : Loc),<br>
+      Var);<br>
   if (RefResult.isInvalid())<br>
     return ExprError();<br>
   Expr *Ref = RefResult.get();<br>
@@ -1561,7 +1564,8 @@<br>
       Expr *Init = From.getInitExpr();<br>
       if (!Init) {<br>
         auto InitResult = performLambdaVarCaptureInitialization(<br>
-            *this, From, *CurField, ArrayIndexVars, ArrayIndexStarts);<br>
+            *this, From, *CurField, ArrayIndexVars, ArrayIndexStarts,<br>
+            CaptureDefault != LCD_None, CaptureDefaultLoc);<br>
         if (InitResult.isInvalid())<br>
           return ExprError();<br>
         Init = InitResult.get();<br>
Index: test/CodeGenCXX/debug-lambda-expressions.cpp<br>
===================================================================<br>
--- test/CodeGenCXX/debug-lambda-expressions.cpp<br>
+++ test/CodeGenCXX/debug-lambda-expressions.cpp<br>
@@ -14,6 +14,19 @@<br>
 struct D { D(); D(const D&); int x; };<br>
 int d(int x) { D y[10]; return [x,y] { return y[x].x; }(); }<br>
<br>
+// CHECK-LABEL: foo<br>
+int foo(int x) {<br>
+// CHECK: [[X:%.+]] = alloca i32,<br>
+// CHECK: call void @llvm.dbg.declare(<br>
+// CHECK: [[X_REF:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}}* %{{.+}}, i32 0, i32 0, !dbg ![[DBG_FOO:[0-9]+]]<br>
+// CHECK: [[X_VAL:%.+]] = load i32, i32* [[X]], align 4, !dbg ![[DBG_FOO]]<br>
+// CHECK: store i32 [[X_VAL]], i32* [[X_REF]], align 4, !dbg ![[DBG_FOO]]<br>
+// CHECK: call i32 @{{.+}}, !dbg ![[DBG_FOO]]<br>
+  return [=] {<br>
+    return x;<br>
+  }();<br>
+}<br>
+<br>
 // Randomness for file. -- 6<br>
 // CHECK: [[FILE:.*]] = !DIFile(filename: "{{.*}}debug-lambda-expressions.cpp",<br>
<br>
@@ -100,3 +113,5 @@<br>
 // CHECK-SAME:                          line: [[VAR_LINE]],<br>
 // CHECK-SAME:                          elements: ![[VAR_ARGS:[0-9]+]]<br>
 // CHECK: ![[VAR_ARGS]] = !{!{{[0-9]+}}}<br>
+<br>
+// CHECK: [[DBG_FOO:![0-9]+]] = !DILocation(line: 25,<br>
<br>
<br>
<br>_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
<br></blockquote></div><br></div></div>