On Tue, Aug 18, 2015 at 9:05 PM, Alexey Bataev via cfe-commits < 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 > 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