[cfe-commits] r80846 - in /cfe/trunk: lib/Sema/SemaDeclCXX.cpp test/CodeGenCXX/constructor-template.cpp

Fariborz Jahanian fjahanian at apple.com
Thu Sep 3 16:21:39 PDT 2009


On Sep 3, 2009, at 7:49 AM, Douglas Gregor wrote:

>
> On Sep 2, 2009, at 4:02 PM, Fariborz Jahanian wrote:
>
>> Author: fjahanian
>> Date: Wed Sep  2 18:02:57 2009
>> New Revision: 80846
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=80846&view=rev
>> Log:
>> Referenced instatiated default constructors
>> must be defined. Fixed pr4853.
>
> Thanks! Some comments below.
>
>> Modified:
>>   cfe/trunk/lib/Sema/SemaDeclCXX.cpp
>>   cfe/trunk/test/CodeGenCXX/constructor-template.cpp
>>
>> Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=80846&r1=80845&r2=80846&view=diff
>>
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =====================================================================
>> --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Wed Sep  2 18:02:57 2009
>> @@ -1003,7 +1003,25 @@
>>
>>  if (Constructor->isDependentContext())
>>    return;
>> -
>> +  // Mark all constructors used in initialization of class's members
>> +  // as referenced.
>> +  // FIXME. We can do this while building the initializer list. But
>> +  // MarkDeclarationReferenced is not accessible in ASTContext.
>> +  for (CXXConstructorDecl::init_const_iterator B = Constructor- 
>> >init_begin(),
>> +       E = Constructor->init_end();
>> +       B != E; ++B) {
>
> Shouldn't we just move the code from  
> CXXConstructorDecl::setBaseOrMemberInitializers into Sema, so that  
> it can call MarkDeclarationReferenced directly (rather than have to  
> go through the whole list of initializers again later)?
>
> Also, I wonder if CXXDestructorDecl::computeBaseOrMembersToDestroy  
> will have the same problem. We'll need to call  
> MarkDeclarationReferenced on each of the destructors it uses.
>
>> +    CXXBaseOrMemberInitializer *Member = (*B);
>> +    if (!Member->isMemberInitializer())
>> +      continue;
>
> We shouldn't skip out of this loop so soon, since base class  
> initializers will need the same treatment as member initializers.  
> Here's a tweaked version of the test case from PR4826 that is still  
> missing a MarkDeclarationReferenced call:
>
> template <typename T> class List {
>  int i;
> public:
>  List(){ }	// List<BinomialNode<int>*>::List() remains undefined.
> };
>
> template<typename T> class BinomialNode
> : List<BinomialNode<T>*> {
> public:
>  BinomialNode(T value) {}
>  // nodes;
> };
>
> int main() {
>  BinomialNode<int> *node = new BinomialNode<int>(1);
> }
>
>> +    FieldDecl *Field = Member->getMember();
>> +    QualType FT = Context.getBaseElementType(Field->getType());
>> +    if (const RecordType* RT = FT->getAs<RecordType>()) {
>> +      CXXConstructorDecl *Ctor =
>> +        cast<CXXRecordDecl>(RT->getDecl())- 
>> >getDefaultConstructor(Context);
>> +      if (Ctor && !FT->isDependentType())
>> +        MarkDeclarationReferenced(Ctor->getLocation(), Ctor);
>
> The location that we pass to MarkDeclarationReferenced should be the  
> location where the declaration was referenced from. For user-written  
> base or member initializers, that's  
> CXXBaseOrMemberInitializer::IdLoc. For synthesized base or member  
> initializers, we should pick something easily recognizable as being  
> part of the definition, e.g., the '{' that starts the constructor  
> definition.

All done in TOT:
http://llvm.org/viewvc/llvm-project?view=rev&revision=80950 &
http://llvm.org/viewvc/llvm-project?view=rev&revision=80967
- Fariborz

>
>
>  - Doug




More information about the cfe-commits mailing list