<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Aug 25, 2015 at 8:18 AM, Bataev, Alexey <span dir="ltr"><<a href="mailto:a.bataev@hotmail.com" target="_blank">a.bataev@hotmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I though about this. I think it will be more convenient for user to see the diagnostic on the first use of the variable rather than on '=' or '&' symbol.<br></blockquote><div><br>Why the difference between the diagnostic & the debug info, then?<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Best regards,<br>
Alexey Bataev<br>
=============<br>
Software Engineer<br>
Intel Compiler Team<br>
<br>
<a href="tel:25.08.2015%2018" value="+12508201518" target="_blank">25.08.2015 18</a>:07, David Blaikie пишет:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5">
<br>
<br>
On Tue, Aug 18, 2015 at 9:05 PM, Alexey Bataev via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a> <mailto:<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>>> wrote:<br>
<br>
    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<br>
    generated for captured variables points to location where they are<br>
    used first.  This patch makes debug info to point to capture<br>
    default location.<br>
<br>
<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>
<br>
<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<br>
    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(),<br>
    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,<br>
    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 %{{.+}},<br>
    %{{.+}}* %{{.+}}, i32 0, i32 0, !dbg ![[DBG_FOO:[0-9]+]]<br>
    +// CHECK: [[X_VAL:%.+]] = load i32, i32* [[X]], align 4, !dbg<br>
    ![[DBG_FOO]]<br>
    +// CHECK: store i32 [[X_VAL]], i32* [[X_REF]], align 4, !dbg<br>
    ![[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:<br>
    "{{.*}}debug-lambda-expressions.cpp",<br>
<br>
    @@ -100,3 +113,5 @@<br>
     // CHECK-SAME:                          line: [[VAR_LINE]],<br>
     // CHECK-SAME:                          elements:<br>
    ![[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></div></div>
    <a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a> <mailto:<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">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>
<br>
</blockquote>
<br>
</blockquote></div><br></div></div>