[cfe-commits] r131066 - /cfe/trunk/lib/Sema/SemaExprCXX.cpp

Douglas Gregor dgregor at apple.com
Mon May 9 16:37:46 PDT 2011


On May 9, 2011, at 4:32 PM, Francois Pichet wrote:

> On Mon, May 9, 2011 at 7:24 PM, Douglas Gregor <dgregor at apple.com> wrote:
>> 
>> On May 9, 2011, at 3:45 PM, Francois Pichet wrote:
>> 
>>> On Mon, May 9, 2011 at 3:00 PM, Douglas Gregor <dgregor at apple.com> wrote:
>>>> 
>>>> On May 8, 2011, at 3:02 AM, Francois Pichet wrote:
>>>> 
>>>>> Author: fpichet
>>>>> Date: Sun May  8 05:02:20 2011
>>>>> New Revision: 131066
>>>>> 
>>>>> URL: http://llvm.org/viewvc/llvm-project?rev=131066&view=rev
>>>>> Log:
>>>>> Look at all the record redeclaration when looking for a uuid attribute.
>>>>> 
>>>>> Modified:
>>>>>    cfe/trunk/lib/Sema/SemaExprCXX.cpp
>>>>> 
>>>>> Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
>>>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=131066&r1=131065&r2=131066&view=diff
>>>>> ==============================================================================
>>>>> --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
>>>>> +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Sun May  8 05:02:20 2011
>>>>> @@ -385,13 +385,14 @@
>>>>>   else if (QT->isArrayType())
>>>>>     Ty = cast<ArrayType>(QT)->getElementType().getTypePtr();
>>>>> 
>>>>> -  // Loop all class definition and declaration looking for an uuid attribute.
>>>>> +  // Loop all record redeclaration looking for an uuid attribute.
>>>>>   CXXRecordDecl *RD = Ty->getAsCXXRecordDecl();
>>>>> -  while (RD) {
>>>>> -    if (UuidAttr *Uuid = RD->getAttr<UuidAttr>())
>>>>> +  for (CXXRecordDecl::redecl_iterator I = RD->redecls_begin(),
>>>>> +       E = RD->redecls_end(); I != E; ++I) {
>>>>> +    if (UuidAttr *Uuid = I->getAttr<UuidAttr>())
>>>>>       return Uuid;
>>>>> -    RD = RD->getPreviousDeclaration();
>>>>>   }
>>>>> +
>>>>>   return 0;
>>>>> }
>>>> 
>>>> 
>>>> Usually, we merge attributes from prior declarations to later declarations, so that we don't need to perform walks over all redeclarations. That would be a better solution, unless you're seeing a case where MSVC is allowing us to pick up a UUID attribute from a later declaration?
>>>> 
>>> 
>>> yes MSVC will pick a UUID from a later declaration:
>>> 
>>> as in:
>>> 
>>> struct A;
>>> struct __declspec(uuid("000000A0-0000-0000-C000-000000000049")) A;
>> 
>> Sure, but how does this affect the UUID operator? Is it something like:
>> 
>>        struct A;
>>        template<typename T>
>>        void f() {
>>                __uuidof(A);
>>        }
>>        struct __declspec(uuid("000000A0-0000-0000-C000-000000000049")) A;
>> 
>> ?
>> 
>> I could certainly imagine MSVC allowing that. (A test to that effect would be nice)
>> 
>>        - Doug
>> 
> 
> yes MSVC allows that. But you have to force an instantiation to really test it:
> 
> int main() {
>  f<int>();
> }

Could you add a test case that checks this property? Otherwise, it's possible that a future refactoring will break this.

	- Doug



More information about the cfe-commits mailing list