<div dir="ltr">Another one for 3.6 ( <a href="http://llvm.org/bugs/show_bug.cgi?id=22257">http://llvm.org/bugs/show_bug.cgi?id=22257</a> again)</div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Feb 3, 2015 at 2:37 PM, David Blaikie <span dir="ltr"><<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: dblaikie<br>
Date: Tue Feb  3 16:37:17 2015<br>
New Revision: 228053<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=228053&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=228053&view=rev</a><br>
Log:<br>
DebugInfo: Ensure calls to functions with default arguments which themselves have default arguments, still have locations.<br>
<br>
To handle default arguments in C++ in the debug info, we disable code<br>
updating the debug location during the emission of default arguments.<br>
<br>
This code was buggy in the case of default arguments which, themselves,<br>
have default arguments - the inner default argument would re-enable<br>
debug info when it was finished, but before the outer default argument<br>
was finished.<br>
<br>
This was already a bug, but got worse (because a crasher instead of just<br>
a quality bug) with the recent improvements to debug info line quality<br>
because... The ApplyDebugLocation scoped device would find the debug<br>
info disabled and not save any debug location. But then in<br>
~ApplyDebugLocation it would find the debug info had been enabled and<br>
would then apply the no-location. Then the outer function call would be<br>
emitted without any location. That's bad.<br>
<br>
Arguably we could /also/ fix the ApplyDebugLocation to assert on this<br>
situation (where debug info was disabled in the ctor and enabled in the<br>
dtor, or the other way around) but this is at least the necessary fix<br>
regardless.<br>
<br>
(also, I imagine this disabling behavior might need to be in-place for<br>
CGExprComplex and CGExprAgg too, maybe... ?)<br>
<br>
And I seem to recall seeing some weird default arg stepping behavior<br>
recently which might be related to this too... I'll have to look into<br>
it.<br>
<br>
Modified:<br>
    cfe/trunk/lib/CodeGen/CGExprScalar.cpp<br>
    cfe/trunk/test/CodeGenCXX/debug-info-line.cpp<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CGExprScalar.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprScalar.cpp?rev=228053&r1=228052&r2=228053&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprScalar.cpp?rev=228053&r1=228052&r2=228053&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CGExprScalar.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CGExprScalar.cpp Tue Feb  3 16:37:17 2015<br>
@@ -3393,11 +3393,12 @@ Value *CodeGenFunction::EmitScalarExpr(c<br>
   assert(E && hasScalarEvaluationKind(E->getType()) &&<br>
          "Invalid scalar expression to emit");<br>
<br>
+  bool hasDebugInfo = getDebugInfo();<br>
   if (isa<CXXDefaultArgExpr>(E))<br>
     disableDebugInfo();<br>
   Value *V = ScalarExprEmitter(*this, IgnoreResultAssign)<br>
     .Visit(const_cast<Expr*>(E));<br>
-  if (isa<CXXDefaultArgExpr>(E))<br>
+  if (isa<CXXDefaultArgExpr>(E) && hasDebugInfo)<br>
     enableDebugInfo();<br>
   return V;<br>
 }<br>
<br>
Modified: cfe/trunk/test/CodeGenCXX/debug-info-line.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-line.cpp?rev=228053&r1=228052&r2=228053&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-line.cpp?rev=228053&r1=228052&r2=228053&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGenCXX/debug-info-line.cpp (original)<br>
+++ cfe/trunk/test/CodeGenCXX/debug-info-line.cpp Tue Feb  3 16:37:17 2015<br>
@@ -250,6 +250,15 @@ void f20(int a, int b, int c) {<br>
     ;<br>
 }<br>
<br>
+// CHECK-LABEL: define<br>
+int f21_a(int = 0);<br>
+void f21_b(int = f21_a());<br>
+void f21() {<br>
+// CHECK: call {{.*}}f21_b{{.*}}, !dbg [[DBG_F21:![0-9]*]]<br>
+#line 2300<br>
+  f21_b();<br>
+}<br>
+<br>
 // CHECK: [[DBG_F1]] = !MDLocation(line: 100,<br>
 // CHECK: [[DBG_FOO_VALUE]] = !MDLocation(line: 200,<br>
 // CHECK: [[DBG_FOO_REF]] = !MDLocation(line: 202,<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>