clang  3.9.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/Lex/Preprocessor.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, 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, 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, SourceRange OpRange, QualType OrigSrcType, QualType OrigDestType, unsigned &msg, CastKind &Kind, CXXCastPath &BasePath)
 TryStaticDowncast - Common functionality of TryStaticReferenceDowncast and TryStaticPointerDowncast. More...
 
static TryCastResult TryStaticMemberPointerUpcast (Sema &Self, ExprResult &SrcExpr, QualType SrcType, QualType DestType, bool CStyle, SourceRange OpRange, unsigned &msg, CastKind &Kind, CXXCastPath &BasePath)
 TryStaticMemberPointerUpcast - Tests whether a conversion according to C++ 5.2.9p9 is valid: More...
 
static TryCastResult TryStaticImplicitCast (Sema &Self, ExprResult &SrcExpr, QualType DestType, Sema::CheckedConversionKind CCK, SourceRange OpRange, unsigned &msg, CastKind &Kind, bool ListInitialization)
 TryStaticImplicitCast - Tests whether a conversion according to C++ 5.2.9p2 is valid: More...
 
static TryCastResult TryStaticCast (Sema &Self, ExprResult &SrcExpr, QualType DestType, Sema::CheckedConversionKind CCK, SourceRange OpRange, unsigned &msg, CastKind &Kind, CXXCastPath &BasePath, bool ListInitialization)
 TryStaticCast - Check if a static cast can be performed, and do so if possible. More...
 
static TryCastResult TryConstCast (Sema &Self, ExprResult &SrcExpr, QualType DestType, bool CStyle, unsigned &msg)
 TryConstCast - See if a const_cast from source to destination is allowed, and perform it if it is. More...
 
static TryCastResult TryReinterpretCast (Sema &Self, ExprResult &SrcExpr, QualType DestType, bool CStyle, SourceRange OpRange, unsigned &msg, CastKind &Kind)
 
static bool tryDiagnoseOverloadedCast (Sema &S, CastType CT, SourceRange range, Expr *src, QualType destType, bool listInitialization)
 Try to diagnose a failed overloaded cast. More...
 
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)
 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). More...
 
static bool CastsAwayConstness (Sema &Self, QualType SrcType, QualType DestType, bool CheckCVR, bool CheckObjCLifetime, QualType *TheOffendingSrcType=nullptr, QualType *TheOffendingDestType=nullptr, Qualifiers *CastAwayQualifiers=nullptr)
 CastsAwayConstness - Check if the pointer conversion from SrcType to DestType casts away constness as defined in C++ 5.2.11p8ff. More...
 
static void DiagnoseReinterpretUpDownCast (Sema &Self, const Expr *SrcExpr, QualType DestType, SourceRange OpRange)
 Check that a reinterpret_cast<DestType>(SrcExpr) is not used as upcast or downcast between respective pointers or references. More...
 
static void DiagnoseCastOfObjCSEL (Sema &Self, const ExprResult &SrcExpr, QualType DestType)
 
static void DiagnoseCallingConvCast (Sema &Self, const ExprResult &SrcExpr, QualType DstType, SourceRange OpRange)
 Diagnose casts that change the calling convention of a pointer to a function defined in the current TU. More...
 
static void checkIntToPointerCast (bool CStyle, SourceLocation Loc, const Expr *SrcExpr, QualType DestType, Sema &Self)
 
static bool fixOverloadedReinterpretCastExpr (Sema &Self, QualType DestType, ExprResult &Result)
 
static void DiagnoseBadFunctionCast (Sema &Self, const ExprResult &SrcExpr, QualType DestType)
 DiagnoseBadFunctionCast - Warn whenever a function call is cast to a non-matching type. More...
 

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 40 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 33 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 487 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 DiagnoseCallingConvCast ( Sema Self,
const ExprResult SrcExpr,
QualType  DstType,
SourceRange  OpRange 
)
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 bool fixOverloadedReinterpretCastExpr ( Sema Self,
QualType  DestType,
ExprResult Result 
)
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,
SourceRange  OpRange,
unsigned msg,
CastKind Kind 
)
static
static TryCastResult TryStaticCast ( Sema Self,
ExprResult SrcExpr,
QualType  DestType,
Sema::CheckedConversionKind  CCK,
SourceRange  OpRange,
unsigned msg,
CastKind Kind,
CXXCastPath BasePath,
bool  ListInitialization 
)
static
TryCastResult TryStaticDowncast ( Sema Self,
CanQualType  SrcType,
CanQualType  DestType,
bool  CStyle,
SourceRange  OpRange,
QualType  OrigSrcType,
QualType  OrigDestType,
unsigned msg,
CastKind Kind,
CXXCastPath BasePath 
)
static
TryCastResult TryStaticImplicitCast ( Sema Self,
ExprResult SrcExpr,
QualType  DestType,
Sema::CheckedConversionKind  CCK,
SourceRange  OpRange,
unsigned msg,
CastKind Kind,
bool  ListInitialization 
)
static
TryCastResult TryStaticMemberPointerUpcast ( Sema Self,
ExprResult SrcExpr,
QualType  SrcType,
QualType  DestType,
bool  CStyle,
SourceRange  OpRange,
unsigned msg,
CastKind Kind,
CXXCastPath BasePath 
)
static
TryCastResult TryStaticPointerDowncast ( Sema Self,
QualType  SrcType,
QualType  DestType,
bool  CStyle,
SourceRange  OpRange,
unsigned msg,
CastKind Kind,
CXXCastPath BasePath 
)
static

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

Definition at line 1227 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,
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 427 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().