diff options
author | Anders Carlsson <andersca@mac.com> | 2009-08-02 19:07:59 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-08-02 19:07:59 +0000 |
commit | 4ab4f7f41649518a684ef340ccd77874fb56bc6e (patch) | |
tree | 452a1f4ddc84ae171e26424d122ce70eca2eab75 /clang | |
parent | 5d52bfbbc98aa9074382870e8bca71d687c0fc8a (diff) | |
download | bcm5719-llvm-4ab4f7f41649518a684ef340ccd77874fb56bc6e.tar.gz bcm5719-llvm-4ab4f7f41649518a684ef340ccd77874fb56bc6e.zip |
Use the correct cast kind for dynamic_cast.
llvm-svn: 77905
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/AST/Expr.h | 5 | ||||
-rw-r--r-- | clang/lib/Sema/SemaCXXCast.cpp | 19 |
2 files changed, 15 insertions, 9 deletions
diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h index 29c2386a2f3..3cec4e8aaf5 100644 --- a/clang/include/clang/AST/Expr.h +++ b/clang/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/clang/lib/Sema/SemaCXXCast.cpp b/clang/lib/Sema/SemaCXXCast.cpp index afe539cd465..254af541710 100644 --- a/clang/lib/Sema/SemaCXXCast.cpp +++ b/clang/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\<DestType\>(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\<DestType\>(SrcExpr) is valid. |