Yeah. I can't see a difference here being useful, and more likely harmful.
On Tue, Aug 25, 2015, 8:48 AM David Blaikie <dblai...@gmail.com
<mailto:dblai...@gmail.com>> wrote:
On Tue, Aug 25, 2015 at 8:44 AM, Bataev, Alexey
<a.bat...@hotmail.com <mailto:a.bat...@hotmail.com>> wrote:
Debug info points to the real place where it is captured,
while diagnostics points to the first use of implicitly
captured variable.
Right, but I'm trying to understand the justification for why
that's the right thing to do. Why the debug info user would want a
different experience than the compiler diagnostic consumer would want.
- David
Best regards,
Alexey Bataev
=============
Software Engineer
Intel Compiler Team
25.08.2015 18 <tel:25.08.2015%2018>:22, David Blaikie пишет:
On Tue, Aug 25, 2015 at 8:18 AM, Bataev, Alexey
<a.bat...@hotmail.com <mailto:a.bat...@hotmail.com>
<mailto:a.bat...@hotmail.com
<mailto:a.bat...@hotmail.com>>> wrote:
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.
Why the difference between the diagnostic & the debug
info, then?
Best regards,
Alexey Bataev
=============
Software Engineer
Intel Compiler Team
25.08.2015 18 <tel:25.08.2015%2018>
<tel:25.08.2015%2018>: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>
<mailto:cfe-commits@lists.llvm.org
<mailto:cfe-commits@lists.llvm.org>>
<mailto:cfe-commits@lists.llvm.org
<mailto:cfe-commits@lists.llvm.org>
<mailto: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>
<mailto:cfe-commits@lists.llvm.org
<mailto:cfe-commits@lists.llvm.org>>
<mailto:cfe-commits@lists.llvm.org
<mailto:cfe-commits@lists.llvm.org>
<mailto:cfe-commits@lists.llvm.org
<mailto:cfe-commits@lists.llvm.org>>>
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits