<div class="gmail_quote">On Fri, Feb 24, 2012 at 2:54 PM, Eli Friedman <span dir="ltr"><<a href="mailto:eli.friedman@gmail.com">eli.friedman@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5">On Fri, Feb 24, 2012 at 2:12 PM, Richard Smith<br>
<<a href="mailto:richard-llvm@metafoo.co.uk">richard-llvm@metafoo.co.uk</a>> wrote:<br>
> Author: rsmith<br>
> Date: Fri Feb 24 16:12:32 2012<br>
> New Revision: 151399<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=151399&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=151399&view=rev</a><br>
> Log:<br>
> When checking whether a reference to a variable is an ICE, look at the type of<br>
> the declaration, not at the type of the DeclRefExpr, since within a lambda the<br>
> DeclRefExpr can be more const than the declaration is.<br>
><br>
> Modified:<br>
> cfe/trunk/lib/AST/ExprConstant.cpp<br>
> cfe/trunk/test/SemaCXX/lambda-expressions.cpp<br>
><br>
> Modified: cfe/trunk/lib/AST/ExprConstant.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=151399&r1=151398&r2=151399&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=151399&r1=151398&r2=151399&view=diff</a><br>
> ==============================================================================<br>
> --- cfe/trunk/lib/AST/ExprConstant.cpp (original)<br>
> +++ cfe/trunk/lib/AST/ExprConstant.cpp Fri Feb 24 16:12:32 2012<br>
> @@ -6379,12 +6379,12 @@<br>
> return CheckEvalInICE(E, Ctx);<br>
> return ICEDiag(2, E->getLocStart());<br>
> }<br>
> - case Expr::DeclRefExprClass:<br>
> + case Expr::DeclRefExprClass: {<br>
> if (isa<EnumConstantDecl>(cast<DeclRefExpr>(E)->getDecl()))<br>
> return NoDiag();<br>
> - if (Ctx.getLangOptions().CPlusPlus && IsConstNonVolatile(E->getType())) {<br>
> - const NamedDecl *D = cast<DeclRefExpr>(E)->getDecl();<br>
> -<br>
> + const ValueDecl *D = dyn_cast<ValueDecl>(cast<DeclRefExpr>(E)->getDecl());<br>
> + if (Ctx.getLangOptions().CPlusPlus &&<br>
> + D && IsConstNonVolatile(D->getType())) {<br>
> // Parameter variables are never constants. Without this check,<br>
> // getAnyInitializer() can find a default argument, which leads<br>
> // to chaos.<br>
> @@ -6408,6 +6408,7 @@<br>
> }<br>
> }<br>
> return ICEDiag(2, E->getLocStart());<br>
> + }<br>
> case Expr::UnaryOperatorClass: {<br>
> const UnaryOperator *Exp = cast<UnaryOperator>(E);<br>
> switch (Exp->getOpcode()) {<br>
><br>
> Modified: cfe/trunk/test/SemaCXX/lambda-expressions.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/lambda-expressions.cpp?rev=151399&r1=151398&r2=151399&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/lambda-expressions.cpp?rev=151399&r1=151398&r2=151399&view=diff</a><br>
> ==============================================================================<br>
> --- cfe/trunk/test/SemaCXX/lambda-expressions.cpp (original)<br>
> +++ cfe/trunk/test/SemaCXX/lambda-expressions.cpp Fri Feb 24 16:12:32 2012<br>
> @@ -101,3 +101,30 @@<br>
> f(v, [](){});<br>
> }<br>
> }<br>
> +<br>
> +namespace NullPtr {<br>
> + int &f(int *p);<br>
> + char &f(...);<br>
> + void g() {<br>
> + int n = 0;<br>
> + [=] {<br>
> + char &k = f(n); // not a null pointer constant<br>
> + } ();<br>
> +<br>
> + const int m = 0;<br>
> + [=] {<br>
> + int &k = f(m); // a null pointer constant<br>
> + } ();<br>
> +<br>
> + // FIXME: At least the second of these cases should probably not be<br>
> + // considered to be a null pointer constant.<br>
> + [=] () -> bool {<br>
> + int &k = f(m); // a null pointer constant?<br>
> + return &m == 0; // no, captured!<br>
> + } ();<br>
> +<br>
> + [m] {<br>
> + int &k = f(m); // a null pointer constant?<br>
> + } ();<br>
<br>
</div></div>I don't follow what you're trying to test here... IIRC, whether a</blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
variable is captured should have no effect on whether a particular use<br>
is an odr-use.</blockquote><div><br></div><div>Ah, sorry, I missed that part of p17. I've taken out the FIXME in r151405, but left the tests in.</div></div>