65#include "llvm/ADT/STLExtras.h"
66#include "llvm/ADT/StringExtras.h"
67#include "llvm/Support/ConvertUTF.h"
68#include "llvm/Support/SaveAndRestore.h"
69#include "llvm/Support/TimeProfiler.h"
70#include "llvm/Support/TypeSize.h"
95 if (TreatUnavailableAsInvalid &&
113 if (
const auto *A = D->
getAttr<UnusedAttr>()) {
116 if (A->getSemanticSpelling() != UnusedAttr::CXX11_maybe_unused &&
117 A->getSemanticSpelling() != UnusedAttr::C23_maybe_unused) {
119 if (DC && !DC->
hasAttr<UnusedAttr>())
120 S.
Diag(Loc, diag::warn_used_but_marked_unused) << D;
128 if (
Decl->isDefaulted()) {
139 auto *Ctor = dyn_cast<CXXConstructorDecl>(
Decl);
140 if (Ctor && Ctor->isInheritingConstructor())
151 if (I->getStorageClass() !=
SC_None)
202 DiagID = diag::warn_c2y_compat_internal_in_extern_inline;
203 else if ((UsedFn && (UsedFn->
isInlined() || UsedFn->
hasAttr<ConstAttr>())) ||
205 DiagID = diag::ext_internal_in_extern_inline_quiet;
207 DiagID = diag::ext_internal_in_extern_inline;
209 S.
Diag(Loc, DiagID) << !UsedFn << D;
221 Diag(DeclBegin, diag::note_convert_inline_to_static)
228 bool ObjCPropertyAccess,
229 bool AvoidPartialAvailabilityChecks,
231 bool SkipTrailingRequiresClause) {
238 for (
const auto &[DiagLoc, PD] : Pos->second) {
252 Diag(Loc, diag::ext_main_used);
260 Diag(Loc, diag::err_binding_cannot_appear_in_own_initializer)
263 Diag(Loc, diag::err_auto_variable_cannot_appear_in_own_initializer)
272 if (FD->isDeleted()) {
273 auto *Ctor = dyn_cast<CXXConstructorDecl>(FD);
274 if (Ctor && Ctor->isInheritingConstructor())
275 Diag(Loc, diag::err_deleted_inherited_ctor_use)
277 << Ctor->getInheritedConstructor().getConstructor()->getParent();
280 Diag(Loc, diag::err_deleted_function_use)
281 << (Msg !=
nullptr) << (Msg ? Msg->
getString() : StringRef());
295 if (!SkipTrailingRequiresClause && FD->getTrailingRequiresClause()) {
304 diag::err_reference_to_function_with_unsatisfied_constraints)
322 if (
auto *
Concept = dyn_cast<ConceptDecl>(D);
326 if (
auto *MD = dyn_cast<CXXMethodDecl>(D)) {
328 if (MD->getParent()->isLambda() &&
331 MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator())) {
332 Diag(Loc, diag::warn_cxx17_compat_lambda_def_ctor_assign)
337 auto getReferencedObjCProp = [](
const NamedDecl *D) ->
339 if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D))
340 return MD->findPropertyDecl();
354 auto *DRD = dyn_cast<OMPDeclareReductionDecl>(
CurContext);
357 Diag(Loc, diag::err_omp_wrong_var_in_declare_reduction)
370 Diag(Loc, diag::err_omp_declare_mapper_wrong_var)
376 if (
const auto *EmptyD = dyn_cast<UnresolvedUsingIfExistsDecl>(D)) {
377 Diag(Loc, diag::err_use_of_empty_using_if_exists);
378 Diag(EmptyD->getLocation(), diag::note_empty_using_if_exists_here);
383 AvoidPartialAvailabilityChecks, ClassReceiver);
389 if (D->
hasAttr<AvailableOnlyInDefaultEvalMethodAttr>()) {
392 PP.getLastFPEvalPragmaLocation().isValid() &&
393 PP.getCurrentFPEvalMethod() !=
getLangOpts().getFPEvalMethod())
395 diag::err_type_available_only_in_default_eval_method)
399 if (
auto *VD = dyn_cast<ValueDecl>(D))
404 if (!
Context.getTargetInfo().isTLSSupported())
405 if (
const auto *VD = dyn_cast<VarDecl>(D))
407 targetDiag(*Locs.begin(), diag::err_thread_unsupported);
418 const SentinelAttr *
Attr = D->
getAttr<SentinelAttr>();
423 unsigned NumFormalParams;
427 enum { CK_Function, CK_Method, CK_Block } CalleeKind;
429 if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D)) {
430 NumFormalParams = MD->param_size();
431 CalleeKind = CK_Method;
432 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
433 NumFormalParams = FD->param_size();
434 CalleeKind = CK_Function;
435 }
else if (
const auto *VD = dyn_cast<VarDecl>(D)) {
442 CalleeKind = CK_Function;
445 CalleeKind = CK_Block;
450 if (
const auto *proto = dyn_cast<FunctionProtoType>(Fn))
451 NumFormalParams = proto->getNumParams();
462 unsigned NullPos =
Attr->getNullPos();
463 assert((NullPos == 0 || NullPos == 1) &&
"invalid null position on sentinel");
464 NumFormalParams = (NullPos > NumFormalParams ? 0 : NumFormalParams - NullPos);
467 unsigned NumArgsAfterSentinel =
Attr->getSentinel();
471 if (Args.size() < NumFormalParams + NumArgsAfterSentinel + 1) {
478 const Expr *SentinelExpr = Args[Args.size() - NumArgsAfterSentinel - 1];
483 if (
Context.isSentinelNullExpr(SentinelExpr))
491 std::string NullValue;
492 if (CalleeKind == CK_Method &&
PP.isMacroDefined(
"nil"))
495 NullValue =
"nullptr";
496 else if (
PP.isMacroDefined(
"NULL"))
499 NullValue =
"(void*) 0";
502 Diag(Loc, diag::warn_missing_sentinel) <<
int(CalleeKind);
504 Diag(MissingNilLoc, diag::warn_missing_sentinel)
529 assert(!Ty.
isNull() &&
"DefaultFunctionArrayConversion - missing type");
533 if (
auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl()))
538 CK_FunctionToPointerDecay).
get();
553 CK_ArrayToPointerDecay);
569 if (UO && UO->getOpcode() == UO_Deref &&
570 UO->getSubExpr()->getType()->isPointerType()) {
572 UO->getSubExpr()->getType()->getPointeeType().getAddressSpace();
575 UO->getSubExpr()->IgnoreParenCasts()->isNullPointerConstant(
577 !UO->getType().isVolatileQualified()) {
579 S.
PDiag(diag::warn_indirection_through_null)
580 << UO->getSubExpr()->getSourceRange());
582 S.
PDiag(diag::note_indirection_through_null));
602 BaseType = BaseType->getPointeeType();
614 if (ObjectSetClass) {
658 assert(!T.isNull() &&
"r-value conversion on typeless expression?");
662 if (T->canDecayToPointerType())
668 if (T ==
Context.OverloadTy || T->isRecordType() ||
669 (T->isDependentType() && !T->isAnyPointerType() &&
670 !T->isMemberPointerType()))
694 &
Context.Idents.get(
"object_getClass"),
700 SourceRange(OISA->getOpLoc(), OISA->getIsaMemberLoc()),
")");
717 if (T.hasQualifiers())
718 T = T.getUnqualifiedType();
721 if (T->isMemberPointerType() &&
722 Context.getTargetInfo().getCXXABI().isMicrosoft())
733 Cleanup.setExprNeedsCleanups(
true);
736 Cleanup.setExprNeedsCleanups(
true);
743 CastKind CK = T->isNullPtrType() ? CK_NullToPointer : CK_LValueToRValue;
751 T =
Atomic->getValueType().getUnqualifiedType();
776 CK_FunctionToPointerDecay);
790 assert(!Ty.
isNull() &&
"UsualUnaryFPConversions - missing type");
796 PP.getLastFPEvalPragmaLocation().isValid())) {
797 switch (EvalMethod) {
799 llvm_unreachable(
"Unrecognized float evaluation method");
802 llvm_unreachable(
"Float evaluation method should be set by now");
810 CK_FloatingComplexCast)
819 CK_FloatingComplexCast)
851 assert(!Ty.
isNull() &&
"UsualUnaryConversions - missing type");
875 if (
Context.isPromotableIntegerType(Ty)) {
890 assert(!Ty.
isNull() &&
"DefaultArgumentPromotion - missing type");
902 if (BTy && (BTy->
getKind() == BuiltinType::Half ||
903 BTy->
getKind() == BuiltinType::Float)) {
906 if (BTy->
getKind() == BuiltinType::Half) {
917 Context.getTypeSizeInChars(BTy) <
923 assert(8 ==
Context.getTypeSizeInChars(
Context.LongLongTy).getQuantity() &&
924 "Unexpected typesize for LongLongTy");
978 if (
Context.getTargetInfo().getTriple().isWasm() &&
993 if (!
Record->hasNonTrivialCopyConstructor() &&
994 !
Record->hasNonTrivialMoveConstructor() &&
995 !
Record->hasNonTrivialDestructor())
1028 PDiag(diag::warn_cxx98_compat_pass_non_pod_arg_to_vararg) << Ty << CT);
1035 PDiag(diag::warn_pass_class_arg_to_vararg)
1043 PDiag(diag::warn_cannot_pass_non_pod_arg_to_vararg)
1050 diag::err_cannot_pass_non_trivial_c_struct_to_vararg)
1054 PDiag(diag::err_cannot_pass_objc_interface_to_vararg)
1067 if (PlaceholderTy->getKind() == BuiltinType::ARCUnbridgedCast &&
1069 (FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>()))) {
1108 if (
Call.isInvalid())
1113 if (Comma.isInvalid())
1120 diag::err_call_incomplete_argument))
1138 if (SkipCast)
return false;
1145 CK_IntegralComplexToFloatingComplex);
1163 bool PromotePrecision) {
1168 if (PromotePrecision) {
1173 if (LongerIsComplex)
1185 QualType RHSType,
bool IsCompAssign) {
1210 bool ConvertFloat,
bool ConvertInt) {
1215 CK_IntegralToFloating);
1226 CK_IntegralComplexToFloatingComplex);
1231 CK_FloatingRealToComplex);
1240 QualType RHSType,
bool IsCompAssign) {
1250 else if (!IsCompAssign)
1252 return LHSFloat ? LHSType : RHSType;
1257 if (LHSFloat && RHSFloat) {
1264 assert(order < 0 &&
"illegal float comparison");
1298 QualType LHSElem = LHSComplex ? LHSComplex->getElementType() : LHSType;
1304 if ((&LHSSem != &llvm::APFloat::PPCDoubleDouble() ||
1305 &RHSSem != &llvm::APFloat::IEEEquad()) &&
1306 (&LHSSem != &llvm::APFloat::IEEEquad() ||
1307 &RHSSem != &llvm::APFloat::PPCDoubleDouble()))
1324 CK_IntegralComplexCast);
1330template <PerformCastFn doLHSCast, PerformCastFn doRHSCast>
1333 QualType RHSType,
bool IsCompAssign) {
1338 if (LHSSigned == RHSSigned) {
1341 RHS = (*doRHSCast)(S, RHS.
get(), LHSType);
1343 }
else if (!IsCompAssign)
1344 LHS = (*doLHSCast)(S, LHS.
get(), RHSType);
1346 }
else if (order != (LHSSigned ? 1 : -1)) {
1350 RHS = (*doRHSCast)(S, RHS.
get(), LHSType);
1352 }
else if (!IsCompAssign)
1353 LHS = (*doLHSCast)(S, LHS.
get(), RHSType);
1360 RHS = (*doRHSCast)(S, RHS.
get(), LHSType);
1362 }
else if (!IsCompAssign)
1363 LHS = (*doLHSCast)(S, LHS.
get(), RHSType);
1372 RHS = (*doRHSCast)(S, RHS.
get(), result);
1374 LHS = (*doLHSCast)(S, LHS.
get(), result);
1384 bool IsCompAssign) {
1388 if (LHSComplexInt && RHSComplexInt) {
1393 (S, LHS, RHS, LHSEltType, RHSEltType, IsCompAssign);
1398 if (LHSComplexInt) {
1402 (S, LHS, RHS, LHSEltType, RHSType, IsCompAssign);
1405 CK_IntegralRealToComplex);
1410 assert(RHSComplexInt);
1415 (S, LHS, RHS, LHSType, RHSEltType, IsCompAssign);
1420 CK_IntegralRealToComplex);
1428 bool IsCompAssign) {
1430 const auto *LhsOBT = LHSType->
getAs<OverflowBehaviorType>();
1431 const auto *RhsOBT = RHSType->
getAs<OverflowBehaviorType>();
1434 "Non-integer type conversion not supported for OverflowBehaviorTypes");
1437 LhsOBT && LhsOBT->getBehaviorKind() ==
1438 OverflowBehaviorType::OverflowBehaviorKind::Trap;
1440 RhsOBT && RhsOBT->getBehaviorKind() ==
1441 OverflowBehaviorType::OverflowBehaviorKind::Trap;
1443 LhsOBT && LhsOBT->getBehaviorKind() ==
1444 OverflowBehaviorType::OverflowBehaviorKind::Wrap;
1446 RhsOBT && RhsOBT->getBehaviorKind() ==
1447 OverflowBehaviorType::OverflowBehaviorKind::Wrap;
1449 QualType LHSUnderlyingType = LhsOBT ? LhsOBT->getUnderlyingType() : LHSType;
1450 QualType RHSUnderlyingType = RhsOBT ? RhsOBT->getUnderlyingType() : RHSType;
1452 std::optional<OverflowBehaviorType::OverflowBehaviorKind> DominantBehavior;
1453 if (LHSHasTrap || RHSHasTrap)
1454 DominantBehavior = OverflowBehaviorType::OverflowBehaviorKind::Trap;
1455 else if (LHSHasWrap || RHSHasWrap)
1456 DominantBehavior = OverflowBehaviorType::OverflowBehaviorKind::Wrap;
1458 QualType LHSConvType = LHSUnderlyingType;
1459 QualType RHSConvType = RHSUnderlyingType;
1460 if (DominantBehavior) {
1461 if (!LhsOBT || LhsOBT->getBehaviorKind() != *DominantBehavior)
1465 LHSConvType = LHSType;
1467 if (!RhsOBT || RhsOBT->getBehaviorKind() != *DominantBehavior)
1471 RHSConvType = RHSType;
1475 S, LHS, RHS, LHSConvType, RHSConvType, IsCompAssign);
1483 assert(BTy &&
"Expected a builtin type.");
1485 switch (BTy->getKind()) {
1486 case BuiltinType::ShortFract:
1487 case BuiltinType::UShortFract:
1488 case BuiltinType::SatShortFract:
1489 case BuiltinType::SatUShortFract:
1491 case BuiltinType::Fract:
1492 case BuiltinType::UFract:
1493 case BuiltinType::SatFract:
1494 case BuiltinType::SatUFract:
1496 case BuiltinType::LongFract:
1497 case BuiltinType::ULongFract:
1498 case BuiltinType::SatLongFract:
1499 case BuiltinType::SatULongFract:
1501 case BuiltinType::ShortAccum:
1502 case BuiltinType::UShortAccum:
1503 case BuiltinType::SatShortAccum:
1504 case BuiltinType::SatUShortAccum:
1506 case BuiltinType::Accum:
1507 case BuiltinType::UAccum:
1508 case BuiltinType::SatAccum:
1509 case BuiltinType::SatUAccum:
1511 case BuiltinType::LongAccum:
1512 case BuiltinType::ULongAccum:
1513 case BuiltinType::SatLongAccum:
1514 case BuiltinType::SatULongAccum:
1517 if (BTy->isInteger())
1519 llvm_unreachable(
"Unexpected fixed point or integer type");
1531 "Expected at least one of the operands to be a fixed point type");
1534 "Special fixed point arithmetic operation conversions are only "
1535 "applied to ints or other fixed point types");
1557 QualType ResultTy = LHSTyRank > RHSTyRank ? LHSTy : RHSTy;
1580 REnum = R->isUnscopedEnumerationType();
1582 if ((!IsCompAssign && LEnum && R->isFloatingType()) ||
1586 ? diag::warn_arith_conv_enum_float_cxx20
1587 : diag::warn_arith_conv_enum_float)
1590 }
else if (!IsCompAssign && LEnum && REnum &&
1591 !
Context.hasSameUnqualifiedType(L, R)) {
1596 DiagID = diag::warn_conv_mixed_enum_types_cxx26;
1597 else if (!L->
castAsCanonical<EnumType>()->getDecl()->hasNameForLinkage() ||
1598 !R->castAsCanonical<EnumType>()->getDecl()->hasNameForLinkage()) {
1603 ? diag::warn_arith_conv_mixed_anon_enum_types_cxx20
1604 : diag::warn_arith_conv_mixed_anon_enum_types;
1609 ? diag::warn_conditional_mixed_enum_types_cxx20
1610 : diag::warn_conditional_mixed_enum_types;
1615 ? diag::warn_comparison_mixed_enum_types_cxx20
1616 : diag::warn_comparison_mixed_enum_types;
1619 ? diag::warn_arith_conv_mixed_enum_types_cxx20
1620 : diag::warn_arith_conv_mixed_enum_types;
1623 << (int)ACK << L << R;
1641 auto IsSingleCodeUnitCP = [](
const QualType &T,
const llvm::APSInt &
Value) {
1642 if (T->isChar8Type())
1643 return llvm::IsSingleCodeUnitUTF8Codepoint(
Value.getExtValue());
1644 if (T->isChar16Type())
1645 return llvm::IsSingleCodeUnitUTF16Codepoint(
Value.getExtValue());
1646 assert(T->isChar32Type());
1647 return llvm::IsSingleCodeUnitUTF32Codepoint(
Value.getExtValue());
1660 if (LHSSuccess != RHSuccess) {
1662 if (IsSingleCodeUnitCP(LHSType, Res.
Val.
getInt()) &&
1663 IsSingleCodeUnitCP(RHSType, Res.
Val.
getInt()))
1667 if (!LHSSuccess || !RHSuccess) {
1668 SemaRef.
Diag(Loc, diag::warn_comparison_unicode_mixed_types)
1674 llvm::APSInt LHSValue(32);
1676 llvm::APSInt RHSValue(32);
1679 bool LHSSafe = IsSingleCodeUnitCP(LHSType, LHSValue);
1680 bool RHSSafe = IsSingleCodeUnitCP(RHSType, RHSValue);
1681 if (LHSSafe && RHSSafe)
1684 SemaRef.
Diag(Loc, diag::warn_comparison_unicode_mixed_types_constant)
1694 SemaRef.
Diag(Loc, diag::warn_arith_conv_mixed_unicode_types)
1728 LHSType = AtomicLHS->getValueType();
1731 if (
Context.hasSameType(LHSType, RHSType))
1732 return Context.getCommonSugaredType(LHSType, RHSType);
1740 QualType LHSUnpromotedType = LHSType;
1741 if (
Context.isPromotableIntegerType(LHSType))
1742 LHSType =
Context.getPromotedIntegerType(LHSType);
1744 if (!LHSBitfieldPromoteTy.
isNull())
1745 LHSType = LHSBitfieldPromoteTy;
1750 if (
Context.hasSameType(LHSType, RHSType))
1751 return Context.getCommonSugaredType(LHSType, RHSType);
1794 bool PredicateIsExpr,
void *ControllingExprOrType,
1796 unsigned NumAssocs = ArgTypes.size();
1797 assert(NumAssocs == ArgExprs.size());
1800 for (
unsigned i = 0; i < NumAssocs; ++i) {
1809 if (!PredicateIsExpr) {
1813 assert(ControllingType &&
"couldn't get the type out of the parser");
1814 ControllingExprOrType = ControllingType;
1818 KeyLoc, DefaultLoc, RParenLoc, PredicateIsExpr, ControllingExprOrType,
1830 const auto *TOBT = T->getAs<OverflowBehaviorType>();
1831 const auto *UOBT =
U.getCanonicalType()->getAs<OverflowBehaviorType>();
1835 if (TOBT->getBehaviorKind() == UOBT->getBehaviorKind())
1837 UOBT->getUnderlyingType());
1849 bool PredicateIsExpr,
void *ControllingExprOrType,
1851 unsigned NumAssocs = Types.size();
1852 assert(NumAssocs == Exprs.size());
1853 assert(ControllingExprOrType &&
1854 "Must have either a controlling expression or a controlling type");
1856 Expr *ControllingExpr =
nullptr;
1858 if (PredicateIsExpr) {
1865 reinterpret_cast<Expr *
>(ControllingExprOrType));
1868 ControllingExpr = R.get();
1871 ControllingType =
reinterpret_cast<TypeSourceInfo *
>(ControllingExprOrType);
1872 if (!ControllingType)
1876 bool TypeErrorFound =
false,
1877 IsResultDependent = ControllingExpr
1880 ContainsUnexpandedParameterPack =
1890 diag::warn_side_effects_unevaluated_context);
1892 for (
unsigned i = 0; i < NumAssocs; ++i) {
1893 if (Exprs[i]->containsUnexpandedParameterPack())
1894 ContainsUnexpandedParameterPack =
true;
1897 if (Types[i]->
getType()->containsUnexpandedParameterPack())
1898 ContainsUnexpandedParameterPack =
true;
1900 if (Types[i]->
getType()->isDependentType()) {
1901 IsResultDependent =
true;
1918 if (ControllingExpr && Types[i]->
getType()->isIncompleteType())
1919 D =
LangOpts.C2y ? diag::warn_c2y_compat_assoc_type_incomplete
1920 : diag::ext_assoc_type_incomplete;
1921 else if (ControllingExpr && !Types[i]->
getType()->isObjectType())
1922 D = diag::err_assoc_type_nonobject;
1923 else if (Types[i]->
getType()->isVariablyModifiedType())
1924 D = diag::err_assoc_type_variably_modified;
1925 else if (ControllingExpr) {
1944 unsigned Reason = 0;
1953 Diag(Types[i]->getTypeLoc().getBeginLoc(),
1954 diag::warn_unreachable_association)
1955 << QT << (Reason - 1);
1959 Diag(Types[i]->getTypeLoc().getBeginLoc(), D)
1960 << Types[i]->getTypeLoc().getSourceRange() << Types[i]->getType();
1962 D, Types[i]->getTypeLoc().getBeginLoc()) >=
1964 TypeErrorFound =
true;
1969 for (
unsigned j = i+1; j < NumAssocs; ++j)
1970 if (Types[j] && !Types[j]->
getType()->isDependentType() &&
1973 Diag(Types[j]->getTypeLoc().getBeginLoc(),
1974 diag::err_assoc_compatible_types)
1975 << Types[j]->getTypeLoc().getSourceRange()
1976 << Types[j]->getType()
1977 << Types[i]->getType();
1978 Diag(Types[i]->getTypeLoc().getBeginLoc(),
1979 diag::note_compat_assoc)
1980 << Types[i]->getTypeLoc().getSourceRange()
1981 << Types[i]->getType();
1982 TypeErrorFound =
true;
1992 if (IsResultDependent) {
1993 if (ControllingExpr)
1995 Types, Exprs, DefaultLoc, RParenLoc,
1996 ContainsUnexpandedParameterPack);
1998 Exprs, DefaultLoc, RParenLoc,
1999 ContainsUnexpandedParameterPack);
2003 unsigned DefaultIndex = std::numeric_limits<unsigned>::max();
2007 for (
unsigned i = 0; i < NumAssocs; ++i) {
2015 QualType AssocQT = Types[i]->getType();
2021 CompatIndices.push_back(i);
2025 auto GetControllingRangeAndType = [](
Expr *ControllingExpr,
2029 if (ControllingExpr)
2038 return std::make_pair(SR, QT);
2044 if (CompatIndices.size() > 1) {
2045 auto P = GetControllingRangeAndType(ControllingExpr, ControllingType);
2048 << SR << P.second << (
unsigned)CompatIndices.size();
2049 for (
unsigned I : CompatIndices) {
2050 Diag(Types[I]->getTypeLoc().getBeginLoc(),
2051 diag::note_compat_assoc)
2052 << Types[I]->getTypeLoc().getSourceRange()
2053 << Types[I]->getType();
2061 if (DefaultIndex == std::numeric_limits<unsigned>::max() &&
2062 CompatIndices.size() == 0) {
2063 auto P = GetControllingRangeAndType(ControllingExpr, ControllingType);
2065 Diag(SR.
getBegin(), diag::err_generic_sel_no_match) << SR << P.second;
2074 unsigned ResultIndex =
2075 CompatIndices.size() ? CompatIndices[0] : DefaultIndex;
2077 if (ControllingExpr) {
2079 Context, KeyLoc, ControllingExpr, Types, Exprs, DefaultLoc, RParenLoc,
2080 ContainsUnexpandedParameterPack, ResultIndex);
2083 Context, KeyLoc, ControllingType, Types, Exprs, DefaultLoc, RParenLoc,
2084 ContainsUnexpandedParameterPack, ResultIndex);
2090 llvm_unreachable(
"unexpected TokenKind");
2091 case tok::kw___func__:
2093 case tok::kw___FUNCTION__:
2095 case tok::kw___FUNCDNAME__:
2097 case tok::kw___FUNCSIG__:
2099 case tok::kw_L__FUNCTION__:
2101 case tok::kw_L__FUNCSIG__:
2103 case tok::kw___PRETTY_FUNCTION__:
2114 return cast_or_null<Decl>(DC);
2132 assert(Args.size() <= 2 &&
"too many arguments for literal operator");
2135 for (
unsigned ArgIdx = 0; ArgIdx != Args.size(); ++ArgIdx) {
2136 ArgTy[ArgIdx] = Args[ArgIdx]->getType();
2137 if (ArgTy[ArgIdx]->isArrayType())
2158 std::vector<Token> ExpandedToks;
2164 if (Literal.hadError)
2168 for (
const Token &
Tok : StringToks)
2169 StringTokLocs.push_back(
Tok.getLocation());
2173 false, {}, StringTokLocs);
2175 if (!Literal.getUDSuffix().empty()) {
2178 Literal.getUDSuffixOffset());
2179 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_string_udl));
2199 CurrentDecl =
Context.getTranslationUnitDecl();
2201 std::vector<Token> ExpandedToks;
2202 ExpandedToks.reserve(Toks.size());
2206 ExpandedToks.emplace_back(
Tok);
2210 Diag(
Tok.getLocation(), diag::ext_predef_outside_function);
2212 Diag(
Tok.getLocation(), diag::ext_string_literal_from_predefined)
2215 llvm::raw_svector_ostream
OS(Str);
2216 Token &Exp = ExpandedToks.emplace_back();
2218 if (
Tok.getKind() == tok::kw_L__FUNCTION__ ||
2219 Tok.getKind() == tok::kw_L__FUNCSIG__) {
2221 Exp.
setKind(tok::wide_string_literal);
2223 Exp.
setKind(tok::string_literal);
2229 PP.CreateString(
OS.str(), Exp,
Tok.getLocation(),
Tok.getEndLoc());
2231 return ExpandedToks;
2236 assert(!StringToks.empty() &&
"Must have at least one string!");
2239 std::vector<Token> ExpandedToks;
2244 if (Literal.hadError)
2248 for (
const Token &
Tok : StringToks)
2249 StringTokLocs.push_back(
Tok.getLocation());
2253 if (Literal.isWide()) {
2254 CharTy =
Context.getWideCharType();
2256 }
else if (Literal.isUTF8()) {
2260 CharTy =
Context.UnsignedCharTy;
2262 }
else if (Literal.isUTF16()) {
2265 }
else if (Literal.isUTF32()) {
2268 }
else if (Literal.isPascal()) {
2269 CharTy =
Context.UnsignedCharTy;
2281 ? diag::warn_cxx20_compat_utf8_string
2282 : diag::warn_c23_compat_utf8_string);
2288 auto RemovalDiag =
PDiag(diag::note_cxx20_c23_compat_utf8_string_remove_u8);
2290 for (
const Token &
Tok : StringToks) {
2291 if (
Tok.getKind() == tok::utf8_string_literal) {
2293 RemovalDiagLoc =
Tok.getLocation();
2300 Diag(RemovalDiagLoc, RemovalDiag);
2304 Context.getStringLiteralArrayType(CharTy, Literal.GetNumStringChars());
2308 Context, Literal.GetString(), Kind, Literal.Pascal, StrTy, StringTokLocs);
2309 if (Literal.getUDSuffix().empty())
2316 Literal.getUDSuffixOffset());
2320 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_string_udl));
2327 Context.DeclarationNames.getCXXLiteralOperatorName(UDSuffix);
2332 Context.getArrayDecayedType(StrTy), SizeType
2342 llvm::APInt Len(
Context.getIntWidth(SizeType), Literal.GetNumStringChars());
2345 Expr *Args[] = { Lit, LenArg };
2362 unsigned CharBits =
Context.getIntWidth(CharTy);
2364 llvm::APSInt
Value(CharBits, CharIsUnsigned);
2371 for (
unsigned I = 0, N = Lit->
getLength(); I != N; ++I) {
2381 llvm_unreachable(
"unexpected literal operator lookup result");
2385 llvm_unreachable(
"unexpected literal operator lookup result");
2417 auto *DRE = dyn_cast<DeclRefExpr>(VD->
getInit());
2420 auto *Referee = dyn_cast<VarDecl>(DRE->getDecl());
2421 if (!Referee || !Referee->hasGlobalStorage() ||
2422 Referee->hasAttr<CUDADeviceAttr>())
2428 auto *MD = dyn_cast_or_null<CXXMethodDecl>(S.
CurContext);
2429 if (MD && MD->getParent()->isLambda() &&
2430 MD->getOverloadedOperator() == OO_Call && MD->hasAttr<CUDADeviceAttr>() &&
2452 if (
VarDecl *VD = dyn_cast<VarDecl>(D)) {
2453 if (VD->getType()->isReferenceType() &&
2456 VD->isUsableInConstantExpressions(
Context))
2475 Context, NNS, TemplateKWLoc, D, RefersToCapturedVariable, NameInfo, Ty,
2503 const auto *FD = dyn_cast<FieldDecl>(D);
2504 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(D))
2505 FD = IFD->getAnonField();
2509 if (FD->isBitField())
2515 if (
const auto *BD = dyn_cast<BindingDecl>(D))
2516 if (
const auto *BE = BD->getBinding())
2537 NameInfo =
Context.getNameForTemplate(TName, TNameLoc);
2538 TemplateArgs = &Buffer;
2541 TemplateArgs =
nullptr;
2549 bool isDefaultArgument =
2553 const auto *CurMethod = dyn_cast<CXXMethodDecl>(
CurContext);
2554 bool isInstance = CurMethod && CurMethod->isInstance() &&
2555 R.getNamingClass() == CurMethod->getParent() &&
2563 unsigned DiagID = diag::err_found_in_dependent_base;
2564 unsigned NoteID = diag::note_member_declared_at;
2565 if (R.getRepresentativeDecl()->getDeclContext()->Equals(R.getNamingClass())) {
2566 DiagID =
getLangOpts().MSVCCompat ? diag::ext_found_later_in_class
2567 : diag::err_found_later_in_class;
2569 DiagID = diag::ext_found_in_dependent_base;
2570 NoteID = diag::note_dependent_member_use;
2575 Diag(R.getNameLoc(), DiagID)
2576 << R.getLookupName()
2582 Diag(R.getNameLoc(), DiagID) << R.getLookupName();
2586 Diag(D->getLocation(), NoteID);
2595 if (isDefaultArgument && ((*R.begin())->isCXXInstanceMember())) {
2596 Diag(R.getNameLoc(), diag::err_member_call_without_object) << 0;
2609 SourceRange NameRange = R.getLookupNameInfo().getSourceRange();
2611 unsigned diagnostic = diag::err_undeclared_var_use;
2612 unsigned diagnostic_suggest = diag::err_undeclared_var_use_suggest;
2616 diagnostic = diag::err_undeclared_use;
2617 diagnostic_suggest = diag::err_undeclared_use_suggest;
2628 if (ExplicitTemplateArgs) {
2640 R.suppressDiagnostics();
2651 R.addDecl(Best->FoundDecl.getDecl(), Best->FoundDecl.getAccess());
2666 if (S && (Corrected =
2667 CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), S, &SS,
2670 bool DroppedSpecifier =
2674 bool AcceptableWithRecovery =
false;
2675 bool AcceptableWithoutRecovery =
false;
2684 dyn_cast<FunctionTemplateDecl>(CD))
2688 else if (
FunctionDecl *FD = dyn_cast<FunctionDecl>(CD))
2689 if (!ExplicitTemplateArgs || ExplicitTemplateArgs->
size() == 0)
2695 ND = Best->FoundDecl;
2696 Corrected.setCorrectionDecl(ND);
2700 Corrected.setCorrectionDecl(ND);
2711 R.setNamingClass(
Record);
2728 AcceptableWithoutRecovery =
true;
2731 if (AcceptableWithRecovery || AcceptableWithoutRecovery) {
2733 ? diag::note_implicit_param_decl
2734 : diag::note_previous_decl;
2737 PDiag(NoteID), AcceptableWithRecovery);
2740 PDiag(diag::err_no_member_suggest)
2742 << DroppedSpecifier << NameRange,
2743 PDiag(NoteID), AcceptableWithRecovery);
2753 return !AcceptableWithRecovery;
2761 Diag(R.getNameLoc(), diag::err_no_member)
2767 Diag(R.getNameLoc(), diagnostic) << Name << NameRange;
2788 else if (
auto *MD = dyn_cast<CXXMethodDecl>(S.
CurContext))
2796 auto DB = S.
Diag(Loc, diag::ext_undeclared_unqual_id_with_dependent_base);
2797 DB << NameInfo.
getName() << RD;
2799 if (!ThisType.
isNull()) {
2802 Context,
nullptr, ThisType,
true,
2804 nullptr, NameInfo, TemplateArgs);
2820 bool HasTrailingLParen,
bool IsAddressOfOperand,
2822 bool IsInlineAsmIdentifier,
Token *KeywordReplacement) {
2823 assert(!(IsAddressOfOperand && HasTrailingLParen) &&
2824 "cannot be direct & operand and have a trailing lparen");
2853 if (
auto *VD = dyn_cast<ValueDecl>(R.getFoundDecl())) {
2867 if (TemplateKWLoc.
isValid() || TemplateArgs) {
2875 false, TemplateKWLoc,
2879 if (R.wasNotFoundInCurrentInstantiation() || SS.
isInvalid())
2881 IsAddressOfOperand, TemplateArgs);
2885 !IvarLookupFollowUp);
2889 if (R.wasNotFoundInCurrentInstantiation() || SS.
isInvalid())
2891 IsAddressOfOperand, TemplateArgs);
2895 if (IvarLookupFollowUp) {
2905 if (R.isAmbiguous())
2910 if (R.empty() && HasTrailingLParen && II &&
2913 if (D) R.addDecl(D);
2920 if (R.empty() && !ADL) {
2923 TemplateKWLoc, TemplateArgs))
2928 if (IsInlineAsmIdentifier)
2936 "Typo correction callback misconfigured");
2950 assert(!R.empty() &&
2951 "DiagnoseEmptyLookup returned false but added no results");
2958 ExprResult E(
ObjC().LookupInObjCMethod(R, S, Ivar->getIdentifier()));
2968 assert(!R.empty() || ADL);
2998 if (TemplateArgs || TemplateKWLoc.
isValid()) {
3007 "There should only be one declaration found.");
3022 if (R.isAmbiguous())
3025 if (R.wasNotFoundInCurrentInstantiation() || SS.
isInvalid())
3035 if (
const auto *CD = dyn_cast<CXXRecordDecl>(DC))
3036 if (CD->isInvalidDecl() || CD->isBeingDefined())
3046 if (
auto *TagD = dyn_cast<TagDecl>(TD)) {
3053 TL.setNameLoc(NameInfo.
getLoc());
3054 }
else if (
auto *TypedefD = dyn_cast<TypedefNameDecl>(TD)) {
3062 ET =
SemaRef.Context.getTypeDeclType(TD);
3070 unsigned DiagID = diag::err_typename_missing;
3072 DiagID = diag::ext_typename_missing;
3074 auto D =
Diag(Loc, DiagID);
3105 const auto *RD = dyn_cast<CXXRecordDecl>(
Member->getDeclContext());
3113 bool PointerConversions =
false;
3115 DestRecordType =
Context.getCanonicalTagType(RD);
3117 DestRecordType =
Context.getAddrSpaceQualType(
3118 DestRecordType, FromPtrType
3123 DestType =
Context.getPointerType(DestRecordType);
3125 PointerConversions =
true;
3127 DestType = DestRecordType;
3128 FromRecordType = FromType;
3130 }
else if (
const auto *
Method = dyn_cast<CXXMethodDecl>(
Member)) {
3131 if (!
Method->isImplicitObjectMemberFunction())
3134 DestType =
Method->getThisType().getNonReferenceType();
3135 DestRecordType =
Method->getFunctionObjectParameterType();
3139 PointerConversions =
true;
3141 FromRecordType = FromType;
3142 DestType = DestRecordType;
3147 if (FromAS != DestAS) {
3149 Context.removeAddrSpaceQualType(FromRecordType);
3151 Context.getAddrSpaceQualType(FromRecordTypeWithoutAS, DestAS);
3152 if (PointerConversions)
3153 FromTypeWithDestAS =
Context.getPointerType(FromTypeWithDestAS);
3167 if (
Context.hasSameUnqualifiedType(FromRecordType, DestRecordType))
3195 assert(QType->
isRecordType() &&
"lookup done with non-record type");
3205 FromLoc, FromRange, &BasePath))
3208 if (PointerConversions)
3209 QType =
Context.getPointerType(QType);
3211 VK, &BasePath).
get();
3214 FromRecordType = QRecordType;
3218 if (
Context.hasSameUnqualifiedType(FromRecordType, DestRecordType))
3225 FromLoc, FromRange, &BasePath,
3234 DestType =
Context.getQualifiedType(DestType, FromTypeQuals);
3242 bool HasTrailingLParen) {
3244 if (!HasTrailingLParen)
3262 if (D->isCXXClassMember())
3273 else if (D->getLexicalDeclContext()->isFunctionOrMethod())
3280 if (
const auto *FDecl = dyn_cast<FunctionDecl>(D)) {
3282 if (FDecl->getBuiltinID() && FDecl->isImplicit())
3297 bool AcceptInvalid) {
3322 assert(R.isSingleResult() &&
"Expected only a single result");
3323 const auto *FD = dyn_cast<FunctionDecl>(R.getFoundDecl());
3325 (FD->isCPUDispatchMultiVersion() || FD->isCPUSpecificMultiVersion());
3330 bool AcceptInvalidDecl) {
3333 if (!NeedsADL && R.isSingleResult() &&
3337 R.getRepresentativeDecl(),
nullptr,
3351 R.suppressDiagnostics();
3355 R.getLookupNameInfo(), NeedsADL, R.begin(), R.end(),
3364 bool AcceptInvalidDecl) {
3365 assert(D &&
"Cannot refer to a NULL declaration");
3367 "Cannot refer unambiguously to a function template");
3386 Diag(Loc, diag::err_ref_non_value) << D << SS.
getRange();
3401 if (VD->isInvalidDecl() && !AcceptInvalidDecl)
3407 if (
auto *IndirectField = dyn_cast<IndirectFieldDecl>(VD);
3408 IndirectField && !IndirectField->isCXXClassMember())
3420 type =
type.getNonPackExpansionType();
3424#define ABSTRACT_DECL(kind)
3425#define VALUE(type, base)
3426#define DECL(type, base) case Decl::type:
3427#include "clang/AST/DeclNodes.inc"
3428 llvm_unreachable(
"invalid value decl kind");
3431 case Decl::ObjCAtDefsField:
3432 llvm_unreachable(
"forming non-member reference to ivar?");
3436 case Decl::EnumConstant:
3437 case Decl::UnresolvedUsingValue:
3438 case Decl::OMPDeclareReduction:
3439 case Decl::OMPDeclareMapper:
3448 case Decl::IndirectField:
3449 case Decl::ObjCIvar:
3451 "building reference to field in C?");
3461 case Decl::NonTypeTemplateParm: {
3463 type = reftype->getPointeeType();
3473 if (
type->isRecordType()) {
3474 type =
type.getUnqualifiedType().withConst();
3487 case Decl::VarTemplateSpecialization:
3488 case Decl::VarTemplatePartialSpecialization:
3489 case Decl::Decomposition:
3491 case Decl::OMPCapturedExpr:
3494 type->isVoidType()) {
3500 case Decl::ImplicitParam:
3501 case Decl::ParmVar: {
3511 if (!CapturedType.
isNull())
3512 type = CapturedType;
3517 case Decl::Function: {
3519 if (!
Context.BuiltinInfo.isDirectlyAddressable(BID)) {
3556 case Decl::CXXDeductionGuide:
3557 llvm_unreachable(
"building reference to deduction guide");
3559 case Decl::MSProperty:
3561 case Decl::TemplateParamObject:
3567 case Decl::UnnamedGlobalConstant:
3571 case Decl::CXXMethod:
3576 dyn_cast<FunctionProtoType>(VD->getType()))
3577 if (proto->getReturnType() ==
Context.UnknownAnyTy) {
3590 case Decl::CXXConversion:
3591 case Decl::CXXDestructor:
3592 case Decl::CXXConstructor:
3604 if (VD->isInvalidDecl() && E)
3611 Target.resize(CharByteWidth * (Source.size() + 1));
3612 char *ResultPtr = &
Target[0];
3613 const llvm::UTF8 *ErrorPtr;
3615 llvm::ConvertUTF8toWide(CharByteWidth, Source, ResultPtr, ErrorPtr);
3625 Diag(Loc, diag::ext_predef_outside_function);
3626 currentDecl =
Context.getTranslationUnitDecl();
3636 bool ForceElaboratedPrinting =
3640 unsigned Length = Str.length();
3642 llvm::APInt LengthI(32, Length + 1);
3646 Context.adjustStringLiteralBaseType(
Context.WideCharTy.withConst());
3650 ResTy =
Context.getConstantArrayType(ResTy, LengthI,
nullptr,
3656 ResTy =
Context.adjustStringLiteralBaseType(
Context.CharTy.withConst());
3657 ResTy =
Context.getConstantArrayType(ResTy, LengthI,
nullptr,
3676 StringRef ThisTok =
PP.getSpelling(
Tok, CharBuffer, &
Invalid);
3682 if (Literal.hadError())
3686 if (Literal.isWide())
3692 else if (Literal.isUTF16())
3694 else if (Literal.isUTF32())
3703 if (Literal.isWide())
3705 else if (Literal.isUTF16())
3707 else if (Literal.isUTF32())
3709 else if (Literal.isUTF8())
3715 if (Literal.getUDSuffix().empty())
3725 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_character_udl));
3730 Lit,
Tok.getLocation());
3734 unsigned IntSize =
Context.getTargetInfo().getIntWidth();
3736 llvm::APInt(IntSize, Val,
true),
3744 using llvm::APFloat;
3745 APFloat Val(Format);
3748 if (RM == llvm::RoundingMode::Dynamic)
3749 RM = llvm::RoundingMode::NearestTiesToEven;
3750 APFloat::opStatus result = Literal.GetFloatValue(Val, RM);
3754 if ((result & APFloat::opOverflow) ||
3755 ((result & APFloat::opUnderflow) && Val.isZero())) {
3756 unsigned diagnostic;
3758 if (result & APFloat::opOverflow) {
3759 diagnostic = diag::warn_float_overflow;
3760 APFloat::getLargest(Format).toString(buffer);
3762 diagnostic = diag::warn_float_underflow;
3763 APFloat::getSmallest(Format).toString(buffer);
3766 S.
Diag(Loc, diagnostic) << Ty << buffer.str();
3769 bool isExact = (result == APFloat::opOK);
3774 assert(E &&
"Invalid expression");
3781 Diag(E->
getExprLoc(), diag::err_pragma_loop_invalid_argument_type) << QT;
3785 llvm::APSInt ValueAPS;
3796 bool ValueIsPositive =
3797 AllowZero ? ValueAPS.isNonNegative() : ValueAPS.isStrictlyPositive();
3798 if (!ValueIsPositive || ValueAPS.getActiveBits() > 31) {
3800 <<
toString(ValueAPS, 10) << ValueIsPositive;
3810 if (
Tok.getLength() == 1 ||
Tok.getKind() == tok::binary_data) {
3811 const uint8_t Val =
PP.getSpellingOfSingleCharacterNumericConstant(
Tok);
3820 SpellingBuffer.resize(
Tok.getLength() + 1);
3824 StringRef TokSpelling =
PP.getSpelling(
Tok, SpellingBuffer, &
Invalid);
3829 PP.getSourceManager(),
PP.getLangOpts(),
3830 PP.getTargetInfo(),
PP.getDiagnostics());
3831 if (Literal.hadError)
3834 if (Literal.hasUDSuffix()) {
3842 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_numeric_udl));
3845 if (Literal.isFloatingLiteral()) {
3849 CookedTy =
Context.LongDoubleTy;
3854 CookedTy =
Context.UnsignedLongLongTy;
3858 Context.DeclarationNames.getCXXLiteralOperatorName(UDSuffix);
3870 !Literal.isImaginary)) {
3879 if (Literal.isFloatingLiteral()) {
3882 llvm::APInt ResultVal(
Context.getTargetInfo().getLongLongWidth(), 0);
3883 if (Literal.GetIntegerValue(ResultVal))
3884 Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
3896 unsigned Length = Literal.getUDSuffixOffset();
3903 false, StrTy, TokLoc);
3914 bool CharIsUnsigned =
Context.CharTy->isUnsignedIntegerType();
3915 llvm::APSInt
Value(CharBits, CharIsUnsigned);
3916 for (
unsigned I = 0, N = Literal.getUDSuffixOffset(); I != N; ++I) {
3917 Value = TokSpelling[I];
3925 llvm_unreachable(
"unexpected literal operator lookup result");
3931 if (Literal.isFixedPointLiteral()) {
3934 if (Literal.isAccum) {
3935 if (Literal.isHalf) {
3937 }
else if (Literal.isLong) {
3942 }
else if (Literal.isFract) {
3943 if (Literal.isHalf) {
3945 }
else if (Literal.isLong) {
3952 if (Literal.isUnsigned) Ty =
Context.getCorrespondingUnsignedType(Ty);
3954 bool isSigned = !Literal.isUnsigned;
3955 unsigned scale =
Context.getFixedPointScale(Ty);
3956 unsigned bit_width =
Context.getTypeInfo(Ty).Width;
3958 llvm::APInt Val(bit_width, 0, isSigned);
3959 bool Overflowed = Literal.GetFixedPointValue(Val, scale);
3960 bool ValIsZero = Val.isZero() && !Overflowed;
3962 auto MaxVal =
Context.getFixedPointMax(Ty).getValue();
3963 if (Literal.isFract && Val == MaxVal + 1 && !ValIsZero)
3969 else if (Val.ugt(MaxVal) || Overflowed)
3970 Diag(
Tok.getLocation(), diag::err_too_large_for_fixed_point);
3973 Tok.getLocation(), scale);
3974 }
else if (Literal.isFloatingLiteral()) {
3976 if (Literal.isHalf){
3981 Diag(
Tok.getLocation(), diag::err_half_const_requires_fp16);
3984 }
else if (Literal.isFloat)
3986 else if (Literal.isLong)
3988 else if (Literal.isFloat16)
3990 else if (Literal.isFloat128)
4007 Diag(
Tok.getLocation(), diag::warn_double_const_requires_fp64)
4012 }
else if (!Literal.isIntegerLiteral()) {
4018 if (Literal.isSizeT)
4021 ? diag::warn_cxx20_compat_size_t_suffix
4022 : diag::ext_cxx23_size_t_suffix
4023 : diag::err_cxx23_size_t_suffix);
4030 if (Literal.isBitInt)
4031 PP.Diag(
Tok.getLocation(),
4034 : diag::ext_c23_bitint_suffix);
4043 unsigned BitsNeeded =
Context.getTargetInfo().getIntMaxTWidth();
4044 if (Literal.isBitInt)
4045 BitsNeeded = llvm::APInt::getSufficientBitsNeeded(
4046 Literal.getLiteralDigits(), Literal.getRadix());
4047 if (Literal.MicrosoftInteger) {
4048 if (Literal.MicrosoftInteger == 128 &&
4049 !
Context.getTargetInfo().hasInt128Type())
4050 PP.Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
4051 << Literal.isUnsigned;
4052 BitsNeeded = Literal.MicrosoftInteger;
4055 llvm::APInt ResultVal(BitsNeeded, 0);
4057 if (Literal.GetIntegerValue(ResultVal)) {
4059 Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
4061 Ty =
Context.UnsignedLongLongTy;
4062 assert(
Context.getTypeSize(Ty) == ResultVal.getBitWidth() &&
4063 "long long is not intmax_t?");
4070 bool AllowUnsigned = Literal.isUnsigned || Literal.getRadix() != 10;
4077 Literal.isLong =
true;
4078 Literal.isLongLong =
false;
4085 if (Literal.MicrosoftInteger) {
4086 if (Literal.MicrosoftInteger == 8 && !Literal.isUnsigned) {
4090 Width = Literal.MicrosoftInteger;
4091 Ty =
Context.getIntTypeForBitwidth(Width,
4092 !Literal.isUnsigned);
4098 if (Literal.isBitInt) {
4101 Width = std::max(ResultVal.getActiveBits(), 1u) +
4102 (Literal.isUnsigned ? 0u : 1u);
4106 unsigned int MaxBitIntWidth =
4107 Context.getTargetInfo().getMaxBitIntWidth();
4108 if (Width > MaxBitIntWidth) {
4109 Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
4110 << Literal.isUnsigned;
4111 Width = MaxBitIntWidth;
4118 ResultVal = ResultVal.zextOrTrunc(Width);
4119 Ty =
Context.getBitIntType(Literal.isUnsigned, Width);
4123 if (Literal.isSizeT) {
4124 assert(!Literal.MicrosoftInteger &&
4125 "size_t literals can't be Microsoft literals");
4126 unsigned SizeTSize =
Context.getTargetInfo().getTypeWidth(
4127 Context.getTargetInfo().getSizeType());
4130 if (ResultVal.isIntN(SizeTSize)) {
4132 if (!Literal.isUnsigned && ResultVal[SizeTSize - 1] == 0)
4133 Ty =
Context.getSignedSizeType();
4134 else if (AllowUnsigned)
4140 if (Ty.
isNull() && !Literal.isLong && !Literal.isLongLong &&
4143 unsigned IntSize =
Context.getTargetInfo().getIntWidth();
4146 if (ResultVal.isIntN(IntSize)) {
4148 if (!Literal.isUnsigned && ResultVal[IntSize-1] == 0)
4150 else if (AllowUnsigned)
4157 if (Ty.
isNull() && !Literal.isLongLong && !Literal.isSizeT) {
4158 unsigned LongSize =
Context.getTargetInfo().getLongWidth();
4161 if (ResultVal.isIntN(LongSize)) {
4163 if (!Literal.isUnsigned && ResultVal[LongSize-1] == 0)
4165 else if (AllowUnsigned)
4170 const unsigned LongLongSize =
4171 Context.getTargetInfo().getLongLongWidth();
4175 ? diag::warn_old_implicitly_unsigned_long_cxx
4177 ext_old_implicitly_unsigned_long_cxx
4178 : diag::warn_old_implicitly_unsigned_long)
4179 << (LongLongSize > LongSize ? 0
4188 if (Ty.
isNull() && !Literal.isSizeT) {
4189 unsigned LongLongSize =
Context.getTargetInfo().getLongLongWidth();
4192 if (ResultVal.isIntN(LongLongSize)) {
4196 if (!Literal.isUnsigned && (ResultVal[LongLongSize-1] == 0 ||
4197 (
getLangOpts().MSVCCompat && Literal.isLongLong)))
4199 else if (AllowUnsigned)
4200 Ty =
Context.UnsignedLongLongTy;
4201 Width = LongLongSize;
4207 ? diag::warn_cxx98_compat_longlong
4208 : diag::ext_cxx11_longlong);
4210 Diag(
Tok.getLocation(), diag::ext_c99_longlong);
4218 if (Literal.isSizeT)
4219 Diag(
Tok.getLocation(), diag::err_size_t_literal_too_large)
4220 << Literal.isUnsigned;
4223 diag::ext_integer_literal_too_large_for_signed);
4224 Ty =
Context.UnsignedLongLongTy;
4225 Width =
Context.getTargetInfo().getLongLongWidth();
4228 if (ResultVal.getBitWidth() != Width)
4229 ResultVal = ResultVal.trunc(Width);
4235 if (Literal.isImaginary) {
4242 DiagId = diag::ext_gnu_imaginary_constant;
4244 DiagId = diag::warn_c23_compat_imaginary_constant;
4246 DiagId = diag::ext_c2y_imaginary_constant;
4247 Diag(
Tok.getLocation(), DiagId);
4253 assert(E &&
"ActOnParenExpr() missing expr");
4268 if (!(T->isArithmeticType() || T->isVoidType() || T->isVectorType())) {
4269 S.
Diag(Loc, diag::err_vecstep_non_scalar_vector_type)
4274 assert((T->isVoidType() || !T->isIncompleteType()) &&
4275 "Scalar types should always be complete");
4283 if (!T->isVectorType() && !T->isSizelessVectorType())
4284 return S.
Diag(Loc, diag::err_builtin_non_vector_type)
4286 <<
"__builtin_vectorelements" << T << ArgRange;
4288 if (
auto *FD = dyn_cast<FunctionDecl>(S.
CurContext)) {
4289 if (T->isSVESizelessBuiltinType()) {
4290 llvm::StringMap<bool> CallerFeatureMap;
4305 if (!T->isFunctionType() && !T->isFunctionPointerType() &&
4306 !T->isFunctionReferenceType() && !T->isMemberFunctionPointerType()) {
4307 S.
Diag(Loc, diag::err_ptrauth_type_disc_undiscriminated) << T << ArgRange;
4323 if (TraitKind == UETT_SizeOf || TraitKind == UETT_AlignOf ||
4324 TraitKind == UETT_PreferredAlignOf) {
4327 if (T->isFunctionType()) {
4328 S.
Diag(Loc, diag::ext_sizeof_alignof_function_type)
4335 if (T->isVoidType()) {
4336 unsigned DiagID = S.
LangOpts.OpenCL ? diag::err_opencl_sizeof_alignof_type
4337 : diag::ext_sizeof_alignof_void_type;
4352 S.
Diag(Loc, diag::err_sizeof_nonfragile_interface)
4353 << T << (TraitKind == UETT_SizeOf)
4370 const auto *ICE = dyn_cast<ImplicitCastExpr>(E);
4371 if (!ICE || ICE->getCastKind() != CK_ArrayToPointerDecay)
4374 S.
Diag(Loc, diag::warn_sizeof_array_decay) << ICE->getSourceRange()
4376 << ICE->getSubExpr()->getType();
4384 bool IsUnevaluatedOperand =
4385 (ExprKind == UETT_SizeOf || ExprKind == UETT_DataSizeOf ||
4386 ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf ||
4387 ExprKind == UETT_VecStep || ExprKind == UETT_CountOf);
4388 if (IsUnevaluatedOperand) {
4404 Diag(E->
getExprLoc(), diag::warn_side_effects_unevaluated_context);
4406 if (ExprKind == UETT_VecStep)
4410 if (ExprKind == UETT_VectorElements)
4421 if (
Context.getTargetInfo().getTriple().isWasm() &&
4432 if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf) {
4435 diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4440 E, diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4459 if (ExprKind == UETT_CountOf) {
4464 Diag(E->
getExprLoc(), diag::err_countof_arg_not_array_type) << ExprType;
4474 if (ExprKind == UETT_SizeOf) {
4475 if (
const auto *DeclRef = dyn_cast<DeclRefExpr>(E->
IgnoreParens())) {
4476 if (
const auto *PVD = dyn_cast<ParmVarDecl>(DeclRef->getFoundDecl())) {
4477 QualType OType = PVD->getOriginalType();
4482 Diag(PVD->getLocation(), diag::note_declared_at);
4490 if (
const auto *BO = dyn_cast<BinaryOperator>(E->
IgnoreParens())) {
4507 S.
Diag(E->
getExprLoc(), diag::err_sizeof_alignof_typeof_bitfield)
4514 if (
DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Inner)) {
4516 }
else if (
MemberExpr *ME = dyn_cast<MemberExpr>(Inner)) {
4517 D = ME->getMemberDecl();
4537 if (
FieldDecl *FD = dyn_cast_or_null<FieldDecl>(D)) {
4540 if (!FD->getParent()->isCompleteDefinition()) {
4541 S.
Diag(E->
getExprLoc(), diag::err_alignof_member_of_incomplete_type)
4550 if (!FD->getType()->isReferenceType())
4569 assert(T->isVariablyModifiedType());
4570 assert(CSI !=
nullptr);
4574 const Type *Ty = T.getTypePtr();
4576#define TYPE(Class, Base)
4577#define ABSTRACT_TYPE(Class, Base)
4578#define NON_CANONICAL_TYPE(Class, Base)
4579#define DEPENDENT_TYPE(Class, Base) case Type::Class:
4580#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)
4581#include "clang/AST/TypeNodes.inc"
4588 case Type::ExtVector:
4589 case Type::ConstantMatrix:
4592 case Type::TemplateSpecialization:
4593 case Type::ObjCObject:
4594 case Type::ObjCInterface:
4595 case Type::ObjCObjectPointer:
4596 case Type::ObjCTypeParam:
4599 case Type::HLSLInlineSpirv:
4600 llvm_unreachable(
"type class is never variably-modified!");
4601 case Type::Adjusted:
4607 case Type::ArrayParameter:
4613 case Type::BlockPointer:
4616 case Type::LValueReference:
4617 case Type::RValueReference:
4620 case Type::MemberPointer:
4623 case Type::ConstantArray:
4624 case Type::IncompleteArray:
4628 case Type::VariableArray: {
4642 case Type::FunctionProto:
4643 case Type::FunctionNoProto:
4648 case Type::UnaryTransform:
4649 case Type::Attributed:
4650 case Type::BTFTagAttributed:
4651 case Type::OverflowBehavior:
4652 case Type::HLSLAttributedResource:
4653 case Type::SubstTemplateTypeParm:
4654 case Type::MacroQualified:
4655 case Type::CountAttributed:
4657 T = T.getSingleStepDesugaredType(Context);
4662 case Type::Decltype:
4665 case Type::PackIndexing:
4672 case Type::DeducedTemplateSpecialization:
4675 case Type::TypeOfExpr:
4681 case Type::PredefinedSugar:
4685 }
while (!T.isNull() && T->isVariablyModifiedType());
4708 if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf ||
4709 ExprKind == UETT_OpenMPRequiredSimdAlign) {
4715 ? diag::warn_c2y_compat_alignof_incomplete_array
4716 : diag::ext_c2y_alignof_incomplete_array);
4717 ExprType =
Context.getBaseElementType(ExprType);
4720 if (ExprKind == UETT_VecStep)
4723 if (ExprKind == UETT_VectorElements)
4727 if (ExprKind == UETT_PtrAuthTypeDiscriminator)
4737 OpLoc, ExprType, diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4742 Diag(OpLoc, diag::err_sizeof_alignof_function_type) << KWName << ExprRange;
4746 if (ExprKind == UETT_CountOf) {
4750 Diag(OpLoc, diag::err_countof_arg_not_array_type) << ExprType;
4757 if (
Context.getTargetInfo().getTriple().isWasm() &&
4759 Diag(OpLoc, diag::err_wasm_table_invalid_uett_operand)
4773 auto *CSI = dyn_cast<CapturingScopeInfo>(*I);
4777 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(CSI))
4778 DC = LSI->CallOperator;
4779 else if (
auto *CRSI = dyn_cast<CapturedRegionScopeInfo>(CSI))
4780 DC = CRSI->TheCapturedDecl;
4781 else if (
auto *BSI = dyn_cast<BlockScopeInfo>(CSI))
4804 if (!T->isDependentType() &&
4813 (ExprKind == UETT_SizeOf || ExprKind == UETT_CountOf) &&
4823 ExprKind, TInfo,
Context.getSizeType(), OpLoc, R.getEnd());
4839 }
else if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf) {
4841 }
else if (ExprKind == UETT_VecStep) {
4843 }
else if (ExprKind == UETT_OpenMPRequiredSimdAlign) {
4847 Diag(E->
getExprLoc(), diag::err_sizeof_alignof_typeof_bitfield) << 0;
4849 }
else if (ExprKind == UETT_VectorElements || ExprKind == UETT_SizeOf ||
4850 ExprKind == UETT_CountOf) {
4857 if ((ExprKind == UETT_SizeOf || ExprKind == UETT_CountOf) &&
4892 UETT_AlignOf, KWName);
4905 if (
V.get()->isTypeDependent())
4917 return CT->getElementType();
4920 if (
V.get()->getType()->isArithmeticType())
4921 return V.get()->getType();
4926 if (PR.
get() !=
V.get()) {
4932 S.
Diag(Loc, diag::err_realimag_invalid_type) <<
V.get()->getType()
4933 << (IsReal ?
"__real" :
"__imag");
4944 default: llvm_unreachable(
"Unknown unary op!");
4945 case tok::plusplus: Opc = UO_PostInc;
break;
4946 case tok::minusminus: Opc = UO_PostDec;
break;
4965 !S.
LangOpts.ObjCSubscriptingLegacyRuntime)
4968 S.
Diag(opLoc, diag::err_arithmetic_nonfragile_interface)
4975 auto *BaseNoParens =
Base->IgnoreParens();
4976 if (
auto *MSProp = dyn_cast<MSPropertyRefExpr>(BaseNoParens))
4977 return MSProp->getPropertyDecl()->getType()->isArrayType();
4998 if (RTy->isIntegralOrUnscopedEnumerationType()) {
5000 Result = PT->getPointeeType();
5002 Result = AT->getElementType();
5005 Result = PT->getPointeeType();
5007 Result = AT->getElementType();
5010 return Result->isDependentType() ? Result : Ctx.
DependentTy;
5021 if (AS->isOMPArraySection())
5037 base = result.
get();
5046 auto CheckAndReportCommaError = [&](
Expr *E) {
5047 if (ArgExprs.size() > 1 ||
5049 Diag(E->getExprLoc(), diag::err_matrix_subscript_comma)
5060 Diag(base->
getExprLoc(), diag::err_matrix_separate_incomplete_index)
5066 auto *matSubscriptE = dyn_cast<MatrixSubscriptExpr>(base);
5067 if (matSubscriptE) {
5068 if (CheckAndReportCommaError(ArgExprs.front()))
5071 assert(matSubscriptE->isIncomplete() &&
5072 "base has to be an incomplete matrix subscript");
5074 matSubscriptE->getRowIdx(),
5075 ArgExprs.front(), rbLoc);
5083 CheckInvalidBuiltinCountedByRef(base,
5091 bool IsMSPropertySubscript =
false;
5094 if (!IsMSPropertySubscript) {
5098 base = result.
get();
5104 if (CheckAndReportCommaError(ArgExprs.front()))
5112 Expr *idx = ArgExprs[0];
5121 if (ArgExprs.size() == 1 &&
5122 ArgExprs[0]->getType()->isNonOverloadPlaceholderType()) {
5126 ArgExprs[0] = result.
get();
5138 base, ArgExprs.front(),
5151 if (IsMSPropertySubscript) {
5152 if (ArgExprs.size() > 1) {
5154 diag::err_ms_property_subscript_expects_single_arg);
5180 Diag(base->
getExprLoc(), diag::err_ovl_builtin_subscript_expects_single_arg)
5188 ArgExprs[0]->getType()->isRecordType())))) {
5206 return InitSeq.
Perform(*
this, Entity, Kind, E);
5220 RowIdx = RowR.
get();
5230 auto IsIndexValid = [&](
Expr *IndexExpr,
unsigned Dim,
5231 bool IsColumnIdx) ->
Expr * {
5239 if (std::optional<llvm::APSInt> Idx =
5241 if ((*Idx < 0 || *Idx >=
Dim)) {
5243 << IsColumnIdx <<
Dim;
5250 "should be able to convert any integer type to size type");
5251 return ConvExpr.
get();
5255 RowIdx = IsIndexValid(RowIdx, MTy->getNumRows(),
false);
5260 Context.getExtVectorType(MTy->getElementType(), MTy->getNumColumns());
5276 RowIdx = RowR.
get();
5280 Base, RowIdx, ColumnIdx,
Context.IncompleteMatrixIdxTy, RBLoc);
5291 ColumnIdx = ColumnR.
get();
5296 auto IsIndexValid = [&](
Expr *IndexExpr,
unsigned Dim,
5297 bool IsColumnIdx) ->
Expr * {
5305 if (std::optional<llvm::APSInt> Idx =
5307 if ((*Idx < 0 || *Idx >=
Dim)) {
5309 << IsColumnIdx <<
Dim;
5316 "should be able to convert any integer type to size type");
5317 return ConvExpr.
get();
5321 RowIdx = IsIndexValid(RowIdx, MTy->getNumRows(),
false);
5322 ColumnIdx = IsIndexValid(ColumnIdx, MTy->getNumColumns(),
true);
5323 if (!RowIdx || !ColumnIdx)
5327 MTy->getElementType(), RBLoc);
5330void Sema::CheckAddressOfNoDeref(
const Expr *E) {
5337 while ((
Member = dyn_cast<MemberExpr>(StrippedExpr)) && !
Member->isArrow())
5338 StrippedExpr =
Member->getBase()->IgnoreParenImpCasts();
5340 LastRecord.PossibleDerefs.erase(StrippedExpr);
5354 if (ResultTy->
hasAttr(attr::NoDeref)) {
5355 LastRecord.PossibleDerefs.insert(E);
5362 QualType BaseTy =
Base->getType();
5367 const MemberExpr *
Member =
nullptr;
5368 while ((
Member = dyn_cast<MemberExpr>(
Base->IgnoreParenCasts())) &&
5372 if (
const auto *Ptr = dyn_cast<PointerType>(
Base->getType())) {
5373 if (Ptr->getPointeeType()->hasAttr(attr::NoDeref))
5374 LastRecord.PossibleDerefs.insert(E);
5390 for (
auto *Op : {LHSExp, RHSExp}) {
5391 Op = Op->IgnoreImplicit();
5392 if (Op->getType()->isArrayType() && !Op->isLValue())
5415 Expr *BaseExpr, *IndexExpr;
5433 if (!
LangOpts.isSubscriptPointerArithmetic())
5449 if (!
LangOpts.isSubscriptPointerArithmetic()) {
5450 Diag(LLoc, diag::err_subscript_nonfragile_interface)
5474 LHSExp = Materialized.
get();
5481 Qualifiers BaseQuals = BaseType.getQualifiers();
5483 Qualifiers Combined = BaseQuals + MemberQuals;
5484 if (Combined != MemberQuals)
5485 ResultType =
Context.getQualifiedType(ResultType, Combined);
5495 CK_ArrayToPointerDecay).
get();
5501 }
else if (RHSTy->isArrayType()) {
5506 CK_ArrayToPointerDecay).
get();
5513 return ExprError(
Diag(LLoc, diag::err_typecheck_subscript_value)
5518 return ExprError(
Diag(LLoc, diag::err_typecheck_subscript_not_integer)
5524 std::optional<llvm::APSInt> IntegerContantExpr =
5526 if (!IntegerContantExpr.has_value() ||
5527 IntegerContantExpr.value().isNegative())
5543 Diag(LLoc, diag::ext_gnu_subscript_void_type)
5554 diag::err_subscript_incomplete_or_sizeless_type, BaseExpr))
5567 auto *CSI = dyn_cast<CapturingScopeInfo>(*I);
5571 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(CSI))
5572 DC = LSI->CallOperator;
5573 else if (
auto *CRSI = dyn_cast<CapturedRegionScopeInfo>(CSI))
5574 DC = CRSI->TheCapturedDecl;
5575 else if (
auto *BSI = dyn_cast<BlockScopeInfo>(CSI))
5593 bool SkipImmediateInvocations) {
5594 if (Param->hasUnparsedDefaultArg()) {
5595 assert(!RewrittenInit &&
"Should not have a rewritten init expression yet");
5599 Diag(Param->getBeginLoc(), diag::err_recursive_default_argument) << FD;
5600 Diag(CallLoc, diag::note_recursive_default_argument_used_here);
5601 Param->setInvalidDecl();
5605 Diag(CallLoc, diag::err_use_of_default_argument_to_function_declared_later)
5608 diag::note_default_argument_declared_here);
5612 if (Param->hasUninstantiatedDefaultArg()) {
5613 assert(!RewrittenInit &&
"Should not have a rewitten init expression yet");
5618 Expr *
Init = RewrittenInit ? RewrittenInit : Param->getInit();
5619 assert(
Init &&
"default argument but no initializer?");
5628 if (
auto *InitWithCleanup = dyn_cast<ExprWithCleanups>(
Init)) {
5631 Cleanup.setExprNeedsCleanups(InitWithCleanup->cleanupsHaveSideEffects());
5635 assert(!InitWithCleanup->getNumObjects() &&
5636 "default argument expression has capturing blocks?");
5649 SkipImmediateInvocations;
5737 if (!
SemaRef.CurrentInstantiationScope ||
5749 assert(Param->hasDefaultArg() &&
"can't build nonexistent default arg");
5753 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
5754 InitializationContext =
5756 if (!InitializationContext.has_value())
5757 InitializationContext.emplace(CallLoc, Param,
CurContext);
5759 if (!
Init && !Param->hasUnparsedDefaultArg()) {
5774 if (Param->hasUninstantiatedDefaultArg()) {
5783 if (!NestedDefaultChecking)
5784 V.TraverseDecl(Param);
5788 if (
V.HasImmediateCalls ||
5789 (NeedRebuild && isa_and_present<ExprWithCleanups>(Param->getInit()))) {
5790 if (
V.HasImmediateCalls)
5800 Res = Immediate.TransformInitializer(Param->getInit(),
5814 CallLoc, FD, Param,
Init,
5815 NestedDefaultChecking))
5819 Init, InitializationContext->Context);
5829 ClassPattern->
lookup(Field->getDeclName());
5830 auto Rng = llvm::make_filter_range(
5841 assert(Field->hasInClassInitializer());
5847 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
5848 InitializationContext =
5850 if (!InitializationContext.has_value())
5851 InitializationContext.emplace(Loc, Field,
CurContext);
5860 if (!Field->getInClassInitializer()) {
5866 assert(Pattern &&
"We must have set the Pattern!");
5870 Field->setInvalidDecl();
5882 if (!NestedDefaultChecking)
5883 V.TraverseDecl(Field);
5892 bool ContainsAnyTemporaries =
5893 isa_and_present<ExprWithCleanups>(Field->getInClassInitializer());
5894 if (Field->getInClassInitializer() &&
5895 !Field->getInClassInitializer()->containsErrors() &&
5896 (
V.HasImmediateCalls || (NeedRebuild && ContainsAnyTemporaries))) {
5900 NestedDefaultChecking;
5908 Res = Immediate.TransformInitializer(Field->getInClassInitializer(),
5914 Field->setInvalidDecl();
5920 if (Field->getInClassInitializer()) {
5921 Expr *E =
Init ?
Init : Field->getInClassInitializer();
5922 if (!NestedDefaultChecking)
5933 Field->setInvalidDecl();
5939 Field, InitializationContext->Context,
5958 Diag(Loc, diag::err_default_member_initializer_not_yet_parsed)
5959 << OutermostClass << Field;
5960 Diag(Field->getEndLoc(),
5961 diag::note_default_member_initializer_not_yet_parsed);
5964 Field->setInvalidDecl();
5972 if (isa_and_nonnull<CXXConstructorDecl>(FDecl))
5974 else if (Fn && Fn->getType()->isBlockPointerType())
5978 if (
Method->isInstance())
5980 }
else if (Fn && Fn->getType() ==
Context.BoundMemberTy)
5993 FunctionName(FuncName) {}
5995 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
6004 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
6005 return std::make_unique<FunctionCallCCC>(*
this);
6009 const IdentifierInfo *
const FunctionName;
6025 if (
NamedDecl *ND = Corrected.getFoundDecl()) {
6026 if (Corrected.isOverloaded()) {
6036 ND = Best->FoundDecl;
6037 Corrected.setCorrectionDecl(ND);
6043 ND = ND->getUnderlyingDecl();
6058 Fn = Fn->IgnoreParens();
6060 auto *UO = dyn_cast<UnaryOperator>(Fn);
6061 if (!UO || UO->getOpcode() != clang::UO_AddrOf)
6063 if (
auto *DRE = dyn_cast<DeclRefExpr>(UO->getSubExpr()->IgnoreParens())) {
6064 return DRE->hasQualifier();
6066 if (
auto *OVL = dyn_cast<OverloadExpr>(UO->getSubExpr()->IgnoreParens()))
6067 return bool(OVL->getQualifier());
6077 bool IsExecConfig) {
6081 if (
Context.BuiltinInfo.hasCustomTypechecking(ID))
6088 bool HasExplicitObjectParameter =
6090 unsigned ExplicitObjectParameterOffset = HasExplicitObjectParameter ? 1 : 0;
6094 unsigned FnKind = Fn->getType()->isBlockPointerType()
6101 if (Args.size() < NumParams) {
6102 if (Args.size() < MinArgs) {
6107 ? diag::err_typecheck_call_too_few_args_suggest
6108 : diag::err_typecheck_call_too_few_args_at_least_suggest;
6111 << FnKind << MinArgs - ExplicitObjectParameterOffset
6112 <<
static_cast<unsigned>(Args.size()) -
6113 ExplicitObjectParameterOffset
6115 }
else if (MinArgs - ExplicitObjectParameterOffset == 1 && FDecl &&
6120 ? diag::err_typecheck_call_too_few_args_one
6121 : diag::err_typecheck_call_too_few_args_at_least_one)
6122 << FnKind << FDecl->
getParamDecl(ExplicitObjectParameterOffset)
6123 << HasExplicitObjectParameter << Fn->getSourceRange();
6126 ? diag::err_typecheck_call_too_few_args
6127 : diag::err_typecheck_call_too_few_args_at_least)
6128 << FnKind << MinArgs - ExplicitObjectParameterOffset
6129 <<
static_cast<unsigned>(Args.size()) -
6130 ExplicitObjectParameterOffset
6131 << HasExplicitObjectParameter << Fn->getSourceRange();
6134 if (!TC && FDecl && !FDecl->
getBuiltinID() && !IsExecConfig)
6142 assert((
Call->getNumArgs() == NumParams) &&
6143 "We should have reserved space for the default arguments before!");
6148 if (Args.size() > NumParams) {
6154 ? diag::err_typecheck_call_too_many_args_suggest
6155 : diag::err_typecheck_call_too_many_args_at_most_suggest;
6158 << FnKind << NumParams - ExplicitObjectParameterOffset
6159 <<
static_cast<unsigned>(Args.size()) -
6160 ExplicitObjectParameterOffset
6162 }
else if (NumParams - ExplicitObjectParameterOffset == 1 && FDecl &&
6165 Diag(Args[NumParams]->getBeginLoc(),
6166 MinArgs == NumParams
6167 ? diag::err_typecheck_call_too_many_args_one
6168 : diag::err_typecheck_call_too_many_args_at_most_one)
6169 << FnKind << FDecl->
getParamDecl(ExplicitObjectParameterOffset)
6170 <<
static_cast<unsigned>(Args.size()) -
6171 ExplicitObjectParameterOffset
6172 << HasExplicitObjectParameter << Fn->getSourceRange()
6174 Args.back()->getEndLoc());
6176 Diag(Args[NumParams]->getBeginLoc(),
6177 MinArgs == NumParams
6178 ? diag::err_typecheck_call_too_many_args
6179 : diag::err_typecheck_call_too_many_args_at_most)
6180 << FnKind << NumParams - ExplicitObjectParameterOffset
6181 <<
static_cast<unsigned>(Args.size()) -
6182 ExplicitObjectParameterOffset
6183 << HasExplicitObjectParameter << Fn->getSourceRange()
6185 Args.back()->getEndLoc());
6188 if (!TC && FDecl && !FDecl->
getBuiltinID() && !IsExecConfig)
6193 Call->shrinkNumArgs(NumParams);
6204 unsigned TotalNumArgs = AllArgs.size();
6205 for (
unsigned i = 0; i < TotalNumArgs; ++i)
6206 Call->setArg(i, AllArgs[i]);
6208 Call->computeDependence();
6217 bool IsListInitialization) {
6222 for (
unsigned i = FirstParam; i < NumParams; i++) {
6227 if (ArgIx < Args.size()) {
6228 Arg = Args[ArgIx++];
6231 diag::err_call_incomplete_argument, Arg))
6235 bool CFAudited =
false;
6237 FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>() &&
6238 (!Param || !Param->hasAttr<CFConsumedAttr>()))
6241 FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>() &&
6242 (!Param || !Param->hasAttr<CFConsumedAttr>()))
6248 BE->getBlockDecl()->setDoesNotEscape();
6269 if (
const auto *OBT = Arg->
getType()->
getAs<OverflowBehaviorType>();
6272 OBT->isUnsignedIntegerOrEnumerationType() && OBT->isWrapKind();
6274 isPedantic ? diag::warn_obt_discarded_at_function_boundary_pedantic
6275 : diag::warn_obt_discarded_at_function_boundary)
6276 << Arg->
getType() << ProtoArgType;
6280 Entity,
SourceLocation(), Arg, IsListInitialization, AllowExplicit);
6286 assert(Param &&
"can't use default arguments without a known callee");
6298 CheckArrayAccess(Arg);
6303 AllArgs.push_back(Arg);
6312 for (
Expr *A : Args.slice(ArgIx)) {
6316 AllArgs.push_back(arg.get());
6321 for (
Expr *A : Args.slice(ArgIx)) {
6324 AllArgs.push_back(Arg.
get());
6329 for (
Expr *A : Args.slice(ArgIx))
6330 CheckArrayAccess(A);
6338 TL = DTL.getOriginalLoc();
6341 << ATL.getLocalSourceRange();
6347 const Expr *ArgExpr) {
6352 QualType OrigTy = Param->getOriginalType();
6377 Diag(CallLoc, diag::warn_static_array_too_small)
6385 std::optional<CharUnits> ArgSize =
6387 std::optional<CharUnits> ParmSize =
6389 if (ArgSize && ParmSize && *ArgSize < *ParmSize) {
6390 Diag(CallLoc, diag::warn_static_array_too_small)
6392 << (
unsigned)ParmSize->getQuantity() << 1;
6406 if (!placeholder)
return false;
6408 switch (placeholder->
getKind()) {
6410#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
6411 case BuiltinType::Id:
6412#include "clang/Basic/OpenCLImageTypes.def"
6413#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
6414 case BuiltinType::Id:
6415#include "clang/Basic/OpenCLExtensionTypes.def"
6418#define SVE_TYPE(Name, Id, SingletonId) \
6419 case BuiltinType::Id:
6420#include "clang/Basic/AArch64ACLETypes.def"
6421#define PPC_VECTOR_TYPE(Name, Id, Size) \
6422 case BuiltinType::Id:
6423#include "clang/Basic/PPCTypes.def"
6424#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6425#include "clang/Basic/RISCVVTypes.def"
6426#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6427#include "clang/Basic/WebAssemblyReferenceTypes.def"
6428#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
6429#include "clang/Basic/AMDGPUTypes.def"
6430#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6431#include "clang/Basic/HLSLIntangibleTypes.def"
6432#define PLACEHOLDER_TYPE(ID, SINGLETON_ID)
6433#define BUILTIN_TYPE(ID, SINGLETON_ID) case BuiltinType::ID:
6434#include "clang/AST/BuiltinTypes.def"
6437 case BuiltinType::UnresolvedTemplate:
6440 case BuiltinType::Overload:
6445 case BuiltinType::ARCUnbridgedCast:
6449 case BuiltinType::PseudoObject:
6454 case BuiltinType::UnknownAny:
6458 case BuiltinType::BoundMember:
6459 case BuiltinType::BuiltinFn:
6460 case BuiltinType::IncompleteMatrixIdx:
6461 case BuiltinType::ArraySection:
6462 case BuiltinType::OMPArrayShaping:
6463 case BuiltinType::OMPIterator:
6467 llvm_unreachable(
"bad builtin type kind");
6473 bool hasInvalid =
false;
6474 for (
size_t i = 0, e = args.size(); i != e; i++) {
6477 if (result.
isInvalid()) hasInvalid =
true;
6478 else args[i] = result.
get();
6502 if (!Context.BuiltinInfo.hasPtrArgsOrResult(FDecl->
getBuiltinID()) || !FT ||
6506 bool NeedsNewDecl =
false;
6526 if (!ParamType->isPointerType() ||
6527 ParamType->getPointeeType().hasAddressSpace() ||
6528 !ArgType->isPointerType() ||
6529 !ArgType->getPointeeType().hasAddressSpace() ||
6531 OverloadParams.push_back(ParamType);
6536 NeedsNewDecl =
true;
6537 LangAS AS = ArgType->getPointeeType().getAddressSpace();
6539 PointeeType = Context.getAddrSpaceQualType(PointeeType, AS);
6540 OverloadParams.push_back(Context.getPointerType(PointeeType));
6550 OverloadParams, EPI);
6560 for (
unsigned i = 0, e = FT->
getNumParams(); i != e; ++i) {
6567 Params.push_back(Parm);
6569 OverloadDecl->setParams(Params);
6573 if (FDecl->
hasAttr<CUDAHostAttr>())
6574 OverloadDecl->
addAttr(CUDAHostAttr::CreateImplicit(Context));
6575 if (FDecl->
hasAttr<CUDADeviceAttr>())
6576 OverloadDecl->
addAttr(CUDADeviceAttr::CreateImplicit(Context));
6579 return OverloadDecl;
6590 !Callee->isVariadic())
6592 if (Callee->getMinRequiredArguments() > ArgExprs.size())
6595 if (
const EnableIfAttr *
Attr =
6596 S.
CheckEnableIf(Callee, Fn->getBeginLoc(), ArgExprs,
true)) {
6597 S.
Diag(Fn->getBeginLoc(),
6599 ? diag::err_ovl_no_viable_member_function_in_call
6600 : diag::err_ovl_no_viable_function_in_call)
6601 << Callee << Callee->getSourceRange();
6602 S.
Diag(Callee->getLocation(),
6603 diag::note_ovl_candidate_disabled_by_function_cond_attr)
6604 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
6612 const auto GetFunctionLevelDCIfCXXClass =
6620 if (
const auto *MD = dyn_cast<CXXMethodDecl>(DC))
6621 return MD->
getParent()->getCanonicalDecl();
6624 if (
const auto *RD = dyn_cast<CXXRecordDecl>(DC))
6625 return RD->getCanonicalDecl();
6632 const CXXRecordDecl *
const CurParentClass = GetFunctionLevelDCIfCXXClass(S);
6633 if (!CurParentClass)
6640 assert(NamingClass &&
"Must have naming class even for implicit access");
6646 return CurParentClass == NamingClass ||
6695 if (
Call->getNumArgs() != 1)
6698 const Expr *E =
Call->getCallee()->IgnoreParenImpCasts();
6701 const DeclRefExpr *DRE = dyn_cast_if_present<DeclRefExpr>(E);
6714 if (BuiltinID != Builtin::BImove && BuiltinID != Builtin::BIforward)
6717 S.
Diag(DRE->
getLocation(), diag::warn_unqualified_call_to_std_cast_function)
6728 if (
Call.isInvalid())
6733 if (
const auto *ULE = dyn_cast<UnresolvedLookupExpr>(Fn);
6734 ULE && ULE->hasExplicitTemplateArgs() && ULE->decls().empty()) {
6735 DiagCompat(Fn->getExprLoc(), diag_compat::adl_only_template_id)
6743 if (
const auto *CE = dyn_cast<CallExpr>(
Call.get()))
6749 if (
auto *DRE = dyn_cast<DeclRefExpr>(Fn->IgnoreParens());
6750 DRE &&
Call.get()->isValueDependent()) {
6760 if (T->isDependentType())
6763 if (T == Context.BoundMemberTy || T == Context.UnknownAnyTy ||
6764 T == Context.BuiltinFnTy || T == Context.OverloadTy ||
6765 T->isFunctionType() || T->isFunctionReferenceType() ||
6766 T->isMemberFunctionPointerType() || T->isFunctionPointerType() ||
6767 T->isBlockPointerType() || T->isRecordType())
6776 Expr *ExecConfig,
bool IsExecConfig,
6777 bool AllowRecovery) {
6786 if (Fn->getType() ==
Context.BuiltinFnTy && ArgExprs.size() == 1 &&
6787 ArgExprs[0]->getType() ==
Context.BuiltinFnTy) {
6790 if (FD->getName() ==
"__builtin_amdgcn_is_invocable") {
6804 for (
const Expr *Arg : ArgExprs)
6805 if (CheckInvalidBuiltinCountedByRef(Arg,
6812 if (!ArgExprs.empty()) {
6814 Diag(Fn->getBeginLoc(), diag::err_pseudo_dtor_call_with_args)
6817 ArgExprs.back()->getEndLoc()));
6823 if (Fn->getType() ==
Context.PseudoObjectTy) {
6840 *
this, dyn_cast<UnresolvedMemberExpr>(Fn->IgnoreParens()),
6848 Diag(LParenLoc, diag::err_typecheck_call_not_function)
6849 << Fn->getType() << Fn->getSourceRange());
6857 if (Fn->getType()->isRecordType())
6861 if (Fn->getType() ==
Context.UnknownAnyTy) {
6867 if (Fn->getType() ==
Context.BoundMemberTy) {
6869 RParenLoc, ExecConfig, IsExecConfig,
6875 if (Fn->getType() ==
Context.OverloadTy) {
6886 Scope, Fn, ULE, LParenLoc, ArgExprs, RParenLoc, ExecConfig,
6889 RParenLoc, ExecConfig, IsExecConfig,
6895 if (Fn->getType() ==
Context.UnknownAnyTy) {
6901 Expr *NakedFn = Fn->IgnoreParens();
6903 bool CallingNDeclIndirectly =
false;
6905 if (
UnaryOperator *UnOp = dyn_cast<UnaryOperator>(NakedFn)) {
6906 if (UnOp->getOpcode() == UO_AddrOf) {
6907 CallingNDeclIndirectly =
true;
6912 if (
auto *DRE = dyn_cast<DeclRefExpr>(NakedFn)) {
6913 NDecl = DRE->getDecl();
6917 const llvm::Triple &Triple =
Context.getTargetInfo().getTriple();
6918 if (Triple.isSPIRV() && Triple.getVendor() == llvm::Triple::AMD) {
6935 Fn->getValueKind(), FDecl,
nullptr, DRE->isNonOdrUse());
6938 }
else if (
auto *ME = dyn_cast<MemberExpr>(NakedFn))
6939 NDecl = ME->getMemberDecl();
6941 if (
FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(NDecl)) {
6943 FD,
true, Fn->getBeginLoc()))
6955 for (
unsigned Idx = 0; Idx < ArgExprs.size() && Idx < FD->param_size();
6958 if (!ArgExprs[Idx] || !Param || !Param->getType()->isPointerType() ||
6959 !ArgExprs[Idx]->getType()->isPointerType())
6963 auto ArgTy = ArgExprs[Idx]->getType();
6964 auto ArgPtTy = ArgTy->getPointeeType();
6965 auto ArgAS = ArgPtTy.getAddressSpace();
6968 bool NeedImplicitASC =
6973 if (!NeedImplicitASC)
6977 if (ArgExprs[Idx]->isGLValue()) {
6981 ArgExprs[Idx] = Res.
get();
6985 Qualifiers ArgPtQuals = ArgPtTy.getQualifiers();
6988 Context.getQualifiedType(ArgPtTy.getUnqualifiedType(), ArgPtQuals);
6991 ArgTy.getQualifiers());
6995 CK_AddressSpaceConversion)
7001 if (
Context.isDependenceAllowed() &&
7004 assert((Fn->containsErrors() ||
7005 llvm::any_of(ArgExprs,
7006 [](
clang::Expr *E) { return E->containsErrors(); })) &&
7007 "should only occur in error-recovery path.");
7012 ExecConfig, IsExecConfig);
7017 std::string Name =
Context.BuiltinInfo.getName(Id);
7023 assert(BuiltInDecl &&
"failed to find builtin declaration");
7027 assert(DeclRef.
isUsable() &&
"Builtin reference cannot fail");
7032 assert(!
Call.isInvalid() &&
"Call to builtin cannot fail!");
7052 Diag(BuiltinLoc, diag::err_invalid_astype_of_different_size)
7070 FunctionDecl *FDecl = dyn_cast_or_null<FunctionDecl>(NDecl);
7071 unsigned BuiltinID = (FDecl ? FDecl->
getBuiltinID() : 0);
7074 switch (BuiltinID) {
7075 case Builtin::BI__builtin_longjmp:
7076 case Builtin::BI__builtin_setjmp:
7077 case Builtin::BI__sigsetjmp:
7078 case Builtin::BI_longjmp:
7079 case Builtin::BI_setjmp:
7080 case Builtin::BIlongjmp:
7081 case Builtin::BIsetjmp:
7082 case Builtin::BIsiglongjmp:
7083 case Builtin::BIsigsetjmp:
7096 if (DeferParent->
Contains(*CurScope) &&
7098 Diag(Fn->getExprLoc(), diag::err_defer_invalid_sjlj) << FDecl;
7103 if (FDecl->
hasAttr<AnyX86InterruptAttr>()) {
7104 Diag(Fn->getExprLoc(), diag::err_anyx86_interrupt_called);
7107 if (FDecl->
hasAttr<ARMInterruptAttr>()) {
7108 Diag(Fn->getExprLoc(), diag::err_arm_interrupt_called);
7117 if (Caller->hasAttr<AnyX86InterruptAttr>() ||
7118 Caller->hasAttr<AnyX86NoCallerSavedRegistersAttr>()) {
7120 bool HasNonGPRRegisters =
7122 if (HasNonGPRRegisters &&
7123 (!FDecl || !FDecl->
hasAttr<AnyX86NoCallerSavedRegistersAttr>())) {
7124 Diag(Fn->getExprLoc(), diag::warn_anyx86_excessive_regsave)
7125 << (Caller->hasAttr<AnyX86InterruptAttr>() ? 0 : 1);
7144 Fn->getType()->isSpecificBuiltinType(BuiltinType::BuiltinFn)) {
7160 if (!BuiltinID || !
Context.BuiltinInfo.hasCustomTypechecking(BuiltinID)) {
7167 return ExprError(
Diag(LParenLoc, diag::err_typecheck_call_not_function)
7168 << Fn->getType() << Fn->getSourceRange());
7174 if (Fn->getType() ==
Context.UnknownAnyTy) {
7182 return ExprError(
Diag(LParenLoc, diag::err_typecheck_call_not_function)
7183 << Fn->getType() << Fn->getSourceRange());
7190 const auto *Proto = dyn_cast_or_null<FunctionProtoType>(FuncT);
7191 unsigned NumParams = Proto ? Proto->getNumParams() : 0;
7195 assert(UsesADL == ADLCallKind::NotADL &&
7196 "CUDAKernelCallExpr should not use ADL");
7207 if (BuiltinID &&
Context.BuiltinInfo.hasCustomTypechecking(BuiltinID)) {
7208 ExprResult E = CheckBuiltinFunctionCall(FDecl, BuiltinID, TheCall);
7217 if (FDecl && !FDecl->
hasAttr<CUDAGlobalAttr>())
7218 return ExprError(
Diag(LParenLoc,diag::err_kern_call_not_global_function)
7219 << FDecl << Fn->getSourceRange());
7225 return ExprError(
Diag(LParenLoc, diag::err_kern_type_not_void_return)
7226 << Fn->getType() << Fn->getSourceRange());
7229 if (FDecl && FDecl->
hasAttr<CUDAGlobalAttr>())
7230 return ExprError(
Diag(LParenLoc, diag::err_global_call_not_config)
7231 << FDecl << Fn->getSourceRange());
7245 if (
Context.getTargetInfo().getTriple().isWasm()) {
7246 for (
const Expr *Arg : Args) {
7247 if (Arg && Arg->getType()->isWebAssemblyTableType()) {
7249 diag::err_wasm_table_as_function_parameter));
7267 if (!Proto || !(Proto->isVariadic() && Args.size() >= Def->
param_size()))
7268 Diag(RParenLoc, diag::warn_call_wrong_number_of_arguments)
7269 << (Args.size() > Def->
param_size()) << FDecl << Fn->getSourceRange();
7288 if (!Proto && !Args.empty() &&
7290 !
Diags.isIgnored(diag::warn_strict_uses_without_prototype,
7292 Diag(LParenLoc, diag::warn_strict_uses_without_prototype)
7293 << (FDecl !=
nullptr) << FDecl;
7296 for (
unsigned i = 0, e = Args.size(); i != e; i++) {
7297 Expr *Arg = Args[i];
7299 if (Proto && i < Proto->getNumParams()) {
7301 Context, Proto->getParamType(i), Proto->isParamConsumed(i));
7319 diag::err_call_incomplete_argument, Arg))
7328 if (
Method->isImplicitObjectMemberFunction())
7329 return ExprError(
Diag(LParenLoc, diag::err_member_call_without_object)
7330 << Fn->getSourceRange() << 0);
7338 for (
unsigned i = 0, e = Args.size(); i != e; i++) {
7339 if (
const auto *RT =
7340 dyn_cast<RecordType>(Args[i]->
getType().getCanonicalType())) {
7341 if (RT->getDecl()->isOrContainsUnion())
7342 Diag(Args[i]->getBeginLoc(), diag::warn_cmse_nonsecure_union)
7353 checkFortifiedBuiltinMemoryFunction(FDecl, TheCall);
7356 return CheckBuiltinFunctionCall(FDecl, BuiltinID, TheCall);
7358 if (CheckPointerCall(NDecl, TheCall, Proto))
7361 if (CheckOtherCall(TheCall, Proto))
7371 assert(Ty &&
"ActOnCompoundLiteral(): missing type");
7372 assert(InitExpr &&
"ActOnCompoundLiteral(): missing expression");
7377 TInfo =
Context.getTrivialTypeSourceInfo(literalType);
7389 LParenLoc,
Context.getBaseElementType(literalType),
7390 diag::err_array_incomplete_or_sizeless_type,
7413 ? diag::err_variable_object_no_init
7414 : diag::err_compound_literal_with_vla_type;
7421 diag::err_typecheck_decl_incomplete_type,
7436 LiteralExpr =
Result.get();
7443 bool IsFileScope = !
CurContext->isFunctionOrMethod() &&
7474 if (
auto ILE = dyn_cast<InitListExpr>(LiteralExpr))
7475 for (
unsigned i = 0, j = ILE->getNumInits(); i != j; i++) {
7477 if (!
Init->isTypeDependent() && !
Init->isValueDependent() &&
7479 Diag(
Init->getExprLoc(), diag::err_init_element_not_constant)
7480 <<
Init->getSourceBitField();
7488 LiteralExpr, IsFileScope);
7500 Diag(LParenLoc, diag::err_compound_literal_with_address_space)
7518 Cleanup.setExprNeedsCleanups(
true);
7537 bool DiagnosedArrayDesignator =
false;
7538 bool DiagnosedNestedDesignator =
false;
7539 bool DiagnosedMixedDesignator =
false;
7543 for (
unsigned I = 0, E = InitArgList.size(); I != E; ++I) {
7544 if (
auto *DIE = dyn_cast<DesignatedInitExpr>(InitArgList[I])) {
7546 FirstDesignator = DIE->getBeginLoc();
7551 if (!DiagnosedNestedDesignator && DIE->size() > 1) {
7552 DiagnosedNestedDesignator =
true;
7553 Diag(DIE->getBeginLoc(), diag::ext_designated_init_nested)
7554 << DIE->getDesignatorsSourceRange();
7557 for (
auto &Desig : DIE->designators()) {
7558 if (!Desig.isFieldDesignator() && !DiagnosedArrayDesignator) {
7559 DiagnosedArrayDesignator =
true;
7560 Diag(Desig.getBeginLoc(), diag::ext_designated_init_array)
7561 << Desig.getSourceRange();
7565 if (!DiagnosedMixedDesignator &&
7567 DiagnosedMixedDesignator =
true;
7568 Diag(DIE->getBeginLoc(), diag::ext_designated_init_mixed)
7569 << DIE->getSourceRange();
7570 Diag(InitArgList[0]->getBeginLoc(), diag::note_designated_init_mixed)
7571 << InitArgList[0]->getSourceRange();
7575 DiagnosedMixedDesignator =
true;
7577 Diag(DIE->getBeginLoc(), diag::ext_designated_init_mixed)
7578 << DIE->getSourceRange();
7579 Diag(InitArgList[I]->getBeginLoc(), diag::note_designated_init_mixed)
7580 << InitArgList[I]->getSourceRange();
7584 if (FirstDesignator.
isValid()) {
7588 !DiagnosedNestedDesignator && !DiagnosedMixedDesignator) {
7590 ? diag::warn_cxx17_compat_designated_init
7591 : diag::ext_cxx_designated_init);
7593 Diag(FirstDesignator, diag::ext_designated_init);
7608 for (
unsigned I = 0, E = InitArgList.size(); I != E; ++I) {
7609 if (InitArgList[I]->
getType()->isNonOverloadPlaceholderType()) {
7616 InitArgList[I] = result.
get();
7636 Cleanup.setExprNeedsCleanups(
true);
7645 if (
Context.hasSameUnqualifiedType(SrcTy, DestTy))
7650 llvm_unreachable(
"member pointer type in C");
7659 if (SrcAS != DestAS)
7660 return CK_AddressSpaceConversion;
7661 if (
Context.hasCvrSimilarType(SrcTy, DestTy))
7667 ? CK_BitCast : CK_AnyPointerToBlockPointerCast);
7672 return CK_CPointerToObjCPointerCast;
7674 return CK_BlockPointerToObjCPointerCast;
7676 return CK_PointerToBoolean;
7678 return CK_PointerToIntegral;
7684 llvm_unreachable(
"illegal cast from pointer");
7686 llvm_unreachable(
"Should have returned before this");
7691 return CK_FixedPointCast;
7693 return CK_FixedPointToBoolean;
7695 return CK_FixedPointToIntegral;
7697 return CK_FixedPointToFloating;
7701 diag::err_unimplemented_conversion_with_fixed_point_type)
7703 return CK_IntegralCast;
7708 llvm_unreachable(
"illegal cast to pointer type");
7710 llvm_unreachable(
"Should have returned before this");
7720 return CK_NullToPointer;
7721 return CK_IntegralToPointer;
7723 return CK_IntegralToBoolean;
7725 return CK_IntegralCast;
7727 return CK_IntegralToFloating;
7732 return CK_IntegralRealToComplex;
7736 CK_IntegralToFloating);
7737 return CK_FloatingRealToComplex;
7739 llvm_unreachable(
"member pointer type in C");
7741 return CK_IntegralToFixedPoint;
7743 llvm_unreachable(
"Should have returned before this");
7748 return CK_FloatingCast;
7750 return CK_FloatingToBoolean;
7752 return CK_FloatingToIntegral;
7757 return CK_FloatingRealToComplex;
7761 CK_FloatingToIntegral);
7762 return CK_IntegralRealToComplex;
7766 llvm_unreachable(
"valid float->pointer cast?");
7768 llvm_unreachable(
"member pointer type in C");
7770 return CK_FloatingToFixedPoint;
7772 llvm_unreachable(
"Should have returned before this");
7777 return CK_FloatingComplexCast;
7779 return CK_FloatingComplexToIntegralComplex;
7782 if (
Context.hasSameType(ET, DestTy))
7783 return CK_FloatingComplexToReal;
7785 return CK_FloatingCast;
7788 return CK_FloatingComplexToBoolean;
7792 CK_FloatingComplexToReal);
7793 return CK_FloatingToIntegral;
7797 llvm_unreachable(
"valid complex float->pointer cast?");
7799 llvm_unreachable(
"member pointer type in C");
7802 diag::err_unimplemented_conversion_with_fixed_point_type)
7804 return CK_IntegralCast;
7806 llvm_unreachable(
"Should have returned before this");
7811 return CK_IntegralComplexToFloatingComplex;
7813 return CK_IntegralComplexCast;
7816 if (
Context.hasSameType(ET, DestTy))
7817 return CK_IntegralComplexToReal;
7819 return CK_IntegralCast;
7822 return CK_IntegralComplexToBoolean;
7826 CK_IntegralComplexToReal);
7827 return CK_IntegralToFloating;
7831 llvm_unreachable(
"valid complex int->pointer cast?");
7833 llvm_unreachable(
"member pointer type in C");
7836 diag::err_unimplemented_conversion_with_fixed_point_type)
7838 return CK_IntegralCast;
7840 llvm_unreachable(
"Should have returned before this");
7843 llvm_unreachable(
"Unhandled scalar cast");
7850 len = vecType->getNumElements();
7851 eltType = vecType->getElementType();
7858 if (!
type->isRealType())
return false;
7868 auto ValidScalableConversion = [](
QualType FirstType,
QualType SecondType) {
7872 const auto *VecTy = SecondType->getAs<
VectorType>();
7876 return ValidScalableConversion(srcTy, destTy) ||
7877 ValidScalableConversion(destTy, srcTy);
7887 return matSrcType->
getNumRows() == matDestType->getNumRows() &&
7888 matSrcType->
getNumColumns() == matDestType->getNumColumns();
7894 uint64_t SrcLen, DestLen;
7904 uint64_t SrcEltSize =
Context.getTypeSize(SrcEltTy);
7905 uint64_t DestEltSize =
Context.getTypeSize(DestEltTy);
7907 return (SrcLen * SrcEltSize == DestLen * DestEltSize);
7912 "expected at least one type to be a vector here");
7914 bool IsSrcTyAltivec =
7930 return (IsSrcTyAltivec || IsDestTyAltivec);
7950 switch (
Context.getLangOpts().getLaxVectorConversions()) {
7957 if (!Vec || !Vec->getElementType()->isIntegralOrEnumerationType())
7962 if (!Vec || !Vec->getElementType()->isIntegralOrEnumerationType())
7979 return Diag(R.getBegin(), diag::err_invalid_conversion_between_matrixes)
7980 << DestTy << SrcTy << R;
7983 return Diag(R.getBegin(),
7984 diag::err_invalid_conversion_between_matrix_and_type)
7985 << SrcTy << DestTy << R;
7987 return Diag(R.getBegin(),
7988 diag::err_invalid_conversion_between_matrix_and_type)
7989 << DestTy << SrcTy << R;
7992 Kind = CK_MatrixCast;
7998 assert(VectorTy->
isVectorType() &&
"Not a vector type!");
8002 return Diag(R.getBegin(),
8004 diag::err_invalid_conversion_between_vectors :
8005 diag::err_invalid_conversion_between_vector_and_integer)
8006 << VectorTy << Ty << R;
8008 return Diag(R.getBegin(),
8009 diag::err_invalid_conversion_between_vector_and_scalar)
8010 << VectorTy << Ty << R;
8019 if (DestElemTy == SplattedExpr->
getType())
8020 return SplattedExpr;
8033 CK_BooleanToSignedIntegral);
8034 SplattedExpr = CastExprRes.
get();
8035 CK = CK_IntegralToFloating;
8037 CK = CK_BooleanToSignedIntegral;
8044 SplattedExpr = CastExprRes.
get();
8052 if (DestElemTy == SplattedExpr->
getType())
8053 return SplattedExpr;
8062 SplattedExpr = CastExprRes.
get();
8080 !
Context.hasSameUnqualifiedType(DestTy, SrcTy) &&
8081 !
Context.areCompatibleVectorTypes(DestTy, SrcTy))) {
8082 Diag(R.getBegin(),diag::err_invalid_conversion_between_ext_vectors)
8083 << DestTy << SrcTy << R;
8094 return Diag(R.getBegin(),
8095 diag::err_invalid_conversion_between_vector_and_scalar)
8096 << DestTy << SrcTy << R;
8098 Kind = CK_VectorSplat;
8108 DestType == SourceType)
8116 if (!CE->getCalleeAllocSizeAttr())
8118 std::optional<llvm::APInt> AllocSize =
8119 CE->evaluateBytesReturnedByAllocSizeCall(S.
Context);
8122 if (!AllocSize || AllocSize->isZero())
8132 if (LhsSize && Size < LhsSize)
8134 << Size.getQuantity() << TargetType << LhsSize->getQuantity();
8142 "ActOnCastExpr(): missing type or expr");
8158 bool isVectorLiteral =
false;
8173 isVectorLiteral =
true;
8176 isVectorLiteral =
true;
8181 if (isVectorLiteral)
8211 "Expected paren or paren list expression");
8218 LiteralLParenLoc = PE->getLParenLoc();
8219 LiteralRParenLoc = PE->getRParenLoc();
8220 exprs = PE->getExprs();
8221 numExprs = PE->getNumExprs();
8248 if (numExprs == 1) {
8251 if (Literal.isInvalid())
8257 else if (numExprs < numElems) {
8259 diag::err_incorrect_number_of_vector_initializers);
8263 initExprs.append(exprs, exprs + numExprs);
8272 Diag(exprs[0]->getBeginLoc(), diag::err_typecheck_convert_incompatible)
8279 if (Literal.isInvalid())
8286 initExprs.append(exprs, exprs + numExprs);
8291 initExprs, LiteralRParenLoc);
8320 unsigned NumUserSpecifiedExprs,
8325 InitLoc, LParenLoc, RParenLoc);
8330 const Expr *NullExpr = LHSExpr;
8331 const Expr *NonPointerExpr = RHSExpr;
8338 NonPointerExpr = LHSExpr;
8360 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands_null)
8361 << NonPointerExpr->
getType() << DiagType
8373 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_nonfloat)
8374 << CondTy <<
Cond->getSourceRange();
8381 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_scalar)
8382 << CondTy <<
Cond->getSourceRange();
8415 bool IsBlockPointer =
false;
8419 IsBlockPointer =
true;
8444 ResultAddrSpace = LAddrSpace;
8446 ResultAddrSpace = RAddrSpace;
8448 S.
Diag(Loc, diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
8455 auto LHSCastKind = CK_BitCast, RHSCastKind = CK_BitCast;
8460 S.
Diag(Loc, diag::err_typecheck_cond_incompatible_ptrauth)
8477 LAddrSpace == ResultAddrSpace ? CK_BitCast : CK_AddressSpaceConversion;
8479 RAddrSpace == ResultAddrSpace ? CK_BitCast : CK_AddressSpaceConversion;
8487 lhptee, rhptee,
false,
false,
8490 if (CompositeTy.
isNull()) {
8507 S.
Diag(Loc, diag::ext_typecheck_cond_incompatible_pointers)
8518 QualType ResultTy = [&, ResultAddrSpace]() {
8553 S.
Diag(Loc, diag::err_typecheck_cond_incompatible_operands)
8606 bool IsIntFirstExpr) {
8608 !Int.get()->getType()->isIntegerType())
8611 Expr *Expr1 = IsIntFirstExpr ? Int.get() : PointerExpr;
8612 Expr *Expr2 = IsIntFirstExpr ? PointerExpr : Int.get();
8614 S.
Diag(Loc, diag::ext_typecheck_cond_pointer_integer_mismatch)
8618 CK_IntegralToPointer);
8652 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_int_float)
8658 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_int_float)
8664 if (LHSType == RHSType)
8674 (S, LHS, RHS, LHSType, RHSType,
false);
8708 llvm::raw_svector_ostream OS(Str);
8709 OS <<
"(vector of " << NumElements <<
" '" << EleTyName <<
"' values)";
8710 S.
Diag(QuestionLoc, diag::err_conditional_vector_element_size)
8711 << CondTy << OS.str();
8732 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_nonfloat)
8733 <<
Cond->getType() <<
Cond->getSourceRange();
8750 S.
Diag(QuestionLoc, diag::err_conditional_vector_size)
8751 << CondTy << VecResTy;
8756 QualType RVE = RV->getElementType();
8761 S.
Diag(QuestionLoc, diag::err_conditional_vector_element_size)
8762 << CondTy << VecResTy;
8777 if (
Cond.isInvalid())
8788 bool IsBoolVecLang =
8817 if (
const CallExpr *CE = dyn_cast<CallExpr>(E)) {
8818 QualType Ty = CE->getCallee()->getType();
8850 if (
Context.isDependenceAllowed() &&
8856 "should only occur in error-recovery path.");
8863 Cond.get()->getType()->isExtVectorType())
8868 if (
Cond.isInvalid())
8891 Diag(QuestionLoc, diag::err_wasm_table_conditional_expression)
8900 diag::err_typecheck_cond_incompatible_operands) << LHSTy << RHSTy
8919 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands)
8935 Context.hasSameUnqualifiedType(LHSTy, RHSTy))
8975 if (!compositeType.
isNull())
8976 return compositeType;
9006 if (
Context.hasSameType(LHSTy, RHSTy))
9007 return Context.getCommonSugaredType(LHSTy, RHSTy);
9010 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands)
9029 Self.Diag(Loc,
Note) << ParenRange;
9049 const Expr **RHSExprs) {
9054 if (
const auto *MTE = dyn_cast<MaterializeTemporaryExpr>(E)) {
9055 E = MTE->getSubExpr();
9060 if (
const auto *OP = dyn_cast<BinaryOperator>(E);
9062 *Opcode = OP->getOpcode();
9063 *RHSExprs = OP->getRHS();
9068 if (
const auto *
Call = dyn_cast<CXXOperatorCallExpr>(E)) {
9069 if (
Call->getNumArgs() != 2)
9075 if (OO < OO_Plus || OO > OO_Arrow ||
9076 OO == OO_PlusPlus || OO == OO_MinusMinus)
9082 *RHSExprs =
Call->getArg(1);
9098 if (
const auto *OP = dyn_cast<BinaryOperator>(E))
9099 return OP->isComparisonOp() || OP->isLogicalOp();
9100 if (
const auto *OP = dyn_cast<UnaryOperator>(E))
9101 return OP->getOpcode() == UO_LNot;
9116 const Expr *RHSExpr) {
9118 const Expr *CondRHS;
9129 ? diag::warn_precedence_bitwise_conditional
9130 : diag::warn_precedence_conditional;
9132 Self.Diag(OpLoc, DiagID)
9138 Self.PDiag(diag::note_precedence_silence)
9143 Self.PDiag(diag::note_precedence_conditional_first),
9154 auto GetNullability = [](
QualType Ty) {
9155 std::optional<NullabilityKind> Kind = Ty->getNullability();
9165 auto LHSKind = GetNullability(LHSTy), RHSKind = GetNullability(RHSTy);
9173 MergedKind = RHSKind;
9180 MergedKind = RHSKind;
9182 MergedKind = LHSKind;
9188 if (GetNullability(ResTy) == MergedKind)
9206 Expr *commonExpr =
nullptr;
9208 commonExpr = CondExpr;
9215 commonExpr = result.
get();
9229 commonExpr = commonRes.
get();
9239 commonExpr = MatExpr.
get();
9247 LHSExpr = CondExpr = opaqueValue;
9255 VK, OK, QuestionLoc);
9256 if (result.
isNull() ||
Cond.isInvalid() || LHS.isInvalid() ||
9263 CheckBoolLikeConversion(
Cond.get(), QuestionLoc);
9271 RHS.get(), result,
VK, OK);
9274 commonExpr, opaqueValue,
Cond.get(), LHS.get(), RHS.get(), QuestionLoc,
9275 ColonLoc, result,
VK, OK);
9279 unsigned FromAttributes = 0, ToAttributes = 0;
9280 if (
const auto *FromFn =
9281 dyn_cast<FunctionProtoType>(
Context.getCanonicalType(FromType)))
9284 if (
const auto *ToFn =
9285 dyn_cast<FunctionProtoType>(
Context.getCanonicalType(ToType)))
9289 return FromAttributes != ToAttributes;
9301 assert(LHSType.
isCanonical() &&
"LHS not canonicalized!");
9302 assert(RHSType.
isCanonical() &&
"RHS not canonicalized!");
9305 const Type *lhptee, *rhptee;
9307 std::tie(lhptee, lhq) =
9309 std::tie(rhptee, rhq) =
9380 diag::warn_typecheck_convert_incompatible_function_pointer_strict,
9404 ltrans = LUnderlying;
9405 rtrans = RUnderlying;
9423 if (ltrans == rtrans) {
9439 std::tie(lhptee, lhq) =
9441 std::tie(rhptee, rhq) =
9453 return AssignConvertType::
9454 IncompatibleNestedPointerAddressSpaceMismatch;
9458 if (lhptee == rhptee)
9478 const auto *LFPT = dyn_cast<FunctionProtoType>(LFT);
9479 const auto *RFPT = dyn_cast<FunctionProtoType>(RFT);
9482 LFPT->getParamTypes(),
9483 RFPT->getExtProtoInfo());
9488 LFPT->getParamTypes(), EPI);
9493 EPI.
ExtInfo = LFT->getExtInfo();
9495 RFPT->getParamTypes(), EPI);
9514 assert(LHSType.
isCanonical() &&
"LHS not canonicalized!");
9515 assert(RHSType.
isCanonical() &&
"RHS not canonicalized!");
9536 if (LQuals != RQuals)
9565 assert(LHSType.
isCanonical() &&
"LHS was not canonicalized!");
9566 assert(RHSType.
isCanonical() &&
"RHS was not canonicalized!");
9614 return VT->getElementType().getCanonicalType() == ElementType;
9644 LHSType =
Context.getCanonicalType(LHSType).getUnqualifiedType();
9645 RHSType =
Context.getCanonicalType(RHSType).getUnqualifiedType();
9648 if (LHSType == RHSType) {
9655 if (
const auto *AT = dyn_cast<AutoType>(LHSType)) {
9656 if (AT->isGNUAutoType()) {
9662 auto OBTResult =
Context.checkOBTAssignmentCompatibility(LHSType, RHSType);
9663 switch (OBTResult) {
9668 Kind = LHSType->
isBooleanType() ? CK_IntegralToBoolean : CK_IntegralCast;
9681 !
Context.areCompatibleOverflowBehaviorTypes(LHSPointee, RHSPointee)) {
9689 if (
const AtomicType *AtomicTy = dyn_cast<AtomicType>(LHSType)) {
9694 if (Kind != CK_NoOp && ConvertRHS)
9696 Kind = CK_NonAtomicToAtomic;
9708 if (
Context.typesAreCompatible(LHSTypeRef->getPointeeType(), RHSType)) {
9709 Kind = CK_LValueBitCast;
9720 if (LHSExtType->getNumElements() != RHSExtType->getNumElements())
9724 RHSExtType->getElementType()->isIntegerType()) {
9725 Kind = CK_IntegralToBoolean;
9729 if (
Context.getLangOpts().OpenCL &&
9730 Context.areCompatibleVectorTypes(LHSType, RHSType)) {
9740 Kind = CK_VectorSplat;
9750 if (
Context.areCompatibleVectorTypes(LHSType, RHSType)) {
9762 if (
Context.getTargetInfo().getTriple().isPPC() &&
9764 !
Context.areCompatibleVectorTypes(RHSType, LHSType))
9766 << RHSType << LHSType;
9780 if (
Context.getTargetInfo().getTriple().isPPC() &&
9785 << RHSType << LHSType;
9796 if (
ARM().areCompatibleSveTypes(LHSType, RHSType) ||
9797 ARM().areLaxCompatibleSveTypes(LHSType, RHSType)) {
9805 if (
Context.areCompatibleRVVTypes(LHSType, RHSType) ||
9806 Context.areLaxCompatibleRVVTypes(LHSType, RHSType)) {
9835 if (
const PointerType *LHSPointer = dyn_cast<PointerType>(LHSType)) {
9838 LangAS AddrSpaceL = LHSPointer->getPointeeType().getAddressSpace();
9840 if (AddrSpaceL != AddrSpaceR)
9841 Kind = CK_AddressSpaceConversion;
9842 else if (
Context.hasCvrSimilarType(RHSType, LHSType))
9852 Kind = CK_IntegralToPointer;
9860 if (LHSPointer->getPointeeType()->isVoidType()) {
9868 Context.getObjCClassRedefinitionType())) {
9879 if (LHSPointer->getPointeeType()->isVoidType()) {
9880 LangAS AddrSpaceL = LHSPointer->getPointeeType().getAddressSpace();
9885 AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion : CK_BitCast;
9903 Kind = AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion : CK_BitCast;
9909 Kind = CK_IntegralToPointer;
9915 Kind = CK_AnyPointerToBlockPointerCast;
9921 if (RHSPT->getPointeeType()->isVoidType()) {
9922 Kind = CK_AnyPointerToBlockPointerCast;
9936 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
9938 !
ObjC().CheckObjCARCUnavailableWeakConversion(OrigLHSType, RHSType))
9945 Kind = CK_IntegralToPointer;
9952 Kind = CK_CPointerToObjCPointerCast;
9962 Context.getObjCClassRedefinitionType())) {
9974 Kind = CK_BlockPointerToObjCPointerCast;
9986 Kind = CK_NullToPointer;
9993 if (LHSType ==
Context.BoolTy) {
9994 Kind = CK_PointerToBoolean;
10000 Kind = CK_PointerToIntegral;
10010 if (LHSType ==
Context.BoolTy) {
10011 Kind = CK_PointerToBoolean;
10017 Kind = CK_PointerToIntegral;
10026 if (
Context.typesAreCompatible(LHSType, RHSType)) {
10033 Kind = CK_IntToOCLSampler;
10067 const RecordType *UT =
ArgType->getAsUnionType();
10071 RecordDecl *UD = UT->getDecl()->getDefinitionOrSelf();
10072 if (!UD->
hasAttr<TransparentUnionAttr>())
10078 for (
auto *it : UD->
fields()) {
10079 if (it->getType()->isPointerType()) {
10118 bool DiagnoseCFAudited,
10122 assert((ConvertRHS || !
Diagnose) &&
"can't indicate whether we diagnosed");
10128 ExprResult &RHS = ConvertRHS ? CallerRHS : LocalRHS;
10132 if (RHSPtrType->getPointeeType()->hasAttr(attr::NoDeref) &&
10133 !LHSPtrType->getPointeeType()->hasAttr(attr::NoDeref)) {
10135 diag::warn_noderef_to_dereferenceable_pointer)
10154 AllowedExplicit::None,
10166 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
10167 !
ObjC().CheckObjCARCUnavailableWeakConversion(LHSType, RHSType))
10189 RHS.
get(), LHSType,
false, DAP))
10312 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
10322 ObjC().CheckConversionToObjCLiteral(LHSType, E,
Diagnose))) {
10342struct OriginalOperand {
10343 explicit OriginalOperand(
Expr *Op) : Orig(Op), Conversion(
nullptr) {
10344 if (
auto *MTE = dyn_cast<MaterializeTemporaryExpr>(Op))
10345 Op = MTE->getSubExpr();
10346 if (
auto *BTE = dyn_cast<CXXBindTemporaryExpr>(Op))
10347 Op = BTE->getSubExpr();
10348 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(Op)) {
10349 Orig = ICE->getSubExprAsWritten();
10350 Conversion = ICE->getConversionFunction();
10354 QualType
getType()
const {
return Orig->getType(); }
10357 NamedDecl *Conversion;
10363 OriginalOperand OrigLHS(LHS.
get()), OrigRHS(RHS.
get());
10365 Diag(Loc, diag::err_typecheck_invalid_operands)
10366 << OrigLHS.getType() << OrigRHS.getType()
10371 if (OrigLHS.Conversion) {
10372 Diag(OrigLHS.Conversion->getLocation(),
10373 diag::note_typecheck_invalid_operands_converted)
10376 if (OrigRHS.Conversion) {
10378 diag::note_typecheck_invalid_operands_converted)
10393 if (!(LHSNatVec && RHSNatVec)) {
10395 Expr *NonVector = !LHSNatVec ? LHS.
get() : RHS.
get();
10396 Diag(Loc, diag::err_typecheck_logical_vector_expr_gnu_cpp_restrict)
10398 <<
Vector->getSourceRange();
10402 Diag(Loc, diag::err_typecheck_logical_vector_expr_gnu_cpp_restrict)
10425 unsigned &DiagID) {
10431 scalarCast = CK_IntegralToBoolean;
10436 DiagID = diag::err_opencl_scalar_type_rank_greater_than_vector_type;
10441 scalarCast = CK_IntegralCast;
10446 DiagID = diag::err_opencl_scalar_type_rank_greater_than_vector_type;
10449 scalarCast = CK_FloatingCast;
10452 scalarCast = CK_IntegralToFloating;
10461 if (scalarCast != CK_NoOp)
10472 assert(VecTy &&
"Expression E must be a vector");
10477 VecTy->getVectorKind());
10481 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(E))
10482 if (ICE->getSubExpr()->getType() == NewVecTy)
10483 return ICE->getSubExpr();
10485 auto Cast = ElementType->
isIntegerType() ? CK_IntegralCast : CK_FloatingCast;
10493 Expr *E = Int->get();
10497 QualType IntTy = Int->get()->getType().getUnqualifiedType();
10503 bool CstInt = Int->get()->EvaluateAsInt(EVResult, S.
Context);
10511 llvm::APSInt Result = EVResult.
Val.
getInt();
10512 unsigned NumBits = IntSigned
10513 ? (Result.isNegative() ? Result.getSignificantBits()
10514 : Result.getActiveBits())
10515 : Result.getActiveBits();
10522 return (IntSigned != OtherIntSigned &&
10528 return (Order < 0);
10535 if (Int->get()->containsErrors())
10538 QualType IntTy = Int->get()->getType().getUnqualifiedType();
10543 bool CstInt = Int->get()->EvaluateAsInt(EVResult, S.
Context);
10552 llvm::APSInt Result = EVResult.
Val.
getInt();
10555 llvm::APFloat::rmTowardZero);
10558 bool Ignored =
false;
10559 Float.convertToInteger(ConvertBack, llvm::APFloat::rmNearestTiesToEven,
10561 if (Result != ConvertBack)
10567 unsigned FloatPrec = llvm::APFloat::semanticsPrecision(
10569 if (Bits > FloatPrec)
10582 QualType ScalarTy = Scalar->get()->getType().getUnqualifiedType();
10583 QualType VectorTy =
Vector->get()->getType().getUnqualifiedType();
10588 "ExtVectorTypes should not be handled here!");
10589 VectorEltTy = VT->getElementType();
10594 llvm_unreachable(
"Only Fixed-Length and SVE Vector types are handled here");
10620 ScalarCast = CK_IntegralCast;
10624 ScalarCast = CK_FloatingToIntegral;
10632 llvm::APFloat
Result(0.0);
10638 bool CstScalar = Scalar->get()->isValueDependent() ||
10639 Scalar->get()->EvaluateAsFloat(Result, S.
Context);
10641 if (!CstScalar && Order < 0)
10647 bool Truncated =
false;
10649 llvm::APFloat::rmNearestTiesToEven, &Truncated);
10654 ScalarCast = CK_FloatingCast;
10659 ScalarCast = CK_IntegralToFloating;
10666 if (ScalarCast != CK_NoOp)
10674 bool AllowBothBool,
10675 bool AllowBoolConversions,
10676 bool AllowBoolOperation,
10677 bool ReportInvalid) {
10678 if (!IsCompAssign) {
10694 assert(LHSVecType || RHSVecType);
10702 (RHSVecType && RHSVecType->getElementType()->isMFloat8Type()))
10707 if (!AllowBothBool && LHSVecType &&
10713 if (!AllowBoolOperation &&
10718 if (
Context.hasSameType(LHSType, RHSType))
10719 return Context.getCommonSugaredType(LHSType, RHSType);
10722 if (LHSVecType && RHSVecType &&
10723 Context.areCompatibleVectorTypes(LHSType, RHSType)) {
10737 if (AllowBoolConversions && LHSVecType && RHSVecType &&
10740 Context.getTypeSize(RHSVecType->getElementType()))) {
10747 if (!IsCompAssign &&
10750 RHSVecType->getElementType()->isIntegerType()) {
10759 unsigned &SVEorRVV) {
10780 if (IsSveRVVConversion(LHSType, RHSType, SVEorRVV) ||
10781 IsSveRVVConversion(RHSType, LHSType, SVEorRVV)) {
10782 Diag(Loc, diag::err_typecheck_sve_rvv_ambiguous)
10783 << SVEorRVV << LHSType << RHSType;
10790 unsigned &SVEorRVV) {
10795 if (FirstVecType && SecondVecType) {
10798 SecondVecType->getVectorKind() ==
10803 SecondVecType->getVectorKind() ==
10805 SecondVecType->getVectorKind() ==
10807 SecondVecType->getVectorKind() ==
10816 if (SecondVecType &&
10829 if (IsSveRVVGnuConversion(LHSType, RHSType, SVEorRVV) ||
10830 IsSveRVVGnuConversion(RHSType, LHSType, SVEorRVV)) {
10831 Diag(Loc, diag::err_typecheck_sve_rvv_gnu_ambiguous)
10832 << SVEorRVV << LHSType << RHSType;
10838 unsigned DiagID = diag::err_typecheck_vector_not_convertable;
10853 LHSType, RHSVecType->getElementType(),
10866 QualType VecType = LHSVecType ? LHSType : RHSType;
10867 const VectorType *VT = LHSVecType ? LHSVecType : RHSVecType;
10868 QualType OtherType = LHSVecType ? RHSType : LHSType;
10869 ExprResult *OtherExpr = LHSVecType ? &RHS : &LHS;
10871 if (
Context.getTargetInfo().getTriple().isPPC() &&
10873 !
Context.areCompatibleVectorTypes(RHSType, LHSType))
10874 Diag(Loc, diag::warn_deprecated_lax_vec_conv_all) << RHSType << LHSType;
10878 if (!IsCompAssign) {
10897 if ((!RHSVecType && !RHSType->
isRealType()) ||
10899 Diag(Loc, diag::err_typecheck_vector_not_convertable_non_scalar)
10900 << LHSType << RHSType
10912 Diag(Loc, diag::err_opencl_implicit_vector_conversion) << LHSType
10923 QualType Scalar = LHSVecType ? RHSType : LHSType;
10925 unsigned ScalarOrVector = LHSVecType && RHSVecType ? 1 : 0;
10927 diag::err_typecheck_vector_not_convertable_implict_truncation)
10928 << ScalarOrVector << Scalar <<
Vector;
10935 << LHSType << RHSType
10944 if (!IsCompAssign) {
10959 unsigned DiagID = diag::err_typecheck_invalid_operands;
10961 ((LHSBuiltinTy && LHSBuiltinTy->
isSVEBool()) ||
10962 (RHSBuiltinTy && RHSBuiltinTy->isSVEBool()))) {
10968 if (
Context.hasSameType(LHSType, RHSType))
10983 Diag(Loc, diag::err_typecheck_vector_not_convertable_non_scalar)
10990 Context.getBuiltinVectorTypeInfo(LHSBuiltinTy).EC !=
10991 Context.getBuiltinVectorTypeInfo(RHSBuiltinTy).EC) {
10992 Diag(Loc, diag::err_typecheck_vector_lengths_not_equal)
11001 bool ScalarOrVector =
11004 Diag(Loc, diag::err_typecheck_vector_not_convertable_implict_truncation)
11005 << ScalarOrVector << Scalar <<
Vector;
11037 S.
Diag(Loc, diag::warn_null_in_arithmetic_operation)
11049 S.
Diag(Loc, diag::warn_null_in_comparison_operation)
11050 << LHSNull << NonNullType
11062 QualType ElementType = CT->getElementType().getCanonicalType();
11063 bool IsComplexRangePromoted = S.
getLangOpts().getComplexRange() ==
11070 const llvm::fltSemantics &ElementTypeSemantics =
11072 const llvm::fltSemantics &HigherElementTypeSemantics =
11075 if ((llvm::APFloat::semanticsMaxExponent(ElementTypeSemantics) * 2 + 1 >
11076 llvm::APFloat::semanticsMaxExponent(HigherElementTypeSemantics)) ||
11083 if (
Type == HigherElementType) {
11095 const auto *LUE = dyn_cast<UnaryExprOrTypeTraitExpr>(LHS);
11096 const auto *RUE = dyn_cast<UnaryExprOrTypeTraitExpr>(RHS);
11099 if (LUE->getKind() != UETT_SizeOf || LUE->isArgumentType() ||
11100 RUE->getKind() != UETT_SizeOf)
11107 if (RUE->isArgumentType())
11108 RHSTy = RUE->getArgumentType().getNonReferenceType();
11110 RHSTy = RUE->getArgumentExpr()->IgnoreParens()->getType();
11117 if (
const auto *DRE = dyn_cast<DeclRefExpr>(LHSArg)) {
11118 if (
const ValueDecl *LHSArgDecl = DRE->getDecl())
11119 S.
Diag(LHSArgDecl->getLocation(), diag::note_pointer_declared_here)
11123 QualType ArrayElemTy = ArrayTy->getElementType();
11129 S.
Diag(Loc, diag::warn_division_sizeof_array)
11131 if (
const auto *DRE = dyn_cast<DeclRefExpr>(LHSArg)) {
11132 if (
const ValueDecl *LHSArgDecl = DRE->getDecl())
11133 S.
Diag(LHSArgDecl->getLocation(), diag::note_array_declared_here)
11137 S.
Diag(Loc, diag::note_precedence_silence) << RHS;
11150 S.
PDiag(diag::warn_remainder_division_by_zero)
11159 const Expr *LHSExpr = LHS.
get();
11160 const Expr *RHSExpr = RHS.
get();
11165 if (!LHSIsScoped && !RHSIsScoped)
11177 ->getDefinitionOrSelf()
11178 ->getIntegerType();
11179 std::string InsertionString =
"static_cast<" + IntType.getAsString() +
">(";
11180 S.
Diag(BeginLoc, diag::note_no_implicit_conversion_for_scoped_enum)
11185 DiagnosticHelper(LHSExpr, LHSType);
11188 DiagnosticHelper(RHSExpr, RHSType);
11195 bool IsCompAssign = Opc == BO_MulAssign || Opc == BO_DivAssign;
11196 bool IsDiv = Opc == BO_Div || Opc == BO_DivAssign;
11290 if (compType.
isNull() ||
11295 IsCompAssign ? BO_RemAssign : BO_Rem);
11306 ? diag::err_typecheck_pointer_arith_void_type
11307 : diag::ext_gnu_void_ptr)
11316 ? diag::err_typecheck_pointer_arith_void_type
11317 : diag::ext_gnu_void_ptr)
11318 << 0 <<
Pointer->getSourceRange();
11329 S.
Diag(Loc, diag::warn_gnu_null_ptr_arith)
11330 <<
Pointer->getSourceRange();
11332 S.
Diag(Loc, diag::warn_pointer_arith_null_ptr)
11349 S.
PDiag(diag::warn_pointer_sub_null_ptr)
11351 <<
Pointer->getSourceRange());
11360 ? diag::err_typecheck_pointer_arith_function_type
11361 : diag::ext_gnu_ptr_func_arith)
11373 assert(
Pointer->getType()->isAnyPointerType());
11375 ? diag::err_typecheck_pointer_arith_function_type
11376 : diag::ext_gnu_ptr_func_arith)
11377 << 0 <<
Pointer->getType()->getPointeeType()
11379 <<
Pointer->getSourceRange();
11387 QualType ResType = Operand->getType();
11389 ResType = ResAtomicType->getValueType();
11395 diag::err_typecheck_arithmetic_incomplete_or_sizeless_type,
11396 Operand->getSourceRange());
11409 QualType ResType = Operand->getType();
11411 ResType = ResAtomicType->getValueType();
11443 if (!isLHSPointer && !isRHSPointer)
return true;
11445 QualType LHSPointeeTy, RHSPointeeTy;
11450 if (isLHSPointer && isRHSPointer) {
11454 diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
11462 bool isLHSVoidPtr = isLHSPointer && LHSPointeeTy->
isVoidType();
11463 bool isRHSVoidPtr = isRHSPointer && RHSPointeeTy->
isVoidType();
11464 if (isLHSVoidPtr || isRHSVoidPtr) {
11472 bool isLHSFuncPtr = isLHSPointer && LHSPointeeTy->
isFunctionType();
11473 bool isRHSFuncPtr = isRHSPointer && RHSPointeeTy->
isFunctionType();
11474 if (isLHSFuncPtr || isRHSFuncPtr) {
11496 Expr* IndexExpr = RHSExpr;
11499 IndexExpr = LHSExpr;
11502 bool IsStringPlusInt = StrExpr &&
11508 Self.Diag(OpLoc, diag::warn_string_plus_int)
11512 if (IndexExpr == RHSExpr) {
11514 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence)
11519 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence);
11525 const Expr *StringRefExpr = LHSExpr;
11530 CharExpr = dyn_cast<CharacterLiteral>(LHSExpr->
IgnoreImpCasts());
11531 StringRefExpr = RHSExpr;
11534 if (!CharExpr || !StringRefExpr)
11554 Self.Diag(OpLoc, diag::warn_string_plus_char)
11555 << DiagRange << Ctx.
CharTy;
11557 Self.Diag(OpLoc, diag::warn_string_plus_char)
11558 << DiagRange << CharExpr->
getType();
11564 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence)
11569 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence);
11578 S.
Diag(Loc, diag::err_typecheck_sub_ptr_compatible)
11597 if (CompLHSTy) *CompLHSTy = compType;
11606 *CompLHSTy = compType;
11615 *CompLHSTy = compType;
11626 if (Opc == BO_Add) {
11633 if (CompLHSTy) *CompLHSTy = compType;
11647 std::swap(PExp, IExp);
11660 if (!IExp->getType()->isIntegerType())
11669 (!IExp->isValueDependent() &&
11670 (!IExp->EvaluateAsInt(KnownVal,
Context) ||
11674 Context, BO_Add, PExp, IExp);
11688 Diag(Loc, diag::err_ptrauth_indirect_goto_addrlabel_arithmetic)
11694 CheckArrayAccess(PExp, IExp);
11700 if (
Context.isPromotableIntegerType(LHSTy))
11701 LHSTy =
Context.getPromotedIntegerType(LHSTy);
11703 *CompLHSTy = LHSTy;
11724 if (CompLHSTy) *CompLHSTy = compType;
11733 *CompLHSTy = compType;
11742 *CompLHSTy = compType;
11756 if (CompLHSTy) *CompLHSTy = compType;
11773 Diag(Loc, diag::err_ptrauth_indirect_goto_addrlabel_arithmetic)
11799 CheckArrayAccess(LHS.
get(), RHS.
get(),
nullptr,
11802 if (CompLHSTy) *CompLHSTy = LHS.
get()->
getType();
11813 if (!
Context.hasSameUnqualifiedType(lpointee, rpointee)) {
11818 if (!
Context.typesAreCompatible(
11819 Context.getCanonicalType(lpointee).getUnqualifiedType(),
11820 Context.getCanonicalType(rpointee).getUnqualifiedType())) {
11846 if (ElementSize.
isZero()) {
11847 Diag(Loc,diag::warn_sub_ptr_zero_size_types)
11853 if (CompLHSTy) *CompLHSTy = LHS.
get()->
getType();
11854 return Context.getPointerDiffType();
11864 if (
const EnumType *ET = T->getAsCanonical<EnumType>())
11865 return ET->getDecl()->isScoped();
11877 if (Opc == BO_Shr &&
11886 llvm::APSInt Right = RHSResult.
Val.
getInt();
11888 if (Right.isNegative()) {
11890 S.
PDiag(diag::warn_shift_negative)
11901 LeftSize = FXSema.getWidth() - (
unsigned)FXSema.hasUnsignedPadding();
11903 if (Right.uge(LeftSize)) {
11905 S.
PDiag(diag::warn_shift_gt_typewidth)
11925 llvm::APSInt Left = LHSResult.
Val.
getInt();
11936 if (Left.isNegative()) {
11938 S.
PDiag(diag::warn_shift_lhs_negative)
11943 llvm::APInt ResultBits =
11944 static_cast<llvm::APInt &
>(Right) + Left.getSignificantBits();
11945 if (ResultBits.ule(LeftSize))
11947 llvm::APSInt Result = Left.extend(ResultBits.getLimitedValue());
11948 Result = Result.shl(Right);
11953 Result.toString(HexResult, 16,
false,
true);
11959 if (ResultBits - 1 == LeftSize) {
11960 S.
Diag(Loc, diag::warn_shift_result_sets_sign_bit)
11961 << HexResult << LHSType
11966 S.
Diag(Loc, diag::warn_shift_result_gt_typewidth)
11967 << HexResult.str() << Result.getSignificantBits() << LHSType
11979 S.
Diag(Loc, diag::err_shift_rhs_only_vector)
11985 if (!IsCompAssign) {
12007 S.
Diag(Loc, diag::err_typecheck_invalid_operands)
12014 if (!LHSEleType->isIntegerType()) {
12015 S.
Diag(Loc, diag::err_typecheck_expect_int)
12020 if (!RHSEleType->isIntegerType()) {
12021 S.
Diag(Loc, diag::err_typecheck_expect_int)
12030 if (LHSEleType != RHSEleType) {
12032 LHSEleType = RHSEleType;
12038 }
else if (RHSVecTy) {
12043 S.
Diag(Loc, diag::err_typecheck_vector_lengths_not_equal)
12051 if (LHSBT != RHSBT &&
12053 S.
Diag(Loc, diag::warn_typecheck_vector_element_sizes_not_equal)
12070 bool IsCompAssign) {
12071 if (!IsCompAssign) {
12094 if ((LHSBuiltinTy && LHSBuiltinTy->
isSVEBool()) ||
12095 (RHSBuiltinTy && RHSBuiltinTy->
isSVEBool())) {
12096 S.
Diag(Loc, diag::err_typecheck_invalid_operands)
12101 if (!LHSEleType->isIntegerType()) {
12102 S.
Diag(Loc, diag::err_typecheck_expect_int)
12107 if (!RHSEleType->isIntegerType()) {
12108 S.
Diag(Loc, diag::err_typecheck_expect_int)
12116 S.
Diag(Loc, diag::err_typecheck_invalid_operands)
12126 if (LHSEleType != RHSEleType) {
12128 LHSEleType = RHSEleType;
12130 const llvm::ElementCount VecSize =
12139 S.
Diag(Loc, diag::err_typecheck_vector_lengths_not_equal)
12145 const llvm::ElementCount VecSize =
12147 if (LHSEleType != RHSEleType) {
12149 RHSEleType = LHSEleType;
12162 bool IsCompAssign) {
12196 if (IsCompAssign) LHS = OldLHS;
12224 S.
Diag(Loc, IsError ? diag::err_typecheck_comparison_of_distinct_pointers
12225 : diag::ext_typecheck_comparison_of_distinct_pointers)
12265 S.
Diag(Loc, IsError ? diag::err_typecheck_comparison_of_fptr_to_void
12266 : diag::ext_typecheck_comparison_of_fptr_to_void)
12273 case Stmt::ObjCArrayLiteralClass:
12274 case Stmt::ObjCDictionaryLiteralClass:
12275 case Stmt::ObjCStringLiteralClass:
12276 case Stmt::ObjCBoxedExprClass:
12320 QualType T = Method->parameters()[0]->getType();
12321 if (!T->isObjCObjectPointerType())
12324 QualType R = Method->getReturnType();
12325 if (!R->isScalarType())
12337 Literal = LHS.
get();
12340 Literal = RHS.
get();
12356 llvm_unreachable(
"Unknown Objective-C object literal kind");
12360 S.
Diag(Loc, diag::warn_objc_string_literal_comparison)
12361 << Literal->getSourceRange();
12363 S.
Diag(Loc, diag::warn_objc_literal_comparison)
12364 << LiteralKind << Literal->getSourceRange();
12373 S.
Diag(Loc, diag::note_objc_literal_comparison_isequal)
12386 if (!UO || UO->
getOpcode() != UO_LNot)
return;
12396 bool IsBitwiseOp = Opc == BO_And || Opc == BO_Or || Opc == BO_Xor;
12398 << Loc << IsBitwiseOp;
12425 if (
const DeclRefExpr *DR = dyn_cast<DeclRefExpr>(E)) {
12427 }
else if (
const MemberExpr *Mem = dyn_cast<MemberExpr>(E)) {
12428 if (Mem->isImplicitAccess())
12429 D = Mem->getMemberDecl();
12444 return std::nullopt;
12452 std::swap(LHS, RHS);
12456 std::swap(LHS, RHS);
12460 return std::nullopt;
12463 auto *BO = dyn_cast<BinaryOperator>(LHS);
12464 if (!BO || BO->getOpcode() != BO_Add)
12465 return std::nullopt;
12469 Other = BO->getRHS();
12471 Other = BO->getLHS();
12473 return std::nullopt;
12475 if (!
Other->getType()->isUnsignedIntegerType())
12476 return std::nullopt;
12478 return Opc == BO_GE;
12532 auto IsDeprArrayComparionIgnored =
12535 ? diag::warn_array_comparison_cxx26
12536 : !S.
getLangOpts().CPlusPlus20 || IsDeprArrayComparionIgnored
12537 ? diag::warn_array_comparison
12538 : diag::warn_depr_array_comparison;
12553 Result = AlwaysTrue;
12558 Result = AlwaysFalse;
12561 Result = AlwaysEqual;
12564 Result = AlwaysConstant;
12568 S.
PDiag(diag::warn_comparison_always)
12576 Result = AlwaysFalse;
12579 Result = AlwaysTrue;
12583 Result = AlwaysConstant;
12587 S.
PDiag(diag::warn_comparison_always)
12590 }
else if (std::optional<bool> Res =
12593 S.
PDiag(diag::warn_comparison_always)
12595 << (*Res ? AlwaysTrue : AlwaysFalse));
12606 Expr *LiteralString =
nullptr;
12607 Expr *LiteralStringStripped =
nullptr;
12611 LiteralString = LHS;
12612 LiteralStringStripped = LHSStripped;
12617 LiteralString = RHS;
12618 LiteralStringStripped = RHSStripped;
12621 if (LiteralString) {
12623 S.
PDiag(diag::warn_stringcompare)
12636 llvm_unreachable(
"unhandled cast kind");
12638 case CK_UserDefinedConversion:
12640 case CK_LValueToRValue:
12642 case CK_ArrayToPointerDecay:
12644 case CK_FunctionToPointerDecay:
12646 case CK_IntegralCast:
12648 case CK_FloatingCast:
12650 case CK_IntegralToFloating:
12651 case CK_FloatingToIntegral:
12653 case CK_IntegralComplexCast:
12654 case CK_FloatingComplexCast:
12655 case CK_FloatingComplexToIntegralComplex:
12656 case CK_IntegralComplexToFloatingComplex:
12658 case CK_FloatingComplexToReal:
12659 case CK_FloatingRealToComplex:
12660 case CK_IntegralComplexToReal:
12661 case CK_IntegralRealToComplex:
12663 case CK_HLSLArrayRValue:
12676 if (
const auto *ICE = dyn_cast<ImplicitCastExpr>(E))
12703 << 0 << FromType << ToType;
12708 llvm_unreachable(
"unhandled case in switch");
12735 if (NumEnumArgs == 1) {
12737 QualType OtherTy = LHSIsEnum ? RHSStrippedType : LHSStrippedType;
12743 if (NumEnumArgs == 2) {
12752 assert(IntType->isArithmeticType());
12762 LHSType = RHSType = IntType;
12771 if (
Type.isNull()) {
12777 std::optional<ComparisonCategoryType> CCT =
12789 assert(!
Type.isNull() &&
"composite type for <=> has not been set");
12807 if (
Type.isNull()) {
12828 int NullValue =
PP.isMacroDefined(
"NULL") ? 0 : 1;
12833 if (
const auto *
CL = dyn_cast<CharacterLiteral>(E.
get())) {
12834 if (
CL->getValue() == 0)
12838 NullValue ?
"NULL" :
"(void *)0");
12839 }
else if (
const auto *CE = dyn_cast<CStyleCastExpr>(E.
get())) {
12846 NullValue ?
"NULL" :
"(void *)0");
12856 bool IsThreeWay = Opc == BO_Cmp;
12857 bool IsOrdered = IsRelational || IsThreeWay;
12868 if (!IsThreeWay || IsAnyPointerType(LHS) || IsAnyPointerType(RHS)) {
12921 auto computeResultTy = [&]() {
12930 std::optional<ComparisonCategoryType> CCT =
12935 if (CompositeTy->
isPointerType() && LHSIsNull != RHSIsNull) {
12939 Diag(Loc, diag::err_typecheck_three_way_comparison_of_pointer_and_zero)
12940 << (LHSIsNull ? LHS.
get()->getSourceRange()
12949 if (!IsOrdered && LHSIsNull != RHSIsNull) {
12950 bool IsEquality = Opc == BO_EQ;
12962 bool IsError = Opc == BO_Cmp;
12964 IsError ? diag::err_typecheck_ordered_comparison_of_function_pointers
12966 ? diag::warn_typecheck_ordered_comparison_of_function_pointers
12967 : diag::ext_typecheck_ordered_comparison_of_function_pointers;
12996 return computeResultTy();
13012 (IsOrdered ? 2 : 1) &&
13017 return computeResultTy();
13031 if (IsRelational) {
13036 Diag(Loc, diag::ext_typecheck_compare_complete_incomplete_pointers)
13042 }
else if (!IsRelational &&
13046 && !LHSIsNull && !RHSIsNull)
13053 if (LCanPointeeTy != RCanPointeeTy) {
13059 diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
13060 << LHSType << RHSType << 0
13066 CastKind Kind = AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion
13072 bool RHSHasCFIUncheckedCallee = RFn && RFn->getCFIUncheckedCalleeAttr();
13073 bool ChangingCFIUncheckedCallee =
13074 LHSHasCFIUncheckedCallee != RHSHasCFIUncheckedCallee;
13076 if (LHSIsNull && !RHSIsNull)
13078 else if (!ChangingCFIUncheckedCallee)
13081 return computeResultTy();
13093 if (!IsOrdered && LHSIsNull && RHSIsNull) {
13096 return computeResultTy();
13100 return computeResultTy();
13111 return computeResultTy();
13115 return computeResultTy();
13124 return computeResultTy();
13129 return computeResultTy();
13133 if (IsRelational &&
13144 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
13145 if (CTSD->isInStdNamespace() &&
13146 llvm::StringSwitch<bool>(CTSD->getName())
13147 .Cases({
"less",
"less_equal",
"greater",
"greater_equal"},
true)
13153 return computeResultTy();
13166 return computeResultTy();
13176 if (!LHSIsNull && !RHSIsNull &&
13177 !
Context.typesAreCompatible(lpointee, rpointee)) {
13178 Diag(Loc, diag::err_typecheck_comparison_of_distinct_blocks)
13183 return computeResultTy();
13190 if (!LHSIsNull && !RHSIsNull) {
13195 Diag(Loc, diag::err_typecheck_comparison_of_distinct_blocks)
13199 if (LHSIsNull && !RHSIsNull)
13202 : CK_AnyPointerToBlockPointerCast);
13206 : CK_AnyPointerToBlockPointerCast);
13207 return computeResultTy();
13216 bool RPtrToVoid = RPT ? RPT->getPointeeType()->isVoidType() :
false;
13218 if (!LPtrToVoid && !RPtrToVoid &&
13219 !
Context.typesAreCompatible(LHSType, RHSType)) {
13226 if (LHSIsNull && !RHSIsNull) {
13232 RPT ? CK_BitCast :CK_CPointerToObjCPointerCast);
13242 LPT ? CK_BitCast :CK_CPointerToObjCPointerCast);
13244 return computeResultTy();
13248 if (!
Context.areComparableObjCPointerTypes(LHSType, RHSType))
13254 if (LHSIsNull && !RHSIsNull)
13258 return computeResultTy();
13264 CK_BlockPointerToObjCPointerCast);
13265 return computeResultTy();
13266 }
else if (!IsOrdered &&
13270 CK_BlockPointerToObjCPointerCast);
13271 return computeResultTy();
13276 unsigned DiagID = 0;
13277 bool isError =
false;
13286 isError ? diag::err_typecheck_ordered_comparison_of_pointer_and_zero
13287 : diag::ext_typecheck_ordered_comparison_of_pointer_and_zero;
13290 DiagID = diag::err_typecheck_comparison_of_pointer_integer;
13292 }
else if (IsOrdered)
13293 DiagID = diag::ext_typecheck_ordered_comparison_of_pointer_integer;
13295 DiagID = diag::ext_typecheck_comparison_of_pointer_integer;
13307 LHSIsNull ? CK_NullToPointer : CK_IntegralToPointer);
13310 RHSIsNull ? CK_NullToPointer : CK_IntegralToPointer);
13311 return computeResultTy();
13315 if (!IsOrdered && RHSIsNull
13318 return computeResultTy();
13320 if (!IsOrdered && LHSIsNull
13323 return computeResultTy();
13326 if (
getLangOpts().getOpenCLCompatibleVersion() >= 200) {
13328 return computeResultTy();
13332 return computeResultTy();
13335 if (LHSIsNull && RHSType->
isQueueT()) {
13337 return computeResultTy();
13340 if (LHSType->
isQueueT() && RHSIsNull) {
13342 return computeResultTy();
13367 "Unhandled vector element size in vector compare");
13387 "Unhandled vector element size in vector compare");
13397 const auto TypeSize =
Context.getTypeSize(ETy);
13399 const QualType IntTy =
Context.getIntTypeForBitwidth(TypeSize,
true);
13400 const llvm::ElementCount VecSize =
Context.getBuiltinVectorTypeInfo(VTy).EC;
13401 return Context.getScalableVectorType(IntTy, VecSize.getKnownMinValue());
13407 if (Opc == BO_Cmp) {
13408 Diag(Loc, diag::err_three_way_vector_comparison);
13437 return Context.getLogicalOperationType();
13439 Diag(Loc, diag::warn_deprecated_altivec_src_compat);
13445 return Context.getLogicalOperationType();
13469 if (Opc == BO_Cmp) {
13470 Diag(Loc, diag::err_three_way_vector_comparison);
13498 if (LHSBuiltinTy && RHSBuiltinTy && LHSBuiltinTy->
isSVEBool() &&
13499 RHSBuiltinTy->isSVEBool())
13518 bool Negative =
false;
13519 bool ExplicitPlus =
false;
13520 const auto *LHSInt = dyn_cast<IntegerLiteral>(XorLHS.
get());
13521 const auto *RHSInt = dyn_cast<IntegerLiteral>(XorRHS.
get());
13527 if (
const auto *UO = dyn_cast<UnaryOperator>(XorRHS.
get())) {
13529 if (Opc != UO_Minus && Opc != UO_Plus)
13531 RHSInt = dyn_cast<IntegerLiteral>(UO->getSubExpr());
13534 Negative = (Opc == UO_Minus);
13535 ExplicitPlus = !Negative;
13541 const llvm::APInt &LeftSideValue = LHSInt->getValue();
13542 llvm::APInt RightSideValue = RHSInt->getValue();
13543 if (LeftSideValue != 2 && LeftSideValue != 10)
13546 if (LeftSideValue.getBitWidth() != RightSideValue.getBitWidth())
13551 llvm::StringRef ExprStr =
13556 llvm::StringRef XorStr =
13559 if (XorStr ==
"xor")
13570 RightSideValue = -RightSideValue;
13571 RHSStr =
"-" + RHSStr;
13572 }
else if (ExplicitPlus) {
13573 RHSStr =
"+" + RHSStr;
13576 StringRef LHSStrRef = LHSStr;
13577 StringRef RHSStrRef = RHSStr;
13580 if (LHSStrRef.starts_with(
"0b") || LHSStrRef.starts_with(
"0B") ||
13581 RHSStrRef.starts_with(
"0b") || RHSStrRef.starts_with(
"0B") ||
13582 LHSStrRef.starts_with(
"0x") || LHSStrRef.starts_with(
"0X") ||
13583 RHSStrRef.starts_with(
"0x") || RHSStrRef.starts_with(
"0X") ||
13584 (LHSStrRef.size() > 1 && LHSStrRef.starts_with(
"0")) ||
13585 (RHSStrRef.size() > 1 && RHSStrRef.starts_with(
"0")) ||
13586 LHSStrRef.contains(
'\'') || RHSStrRef.contains(
'\''))
13591 const llvm::APInt XorValue = LeftSideValue ^ RightSideValue;
13592 int64_t RightSideIntValue = RightSideValue.getSExtValue();
13593 if (LeftSideValue == 2 && RightSideIntValue >= 0) {
13594 std::string SuggestedExpr =
"1 << " + RHSStr;
13595 bool Overflow =
false;
13596 llvm::APInt One = (LeftSideValue - 1);
13597 llvm::APInt PowValue = One.sshl_ov(RightSideValue, Overflow);
13599 if (RightSideIntValue < 64)
13600 S.
Diag(Loc, diag::warn_xor_used_as_pow_base)
13601 << ExprStr <<
toString(XorValue, 10,
true) << (
"1LL << " + RHSStr)
13603 else if (RightSideIntValue == 64)
13604 S.
Diag(Loc, diag::warn_xor_used_as_pow)
13605 << ExprStr <<
toString(XorValue, 10,
true);
13609 S.
Diag(Loc, diag::warn_xor_used_as_pow_base_extra)
13610 << ExprStr <<
toString(XorValue, 10,
true) << SuggestedExpr
13613 ExprRange, (RightSideIntValue == 0) ?
"1" : SuggestedExpr);
13616 S.
Diag(Loc, diag::note_xor_used_as_pow_silence)
13617 << (
"0x2 ^ " + RHSStr) << SuggestXor;
13618 }
else if (LeftSideValue == 10) {
13619 std::string SuggestedValue =
"1e" + std::to_string(RightSideIntValue);
13620 S.
Diag(Loc, diag::warn_xor_used_as_pow_base)
13621 << ExprStr <<
toString(XorValue, 10,
true) << SuggestedValue
13623 S.
Diag(Loc, diag::note_xor_used_as_pow_silence)
13624 << (
"0xA ^ " + RHSStr) << SuggestXor;
13641 getLangOpts().getOpenCLCompatibleVersion() < 120 &&
13668 assert(
false &&
"Logical operands are not supported in C\\C++");
13684 bool IsCompAssign) {
13685 if (!IsCompAssign) {
13701 assert((LHSMatType || RHSMatType) &&
"At least one operand must be a matrix");
13703 if (
Context.hasSameType(LHSType, RHSType))
13704 return Context.getCommonSugaredType(LHSType, RHSType);
13710 if (LHSMatType && !RHSMatType) {
13718 if (!LHSMatType && RHSMatType) {
13730 bool IsCompAssign) {
13731 if (!IsCompAssign) {
13742 assert((LHSMatType || RHSMatType) &&
"At least one operand must be a matrix");
13744 if (LHSMatType && RHSMatType) {
13745 if (LHSMatType->getNumColumns() != RHSMatType->
getNumRows())
13748 if (
Context.hasSameType(LHSMatType, RHSMatType))
13749 return Context.getCommonSugaredType(
13753 QualType LHSELTy = LHSMatType->getElementType(),
13755 if (!
Context.hasSameType(LHSELTy, RHSELTy))
13758 return Context.getConstantMatrixType(
13759 Context.getCommonSugaredType(LHSELTy, RHSELTy),
13784 bool IsCompAssign =
13785 Opc == BO_AndAssign || Opc == BO_OrAssign || Opc == BO_XorAssign;
13796 LegalBoolVecOperator,
13826 ExprResult LHSResult = LHS, RHSResult = RHS;
13828 LHSResult, RHSResult, Loc,
13830 if (LHSResult.
isInvalid() || RHSResult.isInvalid())
13832 LHS = LHSResult.
get();
13833 RHS = RHSResult.
get();
13858 bool EnumConstantInBoolContext =
false;
13860 if (
const auto *DREHS = dyn_cast<DeclRefExpr>(HS.get())) {
13861 const auto *ECDHS = dyn_cast<EnumConstantDecl>(DREHS->getDecl());
13862 if (ECDHS && ECDHS->getInitVal() != 0 && ECDHS->getInitVal() != 1)
13863 EnumConstantInBoolContext =
true;
13867 if (EnumConstantInBoolContext)
13868 Diag(Loc, diag::warn_enum_constant_in_bool_context);
13873 const auto *LHSATy = dyn_cast<ArrayType>(LHSTy);
13874 const auto *RHSATy = dyn_cast<ArrayType>(RHSTy);
13875 if ((LHSATy && LHSATy->getElementType().isWebAssemblyReferenceType()) ||
13876 (RHSATy && RHSATy->getElementType().isWebAssemblyReferenceType())) {
13898 Diag(Loc, diag::warn_logical_instead_of_bitwise)
13901 Diag(Loc, diag::note_logical_instead_of_bitwise_change_operator)
13902 << (Opc == BO_LAnd ?
"&" :
"|")
13905 Opc == BO_LAnd ?
"&" :
"|");
13906 if (Opc == BO_LAnd)
13908 Diag(Loc, diag::note_logical_instead_of_bitwise_remove_constant)
13916 if (!
Context.getLangOpts().CPlusPlus) {
13919 if (
Context.getLangOpts().OpenCL &&
13920 Context.getLangOpts().OpenCLVersion < 120) {
13975 const MemberExpr *ME = dyn_cast<MemberExpr>(E);
13976 if (!ME)
return false;
13980 if (!
Base)
return false;
13981 return Base->getMethodDecl() !=
nullptr;
14005 assert(S.
getLangOpts().CPlusPlus &&
"BindingDecl outside of C++?");
14016 assert(Var->
hasLocalStorage() &&
"capture added 'const' to non-local?");
14024 if (
auto *FD = dyn_cast<FunctionDecl>(DC))
14066 bool DiagnosticEmitted =
false;
14070 bool IsDereference =
false;
14071 bool NextIsDereference =
false;
14075 IsDereference = NextIsDereference;
14078 if (
const MemberExpr *ME = dyn_cast<MemberExpr>(E)) {
14079 NextIsDereference = ME->isArrow();
14080 const ValueDecl *VD = ME->getMemberDecl();
14081 if (
const FieldDecl *Field = dyn_cast<FieldDecl>(VD)) {
14083 if (Field->isMutable()) {
14084 assert(DiagnosticEmitted &&
"Expected diagnostic not emitted.");
14089 if (!DiagnosticEmitted) {
14090 S.
Diag(Loc, diag::err_typecheck_assign_const)
14092 << Field->getType();
14093 DiagnosticEmitted =
true;
14096 <<
ConstMember <<
false << Field << Field->getType()
14097 << Field->getSourceRange();
14101 }
else if (
const VarDecl *VDecl = dyn_cast<VarDecl>(VD)) {
14102 if (VDecl->getType().isConstQualified()) {
14103 if (!DiagnosticEmitted) {
14104 S.
Diag(Loc, diag::err_typecheck_assign_const)
14106 << VDecl->getType();
14107 DiagnosticEmitted =
true;
14110 <<
ConstMember <<
true << VDecl << VDecl->getType()
14111 << VDecl->getSourceRange();
14118 dyn_cast<ArraySubscriptExpr>(E)) {
14122 dyn_cast<ExtVectorElementExpr>(E)) {
14129 if (
const CallExpr *CE = dyn_cast<CallExpr>(E)) {
14133 if (!DiagnosticEmitted) {
14134 S.
Diag(Loc, diag::err_typecheck_assign_const) << ExprRange
14136 DiagnosticEmitted =
true;
14139 diag::note_typecheck_assign_const)
14143 }
else if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
14145 if (
const ValueDecl *VD = DRE->getDecl()) {
14147 if (!DiagnosticEmitted) {
14148 S.
Diag(Loc, diag::err_typecheck_assign_const)
14150 DiagnosticEmitted =
true;
14152 S.
Diag(VD->getLocation(), diag::note_typecheck_assign_const)
14153 <<
ConstVariable << VD << VD->getType() << VD->getSourceRange();
14158 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(DC)) {
14159 if (MD->isConst()) {
14160 if (!DiagnosticEmitted) {
14161 S.
Diag(Loc, diag::err_typecheck_assign_const_method)
14162 << ExprRange << MD;
14163 DiagnosticEmitted =
true;
14165 S.
Diag(MD->getLocation(), diag::note_typecheck_assign_const_method)
14166 << MD << MD->getSourceRange();
14172 if (DiagnosticEmitted)
14176 S.
Diag(Loc, diag::err_typecheck_assign_const) << ExprRange <<
ConstUnknown;
14186 const RecordType *Ty,
14189 bool &DiagnosticEmitted) {
14190 std::vector<const RecordType *> RecordTypeList;
14191 RecordTypeList.push_back(Ty);
14192 unsigned NextToCheckIndex = 0;
14195 while (RecordTypeList.size() > NextToCheckIndex) {
14196 bool IsNested = NextToCheckIndex > 0;
14197 for (
const FieldDecl *Field : RecordTypeList[NextToCheckIndex]
14202 QualType FieldTy = Field->getType();
14204 if (!DiagnosticEmitted) {
14205 S.
Diag(Loc, diag::err_typecheck_assign_const)
14207 << IsNested << Field;
14208 DiagnosticEmitted =
true;
14210 S.
Diag(Field->getLocation(), diag::note_typecheck_assign_const)
14212 << FieldTy << Field->getSourceRange();
14217 if (
const auto *FieldRecTy = FieldTy->
getAsCanonical<RecordType>()) {
14218 if (!llvm::is_contained(RecordTypeList, FieldRecTy))
14219 RecordTypeList.push_back(FieldRecTy);
14222 ++NextToCheckIndex;
14231 assert(Ty->
isRecordType() &&
"lvalue was not record?");
14234 bool DiagEmitted =
false;
14236 if (
const MemberExpr *ME = dyn_cast<MemberExpr>(E))
14239 else if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
14264 unsigned DiagID = 0;
14265 bool NeedType =
false;
14272 DiagID = diag::err_block_decl_ref_not_modifiable_lvalue;
14274 DiagID = diag::err_lambda_decl_ref_not_modifiable_lvalue;
14287 if (var->isARCPseudoStrong() &&
14288 (!var->getTypeSourceInfo() ||
14289 !var->getTypeSourceInfo()->getType().isConstQualified())) {
14295 ? diag::err_typecheck_arc_assign_self_class_method
14296 : diag::err_typecheck_arc_assign_self;
14299 }
else if (var->hasAttr<ObjCExternallyRetainedAttr>() ||
14301 DiagID = diag::err_typecheck_arc_assign_externally_retained;
14305 DiagID = diag::err_typecheck_arr_assign_enumeration;
14309 if (Loc != OrigLoc)
14335 DiagID = diag::err_typecheck_array_not_modifiable_lvalue;
14339 DiagID = diag::err_typecheck_non_object_not_modifiable_lvalue;
14343 DiagID = diag::err_typecheck_lvalue_casts_not_supported;
14346 llvm_unreachable(
"did not take early return for MLV_Valid");
14350 DiagID = diag::err_typecheck_expression_not_modifiable_lvalue;
14355 diag::err_typecheck_incomplete_type_not_modifiable_lvalue, E);
14357 DiagID = diag::err_typecheck_duplicate_vector_components_not_mlvalue;
14360 DiagID = diag::err_typecheck_duplicate_matrix_components_not_mlvalue;
14363 llvm_unreachable(
"readonly properties should be processed differently");
14365 DiagID = diag::err_readonly_message_assignment;
14368 DiagID = diag::err_no_subobject_property_setting;
14373 if (Loc != OrigLoc)
14395 MemberExpr *ML = dyn_cast<MemberExpr>(LHSExpr);
14396 MemberExpr *MR = dyn_cast<MemberExpr>(RHSExpr);
14404 if (LHSDecl != RHSDecl)
14409 if (RefTy->getPointeeType().isVolatileQualified())
14412 Sema.
Diag(Loc, diag::warn_identity_field_assign) << 0;
14422 Sema.
Diag(Loc, diag::warn_identity_field_assign) << 1;
14446 bool ShowFullyQualifiedAssigneeName =
false;
14449 Assignee = DR->getDecl();
14450 }
else if (
auto *ME = dyn_cast<MemberExpr>(LHSExpr->
IgnoreParenCasts())) {
14451 Assignee = ME->getMemberDecl();
14452 ShowFullyQualifiedAssigneeName =
true;
14457 ShowFullyQualifiedAssigneeName);
14466 Diag(Loc, diag::err_opencl_half_load_store) << 1
14473 Diag(Loc, diag::err_wasm_table_art) << 0;
14478 if (CompoundType.
isNull()) {
14489 ((
Context.isObjCNSObjectType(LHSType) &&
14491 (
Context.isObjCNSObjectType(RHSType) &&
14496 Diag(Loc, diag::err_objc_object_assignment) << LHSType;
14502 RHSCheck = ICE->getSubExpr();
14503 if (
UnaryOperator *UO = dyn_cast<UnaryOperator>(RHSCheck)) {
14504 if ((UO->getOpcode() == UO_Plus || UO->getOpcode() == UO_Minus) &&
14505 Loc.
isFileID() && UO->getOperatorLoc().isFileID() &&
14511 UO->getSubExpr()->getBeginLoc().
isFileID()) {
14512 Diag(Loc, diag::warn_not_compound_assign)
14513 << (UO->getOpcode() == UO_Plus ?
"+" :
"-")
14514 <<
SourceRange(UO->getOperatorLoc(), UO->getOperatorLoc());
14524 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(InnerLHS);
14540 if (!
Diags.isIgnored(diag::warn_arc_repeated_use_of_weak,
14563 if (CompoundType.
isNull()) {
14589 if (
const CastExpr *CE = dyn_cast<CastExpr>(E)) {
14590 if (CE->getCastKind() == CK_ToVoid) {
14596 CE->getSubExpr()->getType()->isDependentType()) {
14601 if (
const auto *CE = dyn_cast<CallExpr>(E))
14602 return CE->getCallReturnType(Context)->isVoidType();
14622 const unsigned ForIncrementFlags =
14628 if ((ScopeFlags & ForIncrementFlags) == ForIncrementFlags ||
14629 (ScopeFlags & ForInitFlags) == ForInitFlags)
14634 while (
const BinaryOperator *BO = dyn_cast<BinaryOperator>(LHS)) {
14635 if (BO->getOpcode() != BO_Comma)
14637 LHS = BO->getRHS();
14644 Diag(Loc, diag::warn_comma_operator);
14648 LangOpts.CPlusPlus ?
"static_cast<void>("
14680 diag::err_incomplete_type);
14701 ResType = ResAtomicType->getValueType();
14703 assert(!ResType.
isNull() &&
"no type for increment/decrement expression");
14713 : diag::warn_increment_bool)
14717 S.
Diag(OpLoc, diag::err_increment_decrement_enum) << IsInc << ResType;
14735 S.
Diag(OpLoc, S.
getLangOpts().C2y ? diag::warn_c2y_compat_increment_complex
14736 : diag::ext_c2y_increment_complex)
14753 S.
Diag(OpLoc, diag::err_typecheck_illegal_increment_decrement)
14764 S.
Diag(OpLoc, diag::warn_deprecated_increment_decrement_volatile)
14765 << IsInc << ResType;
14797 case Stmt::DeclRefExprClass:
14799 case Stmt::MemberExprClass:
14807 case Stmt::ArraySubscriptExprClass: {
14812 if (ICE->getSubExpr()->getType()->isArrayType())
14817 case Stmt::UnaryOperatorClass: {
14829 case Stmt::ParenExprClass:
14831 case Stmt::ImplicitCastExprClass:
14835 case Stmt::CXXUuidofExprClass:
14845 AO_Vector_Element = 1,
14846 AO_Property_Expansion = 2,
14847 AO_Register_Variable = 3,
14848 AO_Matrix_Element = 4,
14866 return Diag(OpLoc, diag::err_parens_pointer_member_function)
14871 return Diag(OpLoc, diag::err_typecheck_addrof_dtor)
14872 << DRE->getSourceRange();
14874 if (DRE->getQualifier())
14878 return Diag(OpLoc, diag::err_unqualified_pointer_member_function)
14879 << DRE->getSourceRange();
14882 StringRef Qual = (MD->
getParent()->getName() +
"::").toStringRef(Str);
14883 return Diag(OpLoc, diag::err_unqualified_pointer_member_function)
14884 << DRE->getSourceRange()
14890 if (PTy->getKind() == BuiltinType::Overload) {
14894 Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof_addrof_function)
14902 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
14910 if (PTy->getKind() == BuiltinType::UnknownAny)
14913 if (PTy->getKind() == BuiltinType::BoundMember) {
14914 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
14937 auto* VarRef = dyn_cast<DeclRefExpr>(op);
14938 if (VarRef && VarRef->refersToEnclosingVariableOrCapture()) {
14939 Diag(op->
getExprLoc(), diag::err_opencl_taking_address_capture);
14947 if (uOp->getOpcode() == UO_Deref)
14950 return uOp->getSubExpr()->getType();
14957 if (
auto *FD = dyn_cast_or_null<FunctionDecl>(dcl))
14963 unsigned AddressOfError = AO_No_Error;
14967 Diag(OpLoc, IsError ? diag::err_typecheck_addrof_temporary
14968 : diag::ext_typecheck_addrof_temporary)
14983 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
15001 auto ReturnOrParamTypeIsIncomplete = [&](
QualType T,
15006 diag::note_ptrauth_virtual_function_pointer_incomplete_arg_ret);
15007 Diag(RetArgTypeLoc,
15008 diag::note_ptrauth_virtual_function_incomplete_arg_ret_type)
15015 bool IsIncomplete =
15017 ReturnOrParamTypeIsIncomplete(
15020 IsIncomplete |= ReturnOrParamTypeIsIncomplete(PVD->getType(), OpLoc,
15021 PVD->getBeginLoc());
15027 if (
Context.getTargetInfo().getCXXABI().isMicrosoft())
15036 AddressOfError = AO_Property_Expansion;
15038 Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof)
15042 }
else if (
const auto *DRE = dyn_cast<DeclRefExpr>(op)) {
15043 if (
const auto *MD = dyn_cast_or_null<CXXMethodDecl>(DRE->getDecl()))
15049 AddressOfError = AO_Bit_Field;
15052 AddressOfError = AO_Vector_Element;
15055 AddressOfError = AO_Matrix_Element;
15059 if (
const VarDecl *vd = dyn_cast<VarDecl>(dcl)) {
15064 AddressOfError = AO_Register_Variable;
15067 AddressOfError = AO_Property_Expansion;
15080 if (
auto *DRE = dyn_cast<DeclRefExpr>(op);
15086 diag::err_cannot_form_pointer_to_member_of_reference_type)
15097 if (
Context.getTargetInfo().getCXXABI().isMicrosoft())
15105 llvm_unreachable(
"Unknown/unexpected decl type");
15108 if (AddressOfError != AO_No_Error) {
15125 if (
Context.getTargetInfo().getTriple().isWasm()) {
15128 Diag(OpLoc, diag::err_wasm_ca_reference)
15133 Diag(OpLoc, diag::err_wasm_table_pr)
15139 CheckAddressOfPackedMember(op);
15145 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Exp);
15151 const ParmVarDecl *Param = dyn_cast<ParmVarDecl>(D);
15154 if (
const FunctionDecl* FD = dyn_cast<FunctionDecl>(Param->getDeclContext()))
15155 if (!FD->hasAttr<NonNullAttr>() && !Param->hasAttr<NonNullAttr>())
15158 FD->ModifiedNonNullParams.insert(Param);
15164 bool IsAfterAmp =
false) {
15168 Op = ConvResult.
get();
15180 Result = PT->getPointeeType();
15188 if (PR.
get() != Op)
15192 if (Result.isNull()) {
15193 S.
Diag(OpLoc, diag::err_typecheck_indirection_requires_pointer)
15198 if (Result->isVoidType()) {
15204 S.
Diag(OpLoc, diag::err_typecheck_indirection_through_void_pointer_cpp)
15207 S.
Diag(OpLoc, diag::ext_typecheck_indirection_through_void_pointer)
15215 if (!S.
getLangOpts().CPlusPlus && Result.isCForbiddenLValueType())
15224 default: llvm_unreachable(
"Unknown binop!");
15225 case tok::periodstar: Opc = BO_PtrMemD;
break;
15226 case tok::arrowstar: Opc = BO_PtrMemI;
break;
15227 case tok::star: Opc = BO_Mul;
break;
15228 case tok::slash: Opc = BO_Div;
break;
15229 case tok::percent: Opc = BO_Rem;
break;
15230 case tok::plus: Opc = BO_Add;
break;
15231 case tok::minus: Opc = BO_Sub;
break;
15232 case tok::lessless: Opc = BO_Shl;
break;
15233 case tok::greatergreater: Opc = BO_Shr;
break;
15234 case tok::lessequal: Opc = BO_LE;
break;
15235 case tok::less: Opc = BO_LT;
break;
15236 case tok::greaterequal: Opc = BO_GE;
break;
15237 case tok::greater: Opc = BO_GT;
break;
15238 case tok::exclaimequal: Opc = BO_NE;
break;
15239 case tok::equalequal: Opc = BO_EQ;
break;
15240 case tok::spaceship: Opc = BO_Cmp;
break;
15241 case tok::amp: Opc = BO_And;
break;
15242 case tok::caret: Opc = BO_Xor;
break;
15243 case tok::pipe: Opc = BO_Or;
break;
15244 case tok::ampamp: Opc = BO_LAnd;
break;
15245 case tok::pipepipe: Opc = BO_LOr;
break;
15246 case tok::equal: Opc = BO_Assign;
break;
15247 case tok::starequal: Opc = BO_MulAssign;
break;
15248 case tok::slashequal: Opc = BO_DivAssign;
break;
15249 case tok::percentequal: Opc = BO_RemAssign;
break;
15250 case tok::plusequal: Opc = BO_AddAssign;
break;
15251 case tok::minusequal: Opc = BO_SubAssign;
break;
15252 case tok::lesslessequal: Opc = BO_ShlAssign;
break;
15253 case tok::greatergreaterequal: Opc = BO_ShrAssign;
break;
15254 case tok::ampequal: Opc = BO_AndAssign;
break;
15255 case tok::caretequal: Opc = BO_XorAssign;
break;
15256 case tok::pipeequal: Opc = BO_OrAssign;
break;
15257 case tok::comma: Opc = BO_Comma;
break;
15266 default: llvm_unreachable(
"Unknown unary op!");
15267 case tok::plusplus: Opc = UO_PreInc;
break;
15268 case tok::minusminus: Opc = UO_PreDec;
break;
15269 case tok::amp: Opc = UO_AddrOf;
break;
15270 case tok::star: Opc = UO_Deref;
break;
15271 case tok::plus: Opc = UO_Plus;
break;
15272 case tok::minus: Opc = UO_Minus;
break;
15273 case tok::tilde: Opc = UO_Not;
break;
15274 case tok::exclaim: Opc = UO_LNot;
break;
15275 case tok::kw___real: Opc = UO_Real;
break;
15276 case tok::kw___imag: Opc = UO_Imag;
break;
15277 case tok::kw___extension__: Opc = UO_Extension;
break;
15309 llvm::find_if(Parent->
fields(),
15311 return F->getDeclName() == Name;
15313 return (Field != Parent->
field_end()) ? *Field :
nullptr;
15328 const DeclRefExpr *LHSDeclRef = dyn_cast<DeclRefExpr>(LHSExpr);
15329 const DeclRefExpr *RHSDeclRef = dyn_cast<DeclRefExpr>(RHSExpr);
15330 if (!LHSDeclRef || !RHSDeclRef ||
15338 if (LHSDecl != RHSDecl)
15343 if (RefTy->getPointeeType().isVolatileQualified())
15346 auto Diag = S.
Diag(OpLoc, IsBuiltin ? diag::warn_self_assignment_builtin
15347 : diag::warn_self_assignment_overloaded)
15352 Diag << 1 << SelfAssignField
15365 const Expr *ObjCPointerExpr =
nullptr, *OtherExpr =
nullptr;
15367 const Expr *RHS = R.get();
15370 ObjCPointerExpr = LHS;
15374 ObjCPointerExpr = RHS;
15383 unsigned Diag = diag::warn_objc_pointer_masking;
15392 if (SelArg0.starts_with(
"performSelector"))
15393 Diag = diag::warn_objc_pointer_masking_performSelector;
15410 assert((
isVector(ResultTy, Context.HalfTy) ||
15411 isVector(ResultTy, Context.ShortTy)) &&
15412 "Result must be a vector of half or short");
15415 "both operands expected to be a half vector");
15422 if (
isVector(ResultTy, Context.ShortTy))
15427 ResultTy,
VK, OK, OpLoc, FPFeatures,
15428 BinOpResTy, BinOpResTy);
15432 BinOpResTy,
VK, OK, OpLoc, FPFeatures);
15440 if (!OpRequiresConversion || Ctx.
getLangOpts().NativeHalfType ||
15444 auto HasVectorOfHalfType = [&Ctx](
Expr *E) {
15454 return VT->getElementType().getCanonicalType() == Ctx.
HalfTy;
15459 return HasVectorOfHalfType(E0) && (!E1 || HasVectorOfHalfType(E1));
15464 Expr *RHSExpr,
bool ForFoldExpression) {
15478 if (
Init.isInvalid())
15480 RHSExpr =
Init.get();
15490 bool ConvertHalfVec =
false;
15492 if (!LHS.
isUsable() || !RHS.isUsable())
15502 if (BO_Assign == Opc)
15503 Diag(OpLoc, diag::err_opencl_atomic_init) << 0 << SR;
15531 if (!ResultTy.
isNull()) {
15548 if (
auto *BE = dyn_cast<BlockExpr>(RHS.get()->IgnoreParens()))
15550 if (
auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
15551 if (VD->hasLocalStorage() &&
getCurScope()->isDeclScope(VD))
15552 BE->getBlockDecl()->setCanAvoidCopyToHeap();
15563 Opc == BO_PtrMemI);
15567 ConvertHalfVec =
true;
15574 ConvertHalfVec =
true;
15578 ConvertHalfVec =
true;
15589 ConvertHalfVec =
true;
15592 if (
const auto *BI = dyn_cast<BinaryOperator>(LHSExpr);
15593 !ForFoldExpression && BI && BI->isComparisonOp())
15594 Diag(OpLoc, diag::warn_consecutive_comparison)
15600 ConvertHalfVec =
true;
15604 ConvertHalfVec =
true;
15617 ConvertHalfVec =
true;
15622 ConvertHalfVec =
true;
15624 CompLHSTy = CompResultTy;
15631 CompLHSTy = CompResultTy;
15637 ConvertHalfVec =
true;
15644 ConvertHalfVec =
true;
15653 CompLHSTy = CompResultTy;
15664 CompLHSTy = CompResultTy;
15672 VK = RHS.get()->getValueKind();
15673 OK = RHS.get()->getObjectKind();
15685 (Opc == BO_Comma ||
isVector(RHS.get()->getType(),
Context.HalfTy) ==
15687 "both sides are half vectors or neither sides are");
15692 CheckArrayAccess(LHS.
get());
15693 CheckArrayAccess(RHS.get());
15697 &
Context.Idents.get(
"object_setClass"),
15703 "object_setClass(")
15716 if (CompResultTy.
isNull()) {
15717 if (ConvertHalfVec)
15737 if (ConvertHalfVec)
15742 Context, LHS.
get(), RHS.get(), Opc, ResultTy,
VK, OK, OpLoc,
15759 if (isLeftComp == isRightComp)
15764 bool isLeftBitwise = LHSBO && LHSBO->
isBitwiseOp();
15765 bool isRightBitwise = RHSBO && RHSBO->
isBitwiseOp();
15766 if (isLeftBitwise || isRightBitwise)
15778 Self.Diag(OpLoc, diag::warn_precedence_bitwise_rel)
15781 Self.PDiag(diag::note_precedence_silence) << OpStr,
15782 (isLeftComp ? LHSExpr : RHSExpr)->getSourceRange());
15784 Self.PDiag(diag::note_precedence_bitwise_first)
15799 Self.PDiag(diag::note_precedence_silence)
15808 if (Bop->getOpcode() == BO_LAnd) {
15813 }
else if (Bop->getOpcode() == BO_LOr) {
15814 if (
BinaryOperator *RBop = dyn_cast<BinaryOperator>(Bop->getRHS())) {
15817 if (RBop->getOpcode() == BO_LAnd &&
15829 if (Bop->getOpcode() == BO_LAnd) {
15844 if (Bop->isBitwiseOp() && Bop->getOpcode() < Opc) {
15845 S.
Diag(Bop->getOperatorLoc(), diag::warn_bitwise_op_in_bitwise_op)
15847 << Bop->getSourceRange() << OpLoc;
15849 S.
PDiag(diag::note_precedence_silence)
15850 << Bop->getOpcodeStr(),
15851 Bop->getSourceRange());
15857 Expr *SubExpr, StringRef Shift) {
15859 if (Bop->getOpcode() == BO_Add || Bop->getOpcode() == BO_Sub) {
15860 StringRef Op = Bop->getOpcodeStr();
15861 S.
Diag(Bop->getOperatorLoc(), diag::warn_addition_in_bitshift)
15862 << Bop->getSourceRange() << OpLoc << Shift << Op;
15864 S.
PDiag(diag::note_precedence_silence) << Op,
15865 Bop->getSourceRange());
15881 if (Kind != OO_LessLess && Kind != OO_GreaterGreater)
15884 S.
Diag(OpLoc, diag::warn_overloaded_shift_in_comparison)
15886 << (Kind == OO_LessLess);
15888 S.
PDiag(diag::note_precedence_silence)
15889 << (Kind == OO_LessLess ?
"<<" :
">>"),
15892 S, OpLoc, S.
PDiag(diag::note_evaluate_comparison_first),
15906 if ((Opc == BO_Or || Opc == BO_Xor) &&
15914 if (Opc == BO_LOr && !OpLoc.
isMacroID()) {
15920 || Opc == BO_Shr) {
15936 assert(LHSExpr &&
"ActOnBinOp(): missing left expression");
15937 assert(RHSExpr &&
"ActOnBinOp(): missing right expression");
15946 CheckInvalidBuiltinCountedByRef(LHSExpr, K);
15947 CheckInvalidBuiltinCountedByRef(RHSExpr, K);
15949 return BuildBinOp(S, TokLoc, Opc, LHSExpr, RHSExpr);
15955 if (OverOp !=
OO_None && OverOp != OO_Equal)
16004 Expr *RHSExpr,
bool ForFoldExpression) {
16005 if (!LHSExpr || !RHSExpr)
16017 if (pty->getKind() == BuiltinType::PseudoObject &&
16030 RHSExpr = resolvedRHS.
get();
16044 (pty->getKind() == BuiltinType::BoundMember ||
16045 pty->getKind() == BuiltinType::Overload)) {
16046 auto *OE = dyn_cast<OverloadExpr>(LHSExpr);
16047 if (OE && !OE->hasTemplateKeyword() && !OE->hasExplicitTemplateArgs() &&
16048 llvm::any_of(OE->decls(), [](
NamedDecl *ND) {
16049 return isa<FunctionTemplateDecl>(ND);
16051 Diag(OE->getQualifier() ? OE->getQualifierLoc().getBeginLoc()
16052 : OE->getNameLoc(),
16053 diag::err_template_kw_missing)
16054 << OE->getName().getAsIdentifierInfo();
16061 LHSExpr = LHS.
get();
16068 if (Opc == BO_Assign && pty->getKind() == BuiltinType::Overload) {
16075 ForFoldExpression);
16085 RHSExpr = resolvedRHS.
get();
16090 if (!
HLSL().CheckResourceBinOp(Opc, LHSExpr, RHSExpr, OpLoc))
16107 "Should only occur in error-recovery path.");
16113 Context, LHSExpr, RHSExpr, Opc,
16133 ResultType = RHSExpr->
getType();
16136 ResultType =
Context.DependentTy;
16149 if (T.isNull() || T->isDependentType())
16165 bool CanOverflow =
false;
16167 bool ConvertHalfVec =
false;
16176 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16183 if (Opc == UO_AddrOf)
16184 return ExprError(
Diag(OpLoc, diag::err_hlsl_operator_unsupported) << 0);
16185 if (Opc == UO_Deref)
16186 return ExprError(
Diag(OpLoc, diag::err_hlsl_operator_unsupported) << 1);
16191 resultType =
Context.DependentTy;
16200 Opc == UO_PreInc || Opc == UO_PostInc,
16201 Opc == UO_PreInc || Opc == UO_PreDec);
16206 CheckAddressOfNoDeref(InputExpr);
16219 CanOverflow = Opc == UO_Minus &&
16231 if (ConvertHalfVec)
16238 (!
Context.getLangOpts().ZVector ||
16248 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16259 Diag(OpLoc, diag::ext_integer_complement_complex)
16267 if (!T->isIntegerType())
16268 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16271 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16287 resultType =
Context.FloatTy;
16293 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16299 if (
Context.getLangOpts().CPlusPlus) {
16304 }
else if (
Context.getLangOpts().OpenCL &&
16305 Context.getLangOpts().OpenCLVersion < 120) {
16309 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16322 Input.
get(), resultType,
16327 if (
Context.getLangOpts().OpenCL &&
16328 Context.getLangOpts().getOpenCLCompatibleVersion() < 120) {
16332 if (!T->isIntegerType())
16333 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16339 }
else if (
Context.getLangOpts().CPlusPlus &&
16343 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16349 }
else if (resultType ==
Context.AMDGPUFeaturePredicateTy) {
16350 resultType =
Context.getLogicalOperationType();
16354 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16360 resultType =
Context.getLogicalOperationType();
16388 "the co_await expression must be non-dependant before "
16389 "building operator co_await");
16400 if (Opc != UO_AddrOf && Opc != UO_Deref)
16401 CheckArrayAccess(Input.
get());
16407 if (Opc == UO_Deref && UO->getType()->hasAttr(attr::NoDeref) &&
16413 if (ConvertHalfVec)
16419 if (
DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
16420 if (!DRE->getQualifier())
16430 return Method->isImplicitObjectMemberFunction();
16436 if (!ULE->getQualifier())
16441 if (
Method->isImplicitObjectMemberFunction())
16462 if (pty->getKind() == BuiltinType::PseudoObject &&
16467 if (Opc == UO_Extension)
16472 if (Opc == UO_AddrOf &&
16473 (pty->getKind() == BuiltinType::Overload ||
16474 pty->getKind() == BuiltinType::UnknownAny ||
16475 pty->getKind() == BuiltinType::BoundMember))
16500 Expr *Input,
bool IsAfterAmp) {
16510 OpLoc, LabLoc, TheDecl,
Context.getPointerType(
Context.VoidTy));
16544 assert(!
Cleanup.exprNeedsCleanups() &&
16545 "cleanups within StmtExpr not correctly bound!");
16555 bool StmtExprMayBindToTemp =
false;
16557 if (
const auto *LastStmt = dyn_cast<ValueStmt>(Compound->
body_back())) {
16558 if (
const Expr *
Value = LastStmt->getExprStmt()) {
16559 StmtExprMayBindToTemp =
true;
16567 Expr *ResStmtExpr =
16569 if (StmtExprMayBindToTemp)
16571 return ResStmtExpr;
16594 auto *Cast = dyn_cast<ImplicitCastExpr>(E);
16595 if (Cast && Cast->getCastKind() == CK_ARCConsumeObject)
16596 return Cast->getSubExpr();
16617 return ExprError(
Diag(BuiltinLoc, diag::err_offsetof_record_type)
16618 << ArgTy << TypeRange);
16624 diag::err_offsetof_incomplete_type, TypeRange))
16627 bool DidWarnAboutNonPOD =
false;
16632 if (OC.isBrackets) {
16637 return ExprError(
Diag(OC.LocEnd, diag::err_offsetof_array_type)
16641 CurrentType =
Context.DependentTy;
16657 Comps.push_back(
OffsetOfNode(OC.LocStart, Exprs.size(), OC.LocEnd));
16658 Exprs.push_back(Idx);
16666 Comps.push_back(
OffsetOfNode(OC.LocStart, OC.U.IdentInfo, OC.LocEnd));
16667 CurrentType =
Context.DependentTy;
16673 diag::err_offsetof_incomplete_type))
16679 return ExprError(
Diag(OC.LocEnd, diag::err_offsetof_record_type)
16690 bool IsSafe =
LangOpts.CPlusPlus11? CRD->isStandardLayout() : CRD->isPOD();
16692 LangOpts.CPlusPlus11? diag::ext_offsetof_non_standardlayout_type
16693 : diag::ext_offsetof_non_pod_type;
16696 Diag(BuiltinLoc, DiagID)
16697 <<
SourceRange(Components[0].LocStart, OC.LocEnd) << CurrentType;
16698 DidWarnAboutNonPOD =
true;
16709 MemberDecl = IndirectMemberDecl->getAnonField();
16716 if (!R.isAmbiguous())
16717 Diag(BuiltinLoc, diag::err_no_member)
16718 << OC.U.IdentInfo << RD <<
SourceRange(OC.LocStart, OC.LocEnd);
16727 Diag(OC.LocEnd, diag::err_offsetof_bitfield)
16735 if (IndirectMemberDecl)
16742 Context.getCanonicalTagType(Parent), Paths)) {
16744 Diag(OC.LocEnd, diag::err_offsetof_field_of_virtual_base)
16755 if (IndirectMemberDecl) {
16756 for (
auto *FI : IndirectMemberDecl->chain()) {
16762 Comps.push_back(
OffsetOfNode(OC.LocStart, MemberDecl, OC.LocEnd));
16768 Comps, Exprs, RParenLoc);
16794 assert((CondExpr && LHSExpr && RHSExpr) &&
"Missing type argument(s)");
16799 bool CondIsTrue =
false;
16801 resType =
Context.DependentTy;
16804 llvm::APSInt condEval(32);
16806 CondExpr, &condEval, diag::err_typecheck_choose_expr_requires_constant);
16809 CondExpr = CondICE.
get();
16810 CondIsTrue = condEval.getZExtValue();
16813 Expr *ActiveExpr = CondIsTrue ? LHSExpr : RHSExpr;
16815 resType = ActiveExpr->
getType();
16821 resType,
VK, OK, RPLoc, CondIsTrue);
16833 Decl *ManglingContextDecl;
16834 std::tie(MCtx, ManglingContextDecl) =
16838 Block->setBlockMangling(ManglingNumber, ManglingContextDecl);
16860 "block-id should have no identifier!");
16871 assert(T->isFunctionType() &&
16872 "GetTypeForDeclarator made a non-function block signature");
16888 unsigned Size =
Result.getFullDataSize();
16889 Sig =
Context.CreateTypeSourceInfo(
Result.getType(), Size);
16900 QualType RetTy = Fn->getReturnType();
16910 if (RetTy !=
Context.DependentTy) {
16918 if (ExplicitSignature) {
16919 for (
unsigned I = 0, E = ExplicitSignature.
getNumParams(); I != E; ++I) {
16921 if (Param->getIdentifier() ==
nullptr && !Param->isImplicit() &&
16925 Diag(Param->getLocation(), diag::ext_parameter_name_omitted_c23);
16927 Params.push_back(Param);
16933 for (
const auto &I : Fn->param_types()) {
16936 Params.push_back(Param);
16941 if (!Params.empty()) {
16952 AI->setOwningFunction(CurBlock->
TheDecl);
16955 if (AI->getIdentifier()) {
16961 if (AI->isInvalidDecl())
16980 Diag(CaretLoc, diag::err_blocks_disable) <<
LangOpts.OpenCL;
16985 assert(!
Cleanup.exprNeedsCleanups() &&
16986 "cleanups within block not correctly bound!");
17001 bool NoReturn = BD->
hasAttr<NoReturnAttr>();
17009 if (NoReturn && !Ext.getNoReturn()) Ext = Ext.
withNoReturn(
true);
17015 BlockTy =
Context.getFunctionType(RetTy, {}, EPI);
17036 BlockTy =
Context.getFunctionType(RetTy, {}, EPI);
17040 BlockTy =
Context.getBlockPointerType(BlockTy);
17044 !
PP.isCodeCompletionEnabled())
17049 if (Body &&
getCurFunction()->HasPotentialAvailabilityViolations)
17075 Expr *CopyExpr =
nullptr;
17102 if (!
Result.isInvalid() &&
17103 !
Result.get()->getType().isConstQualified()) {
17105 Result.get()->getType().withConst(),
17109 if (!
Result.isInvalid()) {
17119 if (!
Result.isInvalid() &&
17123 CopyExpr =
Result.get();
17130 Captures.push_back(NewCap);
17144 if (
Result->getBlockDecl()->hasCaptures()) {
17147 Cleanup.setExprNeedsCleanups(
true);
17151 for (
const auto &CI :
Result->getBlockDecl()->captures()) {
17152 const VarDecl *var = CI.getVariable();
17167 {Result},
Result->getType());
17181 Expr *OrigExpr = E;
17195 Context.getTargetInfo().getTriple().isNVPTX())
17218 VaListType =
Context.getArrayDecayedType(VaListType);
17230 if (
Init.isInvalid())
17246 diag::err_first_argument_to_va_arg_not_of_type_va_list)
17251 diag::err_second_parameter_to_va_arg_incomplete,
17257 diag::err_second_parameter_to_va_arg_abstract,
17264 ? diag::warn_second_parameter_to_va_arg_ownership_qualified
17265 : diag::warn_second_parameter_to_va_arg_not_pod)
17272 PDiag(diag::warn_second_parameter_to_va_arg_array)
17305 UnderlyingType = ED->getIntegerType();
17306 if (
Context.typesAreCompatible(PromoteType, UnderlyingType,
17319 ?
Context.getCorrespondingSignedType(UnderlyingType)
17320 :
Context.getCorrespondingUnsignedType(UnderlyingType);
17321 if (
Context.typesAreCompatible(PromoteType, UnderlyingType,
17327 PromoteType =
Context.DoubleTy;
17328 if (!PromoteType.
isNull())
17330 PDiag(diag::warn_second_parameter_to_va_arg_never_compatible)
17345 if (pw ==
Context.getTargetInfo().getIntWidth())
17347 else if (pw ==
Context.getTargetInfo().getLongWidth())
17349 else if (pw ==
Context.getTargetInfo().getLongLongWidth())
17352 llvm_unreachable(
"I don't know size of pointer!");
17369 if ((SLDecl->isCompleteDefinition() || SLDecl->isBeingDefined()) &&
17378 S.
Diag(Loc, diag::err_std_source_location_impl_not_found);
17386 S.
Diag(Loc, diag::err_std_source_location_impl_malformed);
17390 unsigned Count = 0;
17392 StringRef Name = F->getName();
17394 if (Name ==
"_M_file_name") {
17395 if (F->getType() !=
17399 }
else if (Name ==
"_M_function_name") {
17400 if (F->getType() !=
17404 }
else if (Name ==
"_M_line") {
17405 if (!F->getType()->isIntegerType())
17408 }
else if (Name ==
"_M_column") {
17409 if (!F->getType()->isIntegerType())
17418 S.
Diag(Loc, diag::err_std_source_location_impl_malformed);
17441 ResultTy =
Context.UnsignedIntTy;
17450 ResultTy =
Context.getPointerType(
17469 Data->BinaryData = BinaryData;
17473 Data->getDataElementCount());
17477 const Expr *SrcExpr) {
17486 auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl());
17499 bool *Complained) {
17501 *Complained =
false;
17504 bool CheckInferredResultType =
false;
17506 unsigned DiagKind = 0;
17508 bool MayHaveConvFixit =
false;
17509 bool MayHaveFunctionDiff =
false;
17520 DiagKind = diag::warn_compatible_implicit_pointer_conv;
17524 DiagKind = diag::err_typecheck_convert_pointer_int;
17527 DiagKind = diag::ext_typecheck_convert_pointer_int;
17530 MayHaveConvFixit =
true;
17534 DiagKind = diag::err_typecheck_convert_int_pointer;
17537 DiagKind = diag::ext_typecheck_convert_int_pointer;
17540 MayHaveConvFixit =
true;
17544 diag::warn_typecheck_convert_incompatible_function_pointer_strict;
17546 MayHaveConvFixit =
true;
17550 DiagKind = diag::err_typecheck_convert_incompatible_function_pointer;
17553 DiagKind = diag::ext_typecheck_convert_incompatible_function_pointer;
17556 MayHaveConvFixit =
true;
17560 DiagKind = diag::err_arc_typecheck_convert_incompatible_pointer;
17562 DiagKind = diag::err_typecheck_convert_incompatible_pointer;
17565 DiagKind = diag::ext_typecheck_convert_incompatible_pointer;
17569 if (CheckInferredResultType) {
17575 MayHaveConvFixit =
true;
17579 DiagKind = diag::err_typecheck_convert_incompatible_pointer_sign;
17582 DiagKind = diag::ext_typecheck_convert_incompatible_pointer_sign;
17587 DiagKind = diag::err_typecheck_convert_pointer_void_func;
17590 DiagKind = diag::ext_typecheck_convert_pointer_void_func;
17602 DiagKind = diag::err_typecheck_incompatible_address_space;
17605 DiagKind = diag::err_typecheck_incompatible_ownership;
17608 DiagKind = diag::err_typecheck_incompatible_ptrauth;
17612 llvm_unreachable(
"unknown error case for discarding qualifiers!");
17617 SrcType =
Context.getArrayDecayedType(SrcType);
17619 DiagKind = diag::ext_typecheck_convert_discards_overflow_behavior;
17635 DiagKind = diag::err_typecheck_convert_discards_qualifiers;
17638 DiagKind = diag::ext_typecheck_convert_discards_qualifiers;
17645 DiagKind = diag::err_nested_pointer_qualifier_mismatch;
17647 DiagKind = diag::ext_nested_pointer_qualifier_mismatch;
17651 DiagKind = diag::err_typecheck_incompatible_nested_address_space;
17655 DiagKind = diag::err_int_to_block_pointer;
17659 DiagKind = diag::err_typecheck_convert_incompatible_block_pointer;
17666 for (
auto *srcProto : srcOPT->
quals()) {
17672 IFace = IFaceT->getDecl();
17677 for (
auto *dstProto : dstOPT->
quals()) {
17683 IFace = IFaceT->getDecl();
17686 DiagKind = diag::err_incompatible_qualified_id;
17689 DiagKind = diag::warn_incompatible_qualified_id;
17695 DiagKind = diag::err_incompatible_vectors;
17698 DiagKind = diag::warn_incompatible_vectors;
17702 DiagKind = diag::err_arc_weak_unavailable_assign;
17708 auto getOBTKindName = [](
QualType Ty) -> StringRef {
17709 if (Ty->isPointerType())
17710 Ty = Ty->getPointeeType();
17711 if (
const auto *OBT = Ty->getAs<OverflowBehaviorType>()) {
17712 return OBT->getBehaviorKind() ==
17713 OverflowBehaviorType::OverflowBehaviorKind::Trap
17717 llvm_unreachable(
"OBT kind unhandled");
17720 Diag(Loc, diag::err_incompatible_obt_kinds_assignment)
17721 << DstType << SrcType << getOBTKindName(DstType)
17722 << getOBTKindName(SrcType);
17729 *Complained =
true;
17733 DiagKind = diag::err_typecheck_convert_incompatible;
17735 MayHaveConvFixit =
true;
17737 MayHaveFunctionDiff =
true;
17746 FirstType = DstType;
17747 SecondType = SrcType;
17757 FirstType = SrcType;
17758 SecondType = DstType;
17767 FDiag << FirstType << SecondType << ActionForDiag
17770 if (DiagKind == diag::ext_typecheck_convert_incompatible_pointer_sign ||
17771 DiagKind == diag::err_typecheck_convert_incompatible_pointer_sign) {
17781 if (!ConvHints.
isNull()) {
17786 if (MayHaveConvFixit) { FDiag << (
unsigned) (ConvHints.
Kind); }
17788 if (MayHaveFunctionDiff)
17792 if ((DiagKind == diag::warn_incompatible_qualified_id ||
17793 DiagKind == diag::err_incompatible_qualified_id) &&
17795 Diag(IFace->
getLocation(), diag::note_incomplete_class_and_qualified_id)
17798 if (SecondType ==
Context.OverloadTy)
17802 if (CheckInferredResultType)
17810 *Complained =
true;
17821 return S.
Diag(Loc, diag::err_ice_not_integral)
17825 return S.
Diag(Loc, diag::err_expr_not_ice) << S.
LangOpts.CPlusPlus;
17840 IDDiagnoser(
unsigned DiagID)
17844 return S.
Diag(Loc, DiagID);
17846 } Diagnoser(DiagID);
17859 return S.
Diag(Loc, diag::ext_expr_not_ice) << S.
LangOpts.CPlusPlus;
17881 BaseDiagnoser(BaseDiagnoser) {}
17890 return S.
Diag(Loc, diag::err_ice_incomplete_type) << T;
17895 return S.
Diag(Loc, diag::err_ice_explicit_conversion) << T << ConvTy;
17906 return S.
Diag(Loc, diag::err_ice_ambiguous_conversion) << T;
17917 llvm_unreachable(
"conversion functions are permitted");
17919 } ConvertDiagnoser(Diagnoser);
17925 E = Converted.
get();
17946 E = RValueExpr.
get();
17964 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
17965 diag::note_invalid_subexpr_in_const_expr) {
17966 DiagLoc = Notes[0].first;
17988 EvalResult.
Diag = &Notes;
18012 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
18013 diag::note_invalid_subexpr_in_const_expr) {
18014 DiagLoc = Notes[0].first;
18040 class TransformToPE :
public TreeTransform<TransformToPE> {
18044 TransformToPE(
Sema &SemaRef) : BaseTransform(SemaRef) { }
18047 bool AlwaysRebuild() {
return true; }
18048 bool ReplacingOriginal() {
return true; }
18057 ExprResult TransformDeclRefExpr(DeclRefExpr *E) {
18059 !SemaRef.isUnevaluatedContext())
18061 diag::err_invalid_non_static_member_use)
18064 return BaseTransform::TransformDeclRefExpr(E);
18068 ExprResult TransformUnaryOperator(UnaryOperator *E) {
18072 return BaseTransform::TransformUnaryOperator(E);
18080 return SkipLambdaBody(E, Body);
18087 "Should only transform unevaluated expressions");
18092 return TransformToPE(*this).TransformExpr(E);
18097 "Should only transform unevaluated expressions");
18101 return TransformToPE(*this).TransformType(TInfo);
18109 LambdaContextDecl, ExprContext);
18123 Prev.isImmediateFunctionContext() || Prev.isConstantEvaluated();
18126 Prev.InImmediateEscalatingFunctionContext;
18194 if (
const auto *E = dyn_cast<UnaryOperator>(PossibleDeref)) {
18195 if (E->getOpcode() == UO_Deref)
18196 return CheckPossibleDeref(S, E->getSubExpr());
18197 }
else if (
const auto *E = dyn_cast<ArraySubscriptExpr>(PossibleDeref)) {
18198 return CheckPossibleDeref(S, E->getBase());
18199 }
else if (
const auto *E = dyn_cast<MemberExpr>(PossibleDeref)) {
18200 return CheckPossibleDeref(S, E->getBase());
18201 }
else if (
const auto E = dyn_cast<DeclRefExpr>(PossibleDeref)) {
18204 if (
const auto *Ptr = Ty->
getAs<PointerType>())
18207 Inner = Arr->getElementType();
18211 if (Inner->
hasAttr(attr::NoDeref))
18221 const DeclRefExpr *DeclRef = CheckPossibleDeref(*
this, E);
18228 Diag(E->
getExprLoc(), diag::warn_dereference_of_noderef_type_no_decl)
18243 if (BO->getOpcode() == BO_Assign) {
18245 llvm::erase(LHSs, BO->getLHS());
18253 "Cannot mark an immediate escalating expression outside of an "
18254 "immediate escalating context");
18257 if (
auto *DeclRef =
18258 dyn_cast<DeclRefExpr>(
Call->getCallee()->IgnoreImplicit()))
18259 DeclRef->setIsImmediateEscalating(
true);
18260 }
else if (
auto *Ctr = dyn_cast<CXXConstructExpr>(E->
IgnoreImplicit())) {
18261 Ctr->setIsImmediateEscalating(
true);
18262 }
else if (
auto *DeclRef = dyn_cast<DeclRefExpr>(E->
IgnoreImplicit())) {
18263 DeclRef->setIsImmediateEscalating(
true);
18265 assert(
false &&
"expected an immediately escalating expression");
18268 FI->FoundImmediateEscalatingExpression =
true;
18283 if (
auto *DeclRef =
18284 dyn_cast<DeclRefExpr>(
Call->getCallee()->IgnoreImplicit()))
18293 auto CheckConstantExpressionAndKeepResult = [&]() {
18296 Eval.
Diag = &Notes;
18298 Eval,
getASTContext(), ConstantExprKind::ImmediateInvocation);
18299 if (Res && Notes.empty()) {
18300 Cached = std::move(Eval.
Val);
18308 !CheckConstantExpressionAndKeepResult()) {
18313 if (
Cleanup.exprNeedsCleanups()) {
18330 Cleanup.cleanupsHaveSideEffects(), {});
18343 ExprEvalContexts.back().ImmediateInvocationCandidates.emplace_back(Res, 0);
18351 Eval.
Diag = &Notes;
18355 if (!Result || !Notes.empty()) {
18358 if (
auto *
FunctionalCast = dyn_cast<CXXFunctionalCastExpr>(InnerExpr))
18361 if (
auto *
Call = dyn_cast<CallExpr>(InnerExpr))
18363 else if (
auto *
Call = dyn_cast<CXXConstructExpr>(InnerExpr))
18364 FD =
Call->getConstructor();
18365 else if (
auto *Cast = dyn_cast<CastExpr>(InnerExpr))
18366 FD = dyn_cast_or_null<FunctionDecl>(Cast->getConversionFunction());
18369 "could not find an immediate function in this expression");
18376 SemaRef.
Diag(Context->Loc, diag::note_invalid_consteval_initializer)
18378 SemaRef.
Diag(Context->Decl->getBeginLoc(), diag::note_declared_at);
18382 for (
auto &
Note : Notes)
18394 llvm::SmallPtrSetImpl<DeclRefExpr *> &DRSet;
18398 ComplexRemove(
Sema &SemaRef, llvm::SmallPtrSetImpl<DeclRefExpr *> &DR,
18402 :
Base(SemaRef), DRSet(DR), IISet(II), CurrentII(Current) {}
18404 auto It = std::find_if(CurrentII, IISet.rend(),
18406 return Elem.getPointer() == E;
18412 if (It == IISet.rend()) {
18414 CurrentII->setInt(1);
18421 return Base::TransformConstantExpr(E);
18422 RemoveImmediateInvocation(E);
18423 return Base::TransformExpr(E->
getSubExpr());
18429 return Base::TransformCXXOperatorCallExpr(E);
18443 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(
Init))
18444 Init = ICE->getSubExpr();
18445 else if (
auto *ICE = dyn_cast<MaterializeTemporaryExpr>(
Init))
18446 Init = ICE->getSubExpr();
18452 if (
auto *CE = dyn_cast<ConstantExpr>(
Init);
18453 CE && CE->isImmediateInvocation())
18454 RemoveImmediateInvocation(CE);
18455 return Base::TransformInitializer(
Init, NotCopyInit);
18466 bool AlwaysRebuild() {
return false; }
18467 bool ReplacingOriginal() {
return true; }
18468 bool AllowSkippingCXXConstructExpr() {
18469 bool Res = AllowSkippingFirstCXXConstructExpr;
18470 AllowSkippingFirstCXXConstructExpr =
true;
18473 bool AllowSkippingFirstCXXConstructExpr =
true;
18484 Transformer.AllowSkippingFirstCXXConstructExpr =
false;
18486 ExprResult Res = Transformer.TransformExpr(It->getPointer()->getSubExpr());
18492 It->getPointer()->setSubExpr(Res.
get());
18512 if (VD && (VD->isUsableInConstantExpressions(
SemaRef.
Context) ||
18513 VD->hasConstantInitialization())) {
18546 llvm::SmallPtrSetImpl<DeclRefExpr *> &DRSet;
18547 SimpleRemove(llvm::SmallPtrSetImpl<DeclRefExpr *> &S) : DRSet(S) {}
18550 return DRSet.size();
18553 Visitor.TraverseStmt(
18563 if (DR->isImmediateEscalating())
18567 if (
const auto *MD = dyn_cast<CXXMethodDecl>(ND);
18569 ND = MD->getParent();
18576 bool ImmediateEscalating =
false;
18577 bool IsPotentiallyEvaluated =
18587 SemaRef.
Diag(DR->getBeginLoc(), diag::err_invalid_consteval_take_address)
18588 << ND << isa<CXXRecordDecl>(ND) << FD->isConsteval();
18589 if (!FD->getBuiltinID())
18593 SemaRef.
Diag(Context->Loc, diag::note_invalid_consteval_initializer)
18595 SemaRef.
Diag(Context->Decl->getBeginLoc(), diag::note_declared_at);
18597 if (FD->isImmediateEscalating() && !FD->isConsteval())
18611 (Rec.
ExprContext == ExpressionKind::EK_TemplateArgument ||
18619 D = diag::err_lambda_unevaluated_operand;
18625 D = diag::err_lambda_in_constant_expression;
18626 }
else if (Rec.
ExprContext == ExpressionKind::EK_TemplateArgument) {
18629 D = diag::err_lambda_in_invalid_context;
18631 llvm_unreachable(
"Couldn't infer lambda error message.");
18633 for (
const auto *L : Rec.
Lambdas)
18634 Diag(L->getBeginLoc(), D);
18654 Diag(BO->getBeginLoc(), diag::warn_deprecated_simple_assign_volatile)
18725 llvm_unreachable(
"Invalid context");
18771 : FD(FD), Param(Param) {}
18778 CCName =
"stdcall";
18781 CCName =
"fastcall";
18784 CCName =
"vectorcall";
18787 llvm_unreachable(
"CC does not need mangling");
18790 S.
Diag(Loc, diag::err_cconv_incomplete_param_type)
18791 << Param->getDeclName() << FD->
getDeclName() << CCName;
18796 ParamIncompleteTypeDiagnoser Diagnoser(FD, Param);
18802enum class OdrUseContext {
18821 if (Context.isUnevaluated())
18822 return OdrUseContext::None;
18825 return OdrUseContext::Dependent;
18827 if (Context.isDiscardedStatementContext())
18828 return OdrUseContext::FormallyOdrUsed;
18830 else if (Context.Context ==
18832 return OdrUseContext::FormallyOdrUsed;
18834 return OdrUseContext::Used;
18838 if (!
Func->isConstexpr())
18841 if (
Func->isImplicitlyInstantiable() || !
Func->isUserProvided())
18848 auto *CCD = dyn_cast<CXXConstructorDecl>(
Func);
18849 return CCD && CCD->getInheritedConstructor();
18853 bool MightBeOdrUse) {
18854 assert(
Func &&
"No function?");
18856 Func->setReferenced();
18869 OdrUseContext OdrUse =
18871 if (IsRecursiveCall && OdrUse == OdrUseContext::Used)
18872 OdrUse = OdrUseContext::FormallyOdrUsed;
18876 if (
Func->isTrivial() && !
Func->hasAttr<DLLExportAttr>() &&
18877 OdrUse == OdrUseContext::Used) {
18880 OdrUse = OdrUseContext::FormallyOdrUsed;
18882 OdrUse = OdrUseContext::FormallyOdrUsed;
18889 bool NeededForConstantEvaluation =
18914 bool NeedDefinition =
18915 !IsRecursiveCall &&
18916 (OdrUse == OdrUseContext::Used ||
18917 (NeededForConstantEvaluation && !
Func->isPureVirtual()));
18924 if (NeedDefinition &&
18926 Func->getMemberSpecializationInfo()))
18933 if (NeedDefinition && !
Func->getBody()) {
18936 dyn_cast<CXXConstructorDecl>(
Func)) {
18949 }
else if (
Constructor->getInheritedConstructor()) {
18953 dyn_cast<CXXDestructorDecl>(
Func)) {
18963 if (MethodDecl->isOverloadedOperator() &&
18964 MethodDecl->getOverloadedOperator() == OO_Equal) {
18966 if (MethodDecl->isDefaulted() && !MethodDecl->isDeleted()) {
18967 if (MethodDecl->isCopyAssignmentOperator())
18969 else if (MethodDecl->isMoveAssignmentOperator())
18973 MethodDecl->getParent()->isLambda()) {
18980 }
else if (MethodDecl->isVirtual() &&
getLangOpts().AppleKext)
18984 if (
Func->isDefaulted() && !
Func->isDeleted()) {
18992 if (
Func->isImplicitlyInstantiable()) {
18994 Func->getTemplateSpecializationKindForInstantiation();
18996 bool FirstInstantiation = PointOfInstantiation.
isInvalid();
18997 if (FirstInstantiation) {
18998 PointOfInstantiation = Loc;
18999 if (
auto *MSI =
Func->getMemberSpecializationInfo())
19000 MSI->setPointOfInstantiation(Loc);
19003 Func->setTemplateSpecializationKind(TSK, PointOfInstantiation);
19008 PointOfInstantiation = Loc;
19012 Func->isConstexpr()) {
19017 std::make_pair(
Func, PointOfInstantiation));
19018 else if (
Func->isConstexpr())
19024 Func->setInstantiationIsPending(
true);
19026 std::make_pair(
Func, PointOfInstantiation));
19027 if (llvm::isTimeTraceVerbose()) {
19028 llvm::timeTraceAddInstantEvent(
"DeferInstantiation", [&] {
19030 llvm::raw_string_ostream
OS(Name);
19037 Consumer.HandleCXXImplicitFunctionInstantiation(
Func);
19042 for (
auto *i :
Func->redecls()) {
19043 if (!i->isUsed(
false) && i->isImplicitlyInstantiable())
19061 if (
Init->isInClassMemberInitializer())
19063 MarkDeclarationsReferencedInExpr(Init->getInit());
19084 if (
LangOpts.OffloadImplicitHostDeviceTemplates &&
LangOpts.CUDAIsDevice &&
19089 if (OdrUse == OdrUseContext::Used && !
Func->isUsed(
false)) {
19091 if (!
Func->isDefined() && !
Func->isInAnotherModuleUnit()) {
19092 if (mightHaveNonExternalLinkage(
Func))
19094 else if (
Func->getMostRecentDecl()->isInlined() &&
19096 !
Func->getMostRecentDecl()->hasAttr<GNUInlineAttr>())
19114 if (
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
19115 if (
auto *Dtor = dyn_cast<CXXDestructorDecl>(
Func)) {
19135 const unsigned *
const FunctionScopeIndexToStopAt =
nullptr) {
19138 VarDecl *Var =
V->getPotentiallyDecomposedVarDecl();
19139 assert(Var &&
"expected a capturable variable");
19149 QualType CaptureType, DeclRefType;
19155 DeclRefType, FunctionScopeIndexToStopAt);
19170 << 2 << 1 << Var << UserTarget;
19173 ? diag::note_cuda_const_var_unpromoted
19174 : diag::note_cuda_host_var);
19183 Var->
hasAttr<CUDADeviceAttr>() &&
19184 !Var->
getAttr<CUDADeviceAttr>()->isImplicit())) &&
19185 !Var->
hasAttr<CUDASharedAttr>() &&
19201 (!FD || (!FD->getDescribedFunctionTemplate() &&
19213 unsigned CapturingScopeIndex) {
19240 unsigned ContextKind = 3;
19250 S.
Diag(loc, diag::err_reference_to_local_in_enclosing_context)
19251 << var << ValueKind << ContextKind << VarDC;
19252 S.
Diag(var->getLocation(), diag::note_entity_declared_at)
19261 bool &SubCapturesAreNested,
19267 SubCapturesAreNested =
true;
19320 "Only variables and structured bindings can be captured");
19331 S.
Diag(Loc, diag::err_lambda_capture_anonymous_var);
19340 S.
Diag(Loc, diag::err_ref_vm_type);
19351 S.
Diag(Loc, diag::err_ref_flexarray_type);
19353 S.
Diag(Loc, diag::err_lambda_capture_flexarray_type) << Var;
19358 const bool HasBlocksAttr = Var->
hasAttr<BlocksAttr>();
19363 S.
Diag(Loc, diag::err_capture_block_variable) << Var << !IsLambda;
19372 S.
Diag(Loc, diag::err_opencl_block_ref_block);
19383 ? diag::warn_cxx17_compat_capture_binding
19384 : diag::ext_capture_binding)
19398 bool ByRef =
false;
19404 if (BuildAndDiagnose) {
19405 S.
Diag(Loc, diag::err_ref_array_type);
19416 if (BuildAndDiagnose) {
19417 S.
Diag(Loc, diag::err_arc_autoreleasing_capture)
19433 if (BuildAndDiagnose) {
19435 S.
Diag(Loc, diag::warn_block_capture_autoreleasing);
19436 S.
Diag(VarLoc, diag::note_declare_parameter_strong);
19441 const bool HasBlocksAttr = Var->
hasAttr<BlocksAttr>();
19450 DeclRefType = CaptureType;
19454 if (BuildAndDiagnose)
19464 const bool BuildAndDiagnose,
QualType &CaptureType,
QualType &DeclRefType,
19465 const bool RefersToCapturedVariable,
TryCaptureKind Kind,
bool IsTopScope,
19491 CaptureType = DeclRefType;
19494 if (BuildAndDiagnose)
19495 RSI->
addCapture(Var,
false, ByRef, RefersToCapturedVariable,
19505 const bool RefersToCapturedVariable,
19510 bool ByRef =
false;
19514 ByRef = (LSI->
ImpCaptureStyle == LambdaScopeInfo::ImpCap_LambdaByref);
19519 S.
Diag(Loc, diag::err_wasm_ca_reference) << 0;
19550 if (!RefType->getPointeeType()->isFunctionType())
19557 if (BuildAndDiagnose) {
19558 S.
Diag(Loc, diag::err_arc_autoreleasing_capture) << 1;
19568 if (!
Invalid && BuildAndDiagnose) {
19572 diag::err_capture_of_incomplete_or_sizeless_type,
19576 diag::err_capture_of_abstract_type))
19602 if (BuildAndDiagnose)
19603 LSI->
addCapture(Var,
false, ByRef, RefersToCapturedVariable,
19604 Loc, EllipsisLoc, CaptureType,
Invalid);
19615 if (T.isTriviallyCopyableType(Context))
19619 if (!(RD = RD->getDefinition()))
19621 if (RD->hasSimpleCopyConstructor())
19623 if (RD->hasUserDeclaredCopyConstructor())
19625 if (Ctor->isCopyConstructor())
19626 return !Ctor->isDeleted();
19646 if (ShouldOfferCopyFix) {
19650 FixBuffer.assign({Separator, Var->
getName()});
19651 Sema.
Diag(VarInsertLoc, diag::note_lambda_variable_capture_fixit)
19656 FixBuffer.assign({Separator,
"&", Var->
getName()});
19657 Sema.
Diag(VarInsertLoc, diag::note_lambda_variable_capture_fixit)
19669 return !C.isThisCapture() && !C.isInitCapture();
19678 if (ShouldOfferCopyFix) {
19679 bool CanDefaultCopyCapture =
true;
19688 if (CanDefaultCopyCapture && llvm::none_of(LSI->
Captures, [](
Capture &
C) {
19689 return !C.isThisCapture() && !C.isInitCapture() && C.isCopyCapture();
19691 FixBuffer.assign({
"=", Separator});
19692 Sema.
Diag(DefaultInsertLoc, diag::note_lambda_default_capture_fixit)
19701 return !C.isInitCapture() && C.isReferenceCapture() &&
19702 !C.isThisCapture();
19704 FixBuffer.assign({
"&", Separator});
19705 Sema.
Diag(DefaultInsertLoc, diag::note_lambda_default_capture_fixit)
19714 QualType &DeclRefType,
const unsigned *
const FunctionScopeIndexToStopAt) {
19737 const auto *VD = dyn_cast<VarDecl>(Var);
19739 if (VD->isInitCapture())
19744 assert(VD &&
"Cannot capture a null variable");
19746 const unsigned MaxFunctionScopesIndex = FunctionScopeIndexToStopAt
19750 if (FunctionScopeIndexToStopAt) {
19751 assert(!
FunctionScopes.empty() &&
"No function scopes to stop at?");
19756 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(
FunctionScopes[FSIndex]);
19757 FSIndex && LSI && !LSI->AfterParameterList)
19759 assert(MaxFunctionScopesIndex <= FSIndex &&
19760 "FunctionScopeIndexToStopAt should be no greater than FSIndex into "
19761 "FunctionScopes.");
19762 while (FSIndex != MaxFunctionScopesIndex) {
19770 bool IsGlobal = !VD->hasLocalStorage();
19771 if (IsGlobal && !(
LangOpts.OpenMP &&
19772 OpenMP().isOpenMPCapturedDecl(Var,
true,
19773 MaxFunctionScopesIndex)))
19787 CaptureType = Var->
getType();
19789 bool Nested =
false;
19791 unsigned FunctionScopesIndex = MaxFunctionScopesIndex;
19796 LSI = dyn_cast_or_null<LambdaScopeInfo>(
19799 bool IsInScopeDeclarationContext =
19810 if (IsInScopeDeclarationContext &&
19811 FunctionScopesIndex == MaxFunctionScopesIndex && VarDC == DC)
19817 !IsInScopeDeclarationContext
19820 BuildAndDiagnose, *
this);
19826 FunctionScopesIndex = MaxFunctionScopesIndex - 1;
19845 if (
const auto *Parm = dyn_cast<ParmVarDecl>(Var);
19846 Parm && Parm->getDeclContext() == DC)
19854 if (BuildAndDiagnose) {
19857 Diag(ExprLoc, diag::err_lambda_impcap) << Var;
19872 if (
ParmVarDecl *PVD = dyn_cast_or_null<ParmVarDecl>(Var))
19873 QTy = PVD->getOriginalType();
19878 if (
auto *RSI = dyn_cast<CapturedRegionScopeInfo>(CSI)) {
19885 if (BuildAndDiagnose) {
19886 Diag(ExprLoc, diag::err_capture_binding_openmp) << Var;
19892 Var, RSI->OpenMPLevel, RSI->OpenMPCaptureLevel);
19897 if (IsOpenMPPrivateDecl != OMPC_unknown &&
19900 if (
ParmVarDecl *PVD = dyn_cast_or_null<ParmVarDecl>(Var))
19901 QTy = PVD->getOriginalType();
19903 E =
OpenMP().getNumberOfConstructScopes(RSI->OpenMPLevel);
19907 assert(RSI->OpenMPLevel == OuterRSI->OpenMPLevel &&
19908 "Wrong number of captured regions associated with the "
19909 "OpenMP construct.");
19914 IsOpenMPPrivateDecl != OMPC_private &&
19916 RSI->OpenMPCaptureLevel);
19920 Var, RSI->OpenMPLevel, RSI->OpenMPCaptureLevel);
19926 OpenMP().adjustOpenMPTargetScopeIndex(FunctionScopesIndex,
19929 if (IsTargetCap || IsOpenMPPrivateDecl == OMPC_private ||
19930 (IsGlobal && !IsGlobalCap)) {
19931 Nested = !IsTargetCap;
19937 CaptureType =
Context.getLValueReferenceType(DeclRefType);
19946 if (BuildAndDiagnose) {
19947 Diag(ExprLoc, diag::err_lambda_impcap) << Var;
19969 FunctionScopesIndex--;
19970 if (IsInScopeDeclarationContext)
19972 }
while (!VarDC->
Equals(DC));
19980 for (
unsigned I = ++FunctionScopesIndex, N = MaxFunctionScopesIndex + 1; I != N;
19993 if (
Invalid && !BuildAndDiagnose)
19998 DeclRefType, Nested, *
this,
Invalid);
20002 RSI, Var, ExprLoc, BuildAndDiagnose, CaptureType, DeclRefType, Nested,
20003 Kind, I == N - 1, *
this,
Invalid);
20009 DeclRefType, Nested, Kind, EllipsisLoc,
20014 if (
Invalid && !BuildAndDiagnose)
20026 DeclRefType,
nullptr);
20034 false, CaptureType, DeclRefType,
nullptr);
20038 assert(Var &&
"Null value cannot be captured");
20045 false, CaptureType, DeclRefType,
20049 return DeclRefType;
20057class CopiedTemplateArgs {
20061 template<
typename RefExpr>
20062 CopiedTemplateArgs(RefExpr *E) : HasArgs(E->hasExplicitTemplateArgs()) {
20064 E->copyTemplateArgumentsInto(TemplateArgStorage);
20067#ifdef __has_cpp_attribute
20068#if __has_cpp_attribute(clang::lifetimebound)
20069 [[clang::lifetimebound]]
20073 return HasArgs ? &TemplateArgStorage :
nullptr;
20099 auto Rebuild = [&](
Expr *Sub) {
20104 auto IsPotentialResultOdrUsed = [&](
NamedDecl *D) {
20107 auto *VD = dyn_cast<VarDecl>(D);
20130 llvm_unreachable(
"unexpected non-odr-use-reason");
20134 if (VD->getType()->isReferenceType())
20136 if (
auto *RD = VD->getType()->getAsCXXRecordDecl())
20137 if (RD->hasDefinition() && RD->hasMutableFields())
20139 if (!VD->isUsableInConstantExpressions(S.
Context))
20144 if (VD->getType()->isReferenceType())
20152 auto MaybeCUDAODRUsed = [&]() ->
bool {
20158 auto *DRE = dyn_cast<DeclRefExpr>(E);
20161 auto *VD = dyn_cast<VarDecl>(DRE->getDecl());
20168 auto MarkNotOdrUsed = [&] {
20169 if (!MaybeCUDAODRUsed()) {
20172 LSI->markVariableExprAsNonODRUsed(E);
20180 case Expr::DeclRefExprClass: {
20182 if (DRE->isNonOdrUse() || IsPotentialResultOdrUsed(DRE->getDecl()))
20188 S.
Context, DRE->getQualifierLoc(), DRE->getTemplateKeywordLoc(),
20189 DRE->getDecl(), DRE->refersToEnclosingVariableOrCapture(),
20190 DRE->getNameInfo(), DRE->getType(), DRE->getValueKind(),
20191 DRE->getFoundDecl(), CopiedTemplateArgs(DRE), NOUR);
20194 case Expr::FunctionParmPackExprClass: {
20199 if (IsPotentialResultOdrUsed(D))
20210 case Expr::ArraySubscriptExprClass: {
20216 if (!
Base.isUsable())
20218 Expr *LHS = ASE->getBase() == ASE->getLHS() ?
Base.get() : ASE->getLHS();
20219 Expr *RHS = ASE->getBase() == ASE->getRHS() ?
Base.get() : ASE->getRHS();
20222 ASE->getRBracketLoc());
20225 case Expr::MemberExprClass: {
20231 if (!
Base.isUsable())
20234 S.
Context,
Base.get(), ME->isArrow(), ME->getOperatorLoc(),
20235 ME->getQualifierLoc(), ME->getTemplateKeywordLoc(),
20236 ME->getMemberDecl(), ME->getFoundDecl(), ME->getMemberNameInfo(),
20237 CopiedTemplateArgs(ME), ME->getType(), ME->getValueKind(),
20238 ME->getObjectKind(), ME->isNonOdrUse());
20241 if (ME->getMemberDecl()->isCXXInstanceMember())
20246 if (ME->isNonOdrUse() || IsPotentialResultOdrUsed(ME->getMemberDecl()))
20252 S.
Context, ME->getBase(), ME->isArrow(), ME->getOperatorLoc(),
20253 ME->getQualifierLoc(), ME->getTemplateKeywordLoc(), ME->getMemberDecl(),
20254 ME->getFoundDecl(), ME->getMemberNameInfo(), CopiedTemplateArgs(ME),
20255 ME->getType(), ME->getValueKind(), ME->getObjectKind(), NOUR);
20258 case Expr::BinaryOperatorClass: {
20260 Expr *LHS = BO->getLHS();
20261 Expr *RHS = BO->getRHS();
20263 if (BO->getOpcode() == BO_PtrMemD) {
20265 if (!Sub.isUsable())
20267 BO->setLHS(Sub.get());
20269 }
else if (BO->getOpcode() == BO_Comma) {
20271 if (!Sub.isUsable())
20273 BO->setRHS(Sub.get());
20281 case Expr::ParenExprClass: {
20284 if (!Sub.isUsable())
20286 return S.
ActOnParenExpr(PE->getLParen(), PE->getRParen(), Sub.get());
20291 case Expr::ConditionalOperatorClass: {
20302 LHS = CO->getLHS();
20304 RHS = CO->getRHS();
20306 CO->getCond(), LHS.
get(), RHS.
get());
20311 case Expr::UnaryOperatorClass: {
20313 if (UO->getOpcode() != UO_Extension)
20316 if (!Sub.isUsable())
20318 return S.
BuildUnaryOp(
nullptr, UO->getOperatorLoc(), UO_Extension,
20325 case Expr::GenericSelectionExprClass: {
20329 bool AnyChanged =
false;
20330 for (
Expr *OrigAssocExpr : GSE->getAssocExprs()) {
20331 ExprResult AssocExpr = Rebuild(OrigAssocExpr);
20335 AssocExprs.push_back(AssocExpr.
get());
20338 AssocExprs.push_back(OrigAssocExpr);
20342 void *ExOrTy =
nullptr;
20343 bool IsExpr = GSE->isExprPredicate();
20345 ExOrTy = GSE->getControllingExpr();
20347 ExOrTy = GSE->getControllingType();
20349 GSE->getGenericLoc(), GSE->getDefaultLoc(),
20350 GSE->getRParenLoc(), IsExpr, ExOrTy,
20351 GSE->getAssocTypeSourceInfos(), AssocExprs)
20359 case Expr::ChooseExprClass: {
20370 if (!LHS.
get() && !RHS.
get())
20373 LHS = CE->getLHS();
20375 RHS = CE->getRHS();
20378 RHS.
get(), CE->getRParenLoc());
20382 case Expr::ConstantExprClass: {
20385 if (!Sub.isUsable())
20392 case Expr::ImplicitCastExprClass: {
20397 switch (ICE->getCastKind()) {
20399 case CK_DerivedToBase:
20400 case CK_UncheckedDerivedToBase: {
20401 ExprResult Sub = Rebuild(ICE->getSubExpr());
20402 if (!Sub.isUsable())
20406 ICE->getValueKind(), &Path);
20463 for (
Expr *E : LocalMaybeODRUseExprs) {
20464 if (
auto *DRE = dyn_cast<DeclRefExpr>(E)) {
20466 DRE->getLocation(), *
this);
20467 }
else if (
auto *ME = dyn_cast<MemberExpr>(E)) {
20470 }
else if (
auto *FP = dyn_cast<FunctionParmPackExpr>(E)) {
20474 llvm_unreachable(
"Unexpected expression");
20479 "MarkVarDeclODRUsed failed to cleanup MaybeODRUseExprs?");
20488 const bool RefersToEnclosingScope =
20491 if (RefersToEnclosingScope) {
20506 assert(E &&
"Capture variable should be used in an expression.");
20519 "Invalid Expr argument to DoMarkVarDeclReferenced");
20530 bool UsableInConstantExpr =
20549 bool NeededForConstantEvaluation =
20552 bool NeedDefinition =
20553 OdrUse == OdrUseContext::Used || NeededForConstantEvaluation ||
20555 Var->
getType()->isUndeducedType());
20558 "Can't instantiate a partial template specialization.");
20575 bool TryInstantiating =
20579 if (TryInstantiating) {
20582 bool FirstInstantiation = PointOfInstantiation.
isInvalid();
20583 if (FirstInstantiation) {
20584 PointOfInstantiation = Loc;
20586 MSI->setPointOfInstantiation(PointOfInstantiation);
20608 if (
auto *DRE = dyn_cast_or_null<DeclRefExpr>(E))
20609 DRE->setDecl(DRE->getDecl());
20610 else if (
auto *ME = dyn_cast_or_null<MemberExpr>(E))
20611 ME->setMemberDecl(ME->getMemberDecl());
20612 }
else if (FirstInstantiation) {
20614 .push_back(std::make_pair(Var, PointOfInstantiation));
20616 bool Inserted =
false;
20618 auto Iter = llvm::find_if(
20620 return P.first == Var;
20622 if (Iter != I.end()) {
20637 .push_back(std::make_pair(Var, PointOfInstantiation));
20661 if (
DeclRefExpr *DRE = dyn_cast_or_null<DeclRefExpr>(E))
20662 if (DRE->isNonOdrUse())
20664 if (
MemberExpr *ME = dyn_cast_or_null<MemberExpr>(E))
20665 if (ME->isNonOdrUse())
20669 case OdrUseContext::None:
20674 "missing non-odr-use marking for unevaluated decl ref");
20677 case OdrUseContext::FormallyOdrUsed:
20682 case OdrUseContext::Used:
20691 case OdrUseContext::Dependent:
20709 if (OdrUse == OdrUseContext::Used) {
20710 QualType CaptureType, DeclRefType;
20716 }
else if (OdrUse == OdrUseContext::Dependent) {
20732 auto *ID = dyn_cast<DeclRefExpr>(E);
20733 if (!ID || ID->isTypeDependent() || !ID->refersToEnclosingVariableOrCapture())
20740 auto IsDependent = [&]() {
20742 auto *LSI = dyn_cast<sema::LambdaScopeInfo>(
Scope);
20747 LSI->AfterParameterList)
20750 const auto *MD = LSI->CallOperator;
20751 if (MD->getType().isNull())
20755 if (!Ty || !MD->isExplicitObjectMemberFunction() ||
20759 if (
auto *
C = LSI->CaptureMap.count(D) ? &LSI->getCapture(D) :
nullptr) {
20760 if (
C->isCopyCapture())
20765 if (LSI->ImpCaptureStyle == LambdaScopeInfo::ImpCap_LambdaByval)
20771 ID->setCapturedByCopyInLambdaWithExplicitObjectParameter(
20777 bool MightBeOdrUse,
20785 if (
VarDecl *Var = dyn_cast<VarDecl>(D)) {
20804 const MemberExpr *ME = dyn_cast<MemberExpr>(E);
20811 bool IsVirtualCall = MD->
isVirtual() &&
20813 if (!IsVirtualCall)
20830 bool OdrUse =
true;
20832 if (
Method->isVirtual() &&
20836 if (
auto *FD = dyn_cast<FunctionDecl>(E->
getDecl())) {
20841 !FD->isDependentContext())
20855 bool MightBeOdrUse =
true;
20858 if (
Method->isPureVirtual())
20859 MightBeOdrUse =
false;
20878 bool MightBeOdrUse) {
20879 if (MightBeOdrUse) {
20880 if (
auto *VD = dyn_cast<VarDecl>(D)) {
20885 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
20911bool MarkReferencedDecls::TraverseTemplateArgument(
20912 const TemplateArgument &Arg) {
20915 EnterExpressionEvaluationContext
Evaluated(
20929 MarkReferencedDecls Marker(*
this, Loc);
20930 Marker.TraverseType(T);
20936class EvaluatedExprMarker :
public UsedDeclVisitor<EvaluatedExprMarker> {
20939 bool SkipLocalVariables;
20942 EvaluatedExprMarker(
Sema &S,
bool SkipLocalVariables,
20944 : Inherited(S), SkipLocalVariables(SkipLocalVariables), StopAt(StopAt) {}
20950 void Visit(Expr *E) {
20951 if (llvm::is_contained(StopAt, E))
20953 Inherited::Visit(E);
20956 void VisitConstantExpr(ConstantExpr *E) {
20961 void VisitDeclRefExpr(DeclRefExpr *E) {
20963 if (SkipLocalVariables) {
20964 if (VarDecl *VD = dyn_cast<VarDecl>(E->
getDecl()))
20965 if (VD->hasLocalStorage())
20975 void VisitMemberExpr(MemberExpr *E) {
20983 bool SkipLocalVariables,
20985 EvaluatedExprMarker(*
this, SkipLocalVariables, StopAt).Visit(E);
20997 (
Decl->isConstexpr() || (
Decl->isStaticDataMember() &&
21001 if (Stmts.empty()) {
21015 if (
Decl &&
Decl->isFileVarDecl()) {
21088 class CallReturnIncompleteDiagnoser :
public TypeDiagnoser {
21094 : FD(FD), CE(CE) { }
21098 S.
Diag(Loc, diag::err_call_incomplete_return)
21103 S.
Diag(Loc, diag::err_call_function_incomplete_return)
21108 } Diagnoser(FD, CE);
21121 unsigned diagnostic = diag::warn_condition_is_assignment;
21122 bool IsOrAssign =
false;
21125 if (Op->getOpcode() != BO_Assign && Op->getOpcode() != BO_OrAssign)
21128 IsOrAssign = Op->getOpcode() == BO_OrAssign;
21136 if (
ObjC().isSelfExpr(Op->getLHS()) && ME->getMethodFamily() ==
OMF_init)
21137 diagnostic = diag::warn_condition_is_idiomatic_assignment;
21141 diagnostic = diag::warn_condition_is_idiomatic_assignment;
21144 Loc = Op->getOperatorLoc();
21146 if (Op->getOperator() != OO_Equal && Op->getOperator() != OO_PipeEqual)
21149 IsOrAssign = Op->getOperator() == OO_PipeEqual;
21150 Loc = Op->getOperatorLoc();
21162 Diag(Loc, diag::note_condition_assign_silence)
21167 Diag(Loc, diag::note_condition_or_assign_to_comparison)
21170 Diag(Loc, diag::note_condition_assign_to_comparison)
21188 if (opE->getOpcode() == BO_EQ &&
21189 opE->getLHS()->IgnoreParenImpCasts()->isModifiableLvalue(
Context)
21195 Diag(Loc, diag::note_equality_comparison_silence)
21198 Diag(Loc, diag::note_equality_comparison_to_assign)
21204 bool IsConstexpr) {
21206 if (
ParenExpr *parenE = dyn_cast<ParenExpr>(E))
21226 if (!T->isScalarType()) {
21227 Diag(Loc, diag::err_typecheck_statement_requires_scalar)
21231 CheckBoolLikeConversion(E, Loc);
21260 if (
Cond.isInvalid()) {
21268 if (!
Cond.isUsable())
21278 struct RebuildUnknownAnyFunction
21279 :
StmtVisitor<RebuildUnknownAnyFunction, ExprResult> {
21283 RebuildUnknownAnyFunction(
Sema &S) : S(S) {}
21286 llvm_unreachable(
"unexpected statement!");
21297 template <
class T>
ExprResult rebuildSugarExpr(T *E) {
21298 ExprResult SubResult = Visit(E->getSubExpr());
21301 Expr *SubExpr = SubResult.
get();
21302 E->setSubExpr(SubExpr);
21303 E->setType(SubExpr->
getType());
21310 return rebuildSugarExpr(E);
21313 ExprResult VisitUnaryExtension(UnaryOperator *E) {
21314 return rebuildSugarExpr(E);
21317 ExprResult VisitUnaryAddrOf(UnaryOperator *E) {
21321 Expr *SubExpr = SubResult.
get();
21329 ExprResult resolveDecl(Expr *E, ValueDecl *VD) {
21347 ExprResult VisitDeclRefExpr(DeclRefExpr *E) {
21348 return resolveDecl(E, E->
getDecl());
21356 ExprResult Result = RebuildUnknownAnyFunction(S).Visit(FunctionExpr);
21357 if (Result.isInvalid())
return ExprError();
21366 struct RebuildUnknownAnyExpr
21367 : StmtVisitor<RebuildUnknownAnyExpr, ExprResult> {
21374 RebuildUnknownAnyExpr(Sema &S, QualType
CastType)
21378 llvm_unreachable(
"unexpected statement!");
21388 ExprResult VisitObjCMessageExpr(ObjCMessageExpr *E);
21392 template <
class T>
ExprResult rebuildSugarExpr(T *E) {
21393 ExprResult SubResult = Visit(E->getSubExpr());
21395 Expr *SubExpr = SubResult.
get();
21396 E->setSubExpr(SubExpr);
21397 E->setType(SubExpr->
getType());
21404 return rebuildSugarExpr(E);
21407 ExprResult VisitUnaryExtension(UnaryOperator *E) {
21408 return rebuildSugarExpr(E);
21411 ExprResult VisitUnaryAddrOf(UnaryOperator *E) {
21412 const PointerType *Ptr = DestType->
getAs<PointerType>();
21437 ExprResult VisitImplicitCastExpr(ImplicitCastExpr *E);
21439 ExprResult resolveDecl(Expr *E, ValueDecl *VD);
21445 ExprResult VisitDeclRefExpr(DeclRefExpr *E) {
21446 return resolveDecl(E, E->
getDecl());
21452ExprResult RebuildUnknownAnyExpr::VisitCallExpr(CallExpr *E) {
21457 FK_FunctionPointer,
21462 QualType CalleeType = CalleeExpr->
getType();
21465 Kind = FK_MemberFunction;
21467 }
else if (
const PointerType *Ptr = CalleeType->
getAs<PointerType>()) {
21469 Kind = FK_FunctionPointer;
21472 Kind = FK_BlockPointer;
21474 const FunctionType *FnType = CalleeType->
castAs<FunctionType>();
21479 unsigned diagID = diag::err_func_returning_array_function;
21480 if (Kind == FK_BlockPointer)
21481 diagID = diag::err_block_returning_array_function;
21494 const FunctionProtoType *Proto = dyn_cast<FunctionProtoType>(FnType);
21516 SmallVector<QualType, 8> ArgTypes;
21517 if (ParamTypes.empty() && Proto->
isVariadic()) {
21519 for (
unsigned i = 0, e = E->
getNumArgs(); i != e; ++i) {
21522 ParamTypes = ArgTypes;
21533 case FK_MemberFunction:
21537 case FK_FunctionPointer:
21541 case FK_BlockPointer:
21547 ExprResult CalleeResult = Visit(CalleeExpr);
21555ExprResult RebuildUnknownAnyExpr::VisitObjCMessageExpr(ObjCMessageExpr *E) {
21558 S.
Diag(E->
getExprLoc(), diag::err_func_returning_array_function)
21566 Method->setReturnType(DestType);
21576ExprResult RebuildUnknownAnyExpr::VisitImplicitCastExpr(ImplicitCastExpr *E) {
21578 if (E->
getCastKind() == CK_FunctionToPointerDecay) {
21592 }
else if (E->
getCastKind() == CK_LValueToRValue) {
21609 llvm_unreachable(
"Unhandled cast type!");
21613ExprResult RebuildUnknownAnyExpr::resolveDecl(Expr *E, ValueDecl *VD) {
21615 QualType
Type = DestType;
21620 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(VD)) {
21621 if (
const PointerType *Ptr =
Type->getAs<PointerType>()) {
21629 if (!
Type->isFunctionType()) {
21634 if (
const FunctionProtoType *FT =
Type->getAs<FunctionProtoType>()) {
21638 QualType FDT = FD->getType();
21639 const FunctionType *FnType = FDT->
castAs<FunctionType>();
21640 const FunctionProtoType *Proto = dyn_cast_or_null<FunctionProtoType>(FnType);
21641 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E);
21642 if (DRE && Proto && Proto->getParamTypes().empty() && Proto->isVariadic()) {
21643 SourceLocation Loc = FD->getLocation();
21645 S.
Context, FD->getDeclContext(), Loc, Loc,
21646 FD->getNameInfo().getName(), DestType, FD->getTypeSourceInfo(),
21648 false , FD->hasPrototype(),
21651 if (FD->getQualifier())
21654 SmallVector<ParmVarDecl*, 16> Params;
21655 for (
const auto &AI : FT->param_types()) {
21656 ParmVarDecl *Param =
21659 Params.push_back(Param);
21661 NewFD->setParams(Params);
21667 if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD))
21668 if (MD->isInstance()) {
21679 if (
const ReferenceType *RefTy =
Type->getAs<ReferenceType>()) {
21680 Type = RefTy->getPointeeType();
21681 }
else if (
Type->isFunctionType()) {
21682 S.
Diag(E->
getExprLoc(), diag::err_unknown_any_var_function_type)
21708 diag::err_typecheck_cast_to_incomplete))
21723 return RebuildUnknownAnyExpr(*
this, ToType).Visit(E);
21730 ExplicitCastExpr *castArg = dyn_cast<ExplicitCastExpr>(arg->IgnoreParens());
21739 assert(!arg->hasPlaceholderType());
21751 unsigned diagID = diag::err_uncasted_use_of_unknown_any;
21754 if (
CallExpr *call = dyn_cast<CallExpr>(E)) {
21755 E = call->getCallee();
21756 diagID = diag::err_uncasted_call_of_unknown_any;
21764 if (
DeclRefExpr *ref = dyn_cast<DeclRefExpr>(E)) {
21765 loc = ref->getLocation();
21766 d = ref->getDecl();
21767 }
else if (
MemberExpr *mem = dyn_cast<MemberExpr>(E)) {
21768 loc = mem->getMemberLoc();
21769 d = mem->getMemberDecl();
21771 diagID = diag::err_uncasted_call_of_unknown_any;
21772 loc = msg->getSelectorStartLoc();
21773 d = msg->getMethodDecl();
21775 S.
Diag(loc, diag::err_uncasted_send_to_unknown_any_method)
21776 <<
static_cast<unsigned>(msg->isClassMessage()) << msg->getSelector()
21794 if (!placeholderType)
return E;
21796 switch (placeholderType->
getKind()) {
21797 case BuiltinType::UnresolvedTemplate: {
21810 if (
auto *TD = dyn_cast<TemplateDecl>(Temp))
21811 TN =
Context.getQualifiedTemplateName(NNS, ULE->hasTemplateKeyword(),
21816 Diag(NameInfo.
getLoc(), diag::err_template_kw_refers_to_type_template)
21817 << TN << ULE->getSourceRange() << IsTypeAliasTemplateDecl;
21819 << IsTypeAliasTemplateDecl;
21822 bool HasAnyDependentTA =
false;
21824 HasAnyDependentTA |= Arg.getArgument().
isDependent();
21836 TST =
Context.getTemplateSpecializationType(
21845 case BuiltinType::Overload: {
21865 case BuiltinType::BoundMember: {
21871 PD =
PDiag(diag::err_dtor_expr_without_call) << 1;
21872 }
else if (
const auto *ME = dyn_cast<MemberExpr>(BME)) {
21873 if (ME->getMemberNameInfo().getName().getNameKind() ==
21875 PD =
PDiag(diag::err_dtor_expr_without_call) << 0;
21883 case BuiltinType::ARCUnbridgedCast: {
21890 case BuiltinType::UnknownAny:
21894 case BuiltinType::PseudoObject:
21897 case BuiltinType::BuiltinFn: {
21902 unsigned BuiltinID = FD->getBuiltinID();
21903 if (BuiltinID == Builtin::BI__noop) {
21905 CK_BuiltinFnToFnPtr)
21912 if (
Context.BuiltinInfo.isInStdNamespace(BuiltinID)) {
21918 ? diag::err_use_of_unaddressable_function
21919 : diag::warn_cxx20_compat_use_of_unaddressable_function);
21920 if (FD->isImplicitlyInstantiable()) {
21947 case BuiltinType::IncompleteMatrixIdx: {
21953 MS->getBase(), MS->getRowIdx(), E->
getExprLoc());
21955 Diag(MS->getRowIdx()->getBeginLoc(), diag::err_matrix_incomplete_index);
21960 case BuiltinType::ArraySection:
21969 case BuiltinType::OMPArrayShaping:
21972 case BuiltinType::OMPIterator:
21976#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
21977 case BuiltinType::Id:
21978#include "clang/Basic/OpenCLImageTypes.def"
21979#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
21980 case BuiltinType::Id:
21981#include "clang/Basic/OpenCLExtensionTypes.def"
21982#define SVE_TYPE(Name, Id, SingletonId) \
21983 case BuiltinType::Id:
21984#include "clang/Basic/AArch64ACLETypes.def"
21985#define PPC_VECTOR_TYPE(Name, Id, Size) \
21986 case BuiltinType::Id:
21987#include "clang/Basic/PPCTypes.def"
21988#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
21989#include "clang/Basic/RISCVVTypes.def"
21990#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
21991#include "clang/Basic/WebAssemblyReferenceTypes.def"
21992#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
21993#include "clang/Basic/AMDGPUTypes.def"
21994#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
21995#include "clang/Basic/HLSLIntangibleTypes.def"
21996#define BUILTIN_TYPE(Id, SingletonId) case BuiltinType::Id:
21997#define PLACEHOLDER_TYPE(Id, SingletonId)
21998#include "clang/AST/BuiltinTypes.def"
22002 llvm_unreachable(
"invalid placeholder type!");
22015 if (!
Context.getLangOpts().RecoveryAST)
22021 if (T.isNull() || T->isUndeducedType() ||
22022 !
Context.getLangOpts().RecoveryASTType)
Defines the clang::ASTContext interface.
This file provides some common utility functions for processing Lambda related AST Constructs.
static bool isObjCPointer(const MemRegion *R)
Defines enum values for all the target-independent builtin functions.
This file defines the classes used to store parsed information about declaration-specifiers and decla...
Defines the C++ template declaration subclasses.
static DeclT * getDefinitionOrSelf(DeclT *D)
Defines the classes clang::DelayedDiagnostic and clang::AccessedEntity.
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.
llvm::MachO::Target Target
llvm::MachO::Record Record
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
Defines the clang::Preprocessor interface.
static QualType getUnderlyingType(const SubRegion *R)
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.
This file declares semantic analysis functions specific to ARM.
This file declares semantic analysis for CUDA constructs.
static void DetectPrecisionLossInComplexDivision(Sema &S, QualType DivisorTy, SourceLocation OpLoc)
static void HandleImmediateInvocations(Sema &SemaRef, Sema::ExpressionEvaluationContextRecord &Rec)
static ExprResult BuildCookedLiteralOperatorCall(Sema &S, Scope *Scope, IdentifierInfo *UDSuffix, SourceLocation UDSuffixLoc, ArrayRef< Expr * > Args, SourceLocation LitEndLoc)
BuildCookedLiteralOperatorCall - A user-defined literal was found.
static ExprResult BuildOverloadedBinOp(Sema &S, Scope *Sc, SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHS, Expr *RHS)
Build an overloaded binary operator expression in the given scope.
static bool canConvertIntTyToFloatTy(Sema &S, ExprResult *Int, QualType FloatTy)
Test if a (constant) integer Int can be casted to floating point type FloatTy without losing precisio...
static bool checkArithmeticOpPointerOperand(Sema &S, SourceLocation Loc, Expr *Operand)
Check the validity of an arithmetic pointer operand.
static void DiagnoseBitwisePrecedence(Sema &Self, BinaryOperatorKind Opc, SourceLocation OpLoc, Expr *LHSExpr, Expr *RHSExpr)
DiagnoseBitwisePrecedence - Emit a warning when bitwise and comparison operators are mixed in a way t...
static bool isPlaceholderToRemoveAsArg(QualType type)
Is the given type a placeholder that we need to lower out immediately during argument processing?
static void diagnoseArithmeticOnNullPointer(Sema &S, SourceLocation Loc, Expr *Pointer, bool IsGNUIdiom)
Diagnose invalid arithmetic on a null pointer.
static void DiagnoseConditionalPrecedence(Sema &Self, SourceLocation OpLoc, Expr *Condition, const Expr *LHSExpr, const Expr *RHSExpr)
DiagnoseConditionalPrecedence - Emit a warning when a conditional operator and binary operator are mi...
static bool CheckDeclInExpr(Sema &S, SourceLocation Loc, NamedDecl *D, bool AcceptInvalid)
Diagnoses obvious problems with the use of the given declaration as an expression.
static void diagnoseUncapturableValueReferenceOrBinding(Sema &S, SourceLocation loc, ValueDecl *var)
static QualType checkConditionalObjectPointersCompatibility(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc)
Return the resulting type when the operands are both pointers.
static QualType OpenCLCheckVectorConditional(Sema &S, ExprResult &Cond, ExprResult &LHS, ExprResult &RHS, SourceLocation QuestionLoc)
Return the resulting type for the conditional operator in OpenCL (aka "ternary selection operator",...
static void diagnoseLogicalNotOnLHSofCheck(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
Warns on !x < y, !x & y where !(x < y), !(x & y) was probably intended.
static void diagnoseArithmeticOnFunctionPointer(Sema &S, SourceLocation Loc, Expr *Pointer)
Diagnose invalid arithmetic on a function pointer.
static AssignConvertType checkObjCPointerTypesForAssignment(Sema &S, QualType LHSType, QualType RHSType)
checkObjCPointerTypesForAssignment - Compares two objective-c pointer types for assignment compatibil...
static void diagnoseObjCLiteralComparison(Sema &S, SourceLocation Loc, ExprResult &LHS, ExprResult &RHS, BinaryOperator::Opcode Opc)
static bool isParenthetizedAndQualifiedAddressOfExpr(Expr *Fn)
static bool isCapturingReferenceToHostVarInCUDADeviceLambda(const Sema &S, VarDecl *VD)
static UnaryOperatorKind ConvertTokenKindToUnaryOpcode(tok::TokenKind Kind)
static bool isImplicitlyDefinableConstexprFunction(FunctionDecl *Func)
NonConstCaptureKind
Is the given expression (which must be 'const') a reference to a variable which was originally non-co...
static bool tryVectorConvertAndSplat(Sema &S, ExprResult *scalar, QualType scalarTy, QualType vectorEltTy, QualType vectorTy, unsigned &DiagID)
Try to convert a value of non-vector type to a vector type by converting the type to the element type...
static bool isVector(QualType QT, QualType ElementType)
This helper function returns true if QT is a vector type that has element type ElementType.
static void DiagnoseCalleeStaticArrayParam(Sema &S, ParmVarDecl *PVD)
static Expr * recoverFromMSUnqualifiedLookup(Sema &S, ASTContext &Context, DeclarationNameInfo &NameInfo, SourceLocation TemplateKWLoc, const TemplateArgumentListInfo *TemplateArgs)
In Microsoft mode, if we are inside a template class whose parent class has dependent base classes,...
static AssignConvertType checkBlockPointerTypesForAssignment(Sema &S, QualType LHSType, QualType RHSType)
checkBlockPointerTypesForAssignment - This routine determines whether two block pointer types are com...
static void FixDependencyOfIdExpressionsInLambdaWithDependentObjectParameter(Sema &SemaRef, ValueDecl *D, Expr *E)
static bool isVariableCapturable(CapturingScopeInfo *CSI, ValueDecl *Var, SourceLocation Loc, const bool Diagnose, Sema &S)
static bool maybeDiagnoseAssignmentToFunction(Sema &S, QualType DstType, const Expr *SrcExpr)
static void SuggestParentheses(Sema &Self, SourceLocation Loc, const PartialDiagnostic &Note, SourceRange ParenRange)
SuggestParentheses - Emit a note with a fixit hint that wraps ParenRange in parentheses.
static Decl * getPredefinedExprDecl(DeclContext *DC)
getPredefinedExprDecl - Returns Decl of a given DeclContext that can be used to determine the value o...
static CXXRecordDecl * LookupStdSourceLocationImpl(Sema &S, SourceLocation Loc)
static bool IgnoreCommaOperand(const Expr *E, const ASTContext &Context)
static QualType CheckRealImagOperand(Sema &S, ExprResult &V, SourceLocation Loc, bool IsReal)
static QualType checkArithmeticOrEnumeralCompare(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
static QualType CheckIndirectionOperand(Sema &S, Expr *Op, ExprValueKind &VK, SourceLocation OpLoc, bool IsAfterAmp=false)
CheckIndirectionOperand - Type check unary indirection (prefix '*').
static bool CheckAlignOfExpr(Sema &S, Expr *E, UnaryExprOrTypeTrait ExprKind)
static bool ExprLooksBoolean(const Expr *E)
ExprLooksBoolean - Returns true if E looks boolean, i.e.
static bool isPotentiallyConstantEvaluatedContext(Sema &SemaRef)
Are we in a context that is potentially constant evaluated per C++20 [expr.const]p12?
static void DiagnoseSelfAssignment(Sema &S, Expr *LHSExpr, Expr *RHSExpr, SourceLocation OpLoc, bool IsBuiltin)
DiagnoseSelfAssignment - Emits a warning if a value is assigned to itself.
static void diagnoseStringPlusInt(Sema &Self, SourceLocation OpLoc, Expr *LHSExpr, Expr *RHSExpr)
diagnoseStringPlusInt - Emit a warning when adding an integer to a string literal.
static QualType checkConditionalPointerCompatibility(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc)
Checks compatibility between two pointers and return the resulting type.
static void DoMarkVarDeclReferenced(Sema &SemaRef, SourceLocation Loc, VarDecl *Var, Expr *E, llvm::DenseMap< const VarDecl *, int > &RefsMinusAssignments)
static bool ShouldLookupResultBeMultiVersionOverload(const LookupResult &R)
static bool checkCondition(Sema &S, const Expr *Cond, SourceLocation QuestionLoc)
Return false if the condition expression is valid, true otherwise.
static bool checkForArray(const Expr *E)
static void DiagnosedUnqualifiedCallsToStdFunctions(Sema &S, const CallExpr *Call)
static void DiagnoseRecursiveConstFields(Sema &S, const ValueDecl *VD, const RecordType *Ty, SourceLocation Loc, SourceRange Range, OriginalExprKind OEK, bool &DiagnosticEmitted)
static bool areTypesCompatibleForGeneric(ASTContext &Ctx, QualType T, QualType U)
static void MarkExprReferenced(Sema &SemaRef, SourceLocation Loc, Decl *D, Expr *E, bool MightBeOdrUse, llvm::DenseMap< const VarDecl *, int > &RefsMinusAssignments)
static bool MayBeFunctionType(const ASTContext &Context, const Expr *E)
static ExprResult convertVector(Expr *E, QualType ElementType, Sema &S)
Convert vector E to a vector with the same number of elements but different element type.
static void DoMarkPotentialCapture(Sema &SemaRef, SourceLocation Loc, ValueDecl *Var, Expr *E)
static void RecordModifiableNonNullParam(Sema &S, const Expr *Exp)
static void EvaluateAndDiagnoseImmediateInvocation(Sema &SemaRef, Sema::ImmediateInvocationCandidate Candidate)
static bool checkThreeWayNarrowingConversion(Sema &S, QualType ToType, Expr *E, QualType FromType, SourceLocation Loc)
static bool IsArithmeticBinaryExpr(const Expr *E, BinaryOperatorKind *Opcode, const Expr **RHSExprs)
IsArithmeticBinaryExpr - Returns true if E is an arithmetic binary expression, either using a built-i...
static ExprResult convertHalfVecBinOp(Sema &S, ExprResult LHS, ExprResult RHS, BinaryOperatorKind Opc, QualType ResultTy, ExprValueKind VK, ExprObjectKind OK, bool IsCompAssign, SourceLocation OpLoc, FPOptionsOverride FPFeatures)
static QualType handleIntegerConversion(Sema &S, ExprResult &LHS, ExprResult &RHS, QualType LHSType, QualType RHSType, bool IsCompAssign)
Handle integer arithmetic conversions.
static void checkDirectCallValidity(Sema &S, const Expr *Fn, FunctionDecl *Callee, MultiExprArg ArgExprs)
static void ConstructTransparentUnion(Sema &S, ASTContext &C, ExprResult &EResult, QualType UnionType, FieldDecl *Field)
Constructs a transparent union from an expression that is used to initialize the transparent union.
static QualType OpenCLConvertScalarsToVectors(Sema &S, ExprResult &LHS, ExprResult &RHS, QualType CondTy, SourceLocation QuestionLoc)
Convert scalar operands to a vector that matches the condition in length.
static bool checkConditionalNullPointer(Sema &S, ExprResult &NullExpr, QualType PointerTy)
Return false if the NullExpr can be promoted to PointerTy, true otherwise.
static void diagnoseSubtractionOnNullPointer(Sema &S, SourceLocation Loc, Expr *Pointer, bool BothNull)
Diagnose invalid subraction on a null pointer.
static bool checkArithmeticOnObjCPointer(Sema &S, SourceLocation opLoc, Expr *op)
Diagnose if arithmetic on the given ObjC pointer is illegal.
static void RemoveNestedImmediateInvocation(Sema &SemaRef, Sema::ExpressionEvaluationContextRecord &Rec, SmallVector< Sema::ImmediateInvocationCandidate, 4 >::reverse_iterator It)
static void CheckUnicodeArithmeticConversions(Sema &SemaRef, Expr *LHS, Expr *RHS, SourceLocation Loc, ArithConvKind ACK)
static void DiagnoseBitwiseOpInBitwiseOp(Sema &S, BinaryOperatorKind Opc, SourceLocation OpLoc, Expr *SubExpr)
Look for bitwise op in the left or right hand of a bitwise op with lower precedence and emit a diagno...
static QualType CheckIncrementDecrementOperand(Sema &S, Expr *Op, ExprValueKind &VK, ExprObjectKind &OK, SourceLocation OpLoc, bool IsInc, bool IsPrefix)
CheckIncrementDecrementOperand - unlike most "Check" methods, this routine doesn't need to call Usual...
static QualType OpenCLArithmeticConversions(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation QuestionLoc)
Simple conversion between integer and floating point types.
static bool checkVectorResult(Sema &S, QualType CondTy, QualType VecResTy, SourceLocation QuestionLoc)
Return false if the vector condition type and the vector result type are compatible.
static void DiagnoseDivisionSizeofPointerOrArray(Sema &S, Expr *LHS, Expr *RHS, SourceLocation Loc)
static void diagnoseTautologicalComparison(Sema &S, SourceLocation Loc, Expr *LHS, Expr *RHS, BinaryOperatorKind Opc)
Diagnose some forms of syntactically-obvious tautological comparison.
static void warnOnSizeofOnArrayDecay(Sema &S, SourceLocation Loc, QualType T, const Expr *E)
Check whether E is a pointer from a decayed array type (the decayed pointer type is equal to T) and e...
static void DiagnoseBadDivideOrRemainderValues(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsDiv)
static void ConvertUTF8ToWideString(unsigned CharByteWidth, StringRef Source, SmallString< 32 > &Target)
static TypoCorrection TryTypoCorrectionForCall(Sema &S, Expr *Fn, FunctionDecl *FDecl, ArrayRef< Expr * > Args)
static bool hasAnyExplicitStorageClass(const FunctionDecl *D)
Determine whether a FunctionDecl was ever declared with an explicit storage class.
static void DiagnoseBadShiftValues(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc, QualType LHSType)
static bool CheckVecStepTraitOperandType(Sema &S, QualType T, SourceLocation Loc, SourceRange ArgRange)
static bool captureInLambda(LambdaScopeInfo *LSI, ValueDecl *Var, SourceLocation Loc, const bool BuildAndDiagnose, QualType &CaptureType, QualType &DeclRefType, const bool RefersToCapturedVariable, const TryCaptureKind Kind, SourceLocation EllipsisLoc, const bool IsTopScope, Sema &S, bool Invalid)
Capture the given variable in the lambda.
static bool unsupportedTypeConversion(const Sema &S, QualType LHSType, QualType RHSType)
Diagnose attempts to convert between __float128, __ibm128 and long double if there is no support for ...
static void MarkVarDeclODRUsed(ValueDecl *V, SourceLocation Loc, Sema &SemaRef, const unsigned *const FunctionScopeIndexToStopAt=nullptr)
Directly mark a variable odr-used.
static void diagnoseStringPlusChar(Sema &Self, SourceLocation OpLoc, Expr *LHSExpr, Expr *RHSExpr)
Emit a warning when adding a char literal to a string.
static bool CheckForModifiableLvalue(Expr *E, SourceLocation Loc, Sema &S)
CheckForModifiableLvalue - Verify that E is a modifiable lvalue.
static ValueDecl * getPrimaryDecl(Expr *E)
getPrimaryDecl - Helper function for CheckAddressOfOperand().
static void diagnoseUseOfInternalDeclInInlineFunction(Sema &S, const NamedDecl *D, SourceLocation Loc)
Check whether we're in an extern inline function and referring to a variable or function with interna...
static bool funcHasParameterSizeMangling(Sema &S, FunctionDecl *FD)
Return true if this function has a calling convention that requires mangling in the size of the param...
static bool convertPointersToCompositeType(Sema &S, SourceLocation Loc, ExprResult &LHS, ExprResult &RHS)
Returns false if the pointers are converted to a composite type, true otherwise.
static void DiagnoseBinOpPrecedence(Sema &Self, BinaryOperatorKind Opc, SourceLocation OpLoc, Expr *LHSExpr, Expr *RHSExpr)
DiagnoseBinOpPrecedence - Emit warnings for expressions with tricky precedence.
static void diagnoseAddressOfInvalidType(Sema &S, SourceLocation Loc, Expr *E, unsigned Type)
Diagnose invalid operand for address of operations.
static QualType handleComplexIntConversion(Sema &S, ExprResult &LHS, ExprResult &RHS, QualType LHSType, QualType RHSType, bool IsCompAssign)
Handle conversions with GCC complex int extension.
static AssignConvertType checkPointerTypesForAssignment(Sema &S, QualType LHSType, QualType RHSType, SourceLocation Loc)
static bool isMSPropertySubscriptExpr(Sema &S, Expr *Base)
static bool tryGCCVectorConvertAndSplat(Sema &S, ExprResult *Scalar, ExprResult *Vector)
Attempt to convert and splat Scalar into a vector whose types matches Vector following GCC conversion...
static void diagnoseScopedEnums(Sema &S, const SourceLocation Loc, const ExprResult &LHS, const ExprResult &RHS, BinaryOperatorKind Opc)
static void DiagnoseLogicalAndInLogicalOrLHS(Sema &S, SourceLocation OpLoc, Expr *LHSExpr, Expr *RHSExpr)
Look for '&&' in the left hand of a '||' expr.
static void CheckForNullPointerDereference(Sema &S, Expr *E)
static QualType computeConditionalNullability(QualType ResTy, bool IsBin, QualType LHSTy, QualType RHSTy, ASTContext &Ctx)
Compute the nullability of a conditional expression.
static OdrUseContext isOdrUseContext(Sema &SemaRef)
Are we within a context in which references to resolved functions or to variables result in odr-use?
static void DiagnoseConstAssignment(Sema &S, const Expr *E, SourceLocation Loc)
Emit the "read-only variable not assignable" error and print notes to give more information about why...
static Expr * BuildFloatingLiteral(Sema &S, NumericLiteralParser &Literal, QualType Ty, SourceLocation Loc)
static bool IsTypeModifiable(QualType Ty, bool IsDereference)
static bool isVariableAlreadyCapturedInScopeInfo(CapturingScopeInfo *CSI, ValueDecl *Var, bool &SubCapturesAreNested, QualType &CaptureType, QualType &DeclRefType)
static bool checkArithmeticIncompletePointerType(Sema &S, SourceLocation Loc, Expr *Operand)
Emit error if Operand is incomplete pointer type.
static bool CheckExtensionTraitOperandType(Sema &S, QualType T, SourceLocation Loc, SourceRange ArgRange, UnaryExprOrTypeTrait TraitKind)
static void CheckSufficientAllocSize(Sema &S, QualType DestType, const Expr *E)
Check that a call to alloc_size function specifies sufficient space for the destination type.
static QualType checkSizelessVectorShift(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign)
static QualType checkArithmeticOrEnumeralThreeWayCompare(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc)
static ExprResult diagnoseUnknownAnyExpr(Sema &S, Expr *E)
static QualType handleOverflowBehaviorTypeConversion(Sema &S, ExprResult &LHS, ExprResult &RHS, QualType LHSType, QualType RHSType, bool IsCompAssign)
static SourceLocation getUDSuffixLoc(Sema &S, SourceLocation TokLoc, unsigned Offset)
getUDSuffixLoc - Create a SourceLocation for a ud-suffix, given the location of the token and the off...
static bool checkBlockType(Sema &S, const Expr *E)
Return true if the Expr is block type.
static bool captureInBlock(BlockScopeInfo *BSI, ValueDecl *Var, SourceLocation Loc, const bool BuildAndDiagnose, QualType &CaptureType, QualType &DeclRefType, const bool Nested, Sema &S, bool Invalid)
static QualType handleFloatConversion(Sema &S, ExprResult &LHS, ExprResult &RHS, QualType LHSType, QualType RHSType, bool IsCompAssign)
Handle arithmethic conversion with floating point types.
static void diagnoseArithmeticOnVoidPointer(Sema &S, SourceLocation Loc, Expr *Pointer)
Diagnose invalid arithmetic on a void pointer.
static QualType checkVectorShift(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign)
Return the resulting type when a vector is shifted by a scalar or vector shift amount.
static FieldDecl * FindFieldDeclInstantiationPattern(const ASTContext &Ctx, FieldDecl *Field)
ExprResult PerformCastFn(Sema &S, Expr *operand, QualType toType)
static void checkArithmeticNull(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompare)
static bool IsReadonlyMessage(Expr *E, Sema &S)
static std::optional< bool > isTautologicalBoundsCheck(Sema &S, const Expr *LHS, const Expr *RHS, BinaryOperatorKind Opc)
Detect patterns ptr + size >= ptr and ptr + size < ptr, where ptr is a pointer and size is an unsigne...
static void buildLambdaCaptureFixit(Sema &Sema, LambdaScopeInfo *LSI, ValueDecl *Var)
Create up to 4 fix-its for explicit reference and value capture of Var or default capture.
static void tryImplicitlyCaptureThisIfImplicitMemberFunctionAccessWithDependentArgs(Sema &S, const UnresolvedMemberExpr *const UME, SourceLocation CallLoc)
static bool checkPtrAuthTypeDiscriminatorOperandType(Sema &S, QualType T, SourceLocation Loc, SourceRange ArgRange)
static bool CheckVectorElementsTraitOperandType(Sema &S, QualType T, SourceLocation Loc, SourceRange ArgRange)
static void DiagnoseLogicalAndInLogicalOrRHS(Sema &S, SourceLocation OpLoc, Expr *LHSExpr, Expr *RHSExpr)
Look for '&&' in the right hand of a '||' expr.
static QualType getDependentArraySubscriptType(Expr *LHS, Expr *RHS, const ASTContext &Ctx)
static void diagnosePointerIncompatibility(Sema &S, SourceLocation Loc, Expr *LHSExpr, Expr *RHSExpr)
Emit error when two pointers are incompatible.
static bool captureInCapturedRegion(CapturedRegionScopeInfo *RSI, ValueDecl *Var, SourceLocation Loc, const bool BuildAndDiagnose, QualType &CaptureType, QualType &DeclRefType, const bool RefersToCapturedVariable, TryCaptureKind Kind, bool IsTopScope, Sema &S, bool Invalid)
Capture the given variable in the captured region.
static bool enclosingClassIsRelatedToClassInWhichMembersWereFound(const UnresolvedMemberExpr *const UME, Sema &S)
static unsigned GetFixedPointRank(QualType Ty)
Return the rank of a given fixed point or integer type.
static bool CheckObjCTraitOperandConstraints(Sema &S, QualType T, SourceLocation Loc, SourceRange ArgRange, UnaryExprOrTypeTrait TraitKind)
static void diagnoseArithmeticOnTwoFunctionPointers(Sema &S, SourceLocation Loc, Expr *LHS, Expr *RHS)
Diagnose invalid arithmetic on two function pointers.
static bool checkPointerIntegerMismatch(Sema &S, ExprResult &Int, Expr *PointerExpr, SourceLocation Loc, bool IsIntFirstExpr)
Return false if the first expression is not an integer and the second expression is not a pointer,...
static ImplicitConversionKind castKindToImplicitConversionKind(CastKind CK)
static void diagnoseXorMisusedAsPow(Sema &S, const ExprResult &XorLHS, const ExprResult &XorRHS, const SourceLocation Loc)
static bool checkOpenCLConditionVector(Sema &S, Expr *Cond, SourceLocation QuestionLoc)
Return false if this is a valid OpenCL condition vector.
static bool IsArithmeticOp(BinaryOperatorKind Opc)
static bool handleComplexIntegerToFloatConversion(Sema &S, ExprResult &IntExpr, ExprResult &ComplexExpr, QualType IntTy, QualType ComplexTy, bool SkipCast)
Convert complex integers to complex floats and real integers to real floats as required for complex a...
static void checkObjCPointerIntrospection(Sema &S, ExprResult &L, ExprResult &R, SourceLocation OpLoc)
Check if a bitwise-& is performed on an Objective-C pointer.
static void DiagnoseDirectIsaAccess(Sema &S, const ObjCIvarRefExpr *OIRE, SourceLocation AssignLoc, const Expr *RHS)
static ExprResult rebuildUnknownAnyFunction(Sema &S, Expr *fn)
Given a function expression of unknown-any type, try to rebuild it to have a function type.
static QualType handleIntToFloatConversion(Sema &S, ExprResult &FloatExpr, ExprResult &IntExpr, QualType FloatTy, QualType IntTy, bool ConvertFloat, bool ConvertInt)
Handle arithmetic conversion from integer to float.
static bool hasIsEqualMethod(Sema &S, const Expr *LHS, const Expr *RHS)
static QualType handleComplexFloatConversion(Sema &S, ExprResult &Shorter, QualType ShorterType, QualType LongerType, bool PromotePrecision)
static FunctionDecl * rewriteBuiltinFunctionDecl(Sema *Sema, ASTContext &Context, FunctionDecl *FDecl, MultiExprArg ArgExprs)
If a builtin function has a pointer argument with no explicit address space, then it should be able t...
static void DoMarkBindingDeclReferenced(Sema &SemaRef, SourceLocation Loc, BindingDecl *BD, Expr *E)
static PredefinedIdentKind getPredefinedExprKind(tok::TokenKind Kind)
static void DiagnoseUnusedOfDecl(Sema &S, NamedDecl *D, SourceLocation Loc)
static QualType handleFixedPointConversion(Sema &S, QualType LHSTy, QualType RHSTy)
handleFixedPointConversion - Fixed point operations between fixed point types and integers or other f...
static QualType handleComplexConversion(Sema &S, ExprResult &LHS, ExprResult &RHS, QualType LHSType, QualType RHSType, bool IsCompAssign)
Handle arithmetic conversion with complex types.
static QualType CheckCommaOperands(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc)
static bool canCaptureVariableByCopy(ValueDecl *Var, const ASTContext &Context)
static void diagnoseArithmeticOnTwoVoidPointers(Sema &S, SourceLocation Loc, Expr *LHSExpr, Expr *RHSExpr)
Diagnose invalid arithmetic on two void pointers.
static void diagnoseDistinctPointerComparison(Sema &S, SourceLocation Loc, ExprResult &LHS, ExprResult &RHS, bool IsError)
Diagnose bad pointer comparisons.
static bool needsConversionOfHalfVec(bool OpRequiresConversion, ASTContext &Ctx, Expr *E0, Expr *E1=nullptr)
Returns true if conversion between vectors of halfs and vectors of floats is needed.
static bool isObjCObjectLiteral(ExprResult &E)
static NonConstCaptureKind isReferenceToNonConstCapture(Sema &S, Expr *E)
static QualType checkConditionalBlockPointerCompatibility(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc)
Return the resulting type when the operands are both block pointers.
static void DiagnoseShiftCompare(Sema &S, SourceLocation OpLoc, Expr *LHSExpr, Expr *RHSExpr)
static void DiagnoseAdditionInShift(Sema &S, SourceLocation OpLoc, Expr *SubExpr, StringRef Shift)
static void diagnoseFunctionPointerToVoidComparison(Sema &S, SourceLocation Loc, ExprResult &LHS, ExprResult &RHS, bool IsError)
static void EmitDiagnosticForLogicalAndInLogicalOr(Sema &Self, SourceLocation OpLoc, BinaryOperator *Bop)
It accepts a '&&' expr that is inside a '||' one.
static void captureVariablyModifiedType(ASTContext &Context, QualType T, CapturingScopeInfo *CSI)
static bool canConvertIntToOtherIntTy(Sema &S, ExprResult *Int, QualType OtherIntTy)
Test if a (constant) integer Int can be casted to another integer type IntTy without losing precision...
static DeclContext * getParentOfCapturingContextOrNull(DeclContext *DC, ValueDecl *Var, SourceLocation Loc, const bool Diagnose, Sema &S)
static bool isOverflowingIntegerType(ASTContext &Ctx, QualType T)
static void CheckIdentityFieldAssignment(Expr *LHSExpr, Expr *RHSExpr, SourceLocation Loc, Sema &Sema)
static bool isLegalBoolVectorBinaryOp(BinaryOperatorKind Opc)
static ExprResult rebuildPotentialResultsAsNonOdrUsed(Sema &S, Expr *E, NonOdrUseReason NOUR)
Walk the set of potential results of an expression and mark them all as non-odr-uses if they satisfy ...
static void CheckCompleteParameterTypesForMangler(Sema &S, FunctionDecl *FD, SourceLocation Loc)
Require that all of the parameter types of function be complete.
static bool isScopedEnumerationType(QualType T)
static bool checkArithmeticBinOpPointerOperands(Sema &S, SourceLocation Loc, Expr *LHSExpr, Expr *RHSExpr)
Check the validity of a binary arithmetic operation w.r.t.
static bool breakDownVectorType(QualType type, uint64_t &len, QualType &eltType)
This file declares semantic analysis for HLSL constructs.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis for OpenMP constructs and clauses.
This file declares semantic analysis for expressions involving.
static bool isInvalid(LocType Loc, bool *Invalid)
Defines the SourceManager interface.
Defines various enumerations that describe declaration and type specifiers.
static QualType getPointeeType(const MemRegion *R)
Defines the clang::TypeLoc interface and its subclasses.
Defines enumerations for the type traits support.
C Language Family Type Representation.
@ Open
The standard open() call: int open(const char *path, int oflag, ...);.
a trap message and trap category.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
std::string getAsString(const ASTContext &Ctx, QualType Ty) const
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
BuiltinVectorTypeInfo getBuiltinVectorTypeInfo(const BuiltinType *VecTy) const
Returns the element type, element count and number of vectors (in case of tuple) for a builtin vector...
unsigned getIntWidth(QualType T) const
const llvm::fltSemantics & getFloatTypeSemantics(QualType T) const
Return the APFloat 'semantics' for the specified scalar floating point type.
QualType getBlockPointerType(QualType T) const
Return the uniqued reference to the type for a block of the specified type.
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
DeclarationNameTable DeclarationNames
int getIntegerTypeOrder(QualType LHS, QualType RHS) const
Return the highest ranked integer type, see C99 6.3.1.8p1.
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType, const Attr *attr=nullptr) const
QualType getScalableVectorType(QualType EltTy, unsigned NumElts, unsigned NumFields=1) const
Return the unique reference to a scalable vector type of the specified element type and scalable numb...
QualType getFunctionNoProtoType(QualType ResultTy, const FunctionType::ExtInfo &Info) const
Return a K&R style C function type like 'int()'.
QualType getCorrespondingSignedFixedPointType(QualType Ty) const
QualType getVectorType(QualType VectorType, unsigned NumElts, VectorKind VecKind) const
Return the unique reference to a vector type of the specified element type and size.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
QualType getReferenceQualifiedType(const Expr *e) const
getReferenceQualifiedType - Given an expr, will return the type for that expression,...
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const
Return the uniqued reference to the type for an lvalue reference to the specified type.
const LangOptions & getLangOpts() const
CanQualType getLogicalOperationType() const
The result type of logical operations, '<', '>', '!=', etc.
const QualType GetHigherPrecisionFPType(QualType ElementType) const
bool typesAreBlockPointerCompatible(QualType, QualType)
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
llvm::SetVector< const VarDecl * > CUDADeviceVarODRUsedByHost
Keep track of CUDA/HIP device-side variables ODR-used by host code.
llvm::SetVector< const ValueDecl * > CUDAExternalDeviceDeclODRUsedByHost
Keep track of CUDA/HIP external kernels or device variables ODR-used by host code.
int getFloatingTypeOrder(QualType LHS, QualType RHS) const
Compare the rank of the two specified floating point types, ignoring the domain of the type (i....
GVALinkage GetGVALinkageForFunction(const FunctionDecl *FD) const
QualType getCorrespondingSaturatedType(QualType Ty) const
CanQualType BoundMemberTy
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
llvm::FixedPointSemantics getFixedPointSemantics(QualType Ty) const
QualType mergeTypes(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false, bool BlockReturnType=false, bool IsConditionalOperator=false)
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CanQualType UnsignedCharTy
FieldDecl * getInstantiatedFromUnnamedFieldDecl(FieldDecl *Field) const
QualType getArrayDecayedType(QualType T) const
Return the properly qualified result of decaying the specified array type to a pointer.
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
QualType getPromotedIntegerType(QualType PromotableType) const
Return the type that PromotableType will promote to: C99 6.3.1.1p2, assuming that PromotableType is a...
QualType getComplexType(QualType T) const
Return the uniqued reference to the type for a complex number with the specified element type.
bool hasDirectOwnershipQualifier(QualType Ty) const
Return true if the type has been explicitly qualified with ObjC ownership.
QualType getExtVectorType(QualType VectorType, unsigned NumElts) const
Return the unique reference to an extended vector type of the specified element type and size.
const TargetInfo & getTargetInfo() const
QualType getOverflowBehaviorType(const OverflowBehaviorAttr *Attr, QualType Wrapped) const
std::optional< CharUnits > getTypeSizeInCharsIfKnown(QualType Ty) const
void getFunctionFeatureMap(llvm::StringMap< bool > &FeatureMap, const FunctionDecl *) const
QualType getCorrespondingUnsignedType(QualType T) const
bool typesAreCompatible(QualType T1, QualType T2, bool CompareUnqualified=false)
Compatibility predicates used to check assignment expressions.
QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const
Return the uniqued reference to the type for an address space qualified type with the specified type ...
unsigned getTargetAddressSpace(LangAS AS) const
bool isPromotableIntegerType(QualType T) const
More type predicates useful for type checking/promotion.
static bool hasSameUnqualifiedType(QualType T1, QualType T2)
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
QualType getCommonSugaredType(QualType X, QualType Y, bool Unqualified=false) const
uint64_t getCharWidth() const
Return the size of the character type, in bits.
AddrLabelExpr - The GNU address of label extension, representing &&label.
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
SourceLocation getExprLoc() const LLVM_READONLY
Wrapper for source info for arrays.
Represents an array type, per C99 6.7.5.2 - Array Declarators.
ArraySizeModifier getSizeModifier() const
QualType getElementType() const
AsTypeExpr - Clang builtin function __builtin_astype [OpenCL 6.2.4.2] This AST node provides support ...
Attr - This represents one attribute.
SourceRange getRange() const
BinaryConditionalOperator - The GNU extension to the conditional operator which allows the middle ope...
A builtin binary operation expression such as "x + y" or "x <= y".
static bool isRelationalOp(Opcode Opc)
static OverloadedOperatorKind getOverloadedOperator(Opcode Opc)
Retrieve the overloaded operator kind that corresponds to the given binary opcode.
static bool isComparisonOp(Opcode Opc)
StringRef getOpcodeStr() const
bool isRelationalOp() const
SourceLocation getOperatorLoc() const
bool isMultiplicativeOp() const
static StringRef getOpcodeStr(Opcode Op)
getOpcodeStr - Turn an Opcode enum value into the punctuation char it corresponds to,...
static BinaryOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)
bool isAdditiveOp() const
static bool isAssignmentOp(Opcode Opc)
static bool isCompoundAssignmentOp(Opcode Opc)
static bool isNullPointerArithmeticExtension(ASTContext &Ctx, Opcode Opc, const Expr *LHS, const Expr *RHS)
Return true if a binary operator using the specified opcode and operands would match the 'p = (i8*)nu...
bool isAssignmentOp() const
static Opcode getOverloadedOpcode(OverloadedOperatorKind OO)
Retrieve the binary opcode that corresponds to the given overloaded operator.
static bool isEqualityOp(Opcode Opc)
static bool isBitwiseOp(Opcode Opc)
BinaryOperatorKind Opcode
A binding in a decomposition declaration.
A class which contains all the information about a particular captured value.
Represents a block literal declaration, which is like an unnamed FunctionDecl.
void setParams(ArrayRef< ParmVarDecl * > NewParamInfo)
void setSignatureAsWritten(TypeSourceInfo *Sig)
void setBlockMissingReturnType(bool val=true)
void setIsVariadic(bool value)
SourceLocation getCaretLocation() const
void setBody(CompoundStmt *B)
ArrayRef< ParmVarDecl * > parameters() const
void setCaptures(ASTContext &Context, ArrayRef< Capture > Captures, bool CapturesCXXThis)
static BlockDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L)
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
This class is used for builtin types like 'int'.
static CUDAKernelCallExpr * Create(const ASTContext &Ctx, Expr *Fn, CallExpr *Config, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RP, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0)
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).
Represents a call to a C++ constructor.
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
Represents a C++ constructor within a class.
Represents a C++ conversion function within a class.
bool isLambdaToBlockPointerConversion() const
Determine whether this conversion function is a conversion from a lambda closure type to a block poin...
Represents a C++ base or member initializer.
A default argument (C++ [dcl.fct.default]).
static CXXDefaultArgExpr * Create(const ASTContext &C, SourceLocation Loc, ParmVarDecl *Param, Expr *RewrittenExpr, DeclContext *UsedContext)
A use of a default initializer in a constructor or in aggregate initialization.
static CXXDefaultInitExpr * Create(const ASTContext &Ctx, SourceLocation Loc, FieldDecl *Field, DeclContext *UsedContext, Expr *RewrittenInitExpr)
Field is the non-static data member whose default initializer is used by this expression.
Expr * getExpr()
Get the initialization expression that will be used.
static CXXDependentScopeMemberExpr * Create(const ASTContext &Ctx, Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierFoundInScope, DeclarationNameInfo MemberNameInfo, const TemplateArgumentListInfo *TemplateArgs)
Represents a C++ destructor within a class.
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.
CXXMethodDecl * getDevirtualizedMethod(const Expr *Base, bool IsAppleKext)
If it's possible to devirtualize a call to this method, return the called function.
A call to an overloaded operator written using operator syntax.
SourceLocation getOperatorLoc() const
Returns the location of the operator symbol in the expression.
SourceRange getSourceRange() const
static CXXParenListInitExpr * Create(ASTContext &C, ArrayRef< Expr * > Args, QualType T, unsigned NumUserSpecifiedExprs, SourceLocation InitLoc, SourceLocation LParenLoc, SourceLocation RParenLoc)
Represents a C++ pseudo-destructor (C++ [expr.pseudo]).
Represents a C++ struct/union/class.
bool isStandardLayout() const
Determine whether this class is standard-layout per C++ [class]p7.
bool hasAnyDependentBases() const
Determine whether this class has any dependent base classes which are not the current instantiation.
bool isLambda() const
Determine whether this class describes a lambda function object.
unsigned getNumBases() const
Retrieves the number of base classes of this class.
const CXXRecordDecl * getTemplateInstantiationPattern() const
Retrieve the record declaration from which this record could be instantiated.
bool hasDefinition() const
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
unsigned getNumVBases() const
Retrieves the number of virtual base classes of this class.
bool isDerivedFrom(const CXXRecordDecl *Base) const
Determine whether this class is derived from the class Base.
static CXXReflectExpr * Create(ASTContext &C, SourceLocation OperatorLoc, TypeSourceInfo *TL)
Represents a C++ nested-name-specifier or a global scope specifier.
bool isNotEmpty() const
A scope specifier is present, but may be valid or invalid.
bool isValid() const
A scope specifier is present, and it refers to a real scope.
void MakeTrivial(ASTContext &Context, NestedNameSpecifier Qualifier, SourceRange R)
Make a new nested-name-specifier from incomplete source-location information.
SourceRange getRange() const
SourceLocation getBeginLoc() const
bool isSet() const
Deprecated.
NestedNameSpecifier getScopeRep() const
Retrieve the representation of the nested-name-specifier.
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
bool isInvalid() const
An error occurred during parsing of the scope specifier.
bool isEmpty() const
No scope specifier.
void Adopt(NestedNameSpecifierLoc Other)
Adopt an existing nested-name-specifier (with source-range information).
Represents the this expression in C++.
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
void setArg(unsigned Arg, Expr *ArgExpr)
setArg - Set the specified argument.
static CallExpr * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RParenLoc, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0, ADLCallKind UsesADL=NotADL)
Create a call expression.
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
void computeDependence()
Compute and set dependence bits.
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this call.
QualType withConst() const
Retrieves a version of this type with const applied.
CanQual< T > getUnqualifiedType() const
Retrieve the unqualified form of this type.
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
CastKind getCastKind() const
const char * getCastKindName() const
CharLiteralParser - Perform interpretation and semantic analysis of a character literal.
Represents a byte-granular source range.
static CharSourceRange getCharRange(SourceRange R)
static CharSourceRange getTokenRange(SourceRange R)
CharUnits - This is an opaque type for sizes expressed in character units.
bool isZero() const
isZero - Test whether the quantity equals zero.
static CharUnits One()
One - Construct a CharUnits quantity of one.
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
unsigned getValue() const
ChooseExpr - GNU builtin-in function __builtin_choose_expr.
Complex values, per C99 6.2.5p11.
QualType getElementType() const
static CompoundAssignOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures, QualType CompLHSType=QualType(), QualType CompResultType=QualType())
CompoundLiteralExpr - [C99 6.5.2.5].
CompoundStmt - This represents a group of statements like { stmt stmt }.
ConditionalOperator - The ?
Represents the canonical version of C arrays with a specified constant size.
llvm::APInt getSize() const
Return the constant array size as an APInt.
uint64_t getZExtSize() const
Return the size zero-extended as a uint64_t.
ConstantExpr - An expression that occurs in a constant context and optionally the result of evaluatin...
static ConstantResultStorageKind getStorageKind(const APValue &Value)
void MoveIntoResult(APValue &Value, const ASTContext &Context)
SourceLocation getBeginLoc() const LLVM_READONLY
static ConstantExpr * Create(const ASTContext &Context, Expr *E, const APValue &Result)
bool isImmediateInvocation() const
Represents a concrete matrix type with constant number of rows and columns.
unsigned getNumColumns() const
Returns the number of columns in the matrix.
unsigned getNumRows() const
Returns the number of rows in the matrix.
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Base class for callback objects used by Sema::CorrectTypo to check the validity of a potential typo c...
void setTypoName(const IdentifierInfo *II)
void setTypoNNS(NestedNameSpecifier NNS)
Wrapper for source info for pointers decayed from arrays and functions.
A POD class for pairing a NamedDecl* with an access specifier.
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
bool isRequiresExprBody() const
DeclContextLookupResult lookup_result
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
bool containsDecl(Decl *D) const
Checks whether a declaration is in this context.
RecordDecl * getOuterLexicalRecordContext()
Retrieve the outermost lexically enclosing record context.
bool isFunctionOrMethod() const
DeclContext * getLookupParent()
Find the parent context of this context that will be used for unqualified name lookup.
bool Encloses(const DeclContext *DC) const
Determine whether this declaration context semantically encloses the declaration context DC.
A reference to a declared variable, function, enum, etc.
NamedDecl * getFoundDecl()
Get the NamedDecl through which this reference occurred.
bool hasExplicitTemplateArgs() const
Determines whether this declaration reference was followed by an explicit template argument list.
NestedNameSpecifier getQualifier() const
If the name was qualified, retrieves the nested-name-specifier that precedes the name.
bool refersToEnclosingVariableOrCapture() const
Does this DeclRefExpr refer to an enclosing local or a captured variable?
void setDecl(ValueDecl *NewD)
void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const
Copies the template arguments (if present) into the given structure.
DeclarationNameInfo getNameInfo() const
SourceLocation getTemplateKeywordLoc() const
Retrieve the location of the template keyword preceding this name, if any.
static DeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *D, bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc, QualType T, ExprValueKind VK, NamedDecl *FoundD=nullptr, const TemplateArgumentListInfo *TemplateArgs=nullptr, NonOdrUseReason NOUR=NOUR_None)
bool hasQualifier() const
Determine whether this declaration reference was preceded by a C++ nested-name-specifier,...
NestedNameSpecifierLoc getQualifierLoc() const
If the name was qualified, retrieves the nested-name-specifier that precedes the name,...
SourceLocation getBeginLoc() const
SourceLocation getLocation() const
Decl - This represents one declaration (or definition), e.g.
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
AvailabilityResult getAvailability(std::string *Message=nullptr, VersionTuple EnclosingVersion=VersionTuple(), StringRef *RealizedPlatform=nullptr) const
Determine the availability of the given declaration.
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
void markUsed(ASTContext &C)
Mark the declaration used, in the sense of odr-use.
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
bool isInvalidDecl() const
SourceLocation getLocation() const
void setReferenced(bool R=true)
DeclContext * getDeclContext()
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
std::string getAsString() const
Retrieve the human-readable string for this name.
@ CXXConversionFunctionName
NameKind getNameKind() const
Determine what kind of name this is.
bool isIdentifier() const
Predicate functions for querying what type of name this is.
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
TypeSourceInfo * getTypeSourceInfo() const
Information about one declarator, including the parsed type information and the identifier.
DeclaratorContext getContext() const
SourceLocation getBeginLoc() const LLVM_READONLY
bool isInvalidType() const
const IdentifierInfo * getIdentifier() const
static DependentScopeDeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs)
A little helper class used to produce diagnostics.
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
bool getSuppressSystemWarnings() const
bool ShouldVisitImplicitCode
virtual bool VisitStmt(MaybeConst< Stmt > *S)
virtual bool TraverseStmt(MaybeConst< Stmt > *S)
virtual bool TraverseTemplateArgument(const TemplateArgument &Arg)
Represents a reference to emded data.
RAII object that enters a new expression evaluation context.
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
ExplicitCastExpr - An explicit cast written in the source code.
QualType getTypeAsWritten() const
getTypeAsWritten - Returns the type that this expression is casting to, as written in the source code...
static ExprWithCleanups * Create(const ASTContext &C, EmptyShell empty, unsigned numObjects)
This represents one expression.
bool EvaluateAsInt(EvalResult &Result, const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects, bool InConstantContext=false) const
EvaluateAsInt - Return true if this is a constant which we can fold and convert to an integer,...
bool isIntegerConstantExpr(const ASTContext &Ctx) const
Expr * IgnoreParenNoopCasts(const ASTContext &Ctx) LLVM_READONLY
Skip past any parentheses and casts which do not change the value (including ptr->int casts of the sa...
isModifiableLvalueResult isModifiableLvalue(ASTContext &Ctx, SourceLocation *Loc=nullptr) const
isModifiableLvalue - C99 6.3.2.1: an lvalue that does not have array type, does not have an incomplet...
@ SE_AllowSideEffects
Allow any unmodeled side effect.
static QualType findBoundMemberType(const Expr *expr)
Given an expression of bound-member type, find the type of the member.
llvm::APSInt EvaluateKnownConstIntCheckOverflow(const ASTContext &Ctx, SmallVectorImpl< PartialDiagnosticAt > *Diag=nullptr) const
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
LValueClassification ClassifyLValue(ASTContext &Ctx) const
Reasons why an expression might not be an l-value.
bool isValueDependent() const
Determines whether the value of this expression depends on.
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
bool containsUnexpandedParameterPack() const
Whether this expression contains an unexpanded parameter pack (for C++11 variadic templates).
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
Expr * IgnoreImplicit() LLVM_READONLY
Skip past any implicit AST nodes which might surround this expression until reaching a fixed point.
Expr * IgnoreConversionOperatorSingleStep() LLVM_READONLY
Skip conversion operators.
bool containsErrors() const
Whether this expression contains subexpressions which had errors.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
bool isLValue() const
isLValue - True if this expression is an "l-value" according to the rules of the current language.
static bool hasAnyTypeDependentArguments(ArrayRef< Expr * > Exprs)
hasAnyTypeDependentArguments - Determines if any of the expressions in Exprs is type-dependent.
@ NPC_ValueDependentIsNull
Specifies that a value-dependent expression of integral or dependent type should be considered a null...
@ NPC_NeverValueDependent
Specifies that the expression should never be value-dependent.
@ NPC_ValueDependentIsNotNull
Specifies that a value-dependent expression should be considered to never be a null pointer constant.
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
bool EvaluateAsRValue(EvalResult &Result, const ASTContext &Ctx, bool InConstantContext=false) const
EvaluateAsRValue - Return true if this is a constant which we can fold to an rvalue using any crazy t...
bool HasSideEffects(const ASTContext &Ctx, bool IncludePossibleEffects=true) const
HasSideEffects - This routine returns true for all those expressions which have any effect other than...
bool EvaluateAsConstantExpr(EvalResult &Result, const ASTContext &Ctx, ConstantExprKind Kind=ConstantExprKind::Normal) const
Evaluate an expression that is required to be a constant expression.
bool isInstantiationDependent() const
Whether this expression is instantiation-dependent, meaning that it depends in some way on.
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
NullPointerConstantKind
Enumeration used to describe the kind of Null pointer constant returned from isNullPointerConstant().
@ NPCK_ZeroExpression
Expression is a Null pointer constant built from a zero integer expression that is not a simple,...
@ NPCK_ZeroLiteral
Expression is a Null pointer constant built from a literal zero.
@ NPCK_CXX11_nullptr
Expression is a C++11 nullptr.
@ NPCK_NotNull
Expression is not a Null pointer constant.
NullPointerConstantKind isNullPointerConstant(ASTContext &Ctx, NullPointerConstantValueDependence NPC) const
isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to a Null pointer constant.
QualType getEnumCoercedType(const ASTContext &Ctx) const
If this expression is an enumeration constant, return the enumeration type under which said constant ...
void setValueKind(ExprValueKind Cat)
setValueKind - Set the value kind produced by this expression.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
static bool isSameComparisonOperand(const Expr *E1, const Expr *E2)
Checks that the two Expr's will refer to the same value as a comparison operand.
void setObjectKind(ExprObjectKind Cat)
setObjectKind - Set the object kind produced by this expression.
bool refersToBitField() const
Returns true if this expression is a gl-value that potentially refers to a bit-field.
@ MLV_DuplicateVectorComponents
@ MLV_InvalidMessageExpression
@ MLV_DuplicateMatrixComponents
@ MLV_ConstQualifiedField
@ MLV_SubObjCPropertySetting
bool isOrdinaryOrBitFieldObject() const
bool hasPlaceholderType() const
Returns whether this expression has a placeholder type.
static ExprValueKind getValueKindForType(QualType T)
getValueKindForType - Given a formal return or parameter type, give its value kind.
bool isKnownToHaveBooleanValue(bool Semantic=true) const
isKnownToHaveBooleanValue - Return true if this is an integer expression that is known to return 0 or...
ExtVectorElementExpr - This represents access to specific elements of a vector, and may occur on the ...
ExtVectorType - Extended vector type.
Represents difference between two FPOptions values.
bool isFPConstrained() const
RoundingMode getRoundingMode() const
Represents a member of a struct/union/class.
bool isBitField() const
Determines whether this field is a bitfield.
bool hasInClassInitializer() const
Determine whether this member has a C++11 default member initializer.
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...
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 CreateRemoval(CharSourceRange RemoveRange)
Create a code modification hint that removes the given source range.
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.
static FixedPointLiteral * CreateFromRawInt(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l, unsigned Scale)
static FloatingLiteral * Create(const ASTContext &C, const llvm::APFloat &V, bool isexact, QualType Type, SourceLocation L)
const Expr * getSubExpr() const
bool ValidateCandidate(const TypoCorrection &candidate) override
Simple predicate used by the default RankCandidate to determine whether to return an edit distance of...
Represents a function declaration or definition.
static FunctionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation NLoc, DeclarationName N, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin=false, bool isInlineSpecified=false, bool hasWrittenPrototype=true, ConstexprSpecKind ConstexprKind=ConstexprSpecKind::Unspecified, const AssociatedConstraint &TrailingRequiresClause={})
const ParmVarDecl * getParamDecl(unsigned i) const
unsigned getMinRequiredArguments() const
Returns the minimum number of arguments needed to call this function.
bool isImmediateFunction() const
SourceRange getReturnTypeSourceRange() const
Attempt to compute an informative source range covering the function return type.
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
bool hasCXXExplicitFunctionObjectParameter() const
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
QualType getReturnType() const
ArrayRef< ParmVarDecl * > parameters() const
bool hasPrototype() const
Whether this function has a prototype, either because one was explicitly written or because it was "i...
bool isExternC() const
Determines whether this function is a function with external, C linkage.
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
bool isImmediateEscalating() const
bool isOverloadedOperator() const
Whether this function declaration represents an C++ overloaded operator, e.g., "operator+".
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
size_t param_size() const
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
SourceRange getParametersSourceRange() const
Attempt to compute an informative source range covering the function parameters, including the ellips...
QualType getCallResultType() const
Determine the type of an expression that calls this function.
Represents a reference to a function parameter pack, init-capture pack, or binding pack that has been...
SourceLocation getParameterPackLocation() const
Get the location of the parameter pack.
Represents a prototype with parameter type info, e.g.
ExtParameterInfo getExtParameterInfo(unsigned I) const
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
bool isParamConsumed(unsigned I) const
unsigned getNumParams() const
QualType getParamType(unsigned i) const
bool isVariadic() const
Whether this function prototype is variadic.
ExtProtoInfo getExtProtoInfo() const
ArrayRef< QualType > getParamTypes() const
ArrayRef< QualType > param_types() const
Declaration of a template function.
unsigned getNumParams() const
ParmVarDecl * getParam(unsigned i) const
SourceLocation getLocalRangeEnd() const
TypeLoc getReturnLoc() const
SourceLocation getLocalRangeBegin() const
A class which abstracts out some details necessary for making a call.
ExtInfo withNoReturn(bool noReturn) const
ParameterABI getABI() const
Return the ABI treatment of this parameter.
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
bool getNoReturnAttr() const
Determine whether this function type includes the GNU noreturn attribute.
bool getCFIUncheckedCalleeAttr() const
Determine whether this is a function prototype that includes the cfi_unchecked_callee attribute.
QualType getReturnType() const
bool getCmseNSCallAttr() const
QualType getCallResultType(const ASTContext &Context) const
Determine the type of an expression that calls a function of this type.
GNUNullExpr - Implements the GNU __null extension, which is a name for a null pointer constant that h...
static GenericSelectionExpr * Create(const ASTContext &Context, SourceLocation GenericLoc, Expr *ControllingExpr, ArrayRef< TypeSourceInfo * > AssocTypes, ArrayRef< Expr * > AssocExprs, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack, unsigned ResultIndex)
Create a non-result-dependent generic selection expression accepting an expression predicate.
One of these records is kept for each identifier that is lexed.
bool isEditorPlaceholder() const
Return true if this identifier is an editor placeholder.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
ImaginaryLiteral - We support imaginary integer and floating point literals, like "1....
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
ImplicitConversionSequence - Represents an implicit conversion sequence, which may be a standard conv...
Represents a field injected from an anonymous union/struct into the parent scope.
Describes an C or C++ initializer list.
Describes the kind of initialization being performed, along with location information for tokens rela...
static InitializationKind CreateCopy(SourceLocation InitLoc, SourceLocation EqualLoc, bool AllowExplicitConvs=false)
Create a copy initialization.
static InitializationKind CreateDirectList(SourceLocation InitLoc)
static InitializationKind CreateCStyleCast(SourceLocation StartLoc, SourceRange TypeRange, bool InitList)
Create a direct initialization for a C-style cast.
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.
Describes an entity that is being initialized.
void setParameterCFAudited()
static InitializedEntity InitializeStmtExprResult(SourceLocation ReturnLoc, QualType Type)
static InitializedEntity InitializeTemporary(QualType Type)
Create the initialization entity for a temporary.
static InitializedEntity InitializeBlock(SourceLocation BlockVarLoc, QualType Type)
static InitializedEntity InitializeParameter(ASTContext &Context, ParmVarDecl *Parm)
Create the initialization entity for a parameter.
static InitializedEntity InitializeCompoundLiteralInit(TypeSourceInfo *TSI)
Create the entity for a compound literal initializer.
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
Represents the declaration of a label.
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
CXXMethodDecl * getCallOperator() const
Retrieve the function call operator associated with this lambda expression.
FPEvalMethodKind
Possible float expression evaluation method choices.
@ FEM_Extended
Use extended type for fp arithmetic.
@ FEM_Double
Use the type double for fp arithmetic.
@ FEM_UnsetOnCommandLine
Used only for FE option processing; this is only used to indicate that the user did not specify an ex...
@ FEM_Source
Use the declared type for fp arithmetic.
@ CX_Promoted
Implementation of complex division using algebraic formulas at higher precision.
@ None
Permit no implicit vector bitcasts.
@ Integer
Permit vector bitcasts between integer vectors with different numbers of elements but the same total ...
@ All
Permit vector bitcasts between all vectors with the same total bit-width.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
clang::ObjCRuntime ObjCRuntime
bool isSignedOverflowDefined() const
bool allowArrayReturnTypes() const
unsigned getOpenCLCompatibleVersion() const
Return the OpenCL version that kernel language is compatible with.
static StringRef getSourceText(CharSourceRange Range, const SourceManager &SM, const LangOptions &LangOpts, bool *Invalid=nullptr)
Returns a string for the source that the range encompasses.
static SourceLocation AdvanceToTokenCharacter(SourceLocation TokStart, unsigned Characters, const SourceManager &SM, const LangOptions &LangOpts)
AdvanceToTokenCharacter - If the current SourceLocation specifies a location at the start of a token,...
static std::string Stringify(StringRef Str, bool Charify=false)
Stringify - Convert the specified string into a C string by i) escaping '\' and " characters and ii) ...
Represents the results of name lookup.
DeclClass * getAsSingle() const
MS property subscript expression.
Keeps track of the mangled names of lambda expressions and block literals within a particular context...
virtual unsigned getManglingNumber(const CXXMethodDecl *CallOperator)=0
Retrieve the mangling number of a new lambda expression with the given call operator within this cont...
MatrixSingleSubscriptExpr - Matrix single subscript expression for the MatrixType extension when you ...
MatrixSubscriptExpr - Matrix subscript expression for the MatrixType extension.
Represents a matrix type, as defined in the Matrix Types clang extensions.
QualType getElementType() const
Returns type of the elements being stored in the matrix.
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
SourceLocation getMemberLoc() const
getMemberLoc - Return the location of the "member", in X->F, it is the location of 'F'.
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
static MemberExpr * Create(const ASTContext &C, Expr *Base, bool IsArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *MemberDecl, DeclAccessPair FoundDecl, DeclarationNameInfo MemberNameInfo, const TemplateArgumentListInfo *TemplateArgs, QualType T, ExprValueKind VK, ExprObjectKind OK, NonOdrUseReason NOUR)
bool performsVirtualDispatch(const LangOptions &LO) const
Returns true if virtual dispatch is performed.
SourceLocation getBeginLoc() const LLVM_READONLY
This represents a decl that may have a name.
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
std::string getQualifiedNameAsString() const
Linkage getFormalLinkage() const
Get the linkage from a semantic point of view.
bool isExternallyVisible() const
bool isCXXClassMember() const
Determine whether this declaration is a C++ class member.
Represent a C++ namespace.
A C++ nested-name-specifier augmented with source location information.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
CXXRecordDecl * getAsRecordDecl() const
Retrieve the record declaration stored in this nested name specifier, or null.
@ Type
A type, stored as a Type*.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
NumericLiteralParser - This performs strict semantic analysis of the content of a ppnumber,...
Represents an ObjC class declaration.
bool hasDefinition() const
Determine whether this class has been defined.
ivar_iterator ivar_begin() const
ObjCInterfaceDecl * getSuperClass() const
Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...
ObjCIsaExpr - Represent X->isa and X.isa when X is an ObjC 'id' type.
ObjCIvarDecl - Represents an ObjC instance variable.
ObjCIvarRefExpr - A reference to an ObjC instance variable.
SourceLocation getBeginLoc() const LLVM_READONLY
SourceLocation getLocation() const
SourceLocation getOpLoc() const
SourceLocation getEndLoc() const LLVM_READONLY
const Expr * getBase() const
An expression that sends a message to the given Objective-C object or class.
const ObjCMethodDecl * getMethodDecl() const
ObjCMethodDecl - Represents an instance or class method declaration.
ImplicitParamDecl * getSelfDecl() const
bool isClassMethod() const
Represents a pointer to an Objective C object.
const ObjCInterfaceType * getInterfaceType() const
If this pointer points to an Objective C @interface type, gets the type for that interface.
Represents one property declaration in an Objective-C interface.
Represents an Objective-C protocol declaration.
bool allowsSizeofAlignof() const
Does this runtime allow sizeof or alignof on object types?
bool allowsPointerArithmetic() const
Does this runtime allow pointer arithmetic on objects?
static OffsetOfExpr * Create(const ASTContext &C, QualType type, SourceLocation OperatorLoc, TypeSourceInfo *tsi, ArrayRef< OffsetOfNode > comps, ArrayRef< Expr * > exprs, SourceLocation RParenLoc)
Helper class for OffsetOfExpr.
void * getAsOpaquePtr() const
static OpaquePtr getFromOpaquePtr(void *P)
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
@ CSK_Normal
Normal lookup.
SmallVectorImpl< OverloadCandidate >::iterator iterator
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.
ParenExpr - This represents a parenthesized expression, e.g.
SourceLocation getBeginLoc() const LLVM_READONLY
const Expr * getSubExpr() const
bool isProducedByFoldExpansion() const
Expr * getExpr(unsigned Init)
static ParenListExpr * Create(const ASTContext &Ctx, SourceLocation LParenLoc, ArrayRef< Expr * > Exprs, SourceLocation RParenLoc)
Create a paren list.
unsigned getNumExprs() const
Return the number of expressions in this paren list.
SourceLocation getLParenLoc() const
SourceLocation getRParenLoc() const
Represents a parameter to a function.
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
static ParmVarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S, Expr *DefArg)
bool isEquivalent(PointerAuthQualifier Other) const
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
static PredefinedExpr * Create(const ASTContext &Ctx, SourceLocation L, QualType FNTy, PredefinedIdentKind IK, bool IsTransparent, StringLiteral *SL)
Create a PredefinedExpr.
static std::string ComputeName(PredefinedIdentKind IK, const Decl *CurrentDecl, bool ForceElaboratedPrinting=false)
bool isMacroDefined(StringRef Id)
IdentifierTable & getIdentifierTable()
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool hasQualifiers() const
Determine whether this type has any qualifiers.
bool hasNonTrivialToPrimitiveCopyCUnion() const
Check if this is or contains a C union that is non-trivial to copy, which is a union that has a membe...
QualType getNonLValueExprType(const ASTContext &Context) const
Determine the type of a (typically non-lvalue) expression with the specified result type.
bool isNonWeakInMRRWithObjCWeak(const ASTContext &Context) const
bool isAddressSpaceOverlapping(QualType T, const ASTContext &Ctx) const
Returns true if address space qualifiers overlap with T address space qualifiers.
QualType withConst() const
void addConst()
Add the const type qualifier to this QualType.
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.
bool hasNonTrivialToPrimitiveDestructCUnion() const
Check if this is or contains a C union that is non-trivial to destruct, which is a union that has a m...
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
bool isCXX98PODType(const ASTContext &Context) const
Return true if this is a POD type according to the rules of the C++98 standard, regardless of the cur...
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of 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.
bool isWebAssemblyReferenceType() const
Returns true if it is a WebAssembly Reference Type.
QualType withCVRQualifiers(unsigned CVR) const
bool isCForbiddenLValueType() const
Determine whether expressions of the given type are forbidden from being lvalues in C.
bool isConstQualified() const
Determine whether this type is const-qualified.
QualType getAtomicUnqualifiedType() const
Remove all qualifiers including _Atomic.
DestructionKind isDestructedType() const
Returns a nonzero value if objects of this type require non-trivial work to clean up after.
QualType getSingleStepDesugaredType(const ASTContext &Context) const
Return the specified type with one level of "sugar" removed from the type.
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
bool isPODType(const ASTContext &Context) const
Determine whether this is a Plain Old Data (POD) type (C++ 3.9p10).
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...
Qualifiers getLocalQualifiers() const
Retrieve the set of qualifiers local to this particular QualType instance, not including any qualifie...
bool hasNonTrivialToPrimitiveDefaultInitializeCUnion() const
Check if this is or contains a C union that is non-trivial to default-initialize, which is a union th...
The collection of all-type qualifiers we support.
unsigned getCVRQualifiers() const
void removeCVRQualifiers(unsigned mask)
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
@ OCL_Weak
Reading or writing from this object requires a barrier call.
@ OCL_Autoreleasing
Assigning into this object requires a lifetime extension.
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.
void removeAddressSpace()
void setAddressSpace(LangAS space)
PointerAuthQualifier getPointerAuth() const
ObjCLifetime getObjCLifetime() const
Qualifiers withoutObjCLifetime() const
Qualifiers withoutObjCGCAttr() const
LangAS getAddressSpace() const
bool compatiblyIncludesObjCLifetime(Qualifiers other) const
Determines if these qualifiers compatibly include another set of qualifiers from the narrow perspecti...
Represents a struct/union/class.
bool hasFlexibleArrayMember() const
field_iterator field_end() const
field_range fields() const
static RecoveryExpr * Create(ASTContext &Ctx, QualType T, SourceLocation BeginLoc, SourceLocation EndLoc, ArrayRef< Expr * > SubExprs)
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
Base for LValueReferenceType and RValueReferenceType.
Scope - A scope is a transient data structure that is used while parsing the program.
bool isClassScope() const
isClassScope - Return true if this scope is a class/struct/union scope.
bool Contains(const Scope &rhs) const
Returns if rhs has a higher scope depth than this.
unsigned getFlags() const
getFlags - Return the flags for this scope.
bool isInCFunctionScope() const
isInObjcMethodScope - Return true if this scope is, or is contained, in an C function body.
bool isFunctionPrototypeScope() const
isFunctionPrototypeScope - Return true if this scope is a function prototype scope.
@ ContinueScope
This is a while, do, for, which can have continue statements embedded into it.
@ ControlScope
The controlling scope in a if/switch/while/for statement.
@ BreakScope
This is a while, do, switch, for, etc that can have break statements embedded into it.
@ DeclScope
This is a scope that can contain a declaration.
Smart pointer class that efficiently represents Objective-C method names.
StringRef getNameForSlot(unsigned argIndex) const
Retrieve the name at a given position in the selector.
bool isUnarySelector() const
Expr * ExpandAMDGPUPredicateBuiltIn(Expr *CE)
Expand a valid use of the feature identification builtins into its corresponding sequence of instruct...
void AddPotentiallyUnguardedBuiltinUser(FunctionDecl *FD)
Diagnose unguarded usages of AMDGPU builtins and recommend guarding with __builtin_amdgcn_is_invocabl...
bool checkSVETypeSupport(QualType Ty, SourceLocation Loc, const FunctionDecl *FD, const llvm::StringMap< bool > &FeatureMap)
A generic diagnostic builder for errors which may or may not be deferred.
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
SemaDiagnosticBuilder DiagCompat(SourceLocation Loc, unsigned CompatDiagId)
Emit a compatibility diagnostic.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
void RecordImplicitHostDeviceFuncUsedByDevice(const FunctionDecl *FD)
Record FD if it is a CUDA/HIP implicit host device function used on device side in device compilation...
CUDAFunctionTarget IdentifyTarget(const FunctionDecl *D, bool IgnoreImplicitHDAttr=false)
Determines whether the given function is a CUDA device/host/kernel/etc.
bool CheckCall(SourceLocation Loc, FunctionDecl *Callee)
Check whether we're allowed to call Callee from the current context.
@ CVT_Host
Emitted on device side with a shadow variable on host side.
@ CVT_Both
Emitted on host side only.
ExprResult ActOnOutParamExpr(ParmVarDecl *Param, Expr *Arg)
void emitLogicalOperatorFixIt(Expr *LHS, Expr *RHS, BinaryOperatorKind Opc)
QualType handleVectorBinOpConversion(ExprResult &LHS, ExprResult &RHS, QualType LHSType, QualType RHSType, bool IsCompAssign)
ObjCMethodDecl * LookupInstanceMethodInGlobalPool(Selector Sel, SourceRange R, bool receiverIdOrClass=false)
LookupInstanceMethodInGlobalPool - Returns the method and warns if there are multiple signatures.
ObjCLiteralKind CheckLiteralKind(Expr *FromE)
ObjCMethodDecl * LookupMethodInObjectType(Selector Sel, QualType Ty, bool IsInstance)
LookupMethodInType - Look up a method in an ObjCObjectType.
void CheckObjCBridgeRelatedCast(QualType castType, Expr *castExpr)
QualType FindCompositeObjCPointerType(ExprResult &LHS, ExprResult &RHS, SourceLocation QuestionLoc)
FindCompositeObjCPointerType - Helper method to find composite type of two objective-c pointer types ...
void CheckTollFreeBridgeCast(QualType castType, Expr *castExpr)
const DeclContext * getCurObjCLexicalContext() const
void checkRetainCycles(ObjCMessageExpr *msg)
checkRetainCycles - Check whether an Objective-C message send might create an obvious retain cycle.
void EmitRelatedResultTypeNote(const Expr *E)
If the given expression involves a message send to a method with a related result type,...
void EmitRelatedResultTypeNoteForReturn(QualType destType)
Given that we had incompatible pointer types in a return statement, check whether we're in a method w...
void diagnoseARCUnbridgedCast(Expr *e)
Given that we saw an expression with the ARCUnbridgedCastTy placeholder type, complain bitterly.
ObjCMethodDecl * LookupMethodInQualifiedType(Selector Sel, const ObjCObjectPointerType *OPT, bool IsInstance)
LookupMethodInQualifiedType - Lookups up a method in protocol qualifier list of a qualified objective...
ARCConversionResult CheckObjCConversion(SourceRange castRange, QualType castType, Expr *&op, CheckedConversionKind CCK, bool Diagnose=true, bool DiagnoseCFAudited=false, BinaryOperatorKind Opc=BO_PtrMemD, bool IsReinterpretCast=false)
Checks for invalid conversions and casts between retainable pointers and other pointer kinds for ARC ...
Expr * stripARCUnbridgedCast(Expr *e)
stripARCUnbridgedCast - Given an expression of ARCUnbridgedCast type, remove the placeholder cast.
ExprResult BuildObjCSubscriptExpression(SourceLocation RB, Expr *BaseExpr, Expr *IndexExpr, ObjCMethodDecl *getterMethod, ObjCMethodDecl *setterMethod)
Build an ObjC subscript pseudo-object expression, given that that's supported by the runtime.
std::unique_ptr< NSAPI > NSAPIObj
Caches identifiers/selectors for NSFoundation APIs.
void CheckDeclReference(SourceLocation Loc, Expr *E, Decl *D)
ExprResult ActOnArraySectionExpr(Expr *Base, SourceLocation LBLoc, Expr *LowerBound, SourceLocation ColonLocFirst, Expr *Length, SourceLocation RBLoc)
Checks and creates an Array Section used in an OpenACC construct/clause.
ExprResult ActOnOpenMPCall(ExprResult Call, Scope *Scope, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig)
Given the potential call expression Call, determine if there is a specialization via the OpenMP decla...
void tryCaptureOpenMPLambdas(ValueDecl *V)
Function tries to capture lambda's captured variables in the OpenMP region before the original lambda...
OpenMPClauseKind isOpenMPPrivateDecl(ValueDecl *D, unsigned Level, unsigned CapLevel) const
Check if the specified variable is used in 'private' clause.
VarDecl * isOpenMPCapturedDecl(ValueDecl *D, bool CheckScopeInfo=false, unsigned StopAt=0)
Check if the specified variable is used in one of the private clauses (private, firstprivate,...
ExprResult ActOnOMPArraySectionExpr(Expr *Base, SourceLocation LBLoc, Expr *LowerBound, SourceLocation ColonLocFirst, SourceLocation ColonLocSecond, Expr *Length, Expr *Stride, SourceLocation RBLoc)
bool isOpenMPCapturedByRef(const ValueDecl *D, unsigned Level, unsigned OpenMPCaptureLevel) const
Return true if the provided declaration VD should be captured by reference.
bool isOpenMPTargetCapturedDecl(const ValueDecl *D, unsigned Level, unsigned CaptureLevel) const
Check if the specified variable is captured by 'target' directive.
bool isOpenMPGlobalCapturedDecl(ValueDecl *D, unsigned Level, unsigned CaptureLevel) const
Check if the specified global variable must be captured by outer capture regions.
bool isInOpenMPDeclareTargetContext() const
Return true inside OpenMP declare target region.
void checkDeclIsAllowedInOpenMPTarget(Expr *E, Decl *D, SourceLocation IdLoc=SourceLocation())
Check declaration inside target region.
const ValueDecl * getOpenMPDeclareMapperVarName() const
ExprResult checkAssignment(Scope *S, SourceLocation OpLoc, BinaryOperatorKind Opcode, Expr *LHS, Expr *RHS)
ExprResult checkIncDec(Scope *S, SourceLocation OpLoc, UnaryOperatorKind Opcode, Expr *Op)
Check an increment or decrement of a pseudo-object expression.
ExprResult checkRValue(Expr *E)
void CheckDeviceUseOfDecl(NamedDecl *ND, SourceLocation Loc)
Issues a deferred diagnostic if use of the declaration designated by 'ND' is invalid in a device cont...
RAII object used to temporarily allow the C++ 'this' expression to be used, with the given qualifiers...
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
RAII class used to indicate that we are performing provisional semantic analysis to determine the val...
Abstract base class used for diagnosing integer constant expression violations.
virtual SemaDiagnosticBuilder diagnoseNotICE(Sema &S, SourceLocation Loc)=0
virtual SemaDiagnosticBuilder diagnoseNotICEType(Sema &S, SourceLocation Loc, QualType T)
virtual SemaDiagnosticBuilder diagnoseFold(Sema &S, SourceLocation Loc)
Sema - This implements semantic analysis and AST building for C.
const FieldDecl * getSelfAssignmentClassMemberCandidate(const ValueDecl *SelfAssigned)
Returns a field in a CXXRecordDecl that has the same name as the decl SelfAssigned when inside a CXXM...
bool TryFunctionConversion(QualType FromType, QualType ToType, QualType &ResultTy) const
Same as IsFunctionConversion, but if this would return true, it sets ResultTy to ToType.
void DefineImplicitLambdaToFunctionPointerConversion(SourceLocation CurrentLoc, CXXConversionDecl *Conv)
Define the "body" of the conversion from a lambda object to a function pointer.
ParsedType CreateParsedType(QualType T, TypeSourceInfo *TInfo)
Package the given type and TSI into a ParsedType.
ExprResult ActOnCXXParenListInitExpr(ArrayRef< Expr * > Args, QualType T, unsigned NumUserSpecifiedExprs, SourceLocation InitLoc, SourceLocation LParenLoc, SourceLocation RParenLoc)
QualType getCurrentThisType()
Try to retrieve the type of the 'this' pointer.
std::optional< ExpressionEvaluationContextRecord::InitializationContext > InnermostDeclarationWithDelayedImmediateInvocations() const
SmallVector< CodeSynthesisContext, 16 > CodeSynthesisContexts
List of active code synthesis contexts.
Scope * getCurScope() const
Retrieve the parser's current scope.
ExprResult ActOnUnaryOp(Scope *S, SourceLocation OpLoc, tok::TokenKind Op, Expr *Input, bool IsAfterAmp=false)
Unary Operators. 'Tok' is the token for the operator.
bool RequireCompleteSizedExprType(Expr *E, unsigned DiagID, const Ts &...Args)
ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp=false)
bool isAlwaysConstantEvaluatedContext() const
bool isExternalWithNoLinkageType(const ValueDecl *VD) const
Determine if VD, which must be a variable or function, is an external symbol that nonetheless can't b...
bool isAttrContext() const
void DiagnoseUnusedParameters(ArrayRef< ParmVarDecl * > Parameters)
Diagnose any unused parameters in the given sequence of ParmVarDecl pointers.
ExprResult IgnoredValueConversions(Expr *E)
IgnoredValueConversions - Given that an expression's result is syntactically ignored,...
bool RequireCompleteSizedType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupObjCImplicitSelfParam
Look up implicit 'self' parameter of an objective-c method.
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
void DiagnoseSentinelCalls(const NamedDecl *D, SourceLocation Loc, ArrayRef< Expr * > Args)
DiagnoseSentinelCalls - This routine checks whether a call or message-send is to a declaration with t...
ExprResult CreateBuiltinMatrixSingleSubscriptExpr(Expr *Base, Expr *RowIdx, SourceLocation RBLoc)
ExprResult ActOnConstantExpression(ExprResult Res)
QualType CheckLogicalOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
ExprResult ActOnCompoundLiteral(SourceLocation LParenLoc, ParsedType Ty, SourceLocation RParenLoc, Expr *InitExpr)
bool LookupTemplateName(LookupResult &R, Scope *S, CXXScopeSpec &SS, QualType ObjectType, bool EnteringContext, RequiredTemplateKind RequiredTemplate=SourceLocation(), AssumedTemplateKind *ATK=nullptr, bool AllowTypoCorrection=true)
ImplicitConversionSequence TryImplicitConversion(Expr *From, QualType ToType, bool SuppressUserConversions, AllowedExplicit AllowExplicit, bool InOverloadResolution, bool CStyle, bool AllowObjCWritebackConversion)
ExprResult BuildLiteralOperatorCall(LookupResult &R, DeclarationNameInfo &SuffixInfo, ArrayRef< Expr * > Args, SourceLocation LitEndLoc, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr)
BuildLiteralOperatorCall - Build a UserDefinedLiteral by creating a call to a literal operator descri...
bool areVectorTypesSameSize(QualType srcType, QualType destType)
void DiagnoseAlwaysNonNullPointer(Expr *E, Expr::NullPointerConstantKind NullType, bool IsEqual, SourceRange Range)
Diagnose pointers that are always non-null.
void DefineImplicitMoveAssignment(SourceLocation CurrentLocation, CXXMethodDecl *MethodDecl)
Defines an implicitly-declared move assignment operator.
VariadicCallType getVariadicCallType(FunctionDecl *FDecl, const FunctionProtoType *Proto, Expr *Fn)
ExprResult CreateBuiltinBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr, bool ForFoldExpression=false)
CreateBuiltinBinOp - Creates a new built-in binary operation with operator Opc at location TokLoc.
void DecomposeUnqualifiedId(const UnqualifiedId &Id, TemplateArgumentListInfo &Buffer, DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *&TemplateArgs)
Decomposes the given name into a DeclarationNameInfo, its location, and possibly a list of template a...
bool InstantiateDefaultArgument(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param)
void ActOnStartStmtExpr()
ExprResult CreateOverloadedArraySubscriptExpr(SourceLocation LLoc, SourceLocation RLoc, Expr *Base, MultiExprArg Args)
void WarnOnPendingNoDerefs(ExpressionEvaluationContextRecord &Rec)
Emit a warning for all pending noderef expressions that we recorded.
void ActOnStmtExprError()
void MarkDeclarationsReferencedInExpr(Expr *E, bool SkipLocalVariables=false, ArrayRef< const Expr * > StopAt={})
Mark any declarations that appear within this expression or any potentially-evaluated subexpressions ...
bool BoundsSafetyCheckAssignmentToCountAttrPtr(QualType LHSTy, Expr *RHSExpr, AssignmentAction Action, SourceLocation Loc, const ValueDecl *Assignee, bool ShowFullyQualifiedAssigneeName)
Perform Bounds Safety Semantic checks for assigning to a __counted_by or __counted_by_or_null pointer...
QualType UsualArithmeticConversions(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, ArithConvKind ACK)
UsualArithmeticConversions - Performs various conversions that are common to binary operators (C99 6....
void CheckFloatComparison(SourceLocation Loc, const Expr *LHS, const Expr *RHS, BinaryOperatorKind Opcode)
Check for comparisons of floating-point values using == and !=.
void CheckPtrComparisonWithNullChar(ExprResult &E, ExprResult &NullE)
NamedDecl * ImplicitlyDefineFunction(SourceLocation Loc, IdentifierInfo &II, Scope *S)
ImplicitlyDefineFunction - An undeclared identifier was used in a function call, forming a call to an...
unsigned CapturingFunctionScopes
Track the number of currently active capturing scopes.
void PushExpressionEvaluationContext(ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl=nullptr, ExpressionEvaluationContextRecord::ExpressionKind Type=ExpressionEvaluationContextRecord::EK_Other)
ExprResult CheckBooleanCondition(SourceLocation Loc, Expr *E, bool IsConstexpr=false)
CheckBooleanCondition - Diagnose problems involving the use of the given expression as a boolean cond...
@ Boolean
A boolean condition, from 'if', 'while', 'for', or 'do'.
@ Switch
An integral condition for a 'switch' statement.
@ ConstexprIf
A constant boolean condition from 'if constexpr'.
ExprResult ActOnIdExpression(Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, UnqualifiedId &Id, bool HasTrailingLParen, bool IsAddressOfOperand, CorrectionCandidateCallback *CCC=nullptr, bool IsInlineAsmIdentifier=false, Token *KeywordReplacement=nullptr)
bool needsRebuildOfDefaultArgOrInit() const
bool GatherArgumentsForCall(SourceLocation CallLoc, FunctionDecl *FDecl, const FunctionProtoType *Proto, unsigned FirstParam, ArrayRef< Expr * > Args, SmallVectorImpl< Expr * > &AllArgs, VariadicCallType CallType=VariadicCallType::DoesNotApply, bool AllowExplicit=false, bool IsListInitialization=false)
GatherArgumentsForCall - Collector argument expressions for various form of call prototypes.
SourceLocation LocationOfExcessPrecisionNotSatisfied
SmallVector< sema::FunctionScopeInfo *, 4 > FunctionScopes
Stack containing information about each of the nested function, block, and method scopes that are cur...
Preprocessor & getPreprocessor() const
const ExpressionEvaluationContextRecord & currentEvaluationContext() const
Scope * getScopeForContext(DeclContext *Ctx)
Determines the active Scope associated with the given declaration context.
QualType GetSignedSizelessVectorType(QualType V)
bool CheckCXXThisCapture(SourceLocation Loc, bool Explicit=false, bool BuildAndDiagnose=true, const unsigned *const FunctionScopeIndexToStopAt=nullptr, bool ByCopy=false)
Make sure the value of 'this' is actually available in the current context, if it is a potentially ev...
llvm::SmallPtrSet< ConstantExpr *, 4 > FailedImmediateInvocations
ExprResult ActOnCharacterConstant(const Token &Tok, Scope *UDLScope=nullptr)
DefaultedComparisonKind getDefaultedComparisonKind(const FunctionDecl *FD)
ExprResult MaybeBindToTemporary(Expr *E)
MaybeBindToTemporary - If the passed in expression has a record type with a non-trivial destructor,...
void CheckCompleteDestructorVariant(SourceLocation CurrentLocation, CXXDestructorDecl *Dtor)
Do semantic checks to allow the complete destructor variant to be emitted when the destructor is defi...
void MarkCaptureUsedInEnclosingContext(ValueDecl *Capture, SourceLocation Loc, unsigned CapturingScopeIndex)
llvm::SmallSetVector< Expr *, 4 > MaybeODRUseExprSet
Store a set of either DeclRefExprs or MemberExprs that contain a reference to a variable (constant) t...
Expr * BuildBuiltinCallExpr(SourceLocation Loc, Builtin::ID Id, MultiExprArg CallArgs)
BuildBuiltinCallExpr - Create a call to a builtin function specified by Id.
QualType CheckVectorOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, bool AllowBothBool, bool AllowBoolConversion, bool AllowBoolOperation, bool ReportInvalid)
type checking for vector binary operators.
LiteralOperatorLookupResult LookupLiteralOperator(Scope *S, LookupResult &R, ArrayRef< QualType > ArgTys, bool AllowRaw, bool AllowTemplate, bool AllowStringTemplate, bool DiagnoseMissing, StringLiteral *StringLit=nullptr)
LookupLiteralOperator - Determine which literal operator should be used for a user-defined literal,...
FPOptionsOverride CurFPFeatureOverrides()
bool isValidSveBitcast(QualType srcType, QualType destType)
Are the two types SVE-bitcast-compatible types?
ExprResult ActOnDependentIdExpression(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, bool isAddressOfOperand, const TemplateArgumentListInfo *TemplateArgs)
ActOnDependentIdExpression - Handle a dependent id-expression that was just parsed.
ExprResult BuildStmtExpr(SourceLocation LPLoc, Stmt *SubStmt, SourceLocation RPLoc, unsigned TemplateDepth)
ExprResult BuildCallToMemberFunction(Scope *S, Expr *MemExpr, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallToMemberFunction - Build a call to a member function.
NamedDecl * LookupSingleName(Scope *S, DeclarationName Name, SourceLocation Loc, LookupNameKind NameKind, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)
Look up a name, looking for a single declaration.
AssignConvertType CheckSingleAssignmentConstraints(QualType LHSType, ExprResult &RHS, bool Diagnose=true, bool DiagnoseCFAudited=false, bool ConvertRHS=true)
Check assignment constraints for an assignment of RHS to LHSType.
ExprResult BuildVAArgExpr(SourceLocation BuiltinLoc, Expr *E, TypeSourceInfo *TInfo, SourceLocation RPLoc)
ExpressionEvaluationContextRecord & parentEvaluationContext()
FunctionDecl * getCurFunctionDecl(bool AllowLambda=false) const
Returns a pointer to the innermost enclosing function, or nullptr if the current context is not insid...
ExprResult PerformContextualImplicitConversion(SourceLocation Loc, Expr *FromE, ContextualImplicitConverter &Converter)
Perform a contextual implicit conversion.
bool CheckConceptUseInDefinition(NamedDecl *Concept, SourceLocation Loc)
ExprResult UsualUnaryConversions(Expr *E)
UsualUnaryConversions - Performs various conversions that are common to most operators (C99 6....
bool checkPointerAuthEnabled(SourceLocation Loc, SourceRange Range)
ExprResult CheckUnevaluatedOperand(Expr *E)
ExprResult DefaultVariadicArgumentPromotion(Expr *E, VariadicCallType CT, FunctionDecl *FDecl)
void DiagnoseCommaOperator(const Expr *LHS, SourceLocation Loc)
Look for instances where it is likely the comma operator is confused with another operator.
ExprResult tryConvertExprToType(Expr *E, QualType Ty)
Try to convert an expression E to type Ty.
bool DeduceReturnType(FunctionDecl *FD, SourceLocation Loc, bool Diagnose=true)
std::vector< Token > ExpandFunctionLocalPredefinedMacros(ArrayRef< Token > Toks)
bool CheckMatrixCast(SourceRange R, QualType DestTy, QualType SrcTy, CastKind &Kind)
QualType CheckAddressOfOperand(ExprResult &Operand, SourceLocation OpLoc)
CheckAddressOfOperand - The operand of & must be either a function designator or an lvalue designatin...
ParmVarDecl * BuildParmVarDeclForTypedef(DeclContext *DC, SourceLocation Loc, QualType T)
Synthesizes a variable for a parameter arising from a typedef.
ExprResult CheckSwitchCondition(SourceLocation SwitchLoc, Expr *Cond)
static bool TooManyArguments(size_t NumParams, size_t NumArgs, bool PartialOverloading=false)
To be used for checking whether the arguments being passed to function exceeds the number of paramete...
bool ShouldSplatAltivecScalarInCast(const VectorType *VecTy)
QualType CheckVectorLogicalOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
QualType InvalidOperands(SourceLocation Loc, ExprResult &LHS, ExprResult &RHS)
the following "Check" methods will return a valid/converted QualType or a null QualType (indicating a...
bool DiagIfReachable(SourceLocation Loc, ArrayRef< const Stmt * > Stmts, const PartialDiagnostic &PD)
Conditionally issue a diagnostic based on the statements's reachability analysis.
bool BoundsSafetyCheckUseOfCountAttrPtr(const Expr *E)
Perform Bounds Safety semantic checks for uses of invalid uses counted_by or counted_by_or_null point...
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReceiver=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
QualType CheckShiftOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc, bool IsCompAssign=false)
DiagnosticsEngine & getDiagnostics() const
ExprResult MaybeConvertParenListExprToParenExpr(Scope *S, Expr *ME)
This is not an AltiVec-style cast or or C++ direct-initialization, so turn the ParenListExpr into a s...
bool checkAddressOfFunctionIsAvailable(const FunctionDecl *Function, bool Complain=false, SourceLocation Loc=SourceLocation())
Returns whether the given function's address can be taken or not, optionally emitting a diagnostic if...
bool CheckCaseExpression(Expr *E)
QualType CheckMatrixElementwiseOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign)
Type checking for matrix binary operators.
bool tryToRecoverWithCall(ExprResult &E, const PartialDiagnostic &PD, bool ForceComplain=false, bool(*IsPlausibleResult)(QualType)=nullptr)
Try to recover by turning the given expression into a call.
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....
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
void LookupOverloadedOperatorName(OverloadedOperatorKind Op, Scope *S, UnresolvedSetImpl &Functions)
void checkSpecializationReachability(SourceLocation Loc, NamedDecl *Spec)
void CleanupVarDeclMarking()
ExprResult DefaultFunctionArrayLvalueConversion(Expr *E, bool Diagnose=true)
bool isImmediateFunctionContext() const
ASTContext & getASTContext() const
std::unique_ptr< sema::FunctionScopeInfo, PoppedFunctionScopeDeleter > PoppedFunctionScopePtr
ExprResult CallExprUnaryConversions(Expr *E)
CallExprUnaryConversions - a special case of an unary conversion performed on a function designator o...
void translateTemplateArguments(const ASTTemplateArgsPtr &In, TemplateArgumentListInfo &Out)
Translates template arguments as provided by the parser into template arguments used by semantic anal...
ExprResult BuildUnaryOp(Scope *S, SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *Input, bool IsAfterAmp=false)
bool tryCaptureVariable(ValueDecl *Var, SourceLocation Loc, TryCaptureKind Kind, SourceLocation EllipsisLoc, bool BuildAndDiagnose, QualType &CaptureType, QualType &DeclRefType, const unsigned *const FunctionScopeIndexToStopAt)
Try to capture the given variable.
void MarkVariableReferenced(SourceLocation Loc, VarDecl *Var)
Mark a variable referenced, and check whether it is odr-used (C++ [basic.def.odr]p2,...
void LookupBinOp(Scope *S, SourceLocation OpLoc, BinaryOperatorKind Opc, UnresolvedSetImpl &Functions)
ExprResult BuildTemplateIdExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, bool RequiresADL, const TemplateArgumentListInfo *TemplateArgs)
void DiagnoseUnguardedAvailabilityViolations(Decl *FD)
Issue any -Wunguarded-availability warnings in FD.
void PopExpressionEvaluationContext()
ExprResult CreateOverloadedBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, const UnresolvedSetImpl &Fns, Expr *LHS, Expr *RHS, bool RequiresADL=true, bool AllowRewrittenCandidates=true, FunctionDecl *DefaultedFn=nullptr)
Create a binary operation that may resolve to an overloaded operator.
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
ExprResult DefaultArgumentPromotion(Expr *E)
DefaultArgumentPromotion (C99 6.5.2.2p6).
ExprResult BuildPredefinedExpr(SourceLocation Loc, PredefinedIdentKind IK)
bool CheckArgsForPlaceholders(MultiExprArg args)
Check an argument list for placeholders that we won't try to handle later.
bool UseArgumentDependentLookup(const CXXScopeSpec &SS, const LookupResult &R, bool HasTrailingLParen)
void InstantiateVariableDefinition(SourceLocation PointOfInstantiation, VarDecl *Var, bool Recursive=false, bool DefinitionRequired=false, bool AtEndOfTU=false)
Instantiate the definition of the given variable from its template.
ExprResult BuildCompoundLiteralExpr(SourceLocation LParenLoc, TypeSourceInfo *TInfo, SourceLocation RParenLoc, Expr *LiteralExpr)
ExprResult ActOnAddrLabel(SourceLocation OpLoc, SourceLocation LabLoc, LabelDecl *TheDecl)
ActOnAddrLabel - Parse the GNU address of label extension: "&&foo".
QualType CheckSubtractionOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc, QualType *CompLHSTy=nullptr)
DefaultedComparisonKind
Kinds of defaulted comparison operator functions.
@ None
This is not a defaultable comparison operator.
ExprResult ActOnParenListExpr(SourceLocation L, SourceLocation R, MultiExprArg Val)
QualType CheckMatrixMultiplyOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign)
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
ObjCMethodDecl * getCurMethodDecl()
getCurMethodDecl - If inside of a method body, this returns a pointer to the method decl for the meth...
DeclRefExpr * BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK, SourceLocation Loc, const CXXScopeSpec *SS=nullptr)
void DefineImplicitMoveConstructor(SourceLocation CurrentLocation, CXXConstructorDecl *Constructor)
DefineImplicitMoveConstructor - Checks for feasibility of defining this constructor as the move const...
ExprResult ActOnChooseExpr(SourceLocation BuiltinLoc, Expr *CondExpr, Expr *LHSExpr, Expr *RHSExpr, SourceLocation RPLoc)
ExprResult CreateGenericSelectionExpr(SourceLocation KeyLoc, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool PredicateIsExpr, void *ControllingExprOrType, ArrayRef< TypeSourceInfo * > Types, ArrayRef< Expr * > Exprs)
ControllingExprOrType is either a TypeSourceInfo * or an Expr *.
ExprResult ActOnUnevaluatedStringLiteral(ArrayRef< Token > StringToks)
void DiagnoseSelfMove(const Expr *LHSExpr, const Expr *RHSExpr, SourceLocation OpLoc)
DiagnoseSelfMove - Emits a warning if a value is moved to itself.
SourceRange getExprRange(Expr *E) const
void AddTemplateOverloadCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false)
Add a C++ function template specialization as a candidate in the candidate set, using template argume...
void DefineImplicitCopyConstructor(SourceLocation CurrentLocation, CXXConstructorDecl *Constructor)
DefineImplicitCopyConstructor - Checks for feasibility of defining this constructor as the copy const...
std::optional< ExpressionEvaluationContextRecord::InitializationContext > OutermostDeclarationWithDelayedImmediateInvocations() const
void DiagnoseUnusedExprResult(const Stmt *S, unsigned DiagID)
DiagnoseUnusedExprResult - If the statement passed in is an expression whose result is unused,...
FPOptions & getCurFPFeatures()
RecordDecl * StdSourceLocationImplDecl
The C++ "std::source_location::__impl" struct, defined in <source_location>.
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
ConditionResult ActOnCondition(Scope *S, SourceLocation Loc, Expr *SubExpr, ConditionKind CK, bool MissingOK=false)
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
@ UPPC_Block
Block expression.
const LangOptions & getLangOpts() const
TypoCorrection CorrectTypo(const DeclarationNameInfo &Typo, Sema::LookupNameKind LookupKind, Scope *S, CXXScopeSpec *SS, CorrectionCandidateCallback &CCC, CorrectTypoKind Mode, DeclContext *MemberContext=nullptr, bool EnteringContext=false, const ObjCObjectPointerType *OPT=nullptr, bool RecordFailure=true)
Try to "correct" a typo in the source code by finding visible declarations whose names are similar to...
QualType CheckComparisonCategoryType(ComparisonCategoryType Kind, SourceLocation Loc, ComparisonCategoryUsage Usage)
Lookup the specified comparison category types in the standard library, an check the VarDecls possibl...
void DiagnoseInvalidJumps(Stmt *Body)
PoppedFunctionScopePtr PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, Decl *D=nullptr, QualType BlockType=QualType())
Pop a function (or block or lambda or captured region) scope from the stack.
QualType CheckCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
CastKind PrepareScalarCast(ExprResult &src, QualType destType)
Prepares for a scalar cast, performing all the necessary stages except the final cast and returning t...
bool tryToFixVariablyModifiedVarType(TypeSourceInfo *&TInfo, QualType &T, SourceLocation Loc, unsigned FailedFoldDiagID)
Attempt to fold a variable-sized type to a constant-sized type, returning true if we were successful.
const FunctionProtoType * ResolveExceptionSpec(SourceLocation Loc, const FunctionProtoType *FPT)
void MarkExpressionAsImmediateEscalating(Expr *E)
NonOdrUseReason getNonOdrUseReasonInCurrentContext(ValueDecl *D)
If D cannot be odr-used in the current expression evaluation context, return a reason explaining why.
void DefineDefaultedComparison(SourceLocation Loc, FunctionDecl *FD, DefaultedComparisonKind DCK)
void diagnoseUnavailableAlignedAllocation(const FunctionDecl &FD, SourceLocation Loc)
Produce diagnostics if FD is an aligned allocation or deallocation function that is unavailable.
bool LookupParsedName(LookupResult &R, Scope *S, CXXScopeSpec *SS, QualType ObjectType, bool AllowBuiltinCreation=false, bool EnteringContext=false)
Performs name lookup for a name that was parsed in the source code, and may contain a C++ scope speci...
void MarkFunctionParmPackReferenced(FunctionParmPackExpr *E)
Perform reference-marking and odr-use handling for a FunctionParmPackExpr.
bool DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, CorrectionCandidateCallback &CCC, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr, ArrayRef< Expr * > Args={}, DeclContext *LookupCtx=nullptr)
Diagnose an empty lookup.
QualType CheckAdditionOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc, QualType *CompLHSTy=nullptr)
bool isPotentialImplicitMemberAccess(const CXXScopeSpec &SS, LookupResult &R, bool IsAddressOfOperand)
Check whether an expression might be an implicit class member access.
ExprResult BuildCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallExpr - Handle a call to Fn with the specified array of arguments.
bool CheckUseOfCXXMethodAsAddressOfOperand(SourceLocation OpLoc, const Expr *Op, const CXXMethodDecl *MD)
ExprResult BuildSourceLocExpr(SourceLocIdentKind Kind, QualType ResultTy, SourceLocation BuiltinLoc, SourceLocation RPLoc, DeclContext *ParentContext)
bool ActOnAlignasTypeArgument(StringRef KWName, ParsedType Ty, SourceLocation OpLoc, SourceRange R)
ActOnAlignasTypeArgument - Handle alignas(type-id) and _Alignas(type-name) .
bool DiagnoseUnexpandedParameterPack(SourceLocation Loc, TypeSourceInfo *T, UnexpandedParameterPackContext UPPC)
If the given type contains an unexpanded parameter pack, diagnose the error.
bool RequireNonAbstractType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
void checkTypeSupport(QualType Ty, SourceLocation Loc, ValueDecl *D=nullptr)
Check if the type is allowed to be used for the current target.
bool areMatrixTypesOfTheSameDimension(QualType srcTy, QualType destTy)
Are the two types matrix types and do they have the same dimensions i.e.
void CheckExtraCXXDefaultArguments(Declarator &D)
CheckExtraCXXDefaultArguments - Check for any extra default arguments in the declarator,...
bool hasCStrMethod(const Expr *E)
Check to see if a given expression could have '.c_str()' called on it.
AssignConvertType CheckAssignmentConstraints(SourceLocation Loc, QualType LHSType, QualType RHSType)
CheckAssignmentConstraints - Perform type checking for assignment, argument passing,...
void AddOverloadCandidate(FunctionDecl *Function, DeclAccessPair FoundDecl, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, bool AllowExplicitConversion=false, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, ConversionSequenceList EarlyConversions={}, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false, bool StrictPackMatch=false)
AddOverloadCandidate - Adds the given function to the set of candidate functions, using the given fun...
const LangOptions & LangOpts
void PushExpressionEvaluationContextForFunction(ExpressionEvaluationContext NewContext, FunctionDecl *FD)
ExprResult BuildBuiltinOffsetOf(SourceLocation BuiltinLoc, TypeSourceInfo *TInfo, ArrayRef< OffsetOfComponent > Components, SourceLocation RParenLoc)
__builtin_offsetof(type, a.b[123][456].c)
sema::LambdaScopeInfo * getCurLambda(bool IgnoreNonLambdaCapturingScope=false)
Retrieve the current lambda scope info, if any.
ExprResult BuildResolvedCallExpr(Expr *Fn, NamedDecl *NDecl, SourceLocation LParenLoc, ArrayRef< Expr * > Arg, SourceLocation RParenLoc, Expr *Config=nullptr, bool IsExecConfig=false, ADLCallKind UsesADL=ADLCallKind::NotADL)
BuildResolvedCallExpr - Build a call to a resolved expression, i.e.
ExprResult CheckForImmediateInvocation(ExprResult E, FunctionDecl *Decl)
Wrap the expression in a ConstantExpr if it is a potential immediate invocation.
ExprResult TemporaryMaterializationConversion(Expr *E)
If E is a prvalue denoting an unmaterialized temporary, materialize it as an xvalue.
VarArgKind isValidVarArgType(const QualType &Ty)
Determine the degree of POD-ness for an expression.
NamedDeclSetType UnusedPrivateFields
Set containing all declared private fields that are not used.
void DefineInheritingConstructor(SourceLocation UseLoc, CXXConstructorDecl *Constructor)
Define the specified inheriting constructor.
ExprResult ConvertVectorExpr(Expr *E, TypeSourceInfo *TInfo, SourceLocation BuiltinLoc, SourceLocation RParenLoc)
ConvertVectorExpr - Handle __builtin_convertvector.
void CheckUnusedVolatileAssignment(Expr *E)
Check whether E, which is either a discarded-value expression or an unevaluated operand,...
void maybeAddDeclWithEffects(FuncOrBlockDecl *D)
Inline checks from the start of maybeAddDeclWithEffects, to minimize performance impact on code not u...
ExprResult prepareMatrixSplat(QualType MatrixTy, Expr *SplattedExpr)
Prepare SplattedExpr for a matrix splat operation, adding implicit casts if necessary.
void MaybeSuggestAddingStaticToDecl(const FunctionDecl *D)
@ OperatorInExpression
The '<=>' operator was used in an expression and a builtin operator was selected.
ExprResult BuildCXXReflectExpr(SourceLocation OperatorLoc, TypeSourceInfo *TSI)
bool CanUseDecl(NamedDecl *D, bool TreatUnavailableAsInvalid)
Determine whether the use of this declaration is valid, without emitting diagnostics.
void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse)
Perform marking for a reference to an arbitrary declaration.
void MarkVTableUsed(SourceLocation Loc, CXXRecordDecl *Class, bool DefinitionRequired=false)
Note that the vtable for the given class was used at the given location.
QualType InvalidLogicalVectorOperands(SourceLocation Loc, ExprResult &LHS, ExprResult &RHS)
Diagnose cases where a scalar was implicitly converted to a vector and diagnose the underlying types.
bool diagnoseArgIndependentDiagnoseIfAttrs(const NamedDecl *ND, SourceLocation Loc)
Emit diagnostics for the diagnose_if attributes on Function, ignoring any ArgDependent DiagnoseIfAttr...
CleanupInfo Cleanup
Used to control the generation of ExprWithCleanups.
llvm::DenseMap< ParmVarDecl *, SourceLocation > UnparsedDefaultArgLocs
QualType CheckMultiplyDivideOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
QualType FindCompositePointerType(SourceLocation Loc, Expr *&E1, Expr *&E2, bool ConvertArgs=true)
Find a merged pointer type and convert the two expressions to it.
SmallVector< std::deque< PendingImplicitInstantiation >, 8 > SavedPendingInstantiations
bool isQualifiedMemberAccess(Expr *E)
Determine whether the given expression is a qualified member access expression, of a form that could ...
static CastKind ScalarTypeToBooleanCastKind(QualType ScalarTy)
ScalarTypeToBooleanCastKind - Returns the cast kind corresponding to the conversion from scalar type ...
void DefineImplicitLambdaToBlockPointerConversion(SourceLocation CurrentLoc, CXXConversionDecl *Conv)
Define the "body" of the conversion from a lambda object to a block pointer.
void DefineImplicitDestructor(SourceLocation CurrentLocation, CXXDestructorDecl *Destructor)
DefineImplicitDestructor - Checks for feasibility of defining this destructor as the default destruct...
ExprResult BuildCStyleCastExpr(SourceLocation LParenLoc, TypeSourceInfo *Ty, SourceLocation RParenLoc, Expr *Op)
void DiagnoseMisalignedMembers()
Diagnoses the current set of gathered accesses.
sema::FunctionScopeInfo * getCurFunction() const
void checkUnsafeExprAssigns(SourceLocation Loc, Expr *LHS, Expr *RHS)
checkUnsafeExprAssigns - Check whether +1 expr is being assigned to weak/__unsafe_unretained expressi...
ExprResult ActOnEmbedExpr(SourceLocation EmbedKeywordLoc, StringLiteral *BinaryData, StringRef FileName)
bool CheckLoopHintExpr(Expr *E, SourceLocation Loc, bool AllowZero)
QualType CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, ArithConvKind OperationKind)
void DiagnoseAssignmentEnum(QualType DstType, QualType SrcType, Expr *SrcExpr)
DiagnoseAssignmentEnum - Warn if assignment to enum is a constant integer not in the range of enum va...
llvm::DenseMap< const VarDecl *, int > RefsMinusAssignments
Increment when we find a reference; decrement when we find an ignored assignment.
ExprResult CreateOverloadedUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, const UnresolvedSetImpl &Fns, Expr *input, bool RequiresADL=true)
Create a unary operation that may resolve to an overloaded operator.
bool findMacroSpelling(SourceLocation &loc, StringRef name)
Looks through the macro-expansion chain for the given location, looking for a macro expansion with th...
void DefineImplicitDefaultConstructor(SourceLocation CurrentLocation, CXXConstructorDecl *Constructor)
DefineImplicitDefaultConstructor - Checks for feasibility of defining this constructor as the default...
void AddOverloadedCallCandidates(UnresolvedLookupExpr *ULE, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool PartialOverloading=false)
Add the overload candidates named by callee and/or found by argument dependent lookup to the given ov...
ExprResult DefaultLvalueConversion(Expr *E)
ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R, bool NeedsADL, bool AcceptInvalidDecl=false)
bool CheckDerivedToBaseConversion(QualType Derived, QualType Base, SourceLocation Loc, SourceRange Range, CXXCastPath *BasePath=nullptr, bool IgnoreAccess=false)
bool isInLifetimeExtendingContext() const
AssignConvertType CheckTransparentUnionArgumentConstraints(QualType ArgType, ExprResult &RHS)
void maybeExtendBlockObject(ExprResult &E)
Do an explicit extend of the given block pointer if we're in ARC.
ExprResult ActOnGenericSelectionExpr(SourceLocation KeyLoc, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool PredicateIsExpr, void *ControllingExprOrType, ArrayRef< ParsedType > ArgTypes, ArrayRef< Expr * > ArgExprs)
ControllingExprOrType is either an opaque pointer coming out of a ParsedType or an Expr *.
void ActOnBlockError(SourceLocation CaretLoc, Scope *CurScope)
ActOnBlockError - If there is an error parsing a block, this callback is invoked to pop the informati...
ExprResult prepareVectorSplat(QualType VectorTy, Expr *SplattedExpr)
Prepare SplattedExpr for a vector splat operation, adding implicit casts if necessary.
bool IsAssignConvertCompatible(AssignConvertType ConvTy)
sema::BlockScopeInfo * getCurBlock()
Retrieve the current block, if any.
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
MaterializeTemporaryExpr * CreateMaterializeTemporaryExpr(QualType T, Expr *Temporary, bool BoundToLvalueReference)
ExprResult checkUnknownAnyCast(SourceRange TypeRange, QualType CastType, Expr *CastExpr, CastKind &CastKind, ExprValueKind &VK, CXXCastPath &Path)
Check a cast of an unknown-any type.
MultiLevelTemplateArgumentList getTemplateInstantiationArgs(const NamedDecl *D, const DeclContext *DC=nullptr, bool Final=false, std::optional< ArrayRef< TemplateArgument > > Innermost=std::nullopt, bool RelativeToPrimary=false, const FunctionDecl *Pattern=nullptr, bool ForConstraintInstantiation=false, bool SkipForSpecialization=false, bool ForDefaultArgumentSubstitution=false)
Retrieve the template argument list(s) that should be used to instantiate the definition of the given...
SuppressedDiagnosticsMap SuppressedDiagnostics
DeclarationNameInfo GetNameFromUnqualifiedId(const UnqualifiedId &Name)
Retrieves the declaration name from a parsed unqualified-id.
std::deque< PendingImplicitInstantiation > PendingLocalImplicitInstantiations
The queue of implicit template instantiations that are required and must be performed within the curr...
void DiagnoseUnsatisfiedConstraint(const ConstraintSatisfaction &Satisfaction, SourceLocation Loc={}, bool First=true)
Emit diagnostics explaining why a constraint expression was deemed unsatisfied.
ExprResult ActOnGNUNullExpr(SourceLocation TokenLoc)
ExprResult PerformContextuallyConvertToBool(Expr *From)
PerformContextuallyConvertToBool - Perform a contextual conversion of the expression From to bool (C+...
void DefineImplicitCopyAssignment(SourceLocation CurrentLocation, CXXMethodDecl *MethodDecl)
Defines an implicitly-declared copy assignment operator.
bool DiagnoseConditionalForNull(const Expr *LHSExpr, const Expr *RHSExpr, SourceLocation QuestionLoc)
Emit a specialized diagnostic when one expression is a null pointer constant and the other is not a p...
bool CheckFunctionConstraints(const FunctionDecl *FD, ConstraintSatisfaction &Satisfaction, SourceLocation UsageLoc=SourceLocation(), bool ForOverloadResolution=false)
Check whether the given function decl's trailing requires clause is satisfied, if any.
bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived, CXXRecordDecl *Base, CXXBasePaths &Paths)
Determine whether the type Derived is a C++ class that is derived from the type Base.
void MarkDeclarationsReferencedInType(SourceLocation Loc, QualType T)
Mark all of the declarations referenced within a particular AST node as referenced.
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
DeclContext * getFunctionLevelDeclContext(bool AllowLambda=false) const
If AllowLambda is true, treat lambda as function.
FunctionDecl * ResolveSingleFunctionTemplateSpecialization(OverloadExpr *ovl, bool Complain=false, DeclAccessPair *Found=nullptr, TemplateSpecCandidateSet *FailedTSC=nullptr, bool ForTypeDeduction=false)
Given an expression that refers to an overloaded function, try to resolve that overloaded function ex...
void CheckShadowingDeclModification(Expr *E, SourceLocation Loc)
Warn if 'E', which is an expression that is about to be modified, refers to a shadowing declaration.
void MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base=nullptr)
Perform reference-marking and odr-use handling for a DeclRefExpr.
ExprResult BuildQualifiedDeclarationNameExpr(CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, bool IsAddressOfOperand, TypeSourceInfo **RecoveryTSI=nullptr)
BuildQualifiedDeclarationNameExpr - Build a C++ qualified declaration name, generally during template...
ExprResult ActOnParenExpr(SourceLocation L, SourceLocation R, Expr *E)
ExprResult ActOnSourceLocExpr(SourceLocIdentKind Kind, SourceLocation BuiltinLoc, SourceLocation RPLoc)
llvm::PointerIntPair< ConstantExpr *, 1 > ImmediateInvocationCandidate
ExprResult CheckPlaceholderExpr(Expr *E)
Check for operands with placeholder types and complain if found.
ExprResult TransformToPotentiallyEvaluated(Expr *E)
EnableIfAttr * CheckEnableIf(FunctionDecl *Function, SourceLocation CallLoc, ArrayRef< Expr * > Args, bool MissingImplicitThis=false)
Check the enable_if expressions on the given function.
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
SourceManager & getSourceManager() const
ExprResult BuildAsTypeExpr(Expr *E, QualType DestTy, SourceLocation BuiltinLoc, SourceLocation RParenLoc)
Create a new AsTypeExpr node (bitcast) from the arguments.
bool CheckVecStepExpr(Expr *E)
ExprResult FixOverloadedFunctionReference(Expr *E, DeclAccessPair FoundDecl, FunctionDecl *Fn)
FixOverloadedFunctionReference - E is an expression that refers to a C++ overloaded function (possibl...
ExprResult ActOnConditionalOp(SourceLocation QuestionLoc, SourceLocation ColonLoc, Expr *CondExpr, Expr *LHSExpr, Expr *RHSExpr)
ActOnConditionalOp - Parse a ?
QualType CheckVectorCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
CheckVectorCompareOperands - vector comparisons are a clang extension that operates on extended vecto...
ExprResult CheckCXXBooleanCondition(Expr *CondExpr, bool IsConstexpr=false)
CheckCXXBooleanCondition - Returns true if conversion to bool is invalid.
ExprResult CheckLValueToRValueConversionOperand(Expr *E)
QualType CheckAssignmentOperands(Expr *LHSExpr, ExprResult &RHS, SourceLocation Loc, QualType CompoundType, BinaryOperatorKind Opc)
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...
ExprResult BuildPossibleImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, const TemplateArgumentListInfo *TemplateArgs, const Scope *S)
Builds an expression which might be an implicit member expression.
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
bool resolveAndFixAddressOfSingleOverloadCandidate(ExprResult &SrcExpr, bool DoFunctionPointerConversion=false)
Given an overloaded function, tries to turn it into a non-overloaded function reference using resolve...
void DiagnoseAvailabilityOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass, bool ObjCPropertyAccess, bool AvoidPartialAvailabilityChecks, ObjCInterfaceDecl *ClassReceiver)
CallExpr::ADLCallKind ADLCallKind
QualType CheckPointerToMemberOperands(ExprResult &LHS, ExprResult &RHS, ExprValueKind &VK, SourceLocation OpLoc, bool isIndirect)
std::vector< std::pair< QualType, unsigned > > ExcessPrecisionNotSatisfied
bool DiagRuntimeBehavior(SourceLocation Loc, const Stmt *Statement, const PartialDiagnostic &PD)
Conditionally issue a diagnostic based on the current evaluation context.
ExprResult BuildCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *Init=nullptr)
BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating the default expr if needed.
bool anyAltivecTypes(QualType srcType, QualType destType)
bool isLaxVectorConversion(QualType srcType, QualType destType)
Is this a legal conversion between two types, one of which is known to be a vector type?
void PushBlockScope(Scope *BlockScope, BlockDecl *Block)
ExprResult BuildOverloadedCallExpr(Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig, bool AllowTypoCorrection=true, bool CalleesAddressIsTaken=false)
BuildOverloadedCallExpr - Given the call expression that calls Fn (which eventually refers to the dec...
QualType CXXCheckConditionalOperands(ExprResult &cond, ExprResult &lhs, ExprResult &rhs, ExprValueKind &VK, ExprObjectKind &OK, SourceLocation questionLoc)
Check the operands of ?
ExprResult BuildAnonymousStructUnionMemberReference(const CXXScopeSpec &SS, SourceLocation nameLoc, IndirectFieldDecl *indirectField, DeclAccessPair FoundDecl=DeclAccessPair::make(nullptr, AS_none), Expr *baseObjectExpr=nullptr, SourceLocation opLoc=SourceLocation())
MaybeODRUseExprSet MaybeODRUseExprs
ExprResult PerformImplicitConversion(Expr *From, QualType ToType, const ImplicitConversionSequence &ICS, AssignmentAction Action, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
PerformImplicitConversion - Perform an implicit conversion of the expression From to the type ToType ...
bool isSFINAEContext() const
bool InstantiateInClassInitializer(SourceLocation PointOfInstantiation, FieldDecl *Instantiation, FieldDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs)
Instantiate the definition of a field from the given pattern.
bool CheckParmsForFunctionDef(ArrayRef< ParmVarDecl * > Parameters, bool CheckParameterNames)
CheckParmsForFunctionDef - Check that the parameters of the given function are appropriate for the de...
void CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl, const LookupResult &R)
Diagnose variable or built-in function shadowing.
ExprResult BuildCallToObjectOfClassType(Scope *S, Expr *Object, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc)
BuildCallToObjectOfClassType - Build a call to an object of class type (C++ [over....
ExprResult ActOnStringLiteral(ArrayRef< Token > StringToks, Scope *UDLScope=nullptr)
ActOnStringLiteral - The specified tokens were lexed as pasted string fragments (e....
ExprResult ActOnCXXReflectExpr(SourceLocation OpLoc, TypeSourceInfo *TSI)
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
ExprResult ActOnBinOp(Scope *S, SourceLocation TokLoc, tok::TokenKind Kind, Expr *LHSExpr, Expr *RHSExpr)
Binary Operators. 'Tok' is the token for the operator.
void checkUnusedDeclAttributes(Declarator &D)
checkUnusedDeclAttributes - Given a declarator which is not being used to build a declaration,...
ExprResult CheckExtVectorCast(SourceRange R, QualType DestTy, Expr *CastExpr, CastKind &Kind)
QualType CheckTemplateIdType(ElaboratedTypeKeyword Keyword, TemplateName Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs, Scope *Scope, bool ForNestedNameSpecifier)
void setFunctionHasBranchProtectedScope()
bool isConstantEvaluatedContext() const
void InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, FunctionDecl *Function, bool Recursive=false, bool DefinitionRequired=false, bool AtEndOfTU=false)
Instantiate the definition of the given function from its template.
void FinalizeVarWithDestructor(VarDecl *VD, CXXRecordDecl *DeclInit)
FinalizeVarWithDestructor - Prepare for calling destructor on the constructed variable.
ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, VerifyICEDiagnoser &Diagnoser, AllowFoldKind CanFold=AllowFoldKind::No)
VerifyIntegerConstantExpression - Verifies that an expression is an ICE, and reports the appropriate ...
bool CheckForConstantInitializer(Expr *Init, unsigned DiagID=diag::err_init_element_not_constant)
type checking declaration initializers (C99 6.7.8)
llvm::SmallPtrSet< const Decl *, 4 > ParsingInitForAutoVars
ParsingInitForAutoVars - a set of declarations with auto types for which we are currently parsing the...
bool CheckPointerConversion(Expr *From, QualType ToType, CastKind &Kind, CXXCastPath &BasePath, bool IgnoreBaseAccess, bool Diagnose=true)
CheckPointerConversion - Check the pointer conversion from the expression From to the type ToType.
SmallVector< ExprWithCleanups::CleanupObject, 8 > ExprCleanupObjects
ExprCleanupObjects - This is the stack of objects requiring cleanup that are created by the current f...
void NoteDeletedFunction(FunctionDecl *FD)
Emit a note explaining that this function is deleted.
sema::AnalysisBasedWarnings AnalysisWarnings
Worker object for performing CFG-based warnings.
std::deque< PendingImplicitInstantiation > PendingInstantiations
The queue of implicit template instantiations that are required but have not yet been performed.
ExprResult CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc, Expr *Idx, SourceLocation RLoc)
void NoteAllOverloadCandidates(Expr *E, QualType DestType=QualType(), bool TakingAddress=false)
ExprResult ActOnPredefinedExpr(SourceLocation Loc, tok::TokenKind Kind)
QualType GetSignedVectorType(QualType V)
Return a signed ext_vector_type that is of identical size and number of elements.
QualType CheckConditionalOperands(ExprResult &Cond, ExprResult &LHS, ExprResult &RHS, ExprValueKind &VK, ExprObjectKind &OK, SourceLocation QuestionLoc)
Note that LHS is not null here, even if this is the gnu "x ?: y" extension.
ExpressionEvaluationContext
Describes how the expressions currently being parsed are evaluated at run-time, if at all.
@ UnevaluatedAbstract
The current expression occurs within an unevaluated operand that unconditionally permits abstract ref...
@ UnevaluatedList
The current expression occurs within a braced-init-list within an unevaluated operand.
@ ConstantEvaluated
The current context is "potentially evaluated" in C++11 terms, but the expression is evaluated at com...
@ DiscardedStatement
The current expression occurs within a discarded statement.
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
@ ImmediateFunctionContext
In addition of being constant evaluated, the current expression occurs in an immediate function conte...
@ PotentiallyEvaluatedIfUsed
The current expression is potentially evaluated, but any declarations referenced inside that expressi...
void CheckCompatibleReinterpretCast(QualType SrcType, QualType DestType, bool IsDereference, SourceRange Range)
ExprResult BuildDependentDeclRefExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs)
ExprResult ActOnAsTypeExpr(Expr *E, ParsedType ParsedDestTy, SourceLocation BuiltinLoc, SourceLocation RParenLoc)
Parse a __builtin_astype expression.
ExprResult CreateUnaryExprOrTypeTraitExpr(TypeSourceInfo *TInfo, SourceLocation OpLoc, UnaryExprOrTypeTrait ExprKind, SourceRange R)
Build a sizeof or alignof expression given a type operand.
TypeSourceInfo * GetTypeForDeclarator(Declarator &D)
GetTypeForDeclarator - Convert the type for the specified declarator to Type instances.
void diagnoseTypo(const TypoCorrection &Correction, const PartialDiagnostic &TypoDiag, bool ErrorRecovery=true)
bool CheckCallReturnType(QualType ReturnType, SourceLocation Loc, CallExpr *CE, FunctionDecl *FD)
CheckCallReturnType - Checks that a call expression's return type is complete.
bool CheckUnaryExprOrTypeTraitOperand(Expr *E, UnaryExprOrTypeTrait ExprKind)
Check the constraints on expression operands to unary type expression and type traits.
ExprResult ActOnVAArg(SourceLocation BuiltinLoc, Expr *E, ParsedType Ty, SourceLocation RPLoc)
TypeSourceInfo * GetTypeForDeclaratorCast(Declarator &D, QualType FromTy)
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
Scope * TUScope
Translation Unit Scope - useful to Objective-C actions that need to lookup file scope declarations in...
ExprResult forceUnknownAnyToType(Expr *E, QualType ToType)
Force an expression with unknown-type to an expression of the given type.
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
void NoteDeletedInheritingConstructor(CXXConstructorDecl *CD)
QualType getCapturedDeclRefType(ValueDecl *Var, SourceLocation Loc)
Given a variable, determine the type that a reference to that variable will have in the given scope.
ExprResult ActOnCastExpr(Scope *S, SourceLocation LParenLoc, Declarator &D, ParsedType &Ty, SourceLocation RParenLoc, Expr *CastExpr)
ExprResult PerformObjectMemberConversion(Expr *From, NestedNameSpecifier Qualifier, NamedDecl *FoundDecl, NamedDecl *Member)
Cast a base object to a member's actual type.
Expr * MaybeCreateExprWithCleanups(Expr *SubExpr)
MaybeCreateExprWithCleanups - If the current full-expression requires any cleanups,...
bool RebuildingImmediateInvocation
Whether the AST is currently being rebuilt to correct immediate invocations.
void DiscardCleanupsInEvaluationContext()
bool NeedToCaptureVariable(ValueDecl *Var, SourceLocation Loc)
Checks if the variable must be captured.
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
void PushDeclContext(Scope *S, DeclContext *DC)
Set the current declaration context until it gets popped.
bool CheckVectorCast(SourceRange R, QualType VectorTy, QualType Ty, CastKind &Kind)
QualType getCompletedType(Expr *E)
Get the type of expression E, triggering instantiation to complete the type if necessary – that is,...
void mergeDeclAttributes(NamedDecl *New, Decl *Old, AvailabilityMergeKind AMK=AvailabilityMergeKind::Redeclaration)
mergeDeclAttributes - Copy attributes from the Old decl to the New one.
SourceManager & SourceMgr
bool CheckAlignasTypeArgument(StringRef KWName, TypeSourceInfo *TInfo, SourceLocation OpLoc, SourceRange R)
ExprResult BuildVectorLiteral(SourceLocation LParenLoc, SourceLocation RParenLoc, Expr *E, TypeSourceInfo *TInfo)
Build an altivec or OpenCL literal.
ExprResult UsualUnaryFPConversions(Expr *E)
UsualUnaryFPConversions - Promotes floating-point types according to the current language semantics.
bool isUnavailableAlignedAllocationFunction(const FunctionDecl &FD) const
Determine whether FD is an aligned allocation or deallocation function that is unavailable.
bool DiagnoseDependentMemberLookup(const LookupResult &R)
Diagnose a lookup that found results in an enclosing class during error recovery.
DiagnosticsEngine & Diags
OpenCLOptions & getOpenCLOptions()
NamespaceDecl * getStdNamespace() const
ExprResult DefaultFunctionArrayConversion(Expr *E, bool Diagnose=true)
DefaultFunctionArrayConversion (C99 6.3.2.1p3, C99 6.3.2.1p4).
void deduceClosureReturnType(sema::CapturingScopeInfo &CSI)
Deduce a block or lambda's return type based on the return statements present in the body.
bool areLaxCompatibleVectorTypes(QualType srcType, QualType destType)
Are the two types lax-compatible vector types?
ExprResult BuildBinOp(Scope *S, SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr, bool ForFoldExpression=false)
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
void diagnoseMissingTemplateArguments(TemplateName Name, SourceLocation Loc)
ExprResult ActOnIntegerConstant(SourceLocation Loc, int64_t Val)
ExprResult BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field)
friend class InitializationSequence
void DiagnoseAssignmentAsCondition(Expr *E)
DiagnoseAssignmentAsCondition - Given that an expression is being used as a boolean condition,...
void checkSpecializationVisibility(SourceLocation Loc, NamedDecl *Spec)
We've found a use of a templated declaration that would trigger an implicit instantiation.
QualType CheckBitwiseOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
llvm::MapVector< NamedDecl *, SourceLocation > UndefinedButUsed
UndefinedInternals - all the used, undefined objects which require a definition in this translation u...
ExprResult ActOnStmtExpr(Scope *S, SourceLocation LPLoc, Stmt *SubStmt, SourceLocation RPLoc)
bool ResolveAndFixSingleFunctionTemplateSpecialization(ExprResult &SrcExpr, bool DoFunctionPointerConversion=false, bool Complain=false, SourceRange OpRangeForComplaining=SourceRange(), QualType DestTypeForComplaining=QualType(), unsigned DiagIDForComplaining=0)
ExprResult ConvertParamDefaultArgument(ParmVarDecl *Param, Expr *DefaultArg, SourceLocation EqualLoc)
void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD)
ProcessDeclAttributes - Given a declarator (PD) with attributes indicated in it, apply them to D.
void checkVariadicArgument(const Expr *E, VariadicCallType CT)
Check to see if the given expression is a valid argument to a variadic function, issuing a diagnostic...
void CheckStaticArrayArgument(SourceLocation CallLoc, ParmVarDecl *Param, const Expr *ArgExpr)
CheckStaticArrayArgument - If the given argument corresponds to a static array parameter,...
QualType CheckSizelessVectorCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
ExprResult ConvertMemberDefaultInitExpression(FieldDecl *FD, Expr *InitExpr, SourceLocation InitLoc)
bool IsInvalidSMECallConversion(QualType FromType, QualType ToType)
void checkNonTrivialCUnionInInitializer(const Expr *Init, SourceLocation Loc)
Emit diagnostics if the initializer or any of its explicit or implicitly-generated subexpressions req...
ExprResult ActOnBlockStmtExpr(SourceLocation CaretLoc, Stmt *Body, Scope *CurScope)
ActOnBlockStmtExpr - This is called when the body of a block statement literal was successfully compl...
void DiagnoseDeletedDefaultedFunction(FunctionDecl *FD)
Produce notes explaining why a defaulted function was defined as deleted.
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
Run some code with "sufficient" stack space.
void MarkMemberReferenced(MemberExpr *E)
Perform reference-marking and odr-use handling for a MemberExpr.
bool DiagnoseAssignmentResult(AssignConvertType ConvTy, SourceLocation Loc, QualType DstType, QualType SrcType, Expr *SrcExpr, AssignmentAction Action, bool *Complained=nullptr)
DiagnoseAssignmentResult - Emit a diagnostic, if required, for the assignment conversion type specifi...
void MarkFunctionReferenced(SourceLocation Loc, FunctionDecl *Func, bool MightBeOdrUse=true)
Mark a function referenced, and check whether it is odr-used (C++ [basic.def.odr]p2,...
ExprResult ActOnStmtExprResult(ExprResult E)
ExprResult ActOnPostfixUnaryOp(Scope *S, SourceLocation OpLoc, tok::TokenKind Kind, Expr *Input)
std::tuple< MangleNumberingContext *, Decl * > getCurrentMangleNumberContext(const DeclContext *DC)
Compute the mangling number context for a lambda expression or block literal.
void DiagnoseEqualityWithExtraParens(ParenExpr *ParenE)
Redundant parentheses over an equality comparison can indicate that the user intended an assignment u...
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD=nullptr)
ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())
Attempts to produce a RecoveryExpr after some AST node cannot be created.
ExprResult ActOnNumericConstant(const Token &Tok, Scope *UDLScope=nullptr)
QualType CheckMatrixLogicalOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
ExprResult BuildInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList, SourceLocation RBraceLoc)
void ActOnBlockStart(SourceLocation CaretLoc, Scope *CurScope)
ActOnBlockStart - This callback is invoked when a block literal is started.
bool IsFunctionConversion(QualType FromType, QualType ToType) const
Determine whether the conversion from FromType to ToType is a valid conversion of ExtInfo/ExtProtoInf...
ExprResult ActOnArraySubscriptExpr(Scope *S, Expr *Base, SourceLocation LLoc, MultiExprArg ArgExprs, SourceLocation RLoc)
ExprResult ActOnCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig=nullptr)
ActOnCallExpr - Handle a call to Fn with the specified array of arguments.
ExprResult ActOnUnaryExprOrTypeTraitExpr(SourceLocation OpLoc, UnaryExprOrTypeTrait ExprKind, bool IsType, void *TyOrEx, SourceRange ArgRange)
ActOnUnaryExprOrTypeTraitExpr - Handle sizeof(type) and sizeof expr and the same for alignof and __al...
QualType PreferredConditionType(ConditionKind K) const
@ LOLR_ErrorNoDiagnostic
The lookup found no match but no diagnostic was issued.
@ LOLR_Raw
The lookup found a single 'raw' literal operator, which expects a string literal containing the spell...
@ LOLR_Error
The lookup resulted in an error.
@ LOLR_Cooked
The lookup found a single 'cooked' literal operator, which expects a normal literal to be built and p...
@ LOLR_StringTemplatePack
The lookup found an overload set of literal operator templates, which expect the character type and c...
@ LOLR_Template
The lookup found an overload set of literal operator templates, which expect the characters of the sp...
void ActOnBlockArguments(SourceLocation CaretLoc, Declarator &ParamInfo, Scope *CurScope)
ActOnBlockArguments - This callback allows processing of block arguments.
QualType CheckRemainderOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign=false)
@ Diagnose
Diagnose issues that are non-constant or that are extensions.
std::pair< ValueDecl *, SourceLocation > PendingImplicitInstantiation
An entity for which implicit template instantiation is required.
unsigned getTemplateDepth(Scope *S) const
Determine the number of levels of enclosing template parameters.
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
void checkEnumArithmeticConversions(Expr *LHS, Expr *RHS, SourceLocation Loc, ArithConvKind ACK)
Check that the usual arithmetic conversions can be performed on this pair of expressions that might b...
static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo=nullptr)
bool IsStringLiteralToNonConstPointerConversion(Expr *From, QualType ToType)
Helper function to determine whether this is the (deprecated) C++ conversion from a string literal to...
void computeNRVO(Stmt *Body, sema::FunctionScopeInfo *Scope)
Given the set of return statements within a function body, compute the variables that are subject to ...
void checkNonTrivialCUnion(QualType QT, SourceLocation Loc, NonTrivialCUnionContext UseContext, unsigned NonTrivialKind)
Emit diagnostics if a non-trivial C union type or a struct that contains a non-trivial C union is use...
static ConditionResult ConditionError()
ExprResult ActOnConvertVectorExpr(Expr *E, ParsedType ParsedDestTy, SourceLocation BuiltinLoc, SourceLocation RParenLoc)
ActOnConvertVectorExpr - create a new convert-vector expression from the provided arguments.
void HandleFunctionTypeMismatch(PartialDiagnostic &PDiag, QualType FromType, QualType ToType)
HandleFunctionTypeMismatch - Gives diagnostic information for differeing function types.
ExprResult checkUnknownAnyArg(SourceLocation callLoc, Expr *result, QualType ¶mType)
Type-check an expression that's being passed to an __unknown_anytype parameter.
bool ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, FunctionDecl *FDecl, const FunctionProtoType *Proto, ArrayRef< Expr * > Args, SourceLocation RParenLoc, bool ExecConfig=false)
ConvertArgumentsForCall - Converts the arguments specified in Args/NumArgs to the parameter types of ...
ExprResult ActOnBuiltinOffsetOf(Scope *S, SourceLocation BuiltinLoc, SourceLocation TypeLoc, ParsedType ParsedArgTy, ArrayRef< OffsetOfComponent > Components, SourceLocation RParenLoc)
SemaPseudoObject & PseudoObject()
bool hasAnyUnrecoverableErrorsInThisFunction() const
Determine whether any errors occurred within this function/method/ block.
bool CheckAltivecInitFromScalar(SourceRange R, QualType VecTy, QualType SrcTy)
ExprResult HandleExprEvaluationContextForTypeof(Expr *E)
ExprResult ActOnInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList, SourceLocation RBraceLoc)
bool isCheckingDefaultArgumentOrInitializer() const
bool CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall, const FunctionProtoType *Proto)
CheckFunctionCall - Check a direct function call for various correctness and safety properties not st...
SmallVector< std::pair< Scope *, SourceLocation >, 2 > CurrentDefer
Stack of '_Defer' statements that are currently being parsed, as well as the locations of their '_Def...
bool CheckCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *Init=nullptr, bool SkipImmediateInvocations=true)
Instantiate or parse a C++ default argument expression as necessary.
void DiagnoseImmediateEscalatingReason(FunctionDecl *FD)
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
ExprResult CreateBuiltinMatrixSubscriptExpr(Expr *Base, Expr *RowIdx, Expr *ColumnIdx, SourceLocation RBLoc)
Represents a function call to one of __builtin_LINE(), __builtin_COLUMN(), __builtin_FUNCTION(),...
SourceLocation getBeginLoc() const
const DeclContext * getParentContext() const
If the SourceLocExpr has been resolved return the subexpression representing the resolved value.
SourceLocation getEndLoc() const
SourceLocIdentKind getIdentKind() const
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
bool isInMainFile(SourceLocation Loc) const
Returns whether the PresumedLoc for a given SourceLocation is in the main file.
bool isInSystemMacro(SourceLocation loc) const
Returns whether Loc is expanded from a macro in a system header.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
StandardConversionSequence - represents a standard conversion sequence (C++ 13.3.3....
ImplicitConversionKind Second
Second - The second conversion can be an integral promotion, floating point promotion,...
void setAsIdentityConversion()
StandardConversionSequence - Set the standard conversion sequence to the identity conversion.
void setToType(unsigned Idx, QualType T)
NarrowingKind getNarrowingKind(ASTContext &Context, const Expr *Converted, APValue &ConstantValue, QualType &ConstantType, bool IgnoreFloatToIntegralConversion=false) const
Check if this standard conversion sequence represents a narrowing conversion, according to C++11 [dcl...
StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
StmtVisitor - This class implements a simple visitor for Stmt subclasses.
Stmt - This represents one statement.
SourceLocation getEndLoc() const LLVM_READONLY
StmtClass getStmtClass() const
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
StringLiteralParser - This decodes string escape characters and performs wide string analysis and Tra...
StringLiteral - This represents a string literal expression, e.g.
unsigned getLength() const
static StringLiteral * Create(const ASTContext &Ctx, StringRef Str, StringLiteralKind Kind, bool Pascal, QualType Ty, ArrayRef< SourceLocation > Locs)
This is the "fully general" constructor that allows representation of strings formed from one or more...
uint32_t getCodeUnit(size_t i) const
StringRef getString() const
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
void setElaboratedKeywordLoc(SourceLocation Loc)
Exposes information about the current target.
virtual bool hasLongDoubleType() const
Determine whether the long double type is supported on this target.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
@ CharPtrBuiltinVaList
typedef char* __builtin_va_list;
virtual bool useFP16ConversionIntrinsics() const
Check whether conversions to and from __fp16 should go through an integer bitcast with i16.
bool shouldUseMicrosoftCCforMangling() const
Should the Microsoft mangling scheme be used for C Calling Convention.
virtual bool hasFeature(StringRef Feature) const
Determine whether the given target has the given feature.
A convenient class for passing around template argument information.
void setLAngleLoc(SourceLocation Loc)
void setRAngleLoc(SourceLocation Loc)
void addArgument(const TemplateArgumentLoc &Loc)
Location wrapper for a TemplateArgument.
Represents a template argument.
Expr * getAsExpr() const
Retrieve the template argument as an expression.
bool isDependent() const
Whether this template argument is dependent on a template parameter such that its result can change f...
ValueDecl * getAsDecl() const
Retrieve the declaration for a declaration non-type template argument.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
The base class of all kinds of template declarations (e.g., class, function, etc.).
Represents a C++ template name within the type system.
A template parameter object.
Token - This structure provides full information about a lexed token.
void setKind(tok::TokenKind K)
void startToken()
Reset all flags to cleared.
Represents a declaration of a type.
SourceLocation getBeginLoc() const LLVM_READONLY
TyLocType push(QualType T)
Pushes space for a new TypeLoc of the given type.
TypeSpecTypeLoc pushTypeSpec(QualType T)
Pushes space for a typespec TypeLoc.
TypeSourceInfo * getTypeSourceInfo(ASTContext &Context, QualType T)
Creates a TypeSourceInfo for the given type.
Base wrapper for a particular "section" of type source info.
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
void initializeFullCopy(TypeLoc Other)
Initializes this by copying its information from another TypeLoc of the same type.
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
SourceRange getLocalSourceRange() const
Get the local source range.
T getAsAdjusted() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
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.
void setNameLoc(SourceLocation Loc)
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 isFixedPointOrIntegerType() const
Return true if this is a fixed point or integer type.
bool isBlockPointerType() const
bool isBooleanType() const
bool isObjCBuiltinType() const
bool isMFloat8Type() const
bool hasAttr(attr::Kind AK) const
Determine whether this type had the specified attribute applied to it (looking through top-level type...
const Type * getPointeeOrArrayElementType() const
If this is a pointer type, return the pointee type.
bool isIncompleteArrayType() 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 isComplexType() const
isComplexType() does not include complex integers (a GCC extension).
bool isIntegralOrUnscopedEnumerationType() const
Determine whether this type is an integral or unscoped enumeration type.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool canDecayToPointerType() const
Determines whether this type can decay to a pointer type.
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool hasIntegerRepresentation() const
Determine whether this type has an integer representation of some sort, e.g., it is an integer type o...
bool isVoidPointerType() const
const ComplexType * getAsComplexIntegerType() const
bool isFunctionPointerType() const
bool isArithmeticType() const
bool isConstantMatrixType() const
bool isPointerType() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
bool isSVESizelessBuiltinType() const
Returns true for SVE scalable vector types.
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isSignedFixedPointType() const
Return true if this is a fixed point type that is signed according to ISO/IEC JTC1 SC22 WG14 N1169.
bool isEnumeralType() const
bool isScalarType() const
bool isVariableArrayType() const
bool isSizelessBuiltinType() const
bool isSveVLSBuiltinType() const
Determines if this is a sizeless type supported by the 'arm_sve_vector_bits' type attribute,...
bool isIntegralType(const ASTContext &Ctx) const
Determine whether this type is an integral type.
bool isObjCQualifiedIdType() const
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 hasUnsignedIntegerRepresentation() const
Determine whether this type has an unsigned integer representation of some sort, e....
bool isExtVectorType() const
bool isAnyCharacterType() const
Determine whether this type is any of the built-in character types.
bool isExtVectorBoolType() const
QualType getSveEltType(const ASTContext &Ctx) const
Returns the representative type for the element of an SVE builtin type.
bool isNonOverloadPlaceholderType() const
Test for a placeholder type other than Overload; see BuiltinType::isNonOverloadPlaceholderType.
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isBitIntType() const
bool isSpecificBuiltinType(unsigned K) const
Test for a particular builtin type.
bool isBuiltinType() const
Helper methods to distinguish type categories.
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isAnyComplexType() const
bool isFixedPointType() const
Return true if this is a fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
bool isSaturatedFixedPointType() const
Return true if this is a saturated fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
ScalarTypeKind getScalarTypeKind() const
Given that this is a scalar type, classify it.
const BuiltinType * getAsPlaceholderType() const
bool hasSignedIntegerRepresentation() const
Determine whether this type has an signed integer representation of some sort, e.g....
bool isWebAssemblyTableType() const
Returns true if this is a WebAssembly table type: either an array of reference types,...
bool isMemberPointerType() const
bool isAtomicType() const
bool isOverloadableType() const
Determines whether this is a type for which one can define an overloaded operator.
bool isObjCIdType() const
bool isMatrixType() const
bool isOverflowBehaviorType() const
EnumDecl * castAsEnumDecl() const
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
bool isComplexIntegerType() const
bool isUnscopedEnumerationType() const
bool isObjCObjectType() const
bool isBlockCompatibleObjCPointerType(ASTContext &ctx) const
const ArrayType * getAsArrayTypeUnsafe() const
A variant of getAs<> for array types which silently discards qualifiers from the outermost type.
bool isObjCLifetimeType() const
Returns true if objects of this type have lifetime semantics under ARC.
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
bool isHLSLResourceRecord() const
EnumDecl * getAsEnumDecl() const
Retrieves the EnumDecl this type refers to.
bool isDoubleType() const
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isFunctionType() const
bool isObjCObjectPointerType() const
bool hasFloatingRepresentation() const
Determine whether this type has a floating-point representation of some sort, e.g....
bool isUnsignedFixedPointType() const
Return true if this is a fixed point type that is unsigned according to ISO/IEC JTC1 SC22 WG14 N1169.
bool isVectorType() const
bool isObjCQualifiedClassType() const
bool isObjCClassType() const
bool isRealFloatingType() const
Floating point categories.
bool isRVVSizelessBuiltinType() const
Returns true for RVV scalable vector types.
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...
const T * castAsCanonical() const
Return this type's canonical type cast to the specified type.
bool isAnyPointerType() const
TypeClass getTypeClass() const
bool isSubscriptableVectorType() const
const T * getAs() const
Member-template getAs<specific type>'.
bool isNullPtrType() const
bool isRecordType() const
bool isHLSLResourceRecordArray() const
std::optional< NullabilityKind > getNullability() const
Determine the nullability of the given type.
bool isScopedEnumeralType() const
Determine whether this type is a scoped enumeration type.
bool isUnicodeCharacterType() const
bool hasBooleanRepresentation() const
Determine whether this type has a boolean representation – i.e., it is a boolean type,...
Wrapper for source info for typedefs.
Simple class containing the result of Sema::CorrectTypo.
IdentifierInfo * getCorrectionAsIdentifierInfo() const
std::string getAsString(const LangOptions &LO) const
SourceRange getCorrectionRange() const
void WillReplaceSpecifier(bool ForceReplacement)
DeclClass * getCorrectionDeclAs() const
DeclarationName getCorrection() const
Gets the DeclarationName of the typo correction.
bool isOverloaded() const
NestedNameSpecifier getCorrectionSpecifier() const
Gets the NestedNameSpecifier needed to use the typo correction.
NamedDecl * getFoundDecl() const
Get the correction declaration found by name lookup (before we looked through using shadow declaratio...
UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated) expression operand.
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
SourceLocation getOperatorLoc() const
getOperatorLoc - Return the location of the operator.
Expr * getSubExpr() const
static OverloadedOperatorKind getOverloadedOperator(Opcode Opc)
Retrieve the overloaded operator kind that corresponds to the given unary opcode.
static bool isIncrementDecrementOp(Opcode Op)
static UnaryOperator * Create(const ASTContext &C, Expr *input, Opcode opc, QualType type, ExprValueKind VK, ExprObjectKind OK, SourceLocation l, bool CanOverflow, FPOptionsOverride FPFeatures)
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
Represents a C++ unqualified-id that has been parsed.
void setIdentifier(const IdentifierInfo *Id, SourceLocation IdLoc)
Specify that this unqualified-id was parsed as an identifier.
UnqualifiedIdKind getKind() const
Determine what kind of name we have.
TemplateIdAnnotation * TemplateId
When Kind == IK_TemplateId or IK_ConstructorTemplateId, the template-id annotation that contains the ...
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
static UnresolvedLookupExpr * Create(const ASTContext &Context, CXXRecordDecl *NamingClass, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool RequiresADL, UnresolvedSetIterator Begin, UnresolvedSetIterator End, bool KnownDependent, bool KnownInstantiationDependent)
Represents a C++ member access expression for which lookup produced a set of overloaded functions.
CXXRecordDecl * getNamingClass()
Retrieve the naming class of this lookup.
bool isImplicitAccess() const
True if this is an implicit access, i.e., one in which the member being accessed was not written in t...
A set of unresolved declarations.
A set of unresolved declarations.
A call to a literal operator (C++11 [over.literal]) written as a user-defined literal (C++11 [lit....
Represents a call to the builtin function __builtin_va_arg.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
void setType(QualType newType)
bool isWeak() const
Determine whether this symbol is weakly-imported, or declared with the weak or weak-ref attr.
VarDecl * getPotentiallyDecomposedVarDecl()
Represents a variable declaration or definition.
VarDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool isInitCapture() const
Whether this variable is the implicit variable for a lambda init-capture.
bool isInternalLinkageFileVar() const
Returns true if this is a file-scope variable with internal linkage.
bool isStaticDataMember() const
Determines whether this is a static data member.
bool hasGlobalStorage() const
Returns true for all variables that do not have local storage.
bool mightBeUsableInConstantExpressions(const ASTContext &C) const
Determine whether this variable's value might be usable in a constant expression, according to the re...
void setTemplateSpecializationKind(TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())
For a static data member that was instantiated from a static data member of a class template,...
bool isInline() const
Whether this variable is (C++1z) inline.
const Expr * getInit() const
bool hasExternalStorage() const
Returns true if a variable has extern or private_extern storage.
bool hasLocalStorage() const
Returns true if a variable with function scope is a non-static local variable.
@ TLS_None
Not a TLS variable.
@ DeclarationOnly
This declaration is only a declaration.
DefinitionKind hasDefinition(ASTContext &) const
Check whether this variable is defined in this translation unit.
bool isUsableInConstantExpressions(const ASTContext &C) const
Determine whether this variable's value can be used in a constant expression, according to the releva...
SourceLocation getPointOfInstantiation() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
bool isLocalVarDeclOrParm() const
Similar to isLocalVarDecl but also includes parameters.
TemplateSpecializationKind getTemplateSpecializationKind() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this variable is an instantiation of a static data member of a class template specialization,...
Represents a C array with a specified size that is not an integer-constant-expression.
Expr * getSizeExpr() const
Represents a GCC generic vector type.
unsigned getNumElements() const
VectorKind getVectorKind() const
QualType getElementType() const
Retains information about a block that is currently being parsed.
Scope * TheScope
TheScope - This is the scope for the block itself, which contains arguments etc.
QualType FunctionType
BlockType - The function type of the block, if one was given.
ValueDecl * getVariable() const
bool isBlockCapture() const
SourceLocation getLocation() const
Retrieve the location at which this variable was captured.
void markUsed(bool IsODRUse)
bool isThisCapture() const
QualType getCaptureType() const
Retrieve the capture type for this capture, which is effectively the type of the non-static data memb...
bool isCopyCapture() const
Retains information about a captured region.
unsigned short OpenMPLevel
unsigned short CapRegionKind
The kind of captured region.
unsigned short OpenMPCaptureLevel
void addVLATypeCapture(SourceLocation Loc, const VariableArrayType *VLAType, QualType CaptureType)
QualType ReturnType
ReturnType - The target type of return statements in this context, or null if unknown.
bool ContainsUnexpandedParameterPack
Whether this contains an unexpanded parameter pack.
SmallVector< Capture, 4 > Captures
Captures - The captures.
ImplicitCaptureStyle ImpCaptureStyle
unsigned CXXThisCaptureIndex
CXXThisCaptureIndex - The (index+1) of the capture of 'this'; zero if 'this' is not captured.
bool HasImplicitReturnType
Capture & getCXXThisCapture()
Retrieve the capture of C++ 'this', if it has been captured.
llvm::DenseMap< ValueDecl *, unsigned > CaptureMap
CaptureMap - A map of captured variables to (index+1) into Captures.
bool isCXXThisCaptured() const
Determine whether the C++ 'this' is captured.
bool isVLATypeCaptured(const VariableArrayType *VAT) const
Determine whether the given variable-array type has been captured.
void addCapture(ValueDecl *Var, bool isBlock, bool isByref, bool isNested, SourceLocation Loc, SourceLocation EllipsisLoc, QualType CaptureType, bool Invalid)
Capture & getCapture(ValueDecl *Var)
Retrieve the capture of the given variable, if it has been captured already.
Retains information about a function, method, or block that is currently being parsed.
void recordUseOfWeak(const ExprT *E, bool IsRead=true)
Record that a weak object was accessed.
void markSafeWeakUse(const Expr *E)
Record that a given expression is a "safe" access of a weak object (e.g.
void addBlock(const BlockDecl *BD)
void setHasBranchProtectedScope()
llvm::SmallVector< AddrLabelExpr *, 4 > AddrLabels
The set of GNU address of label extension "&&label".
bool HasOMPDeclareReductionCombiner
True if current scope is for OpenMP declare reduction combiner.
SourceRange IntroducerRange
Source range covering the lambda introducer [...].
bool lambdaCaptureShouldBeConst() const
void addPotentialCapture(Expr *VarExpr)
Add a variable that might potentially be captured by the lambda and therefore the enclosing lambdas.
void addPotentialThisCapture(SourceLocation Loc)
llvm::SmallPtrSet< VarDecl *, 4 > CUDAPotentialODRUsedVars
Variables that are potentially ODR-used in CUDA/HIP.
CXXRecordDecl * Lambda
The class that describes the lambda.
unsigned NumExplicitCaptures
The number of captures in the Captures list that are explicit captures.
bool AfterParameterList
Indicate that we parsed the parameter list at which point the mutability of the lambda is known.
CXXMethodDecl * CallOperator
The lambda's compiler-generated operator().
Defines the clang::TargetInfo interface.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
void checkAssignmentLifetime(Sema &SemaRef, const AssignedEntity &Entity, Expr *Init)
Check that the lifetime of the given expr (and its subobjects) is sufficient for assigning to the ent...
bool isStringLiteral(TokenKind K)
Return true if this is a C or C++ string-literal (or C++11 user-defined-string-literal) token.
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ OO_None
Not an overloaded operator.
bool isa(CodeGen::Address addr)
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
@ OR_Success
Overload resolution succeeded.
bool isTargetAddressSpace(LangAS AS)
DeclContext * getLambdaAwareParentOfDeclContext(DeclContext *DC)
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
ArithConvKind
Context in which we're performing a usual arithmetic conversion.
@ BitwiseOp
A bitwise operation.
@ Arithmetic
An arithmetic operation.
@ Conditional
A conditional (?:) operator.
@ CompAssign
A compound assignment expression.
@ Comparison
A comparison.
NullabilityKind
Describes the nullability of a particular type.
@ Nullable
Values of this type can be null.
@ Unspecified
Whether values of this type can be null is (explicitly) unspecified.
@ NonNull
Values of this type can never be null.
ExprObjectKind
A further classification of the kind of object referenced by an l-value or x-value.
@ 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_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.
std::string FormatUTFCodeUnitAsCodepoint(unsigned Value, QualType T)
@ Vector
'vector' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ IK_ImplicitSelfParam
An implicit 'self' parameter.
@ IK_TemplateId
A template-id, e.g., f<int>.
std::optional< ComparisonCategoryType > getComparisonCategoryForBuiltinCmp(QualType T)
Get the comparison category that should be used when comparing values of type T.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
@ Dependent
Parse the block as a dependent block, which may be used in some template instantiations but not other...
UnaryExprOrTypeTrait
Names for the "expression or type" traits.
unsigned toTargetAddressSpace(LangAS AS)
MutableArrayRef< Expr * > MultiExprArg
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
TemplateDecl * getAsTypeTemplateDecl(Decl *D)
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Result
The result type of a method or function.
ImplicitConversionKind
ImplicitConversionKind - The kind of implicit conversion used to convert an argument to a parameter's...
@ ICK_Complex_Conversion
Complex conversions (C99 6.3.1.6)
@ ICK_Integral_Conversion
Integral conversions (C++ [conv.integral])
@ ICK_Floating_Integral
Floating-integral conversions (C++ [conv.fpint])
@ ICK_HLSL_Array_RValue
HLSL non-decaying array rvalue cast.
@ ICK_Array_To_Pointer
Array-to-pointer conversion (C++ [conv.array])
@ ICK_Identity
Identity conversion (no conversion)
@ ICK_Lvalue_To_Rvalue
Lvalue-to-rvalue conversion (C++ [conv.lval])
@ ICK_Floating_Conversion
Floating point conversions (C++ [conv.double].
@ ICK_Complex_Real
Complex-real conversions (C99 6.3.1.7)
@ ICK_Function_To_Pointer
Function-to-pointer (C++ [conv.array])
AssignConvertType
AssignConvertType - All of the 'assignment' semantic checks return this enum to indicate whether the ...
@ IncompatiblePointer
IncompatiblePointer - The assignment is between two pointers types that are not compatible,...
@ Incompatible
Incompatible - We reject this conversion outright, it is invalid to represent it in the AST.
@ IntToPointer
IntToPointer - The assignment converts an int to a pointer, which we accept as an extension.
@ IncompatibleVectors
IncompatibleVectors - The assignment is between two vector types that have the same size,...
@ IncompatibleNestedPointerAddressSpaceMismatch
IncompatibleNestedPointerAddressSpaceMismatch - The assignment changes address spaces in nested point...
@ IncompatibleObjCWeakRef
IncompatibleObjCWeakRef - Assigning a weak-unavailable object to an object with __weak qualifier.
@ IntToBlockPointer
IntToBlockPointer - The assignment converts an int to a block pointer.
@ CompatibleOBTDiscards
CompatibleOBTDiscards - Assignment discards overflow behavior.
@ IncompatibleOBTKinds
IncompatibleOBTKinds - Assigning between incompatible OverflowBehaviorType kinds, e....
@ CompatibleVoidPtrToNonVoidPtr
CompatibleVoidPtrToNonVoidPtr - The types are compatible in C because a void * can implicitly convert...
@ IncompatiblePointerDiscardsQualifiers
IncompatiblePointerDiscardsQualifiers - The assignment discards qualifiers that we don't permit to be...
@ CompatiblePointerDiscardsQualifiers
CompatiblePointerDiscardsQualifiers - The assignment discards c/v/r qualifiers, which we accept as an...
@ IncompatibleObjCQualifiedId
IncompatibleObjCQualifiedId - The assignment is between a qualified id type and something else (that ...
@ Compatible
Compatible - the types are compatible according to the standard.
@ IncompatibleFunctionPointerStrict
IncompatibleFunctionPointerStrict - The assignment is between two function pointer types that are not...
@ IncompatiblePointerDiscardsOverflowBehavior
IncompatiblePointerDiscardsOverflowBehavior - The assignment discards overflow behavior annotations b...
@ PointerToInt
PointerToInt - The assignment converts a pointer to an int, which we accept as an extension.
@ FunctionVoidPointer
FunctionVoidPointer - The assignment is between a function pointer and void*, which the standard does...
@ IncompatibleNestedPointerQualifiers
IncompatibleNestedPointerQualifiers - The assignment is between two nested pointer types,...
@ IncompatibleFunctionPointer
IncompatibleFunctionPointer - The assignment is between two function pointers types that are not comp...
@ IncompatiblePointerSign
IncompatiblePointerSign - The assignment is between two pointers types which point to integers which ...
@ IncompatibleBlockPointer
IncompatibleBlockPointer - The assignment is between two block pointers types that are not compatible...
bool isFunctionLocalStringLiteralMacro(tok::TokenKind K, const LangOptions &LO)
Return true if the token corresponds to a function local predefined macro, which expands to a string ...
@ Type
The name was classified as a type.
LangAS
Defines the address space values used by the address space qualifier of QualType.
CastKind
CastKind - The kind of operation required for a conversion.
MutableArrayRef< ParsedTemplateArgument > ASTTemplateArgsPtr
bool isLambdaConversionOperator(CXXConversionDecl *C)
OverloadedOperatorKind getRewrittenOverloadedOperator(OverloadedOperatorKind Kind)
Get the other overloaded operator that the given operator can be rewritten into, if any such operator...
@ TNK_Var_template
The name refers to a variable template whose specialization produces a variable.
@ TNK_Concept_template
The name refers to a concept.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
bool isPtrSizeAddressSpace(LangAS AS)
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.
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
const char * getTraitSpelling(ExpressionTrait T) LLVM_READONLY
Return the spelling of the type trait TT. Never null.
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
@ NK_Not_Narrowing
Not a narrowing conversion.
@ NK_Constant_Narrowing
A narrowing conversion, because a constant expression got narrowed.
@ NK_Dependent_Narrowing
Cannot tell whether this is a narrowing conversion because the expression is value-dependent.
@ NK_Type_Narrowing
A narrowing conversion by virtue of the source and destination types.
@ NK_Variable_Narrowing
A narrowing conversion, because a non-constant-expression variable might have got narrowed.
DynamicRecursiveASTVisitorBase< false > DynamicRecursiveASTVisitor
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
CallingConv
CallingConv - Specifies the calling convention that a function uses.
@ AltiVecBool
is AltiVec 'vector bool ...'
@ SveFixedLengthData
is AArch64 SVE fixed-length data vector
@ AltiVecVector
is AltiVec vector
@ AltiVecPixel
is AltiVec 'vector Pixel'
@ Generic
not a target-specific vector type
@ RVVFixedLengthData
is RISC-V RVV fixed-length data vector
@ RVVFixedLengthMask
is RISC-V RVV fixed-length mask vector
@ SveFixedLengthPredicate
is AArch64 SVE fixed-length predicate vector
U cast(CodeGen::Address addr)
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
@ None
No keyword precedes the qualified type name.
bool isLambdaMethod(const DeclContext *DC)
llvm::omp::Clause OpenMPClauseKind
OpenMP clauses.
ActionResult< Expr * > ExprResult
@ Other
Other implicit parameter.
@ Implicit
An implicit conversion.
ActionResult< Stmt * > StmtResult
bool isGenericLambdaCallOperatorSpecialization(const CXXMethodDecl *MD)
NonOdrUseReason
The reason why a DeclRefExpr does not constitute an odr-use.
@ NOUR_Discarded
This name appears as a potential result of a discarded value expression.
@ NOUR_Unevaluated
This name appears in an unevaluated operand.
@ NOUR_None
This is an odr-use.
@ NOUR_Constant
This name appears as a potential result of an lvalue-to-rvalue conversion that is a constant expressi...
Represents an element in a path from a derived class to a base class.
The class facilities generation and storage of conversion FixIts.
OverloadFixItKind Kind
The type of fix applied.
bool tryToFixConversion(const Expr *FromExpr, const QualType FromQTy, const QualType ToQTy, Sema &S)
If possible, generates and stores a fix for the given conversion.
std::vector< FixItHint > Hints
The list of Hints generated so far.
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
DeclarationName getName() const
getName - Returns the embedded declaration name.
void setCXXLiteralOperatorNameLoc(SourceLocation Loc)
setCXXLiteralOperatorNameLoc - Sets the location of the literal operator name (not the operator keywo...
SourceLocation getBeginLoc() const
getBeginLoc - Retrieve the location of the first token.
SourceLocation getEndLoc() const LLVM_READONLY
Stores data related to a single embed directive.
EvalResult is a struct with detailed info about an evaluated expression.
APValue Val
Val - This is the value the expression can be folded to.
SmallVectorImpl< PartialDiagnosticAt > * Diag
Diag - If this is non-null, it will be filled in with a stack of notes indicating why evaluation fail...
bool HasUndefinedBehavior
Whether the evaluation hit undefined behavior.
bool HasSideEffects
Whether the evaluated expression has side effects.
Extra information about a function prototype.
FunctionType::ExtInfo ExtInfo
bool IsAddressOfOperandWithParen
bool HasFormOfMemberPointer
OverloadExpr * Expression
@ DefaultFunctionArgumentInstantiation
We are instantiating a default argument for a function.
Data structure used to record current or nested expression evaluation contexts.
llvm::SmallPtrSet< const Expr *, 8 > PossibleDerefs
bool InLifetimeExtendingContext
Whether we are currently in a context in which all temporaries must be lifetime-extended,...
Decl * ManglingContextDecl
The declaration that provides context for lambda expressions and block literals if the normal declara...
bool InDiscardedStatement
bool InImmediateFunctionContext
SmallVector< Expr *, 2 > VolatileAssignmentLHSs
Expressions appearing as the LHS of a volatile assignment in this context.
bool isUnevaluated() const
llvm::SmallPtrSet< DeclRefExpr *, 4 > ReferenceToConsteval
Set of DeclRefExprs referencing a consteval function when used in a context not already known to be i...
llvm::SmallVector< ImmediateInvocationCandidate, 4 > ImmediateInvocationCandidates
Set of candidates for starting an immediate invocation.
bool isImmediateFunctionContext() const
SmallVector< MaterializeTemporaryExpr *, 8 > ForRangeLifetimeExtendTemps
P2718R0 - Lifetime extension in range-based for loops.
enum clang::Sema::ExpressionEvaluationContextRecord::ExpressionKind ExprContext
SmallVector< LambdaExpr *, 2 > Lambdas
The lambdas that are present within this context, if it is indeed an unevaluated context.
ExpressionKind
Describes whether we are in an expression constext which we have to handle differently.
MaybeODRUseExprSet SavedMaybeODRUseExprs
CleanupInfo ParentCleanup
Whether the enclosing context needed a cleanup.
bool isConstantEvaluated() const
bool isDiscardedStatementContext() const
ExpressionEvaluationContext Context
The expression evaluation context.
bool InImmediateEscalatingFunctionContext
unsigned NumCleanupObjects
The number of active cleanup objects when we entered this expression evaluation context.
Abstract class used to diagnose incomplete types.
Location information for a TemplateArgument.
TemplateNameKind Kind
The kind of template that Template refers to.
unsigned NumArgs
NumArgs - The number of template arguments.
SourceLocation TemplateNameLoc
TemplateNameLoc - The location of the template name within the source.
ParsedTemplateArgument * getTemplateArgs()
Retrieves a pointer to the template arguments.
SourceLocation RAngleLoc
The location of the '>' after the template argument list.
SourceLocation LAngleLoc
The location of the '<' before the template argument list.
ParsedTemplateTy Template
The declaration of the template corresponding to the template-name.
Describes an entity that is being assigned.