66#include "llvm/ADT/STLExtras.h"
67#include "llvm/ADT/StringExtras.h"
68#include "llvm/Support/ConvertUTF.h"
69#include "llvm/Support/SaveAndRestore.h"
70#include "llvm/Support/TimeProfiler.h"
71#include "llvm/Support/TypeSize.h"
96 if (TreatUnavailableAsInvalid &&
114 if (
const auto *A = D->
getAttr<UnusedAttr>()) {
117 if (A->getSemanticSpelling() != UnusedAttr::CXX11_maybe_unused &&
118 A->getSemanticSpelling() != UnusedAttr::C23_maybe_unused) {
120 if (DC && !DC->
hasAttr<UnusedAttr>())
121 S.
Diag(Loc, diag::warn_used_but_marked_unused) << D;
129 if (
Decl->isDefaulted()) {
140 auto *Ctor = dyn_cast<CXXConstructorDecl>(
Decl);
141 if (Ctor && Ctor->isInheritingConstructor())
152 if (I->getStorageClass() !=
SC_None)
203 DiagID = diag::warn_c2y_compat_internal_in_extern_inline;
204 else if ((UsedFn && (UsedFn->
isInlined() || UsedFn->
hasAttr<ConstAttr>())) ||
206 DiagID = diag::ext_internal_in_extern_inline_quiet;
208 DiagID = diag::ext_internal_in_extern_inline;
210 S.
Diag(Loc, DiagID) << !UsedFn << D;
222 Diag(DeclBegin, diag::note_convert_inline_to_static)
229 bool ObjCPropertyAccess,
230 bool AvoidPartialAvailabilityChecks,
232 bool SkipTrailingRequiresClause) {
239 for (
const auto &[DiagLoc, PD] : Pos->second) {
253 Diag(Loc, diag::ext_main_used);
261 Diag(Loc, diag::err_binding_cannot_appear_in_own_initializer)
264 Diag(Loc, diag::err_auto_variable_cannot_appear_in_own_initializer)
273 if (FD->isDeleted()) {
274 auto *Ctor = dyn_cast<CXXConstructorDecl>(FD);
275 if (Ctor && Ctor->isInheritingConstructor())
276 Diag(Loc, diag::err_deleted_inherited_ctor_use)
278 << Ctor->getInheritedConstructor().getConstructor()->getParent();
281 Diag(Loc, diag::err_deleted_function_use)
282 << (Msg !=
nullptr) << (Msg ? Msg->
getString() : StringRef());
296 if (!SkipTrailingRequiresClause && FD->getTrailingRequiresClause()) {
305 diag::err_reference_to_function_with_unsatisfied_constraints)
323 if (
auto *
Concept = dyn_cast<ConceptDecl>(D);
327 if (
auto *MD = dyn_cast<CXXMethodDecl>(D)) {
329 if (MD->getParent()->isLambda() &&
332 MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator())) {
333 Diag(Loc, diag::warn_cxx17_compat_lambda_def_ctor_assign)
338 auto getReferencedObjCProp = [](
const NamedDecl *D) ->
340 if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D))
341 return MD->findPropertyDecl();
355 auto *DRD = dyn_cast<OMPDeclareReductionDecl>(
CurContext);
358 Diag(Loc, diag::err_omp_wrong_var_in_declare_reduction)
371 Diag(Loc, diag::err_omp_declare_mapper_wrong_var)
377 if (
const auto *EmptyD = dyn_cast<UnresolvedUsingIfExistsDecl>(D)) {
378 Diag(Loc, diag::err_use_of_empty_using_if_exists);
379 Diag(EmptyD->getLocation(), diag::note_empty_using_if_exists_here);
384 AvoidPartialAvailabilityChecks, ClassReceiver);
390 if (D->
hasAttr<AvailableOnlyInDefaultEvalMethodAttr>()) {
393 PP.getLastFPEvalPragmaLocation().isValid() &&
394 PP.getCurrentFPEvalMethod() !=
getLangOpts().getFPEvalMethod())
396 diag::err_type_available_only_in_default_eval_method)
400 if (
auto *VD = dyn_cast<ValueDecl>(D))
405 if (!
Context.getTargetInfo().isTLSSupported())
406 if (
const auto *VD = dyn_cast<VarDecl>(D))
408 targetDiag(*Locs.begin(), diag::err_thread_unsupported);
419 const SentinelAttr *
Attr = D->
getAttr<SentinelAttr>();
424 unsigned NumFormalParams;
428 enum { CK_Function, CK_Method, CK_Block } CalleeKind;
430 if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D)) {
431 NumFormalParams = MD->param_size();
432 CalleeKind = CK_Method;
433 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
434 NumFormalParams = FD->param_size();
435 CalleeKind = CK_Function;
436 }
else if (
const auto *VD = dyn_cast<VarDecl>(D)) {
443 CalleeKind = CK_Function;
446 CalleeKind = CK_Block;
451 if (
const auto *proto = dyn_cast<FunctionProtoType>(Fn))
452 NumFormalParams = proto->getNumParams();
463 unsigned NullPos =
Attr->getNullPos();
464 assert((NullPos == 0 || NullPos == 1) &&
"invalid null position on sentinel");
465 NumFormalParams = (NullPos > NumFormalParams ? 0 : NumFormalParams - NullPos);
468 unsigned NumArgsAfterSentinel =
Attr->getSentinel();
472 if (Args.size() < NumFormalParams + NumArgsAfterSentinel + 1) {
479 const Expr *SentinelExpr = Args[Args.size() - NumArgsAfterSentinel - 1];
484 if (
Context.isSentinelNullExpr(SentinelExpr))
492 std::string NullValue;
493 if (CalleeKind == CK_Method &&
PP.isMacroDefined(
"nil"))
496 NullValue =
"nullptr";
497 else if (
PP.isMacroDefined(
"NULL"))
500 NullValue =
"(void*) 0";
503 Diag(Loc, diag::warn_missing_sentinel) <<
int(CalleeKind);
505 Diag(MissingNilLoc, diag::warn_missing_sentinel)
530 assert(!Ty.
isNull() &&
"DefaultFunctionArrayConversion - missing type");
534 if (
auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl()))
539 CK_FunctionToPointerDecay).
get();
554 CK_ArrayToPointerDecay);
570 if (UO && UO->getOpcode() == UO_Deref &&
571 UO->getSubExpr()->getType()->isPointerType()) {
573 UO->getSubExpr()->getType()->getPointeeType().getAddressSpace();
576 UO->getSubExpr()->IgnoreParenCasts()->isNullPointerConstant(
578 !UO->getType().isVolatileQualified()) {
580 S.
PDiag(diag::warn_indirection_through_null)
581 << UO->getSubExpr()->getSourceRange());
583 S.
PDiag(diag::note_indirection_through_null));
603 BaseType = BaseType->getPointeeType();
615 if (ObjectSetClass) {
659 assert(!T.isNull() &&
"r-value conversion on typeless expression?");
663 if (T->canDecayToPointerType())
671 (T->isDependentType() && !T->isAnyPointerType() &&
672 !T->isMemberPointerType()))
696 &
Context.Idents.get(
"object_getClass"),
702 SourceRange(OISA->getOpLoc(), OISA->getIsaMemberLoc()),
")");
719 if (T.hasQualifiers())
720 T = T.getUnqualifiedType();
723 if (T->isMemberPointerType() &&
724 Context.getTargetInfo().getCXXABI().isMicrosoft())
735 Cleanup.setExprNeedsCleanups(
true);
738 Cleanup.setExprNeedsCleanups(
true);
745 CastKind CK = T->isNullPtrType() ? CK_NullToPointer : CK_LValueToRValue;
753 T =
Atomic->getValueType().getUnqualifiedType();
778 CK_FunctionToPointerDecay);
792 assert(!Ty.
isNull() &&
"UsualUnaryFPConversions - missing type");
798 PP.getLastFPEvalPragmaLocation().isValid())) {
799 switch (EvalMethod) {
801 llvm_unreachable(
"Unrecognized float evaluation method");
804 llvm_unreachable(
"Float evaluation method should be set by now");
812 CK_FloatingComplexCast)
821 CK_FloatingComplexCast)
853 assert(!Ty.
isNull() &&
"UsualUnaryConversions - missing type");
877 if (
Context.isPromotableIntegerType(Ty)) {
892 assert(!Ty.
isNull() &&
"DefaultArgumentPromotion - missing type");
904 if (BTy && (BTy->
getKind() == BuiltinType::Half ||
905 BTy->
getKind() == BuiltinType::Float)) {
908 if (BTy->
getKind() == BuiltinType::Half) {
919 Context.getTypeSizeInChars(BTy) <
925 assert(8 ==
Context.getTypeSizeInChars(
Context.LongLongTy).getQuantity() &&
926 "Unexpected typesize for LongLongTy");
980 if (
Context.getTargetInfo().getTriple().isWasm() &&
995 if (!
Record->hasNonTrivialCopyConstructor() &&
996 !
Record->hasNonTrivialMoveConstructor() &&
997 !
Record->hasNonTrivialDestructor())
1030 PDiag(diag::warn_cxx98_compat_pass_non_pod_arg_to_vararg) << Ty << CT);
1037 PDiag(diag::warn_pass_class_arg_to_vararg)
1045 PDiag(diag::warn_cannot_pass_non_pod_arg_to_vararg)
1052 diag::err_cannot_pass_non_trivial_c_struct_to_vararg)
1056 PDiag(diag::err_cannot_pass_objc_interface_to_vararg)
1069 if (PlaceholderTy->getKind() == BuiltinType::ARCUnbridgedCast &&
1071 (FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>()))) {
1110 if (
Call.isInvalid())
1115 if (Comma.isInvalid())
1122 diag::err_call_incomplete_argument))
1140 if (SkipCast)
return false;
1147 CK_IntegralComplexToFloatingComplex);
1165 bool PromotePrecision) {
1170 if (PromotePrecision) {
1175 if (LongerIsComplex)
1187 QualType RHSType,
bool IsCompAssign) {
1212 bool ConvertFloat,
bool ConvertInt) {
1217 CK_IntegralToFloating);
1228 CK_IntegralComplexToFloatingComplex);
1233 CK_FloatingRealToComplex);
1242 QualType RHSType,
bool IsCompAssign) {
1252 else if (!IsCompAssign)
1254 return LHSFloat ? LHSType : RHSType;
1259 if (LHSFloat && RHSFloat) {
1266 assert(order < 0 &&
"illegal float comparison");
1300 QualType LHSElem = LHSComplex ? LHSComplex->getElementType() : LHSType;
1306 if ((&LHSSem != &llvm::APFloat::PPCDoubleDouble() ||
1307 &RHSSem != &llvm::APFloat::IEEEquad()) &&
1308 (&LHSSem != &llvm::APFloat::IEEEquad() ||
1309 &RHSSem != &llvm::APFloat::PPCDoubleDouble()))
1326 CK_IntegralComplexCast);
1332template <PerformCastFn doLHSCast, PerformCastFn doRHSCast>
1335 QualType RHSType,
bool IsCompAssign) {
1340 if (LHSSigned == RHSSigned) {
1343 RHS = (*doRHSCast)(S, RHS.
get(), LHSType);
1345 }
else if (!IsCompAssign)
1346 LHS = (*doLHSCast)(S, LHS.
get(), RHSType);
1348 }
else if (order != (LHSSigned ? 1 : -1)) {
1352 RHS = (*doRHSCast)(S, RHS.
get(), LHSType);
1354 }
else if (!IsCompAssign)
1355 LHS = (*doLHSCast)(S, LHS.
get(), RHSType);
1362 RHS = (*doRHSCast)(S, RHS.
get(), LHSType);
1364 }
else if (!IsCompAssign)
1365 LHS = (*doLHSCast)(S, LHS.
get(), RHSType);
1374 RHS = (*doRHSCast)(S, RHS.
get(), result);
1376 LHS = (*doLHSCast)(S, LHS.
get(), result);
1386 bool IsCompAssign) {
1390 if (LHSComplexInt && RHSComplexInt) {
1395 (S, LHS, RHS, LHSEltType, RHSEltType, IsCompAssign);
1400 if (LHSComplexInt) {
1404 (S, LHS, RHS, LHSEltType, RHSType, IsCompAssign);
1407 CK_IntegralRealToComplex);
1412 assert(RHSComplexInt);
1417 (S, LHS, RHS, LHSType, RHSEltType, IsCompAssign);
1422 CK_IntegralRealToComplex);
1430 bool IsCompAssign) {
1432 const auto *LhsOBT = LHSType->
getAs<OverflowBehaviorType>();
1433 const auto *RhsOBT = RHSType->
getAs<OverflowBehaviorType>();
1436 "Non-integer type conversion not supported for OverflowBehaviorTypes");
1439 LhsOBT && LhsOBT->getBehaviorKind() ==
1440 OverflowBehaviorType::OverflowBehaviorKind::Trap;
1442 RhsOBT && RhsOBT->getBehaviorKind() ==
1443 OverflowBehaviorType::OverflowBehaviorKind::Trap;
1445 LhsOBT && LhsOBT->getBehaviorKind() ==
1446 OverflowBehaviorType::OverflowBehaviorKind::Wrap;
1448 RhsOBT && RhsOBT->getBehaviorKind() ==
1449 OverflowBehaviorType::OverflowBehaviorKind::Wrap;
1451 QualType LHSUnderlyingType = LhsOBT ? LhsOBT->getUnderlyingType() : LHSType;
1452 QualType RHSUnderlyingType = RhsOBT ? RhsOBT->getUnderlyingType() : RHSType;
1454 std::optional<OverflowBehaviorType::OverflowBehaviorKind> DominantBehavior;
1455 if (LHSHasTrap || RHSHasTrap)
1456 DominantBehavior = OverflowBehaviorType::OverflowBehaviorKind::Trap;
1457 else if (LHSHasWrap || RHSHasWrap)
1458 DominantBehavior = OverflowBehaviorType::OverflowBehaviorKind::Wrap;
1460 QualType LHSConvType = LHSUnderlyingType;
1461 QualType RHSConvType = RHSUnderlyingType;
1462 if (DominantBehavior) {
1463 if (!LhsOBT || LhsOBT->getBehaviorKind() != *DominantBehavior)
1467 LHSConvType = LHSType;
1469 if (!RhsOBT || RhsOBT->getBehaviorKind() != *DominantBehavior)
1473 RHSConvType = RHSType;
1477 S, LHS, RHS, LHSConvType, RHSConvType, IsCompAssign);
1485 assert(BTy &&
"Expected a builtin type.");
1487 switch (BTy->getKind()) {
1488 case BuiltinType::ShortFract:
1489 case BuiltinType::UShortFract:
1490 case BuiltinType::SatShortFract:
1491 case BuiltinType::SatUShortFract:
1493 case BuiltinType::Fract:
1494 case BuiltinType::UFract:
1495 case BuiltinType::SatFract:
1496 case BuiltinType::SatUFract:
1498 case BuiltinType::LongFract:
1499 case BuiltinType::ULongFract:
1500 case BuiltinType::SatLongFract:
1501 case BuiltinType::SatULongFract:
1503 case BuiltinType::ShortAccum:
1504 case BuiltinType::UShortAccum:
1505 case BuiltinType::SatShortAccum:
1506 case BuiltinType::SatUShortAccum:
1508 case BuiltinType::Accum:
1509 case BuiltinType::UAccum:
1510 case BuiltinType::SatAccum:
1511 case BuiltinType::SatUAccum:
1513 case BuiltinType::LongAccum:
1514 case BuiltinType::ULongAccum:
1515 case BuiltinType::SatLongAccum:
1516 case BuiltinType::SatULongAccum:
1519 if (BTy->isInteger())
1521 llvm_unreachable(
"Unexpected fixed point or integer type");
1533 "Expected at least one of the operands to be a fixed point type");
1536 "Special fixed point arithmetic operation conversions are only "
1537 "applied to ints or other fixed point types");
1559 QualType ResultTy = LHSTyRank > RHSTyRank ? LHSTy : RHSTy;
1582 REnum = R->isUnscopedEnumerationType();
1584 if ((!IsCompAssign && LEnum && R->isFloatingType()) ||
1588 ? diag::warn_arith_conv_enum_float_cxx20
1589 : diag::warn_arith_conv_enum_float)
1592 }
else if (!IsCompAssign && LEnum && REnum &&
1593 !
Context.hasSameUnqualifiedType(L, R)) {
1598 DiagID = diag::warn_conv_mixed_enum_types_cxx26;
1599 else if (!L->
castAsCanonical<EnumType>()->getDecl()->hasNameForLinkage() ||
1600 !R->castAsCanonical<EnumType>()->getDecl()->hasNameForLinkage()) {
1605 ? diag::warn_arith_conv_mixed_anon_enum_types_cxx20
1606 : diag::warn_arith_conv_mixed_anon_enum_types;
1611 ? diag::warn_conditional_mixed_enum_types_cxx20
1612 : diag::warn_conditional_mixed_enum_types;
1617 ? diag::warn_comparison_mixed_enum_types_cxx20
1618 : diag::warn_comparison_mixed_enum_types;
1621 ? diag::warn_arith_conv_mixed_enum_types_cxx20
1622 : diag::warn_arith_conv_mixed_enum_types;
1625 << (int)ACK << L << R;
1643 auto IsSingleCodeUnitCP = [](
const QualType &T,
const llvm::APSInt &
Value) {
1644 if (T->isChar8Type())
1645 return llvm::IsSingleCodeUnitUTF8Codepoint(
Value.getExtValue());
1646 if (T->isChar16Type())
1647 return llvm::IsSingleCodeUnitUTF16Codepoint(
Value.getExtValue());
1648 assert(T->isChar32Type());
1649 return llvm::IsSingleCodeUnitUTF32Codepoint(
Value.getExtValue());
1662 if (LHSSuccess != RHSuccess) {
1664 if (IsSingleCodeUnitCP(LHSType, Res.
Val.
getInt()) &&
1665 IsSingleCodeUnitCP(RHSType, Res.
Val.
getInt()))
1669 if (!LHSSuccess || !RHSuccess) {
1670 SemaRef.
Diag(Loc, diag::warn_comparison_unicode_mixed_types)
1676 llvm::APSInt LHSValue(32);
1678 llvm::APSInt RHSValue(32);
1681 bool LHSSafe = IsSingleCodeUnitCP(LHSType, LHSValue);
1682 bool RHSSafe = IsSingleCodeUnitCP(RHSType, RHSValue);
1683 if (LHSSafe && RHSSafe)
1686 SemaRef.
Diag(Loc, diag::warn_comparison_unicode_mixed_types_constant)
1696 SemaRef.
Diag(Loc, diag::warn_arith_conv_mixed_unicode_types)
1730 LHSType = AtomicLHS->getValueType();
1733 if (
Context.hasSameType(LHSType, RHSType))
1734 return Context.getCommonSugaredType(LHSType, RHSType);
1742 QualType LHSUnpromotedType = LHSType;
1743 if (
Context.isPromotableIntegerType(LHSType))
1744 LHSType =
Context.getPromotedIntegerType(LHSType);
1746 if (!LHSBitfieldPromoteTy.
isNull())
1747 LHSType = LHSBitfieldPromoteTy;
1752 if (
Context.hasSameType(LHSType, RHSType))
1753 return Context.getCommonSugaredType(LHSType, RHSType);
1800 bool PredicateIsExpr,
void *ControllingExprOrType,
1802 unsigned NumAssocs = ArgTypes.size();
1803 assert(NumAssocs == ArgExprs.size());
1806 for (
unsigned i = 0; i < NumAssocs; ++i) {
1815 if (!PredicateIsExpr) {
1819 assert(ControllingType &&
"couldn't get the type out of the parser");
1820 ControllingExprOrType = ControllingType;
1824 KeyLoc, DefaultLoc, RParenLoc, PredicateIsExpr, ControllingExprOrType,
1836 const auto *TOBT = T->getAs<OverflowBehaviorType>();
1837 const auto *UOBT =
U.getCanonicalType()->getAs<OverflowBehaviorType>();
1841 if (TOBT->getBehaviorKind() == UOBT->getBehaviorKind())
1843 UOBT->getUnderlyingType());
1855 bool PredicateIsExpr,
void *ControllingExprOrType,
1857 unsigned NumAssocs = Types.size();
1858 assert(NumAssocs == Exprs.size());
1859 assert(ControllingExprOrType &&
1860 "Must have either a controlling expression or a controlling type");
1862 Expr *ControllingExpr =
nullptr;
1864 if (PredicateIsExpr) {
1871 reinterpret_cast<Expr *
>(ControllingExprOrType));
1874 ControllingExpr = R.get();
1877 ControllingType =
reinterpret_cast<TypeSourceInfo *
>(ControllingExprOrType);
1878 if (!ControllingType)
1882 bool TypeErrorFound =
false,
1883 IsResultDependent = ControllingExpr
1886 ContainsUnexpandedParameterPack =
1896 diag::warn_side_effects_unevaluated_context);
1898 for (
unsigned i = 0; i < NumAssocs; ++i) {
1899 if (Exprs[i]->containsUnexpandedParameterPack())
1900 ContainsUnexpandedParameterPack =
true;
1903 if (Types[i]->
getType()->containsUnexpandedParameterPack())
1904 ContainsUnexpandedParameterPack =
true;
1906 if (Types[i]->
getType()->isDependentType()) {
1907 IsResultDependent =
true;
1924 if (ControllingExpr && Types[i]->
getType()->isIncompleteType())
1925 D =
LangOpts.C2y ? diag::warn_c2y_compat_assoc_type_incomplete
1926 : diag::ext_assoc_type_incomplete;
1927 else if (ControllingExpr && !Types[i]->
getType()->isObjectType())
1928 D = diag::err_assoc_type_nonobject;
1929 else if (Types[i]->
getType()->isVariablyModifiedType())
1930 D = diag::err_assoc_type_variably_modified;
1931 else if (ControllingExpr) {
1950 unsigned Reason = 0;
1959 Diag(Types[i]->getTypeLoc().getBeginLoc(),
1960 diag::warn_unreachable_association)
1961 << QT << (Reason - 1);
1965 Diag(Types[i]->getTypeLoc().getBeginLoc(), D)
1966 << Types[i]->getTypeLoc().getSourceRange() << Types[i]->getType();
1968 D, Types[i]->getTypeLoc().getBeginLoc()) >=
1970 TypeErrorFound =
true;
1975 for (
unsigned j = i+1; j < NumAssocs; ++j)
1976 if (Types[j] && !Types[j]->
getType()->isDependentType() &&
1979 Diag(Types[j]->getTypeLoc().getBeginLoc(),
1980 diag::err_assoc_compatible_types)
1981 << Types[j]->getTypeLoc().getSourceRange()
1982 << Types[j]->getType()
1983 << Types[i]->getType();
1984 Diag(Types[i]->getTypeLoc().getBeginLoc(),
1985 diag::note_compat_assoc)
1986 << Types[i]->getTypeLoc().getSourceRange()
1987 << Types[i]->getType();
1988 TypeErrorFound =
true;
1998 if (IsResultDependent) {
1999 if (ControllingExpr)
2001 Types, Exprs, DefaultLoc, RParenLoc,
2002 ContainsUnexpandedParameterPack);
2004 Exprs, DefaultLoc, RParenLoc,
2005 ContainsUnexpandedParameterPack);
2009 unsigned DefaultIndex = std::numeric_limits<unsigned>::max();
2013 for (
unsigned i = 0; i < NumAssocs; ++i) {
2021 QualType AssocQT = Types[i]->getType();
2027 CompatIndices.push_back(i);
2031 auto GetControllingRangeAndType = [](
Expr *ControllingExpr,
2035 if (ControllingExpr)
2044 return std::make_pair(SR, QT);
2050 if (CompatIndices.size() > 1) {
2051 auto P = GetControllingRangeAndType(ControllingExpr, ControllingType);
2054 << SR << P.second << (
unsigned)CompatIndices.size();
2055 for (
unsigned I : CompatIndices) {
2056 Diag(Types[I]->getTypeLoc().getBeginLoc(),
2057 diag::note_compat_assoc)
2058 << Types[I]->getTypeLoc().getSourceRange()
2059 << Types[I]->getType();
2067 if (DefaultIndex == std::numeric_limits<unsigned>::max() &&
2068 CompatIndices.size() == 0) {
2069 auto P = GetControllingRangeAndType(ControllingExpr, ControllingType);
2071 Diag(SR.
getBegin(), diag::err_generic_sel_no_match) << SR << P.second;
2080 unsigned ResultIndex =
2081 CompatIndices.size() ? CompatIndices[0] : DefaultIndex;
2083 if (ControllingExpr) {
2085 Context, KeyLoc, ControllingExpr, Types, Exprs, DefaultLoc, RParenLoc,
2086 ContainsUnexpandedParameterPack, ResultIndex);
2089 Context, KeyLoc, ControllingType, Types, Exprs, DefaultLoc, RParenLoc,
2090 ContainsUnexpandedParameterPack, ResultIndex);
2096 llvm_unreachable(
"unexpected TokenKind");
2097 case tok::kw___func__:
2099 case tok::kw___FUNCTION__:
2101 case tok::kw___FUNCDNAME__:
2103 case tok::kw___FUNCSIG__:
2105 case tok::kw_L__FUNCTION__:
2107 case tok::kw_L__FUNCSIG__:
2109 case tok::kw___PRETTY_FUNCTION__:
2120 return cast_or_null<Decl>(DC);
2138 assert(Args.size() <= 2 &&
"too many arguments for literal operator");
2141 for (
unsigned ArgIdx = 0; ArgIdx != Args.size(); ++ArgIdx) {
2142 ArgTy[ArgIdx] = Args[ArgIdx]->getType();
2143 if (ArgTy[ArgIdx]->isArrayType())
2164 std::vector<Token> ExpandedToks;
2170 if (Literal.hadError)
2174 for (
const Token &
Tok : StringToks)
2175 StringTokLocs.push_back(
Tok.getLocation());
2179 false, {}, StringTokLocs);
2181 if (!Literal.getUDSuffix().empty()) {
2184 Literal.getUDSuffixOffset());
2185 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_string_udl));
2205 CurrentDecl =
Context.getTranslationUnitDecl();
2207 std::vector<Token> ExpandedToks;
2208 ExpandedToks.reserve(Toks.size());
2212 ExpandedToks.emplace_back(
Tok);
2216 Diag(
Tok.getLocation(), diag::ext_predef_outside_function);
2218 Diag(
Tok.getLocation(), diag::ext_string_literal_from_predefined)
2221 llvm::raw_svector_ostream
OS(Str);
2222 Token &Exp = ExpandedToks.emplace_back();
2224 if (
Tok.getKind() == tok::kw_L__FUNCTION__ ||
2225 Tok.getKind() == tok::kw_L__FUNCSIG__) {
2227 Exp.
setKind(tok::wide_string_literal);
2229 Exp.
setKind(tok::string_literal);
2235 PP.CreateString(
OS.str(), Exp,
Tok.getLocation(),
Tok.getEndLoc());
2237 return ExpandedToks;
2242 assert(!StringToks.empty() &&
"Must have at least one string!");
2245 std::vector<Token> ExpandedToks;
2251 if (Literal.hadError)
2255 for (
const Token &
Tok : StringToks)
2256 StringTokLocs.push_back(
Tok.getLocation());
2260 if (Literal.isWide()) {
2261 CharTy =
Context.getWideCharType();
2263 }
else if (Literal.isUTF8()) {
2267 CharTy =
Context.UnsignedCharTy;
2269 }
else if (Literal.isUTF16()) {
2272 }
else if (Literal.isUTF32()) {
2275 }
else if (Literal.isPascal()) {
2276 CharTy =
Context.UnsignedCharTy;
2288 ? diag::warn_cxx20_compat_utf8_string
2289 : diag::warn_c23_compat_utf8_string);
2295 auto RemovalDiag =
PDiag(diag::note_cxx20_c23_compat_utf8_string_remove_u8);
2297 for (
const Token &
Tok : StringToks) {
2298 if (
Tok.getKind() == tok::utf8_string_literal) {
2300 RemovalDiagLoc =
Tok.getLocation();
2307 Diag(RemovalDiagLoc, RemovalDiag);
2311 Context.getStringLiteralArrayType(CharTy, Literal.GetNumStringChars());
2315 Context, Literal.GetString(), Kind, Literal.Pascal, StrTy, StringTokLocs);
2316 if (Literal.getUDSuffix().empty())
2323 Literal.getUDSuffixOffset());
2327 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_string_udl));
2334 Context.DeclarationNames.getCXXLiteralOperatorName(UDSuffix);
2339 Context.getArrayDecayedType(StrTy), SizeType
2349 llvm::APInt Len(
Context.getIntWidth(SizeType), Literal.GetNumStringChars());
2352 Expr *Args[] = { Lit, LenArg };
2369 unsigned CharBits =
Context.getIntWidth(CharTy);
2371 llvm::APSInt
Value(CharBits, CharIsUnsigned);
2378 for (
unsigned I = 0, N = Lit->
getLength(); I != N; ++I) {
2388 llvm_unreachable(
"unexpected literal operator lookup result");
2392 llvm_unreachable(
"unexpected literal operator lookup result");
2424 auto *DRE = dyn_cast<DeclRefExpr>(VD->
getInit());
2427 auto *Referee = dyn_cast<VarDecl>(DRE->getDecl());
2428 if (!Referee || !Referee->hasGlobalStorage() ||
2429 Referee->hasAttr<CUDADeviceAttr>())
2435 auto *MD = dyn_cast_or_null<CXXMethodDecl>(S.
CurContext);
2436 if (MD && MD->getParent()->isLambda() &&
2437 MD->getOverloadedOperator() == OO_Call && MD->hasAttr<CUDADeviceAttr>() &&
2459 if (
VarDecl *VD = dyn_cast<VarDecl>(D)) {
2460 if (VD->getType()->isReferenceType() &&
2463 VD->isUsableInConstantExpressions(
Context))
2482 Context, NNS, TemplateKWLoc, D, RefersToCapturedVariable, NameInfo, Ty,
2510 const auto *FD = dyn_cast<FieldDecl>(D);
2511 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(D))
2512 FD = IFD->getAnonField();
2516 if (FD->isBitField())
2522 if (
const auto *BD = dyn_cast<BindingDecl>(D))
2523 if (
const auto *BE = BD->getBinding())
2544 NameInfo =
Context.getNameForTemplate(TName, TNameLoc);
2545 TemplateArgs = &Buffer;
2548 TemplateArgs =
nullptr;
2556 bool isDefaultArgument =
2560 const auto *CurMethod = dyn_cast<CXXMethodDecl>(
CurContext);
2561 bool isInstance = CurMethod && CurMethod->isInstance() &&
2562 R.getNamingClass() == CurMethod->getParent() &&
2570 unsigned DiagID = diag::err_found_in_dependent_base;
2571 unsigned NoteID = diag::note_member_declared_at;
2572 if (R.getRepresentativeDecl()->getDeclContext()->Equals(R.getNamingClass())) {
2573 DiagID =
getLangOpts().MSVCCompat ? diag::ext_found_later_in_class
2574 : diag::err_found_later_in_class;
2576 DiagID = diag::ext_found_in_dependent_base;
2577 NoteID = diag::note_dependent_member_use;
2582 Diag(R.getNameLoc(), DiagID)
2583 << R.getLookupName()
2589 Diag(R.getNameLoc(), DiagID) << R.getLookupName();
2593 Diag(D->getLocation(), NoteID);
2602 if (isDefaultArgument && ((*R.begin())->isCXXInstanceMember())) {
2603 Diag(R.getNameLoc(), diag::err_member_call_without_object) << 0;
2616 SourceRange NameRange = R.getLookupNameInfo().getSourceRange();
2618 unsigned diagnostic = diag::err_undeclared_var_use;
2619 unsigned diagnostic_suggest = diag::err_undeclared_var_use_suggest;
2623 diagnostic = diag::err_undeclared_use;
2624 diagnostic_suggest = diag::err_undeclared_use_suggest;
2635 if (ExplicitTemplateArgs) {
2647 R.suppressDiagnostics();
2658 R.addDecl(Best->FoundDecl.getDecl(), Best->FoundDecl.getAccess());
2673 if (S && (Corrected =
2674 CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), S, &SS,
2677 bool DroppedSpecifier =
2681 bool AcceptableWithRecovery =
false;
2682 bool AcceptableWithoutRecovery =
false;
2691 dyn_cast<FunctionTemplateDecl>(CD))
2695 else if (
FunctionDecl *FD = dyn_cast<FunctionDecl>(CD))
2696 if (!ExplicitTemplateArgs || ExplicitTemplateArgs->
size() == 0)
2702 ND = Best->FoundDecl;
2703 Corrected.setCorrectionDecl(ND);
2707 Corrected.setCorrectionDecl(ND);
2718 R.setNamingClass(
Record);
2735 AcceptableWithoutRecovery =
true;
2738 if (AcceptableWithRecovery || AcceptableWithoutRecovery) {
2740 ? diag::note_implicit_param_decl
2741 : diag::note_previous_decl;
2744 PDiag(NoteID), AcceptableWithRecovery);
2747 PDiag(diag::err_no_member_suggest)
2749 << DroppedSpecifier << NameRange,
2750 PDiag(NoteID), AcceptableWithRecovery);
2760 return !AcceptableWithRecovery;
2768 Diag(R.getNameLoc(), diag::err_no_member)
2774 Diag(R.getNameLoc(), diagnostic) << Name << NameRange;
2795 else if (
auto *MD = dyn_cast<CXXMethodDecl>(S.
CurContext))
2803 auto DB = S.
Diag(Loc, diag::ext_undeclared_unqual_id_with_dependent_base);
2804 DB << NameInfo.
getName() << RD;
2806 if (!ThisType.
isNull()) {
2809 Context,
nullptr, ThisType,
true,
2811 nullptr, NameInfo, TemplateArgs);
2827 bool IsAddressOfOperand,
2829 bool IsInlineAsmIdentifier) {
2830 assert(!(IsAddressOfOperand && HasTrailingLParen) &&
2831 "cannot be direct & operand and have a trailing lparen");
2860 if (
auto *VD = dyn_cast<ValueDecl>(R.getFoundDecl())) {
2874 if (TemplateKWLoc.
isValid() || TemplateArgs) {
2882 false, TemplateKWLoc,
2886 if (R.wasNotFoundInCurrentInstantiation() || SS.
isInvalid())
2888 IsAddressOfOperand, TemplateArgs);
2892 !IvarLookupFollowUp);
2896 if (R.wasNotFoundInCurrentInstantiation() || SS.
isInvalid())
2898 IsAddressOfOperand, TemplateArgs);
2902 if (IvarLookupFollowUp) {
2912 if (R.isAmbiguous())
2917 if (R.empty() && HasTrailingLParen && II &&
2920 if (D) R.addDecl(D);
2927 if (R.empty() && !ADL) {
2930 TemplateKWLoc, TemplateArgs))
2935 if (IsInlineAsmIdentifier)
2943 "Typo correction callback misconfigured");
2957 assert(!R.empty() &&
2958 "DiagnoseEmptyLookup returned false but added no results");
2965 ExprResult E(
ObjC().LookupInObjCMethod(R, S, Ivar->getIdentifier()));
2975 assert(!R.empty() || ADL);
3005 if (TemplateArgs || TemplateKWLoc.
isValid()) {
3014 "There should only be one declaration found.");
3029 if (R.isAmbiguous())
3032 if (R.wasNotFoundInCurrentInstantiation() || SS.
isInvalid())
3042 if (
const auto *CD = dyn_cast<CXXRecordDecl>(DC))
3043 if (CD->isInvalidDecl() || CD->isBeingDefined())
3053 if (
auto *TagD = dyn_cast<TagDecl>(TD)) {
3060 TL.setNameLoc(NameInfo.
getLoc());
3061 }
else if (
auto *TypedefD = dyn_cast<TypedefNameDecl>(TD)) {
3069 ET =
SemaRef.Context.getTypeDeclType(TD);
3077 unsigned DiagID = diag::err_typename_missing;
3079 DiagID = diag::ext_typename_missing;
3081 auto D =
Diag(Loc, DiagID);
3112 const auto *RD = dyn_cast<CXXRecordDecl>(
Member->getDeclContext());
3120 bool PointerConversions =
false;
3122 DestRecordType =
Context.getCanonicalTagType(RD);
3124 DestRecordType =
Context.getAddrSpaceQualType(
3125 DestRecordType, FromPtrType
3130 DestType =
Context.getPointerType(DestRecordType);
3132 PointerConversions =
true;
3134 DestType = DestRecordType;
3135 FromRecordType = FromType;
3137 }
else if (
const auto *
Method = dyn_cast<CXXMethodDecl>(
Member)) {
3138 if (!
Method->isImplicitObjectMemberFunction())
3141 DestType =
Method->getThisType().getNonReferenceType();
3142 DestRecordType =
Method->getFunctionObjectParameterType();
3146 PointerConversions =
true;
3148 FromRecordType = FromType;
3149 DestType = DestRecordType;
3154 if (FromAS != DestAS) {
3156 Context.removeAddrSpaceQualType(FromRecordType);
3158 Context.getAddrSpaceQualType(FromRecordTypeWithoutAS, DestAS);
3159 if (PointerConversions)
3160 FromTypeWithDestAS =
Context.getPointerType(FromTypeWithDestAS);
3174 if (
Context.hasSameUnqualifiedType(FromRecordType, DestRecordType))
3202 assert(QType->
isRecordType() &&
"lookup done with non-record type");
3212 FromLoc, FromRange, &BasePath))
3215 if (PointerConversions)
3216 QType =
Context.getPointerType(QType);
3218 VK, &BasePath).
get();
3221 FromRecordType = QRecordType;
3225 if (
Context.hasSameUnqualifiedType(FromRecordType, DestRecordType))
3232 FromLoc, FromRange, &BasePath,
3241 DestType =
Context.getQualifiedType(DestType, FromTypeQuals);
3249 bool HasTrailingLParen) {
3251 if (!HasTrailingLParen)
3269 if (D->isCXXClassMember())
3280 else if (D->getLexicalDeclContext()->isFunctionOrMethod())
3287 if (
const auto *FDecl = dyn_cast<FunctionDecl>(D)) {
3289 if (FDecl->getBuiltinID() && FDecl->isImplicit())
3304 bool AcceptInvalid) {
3329 assert(R.isSingleResult() &&
"Expected only a single result");
3330 const auto *FD = dyn_cast<FunctionDecl>(R.getFoundDecl());
3332 (FD->isCPUDispatchMultiVersion() || FD->isCPUSpecificMultiVersion());
3337 bool AcceptInvalidDecl) {
3340 if (!NeedsADL && R.isSingleResult() &&
3344 R.getRepresentativeDecl(),
nullptr,
3358 R.suppressDiagnostics();
3362 R.getLookupNameInfo(), NeedsADL, R.begin(), R.end(),
3371 bool AcceptInvalidDecl) {
3372 assert(D &&
"Cannot refer to a NULL declaration");
3374 "Cannot refer unambiguously to a function template");
3393 Diag(Loc, diag::err_ref_non_value) << D << SS.
getRange();
3408 if (VD->isInvalidDecl() && !AcceptInvalidDecl)
3414 if (
auto *IndirectField = dyn_cast<IndirectFieldDecl>(VD);
3415 IndirectField && !IndirectField->isCXXClassMember())
3427 type =
type.getNonPackExpansionType();
3431#define ABSTRACT_DECL(kind)
3432#define VALUE(type, base)
3433#define DECL(type, base) case Decl::type:
3434#include "clang/AST/DeclNodes.inc"
3435 llvm_unreachable(
"invalid value decl kind");
3438 case Decl::ObjCAtDefsField:
3439 llvm_unreachable(
"forming non-member reference to ivar?");
3443 case Decl::EnumConstant:
3444 case Decl::UnresolvedUsingValue:
3445 case Decl::OMPDeclareReduction:
3446 case Decl::OMPDeclareMapper:
3455 case Decl::IndirectField:
3456 case Decl::ObjCIvar:
3458 "building reference to field in C?");
3468 case Decl::NonTypeTemplateParm: {
3470 type = reftype->getPointeeType();
3480 if (
type->isRecordType()) {
3481 type =
type.getUnqualifiedType().withConst();
3494 case Decl::VarTemplateSpecialization:
3495 case Decl::VarTemplatePartialSpecialization:
3496 case Decl::Decomposition:
3498 case Decl::OMPCapturedExpr:
3501 type->isVoidType()) {
3507 case Decl::ImplicitParam:
3508 case Decl::ParmVar: {
3518 if (!CapturedType.
isNull())
3519 type = CapturedType;
3524 case Decl::Function: {
3526 if (!
Context.BuiltinInfo.isDirectlyAddressable(BID)) {
3563 case Decl::CXXDeductionGuide:
3564 llvm_unreachable(
"building reference to deduction guide");
3566 case Decl::MSProperty:
3568 case Decl::TemplateParamObject:
3574 case Decl::UnnamedGlobalConstant:
3578 case Decl::CXXMethod:
3583 dyn_cast<FunctionProtoType>(VD->getType()))
3584 if (proto->getReturnType() ==
Context.UnknownAnyTy) {
3597 case Decl::CXXConversion:
3598 case Decl::CXXDestructor:
3599 case Decl::CXXConstructor:
3611 if (VD->isInvalidDecl() && E)
3618 Target.resize(CharByteWidth * (Source.size() + 1));
3619 char *ResultPtr = &
Target[0];
3620 const llvm::UTF8 *ErrorPtr;
3622 llvm::ConvertUTF8toWide(CharByteWidth, Source, ResultPtr, ErrorPtr);
3632 Diag(Loc, diag::ext_predef_outside_function);
3633 currentDecl =
Context.getTranslationUnitDecl();
3643 bool ForceElaboratedPrinting =
3647 unsigned Length = Str.length();
3649 llvm::APInt LengthI(32, Length + 1);
3653 Context.adjustStringLiteralBaseType(
Context.WideCharTy.withConst());
3657 ResTy =
Context.getConstantArrayType(ResTy, LengthI,
nullptr,
3663 ResTy =
Context.adjustStringLiteralBaseType(
Context.CharTy.withConst());
3664 ResTy =
Context.getConstantArrayType(ResTy, LengthI,
nullptr,
3683 StringRef ThisTok =
PP.getSpelling(
Tok, CharBuffer, &
Invalid);
3689 if (Literal.hadError())
3693 if (Literal.isWide())
3699 else if (Literal.isUTF16())
3701 else if (Literal.isUTF32())
3710 if (Literal.isWide())
3712 else if (Literal.isUTF16())
3714 else if (Literal.isUTF32())
3716 else if (Literal.isUTF8())
3722 if (Literal.getUDSuffix().empty())
3732 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_character_udl));
3737 Lit,
Tok.getLocation());
3741 unsigned IntSize =
Context.getTargetInfo().getIntWidth();
3743 llvm::APInt(IntSize, Val,
true),
3765 using llvm::APFloat;
3766 APFloat Val(Format);
3769 if (RM == llvm::RoundingMode::Dynamic)
3770 RM = llvm::RoundingMode::NearestTiesToEven;
3771 APFloat::opStatus result = Literal.GetFloatValue(Val, RM);
3775 if ((result & APFloat::opOverflow) ||
3776 ((result & APFloat::opUnderflow) && Val.isZero())) {
3777 unsigned diagnostic;
3779 if (result & APFloat::opOverflow) {
3780 diagnostic = diag::warn_float_overflow;
3781 APFloat::getLargest(Format).toString(buffer);
3783 diagnostic = diag::warn_float_underflow;
3784 APFloat::getSmallest(Format).toString(buffer);
3787 S.
Diag(Loc, diagnostic) << Ty << buffer.str();
3790 bool isExact = (result == APFloat::opOK);
3795 assert(E &&
"Invalid expression");
3802 Diag(E->
getExprLoc(), diag::err_pragma_loop_invalid_argument_type) << QT;
3806 llvm::APSInt ValueAPS;
3817 bool ValueIsPositive =
3818 AllowZero ? ValueAPS.isNonNegative() : ValueAPS.isStrictlyPositive();
3819 if (!ValueIsPositive || ValueAPS.getActiveBits() > 31) {
3821 <<
toString(ValueAPS, 10) << ValueIsPositive;
3831 if (
Tok.getLength() == 1 ||
Tok.getKind() == tok::binary_data) {
3832 const uint8_t Val =
PP.getSpellingOfSingleCharacterNumericConstant(
Tok);
3841 SpellingBuffer.resize(
Tok.getLength() + 1);
3845 StringRef TokSpelling =
PP.getSpelling(
Tok, SpellingBuffer, &
Invalid);
3850 PP.getSourceManager(),
PP.getLangOpts(),
3851 PP.getTargetInfo(),
PP.getDiagnostics());
3852 if (Literal.hadError)
3855 if (Literal.hasUDSuffix()) {
3863 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_numeric_udl));
3866 if (Literal.isFloatingLiteral()) {
3870 CookedTy =
Context.LongDoubleTy;
3875 CookedTy =
Context.UnsignedLongLongTy;
3879 Context.DeclarationNames.getCXXLiteralOperatorName(UDSuffix);
3891 !Literal.isImaginary)) {
3900 if (Literal.isFloatingLiteral()) {
3903 llvm::APInt ResultVal(
Context.getTargetInfo().getLongLongWidth(), 0);
3904 if (Literal.GetIntegerValue(ResultVal))
3905 Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
3917 unsigned Length = Literal.getUDSuffixOffset();
3924 false, StrTy, TokLoc);
3935 bool CharIsUnsigned =
Context.CharTy->isUnsignedIntegerType();
3936 llvm::APSInt
Value(CharBits, CharIsUnsigned);
3937 for (
unsigned I = 0, N = Literal.getUDSuffixOffset(); I != N; ++I) {
3938 Value = TokSpelling[I];
3946 llvm_unreachable(
"unexpected literal operator lookup result");
3952 if (Literal.isFixedPointLiteral()) {
3955 if (Literal.isAccum) {
3956 if (Literal.isHalf) {
3958 }
else if (Literal.isLong) {
3963 }
else if (Literal.isFract) {
3964 if (Literal.isHalf) {
3966 }
else if (Literal.isLong) {
3973 if (Literal.isUnsigned) Ty =
Context.getCorrespondingUnsignedType(Ty);
3975 bool isSigned = !Literal.isUnsigned;
3976 unsigned scale =
Context.getFixedPointScale(Ty);
3977 unsigned bit_width =
Context.getTypeInfo(Ty).Width;
3979 llvm::APInt Val(bit_width, 0, isSigned);
3980 bool Overflowed = Literal.GetFixedPointValue(Val, scale);
3981 bool ValIsZero = Val.isZero() && !Overflowed;
3983 auto MaxVal =
Context.getFixedPointMax(Ty).getValue();
3984 if (Literal.isFract && Val == MaxVal + 1 && !ValIsZero)
3990 else if (Val.ugt(MaxVal) || Overflowed)
3991 Diag(
Tok.getLocation(), diag::err_too_large_for_fixed_point);
3994 Tok.getLocation(), scale);
3995 }
else if (Literal.isFloatingLiteral()) {
3997 if (Literal.isHalf){
4002 Diag(
Tok.getLocation(), diag::err_half_const_requires_fp16);
4005 }
else if (Literal.isFloat)
4007 else if (Literal.isLong)
4009 else if (Literal.isFloat16)
4011 else if (Literal.isFloat128)
4028 Diag(
Tok.getLocation(), diag::warn_double_const_requires_fp64)
4033 }
else if (!Literal.isIntegerLiteral()) {
4039 if (Literal.isSizeT)
4042 ? diag::warn_cxx20_compat_size_t_suffix
4043 : diag::ext_cxx23_size_t_suffix
4044 : diag::err_cxx23_size_t_suffix);
4051 if (Literal.isBitInt)
4052 PP.Diag(
Tok.getLocation(),
4055 : diag::ext_c23_bitint_suffix);
4064 unsigned BitsNeeded =
Context.getTargetInfo().getIntMaxTWidth();
4065 if (Literal.isBitInt)
4066 BitsNeeded = llvm::APInt::getSufficientBitsNeeded(
4067 Literal.getLiteralDigits(), Literal.getRadix());
4068 if (Literal.MicrosoftInteger) {
4069 if (Literal.MicrosoftInteger == 128 &&
4070 !
Context.getTargetInfo().hasInt128Type())
4071 PP.Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
4072 << Literal.isUnsigned;
4073 BitsNeeded = Literal.MicrosoftInteger;
4076 llvm::APInt ResultVal(BitsNeeded, 0);
4078 if (Literal.GetIntegerValue(ResultVal)) {
4080 Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
4082 Ty =
Context.UnsignedLongLongTy;
4083 assert(
Context.getTypeSize(Ty) == ResultVal.getBitWidth() &&
4084 "long long is not intmax_t?");
4091 bool AllowUnsigned = Literal.isUnsigned || Literal.getRadix() != 10;
4098 Literal.isLong =
true;
4099 Literal.isLongLong =
false;
4106 if (Literal.MicrosoftInteger) {
4107 if (Literal.MicrosoftInteger == 8 && !Literal.isUnsigned) {
4111 Width = Literal.MicrosoftInteger;
4112 Ty =
Context.getIntTypeForBitwidth(Width,
4113 !Literal.isUnsigned);
4119 if (Literal.isBitInt) {
4122 Width = std::max(ResultVal.getActiveBits(), 1u) +
4123 (Literal.isUnsigned ? 0u : 1u);
4127 unsigned int MaxBitIntWidth =
4128 Context.getTargetInfo().getMaxBitIntWidth();
4129 if (Width > MaxBitIntWidth) {
4130 Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
4131 << Literal.isUnsigned;
4132 Width = MaxBitIntWidth;
4139 ResultVal = ResultVal.zextOrTrunc(Width);
4140 Ty =
Context.getBitIntType(Literal.isUnsigned, Width);
4144 if (Literal.isSizeT) {
4145 assert(!Literal.MicrosoftInteger &&
4146 "size_t literals can't be Microsoft literals");
4147 unsigned SizeTSize =
Context.getTargetInfo().getTypeWidth(
4148 Context.getTargetInfo().getSizeType());
4151 if (ResultVal.isIntN(SizeTSize)) {
4153 if (!Literal.isUnsigned && ResultVal[SizeTSize - 1] == 0)
4154 Ty =
Context.getSignedSizeType();
4155 else if (AllowUnsigned)
4161 if (Ty.
isNull() && !Literal.isLong && !Literal.isLongLong &&
4164 unsigned IntSize =
Context.getTargetInfo().getIntWidth();
4167 if (ResultVal.isIntN(IntSize)) {
4169 if (!Literal.isUnsigned && ResultVal[IntSize-1] == 0)
4171 else if (AllowUnsigned)
4178 if (Ty.
isNull() && !Literal.isLongLong && !Literal.isSizeT) {
4179 unsigned LongSize =
Context.getTargetInfo().getLongWidth();
4182 if (ResultVal.isIntN(LongSize)) {
4184 if (!Literal.isUnsigned && ResultVal[LongSize-1] == 0)
4186 else if (AllowUnsigned)
4191 const unsigned LongLongSize =
4192 Context.getTargetInfo().getLongLongWidth();
4196 ? diag::warn_old_implicitly_unsigned_long_cxx
4198 ext_old_implicitly_unsigned_long_cxx
4199 : diag::warn_old_implicitly_unsigned_long)
4200 << (LongLongSize > LongSize ? 0
4209 if (Ty.
isNull() && !Literal.isSizeT) {
4210 unsigned LongLongSize =
Context.getTargetInfo().getLongLongWidth();
4213 if (ResultVal.isIntN(LongLongSize)) {
4217 if (!Literal.isUnsigned && (ResultVal[LongLongSize-1] == 0 ||
4218 (
getLangOpts().MSVCCompat && Literal.isLongLong)))
4220 else if (AllowUnsigned)
4221 Ty =
Context.UnsignedLongLongTy;
4222 Width = LongLongSize;
4228 ? diag::warn_cxx98_compat_longlong
4229 : diag::ext_cxx11_longlong);
4231 Diag(
Tok.getLocation(), diag::ext_c99_longlong);
4239 if (Literal.isSizeT)
4240 Diag(
Tok.getLocation(), diag::err_size_t_literal_too_large)
4241 << Literal.isUnsigned;
4244 diag::ext_integer_literal_too_large_for_signed);
4245 Ty =
Context.UnsignedLongLongTy;
4246 Width =
Context.getTargetInfo().getLongLongWidth();
4249 if (ResultVal.getBitWidth() != Width)
4250 ResultVal = ResultVal.trunc(Width);
4256 if (Literal.isImaginary) {
4263 DiagId = diag::ext_gnu_imaginary_constant;
4265 DiagId = diag::warn_c23_compat_imaginary_constant;
4267 DiagId = diag::ext_c2y_imaginary_constant;
4268 Diag(
Tok.getLocation(), DiagId);
4274 assert(E &&
"ActOnParenExpr() missing expr");
4289 if (!(T->isArithmeticType() || T->isVoidType() || T->isVectorType())) {
4290 S.
Diag(Loc, diag::err_vecstep_non_scalar_vector_type)
4295 assert((T->isVoidType() || !T->isIncompleteType()) &&
4296 "Scalar types should always be complete");
4304 if (!T->isVectorType() && !T->isSizelessVectorType())
4305 return S.
Diag(Loc, diag::err_builtin_non_vector_type)
4307 <<
"__builtin_vectorelements" << T << ArgRange;
4309 if (
auto *FD = dyn_cast<FunctionDecl>(S.
CurContext)) {
4310 if (T->isSVESizelessBuiltinType()) {
4311 llvm::StringMap<bool> CallerFeatureMap;
4326 if (!T->isFunctionType() && !T->isFunctionPointerType() &&
4327 !T->isFunctionReferenceType() && !T->isMemberFunctionPointerType()) {
4328 S.
Diag(Loc, diag::err_ptrauth_type_disc_undiscriminated) << T << ArgRange;
4344 if (TraitKind == UETT_SizeOf || TraitKind == UETT_AlignOf ||
4345 TraitKind == UETT_PreferredAlignOf) {
4348 if (T->isFunctionType()) {
4349 S.
Diag(Loc, diag::ext_sizeof_alignof_function_type)
4356 if (T->isVoidType()) {
4357 unsigned DiagID = S.
LangOpts.OpenCL ? diag::err_opencl_sizeof_alignof_type
4358 : diag::ext_sizeof_alignof_void_type;
4373 S.
Diag(Loc, diag::err_sizeof_nonfragile_interface)
4374 << T << (TraitKind == UETT_SizeOf)
4391 const auto *ICE = dyn_cast<ImplicitCastExpr>(E);
4392 if (!ICE || ICE->getCastKind() != CK_ArrayToPointerDecay)
4395 S.
Diag(Loc, diag::warn_sizeof_array_decay) << ICE->getSourceRange()
4397 << ICE->getSubExpr()->getType();
4405 bool IsUnevaluatedOperand =
4406 (ExprKind == UETT_SizeOf || ExprKind == UETT_DataSizeOf ||
4407 ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf ||
4408 ExprKind == UETT_VecStep || ExprKind == UETT_CountOf);
4409 if (IsUnevaluatedOperand) {
4425 Diag(E->
getExprLoc(), diag::warn_side_effects_unevaluated_context);
4427 if (ExprKind == UETT_VecStep)
4431 if (ExprKind == UETT_VectorElements)
4442 if (
Context.getTargetInfo().getTriple().isWasm() &&
4453 if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf) {
4456 diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4461 E, diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4480 if (ExprKind == UETT_CountOf) {
4485 Diag(E->
getExprLoc(), diag::err_countof_arg_not_array_type) << ExprType;
4495 if (ExprKind == UETT_SizeOf) {
4496 if (
const auto *DeclRef = dyn_cast<DeclRefExpr>(E->
IgnoreParens())) {
4497 if (
const auto *PVD = dyn_cast<ParmVarDecl>(DeclRef->getFoundDecl())) {
4498 QualType OType = PVD->getOriginalType();
4503 Diag(PVD->getLocation(), diag::note_declared_at);
4511 if (
const auto *BO = dyn_cast<BinaryOperator>(E->
IgnoreParens())) {
4528 S.
Diag(E->
getExprLoc(), diag::err_sizeof_alignof_typeof_bitfield)
4535 if (
DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Inner)) {
4537 }
else if (
MemberExpr *ME = dyn_cast<MemberExpr>(Inner)) {
4538 D = ME->getMemberDecl();
4558 if (
FieldDecl *FD = dyn_cast_or_null<FieldDecl>(D)) {
4561 if (!FD->getParent()->isCompleteDefinition()) {
4562 S.
Diag(E->
getExprLoc(), diag::err_alignof_member_of_incomplete_type)
4571 if (!FD->getType()->isReferenceType())
4590 assert(T->isVariablyModifiedType());
4591 assert(CSI !=
nullptr);
4595 const Type *Ty = T.getTypePtr();
4597#define TYPE(Class, Base)
4598#define ABSTRACT_TYPE(Class, Base)
4599#define NON_CANONICAL_TYPE(Class, Base)
4600#define DEPENDENT_TYPE(Class, Base) case Type::Class:
4601#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)
4602#include "clang/AST/TypeNodes.inc"
4609 case Type::ExtVector:
4610 case Type::ConstantMatrix:
4613 case Type::TemplateSpecialization:
4614 case Type::ObjCObject:
4615 case Type::ObjCInterface:
4616 case Type::ObjCObjectPointer:
4617 case Type::ObjCTypeParam:
4620 case Type::HLSLInlineSpirv:
4621 llvm_unreachable(
"type class is never variably-modified!");
4622 case Type::Adjusted:
4628 case Type::ArrayParameter:
4634 case Type::BlockPointer:
4637 case Type::LValueReference:
4638 case Type::RValueReference:
4641 case Type::MemberPointer:
4644 case Type::ConstantArray:
4645 case Type::IncompleteArray:
4649 case Type::VariableArray: {
4663 case Type::FunctionProto:
4664 case Type::FunctionNoProto:
4669 case Type::UnaryTransform:
4670 case Type::Attributed:
4671 case Type::BTFTagAttributed:
4672 case Type::OverflowBehavior:
4673 case Type::HLSLAttributedResource:
4674 case Type::SubstTemplateTypeParm:
4675 case Type::MacroQualified:
4676 case Type::CountAttributed:
4678 T = T.getSingleStepDesugaredType(Context);
4683 case Type::Decltype:
4686 case Type::PackIndexing:
4693 case Type::DeducedTemplateSpecialization:
4696 case Type::TypeOfExpr:
4702 case Type::PredefinedSugar:
4706 }
while (!T.isNull() && T->isVariablyModifiedType());
4729 if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf ||
4730 ExprKind == UETT_OpenMPRequiredSimdAlign) {
4736 ? diag::warn_c2y_compat_alignof_incomplete_array
4737 : diag::ext_c2y_alignof_incomplete_array);
4738 ExprType =
Context.getBaseElementType(ExprType);
4741 if (ExprKind == UETT_VecStep)
4744 if (ExprKind == UETT_VectorElements)
4748 if (ExprKind == UETT_PtrAuthTypeDiscriminator)
4758 OpLoc, ExprType, diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4763 Diag(OpLoc, diag::err_sizeof_alignof_function_type) << KWName << ExprRange;
4767 if (ExprKind == UETT_CountOf) {
4771 Diag(OpLoc, diag::err_countof_arg_not_array_type) << ExprType;
4778 if (
Context.getTargetInfo().getTriple().isWasm() &&
4780 Diag(OpLoc, diag::err_wasm_table_invalid_uett_operand)
4794 auto *CSI = dyn_cast<CapturingScopeInfo>(*I);
4798 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(CSI))
4799 DC = LSI->CallOperator;
4800 else if (
auto *CRSI = dyn_cast<CapturedRegionScopeInfo>(CSI))
4801 DC = CRSI->TheCapturedDecl;
4802 else if (
auto *BSI = dyn_cast<BlockScopeInfo>(CSI))
4825 if (!T->isDependentType() &&
4834 (ExprKind == UETT_SizeOf || ExprKind == UETT_CountOf) &&
4844 ExprKind, TInfo,
Context.getSizeType(), OpLoc, R.getEnd());
4860 }
else if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf) {
4862 }
else if (ExprKind == UETT_VecStep) {
4864 }
else if (ExprKind == UETT_OpenMPRequiredSimdAlign) {
4868 Diag(E->
getExprLoc(), diag::err_sizeof_alignof_typeof_bitfield) << 0;
4870 }
else if (ExprKind == UETT_VectorElements || ExprKind == UETT_SizeOf ||
4871 ExprKind == UETT_CountOf) {
4878 if ((ExprKind == UETT_SizeOf || ExprKind == UETT_CountOf) &&
4913 UETT_AlignOf, KWName);
4926 if (
V.get()->isTypeDependent())
4938 return CT->getElementType();
4941 if (
V.get()->getType()->isArithmeticType())
4942 return V.get()->getType();
4947 if (PR.
get() !=
V.get()) {
4953 S.
Diag(Loc, diag::err_realimag_invalid_type) <<
V.get()->getType()
4954 << (IsReal ?
"__real" :
"__imag");
4965 default: llvm_unreachable(
"Unknown unary op!");
4966 case tok::plusplus: Opc = UO_PostInc;
break;
4967 case tok::minusminus: Opc = UO_PostDec;
break;
4986 !S.
LangOpts.ObjCSubscriptingLegacyRuntime)
4989 S.
Diag(opLoc, diag::err_arithmetic_nonfragile_interface)
4996 auto *BaseNoParens =
Base->IgnoreParens();
4997 if (
auto *MSProp = dyn_cast<MSPropertyRefExpr>(BaseNoParens))
4998 return MSProp->getPropertyDecl()->getType()->isArrayType();
5019 if (RTy->isIntegralOrUnscopedEnumerationType()) {
5021 Result = PT->getPointeeType();
5023 Result = AT->getElementType();
5026 Result = PT->getPointeeType();
5028 Result = AT->getElementType();
5042 if (AS->isOMPArraySection())
5058 base = result.
get();
5067 auto CheckAndReportCommaError = [&](
Expr *E) {
5068 if (ArgExprs.size() > 1 ||
5070 Diag(E->getExprLoc(), diag::err_matrix_subscript_comma)
5081 Diag(base->
getExprLoc(), diag::err_matrix_separate_incomplete_index)
5087 auto *matSubscriptE = dyn_cast<MatrixSubscriptExpr>(base);
5088 if (matSubscriptE && matSubscriptE->isIncomplete()) {
5089 if (CheckAndReportCommaError(ArgExprs.front()))
5093 matSubscriptE->getRowIdx(),
5094 ArgExprs.front(), rbLoc);
5102 CheckInvalidBuiltinCountedByRef(base,
5110 bool IsMSPropertySubscript =
false;
5113 if (!IsMSPropertySubscript) {
5117 base = result.
get();
5123 if (CheckAndReportCommaError(ArgExprs.front()))
5131 Expr *idx = ArgExprs[0];
5140 if (ArgExprs.size() == 1 &&
5141 ArgExprs[0]->getType()->isNonOverloadPlaceholderType()) {
5145 ArgExprs[0] = result.
get();
5157 base, ArgExprs.front(),
5170 if (IsMSPropertySubscript) {
5171 if (ArgExprs.size() > 1) {
5173 diag::err_ms_property_subscript_expects_single_arg);
5199 Diag(base->
getExprLoc(), diag::err_ovl_builtin_subscript_expects_single_arg)
5207 ArgExprs[0]->getType()->isRecordType())))) {
5225 return InitSeq.
Perform(*
this, Entity, Kind, E);
5239 RowIdx = RowR.
get();
5249 auto IsIndexValid = [&](
Expr *IndexExpr,
unsigned Dim,
5250 bool IsColumnIdx) ->
Expr * {
5258 if (std::optional<llvm::APSInt> Idx =
5260 if ((*Idx < 0 || *Idx >=
Dim)) {
5262 << IsColumnIdx <<
Dim;
5269 "should be able to convert any integer type to size type");
5270 return ConvExpr.
get();
5274 RowIdx = IsIndexValid(RowIdx, MTy->getNumRows(),
false);
5279 Context.getExtVectorType(MTy->getElementType(), MTy->getNumColumns());
5295 RowIdx = RowR.
get();
5299 Base, RowIdx, ColumnIdx,
Context.IncompleteMatrixIdxTy, RBLoc);
5310 ColumnIdx = ColumnR.
get();
5315 auto IsIndexValid = [&](
Expr *IndexExpr,
unsigned Dim,
5316 bool IsColumnIdx) ->
Expr * {
5324 if (std::optional<llvm::APSInt> Idx =
5326 if ((*Idx < 0 || *Idx >=
Dim)) {
5328 << IsColumnIdx <<
Dim;
5335 "should be able to convert any integer type to size type");
5336 return ConvExpr.
get();
5340 RowIdx = IsIndexValid(RowIdx, MTy->getNumRows(),
false);
5341 ColumnIdx = IsIndexValid(ColumnIdx, MTy->getNumColumns(),
true);
5342 if (!RowIdx || !ColumnIdx)
5346 MTy->getElementType(), RBLoc);
5349void Sema::CheckAddressOfNoDeref(
const Expr *E) {
5356 while ((
Member = dyn_cast<MemberExpr>(StrippedExpr)) && !
Member->isArrow())
5357 StrippedExpr =
Member->getBase()->IgnoreParenImpCasts();
5359 LastRecord.PossibleDerefs.erase(StrippedExpr);
5373 if (ResultTy->
hasAttr(attr::NoDeref)) {
5374 LastRecord.PossibleDerefs.insert(E);
5381 QualType BaseTy =
Base->getType();
5386 const MemberExpr *
Member =
nullptr;
5387 while ((
Member = dyn_cast<MemberExpr>(
Base->IgnoreParenCasts())) &&
5391 if (
const auto *Ptr = dyn_cast<PointerType>(
Base->getType())) {
5392 if (Ptr->getPointeeType()->hasAttr(attr::NoDeref))
5393 LastRecord.PossibleDerefs.insert(E);
5409 for (
auto *Op : {LHSExp, RHSExp}) {
5410 Op = Op->IgnoreImplicit();
5411 if (Op->getType()->isArrayType() && !Op->isLValue())
5434 Expr *BaseExpr, *IndexExpr;
5452 if (!
LangOpts.isSubscriptPointerArithmetic())
5468 if (!
LangOpts.isSubscriptPointerArithmetic()) {
5469 Diag(LLoc, diag::err_subscript_nonfragile_interface)
5493 LHSExp = Materialized.
get();
5500 Qualifiers BaseQuals = BaseType.getQualifiers();
5502 Qualifiers Combined = BaseQuals + MemberQuals;
5503 if (Combined != MemberQuals)
5504 ResultType =
Context.getQualifiedType(ResultType, Combined);
5514 CK_ArrayToPointerDecay).
get();
5520 }
else if (RHSTy->isArrayType()) {
5525 CK_ArrayToPointerDecay).
get();
5532 return ExprError(
Diag(LLoc, diag::err_typecheck_subscript_value)
5537 return ExprError(
Diag(LLoc, diag::err_typecheck_subscript_not_integer)
5543 std::optional<llvm::APSInt> IntegerContantExpr =
5545 if (!IntegerContantExpr.has_value() ||
5546 IntegerContantExpr.value().isNegative())
5562 Diag(LLoc, diag::ext_gnu_subscript_void_type)
5573 diag::err_subscript_incomplete_or_sizeless_type, BaseExpr))
5586 auto *CSI = dyn_cast<CapturingScopeInfo>(*I);
5590 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(CSI))
5591 DC = LSI->CallOperator;
5592 else if (
auto *CRSI = dyn_cast<CapturedRegionScopeInfo>(CSI))
5593 DC = CRSI->TheCapturedDecl;
5594 else if (
auto *BSI = dyn_cast<BlockScopeInfo>(CSI))
5612 bool SkipImmediateInvocations) {
5613 if (Param->hasUnparsedDefaultArg()) {
5614 assert(!RewrittenInit &&
"Should not have a rewritten init expression yet");
5618 Diag(Param->getBeginLoc(), diag::err_recursive_default_argument) << FD;
5619 Diag(CallLoc, diag::note_recursive_default_argument_used_here);
5620 Param->setInvalidDecl();
5624 Diag(CallLoc, diag::err_use_of_default_argument_to_function_declared_later)
5627 diag::note_default_argument_declared_here);
5631 if (Param->hasUninstantiatedDefaultArg()) {
5632 assert(!RewrittenInit &&
"Should not have a rewitten init expression yet");
5637 Expr *
Init = RewrittenInit ? RewrittenInit : Param->getInit();
5638 assert(
Init &&
"default argument but no initializer?");
5647 if (
auto *InitWithCleanup = dyn_cast<ExprWithCleanups>(
Init)) {
5650 Cleanup.setExprNeedsCleanups(InitWithCleanup->cleanupsHaveSideEffects());
5654 assert(!InitWithCleanup->getNumObjects() &&
5655 "default argument expression has capturing blocks?");
5668 SkipImmediateInvocations;
5745 bool Changed =
false;
5746 for (
unsigned I = 0, N = E->
capture_size(); I != N; ++I) {
5757 Changed |= NewInit.
get() !=
Init;
5758 CaptureInits[I] = NewInit.
get();
5773 return SemaRef.MaybeBindToTemporary(Lambda);
5796 if (!
SemaRef.CurrentInstantiationScope ||
5808 assert(Param->hasDefaultArg() &&
"can't build nonexistent default arg");
5812 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
5813 InitializationContext =
5815 if (!InitializationContext.has_value())
5816 InitializationContext.emplace(CallLoc, Param,
CurContext);
5818 if (!
Init && !Param->hasUnparsedDefaultArg()) {
5833 if (Param->hasUninstantiatedDefaultArg()) {
5842 if (!NestedDefaultChecking)
5843 V.TraverseDecl(Param);
5847 if (
V.HasImmediateCalls ||
5848 (NeedRebuild && isa_and_present<ExprWithCleanups>(Param->getInit()))) {
5849 if (
V.HasImmediateCalls)
5859 Res = Immediate.TransformInitializer(Param->getInit(),
5873 CallLoc, FD, Param,
Init,
5874 NestedDefaultChecking))
5878 Init, InitializationContext->Context);
5888 ClassPattern->
lookup(Field->getDeclName());
5889 auto Rng = llvm::make_filter_range(
5900 assert(Field->hasInClassInitializer());
5906 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
5907 InitializationContext =
5909 if (!InitializationContext.has_value())
5910 InitializationContext.emplace(Loc, Field,
CurContext);
5919 if (!Field->getInClassInitializer()) {
5925 assert(Pattern &&
"We must have set the Pattern!");
5929 Field->setInvalidDecl();
5941 if (!NestedDefaultChecking)
5942 V.TraverseDecl(Field);
5951 bool ContainsAnyTemporaries =
5952 isa_and_present<ExprWithCleanups>(Field->getInClassInitializer());
5953 if (Field->getInClassInitializer() &&
5954 !Field->getInClassInitializer()->containsErrors() &&
5955 (
V.HasImmediateCalls || (NeedRebuild && ContainsAnyTemporaries))) {
5959 NestedDefaultChecking;
5967 Res = Immediate.TransformInitializer(Field->getInClassInitializer(),
5973 Field->setInvalidDecl();
5979 if (Field->getInClassInitializer()) {
5980 Expr *E =
Init ?
Init : Field->getInClassInitializer();
5981 if (!NestedDefaultChecking)
5992 Field->setInvalidDecl();
5998 Field, InitializationContext->Context,
6017 Diag(Loc, diag::err_default_member_initializer_not_yet_parsed)
6018 << OutermostClass << Field;
6019 Diag(Field->getEndLoc(),
6020 diag::note_default_member_initializer_not_yet_parsed);
6023 Field->setInvalidDecl();
6031 if (isa_and_nonnull<CXXConstructorDecl>(FDecl))
6033 else if (Fn && Fn->getType()->isBlockPointerType())
6037 if (
Method->isInstance())
6039 }
else if (Fn && Fn->getType() ==
Context.BoundMemberTy)
6052 FunctionName(FuncName) {}
6054 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
6063 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
6064 return std::make_unique<FunctionCallCCC>(*
this);
6068 const IdentifierInfo *
const FunctionName;
6084 if (
NamedDecl *ND = Corrected.getFoundDecl()) {
6085 if (Corrected.isOverloaded()) {
6095 ND = Best->FoundDecl;
6096 Corrected.setCorrectionDecl(ND);
6102 ND = ND->getUnderlyingDecl();
6117 Fn = Fn->IgnoreParens();
6119 auto *UO = dyn_cast<UnaryOperator>(Fn);
6120 if (!UO || UO->getOpcode() != clang::UO_AddrOf)
6122 if (
auto *DRE = dyn_cast<DeclRefExpr>(UO->getSubExpr()->IgnoreParens())) {
6123 return DRE->hasQualifier();
6125 if (
auto *OVL = dyn_cast<OverloadExpr>(UO->getSubExpr()->IgnoreParens()))
6126 return bool(OVL->getQualifier());
6136 bool IsExecConfig) {
6144 if (
Context.BuiltinInfo.hasCustomTypechecking(ID) &&
6145 !(
Context.getLangOpts().HLSL && FDecl->
hasAttr<BuiltinAliasAttr>()))
6152 bool HasExplicitObjectParameter =
6154 unsigned ExplicitObjectParameterOffset = HasExplicitObjectParameter ? 1 : 0;
6158 unsigned FnKind = Fn->getType()->isBlockPointerType()
6165 if (Args.size() < NumParams) {
6166 if (Args.size() < MinArgs) {
6171 ? diag::err_typecheck_call_too_few_args_suggest
6172 : diag::err_typecheck_call_too_few_args_at_least_suggest;
6175 << FnKind << MinArgs - ExplicitObjectParameterOffset
6176 <<
static_cast<unsigned>(Args.size()) -
6177 ExplicitObjectParameterOffset
6179 }
else if (MinArgs - ExplicitObjectParameterOffset == 1 && FDecl &&
6184 ? diag::err_typecheck_call_too_few_args_one
6185 : diag::err_typecheck_call_too_few_args_at_least_one)
6186 << FnKind << FDecl->
getParamDecl(ExplicitObjectParameterOffset)
6187 << HasExplicitObjectParameter << Fn->getSourceRange();
6190 ? diag::err_typecheck_call_too_few_args
6191 : diag::err_typecheck_call_too_few_args_at_least)
6192 << FnKind << MinArgs - ExplicitObjectParameterOffset
6193 <<
static_cast<unsigned>(Args.size()) -
6194 ExplicitObjectParameterOffset
6195 << HasExplicitObjectParameter << Fn->getSourceRange();
6198 if (!TC && FDecl && !FDecl->
getBuiltinID() && !IsExecConfig)
6206 assert((
Call->getNumArgs() == NumParams) &&
6207 "We should have reserved space for the default arguments before!");
6212 if (Args.size() > NumParams) {
6218 ? diag::err_typecheck_call_too_many_args_suggest
6219 : diag::err_typecheck_call_too_many_args_at_most_suggest;
6222 << FnKind << NumParams - ExplicitObjectParameterOffset
6223 <<
static_cast<unsigned>(Args.size()) -
6224 ExplicitObjectParameterOffset
6226 }
else if (NumParams - ExplicitObjectParameterOffset == 1 && FDecl &&
6229 Diag(Args[NumParams]->getBeginLoc(),
6230 MinArgs == NumParams
6231 ? diag::err_typecheck_call_too_many_args_one
6232 : diag::err_typecheck_call_too_many_args_at_most_one)
6233 << FnKind << FDecl->
getParamDecl(ExplicitObjectParameterOffset)
6234 <<
static_cast<unsigned>(Args.size()) -
6235 ExplicitObjectParameterOffset
6236 << HasExplicitObjectParameter << Fn->getSourceRange()
6238 Args.back()->getEndLoc());
6240 Diag(Args[NumParams]->getBeginLoc(),
6241 MinArgs == NumParams
6242 ? diag::err_typecheck_call_too_many_args
6243 : diag::err_typecheck_call_too_many_args_at_most)
6244 << FnKind << NumParams - ExplicitObjectParameterOffset
6245 <<
static_cast<unsigned>(Args.size()) -
6246 ExplicitObjectParameterOffset
6247 << HasExplicitObjectParameter << Fn->getSourceRange()
6249 Args.back()->getEndLoc());
6252 if (!TC && FDecl && !FDecl->
getBuiltinID() && !IsExecConfig)
6257 Call->shrinkNumArgs(NumParams);
6268 unsigned TotalNumArgs = AllArgs.size();
6269 for (
unsigned i = 0; i < TotalNumArgs; ++i)
6270 Call->setArg(i, AllArgs[i]);
6272 Call->computeDependence();
6281 bool IsListInitialization) {
6286 for (
unsigned i = FirstParam; i < NumParams; i++) {
6291 if (ArgIx < Args.size()) {
6292 Arg = Args[ArgIx++];
6295 diag::err_call_incomplete_argument, Arg))
6299 bool CFAudited =
false;
6301 FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>() &&
6302 (!Param || !Param->hasAttr<CFConsumedAttr>()))
6305 FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>() &&
6306 (!Param || !Param->hasAttr<CFConsumedAttr>()))
6312 BE->getBlockDecl()->setDoesNotEscape();
6333 if (
const auto *OBT = Arg->
getType()->
getAs<OverflowBehaviorType>();
6336 OBT->isUnsignedIntegerOrEnumerationType() && OBT->isWrapKind();
6338 isPedantic ? diag::warn_obt_discarded_at_function_boundary_pedantic
6339 : diag::warn_obt_discarded_at_function_boundary)
6340 << Arg->
getType() << ProtoArgType;
6344 Entity,
SourceLocation(), Arg, IsListInitialization, AllowExplicit);
6350 assert(Param &&
"can't use default arguments without a known callee");
6362 CheckArrayAccess(Arg);
6367 AllArgs.push_back(Arg);
6376 for (
Expr *A : Args.slice(ArgIx)) {
6380 AllArgs.push_back(arg.get());
6385 for (
Expr *A : Args.slice(ArgIx)) {
6388 AllArgs.push_back(Arg.
get());
6393 for (
Expr *A : Args.slice(ArgIx))
6394 CheckArrayAccess(A);
6402 TL = DTL.getOriginalLoc();
6405 << ATL.getLocalSourceRange();
6411 const Expr *ArgExpr) {
6416 QualType OrigTy = Param->getOriginalType();
6441 Diag(CallLoc, diag::warn_static_array_too_small)
6449 std::optional<CharUnits> ArgSize =
6451 std::optional<CharUnits> ParmSize =
6453 if (ArgSize && ParmSize && *ArgSize < *ParmSize) {
6454 Diag(CallLoc, diag::warn_static_array_too_small)
6456 << (
unsigned)ParmSize->getQuantity() << 1;
6470 if (!placeholder)
return false;
6472 switch (placeholder->
getKind()) {
6474#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
6475 case BuiltinType::Id:
6476#include "clang/Basic/OpenCLImageTypes.def"
6477#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
6478 case BuiltinType::Id:
6479#include "clang/Basic/OpenCLExtensionTypes.def"
6482#define SVE_TYPE(Name, Id, SingletonId) \
6483 case BuiltinType::Id:
6484#include "clang/Basic/AArch64ACLETypes.def"
6485#define PPC_VECTOR_TYPE(Name, Id, Size) \
6486 case BuiltinType::Id:
6487#include "clang/Basic/PPCTypes.def"
6488#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6489#include "clang/Basic/RISCVVTypes.def"
6490#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6491#include "clang/Basic/WebAssemblyReferenceTypes.def"
6492#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
6493#include "clang/Basic/AMDGPUTypes.def"
6494#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6495#include "clang/Basic/HLSLIntangibleTypes.def"
6496#define PLACEHOLDER_TYPE(ID, SINGLETON_ID)
6497#define BUILTIN_TYPE(ID, SINGLETON_ID) case BuiltinType::ID:
6498#include "clang/AST/BuiltinTypes.def"
6501 case BuiltinType::UnresolvedTemplate:
6504 case BuiltinType::Overload:
6509 case BuiltinType::ARCUnbridgedCast:
6513 case BuiltinType::PseudoObject:
6518 case BuiltinType::UnknownAny:
6522 case BuiltinType::BoundMember:
6523 case BuiltinType::BuiltinFn:
6524 case BuiltinType::IncompleteMatrixIdx:
6525 case BuiltinType::ArraySection:
6526 case BuiltinType::OMPArrayShaping:
6527 case BuiltinType::OMPIterator:
6531 llvm_unreachable(
"bad builtin type kind");
6537 bool hasInvalid =
false;
6538 for (
size_t i = 0, e = args.size(); i != e; i++) {
6541 if (result.
isInvalid()) hasInvalid =
true;
6542 else args[i] = result.
get();
6566 if (!Context.BuiltinInfo.hasPtrArgsOrResult(FDecl->
getBuiltinID()) || !FT ||
6570 bool NeedsNewDecl =
false;
6590 if (!ParamType->isPointerType() ||
6591 ParamType->getPointeeType().hasAddressSpace() ||
6592 !ArgType->isPointerType() ||
6593 !ArgType->getPointeeType().hasAddressSpace() ||
6595 OverloadParams.push_back(ParamType);
6600 NeedsNewDecl =
true;
6601 LangAS AS = ArgType->getPointeeType().getAddressSpace();
6603 PointeeType = Context.getAddrSpaceQualType(PointeeType, AS);
6604 OverloadParams.push_back(Context.getPointerType(PointeeType));
6614 OverloadParams, EPI);
6624 for (
unsigned i = 0, e = FT->
getNumParams(); i != e; ++i) {
6631 Params.push_back(Parm);
6633 OverloadDecl->setParams(Params);
6637 if (FDecl->
hasAttr<CUDAHostAttr>())
6638 OverloadDecl->
addAttr(CUDAHostAttr::CreateImplicit(Context));
6639 if (FDecl->
hasAttr<CUDADeviceAttr>())
6640 OverloadDecl->
addAttr(CUDADeviceAttr::CreateImplicit(Context));
6643 return OverloadDecl;
6654 !Callee->isVariadic())
6656 if (Callee->getMinRequiredArguments() > ArgExprs.size())
6659 if (
const EnableIfAttr *
Attr =
6660 S.
CheckEnableIf(Callee, Fn->getBeginLoc(), ArgExprs,
true)) {
6661 S.
Diag(Fn->getBeginLoc(),
6663 ? diag::err_ovl_no_viable_member_function_in_call
6664 : diag::err_ovl_no_viable_function_in_call)
6665 << Callee << Callee->getSourceRange();
6666 S.
Diag(Callee->getLocation(),
6667 diag::note_ovl_candidate_disabled_by_function_cond_attr)
6668 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
6676 const auto GetFunctionLevelDCIfCXXClass =
6684 if (
const auto *MD = dyn_cast<CXXMethodDecl>(DC))
6685 return MD->
getParent()->getCanonicalDecl();
6688 if (
const auto *RD = dyn_cast<CXXRecordDecl>(DC))
6689 return RD->getCanonicalDecl();
6696 const CXXRecordDecl *
const CurParentClass = GetFunctionLevelDCIfCXXClass(S);
6697 if (!CurParentClass)
6704 assert(NamingClass &&
"Must have naming class even for implicit access");
6710 return CurParentClass == NamingClass ||
6759 if (
Call->getNumArgs() != 1)
6762 const Expr *E =
Call->getCallee()->IgnoreParenImpCasts();
6765 const DeclRefExpr *DRE = dyn_cast_if_present<DeclRefExpr>(E);
6778 if (BuiltinID != Builtin::BImove && BuiltinID != Builtin::BIforward)
6781 S.
Diag(DRE->
getLocation(), diag::warn_unqualified_call_to_std_cast_function)
6792 if (
Call.isInvalid())
6797 if (
const auto *ULE = dyn_cast<UnresolvedLookupExpr>(Fn);
6798 ULE && ULE->hasExplicitTemplateArgs() && ULE->decls().empty()) {
6799 DiagCompat(Fn->getExprLoc(), diag_compat::adl_only_template_id)
6807 if (
const auto *CE = dyn_cast<CallExpr>(
Call.get()))
6813 if (
auto *DRE = dyn_cast<DeclRefExpr>(Fn->IgnoreParens());
6814 DRE &&
Call.get()->isValueDependent()) {
6824 if (T->isDependentType())
6827 if (T == Context.BoundMemberTy || T == Context.UnknownAnyTy ||
6828 T == Context.BuiltinFnTy || T == Context.OverloadTy ||
6829 T->isFunctionType() || T->isFunctionReferenceType() ||
6830 T->isMemberFunctionPointerType() || T->isFunctionPointerType() ||
6831 T->isBlockPointerType() || T->isRecordType())
6840 Expr *ExecConfig,
bool IsExecConfig,
6841 bool AllowRecovery) {
6850 if (Fn->getType() ==
Context.BuiltinFnTy && ArgExprs.size() == 1 &&
6851 ArgExprs[0]->getType() ==
Context.BuiltinFnTy) {
6854 if (FD->getName() ==
"__builtin_amdgcn_is_invocable") {
6868 for (
const Expr *Arg : ArgExprs)
6869 if (CheckInvalidBuiltinCountedByRef(Arg,
6876 if (!ArgExprs.empty()) {
6878 Diag(Fn->getBeginLoc(), diag::err_pseudo_dtor_call_with_args)
6881 ArgExprs.back()->getEndLoc()));
6887 if (Fn->getType() ==
Context.PseudoObjectTy) {
6904 *
this, dyn_cast<UnresolvedMemberExpr>(Fn->IgnoreParens()),
6912 Diag(LParenLoc, diag::err_typecheck_call_not_function)
6913 << Fn->getType() << Fn->getSourceRange());
6921 if (Fn->getType()->isRecordType())
6925 if (Fn->getType() ==
Context.UnknownAnyTy) {
6931 if (Fn->getType() ==
Context.BoundMemberTy) {
6933 RParenLoc, ExecConfig, IsExecConfig,
6939 if (Fn->getType() ==
Context.OverloadTy) {
6950 Scope, Fn, ULE, LParenLoc, ArgExprs, RParenLoc, ExecConfig,
6953 RParenLoc, ExecConfig, IsExecConfig,
6959 if (Fn->getType() ==
Context.UnknownAnyTy) {
6965 Expr *NakedFn = Fn->IgnoreParens();
6967 bool CallingNDeclIndirectly =
false;
6969 if (
UnaryOperator *UnOp = dyn_cast<UnaryOperator>(NakedFn)) {
6970 if (UnOp->getOpcode() == UO_AddrOf) {
6971 CallingNDeclIndirectly =
true;
6976 if (
auto *DRE = dyn_cast<DeclRefExpr>(NakedFn)) {
6977 NDecl = DRE->getDecl();
6981 const llvm::Triple &Triple =
Context.getTargetInfo().getTriple();
6982 if (Triple.isSPIRV() && Triple.getVendor() == llvm::Triple::AMD) {
6999 Fn->getValueKind(), FDecl,
nullptr, DRE->isNonOdrUse());
7002 }
else if (
auto *ME = dyn_cast<MemberExpr>(NakedFn))
7003 NDecl = ME->getMemberDecl();
7005 if (
FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(NDecl)) {
7007 FD,
true, Fn->getBeginLoc()))
7019 for (
unsigned Idx = 0; Idx < ArgExprs.size() && Idx < FD->param_size();
7022 if (!ArgExprs[Idx] || !Param || !Param->getType()->isPointerType() ||
7023 !ArgExprs[Idx]->getType()->isPointerType())
7027 auto ArgTy = ArgExprs[Idx]->getType();
7028 auto ArgPtTy = ArgTy->getPointeeType();
7029 auto ArgAS = ArgPtTy.getAddressSpace();
7032 bool NeedImplicitASC =
7037 if (!NeedImplicitASC)
7041 if (ArgExprs[Idx]->isGLValue()) {
7045 ArgExprs[Idx] = Res.
get();
7049 Qualifiers ArgPtQuals = ArgPtTy.getQualifiers();
7052 Context.getQualifiedType(ArgPtTy.getUnqualifiedType(), ArgPtQuals);
7055 ArgTy.getQualifiers());
7059 CK_AddressSpaceConversion)
7065 if (
Context.isDependenceAllowed() &&
7068 assert((Fn->containsErrors() ||
7069 llvm::any_of(ArgExprs,
7070 [](
clang::Expr *E) { return E->containsErrors(); })) &&
7071 "should only occur in error-recovery path.");
7076 ExecConfig, IsExecConfig);
7081 std::string Name =
Context.BuiltinInfo.getName(Id);
7087 assert(BuiltInDecl &&
"failed to find builtin declaration");
7091 assert(DeclRef.
isUsable() &&
"Builtin reference cannot fail");
7096 assert(!
Call.isInvalid() &&
"Call to builtin cannot fail!");
7116 Diag(BuiltinLoc, diag::err_invalid_astype_of_different_size)
7134 FunctionDecl *FDecl = dyn_cast_or_null<FunctionDecl>(NDecl);
7135 unsigned BuiltinID = (FDecl ? FDecl->
getBuiltinID() : 0);
7138 switch (BuiltinID) {
7139 case Builtin::BI__builtin_longjmp:
7140 case Builtin::BI__builtin_setjmp:
7141 case Builtin::BI__sigsetjmp:
7142 case Builtin::BI_longjmp:
7143 case Builtin::BI_setjmp:
7144 case Builtin::BIlongjmp:
7145 case Builtin::BIsetjmp:
7146 case Builtin::BIsiglongjmp:
7147 case Builtin::BIsigsetjmp:
7160 if (DeferParent->
Contains(*CurScope) &&
7162 Diag(Fn->getExprLoc(), diag::err_defer_invalid_sjlj) << FDecl;
7167 if (FDecl->
hasAttr<AnyX86InterruptAttr>()) {
7168 Diag(Fn->getExprLoc(), diag::err_anyx86_interrupt_called);
7171 if (FDecl->
hasAttr<ARMInterruptAttr>()) {
7172 Diag(Fn->getExprLoc(), diag::err_arm_interrupt_called);
7181 if (Caller->hasAttr<AnyX86InterruptAttr>() ||
7182 Caller->hasAttr<AnyX86NoCallerSavedRegistersAttr>()) {
7184 bool HasNonGPRRegisters =
7186 if (HasNonGPRRegisters &&
7187 (!FDecl || !FDecl->
hasAttr<AnyX86NoCallerSavedRegistersAttr>())) {
7188 Diag(Fn->getExprLoc(), diag::warn_anyx86_excessive_regsave)
7189 << (Caller->hasAttr<AnyX86InterruptAttr>() ? 0 : 1);
7208 Fn->getType()->isSpecificBuiltinType(BuiltinType::BuiltinFn)) {
7224 if (!BuiltinID || !
Context.BuiltinInfo.hasCustomTypechecking(BuiltinID)) {
7231 return ExprError(
Diag(LParenLoc, diag::err_typecheck_call_not_function)
7232 << Fn->getType() << Fn->getSourceRange());
7238 if (Fn->getType() ==
Context.UnknownAnyTy) {
7246 return ExprError(
Diag(LParenLoc, diag::err_typecheck_call_not_function)
7247 << Fn->getType() << Fn->getSourceRange());
7254 const auto *Proto = dyn_cast_or_null<FunctionProtoType>(FuncT);
7255 unsigned NumParams = Proto ? Proto->getNumParams() : 0;
7259 assert(UsesADL == ADLCallKind::NotADL &&
7260 "CUDAKernelCallExpr should not use ADL");
7271 if (BuiltinID &&
Context.BuiltinInfo.hasCustomTypechecking(BuiltinID)) {
7284 ExprResult E = CheckBuiltinFunctionCall(FDecl, BuiltinID, TheCall);
7293 if (FDecl && !FDecl->
hasAttr<CUDAGlobalAttr>())
7294 return ExprError(
Diag(LParenLoc,diag::err_kern_call_not_global_function)
7295 << FDecl << Fn->getSourceRange());
7301 return ExprError(
Diag(LParenLoc, diag::err_kern_type_not_void_return)
7302 << Fn->getType() << Fn->getSourceRange());
7305 if (FDecl && FDecl->
hasAttr<CUDAGlobalAttr>())
7306 return ExprError(
Diag(LParenLoc, diag::err_global_call_not_config)
7307 << FDecl << Fn->getSourceRange());
7321 if (
Context.getTargetInfo().getTriple().isWasm()) {
7322 for (
const Expr *Arg : Args) {
7323 if (Arg && Arg->getType()->isWebAssemblyTableType()) {
7325 diag::err_wasm_table_as_function_parameter));
7349 if (!Proto || !(Proto->isVariadic() && Args.size() >= Def->
param_size()))
7350 Diag(RParenLoc, diag::warn_call_wrong_number_of_arguments)
7351 << (Args.size() > Def->
param_size()) << FDecl << Fn->getSourceRange();
7370 if (!Proto && !Args.empty() &&
7372 !
Diags.isIgnored(diag::warn_strict_uses_without_prototype,
7374 Diag(LParenLoc, diag::warn_strict_uses_without_prototype)
7375 << (FDecl !=
nullptr) << FDecl;
7378 for (
unsigned i = 0, e = Args.size(); i != e; i++) {
7379 Expr *Arg = Args[i];
7381 if (Proto && i < Proto->getNumParams()) {
7383 Context, Proto->getParamType(i), Proto->isParamConsumed(i));
7401 diag::err_call_incomplete_argument, Arg))
7410 if (
Method->isImplicitObjectMemberFunction())
7411 return ExprError(
Diag(LParenLoc, diag::err_member_call_without_object)
7412 << Fn->getSourceRange() << 0);
7420 for (
unsigned i = 0, e = Args.size(); i != e; i++) {
7421 if (
const auto *RT =
7422 dyn_cast<RecordType>(Args[i]->
getType().getCanonicalType())) {
7423 if (RT->getDecl()->isOrContainsUnion())
7424 Diag(Args[i]->getBeginLoc(), diag::warn_cmse_nonsecure_union)
7435 checkFortifiedBuiltinMemoryFunction(FDecl, TheCall);
7436 checkFortifiedLibcArgument(FDecl, TheCall);
7439 return CheckBuiltinFunctionCall(FDecl, BuiltinID, TheCall);
7441 if (CheckPointerCall(NDecl, TheCall, Proto))
7444 if (CheckOtherCall(TheCall, Proto))
7454 assert(Ty &&
"ActOnCompoundLiteral(): missing type");
7455 assert(InitExpr &&
"ActOnCompoundLiteral(): missing expression");
7460 TInfo =
Context.getTrivialTypeSourceInfo(literalType);
7472 LParenLoc,
Context.getBaseElementType(literalType),
7473 diag::err_array_incomplete_or_sizeless_type,
7496 ? diag::err_variable_object_no_init
7497 : diag::err_compound_literal_with_vla_type;
7504 diag::err_typecheck_decl_incomplete_type,
7519 LiteralExpr =
Result.get();
7526 bool IsFileScope = !
CurContext->isFunctionOrMethod() &&
7557 if (
auto ILE = dyn_cast<InitListExpr>(LiteralExpr))
7558 for (
unsigned i = 0, j = ILE->getNumInits(); i != j; i++) {
7560 if (!
Init->isTypeDependent() && !
Init->isValueDependent() &&
7562 Diag(
Init->getExprLoc(), diag::err_init_element_not_constant)
7563 <<
Init->getSourceBitField();
7571 LiteralExpr, IsFileScope);
7583 Diag(LParenLoc, diag::err_compound_literal_with_address_space)
7601 Cleanup.setExprNeedsCleanups(
true);
7620 bool DiagnosedArrayDesignator =
false;
7621 bool DiagnosedNestedDesignator =
false;
7622 bool DiagnosedMixedDesignator =
false;
7626 for (
unsigned I = 0, E = InitArgList.size(); I != E; ++I) {
7627 if (
auto *DIE = dyn_cast<DesignatedInitExpr>(InitArgList[I])) {
7629 FirstDesignator = DIE->getBeginLoc();
7634 if (!DiagnosedNestedDesignator && DIE->size() > 1) {
7635 DiagnosedNestedDesignator =
true;
7636 Diag(DIE->getBeginLoc(), diag::ext_designated_init_nested)
7637 << DIE->getDesignatorsSourceRange();
7640 for (
auto &Desig : DIE->designators()) {
7641 if (!Desig.isFieldDesignator() && !DiagnosedArrayDesignator) {
7642 DiagnosedArrayDesignator =
true;
7643 Diag(Desig.getBeginLoc(), diag::ext_designated_init_array)
7644 << Desig.getSourceRange();
7648 if (!DiagnosedMixedDesignator &&
7650 DiagnosedMixedDesignator =
true;
7651 Diag(DIE->getBeginLoc(), diag::ext_designated_init_mixed)
7652 << DIE->getSourceRange();
7653 Diag(InitArgList[0]->getBeginLoc(), diag::note_designated_init_mixed)
7654 << InitArgList[0]->getSourceRange();
7658 DiagnosedMixedDesignator =
true;
7660 Diag(DIE->getBeginLoc(), diag::ext_designated_init_mixed)
7661 << DIE->getSourceRange();
7662 Diag(InitArgList[I]->getBeginLoc(), diag::note_designated_init_mixed)
7663 << InitArgList[I]->getSourceRange();
7667 if (FirstDesignator.
isValid()) {
7671 !DiagnosedNestedDesignator && !DiagnosedMixedDesignator) {
7673 ? diag::warn_cxx17_compat_designated_init
7674 : diag::ext_cxx_designated_init);
7676 Diag(FirstDesignator, diag::ext_designated_init);
7680 return BuildInitList(LBraceLoc, InitArgList, RBraceLoc,
true);
7691 for (
unsigned I = 0, E = InitArgList.size(); I != E; ++I) {
7692 if (InitArgList[I]->
getType()->isNonOverloadPlaceholderType()) {
7699 InitArgList[I] = result.
get();
7719 Cleanup.setExprNeedsCleanups(
true);
7728 if (
Context.hasSameUnqualifiedType(SrcTy, DestTy))
7733 llvm_unreachable(
"member pointer type in C");
7742 if (SrcAS != DestAS)
7743 return CK_AddressSpaceConversion;
7744 if (
Context.hasCvrSimilarType(SrcTy, DestTy))
7750 ? CK_BitCast : CK_AnyPointerToBlockPointerCast);
7755 return CK_CPointerToObjCPointerCast;
7757 return CK_BlockPointerToObjCPointerCast;
7759 return CK_PointerToBoolean;
7761 return CK_PointerToIntegral;
7767 llvm_unreachable(
"illegal cast from pointer");
7769 llvm_unreachable(
"Should have returned before this");
7774 return CK_FixedPointCast;
7776 return CK_FixedPointToBoolean;
7778 return CK_FixedPointToIntegral;
7780 return CK_FixedPointToFloating;
7784 diag::err_unimplemented_conversion_with_fixed_point_type)
7786 return CK_IntegralCast;
7791 llvm_unreachable(
"illegal cast to pointer type");
7793 llvm_unreachable(
"Should have returned before this");
7803 return CK_NullToPointer;
7804 return CK_IntegralToPointer;
7806 return CK_IntegralToBoolean;
7808 return CK_IntegralCast;
7810 return CK_IntegralToFloating;
7815 return CK_IntegralRealToComplex;
7819 CK_IntegralToFloating);
7820 return CK_FloatingRealToComplex;
7822 llvm_unreachable(
"member pointer type in C");
7824 return CK_IntegralToFixedPoint;
7826 llvm_unreachable(
"Should have returned before this");
7831 return CK_FloatingCast;
7833 return CK_FloatingToBoolean;
7835 return CK_FloatingToIntegral;
7840 return CK_FloatingRealToComplex;
7844 CK_FloatingToIntegral);
7845 return CK_IntegralRealToComplex;
7849 llvm_unreachable(
"valid float->pointer cast?");
7851 llvm_unreachable(
"member pointer type in C");
7853 return CK_FloatingToFixedPoint;
7855 llvm_unreachable(
"Should have returned before this");
7860 return CK_FloatingComplexCast;
7862 return CK_FloatingComplexToIntegralComplex;
7865 if (
Context.hasSameType(ET, DestTy))
7866 return CK_FloatingComplexToReal;
7868 return CK_FloatingCast;
7871 return CK_FloatingComplexToBoolean;
7875 CK_FloatingComplexToReal);
7876 return CK_FloatingToIntegral;
7880 llvm_unreachable(
"valid complex float->pointer cast?");
7882 llvm_unreachable(
"member pointer type in C");
7885 diag::err_unimplemented_conversion_with_fixed_point_type)
7887 return CK_IntegralCast;
7889 llvm_unreachable(
"Should have returned before this");
7894 return CK_IntegralComplexToFloatingComplex;
7896 return CK_IntegralComplexCast;
7899 if (
Context.hasSameType(ET, DestTy))
7900 return CK_IntegralComplexToReal;
7902 return CK_IntegralCast;
7905 return CK_IntegralComplexToBoolean;
7909 CK_IntegralComplexToReal);
7910 return CK_IntegralToFloating;
7914 llvm_unreachable(
"valid complex int->pointer cast?");
7916 llvm_unreachable(
"member pointer type in C");
7919 diag::err_unimplemented_conversion_with_fixed_point_type)
7921 return CK_IntegralCast;
7923 llvm_unreachable(
"Should have returned before this");
7926 llvm_unreachable(
"Unhandled scalar cast");
7933 len = vecType->getNumElements();
7934 eltType = vecType->getElementType();
7941 if (!
type->isRealType())
return false;
7951 auto ValidScalableConversion = [](
QualType FirstType,
QualType SecondType) {
7955 const auto *VecTy = SecondType->getAs<
VectorType>();
7959 return ValidScalableConversion(srcTy, destTy) ||
7960 ValidScalableConversion(destTy, srcTy);
7970 return matSrcType->
getNumRows() == matDestType->getNumRows() &&
7971 matSrcType->
getNumColumns() == matDestType->getNumColumns();
7977 uint64_t SrcLen, DestLen;
7987 uint64_t SrcEltSize =
Context.getTypeSize(SrcEltTy);
7988 uint64_t DestEltSize =
Context.getTypeSize(DestEltTy);
7990 return (SrcLen * SrcEltSize == DestLen * DestEltSize);
7995 "expected at least one type to be a vector here");
7997 bool IsSrcTyAltivec =
8013 return (IsSrcTyAltivec || IsDestTyAltivec);
8033 switch (
Context.getLangOpts().getLaxVectorConversions()) {
8040 if (!Vec || !Vec->getElementType()->isIntegralOrEnumerationType())
8045 if (!Vec || !Vec->getElementType()->isIntegralOrEnumerationType())
8062 return Diag(R.getBegin(), diag::err_invalid_conversion_between_matrixes)
8063 << DestTy << SrcTy << R;
8066 return Diag(R.getBegin(),
8067 diag::err_invalid_conversion_between_matrix_and_type)
8068 << SrcTy << DestTy << R;
8070 return Diag(R.getBegin(),
8071 diag::err_invalid_conversion_between_matrix_and_type)
8072 << DestTy << SrcTy << R;
8075 Kind = CK_MatrixCast;
8081 assert(VectorTy->
isVectorType() &&
"Not a vector type!");
8085 return Diag(R.getBegin(),
8087 diag::err_invalid_conversion_between_vectors :
8088 diag::err_invalid_conversion_between_vector_and_integer)
8089 << VectorTy << Ty << R;
8091 return Diag(R.getBegin(),
8092 diag::err_invalid_conversion_between_vector_and_scalar)
8093 << VectorTy << Ty << R;
8102 if (DestElemTy == SplattedExpr->
getType())
8103 return SplattedExpr;
8116 CK_BooleanToSignedIntegral);
8117 SplattedExpr = CastExprRes.
get();
8118 CK = CK_IntegralToFloating;
8120 CK = CK_BooleanToSignedIntegral;
8127 SplattedExpr = CastExprRes.
get();
8135 if (DestElemTy == SplattedExpr->
getType())
8136 return SplattedExpr;
8145 SplattedExpr = CastExprRes.
get();
8163 !
Context.hasSameUnqualifiedType(DestTy, SrcTy) &&
8164 !
Context.areCompatibleVectorTypes(DestTy, SrcTy))) {
8165 Diag(R.getBegin(),diag::err_invalid_conversion_between_ext_vectors)
8166 << DestTy << SrcTy << R;
8177 return Diag(R.getBegin(),
8178 diag::err_invalid_conversion_between_vector_and_scalar)
8179 << DestTy << SrcTy << R;
8181 Kind = CK_VectorSplat;
8191 DestType == SourceType)
8199 if (!CE->getCalleeAllocSizeAttr())
8201 std::optional<llvm::APInt> AllocSize =
8202 CE->evaluateBytesReturnedByAllocSizeCall(S.
Context);
8205 if (!AllocSize || AllocSize->isZero())
8215 if (LhsSize && Size < LhsSize)
8217 << Size.getQuantity() << TargetType << LhsSize->getQuantity();
8225 "ActOnCastExpr(): missing type or expr");
8241 bool isVectorLiteral =
false;
8256 isVectorLiteral =
true;
8259 isVectorLiteral =
true;
8264 if (isVectorLiteral)
8294 "Expected paren or paren list expression");
8301 LiteralLParenLoc = PE->getLParenLoc();
8302 LiteralRParenLoc = PE->getRParenLoc();
8303 exprs = PE->getExprs();
8304 numExprs = PE->getNumExprs();
8331 if (numExprs == 1) {
8334 if (Literal.isInvalid())
8340 else if (numExprs < numElems) {
8342 diag::err_incorrect_number_of_vector_initializers);
8346 initExprs.append(exprs, exprs + numExprs);
8355 Diag(exprs[0]->getBeginLoc(), diag::err_typecheck_convert_incompatible)
8362 if (Literal.isInvalid())
8369 initExprs.append(exprs, exprs + numExprs);
8375 LiteralRParenLoc,
false);
8404 unsigned NumUserSpecifiedExprs,
8409 InitLoc, LParenLoc, RParenLoc);
8414 const Expr *NullExpr = LHSExpr;
8415 const Expr *NonPointerExpr = RHSExpr;
8422 NonPointerExpr = LHSExpr;
8444 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands_null)
8445 << NonPointerExpr->
getType() << DiagType
8457 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_nonfloat)
8458 << CondTy <<
Cond->getSourceRange();
8465 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_scalar)
8466 << CondTy <<
Cond->getSourceRange();
8499 bool IsBlockPointer =
false;
8503 IsBlockPointer =
true;
8528 ResultAddrSpace = LAddrSpace;
8530 ResultAddrSpace = RAddrSpace;
8532 S.
Diag(Loc, diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
8539 auto LHSCastKind = CK_BitCast, RHSCastKind = CK_BitCast;
8544 S.
Diag(Loc, diag::err_typecheck_cond_incompatible_ptrauth)
8561 LAddrSpace == ResultAddrSpace ? CK_BitCast : CK_AddressSpaceConversion;
8563 RAddrSpace == ResultAddrSpace ? CK_BitCast : CK_AddressSpaceConversion;
8571 lhptee, rhptee,
false,
false,
8574 if (CompositeTy.
isNull()) {
8591 S.
Diag(Loc, diag::ext_typecheck_cond_incompatible_pointers)
8602 QualType ResultTy = [&, ResultAddrSpace]() {
8637 S.
Diag(Loc, diag::err_typecheck_cond_incompatible_operands)
8690 bool IsIntFirstExpr) {
8692 !Int.get()->getType()->isIntegerType())
8695 Expr *Expr1 = IsIntFirstExpr ? Int.get() : PointerExpr;
8696 Expr *Expr2 = IsIntFirstExpr ? PointerExpr : Int.get();
8698 S.
Diag(Loc, diag::ext_typecheck_cond_pointer_integer_mismatch)
8702 CK_IntegralToPointer);
8736 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_int_float)
8742 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_int_float)
8748 if (LHSType == RHSType)
8758 (S, LHS, RHS, LHSType, RHSType,
false);
8792 llvm::raw_svector_ostream OS(Str);
8793 OS <<
"(vector of " << NumElements <<
" '" << EleTyName <<
"' values)";
8794 S.
Diag(QuestionLoc, diag::err_conditional_vector_element_size)
8795 << CondTy << OS.str();
8816 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_nonfloat)
8817 <<
Cond->getType() <<
Cond->getSourceRange();
8834 S.
Diag(QuestionLoc, diag::err_conditional_vector_size)
8835 << CondTy << VecResTy;
8840 QualType RVE = RV->getElementType();
8845 S.
Diag(QuestionLoc, diag::err_conditional_vector_element_size)
8846 << CondTy << VecResTy;
8861 if (
Cond.isInvalid())
8872 bool IsBoolVecLang =
8901 if (
const CallExpr *CE = dyn_cast<CallExpr>(E)) {
8902 QualType Ty = CE->getCallee()->getType();
8934 if (
Context.isDependenceAllowed() &&
8940 "should only occur in error-recovery path.");
8947 Cond.get()->getType()->isExtVectorType())
8952 if (
Cond.isInvalid())
8975 Diag(QuestionLoc, diag::err_wasm_table_conditional_expression)
8984 diag::err_typecheck_cond_incompatible_operands) << LHSTy << RHSTy
9003 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands)
9019 Context.hasSameUnqualifiedType(LHSTy, RHSTy))
9059 if (!compositeType.
isNull())
9060 return compositeType;
9090 if (
Context.hasSameType(LHSTy, RHSTy))
9091 return Context.getCommonSugaredType(LHSTy, RHSTy);
9094 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands)
9113 Self.Diag(Loc,
Note) << ParenRange;
9133 const Expr **RHSExprs) {
9138 if (
const auto *MTE = dyn_cast<MaterializeTemporaryExpr>(E)) {
9139 E = MTE->getSubExpr();
9144 if (
const auto *OP = dyn_cast<BinaryOperator>(E);
9146 *Opcode = OP->getOpcode();
9147 *RHSExprs = OP->getRHS();
9152 if (
const auto *
Call = dyn_cast<CXXOperatorCallExpr>(E)) {
9153 if (
Call->getNumArgs() != 2)
9159 if (OO < OO_Plus || OO > OO_Arrow ||
9160 OO == OO_PlusPlus || OO == OO_MinusMinus)
9166 *RHSExprs =
Call->getArg(1);
9182 if (
const auto *OP = dyn_cast<BinaryOperator>(E))
9183 return OP->isComparisonOp() || OP->isLogicalOp();
9184 if (
const auto *OP = dyn_cast<UnaryOperator>(E))
9185 return OP->getOpcode() == UO_LNot;
9200 const Expr *RHSExpr) {
9202 const Expr *CondRHS;
9213 ? diag::warn_precedence_bitwise_conditional
9214 : diag::warn_precedence_conditional;
9216 Self.Diag(OpLoc, DiagID)
9222 Self.PDiag(diag::note_precedence_silence)
9227 Self.PDiag(diag::note_precedence_conditional_first),
9238 auto GetNullability = [](
QualType Ty) {
9249 auto LHSKind = GetNullability(LHSTy), RHSKind = GetNullability(RHSTy);
9257 MergedKind = RHSKind;
9264 MergedKind = RHSKind;
9266 MergedKind = LHSKind;
9272 if (GetNullability(ResTy) == MergedKind)
9290 Expr *commonExpr =
nullptr;
9292 commonExpr = CondExpr;
9299 commonExpr = result.
get();
9313 commonExpr = commonRes.
get();
9323 commonExpr = MatExpr.
get();
9331 LHSExpr = CondExpr = opaqueValue;
9339 VK, OK, QuestionLoc);
9340 if (result.
isNull() ||
Cond.isInvalid() || LHS.isInvalid() ||
9347 CheckBoolLikeConversion(
Cond.get(), QuestionLoc);
9355 RHS.get(), result,
VK, OK);
9358 commonExpr, opaqueValue,
Cond.get(), LHS.get(), RHS.get(), QuestionLoc,
9359 ColonLoc, result,
VK, OK);
9363 unsigned FromAttributes = 0, ToAttributes = 0;
9364 if (
const auto *FromFn =
9365 dyn_cast<FunctionProtoType>(
Context.getCanonicalType(FromType)))
9368 if (
const auto *ToFn =
9369 dyn_cast<FunctionProtoType>(
Context.getCanonicalType(ToType)))
9373 return FromAttributes != ToAttributes;
9385 assert(LHSType.
isCanonical() &&
"LHS not canonicalized!");
9386 assert(RHSType.
isCanonical() &&
"RHS not canonicalized!");
9389 const Type *lhptee, *rhptee;
9391 std::tie(lhptee, lhq) =
9393 std::tie(rhptee, rhq) =
9464 diag::warn_typecheck_convert_incompatible_function_pointer_strict,
9488 ltrans = LUnderlying;
9489 rtrans = RUnderlying;
9507 if (ltrans == rtrans) {
9523 std::tie(lhptee, lhq) =
9525 std::tie(rhptee, rhq) =
9537 return AssignConvertType::
9538 IncompatibleNestedPointerAddressSpaceMismatch;
9542 if (lhptee == rhptee)
9562 const auto *LFPT = dyn_cast<FunctionProtoType>(LFT);
9563 const auto *RFPT = dyn_cast<FunctionProtoType>(RFT);
9566 LFPT->getParamTypes(),
9567 RFPT->getExtProtoInfo());
9572 LFPT->getParamTypes(), EPI);
9577 EPI.
ExtInfo = LFT->getExtInfo();
9579 RFPT->getParamTypes(), EPI);
9598 assert(LHSType.
isCanonical() &&
"LHS not canonicalized!");
9599 assert(RHSType.
isCanonical() &&
"RHS not canonicalized!");
9620 if (LQuals != RQuals)
9649 assert(LHSType.
isCanonical() &&
"LHS was not canonicalized!");
9650 assert(RHSType.
isCanonical() &&
"RHS was not canonicalized!");
9698 return VT->getElementType().getCanonicalType() == ElementType;
9728 LHSType =
Context.getCanonicalType(LHSType).getUnqualifiedType();
9729 RHSType =
Context.getCanonicalType(RHSType).getUnqualifiedType();
9732 if (LHSType == RHSType) {
9739 if (
const auto *AT = dyn_cast<AutoType>(LHSType)) {
9740 if (AT->isGNUAutoType()) {
9746 auto OBTResult =
Context.checkOBTAssignmentCompatibility(LHSType, RHSType);
9747 switch (OBTResult) {
9752 Kind = LHSType->
isBooleanType() ? CK_IntegralToBoolean : CK_IntegralCast;
9765 !
Context.areCompatibleOverflowBehaviorTypes(LHSPointee, RHSPointee)) {
9773 if (
const AtomicType *AtomicTy = dyn_cast<AtomicType>(LHSType)) {
9778 if (Kind != CK_NoOp && ConvertRHS)
9780 Kind = CK_NonAtomicToAtomic;
9792 if (
Context.typesAreCompatible(LHSTypeRef->getPointeeType(), RHSType)) {
9793 Kind = CK_LValueBitCast;
9804 if (LHSExtType->getNumElements() != RHSExtType->getNumElements())
9808 RHSExtType->getElementType()->isIntegerType()) {
9809 Kind = CK_IntegralToBoolean;
9813 if (
Context.getLangOpts().OpenCL &&
9814 Context.areCompatibleVectorTypes(LHSType, RHSType)) {
9824 Kind = CK_VectorSplat;
9834 if (
Context.areCompatibleVectorTypes(LHSType, RHSType)) {
9846 if (
Context.getTargetInfo().getTriple().isPPC() &&
9848 !
Context.areCompatibleVectorTypes(RHSType, LHSType))
9850 << RHSType << LHSType;
9864 if (
Context.getTargetInfo().getTriple().isPPC() &&
9869 << RHSType << LHSType;
9880 if (
ARM().areCompatibleSveTypes(LHSType, RHSType) ||
9881 ARM().areLaxCompatibleSveTypes(LHSType, RHSType)) {
9889 if (
Context.areCompatibleRVVTypes(LHSType, RHSType) ||
9890 Context.areLaxCompatibleRVVTypes(LHSType, RHSType)) {
9919 if (
const PointerType *LHSPointer = dyn_cast<PointerType>(LHSType)) {
9922 LangAS AddrSpaceL = LHSPointer->getPointeeType().getAddressSpace();
9924 if (AddrSpaceL != AddrSpaceR)
9925 Kind = CK_AddressSpaceConversion;
9926 else if (
Context.hasCvrSimilarType(RHSType, LHSType))
9936 Kind = CK_IntegralToPointer;
9944 if (LHSPointer->getPointeeType()->isVoidType()) {
9952 Context.getObjCClassRedefinitionType())) {
9963 if (LHSPointer->getPointeeType()->isVoidType()) {
9964 LangAS AddrSpaceL = LHSPointer->getPointeeType().getAddressSpace();
9969 AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion : CK_BitCast;
9987 Kind = AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion : CK_BitCast;
9993 Kind = CK_IntegralToPointer;
9999 Kind = CK_AnyPointerToBlockPointerCast;
10005 if (RHSPT->getPointeeType()->isVoidType()) {
10006 Kind = CK_AnyPointerToBlockPointerCast;
10020 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
10022 !
ObjC().CheckObjCARCUnavailableWeakConversion(OrigLHSType, RHSType))
10029 Kind = CK_IntegralToPointer;
10036 Kind = CK_CPointerToObjCPointerCast;
10046 Context.getObjCClassRedefinitionType())) {
10058 Kind = CK_BlockPointerToObjCPointerCast;
10070 Kind = CK_NullToPointer;
10077 if (LHSType ==
Context.BoolTy) {
10078 Kind = CK_PointerToBoolean;
10084 Kind = CK_PointerToIntegral;
10094 if (LHSType ==
Context.BoolTy) {
10095 Kind = CK_PointerToBoolean;
10101 Kind = CK_PointerToIntegral;
10110 if (
Context.typesAreCompatible(LHSType, RHSType)) {
10117 Kind = CK_IntToOCLSampler;
10151 const RecordType *UT =
ArgType->getAsUnionType();
10156 if (!UD->
hasAttr<TransparentUnionAttr>())
10162 for (
auto *it : UD->
fields()) {
10163 if (it->getType()->isPointerType()) {
10202 bool DiagnoseCFAudited,
10206 assert((ConvertRHS || !
Diagnose) &&
"can't indicate whether we diagnosed");
10212 ExprResult &RHS = ConvertRHS ? CallerRHS : LocalRHS;
10216 if (RHSPtrType->getPointeeType()->hasAttr(attr::NoDeref) &&
10217 !LHSPtrType->getPointeeType()->hasAttr(attr::NoDeref)) {
10219 diag::warn_noderef_to_dereferenceable_pointer)
10238 AllowedExplicit::None,
10250 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
10251 !
ObjC().CheckObjCARCUnavailableWeakConversion(LHSType, RHSType))
10273 RHS.
get(), LHSType,
false, DAP))
10282 if (!
Context.hasSameUnqualifiedType(RHSType, LHSType)) {
10410 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
10420 ObjC().CheckConversionToObjCLiteral(LHSType, E,
Diagnose))) {
10440struct OriginalOperand {
10441 explicit OriginalOperand(
Expr *Op) : Orig(Op), Conversion(
nullptr) {
10442 if (
auto *MTE = dyn_cast<MaterializeTemporaryExpr>(Op))
10443 Op = MTE->getSubExpr();
10444 if (
auto *BTE = dyn_cast<CXXBindTemporaryExpr>(Op))
10445 Op = BTE->getSubExpr();
10446 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(Op)) {
10447 Orig = ICE->getSubExprAsWritten();
10448 Conversion = ICE->getConversionFunction();
10452 QualType
getType()
const {
return Orig->getType(); }
10455 NamedDecl *Conversion;
10461 OriginalOperand OrigLHS(LHS.
get()), OrigRHS(RHS.
get());
10463 Diag(Loc, diag::err_typecheck_invalid_operands)
10464 << OrigLHS.getType() << OrigRHS.getType()
10469 if (OrigLHS.Conversion) {
10470 Diag(OrigLHS.Conversion->getLocation(),
10471 diag::note_typecheck_invalid_operands_converted)
10474 if (OrigRHS.Conversion) {
10476 diag::note_typecheck_invalid_operands_converted)
10491 if (!(LHSNatVec && RHSNatVec)) {
10493 Expr *NonVector = !LHSNatVec ? LHS.
get() : RHS.
get();
10494 Diag(Loc, diag::err_typecheck_logical_vector_expr_gnu_cpp_restrict)
10496 <<
Vector->getSourceRange();
10500 Diag(Loc, diag::err_typecheck_logical_vector_expr_gnu_cpp_restrict)
10523 unsigned &DiagID) {
10529 scalarCast = CK_IntegralToBoolean;
10534 DiagID = diag::err_opencl_scalar_type_rank_greater_than_vector_type;
10539 scalarCast = CK_IntegralCast;
10544 DiagID = diag::err_opencl_scalar_type_rank_greater_than_vector_type;
10547 scalarCast = CK_FloatingCast;
10550 scalarCast = CK_IntegralToFloating;
10559 if (scalarCast != CK_NoOp)
10570 assert(VecTy &&
"Expression E must be a vector");
10575 VecTy->getVectorKind());
10579 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(E))
10580 if (ICE->getSubExpr()->getType() == NewVecTy)
10581 return ICE->getSubExpr();
10583 auto Cast = ElementType->
isIntegerType() ? CK_IntegralCast : CK_FloatingCast;
10591 Expr *E = Int->get();
10595 QualType IntTy = Int->get()->getType().getUnqualifiedType();
10601 bool CstInt = Int->get()->EvaluateAsInt(EVResult, S.
Context);
10610 unsigned NumBits = IntSigned
10612 :
Result.getActiveBits())
10613 :
Result.getActiveBits();
10620 return (IntSigned != OtherIntSigned &&
10626 return (Order < 0);
10633 if (Int->get()->containsErrors())
10636 QualType IntTy = Int->get()->getType().getUnqualifiedType();
10641 bool CstInt = Int->get()->EvaluateAsInt(EVResult, S.
Context);
10653 llvm::APFloat::rmTowardZero);
10656 bool Ignored =
false;
10657 Float.convertToInteger(ConvertBack, llvm::APFloat::rmNearestTiesToEven,
10659 if (
Result != ConvertBack)
10665 unsigned FloatPrec = llvm::APFloat::semanticsPrecision(
10667 if (Bits > FloatPrec)
10680 QualType ScalarTy = Scalar->get()->getType().getUnqualifiedType();
10681 QualType VectorTy =
Vector->get()->getType().getUnqualifiedType();
10686 "ExtVectorTypes should not be handled here!");
10687 VectorEltTy = VT->getElementType();
10692 llvm_unreachable(
"Only Fixed-Length and SVE Vector types are handled here");
10718 ScalarCast = CK_IntegralCast;
10722 ScalarCast = CK_FloatingToIntegral;
10730 llvm::APFloat
Result(0.0);
10736 bool CstScalar = Scalar->get()->isValueDependent() ||
10739 if (!CstScalar && Order < 0)
10745 bool Truncated =
false;
10747 llvm::APFloat::rmNearestTiesToEven, &Truncated);
10752 ScalarCast = CK_FloatingCast;
10757 ScalarCast = CK_IntegralToFloating;
10764 if (ScalarCast != CK_NoOp)
10772 bool AllowBothBool,
10773 bool AllowBoolConversions,
10774 bool AllowBoolOperation,
10775 bool ReportInvalid) {
10776 if (!IsCompAssign) {
10792 assert(LHSVecType || RHSVecType);
10800 (RHSVecType && RHSVecType->getElementType()->isMFloat8Type()))
10805 if (!AllowBothBool && LHSVecType &&
10811 if (!AllowBoolOperation &&
10816 if (
Context.hasSameType(LHSType, RHSType))
10817 return Context.getCommonSugaredType(LHSType, RHSType);
10820 if (LHSVecType && RHSVecType &&
10821 Context.areCompatibleVectorTypes(LHSType, RHSType)) {
10835 if (AllowBoolConversions && LHSVecType && RHSVecType &&
10838 Context.getTypeSize(RHSVecType->getElementType()))) {
10845 if (!IsCompAssign &&
10848 RHSVecType->getElementType()->isIntegerType()) {
10857 unsigned &SVEorRVV) {
10878 if (IsSveRVVConversion(LHSType, RHSType, SVEorRVV) ||
10879 IsSveRVVConversion(RHSType, LHSType, SVEorRVV)) {
10880 Diag(Loc, diag::err_typecheck_sve_rvv_ambiguous)
10881 << SVEorRVV << LHSType << RHSType;
10888 unsigned &SVEorRVV) {
10893 if (FirstVecType && SecondVecType) {
10896 SecondVecType->getVectorKind() ==
10901 SecondVecType->getVectorKind() ==
10903 SecondVecType->getVectorKind() ==
10905 SecondVecType->getVectorKind() ==
10914 if (SecondVecType &&
10927 if (IsSveRVVGnuConversion(LHSType, RHSType, SVEorRVV) ||
10928 IsSveRVVGnuConversion(RHSType, LHSType, SVEorRVV)) {
10929 Diag(Loc, diag::err_typecheck_sve_rvv_gnu_ambiguous)
10930 << SVEorRVV << LHSType << RHSType;
10936 unsigned DiagID = diag::err_typecheck_vector_not_convertable;
10951 LHSType, RHSVecType->getElementType(),
10964 QualType VecType = LHSVecType ? LHSType : RHSType;
10965 const VectorType *VT = LHSVecType ? LHSVecType : RHSVecType;
10966 QualType OtherType = LHSVecType ? RHSType : LHSType;
10967 ExprResult *OtherExpr = LHSVecType ? &RHS : &LHS;
10969 if (
Context.getTargetInfo().getTriple().isPPC() &&
10971 !
Context.areCompatibleVectorTypes(RHSType, LHSType))
10972 Diag(Loc, diag::warn_deprecated_lax_vec_conv_all) << RHSType << LHSType;
10976 if (!IsCompAssign) {
10995 if ((!RHSVecType && !RHSType->
isRealType()) ||
10997 Diag(Loc, diag::err_typecheck_vector_not_convertable_non_scalar)
10998 << LHSType << RHSType
11010 Diag(Loc, diag::err_opencl_implicit_vector_conversion) << LHSType
11021 QualType Scalar = LHSVecType ? RHSType : LHSType;
11023 unsigned ScalarOrVector = LHSVecType && RHSVecType ? 1 : 0;
11025 diag::err_typecheck_vector_not_convertable_implict_truncation)
11026 << ScalarOrVector << Scalar <<
Vector;
11033 << LHSType << RHSType
11042 if (!IsCompAssign) {
11057 unsigned DiagID = diag::err_typecheck_invalid_operands;
11059 ((LHSBuiltinTy && LHSBuiltinTy->
isSVEBool()) ||
11060 (RHSBuiltinTy && RHSBuiltinTy->isSVEBool()))) {
11066 if (
Context.hasSameType(LHSType, RHSType))
11081 Diag(Loc, diag::err_typecheck_vector_not_convertable_non_scalar)
11088 Context.getBuiltinVectorTypeInfo(LHSBuiltinTy).EC !=
11089 Context.getBuiltinVectorTypeInfo(RHSBuiltinTy).EC) {
11090 Diag(Loc, diag::err_typecheck_vector_lengths_not_equal)
11099 bool ScalarOrVector =
11102 Diag(Loc, diag::err_typecheck_vector_not_convertable_implict_truncation)
11103 << ScalarOrVector << Scalar <<
Vector;
11135 S.
Diag(Loc, diag::warn_null_in_arithmetic_operation)
11147 S.
Diag(Loc, diag::warn_null_in_comparison_operation)
11148 << LHSNull << NonNullType
11160 QualType ElementType = CT->getElementType().getCanonicalType();
11161 bool IsComplexRangePromoted = S.
getLangOpts().getComplexRange() ==
11168 const llvm::fltSemantics &ElementTypeSemantics =
11170 const llvm::fltSemantics &HigherElementTypeSemantics =
11173 if ((llvm::APFloat::semanticsMaxExponent(ElementTypeSemantics) * 2 + 1 >
11174 llvm::APFloat::semanticsMaxExponent(HigherElementTypeSemantics)) ||
11181 if (
Type == HigherElementType) {
11193 const auto *LUE = dyn_cast<UnaryExprOrTypeTraitExpr>(LHS);
11194 const auto *RUE = dyn_cast<UnaryExprOrTypeTraitExpr>(RHS);
11197 if (LUE->getKind() != UETT_SizeOf || LUE->isArgumentType() ||
11198 RUE->getKind() != UETT_SizeOf)
11205 if (RUE->isArgumentType())
11206 RHSTy = RUE->getArgumentType().getNonReferenceType();
11208 RHSTy = RUE->getArgumentExpr()->IgnoreParens()->getType();
11215 if (
const auto *DRE = dyn_cast<DeclRefExpr>(LHSArg)) {
11216 if (
const ValueDecl *LHSArgDecl = DRE->getDecl())
11217 S.
Diag(LHSArgDecl->getLocation(), diag::note_pointer_declared_here)
11221 QualType ArrayElemTy = ArrayTy->getElementType();
11227 S.
Diag(Loc, diag::warn_division_sizeof_array)
11229 if (
const auto *DRE = dyn_cast<DeclRefExpr>(LHSArg)) {
11230 if (
const ValueDecl *LHSArgDecl = DRE->getDecl())
11231 S.
Diag(LHSArgDecl->getLocation(), diag::note_array_declared_here)
11235 S.
Diag(Loc, diag::note_precedence_silence) << RHS;
11248 S.
PDiag(diag::warn_remainder_division_by_zero)
11257 const Expr *LHSExpr = LHS.
get();
11258 const Expr *RHSExpr = RHS.
get();
11263 if (!LHSIsScoped && !RHSIsScoped)
11275 ->getDefinitionOrSelf()
11276 ->getIntegerType();
11277 std::string InsertionString =
"static_cast<" + IntType.getAsString() +
">(";
11278 S.
Diag(BeginLoc, diag::note_no_implicit_conversion_for_scoped_enum)
11283 DiagnosticHelper(LHSExpr, LHSType);
11286 DiagnosticHelper(RHSExpr, RHSType);
11293 bool IsCompAssign = Opc == BO_MulAssign || Opc == BO_DivAssign;
11294 bool IsDiv = Opc == BO_Div || Opc == BO_DivAssign;
11388 if (compType.
isNull() ||
11393 IsCompAssign ? BO_RemAssign : BO_Rem);
11404 ? diag::err_typecheck_pointer_arith_void_type
11405 : diag::ext_gnu_void_ptr)
11414 ? diag::err_typecheck_pointer_arith_void_type
11415 : diag::ext_gnu_void_ptr)
11416 << 0 <<
Pointer->getSourceRange();
11427 S.
Diag(Loc, diag::warn_gnu_null_ptr_arith)
11428 <<
Pointer->getSourceRange();
11430 S.
Diag(Loc, diag::warn_pointer_arith_null_ptr)
11447 S.
PDiag(diag::warn_pointer_sub_null_ptr)
11449 <<
Pointer->getSourceRange());
11458 ? diag::err_typecheck_pointer_arith_function_type
11459 : diag::ext_gnu_ptr_func_arith)
11471 assert(
Pointer->getType()->isAnyPointerType());
11473 ? diag::err_typecheck_pointer_arith_function_type
11474 : diag::ext_gnu_ptr_func_arith)
11475 << 0 <<
Pointer->getType()->getPointeeType()
11477 <<
Pointer->getSourceRange();
11485 QualType ResType = Operand->getType();
11487 ResType = ResAtomicType->getValueType();
11493 diag::err_typecheck_arithmetic_incomplete_or_sizeless_type,
11494 Operand->getSourceRange());
11507 QualType ResType = Operand->getType();
11509 ResType = ResAtomicType->getValueType();
11541 if (!isLHSPointer && !isRHSPointer)
return true;
11543 QualType LHSPointeeTy, RHSPointeeTy;
11548 if (isLHSPointer && isRHSPointer) {
11552 diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
11560 bool isLHSVoidPtr = isLHSPointer && LHSPointeeTy->
isVoidType();
11561 bool isRHSVoidPtr = isRHSPointer && RHSPointeeTy->
isVoidType();
11562 if (isLHSVoidPtr || isRHSVoidPtr) {
11570 bool isLHSFuncPtr = isLHSPointer && LHSPointeeTy->
isFunctionType();
11571 bool isRHSFuncPtr = isRHSPointer && RHSPointeeTy->
isFunctionType();
11572 if (isLHSFuncPtr || isRHSFuncPtr) {
11594 Expr* IndexExpr = RHSExpr;
11597 IndexExpr = LHSExpr;
11600 bool IsStringPlusInt = StrExpr &&
11606 Self.Diag(OpLoc, diag::warn_string_plus_int)
11610 if (IndexExpr == RHSExpr) {
11612 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence)
11617 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence);
11623 const Expr *StringRefExpr = LHSExpr;
11628 CharExpr = dyn_cast<CharacterLiteral>(LHSExpr->
IgnoreImpCasts());
11629 StringRefExpr = RHSExpr;
11632 if (!CharExpr || !StringRefExpr)
11652 Self.Diag(OpLoc, diag::warn_string_plus_char)
11653 << DiagRange << Ctx.
CharTy;
11655 Self.Diag(OpLoc, diag::warn_string_plus_char)
11656 << DiagRange << CharExpr->
getType();
11662 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence)
11667 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence);
11676 S.
Diag(Loc, diag::err_typecheck_sub_ptr_compatible)
11695 if (CompLHSTy) *CompLHSTy = compType;
11704 *CompLHSTy = compType;
11713 *CompLHSTy = compType;
11724 if (Opc == BO_Add) {
11731 if (CompLHSTy) *CompLHSTy = compType;
11745 std::swap(PExp, IExp);
11758 if (!IExp->getType()->isIntegerType())
11767 (!IExp->isValueDependent() &&
11768 (!IExp->EvaluateAsInt(KnownVal,
Context) ||
11772 Context, BO_Add, PExp, IExp);
11786 Diag(Loc, diag::err_ptrauth_indirect_goto_addrlabel_arithmetic)
11792 CheckArrayAccess(PExp, IExp);
11798 if (
Context.isPromotableIntegerType(LHSTy))
11799 LHSTy =
Context.getPromotedIntegerType(LHSTy);
11801 *CompLHSTy = LHSTy;
11822 if (CompLHSTy) *CompLHSTy = compType;
11831 *CompLHSTy = compType;
11840 *CompLHSTy = compType;
11854 if (CompLHSTy) *CompLHSTy = compType;
11871 Diag(Loc, diag::err_ptrauth_indirect_goto_addrlabel_arithmetic)
11897 CheckArrayAccess(LHS.
get(), RHS.
get(),
nullptr,
11900 if (CompLHSTy) *CompLHSTy = LHS.
get()->
getType();
11911 if (!
Context.hasSameUnqualifiedType(lpointee, rpointee)) {
11916 if (!
Context.typesAreCompatible(
11917 Context.getCanonicalType(lpointee).getUnqualifiedType(),
11918 Context.getCanonicalType(rpointee).getUnqualifiedType())) {
11944 if (ElementSize.
isZero()) {
11945 Diag(Loc,diag::warn_sub_ptr_zero_size_types)
11951 if (CompLHSTy) *CompLHSTy = LHS.
get()->
getType();
11952 return Context.getPointerDiffType();
11962 if (
const EnumType *ET = T->getAsCanonical<EnumType>())
11963 return ET->getDecl()->isScoped();
11975 if (Opc == BO_Shr &&
11984 llvm::APSInt Right = RHSResult.
Val.
getInt();
11986 if (Right.isNegative()) {
11988 S.
PDiag(diag::warn_shift_negative)
11999 LeftSize = FXSema.getWidth() - (
unsigned)FXSema.hasUnsignedPadding();
12001 if (Right.uge(LeftSize)) {
12003 S.
PDiag(diag::warn_shift_gt_typewidth)
12023 llvm::APSInt Left = LHSResult.
Val.
getInt();
12034 if (Left.isNegative()) {
12036 S.
PDiag(diag::warn_shift_lhs_negative)
12041 llvm::APInt ResultBits =
12042 static_cast<llvm::APInt &
>(Right) + Left.getSignificantBits();
12043 if (ResultBits.ule(LeftSize))
12045 llvm::APSInt
Result = Left.extend(ResultBits.getLimitedValue());
12051 Result.toString(HexResult, 16,
false,
true);
12057 if (ResultBits - 1 == LeftSize) {
12058 S.
Diag(Loc, diag::warn_shift_result_sets_sign_bit)
12059 << HexResult << LHSType
12064 S.
Diag(Loc, diag::warn_shift_result_gt_typewidth)
12065 << HexResult.str() <<
Result.getSignificantBits() << LHSType
12077 S.
Diag(Loc, diag::err_shift_rhs_only_vector)
12083 if (!IsCompAssign) {
12105 S.
Diag(Loc, diag::err_typecheck_invalid_operands)
12112 if (!LHSEleType->isIntegerType()) {
12113 S.
Diag(Loc, diag::err_typecheck_expect_int)
12118 if (!RHSEleType->isIntegerType()) {
12119 S.
Diag(Loc, diag::err_typecheck_expect_int)
12128 if (LHSEleType != RHSEleType) {
12130 LHSEleType = RHSEleType;
12136 }
else if (RHSVecTy) {
12141 S.
Diag(Loc, diag::err_typecheck_vector_lengths_not_equal)
12149 if (LHSBT != RHSBT &&
12151 S.
Diag(Loc, diag::warn_typecheck_vector_element_sizes_not_equal)
12168 bool IsCompAssign) {
12169 if (!IsCompAssign) {
12192 if ((LHSBuiltinTy && LHSBuiltinTy->
isSVEBool()) ||
12193 (RHSBuiltinTy && RHSBuiltinTy->
isSVEBool())) {
12194 S.
Diag(Loc, diag::err_typecheck_invalid_operands)
12199 if (!LHSEleType->isIntegerType()) {
12200 S.
Diag(Loc, diag::err_typecheck_expect_int)
12205 if (!RHSEleType->isIntegerType()) {
12206 S.
Diag(Loc, diag::err_typecheck_expect_int)
12214 S.
Diag(Loc, diag::err_typecheck_invalid_operands)
12224 if (LHSEleType != RHSEleType) {
12226 LHSEleType = RHSEleType;
12228 const llvm::ElementCount VecSize =
12237 S.
Diag(Loc, diag::err_typecheck_vector_lengths_not_equal)
12243 const llvm::ElementCount VecSize =
12245 if (LHSEleType != RHSEleType) {
12247 RHSEleType = LHSEleType;
12260 bool IsCompAssign) {
12294 if (IsCompAssign) LHS = OldLHS;
12322 S.
Diag(Loc, IsError ? diag::err_typecheck_comparison_of_distinct_pointers
12323 : diag::ext_typecheck_comparison_of_distinct_pointers)
12363 S.
Diag(Loc, IsError ? diag::err_typecheck_comparison_of_fptr_to_void
12364 : diag::ext_typecheck_comparison_of_fptr_to_void)
12371 case Stmt::ObjCArrayLiteralClass:
12372 case Stmt::ObjCDictionaryLiteralClass:
12373 case Stmt::ObjCStringLiteralClass:
12374 case Stmt::ObjCBoxedExprClass:
12418 QualType T = Method->parameters()[0]->getType();
12419 if (!T->isObjCObjectPointerType())
12422 QualType R = Method->getReturnType();
12423 if (!R->isScalarType())
12435 Literal = LHS.
get();
12438 Literal = RHS.
get();
12454 llvm_unreachable(
"Unknown Objective-C object literal kind");
12458 S.
Diag(Loc, diag::warn_objc_string_literal_comparison)
12459 << Literal->getSourceRange();
12461 S.
Diag(Loc, diag::warn_objc_literal_comparison)
12462 << LiteralKind << Literal->getSourceRange();
12471 S.
Diag(Loc, diag::note_objc_literal_comparison_isequal)
12484 if (!UO || UO->
getOpcode() != UO_LNot)
return;
12494 bool IsBitwiseOp = Opc == BO_And || Opc == BO_Or || Opc == BO_Xor;
12496 << Loc << IsBitwiseOp;
12523 if (
const DeclRefExpr *DR = dyn_cast<DeclRefExpr>(E)) {
12525 }
else if (
const MemberExpr *Mem = dyn_cast<MemberExpr>(E)) {
12526 if (Mem->isImplicitAccess())
12527 D = Mem->getMemberDecl();
12542 return std::nullopt;
12550 std::swap(LHS, RHS);
12554 std::swap(LHS, RHS);
12558 return std::nullopt;
12561 auto *BO = dyn_cast<BinaryOperator>(LHS);
12562 if (!BO || BO->getOpcode() != BO_Add)
12563 return std::nullopt;
12567 Other = BO->getRHS();
12569 Other = BO->getLHS();
12571 return std::nullopt;
12573 if (!
Other->getType()->isUnsignedIntegerType())
12574 return std::nullopt;
12576 return Opc == BO_GE;
12630 auto IsDeprArrayComparionIgnored =
12633 ? diag::warn_array_comparison_cxx26
12634 : !S.
getLangOpts().CPlusPlus20 || IsDeprArrayComparionIgnored
12635 ? diag::warn_array_comparison
12636 : diag::warn_depr_array_comparison;
12662 Result = AlwaysConstant;
12666 S.
PDiag(diag::warn_comparison_always)
12681 Result = AlwaysConstant;
12685 S.
PDiag(diag::warn_comparison_always)
12688 }
else if (std::optional<bool> Res =
12691 S.
PDiag(diag::warn_comparison_always)
12693 << (*Res ? AlwaysTrue : AlwaysFalse));
12704 Expr *LiteralString =
nullptr;
12705 Expr *LiteralStringStripped =
nullptr;
12709 LiteralString = LHS;
12710 LiteralStringStripped = LHSStripped;
12715 LiteralString = RHS;
12716 LiteralStringStripped = RHSStripped;
12719 if (LiteralString) {
12721 S.
PDiag(diag::warn_stringcompare)
12734 llvm_unreachable(
"unhandled cast kind");
12736 case CK_UserDefinedConversion:
12738 case CK_LValueToRValue:
12740 case CK_ArrayToPointerDecay:
12742 case CK_FunctionToPointerDecay:
12744 case CK_IntegralCast:
12746 case CK_FloatingCast:
12748 case CK_IntegralToFloating:
12749 case CK_FloatingToIntegral:
12751 case CK_IntegralComplexCast:
12752 case CK_FloatingComplexCast:
12753 case CK_FloatingComplexToIntegralComplex:
12754 case CK_IntegralComplexToFloatingComplex:
12756 case CK_FloatingComplexToReal:
12757 case CK_FloatingRealToComplex:
12758 case CK_IntegralComplexToReal:
12759 case CK_IntegralRealToComplex:
12761 case CK_HLSLArrayRValue:
12774 if (
const auto *ICE = dyn_cast<ImplicitCastExpr>(E))
12801 << 0 << FromType << ToType;
12806 llvm_unreachable(
"unhandled case in switch");
12833 if (NumEnumArgs == 1) {
12835 QualType OtherTy = LHSIsEnum ? RHSStrippedType : LHSStrippedType;
12841 if (NumEnumArgs == 2) {
12850 assert(IntType->isArithmeticType());
12860 LHSType = RHSType = IntType;
12869 if (
Type.isNull()) {
12875 std::optional<ComparisonCategoryType> CCT =
12887 assert(!
Type.isNull() &&
"composite type for <=> has not been set");
12905 if (
Type.isNull()) {
12926 int NullValue =
PP.isMacroDefined(
"NULL") ? 0 : 1;
12931 if (
const auto *
CL = dyn_cast<CharacterLiteral>(E.
get())) {
12932 if (
CL->getValue() == 0)
12936 NullValue ?
"NULL" :
"(void *)0");
12937 }
else if (
const auto *CE = dyn_cast<CStyleCastExpr>(E.
get())) {
12944 NullValue ?
"NULL" :
"(void *)0");
12954 bool IsThreeWay = Opc == BO_Cmp;
12955 bool IsOrdered = IsRelational || IsThreeWay;
12966 if (!IsThreeWay || IsAnyPointerType(LHS) || IsAnyPointerType(RHS)) {
13019 auto computeResultTy = [&]() {
13028 std::optional<ComparisonCategoryType> CCT =
13033 if (CompositeTy->
isPointerType() && LHSIsNull != RHSIsNull) {
13037 Diag(Loc, diag::err_typecheck_three_way_comparison_of_pointer_and_zero)
13038 << (LHSIsNull ? LHS.
get()->getSourceRange()
13047 if (!IsOrdered && LHSIsNull != RHSIsNull) {
13048 bool IsEquality = Opc == BO_EQ;
13060 bool IsError = Opc == BO_Cmp;
13062 IsError ? diag::err_typecheck_ordered_comparison_of_function_pointers
13064 ? diag::warn_typecheck_ordered_comparison_of_function_pointers
13065 : diag::ext_typecheck_ordered_comparison_of_function_pointers;
13094 return computeResultTy();
13110 (IsOrdered ? 2 : 1) &&
13115 return computeResultTy();
13129 if (IsRelational) {
13134 Diag(Loc, diag::ext_typecheck_compare_complete_incomplete_pointers)
13140 }
else if (!IsRelational &&
13144 && !LHSIsNull && !RHSIsNull)
13151 if (LCanPointeeTy != RCanPointeeTy) {
13157 diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
13158 << LHSType << RHSType << 0
13164 CastKind Kind = AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion
13170 bool RHSHasCFIUncheckedCallee = RFn && RFn->getCFIUncheckedCalleeAttr();
13171 bool ChangingCFIUncheckedCallee =
13172 LHSHasCFIUncheckedCallee != RHSHasCFIUncheckedCallee;
13174 if (LHSIsNull && !RHSIsNull)
13176 else if (!ChangingCFIUncheckedCallee)
13179 return computeResultTy();
13191 if (!IsOrdered && LHSIsNull && RHSIsNull) {
13194 return computeResultTy();
13198 return computeResultTy();
13209 return computeResultTy();
13213 return computeResultTy();
13222 return computeResultTy();
13227 return computeResultTy();
13231 if (IsRelational &&
13242 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
13243 if (CTSD->isInStdNamespace() &&
13244 llvm::StringSwitch<bool>(CTSD->getName())
13245 .Cases({
"less",
"less_equal",
"greater",
"greater_equal"},
true)
13251 return computeResultTy();
13264 return computeResultTy();
13274 if (!LHSIsNull && !RHSIsNull &&
13275 !
Context.typesAreCompatible(lpointee, rpointee)) {
13276 Diag(Loc, diag::err_typecheck_comparison_of_distinct_blocks)
13281 return computeResultTy();
13288 if (!LHSIsNull && !RHSIsNull) {
13293 Diag(Loc, diag::err_typecheck_comparison_of_distinct_blocks)
13297 if (LHSIsNull && !RHSIsNull)
13300 : CK_AnyPointerToBlockPointerCast);
13304 : CK_AnyPointerToBlockPointerCast);
13305 return computeResultTy();
13314 bool RPtrToVoid = RPT ? RPT->getPointeeType()->isVoidType() :
false;
13316 if (!LPtrToVoid && !RPtrToVoid &&
13317 !
Context.typesAreCompatible(LHSType, RHSType)) {
13324 if (LHSIsNull && !RHSIsNull) {
13330 RPT ? CK_BitCast :CK_CPointerToObjCPointerCast);
13340 LPT ? CK_BitCast :CK_CPointerToObjCPointerCast);
13342 return computeResultTy();
13346 if (!
Context.areComparableObjCPointerTypes(LHSType, RHSType))
13352 if (LHSIsNull && !RHSIsNull)
13356 return computeResultTy();
13362 CK_BlockPointerToObjCPointerCast);
13363 return computeResultTy();
13364 }
else if (!IsOrdered &&
13368 CK_BlockPointerToObjCPointerCast);
13369 return computeResultTy();
13374 unsigned DiagID = 0;
13375 bool isError =
false;
13384 isError ? diag::err_typecheck_ordered_comparison_of_pointer_and_zero
13385 : diag::ext_typecheck_ordered_comparison_of_pointer_and_zero;
13388 DiagID = diag::err_typecheck_comparison_of_pointer_integer;
13390 }
else if (IsOrdered)
13391 DiagID = diag::ext_typecheck_ordered_comparison_of_pointer_integer;
13393 DiagID = diag::ext_typecheck_comparison_of_pointer_integer;
13405 LHSIsNull ? CK_NullToPointer : CK_IntegralToPointer);
13408 RHSIsNull ? CK_NullToPointer : CK_IntegralToPointer);
13409 return computeResultTy();
13413 if (!IsOrdered && RHSIsNull
13416 return computeResultTy();
13418 if (!IsOrdered && LHSIsNull
13421 return computeResultTy();
13424 if (
getLangOpts().getOpenCLCompatibleVersion() >= 200) {
13426 return computeResultTy();
13430 return computeResultTy();
13433 if (LHSIsNull && RHSType->
isQueueT()) {
13435 return computeResultTy();
13438 if (LHSType->
isQueueT() && RHSIsNull) {
13440 return computeResultTy();
13465 "Unhandled vector element size in vector compare");
13485 "Unhandled vector element size in vector compare");
13495 const auto TypeSize =
Context.getTypeSize(ETy);
13497 const QualType IntTy =
Context.getIntTypeForBitwidth(TypeSize,
true);
13498 const llvm::ElementCount VecSize =
Context.getBuiltinVectorTypeInfo(VTy).EC;
13499 return Context.getScalableVectorType(IntTy, VecSize.getKnownMinValue());
13505 if (Opc == BO_Cmp) {
13506 Diag(Loc, diag::err_three_way_vector_comparison);
13535 return Context.getLogicalOperationType();
13537 Diag(Loc, diag::warn_deprecated_altivec_src_compat);
13543 return Context.getLogicalOperationType();
13567 if (Opc == BO_Cmp) {
13568 Diag(Loc, diag::err_three_way_vector_comparison);
13596 if (LHSBuiltinTy && RHSBuiltinTy && LHSBuiltinTy->
isSVEBool() &&
13597 RHSBuiltinTy->isSVEBool())
13616 bool Negative =
false;
13617 bool ExplicitPlus =
false;
13618 const auto *LHSInt = dyn_cast<IntegerLiteral>(XorLHS.
get());
13619 const auto *RHSInt = dyn_cast<IntegerLiteral>(XorRHS.
get());
13625 if (
const auto *UO = dyn_cast<UnaryOperator>(XorRHS.
get())) {
13627 if (Opc != UO_Minus && Opc != UO_Plus)
13629 RHSInt = dyn_cast<IntegerLiteral>(UO->getSubExpr());
13632 Negative = (Opc == UO_Minus);
13633 ExplicitPlus = !Negative;
13639 const llvm::APInt &LeftSideValue = LHSInt->getValue();
13640 llvm::APInt RightSideValue = RHSInt->getValue();
13641 if (LeftSideValue != 2 && LeftSideValue != 10)
13644 if (LeftSideValue.getBitWidth() != RightSideValue.getBitWidth())
13649 llvm::StringRef ExprStr =
13654 llvm::StringRef XorStr =
13657 if (XorStr ==
"xor")
13668 RightSideValue = -RightSideValue;
13669 RHSStr =
"-" + RHSStr;
13670 }
else if (ExplicitPlus) {
13671 RHSStr =
"+" + RHSStr;
13674 StringRef LHSStrRef = LHSStr;
13675 StringRef RHSStrRef = RHSStr;
13678 if (LHSStrRef.starts_with(
"0b") || LHSStrRef.starts_with(
"0B") ||
13679 RHSStrRef.starts_with(
"0b") || RHSStrRef.starts_with(
"0B") ||
13680 LHSStrRef.starts_with(
"0x") || LHSStrRef.starts_with(
"0X") ||
13681 RHSStrRef.starts_with(
"0x") || RHSStrRef.starts_with(
"0X") ||
13682 (LHSStrRef.size() > 1 && LHSStrRef.starts_with(
"0")) ||
13683 (RHSStrRef.size() > 1 && RHSStrRef.starts_with(
"0")) ||
13684 LHSStrRef.contains(
'\'') || RHSStrRef.contains(
'\''))
13689 const llvm::APInt XorValue = LeftSideValue ^ RightSideValue;
13690 int64_t RightSideIntValue = RightSideValue.getSExtValue();
13691 if (LeftSideValue == 2 && RightSideIntValue >= 0) {
13692 std::string SuggestedExpr =
"1 << " + RHSStr;
13693 bool Overflow =
false;
13694 llvm::APInt One = (LeftSideValue - 1);
13695 llvm::APInt PowValue = One.sshl_ov(RightSideValue, Overflow);
13697 if (RightSideIntValue < 64)
13698 S.
Diag(Loc, diag::warn_xor_used_as_pow_base)
13699 << ExprStr <<
toString(XorValue, 10,
true) << (
"1LL << " + RHSStr)
13701 else if (RightSideIntValue == 64)
13702 S.
Diag(Loc, diag::warn_xor_used_as_pow)
13703 << ExprStr <<
toString(XorValue, 10,
true);
13707 S.
Diag(Loc, diag::warn_xor_used_as_pow_base_extra)
13708 << ExprStr <<
toString(XorValue, 10,
true) << SuggestedExpr
13711 ExprRange, (RightSideIntValue == 0) ?
"1" : SuggestedExpr);
13714 S.
Diag(Loc, diag::note_xor_used_as_pow_silence)
13715 << (
"0x2 ^ " + RHSStr) << SuggestXor;
13716 }
else if (LeftSideValue == 10) {
13717 std::string SuggestedValue =
"1e" + std::to_string(RightSideIntValue);
13718 S.
Diag(Loc, diag::warn_xor_used_as_pow_base)
13719 << ExprStr <<
toString(XorValue, 10,
true) << SuggestedValue
13721 S.
Diag(Loc, diag::note_xor_used_as_pow_silence)
13722 << (
"0xA ^ " + RHSStr) << SuggestXor;
13739 getLangOpts().getOpenCLCompatibleVersion() < 120 &&
13766 assert(
false &&
"Logical operands are not supported in C\\C++");
13782 bool IsCompAssign) {
13783 if (!IsCompAssign) {
13799 assert((LHSMatType || RHSMatType) &&
"At least one operand must be a matrix");
13801 if (
Context.hasSameType(LHSType, RHSType))
13802 return Context.getCommonSugaredType(LHSType, RHSType);
13808 if (LHSMatType && !RHSMatType) {
13816 if (!LHSMatType && RHSMatType) {
13828 bool IsCompAssign) {
13829 if (!IsCompAssign) {
13840 assert((LHSMatType || RHSMatType) &&
"At least one operand must be a matrix");
13842 if (LHSMatType && RHSMatType) {
13843 if (LHSMatType->getNumColumns() != RHSMatType->
getNumRows())
13846 if (
Context.hasSameType(LHSMatType, RHSMatType))
13847 return Context.getCommonSugaredType(
13851 QualType LHSELTy = LHSMatType->getElementType(),
13853 if (!
Context.hasSameType(LHSELTy, RHSELTy))
13856 return Context.getConstantMatrixType(
13857 Context.getCommonSugaredType(LHSELTy, RHSELTy),
13882 bool IsCompAssign =
13883 Opc == BO_AndAssign || Opc == BO_OrAssign || Opc == BO_XorAssign;
13894 LegalBoolVecOperator,
13924 ExprResult LHSResult = LHS, RHSResult = RHS;
13926 LHSResult, RHSResult, Loc,
13928 if (LHSResult.
isInvalid() || RHSResult.isInvalid())
13930 LHS = LHSResult.
get();
13931 RHS = RHSResult.
get();
13956 bool EnumConstantInBoolContext =
false;
13958 if (
const auto *DREHS = dyn_cast<DeclRefExpr>(HS.get())) {
13959 const auto *ECDHS = dyn_cast<EnumConstantDecl>(DREHS->getDecl());
13960 if (ECDHS && ECDHS->getInitVal() != 0 && ECDHS->getInitVal() != 1)
13961 EnumConstantInBoolContext =
true;
13965 if (EnumConstantInBoolContext)
13966 Diag(Loc, diag::warn_enum_constant_in_bool_context);
13971 const auto *LHSATy = dyn_cast<ArrayType>(LHSTy);
13972 const auto *RHSATy = dyn_cast<ArrayType>(RHSTy);
13973 if ((LHSATy && LHSATy->getElementType().isWebAssemblyReferenceType()) ||
13974 (RHSATy && RHSATy->getElementType().isWebAssemblyReferenceType())) {
13996 Diag(Loc, diag::warn_logical_instead_of_bitwise)
13999 Diag(Loc, diag::note_logical_instead_of_bitwise_change_operator)
14000 << (Opc == BO_LAnd ?
"&" :
"|")
14003 Opc == BO_LAnd ?
"&" :
"|");
14004 if (Opc == BO_LAnd)
14006 Diag(Loc, diag::note_logical_instead_of_bitwise_remove_constant)
14014 if (!
Context.getLangOpts().CPlusPlus) {
14017 if (
Context.getLangOpts().OpenCL &&
14018 Context.getLangOpts().OpenCLVersion < 120) {
14073 const MemberExpr *ME = dyn_cast<MemberExpr>(E);
14074 if (!ME)
return false;
14078 if (!
Base)
return false;
14079 return Base->getMethodDecl() !=
nullptr;
14103 assert(S.
getLangOpts().CPlusPlus &&
"BindingDecl outside of C++?");
14114 assert(Var->
hasLocalStorage() &&
"capture added 'const' to non-local?");
14122 if (
auto *FD = dyn_cast<FunctionDecl>(DC))
14164 bool DiagnosticEmitted =
false;
14168 bool IsDereference =
false;
14169 bool NextIsDereference =
false;
14173 IsDereference = NextIsDereference;
14176 if (
const MemberExpr *ME = dyn_cast<MemberExpr>(E)) {
14177 NextIsDereference = ME->isArrow();
14178 const ValueDecl *VD = ME->getMemberDecl();
14179 if (
const FieldDecl *Field = dyn_cast<FieldDecl>(VD)) {
14181 if (Field->isMutable()) {
14182 assert(DiagnosticEmitted &&
"Expected diagnostic not emitted.");
14187 if (!DiagnosticEmitted) {
14188 S.
Diag(Loc, diag::err_typecheck_assign_const)
14190 << Field->getType();
14191 DiagnosticEmitted =
true;
14194 <<
ConstMember <<
false << Field << Field->getType()
14195 << Field->getSourceRange();
14199 }
else if (
const VarDecl *VDecl = dyn_cast<VarDecl>(VD)) {
14200 if (VDecl->getType().isConstQualified()) {
14201 if (!DiagnosticEmitted) {
14202 S.
Diag(Loc, diag::err_typecheck_assign_const)
14204 << VDecl->getType();
14205 DiagnosticEmitted =
true;
14208 <<
ConstMember <<
true << VDecl << VDecl->getType()
14209 << VDecl->getSourceRange();
14216 dyn_cast<ArraySubscriptExpr>(E)) {
14220 dyn_cast<ExtVectorElementExpr>(E)) {
14227 if (
const CallExpr *CE = dyn_cast<CallExpr>(E)) {
14231 if (!DiagnosticEmitted) {
14232 S.
Diag(Loc, diag::err_typecheck_assign_const) << ExprRange
14234 DiagnosticEmitted =
true;
14237 diag::note_typecheck_assign_const)
14241 }
else if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
14243 if (
const ValueDecl *VD = DRE->getDecl()) {
14245 if (!DiagnosticEmitted) {
14246 S.
Diag(Loc, diag::err_typecheck_assign_const)
14248 DiagnosticEmitted =
true;
14250 S.
Diag(VD->getLocation(), diag::note_typecheck_assign_const)
14251 <<
ConstVariable << VD << VD->getType() << VD->getSourceRange();
14256 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(DC)) {
14257 if (MD->isConst()) {
14258 if (!DiagnosticEmitted) {
14259 S.
Diag(Loc, diag::err_typecheck_assign_const_method)
14260 << ExprRange << MD;
14261 DiagnosticEmitted =
true;
14263 S.
Diag(MD->getLocation(), diag::note_typecheck_assign_const_method)
14264 << MD << MD->getSourceRange();
14270 if (DiagnosticEmitted)
14274 S.
Diag(Loc, diag::err_typecheck_assign_const) << ExprRange <<
ConstUnknown;
14284 const RecordType *Ty,
14287 bool &DiagnosticEmitted) {
14288 std::vector<const RecordType *> RecordTypeList;
14289 RecordTypeList.push_back(Ty);
14290 unsigned NextToCheckIndex = 0;
14293 while (RecordTypeList.size() > NextToCheckIndex) {
14294 bool IsNested = NextToCheckIndex > 0;
14295 for (
const FieldDecl *Field : RecordTypeList[NextToCheckIndex]
14297 ->getDefinitionOrSelf()
14300 QualType FieldTy = Field->getType();
14302 if (!DiagnosticEmitted) {
14303 S.
Diag(Loc, diag::err_typecheck_assign_const)
14305 << IsNested << Field;
14306 DiagnosticEmitted =
true;
14308 S.
Diag(Field->getLocation(), diag::note_typecheck_assign_const)
14310 << FieldTy << Field->getSourceRange();
14315 if (
const auto *FieldRecTy = FieldTy->
getAsCanonical<RecordType>()) {
14316 if (!llvm::is_contained(RecordTypeList, FieldRecTy))
14317 RecordTypeList.push_back(FieldRecTy);
14320 ++NextToCheckIndex;
14329 assert(Ty->
isRecordType() &&
"lvalue was not record?");
14332 bool DiagEmitted =
false;
14334 if (
const MemberExpr *ME = dyn_cast<MemberExpr>(E))
14337 else if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
14362 unsigned DiagID = 0;
14363 bool NeedType =
false;
14370 DiagID = diag::err_block_decl_ref_not_modifiable_lvalue;
14372 DiagID = diag::err_lambda_decl_ref_not_modifiable_lvalue;
14385 if (var->isARCPseudoStrong() &&
14386 (!var->getTypeSourceInfo() ||
14387 !var->getTypeSourceInfo()->getType().isConstQualified())) {
14393 ? diag::err_typecheck_arc_assign_self_class_method
14394 : diag::err_typecheck_arc_assign_self;
14397 }
else if (var->hasAttr<ObjCExternallyRetainedAttr>() ||
14399 DiagID = diag::err_typecheck_arc_assign_externally_retained;
14403 DiagID = diag::err_typecheck_arr_assign_enumeration;
14407 if (Loc != OrigLoc)
14433 DiagID = diag::err_typecheck_array_not_modifiable_lvalue;
14437 DiagID = diag::err_typecheck_non_object_not_modifiable_lvalue;
14441 DiagID = diag::err_typecheck_lvalue_casts_not_supported;
14444 llvm_unreachable(
"did not take early return for MLV_Valid");
14448 DiagID = diag::err_typecheck_expression_not_modifiable_lvalue;
14453 diag::err_typecheck_incomplete_type_not_modifiable_lvalue, E);
14455 DiagID = diag::err_typecheck_duplicate_vector_components_not_mlvalue;
14458 DiagID = diag::err_typecheck_duplicate_matrix_components_not_mlvalue;
14461 llvm_unreachable(
"readonly properties should be processed differently");
14463 DiagID = diag::err_readonly_message_assignment;
14466 DiagID = diag::err_no_subobject_property_setting;
14471 if (Loc != OrigLoc)
14493 MemberExpr *ML = dyn_cast<MemberExpr>(LHSExpr);
14494 MemberExpr *MR = dyn_cast<MemberExpr>(RHSExpr);
14502 if (LHSDecl != RHSDecl)
14507 if (RefTy->getPointeeType().isVolatileQualified())
14510 Sema.
Diag(Loc, diag::warn_identity_field_assign) << 0;
14520 Sema.
Diag(Loc, diag::warn_identity_field_assign) << 1;
14544 bool ShowFullyQualifiedAssigneeName =
false;
14547 Assignee = DR->getDecl();
14548 }
else if (
auto *ME = dyn_cast<MemberExpr>(LHSExpr->
IgnoreParenCasts())) {
14549 Assignee = ME->getMemberDecl();
14550 ShowFullyQualifiedAssigneeName =
true;
14555 ShowFullyQualifiedAssigneeName);
14564 Diag(Loc, diag::err_opencl_half_load_store) << 1
14571 Diag(Loc, diag::err_wasm_table_art) << 0;
14576 if (CompoundType.
isNull()) {
14587 ((
Context.isObjCNSObjectType(LHSType) &&
14589 (
Context.isObjCNSObjectType(RHSType) &&
14594 Diag(Loc, diag::err_objc_object_assignment) << LHSType;
14600 RHSCheck = ICE->getSubExpr();
14601 if (
UnaryOperator *UO = dyn_cast<UnaryOperator>(RHSCheck)) {
14602 if ((UO->getOpcode() == UO_Plus || UO->getOpcode() == UO_Minus) &&
14603 Loc.
isFileID() && UO->getOperatorLoc().isFileID() &&
14609 UO->getSubExpr()->getBeginLoc().
isFileID()) {
14610 Diag(Loc, diag::warn_not_compound_assign)
14611 << (UO->getOpcode() == UO_Plus ?
"+" :
"-")
14612 <<
SourceRange(UO->getOperatorLoc(), UO->getOperatorLoc());
14622 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(InnerLHS);
14638 if (!
Diags.isIgnored(diag::warn_arc_repeated_use_of_weak,
14661 if (CompoundType.
isNull()) {
14687 if (
const CastExpr *CE = dyn_cast<CastExpr>(E)) {
14688 if (CE->getCastKind() == CK_ToVoid) {
14694 CE->getSubExpr()->getType()->isDependentType()) {
14699 if (
const auto *CE = dyn_cast<CallExpr>(E))
14700 return CE->getCallReturnType(Context)->isVoidType();
14724 while (
const BinaryOperator *BO = dyn_cast<BinaryOperator>(LHS)) {
14725 if (BO->getOpcode() != BO_Comma)
14727 LHS = BO->getRHS();
14734 Diag(Loc, diag::warn_comma_operator);
14738 LangOpts.CPlusPlus ?
"static_cast<void>("
14770 diag::err_incomplete_type);
14791 ResType = ResAtomicType->getValueType();
14793 assert(!ResType.
isNull() &&
"no type for increment/decrement expression");
14803 : diag::warn_increment_bool)
14807 S.
Diag(OpLoc, diag::err_increment_decrement_enum) << IsInc << ResType;
14825 S.
Diag(OpLoc, S.
getLangOpts().C2y ? diag::warn_c2y_compat_increment_complex
14826 : diag::ext_c2y_increment_complex)
14843 S.
Diag(OpLoc, diag::err_typecheck_illegal_increment_decrement)
14854 S.
Diag(OpLoc, diag::warn_deprecated_increment_decrement_volatile)
14855 << IsInc << ResType;
14887 case Stmt::DeclRefExprClass:
14889 case Stmt::MemberExprClass:
14897 case Stmt::ArraySubscriptExprClass: {
14902 if (ICE->getSubExpr()->getType()->isArrayType())
14907 case Stmt::UnaryOperatorClass: {
14919 case Stmt::ParenExprClass:
14921 case Stmt::ImplicitCastExprClass:
14925 case Stmt::CXXUuidofExprClass:
14935 AO_Vector_Element = 1,
14936 AO_Property_Expansion = 2,
14937 AO_Register_Variable = 3,
14938 AO_Matrix_Element = 4,
14956 return Diag(OpLoc, diag::err_parens_pointer_member_function)
14961 return Diag(OpLoc, diag::err_typecheck_addrof_dtor)
14962 << DRE->getSourceRange();
14964 if (DRE->getQualifier())
14968 return Diag(OpLoc, diag::err_unqualified_pointer_member_function)
14969 << DRE->getSourceRange();
14972 StringRef Qual = (MD->
getParent()->getName() +
"::").toStringRef(Str);
14973 return Diag(OpLoc, diag::err_unqualified_pointer_member_function)
14974 << DRE->getSourceRange()
14980 if (PTy->getKind() == BuiltinType::Overload) {
14984 Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof_addrof_function)
14992 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
15000 if (PTy->getKind() == BuiltinType::UnknownAny)
15003 if (PTy->getKind() == BuiltinType::BoundMember) {
15004 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
15027 auto* VarRef = dyn_cast<DeclRefExpr>(op);
15028 if (VarRef && VarRef->refersToEnclosingVariableOrCapture()) {
15029 Diag(op->
getExprLoc(), diag::err_opencl_taking_address_capture);
15037 if (uOp->getOpcode() == UO_Deref)
15040 return uOp->getSubExpr()->getType();
15047 if (
auto *FD = dyn_cast_or_null<FunctionDecl>(dcl))
15053 unsigned AddressOfError = AO_No_Error;
15057 Diag(OpLoc, IsError ? diag::err_typecheck_addrof_temporary
15058 : diag::ext_typecheck_addrof_temporary)
15073 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
15091 auto ReturnOrParamTypeIsIncomplete = [&](
QualType T,
15096 diag::note_ptrauth_virtual_function_pointer_incomplete_arg_ret);
15097 Diag(RetArgTypeLoc,
15098 diag::note_ptrauth_virtual_function_incomplete_arg_ret_type)
15105 bool IsIncomplete =
15107 ReturnOrParamTypeIsIncomplete(
15110 IsIncomplete |= ReturnOrParamTypeIsIncomplete(PVD->getType(), OpLoc,
15111 PVD->getBeginLoc());
15117 if (
Context.getTargetInfo().getCXXABI().isMicrosoft())
15126 AddressOfError = AO_Property_Expansion;
15128 Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof)
15132 }
else if (
const auto *DRE = dyn_cast<DeclRefExpr>(op)) {
15133 if (
const auto *MD = dyn_cast_or_null<CXXMethodDecl>(DRE->getDecl()))
15139 AddressOfError = AO_Bit_Field;
15142 AddressOfError = AO_Vector_Element;
15145 AddressOfError = AO_Matrix_Element;
15149 if (
const VarDecl *vd = dyn_cast<VarDecl>(dcl)) {
15154 AddressOfError = AO_Register_Variable;
15157 AddressOfError = AO_Property_Expansion;
15170 if (
auto *DRE = dyn_cast<DeclRefExpr>(op);
15176 diag::err_cannot_form_pointer_to_member_of_reference_type)
15187 if (
Context.getTargetInfo().getCXXABI().isMicrosoft())
15195 llvm_unreachable(
"Unknown/unexpected decl type");
15198 if (AddressOfError != AO_No_Error) {
15215 if (
Context.getTargetInfo().getTriple().isWasm()) {
15218 Diag(OpLoc, diag::err_wasm_ca_reference)
15223 Diag(OpLoc, diag::err_wasm_table_pr)
15229 CheckAddressOfPackedMember(op);
15235 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Exp);
15241 const ParmVarDecl *Param = dyn_cast<ParmVarDecl>(D);
15244 if (
const FunctionDecl* FD = dyn_cast<FunctionDecl>(Param->getDeclContext()))
15245 if (!FD->hasAttr<NonNullAttr>() && !Param->hasAttr<NonNullAttr>())
15248 FD->ModifiedNonNullParams.insert(Param);
15254 bool IsAfterAmp =
false) {
15258 Op = ConvResult.
get();
15270 Result = PT->getPointeeType();
15274 Result = OPT->getPointeeType();
15278 if (PR.
get() != Op)
15283 S.
Diag(OpLoc, diag::err_typecheck_indirection_requires_pointer)
15288 if (
Result->isVoidType()) {
15294 S.
Diag(OpLoc, diag::err_typecheck_indirection_through_void_pointer_cpp)
15297 S.
Diag(OpLoc, diag::ext_typecheck_indirection_through_void_pointer)
15314 default: llvm_unreachable(
"Unknown binop!");
15315 case tok::periodstar: Opc = BO_PtrMemD;
break;
15316 case tok::arrowstar: Opc = BO_PtrMemI;
break;
15317 case tok::star: Opc = BO_Mul;
break;
15318 case tok::slash: Opc = BO_Div;
break;
15319 case tok::percent: Opc = BO_Rem;
break;
15320 case tok::plus: Opc = BO_Add;
break;
15321 case tok::minus: Opc = BO_Sub;
break;
15322 case tok::lessless: Opc = BO_Shl;
break;
15323 case tok::greatergreater: Opc = BO_Shr;
break;
15324 case tok::lessequal: Opc = BO_LE;
break;
15325 case tok::less: Opc = BO_LT;
break;
15326 case tok::greaterequal: Opc = BO_GE;
break;
15327 case tok::greater: Opc = BO_GT;
break;
15328 case tok::exclaimequal: Opc = BO_NE;
break;
15329 case tok::equalequal: Opc = BO_EQ;
break;
15330 case tok::spaceship: Opc = BO_Cmp;
break;
15331 case tok::amp: Opc = BO_And;
break;
15332 case tok::caret: Opc = BO_Xor;
break;
15333 case tok::pipe: Opc = BO_Or;
break;
15334 case tok::ampamp: Opc = BO_LAnd;
break;
15335 case tok::pipepipe: Opc = BO_LOr;
break;
15336 case tok::equal: Opc = BO_Assign;
break;
15337 case tok::starequal: Opc = BO_MulAssign;
break;
15338 case tok::slashequal: Opc = BO_DivAssign;
break;
15339 case tok::percentequal: Opc = BO_RemAssign;
break;
15340 case tok::plusequal: Opc = BO_AddAssign;
break;
15341 case tok::minusequal: Opc = BO_SubAssign;
break;
15342 case tok::lesslessequal: Opc = BO_ShlAssign;
break;
15343 case tok::greatergreaterequal: Opc = BO_ShrAssign;
break;
15344 case tok::ampequal: Opc = BO_AndAssign;
break;
15345 case tok::caretequal: Opc = BO_XorAssign;
break;
15346 case tok::pipeequal: Opc = BO_OrAssign;
break;
15347 case tok::comma: Opc = BO_Comma;
break;
15356 default: llvm_unreachable(
"Unknown unary op!");
15357 case tok::plusplus: Opc = UO_PreInc;
break;
15358 case tok::minusminus: Opc = UO_PreDec;
break;
15359 case tok::amp: Opc = UO_AddrOf;
break;
15360 case tok::star: Opc = UO_Deref;
break;
15361 case tok::plus: Opc = UO_Plus;
break;
15362 case tok::minus: Opc = UO_Minus;
break;
15363 case tok::tilde: Opc = UO_Not;
break;
15364 case tok::exclaim: Opc = UO_LNot;
break;
15365 case tok::kw___real: Opc = UO_Real;
break;
15366 case tok::kw___imag: Opc = UO_Imag;
break;
15367 case tok::kw___extension__: Opc = UO_Extension;
break;
15399 llvm::find_if(Parent->
fields(),
15401 return F->getDeclName() == Name;
15403 return (Field != Parent->
field_end()) ? *Field :
nullptr;
15418 const DeclRefExpr *LHSDeclRef = dyn_cast<DeclRefExpr>(LHSExpr);
15419 const DeclRefExpr *RHSDeclRef = dyn_cast<DeclRefExpr>(RHSExpr);
15420 if (!LHSDeclRef || !RHSDeclRef ||
15428 if (LHSDecl != RHSDecl)
15433 if (RefTy->getPointeeType().isVolatileQualified())
15436 auto Diag = S.
Diag(OpLoc, IsBuiltin ? diag::warn_self_assignment_builtin
15437 : diag::warn_self_assignment_overloaded)
15442 Diag << 1 << SelfAssignField
15455 const Expr *ObjCPointerExpr =
nullptr, *OtherExpr =
nullptr;
15457 const Expr *RHS = R.get();
15460 ObjCPointerExpr = LHS;
15464 ObjCPointerExpr = RHS;
15473 unsigned Diag = diag::warn_objc_pointer_masking;
15482 if (SelArg0.starts_with(
"performSelector"))
15483 Diag = diag::warn_objc_pointer_masking_performSelector;
15500 assert((
isVector(ResultTy, Context.HalfTy) ||
15501 isVector(ResultTy, Context.ShortTy)) &&
15502 "Result must be a vector of half or short");
15505 "both operands expected to be a half vector");
15512 if (
isVector(ResultTy, Context.ShortTy))
15517 ResultTy,
VK, OK, OpLoc, FPFeatures,
15518 BinOpResTy, BinOpResTy);
15522 BinOpResTy,
VK, OK, OpLoc, FPFeatures);
15530 if (!OpRequiresConversion || Ctx.
getLangOpts().NativeHalfType)
15533 auto HasVectorOfHalfType = [&Ctx](
Expr *E) {
15543 return VT->getElementType().getCanonicalType() == Ctx.
HalfTy;
15548 return HasVectorOfHalfType(E0) && (!E1 || HasVectorOfHalfType(E1));
15553 Expr *RHSExpr,
bool ForFoldExpression) {
15567 if (
Init.isInvalid())
15569 RHSExpr =
Init.get();
15579 bool ConvertHalfVec =
false;
15581 if (!LHS.
isUsable() || !RHS.isUsable())
15591 if (BO_Assign == Opc)
15592 Diag(OpLoc, diag::err_opencl_atomic_init) << 0 << SR;
15620 if (!ResultTy.
isNull()) {
15637 if (
auto *BE = dyn_cast<BlockExpr>(RHS.get()->IgnoreParens()))
15639 if (
auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
15640 if (VD->hasLocalStorage() &&
getCurScope()->isDeclScope(VD))
15641 BE->getBlockDecl()->setCanAvoidCopyToHeap();
15652 Opc == BO_PtrMemI);
15656 ConvertHalfVec =
true;
15663 ConvertHalfVec =
true;
15667 ConvertHalfVec =
true;
15678 ConvertHalfVec =
true;
15681 if (
const auto *BI = dyn_cast<BinaryOperator>(LHSExpr);
15682 !ForFoldExpression && BI && BI->isComparisonOp())
15683 Diag(OpLoc, diag::warn_consecutive_comparison)
15689 ConvertHalfVec =
true;
15693 ConvertHalfVec =
true;
15706 ConvertHalfVec =
true;
15711 ConvertHalfVec =
true;
15713 CompLHSTy = CompResultTy;
15720 CompLHSTy = CompResultTy;
15726 ConvertHalfVec =
true;
15733 ConvertHalfVec =
true;
15742 CompLHSTy = CompResultTy;
15753 CompLHSTy = CompResultTy;
15761 VK = RHS.get()->getValueKind();
15762 OK = RHS.get()->getObjectKind();
15774 (Opc == BO_Comma ||
isVector(RHS.get()->getType(),
Context.HalfTy) ==
15776 "both sides are half vectors or neither sides are");
15781 CheckArrayAccess(LHS.
get());
15782 CheckArrayAccess(RHS.get());
15786 &
Context.Idents.get(
"object_setClass"),
15792 "object_setClass(")
15805 if (CompResultTy.
isNull()) {
15806 if (ConvertHalfVec)
15826 if (ConvertHalfVec)
15831 Context, LHS.
get(), RHS.get(), Opc, ResultTy,
VK, OK, OpLoc,
15848 if (isLeftComp == isRightComp)
15853 bool isLeftBitwise = LHSBO && LHSBO->
isBitwiseOp();
15854 bool isRightBitwise = RHSBO && RHSBO->
isBitwiseOp();
15855 if (isLeftBitwise || isRightBitwise)
15867 Self.Diag(OpLoc, diag::warn_precedence_bitwise_rel)
15870 Self.PDiag(diag::note_precedence_silence) << OpStr,
15871 (isLeftComp ? LHSExpr : RHSExpr)->getSourceRange());
15873 Self.PDiag(diag::note_precedence_bitwise_first)
15888 Self.PDiag(diag::note_precedence_silence)
15897 if (Bop->getOpcode() == BO_LAnd) {
15902 }
else if (Bop->getOpcode() == BO_LOr) {
15903 if (
BinaryOperator *RBop = dyn_cast<BinaryOperator>(Bop->getRHS())) {
15906 if (RBop->getOpcode() == BO_LAnd &&
15918 if (Bop->getOpcode() == BO_LAnd) {
15933 if (Bop->isBitwiseOp() && Bop->getOpcode() < Opc) {
15934 S.
Diag(Bop->getOperatorLoc(), diag::warn_bitwise_op_in_bitwise_op)
15936 << Bop->getSourceRange() << OpLoc;
15938 S.
PDiag(diag::note_precedence_silence)
15939 << Bop->getOpcodeStr(),
15940 Bop->getSourceRange());
15946 Expr *SubExpr, StringRef Shift) {
15948 if (Bop->getOpcode() == BO_Add || Bop->getOpcode() == BO_Sub) {
15949 StringRef Op = Bop->getOpcodeStr();
15950 S.
Diag(Bop->getOperatorLoc(), diag::warn_addition_in_bitshift)
15951 << Bop->getSourceRange() << OpLoc << Shift << Op;
15953 S.
PDiag(diag::note_precedence_silence) << Op,
15954 Bop->getSourceRange());
15970 if (Kind != OO_LessLess && Kind != OO_GreaterGreater)
15973 S.
Diag(OpLoc, diag::warn_overloaded_shift_in_comparison)
15975 << (Kind == OO_LessLess);
15977 S.
PDiag(diag::note_precedence_silence)
15978 << (Kind == OO_LessLess ?
"<<" :
">>"),
15981 S, OpLoc, S.
PDiag(diag::note_evaluate_comparison_first),
15995 if ((Opc == BO_Or || Opc == BO_Xor) &&
16003 if (Opc == BO_LOr && !OpLoc.
isMacroID()) {
16009 || Opc == BO_Shr) {
16025 assert(LHSExpr &&
"ActOnBinOp(): missing left expression");
16026 assert(RHSExpr &&
"ActOnBinOp(): missing right expression");
16035 CheckInvalidBuiltinCountedByRef(LHSExpr, K);
16036 CheckInvalidBuiltinCountedByRef(RHSExpr, K);
16038 return BuildBinOp(S, TokLoc, Opc, LHSExpr, RHSExpr);
16044 if (OverOp !=
OO_None && OverOp != OO_Equal)
16093 Expr *RHSExpr,
bool ForFoldExpression) {
16094 if (!LHSExpr || !RHSExpr)
16106 if (pty->getKind() == BuiltinType::PseudoObject &&
16119 RHSExpr = resolvedRHS.
get();
16133 (pty->getKind() == BuiltinType::BoundMember ||
16134 pty->getKind() == BuiltinType::Overload)) {
16135 auto *OE = dyn_cast<OverloadExpr>(LHSExpr);
16136 if (OE && !OE->hasTemplateKeyword() && !OE->hasExplicitTemplateArgs() &&
16137 llvm::any_of(OE->decls(), [](
NamedDecl *ND) {
16138 return isa<FunctionTemplateDecl>(ND);
16140 Diag(OE->getQualifier() ? OE->getQualifierLoc().getBeginLoc()
16141 : OE->getNameLoc(),
16142 diag::err_template_kw_missing)
16143 << OE->getName().getAsIdentifierInfo();
16150 LHSExpr = LHS.
get();
16157 if (Opc == BO_Assign && pty->getKind() == BuiltinType::Overload) {
16164 ForFoldExpression);
16174 RHSExpr = resolvedRHS.
get();
16180 if (!
HLSL().CheckResourceBinOp(Opc, LHSExpr, RHSExpr, OpLoc))
16183 std::optional<ExprResult> ConvRHS =
16185 if (ConvRHS &&
Context.hasSameUnqualifiedType(
16186 LHSExpr->
getType(), ConvRHS->get()->getType())) {
16187 assert(!ConvRHS->isInvalid());
16188 RHSExpr = ConvRHS->get();
16194 bool CanOverloadBinOp =
16198 bool TypeDependent =
16202 if (CanOverloadBinOp && (TypeDependent || Overloadable))
16210 "Should only occur in error-recovery path.");
16216 Context, LHSExpr, RHSExpr, Opc,
16236 ResultType = RHSExpr->
getType();
16239 ResultType =
Context.DependentTy;
16252 if (T.isNull() || T->isDependentType())
16268 bool CanOverflow =
false;
16270 bool ConvertHalfVec =
false;
16279 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16286 if (Opc == UO_AddrOf)
16287 return ExprError(
Diag(OpLoc, diag::err_hlsl_operator_unsupported) << 0);
16288 if (Opc == UO_Deref)
16289 return ExprError(
Diag(OpLoc, diag::err_hlsl_operator_unsupported) << 1);
16294 resultType =
Context.DependentTy;
16303 Opc == UO_PreInc || Opc == UO_PostInc,
16304 Opc == UO_PreInc || Opc == UO_PreDec);
16309 CheckAddressOfNoDeref(InputExpr);
16322 CanOverflow = Opc == UO_Minus &&
16334 if (ConvertHalfVec)
16341 (!
Context.getLangOpts().ZVector ||
16351 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16362 Diag(OpLoc, diag::ext_integer_complement_complex)
16370 if (!T->isIntegerType())
16371 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16374 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16390 resultType =
Context.FloatTy;
16396 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16402 if (
Context.getLangOpts().CPlusPlus) {
16407 }
else if (
Context.getLangOpts().OpenCL &&
16408 Context.getLangOpts().OpenCLVersion < 120) {
16412 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16425 Input.
get(), resultType,
16430 if (
Context.getLangOpts().OpenCL &&
16431 Context.getLangOpts().getOpenCLCompatibleVersion() < 120) {
16435 if (!T->isIntegerType())
16436 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16442 }
else if (
Context.getLangOpts().CPlusPlus &&
16446 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16452 }
else if (resultType ==
Context.AMDGPUFeaturePredicateTy) {
16453 resultType =
Context.getLogicalOperationType();
16457 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16463 resultType =
Context.getLogicalOperationType();
16491 "the co_await expression must be non-dependant before "
16492 "building operator co_await");
16503 if (Opc != UO_AddrOf && Opc != UO_Deref)
16504 CheckArrayAccess(Input.
get());
16510 if (Opc == UO_Deref && UO->getType()->hasAttr(attr::NoDeref) &&
16516 if (ConvertHalfVec)
16522 if (
DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
16523 if (!DRE->getQualifier())
16533 return Method->isImplicitObjectMemberFunction();
16539 if (!ULE->getQualifier())
16544 if (
Method->isImplicitObjectMemberFunction())
16565 if (pty->getKind() == BuiltinType::PseudoObject &&
16570 if (Opc == UO_Extension)
16575 if (Opc == UO_AddrOf &&
16576 (pty->getKind() == BuiltinType::Overload ||
16577 pty->getKind() == BuiltinType::UnknownAny ||
16578 pty->getKind() == BuiltinType::BoundMember))
16603 Expr *Input,
bool IsAfterAmp) {
16613 OpLoc, LabLoc, TheDecl,
Context.getPointerType(
Context.VoidTy));
16647 assert(!
Cleanup.exprNeedsCleanups() &&
16648 "cleanups within StmtExpr not correctly bound!");
16658 bool StmtExprMayBindToTemp =
false;
16660 if (
const auto *LastStmt = dyn_cast<ValueStmt>(Compound->
body_back())) {
16661 if (
const Expr *
Value = LastStmt->getExprStmt()) {
16662 StmtExprMayBindToTemp =
true;
16670 Expr *ResStmtExpr =
16672 if (StmtExprMayBindToTemp)
16674 return ResStmtExpr;
16697 auto *Cast = dyn_cast<ImplicitCastExpr>(E);
16698 if (Cast && Cast->getCastKind() == CK_ARCConsumeObject)
16699 return Cast->getSubExpr();
16720 return ExprError(
Diag(BuiltinLoc, diag::err_offsetof_record_type)
16721 << ArgTy << TypeRange);
16727 diag::err_offsetof_incomplete_type, TypeRange))
16730 bool DidWarnAboutNonPOD =
false;
16746 CurrentType =
Context.DependentTy;
16764 Exprs.push_back(Idx);
16776 CurrentType =
Context.DependentTy;
16782 diag::err_offsetof_incomplete_type))
16799 bool IsSafe =
LangOpts.CPlusPlus11? CRD->isStandardLayout() : CRD->isPOD();
16801 LangOpts.CPlusPlus11? diag::ext_offsetof_non_standardlayout_type
16802 : diag::ext_offsetof_non_pod_type;
16805 Diag(BuiltinLoc, DiagID)
16808 DidWarnAboutNonPOD =
true;
16819 MemberDecl = IndirectMemberDecl->getAnonField();
16826 if (!R.isAmbiguous())
16827 Diag(BuiltinLoc, diag::err_no_member)
16844 if (IndirectMemberDecl)
16851 Context.getCanonicalTagType(Parent), Paths)) {
16853 Diag(D.
getEndLoc(), diag::err_offsetof_field_of_virtual_base)
16863 if (IndirectMemberDecl) {
16864 for (
auto *FI : IndirectMemberDecl->chain()) {
16876 Comps, Exprs, RParenLoc);
16900 assert((CondExpr && LHSExpr && RHSExpr) &&
"Missing type argument(s)");
16905 bool CondIsTrue =
false;
16907 resType =
Context.DependentTy;
16910 llvm::APSInt condEval(32);
16912 CondExpr, &condEval, diag::err_typecheck_choose_expr_requires_constant);
16915 CondExpr = CondICE.
get();
16916 CondIsTrue = condEval.getZExtValue();
16919 Expr *ActiveExpr = CondIsTrue ? LHSExpr : RHSExpr;
16921 resType = ActiveExpr->
getType();
16927 resType,
VK, OK, RPLoc, CondIsTrue);
16939 Decl *ManglingContextDecl;
16940 std::tie(MCtx, ManglingContextDecl) =
16944 Block->setBlockMangling(ManglingNumber, ManglingContextDecl);
16966 "block-id should have no identifier!");
16977 assert(T->isFunctionType() &&
16978 "GetTypeForDeclarator made a non-function block signature");
16994 unsigned Size =
Result.getFullDataSize();
16995 Sig =
Context.CreateTypeSourceInfo(
Result.getType(), Size);
17006 QualType RetTy = Fn->getReturnType();
17016 if (RetTy !=
Context.DependentTy) {
17024 if (ExplicitSignature) {
17025 for (
unsigned I = 0, E = ExplicitSignature.
getNumParams(); I != E; ++I) {
17027 if (Param->getIdentifier() ==
nullptr && !Param->isImplicit() &&
17031 Diag(Param->getLocation(), diag::ext_parameter_name_omitted_c23);
17033 Params.push_back(Param);
17039 for (
const auto &I : Fn->param_types()) {
17042 Params.push_back(Param);
17047 if (!Params.empty()) {
17058 AI->setOwningFunction(CurBlock->
TheDecl);
17061 if (AI->getIdentifier()) {
17067 if (AI->isInvalidDecl())
17086 Diag(CaretLoc, diag::err_blocks_disable) <<
LangOpts.OpenCL;
17091 assert(!
Cleanup.exprNeedsCleanups() &&
17092 "cleanups within block not correctly bound!");
17107 bool NoReturn = BD->
hasAttr<NoReturnAttr>();
17115 if (NoReturn && !Ext.getNoReturn()) Ext = Ext.
withNoReturn(
true);
17121 BlockTy =
Context.getFunctionType(RetTy, {}, EPI);
17142 BlockTy =
Context.getFunctionType(RetTy, {}, EPI);
17146 BlockTy =
Context.getBlockPointerType(BlockTy);
17150 !
PP.isCodeCompletionEnabled())
17155 if (Body &&
getCurFunction()->HasPotentialAvailabilityViolations)
17181 Expr *CopyExpr =
nullptr;
17208 if (!
Result.isInvalid() &&
17209 !
Result.get()->getType().isConstQualified()) {
17211 Result.get()->getType().withConst(),
17215 if (!
Result.isInvalid()) {
17225 if (!
Result.isInvalid() &&
17229 CopyExpr =
Result.get();
17236 Captures.push_back(NewCap);
17250 if (
Result->getBlockDecl()->hasCaptures()) {
17253 Cleanup.setExprNeedsCleanups(
true);
17257 for (
const auto &CI :
Result->getBlockDecl()->captures()) {
17258 const VarDecl *var = CI.getVariable();
17273 {Result},
Result->getType());
17287 Expr *OrigExpr = E;
17301 Context.getTargetInfo().getTriple().isNVPTX())
17324 VaListType =
Context.getArrayDecayedType(VaListType);
17336 if (
Init.isInvalid())
17352 diag::err_first_argument_to_va_arg_not_of_type_va_list)
17357 diag::err_second_parameter_to_va_arg_incomplete,
17363 diag::err_second_parameter_to_va_arg_abstract,
17370 ? diag::warn_second_parameter_to_va_arg_ownership_qualified
17371 : diag::warn_second_parameter_to_va_arg_not_pod)
17378 PDiag(diag::warn_second_parameter_to_va_arg_array)
17411 UnderlyingType = ED->getIntegerType();
17412 if (
Context.typesAreCompatible(PromoteType, UnderlyingType,
17425 ?
Context.getCorrespondingSignedType(UnderlyingType)
17426 :
Context.getCorrespondingUnsignedType(UnderlyingType);
17427 if (
Context.typesAreCompatible(PromoteType, UnderlyingType,
17433 PromoteType =
Context.DoubleTy;
17434 if (!PromoteType.
isNull())
17436 PDiag(diag::warn_second_parameter_to_va_arg_never_compatible)
17451 if (pw ==
Context.getTargetInfo().getIntWidth())
17453 else if (pw ==
Context.getTargetInfo().getLongWidth())
17455 else if (pw ==
Context.getTargetInfo().getLongLongWidth())
17458 llvm_unreachable(
"I don't know size of pointer!");
17475 if ((SLDecl->isCompleteDefinition() || SLDecl->isBeingDefined()) &&
17484 S.
Diag(Loc, diag::err_std_source_location_impl_not_found);
17492 S.
Diag(Loc, diag::err_std_source_location_impl_malformed);
17496 unsigned Count = 0;
17498 StringRef Name = F->getName();
17500 if (Name ==
"_M_file_name") {
17501 if (F->getType() !=
17505 }
else if (Name ==
"_M_function_name") {
17506 if (F->getType() !=
17510 }
else if (Name ==
"_M_line") {
17511 if (!F->getType()->isIntegerType())
17514 }
else if (Name ==
"_M_column") {
17515 if (!F->getType()->isIntegerType())
17524 S.
Diag(Loc, diag::err_std_source_location_impl_malformed);
17547 ResultTy =
Context.UnsignedIntTy;
17556 ResultTy =
Context.getPointerType(
17575 Data->BinaryData = BinaryData;
17579 Data->getDataElementCount());
17583 const Expr *SrcExpr) {
17592 auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl());
17605 bool *Complained) {
17607 *Complained =
false;
17610 bool CheckInferredResultType =
false;
17612 unsigned DiagKind = 0;
17614 bool MayHaveConvFixit =
false;
17615 bool MayHaveFunctionDiff =
false;
17626 DiagKind = diag::warn_compatible_implicit_pointer_conv;
17630 DiagKind = diag::err_typecheck_convert_pointer_int;
17633 DiagKind = diag::ext_typecheck_convert_pointer_int;
17636 MayHaveConvFixit =
true;
17640 DiagKind = diag::err_typecheck_convert_int_pointer;
17643 DiagKind = diag::ext_typecheck_convert_int_pointer;
17646 MayHaveConvFixit =
true;
17650 diag::warn_typecheck_convert_incompatible_function_pointer_strict;
17652 MayHaveConvFixit =
true;
17656 DiagKind = diag::err_typecheck_convert_incompatible_function_pointer;
17659 DiagKind = diag::ext_typecheck_convert_incompatible_function_pointer;
17662 MayHaveConvFixit =
true;
17666 DiagKind = diag::err_arc_typecheck_convert_incompatible_pointer;
17668 DiagKind = diag::err_typecheck_convert_incompatible_pointer;
17671 DiagKind = diag::ext_typecheck_convert_incompatible_pointer;
17675 if (CheckInferredResultType) {
17681 MayHaveConvFixit =
true;
17685 DiagKind = diag::err_typecheck_convert_incompatible_pointer_sign;
17688 DiagKind = diag::ext_typecheck_convert_incompatible_pointer_sign;
17693 DiagKind = diag::err_typecheck_convert_pointer_void_func;
17696 DiagKind = diag::ext_typecheck_convert_pointer_void_func;
17702 SrcType =
Context.getDecayedType(SrcType);
17709 DiagKind = diag::err_typecheck_incompatible_address_space;
17712 DiagKind = diag::err_typecheck_incompatible_ownership;
17715 DiagKind = diag::err_typecheck_incompatible_ptrauth;
17719 llvm_unreachable(
"unknown error case for discarding qualifiers!");
17724 SrcType =
Context.getArrayDecayedType(SrcType);
17726 DiagKind = diag::ext_typecheck_convert_discards_overflow_behavior;
17742 DiagKind = diag::err_typecheck_convert_discards_qualifiers;
17745 DiagKind = diag::ext_typecheck_convert_discards_qualifiers;
17752 DiagKind = diag::err_nested_pointer_qualifier_mismatch;
17754 DiagKind = diag::ext_nested_pointer_qualifier_mismatch;
17758 DiagKind = diag::err_typecheck_incompatible_nested_address_space;
17762 DiagKind = diag::err_int_to_block_pointer;
17766 DiagKind = diag::err_typecheck_convert_incompatible_block_pointer;
17773 for (
auto *srcProto : srcOPT->
quals()) {
17779 IFace = IFaceT->getDecl();
17784 for (
auto *dstProto : dstOPT->
quals()) {
17790 IFace = IFaceT->getDecl();
17793 DiagKind = diag::err_incompatible_qualified_id;
17796 DiagKind = diag::warn_incompatible_qualified_id;
17802 DiagKind = diag::err_incompatible_vectors;
17805 DiagKind = diag::warn_incompatible_vectors;
17809 DiagKind = diag::err_arc_weak_unavailable_assign;
17816 "Unexpected function type found in IncompatibleOBTKinds assignment");
17818 SrcType =
Context.getDecayedType(SrcType);
17820 auto getOBTKindName = [](
QualType Ty) -> StringRef {
17821 if (Ty->isPointerType())
17822 Ty = Ty->getPointeeType();
17823 if (
const auto *OBT = Ty->getAs<OverflowBehaviorType>()) {
17824 return OBT->getBehaviorKind() ==
17825 OverflowBehaviorType::OverflowBehaviorKind::Trap
17829 llvm_unreachable(
"OBT kind unhandled");
17832 Diag(Loc, diag::err_incompatible_obt_kinds_assignment)
17833 << DstType << SrcType << getOBTKindName(DstType)
17834 << getOBTKindName(SrcType);
17841 *Complained =
true;
17845 DiagKind = diag::err_typecheck_convert_incompatible;
17847 MayHaveConvFixit =
true;
17849 MayHaveFunctionDiff =
true;
17858 FirstType = DstType;
17859 SecondType = SrcType;
17869 FirstType = SrcType;
17870 SecondType = DstType;
17879 FDiag << FirstType << SecondType << ActionForDiag
17882 if (DiagKind == diag::ext_typecheck_convert_incompatible_pointer_sign ||
17883 DiagKind == diag::err_typecheck_convert_incompatible_pointer_sign) {
17893 if (!ConvHints.
isNull()) {
17898 if (MayHaveConvFixit) { FDiag << (
unsigned) (ConvHints.
Kind); }
17900 if (MayHaveFunctionDiff)
17904 if ((DiagKind == diag::warn_incompatible_qualified_id ||
17905 DiagKind == diag::err_incompatible_qualified_id) &&
17907 Diag(IFace->
getLocation(), diag::note_incomplete_class_and_qualified_id)
17910 if (SecondType ==
Context.OverloadTy)
17914 if (CheckInferredResultType)
17922 *Complained =
true;
17933 return S.
Diag(Loc, diag::err_ice_not_integral)
17937 return S.
Diag(Loc, diag::err_expr_not_ice) << S.
LangOpts.CPlusPlus;
17952 IDDiagnoser(
unsigned DiagID)
17956 return S.
Diag(Loc, DiagID);
17958 } Diagnoser(DiagID);
17971 return S.
Diag(Loc, diag::ext_expr_not_ice) << S.
LangOpts.CPlusPlus;
17993 BaseDiagnoser(BaseDiagnoser) {}
18002 return S.
Diag(Loc, diag::err_ice_incomplete_type) << T;
18007 return S.
Diag(Loc, diag::err_ice_explicit_conversion) << T << ConvTy;
18018 return S.
Diag(Loc, diag::err_ice_ambiguous_conversion) << T;
18029 llvm_unreachable(
"conversion functions are permitted");
18031 } ConvertDiagnoser(Diagnoser);
18037 E = Converted.
get();
18058 E = RValueExpr.
get();
18076 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
18077 diag::note_invalid_subexpr_in_const_expr) {
18078 DiagLoc = Notes[0].first;
18100 EvalResult.
Diag = &Notes;
18124 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
18125 diag::note_invalid_subexpr_in_const_expr) {
18126 DiagLoc = Notes[0].first;
18152 class TransformToPE :
public TreeTransform<TransformToPE> {
18156 TransformToPE(
Sema &SemaRef) : BaseTransform(SemaRef) { }
18159 bool AlwaysRebuild() {
return true; }
18160 bool ReplacingOriginal() {
return true; }
18169 ExprResult TransformDeclRefExpr(DeclRefExpr *E) {
18171 !SemaRef.isUnevaluatedContext())
18173 diag::err_invalid_non_static_member_use)
18176 return BaseTransform::TransformDeclRefExpr(E);
18180 ExprResult TransformUnaryOperator(UnaryOperator *E) {
18184 return BaseTransform::TransformUnaryOperator(E);
18192 return SkipLambdaBody(E, Body);
18199 "Should only transform unevaluated expressions");
18204 return TransformToPE(*this).TransformExpr(E);
18209 "Should only transform unevaluated expressions");
18213 return TransformToPE(*this).TransformType(TInfo);
18221 LambdaContextDecl, ExprContext);
18235 Prev.isImmediateFunctionContext() || Prev.isConstantEvaluated();
18238 Prev.InImmediateEscalatingFunctionContext;
18306 if (
const auto *E = dyn_cast<UnaryOperator>(PossibleDeref)) {
18307 if (E->getOpcode() == UO_Deref)
18308 return CheckPossibleDeref(S, E->getSubExpr());
18309 }
else if (
const auto *E = dyn_cast<ArraySubscriptExpr>(PossibleDeref)) {
18310 return CheckPossibleDeref(S, E->getBase());
18311 }
else if (
const auto *E = dyn_cast<MemberExpr>(PossibleDeref)) {
18312 return CheckPossibleDeref(S, E->getBase());
18313 }
else if (
const auto E = dyn_cast<DeclRefExpr>(PossibleDeref)) {
18316 if (
const auto *Ptr = Ty->
getAs<PointerType>())
18319 Inner = Arr->getElementType();
18323 if (Inner->
hasAttr(attr::NoDeref))
18333 const DeclRefExpr *DeclRef = CheckPossibleDeref(*
this, E);
18340 Diag(E->
getExprLoc(), diag::warn_dereference_of_noderef_type_no_decl)
18355 if (BO->getOpcode() == BO_Assign) {
18357 llvm::erase(LHSs, BO->getLHS());
18365 "Cannot mark an immediate escalating expression outside of an "
18366 "immediate escalating context");
18369 if (
auto *DeclRef =
18370 dyn_cast<DeclRefExpr>(
Call->getCallee()->IgnoreImplicit()))
18371 DeclRef->setIsImmediateEscalating(
true);
18372 }
else if (
auto *Ctr = dyn_cast<CXXConstructExpr>(E->
IgnoreImplicit())) {
18373 Ctr->setIsImmediateEscalating(
true);
18374 }
else if (
auto *DeclRef = dyn_cast<DeclRefExpr>(E->
IgnoreImplicit())) {
18375 DeclRef->setIsImmediateEscalating(
true);
18377 assert(
false &&
"expected an immediately escalating expression");
18380 FI->FoundImmediateEscalatingExpression =
true;
18395 if (
auto *DeclRef =
18396 dyn_cast<DeclRefExpr>(
Call->getCallee()->IgnoreImplicit()))
18405 auto CheckConstantExpressionAndKeepResult = [&]() {
18408 Eval,
getASTContext(), ConstantExprKind::ImmediateInvocation);
18410 Cached = std::move(Eval.
Val);
18418 !CheckConstantExpressionAndKeepResult()) {
18423 if (
Cleanup.exprNeedsCleanups()) {
18440 Cleanup.cleanupsHaveSideEffects(), {});
18453 ExprEvalContexts.back().ImmediateInvocationCandidates.emplace_back(Res, 0);
18461 Eval.
Diag = &Notes;
18465 if (!
Result || !Notes.empty()) {
18468 if (
auto *
FunctionalCast = dyn_cast<CXXFunctionalCastExpr>(InnerExpr))
18471 if (
auto *
Call = dyn_cast<CallExpr>(InnerExpr))
18473 else if (
auto *
Call = dyn_cast<CXXConstructExpr>(InnerExpr))
18474 FD =
Call->getConstructor();
18475 else if (
auto *Cast = dyn_cast<CastExpr>(InnerExpr))
18476 FD = dyn_cast_or_null<FunctionDecl>(Cast->getConversionFunction());
18479 "could not find an immediate function in this expression");
18486 SemaRef.
Diag(Context->Loc, diag::note_invalid_consteval_initializer)
18488 SemaRef.
Diag(Context->Decl->getBeginLoc(), diag::note_declared_at);
18492 for (
auto &
Note : Notes)
18504 llvm::SmallPtrSetImpl<DeclRefExpr *> &DRSet;
18508 ComplexRemove(
Sema &SemaRef, llvm::SmallPtrSetImpl<DeclRefExpr *> &DR,
18512 :
Base(SemaRef), DRSet(DR), IISet(II), CurrentII(Current) {}
18514 auto It = std::find_if(CurrentII, IISet.rend(),
18516 return Elem.getPointer() == E;
18522 if (It == IISet.rend()) {
18524 CurrentII->setInt(1);
18531 return Base::TransformConstantExpr(E);
18532 RemoveImmediateInvocation(E);
18533 return Base::TransformExpr(E->
getSubExpr());
18539 return Base::TransformCXXOperatorCallExpr(E);
18553 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(
Init))
18554 Init = ICE->getSubExpr();
18555 else if (
auto *ICE = dyn_cast<MaterializeTemporaryExpr>(
Init))
18556 Init = ICE->getSubExpr();
18562 if (
auto *CE = dyn_cast<ConstantExpr>(
Init);
18563 CE && CE->isImmediateInvocation())
18564 RemoveImmediateInvocation(CE);
18565 return Base::TransformInitializer(
Init, NotCopyInit);
18581 bool AlwaysRebuild() {
return false; }
18582 bool ReplacingOriginal() {
return true; }
18583 bool AllowSkippingCXXConstructExpr() {
18584 bool Res = AllowSkippingFirstCXXConstructExpr;
18585 AllowSkippingFirstCXXConstructExpr =
true;
18588 bool AllowSkippingFirstCXXConstructExpr =
true;
18599 Transformer.AllowSkippingFirstCXXConstructExpr =
false;
18601 ExprResult Res = Transformer.TransformExpr(It->getPointer()->getSubExpr());
18607 It->getPointer()->setSubExpr(Res.
get());
18627 if (VD && (VD->isUsableInConstantExpressions(
SemaRef.
Context) ||
18628 VD->hasConstantInitialization())) {
18661 llvm::SmallPtrSetImpl<DeclRefExpr *> &DRSet;
18662 SimpleRemove(llvm::SmallPtrSetImpl<DeclRefExpr *> &S) : DRSet(S) {}
18665 return DRSet.size();
18668 Visitor.TraverseStmt(
18678 if (DR->isImmediateEscalating())
18682 if (
const auto *MD = dyn_cast<CXXMethodDecl>(ND);
18684 ND = MD->getParent();
18691 bool ImmediateEscalating =
false;
18692 bool IsPotentiallyEvaluated =
18702 SemaRef.
Diag(DR->getBeginLoc(), diag::err_invalid_consteval_take_address)
18703 << ND << isa<CXXRecordDecl>(ND) << FD->isConsteval();
18704 if (!FD->getBuiltinID())
18708 SemaRef.
Diag(Context->Loc, diag::note_invalid_consteval_initializer)
18710 SemaRef.
Diag(Context->Decl->getBeginLoc(), diag::note_declared_at);
18712 if (FD->isImmediateEscalating() && !FD->isConsteval())
18726 (Rec.
ExprContext == ExpressionKind::EK_TemplateArgument ||
18734 D = diag::err_lambda_unevaluated_operand;
18740 D = diag::err_lambda_in_constant_expression;
18741 }
else if (Rec.
ExprContext == ExpressionKind::EK_TemplateArgument) {
18744 D = diag::err_lambda_in_invalid_context;
18746 llvm_unreachable(
"Couldn't infer lambda error message.");
18748 for (
const auto *L : Rec.
Lambdas)
18749 Diag(L->getBeginLoc(), D);
18769 Diag(BO->getBeginLoc(), diag::warn_deprecated_simple_assign_volatile)
18840 llvm_unreachable(
"Invalid context");
18886 : FD(FD), Param(Param) {}
18893 CCName =
"stdcall";
18896 CCName =
"fastcall";
18899 CCName =
"vectorcall";
18902 llvm_unreachable(
"CC does not need mangling");
18905 S.
Diag(Loc, diag::err_cconv_incomplete_param_type)
18906 << Param->getDeclName() << FD->
getDeclName() << CCName;
18911 ParamIncompleteTypeDiagnoser Diagnoser(FD, Param);
18917enum class OdrUseContext {
18936 if (Context.isUnevaluated())
18937 return OdrUseContext::None;
18940 return OdrUseContext::Dependent;
18942 if (Context.isDiscardedStatementContext())
18943 return OdrUseContext::FormallyOdrUsed;
18945 else if (Context.Context ==
18947 return OdrUseContext::FormallyOdrUsed;
18949 return OdrUseContext::Used;
18953 if (!
Func->isConstexpr())
18956 if (
Func->isImplicitlyInstantiable() || !
Func->isUserProvided())
18963 auto *CCD = dyn_cast<CXXConstructorDecl>(
Func);
18964 return CCD && CCD->getInheritedConstructor();
18968 bool MightBeOdrUse) {
18969 assert(
Func &&
"No function?");
18971 Func->setReferenced();
18984 OdrUseContext OdrUse =
18986 if (IsRecursiveCall && OdrUse == OdrUseContext::Used)
18987 OdrUse = OdrUseContext::FormallyOdrUsed;
18991 if (
Func->isTrivial() && !
Func->hasAttr<DLLExportAttr>() &&
18992 OdrUse == OdrUseContext::Used) {
18995 OdrUse = OdrUseContext::FormallyOdrUsed;
18997 OdrUse = OdrUseContext::FormallyOdrUsed;
19004 bool NeededForConstantEvaluation =
19029 bool NeedDefinition =
19030 !IsRecursiveCall &&
19031 (OdrUse == OdrUseContext::Used ||
19032 (NeededForConstantEvaluation && !
Func->isPureVirtual()));
19039 if (NeedDefinition &&
19041 Func->getMemberSpecializationInfo()))
19048 if (NeedDefinition && !
Func->getBody()) {
19051 dyn_cast<CXXConstructorDecl>(
Func)) {
19064 }
else if (
Constructor->getInheritedConstructor()) {
19068 dyn_cast<CXXDestructorDecl>(
Func)) {
19078 if (MethodDecl->isOverloadedOperator() &&
19079 MethodDecl->getOverloadedOperator() == OO_Equal) {
19081 if (MethodDecl->isDefaulted() && !MethodDecl->isDeleted()) {
19082 if (MethodDecl->isCopyAssignmentOperator())
19084 else if (MethodDecl->isMoveAssignmentOperator())
19088 MethodDecl->getParent()->isLambda()) {
19095 }
else if (MethodDecl->isVirtual() &&
getLangOpts().AppleKext)
19099 if (
Func->isDefaulted() && !
Func->isDeleted()) {
19107 if (
Func->isImplicitlyInstantiable()) {
19109 Func->getTemplateSpecializationKindForInstantiation();
19111 bool FirstInstantiation = PointOfInstantiation.
isInvalid();
19112 if (FirstInstantiation) {
19113 PointOfInstantiation = Loc;
19114 if (
auto *MSI =
Func->getMemberSpecializationInfo())
19115 MSI->setPointOfInstantiation(Loc);
19118 Func->setTemplateSpecializationKind(TSK, PointOfInstantiation);
19123 PointOfInstantiation = Loc;
19127 Func->isConstexpr()) {
19132 std::make_pair(
Func, PointOfInstantiation));
19133 else if (
Func->isConstexpr())
19139 Func->setInstantiationIsPending(
true);
19141 std::make_pair(
Func, PointOfInstantiation));
19142 if (llvm::isTimeTraceVerbose()) {
19143 llvm::timeTraceAddInstantEvent(
"DeferInstantiation", [&] {
19145 llvm::raw_string_ostream
OS(Name);
19152 Consumer.HandleCXXImplicitFunctionInstantiation(
Func);
19157 for (
auto *i :
Func->redecls()) {
19158 if (!i->isUsed(
false) && i->isImplicitlyInstantiable())
19176 if (
Init->isInClassMemberInitializer())
19178 MarkDeclarationsReferencedInExpr(Init->getInit());
19199 if (
LangOpts.OffloadImplicitHostDeviceTemplates &&
LangOpts.CUDAIsDevice &&
19204 if (OdrUse == OdrUseContext::Used && !
Func->isUsed(
false)) {
19206 if (!
Func->isDefined() && !
Func->isInAnotherModuleUnit()) {
19207 if (mightHaveNonExternalLinkage(
Func))
19209 else if (
Func->getMostRecentDecl()->isInlined() &&
19211 !
Func->getMostRecentDecl()->hasAttr<GNUInlineAttr>())
19229 if (
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
19230 if (
auto *Dtor = dyn_cast<CXXDestructorDecl>(
Func)) {
19250 const unsigned *
const FunctionScopeIndexToStopAt =
nullptr) {
19253 VarDecl *Var =
V->getPotentiallyDecomposedVarDecl();
19254 assert(Var &&
"expected a capturable variable");
19264 QualType CaptureType, DeclRefType;
19270 DeclRefType, FunctionScopeIndexToStopAt);
19285 << 2 << 1 << Var << UserTarget;
19288 ? diag::note_cuda_const_var_unpromoted
19289 : diag::note_cuda_host_var);
19298 Var->
hasAttr<CUDADeviceAttr>() &&
19299 !Var->
getAttr<CUDADeviceAttr>()->isImplicit())) &&
19300 !Var->
hasAttr<CUDASharedAttr>() &&
19316 (!FD || (!FD->getDescribedFunctionTemplate() &&
19328 unsigned CapturingScopeIndex) {
19355 unsigned ContextKind = 3;
19365 S.
Diag(loc, diag::err_reference_to_local_in_enclosing_context)
19366 << var << ValueKind << ContextKind << VarDC;
19367 S.
Diag(var->getLocation(), diag::note_entity_declared_at)
19376 bool &SubCapturesAreNested,
19382 SubCapturesAreNested =
true;
19435 "Only variables and structured bindings can be captured");
19446 S.
Diag(Loc, diag::err_lambda_capture_anonymous_var);
19455 S.
Diag(Loc, diag::err_ref_vm_type);
19466 S.
Diag(Loc, diag::err_ref_flexarray_type);
19468 S.
Diag(Loc, diag::err_lambda_capture_flexarray_type) << Var;
19473 const bool HasBlocksAttr = Var->
hasAttr<BlocksAttr>();
19478 S.
Diag(Loc, diag::err_capture_block_variable) << Var << !IsLambda;
19487 S.
Diag(Loc, diag::err_opencl_block_ref_block);
19498 ? diag::warn_cxx17_compat_capture_binding
19499 : diag::ext_capture_binding)
19513 bool ByRef =
false;
19519 if (BuildAndDiagnose) {
19520 S.
Diag(Loc, diag::err_ref_array_type);
19531 if (BuildAndDiagnose) {
19532 S.
Diag(Loc, diag::err_arc_autoreleasing_capture)
19548 if (BuildAndDiagnose) {
19550 S.
Diag(Loc, diag::warn_block_capture_autoreleasing);
19551 S.
Diag(VarLoc, diag::note_declare_parameter_strong);
19556 const bool HasBlocksAttr = Var->
hasAttr<BlocksAttr>();
19565 DeclRefType = CaptureType;
19569 if (BuildAndDiagnose)
19579 const bool BuildAndDiagnose,
QualType &CaptureType,
QualType &DeclRefType,
19580 const bool RefersToCapturedVariable,
TryCaptureKind Kind,
bool IsTopScope,
19606 CaptureType = DeclRefType;
19609 if (BuildAndDiagnose)
19610 RSI->
addCapture(Var,
false, ByRef, RefersToCapturedVariable,
19620 const bool RefersToCapturedVariable,
19625 bool ByRef =
false;
19629 ByRef = (LSI->
ImpCaptureStyle == LambdaScopeInfo::ImpCap_LambdaByref);
19634 S.
Diag(Loc, diag::err_wasm_ca_reference) << 0;
19665 if (!RefType->getPointeeType()->isFunctionType())
19672 if (BuildAndDiagnose) {
19673 S.
Diag(Loc, diag::err_arc_autoreleasing_capture) << 1;
19683 if (!
Invalid && BuildAndDiagnose) {
19687 diag::err_capture_of_incomplete_or_sizeless_type,
19691 diag::err_capture_of_abstract_type))
19717 if (BuildAndDiagnose)
19718 LSI->
addCapture(Var,
false, ByRef, RefersToCapturedVariable,
19719 Loc, EllipsisLoc, CaptureType,
Invalid);
19730 if (T.isTriviallyCopyableType(Context))
19734 if (!(RD = RD->getDefinition()))
19736 if (RD->hasSimpleCopyConstructor())
19738 if (RD->hasUserDeclaredCopyConstructor())
19740 if (Ctor->isCopyConstructor())
19741 return !Ctor->isDeleted();
19761 if (ShouldOfferCopyFix) {
19765 FixBuffer.assign({Separator, Var->
getName()});
19766 Sema.
Diag(VarInsertLoc, diag::note_lambda_variable_capture_fixit)
19771 FixBuffer.assign({Separator,
"&", Var->
getName()});
19772 Sema.
Diag(VarInsertLoc, diag::note_lambda_variable_capture_fixit)
19784 return !C.isThisCapture() && !C.isInitCapture();
19793 if (ShouldOfferCopyFix) {
19794 bool CanDefaultCopyCapture =
true;
19803 if (CanDefaultCopyCapture && llvm::none_of(LSI->
Captures, [](
Capture &
C) {
19804 return !C.isThisCapture() && !C.isInitCapture() && C.isCopyCapture();
19806 FixBuffer.assign({
"=", Separator});
19807 Sema.
Diag(DefaultInsertLoc, diag::note_lambda_default_capture_fixit)
19816 return !C.isInitCapture() && C.isReferenceCapture() &&
19817 !C.isThisCapture();
19819 FixBuffer.assign({
"&", Separator});
19820 Sema.
Diag(DefaultInsertLoc, diag::note_lambda_default_capture_fixit)
19829 QualType &DeclRefType,
const unsigned *
const FunctionScopeIndexToStopAt) {
19852 const auto *VD = dyn_cast<VarDecl>(Var);
19854 if (VD->isInitCapture())
19859 assert(VD &&
"Cannot capture a null variable");
19861 const unsigned MaxFunctionScopesIndex = FunctionScopeIndexToStopAt
19865 if (FunctionScopeIndexToStopAt) {
19866 assert(!
FunctionScopes.empty() &&
"No function scopes to stop at?");
19871 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(
FunctionScopes[FSIndex]);
19872 FSIndex && LSI && !LSI->AfterParameterList)
19874 assert(MaxFunctionScopesIndex <= FSIndex &&
19875 "FunctionScopeIndexToStopAt should be no greater than FSIndex into "
19876 "FunctionScopes.");
19877 while (FSIndex != MaxFunctionScopesIndex) {
19885 bool IsGlobal = !VD->hasLocalStorage();
19886 if (IsGlobal && !(
LangOpts.OpenMP &&
19887 OpenMP().isOpenMPCapturedDecl(Var,
true,
19888 MaxFunctionScopesIndex)))
19902 CaptureType = Var->
getType();
19904 bool Nested =
false;
19906 unsigned FunctionScopesIndex = MaxFunctionScopesIndex;
19911 LSI = dyn_cast_or_null<LambdaScopeInfo>(
19914 bool IsInScopeDeclarationContext =
19925 if (IsInScopeDeclarationContext &&
19926 FunctionScopesIndex == MaxFunctionScopesIndex && VarDC == DC)
19932 !IsInScopeDeclarationContext
19935 BuildAndDiagnose, *
this);
19941 FunctionScopesIndex = MaxFunctionScopesIndex - 1;
19960 if (
const auto *Parm = dyn_cast<ParmVarDecl>(Var);
19961 Parm && Parm->getDeclContext() == DC)
19969 if (BuildAndDiagnose) {
19972 Diag(ExprLoc, diag::err_lambda_impcap) << Var;
19987 if (
ParmVarDecl *PVD = dyn_cast_or_null<ParmVarDecl>(Var))
19988 QTy = PVD->getOriginalType();
19993 if (
auto *RSI = dyn_cast<CapturedRegionScopeInfo>(CSI)) {
20000 if (BuildAndDiagnose) {
20001 Diag(ExprLoc, diag::err_capture_binding_openmp) << Var;
20007 Var, RSI->OpenMPLevel, RSI->OpenMPCaptureLevel);
20012 if (IsOpenMPPrivateDecl != OMPC_unknown &&
20015 if (
ParmVarDecl *PVD = dyn_cast_or_null<ParmVarDecl>(Var))
20016 QTy = PVD->getOriginalType();
20018 E =
OpenMP().getNumberOfConstructScopes(RSI->OpenMPLevel);
20022 assert(RSI->OpenMPLevel == OuterRSI->OpenMPLevel &&
20023 "Wrong number of captured regions associated with the "
20024 "OpenMP construct.");
20029 IsOpenMPPrivateDecl != OMPC_private &&
20031 RSI->OpenMPCaptureLevel);
20035 Var, RSI->OpenMPLevel, RSI->OpenMPCaptureLevel);
20041 OpenMP().adjustOpenMPTargetScopeIndex(FunctionScopesIndex,
20044 if (IsTargetCap || IsOpenMPPrivateDecl == OMPC_private ||
20045 (IsGlobal && !IsGlobalCap)) {
20046 Nested = !IsTargetCap;
20052 CaptureType =
Context.getLValueReferenceType(DeclRefType);
20061 if (BuildAndDiagnose) {
20062 Diag(ExprLoc, diag::err_lambda_impcap) << Var;
20084 FunctionScopesIndex--;
20085 if (IsInScopeDeclarationContext)
20087 }
while (!VarDC->
Equals(DC));
20095 for (
unsigned I = ++FunctionScopesIndex, N = MaxFunctionScopesIndex + 1; I != N;
20108 if (
Invalid && !BuildAndDiagnose)
20113 DeclRefType, Nested, *
this,
Invalid);
20117 RSI, Var, ExprLoc, BuildAndDiagnose, CaptureType, DeclRefType, Nested,
20118 Kind, I == N - 1, *
this,
Invalid);
20124 DeclRefType, Nested, Kind, EllipsisLoc,
20129 if (
Invalid && !BuildAndDiagnose)
20141 DeclRefType,
nullptr);
20149 false, CaptureType, DeclRefType,
nullptr);
20153 assert(Var &&
"Null value cannot be captured");
20160 false, CaptureType, DeclRefType,
20164 return DeclRefType;
20172class CopiedTemplateArgs {
20176 template<
typename RefExpr>
20177 CopiedTemplateArgs(RefExpr *E) : HasArgs(E->hasExplicitTemplateArgs()) {
20179 E->copyTemplateArgumentsInto(TemplateArgStorage);
20182#ifdef __has_cpp_attribute
20183#if __has_cpp_attribute(clang::lifetimebound)
20184 [[clang::lifetimebound]]
20188 return HasArgs ? &TemplateArgStorage :
nullptr;
20214 auto Rebuild = [&](
Expr *Sub) {
20219 auto IsPotentialResultOdrUsed = [&](
NamedDecl *D) {
20222 auto *VD = dyn_cast<VarDecl>(D);
20245 llvm_unreachable(
"unexpected non-odr-use-reason");
20249 if (VD->getType()->isReferenceType())
20251 if (
auto *RD = VD->getType()->getAsCXXRecordDecl())
20252 if (RD->hasDefinition() && RD->hasMutableFields())
20254 if (!VD->isUsableInConstantExpressions(S.
Context))
20259 if (VD->getType()->isReferenceType())
20267 auto MaybeCUDAODRUsed = [&]() ->
bool {
20273 auto *DRE = dyn_cast<DeclRefExpr>(E);
20276 auto *VD = dyn_cast<VarDecl>(DRE->getDecl());
20283 auto MarkNotOdrUsed = [&] {
20284 if (!MaybeCUDAODRUsed()) {
20287 LSI->markVariableExprAsNonODRUsed(E);
20295 case Expr::DeclRefExprClass: {
20297 if (DRE->isNonOdrUse() || IsPotentialResultOdrUsed(DRE->getDecl()))
20303 S.
Context, DRE->getQualifierLoc(), DRE->getTemplateKeywordLoc(),
20304 DRE->getDecl(), DRE->refersToEnclosingVariableOrCapture(),
20305 DRE->getNameInfo(), DRE->getType(), DRE->getValueKind(),
20306 DRE->getFoundDecl(), CopiedTemplateArgs(DRE), NOUR);
20309 case Expr::FunctionParmPackExprClass: {
20314 if (IsPotentialResultOdrUsed(D))
20325 case Expr::ArraySubscriptExprClass: {
20331 if (!
Base.isUsable())
20333 Expr *LHS = ASE->getBase() == ASE->getLHS() ?
Base.get() : ASE->getLHS();
20334 Expr *RHS = ASE->getBase() == ASE->getRHS() ?
Base.get() : ASE->getRHS();
20337 ASE->getRBracketLoc());
20340 case Expr::MemberExprClass: {
20346 if (!
Base.isUsable())
20349 S.
Context,
Base.get(), ME->isArrow(), ME->getOperatorLoc(),
20350 ME->getQualifierLoc(), ME->getTemplateKeywordLoc(),
20351 ME->getMemberDecl(), ME->getFoundDecl(), ME->getMemberNameInfo(),
20352 CopiedTemplateArgs(ME), ME->getType(), ME->getValueKind(),
20353 ME->getObjectKind(), ME->isNonOdrUse());
20356 if (ME->getMemberDecl()->isCXXInstanceMember())
20361 if (ME->isNonOdrUse() || IsPotentialResultOdrUsed(ME->getMemberDecl()))
20367 S.
Context, ME->getBase(), ME->isArrow(), ME->getOperatorLoc(),
20368 ME->getQualifierLoc(), ME->getTemplateKeywordLoc(), ME->getMemberDecl(),
20369 ME->getFoundDecl(), ME->getMemberNameInfo(), CopiedTemplateArgs(ME),
20370 ME->getType(), ME->getValueKind(), ME->getObjectKind(), NOUR);
20373 case Expr::BinaryOperatorClass: {
20375 Expr *LHS = BO->getLHS();
20376 Expr *RHS = BO->getRHS();
20378 if (BO->getOpcode() == BO_PtrMemD) {
20380 if (!Sub.isUsable())
20382 BO->setLHS(Sub.get());
20384 }
else if (BO->getOpcode() == BO_Comma) {
20386 if (!Sub.isUsable())
20388 BO->setRHS(Sub.get());
20396 case Expr::ParenExprClass: {
20399 if (!Sub.isUsable())
20401 return S.
ActOnParenExpr(PE->getLParen(), PE->getRParen(), Sub.get());
20406 case Expr::ConditionalOperatorClass: {
20417 LHS = CO->getLHS();
20419 RHS = CO->getRHS();
20421 CO->getCond(), LHS.
get(), RHS.
get());
20426 case Expr::UnaryOperatorClass: {
20428 if (UO->getOpcode() != UO_Extension)
20431 if (!Sub.isUsable())
20433 return S.
BuildUnaryOp(
nullptr, UO->getOperatorLoc(), UO_Extension,
20440 case Expr::GenericSelectionExprClass: {
20444 bool AnyChanged =
false;
20445 for (
Expr *OrigAssocExpr : GSE->getAssocExprs()) {
20446 ExprResult AssocExpr = Rebuild(OrigAssocExpr);
20450 AssocExprs.push_back(AssocExpr.
get());
20453 AssocExprs.push_back(OrigAssocExpr);
20457 void *ExOrTy =
nullptr;
20458 bool IsExpr = GSE->isExprPredicate();
20460 ExOrTy = GSE->getControllingExpr();
20462 ExOrTy = GSE->getControllingType();
20464 GSE->getGenericLoc(), GSE->getDefaultLoc(),
20465 GSE->getRParenLoc(), IsExpr, ExOrTy,
20466 GSE->getAssocTypeSourceInfos(), AssocExprs)
20474 case Expr::ChooseExprClass: {
20485 if (!LHS.
get() && !RHS.
get())
20488 LHS = CE->getLHS();
20490 RHS = CE->getRHS();
20493 RHS.
get(), CE->getRParenLoc());
20497 case Expr::ConstantExprClass: {
20500 if (!Sub.isUsable())
20507 case Expr::ImplicitCastExprClass: {
20512 switch (ICE->getCastKind()) {
20514 case CK_DerivedToBase:
20515 case CK_UncheckedDerivedToBase: {
20516 ExprResult Sub = Rebuild(ICE->getSubExpr());
20517 if (!Sub.isUsable())
20521 ICE->getValueKind(), &Path);
20578 for (
Expr *E : LocalMaybeODRUseExprs) {
20579 if (
auto *DRE = dyn_cast<DeclRefExpr>(E)) {
20581 DRE->getLocation(), *
this);
20582 }
else if (
auto *ME = dyn_cast<MemberExpr>(E)) {
20585 }
else if (
auto *FP = dyn_cast<FunctionParmPackExpr>(E)) {
20589 llvm_unreachable(
"Unexpected expression");
20594 "MarkVarDeclODRUsed failed to cleanup MaybeODRUseExprs?");
20603 const bool RefersToEnclosingScope =
20606 if (RefersToEnclosingScope) {
20621 assert(E &&
"Capture variable should be used in an expression.");
20634 "Invalid Expr argument to DoMarkVarDeclReferenced");
20645 bool UsableInConstantExpr =
20664 bool NeededForConstantEvaluation =
20667 bool NeedDefinition =
20668 OdrUse == OdrUseContext::Used || NeededForConstantEvaluation ||
20670 Var->
getType()->isUndeducedType());
20673 "Can't instantiate a partial template specialization.");
20690 bool TryInstantiating =
20694 if (TryInstantiating) {
20697 bool FirstInstantiation = PointOfInstantiation.
isInvalid();
20698 if (FirstInstantiation) {
20699 PointOfInstantiation = Loc;
20701 MSI->setPointOfInstantiation(PointOfInstantiation);
20723 if (
auto *DRE = dyn_cast_or_null<DeclRefExpr>(E))
20724 DRE->setDecl(DRE->getDecl());
20725 else if (
auto *ME = dyn_cast_or_null<MemberExpr>(E))
20726 ME->setMemberDecl(ME->getMemberDecl());
20727 }
else if (FirstInstantiation) {
20729 .push_back(std::make_pair(Var, PointOfInstantiation));
20731 bool Inserted =
false;
20733 auto Iter = llvm::find_if(
20735 return P.first == Var;
20737 if (Iter != I.end()) {
20752 .push_back(std::make_pair(Var, PointOfInstantiation));
20776 if (
DeclRefExpr *DRE = dyn_cast_or_null<DeclRefExpr>(E))
20777 if (DRE->isNonOdrUse())
20779 if (
MemberExpr *ME = dyn_cast_or_null<MemberExpr>(E))
20780 if (ME->isNonOdrUse())
20784 case OdrUseContext::None:
20789 "missing non-odr-use marking for unevaluated decl ref");
20792 case OdrUseContext::FormallyOdrUsed:
20797 case OdrUseContext::Used:
20806 case OdrUseContext::Dependent:
20824 if (OdrUse == OdrUseContext::Used) {
20825 QualType CaptureType, DeclRefType;
20831 }
else if (OdrUse == OdrUseContext::Dependent) {
20847 auto *ID = dyn_cast<DeclRefExpr>(E);
20848 if (!ID || ID->isTypeDependent() || !ID->refersToEnclosingVariableOrCapture())
20855 auto IsDependent = [&]() {
20857 auto *LSI = dyn_cast<sema::LambdaScopeInfo>(
Scope);
20862 LSI->AfterParameterList)
20865 const auto *MD = LSI->CallOperator;
20866 if (MD->getType().isNull())
20870 if (!Ty || !MD->isExplicitObjectMemberFunction() ||
20874 if (
auto *
C = LSI->CaptureMap.count(D) ? &LSI->getCapture(D) :
nullptr) {
20875 if (
C->isCopyCapture())
20880 if (LSI->ImpCaptureStyle == LambdaScopeInfo::ImpCap_LambdaByval)
20886 ID->setCapturedByCopyInLambdaWithExplicitObjectParameter(
20892 bool MightBeOdrUse,
20900 if (
VarDecl *Var = dyn_cast<VarDecl>(D)) {
20919 const MemberExpr *ME = dyn_cast<MemberExpr>(E);
20926 bool IsVirtualCall = MD->
isVirtual() &&
20928 if (!IsVirtualCall)
20945 bool OdrUse =
true;
20947 if (
Method->isVirtual() &&
20951 if (
auto *FD = dyn_cast<FunctionDecl>(E->
getDecl())) {
20956 !FD->isDependentContext())
20970 bool MightBeOdrUse =
true;
20973 if (
Method->isPureVirtual())
20974 MightBeOdrUse =
false;
20993 bool MightBeOdrUse) {
20994 if (MightBeOdrUse) {
20995 if (
auto *VD = dyn_cast<VarDecl>(D)) {
21000 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
21026bool MarkReferencedDecls::TraverseTemplateArgument(
21027 const TemplateArgument &Arg) {
21030 EnterExpressionEvaluationContext
Evaluated(
21044 MarkReferencedDecls Marker(*
this, Loc);
21045 Marker.TraverseType(T);
21051class EvaluatedExprMarker :
public UsedDeclVisitor<EvaluatedExprMarker> {
21054 bool SkipLocalVariables;
21057 EvaluatedExprMarker(
Sema &S,
bool SkipLocalVariables,
21059 : Inherited(S), SkipLocalVariables(SkipLocalVariables), StopAt(StopAt) {}
21065 void Visit(Expr *E) {
21066 if (llvm::is_contained(StopAt, E))
21068 Inherited::Visit(E);
21071 void VisitConstantExpr(ConstantExpr *E) {
21076 void VisitDeclRefExpr(DeclRefExpr *E) {
21078 if (SkipLocalVariables) {
21079 if (VarDecl *VD = dyn_cast<VarDecl>(E->
getDecl()))
21080 if (VD->hasLocalStorage())
21090 void VisitMemberExpr(MemberExpr *E) {
21098 bool SkipLocalVariables,
21100 EvaluatedExprMarker(*
this, SkipLocalVariables, StopAt).Visit(E);
21112 (
Decl->isConstexpr() || (
Decl->isStaticDataMember() &&
21116 if (Stmts.empty()) {
21130 if (
Decl &&
Decl->isFileVarDecl()) {
21203 class CallReturnIncompleteDiagnoser :
public TypeDiagnoser {
21209 : FD(FD), CE(CE) { }
21213 S.
Diag(Loc, diag::err_call_incomplete_return)
21218 S.
Diag(Loc, diag::err_call_function_incomplete_return)
21223 } Diagnoser(FD, CE);
21236 unsigned diagnostic = diag::warn_condition_is_assignment;
21237 bool IsOrAssign =
false;
21240 if (Op->getOpcode() != BO_Assign && Op->getOpcode() != BO_OrAssign)
21243 IsOrAssign = Op->getOpcode() == BO_OrAssign;
21251 if (
ObjC().isSelfExpr(Op->getLHS()) && ME->getMethodFamily() ==
OMF_init)
21252 diagnostic = diag::warn_condition_is_idiomatic_assignment;
21256 diagnostic = diag::warn_condition_is_idiomatic_assignment;
21259 Loc = Op->getOperatorLoc();
21261 if (Op->getOperator() != OO_Equal && Op->getOperator() != OO_PipeEqual)
21264 IsOrAssign = Op->getOperator() == OO_PipeEqual;
21265 Loc = Op->getOperatorLoc();
21277 Diag(Loc, diag::note_condition_assign_silence)
21282 Diag(Loc, diag::note_condition_or_assign_to_comparison)
21285 Diag(Loc, diag::note_condition_assign_to_comparison)
21303 if (opE->getOpcode() == BO_EQ &&
21304 opE->getLHS()->IgnoreParenImpCasts()->isModifiableLvalue(
Context)
21310 Diag(Loc, diag::note_equality_comparison_silence)
21313 Diag(Loc, diag::note_equality_comparison_to_assign)
21319 bool IsConstexpr) {
21321 if (
ParenExpr *parenE = dyn_cast<ParenExpr>(E))
21341 if (!T->isScalarType()) {
21342 Diag(Loc, diag::err_typecheck_statement_requires_scalar)
21346 CheckBoolLikeConversion(E, Loc);
21375 if (
Cond.isInvalid()) {
21383 if (!
Cond.isUsable())
21393 struct RebuildUnknownAnyFunction
21394 :
StmtVisitor<RebuildUnknownAnyFunction, ExprResult> {
21398 RebuildUnknownAnyFunction(
Sema &S) : S(S) {}
21401 llvm_unreachable(
"unexpected statement!");
21412 template <
class T>
ExprResult rebuildSugarExpr(T *E) {
21413 ExprResult SubResult = Visit(E->getSubExpr());
21416 Expr *SubExpr = SubResult.
get();
21417 E->setSubExpr(SubExpr);
21418 E->setType(SubExpr->
getType());
21425 return rebuildSugarExpr(E);
21428 ExprResult VisitUnaryExtension(UnaryOperator *E) {
21429 return rebuildSugarExpr(E);
21432 ExprResult VisitUnaryAddrOf(UnaryOperator *E) {
21436 Expr *SubExpr = SubResult.
get();
21444 ExprResult resolveDecl(Expr *E, ValueDecl *VD) {
21462 ExprResult VisitDeclRefExpr(DeclRefExpr *E) {
21463 return resolveDecl(E, E->
getDecl());
21481 struct RebuildUnknownAnyExpr
21482 : StmtVisitor<RebuildUnknownAnyExpr, ExprResult> {
21489 RebuildUnknownAnyExpr(Sema &S, QualType
CastType)
21493 llvm_unreachable(
"unexpected statement!");
21503 ExprResult VisitObjCMessageExpr(ObjCMessageExpr *E);
21507 template <
class T>
ExprResult rebuildSugarExpr(T *E) {
21508 ExprResult SubResult = Visit(E->getSubExpr());
21510 Expr *SubExpr = SubResult.
get();
21511 E->setSubExpr(SubExpr);
21512 E->setType(SubExpr->
getType());
21519 return rebuildSugarExpr(E);
21522 ExprResult VisitUnaryExtension(UnaryOperator *E) {
21523 return rebuildSugarExpr(E);
21526 ExprResult VisitUnaryAddrOf(UnaryOperator *E) {
21527 const PointerType *Ptr = DestType->
getAs<PointerType>();
21552 ExprResult VisitImplicitCastExpr(ImplicitCastExpr *E);
21554 ExprResult resolveDecl(Expr *E, ValueDecl *VD);
21560 ExprResult VisitDeclRefExpr(DeclRefExpr *E) {
21561 return resolveDecl(E, E->
getDecl());
21567ExprResult RebuildUnknownAnyExpr::VisitCallExpr(CallExpr *E) {
21572 FK_FunctionPointer,
21577 QualType CalleeType = CalleeExpr->
getType();
21580 Kind = FK_MemberFunction;
21582 }
else if (
const PointerType *Ptr = CalleeType->
getAs<PointerType>()) {
21584 Kind = FK_FunctionPointer;
21587 Kind = FK_BlockPointer;
21589 const FunctionType *FnType = CalleeType->
castAs<FunctionType>();
21594 unsigned diagID = diag::err_func_returning_array_function;
21595 if (Kind == FK_BlockPointer)
21596 diagID = diag::err_block_returning_array_function;
21609 const FunctionProtoType *Proto = dyn_cast<FunctionProtoType>(FnType);
21631 SmallVector<QualType, 8> ArgTypes;
21632 if (ParamTypes.empty() && Proto->
isVariadic()) {
21634 for (
unsigned i = 0, e = E->
getNumArgs(); i != e; ++i) {
21637 ParamTypes = ArgTypes;
21648 case FK_MemberFunction:
21652 case FK_FunctionPointer:
21656 case FK_BlockPointer:
21662 ExprResult CalleeResult = Visit(CalleeExpr);
21670ExprResult RebuildUnknownAnyExpr::VisitObjCMessageExpr(ObjCMessageExpr *E) {
21673 S.
Diag(E->
getExprLoc(), diag::err_func_returning_array_function)
21681 Method->setReturnType(DestType);
21691ExprResult RebuildUnknownAnyExpr::VisitImplicitCastExpr(ImplicitCastExpr *E) {
21693 if (E->
getCastKind() == CK_FunctionToPointerDecay) {
21707 }
else if (E->
getCastKind() == CK_LValueToRValue) {
21724 llvm_unreachable(
"Unhandled cast type!");
21728ExprResult RebuildUnknownAnyExpr::resolveDecl(Expr *E, ValueDecl *VD) {
21730 QualType
Type = DestType;
21735 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(VD)) {
21736 if (
const PointerType *Ptr =
Type->getAs<PointerType>()) {
21744 if (!
Type->isFunctionType()) {
21749 if (
const FunctionProtoType *FT =
Type->getAs<FunctionProtoType>()) {
21753 QualType FDT = FD->getType();
21754 const FunctionType *FnType = FDT->
castAs<FunctionType>();
21755 const FunctionProtoType *Proto = dyn_cast_or_null<FunctionProtoType>(FnType);
21756 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E);
21757 if (DRE && Proto && Proto->getParamTypes().empty() && Proto->isVariadic()) {
21758 SourceLocation Loc = FD->getLocation();
21760 S.
Context, FD->getDeclContext(), Loc, Loc,
21761 FD->getNameInfo().getName(), DestType, FD->getTypeSourceInfo(),
21763 false , FD->hasPrototype(),
21766 if (FD->getQualifier())
21769 SmallVector<ParmVarDecl*, 16> Params;
21770 for (
const auto &AI : FT->param_types()) {
21771 ParmVarDecl *Param =
21774 Params.push_back(Param);
21776 NewFD->setParams(Params);
21782 if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD))
21783 if (MD->isInstance()) {
21794 if (
const ReferenceType *RefTy =
Type->getAs<ReferenceType>()) {
21795 Type = RefTy->getPointeeType();
21796 }
else if (
Type->isFunctionType()) {
21797 S.
Diag(E->
getExprLoc(), diag::err_unknown_any_var_function_type)
21823 diag::err_typecheck_cast_to_incomplete))
21838 return RebuildUnknownAnyExpr(*
this, ToType).Visit(E);
21845 ExplicitCastExpr *castArg = dyn_cast<ExplicitCastExpr>(arg->IgnoreParens());
21854 assert(!arg->hasPlaceholderType());
21866 unsigned diagID = diag::err_uncasted_use_of_unknown_any;
21869 if (
CallExpr *call = dyn_cast<CallExpr>(E)) {
21870 E = call->getCallee();
21871 diagID = diag::err_uncasted_call_of_unknown_any;
21879 if (
DeclRefExpr *ref = dyn_cast<DeclRefExpr>(E)) {
21880 loc = ref->getLocation();
21881 d = ref->getDecl();
21882 }
else if (
MemberExpr *mem = dyn_cast<MemberExpr>(E)) {
21883 loc = mem->getMemberLoc();
21884 d = mem->getMemberDecl();
21886 diagID = diag::err_uncasted_call_of_unknown_any;
21887 loc = msg->getSelectorStartLoc();
21888 d = msg->getMethodDecl();
21890 S.
Diag(loc, diag::err_uncasted_send_to_unknown_any_method)
21891 <<
static_cast<unsigned>(msg->isClassMessage()) << msg->getSelector()
21909 if (!placeholderType)
return E;
21911 switch (placeholderType->
getKind()) {
21912 case BuiltinType::UnresolvedTemplate: {
21925 if (
auto *TD = dyn_cast<TemplateDecl>(Temp))
21926 TN =
Context.getQualifiedTemplateName(NNS, ULE->hasTemplateKeyword(),
21931 Diag(NameInfo.
getLoc(), diag::err_template_kw_refers_to_type_template)
21932 << TN << ULE->getSourceRange() << IsTypeAliasTemplateDecl;
21934 << IsTypeAliasTemplateDecl;
21937 bool HasAnyDependentTA =
false;
21939 HasAnyDependentTA |= Arg.getArgument().
isDependent();
21951 TST =
Context.getTemplateSpecializationType(
21960 case BuiltinType::Overload: {
21980 case BuiltinType::BoundMember: {
21986 PD =
PDiag(diag::err_dtor_expr_without_call) << 1;
21987 }
else if (
const auto *ME = dyn_cast<MemberExpr>(BME)) {
21988 if (ME->getMemberNameInfo().getName().getNameKind() ==
21990 PD =
PDiag(diag::err_dtor_expr_without_call) << 0;
21998 case BuiltinType::ARCUnbridgedCast: {
22005 case BuiltinType::UnknownAny:
22009 case BuiltinType::PseudoObject:
22012 case BuiltinType::BuiltinFn: {
22017 unsigned BuiltinID = FD->getBuiltinID();
22018 if (BuiltinID == Builtin::BI__noop) {
22020 CK_BuiltinFnToFnPtr)
22027 if (
Context.BuiltinInfo.isInStdNamespace(BuiltinID)) {
22033 ? diag::err_use_of_unaddressable_function
22034 : diag::warn_cxx20_compat_use_of_unaddressable_function);
22035 if (FD->isImplicitlyInstantiable()) {
22062 case BuiltinType::IncompleteMatrixIdx: {
22068 MS->getBase(), MS->getRowIdx(), E->
getExprLoc());
22070 Diag(MS->getRowIdx()->getBeginLoc(), diag::err_matrix_incomplete_index);
22075 case BuiltinType::ArraySection:
22084 case BuiltinType::OMPArrayShaping:
22087 case BuiltinType::OMPIterator:
22091#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
22092 case BuiltinType::Id:
22093#include "clang/Basic/OpenCLImageTypes.def"
22094#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
22095 case BuiltinType::Id:
22096#include "clang/Basic/OpenCLExtensionTypes.def"
22097#define SVE_TYPE(Name, Id, SingletonId) \
22098 case BuiltinType::Id:
22099#include "clang/Basic/AArch64ACLETypes.def"
22100#define PPC_VECTOR_TYPE(Name, Id, Size) \
22101 case BuiltinType::Id:
22102#include "clang/Basic/PPCTypes.def"
22103#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
22104#include "clang/Basic/RISCVVTypes.def"
22105#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
22106#include "clang/Basic/WebAssemblyReferenceTypes.def"
22107#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
22108#include "clang/Basic/AMDGPUTypes.def"
22109#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
22110#include "clang/Basic/HLSLIntangibleTypes.def"
22111#define BUILTIN_TYPE(Id, SingletonId) case BuiltinType::Id:
22112#define PLACEHOLDER_TYPE(Id, SingletonId)
22113#include "clang/AST/BuiltinTypes.def"
22117 llvm_unreachable(
"invalid placeholder type!");
22130 if (!
Context.getLangOpts().RecoveryAST)
22136 if (T.isNull() || T->isUndeducedType() ||
22137 !
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.
Defines the classes clang::DelayedDiagnostic and clang::AccessedEntity.
Defines the clang::Expr interface and subclasses for C++ expressions.
Result
Implement __builtin_bit_cast and related operations.
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 routines for OpenCL.
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)
Designation - Represent a full designation, which is a sequence of designators.
const Designator & getDesignator(unsigned Idx) const
unsigned getNumDesignators() const
Designator - A designator in a C99 designated initializer.
bool isArrayDesignator() const
SourceLocation getEndLoc() const
Returns the end location of this designator.
bool isArrayRangeDesignator() const
bool isFieldDesignator() const
const IdentifierInfo * getFieldDecl() const
SourceLocation getBeginLoc() const
Returns the start location of this designator.
Expr * getArrayIndex() const
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 TraverseLambdaCapture(MaybeConst< LambdaExpr > *LE, const LambdaCapture *C, MaybeConst< Expr > *Init)
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.
Describes the capture of a variable or of this, or of a C++1y init-capture.
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
capture_iterator capture_begin() const
Retrieve an iterator pointing to the first lambda capture.
static LambdaExpr * Create(const ASTContext &C, CXXRecordDecl *Class, SourceRange IntroducerRange, LambdaCaptureDefault CaptureDefault, SourceLocation CaptureDefaultLoc, bool ExplicitParams, bool ExplicitResultType, ArrayRef< Expr * > CaptureInits, SourceLocation ClosingBrace, bool ContainsUnexpandedParameterPack)
Construct a new lambda expression.
SourceLocation getEndLoc() const LLVM_READONLY
bool hasExplicitParameters() const
Determine whether this lambda has an explicit parameter list vs.
SourceRange getIntroducerRange() const
Retrieve the source range covering the lambda introducer, which contains the explicit capture list su...
unsigned capture_size() const
Determine the number of captures in this lambda.
bool isInitCapture(const LambdaCapture *Capture) const
Determine whether one of this lambda's captures is an init-capture.
CXXMethodDecl * getCallOperator() const
Retrieve the function call operator associated with this lambda expression.
bool hasExplicitResultType() const
Whether this lambda had its result type explicitly specified.
capture_iterator capture_end() const
Retrieve an iterator pointing past the end of the sequence of lambda captures.
SourceLocation getCaptureDefaultLoc() const
Retrieve the location of this lambda's capture-default, if any.
llvm::iterator_range< capture_init_iterator > capture_inits()
Retrieve the initialization expressions for this lambda's captures.
capture_init_iterator capture_init_begin()
Retrieve the first initialization argument for this lambda expression (which initializes the first ca...
LambdaCaptureDefault getCaptureDefault() const
Determine the default capture kind for this lambda.
CXXRecordDecl * getLambdaClass() const
Retrieve the class that corresponds to the lambda.
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
RecordDecl * getDefinitionOrSelf() 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.
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.
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)
bool canHaveOverloadedBinOp(QualType Ty, BinaryOperatorKind Opc)
std::optional< ExprResult > tryPerformConstantBufferConversion(Expr *BaseExpr)
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.
void checkBuiltinReadImage(FunctionDecl *FDecl, CallExpr *Call)
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)
void BuildBasePathArray(const CXXBasePaths &Paths, CXXCastPath &BasePath)
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 BuildBoolLiteral(SourceLocation Loc, bool Value)
Build a boolean-typed literal expression.
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'.
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 ActOnBuiltinOffsetOf(Scope *S, SourceLocation BuiltinLoc, SourceLocation TypeLoc, ParsedType ParsedArgTy, const Designation &Desig, SourceLocation RParenLoc)
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)
ExprResult BuildBuiltinOffsetOf(SourceLocation BuiltinLoc, TypeSourceInfo *TInfo, const Designation &Desig, SourceLocation RParenLoc)
__builtin_offsetof(type, a.b[123][456].c)
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.
ExprResult ActOnIdExpression(Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, UnqualifiedId &Id, bool HasTrailingLParen, bool IsAddressOfOperand, CorrectionCandidateCallback *CCC=nullptr, bool IsInlineAsmIdentifier=false)
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.
ExprResult ActOnCXXBoolLiteral(SourceLocation OpLoc, tok::TokenKind Kind)
ActOnCXXBoolLiteral - Parse {true,false} literals.
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)
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 BuildInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList, SourceLocation RBraceLoc, bool IsExplicit)
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)
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 ...
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;
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
bool isScopedEnumeralType() const
Determine whether this type is a scoped enumeration type.
NullabilityKindOrNone getNullability() const
Determine the nullability of the given 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.
@ CallInit
Call-style initialization (C++98)
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.
OptionalUnsigned< NullabilityKind > NullabilityKindOrNone
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 DiagEmitted
Whether any diagnostic has been emitted.
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.