r295150 - [Sema] Disallow returning a __block variable via a move.

Akira Hatanaka via cfe-commits cfe-commits at lists.llvm.org
Wed Feb 15 11:43:56 PST 2017


Hans,

Can this be merged to 4.0 too?

> On Feb 14, 2017, at 9:15 PM, Akira Hatanaka via cfe-commits <cfe-commits at lists.llvm.org> wrote:
> 
> Author: ahatanak
> Date: Tue Feb 14 23:15:28 2017
> New Revision: 295150
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=295150&view=rev
> Log:
> [Sema] Disallow returning a __block variable via a move.
> 
> r274291 made changes to prefer calling a move constructor to calling a
> copy constructor when returning from a function. This caused programs to
> crash when a __block variable in the heap was moved out and used later.
> 
> This commit fixes the bug by disallowing moving out of __block variables
> implicitly.
> 
> rdar://problem/28181080
> 
> Differential Revision: https://reviews.llvm.org/D29908
> 
> Modified:
>    cfe/trunk/lib/Sema/SemaStmt.cpp
>    cfe/trunk/test/SemaObjCXX/blocks.mm
> 
> Modified: cfe/trunk/lib/Sema/SemaStmt.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaStmt.cpp?rev=295150&r1=295149&r2=295150&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaStmt.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaStmt.cpp Tue Feb 14 23:15:28 2017
> @@ -2743,15 +2743,17 @@ bool Sema::isCopyElisionCandidate(QualTy
>   // ...automatic...
>   if (!VD->hasLocalStorage()) return false;
> 
> +  // Return false if VD is a __block variable. We don't want to implicitly move
> +  // out of a __block variable during a return because we cannot assume the
> +  // variable will no longer be used.
> +  if (VD->hasAttr<BlocksAttr>()) return false;
> +
>   if (AllowParamOrMoveConstructible)
>     return true;
> 
>   // ...non-volatile...
>   if (VD->getType().isVolatileQualified()) return false;
> 
> -  // __block variables can't be allocated in a way that permits NRVO.
> -  if (VD->hasAttr<BlocksAttr>()) return false;
> -
>   // Variables with higher required alignment than their type's ABI
>   // alignment cannot use NRVO.
>   if (!VD->getType()->isDependentType() && VD->hasAttr<AlignedAttr>() &&
> 
> Modified: cfe/trunk/test/SemaObjCXX/blocks.mm
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjCXX/blocks.mm?rev=295150&r1=295149&r2=295150&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaObjCXX/blocks.mm (original)
> +++ cfe/trunk/test/SemaObjCXX/blocks.mm Tue Feb 14 23:15:28 2017
> @@ -1,4 +1,4 @@
> -// RUN: %clang_cc1 -fsyntax-only -verify -fblocks -Wno-objc-root-class %s
> +// RUN: %clang_cc1 -fsyntax-only -verify -fblocks -Wno-objc-root-class -std=c++11 %s
> @protocol NSObject;
> 
> void bar(id(^)(void));
> @@ -144,3 +144,17 @@ namespace DependentReturn {
> 
>   template void f<X>(X);
> }
> +
> +namespace MoveBlockVariable {
> +struct B0 {
> +};
> +
> +struct B1 { // expected-note 2 {{candidate constructor (the implicit}}
> +  B1(B0&&); // expected-note {{candidate constructor not viable}}
> +};
> +
> +B1 test_move() {
> +  __block B0 b;
> +  return b; // expected-error {{no viable conversion from returned value of type 'MoveBlockVariable::B0' to function return type 'MoveBlockVariable::B1'}}
> +}
> +}
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list