clang  3.7.0
Enumerations | Functions
SemaCast.cpp File Reference
#include "clang/Sema/SemaInternal.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/CXXInheritance.h"
#include "clang/AST/ExprCXX.h"
#include "clang/AST/ExprObjC.h"
#include "clang/AST/RecordLayout.h"
#include "clang/Basic/PartialDiagnostic.h"
#include "clang/Basic/TargetInfo.h"
#include "clang/Sema/Initialization.h"
#include "llvm/ADT/SmallVector.h"
#include <set>
Include dependency graph for SemaCast.cpp:

Go to the source code of this file.

Enumerations

enum  TryCastResult { TC_NotApplicable, TC_Success, TC_Failed }
 
enum  CastType {
  CT_Const, CT_Static, CT_Reinterpret, CT_Dynamic,
  CT_CStyle, CT_Functional
}
 

Functions

static TryCastResult TryLValueToRValueCast (Sema &Self, Expr *SrcExpr, QualType DestType, bool CStyle, CastKind &Kind, CXXCastPath &BasePath, unsigned &msg)
 Tests whether a conversion according to N2844 is valid. More...
 
static TryCastResult TryStaticReferenceDowncast (Sema &Self, Expr *SrcExpr, QualType DestType, bool CStyle, const SourceRange &OpRange, unsigned &msg, CastKind &Kind, CXXCastPath &BasePath)
 Tests whether a conversion according to C++ 5.2.9p5 is valid. More...
 
static TryCastResult TryStaticPointerDowncast (Sema &Self, QualType SrcType, QualType DestType, bool CStyle, const SourceRange &OpRange, unsigned &msg, CastKind &Kind, CXXCastPath &BasePath)
 Tests whether a conversion according to C++ 5.2.9p8 is valid. More...
 
static TryCastResult TryStaticDowncast (Sema &Self, CanQualType SrcType, CanQualType DestType, bool CStyle, const SourceRange &OpRange, QualType OrigSrcType, QualType OrigDestType, unsigned &msg, CastKind &Kind, CXXCastPath &BasePath)
 
static TryCastResult TryStaticMemberPointerUpcast (Sema &Self, ExprResult &SrcExpr, QualType SrcType, QualType DestType, bool CStyle, const SourceRange &OpRange, unsigned &msg, CastKind &Kind, CXXCastPath &BasePath)
 
static TryCastResult TryStaticImplicitCast (Sema &Self, ExprResult &SrcExpr, QualType DestType, Sema::CheckedConversionKind CCK, const SourceRange &OpRange, unsigned &msg, CastKind &Kind, bool ListInitialization)
 
static TryCastResult TryStaticCast (Sema &Self, ExprResult &SrcExpr, QualType DestType, Sema::CheckedConversionKind CCK, const SourceRange &OpRange, unsigned &msg, CastKind &Kind, CXXCastPath &BasePath, bool ListInitialization)
 
static TryCastResult TryConstCast (Sema &Self, ExprResult &SrcExpr, QualType DestType, bool CStyle, unsigned &msg)
 
static TryCastResult TryReinterpretCast (Sema &Self, ExprResult &SrcExpr, QualType DestType, bool CStyle, const SourceRange &OpRange, unsigned &msg, CastKind &Kind)
 
static bool tryDiagnoseOverloadedCast (Sema &S, CastType CT, SourceRange range, Expr *src, QualType destType, bool listInitialization)
 
static void diagnoseBadCast (Sema &S, unsigned msg, CastType castType, SourceRange opRange, Expr *src, QualType destType, bool listInitialization)
 Diagnose a failed cast. More...
 
static bool UnwrapDissimilarPointerTypes (QualType &T1, QualType &T2)
 
static bool CastsAwayConstness (Sema &Self, QualType SrcType, QualType DestType, bool CheckCVR, bool CheckObjCLifetime, QualType *TheOffendingSrcType=nullptr, QualType *TheOffendingDestType=nullptr, Qualifiers *CastAwayQualifiers=nullptr)
 
static void DiagnoseReinterpretUpDownCast (Sema &Self, const Expr *SrcExpr, QualType DestType, SourceRange OpRange)
 
static void DiagnoseCastOfObjCSEL (Sema &Self, const ExprResult &SrcExpr, QualType DestType)
 
static void checkIntToPointerCast (bool CStyle, SourceLocation Loc, const Expr *SrcExpr, QualType DestType, Sema &Self)
 
static void DiagnoseBadFunctionCast (Sema &Self, const ExprResult &SrcExpr, QualType DestType)
 

Enumeration Type Documentation

enum CastType
Enumerator
CT_Const 

const_cast

CT_Static 

static_cast

CT_Reinterpret 

reinterpret_cast

CT_Dynamic 

dynamic_cast

CT_CStyle 

(Type)expr

CT_Functional 

Type(expr)

Definition at line 39 of file SemaCast.cpp.

Enumerator
TC_NotApplicable 

The cast method is not applicable.

TC_Success 

The cast method is appropriate and successful.

TC_Failed 

The cast method is appropriate, but failed. A diagnostic has been emitted.

Definition at line 32 of file SemaCast.cpp.

Function Documentation

static bool CastsAwayConstness ( Sema Self,
QualType  SrcType,
QualType  DestType,
bool  CheckCVR,
bool  CheckObjCLifetime,
QualType TheOffendingSrcType = nullptr,
QualType TheOffendingDestType = nullptr,
Qualifiers CastAwayQualifiers = nullptr 
)
static

CastsAwayConstness - Check if the pointer conversion from SrcType to DestType casts away constness as defined in C++ 5.2.11p8ff. This is used by the cast checkers. Both arguments must denote pointer (possibly to member) types.

Parameters
CheckCVRWhether to check for const/volatile/restrict qualifiers.
CheckObjCLifetimeWhether to check Objective-C lifetime qualifiers.

Definition at line 486 of file SemaCast.cpp.

References clang::Qualifiers::compatiblyIncludesObjCLifetime(), clang::Sema::Context, Context, clang::ASTContext::getCanonicalType(), clang::Qualifiers::getCVRQualifiers(), clang::ASTContext::getLangOpts(), clang::ASTContext::getPointerType(), clang::ASTContext::getQualifiedType(), clang::ASTContext::getUnqualifiedArrayType(), clang::Type::isAnyPointerType(), clang::Type::isBlockPointerType(), clang::Type::isMemberPointerType(), clang::Sema::IsQualificationConversion(), clang::Qualifiers::setCVRQualifiers(), UnwrapDissimilarPointerTypes(), and clang::ASTContext::VoidTy.

Referenced by TryReinterpretCast().

static void checkIntToPointerCast ( bool  CStyle,
SourceLocation  Loc,
const Expr SrcExpr,
QualType  DestType,
Sema Self 
)
static
static void diagnoseBadCast ( Sema S,
unsigned  msg,
CastType  castType,
SourceRange  opRange,
Expr src,
QualType  destType,
bool  listInitialization 
)
static
static void DiagnoseBadFunctionCast ( Sema Self,
const ExprResult SrcExpr,
QualType  DestType 
)
static
static void DiagnoseCastOfObjCSEL ( Sema Self,
const ExprResult SrcExpr,
QualType  DestType 
)
static
static void DiagnoseReinterpretUpDownCast ( Sema Self,
const Expr SrcExpr,
QualType  DestType,
SourceRange  OpRange 
)
static
static TryCastResult TryConstCast ( Sema Self,
ExprResult SrcExpr,
QualType  DestType,
bool  CStyle,
unsigned msg 
)
static
static bool tryDiagnoseOverloadedCast ( Sema S,
CastType  CT,
SourceRange  range,
Expr src,
QualType  destType,
bool  listInitialization 
)
static
TryCastResult TryLValueToRValueCast ( Sema Self,
Expr SrcExpr,
QualType  DestType,
bool  CStyle,
CastKind Kind,
CXXCastPath BasePath,
unsigned msg 
)
static
static TryCastResult TryReinterpretCast ( Sema Self,
ExprResult SrcExpr,
QualType  DestType,
bool  CStyle,
const SourceRange OpRange,
unsigned msg,
CastKind Kind 
)
static

Definition at line 1751 of file SemaCast.cpp.

References CastsAwayConstness(), clang::Sema::CheckCompatibleReinterpretCast(), checkIntToPointerCast(), clang::CK_AnyPointerToBlockPointerCast, clang::CK_BitCast, clang::CK_IntegralToPointer, clang::CK_LValueBitCast, clang::CK_NoOp, clang::CK_PointerToIntegral, clang::CK_ReinterpretMemberPointer, clang::Sema::Context, clang::Sema::Diag(), DiagnoseCastOfObjCSEL(), clang::ExprError(), clang::ActionResult< PtrTy, CompressInvalid >::get(), clang::Type::getAs(), clang::SourceRange::getBegin(), clang::ASTContext::getCanonicalType(), clang::TargetInfo::getCXXABI(), clang::Sema::getLangOpts(), clang::ASTContext::getPointerType(), clang::ASTContext::getTargetInfo(), clang::ASTContext::getTypeSize(), clang::Expr::getValueKindForType(), clang::Type::isAnyPointerType(), clang::Type::isBlockPointerType(), clang::Type::isBooleanType(), clang::Type::isFunctionPointerType(), clang::Type::isIntegralOrEnumerationType(), clang::Type::isIntegralType(), clang::MemberPointerType::isMemberFunctionPointer(), clang::Type::isMemberPointerType(), clang::TargetCXXABI::isMicrosoft(), clang::Type::isNullPtrType(), clang::Type::isObjCObjectPointerType(), clang::ActionResult< PtrTy, CompressInvalid >::isUsable(), clang::Type::isVectorType(), clang::OK_BitField, clang::OK_ObjCProperty, clang::OK_ObjCSubscript, clang::OK_Ordinary, clang::OK_VectorComponent, clang::ASTContext::OverloadTy, clang::Sema::PrepareCastToObjCObjectPointer(), clang::Sema::RequireCompleteType(), clang::Sema::ResolveAndFixSingleFunctionTemplateSpecialization(), clang::Result, TC_Failed, TC_NotApplicable, TC_Success, and clang::VK_RValue.

static TryCastResult TryStaticCast ( Sema Self,
ExprResult SrcExpr,
QualType  DestType,
Sema::CheckedConversionKind  CCK,
const SourceRange OpRange,
unsigned msg,
CastKind Kind,
CXXCastPath BasePath,
bool  ListInitialization 
)
static

TryStaticCast - Check if a static cast can be performed, and do so if possible. If CStyle, ignore access restrictions on hierarchy casting and casting away constness.

Definition at line 943 of file SemaCast.cpp.

References clang::Sema::CCK_CStyleCast, clang::Sema::CCK_FunctionalCast, clang::Sema::CheckTollFreeBridgeStaticCast(), clang::CK_AnyPointerToBlockPointerCast, clang::CK_BitCast, clang::CK_CPointerToObjCPointerCast, clang::CK_FloatingToIntegral, clang::CK_IntegralCast, clang::CK_IntegralToBoolean, clang::CK_IntegralToFloating, clang::Qualifiers::compatiblyIncludes(), clang::Sema::Context, clang::Sema::Diag(), clang::ActionResult< PtrTy, CompressInvalid >::get(), clang::Type::getAs(), clang::ASTContext::getCanonicalType(), clang::Sema::getLangOpts(), clang::Type::getPointeeType(), clang::PointerType::getPointeeType(), clang::QualType::getQualifiers(), clang::Type::isBlockPointerType(), clang::Type::isBooleanType(), clang::Type::isEnumeralType(), clang::Type::isFunctionType(), clang::Type::isIncompleteOrObjectType(), clang::Type::isIntegralOrEnumerationType(), clang::Type::isIntegralType(), clang::ActionResult< PtrTy, CompressInvalid >::isInvalid(), clang::Type::isObjCObjectPointerType(), clang::Type::isRealFloatingType(), clang::Type::isVoidType(), clang::Qualifiers::removeObjCGCAttr(), clang::Qualifiers::removeObjCLifetime(), TC_Failed, TC_NotApplicable, TC_Success, TryLValueToRValueCast(), TryStaticImplicitCast(), TryStaticMemberPointerUpcast(), TryStaticPointerDowncast(), and TryStaticReferenceDowncast().

TryCastResult TryStaticDowncast ( Sema Self,
CanQualType  SrcType,
CanQualType  DestType,
bool  CStyle,
const SourceRange OpRange,
QualType  OrigSrcType,
QualType  OrigDestType,
unsigned msg,
CastKind Kind,
CXXCastPath BasePath 
)
static
TryCastResult TryStaticImplicitCast ( Sema Self,
ExprResult SrcExpr,
QualType  DestType,
Sema::CheckedConversionKind  CCK,
const SourceRange OpRange,
unsigned msg,
CastKind Kind,
bool  ListInitialization 
)
static
TryCastResult TryStaticMemberPointerUpcast ( Sema Self,
ExprResult SrcExpr,
QualType  SrcType,
QualType  DestType,
bool  CStyle,
const SourceRange OpRange,
unsigned msg,
CastKind Kind,
CXXCastPath BasePath 
)
static
TryCastResult TryStaticPointerDowncast ( Sema Self,
QualType  SrcType,
QualType  DestType,
bool  CStyle,
const SourceRange OpRange,
unsigned msg,
CastKind Kind,
CXXCastPath BasePath 
)
static

Tests whether a conversion according to C++ 5.2.9p8 is valid.

Definition at line 1224 of file SemaCast.cpp.

References clang::Sema::Context, clang::Type::getAs(), clang::ASTContext::getCanonicalType(), clang::PointerType::getPointeeType(), TC_NotApplicable, and TryStaticDowncast().

Referenced by TryStaticCast().

TryCastResult TryStaticReferenceDowncast ( Sema Self,
Expr SrcExpr,
QualType  DestType,
bool  CStyle,
const SourceRange OpRange,
unsigned msg,
CastKind Kind,
CXXCastPath BasePath 
)
static
static bool UnwrapDissimilarPointerTypes ( QualType T1,
QualType T2 
)
static

UnwrapDissimilarPointerTypes - Like Sema::UnwrapSimilarPointerTypes, this removes one level of indirection from both types, provided that they're the same kind of pointer (plain or to-member). Unlike the Sema function, this one doesn't care if the two pointers-to-member don't point into the same class. This is because CastsAwayConstness doesn't care.

Definition at line 426 of file SemaCast.cpp.

References clang::Type::getAs(), clang::Type::getPointeeType(), clang::PointerType::getPointeeType(), clang::BlockPointerType::getPointeeType(), clang::MemberPointerType::getPointeeType(), and clang::ObjCObjectPointerType::getPointeeType().

Referenced by CastsAwayConstness().