<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>