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.

Best regards,
Alexey Bataev
=============
Software Engineer
Intel Compiler Team

25.08.2015 18:07, David Blaikie пишет:


On Tue, Aug 18, 2015 at 9:05 PM, Alexey Bataev via cfe-commits <cfe-commits@lists.llvm.org <mailto:cfe-commits@lists.llvm.org>> wrote:

    ABataev created this revision.
    ABataev added reviewers: echristo, rjmccall, rsmith.
    ABataev added a subscriber: cfe-commits.

    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.


Not sure if this is the right tradeoff, or if it is, perhaps we should reconsider how our diagnostics work too?

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?


    http://reviews.llvm.org/D12134

    Files:
      lib/Sema/SemaLambda.cpp
      test/CodeGenCXX/debug-lambda-expressions.cpp

    Index: lib/Sema/SemaLambda.cpp
    ===================================================================
    --- lib/Sema/SemaLambda.cpp
    +++ lib/Sema/SemaLambda.cpp
    @@ -1377,10 +1377,10 @@
     }

     static ExprResult performLambdaVarCaptureInitialization(
    -    Sema &S, LambdaScopeInfo::Capture &Capture,
    -    FieldDecl *Field,
    +    Sema &S, LambdaScopeInfo::Capture &Capture, FieldDecl *Field,
         SmallVectorImpl<VarDecl *> &ArrayIndexVars,
    -    SmallVectorImpl<unsigned> &ArrayIndexStarts) {
    +    SmallVectorImpl<unsigned> &ArrayIndexStarts, bool
    ImplicitCapture,
    +    SourceLocation CaptureDefaultLoc) {
       assert(Capture.isVariableCapture() && "not a variable capture");

       auto *Var = Capture.getVariable();
    @@ -1399,7 +1399,10 @@
       //   An entity captured by a lambda-expression is odr-used (3.2) in
       //   the scope containing the lambda-expression.
       ExprResult RefResult = S.BuildDeclarationNameExpr(
    -      CXXScopeSpec(), DeclarationNameInfo(Var->getDeclName(),
    Loc), Var);
    +      CXXScopeSpec(),
    +      DeclarationNameInfo(Var->getDeclName(),
    +                          ImplicitCapture ? CaptureDefaultLoc : Loc),
    +      Var);
       if (RefResult.isInvalid())
         return ExprError();
       Expr *Ref = RefResult.get();
    @@ -1561,7 +1564,8 @@
           Expr *Init = From.getInitExpr();
           if (!Init) {
             auto InitResult = performLambdaVarCaptureInitialization(
    -            *this, From, *CurField, ArrayIndexVars,
    ArrayIndexStarts);
    +            *this, From, *CurField, ArrayIndexVars, ArrayIndexStarts,
    +            CaptureDefault != LCD_None, CaptureDefaultLoc);
             if (InitResult.isInvalid())
               return ExprError();
             Init = InitResult.get();
    Index: test/CodeGenCXX/debug-lambda-expressions.cpp
    ===================================================================
    --- test/CodeGenCXX/debug-lambda-expressions.cpp
    +++ test/CodeGenCXX/debug-lambda-expressions.cpp
    @@ -14,6 +14,19 @@
     struct D { D(); D(const D&); int x; };
     int d(int x) { D y[10]; return [x,y] { return y[x].x; }(); }

    +// CHECK-LABEL: foo
    +int foo(int x) {
    +// CHECK: [[X:%.+]] = alloca i32,
    +// CHECK: call void @llvm.dbg.declare(
    +// CHECK: [[X_REF:%.+]] = getelementptr inbounds %{{.+}},
    %{{.+}}* %{{.+}}, i32 0, i32 0, !dbg ![[DBG_FOO:[0-9]+]]
    +// CHECK: [[X_VAL:%.+]] = load i32, i32* [[X]], align 4, !dbg
    ![[DBG_FOO]]
    +// CHECK: store i32 [[X_VAL]], i32* [[X_REF]], align 4, !dbg
    ![[DBG_FOO]]
    +// CHECK: call i32 @{{.+}}, !dbg ![[DBG_FOO]]
    +  return [=] {
    +    return x;
    +  }();
    +}
    +
     // Randomness for file. -- 6
     // CHECK: [[FILE:.*]] = !DIFile(filename:
    "{{.*}}debug-lambda-expressions.cpp",

    @@ -100,3 +113,5 @@
     // CHECK-SAME:                          line: [[VAR_LINE]],
     // CHECK-SAME:                          elements:
    ![[VAR_ARGS:[0-9]+]]
     // CHECK: ![[VAR_ARGS]] = !{!{{[0-9]+}}}
    +
    +// CHECK: [[DBG_FOO:![0-9]+]] = !DILocation(line: 25,



    _______________________________________________
    cfe-commits mailing list
    cfe-commits@lists.llvm.org <mailto:cfe-commits@lists.llvm.org>
    http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to