[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