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