[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