[cfe-commits] r77497 - in /cfe/trunk/lib/Sema: Sema.h SemaExpr.cpp

Douglas Gregor dgregor at apple.com
Wed Jul 29 13:06:12 PDT 2009


On Jul 29, 2009, at 12:40 PM, Fariborz Jahanian wrote:

> Author: fjahanian
> Date: Wed Jul 29 14:40:11 2009
> New Revision: 77497
>
> URL: http://llvm.org/viewvc/llvm-project?rev=77497&view=rev
> Log:
> Check accessibility when converting object to the base
> class.

Thanks! Some more comments below.

> Modified:
>    cfe/trunk/lib/Sema/Sema.h
>    cfe/trunk/lib/Sema/SemaExpr.cpp
>
> Modified: cfe/trunk/lib/Sema/Sema.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=77497&r1=77496&r2=77497&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/lib/Sema/Sema.h (original)
> +++ cfe/trunk/lib/Sema/Sema.h Wed Jul 29 14:40:11 2009
> @@ -691,7 +691,7 @@
>   ImplicitConversionSequence TryContextuallyConvertToBool(Expr *From);
>   bool PerformContextuallyConvertToBool(Expr *&From);
>
> -  void PerformObjectMemberConversion(Expr *&From, NamedDecl *Member);
> +  bool PerformObjectMemberConversion(Expr *&From, NamedDecl *Member);
>
>   /// OverloadingResult - Capture the result of performing overload
>   /// resolution.
>
> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=77497&r1=77496&r2=77497&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Wed Jul 29 14:40:11 2009
> @@ -1024,7 +1024,7 @@
>   return BuildDeclarationNameExpr(Loc, D, HasTrailingLParen, SS,  
> isAddressOfOperand);
> }
> /// \brief Cast member's object to its own class if necessary.
> -void
> +bool
> Sema::PerformObjectMemberConversion(Expr *&From, NamedDecl *Member) {
>   if (FieldDecl *FD = dyn_cast<FieldDecl>(Member))
>     if (CXXRecordDecl *RD =
> @@ -1033,11 +1033,23 @@
>         Context.getCanonicalType(Context.getTypeDeclType(RD));
>       if (!DestType->isDependentType() &&
>           !From->getType()->isDependentType()) {

Sorry I didn't think of this before, but an early exit to reduce  
nesting would make this clearer:

   if (DestType->isDependentType() || From->isTypeDependent())
     return false;

> -        if (From->getType()->getAsPointerType())
> +        QualType FromRecordType = From->getType();
> +        QualType DestRecordType = DestType;
> +        if (FromRecordType->getAsPointerType()) {
>           DestType = Context.getPointerType(DestType);
> +          FromRecordType = FromRecordType->getPointeeType();
> +        }
> +        if (IsDerivedFrom(FromRecordType, DestRecordType) &&
> +            CheckDerivedToBaseConversion(FromRecordType,
> +                                     DestRecordType,
> +                                     From->getSourceRange().getBegin 
> (),
> +                                     From->getSourceRange()))
> +          return true;
> +

The IsDerivedFrom check can be expensive, so we'd like to avoid doing  
it twice (once in IsDerivedFrom, once in  
CheckDerivedToBaseConversion). Since the object conversion will alway  
have either (canonical) FromRecordType == (canonical) DestRecordType  
or FromRecordType derived from DestRecordType, why not check for the  
equality condition and, if the types aren't equal, just call  
CheckDerivedtoBaseConversion directly? It will assert that there  
actually was a derivation relationship.

>         ImpCastExprToType(From, DestType, /*isLvalue=*/true);


Also: could you add a test case that illustrates the need for  
CheckDerivedToBaseConversion?

	- Doug



More information about the cfe-commits mailing list