From 714179b179a31a0c3769a968ee18ba87b901b13f Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Sun, 2 Aug 2009 19:07:59 +0000 Subject: [PATCH] Use the correct cast kind for dynamic_cast. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77905 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/Expr.h | 5 ++++- lib/Sema/SemaCXXCast.cpp | 19 +++++++++++-------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h index 29c2386a2f..3cec4e8aaf 100644 --- a/include/clang/AST/Expr.h +++ b/include/clang/AST/Expr.h @@ -1170,7 +1170,10 @@ public: CK_NoOp, /// CK_DerivedToBase - Derived to base class casts. - CK_DerivedToBase + CK_DerivedToBase, + + /// CK_Dynamic - Dynamic cast. + CK_Dynamic }; private: diff --git a/lib/Sema/SemaCXXCast.cpp b/lib/Sema/SemaCXXCast.cpp index afe539cd46..254af54171 100644 --- a/lib/Sema/SemaCXXCast.cpp +++ b/lib/Sema/SemaCXXCast.cpp @@ -45,7 +45,8 @@ static void CheckStaticCast(Sema &Self, Expr *&SrcExpr, QualType DestType, const SourceRange &OpRange); static void CheckDynamicCast(Sema &Self, Expr *&SrcExpr, QualType DestType, const SourceRange &OpRange, - const SourceRange &DestRange); + const SourceRange &DestRange, + CastExpr::CastKind &Kind); static bool CastsAwayConstness(Sema &Self, QualType SrcType, QualType DestType); @@ -119,13 +120,13 @@ Sema::ActOnCXXNamedCast(SourceLocation OpLoc, tok::TokenKind Kind, return Owned(new (Context) CXXConstCastExpr(DestType.getNonReferenceType(), Ex, DestType, OpLoc)); - case tok::kw_dynamic_cast: + case tok::kw_dynamic_cast: { + CastExpr::CastKind Kind = CastExpr::CK_Unknown; if (!TypeDependent) - CheckDynamicCast(*this, Ex, DestType, OpRange, DestRange); + CheckDynamicCast(*this, Ex, DestType, OpRange, DestRange, Kind); return Owned(new (Context)CXXDynamicCastExpr(DestType.getNonReferenceType(), - CastExpr::CK_Unknown, Ex, - DestType, OpLoc)); - + Kind, Ex, DestType, OpLoc)); + } case tok::kw_reinterpret_cast: if (!TypeDependent) CheckReinterpretCast(*this, Ex, DestType, OpRange, DestRange); @@ -192,10 +193,10 @@ CastsAwayConstness(Sema &Self, QualType SrcType, QualType DestType) /// CheckDynamicCast - Check that a dynamic_cast\(SrcExpr) is valid. /// Refer to C++ 5.2.7 for details. Dynamic casts are used mostly for runtime- /// checked downcasts in class hierarchies. -void +static void CheckDynamicCast(Sema &Self, Expr *&SrcExpr, QualType DestType, const SourceRange &OpRange, - const SourceRange &DestRange) + const SourceRange &DestRange, CastExpr::CastKind &Kind) { QualType OrigDestType = DestType, OrigSrcType = SrcExpr->getType(); DestType = Self.Context.getCanonicalType(DestType); @@ -292,6 +293,7 @@ CheckDynamicCast(Sema &Self, Expr *&SrcExpr, QualType DestType, if (DestRecord && Self.IsDerivedFrom(SrcPointee, DestPointee)) { Self.CheckDerivedToBaseConversion(SrcPointee, DestPointee, OpRange.getBegin(), OpRange); + Kind = CastExpr::CK_DerivedToBase; // Diagnostic already emitted on error. return; } @@ -305,6 +307,7 @@ CheckDynamicCast(Sema &Self, Expr *&SrcExpr, QualType DestType, } // Done. Everything else is run-time checks. + Kind = CastExpr::CK_Dynamic; } /// CheckConstCast - Check that a const_cast\(SrcExpr) is valid. -- 2.40.0