[cfe-commits] r151399 - in /cfe/trunk: lib/AST/ExprConstant.cpp test/SemaCXX/lambda-expressions.cpp

Eli Friedman eli.friedman at gmail.com
Fri Feb 24 14:54:09 PST 2012


On Fri, Feb 24, 2012 at 2:12 PM, Richard Smith
<richard-llvm at metafoo.co.uk> wrote:
> Author: rsmith
> Date: Fri Feb 24 16:12:32 2012
> New Revision: 151399
>
> URL: http://llvm.org/viewvc/llvm-project?rev=151399&view=rev
> Log:
> When checking whether a reference to a variable is an ICE, look at the type of
> the declaration, not at the type of the DeclRefExpr, since within a lambda the
> DeclRefExpr can be more const than the declaration is.
>
> Modified:
>    cfe/trunk/lib/AST/ExprConstant.cpp
>    cfe/trunk/test/SemaCXX/lambda-expressions.cpp
>
> Modified: cfe/trunk/lib/AST/ExprConstant.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=151399&r1=151398&r2=151399&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/ExprConstant.cpp (original)
> +++ cfe/trunk/lib/AST/ExprConstant.cpp Fri Feb 24 16:12:32 2012
> @@ -6379,12 +6379,12 @@
>       return CheckEvalInICE(E, Ctx);
>     return ICEDiag(2, E->getLocStart());
>   }
> -  case Expr::DeclRefExprClass:
> +  case Expr::DeclRefExprClass: {
>     if (isa<EnumConstantDecl>(cast<DeclRefExpr>(E)->getDecl()))
>       return NoDiag();
> -    if (Ctx.getLangOptions().CPlusPlus && IsConstNonVolatile(E->getType())) {
> -      const NamedDecl *D = cast<DeclRefExpr>(E)->getDecl();
> -
> +    const ValueDecl *D = dyn_cast<ValueDecl>(cast<DeclRefExpr>(E)->getDecl());
> +    if (Ctx.getLangOptions().CPlusPlus &&
> +        D && IsConstNonVolatile(D->getType())) {
>       // Parameter variables are never constants.  Without this check,
>       // getAnyInitializer() can find a default argument, which leads
>       // to chaos.
> @@ -6408,6 +6408,7 @@
>       }
>     }
>     return ICEDiag(2, E->getLocStart());
> +  }
>   case Expr::UnaryOperatorClass: {
>     const UnaryOperator *Exp = cast<UnaryOperator>(E);
>     switch (Exp->getOpcode()) {
>
> Modified: cfe/trunk/test/SemaCXX/lambda-expressions.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/lambda-expressions.cpp?rev=151399&r1=151398&r2=151399&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/lambda-expressions.cpp (original)
> +++ cfe/trunk/test/SemaCXX/lambda-expressions.cpp Fri Feb 24 16:12:32 2012
> @@ -101,3 +101,30 @@
>     f(v, [](){});
>   }
>  }
> +
> +namespace NullPtr {
> +  int &f(int *p);
> +  char &f(...);
> +  void g() {
> +    int n = 0;
> +    [=] {
> +      char &k = f(n); // not a null pointer constant
> +    } ();
> +
> +    const int m = 0;
> +    [=] {
> +      int &k = f(m); // a null pointer constant
> +    } ();
> +
> +    // FIXME: At least the second of these cases should probably not be
> +    // considered to be a null pointer constant.
> +    [=] () -> bool {
> +      int &k = f(m);  // a null pointer constant?
> +      return &m == 0; // no, captured!
> +    } ();
> +
> +    [m] {
> +      int &k = f(m); // a null pointer constant?
> +    } ();

I don't follow what you're trying to test here... IIRC, whether a
variable is captured should have no effect on whether a particular use
is an odr-use.

-Eli




More information about the cfe-commits mailing list