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

Francois Pichet pichet2000 at gmail.com
Mon May 9 16:32:13 PDT 2011


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>();
}




More information about the cfe-commits mailing list