[cfe-commits] r150088 - in /cfe/trunk: lib/Sema/SemaExpr.cpp test/CXX/expr/expr.prim/expr.prim.lambda/p7.cpp

David Blaikie dblaikie at gmail.com
Wed Feb 8 13:17:48 PST 2012


On Wed, Feb 8, 2012 at 12:56 PM, Douglas Gregor <dgregor at apple.com> wrote:
> Author: dgregor
> Date: Wed Feb  8 14:56:50 2012
> New Revision: 150088
>
> URL: http://llvm.org/viewvc/llvm-project?rev=150088&view=rev
> Log:
> When computing the type of a local variable reference within a lambda,
> only add 'const' for variables captured by copy in potentially
> evaluated expressions of non-mutable lambdas. (The "by copy" part was
> missing).
>
> Modified:
>    cfe/trunk/lib/Sema/SemaExpr.cpp
>    cfe/trunk/test/CXX/expr/expr.prim/expr.prim.lambda/p7.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=150088&r1=150087&r2=150088&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Wed Feb  8 14:56:50 2012
> @@ -2094,6 +2094,15 @@
>   return S.getCurBlock() != 0;
>  }
>
> +/// \brief Determine whether the given lambda would capture the given
> +/// variable by copy.
> +static bool willCaptureByCopy(LambdaScopeInfo *LSI, VarDecl *Var) {
> +  if (LSI->isCaptured(Var))
> +    return LSI->getCapture(Var).isCopyCapture();
> +
> +  return LSI->ImpCaptureStyle == CapturingScopeInfo::ImpCap_LambdaByval;
> +}
> +
>  static bool shouldAddConstQualToVarRef(ValueDecl *D, Sema &S) {
>   VarDecl *var = dyn_cast<VarDecl>(D);
>   if (!var)
> @@ -2117,7 +2126,8 @@
>   // about decltype hints that it might apply in unevaluated contexts
>   // as well... and there's precent in our blocks implementation.
>   return !LSI->Mutable &&
> -         S.ExprEvalContexts.back().Context != Sema::Unevaluated;
> +         S.ExprEvalContexts.back().Context != Sema::Unevaluated &&
> +         willCaptureByCopy(LSI, var);
>  }
>
>  static ExprResult BuildBlockDeclRefExpr(Sema &S, ValueDecl *VD,
>
> Modified: cfe/trunk/test/CXX/expr/expr.prim/expr.prim.lambda/p7.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/expr/expr.prim/expr.prim.lambda/p7.cpp?rev=150088&r1=150087&r2=150088&view=diff
> ==============================================================================
> --- cfe/trunk/test/CXX/expr/expr.prim/expr.prim.lambda/p7.cpp (original)
> +++ cfe/trunk/test/CXX/expr/expr.prim/expr.prim.lambda/p7.cpp Wed Feb  8 14:56:50 2012
> @@ -6,7 +6,40 @@
>   // expected-error{{lambda expressions are not supported yet}}
>  }
>
> -// FIXME: Also check translation of captured vars to data members,
> -// most of which isn't in the AST.
> +// Check that we get the right types of captured variables (the semantic-analysis part of

Did part of this comment go missing?

> +int &check_const_int(int&);
> +float &check_const_int(const int&);
> +
> +void test_capture_constness(int i, const int ic) {
> +  [i,ic] ()->void { // expected-error{{lambda expressions are not supported yet}}
> +    float &fr1 = check_const_int(i);
> +    float &fr2 = check_const_int(ic);
> +  };
> +
> +  [=] ()->void { // expected-error{{lambda expressions are not supported yet}}
> +    float &fr1 = check_const_int(i);
> +    float &fr2 = check_const_int(ic);
> +  };
> +
> +  [i,ic] () mutable ->void { // expected-error{{lambda expressions are not supported yet}}
> +    int &ir = check_const_int(i);
> +    float &fr = check_const_int(ic);
> +  };
> +
> +  [=] () mutable ->void { // expected-error{{lambda expressions are not supported yet}}
> +    int &ir = check_const_int(i);
> +    float &fr = check_const_int(ic);
> +  };
> +
> +  [&i,&ic] ()->void { // expected-error{{lambda expressions are not supported yet}}
> +    int &ir = check_const_int(i);
> +    float &fr = check_const_int(ic);
> +  };
> +
> +  [&] ()->void { // expected-error{{lambda expressions are not supported yet}}
> +    int &ir = check_const_int(i);
> +    float &fr = check_const_int(ic);
> +  };
> +}
>
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list