]> granicus.if.org Git - clang/commitdiff
Add a CK_DerivedToBaseMemberPointer cast kind and use it in Sema (Still no codegen).
authorAnders Carlsson <andersca@mac.com>
Fri, 30 Oct 2009 00:46:35 +0000 (00:46 +0000)
committerAnders Carlsson <andersca@mac.com>
Fri, 30 Oct 2009 00:46:35 +0000 (00:46 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@85552 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/Expr.h
lib/AST/Expr.cpp
lib/Sema/SemaCXXCast.cpp

index bb445f659ccd4683ec81ff06c339b39981c067b3..3a43cc0e63c799dc7ee9900f86b5fbf4e7651f3c 100644 (file)
@@ -1532,6 +1532,10 @@ public:
     /// member pointer in derived class.
     CK_BaseToDerivedMemberPointer,
 
+    /// CK_DerivedToBaseMemberPointer - Member pointer in derived class to
+    /// member pointer in base class.
+    CK_DerivedToBaseMemberPointer,
+    
     /// CK_UserDefinedConversion - Conversion using a user defined type
     /// conversion function.
     CK_UserDefinedConversion,
index ad91cd393f6d55a16f4c08d1ef5bff3dbed55433..50a875c3ebcc1a9905980b7b9c1ea8f7c58dcaea 100644 (file)
@@ -503,6 +503,8 @@ const char *CastExpr::getCastKindName() const {
     return "NullToMemberPointer";
   case CastExpr::CK_BaseToDerivedMemberPointer:
     return "BaseToDerivedMemberPointer";
+  case CastExpr::CK_DerivedToBaseMemberPointer:
+    return "DerivedToBaseMemberPointer";
   case CastExpr::CK_UserDefinedConversion:
     return "UserDefinedConversion";
   case CastExpr::CK_ConstructorConversion:
index bf396041b473b7c931a5dbdeabd7cc30f6bc8ced..8bb334855d02954ec9fe1f67dbdc69e0cd84f25d 100644 (file)
@@ -83,7 +83,8 @@ static TryCastResult TryStaticDowncast(Sema &Self, QualType SrcType,
 static TryCastResult TryStaticMemberPointerUpcast(Sema &Self, QualType SrcType,
                                                   QualType DestType,bool CStyle,
                                                   const SourceRange &OpRange,
-                                                  unsigned &msg);
+                                                  unsigned &msg,
+                                                  CastExpr::CastKind &Kind);
 static TryCastResult TryStaticImplicitCast(Sema &Self, Expr *SrcExpr,
                                            QualType DestType, bool CStyle,
                                            const SourceRange &OpRange,
@@ -480,7 +481,7 @@ static TryCastResult TryStaticCast(Sema &Self, Expr *SrcExpr,
   // conversion. C++ 5.2.9p9 has additional information.
   // DR54's access restrictions apply here also.
   tcr = TryStaticMemberPointerUpcast(Self, SrcType, DestType, CStyle,
-                                     OpRange, msg);
+                                     OpRange, msg, Kind);
   if (tcr != TC_NotApplicable)
     return tcr;
 
@@ -706,7 +707,7 @@ TryStaticDowncast(Sema &Self, QualType SrcType, QualType DestType,
 TryCastResult
 TryStaticMemberPointerUpcast(Sema &Self, QualType SrcType, QualType DestType,
                              bool CStyle, const SourceRange &OpRange,
-                             unsigned &msg) {
+                             unsigned &msg, CastExpr::CastKind &Kind) {
   const MemberPointerType *DestMemPtr = DestType->getAs<MemberPointerType>();
   if (!DestMemPtr)
     return TC_NotApplicable;
@@ -760,6 +761,7 @@ TryStaticMemberPointerUpcast(Sema &Self, QualType SrcType, QualType DestType,
     return TC_Failed;
   }
 
+  Kind = CastExpr::CK_DerivedToBaseMemberPointer;
   return TC_Success;
 }