[cfe-commits] r108019 - in /cfe/trunk: lib/Sema/TreeTransform.h test/CodeGenCXX/instantiate-blocks.cpp test/SemaCXX/instantiate-blocks.cpp

Douglas Gregor dgregor at apple.com
Fri Jul 9 19:03:30 PDT 2010



Sent from my iPhone

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

> Author: fjahanian
> Date: Fri Jul  9 16:27:28 2010
> New Revision: 108019
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=108019&view=rev
> Log:
> Instantiation of byref variable in
> block literal expression.
> 
> Added:
>    cfe/trunk/test/SemaCXX/instantiate-blocks.cpp
> Modified:
>    cfe/trunk/lib/Sema/TreeTransform.h
>    cfe/trunk/test/CodeGenCXX/instantiate-blocks.cpp
> 
> Modified: cfe/trunk/lib/Sema/TreeTransform.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=108019&r1=108018&r2=108019&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/TreeTransform.h (original)
> +++ cfe/trunk/lib/Sema/TreeTransform.h Fri Jul  9 16:27:28 2010
> @@ -6279,6 +6279,10 @@
>   if (!ND)
>     return SemaRef.ExprError();
> 
> +  // Is this instantiation of a __block variable?
> +  if (E->getDecl()->getAttr<BlocksAttr>())
> +    ND->addAttr(::new (SemaRef.Context) BlocksAttr(BlocksAttr::ByRef));
> +  

It seems like this attribute should have been copied to the instantiated declaration when the VarDecl itself was created. Is that not the case?

  - Doug

>   if (!getDerived().AlwaysRebuild() &&
>       ND == E->getDecl()) {
>     // Mark it referenced in the new context regardless.
> 
> Modified: cfe/trunk/test/CodeGenCXX/instantiate-blocks.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/instantiate-blocks.cpp?rev=108019&r1=108018&r2=108019&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/instantiate-blocks.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/instantiate-blocks.cpp Fri Jul  9 16:27:28 2010
> @@ -18,7 +18,11 @@
> template <typename T, typename T1> void foo(T t, T1 r)
> {
>     T block_arg;
> -    T1 (^block)(char, T, T1, double) =  ^ T1 (char ch, T arg, T1 arg2, double d1) { return block_arg+arg; };
> +    __block T1 byref_block_arg;
> +
> +    T1 (^block)(char, T, T1, double) =  
> +    ^ T1 (char ch, T arg, T1 arg2, double d1) { byref_block_arg = arg2;
> +                                   return byref_block_arg + arg; };
> 
>     void (^block2)() = ^{};
> }
> 
> Added: cfe/trunk/test/SemaCXX/instantiate-blocks.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/instantiate-blocks.cpp?rev=108019&view=auto
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/instantiate-blocks.cpp (added)
> +++ cfe/trunk/test/SemaCXX/instantiate-blocks.cpp Fri Jul  9 16:27:28 2010
> @@ -0,0 +1,19 @@
> +// RUN: %clang_cc1 -fblocks -fsyntax-only -verify %s
> +// rdar: // 6182276
> +
> +template <typename T, typename T1> void foo(T t, T1 r)
> +{
> +    T block_arg;
> +    __block T1 byref_block_arg;
> +
> +    T1 (^block)(T)  =  ^ T1 (T arg) { 
> +         byref_block_arg = arg;
> +         block_arg = arg;    // expected-error {{variable is not assignable (missing __block type specifier)}}
> +         return block_arg+arg; };
> +}
> +
> +int main(void)
> +{
> +    foo(100, 'a');    // expected-note {{in instantiation of function template specialization 'foo<int, char>' requested here}}
> +}
> +
> 
> 
> _______________________________________________
> 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