30#include "llvm/ADT/SmallVector.h"
31#include "llvm/ADT/StringExtras.h"
61 struct CastOperation {
62 CastOperation(Sema &S, QualType destType,
ExprResult src)
63 :
Self(S), SrcExpr(src), DestType(destType),
66 Kind(CK_Dependent), IsARCUnbridgedCast(
false) {
80 !DestType->isArrayType() && !DestType.getPointerAuth()) {
81 DestType = DestType.getAtomicUnqualifiedType();
84 if (
const BuiltinType *placeholder =
86 PlaceholderKind = placeholder->getKind();
100 bool IsARCUnbridgedCast;
103 SourceLocation Locations[3];
105 OpRangeType(SourceLocation Begin, SourceLocation LParen,
106 SourceLocation RParen)
107 : Locations{Begin, LParen, RParen} {}
109 OpRangeType() =
default;
111 SourceLocation getBegin()
const {
return Locations[0]; }
113 SourceLocation getLParenLoc()
const {
return Locations[1]; }
115 SourceLocation getRParenLoc()
const {
return Locations[2]; }
117 friend const StreamingDiagnostic &
118 operator<<(
const StreamingDiagnostic &DB, OpRangeType Op) {
119 return DB << SourceRange(Op);
122 SourceRange getParenRange()
const {
123 return SourceRange(getLParenLoc(), getRParenLoc());
126 operator SourceRange()
const {
127 return SourceRange(getBegin(), getRParenLoc());
132 SourceRange DestRange;
135 void CheckConstCast();
136 void CheckReinterpretCast();
137 void CheckStaticCast();
138 void CheckDynamicCast();
139 void CheckCXXCStyleCast(
bool FunctionalCast,
bool ListInitialization);
141 void CheckCStyleCast();
142 void CheckBuiltinBitCast();
143 void CheckAddrspaceCast();
145 void updatePartOfExplicitCastFlags(
CastExpr *CE) {
149 for (;
auto *ICE = dyn_cast<ImplicitCastExpr>(CE->
getSubExpr()); CE = ICE)
150 ICE->setIsPartOfExplicitCast(
true);
158 if (IsARCUnbridgedCast) {
160 Self.Context, Self.Context.ARCUnbridgedCastTy, CK_Dependent,
162 Self.CurFPFeatureOverrides());
164 updatePartOfExplicitCastFlags(
castExpr);
174 if (PlaceholderKind != K)
return false;
180 bool isPlaceholder()
const {
181 return PlaceholderKind != 0;
184 return PlaceholderKind == K;
188 void checkAddressSpaceCast(QualType SrcType, QualType DestType);
190 void checkCastAlign() {
191 Self.CheckCastAlign(SrcExpr.get(), DestType, OpRange);
195 bool IsReinterpretCast =
false) {
196 assert(Self.getLangOpts().allowsNonTrivialObjCLifetimeQualifiers());
198 Expr *src = SrcExpr.
get();
199 if (Self.ObjC().CheckObjCConversion(
200 OpRange, DestType, src, CCK,
true,
false, BO_PtrMemD,
202 IsARCUnbridgedCast =
true;
206 void checkQualifiedDestType() {
208 if (DestType.getPointerAuth()) {
209 Self.Diag(DestRange.getBegin(), diag::err_ptrauth_qualifier_cast)
210 << DestType << DestRange;
215 void checkNonOverloadPlaceholders() {
216 if (!isPlaceholder() || isPlaceholder(BuiltinType::Overload))
219 SrcExpr = Self.CheckPlaceholderExpr(SrcExpr.get());
220 if (SrcExpr.isInvalid())
228 if (
const auto *PtrType = dyn_cast<PointerType>(FromType)) {
229 if (PtrType->getPointeeType()->hasAttr(attr::NoDeref)) {
230 if (
const auto *DestType = dyn_cast<PointerType>(ToType)) {
231 if (!DestType->getPointeeType()->hasAttr(attr::NoDeref)) {
232 S.
Diag(OpLoc, diag::warn_noderef_to_dereferenceable_pointer);
239 struct CheckNoDerefRAII {
240 CheckNoDerefRAII(CastOperation &Op) : Op(Op) {}
241 ~CheckNoDerefRAII() {
242 if (!Op.SrcExpr.isInvalid())
243 CheckNoDeref(Op.Self, Op.SrcExpr.get()->getType(), Op.ResultType,
244 Op.OpRange.getBegin());
272 bool CStyle, CastOperation::OpRangeType OpRange,
277 bool CStyle, CastOperation::OpRangeType OpRange,
281 CastOperation::OpRangeType OpRange,
283 QualType OrigDestType,
unsigned &msg,
288 CastOperation::OpRangeType OpRange,
unsigned &msg,
294 CastOperation::OpRangeType OpRange,
296 bool ListInitialization);
299 CastOperation::OpRangeType OpRange,
302 bool ListInitialization);
308 CastOperation::OpRangeType OpRange,
348 CastOperation Op(*
this, DestType, E);
350 CastOperation::OpRangeType(OpLoc,
Parens.getBegin(),
Parens.getEnd());
351 Op.DestRange = AngleBrackets;
353 Op.checkQualifiedDestType();
356 default: llvm_unreachable(
"Unknown C++ cast!");
358 case tok::kw_addrspace_cast:
359 if (!TypeDependent) {
360 Op.CheckAddrspaceCast();
365 Context, Op.ResultType, Op.ValueKind, Op.Kind, Op.SrcExpr.
get(),
366 DestTInfo, OpLoc,
Parens.getEnd(), AngleBrackets));
368 case tok::kw_const_cast:
369 if (!TypeDependent) {
376 Op.ValueKind, Op.SrcExpr.
get(), DestTInfo,
380 case tok::kw_dynamic_cast: {
383 return ExprError(
Diag(OpLoc, diag::err_openclcxx_not_supported)
387 if (!TypeDependent) {
388 Op.CheckDynamicCast();
393 Op.ValueKind, Op.Kind, Op.SrcExpr.
get(),
394 &Op.BasePath, DestTInfo,
398 case tok::kw_reinterpret_cast: {
399 if (!TypeDependent) {
400 Op.CheckReinterpretCast();
406 Op.ValueKind, Op.Kind, Op.SrcExpr.
get(),
407 nullptr, DestTInfo, OpLoc,
411 case tok::kw_static_cast: {
412 if (!TypeDependent) {
413 Op.CheckStaticCast();
420 Context, Op.ResultType, Op.ValueKind, Op.Kind, Op.SrcExpr.
get(),
422 Parens.getEnd(), AngleBrackets));
442 CastOperation Op(*
this, TSI->
getType(), Operand);
443 Op.OpRange = CastOperation::OpRangeType(KWLoc, KWLoc, RParenLoc);
448 Op.CheckBuiltinBitCast();
455 Op.SrcExpr.
get(), TSI, KWLoc, RParenLoc);
456 return Op.complete(BCE);
462 CastOperation::OpRangeType range,
464 bool listInitialization) {
487 range.getBegin(), range, listInitialization)
490 range.getBegin(), range.getParenRange(), listInitialization)
501 default:
return false;
533 case OR_Success: llvm_unreachable(
"successful failed overload");
535 if (candidates.
empty())
536 msg = diag::err_ovl_no_conversion_in_cast;
538 msg = diag::err_ovl_no_viable_conversion_in_cast;
543 msg = diag::err_ovl_ambiguous_conversion_in_cast;
551 assert(Res ==
OR_Deleted &&
"Inconsistent overload resolution");
556 S.
PDiag(diag::err_ovl_deleted_conversion_in_cast)
557 << CT << srcType << destType << (Msg !=
nullptr)
558 << (Msg ? Msg->
getString() : StringRef())
567 S.
PDiag(msg) << CT << srcType << destType << range
569 S, howManyCandidates, src);
576 CastOperation::OpRangeType opRange,
Expr *src,
577 QualType destType,
bool listInitialization) {
578 if (msg == diag::err_bad_cxx_cast_generic &&
583 S.
Diag(opRange.getBegin(), msg) << castType
587 int DifferentPtrness = 0;
598 if (!DifferentPtrness) {
601 DeclFrom && DeclTo) {
602 if (!DeclFrom->isCompleteDefinition())
603 S.
Diag(DeclFrom->getLocation(), diag::note_type_incomplete) << DeclFrom;
604 if (!DeclTo->isCompleteDefinition())
605 S.
Diag(DeclTo->getLocation(), diag::note_type_incomplete) << DeclTo;
613enum CastAwayConstnessKind {
620 CACK_SimilarKind = 2,
639static CastAwayConstnessKind
641 enum {
None, Ptr, MemPtr, BlockPtr, Array };
643 if (T->isAnyPointerType())
return Ptr;
644 if (T->isMemberPointerType())
return MemPtr;
645 if (T->isBlockPointerType())
return BlockPtr;
648 if (T->isConstantArrayType() || T->isIncompleteArrayType())
return Array;
653 if (
auto *AT = Context.getAsArrayType(T))
654 return AT->getElementType();
655 return T->getPointeeType();
658 CastAwayConstnessKind Kind;
666 Kind = CastAwayConstnessKind::CACK_Similar;
667 }
else if (Context.UnwrapSimilarTypes(T1, T2)) {
668 Kind = CastAwayConstnessKind::CACK_Similar;
671 int T1Class = Classify(T1);
673 return CastAwayConstnessKind::CACK_None;
675 int T2Class = Classify(T2);
677 return CastAwayConstnessKind::CACK_None;
681 Kind = T1Class == T2Class ? CastAwayConstnessKind::CACK_SimilarKind
682 : CastAwayConstnessKind::CACK_Incoherent;
690 Context.UnwrapSimilarArrayTypes(T1, T2);
692 if (Classify(T1) != Array)
695 auto T2Class = Classify(T2);
699 if (T2Class != Array)
700 Kind = CastAwayConstnessKind::CACK_Incoherent;
701 else if (Kind != CastAwayConstnessKind::CACK_Incoherent)
702 Kind = CastAwayConstnessKind::CACK_SimilarKind;
717static CastAwayConstnessKind
719 bool CheckCVR,
bool CheckObjCLifetime,
720 QualType *TheOffendingSrcType =
nullptr,
721 QualType *TheOffendingDestType =
nullptr,
725 if (!CheckCVR && CheckObjCLifetime && !
Self.Context.getLangOpts().ObjC)
726 return CastAwayConstnessKind::CACK_None;
731 "Source type is not pointer or pointer to member.");
734 "Destination type is not pointer or pointer to member.");
737 QualType UnwrappedSrcType =
Self.Context.getCanonicalType(SrcType),
738 UnwrappedDestType =
Self.Context.getCanonicalType(DestType);
743 QualType PrevUnwrappedSrcType = UnwrappedSrcType;
744 QualType PrevUnwrappedDestType = UnwrappedDestType;
745 auto WorstKind = CastAwayConstnessKind::CACK_Similar;
746 bool AllConstSoFar =
true;
748 Self.Context, UnwrappedSrcType, UnwrappedDestType)) {
751 if (Kind > WorstKind)
756 Self.Context.getUnqualifiedArrayType(UnwrappedSrcType, SrcQuals);
757 Self.Context.getUnqualifiedArrayType(UnwrappedDestType, DestQuals);
763 UnwrappedDestType->isObjCObjectType())
772 if (SrcCvrQuals != DestCvrQuals) {
773 if (CastAwayQualifiers)
774 *CastAwayQualifiers = SrcCvrQuals - DestCvrQuals;
777 if (!DestCvrQuals.compatiblyIncludes(SrcCvrQuals,
778 Self.getASTContext())) {
779 if (TheOffendingSrcType)
780 *TheOffendingSrcType = PrevUnwrappedSrcType;
781 if (TheOffendingDestType)
782 *TheOffendingDestType = PrevUnwrappedDestType;
793 if (CheckObjCLifetime &&
799 if (AllConstSoFar && !DestQuals.
hasConst()) {
800 AllConstSoFar =
false;
801 if (TheOffendingSrcType)
802 *TheOffendingSrcType = PrevUnwrappedSrcType;
803 if (TheOffendingDestType)
804 *TheOffendingDestType = PrevUnwrappedDestType;
807 PrevUnwrappedSrcType = UnwrappedSrcType;
808 PrevUnwrappedDestType = UnwrappedDestType;
811 return CastAwayConstnessKind::CACK_None;
817 case CastAwayConstnessKind::CACK_None:
818 llvm_unreachable(
"did not cast away constness");
820 case CastAwayConstnessKind::CACK_Similar:
822 case CastAwayConstnessKind::CACK_SimilarKind:
823 DiagID = diag::err_bad_cxx_cast_qualifiers_away;
826 case CastAwayConstnessKind::CACK_Incoherent:
827 DiagID = diag::ext_bad_cxx_cast_qualifiers_away_incoherent;
831 llvm_unreachable(
"unexpected cast away constness kind");
837void CastOperation::CheckDynamicCast() {
838 CheckNoDerefRAII NoderefCheck(*
this);
841 SrcExpr =
Self.DefaultFunctionArrayLvalueConversion(SrcExpr.get());
842 else if (isPlaceholder())
843 SrcExpr =
Self.CheckPlaceholderExpr(SrcExpr.get());
844 if (SrcExpr.isInvalid())
847 QualType OrigSrcType = SrcExpr.get()->getType();
848 QualType DestType =
Self.Context.getCanonicalType(this->DestType);
861 Self.Diag(OpRange.getBegin(), diag::err_bad_dynamic_cast_not_ref_or_ptr)
862 << this->DestType << DestRange;
867 const auto *DestRecord = DestPointee->
getAsCanonical<RecordType>();
869 assert(DestPointer &&
"Reference to void is not possible");
870 }
else if (DestRecord) {
871 if (
Self.RequireCompleteType(OpRange.getBegin(), DestPointee,
872 diag::err_bad_cast_incomplete,
878 Self.Diag(OpRange.getBegin(), diag::err_bad_dynamic_cast_not_class)
888 QualType SrcType =
Self.Context.getCanonicalType(OrigSrcType);
894 Self.Diag(OpRange.getBegin(), diag::err_bad_dynamic_cast_not_ptr)
895 << OrigSrcType << this->DestType << SrcExpr.get()->getSourceRange();
899 }
else if (DestReference->isLValueReferenceType()) {
900 if (!SrcExpr.get()->isLValue()) {
901 Self.Diag(OpRange.getBegin(), diag::err_bad_cxx_cast_rvalue)
902 <<
CT_Dynamic << OrigSrcType << this->DestType << OpRange;
904 SrcPointee = SrcType;
908 if (SrcExpr.get()->isPRValue())
909 SrcExpr =
Self.CreateMaterializeTemporaryExpr(
910 SrcType, SrcExpr.get(),
false);
911 SrcPointee = SrcType;
916 if (
Self.RequireCompleteType(OpRange.getBegin(), SrcPointee,
917 diag::err_bad_cast_incomplete,
923 Self.Diag(OpRange.getBegin(), diag::err_bad_dynamic_cast_not_class)
929 assert((DestPointer || DestReference) &&
930 "Bad destination non-ptr/ref slipped through.");
931 assert((DestRecord || DestPointee->
isVoidType()) &&
932 "Bad destination pointee slipped through.");
933 assert(SrcRecord &&
"Bad source pointee slipped through.");
937 Self.Diag(OpRange.getBegin(), diag::err_bad_cxx_cast_qualifiers_away)
938 <<
CT_Dynamic << OrigSrcType << this->DestType << OpRange;
945 if (DestRecord == SrcRecord) {
953 Self.IsDerivedFrom(OpRange.getBegin(), SrcPointee, DestPointee)) {
954 if (
Self.CheckDerivedToBaseConversion(SrcPointee, DestPointee,
955 OpRange.getBegin(), OpRange,
961 Kind = CK_DerivedToBase;
967 assert(SrcDecl &&
"Definition missing");
969 Self.Diag(OpRange.getBegin(), diag::err_bad_dynamic_cast_not_polymorphic)
978 Self.Diag(OpRange.getBegin(), diag::err_no_dynamic_cast_with_fno_rtti);
984 if (!
Self.getLangOpts().RTTIData) {
986 Self.getASTContext().getTargetInfo().getCXXABI().isMicrosoft();
987 bool isClangCL =
Self.getDiagnostics().getDiagnosticOptions().getFormat() ==
989 if (MicrosoftABI || !DestPointee->
isVoidType())
990 Self.Diag(OpRange.getBegin(),
991 diag::warn_no_dynamic_cast_with_rtti_disabled)
998 auto *DestDecl = DestRecord->getAsCXXRecordDecl();
999 if (DestDecl->isEffectivelyFinal())
1000 Self.MarkVTableUsed(OpRange.getBegin(), DestDecl);
1012void CastOperation::CheckConstCast() {
1013 CheckNoDerefRAII NoderefCheck(*
this);
1016 SrcExpr =
Self.DefaultFunctionArrayLvalueConversion(SrcExpr.get());
1017 else if (isPlaceholder())
1018 SrcExpr =
Self.CheckPlaceholderExpr(SrcExpr.get());
1019 if (SrcExpr.isInvalid())
1022 unsigned msg = diag::err_bad_cxx_cast_generic;
1026 << SrcExpr.get()->getType() << DestType << OpRange;
1032void CastOperation::CheckAddrspaceCast() {
1033 unsigned msg = diag::err_bad_cxx_cast_generic;
1037 Self.Diag(OpRange.getBegin(), msg)
1038 <<
CT_Addrspace << SrcExpr.get()->getType() << DestType << OpRange;
1048 CastOperation::OpRangeType OpRange) {
1075 ReinterpretKind = ReinterpretUpcast;
1077 ReinterpretKind = ReinterpretDowncast;
1082 bool NonZeroOffset =
false;
1084 E = BasePaths.
end();
1088 bool IsVirtual =
false;
1089 for (CXXBasePath::const_iterator IElem = Path.begin(), EElem = Path.end();
1090 IElem != EElem; ++IElem) {
1091 IsVirtual = IElem->Base->isVirtual();
1094 const CXXRecordDecl *BaseRD = IElem->Base->getType()->getAsCXXRecordDecl();
1095 assert(BaseRD &&
"Base type should be a valid unqualified class type");
1100 if (Class->isInvalidDecl() || !ClassDefinition ||
1101 !ClassDefinition->isCompleteDefinition())
1105 Self.Context.getASTRecordLayout(Class);
1110 if (Offset.isZero())
1114 NonZeroOffset =
true;
1119 (void) NonZeroOffset;
1121 "Should have returned if has non-virtual base with zero offset");
1124 ReinterpretKind == ReinterpretUpcast? DestType : SrcType;
1126 ReinterpretKind == ReinterpretUpcast? SrcType : DestType;
1129 Self.Diag(BeginLoc, diag::warn_reinterpret_different_from_static)
1130 << DerivedType << BaseType << !
VirtualBase <<
int(ReinterpretKind)
1132 Self.Diag(BeginLoc, diag::note_reinterpret_updowncast_use_static)
1133 <<
int(ReinterpretKind)
1145 if (Context.getTypeSizeInChars(SrcType) ==
1146 Context.getTypeSizeInChars(DestType))
1149 return Context.hasSameUnqualifiedType(SrcType, DestType);
1154 unsigned int DiagID = 0;
1155 const unsigned int DiagList[] = {diag::warn_cast_function_type_strict,
1156 diag::warn_cast_function_type};
1181 assert(SrcFTy && DstFTy);
1183 if (
Self.Context.hasSameType(SrcFTy, DstFTy))
1187 if (DiagID == diag::warn_cast_function_type_strict)
1191 if (!T->getReturnType()->isVoidType())
1194 return !PT->isVariadic() && PT->getNumParams() == 0;
1207 if (!T->getReturnType()->isIntegerType())
1210 return !PT->isVariadic() && PT->getNumParams() == 0;
1215 if (IsVoidVoid(SrcFTy) || IsVoidVoid(DstFTy))
1221 if (
Self.getASTContext().getTargetInfo().getTriple().isOSWindows() &&
1241 unsigned NumParams = SrcFPTy->getNumParams();
1242 unsigned DstNumParams = DstFPTy->getNumParams();
1243 if (NumParams > DstNumParams) {
1244 if (!DstFPTy->isVariadic())
1246 NumParams = DstNumParams;
1247 }
else if (NumParams < DstNumParams) {
1248 if (!SrcFPTy->isVariadic())
1252 for (
unsigned i = 0; i < NumParams; ++i)
1254 DstFPTy->getParamType(i),
Self.Context))
1265void CastOperation::CheckReinterpretCast() {
1266 if (ValueKind ==
VK_PRValue && !isPlaceholder(BuiltinType::Overload))
1267 SrcExpr =
Self.DefaultFunctionArrayLvalueConversion(SrcExpr.get());
1269 checkNonOverloadPlaceholders();
1270 if (SrcExpr.isInvalid())
1273 unsigned msg = diag::err_bad_cxx_cast_generic;
1276 false, OpRange, msg, Kind);
1278 if (SrcExpr.isInvalid())
1280 if (SrcExpr.get()->getType() ==
Self.Context.OverloadTy) {
1282 Self.Diag(OpRange.getBegin(), diag::err_bad_reinterpret_cast_overload)
1284 << DestType << OpRange;
1285 Self.NoteAllOverloadCandidates(SrcExpr.get());
1294 if (
Self.getLangOpts().allowsNonTrivialObjCLifetimeQualifiers())
1300 Self.Diag(OpRange.getBegin(), DiagID)
1301 << SrcExpr.get()->getType() << DestType << OpRange;
1311void CastOperation::CheckStaticCast() {
1312 CheckNoDerefRAII NoderefCheck(*
this);
1314 if (isPlaceholder()) {
1315 checkNonOverloadPlaceholders();
1316 if (SrcExpr.isInvalid())
1326 if (claimPlaceholder(BuiltinType::Overload)) {
1327 Self.ResolveAndFixSingleFunctionTemplateSpecialization(SrcExpr,
1330 OpRange, DestType, diag::err_bad_static_cast_overload);
1331 if (SrcExpr.isInvalid())
1335 SrcExpr =
Self.IgnoredValueConversions(SrcExpr.get());
1340 !isPlaceholder(BuiltinType::Overload)) {
1341 SrcExpr =
Self.DefaultFunctionArrayLvalueConversion(SrcExpr.get());
1342 if (SrcExpr.isInvalid())
1346 unsigned msg = diag::err_bad_cxx_cast_generic;
1349 OpRange, msg, Kind, BasePath,
false);
1351 if (SrcExpr.isInvalid())
1353 if (SrcExpr.get()->getType() ==
Self.Context.OverloadTy) {
1355 Self.Diag(OpRange.getBegin(), diag::err_bad_static_cast_overload)
1356 << oe->
getName() << DestType << OpRange
1358 Self.NoteAllOverloadCandidates(SrcExpr.get());
1366 if (Kind == CK_BitCast)
1368 if (
Self.getLangOpts().allowsNonTrivialObjCLifetimeQualifiers())
1383 DestPtrType->getPointeeType().getAddressSpace();
1391 CastOperation::OpRangeType OpRange,
1394 bool ListInitialization) {
1420 OpRange, msg, Kind, BasePath);
1428 Kind, BasePath, msg);
1435 Kind, ListInitialization);
1456 if (
const EnumType *
Enum = dyn_cast<EnumType>(SrcType)) {
1457 if (
Enum->getDecl()->isScoped()) {
1459 Kind = CK_IntegralToBoolean;
1462 Kind = CK_IntegralCast;
1465 Kind = CK_IntegralToFloating;
1480 if (
Self.RequireCompleteType(OpRange.getBegin(), DestType,
1481 diag::err_bad_cast_incomplete)) {
1489 Kind = ED->
isFixed() && ED->getIntegerType()->isBooleanType()
1490 ? CK_IntegralToBoolean
1494 Kind = CK_FloatingToIntegral;
1510 OpRange, msg, Kind, BasePath);
1533 if (DestPointeeQuals != SrcPointeeQuals &&
1535 Self.getASTContext())) {
1536 msg = diag::err_bad_cxx_cast_qualifiers_away;
1541 ? CK_AddressSpaceConversion
1548 if (!CStyle &&
Self.getLangOpts().MSVCCompat &&
1550 Self.Diag(OpRange.getBegin(), diag::ext_ms_cast_fn_obj) << OpRange;
1558 Kind = CK_CPointerToObjCPointerCast;
1563 Kind = CK_AnyPointerToBlockPointerCast;
1577 Self.ObjC().CheckTollFreeBridgeStaticCast(DestType, SrcExpr.
get(), Kind))
1584 if (SrcPointer->getPointeeType()->isRecordType() &&
1586 msg = diag::err_bad_cxx_cast_unrelated_class;
1589 if (
Self.CheckMatrixCast(OpRange, DestType, SrcType, Kind)) {
1596 if (SrcType ==
Self.Context.AMDGPUFeaturePredicateTy &&
1597 DestType ==
Self.Context.getLogicalOperationType()) {
1598 SrcExpr =
Self.AMDGPU().ExpandAMDGPUPredicateBuiltIn(SrcExpr.
get());
1625 QualType ToType = R->getPointeeType();
1633 SrcExpr->
getBeginLoc(), ToType, FromType, &RefConv);
1640 msg = SrcExpr->
isLValue() ? diag::err_bad_lvalue_to_rvalue_cast
1641 : diag::err_bad_rvalue_to_rvalue_cast;
1645 if (RefConv & Sema::ReferenceConversions::DerivedToBase) {
1646 Kind = CK_DerivedToBase;
1647 if (
Self.CheckDerivedToBaseConversion(FromType, ToType,
1649 &BasePath, CStyle)) {
1662 CastOperation::OpRangeType OpRange,
1675 if (!DestReference) {
1679 if (!RValueRef && !SrcExpr->
isLValue()) {
1681 msg = diag::err_bad_cxx_cast_rvalue;
1691 Self.Context.getCanonicalType(SrcExpr->
getType()),
1692 Self.Context.getCanonicalType(DestPointee), CStyle,
1693 OpRange, SrcExpr->
getType(), DestType, msg, Kind,
1700 CastOperation::OpRangeType OpRange,
1718 msg = diag::err_bad_static_cast_pointer_nonpointer;
1725 CStyle, OpRange, SrcType, DestType, msg, Kind,
1734 CastOperation::OpRangeType OpRange,
1739 if (!
Self.isCompleteType(OpRange.getBegin(), SrcType) ||
1740 !
Self.isCompleteType(OpRange.getBegin(), DestType))
1744 if (!DestType->
getAs<RecordType>() || !SrcType->
getAs<RecordType>()) {
1750 if (!
Self.IsDerivedFrom(OpRange.getBegin(), DestType, SrcType, Paths)) {
1775 msg = diag::err_bad_cxx_cast_qualifiers_away;
1787 Self.IsDerivedFrom(OpRange.getBegin(), DestType, SrcType, Paths);
1789 std::string PathDisplayStr;
1790 std::set<unsigned> DisplayedPaths;
1792 if (DisplayedPaths.insert(Path.back().SubobjectNumber).second) {
1795 PathDisplayStr +=
"\n ";
1797 PathDisplayStr += PE.Base->getType().getAsString() +
" -> ";
1802 Self.Diag(OpRange.getBegin(), diag::err_ambiguous_base_to_derived_cast)
1805 << PathDisplayStr << OpRange;
1812 Self.Diag(OpRange.getBegin(), diag::err_static_downcast_via_virtual)
1813 << OrigSrcType << OrigDestType <<
VirtualBase << OpRange;
1819 switch (
Self.CheckBaseClassAccess(OpRange.getBegin(),
1822 diag::err_downcast_from_inaccessible_base)) {
1834 Self.BuildBasePathArray(Paths, BasePath);
1835 Kind = CK_BaseToDerived;
1849 CastOperation::OpRangeType OpRange,
1856 bool WasOverloadedFunction =
false;
1860 =
Self.ResolveAddressOfOverloadedFunction(SrcExpr.
get(), DestType,
false,
1863 SrcType =
Self.Context.getMemberPointerType(
1864 Fn->getType(), std::nullopt, M->
getParent());
1865 WasOverloadedFunction =
true;
1869 switch (
Self.CheckMemberPointerConversion(
1870 SrcType, DestMemPtr, Kind, BasePath, OpRange.getBegin(), OpRange, CStyle,
1873 if (Kind == CK_NullToMemberPointer) {
1874 msg = diag::err_bad_static_cast_member_pointer_nonmp;
1888 if (WasOverloadedFunction) {
1900 SrcExpr =
Self.FixOverloadedFunctionReference(SrcExpr, FoundOverload, Fn);
1917 CastOperation::OpRangeType OpRange,
1919 bool ListInitialization) {
1921 if (
Self.RequireCompleteType(OpRange.getBegin(), DestType,
1922 diag::err_bad_cast_incomplete) ||
1923 Self.RequireNonAbstractType(OpRange.getBegin(), DestType,
1924 diag::err_allocation_of_abstract_type)) {
1937 OpRange.getBegin(), OpRange.getParenRange(), ListInitialization)
1939 Expr *SrcExprRaw = SrcExpr.
get();
1956 if (Result.isInvalid()) {
1962 Kind = CK_ConstructorConversion;
1975 DestType =
Self.Context.getCanonicalType(DestType);
1977 bool NeedToMaterializeTemporary =
false;
1995 msg = diag::err_bad_cxx_cast_rvalue;
2003 msg = diag::err_bad_cxx_cast_rvalue;
2009 NeedToMaterializeTemporary =
true;
2018 msg = diag::err_bad_cxx_cast_bitfield;
2022 DestType =
Self.Context.getPointerType(DestTypeTmp->getPointeeType());
2023 SrcType =
Self.Context.getPointerType(SrcType);
2038 msg = diag::err_bad_const_cast_dest;
2047 msg = diag::err_bad_const_cast_dest;
2057 if (!
Self.Context.hasCvrSimilarType(SrcType, DestType))
2060 if (NeedToMaterializeTemporary)
2063 SrcExpr =
Self.CreateMaterializeTemporaryExpr(SrcExpr.
get()->
getType(),
2078 unsigned DiagID = IsDereference ?
2079 diag::warn_pointer_indirection_from_incompatible_type :
2080 diag::warn_undefined_reinterpret_cast;
2082 if (
Diags.isIgnored(DiagID, Range.getBegin()))
2086 if (IsDereference) {
2101 if (
Context.hasSameUnqualifiedType(DestTy, SrcTy)) {
2126 Diag(Range.getBegin(), DiagID) << SrcType << DestType << Range;
2132 if (
Self.Context.hasSameType(SrcType, DestType))
2135 if (SrcPtrTy->isObjCSelType()) {
2141 diag::warn_cast_pointer_from_sel)
2150 CastOperation::OpRangeType OpRange) {
2154 if (
Self.Context.hasSameType(SrcType, DstType) ||
2157 const auto *SrcFTy =
2159 const auto *DstFTy =
2169 if (
auto *UO = dyn_cast<UnaryOperator>(Src))
2170 if (UO->getOpcode() == UO_AddrOf)
2172 auto *DRE = dyn_cast<DeclRefExpr>(Src);
2175 auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl());
2183 CallingConv DefaultCC =
Self.getASTContext().getDefaultCallingConvention(
2184 FD->isVariadic(), FD->isCXXInstanceMember());
2185 if (DstCC == DefaultCC || SrcCC != DefaultCC)
2191 Self.Diag(OpRange.getBegin(), diag::warn_cast_calling_conv)
2192 << SrcCCName << DstCCName << OpRange;
2197 if (
Self.Diags.isIgnored(diag::warn_cast_calling_conv, OpRange.getBegin()))
2204 SourceLocation NameLoc = FD->getFirstDecl()->getNameInfo().getLoc();
2208 llvm::raw_svector_ostream OS(CCAttrText);
2209 if (
Self.getLangOpts().MicrosoftExt) {
2211 OS <<
"__" << DstCCName;
2218 OS <<
"__attribute__((" << DstCCName <<
"))";
2219 AttrTokens.push_back(tok::kw___attribute);
2220 AttrTokens.push_back(tok::l_paren);
2221 AttrTokens.push_back(tok::l_paren);
2226 AttrTokens.push_back(tok::r_paren);
2227 AttrTokens.push_back(tok::r_paren);
2230 if (!AttrSpelling.empty())
2231 CCAttrText = AttrSpelling;
2233 Self.Diag(NameLoc, diag::note_change_calling_conv_fixit)
2249 &&
Self.Context.getTypeSize(DestType) >
2250 Self.Context.getTypeSize(SrcType)) {
2257 diag::warn_int_to_void_pointer_cast
2258 : diag::warn_int_to_pointer_cast;
2271 Expr *E = Result.get();
2274 if (
Self.ResolveAndFixSingleFunctionTemplateSpecialization(
2285 if (!
Self.resolveAndFixAddressOfSingleOverloadCandidate(
2288 return Result.isUsable();
2293 CastOperation::OpRangeType OpRange,
2295 bool IsLValueCast =
false;
2297 DestType =
Self.Context.getCanonicalType(DestType);
2302 if (SrcType ==
Self.Context.OverloadTy) {
2307 assert(FixedExpr.
isUsable() &&
"Invalid result fixing overloaded expr");
2308 SrcExpr = FixedExpr;
2316 msg = diag::err_bad_cxx_cast_rvalue;
2321 Self.CheckCompatibleReinterpretCast(SrcType, DestType,
2329 const char *inappropriate =
nullptr;
2334 msg = diag::err_bad_cxx_cast_bitfield;
2339 inappropriate =
"matrix element";
2342 case OK_ObjCSubscript: inappropriate =
"container subscripting expression";
2345 if (inappropriate) {
2346 Self.Diag(OpRange.getBegin(), diag::err_bad_reinterpret_cast_reference)
2347 << inappropriate << DestType
2354 DestType =
Self.Context.getPointerType(DestTypeTmp->getPointeeType());
2355 SrcType =
Self.Context.getPointerType(SrcType);
2357 IsLValueCast =
true;
2361 SrcType =
Self.Context.getCanonicalType(SrcType);
2365 if (DestMemPtr && SrcMemPtr) {
2371 SrcMemPtr->isMemberFunctionPointer())
2374 if (
Self.Context.getTargetInfo().getCXXABI().isMicrosoft()) {
2377 (void)
Self.isCompleteType(OpRange.getBegin(), SrcType);
2378 (void)
Self.isCompleteType(OpRange.getBegin(), DestType);
2382 if (
Self.Context.getTypeSize(DestMemPtr) !=
2383 Self.Context.getTypeSize(SrcMemPtr)) {
2384 msg = diag::err_bad_cxx_cast_member_pointer_size;
2398 assert(!IsLValueCast);
2399 Kind = CK_ReinterpretMemberPointer;
2409 if (
Self.Context.getTypeSize(SrcType) >
2410 Self.Context.getTypeSize(DestType)) {
2411 msg = diag::err_bad_reinterpret_cast_small_int;
2414 Kind = CK_PointerToIntegral;
2422 if (srcIsVector || destIsVector) {
2424 if (
Self.isValidSveBitcast(SrcType, DestType)) {
2430 if (
Self.RISCV().isValidRVVBitcast(SrcType, DestType)) {
2444 if (
Self.areLaxCompatibleVectorTypes(SrcType, DestType)) {
2449 if (
Self.LangOpts.OpenCL && !CStyle) {
2452 if (
Self.areVectorTypesSameSize(SrcType, DestType)) {
2461 msg = diag::err_bad_cxx_cast_vector_to_scalar_different_size;
2462 else if (!srcIsVector)
2463 msg = diag::err_bad_cxx_cast_scalar_to_vector_different_size;
2465 msg = diag::err_bad_cxx_cast_vector_to_vector_different_size;
2470 if (SrcType == DestType) {
2494 if (!destIsPtr && !srcIsPtr) {
2501 assert(srcIsPtr &&
"One type must be a pointer");
2505 if ((
Self.Context.getTypeSize(SrcType) >
2506 Self.Context.getTypeSize(DestType))) {
2507 bool MicrosoftException =
2509 if (MicrosoftException) {
2511 ? diag::warn_void_pointer_to_int_cast
2512 : diag::warn_pointer_to_int_cast;
2513 Self.Diag(OpRange.getBegin(),
Diag) << SrcType << DestType << OpRange;
2515 msg = diag::err_bad_reinterpret_cast_small_int;
2519 Kind = CK_PointerToIntegral;
2524 assert(destIsPtr &&
"One type must be a pointer");
2530 Kind = CK_IntegralToPointer;
2534 if (!destIsPtr || !srcIsPtr) {
2554 Kind = CK_AddressSpaceConversion;
2561 }
else if (IsLValueCast) {
2562 Kind = CK_LValueBitCast;
2564 Kind =
Self.ObjC().PrepareCastToObjCObjectPointer(SrcExpr);
2567 Kind = CK_AnyPointerToBlockPointerCast;
2578 return SuccessResult;
2592 return SuccessResult;
2601 Self.Diag(OpRange.getBegin(),
2602 Self.getLangOpts().CPlusPlus11 ?
2603 diag::warn_cxx98_compat_cast_fn_obj : diag::ext_cast_fn_obj)
2605 return SuccessResult;
2610 Self.Diag(OpRange.getBegin(),
2611 Self.getLangOpts().CPlusPlus11 ?
2612 diag::warn_cxx98_compat_cast_fn_obj : diag::ext_cast_fn_obj)
2614 return SuccessResult;
2626 Self.Diag(OpRange.getBegin(),
2627 diag::warn_bad_cxx_cast_nested_pointer_addr_space)
2640 return SuccessResult;
2646 if (!
Self.getLangOpts().OpenCL && !
Self.getLangOpts().SYCLIsDevice)
2663 auto SrcPointeeType = SrcPtrType->getPointeeType();
2664 auto DestPointeeType = DestPtrType->getPointeeType();
2665 if (!DestPointeeType.isAddressSpaceOverlapping(SrcPointeeType,
2666 Self.getASTContext())) {
2667 msg = diag::err_bad_cxx_cast_addr_space_mismatch;
2670 auto SrcPointeeTypeWithoutAS =
2671 Self.Context.removeAddrSpaceQualType(SrcPointeeType.getCanonicalType());
2672 auto DestPointeeTypeWithoutAS =
2673 Self.Context.removeAddrSpaceQualType(DestPointeeType.getCanonicalType());
2674 if (
Self.Context.hasSameType(SrcPointeeTypeWithoutAS,
2675 DestPointeeTypeWithoutAS)) {
2676 Kind = SrcPointeeType.getAddressSpace() == DestPointeeType.getAddressSpace()
2678 : CK_AddressSpaceConversion;
2685void CastOperation::checkAddressSpaceCast(
QualType SrcType,
QualType DestType) {
2697 if (
Self.getLangOpts().OpenCL) {
2698 const Type *DestPtr, *SrcPtr;
2699 bool Nested =
false;
2700 unsigned DiagID = diag::err_typecheck_incompatible_address_space;
2701 DestPtr =
Self.getASTContext().getCanonicalType(DestType.
getTypePtr()),
2702 SrcPtr =
Self.getASTContext().getCanonicalType(SrcType.
getTypePtr());
2712 Self.getASTContext())) {
2713 Self.Diag(OpRange.getBegin(), DiagID)
2715 << SrcExpr.get()->getSourceRange();
2724 DiagID = diag::ext_nested_pointer_qualifier_mismatch;
2730 bool SrcCompatXL = this->
getLangOpts().getAltivecSrcCompat() ==
2744 bool SrcCompatGCC = this->
getLangOpts().getAltivecSrcCompat() ==
2746 if (this->
getLangOpts().AltiVec && SrcCompatGCC) {
2748 diag::err_invalid_conversion_between_vector_and_integer)
2749 << VecTy << SrcTy << R;
2755void CastOperation::CheckCXXCStyleCast(
bool FunctionalStyle,
2756 bool ListInitialization) {
2757 assert(
Self.getLangOpts().CPlusPlus);
2760 if (isPlaceholder()) {
2762 if (claimPlaceholder(BuiltinType::UnknownAny)) {
2763 SrcExpr =
Self.checkUnknownAnyCast(DestRange, DestType,
2764 SrcExpr.get(), Kind,
2765 ValueKind, BasePath);
2769 checkNonOverloadPlaceholders();
2770 if (SrcExpr.isInvalid())
2780 if (claimPlaceholder(BuiltinType::Overload)) {
2781 Self.ResolveAndFixSingleFunctionTemplateSpecialization(
2783 true, DestRange, DestType,
2784 diag::err_bad_cstyle_cast_overload);
2785 if (SrcExpr.isInvalid())
2789 SrcExpr =
Self.IgnoredValueConversions(SrcExpr.get());
2794 if (DestType->
isDependentType() || SrcExpr.get()->isTypeDependent() ||
2795 SrcExpr.get()->isValueDependent()) {
2796 assert(Kind == CK_Dependent);
2803 if (
Self.getLangOpts().HLSL) {
2804 if (CheckHLSLCStyleCast(CCK))
2809 !isPlaceholder(BuiltinType::Overload)) {
2810 SrcExpr =
Self.DefaultFunctionArrayLvalueConversion(SrcExpr.get());
2811 if (SrcExpr.isInvalid())
2817 if (
Self.CheckAltivecInitFromScalar(OpRange, DestType,
2818 SrcExpr.get()->getType())) {
2822 if (
Self.ShouldSplatAltivecScalarInCast(vecTy) &&
2823 (SrcExpr.get()->getType()->isIntegerType() ||
2824 SrcExpr.get()->getType()->isFloatingType())) {
2825 Kind = CK_VectorSplat;
2826 SrcExpr =
Self.prepareVectorSplat(DestType, SrcExpr.get());
2832 QualType SrcType = SrcExpr.get()->getType();
2834 Self.Diag(OpRange.getBegin(), diag::err_wasm_cast_table)
2835 << 1 << SrcExpr.get()->getSourceRange();
2852 unsigned msg = diag::err_bad_cxx_cast_generic;
2855 if (SrcExpr.isInvalid())
2863 if (SrcExpr.isInvalid())
2870 BasePath, ListInitialization);
2871 if (SrcExpr.isInvalid())
2877 OpRange, msg, Kind);
2878 if (SrcExpr.isInvalid())
2884 if (
Self.getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
2886 checkObjCConversion(CCK);
2889 if (SrcExpr.get()->getType() ==
Self.Context.OverloadTy) {
2900 Self.Diag(OpRange.getBegin(), diag::err_bad_cstyle_cast_overload)
2901 << OE->
getName() << DestType << OpRange
2903 Self.NoteAllOverloadCandidates(SrcExpr.get());
2907 OpRange, SrcExpr.get(), DestType, ListInitialization);
2912 if (Kind == CK_BitCast)
2916 Self.Diag(OpRange.getBegin(), DiagID)
2917 << SrcExpr.get()->getType() << DestType << OpRange;
2928 assert(
Self.getLangOpts().HLSL &&
"Must be HLSL!");
2929 QualType SrcTy = SrcExpr.get()->getType();
2933 if (
Self.HLSL().CanPerformElementwiseCast(SrcExpr.get(), DestType)) {
2935 SrcExpr =
Self.ImpCastExprToType(
2936 SrcExpr.get(),
Self.Context.getArrayParameterType(SrcTy),
2937 CK_HLSLArrayRValue,
VK_PRValue,
nullptr, CCK);
2939 SrcExpr =
Self.DefaultLvalueConversion(SrcExpr.get());
2940 Kind = CK_HLSLElementwiseCast;
2947 if (
Self.HLSL().CanPerformAggregateSplatCast(SrcExpr.get(), DestType)) {
2948 SrcExpr =
Self.DefaultLvalueConversion(SrcExpr.get());
2953 SrcExpr =
Self.ImpCastExprToType(
2955 SrcExpr.get()->getValueKind(),
nullptr, CCK);
2957 else if (MT && MT->getNumElementsFlattened() == 1)
2958 SrcExpr =
Self.ImpCastExprToType(
2959 SrcExpr.get(), MT->getElementType(), CK_HLSLMatrixTruncation,
2960 SrcExpr.get()->getValueKind(),
nullptr, CCK);
2964 SrcExpr =
Self.ImpCastExprToType(
2965 SrcExpr.get(), DVT->getElementType(),
2966 Self.PrepareScalarCast(SrcExpr, DVT->getElementType()),
2967 SrcExpr.get()->getValueKind(),
nullptr, CCK);
2968 Kind = CK_HLSLAggregateSplatCast;
2975 Self.Diag(OpRange.getBegin(), diag::err_bad_cxx_cast_generic)
2976 << 4 << SrcTy << DestType;
2988 if (
Self.Diags.isIgnored(diag::warn_bad_function_cast,
3017 diag::warn_bad_function_cast)
3022void CastOperation::CheckCStyleCast() {
3023 assert(!
Self.getLangOpts().CPlusPlus);
3026 if (claimPlaceholder(BuiltinType::UnknownAny)) {
3027 SrcExpr =
Self.checkUnknownAnyCast(DestRange, DestType,
3028 SrcExpr.get(), Kind,
3029 ValueKind, BasePath);
3037 SrcExpr =
Self.IgnoredValueConversions(SrcExpr.get());
3038 if (SrcExpr.isInvalid())
3047 if (
Self.getASTContext().isDependenceAllowed() &&
3049 SrcExpr.get()->isValueDependent())) {
3050 assert((DestType->
containsErrors() || SrcExpr.get()->containsErrors() ||
3051 SrcExpr.get()->containsErrors()) &&
3052 "should only occur in error-recovery path.");
3053 assert(Kind == CK_Dependent);
3058 if (SrcExpr.get()->getType() ==
Self.Context.OverloadTy) {
3061 SrcExpr.get(), DestType,
true, DAP))
3062 SrcExpr =
Self.FixOverloadedFunctionReference(SrcExpr.get(), DAP, FD);
3065 assert(SrcExpr.isUsable());
3067 SrcExpr =
Self.DefaultFunctionArrayLvalueConversion(SrcExpr.get());
3068 if (SrcExpr.isInvalid())
3070 QualType SrcType = SrcExpr.get()->getType();
3073 Self.Diag(OpRange.getBegin(), diag::err_wasm_cast_table)
3074 << 1 << SrcExpr.get()->getSourceRange();
3081 checkAddressSpaceCast(SrcType, DestType);
3082 if (SrcExpr.isInvalid())
3085 if (
Self.RequireCompleteType(OpRange.getBegin(), DestType,
3086 diag::err_typecheck_cast_to_incomplete)) {
3093 Self.Context.hasSameUnqualifiedType(DestType, SrcType)) {
3100 Self.isValidSveBitcast(SrcType, DestType)) {
3107 Self.RISCV().isValidRVVBitcast(SrcType, DestType)) {
3114 if (
const RecordType *DestRecordTy =
3116 if (
Self.Context.hasSameUnqualifiedType(DestType, SrcType)) {
3118 Self.Diag(OpRange.getBegin(), diag::ext_typecheck_cast_nonscalar)
3119 << DestType << SrcExpr.get()->getSourceRange();
3128 Self.Diag(OpRange.getBegin(), diag::ext_typecheck_cast_to_union)
3129 << SrcExpr.get()->getSourceRange();
3133 Self.Diag(OpRange.getBegin(), diag::err_typecheck_cast_to_union_no_type)
3134 << SrcType << SrcExpr.get()->getSourceRange();
3141 if (
Self.getLangOpts().OpenCL && DestType->
isEventT()) {
3143 if (SrcExpr.get()->EvaluateAsInt(
Result,
Self.Context)) {
3144 llvm::APSInt CastInt =
Result.Val.getInt();
3146 Kind = CK_ZeroToOCLOpaqueType;
3149 Self.Diag(OpRange.getBegin(),
3150 diag::err_opencl_cast_non_zero_to_event_t)
3151 <<
toString(CastInt, 10) << SrcExpr.get()->getSourceRange();
3158 Self.Diag(OpRange.getBegin(), diag::err_typecheck_cond_expect_scalar)
3159 << DestType << SrcExpr.get()->getSourceRange();
3169 Self.Diag(SrcExpr.get()->getExprLoc(),
3170 diag::err_typecheck_expect_scalar_operand)
3171 << SrcType << SrcExpr.get()->getSourceRange();
3186 Self.Diag(SrcExpr.get()->getExprLoc(), diag::err_nullptr_cast)
3193 Self.Context, DestType, CK_PointerToBoolean, SrcExpr.get(),
nullptr,
3202 Self.CurFPFeatureOverrides());
3207 if (!SrcExpr.get()->isNullPointerConstant(
Self.Context,
3209 Self.Diag(SrcExpr.get()->getExprLoc(), diag::err_nullptr_cast)
3218 Self.CurFPFeatureOverrides());
3222 SrcExpr =
Self.CheckExtVectorCast(OpRange, DestType, SrcExpr.get(), Kind);
3227 if (
Self.CheckMatrixCast(OpRange, DestType, SrcType, Kind))
3233 if (
Self.CheckAltivecInitFromScalar(OpRange, DestType, SrcType)) {
3237 if (
Self.ShouldSplatAltivecScalarInCast(DestVecTy) &&
3239 Kind = CK_VectorSplat;
3240 SrcExpr =
Self.prepareVectorSplat(DestType, SrcExpr.get());
3241 }
else if (
Self.CheckVectorCast(OpRange, DestType, SrcType, Kind)) {
3248 if (
Self.CheckVectorCast(OpRange, SrcType, DestType, Kind))
3259 Self.Diag(SrcExpr.get()->getExprLoc(), diag::err_cast_selector_expr);
3268 Self.Diag(SrcExpr.get()->getExprLoc(),
3269 diag::err_cast_pointer_from_non_pointer_int)
3270 << SrcType << SrcExpr.get()->getSourceRange();
3279 Self.Diag(SrcExpr.get()->getBeginLoc(),
3280 diag::err_cast_pointer_to_non_pointer_int)
3281 << DestType << SrcExpr.get()->getSourceRange();
3286 if ((
Self.Context.getTypeSize(SrcType) >
3287 Self.Context.getTypeSize(DestType)) &&
3297 : diag::warn_void_pointer_to_int_cast;
3299 Diag = diag::warn_pointer_to_enum_cast;
3301 Diag = diag::warn_pointer_to_int_cast;
3302 Self.Diag(OpRange.getBegin(),
Diag) << SrcType << DestType << OpRange;
3306 if (
Self.getLangOpts().OpenCL && !
Self.getOpenCLOptions().isAvailableOption(
3307 "cl_khr_fp16",
Self.getLangOpts())) {
3309 Self.Diag(SrcExpr.get()->getBeginLoc(), diag::err_opencl_cast_to_half)
3310 << DestType << SrcExpr.get()->getSourceRange();
3317 if (
Self.getLangOpts().allowsNonTrivialObjCLifetimeQualifiers()) {
3319 if (SrcExpr.isInvalid())
3323 if (
Self.getLangOpts().ObjCAutoRefCount && CastPtr) {
3326 Qualifiers ExprQuals = ExprPtr->getPointeeType().getQualifiers();
3328 ExprPtr->getPointeeType()->isObjCLifetimeType() &&
3330 Self.Diag(SrcExpr.get()->getBeginLoc(),
3331 diag::err_typecheck_incompatible_ownership)
3333 << SrcExpr.get()->getSourceRange();
3337 }
else if (!
Self.ObjC().CheckObjCARCUnavailableWeakConversion(DestType,
3339 Self.Diag(SrcExpr.get()->getBeginLoc(),
3340 diag::err_arc_convesion_of_weak_unavailable)
3341 << 1 << SrcType << DestType << SrcExpr.get()->getSourceRange();
3348 Self.Diag(OpRange.getBegin(), DiagID) << SrcType << DestType << OpRange;
3357 if (SrcRD && DestRD && SrcRD->
hasAttr<RandomizeLayoutAttr>() &&
3360 Self.Diag(OpRange.getBegin(), diag::err_cast_from_randomized_struct)
3361 << SrcType << DestType;
3370 Kind =
Self.PrepareScalarCast(SrcExpr, DestType);
3371 if (SrcExpr.isInvalid())
3374 if (Kind == CK_BitCast)
3378void CastOperation::CheckBuiltinBitCast() {
3379 QualType SrcType = SrcExpr.get()->getType();
3381 if (
Self.RequireCompleteType(OpRange.getBegin(), DestType,
3382 diag::err_typecheck_cast_to_incomplete) ||
3383 Self.RequireCompleteType(OpRange.getBegin(), SrcType,
3384 diag::err_incomplete_type)) {
3389 if (SrcExpr.get()->isPRValue())
3390 SrcExpr =
Self.CreateMaterializeTemporaryExpr(SrcType, SrcExpr.get(),
3393 CharUnits DestSize =
Self.Context.getTypeSizeInChars(DestType);
3394 CharUnits SourceSize =
Self.Context.getTypeSizeInChars(SrcType);
3395 if (DestSize != SourceSize) {
3396 Self.Diag(OpRange.getBegin(), diag::err_bit_cast_type_size_mismatch)
3404 Self.Diag(OpRange.getBegin(), diag::err_bit_cast_non_trivially_copyable)
3411 Self.Diag(OpRange.getBegin(), diag::err_bit_cast_non_trivially_copyable)
3417 Kind = CK_LValueToRValueBitCast;
3432 QualType TheOffendingSrcType, TheOffendingDestType;
3435 &TheOffendingSrcType, &TheOffendingDestType,
3436 &CastAwayQualifiers) !=
3437 CastAwayConstnessKind::CACK_Similar)
3441 int qualifiers = -1;
3444 }
else if (CastAwayQualifiers.
hasConst()) {
3450 if (qualifiers == -1)
3452 << SrcType << DestType;
3455 << TheOffendingSrcType << TheOffendingDestType << qualifiers;
3467 Op.CheckCXXCStyleCast(
false,
3470 Op.CheckCStyleCast();
3479 Op.checkQualifiedDestType();
3482 Context, Op.ResultType, Op.ValueKind, Op.Kind, Op.SrcExpr.
get(),
3491 assert(LPLoc.
isValid() &&
"List-initialization shouldn't get here.");
3495 CastOperation::OpRangeType(Op.DestRange.
getBegin(), LPLoc, RPLoc);
3497 Op.CheckCXXCStyleCast(
true,
false);
3501 Op.checkQualifiedDestType();
3507 Context, Op.ResultType, Op.ValueKind, CastTypeInfo, Op.Kind,
Defines the clang::ASTContext interface.
Defines the clang::Expr interface and subclasses for C++ expressions.
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.
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
Defines the clang::Preprocessor interface.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
This file declares semantic analysis functions specific to AMDGPU.
static TryCastResult TryStaticDowncast(Sema &Self, CanQualType SrcType, CanQualType DestType, bool CStyle, CastOperation::OpRangeType OpRange, QualType OrigSrcType, QualType OrigDestType, unsigned &msg, CastKind &Kind, CXXCastPath &BasePath)
TryStaticDowncast - Common functionality of TryStaticReferenceDowncast and TryStaticPointerDowncast.
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...
static TryCastResult TryStaticPointerDowncast(Sema &Self, QualType SrcType, QualType DestType, bool CStyle, CastOperation::OpRangeType OpRange, unsigned &msg, CastKind &Kind, CXXCastPath &BasePath)
Tests whether a conversion according to C++ 5.2.9p8 is valid.
static TryCastResult getCastAwayConstnessCastKind(CastAwayConstnessKind CACK, unsigned &DiagID)
static bool IsAddressSpaceConversion(QualType SrcType, QualType DestType)
@ CT_Reinterpret
reinterpret_cast
@ CT_Functional
Type(expr)
@ CT_Addrspace
addrspace_cast
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.
static TryCastResult TryReinterpretCast(Sema &Self, ExprResult &SrcExpr, QualType DestType, bool CStyle, CastOperation::OpRangeType OpRange, unsigned &msg, CastKind &Kind)
static bool isValidCast(TryCastResult TCR)
static TryCastResult TryStaticReferenceDowncast(Sema &Self, Expr *SrcExpr, QualType DestType, bool CStyle, CastOperation::OpRangeType OpRange, unsigned &msg, CastKind &Kind, CXXCastPath &BasePath)
Tests whether a conversion according to C++ 5.2.9p5 is valid.
static bool argTypeIsABIEquivalent(QualType SrcType, QualType DestType, ASTContext &Context)
static unsigned int checkCastFunctionType(Sema &Self, const ExprResult &SrcExpr, QualType DestType)
static TryCastResult TryLValueToRValueCast(Sema &Self, Expr *SrcExpr, QualType DestType, bool CStyle, SourceRange OpRange, CastKind &Kind, CXXCastPath &BasePath, unsigned &msg)
Tests whether a conversion according to N2844 is valid.
@ TC_Success
The cast method is appropriate and successful.
@ TC_Extension
The cast method is appropriate and accepted as a language extension.
@ TC_Failed
The cast method is appropriate, but failed.
@ TC_NotApplicable
The cast method is not applicable.
static void DiagnoseReinterpretUpDownCast(Sema &Self, const Expr *SrcExpr, QualType DestType, CastOperation::OpRangeType OpRange)
Check that a reinterpret_cast<DestType>(SrcExpr) is not used as upcast or downcast between respective...
static void DiagnoseCastQual(Sema &Self, const ExprResult &SrcExpr, QualType DestType)
DiagnoseCastQual - Warn whenever casts discards a qualifiers, be it either const, volatile or both.
static TryCastResult TryStaticMemberPointerUpcast(Sema &Self, ExprResult &SrcExpr, QualType SrcType, QualType DestType, bool CStyle, CastOperation::OpRangeType OpRange, unsigned &msg, CastKind &Kind, CXXCastPath &BasePath)
TryStaticMemberPointerUpcast - Tests whether a conversion according to C++ 5.2.9p9 is valid:
static void DiagnoseCallingConvCast(Sema &Self, const ExprResult &SrcExpr, QualType DstType, CastOperation::OpRangeType OpRange)
Diagnose casts that change the calling convention of a pointer to a function defined in the current T...
static TryCastResult TryStaticCast(Sema &Self, ExprResult &SrcExpr, QualType DestType, CheckedConversionKind CCK, CastOperation::OpRangeType OpRange, unsigned &msg, CastKind &Kind, CXXCastPath &BasePath, bool ListInitialization)
TryStaticCast - Check if a static cast can be performed, and do so if possible.
static void DiagnoseCastOfObjCSEL(Sema &Self, const ExprResult &SrcExpr, QualType DestType)
static void DiagnoseBadFunctionCast(Sema &Self, const ExprResult &SrcExpr, QualType DestType)
DiagnoseBadFunctionCast - Warn whenever a function call is cast to a non-matching type.
static TryCastResult TryStaticImplicitCast(Sema &Self, ExprResult &SrcExpr, QualType DestType, CheckedConversionKind CCK, CastOperation::OpRangeType OpRange, unsigned &msg, CastKind &Kind, bool ListInitialization)
TryStaticImplicitCast - Tests whether a conversion according to C++ 5.2.9p2 is valid:
static bool fixOverloadedReinterpretCastExpr(Sema &Self, QualType DestType, ExprResult &Result)
static bool tryDiagnoseOverloadedCast(Sema &S, CastType CT, CastOperation::OpRangeType range, Expr *src, QualType destType, bool listInitialization)
Try to diagnose a failed overloaded cast.
static void diagnoseBadCast(Sema &S, unsigned msg, CastType castType, CastOperation::OpRangeType opRange, Expr *src, QualType destType, bool listInitialization)
Diagnose a failed cast.
static CastAwayConstnessKind unwrapCastAwayConstnessLevel(ASTContext &Context, QualType &T1, QualType &T2)
Unwrap one level of types for CastsAwayConstness.
static void checkIntToPointerCast(bool CStyle, const SourceRange &OpRange, const Expr *SrcExpr, QualType DestType, Sema &Self)
static TryCastResult TryAddressSpaceCast(Sema &Self, ExprResult &SrcExpr, QualType DestType, bool CStyle, unsigned &msg, CastKind &Kind)
This file declares semantic analysis for HLSL constructs.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis functions specific to RISC-V.
static QualType getPointeeType(const MemRegion *R)
TextDiagnosticBuffer::DiagList DiagList
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
const LangOptions & getLangOpts() const
ASTRecordLayout - This class contains layout information for one RecordDecl, which is a struct/union/...
CharUnits getBaseClassOffset(const CXXRecordDecl *Base) const
getBaseClassOffset - Get the offset, in chars, for the given base class.
Represents a C++2a __builtin_bit_cast(T, v) expression.
static CStyleCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind K, Expr *Op, const CXXCastPath *BasePath, FPOptionsOverride FPO, TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation R)
static CXXAddrspaceCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind Kind, Expr *Op, TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation RParenLoc, SourceRange AngleBrackets)
Represents a path from a specific derived class (which is not represented as part of the path) to a p...
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
const RecordType * getDetectedVirtual() const
The virtual base discovered on the path (if we are merely detecting virtuals).
bool isRecordingPaths() const
Whether we are recording paths.
void setRecordingPaths(bool RP)
Specify whether we should be recording paths or not.
void clear()
Clear the base-paths results.
std::list< CXXBasePath >::const_iterator const_paths_iterator
bool isAmbiguous(CanQualType BaseType) const
Determine whether the path from the most-derived type to the given base type is ambiguous (i....
static CXXConstCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, Expr *Op, TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation RParenLoc, SourceRange AngleBrackets)
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)
static CXXFunctionalCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, TypeSourceInfo *Written, CastKind Kind, Expr *Op, const CXXCastPath *Path, FPOptionsOverride FPO, SourceLocation LPLoc, SourceLocation RPLoc)
Represents a static or instance method of a struct/union/class.
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
Represents a C++ struct/union/class.
CXXRecordDecl * getDefinition() const
bool isDerivedFrom(const CXXRecordDecl *Base) const
Determine whether this class is derived from the class Base.
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)
static CXXStaticCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind K, Expr *Op, const CXXCastPath *Path, TypeSourceInfo *Written, FPOptionsOverride FPO, SourceLocation L, SourceLocation RParenLoc, SourceRange AngleBrackets)
bool isAtLeastAsQualifiedAs(CanQual< T > Other, const ASTContext &Ctx) const
Determines whether this canonical type is at least as qualified as the Other canonical type.
CanQual< T > getUnqualifiedType() const
Retrieve the unqualified form of this type.
CanProxy< U > getAs() const
Retrieve a canonical type pointer with a different static type, upcasting or downcasting as needed.
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
static const FieldDecl * getTargetFieldForToUnionCast(QualType unionType, QualType opType)
CharUnits - This is an opaque type for sizes expressed in character units.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
static CharUnits Zero()
Zero - Construct a CharUnits quantity of zero.
Represents a concrete matrix type with constant number of rows and columns.
A POD class for pairing a NamedDecl* with an access specifier.
bool isInvalidDecl() const
Information about one declarator, including the parsed type information and the identifier.
bool isInvalidType() const
bool isFixed() const
Returns true if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying...
This represents one expression.
bool isIntegerConstantExpr(const ASTContext &Ctx) const
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
bool isLValue() const
isLValue - True if this expression is an "l-value" according to the rules of the current language.
@ NPC_NeverValueDependent
Specifies that the expression should never be value-dependent.
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
bool refersToBitField() const
Returns true if this expression is a gl-value that potentially refers to a bit-field.
static ExprValueKind getValueKindForType(QualType T)
getValueKindForType - Given a formal return or parameter type, give its value kind.
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
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.
Represents a function declaration or definition.
Represents a prototype with parameter type info, e.g.
FunctionType - C99 6.7.5.3 - Function Declarators.
static StringRef getNameForCallConv(CallingConv CC)
CallingConv getCallConv() const
QualType getReturnType() const
One of these records is kept for each identifier that is lexed.
tok::TokenKind getTokenID() const
If this is a source-language token (e.g.
bool isKeyword(const LangOptions &LangOpts) const
Return true if this token is a keyword in the specified language.
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
Describes the kind of initialization being performed, along with location information for tokens rela...
static InitializationKind CreateCast(SourceRange TypeRange)
Create a direct initialization due to a cast that isn't a C-style or functional cast.
static InitializationKind CreateFunctionalCast(SourceLocation StartLoc, SourceRange ParenRange, bool InitList)
Create a direct initialization for a functional cast.
static InitializationKind CreateCStyleCast(SourceLocation StartLoc, SourceRange TypeRange, bool InitList)
Create a direct initialization for a C-style cast.
Describes the sequence of initializations required to initialize a given object or reference with a s...
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.
FailureKind getFailureKind() const
Determine why initialization failed.
OverloadingResult getFailedOverloadResult() const
Get the overloading result, for when the initialization sequence failed due to a bad overload.
bool Failed() const
Determine whether the initialization sequence is invalid.
@ FK_UserConversionOverloadFailed
Overloading for a user-defined conversion failed.
@ FK_ConstructorOverloadFailed
Overloading for initialization by constructor failed.
@ FK_ParenthesizedListInitFailed
Parenthesized list initialization failed at some point.
bool isConstructorInitialization() const
Determine whether this initialization is direct call to a constructor.
OverloadCandidateSet & getFailedCandidateSet()
Retrieve a reference to the candidate set when overload resolution fails.
Describes an entity that is being initialized.
static InitializedEntity InitializeTemporary(QualType Type)
Create the initialization entity for a temporary.
Represents a matrix type, as defined in the Matrix Types clang extensions.
A pointer to member type per C++ 8.3.3 - Pointers to members.
bool isMemberFunctionPointer() const
Returns true if the member type (i.e.
SourceRange getSourceRange() const LLVM_READONLY
Retrieve the source range covering the entirety of this nested-name-specifier.
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
SmallVectorImpl< OverloadCandidate >::iterator iterator
void NoteCandidates(PartialDiagnosticAt PA, 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...
OverloadingResult BestViableFunction(Sema &S, SourceLocation Loc, OverloadCandidateSet::iterator &Best)
Find the best viable function on this overload set, if it exists.
A reference to an overloaded function set, either an UnresolvedLookupExpr or an UnresolvedMemberExpr.
static FindResult find(Expr *E)
Finds the overloaded expression in the given expression E of OverloadTy.
NestedNameSpecifierLoc getQualifierLoc() const
Fetches the nested-name qualifier with source-location information, if one was given.
DeclarationName getName() const
Gets the name looked up.
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
IdentifierInfo * getIdentifierInfo(StringRef Name) const
Return information about the specified preprocessor identifier token.
StringRef getLastMacroWithSpelling(SourceLocation Loc, ArrayRef< TokenValue > Tokens) const
Return the name of the macro defined before Loc that has spelling Tokens.
A (possibly-)qualified type.
bool isTriviallyCopyableType(const ASTContext &Context) const
Return true if this is a trivially copyable type (C++0x [basic.types]p9)
QualType getNonLValueExprType(const ASTContext &Context) const
Determine the type of a (typically non-lvalue) expression with the specified result type.
bool isAddressSpaceOverlapping(QualType T, const ASTContext &Ctx) const
Returns true if address space qualifiers overlap with T address space qualifiers.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
LangAS getAddressSpace() const
Return the address space of this type.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
QualType withCVRQualifiers(unsigned CVR) const
unsigned getCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers applied to this type.
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
bool isAtLeastAsQualifiedAs(QualType Other, const ASTContext &Ctx) const
Determine whether this type is at least as qualified as the other given type, requiring exact equalit...
The collection of all-type qualifiers we support.
unsigned getCVRQualifiers() const
void removeObjCLifetime()
bool compatiblyIncludes(Qualifiers other, const ASTContext &Ctx) const
Determines if these qualifiers compatibly include another set.
static bool isAddressSpaceSupersetOf(LangAS A, LangAS B, const ASTContext &Ctx)
Returns true if address space A is equal to or a superset of B.
static Qualifiers fromCVRMask(unsigned CVR)
bool compatiblyIncludesObjCLifetime(Qualifiers other) const
Determines if these qualifiers compatibly include another set of qualifiers from the narrow perspecti...
An rvalue reference type, per C++11 [dcl.ref].
Represents a struct/union/class.
RecordDecl * getDefinition() const
Returns the RecordDecl that actually defines this struct/union/class.
Base for LValueReferenceType and RValueReferenceType.
QualType getPointeeType() const
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
Sema - This implements semantic analysis and AST building for C.
ReferenceCompareResult
ReferenceCompareResult - Expresses the result of comparing two types (cv1 T1 and cv2 T2) to determine...
@ Ref_Incompatible
Ref_Incompatible - The two types are incompatible, so direct reference binding is not possible.
@ Ref_Compatible
Ref_Compatible - The two types are reference-compatible.
ExprResult BuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, QualType Type, SourceLocation LParenLoc, Expr *CastExpr, SourceLocation RParenLoc)
ExprResult BuildBuiltinBitCastExpr(SourceLocation KWLoc, TypeSourceInfo *TSI, Expr *Operand, SourceLocation RParenLoc)
FPOptionsOverride CurFPFeatureOverrides()
bool ShouldSplatAltivecScalarInCast(const VectorType *VecTy)
ExprResult ActOnBuiltinBitCastExpr(SourceLocation KWLoc, Declarator &Dcl, ExprResult Operand, SourceLocation RParenLoc)
const LangOptions & getLangOpts() const
void CheckExtraCXXDefaultArguments(Declarator &D)
CheckExtraCXXDefaultArguments - Check for any extra default arguments in the declarator,...
ExprResult BuildCStyleCastExpr(SourceLocation LParenLoc, TypeSourceInfo *Ty, SourceLocation RParenLoc, Expr *Op)
ReferenceConversionsScope::ReferenceConversions ReferenceConversions
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,addrspace}_cast's.
void DiscardMisalignedMemberAddress(const Type *T, Expr *E)
This function checks if the expression is in the sef of potentially misaligned members and it is conv...
void CheckCompatibleReinterpretCast(QualType SrcType, QualType DestType, bool IsDereference, SourceRange Range)
TypeSourceInfo * GetTypeForDeclaratorCast(Declarator &D, QualType FromTy)
DiagnosticsEngine & Diags
ExprResult BuildCXXNamedCast(SourceLocation OpLoc, tok::TokenKind Kind, TypeSourceInfo *Ty, Expr *E, SourceRange AngleBrackets, SourceRange Parens)
bool CheckAltivecInitFromScalar(SourceRange R, QualType VecTy, QualType SrcTy)
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
A trivial tuple used to represent a source range.
SourceLocation getBegin() const
SourceLocation getEndLoc() const LLVM_READONLY
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteral - This represents a string literal expression, e.g.
StringRef getString() const
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
Stores token information for comparing actual tokens with predefined values.
Base wrapper for a particular "section" of type source info.
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
SourceLocation getEndLoc() const
Get the end source location.
SourceLocation getBeginLoc() const
Get the begin source location.
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
QualType getType() const
Return the type wrapped by this type source info.
The base class of the type hierarchy.
bool isIncompleteOrObjectType() const
Return true if this is an incomplete or object type, in other words, not a function type.
bool isBlockPointerType() const
bool isBooleanType() const
bool isFunctionReferenceType() const
bool isPlaceholderType() const
Test for a type which does not represent an actual type-system type but is instead used as a placehol...
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
bool isComplexType() const
isComplexType() does not include complex integers (a GCC extension).
bool isRValueReferenceType() const
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isConstantArrayType() const
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool isVoidPointerType() const
bool isFunctionPointerType() const
bool isArithmeticType() const
bool isPointerType() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isEnumeralType() const
bool isScalarType() const
const CXXRecordDecl * getPointeeCXXRecordDecl() const
If this is a pointer or reference to a RecordType, return the CXXRecordDecl that the type refers to.
bool isSizelessBuiltinType() const
bool isIntegralType(const ASTContext &Ctx) const
Determine whether this type is an integral type.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
bool isExtVectorType() const
bool isAnyCharacterType() const
Determine whether this type is any of the built-in character types.
bool isLValueReferenceType() const
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isFixedPointType() const
Return true if this is a fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
const BuiltinType * getAsPlaceholderType() const
bool isWebAssemblyTableType() const
Returns true if this is a WebAssembly table type: either an array of reference types,...
bool containsErrors() const
Whether this type is an error type.
bool isMemberPointerType() const
bool isMatrixType() const
EnumDecl * castAsEnumDecl() const
bool isComplexIntegerType() const
bool isObjCObjectType() const
bool isObjCLifetimeType() const
Returns true if objects of this type have lifetime semantics under ARC.
bool isFunctionType() const
bool isObjCObjectPointerType() const
bool isMemberFunctionPointerType() const
bool isVectorType() const
bool isRealFloatingType() const
Floating point categories.
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
bool isFloatingType() const
bool isUnsignedIntegerType() const
Return true if this is an integer type that is unsigned, according to C99 6.2.5p6 [which returns true...
bool isAnyPointerType() const
const T * getAs() const
Member-template getAs<specific type>'.
bool isNullPtrType() const
bool isRecordType() const
bool isFunctionNoProtoType() const
Represents a GCC generic vector type.
unsigned getNumElements() const
VectorKind getVectorKind() const
QualType getElementType() const
Defines the clang::TargetInfo interface.
const internal::VariadicDynCastAllOfMatcher< Stmt, CastExpr > castExpr
Matches any cast nodes of Clang's AST.
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
bool isa(CodeGen::Address addr)
OverloadingResult
OverloadingResult - Capture the result of performing overload resolution.
@ OR_Deleted
Succeeded, but refers to a deleted function.
@ OR_Success
Overload resolution succeeded.
@ OR_Ambiguous
Ambiguous candidates found.
@ OR_No_Viable_Function
No viable function found.
OverloadCandidateDisplayKind
@ OCD_AmbiguousCandidates
Requests that only tied-for-best candidates be shown.
@ OCD_ViableCandidates
Requests that only viable candidates be shown.
@ OCD_AllCandidates
Requests that all candidates be shown.
@ OK_VectorComponent
A vector component is an element or range of elements of a vector.
@ OK_ObjCProperty
An Objective-C property is a logical field of an Objective-C object which is read and written via Obj...
@ OK_ObjCSubscript
An Objective-C array/dictionary subscripting which reads an object or writes at the subscripted array...
@ OK_Ordinary
An ordinary object is located at an address in memory.
@ OK_BitField
A bitfield object is a bitfield on a C or C++ record.
@ OK_MatrixComponent
A matrix component is a single element or range of elements of a matrix.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ Result
The result type of a method or function.
CastKind
CastKind - The kind of operation required for a conversion.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ConceptReference *C)
Insertion operator for diagnostics.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
@ AltiVecBool
is AltiVec 'vector bool ...'
@ AltiVecVector
is AltiVec vector
@ AltiVecPixel
is AltiVec 'vector Pixel'
U cast(CodeGen::Address addr)
@ None
The alignment was not explicit in code.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
ActionResult< Expr * > ExprResult
@ Parens
New-expression has a C++98 paren-delimited initializer.
CheckedConversionKind
The kind of conversion being performed.
@ CStyleCast
A C-style cast.
@ OtherCast
A cast other than a C-style cast.
@ FunctionalCast
A functional-style cast.
Represents an element in a path from a derived class to a base class.
EvalResult is a struct with detailed info about an evaluated expression.
OverloadExpr * Expression