27 #include "llvm/ADT/SmallVector.h" 29 using namespace clang;
56 struct CastOperation {
58 : Self(S), SrcExpr(src), DestType(destType),
61 Kind(CK_Dependent), IsARCUnbridgedCast(
false) {
64 src.
get()->getType()->getAsPlaceholderType()) {
65 PlaceholderKind = placeholder->getKind();
79 bool IsARCUnbridgedCast;
85 void CheckConstCast();
86 void CheckReinterpretCast();
87 void CheckStaticCast();
88 void CheckDynamicCast();
89 void CheckCXXCStyleCast(
bool FunctionalCast,
bool ListInitialization);
90 void CheckCStyleCast();
92 void updatePartOfExplicitCastFlags(
CastExpr *CE) {
97 ICE->setIsPartOfExplicitCast(
true);
105 if (IsARCUnbridgedCast) {
108 CK_Dependent, castExpr,
nullptr,
111 updatePartOfExplicitCastFlags(castExpr);
121 if (PlaceholderKind != K)
return false;
127 bool isPlaceholder()
const {
128 return PlaceholderKind != 0;
131 return PlaceholderKind == K;
134 void checkCastAlign() {
144 IsARCUnbridgedCast =
true;
149 void checkNonOverloadPlaceholders() {
150 if (!isPlaceholder() || isPlaceholder(BuiltinType::Overload))
196 QualType OrigDestType,
unsigned &msg,
212 bool ListInitialization);
219 bool ListInitialization);
244 if (getLangOpts().CPlusPlus) {
246 CheckExtraCXXDefaultArguments(D);
249 return BuildCXXNamedCast(OpLoc, Kind, TInfo, E,
265 CastOperation Op(*
this, DestType, E);
267 Op.DestRange = AngleBrackets;
270 default: llvm_unreachable(
"Unknown C++ cast!");
272 case tok::kw_const_cast:
273 if (!TypeDependent) {
275 if (Op.SrcExpr.isInvalid())
277 DiscardMisalignedMemberAddress(DestType.
getTypePtr(), E);
280 Op.ValueKind, Op.SrcExpr.get(), DestTInfo,
284 case tok::kw_dynamic_cast: {
286 if (getLangOpts().OpenCLCPlusPlus) {
287 return ExprError(
Diag(OpLoc, diag::err_openclcxx_not_supported)
291 if (!TypeDependent) {
292 Op.CheckDynamicCast();
293 if (Op.SrcExpr.isInvalid())
297 Op.ValueKind, Op.Kind, Op.SrcExpr.get(),
298 &Op.BasePath, DestTInfo,
302 case tok::kw_reinterpret_cast: {
303 if (!TypeDependent) {
304 Op.CheckReinterpretCast();
305 if (Op.SrcExpr.isInvalid())
307 DiscardMisalignedMemberAddress(DestType.
getTypePtr(), E);
310 Op.ValueKind, Op.Kind, Op.SrcExpr.get(),
311 nullptr, DestTInfo, OpLoc,
315 case tok::kw_static_cast: {
316 if (!TypeDependent) {
317 Op.CheckStaticCast();
318 if (Op.SrcExpr.isInvalid())
320 DiscardMisalignedMemberAddress(DestType.
getTypePtr(), E);
324 Op.ValueKind, Op.Kind, Op.SrcExpr.get(),
325 &Op.BasePath, DestTInfo,
337 bool listInitialization) {
359 range, listInitialization)
365 assert(sequence.
Failed() &&
"initialization succeeded on second try?");
367 default:
return false;
380 case OR_Success: llvm_unreachable(
"successful failed overload");
382 if (candidates.
empty())
383 msg = diag::err_ovl_no_conversion_in_cast;
385 msg = diag::err_ovl_no_viable_conversion_in_cast;
390 msg = diag::err_ovl_ambiguous_conversion_in_cast;
395 msg = diag::err_ovl_deleted_conversion_in_cast;
401 << CT << srcType << destType
412 bool listInitialization) {
413 if (msg == diag::err_bad_cxx_cast_generic &&
422 int DifferentPtrness = 0;
433 if (!DifferentPtrness) {
436 if (RecFrom && RecTo) {
438 if (!DeclFrom->isCompleteDefinition())
439 S.
Diag(DeclFrom->getLocation(), diag::note_type_incomplete)
440 << DeclFrom->getDeclName();
442 if (!DeclTo->isCompleteDefinition())
443 S.
Diag(DeclTo->getLocation(), diag::note_type_incomplete)
444 << DeclTo->getDeclName();
459 CACK_SimilarKind = 2,
480 enum {
None, Ptr, MemPtr, BlockPtr, Array };
482 if (T->isAnyPointerType())
return Ptr;
483 if (T->isMemberPointerType())
return MemPtr;
484 if (T->isBlockPointerType())
return BlockPtr;
487 if (T->isConstantArrayType() || T->isIncompleteArrayType())
return Array;
493 return AT->getElementType();
494 return T->getPointeeType();
505 Kind = CastAwayConstnessKind::CACK_Similar;
507 Kind = CastAwayConstnessKind::CACK_Similar;
510 int T1Class = Classify(T1);
512 return CastAwayConstnessKind::CACK_None;
514 int T2Class = Classify(T2);
516 return CastAwayConstnessKind::CACK_None;
520 Kind = T1Class == T2Class ? CastAwayConstnessKind::CACK_SimilarKind
521 : CastAwayConstnessKind::CACK_Incoherent;
531 if (Classify(T1) != Array)
534 auto T2Class = Classify(T2);
538 if (T2Class != Array)
539 Kind = CastAwayConstnessKind::CACK_Incoherent;
540 else if (Kind != CastAwayConstnessKind::CACK_Incoherent)
541 Kind = CastAwayConstnessKind::CACK_SimilarKind;
558 bool CheckCVR,
bool CheckObjCLifetime,
559 QualType *TheOffendingSrcType =
nullptr,
560 QualType *TheOffendingDestType =
nullptr,
565 return CastAwayConstnessKind::CACK_None;
570 "Source type is not pointer or pointer to member.");
573 "Destination type is not pointer or pointer to member.");
582 QualType PrevUnwrappedSrcType = UnwrappedSrcType;
583 QualType PrevUnwrappedDestType = UnwrappedDestType;
584 auto WorstKind = CastAwayConstnessKind::CACK_Similar;
585 bool AllConstSoFar =
true;
587 Self.
Context, UnwrappedSrcType, UnwrappedDestType)) {
590 if (
Kind > WorstKind)
602 UnwrappedDestType->isObjCObjectType())
611 if (SrcCvrQuals != DestCvrQuals) {
612 if (CastAwayQualifiers)
613 *CastAwayQualifiers = SrcCvrQuals - DestCvrQuals;
616 if (!DestCvrQuals.compatiblyIncludes(SrcCvrQuals)) {
617 if (TheOffendingSrcType)
618 *TheOffendingSrcType = PrevUnwrappedSrcType;
619 if (TheOffendingDestType)
620 *TheOffendingDestType = PrevUnwrappedDestType;
631 if (CheckObjCLifetime &&
637 if (AllConstSoFar && !DestQuals.
hasConst()) {
638 AllConstSoFar =
false;
639 if (TheOffendingSrcType)
640 *TheOffendingSrcType = PrevUnwrappedSrcType;
641 if (TheOffendingDestType)
642 *TheOffendingDestType = PrevUnwrappedDestType;
645 PrevUnwrappedSrcType = UnwrappedSrcType;
646 PrevUnwrappedDestType = UnwrappedDestType;
649 return CastAwayConstnessKind::CACK_None;
655 case CastAwayConstnessKind::CACK_None:
656 llvm_unreachable(
"did not cast away constness");
658 case CastAwayConstnessKind::CACK_Similar:
660 case CastAwayConstnessKind::CACK_SimilarKind:
661 DiagID = diag::err_bad_cxx_cast_qualifiers_away;
664 case CastAwayConstnessKind::CACK_Incoherent:
665 DiagID = diag::ext_bad_cxx_cast_qualifiers_away_incoherent;
669 llvm_unreachable(
"unexpected cast away constness kind");
675 void CastOperation::CheckDynamicCast() {
678 else if (isPlaceholder())
697 Self.
Diag(OpRange.
getBegin(), diag::err_bad_dynamic_cast_not_ref_or_ptr)
698 << this->DestType << DestRange;
705 assert(DestPointer &&
"Reference to void is not possible");
706 }
else if (DestRecord) {
708 diag::err_bad_dynamic_cast_incomplete,
714 Self.
Diag(OpRange.
getBegin(), diag::err_bad_dynamic_cast_not_class)
730 Self.
Diag(OpRange.
getBegin(), diag::err_bad_dynamic_cast_not_ptr)
731 << OrigSrcType << SrcExpr.
get()->getSourceRange();
735 }
else if (DestReference->isLValueReferenceType()) {
736 if (!SrcExpr.
get()->isLValue()) {
737 Self.
Diag(OpRange.
getBegin(), diag::err_bad_cxx_cast_rvalue)
738 <<
CT_Dynamic << OrigSrcType << this->DestType << OpRange;
740 SrcPointee = SrcType;
744 if (SrcExpr.
get()->isRValue())
746 SrcType, SrcExpr.
get(),
false);
747 SrcPointee = SrcType;
753 diag::err_bad_dynamic_cast_incomplete,
759 Self.
Diag(OpRange.
getBegin(), diag::err_bad_dynamic_cast_not_class)
765 assert((DestPointer || DestReference) &&
766 "Bad destination non-ptr/ref slipped through.");
767 assert((DestRecord || DestPointee->
isVoidType()) &&
768 "Bad destination pointee slipped through.");
769 assert(SrcRecord &&
"Bad source pointee slipped through.");
773 Self.
Diag(OpRange.
getBegin(), diag::err_bad_cxx_cast_qualifiers_away)
774 <<
CT_Dynamic << OrigSrcType << this->DestType << OpRange;
781 if (DestRecord == SrcRecord) {
797 Kind = CK_DerivedToBase;
803 assert(SrcDecl &&
"Definition missing");
804 if (!cast<CXXRecordDecl>(SrcDecl)->isPolymorphic()) {
805 Self.
Diag(OpRange.
getBegin(), diag::err_bad_dynamic_cast_not_polymorphic)
814 Self.
Diag(OpRange.
getBegin(), diag::err_no_dynamic_cast_with_fno_rtti);
828 void CastOperation::CheckConstCast() {
831 else if (isPlaceholder())
836 unsigned msg = diag::err_bad_cxx_cast_generic;
837 auto TCR =
TryConstCast(Self, SrcExpr, DestType,
false, msg);
840 << SrcExpr.
get()->getType() << DestType << OpRange;
877 ReinterpretKind = ReinterpretUpcast;
879 ReinterpretKind = ReinterpretDowncast;
883 bool VirtualBase =
true;
884 bool NonZeroOffset =
false;
890 bool IsVirtual =
false;
891 for (CXXBasePath::const_iterator IElem = Path.begin(), EElem = Path.end();
892 IElem != EElem; ++IElem) {
893 IsVirtual = IElem->Base->isVirtual();
896 const CXXRecordDecl *BaseRD = IElem->Base->getType()->getAsCXXRecordDecl();
897 assert(BaseRD &&
"Base type should be a valid unqualified class type");
903 !ClassDefinition->isCompleteDefinition())
916 NonZeroOffset =
true;
918 VirtualBase = VirtualBase && IsVirtual;
921 (void) NonZeroOffset;
922 assert((VirtualBase || NonZeroOffset) &&
923 "Should have returned if has non-virtual base with zero offset");
926 ReinterpretKind == ReinterpretUpcast? DestType : SrcType;
928 ReinterpretKind == ReinterpretUpcast? SrcType : DestType;
931 Self.
Diag(BeginLoc, diag::warn_reinterpret_different_from_static)
932 << DerivedType << BaseType << !VirtualBase << int(ReinterpretKind)
934 Self.
Diag(BeginLoc, diag::note_reinterpret_updowncast_use_static)
935 << int(ReinterpretKind)
944 void CastOperation::CheckReinterpretCast() {
945 if (ValueKind ==
VK_RValue && !isPlaceholder(BuiltinType::Overload))
948 checkNonOverloadPlaceholders();
952 unsigned msg = diag::err_bad_cxx_cast_generic;
955 false, OpRange, msg,
Kind);
961 Self.
Diag(OpRange.
getBegin(), diag::err_bad_reinterpret_cast_overload)
963 << DestType << OpRange;
985 void CastOperation::CheckStaticCast() {
986 if (isPlaceholder()) {
987 checkNonOverloadPlaceholders();
998 if (claimPlaceholder(BuiltinType::Overload)) {
1002 OpRange, DestType, diag::err_bad_static_cast_overload);
1012 !isPlaceholder(BuiltinType::Overload)) {
1018 unsigned msg = diag::err_bad_cxx_cast_generic;
1021 Kind, BasePath,
false);
1027 Self.
Diag(OpRange.
getBegin(), diag::err_bad_static_cast_overload)
1028 << oe->
getName() << DestType << OpRange
1038 if (
Kind == CK_BitCast)
1055 bool ListInitialization) {
1081 OpRange, msg,
Kind, BasePath);
1096 Kind, ListInitialization);
1116 if (Enum->getDecl()->isScoped()) {
1118 Kind = CK_IntegralToBoolean;
1121 Kind = CK_IntegralCast;
1124 Kind = CK_IntegralToFloating;
1140 Kind = CK_IntegralCast;
1143 Kind = CK_FloatingToIntegral;
1159 OpRange, msg, Kind, BasePath);
1182 if (DestPointeeQuals != SrcPointeeQuals &&
1184 msg = diag::err_bad_cxx_cast_qualifiers_away;
1196 Self.
Diag(OpRange.getBegin(), diag::ext_ms_cast_fn_obj) << OpRange;
1204 Kind = CK_CPointerToObjCPointerCast;
1209 Kind = CK_AnyPointerToBlockPointerCast;
1230 if (SrcPointer->getPointeeType()->getAs<
RecordType>() &&
1232 msg = diag::err_bad_cxx_cast_unrelated_class;
1257 bool ObjCConversion;
1258 bool ObjCLifetimeConversion;
1267 SrcExpr->
getLocStart(), ToType, FromType, DerivedToBase, ObjCConversion,
1268 ObjCLifetimeConversion);
1275 msg = SrcExpr->
isLValue() ? diag::err_bad_lvalue_to_rvalue_cast
1276 : diag::err_bad_rvalue_to_rvalue_cast;
1280 if (DerivedToBase) {
1281 Kind = CK_DerivedToBase;
1311 if (!DestReference) {
1315 if (!RValueRef && !SrcExpr->
isLValue()) {
1317 msg = diag::err_bad_cxx_cast_rvalue;
1354 msg = diag::err_bad_static_cast_pointer_nonpointer;
1361 CStyle, OpRange, SrcType, DestType, msg, Kind,
1371 QualType OrigDestType,
unsigned &msg,
1409 msg = diag::err_bad_cxx_cast_qualifiers_away;
1413 if (Paths.
isAmbiguous(SrcType.getUnqualifiedType())) {
1423 std::string PathDisplayStr;
1424 std::set<unsigned> DisplayedPaths;
1426 if (DisplayedPaths.insert(Path.back().SubobjectNumber).second) {
1429 PathDisplayStr +=
"\n ";
1431 PathDisplayStr += PE.Base->getType().getAsString() +
" -> ";
1436 Self.
Diag(OpRange.
getBegin(), diag::err_ambiguous_base_to_derived_cast)
1439 << PathDisplayStr << OpRange;
1446 Self.
Diag(OpRange.
getBegin(), diag::err_static_downcast_via_virtual)
1447 << OrigSrcType << OrigDestType << VirtualBase << OpRange;
1456 diag::err_downcast_from_inaccessible_base)) {
1469 Kind = CK_BaseToDerived;
1490 bool WasOverloadedFunction =
false;
1499 WasOverloadedFunction =
true;
1505 msg = diag::err_bad_static_cast_member_pointer_nonmp;
1532 Paths.setRecordingPaths(
true);
1538 Self.
Diag(OpRange.
getBegin(), diag::err_ambiguous_memptr_conv)
1539 << 1 << SrcClass << DestClass << PathDisplayStr << OpRange;
1544 if (
const RecordType *VBase = Paths.getDetectedVirtual()) {
1545 Self.
Diag(OpRange.
getBegin(), diag::err_memptr_conv_via_virtual)
1546 << SrcClass << DestClass <<
QualType(VBase, 0) << OpRange;
1553 DestClass, SrcClass,
1555 diag::err_upcast_to_inaccessible_base)) {
1569 if (WasOverloadedFunction) {
1589 Kind = CK_DerivedToBaseMemberPointer;
1605 diag::err_bad_dynamic_cast_incomplete) ||
1607 diag::err_allocation_of_abstract_type)) {
1621 Expr *SrcExprRaw = SrcExpr.
get();
1644 Kind = CK_ConstructorConversion;
1659 bool NeedToMaterializeTemporary =
false;
1673 if (isa<LValueReferenceType>(DestTypeTmp) && !SrcExpr.
get()->isLValue()) {
1677 msg = diag::err_bad_cxx_cast_rvalue;
1681 if (isa<RValueReferenceType>(DestTypeTmp) && SrcExpr.
get()->isRValue()) {
1685 msg = diag::err_bad_cxx_cast_rvalue;
1691 NeedToMaterializeTemporary =
true;
1699 if (SrcExpr.
get()->refersToBitField()) {
1700 msg = diag::err_bad_cxx_cast_bitfield;
1720 msg = diag::err_bad_const_cast_dest;
1729 msg = diag::err_bad_const_cast_dest;
1742 if (NeedToMaterializeTemporary)
1760 unsigned DiagID = IsDereference ?
1761 diag::warn_pointer_indirection_from_incompatible_type :
1762 diag::warn_undefined_reinterpret_cast;
1764 if (Diags.isIgnored(DiagID, Range.
getBegin()))
1768 if (IsDereference) {
1804 Diag(Range.
getBegin(), DiagID) << SrcType << DestType << Range;
1813 if (SrcPtrTy->isObjCSelType()) {
1815 if (isa<PointerType>(DestType))
1818 Self.
Diag(SrcExpr.
get()->getExprLoc(),
1819 diag::warn_cast_pointer_from_sel)
1820 << SrcType << DestType << SrcExpr.
get()->getSourceRange();
1834 const auto *SrcFTy =
1836 const auto *DstFTy =
1845 Expr *Src = SrcExpr.
get()->IgnoreParenImpCasts();
1846 if (
auto *UO = dyn_cast<UnaryOperator>(Src))
1847 if (UO->getOpcode() == UO_AddrOf)
1861 FD->isVariadic(), FD->isCXXInstanceMember());
1862 if (DstCC == DefaultCC || SrcCC != DefaultCC)
1868 Self.
Diag(OpRange.
getBegin(), diag::warn_cast_calling_conv)
1869 << SrcCCName << DstCCName << OpRange;
1881 SourceLocation NameLoc = FD->getFirstDecl()->getNameInfo().getLoc();
1885 llvm::raw_svector_ostream OS(CCAttrText);
1888 OS <<
"__" << DstCCName;
1895 OS <<
"__attribute__((" << DstCCName <<
"))";
1896 AttrTokens.push_back(tok::kw___attribute);
1897 AttrTokens.push_back(tok::l_paren);
1898 AttrTokens.push_back(tok::l_paren);
1903 AttrTokens.push_back(tok::r_paren);
1904 AttrTokens.push_back(tok::r_paren);
1907 if (!AttrSpelling.empty())
1908 CCAttrText = AttrSpelling;
1910 Self.
Diag(NameLoc, diag::note_change_calling_conv_fixit)
1934 diag::warn_int_to_void_pointer_cast
1935 : diag::warn_int_to_pointer_cast;
1936 Self.
Diag(Loc, Diag) << SrcType << DestType;
1978 bool IsLValueCast =
false;
1990 assert(FixedExpr.
isUsable() &&
"Invalid result fixing overloaded expr");
1991 SrcExpr = FixedExpr;
1992 SrcType = SrcExpr.get()->getType();
1996 if (!SrcExpr.
get()->isGLValue()) {
1999 msg = diag::err_bad_cxx_cast_rvalue;
2012 const char *inappropriate =
nullptr;
2013 switch (SrcExpr.
get()->getObjectKind()) {
2017 msg = diag::err_bad_cxx_cast_bitfield;
2022 case OK_ObjCSubscript: inappropriate =
"container subscripting expression";
2025 if (inappropriate) {
2026 Self.
Diag(OpRange.
getBegin(), diag::err_bad_reinterpret_cast_reference)
2027 << inappropriate << DestType
2028 << OpRange << SrcExpr.
get()->getSourceRange();
2037 IsLValueCast =
true;
2045 if (DestMemPtr && SrcMemPtr) {
2051 SrcMemPtr->isMemberFunctionPointer())
2064 msg = diag::err_bad_cxx_cast_member_pointer_size;
2078 assert(!IsLValueCast);
2079 Kind = CK_ReinterpretMemberPointer;
2091 msg = diag::err_bad_reinterpret_cast_small_int;
2094 Kind = CK_PointerToIntegral;
2102 if (srcIsVector || destIsVector) {
2119 msg = diag::err_bad_cxx_cast_vector_to_scalar_different_size;
2120 else if (!srcIsVector)
2121 msg = diag::err_bad_cxx_cast_scalar_to_vector_different_size;
2123 msg = diag::err_bad_cxx_cast_vector_to_vector_different_size;
2128 if (SrcType == DestType) {
2152 if (!destIsPtr && !srcIsPtr) {
2159 assert(srcIsPtr &&
"One type must be a pointer");
2163 bool MicrosoftException = Self.
getLangOpts().MicrosoftExt &&
2167 !MicrosoftException) {
2168 msg = diag::err_bad_reinterpret_cast_small_int;
2171 Kind = CK_PointerToIntegral;
2176 assert(destIsPtr &&
"One type must be a pointer");
2183 Kind = CK_IntegralToPointer;
2187 if (!destIsPtr || !srcIsPtr) {
2207 Kind = CK_LValueBitCast;
2212 Kind = CK_AnyPointerToBlockPointerCast;
2217 Kind = CK_AddressSpaceConversion;
2225 return SuccessResult;
2239 return SuccessResult;
2250 diag::warn_cxx98_compat_cast_fn_obj : diag::ext_cast_fn_obj)
2252 return SuccessResult;
2259 diag::warn_cxx98_compat_cast_fn_obj : diag::ext_cast_fn_obj)
2261 return SuccessResult;
2269 return SuccessResult;
2272 void CastOperation::CheckCXXCStyleCast(
bool FunctionalStyle,
2273 bool ListInitialization) {
2277 if (isPlaceholder()) {
2279 if (claimPlaceholder(BuiltinType::UnknownAny)) {
2282 ValueKind, BasePath);
2286 checkNonOverloadPlaceholders();
2297 if (claimPlaceholder(BuiltinType::Overload)) {
2300 true, DestRange, DestType,
2301 diag::err_bad_cstyle_cast_overload);
2312 SrcExpr.
get()->isValueDependent()) {
2313 assert(
Kind == CK_Dependent);
2318 !isPlaceholder(BuiltinType::Overload)) {
2327 && (SrcExpr.
get()->getType()->isIntegerType()
2328 || SrcExpr.
get()->getType()->isFloatingType())) {
2329 Kind = CK_VectorSplat;
2345 unsigned msg = diag::err_bad_cxx_cast_generic;
2359 msg,
Kind, BasePath, ListInitialization);
2366 OpRange, msg,
Kind);
2374 checkObjCConversion(CCK);
2388 Self.
Diag(OpRange.
getBegin(), diag::err_bad_cstyle_cast_overload)
2389 << OE->
getName() << DestType << OpRange
2395 OpRange, SrcExpr.
get(), DestType, ListInitialization);
2400 if (
Kind == CK_BitCast)
2413 SrcExpr.
get()->getExprLoc()))
2416 if (!isa<CallExpr>(SrcExpr.
get()))
2438 Self.
Diag(SrcExpr.
get()->getExprLoc(),
2439 diag::warn_bad_function_cast)
2440 << SrcType << DestType << SrcExpr.
get()->getSourceRange();
2444 void CastOperation::CheckCStyleCast() {
2448 if (claimPlaceholder(BuiltinType::UnknownAny)) {
2451 ValueKind, BasePath);
2472 SrcExpr.
get(), DestType,
true, DAP))
2479 if (SrcExpr.isInvalid())
2481 QualType SrcType = SrcExpr.get()->getType();
2492 diag::err_typecheck_incompatible_address_space)
2494 << SrcExpr.get()->getSourceRange();
2501 diag::err_typecheck_cast_to_incomplete)) {
2511 Self.
Diag(OpRange.
getBegin(), diag::ext_typecheck_cast_nonscalar)
2512 << DestType << SrcExpr.get()->getSourceRange();
2521 Self.
Diag(OpRange.
getBegin(), diag::ext_typecheck_cast_to_union)
2522 << SrcExpr.get()->getSourceRange();
2526 Self.
Diag(OpRange.
getBegin(), diag::err_typecheck_cast_to_union_no_type)
2527 << SrcType << SrcExpr.get()->getSourceRange();
2535 llvm::APSInt CastInt;
2536 if (SrcExpr.get()->EvaluateAsInt(CastInt, Self.
Context)) {
2538 Kind = CK_ZeroToOCLEvent;
2542 diag::err_opencl_cast_non_zero_to_event_t)
2543 << CastInt.toString(10) << SrcExpr.get()->getSourceRange();
2550 Self.
Diag(OpRange.
getBegin(), diag::err_typecheck_cond_expect_scalar)
2551 << DestType << SrcExpr.get()->getSourceRange();
2560 Self.
Diag(SrcExpr.get()->getExprLoc(),
2561 diag::err_typecheck_expect_scalar_operand)
2562 << SrcType << SrcExpr.get()->getSourceRange();
2575 Kind = CK_VectorSplat;
2594 if (isa<ObjCSelectorExpr>(SrcExpr.get())) {
2595 Self.
Diag(SrcExpr.get()->getExprLoc(), diag::err_cast_selector_expr);
2604 Self.
Diag(SrcExpr.get()->getExprLoc(),
2605 diag::err_cast_pointer_from_non_pointer_int)
2606 << SrcType << SrcExpr.get()->getSourceRange();
2615 Self.
Diag(SrcExpr.get()->getLocStart(),
2616 diag::err_cast_pointer_to_non_pointer_int)
2617 << DestType << SrcExpr.get()->getSourceRange();
2626 Self.
Diag(SrcExpr.get()->getLocStart(), diag::err_opencl_cast_to_half)
2627 << DestType << SrcExpr.get()->getSourceRange();
2636 if (SrcExpr.isInvalid())
2640 if (Self.
getLangOpts().ObjCAutoRefCount && CastPtr) {
2643 Qualifiers ExprQuals = ExprPtr->getPointeeType().getQualifiers();
2645 ExprPtr->getPointeeType()->isObjCLifetimeType() &&
2647 Self.
Diag(SrcExpr.get()->getLocStart(),
2648 diag::err_typecheck_incompatible_ownership)
2650 << SrcExpr.get()->getSourceRange();
2656 Self.
Diag(SrcExpr.get()->getLocStart(),
2657 diag::err_arc_convesion_of_weak_unavailable)
2658 << 1 << SrcType << DestType << SrcExpr.get()->getSourceRange();
2668 if (SrcExpr.isInvalid())
2671 if (
Kind == CK_BitCast)
2687 QualType TheOffendingSrcType, TheOffendingDestType;
2690 &TheOffendingSrcType, &TheOffendingDestType,
2691 &CastAwayQualifiers) !=
2692 CastAwayConstnessKind::CACK_Similar)
2696 int qualifiers = -1;
2699 }
else if (CastAwayQualifiers.
hasConst()) {
2705 if (qualifiers == -1)
2706 Self.
Diag(SrcExpr.
get()->getLocStart(), diag::warn_cast_qual2)
2707 << SrcType << DestType;
2709 Self.
Diag(SrcExpr.
get()->getLocStart(), diag::warn_cast_qual)
2710 << TheOffendingSrcType << TheOffendingDestType << qualifiers;
2717 CastOperation Op(*
this, CastTypeInfo->
getType(), CastExpr);
2721 if (getLangOpts().CPlusPlus) {
2722 Op.CheckCXXCStyleCast(
false,
2723 isa<InitListExpr>(CastExpr));
2725 Op.CheckCStyleCast();
2728 if (Op.SrcExpr.isInvalid())
2735 Op.ValueKind, Op.Kind, Op.SrcExpr.get(),
2736 &Op.BasePath, CastTypeInfo, LPLoc, RPLoc));
2744 assert(LPLoc.
isValid() &&
"List-initialization shouldn't get here.");
2745 CastOperation Op(*
this, Type, CastExpr);
2749 Op.CheckCXXCStyleCast(
true,
false);
2750 if (Op.SrcExpr.isInvalid())
2753 auto *SubExpr = Op.SrcExpr.
get();
2754 if (
auto *BindExpr = dyn_cast<CXXBindTemporaryExpr>(SubExpr))
2755 SubExpr = BindExpr->getSubExpr();
2756 if (
auto *ConstructExpr = dyn_cast<CXXConstructExpr>(SubExpr))
2757 ConstructExpr->setParenOrBraceRange(
SourceRange(LPLoc, RPLoc));
2760 Op.ValueKind, CastTypeInfo, Op.Kind,
2761 Op.SrcExpr.get(), &Op.BasePath, LPLoc, RPLoc));
Defines the clang::ASTContext interface.
bool RequireNonAbstractType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
Represents a function declaration or definition.
static bool IsAddressSpaceConversion(QualType SrcType, QualType DestType)
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
A (possibly-)qualified type.
bool isBlockPointerType() const
bool isMemberPointerType() const
IdentifierInfo * getIdentifierInfo(StringRef Name) const
Return information about the specified preprocessor identifier token.
A cast other than a C-style cast.
SourceRange getSourceRange() const LLVM_READONLY
Retrieve the source range covering the entirety of this nested-name-specifier.
const ASTRecordLayout & getASTRecordLayout(const RecordDecl *D) const
Get or compute information about the layout of the specified record (struct/union/class) D...
bool isArithmeticType() const
FunctionType - C99 6.7.5.3 - Function Declarators.
ARCConversionResult CheckObjCConversion(SourceRange castRange, QualType castType, Expr *&op, CheckedConversionKind CCK, bool Diagnose=true, bool DiagnoseCFAudited=false, BinaryOperatorKind Opc=BO_PtrMemD)
Checks for invalid conversions and casts between retainable pointers and other pointer kinds for ARC ...
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee...
CharUnits getBaseClassOffset(const CXXRecordDecl *Base) const
getBaseClassOffset - Get the offset, in chars, for the given base class.
static CXXDynamicCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind Kind, Expr *Op, const CXXCastPath *Path, TypeSourceInfo *Written, SourceLocation L, SourceLocation RParenLoc, SourceRange AngleBrackets)
bool isRealFloatingType() const
Floating point categories.
bool isRecordType() const
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
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.
bool isExtVectorType() const
The cast method is appropriate and successful.
FailureKind getFailureKind() const
Determine why initialization failed.
CanQualType ARCUnbridgedCastTy
The base class of the type hierarchy.
bool isDerivedFrom(const CXXRecordDecl *Base) const
Determine whether this class is derived from the class Base.
StringRef getLastMacroWithSpelling(SourceLocation Loc, ArrayRef< TokenValue > Tokens) const
Return the name of the macro defined before Loc that has spelling Tokens.
static ExprValueKind getValueKindForType(QualType T)
getValueKindForType - Given a formal return or parameter type, give its value kind.
Overloading for a user-defined conversion failed.
bool isZero() const
isZero - Test whether the quantity equals zero.
Ambiguous candidates found.
const TargetInfo & getTargetInfo() const
A container of type source information.
static CXXFunctionalCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, TypeSourceInfo *Written, CastKind Kind, Expr *Op, const CXXCastPath *Path, SourceLocation LPLoc, SourceLocation RPLoc)
Represents a path from a specific derived class (which is not represented as part of the path) to a p...
static InitializedEntity InitializeTemporary(QualType Type)
Create the initialization entity for a temporary.
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
bool isUnsignedIntegerType() const
Return true if this is an integer type that is unsigned, according to C99 6.2.5p6 [which returns true...
bool CheckVectorCast(SourceRange R, QualType VectorTy, QualType Ty, CastKind &Kind)
An Objective-C array/dictionary subscripting which reads an object or writes at the subscripted array...
Information about one declarator, including the parsed type information and the identifier.
void removeObjCLifetime()
DiagnosticsEngine & Diags
bool isEnumeralType() const
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 T...
const T * getAs() const
Member-template getAs<specific type>'.
void clear()
Clear the base-paths results.
CastAwayConstnessKind
The kind of unwrapping we did when determining whether a conversion casts away constness.
QualType getMemberPointerType(QualType T, const Type *Cls) const
Return the uniqued reference to the type for a member pointer to the specified type in the specified ...
DeclarationName getName() const
Gets the name looked up.
bool isInvalidDecl() const
OpenCLOptions & getOpenCLOptions()
Defines the clang::Expr interface and subclasses for C++ expressions.
The collection of all-type qualifiers we support.
bool isRecordingPaths() const
Whether we are recording paths.
bool UnwrapSimilarTypes(QualType &T1, QualType &T2)
Attempt to unwrap two types that may be similar (C++ [conv.qual]).
Expr * FixOverloadedFunctionReference(Expr *E, DeclAccessPair FoundDecl, FunctionDecl *Fn)
FixOverloadedFunctionReference - E is an expression that refers to a C++ overloaded function (possibl...
Represents a struct/union/class.
One of these records is kept for each identifier that is lexed.
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
void setRecordingPaths(bool RP)
Specify whether we should be recording paths or not.
A vector component is an element or range of elements on a vector.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
bool allowsNonTrivialObjCLifetimeQualifiers() const
True if any ObjC types may have non-trivial lifetime qualifiers.
bool isObjCLifetimeType() const
Returns true if objects of this type have lifetime semantics under ARC.
The cast method is not applicable.
RecordDecl * getDefinition() const
Returns the RecordDecl that actually defines this struct/union/class.
bool IsDerivedFrom(SourceLocation Loc, QualType Derived, QualType Base)
Determine whether the type Derived is a C++ class that is derived from the type Base.
static TryCastResult getCastAwayConstnessCastKind(CastAwayConstnessKind CACK, unsigned &DiagID)
bool isReferenceType() const
static CharUnits Zero()
Zero - Construct a CharUnits quantity of zero.
Ref_Incompatible - The two types are incompatible, so direct reference binding is not possible...
bool isAtLeastAsQualifiedAs(QualType Other) const
Determine whether this type is at least as qualified as the other given type, requiring exact equalit...
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
OverloadCandidateDisplayKind
An r-value expression (a pr-value in the C++11 taxonomy) produces a temporary value.
bool isInvalidType() const
static bool isValidCast(TryCastResult TCR)
bool isCompleteType(SourceLocation Loc, QualType T)
An rvalue reference type, per C++11 [dcl.ref].
tok::TokenKind getTokenID() const
If this is a source-language token (e.g.
CharUnits - This is an opaque type for sizes expressed in character units.
ReferenceCompareResult CompareReferenceRelationship(SourceLocation Loc, QualType T1, QualType T2, bool &DerivedToBase, bool &ObjCConversion, bool &ObjCLifetimeConversion)
CompareReferenceRelationship - Compare the two types T1 and T2 to determine whether they are referenc...
Succeeded, but refers to a deleted function.
Ref_Compatible - The two types are reference-compatible.
OverloadCandidateSet & getFailedCandidateSet()
Retrieve a reference to the candidate set when overload resolution fails.
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
const Type * getClass() const
bool isRValueReferenceType() const
CheckedConversionKind
The kind of conversion being performed.
static TryCastResult TryReinterpretCast(Sema &Self, ExprResult &SrcExpr, QualType DestType, bool CStyle, SourceRange OpRange, unsigned &msg, CastKind &Kind)
FunctionDecl * ResolveAddressOfOverloadedFunction(Expr *AddressOfExpr, QualType TargetType, bool Complain, DeclAccessPair &Found, bool *pHadMultipleCandidates=nullptr)
ResolveAddressOfOverloadedFunction - Try to resolve the address of an overloaded function (C++ [over...
ExprResult Perform(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, QualType *ResultType=nullptr)
Perform the actual initialization of the given entity based on the computed initialization sequence...
const RecordType * getDetectedVirtual() const
The virtual base discovered on the path (if we are merely detecting virtuals).
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
static void DiagnoseCastQual(Sema &Self, const ExprResult &SrcExpr, QualType DestType)
DiagnoseCastQual - Warn whenever casts discards a qualifiers, be it either const, volatile or both...
const internal::VariadicDynCastAllOfMatcher< Stmt, CastExpr > castExpr
Matches any cast nodes of Clang's AST.
const LangOptions & getLangOpts() const
ExprResult DefaultFunctionArrayLvalueConversion(Expr *E, bool Diagnose=true)
bool isScalarType() const
bool compatiblyIncludesObjCLifetime(Qualifiers other) const
Determines if these qualifiers compatibly include another set of qualifiers from the narrow perspecti...
An ordinary object is located at an address in memory.
CastKind PrepareScalarCast(ExprResult &src, QualType destType)
Prepares for a scalar cast, performing all the necessary stages except the final cast and returning t...
static CastAwayConstnessKind unwrapCastAwayConstnessLevel(ASTContext &Context, QualType &T1, QualType &T2)
Unwrap one level of types for CastsAwayConstness.
Sema - This implements semantic analysis and AST building for C.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool compatiblyIncludes(Qualifiers other) const
Determines if these qualifiers compatibly include another set.
bool isComplexType() const
isComplexType() does not include complex integers (a GCC extension).
CastKind
CastKind - The kind of operation required for a conversion.
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat)
bool UnwrapSimilarArrayTypes(QualType &T1, QualType &T2)
Attempt to unwrap two types that may both be array types with the same bound (or both be array types ...
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...
bool isEnabled(llvm::StringRef Ext) const
ASTRecordLayout - This class contains layout information for one RecordDecl, which is a struct/union/...
An Objective-C property is a logical field of an Objective-C object which is read and written via Obj...
Expr - This represents one expression.
static void diagnoseBadCast(Sema &S, unsigned msg, CastType castType, SourceRange opRange, Expr *src, QualType destType, bool listInitialization)
Diagnose a failed cast.
QualType getPointeeType() const
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
static InitializationKind CreateFunctionalCast(SourceRange TypeRange, bool InitList)
Create a direct initialization for a functional cast.
void BuildBasePathArray(const CXXBasePaths &Paths, CXXCastPath &BasePath)
static FindResult find(Expr *E)
Finds the overloaded expression in the given expression E of OverloadTy.
const CXXRecordDecl * getPointeeCXXRecordDecl() const
If this is a pointer or reference to a RecordType, return the CXXRecordDecl that the type refers to...
const T * castAs() const
Member-template castAs<specific type>.
OverloadingResult getFailedOverloadResult() const
Get the overloading result, for when the initialization sequence failed due to a bad overload...
The cast method is appropriate and accepted as a language extension.
Defines the clang::Preprocessor interface.
bool isNullPtrType() const
static CXXStaticCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind K, Expr *Op, const CXXCastPath *Path, TypeSourceInfo *Written, SourceLocation L, SourceLocation RParenLoc, SourceRange AngleBrackets)
CXXRecordDecl * getDefinition() const
Overload resolution succeeded.
ExprResult BuildCXXNamedCast(SourceLocation OpLoc, tok::TokenKind Kind, TypeSourceInfo *Ty, Expr *E, SourceRange AngleBrackets, SourceRange Parens)
Stores token information for comparing actual tokens with predefined values.
ExprResult CheckPlaceholderExpr(Expr *E)
Check for operands with placeholder types and complain if found.
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: ...
bool isConstructorInitialization() const
Determine whether this initialization is direct call to a constructor.
ReferenceCompareResult
ReferenceCompareResult - Expresses the result of comparing two types (cv1 T1 and cv2 T2) to determine...
bool RequireCompleteType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char, signed char, short, int, long..], or an enum decl which has a signed representation.
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: ...
bool ResolveAndFixSingleFunctionTemplateSpecialization(ExprResult &SrcExpr, bool DoFunctionPointerConverion=false, bool Complain=false, SourceRange OpRangeForComplaining=SourceRange(), QualType DestTypeForComplaining=QualType(), unsigned DiagIDForComplaining=0)
bool resolveAndFixAddressOfOnlyViableOverloadCandidate(ExprResult &SrcExpr, bool DoFunctionPointerConversion=false)
Given an overloaded function, tries to turn it into a non-overloaded function reference using resolve...
bool isAtLeastAsQualifiedAs(CanQual< T > Other) const
Determines whether this canonical type is at least as qualified as the Other canonical type...
SourceLocation getEnd() const
Preprocessor & getPreprocessor() const
Represents a GCC generic vector type.
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.
bool CheckTollFreeBridgeStaticCast(QualType castType, Expr *castExpr, CastKind &Kind)
QualType getTypeDeclType(const TypeDecl *Decl, const TypeDecl *PrevDecl=nullptr) const
Return the unique reference to the type for the specified type declaration.
The result type of a method or function.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
bool isKeyword(const LangOptions &LangOpts) const
Return true if this token is a keyword in the specified language.
unsigned getCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers applied to this type.
ExprResult BuildCStyleCastExpr(SourceLocation LParenLoc, TypeSourceInfo *Ty, SourceLocation RParenLoc, Expr *Op)
bool isVoidPointerType() const
bool areLaxCompatibleVectorTypes(QualType srcType, QualType destType)
Are the two types lax-compatible vector types? That is, given that one of them is a vector...
RecordDecl * getDecl() const
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.
static CXXConstCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, Expr *Op, TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation RParenLoc, SourceRange AngleBrackets)
A reference to an overloaded function set, either an UnresolvedLookupExpr or an UnresolvedMemberExpr...
ActionResult - This structure is used while parsing/acting on expressions, stmts, etc...
ASTContext & getASTContext() const
Encodes a location in the source.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of enums...
CastKind PrepareCastToObjCObjectPointer(ExprResult &E)
Prepare a conversion of the given expression to an ObjC object pointer type.
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.
static const FieldDecl * getTargetFieldForToUnionCast(QualType unionType, QualType opType)
SourceLocation getLocStart() const LLVM_READONLY
bool isIntegralType(const ASTContext &Ctx) const
Determine whether this type is an integral type.
Represents a static or instance method of a struct/union/class.
ExprResult ActOnCXXNamedCast(SourceLocation OpLoc, tok::TokenKind Kind, SourceLocation LAngleBracketLoc, Declarator &D, SourceLocation RAngleBracketLoc, SourceLocation LParenLoc, Expr *E, SourceLocation RParenLoc)
ActOnCXXNamedCast - Parse {dynamic,static,reinterpret,const}_cast's.
bool CheckObjCARCUnavailableWeakConversion(QualType castType, QualType ExprType)
std::string getAmbiguousPathsDisplayString(CXXBasePaths &Paths)
Builds a string representing ambiguous paths from a specific derived class to different subobjects of...
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
Represents a canonical, potentially-qualified type.
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
Describes the kind of initialization being performed, along with location information for tokens rela...
bool isMemberFunctionPointerType() const
bool isObjCObjectPointerType() const
bool isAnyPointerType() const
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
bool isLValue() const
isLValue - True if this expression is an "l-value" according to the rules of the current language...
Overloading for initialization by constructor failed.
Requests that all candidates be shown.
SourceLocation getLocEnd() const LLVM_READONLY
bool isAddressSpaceOverlapping(const PointerType &other) const
Returns true if address spaces of pointers overlap.
bool isAnyCharacterType() const
Determine whether this type is any of the built-in character types.
bool isVectorType() const
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13...
static InitializationKind CreateCast(SourceRange TypeRange)
Create a direct initialization due to a cast that isn't a C-style or functional cast.
bool hasSameUnqualifiedType(QualType T1, QualType T2) const
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
static CXXReinterpretCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind Kind, Expr *Op, const CXXCastPath *Path, TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation RParenLoc, SourceRange AngleBrackets)
CanProxy< U > getAs() const
Retrieve a canonical type pointer with a different static type, upcasting or downcasting as needed...
ExprResult checkUnknownAnyCast(SourceRange TypeRange, QualType CastType, Expr *CastExpr, CastKind &CastKind, ExprValueKind &VK, CXXCastPath &Path)
Check a cast of an unknown-any type.
A POD class for pairing a NamedDecl* with an access specifier.
bool isPlaceholderType() const
Test for a type which does not represent an actual type-system type but is instead used as a placehol...
Represents an element in a path from a derived class to a base class.
CallingConv getDefaultCallingConvention(bool IsVariadic, bool IsCXXMethod) const
Retrieves the default calling convention for the current target.
std::list< CXXBasePath >::const_iterator const_paths_iterator
Dataflow Directional Tag Classes.
bool isValid() const
Return true if this is a valid SourceLocation object.
void CheckCompatibleReinterpretCast(QualType SrcType, QualType DestType, bool IsDereference, SourceRange Range)
bool hasCvrSimilarType(QualType T1, QualType T2)
Determine if two types are similar, ignoring only CVR qualifiers.
The cast method is appropriate, but failed.
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
const CXXRecordDecl * getParent() const
Returns the parent of this method declaration, which is the class in which this method is defined...
bool isBooleanType() const
ExprResult prepareVectorSplat(QualType VectorTy, Expr *SplattedExpr)
Prepare SplattedExpr for a vector splat operation, adding implicit casts if necessary.
static void checkIntToPointerCast(bool CStyle, SourceLocation Loc, const Expr *SrcExpr, QualType DestType, Sema &Self)
Requests that only viable candidates be shown.
bool isAmbiguous(CanQualType BaseType)
Determine whether the path from the most-derived type to the given base type is ambiguous (i...
A pointer to member type per C++ 8.3.3 - Pointers to members.
bool isIntegerConstantExpr(llvm::APSInt &Result, const ASTContext &Ctx, SourceLocation *Loc=nullptr, bool isEvaluated=true) const
isIntegerConstantExpr - Return true if this expression is a valid integer constant expression...
static InitializationKind CreateCStyleCast(SourceLocation StartLoc, SourceRange TypeRange, bool InitList)
Create a direct initialization for a C-style cast.
void CheckCastAlign(Expr *Op, QualType T, SourceRange TRange)
CheckCastAlign - Implements -Wcast-align, which warns when a pointer cast increases the alignment req...
static void DiagnoseCastOfObjCSEL(Sema &Self, const ExprResult &SrcExpr, QualType DestType)
static bool fixOverloadedReinterpretCastExpr(Sema &Self, QualType DestType, ExprResult &Result)
Expr * IgnoreParenImpCasts() LLVM_READONLY
IgnoreParenImpCasts - Ignore parentheses and implicit casts.
ExprResult IgnoredValueConversions(Expr *E)
IgnoredValueConversions - Given that an expression's result is syntactically ignored, perform any conversions that are required.
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
static bool tryDiagnoseOverloadedCast(Sema &S, CastType CT, SourceRange range, Expr *src, QualType destType, bool listInitialization)
Try to diagnose a failed overloaded cast.
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
ExprResult CheckExtVectorCast(SourceRange R, QualType DestTy, Expr *CastExpr, CastKind &Kind)
static CStyleCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind K, Expr *Op, const CXXCastPath *BasePath, TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation R)
bool CheckDerivedToBaseConversion(QualType Derived, QualType Base, SourceLocation Loc, SourceRange Range, CXXCastPath *BasePath=nullptr, bool IgnoreAccess=false)
bool isFunctionType() const
MaterializeTemporaryExpr * CreateMaterializeTemporaryExpr(QualType T, Expr *Temporary, bool BoundToLvalueReference)
Base for LValueReferenceType and RValueReferenceType.
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
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.
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream...
QualType getNonLValueExprType(const ASTContext &Context) const
Determine the type of a (typically non-lvalue) expression with the specified result type...
A bitfield object is a bitfield on a C or C++ record.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
bool isObjCObjectType() const
QualType withCVRQualifiers(unsigned CVR) const
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
bool isLValueReferenceType() const
ExprResult BuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, QualType Type, SourceLocation LParenLoc, Expr *CastExpr, SourceLocation RParenLoc)
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
bool Failed() const
Determine whether the initialization sequence is invalid.
CallingConv getCallConv() const
Describes the sequence of initializations required to initialize a given object or reference with a s...
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
Represents a C++ struct/union/class.
bool isMemberFunctionPointer() const
Returns true if the member type (i.e.
static CastAwayConstnessKind CastsAwayConstness(Sema &Self, QualType SrcType, QualType DestType, bool CheckCVR, bool CheckObjCLifetime, QualType *TheOffendingSrcType=nullptr, QualType *TheOffendingDestType=nullptr, Qualifiers *CastAwayQualifiers=nullptr)
Check if the pointer conversion from SrcType to DestType casts away constness as defined in C++ [expr...
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
AccessResult CheckBaseClassAccess(SourceLocation AccessLoc, QualType Base, QualType Derived, const CXXBasePath &Path, unsigned DiagID, bool ForceCheck=false, bool ForceUnprivileged=false)
Checks access for a hierarchy conversion.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string...
This class is used for builtin types like 'int'.
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
Defines the clang::TargetInfo interface.
bool isComplexIntegerType() const
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
unsigned getCVRQualifiers() const
static Qualifiers fromCVRMask(unsigned CVR)
static void DiagnoseBadFunctionCast(Sema &Self, const ExprResult &SrcExpr, QualType DestType)
DiagnoseBadFunctionCast - Warn whenever a function call is cast to a non-matching type...
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
A reference to a declared variable, function, enum, etc.
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
NestedNameSpecifierLoc getQualifierLoc() const
Fetches the nested-name qualifier with source-location information, if one was given.
bool isPointerType() const
void NoteAllOverloadCandidates(Expr *E, QualType DestType=QualType(), bool TakingAddress=false)
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
No viable function found.
static StringRef getNameForCallConv(CallingConv CC)
bool isFloatingType() const
A trivial tuple used to represent a source range.
Describes an entity that is being initialized.
bool isFunctionPointerType() const
SourceLocation getBegin() const
const LangOptions & getLangOpts() const
void NoteCandidates(Sema &S, OverloadCandidateDisplayKind OCD, ArrayRef< Expr *> Args, StringRef Opc="", SourceLocation Loc=SourceLocation(), llvm::function_ref< bool(OverloadCandidate &)> Filter=[](OverloadCandidate &) { return true;})
When overload resolution fails, prints diagnostic messages containing the candidates in the candidate...
QualType getUnqualifiedArrayType(QualType T, Qualifiers &Quals)
Return this type as a completely-unqualified array type, capturing the qualifiers in Quals...
bool isIncompleteOrObjectType() const
Return true if this is an incomplete or object type, in other words, not a function type...
QualType getPointeeType() const
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...
QualType getType() const
Return the type wrapped by this type source info.
Engages in a tight little dance with the lexer to efficiently preprocess tokens.