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

Fariborz Jahanian fjahanian at apple.com
Sat Jul 10 10:50:11 PDT 2010


On Jul 9, 2010, at 7:03 PM, Douglas Gregor wrote:

>
>
> 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?

Unlike our expectation it wasn't doing that. AFAIK, no other  
attributes are moved over either. But I will
look further.

- Fariborz

>
>  - 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