[cfe-commits] r108026 - in /cfe/trunk: lib/Sema/SemaExpr.cpp test/CodeGenCXX/instantiate-blocks.cpp

Douglas Gregor dgregor at apple.com
Fri Jul 9 19:12:31 PDT 2010



Sent from my iPhone

On Jul 9, 2010, at 3:21 PM, Fariborz Jahanian <fjahanian at apple.com> wrote:

> Author: fjahanian
> Date: Fri Jul  9 17:21:32 2010
> New Revision: 108026
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=108026&view=rev
> Log:
> BlockDeclRefExpr of a dependent type must
> be a dependent expression when its is built.
> 
> 
> Modified:
>    cfe/trunk/lib/Sema/SemaExpr.cpp
>    cfe/trunk/test/CodeGenCXX/instantiate-blocks.cpp
> 
> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=108026&r1=108025&r2=108026&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Fri Jul  9 17:21:32 2010
> @@ -1748,22 +1748,25 @@
>                                                             ExprTy, Loc, false,
>                                                             constAdded);
>     QualType T = VD->getType();
> -    if (getLangOptions().CPlusPlus && !T->isDependentType() &&
> -        !T->isReferenceType()) {
> -      Expr *E = new (Context) 
> -                  DeclRefExpr(const_cast<ValueDecl*>(BDRE->getDecl()), T,
> -                                         SourceLocation());
> +    if (getLangOptions().CPlusPlus) {
> +      if (!T->isDependentType() && !T->isReferenceType()) {
> +        Expr *E = new (Context) 
> +                    DeclRefExpr(const_cast<ValueDecl*>(BDRE->getDecl()), T,
> +                                          SourceLocation());
> 
> -      OwningExprResult Res = PerformCopyInitialization(
> -                      InitializedEntity::InitializeBlock(VD->getLocation(), 
> +        OwningExprResult Res = PerformCopyInitialization(
> +                          InitializedEntity::InitializeBlock(VD->getLocation(), 
>                                                          T, false),
> -                      SourceLocation(),
> -                      Owned(E));
> -      if (!Res.isInvalid()) {
> -        Res = MaybeCreateCXXExprWithTemporaries(move(Res));
> -        Expr *Init = Res.takeAs<Expr>();
> -        BDRE->setCopyConstructorExpr(Init);
> +                                                         SourceLocation(),
> +                                                         Owned(E));
> +        if (!Res.isInvalid()) {
> +          Res = MaybeCreateCXXExprWithTemporaries(move(Res));
> +          Expr *Init = Res.takeAs<Expr>();
> +          BDRE->setCopyConstructorExpr(Init);
> +        }
>       }
> +      else if (T->isDependentType())
> +        BDRE->setTypeDependent(true);

Since we only need to look at the declaration's type to determine whether the BlockDeclRefExpr is type-dependent, why not move this part of the computation into its constructor?

  - Doug

>     }
>     return Owned(BDRE);
>   }
> 
> Modified: cfe/trunk/test/CodeGenCXX/instantiate-blocks.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/instantiate-blocks.cpp?rev=108026&r1=108025&r2=108026&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/instantiate-blocks.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/instantiate-blocks.cpp Fri Jul  9 17:21:32 2010
> @@ -22,7 +22,7 @@
> 
>     T1 (^block)(char, T, T1, double) =  
>    ^ T1 (char ch, T arg, T1 arg2, double d1) { byref_block_arg = arg2;
> -                                   return byref_block_arg + arg; };
> +                                   return byref_block_arg + block_arg + arg; };
> 
>     void (^block2)() = ^{};
> }
> 
> 
> _______________________________________________
> 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