[cfe-commits] r105606 - in /cfe/trunk: lib/CodeGen/Mangle.cpp test/CodeGenCXX/mangle-unnamed.cpp

Anders Carlsson andersca at mac.com
Tue Jun 8 07:59:46 PDT 2010


8 jun 2010 kl. 07.53 skrev Douglas Gregor:

> 
> On Jun 8, 2010, at 7:49 AM, Anders Carlsson wrote:
> 
>> Author: andersca
>> Date: Tue Jun  8 09:49:03 2010
>> New Revision: 105606
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=105606&view=rev
>> Log:
>> Correctly mangle static variables of anonymous struct/union type.
>> 
>> Modified:
>>  cfe/trunk/lib/CodeGen/Mangle.cpp
>>  cfe/trunk/test/CodeGenCXX/mangle-unnamed.cpp
>> 
>> Modified: cfe/trunk/lib/CodeGen/Mangle.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/Mangle.cpp?rev=105606&r1=105605&r2=105606&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/Mangle.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/Mangle.cpp Tue Jun  8 09:49:03 2010
>> @@ -598,6 +598,28 @@
>> mangleUnqualifiedName(0, Name, KnownArity);
>> }
>> 
>> +static const FieldDecl *FindFirstNamedDataMember(const RecordDecl *RD) {
>> +  assert(RD->isAnonymousStructOrUnion() &&
>> +         "Expected anonymous struct or union!");
>> +  
>> +  for (RecordDecl::field_iterator I = RD->field_begin(), E = RD->field_end();
>> +       I != E; ++I) {
>> +    const FieldDecl *FD = *I;
>> +    
>> +    if (FD->getIdentifier())
>> +      return FD;
>> +    
>> +    if (const RecordType *RT = FD->getType()->getAs<RecordType>()) {
>> +      if (const FieldDecl *NamedDataMember = 
>> +          FindFirstNamedDataMember(RT->getDecl()))
>> +        return NamedDataMember;
>> +    }
>> +  }
>> +
>> +  // We didn't find a named data member.
>> +  return 0;
>> +}
>> +
>> void CXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND,
>>                                          DeclarationName Name,
>>                                          unsigned KnownArity) {
>> @@ -630,6 +652,28 @@
>>     }
>>   }
>> 
>> +    if (const VarDecl *VD = dyn_cast<VarDecl>(ND)) {
>> +      // We must have an anonymous union or struct declaration.
>> +      const RecordDecl *RD = 
>> +        cast<RecordDecl>(VD->getType()->getAs<RecordType>()->getDecl());
> 
> Should you
> 
> 	assert(RD->isAnonymousStructOrUnion());
> 

I already do that in FindFirstNamedDataMember. Would you like me to add another assert?

- Anders




More information about the cfe-commits mailing list