[cfe-commits] r73922 - in /cfe/trunk: include/clang/AST/DeclCXX.h lib/AST/DeclCXX.cpp lib/Sema/Sema.h lib/Sema/SemaDeclCXX.cpp lib/Sema/SemaExpr.cpp

Fariborz Jahanian fjahanian at apple.com
Tue Jun 23 16:50:52 PDT 2009


On Jun 23, 2009, at 1:52 PM, Douglas Gregor wrote:

>
> On Jun 22, 2009, at 4:34 PM, Fariborz Jahanian wrote:
>
>> Author: fjahanian
>> Date: Mon Jun 22 18:34:40 2009
>> New Revision: 73922
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=73922&view=rev
>> Log:
>> patch to mark use of implicit copy constructors.
>>
>>
>> Modified:
>>   cfe/trunk/include/clang/AST/DeclCXX.h
>>   cfe/trunk/lib/AST/DeclCXX.cpp
>>   cfe/trunk/lib/Sema/Sema.h
>>   cfe/trunk/lib/Sema/SemaDeclCXX.cpp
>>   cfe/trunk/lib/Sema/SemaExpr.cpp
>>
>> Modified: cfe/trunk/include/clang/AST/DeclCXX.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclCXX.h?rev=73922&r1=73921&r2=73922&view=diff
>>
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =====================================================================
>> --- cfe/trunk/include/clang/AST/DeclCXX.h (original)
>> +++ cfe/trunk/include/clang/AST/DeclCXX.h Mon Jun 22 18:34:40 2009
>> @@ -283,6 +283,10 @@
>>  /// copy constructor that accepts a const-qualified argument.
>>  bool hasConstCopyConstructor(ASTContext &Context) const;
>>
>> +  /// getCopyConstructor - Returns the copy constructor for this  
>> class
>> +  CXXConstructorDecl *getCopyConstructor(ASTContext &Context,
>> +                                         unsigned TypeQuals) const;
>> +
>>  /// hasConstCopyAssignment - Determines whether this class has a
>>  /// copy assignment operator that accepts a const-qualified  
>> argument.
>>  bool hasConstCopyAssignment(ASTContext &Context) const;
>>
>> Modified: cfe/trunk/lib/AST/DeclCXX.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclCXX.cpp?rev=73922&r1=73921&r2=73922&view=diff
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- cfe/trunk/lib/AST/DeclCXX.cpp (original)
>> +++ cfe/trunk/lib/AST/DeclCXX.cpp Mon Jun 22 18:34:40 2009
>> @@ -66,21 +66,29 @@
>> }
>>
>> bool CXXRecordDecl::hasConstCopyConstructor(ASTContext &Context)  
>> const {
>> +  return getCopyConstructor(Context, QualType::Const) != 0;
>> +}
>> +
>> +CXXConstructorDecl *CXXRecordDecl::getCopyConstructor(ASTContext  
>> &Context,
>> +                                                      unsigned  
>> TypeQuals) const{
>>  QualType ClassType
>>    = Context.getTypeDeclType(const_cast<CXXRecordDecl*>(this));
>>  DeclarationName ConstructorName
>>    = Context.DeclarationNames.getCXXConstructorName(
>> -                                            
>> Context.getCanonicalType(ClassType));
>> -  unsigned TypeQuals;
>> +                                           
>> Context.getCanonicalType(ClassType));
>> +  unsigned FoundTQs;
>>  DeclContext::lookup_const_iterator Con, ConEnd;
>>  for (llvm::tie(Con, ConEnd) = this->lookup(Context,  
>> ConstructorName);
>>       Con != ConEnd; ++Con) {
>> -    if (cast<CXXConstructorDecl>(*Con)->isCopyConstructor(Context,  
>> TypeQuals) &&
>> -        (TypeQuals & QualType::Const) != 0)
>> -      return true;
>> +    if (cast<CXXConstructorDecl>(*Con)->isCopyConstructor(Context,
>> +                                                           
>> FoundTQs)) {
>> +      if (((TypeQuals & QualType::Const) == (FoundTQs &  
>> QualType::Const)) ||
>> +          (!(TypeQuals & QualType::Const) && (FoundTQs &  
>> QualType::Const)))
>> +        return cast<CXXConstructorDecl>(*Con);
>> +
>> +    }
>>  }
>> -
>> -  return false;
>> +  return 0;
>> }
>
> This looks like it's doing overload resolution... why not just use  
> the existing overload-resolution code in Sema instead? (Or am I  
> misunderstanding the role of this code?).

This is essentially what I am doing. For a current class's copy ctor;   
I am looking up a valid copy constructor
of its base(s) and data members. So, for 'const X&' I am only looking  
for 'const B&' and for 'X&' I am
looking for either 'B&' or 'const B&'. I could be using  
PerformInitializationByConstructor for this purpose.
But it is overkill IMO and requires building and passing argument  
expression which I don't have. But
I am open for suggestion if  suitable API is available which does not  
have the extra overhead.

Other aspect of review is taken care of in:
http://llvm.org/viewvc/llvm-project?view=rev&revision=74025

- Thanks, Fariborz




More information about the cfe-commits mailing list