66#include "llvm/ADT/STLExtras.h"
67#include "llvm/ADT/StringExtras.h"
68#include "llvm/IR/DerivedTypes.h"
69#include "llvm/Support/ConvertUTF.h"
70#include "llvm/Support/SaveAndRestore.h"
71#include "llvm/Support/TimeProfiler.h"
72#include "llvm/Support/TypeSize.h"
97 if (TreatUnavailableAsInvalid &&
115 if (
const auto *A = D->
getAttr<UnusedAttr>()) {
118 if (A->getSemanticSpelling() != UnusedAttr::CXX11_maybe_unused &&
119 A->getSemanticSpelling() != UnusedAttr::C23_maybe_unused) {
121 if (DC && !DC->
hasAttr<UnusedAttr>())
122 S.
Diag(Loc, diag::warn_used_but_marked_unused) << D;
130 if (
Decl->isDefaulted()) {
141 auto *Ctor = dyn_cast<CXXConstructorDecl>(
Decl);
142 if (Ctor && Ctor->isInheritingConstructor())
153 if (I->getStorageClass() !=
SC_None)
204 DiagID = diag::warn_c2y_compat_internal_in_extern_inline;
205 else if ((UsedFn && (UsedFn->
isInlined() || UsedFn->
hasAttr<ConstAttr>())) ||
207 DiagID = diag::ext_internal_in_extern_inline_quiet;
209 DiagID = diag::ext_internal_in_extern_inline;
211 S.
Diag(Loc, DiagID) << !UsedFn << D;
223 Diag(DeclBegin, diag::note_convert_inline_to_static)
230 bool ObjCPropertyAccess,
231 bool AvoidPartialAvailabilityChecks,
233 bool SkipTrailingRequiresClause) {
240 for (
const auto &[DiagLoc, PD] : Pos->second) {
254 Diag(Loc, diag::ext_main_used);
262 Diag(Loc, diag::err_binding_cannot_appear_in_own_initializer)
265 Diag(Loc, diag::err_auto_variable_cannot_appear_in_own_initializer)
274 if (FD->isDeleted()) {
275 auto *Ctor = dyn_cast<CXXConstructorDecl>(FD);
276 if (Ctor && Ctor->isInheritingConstructor())
277 Diag(Loc, diag::err_deleted_inherited_ctor_use)
279 << Ctor->getInheritedConstructor().getConstructor()->getParent();
282 Diag(Loc, diag::err_deleted_function_use)
283 << (Msg !=
nullptr) << (Msg ? Msg->
getString() : StringRef());
297 if (!SkipTrailingRequiresClause && FD->getTrailingRequiresClause()) {
306 diag::err_reference_to_function_with_unsatisfied_constraints)
324 if (
auto *
Concept = dyn_cast<ConceptDecl>(D);
328 if (
auto *MD = dyn_cast<CXXMethodDecl>(D)) {
330 if (MD->getParent()->isLambda() &&
333 MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator())) {
334 Diag(Loc, diag::warn_cxx17_compat_lambda_def_ctor_assign)
339 auto getReferencedObjCProp = [](
const NamedDecl *D) ->
341 if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D))
342 return MD->findPropertyDecl();
356 auto *DRD = dyn_cast<OMPDeclareReductionDecl>(
CurContext);
359 Diag(Loc, diag::err_omp_wrong_var_in_declare_reduction)
372 Diag(Loc, diag::err_omp_declare_mapper_wrong_var)
378 if (
const auto *EmptyD = dyn_cast<UnresolvedUsingIfExistsDecl>(D)) {
379 Diag(Loc, diag::err_use_of_empty_using_if_exists);
380 Diag(EmptyD->getLocation(), diag::note_empty_using_if_exists_here);
385 AvoidPartialAvailabilityChecks, ClassReceiver);
391 if (D->
hasAttr<AvailableOnlyInDefaultEvalMethodAttr>()) {
394 PP.getLastFPEvalPragmaLocation().isValid() &&
395 PP.getCurrentFPEvalMethod() !=
getLangOpts().getFPEvalMethod())
397 diag::err_type_available_only_in_default_eval_method)
401 if (
auto *VD = dyn_cast<ValueDecl>(D))
406 if (!
Context.getTargetInfo().isTLSSupported())
407 if (
const auto *VD = dyn_cast<VarDecl>(D))
409 targetDiag(*Locs.begin(), diag::err_thread_unsupported);
420 const SentinelAttr *
Attr = D->
getAttr<SentinelAttr>();
425 unsigned NumFormalParams;
429 enum { CK_Function, CK_Method, CK_Block } CalleeKind;
431 if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D)) {
432 NumFormalParams = MD->param_size();
433 CalleeKind = CK_Method;
434 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
435 NumFormalParams = FD->param_size();
436 CalleeKind = CK_Function;
437 if (FD->hasCXXExplicitFunctionObjectParameter())
439 }
else if (
const auto *VD = dyn_cast<VarDecl>(D)) {
446 CalleeKind = CK_Function;
449 CalleeKind = CK_Block;
454 if (
const auto *proto = dyn_cast<FunctionProtoType>(Fn))
455 NumFormalParams = proto->getNumParams();
466 unsigned NullPos =
Attr->getNullPos();
467 assert((NullPos == 0 || NullPos == 1) &&
"invalid null position on sentinel");
468 NumFormalParams = (NullPos > NumFormalParams ? 0 : NumFormalParams - NullPos);
471 unsigned NumArgsAfterSentinel =
Attr->getSentinel();
475 if (Args.size() < NumFormalParams + NumArgsAfterSentinel + 1) {
482 const Expr *SentinelExpr = Args[Args.size() - NumArgsAfterSentinel - 1];
487 if (
Context.isSentinelNullExpr(SentinelExpr))
495 std::string NullValue;
496 if (CalleeKind == CK_Method &&
PP.isMacroDefined(
"nil"))
499 NullValue =
"nullptr";
500 else if (
PP.isMacroDefined(
"NULL"))
503 NullValue =
"(void*) 0";
506 Diag(Loc, diag::warn_missing_sentinel) <<
int(CalleeKind);
508 Diag(MissingNilLoc, diag::warn_missing_sentinel)
533 assert(!Ty.
isNull() &&
"DefaultFunctionArrayConversion - missing type");
537 if (
auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl()))
542 CK_FunctionToPointerDecay).
get();
557 CK_ArrayToPointerDecay);
573 if (UO && UO->getOpcode() == UO_Deref &&
574 UO->getSubExpr()->getType()->isPointerType()) {
576 UO->getSubExpr()->getType()->getPointeeType().getAddressSpace();
579 UO->getSubExpr()->IgnoreParenCasts()->isNullPointerConstant(
581 !UO->getType().isVolatileQualified()) {
583 S.
PDiag(diag::warn_indirection_through_null)
584 << UO->getSubExpr()->getSourceRange());
586 S.
PDiag(diag::note_indirection_through_null));
606 BaseType = BaseType->getPointeeType();
618 if (ObjectSetClass) {
662 assert(!
T.isNull() &&
"r-value conversion on typeless expression?");
666 if (
T->canDecayToPointerType())
674 (
T->isDependentType() && !
T->isAnyPointerType() &&
675 !
T->isMemberPointerType()))
699 &
Context.Idents.get(
"object_getClass"),
705 SourceRange(OISA->getOpLoc(), OISA->getIsaMemberLoc()),
")");
722 if (
T.hasQualifiers())
723 T =
T.getUnqualifiedType();
726 if (
T->isMemberPointerType() &&
727 Context.getTargetInfo().getCXXABI().isMicrosoft())
738 Cleanup.setExprNeedsCleanups(
true);
741 Cleanup.setExprNeedsCleanups(
true);
748 CastKind CK =
T->isNullPtrType() ? CK_NullToPointer : CK_LValueToRValue;
756 T =
Atomic->getValueType().getUnqualifiedType();
781 CK_FunctionToPointerDecay);
795 assert(!Ty.
isNull() &&
"UsualUnaryFPConversions - missing type");
801 PP.getLastFPEvalPragmaLocation().isValid())) {
802 switch (EvalMethod) {
804 llvm_unreachable(
"Unrecognized float evaluation method");
807 llvm_unreachable(
"Float evaluation method should be set by now");
815 CK_FloatingComplexCast)
824 CK_FloatingComplexCast)
856 assert(!Ty.
isNull() &&
"UsualUnaryConversions - missing type");
880 if (
Context.isPromotableIntegerType(Ty)) {
895 assert(!Ty.
isNull() &&
"DefaultArgumentPromotion - missing type");
907 if (BTy && (BTy->
getKind() == BuiltinType::Half ||
908 BTy->
getKind() == BuiltinType::Float)) {
911 if (BTy->
getKind() == BuiltinType::Half) {
922 Context.getTypeSizeInChars(BTy) <
928 assert(8 ==
Context.getTypeSizeInChars(
Context.LongLongTy).getQuantity() &&
929 "Unexpected typesize for LongLongTy");
983 if (
Context.getTargetInfo().getTriple().isWasm() &&
998 if (!
Record->hasNonTrivialCopyConstructor() &&
999 !
Record->hasNonTrivialMoveConstructor() &&
1000 !
Record->hasNonTrivialDestructor())
1033 PDiag(diag::warn_cxx98_compat_pass_non_pod_arg_to_vararg) << Ty << CT);
1040 PDiag(diag::warn_pass_class_arg_to_vararg)
1048 PDiag(diag::warn_cannot_pass_non_pod_arg_to_vararg)
1055 diag::err_cannot_pass_non_trivial_c_struct_to_vararg)
1059 PDiag(diag::err_cannot_pass_objc_interface_to_vararg)
1072 if (PlaceholderTy->getKind() == BuiltinType::ARCUnbridgedCast &&
1074 (FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>()))) {
1113 if (
Call.isInvalid())
1118 if (Comma.isInvalid())
1125 diag::err_call_incomplete_argument))
1143 if (SkipCast)
return false;
1150 CK_IntegralComplexToFloatingComplex);
1168 bool PromotePrecision) {
1173 if (PromotePrecision) {
1178 if (LongerIsComplex)
1190 QualType RHSType,
bool IsCompAssign) {
1215 bool ConvertFloat,
bool ConvertInt) {
1220 CK_IntegralToFloating);
1231 CK_IntegralComplexToFloatingComplex);
1236 CK_FloatingRealToComplex);
1245 QualType RHSType,
bool IsCompAssign) {
1255 else if (!IsCompAssign)
1257 return LHSFloat ? LHSType : RHSType;
1262 if (LHSFloat && RHSFloat) {
1269 assert(order < 0 &&
"illegal float comparison");
1303 QualType LHSElem = LHSComplex ? LHSComplex->getElementType() : LHSType;
1309 if ((&LHSSem != &llvm::APFloat::PPCDoubleDouble() ||
1310 &RHSSem != &llvm::APFloat::IEEEquad()) &&
1311 (&LHSSem != &llvm::APFloat::IEEEquad() ||
1312 &RHSSem != &llvm::APFloat::PPCDoubleDouble()))
1329 CK_IntegralComplexCast);
1335template <PerformCastFn doLHSCast, PerformCastFn doRHSCast>
1338 QualType RHSType,
bool IsCompAssign) {
1343 if (LHSSigned == RHSSigned) {
1346 RHS = (*doRHSCast)(S, RHS.
get(), LHSType);
1348 }
else if (!IsCompAssign)
1349 LHS = (*doLHSCast)(S, LHS.
get(), RHSType);
1351 }
else if (order != (LHSSigned ? 1 : -1)) {
1355 RHS = (*doRHSCast)(S, RHS.
get(), LHSType);
1357 }
else if (!IsCompAssign)
1358 LHS = (*doLHSCast)(S, LHS.
get(), RHSType);
1365 RHS = (*doRHSCast)(S, RHS.
get(), LHSType);
1367 }
else if (!IsCompAssign)
1368 LHS = (*doLHSCast)(S, LHS.
get(), RHSType);
1377 RHS = (*doRHSCast)(S, RHS.
get(), result);
1379 LHS = (*doLHSCast)(S, LHS.
get(), result);
1389 bool IsCompAssign) {
1393 if (LHSComplexInt && RHSComplexInt) {
1398 (S, LHS, RHS, LHSEltType, RHSEltType, IsCompAssign);
1403 if (LHSComplexInt) {
1407 (S, LHS, RHS, LHSEltType, RHSType, IsCompAssign);
1410 CK_IntegralRealToComplex);
1415 assert(RHSComplexInt);
1420 (S, LHS, RHS, LHSType, RHSEltType, IsCompAssign);
1425 CK_IntegralRealToComplex);
1433 bool IsCompAssign) {
1435 const auto *LhsOBT = LHSType->
getAs<OverflowBehaviorType>();
1436 const auto *RhsOBT = RHSType->
getAs<OverflowBehaviorType>();
1439 "Non-integer type conversion not supported for OverflowBehaviorTypes");
1442 LhsOBT && LhsOBT->getBehaviorKind() ==
1443 OverflowBehaviorType::OverflowBehaviorKind::Trap;
1445 RhsOBT && RhsOBT->getBehaviorKind() ==
1446 OverflowBehaviorType::OverflowBehaviorKind::Trap;
1448 LhsOBT && LhsOBT->getBehaviorKind() ==
1449 OverflowBehaviorType::OverflowBehaviorKind::Wrap;
1451 RhsOBT && RhsOBT->getBehaviorKind() ==
1452 OverflowBehaviorType::OverflowBehaviorKind::Wrap;
1454 QualType LHSUnderlyingType = LhsOBT ? LhsOBT->getUnderlyingType() : LHSType;
1455 QualType RHSUnderlyingType = RhsOBT ? RhsOBT->getUnderlyingType() : RHSType;
1457 std::optional<OverflowBehaviorType::OverflowBehaviorKind> DominantBehavior;
1458 if (LHSHasTrap || RHSHasTrap)
1459 DominantBehavior = OverflowBehaviorType::OverflowBehaviorKind::Trap;
1460 else if (LHSHasWrap || RHSHasWrap)
1461 DominantBehavior = OverflowBehaviorType::OverflowBehaviorKind::Wrap;
1463 QualType LHSConvType = LHSUnderlyingType;
1464 QualType RHSConvType = RHSUnderlyingType;
1465 if (DominantBehavior) {
1466 if (!LhsOBT || LhsOBT->getBehaviorKind() != *DominantBehavior)
1470 LHSConvType = LHSType;
1472 if (!RhsOBT || RhsOBT->getBehaviorKind() != *DominantBehavior)
1476 RHSConvType = RHSType;
1480 S, LHS, RHS, LHSConvType, RHSConvType, IsCompAssign);
1488 assert(BTy &&
"Expected a builtin type.");
1490 switch (BTy->getKind()) {
1491 case BuiltinType::ShortFract:
1492 case BuiltinType::UShortFract:
1493 case BuiltinType::SatShortFract:
1494 case BuiltinType::SatUShortFract:
1496 case BuiltinType::Fract:
1497 case BuiltinType::UFract:
1498 case BuiltinType::SatFract:
1499 case BuiltinType::SatUFract:
1501 case BuiltinType::LongFract:
1502 case BuiltinType::ULongFract:
1503 case BuiltinType::SatLongFract:
1504 case BuiltinType::SatULongFract:
1506 case BuiltinType::ShortAccum:
1507 case BuiltinType::UShortAccum:
1508 case BuiltinType::SatShortAccum:
1509 case BuiltinType::SatUShortAccum:
1511 case BuiltinType::Accum:
1512 case BuiltinType::UAccum:
1513 case BuiltinType::SatAccum:
1514 case BuiltinType::SatUAccum:
1516 case BuiltinType::LongAccum:
1517 case BuiltinType::ULongAccum:
1518 case BuiltinType::SatLongAccum:
1519 case BuiltinType::SatULongAccum:
1522 if (BTy->isInteger())
1524 llvm_unreachable(
"Unexpected fixed point or integer type");
1536 "Expected at least one of the operands to be a fixed point type");
1539 "Special fixed point arithmetic operation conversions are only "
1540 "applied to ints or other fixed point types");
1562 QualType ResultTy = LHSTyRank > RHSTyRank ? LHSTy : RHSTy;
1585 REnum = R->isUnscopedEnumerationType();
1587 if ((!IsCompAssign && LEnum && R->isFloatingType()) ||
1591 ? diag::warn_arith_conv_enum_float_cxx20
1592 : diag::warn_arith_conv_enum_float)
1595 }
else if (!IsCompAssign && LEnum && REnum &&
1596 !
Context.hasSameUnqualifiedType(L, R)) {
1601 DiagID = diag::warn_conv_mixed_enum_types_cxx26;
1602 else if (!L->
castAsCanonical<EnumType>()->getDecl()->hasNameForLinkage() ||
1603 !R->castAsCanonical<EnumType>()->getDecl()->hasNameForLinkage()) {
1608 ? diag::warn_arith_conv_mixed_anon_enum_types_cxx20
1609 : diag::warn_arith_conv_mixed_anon_enum_types;
1614 ? diag::warn_conditional_mixed_enum_types_cxx20
1615 : diag::warn_conditional_mixed_enum_types;
1620 ? diag::warn_comparison_mixed_enum_types_cxx20
1621 : diag::warn_comparison_mixed_enum_types;
1624 ? diag::warn_arith_conv_mixed_enum_types_cxx20
1625 : diag::warn_arith_conv_mixed_enum_types;
1628 << (int)ACK << L << R;
1646 auto IsSingleCodeUnitCP = [](
const QualType &
T,
const llvm::APSInt &
Value) {
1647 if (
T->isChar8Type())
1648 return llvm::IsSingleCodeUnitUTF8Codepoint(
Value.getExtValue());
1649 if (
T->isChar16Type())
1650 return llvm::IsSingleCodeUnitUTF16Codepoint(
Value.getExtValue());
1651 assert(
T->isChar32Type());
1652 return llvm::IsSingleCodeUnitUTF32Codepoint(
Value.getExtValue());
1665 if (LHSSuccess != RHSuccess) {
1667 if (IsSingleCodeUnitCP(LHSType, Res.
Val.
getInt()) &&
1668 IsSingleCodeUnitCP(RHSType, Res.
Val.
getInt()))
1672 if (!LHSSuccess || !RHSuccess) {
1673 SemaRef.
Diag(Loc, diag::warn_comparison_unicode_mixed_types)
1679 llvm::APSInt LHSValue(32);
1681 llvm::APSInt RHSValue(32);
1684 bool LHSSafe = IsSingleCodeUnitCP(LHSType, LHSValue);
1685 bool RHSSafe = IsSingleCodeUnitCP(RHSType, RHSValue);
1686 if (LHSSafe && RHSSafe)
1689 SemaRef.
Diag(Loc, diag::warn_comparison_unicode_mixed_types_constant)
1699 SemaRef.
Diag(Loc, diag::warn_arith_conv_mixed_unicode_types)
1733 LHSType = AtomicLHS->getValueType();
1736 if (
Context.hasSameType(LHSType, RHSType))
1737 return Context.getCommonSugaredType(LHSType, RHSType);
1745 QualType LHSUnpromotedType = LHSType;
1746 if (
Context.isPromotableIntegerType(LHSType))
1747 LHSType =
Context.getPromotedIntegerType(LHSType);
1749 if (!LHSBitfieldPromoteTy.
isNull())
1750 LHSType = LHSBitfieldPromoteTy;
1755 if (
Context.hasSameType(LHSType, RHSType))
1756 return Context.getCommonSugaredType(LHSType, RHSType);
1803 bool PredicateIsExpr,
void *ControllingExprOrType,
1805 unsigned NumAssocs = ArgTypes.size();
1806 assert(NumAssocs == ArgExprs.size());
1809 for (
unsigned i = 0; i < NumAssocs; ++i) {
1818 if (!PredicateIsExpr) {
1822 assert(ControllingType &&
"couldn't get the type out of the parser");
1823 ControllingExprOrType = ControllingType;
1827 KeyLoc, DefaultLoc, RParenLoc, PredicateIsExpr, ControllingExprOrType,
1839 const auto *TOBT =
T->getAs<OverflowBehaviorType>();
1840 const auto *UOBT =
U.getCanonicalType()->getAs<OverflowBehaviorType>();
1844 if (TOBT->getBehaviorKind() == UOBT->getBehaviorKind())
1846 UOBT->getUnderlyingType());
1858 bool PredicateIsExpr,
void *ControllingExprOrType,
1860 unsigned NumAssocs = Types.size();
1861 assert(NumAssocs == Exprs.size());
1862 assert(ControllingExprOrType &&
1863 "Must have either a controlling expression or a controlling type");
1865 Expr *ControllingExpr =
nullptr;
1867 if (PredicateIsExpr) {
1874 reinterpret_cast<Expr *
>(ControllingExprOrType));
1877 ControllingExpr = R.get();
1880 ControllingType =
reinterpret_cast<TypeSourceInfo *
>(ControllingExprOrType);
1881 if (!ControllingType)
1885 bool TypeErrorFound =
false,
1886 IsResultDependent = ControllingExpr
1889 ContainsUnexpandedParameterPack =
1899 diag::warn_side_effects_unevaluated_context);
1901 for (
unsigned i = 0; i < NumAssocs; ++i) {
1902 if (Exprs[i]->containsUnexpandedParameterPack())
1903 ContainsUnexpandedParameterPack =
true;
1906 if (Types[i]->
getType()->containsUnexpandedParameterPack())
1907 ContainsUnexpandedParameterPack =
true;
1909 if (Types[i]->
getType()->isDependentType()) {
1910 IsResultDependent =
true;
1927 if (ControllingExpr && Types[i]->
getType()->isIncompleteType())
1928 D =
LangOpts.C2y ? diag::compat_c2y_assoc_type_incomplete
1929 : diag::compat_pre_c2y_assoc_type_incomplete;
1930 else if (ControllingExpr && !Types[i]->
getType()->isObjectType())
1931 D = diag::err_assoc_type_nonobject;
1932 else if (Types[i]->
getType()->isVariablyModifiedType())
1933 D = diag::err_assoc_type_variably_modified;
1934 else if (ControllingExpr) {
1953 unsigned Reason = 0;
1962 Diag(Types[i]->getTypeLoc().getBeginLoc(),
1963 diag::warn_unreachable_association)
1964 << QT << (Reason - 1);
1968 Diag(Types[i]->getTypeLoc().getBeginLoc(), D)
1969 << Types[i]->getTypeLoc().getSourceRange() << Types[i]->getType();
1971 D, Types[i]->getTypeLoc().getBeginLoc()) >=
1973 TypeErrorFound =
true;
1978 for (
unsigned j = i+1; j < NumAssocs; ++j)
1979 if (Types[j] && !Types[j]->
getType()->isDependentType() &&
1982 Diag(Types[j]->getTypeLoc().getBeginLoc(),
1983 diag::err_assoc_compatible_types)
1984 << Types[j]->getTypeLoc().getSourceRange()
1985 << Types[j]->getType()
1986 << Types[i]->getType();
1987 Diag(Types[i]->getTypeLoc().getBeginLoc(),
1988 diag::note_compat_assoc)
1989 << Types[i]->getTypeLoc().getSourceRange()
1990 << Types[i]->getType();
1991 TypeErrorFound =
true;
2001 if (IsResultDependent) {
2002 if (ControllingExpr)
2004 Types, Exprs, DefaultLoc, RParenLoc,
2005 ContainsUnexpandedParameterPack);
2007 Exprs, DefaultLoc, RParenLoc,
2008 ContainsUnexpandedParameterPack);
2012 unsigned DefaultIndex = std::numeric_limits<unsigned>::max();
2016 for (
unsigned i = 0; i < NumAssocs; ++i) {
2024 QualType AssocQT = Types[i]->getType();
2030 CompatIndices.push_back(i);
2034 auto GetControllingRangeAndType = [](
Expr *ControllingExpr,
2038 if (ControllingExpr)
2047 return std::make_pair(SR, QT);
2053 if (CompatIndices.size() > 1) {
2054 auto P = GetControllingRangeAndType(ControllingExpr, ControllingType);
2057 << SR << P.second << (
unsigned)CompatIndices.size();
2058 for (
unsigned I : CompatIndices) {
2059 Diag(Types[I]->getTypeLoc().getBeginLoc(),
2060 diag::note_compat_assoc)
2061 << Types[I]->getTypeLoc().getSourceRange()
2062 << Types[I]->getType();
2070 if (DefaultIndex == std::numeric_limits<unsigned>::max() &&
2071 CompatIndices.size() == 0) {
2072 auto P = GetControllingRangeAndType(ControllingExpr, ControllingType);
2074 Diag(SR.
getBegin(), diag::err_generic_sel_no_match) << SR << P.second;
2083 unsigned ResultIndex =
2084 CompatIndices.size() ? CompatIndices[0] : DefaultIndex;
2086 if (ControllingExpr) {
2088 Context, KeyLoc, ControllingExpr, Types, Exprs, DefaultLoc, RParenLoc,
2089 ContainsUnexpandedParameterPack, ResultIndex);
2092 Context, KeyLoc, ControllingType, Types, Exprs, DefaultLoc, RParenLoc,
2093 ContainsUnexpandedParameterPack, ResultIndex);
2099 llvm_unreachable(
"unexpected TokenKind");
2100 case tok::kw___func__:
2102 case tok::kw___FUNCTION__:
2104 case tok::kw___FUNCDNAME__:
2106 case tok::kw___FUNCSIG__:
2108 case tok::kw_L__FUNCTION__:
2110 case tok::kw_L__FUNCSIG__:
2112 case tok::kw___PRETTY_FUNCTION__:
2123 auto tryAdjustLambdaContext = [&S, &LSI](
DeclContext *&DC) {
2128 assert(LSI != E &&
"Should be in a lambda scope info");
2129 if (dyn_cast<LambdaScopeInfo>(*LSI)->BeforeCompoundStatement)
2135 tryAdjustLambdaContext(DC);
2139 tryAdjustLambdaContext(DC);
2142 return cast_or_null<Decl>(DC);
2160 assert(Args.size() <= 2 &&
"too many arguments for literal operator");
2163 for (
unsigned ArgIdx = 0; ArgIdx != Args.size(); ++ArgIdx) {
2164 ArgTy[ArgIdx] = Args[ArgIdx]->getType();
2165 if (ArgTy[ArgIdx]->isArrayType())
2186 std::vector<Token> ExpandedToks;
2192 if (Literal.hadError)
2196 for (
const Token &
Tok : StringToks)
2197 StringTokLocs.push_back(
Tok.getLocation());
2201 false, {}, StringTokLocs);
2203 if (!Literal.getUDSuffix().empty()) {
2206 Literal.getUDSuffixOffset());
2207 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_string_udl));
2227 CurrentDecl =
Context.getTranslationUnitDecl();
2229 std::vector<Token> ExpandedToks;
2230 ExpandedToks.reserve(Toks.size());
2234 ExpandedToks.emplace_back(
Tok);
2238 Diag(
Tok.getLocation(), diag::ext_predef_outside_function);
2240 Diag(
Tok.getLocation(), diag::ext_string_literal_from_predefined)
2243 llvm::raw_svector_ostream
OS(Str);
2244 Token &Exp = ExpandedToks.emplace_back();
2246 if (
Tok.getKind() == tok::kw_L__FUNCTION__ ||
2247 Tok.getKind() == tok::kw_L__FUNCSIG__) {
2249 Exp.
setKind(tok::wide_string_literal);
2251 Exp.
setKind(tok::string_literal);
2257 PP.CreateString(
OS.str(), Exp,
Tok.getLocation(),
Tok.getEndLoc());
2259 return ExpandedToks;
2264 assert(!StringToks.empty() &&
"Must have at least one string!");
2267 std::vector<Token> ExpandedToks;
2273 if (Literal.hadError)
2277 for (
const Token &
Tok : StringToks)
2278 StringTokLocs.push_back(
Tok.getLocation());
2282 if (Literal.isWide()) {
2283 CharTy =
Context.getWideCharType();
2285 }
else if (Literal.isUTF8()) {
2289 CharTy =
Context.UnsignedCharTy;
2291 }
else if (Literal.isUTF16()) {
2294 }
else if (Literal.isUTF32()) {
2297 }
else if (Literal.isPascal()) {
2298 CharTy =
Context.UnsignedCharTy;
2310 ? diag::warn_cxx20_compat_utf8_string
2311 : diag::warn_c23_compat_utf8_string);
2317 auto RemovalDiag =
PDiag(diag::note_cxx20_c23_compat_utf8_string_remove_u8);
2319 for (
const Token &
Tok : StringToks) {
2320 if (
Tok.getKind() == tok::utf8_string_literal) {
2322 RemovalDiagLoc =
Tok.getLocation();
2329 Diag(RemovalDiagLoc, RemovalDiag);
2333 Context.getStringLiteralArrayType(CharTy, Literal.GetNumStringChars());
2337 Context, Literal.GetString(), Kind, Literal.Pascal, StrTy, StringTokLocs);
2338 if (Literal.getUDSuffix().empty())
2345 Literal.getUDSuffixOffset());
2349 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_string_udl));
2356 Context.DeclarationNames.getCXXLiteralOperatorName(UDSuffix);
2361 Context.getArrayDecayedType(StrTy), SizeType
2371 llvm::APInt Len(
Context.getIntWidth(SizeType), Literal.GetNumStringChars());
2374 Expr *Args[] = { Lit, LenArg };
2391 unsigned CharBits =
Context.getIntWidth(CharTy);
2393 llvm::APSInt
Value(CharBits, CharIsUnsigned);
2400 for (
unsigned I = 0, N = Lit->
getLength(); I != N; ++I) {
2410 llvm_unreachable(
"unexpected literal operator lookup result");
2414 llvm_unreachable(
"unexpected literal operator lookup result");
2446 auto *DRE = dyn_cast<DeclRefExpr>(VD->
getInit());
2449 auto *Referee = dyn_cast<VarDecl>(DRE->getDecl());
2450 if (!Referee || !Referee->hasGlobalStorage() ||
2451 Referee->hasAttr<CUDADeviceAttr>())
2457 auto *MD = dyn_cast_or_null<CXXMethodDecl>(S.
CurContext);
2458 if (MD && MD->getParent()->isLambda() &&
2459 MD->getOverloadedOperator() == OO_Call && MD->hasAttr<CUDADeviceAttr>() &&
2481 if (
VarDecl *VD = dyn_cast<VarDecl>(D)) {
2482 if (VD->getType()->isReferenceType() &&
2485 VD->isUsableInConstantExpressions(
Context))
2504 Context, NNS, TemplateKWLoc, D, RefersToCapturedVariable, NameInfo, Ty,
2532 const auto *FD = dyn_cast<FieldDecl>(D);
2533 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(D))
2534 FD = IFD->getAnonField();
2538 if (FD->isBitField())
2544 if (
const auto *BD = dyn_cast<BindingDecl>(D))
2545 if (
const auto *BE = BD->getBinding())
2557 if (II->hasMacroDefinition()) {
2567 std::optional<Token> NextTok =
2569 if (NextTok && NextTok->is(tok::l_paren))
2571 SemaRef.
Diag(TypoLoc,
2572 diag::err_undeclared_var_use_suggest_func_like_macro)
2575 diag::note_function_like_macro_requires_parens)
2599 NameInfo =
Context.getNameForTemplate(TName, TNameLoc);
2600 TemplateArgs = &Buffer;
2603 TemplateArgs =
nullptr;
2611 bool isDefaultArgument =
2615 const auto *CurMethod = dyn_cast<CXXMethodDecl>(
CurContext);
2616 bool isInstance = CurMethod && CurMethod->isInstance() &&
2617 R.getNamingClass() == CurMethod->getParent() &&
2625 unsigned DiagID = diag::err_found_in_dependent_base;
2626 unsigned NoteID = diag::note_member_declared_at;
2627 if (R.getRepresentativeDecl()->getDeclContext()->Equals(R.getNamingClass())) {
2628 DiagID =
getLangOpts().MSVCCompat ? diag::ext_found_later_in_class
2629 : diag::err_found_later_in_class;
2631 DiagID = diag::ext_found_in_dependent_base;
2632 NoteID = diag::note_dependent_member_use;
2637 Diag(R.getNameLoc(), DiagID)
2638 << R.getLookupName()
2644 Diag(R.getNameLoc(), DiagID) << R.getLookupName();
2648 Diag(D->getLocation(), NoteID);
2657 if (isDefaultArgument && ((*R.begin())->isCXXInstanceMember())) {
2658 Diag(R.getNameLoc(), diag::err_member_call_without_object) << 0;
2671 SourceRange NameRange = R.getLookupNameInfo().getSourceRange();
2673 unsigned diagnostic = diag::err_undeclared_var_use;
2674 unsigned diagnostic_suggest = diag::err_undeclared_var_use_suggest;
2678 diagnostic = diag::err_undeclared_use;
2679 diagnostic_suggest = diag::err_undeclared_use_suggest;
2690 if (ExplicitTemplateArgs) {
2702 R.suppressDiagnostics();
2713 R.addDecl(Best->FoundDecl.getDecl(), Best->FoundDecl.getAccess());
2728 if (S && (Corrected =
2729 CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), S, &SS,
2732 bool DroppedSpecifier =
2736 bool AcceptableWithRecovery =
false;
2737 bool AcceptableWithoutRecovery =
false;
2746 dyn_cast<FunctionTemplateDecl>(CD))
2750 else if (
FunctionDecl *FD = dyn_cast<FunctionDecl>(CD))
2751 if (!ExplicitTemplateArgs || ExplicitTemplateArgs->
size() == 0)
2757 ND = Best->FoundDecl;
2758 Corrected.setCorrectionDecl(ND);
2762 Corrected.setCorrectionDecl(ND);
2773 R.setNamingClass(
Record);
2790 AcceptableWithoutRecovery =
true;
2793 if (AcceptableWithRecovery || AcceptableWithoutRecovery) {
2795 ? diag::note_implicit_param_decl
2796 : diag::note_previous_decl;
2799 PDiag(NoteID), AcceptableWithRecovery);
2802 PDiag(diag::err_no_member_suggest)
2804 << DroppedSpecifier << NameRange,
2805 PDiag(NoteID), AcceptableWithRecovery);
2815 return !AcceptableWithRecovery;
2826 Diag(R.getNameLoc(), diag::err_no_member)
2832 Diag(R.getNameLoc(), diagnostic) << Name << NameRange;
2853 else if (
auto *MD = dyn_cast<CXXMethodDecl>(S.
CurContext))
2861 auto DB = S.
Diag(Loc, diag::ext_undeclared_unqual_id_with_dependent_base);
2862 DB << NameInfo.
getName() << RD;
2864 if (!ThisType.
isNull()) {
2867 Context,
nullptr, ThisType,
true,
2869 nullptr, NameInfo, TemplateArgs);
2885 bool IsAddressOfOperand,
2887 bool IsInlineAsmIdentifier) {
2888 assert(!(IsAddressOfOperand && HasTrailingLParen) &&
2889 "cannot be direct & operand and have a trailing lparen");
2924 if (
auto *VD = dyn_cast<ValueDecl>(R.getFoundDecl())) {
2938 if (TemplateKWLoc.
isValid() || TemplateArgs) {
2946 false, TemplateKWLoc,
2950 if (R.wasNotFoundInCurrentInstantiation() || SS.
isInvalid())
2952 IsAddressOfOperand, TemplateArgs);
2956 !IvarLookupFollowUp);
2960 if (R.wasNotFoundInCurrentInstantiation() || SS.
isInvalid())
2962 IsAddressOfOperand, TemplateArgs);
2966 if (IvarLookupFollowUp) {
2976 if (R.isAmbiguous())
2981 if (R.empty() && HasTrailingLParen && II &&
2984 if (D) R.addDecl(D);
2991 if (R.empty() && !ADL) {
2994 TemplateKWLoc, TemplateArgs))
2999 if (IsInlineAsmIdentifier)
3007 "Typo correction callback misconfigured");
3021 assert(!R.empty() &&
3022 "DiagnoseEmptyLookup returned false but added no results");
3029 ExprResult E(
ObjC().LookupInObjCMethod(R, S, Ivar->getIdentifier()));
3039 assert(!R.empty() || ADL);
3069 if (TemplateArgs || TemplateKWLoc.
isValid()) {
3078 "There should only be one declaration found.");
3093 if (R.isAmbiguous())
3096 if (R.wasNotFoundInCurrentInstantiation() || SS.
isInvalid())
3106 if (
const auto *CD = dyn_cast<CXXRecordDecl>(DC))
3107 if (CD->isInvalidDecl() || CD->isBeingDefined())
3117 if (
auto *TagD = dyn_cast<TagDecl>(TD)) {
3124 TL.setNameLoc(NameInfo.
getLoc());
3125 }
else if (
auto *TypedefD = dyn_cast<TypedefNameDecl>(TD)) {
3133 ET =
SemaRef.Context.getTypeDeclType(TD);
3141 unsigned DiagID = diag::err_typename_missing;
3143 DiagID = diag::ext_typename_missing;
3145 auto D =
Diag(Loc, DiagID);
3176 const auto *RD = dyn_cast<CXXRecordDecl>(
Member->getDeclContext());
3184 bool PointerConversions =
false;
3186 DestRecordType =
Context.getCanonicalTagType(RD);
3188 DestRecordType =
Context.getAddrSpaceQualType(
3189 DestRecordType, FromPtrType
3194 DestType =
Context.getPointerType(DestRecordType);
3196 PointerConversions =
true;
3198 DestType = DestRecordType;
3199 FromRecordType = FromType;
3201 }
else if (
const auto *
Method = dyn_cast<CXXMethodDecl>(
Member)) {
3202 if (!
Method->isImplicitObjectMemberFunction())
3205 DestType =
Method->getThisType().getNonReferenceType();
3206 DestRecordType =
Method->getFunctionObjectParameterType();
3210 PointerConversions =
true;
3212 FromRecordType = FromType;
3213 DestType = DestRecordType;
3218 if (FromAS != DestAS) {
3220 Context.removeAddrSpaceQualType(FromRecordType);
3222 Context.getAddrSpaceQualType(FromRecordTypeWithoutAS, DestAS);
3223 if (PointerConversions)
3224 FromTypeWithDestAS =
Context.getPointerType(FromTypeWithDestAS);
3238 if (
Context.hasSameUnqualifiedType(FromRecordType, DestRecordType))
3266 assert(QType->
isRecordType() &&
"lookup done with non-record type");
3276 FromLoc, FromRange, &BasePath))
3279 if (PointerConversions)
3280 QType =
Context.getPointerType(QType);
3282 VK, &BasePath).
get();
3285 FromRecordType = QRecordType;
3289 if (
Context.hasSameUnqualifiedType(FromRecordType, DestRecordType))
3296 FromLoc, FromRange, &BasePath,
3305 DestType =
Context.getQualifiedType(DestType, FromTypeQuals);
3313 bool HasTrailingLParen) {
3315 if (!HasTrailingLParen)
3333 if (D->isCXXClassMember())
3344 else if (D->getLexicalDeclContext()->isFunctionOrMethod())
3351 if (
const auto *FDecl = dyn_cast<FunctionDecl>(D)) {
3353 if (FDecl->getBuiltinID() && FDecl->isImplicit())
3368 bool AcceptInvalid) {
3393 assert(R.isSingleResult() &&
"Expected only a single result");
3394 const auto *FD = dyn_cast<FunctionDecl>(R.getFoundDecl());
3396 (FD->isCPUDispatchMultiVersion() || FD->isCPUSpecificMultiVersion());
3401 bool AcceptInvalidDecl) {
3404 if (!NeedsADL && R.isSingleResult() &&
3408 R.getRepresentativeDecl(),
nullptr,
3422 R.suppressDiagnostics();
3426 R.getLookupNameInfo(), NeedsADL, R.begin(), R.end(),
3435 bool AcceptInvalidDecl) {
3436 assert(D &&
"Cannot refer to a NULL declaration");
3438 "Cannot refer unambiguously to a function template");
3457 Diag(Loc, diag::err_ref_non_value) << D << SS.
getRange();
3472 if (VD->isInvalidDecl() && !AcceptInvalidDecl)
3478 if (
auto *IndirectField = dyn_cast<IndirectFieldDecl>(VD);
3479 IndirectField && !IndirectField->isCXXClassMember())
3491 type =
type.getNonPackExpansionType();
3495#define ABSTRACT_DECL(kind)
3496#define VALUE(type, base)
3497#define DECL(type, base) case Decl::type:
3498#include "clang/AST/DeclNodes.inc"
3499 llvm_unreachable(
"invalid value decl kind");
3502 case Decl::ObjCAtDefsField:
3503 llvm_unreachable(
"forming non-member reference to ivar?");
3507 case Decl::EnumConstant:
3508 case Decl::UnresolvedUsingValue:
3509 case Decl::OMPDeclareReduction:
3510 case Decl::OMPDeclareMapper:
3519 case Decl::IndirectField:
3520 case Decl::ObjCIvar:
3522 "building reference to field in C?");
3532 case Decl::NonTypeTemplateParm: {
3534 type = reftype->getPointeeType();
3544 if (
type->isRecordType()) {
3545 type =
type.getUnqualifiedType().withConst();
3558 case Decl::VarTemplateSpecialization:
3559 case Decl::VarTemplatePartialSpecialization:
3560 case Decl::Decomposition:
3562 case Decl::OMPCapturedExpr:
3565 type->isVoidType()) {
3571 case Decl::ImplicitParam:
3572 case Decl::ParmVar: {
3582 if (!CapturedType.
isNull())
3583 type = CapturedType;
3588 case Decl::Function: {
3590 if (!
Context.BuiltinInfo.isDirectlyAddressable(BID)) {
3627 case Decl::CXXDeductionGuide:
3628 llvm_unreachable(
"building reference to deduction guide");
3630 case Decl::MSProperty:
3632 case Decl::TemplateParamObject:
3638 case Decl::UnnamedGlobalConstant:
3642 case Decl::CXXMethod:
3647 dyn_cast<FunctionProtoType>(VD->getType()))
3648 if (proto->getReturnType() ==
Context.UnknownAnyTy) {
3661 case Decl::CXXConversion:
3662 case Decl::CXXDestructor:
3663 case Decl::CXXConstructor:
3675 if (VD->isInvalidDecl() && E)
3682 Target.resize(CharByteWidth * (Source.size() + 1));
3683 char *ResultPtr = &
Target[0];
3684 const llvm::UTF8 *ErrorPtr;
3686 llvm::ConvertUTF8toWide(CharByteWidth, Source, ResultPtr, ErrorPtr);
3696 Diag(Loc, diag::ext_predef_outside_function);
3697 currentDecl =
Context.getTranslationUnitDecl();
3707 bool ForceElaboratedPrinting =
3711 unsigned Length = Str.length();
3713 llvm::APInt LengthI(32, Length + 1);
3717 Context.adjustStringLiteralBaseType(
Context.WideCharTy.withConst());
3721 ResTy =
Context.getConstantArrayType(ResTy, LengthI,
nullptr,
3727 ResTy =
Context.adjustStringLiteralBaseType(
Context.CharTy.withConst());
3728 ResTy =
Context.getConstantArrayType(ResTy, LengthI,
nullptr,
3747 StringRef ThisTok =
PP.getSpelling(
Tok, CharBuffer, &
Invalid);
3753 if (Literal.hadError())
3757 if (Literal.isWide())
3763 else if (Literal.isUTF16())
3765 else if (Literal.isUTF32())
3774 if (Literal.isWide())
3776 else if (Literal.isUTF16())
3778 else if (Literal.isUTF32())
3780 else if (Literal.isUTF8())
3786 if (Literal.getUDSuffix().empty())
3796 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_character_udl));
3801 Lit,
Tok.getLocation());
3805 unsigned IntSize =
Context.getTargetInfo().getIntWidth();
3807 llvm::APInt(IntSize, Val,
true),
3829 using llvm::APFloat;
3830 APFloat Val(Format);
3833 if (RM == llvm::RoundingMode::Dynamic)
3834 RM = llvm::RoundingMode::NearestTiesToEven;
3835 APFloat::opStatus result = Literal.GetFloatValue(Val, RM);
3839 if ((result & APFloat::opOverflow) ||
3840 ((result & APFloat::opUnderflow) && Val.isZero())) {
3841 unsigned diagnostic;
3843 if (result & APFloat::opOverflow) {
3844 diagnostic = diag::warn_float_overflow;
3845 APFloat::getLargest(Format).toString(buffer);
3847 diagnostic = diag::warn_float_underflow;
3848 APFloat::getSmallest(Format).toString(buffer);
3851 S.
Diag(Loc, diagnostic) << Ty << buffer.str();
3854 bool isExact = (result == APFloat::opOK);
3859 assert(E &&
"Invalid expression");
3866 Diag(E->
getExprLoc(), diag::err_pragma_loop_invalid_argument_type) << QT;
3870 llvm::APSInt ValueAPS;
3881 bool ValueIsPositive =
3882 AllowZero ? ValueAPS.isNonNegative() : ValueAPS.isStrictlyPositive();
3883 if (!ValueIsPositive || ValueAPS.getActiveBits() > 31) {
3885 <<
toString(ValueAPS, 10) << ValueIsPositive;
3895 if (
Tok.getLength() == 1 ||
Tok.getKind() == tok::binary_data) {
3896 const uint8_t Val =
PP.getSpellingOfSingleCharacterNumericConstant(
Tok);
3905 SpellingBuffer.resize(
Tok.getLength() + 1);
3909 StringRef TokSpelling =
PP.getSpelling(
Tok, SpellingBuffer, &
Invalid);
3914 PP.getSourceManager(),
PP.getLangOpts(),
3915 PP.getTargetInfo(),
PP.getDiagnostics());
3916 if (Literal.hadError)
3919 if (Literal.hasUDSuffix()) {
3927 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_numeric_udl));
3930 if (Literal.isFloatingLiteral()) {
3934 CookedTy =
Context.LongDoubleTy;
3939 CookedTy =
Context.UnsignedLongLongTy;
3943 Context.DeclarationNames.getCXXLiteralOperatorName(UDSuffix);
3955 !Literal.isImaginary)) {
3964 if (Literal.isFloatingLiteral()) {
3967 llvm::APInt ResultVal(
Context.getTargetInfo().getLongLongWidth(), 0);
3968 if (Literal.GetIntegerValue(ResultVal))
3969 Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
3981 unsigned Length = Literal.getUDSuffixOffset();
3988 false, StrTy, TokLoc);
3999 bool CharIsUnsigned =
Context.CharTy->isUnsignedIntegerType();
4000 llvm::APSInt
Value(CharBits, CharIsUnsigned);
4001 for (
unsigned I = 0, N = Literal.getUDSuffixOffset(); I != N; ++I) {
4002 Value = TokSpelling[I];
4010 llvm_unreachable(
"unexpected literal operator lookup result");
4016 if (Literal.isFixedPointLiteral()) {
4019 if (Literal.isAccum) {
4020 if (Literal.isHalf) {
4022 }
else if (Literal.isLong) {
4027 }
else if (Literal.isFract) {
4028 if (Literal.isHalf) {
4030 }
else if (Literal.isLong) {
4037 if (Literal.isUnsigned) Ty =
Context.getCorrespondingUnsignedType(Ty);
4039 bool isSigned = !Literal.isUnsigned;
4040 unsigned scale =
Context.getFixedPointScale(Ty);
4041 unsigned bit_width =
Context.getTypeInfo(Ty).Width;
4043 llvm::APInt Val(bit_width, 0, isSigned);
4044 bool Overflowed = Literal.GetFixedPointValue(Val, scale);
4045 bool ValIsZero = Val.isZero() && !Overflowed;
4047 auto MaxVal =
Context.getFixedPointMax(Ty).getValue();
4048 if (Literal.isFract && Val == MaxVal + 1 && !ValIsZero)
4054 else if (Val.ugt(MaxVal) || Overflowed)
4055 Diag(
Tok.getLocation(), diag::err_too_large_for_fixed_point);
4058 Tok.getLocation(), scale);
4059 }
else if (Literal.isFloatingLiteral()) {
4061 if (Literal.isHalf){
4066 Diag(
Tok.getLocation(), diag::err_half_const_requires_fp16);
4069 }
else if (Literal.isFloat)
4071 else if (Literal.isLong)
4073 else if (Literal.isFloat16)
4075 else if (Literal.isFloat128)
4092 Diag(
Tok.getLocation(), diag::warn_double_const_requires_fp64)
4097 }
else if (!Literal.isIntegerLiteral()) {
4103 if (Literal.isSizeT) {
4107 Diag(
Tok.getLocation(), diag::err_cxx23_size_t_suffix);
4115 if (Literal.isBitInt)
4116 PP.Diag(
Tok.getLocation(),
4119 : diag::ext_c23_bitint_suffix);
4128 unsigned BitsNeeded =
Context.getTargetInfo().getIntMaxTWidth();
4129 if (Literal.isBitInt)
4130 BitsNeeded = llvm::APInt::getSufficientBitsNeeded(
4131 Literal.getLiteralDigits(), Literal.getRadix());
4132 if (Literal.MicrosoftInteger) {
4133 if (Literal.MicrosoftInteger == 128 &&
4134 !
Context.getTargetInfo().hasInt128Type())
4135 PP.Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
4136 << Literal.isUnsigned;
4137 BitsNeeded = std::max<unsigned>(BitsNeeded, Literal.MicrosoftInteger);
4140 llvm::APInt ResultVal(BitsNeeded, 0);
4142 if (Literal.GetIntegerValue(ResultVal)) {
4144 Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
4146 Ty =
Context.UnsignedLongLongTy;
4147 assert(
Context.getTypeSize(Ty) == ResultVal.getBitWidth() &&
4148 "long long is not intmax_t?");
4155 bool AllowUnsigned = Literal.isUnsigned || Literal.getRadix() != 10;
4162 Literal.isLong =
true;
4163 Literal.isLongLong =
false;
4170 if (Literal.MicrosoftInteger) {
4171 if (Literal.MicrosoftInteger == 8 && !Literal.isUnsigned) {
4175 Width = Literal.MicrosoftInteger;
4176 Ty =
Context.getIntTypeForBitwidth(Width,
4177 !Literal.isUnsigned);
4181 ResultVal = ResultVal.zextOrTrunc(Width);
4186 if (Literal.isBitInt) {
4189 Width = std::max(ResultVal.getActiveBits(), 1u) +
4190 (Literal.isUnsigned ? 0u : 1u);
4194 unsigned int MaxBitIntWidth =
4195 Context.getTargetInfo().getMaxBitIntWidth();
4196 if (Width > MaxBitIntWidth) {
4197 Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
4198 << Literal.isUnsigned;
4199 Width = MaxBitIntWidth;
4206 ResultVal = ResultVal.zextOrTrunc(Width);
4207 Ty =
Context.getBitIntType(Literal.isUnsigned, Width);
4211 if (Literal.isSizeT) {
4212 assert(!Literal.MicrosoftInteger &&
4213 "size_t literals can't be Microsoft literals");
4214 unsigned SizeTSize =
Context.getTargetInfo().getTypeWidth(
4215 Context.getTargetInfo().getSizeType());
4218 if (ResultVal.isIntN(SizeTSize)) {
4220 if (!Literal.isUnsigned && ResultVal[SizeTSize - 1] == 0)
4221 Ty =
Context.getSignedSizeType();
4222 else if (AllowUnsigned)
4228 if (Ty.
isNull() && !Literal.isLong && !Literal.isLongLong &&
4231 unsigned IntSize =
Context.getTargetInfo().getIntWidth();
4234 if (ResultVal.isIntN(IntSize)) {
4236 if (!Literal.isUnsigned && ResultVal[IntSize-1] == 0)
4238 else if (AllowUnsigned)
4245 if (Ty.
isNull() && !Literal.isLongLong && !Literal.isSizeT) {
4246 unsigned LongSize =
Context.getTargetInfo().getLongWidth();
4249 if (ResultVal.isIntN(LongSize)) {
4251 if (!Literal.isUnsigned && ResultVal[LongSize-1] == 0)
4253 else if (AllowUnsigned)
4258 const unsigned LongLongSize =
4259 Context.getTargetInfo().getLongLongWidth();
4263 ? diag::warn_old_implicitly_unsigned_long_cxx
4265 ext_old_implicitly_unsigned_long_cxx
4266 : diag::warn_old_implicitly_unsigned_long)
4267 << (LongLongSize > LongSize ? 0
4276 if (Ty.
isNull() && !Literal.isSizeT) {
4277 unsigned LongLongSize =
Context.getTargetInfo().getLongLongWidth();
4280 if (ResultVal.isIntN(LongLongSize)) {
4284 if (!Literal.isUnsigned && (ResultVal[LongLongSize-1] == 0 ||
4285 (
getLangOpts().MSVCCompat && Literal.isLongLong)))
4287 else if (AllowUnsigned)
4288 Ty =
Context.UnsignedLongLongTy;
4289 Width = LongLongSize;
4295 ? diag::warn_cxx98_compat_longlong
4296 : diag::ext_cxx11_longlong);
4298 Diag(
Tok.getLocation(), diag::ext_c99_longlong);
4306 if (Literal.isSizeT)
4307 Diag(
Tok.getLocation(), diag::err_size_t_literal_too_large)
4308 << Literal.isUnsigned;
4311 diag::ext_integer_literal_too_large_for_signed);
4312 Ty =
Context.UnsignedLongLongTy;
4313 Width =
Context.getTargetInfo().getLongLongWidth();
4316 if (ResultVal.getBitWidth() != Width)
4317 ResultVal = ResultVal.trunc(Width);
4323 if (Literal.isImaginary) {
4329 Diag(
Tok.getLocation(), diag::ext_gnu_imaginary_constant);
4331 DiagCompat(
Tok.getLocation(), diag_compat::imaginary_constant);
4337 assert(E &&
"ActOnParenExpr() missing expr");
4352 if (!(
T->isArithmeticType() ||
T->isVoidType() ||
T->isVectorType())) {
4353 S.
Diag(Loc, diag::err_vecstep_non_scalar_vector_type)
4358 assert((
T->isVoidType() || !
T->isIncompleteType()) &&
4359 "Scalar types should always be complete");
4367 if (!
T->isVectorType() && !
T->isSizelessVectorType())
4368 return S.
Diag(Loc, diag::err_builtin_non_vector_type)
4370 <<
"__builtin_vectorelements" <<
T << ArgRange;
4372 if (
auto *FD = dyn_cast<FunctionDecl>(S.
CurContext)) {
4373 if (
T->isSVESizelessBuiltinType()) {
4374 llvm::StringMap<bool> CallerFeatureMap;
4389 if (!
T->isFunctionType() && !
T->isFunctionPointerType() &&
4390 !
T->isFunctionReferenceType() && !
T->isMemberFunctionPointerType()) {
4391 S.
Diag(Loc, diag::err_ptrauth_type_disc_undiscriminated) <<
T << ArgRange;
4401 UnaryExprOrTypeTrait TraitKind) {
4407 if (TraitKind == UETT_SizeOf || TraitKind == UETT_AlignOf ||
4408 TraitKind == UETT_PreferredAlignOf) {
4411 if (
T->isFunctionType()) {
4412 S.
Diag(Loc, diag::ext_sizeof_alignof_function_type)
4419 if (
T->isVoidType()) {
4420 unsigned DiagID = S.
LangOpts.OpenCL ? diag::err_opencl_sizeof_alignof_type
4421 : diag::ext_sizeof_alignof_void_type;
4432 UnaryExprOrTypeTrait TraitKind) {
4436 S.
Diag(Loc, diag::err_sizeof_nonfragile_interface)
4437 <<
T << (TraitKind == UETT_SizeOf)
4454 const auto *ICE = dyn_cast<ImplicitCastExpr>(E);
4455 if (!ICE || ICE->getCastKind() != CK_ArrayToPointerDecay)
4458 S.
Diag(Loc, diag::warn_sizeof_array_decay) << ICE->getSourceRange()
4460 << ICE->getSubExpr()->getType();
4464 UnaryExprOrTypeTrait ExprKind) {
4468 bool IsUnevaluatedOperand =
4469 (ExprKind == UETT_SizeOf || ExprKind == UETT_DataSizeOf ||
4470 ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf ||
4471 ExprKind == UETT_VecStep || ExprKind == UETT_CountOf);
4472 if (IsUnevaluatedOperand) {
4488 Diag(E->
getExprLoc(), diag::warn_side_effects_unevaluated_context);
4490 if (ExprKind == UETT_VecStep)
4494 if (ExprKind == UETT_VectorElements)
4505 if (
Context.getTargetInfo().getTriple().isWasm() &&
4516 if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf) {
4519 diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4524 E, diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4543 if (ExprKind == UETT_CountOf) {
4548 Diag(E->
getExprLoc(), diag::err_countof_arg_not_array_type) << ExprType;
4558 if (ExprKind == UETT_SizeOf) {
4559 if (
const auto *DeclRef = dyn_cast<DeclRefExpr>(E->
IgnoreParens())) {
4560 if (
const auto *PVD = dyn_cast<ParmVarDecl>(DeclRef->getFoundDecl())) {
4561 QualType OType = PVD->getOriginalType();
4566 Diag(PVD->getLocation(), diag::note_declared_at);
4574 if (
const auto *BO = dyn_cast<BinaryOperator>(E->
IgnoreParens())) {
4591 S.
Diag(E->
getExprLoc(), diag::err_sizeof_alignof_typeof_bitfield)
4598 if (
DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Inner)) {
4600 }
else if (
MemberExpr *ME = dyn_cast<MemberExpr>(Inner)) {
4601 D = ME->getMemberDecl();
4621 if (
FieldDecl *FD = dyn_cast_or_null<FieldDecl>(D)) {
4624 if (!FD->getParent()->isCompleteDefinition()) {
4625 S.
Diag(E->
getExprLoc(), diag::err_alignof_member_of_incomplete_type)
4634 if (!FD->getType()->isReferenceType())
4653 assert(
T->isVariablyModifiedType());
4654 assert(CSI !=
nullptr);
4658 const Type *Ty =
T.getTypePtr();
4660#define TYPE(Class, Base)
4661#define ABSTRACT_TYPE(Class, Base)
4662#define NON_CANONICAL_TYPE(Class, Base)
4663#define DEPENDENT_TYPE(Class, Base) case Type::Class:
4664#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)
4665#include "clang/AST/TypeNodes.inc"
4672 case Type::ExtVector:
4673 case Type::ConstantMatrix:
4676 case Type::TemplateSpecialization:
4677 case Type::ObjCObject:
4678 case Type::ObjCInterface:
4679 case Type::ObjCObjectPointer:
4680 case Type::ObjCTypeParam:
4683 case Type::HLSLInlineSpirv:
4684 llvm_unreachable(
"type class is never variably-modified!");
4685 case Type::Adjusted:
4691 case Type::ArrayParameter:
4697 case Type::BlockPointer:
4700 case Type::LValueReference:
4701 case Type::RValueReference:
4704 case Type::MemberPointer:
4707 case Type::ConstantArray:
4708 case Type::IncompleteArray:
4712 case Type::VariableArray: {
4726 case Type::FunctionProto:
4727 case Type::FunctionNoProto:
4732 case Type::UnaryTransform:
4733 case Type::Attributed:
4734 case Type::BTFTagAttributed:
4735 case Type::OverflowBehavior:
4736 case Type::HLSLAttributedResource:
4737 case Type::SubstTemplateTypeParm:
4738 case Type::MacroQualified:
4739 case Type::CountAttributed:
4740 case Type::LateParsedAttr:
4742 T =
T.getSingleStepDesugaredType(Context);
4747 case Type::Decltype:
4750 case Type::PackIndexing:
4757 case Type::DeducedTemplateSpecialization:
4760 case Type::TypeOfExpr:
4766 case Type::PredefinedSugar:
4770 }
while (!
T.isNull() &&
T->isVariablyModifiedType());
4776 UnaryExprOrTypeTrait ExprKind,
4783 if (ExprKind == UETT_VectorElements)
4786 if (ExprKind == UETT_VecStep)
4788 if (ExprKind == UETT_PtrAuthTypeDiscriminator)
4804 if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf ||
4805 ExprKind == UETT_OpenMPRequiredSimdAlign) {
4810 DiagCompat(OpLoc, diag_compat::alignof_incomplete_array);
4811 ExprType =
Context.getBaseElementType(ExprType);
4820 OpLoc, ExprType, diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4825 Diag(OpLoc, diag::err_sizeof_alignof_function_type) << KWName << ExprRange;
4829 if (ExprKind == UETT_CountOf) {
4833 Diag(OpLoc, diag::err_countof_arg_not_array_type) << ExprType;
4840 if (
Context.getTargetInfo().getTriple().isWasm() &&
4842 Diag(OpLoc, diag::err_wasm_table_invalid_uett_operand)
4856 auto *CSI = dyn_cast<CapturingScopeInfo>(*I);
4860 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(CSI))
4861 DC = LSI->CallOperator;
4862 else if (
auto *CRSI = dyn_cast<CapturedRegionScopeInfo>(CSI))
4863 DC = CRSI->TheCapturedDecl;
4864 else if (
auto *BSI = dyn_cast<BlockScopeInfo>(CSI))
4880 UnaryExprOrTypeTrait ExprKind,
4887 if (!
T->isDependentType() &&
4896 (ExprKind == UETT_SizeOf || ExprKind == UETT_CountOf) &&
4906 ExprKind, TInfo,
Context.getSizeType(), OpLoc, R.getEnd());
4911 UnaryExprOrTypeTrait ExprKind) {
4922 }
else if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf) {
4924 }
else if (ExprKind == UETT_VecStep) {
4926 }
else if (ExprKind == UETT_OpenMPRequiredSimdAlign) {
4930 Diag(E->
getExprLoc(), diag::err_sizeof_alignof_typeof_bitfield) << 0;
4932 }
else if (ExprKind == UETT_VectorElements || ExprKind == UETT_SizeOf ||
4933 ExprKind == UETT_CountOf) {
4940 if ((ExprKind == UETT_SizeOf || ExprKind == UETT_CountOf) &&
4954 UnaryExprOrTypeTrait ExprKind,
bool IsType,
4975 UETT_AlignOf, KWName);
4988 if (
V.get()->isTypeDependent())
5000 return CT->getElementType();
5003 if (
V.get()->getType()->isArithmeticType())
5004 return V.get()->getType();
5009 if (PR.
get() !=
V.get()) {
5015 S.
Diag(Loc, diag::err_realimag_invalid_type) <<
V.get()->getType()
5016 << (IsReal ?
"__real" :
"__imag");
5027 default: llvm_unreachable(
"Unknown unary op!");
5028 case tok::plusplus: Opc = UO_PostInc;
break;
5029 case tok::minusminus: Opc = UO_PostDec;
break;
5048 !S.
LangOpts.ObjCSubscriptingLegacyRuntime)
5051 S.
Diag(opLoc, diag::err_arithmetic_nonfragile_interface)
5058 auto *BaseNoParens =
Base->IgnoreParens();
5059 if (
auto *MSProp = dyn_cast<MSPropertyRefExpr>(BaseNoParens))
5060 return MSProp->getPropertyDecl()->getType()->isArrayType();
5081 if (RTy->isIntegralOrUnscopedEnumerationType()) {
5083 Result = PT->getPointeeType();
5085 Result = AT->getElementType();
5088 Result = PT->getPointeeType();
5090 Result = AT->getElementType();
5104 if (AS->isOMPArraySection())
5120 base = result.
get();
5129 auto CheckAndReportCommaError = [&](
Expr *E) {
5130 if (ArgExprs.size() > 1 ||
5132 Diag(E->getExprLoc(), diag::err_matrix_subscript_comma)
5143 Diag(base->
getExprLoc(), diag::err_matrix_separate_incomplete_index)
5149 auto *matSubscriptE = dyn_cast<MatrixSubscriptExpr>(base);
5150 if (matSubscriptE && matSubscriptE->isIncomplete()) {
5151 if (CheckAndReportCommaError(ArgExprs.front()))
5155 matSubscriptE->getRowIdx(),
5156 ArgExprs.front(), rbLoc);
5164 CheckInvalidBuiltinCountedByRef(base,
5172 bool IsMSPropertySubscript =
false;
5175 if (!IsMSPropertySubscript) {
5179 base = result.
get();
5185 if (CheckAndReportCommaError(ArgExprs.front()))
5193 Expr *idx = ArgExprs[0];
5202 if (ArgExprs.size() == 1 &&
5203 ArgExprs[0]->getType()->isNonOverloadPlaceholderType()) {
5207 ArgExprs[0] = result.
get();
5219 base, ArgExprs.front(),
5232 if (IsMSPropertySubscript) {
5233 if (ArgExprs.size() > 1) {
5235 diag::err_ms_property_subscript_expects_single_arg);
5261 Diag(base->
getExprLoc(), diag::err_ovl_builtin_subscript_expects_single_arg)
5269 ArgExprs[0]->getType()->isRecordType())))) {
5287 return InitSeq.
Perform(*
this, Entity, Kind, E);
5301 RowIdx = RowR.
get();
5311 auto IsIndexValid = [&](
Expr *IndexExpr,
unsigned Dim,
5312 bool IsColumnIdx) ->
Expr * {
5320 if (std::optional<llvm::APSInt> Idx =
5322 if ((*Idx < 0 || *Idx >=
Dim)) {
5324 << IsColumnIdx <<
Dim;
5331 "should be able to convert any integer type to size type");
5332 return ConvExpr.
get();
5336 RowIdx = IsIndexValid(RowIdx, MTy->getNumRows(),
false);
5341 Context.getExtVectorType(MTy->getElementType(), MTy->getNumColumns());
5357 RowIdx = RowR.
get();
5361 Base, RowIdx, ColumnIdx,
Context.IncompleteMatrixIdxTy, RBLoc);
5372 ColumnIdx = ColumnR.
get();
5377 auto IsIndexValid = [&](
Expr *IndexExpr,
unsigned Dim,
5378 bool IsColumnIdx) ->
Expr * {
5386 if (std::optional<llvm::APSInt> Idx =
5388 if ((*Idx < 0 || *Idx >=
Dim)) {
5390 << IsColumnIdx <<
Dim;
5397 "should be able to convert any integer type to size type");
5398 return ConvExpr.
get();
5402 RowIdx = IsIndexValid(RowIdx, MTy->getNumRows(),
false);
5403 ColumnIdx = IsIndexValid(ColumnIdx, MTy->getNumColumns(),
true);
5404 if (!RowIdx || !ColumnIdx)
5408 MTy->getElementType(), RBLoc);
5411void Sema::CheckAddressOfNoDeref(
const Expr *E) {
5418 while ((
Member = dyn_cast<MemberExpr>(StrippedExpr)) && !
Member->isArrow())
5419 StrippedExpr =
Member->getBase()->IgnoreParenImpCasts();
5421 LastRecord.PossibleDerefs.erase(StrippedExpr);
5435 if (ResultTy->
hasAttr(attr::NoDeref)) {
5436 LastRecord.PossibleDerefs.insert(E);
5443 QualType BaseTy =
Base->getType();
5448 const MemberExpr *
Member =
nullptr;
5449 while ((
Member = dyn_cast<MemberExpr>(
Base->IgnoreParenCasts())) &&
5453 if (
const auto *Ptr = dyn_cast<PointerType>(
Base->getType())) {
5454 if (
Ptr->getPointeeType()->hasAttr(attr::NoDeref))
5455 LastRecord.PossibleDerefs.insert(E);
5471 for (
auto *Op : {LHSExp, RHSExp}) {
5472 Op = Op->IgnoreImplicit();
5473 if (Op->getType()->isArrayType() && !Op->isLValue())
5496 Expr *BaseExpr, *IndexExpr;
5514 if (!
LangOpts.isSubscriptPointerArithmetic())
5530 if (!
LangOpts.isSubscriptPointerArithmetic()) {
5531 Diag(LLoc, diag::err_subscript_nonfragile_interface)
5555 LHSExp = Materialized.
get();
5562 Qualifiers BaseQuals = BaseType.getQualifiers();
5564 Qualifiers Combined = BaseQuals + MemberQuals;
5565 if (Combined != MemberQuals)
5566 ResultType =
Context.getQualifiedType(ResultType, Combined);
5576 CK_ArrayToPointerDecay).
get();
5582 }
else if (RHSTy->isArrayType()) {
5587 CK_ArrayToPointerDecay).
get();
5594 return ExprError(
Diag(LLoc, diag::err_typecheck_subscript_value)
5599 return ExprError(
Diag(LLoc, diag::err_typecheck_subscript_not_integer)
5605 std::optional<llvm::APSInt> IntegerContantExpr =
5607 if (!IntegerContantExpr.has_value() ||
5608 IntegerContantExpr.value().isNegative())
5624 Diag(LLoc, diag::ext_gnu_subscript_void_type)
5635 diag::err_subscript_incomplete_or_sizeless_type, BaseExpr))
5648 auto *CSI = dyn_cast<CapturingScopeInfo>(*I);
5652 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(CSI))
5653 DC = LSI->CallOperator;
5654 else if (
auto *CRSI = dyn_cast<CapturedRegionScopeInfo>(CSI))
5655 DC = CRSI->TheCapturedDecl;
5656 else if (
auto *BSI = dyn_cast<BlockScopeInfo>(CSI))
5674 bool SkipImmediateInvocations) {
5675 if (Param->hasUnparsedDefaultArg()) {
5676 assert(!RewrittenInit &&
"Should not have a rewritten init expression yet");
5680 Diag(Param->getBeginLoc(), diag::err_recursive_default_argument) << FD;
5681 Diag(CallLoc, diag::note_recursive_default_argument_used_here);
5682 Param->setInvalidDecl();
5686 Diag(CallLoc, diag::err_use_of_default_argument_to_function_declared_later)
5689 diag::note_default_argument_declared_here);
5693 if (Param->hasUninstantiatedDefaultArg()) {
5694 assert(!RewrittenInit &&
"Should not have a rewitten init expression yet");
5699 Expr *
Init = RewrittenInit ? RewrittenInit : Param->getInit();
5700 assert(
Init &&
"default argument but no initializer?");
5709 if (
auto *InitWithCleanup = dyn_cast<ExprWithCleanups>(
Init)) {
5712 Cleanup.setExprNeedsCleanups(InitWithCleanup->cleanupsHaveSideEffects());
5716 assert(!InitWithCleanup->getNumObjects() &&
5717 "default argument expression has capturing blocks?");
5730 SkipImmediateInvocations;
5818 if (!
SemaRef.CurrentInstantiationScope ||
5830 assert(Param->hasDefaultArg() &&
"can't build nonexistent default arg");
5834 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
5835 InitializationContext =
5837 if (!InitializationContext.has_value())
5838 InitializationContext.emplace(CallLoc, Param,
CurContext);
5840 if (!
Init && !Param->hasUnparsedDefaultArg()) {
5855 if (Param->hasUninstantiatedDefaultArg()) {
5864 if (!NestedDefaultChecking)
5865 V.TraverseDecl(Param);
5869 if (
V.HasImmediateCalls ||
5870 (NeedRebuild && isa_and_present<ExprWithCleanups>(Param->getInit()))) {
5871 if (
V.HasImmediateCalls)
5881 Res = Immediate.TransformInitializer(Param->getInit(),
5895 CallLoc, FD, Param,
Init,
5896 NestedDefaultChecking))
5900 Init, InitializationContext->Context);
5910 ClassPattern->
lookup(Field->getDeclName());
5911 auto Rng = llvm::make_filter_range(
5924 bool NestedDefaultChecking,
5928 if (!
Field->getInClassInitializer() &&
5932 FieldDecl *Pattern =
5934 assert(Pattern &&
"We must have set the Pattern!");
5941 Expr *InClassInit =
Field->getInClassInitializer();
5957 RecordDecl *OutermostClass = ParentRD->getOuterLexicalRecordContext();
5958 Diag(Loc, diag::err_default_member_initializer_not_yet_parsed)
5959 << OutermostClass <<
Field;
5961 diag::note_default_member_initializer_not_yet_parsed);
5964 Field->setInvalidDecl();
5974 if (!NestedDefaultChecking)
5975 V.TraverseDecl(Field);
5985 Expr *
Init = InClassInit;
5987 (
V.HasImmediateCalls || (NeedRebuild && ContainsAnyTemporaries))) {
5991 NestedDefaultChecking;
5997 EnsureImmediateInvocationInDefaultArgs
Immediate(*
this);
6000 Res =
Immediate.TransformInitializer(InClassInit,
6006 Field->setInvalidDecl();
6012 if (!NestedDefaultChecking)
6021 assert(Field->hasInClassInitializer());
6049 NestedDefaultChecking,
false);
6050 if (
Init.isInvalid())
6054 if (
Init.isInvalid()) {
6055 Field->setInvalidDecl();
6060 Context, InitContext->Loc, Field, InitContext->Context,
6061 Init.get() == Field->getInClassInitializer() ?
nullptr :
Init.get());
6067 assert(Field->hasInClassInitializer());
6099 Loc, Field, MemberEntity, NestedDefaultChecking,
true);
6100 if (
Init.isInvalid())
6110 Context, InitContext->Loc, Field, InitContext->Context,
6111 Init.get() == Field->getInClassInitializer() ?
nullptr :
Init.get());
6118 if (isa_and_nonnull<CXXConstructorDecl>(FDecl))
6120 else if (Fn && Fn->getType()->isBlockPointerType())
6124 if (
Method->isInstance())
6126 }
else if (Fn && Fn->getType() ==
Context.BoundMemberTy)
6139 FunctionName(FuncName) {}
6141 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
6150 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
6151 return std::make_unique<FunctionCallCCC>(*
this);
6155 const IdentifierInfo *
const FunctionName;
6171 if (
NamedDecl *ND = Corrected.getFoundDecl()) {
6172 if (Corrected.isOverloaded()) {
6182 ND = Best->FoundDecl;
6183 Corrected.setCorrectionDecl(ND);
6189 ND = ND->getUnderlyingDecl();
6204 Fn = Fn->IgnoreParens();
6206 auto *UO = dyn_cast<UnaryOperator>(Fn);
6207 if (!UO || UO->getOpcode() != clang::UO_AddrOf)
6209 if (
auto *DRE = dyn_cast<DeclRefExpr>(UO->getSubExpr()->IgnoreParens())) {
6210 return DRE->hasQualifier();
6212 if (
auto *OVL = dyn_cast<OverloadExpr>(UO->getSubExpr()->IgnoreParens()))
6213 return bool(OVL->getQualifier());
6223 bool IsExecConfig) {
6231 if (
Context.BuiltinInfo.hasCustomTypechecking(ID) &&
6232 !(
Context.getLangOpts().HLSL && FDecl->
hasAttr<BuiltinAliasAttr>()))
6239 bool HasExplicitObjectParameter =
6241 unsigned ExplicitObjectParameterOffset = HasExplicitObjectParameter ? 1 : 0;
6245 unsigned FnKind = Fn->getType()->isBlockPointerType()
6252 if (Args.size() < NumParams) {
6253 if (Args.size() < MinArgs) {
6258 ? diag::err_typecheck_call_too_few_args_suggest
6259 : diag::err_typecheck_call_too_few_args_at_least_suggest;
6262 << FnKind << MinArgs - ExplicitObjectParameterOffset
6263 <<
static_cast<unsigned>(Args.size()) -
6264 ExplicitObjectParameterOffset
6266 }
else if (MinArgs - ExplicitObjectParameterOffset == 1 && FDecl &&
6271 ? diag::err_typecheck_call_too_few_args_one
6272 : diag::err_typecheck_call_too_few_args_at_least_one)
6273 << FnKind << FDecl->
getParamDecl(ExplicitObjectParameterOffset)
6274 << HasExplicitObjectParameter << Fn->getSourceRange();
6277 ? diag::err_typecheck_call_too_few_args
6278 : diag::err_typecheck_call_too_few_args_at_least)
6279 << FnKind << MinArgs - ExplicitObjectParameterOffset
6280 <<
static_cast<unsigned>(Args.size()) -
6281 ExplicitObjectParameterOffset
6282 << HasExplicitObjectParameter << Fn->getSourceRange();
6285 if (!TC && FDecl && !FDecl->
getBuiltinID() && !IsExecConfig)
6293 assert((
Call->getNumArgs() == NumParams) &&
6294 "We should have reserved space for the default arguments before!");
6299 if (Args.size() > NumParams) {
6305 ? diag::err_typecheck_call_too_many_args_suggest
6306 : diag::err_typecheck_call_too_many_args_at_most_suggest;
6309 << FnKind << NumParams - ExplicitObjectParameterOffset
6310 <<
static_cast<unsigned>(Args.size()) -
6311 ExplicitObjectParameterOffset
6313 }
else if (NumParams - ExplicitObjectParameterOffset == 1 && FDecl &&
6316 Diag(Args[NumParams]->getBeginLoc(),
6317 MinArgs == NumParams
6318 ? diag::err_typecheck_call_too_many_args_one
6319 : diag::err_typecheck_call_too_many_args_at_most_one)
6320 << FnKind << FDecl->
getParamDecl(ExplicitObjectParameterOffset)
6321 <<
static_cast<unsigned>(Args.size()) -
6322 ExplicitObjectParameterOffset
6323 << HasExplicitObjectParameter << Fn->getSourceRange()
6325 Args.back()->getEndLoc());
6327 Diag(Args[NumParams]->getBeginLoc(),
6328 MinArgs == NumParams
6329 ? diag::err_typecheck_call_too_many_args
6330 : diag::err_typecheck_call_too_many_args_at_most)
6331 << FnKind << NumParams - ExplicitObjectParameterOffset
6332 <<
static_cast<unsigned>(Args.size()) -
6333 ExplicitObjectParameterOffset
6334 << HasExplicitObjectParameter << Fn->getSourceRange()
6336 Args.back()->getEndLoc());
6339 if (!TC && FDecl && !FDecl->
getBuiltinID() && !IsExecConfig)
6344 Call->shrinkNumArgs(NumParams);
6355 unsigned TotalNumArgs = AllArgs.size();
6356 for (
unsigned i = 0; i < TotalNumArgs; ++i)
6357 Call->setArg(i, AllArgs[i]);
6359 Call->computeDependence();
6368 bool IsListInitialization) {
6373 for (
unsigned i = FirstParam; i < NumParams; i++) {
6378 if (ArgIx < Args.size()) {
6379 Arg = Args[ArgIx++];
6382 diag::err_call_incomplete_argument, Arg))
6386 bool CFAudited =
false;
6388 FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>() &&
6389 (!Param || !Param->hasAttr<CFConsumedAttr>()))
6392 FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>() &&
6393 (!Param || !Param->hasAttr<CFConsumedAttr>()))
6399 BE->getBlockDecl()->setDoesNotEscape();
6420 if (
const auto *OBT = Arg->
getType()->
getAs<OverflowBehaviorType>();
6423 OBT->isUnsignedIntegerOrEnumerationType() && OBT->isWrapKind();
6425 isPedantic ? diag::warn_obt_discarded_at_function_boundary_pedantic
6426 : diag::warn_obt_discarded_at_function_boundary)
6427 << Arg->
getType() << ProtoArgType;
6431 Entity,
SourceLocation(), Arg, IsListInitialization, AllowExplicit);
6437 assert(Param &&
"can't use default arguments without a known callee");
6449 CheckArrayAccess(Arg);
6454 AllArgs.push_back(Arg);
6463 for (
Expr *A : Args.slice(ArgIx)) {
6467 AllArgs.push_back(arg.get());
6472 for (
Expr *A : Args.slice(ArgIx)) {
6475 AllArgs.push_back(Arg.
get());
6480 for (
Expr *A : Args.slice(ArgIx))
6481 CheckArrayAccess(A);
6489 TL = DTL.getOriginalLoc();
6492 << ATL.getLocalSourceRange();
6498 const Expr *ArgExpr) {
6503 QualType OrigTy = Param->getOriginalType();
6528 Diag(CallLoc, diag::warn_static_array_too_small)
6536 std::optional<CharUnits> ArgSize =
6538 std::optional<CharUnits> ParmSize =
6540 if (ArgSize && ParmSize && *ArgSize < *ParmSize) {
6541 Diag(CallLoc, diag::warn_static_array_too_small)
6543 << (
unsigned)ParmSize->getQuantity() << 1;
6557 if (!placeholder)
return false;
6559 switch (placeholder->
getKind()) {
6561#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
6562 case BuiltinType::Id:
6563#include "clang/Basic/OpenCLImageTypes.def"
6564#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
6565 case BuiltinType::Id:
6566#include "clang/Basic/OpenCLExtensionTypes.def"
6569#define SVE_TYPE(Name, Id, SingletonId) \
6570 case BuiltinType::Id:
6571#include "clang/Basic/AArch64ACLETypes.def"
6572#define PPC_VECTOR_TYPE(Name, Id, Size) \
6573 case BuiltinType::Id:
6574#include "clang/Basic/PPCTypes.def"
6575#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6576#include "clang/Basic/RISCVVTypes.def"
6577#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6578#include "clang/Basic/WebAssemblyReferenceTypes.def"
6579#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
6580#include "clang/Basic/AMDGPUTypes.def"
6581#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6582#include "clang/Basic/HLSLIntangibleTypes.def"
6583#define SPIRV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6584#include "clang/Basic/SPIRVTypes.def"
6585#define PLACEHOLDER_TYPE(ID, SINGLETON_ID)
6586#define BUILTIN_TYPE(ID, SINGLETON_ID) case BuiltinType::ID:
6587#include "clang/AST/BuiltinTypes.def"
6590 case BuiltinType::UnresolvedTemplate:
6593 case BuiltinType::Overload:
6598 case BuiltinType::ARCUnbridgedCast:
6602 case BuiltinType::PseudoObject:
6607 case BuiltinType::UnknownAny:
6611 case BuiltinType::BoundMember:
6612 case BuiltinType::BuiltinFn:
6613 case BuiltinType::IncompleteMatrixIdx:
6614 case BuiltinType::ArraySection:
6615 case BuiltinType::OMPArrayShaping:
6616 case BuiltinType::OMPIterator:
6620 llvm_unreachable(
"bad builtin type kind");
6626 bool hasInvalid =
false;
6627 for (
size_t i = 0, e = args.size(); i != e; i++) {
6630 if (result.
isInvalid()) hasInvalid =
true;
6631 else args[i] = result.
get();
6655 if (!Context.BuiltinInfo.hasPtrArgsOrResult(FDecl->
getBuiltinID()) || !FT ||
6659 bool NeedsNewDecl =
false;
6679 if (!ParamType->isPointerType() ||
6680 ParamType->getPointeeType().hasAddressSpace() ||
6681 !ArgType->isPointerType() ||
6682 !ArgType->getPointeeType().hasAddressSpace() ||
6684 OverloadParams.push_back(ParamType);
6689 NeedsNewDecl =
true;
6690 LangAS AS = ArgType->getPointeeType().getAddressSpace();
6692 PointeeType = Context.getAddrSpaceQualType(PointeeType, AS);
6693 OverloadParams.push_back(Context.getPointerType(PointeeType));
6703 OverloadParams, EPI);
6713 for (
unsigned i = 0, e = FT->
getNumParams(); i != e; ++i) {
6720 Params.push_back(Parm);
6722 OverloadDecl->setParams(Params);
6726 if (FDecl->
hasAttr<CUDAHostAttr>())
6727 OverloadDecl->
addAttr(CUDAHostAttr::CreateImplicit(Context));
6728 if (FDecl->
hasAttr<CUDADeviceAttr>())
6729 OverloadDecl->
addAttr(CUDADeviceAttr::CreateImplicit(Context));
6732 return OverloadDecl;
6743 !Callee->isVariadic())
6745 if (Callee->getMinRequiredArguments() > ArgExprs.size())
6748 if (
const EnableIfAttr *
Attr =
6749 S.
CheckEnableIf(Callee, Fn->getBeginLoc(), ArgExprs,
true)) {
6750 S.
Diag(Fn->getBeginLoc(),
6752 ? diag::err_ovl_no_viable_member_function_in_call
6753 : diag::err_ovl_no_viable_function_in_call)
6754 << Callee << Callee->getSourceRange();
6755 S.
Diag(Callee->getLocation(),
6756 diag::note_ovl_candidate_disabled_by_function_cond_attr)
6757 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
6765 const auto GetFunctionLevelDCIfCXXClass =
6773 if (
const auto *MD = dyn_cast<CXXMethodDecl>(DC))
6774 return MD->
getParent()->getCanonicalDecl();
6777 if (
const auto *RD = dyn_cast<CXXRecordDecl>(DC))
6778 return RD->getCanonicalDecl();
6785 const CXXRecordDecl *
const CurParentClass = GetFunctionLevelDCIfCXXClass(S);
6786 if (!CurParentClass)
6793 assert(NamingClass &&
"Must have naming class even for implicit access");
6799 return CurParentClass == NamingClass ||
6848 if (
Call->getNumArgs() != 1)
6851 const Expr *E =
Call->getCallee()->IgnoreParenImpCasts();
6854 const DeclRefExpr *DRE = dyn_cast_if_present<DeclRefExpr>(E);
6867 if (BuiltinID != Builtin::BImove && BuiltinID != Builtin::BIforward)
6870 S.
Diag(DRE->
getLocation(), diag::warn_unqualified_call_to_std_cast_function)
6881 if (
Call.isInvalid())
6886 if (
const auto *ULE = dyn_cast<UnresolvedLookupExpr>(Fn);
6887 ULE && ULE->hasExplicitTemplateArgs() && ULE->decls().empty()) {
6888 DiagCompat(Fn->getExprLoc(), diag_compat::adl_only_template_id)
6896 if (
const auto *CE = dyn_cast<CallExpr>(
Call.get()))
6902 if (
auto *DRE = dyn_cast<DeclRefExpr>(Fn->IgnoreParens());
6903 DRE &&
Call.get()->isValueDependent()) {
6913 if (
T->isDependentType())
6916 if (
T == Context.BoundMemberTy ||
T == Context.UnknownAnyTy ||
6917 T == Context.BuiltinFnTy ||
T == Context.OverloadTy ||
6918 T->isFunctionType() ||
T->isFunctionReferenceType() ||
6919 T->isMemberFunctionPointerType() ||
T->isFunctionPointerType() ||
6920 T->isBlockPointerType() ||
T->isRecordType() ||
T->isUndeducedType())
6929 Expr *ExecConfig,
bool IsExecConfig,
6930 bool AllowRecovery) {
6939 if (Fn->getType() ==
Context.BuiltinFnTy && ArgExprs.size() == 1 &&
6940 ArgExprs[0]->getType() ==
Context.BuiltinFnTy) {
6943 if (FD->getName() ==
"__builtin_amdgcn_is_invocable") {
6957 for (
const Expr *Arg : ArgExprs)
6958 if (CheckInvalidBuiltinCountedByRef(Arg,
6965 if (!ArgExprs.empty()) {
6967 Diag(Fn->getBeginLoc(), diag::err_pseudo_dtor_call_with_args)
6970 ArgExprs.back()->getEndLoc()));
6976 if (Fn->getType() ==
Context.PseudoObjectTy) {
6993 *
this, dyn_cast<UnresolvedMemberExpr>(Fn->IgnoreParens()),
7001 Diag(LParenLoc, diag::err_typecheck_call_not_function)
7002 << Fn->getType() << Fn->getSourceRange());
7010 if (Fn->getType()->isRecordType())
7014 if (Fn->getType() ==
Context.UnknownAnyTy) {
7020 if (Fn->getType() ==
Context.BoundMemberTy) {
7022 RParenLoc, ExecConfig, IsExecConfig,
7028 if (Fn->getType() ==
Context.OverloadTy) {
7039 Scope, Fn, ULE, LParenLoc, ArgExprs, RParenLoc, ExecConfig,
7042 RParenLoc, ExecConfig, IsExecConfig,
7048 if (Fn->getType() ==
Context.UnknownAnyTy) {
7054 Expr *NakedFn = Fn->IgnoreParens();
7056 bool CallingNDeclIndirectly =
false;
7058 if (
UnaryOperator *UnOp = dyn_cast<UnaryOperator>(NakedFn)) {
7059 if (UnOp->getOpcode() == UO_AddrOf) {
7060 CallingNDeclIndirectly =
true;
7065 if (
auto *DRE = dyn_cast<DeclRefExpr>(NakedFn)) {
7066 NDecl = DRE->getDecl();
7070 const llvm::Triple &Triple =
Context.getTargetInfo().getTriple();
7071 if (Triple.isSPIRV() && Triple.getVendor() == llvm::Triple::AMD) {
7088 Fn->getValueKind(), FDecl,
nullptr, DRE->isNonOdrUse());
7091 }
else if (
auto *ME = dyn_cast<MemberExpr>(NakedFn))
7092 NDecl = ME->getMemberDecl();
7094 if (
FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(NDecl)) {
7096 FD,
true, Fn->getBeginLoc()))
7108 for (
unsigned Idx = 0; Idx < ArgExprs.size() && Idx < FD->param_size();
7111 if (!ArgExprs[Idx] || !Param || !Param->getType()->isPointerType() ||
7112 !ArgExprs[Idx]->getType()->isPointerType())
7116 auto ArgTy = ArgExprs[Idx]->getType();
7117 auto ArgPtTy = ArgTy->getPointeeType();
7118 auto ArgAS = ArgPtTy.getAddressSpace();
7121 bool NeedImplicitASC =
7126 if (!NeedImplicitASC)
7130 if (ArgExprs[Idx]->isGLValue()) {
7134 ArgExprs[Idx] = Res.
get();
7138 Qualifiers ArgPtQuals = ArgPtTy.getQualifiers();
7141 Context.getQualifiedType(ArgPtTy.getUnqualifiedType(), ArgPtQuals);
7144 ArgTy.getQualifiers());
7148 CK_AddressSpaceConversion)
7154 if (
Context.isDependenceAllowed() &&
7157 assert((Fn->containsErrors() ||
7158 llvm::any_of(ArgExprs,
7159 [](
clang::Expr *E) { return E->containsErrors(); })) &&
7160 "should only occur in error-recovery path.");
7165 ExecConfig, IsExecConfig);
7170 std::string Name =
Context.BuiltinInfo.getName(Id);
7176 assert(BuiltInDecl &&
"failed to find builtin declaration");
7180 assert(DeclRef.
isUsable() &&
"Builtin reference cannot fail");
7185 assert(!
Call.isInvalid() &&
"Call to builtin cannot fail!");
7205 Diag(BuiltinLoc, diag::err_invalid_astype_of_different_size)
7223 FunctionDecl *FDecl = dyn_cast_or_null<FunctionDecl>(NDecl);
7224 unsigned BuiltinID = (FDecl ? FDecl->
getBuiltinID() : 0);
7227 switch (BuiltinID) {
7228 case Builtin::BI__builtin_longjmp:
7229 case Builtin::BI__builtin_setjmp:
7230 case Builtin::BI__sigsetjmp:
7231 case Builtin::BI_longjmp:
7232 case Builtin::BI_setjmp:
7233 case Builtin::BIlongjmp:
7234 case Builtin::BIsetjmp:
7235 case Builtin::BIsiglongjmp:
7236 case Builtin::BIsigsetjmp:
7249 if (DeferParent->
Contains(*CurScope) &&
7251 Diag(Fn->getExprLoc(), diag::err_defer_invalid_sjlj) << FDecl;
7256 if (FDecl->
hasAttr<AnyX86InterruptAttr>()) {
7257 Diag(Fn->getExprLoc(), diag::err_anyx86_interrupt_called);
7260 if (FDecl->
hasAttr<ARMInterruptAttr>()) {
7261 Diag(Fn->getExprLoc(), diag::err_arm_interrupt_called);
7270 if (Caller->hasAttr<AnyX86InterruptAttr>() ||
7271 Caller->hasAttr<AnyX86NoCallerSavedRegistersAttr>()) {
7273 bool HasNonGPRRegisters =
7275 if (HasNonGPRRegisters &&
7276 (!FDecl || !FDecl->
hasAttr<AnyX86NoCallerSavedRegistersAttr>())) {
7277 Diag(Fn->getExprLoc(), diag::warn_anyx86_excessive_regsave)
7278 << (Caller->hasAttr<AnyX86InterruptAttr>() ? 0 : 1);
7297 Fn->getType()->isSpecificBuiltinType(BuiltinType::BuiltinFn)) {
7313 if (!BuiltinID || !
Context.BuiltinInfo.hasCustomTypechecking(BuiltinID)) {
7320 return ExprError(
Diag(LParenLoc, diag::err_typecheck_call_not_function)
7321 << Fn->getType() << Fn->getSourceRange());
7327 if (Fn->getType() ==
Context.UnknownAnyTy) {
7335 return ExprError(
Diag(LParenLoc, diag::err_typecheck_call_not_function)
7336 << Fn->getType() << Fn->getSourceRange());
7343 const auto *Proto = dyn_cast_or_null<FunctionProtoType>(FuncT);
7344 unsigned NumParams = Proto ? Proto->getNumParams() : 0;
7348 assert(UsesADL == ADLCallKind::NotADL &&
7349 "CUDAKernelCallExpr should not use ADL");
7360 if (BuiltinID &&
Context.BuiltinInfo.hasCustomTypechecking(BuiltinID)) {
7373 ExprResult E = CheckBuiltinFunctionCall(FDecl, BuiltinID, TheCall);
7382 if (FDecl && !FDecl->
hasAttr<CUDAGlobalAttr>())
7383 return ExprError(
Diag(LParenLoc,diag::err_kern_call_not_global_function)
7384 << FDecl << Fn->getSourceRange());
7390 return ExprError(
Diag(LParenLoc, diag::err_kern_type_not_void_return)
7391 << Fn->getType() << Fn->getSourceRange());
7394 if (FDecl && FDecl->
hasAttr<CUDAGlobalAttr>())
7395 return ExprError(
Diag(LParenLoc, diag::err_global_call_not_config)
7396 << FDecl << Fn->getSourceRange());
7410 if (
Context.getTargetInfo().getTriple().isWasm()) {
7411 for (
const Expr *Arg : Args) {
7412 if (Arg && Arg->getType()->isWebAssemblyTableType()) {
7414 diag::err_wasm_table_as_function_parameter));
7438 if (!Proto || !(Proto->isVariadic() && Args.size() >= Def->
param_size()))
7439 Diag(RParenLoc, diag::warn_call_wrong_number_of_arguments)
7440 << (Args.size() > Def->
param_size()) << FDecl << Fn->getSourceRange();
7459 if (!Proto && !Args.empty() &&
7461 !
Diags.isIgnored(diag::warn_strict_uses_without_prototype,
7463 Diag(LParenLoc, diag::warn_strict_uses_without_prototype)
7464 << (FDecl !=
nullptr) << FDecl;
7467 for (
unsigned i = 0, e = Args.size(); i != e; i++) {
7468 Expr *Arg = Args[i];
7470 if (Proto && i < Proto->getNumParams()) {
7472 Context, Proto->getParamType(i), Proto->isParamConsumed(i));
7490 diag::err_call_incomplete_argument, Arg))
7499 if (
Method->isImplicitObjectMemberFunction())
7500 return ExprError(
Diag(LParenLoc, diag::err_member_call_without_object)
7501 << Fn->getSourceRange() << 0);
7509 for (
unsigned i = 0, e = Args.size(); i != e; i++) {
7510 if (
const auto *RT =
7511 dyn_cast<RecordType>(Args[i]->
getType().getCanonicalType())) {
7512 if (RT->getDecl()->isOrContainsUnion())
7513 Diag(Args[i]->getBeginLoc(), diag::warn_cmse_nonsecure_union)
7524 checkFortifiedBuiltinMemoryFunction(FDecl, TheCall);
7525 checkFortifiedLibcArgument(FDecl, TheCall);
7528 return CheckBuiltinFunctionCall(FDecl, BuiltinID, TheCall);
7530 if (CheckPointerCall(NDecl, TheCall, Proto))
7533 if (CheckOtherCall(TheCall, Proto))
7543 assert(Ty &&
"ActOnCompoundLiteral(): missing type");
7544 assert(InitExpr &&
"ActOnCompoundLiteral(): missing expression");
7549 TInfo =
Context.getTrivialTypeSourceInfo(literalType);
7561 LParenLoc,
Context.getBaseElementType(literalType),
7562 diag::err_array_incomplete_or_sizeless_type,
7585 ? diag::err_variable_object_no_init
7586 : diag::err_compound_literal_with_vla_type;
7593 diag::err_typecheck_decl_incomplete_type,
7608 LiteralExpr =
Result.get();
7615 bool IsFileScope = !
CurContext->isFunctionOrMethod() &&
7646 if (
auto ILE = dyn_cast<InitListExpr>(LiteralExpr))
7647 for (
unsigned i = 0, j = ILE->getNumInits(); i != j; i++) {
7649 if (!
Init->isTypeDependent() && !
Init->isValueDependent() &&
7651 Diag(
Init->getExprLoc(), diag::err_init_element_not_constant)
7652 <<
Init->getSourceBitField();
7660 LiteralExpr, IsFileScope);
7672 Diag(LParenLoc, diag::err_compound_literal_with_address_space)
7689 Cleanup.setExprNeedsCleanups(
true);
7709 bool DiagnosedArrayDesignator =
false;
7710 bool DiagnosedNestedDesignator =
false;
7711 bool DiagnosedMixedDesignator =
false;
7715 for (
unsigned I = 0, E = InitArgList.size(); I != E; ++I) {
7716 if (
auto *DIE = dyn_cast<DesignatedInitExpr>(InitArgList[I])) {
7718 FirstDesignator = DIE->getBeginLoc();
7723 if (!DiagnosedNestedDesignator && DIE->size() > 1) {
7724 DiagnosedNestedDesignator =
true;
7725 Diag(DIE->getBeginLoc(), diag::ext_designated_init_nested)
7726 << DIE->getDesignatorsSourceRange();
7729 for (
auto &Desig : DIE->designators()) {
7730 if (!Desig.isFieldDesignator() && !DiagnosedArrayDesignator) {
7731 DiagnosedArrayDesignator =
true;
7732 Diag(Desig.getBeginLoc(), diag::ext_designated_init_array)
7733 << Desig.getSourceRange();
7737 if (!DiagnosedMixedDesignator &&
7739 DiagnosedMixedDesignator =
true;
7740 Diag(DIE->getBeginLoc(), diag::ext_designated_init_mixed)
7741 << DIE->getSourceRange();
7742 Diag(InitArgList[0]->getBeginLoc(), diag::note_designated_init_mixed)
7743 << InitArgList[0]->getSourceRange();
7747 DiagnosedMixedDesignator =
true;
7749 Diag(DIE->getBeginLoc(), diag::ext_designated_init_mixed)
7750 << DIE->getSourceRange();
7751 Diag(InitArgList[I]->getBeginLoc(), diag::note_designated_init_mixed)
7752 << InitArgList[I]->getSourceRange();
7756 if (FirstDesignator.
isValid()) {
7760 !DiagnosedNestedDesignator && !DiagnosedMixedDesignator) {
7762 ? diag::warn_cxx17_compat_designated_init
7763 : diag::ext_cxx_designated_init);
7765 Diag(FirstDesignator, diag::ext_designated_init);
7769 return BuildInitList(LBraceLoc, InitArgList, RBraceLoc,
true);
7780 for (
unsigned I = 0, E = InitArgList.size(); I != E; ++I) {
7781 if (InitArgList[I]->
getType()->isNonOverloadPlaceholderType()) {
7788 InitArgList[I] = result.
get();
7808 Cleanup.setExprNeedsCleanups(
true);
7817 if (
Context.hasSameUnqualifiedType(SrcTy, DestTy))
7822 llvm_unreachable(
"member pointer type in C");
7831 if (SrcAS != DestAS)
7832 return CK_AddressSpaceConversion;
7833 if (
Context.hasCvrSimilarType(SrcTy, DestTy))
7839 ? CK_BitCast : CK_AnyPointerToBlockPointerCast);
7844 return CK_CPointerToObjCPointerCast;
7846 return CK_BlockPointerToObjCPointerCast;
7848 return CK_PointerToBoolean;
7850 return CK_PointerToIntegral;
7856 llvm_unreachable(
"illegal cast from pointer");
7858 llvm_unreachable(
"Should have returned before this");
7863 return CK_FixedPointCast;
7865 return CK_FixedPointToBoolean;
7867 return CK_FixedPointToIntegral;
7869 return CK_FixedPointToFloating;
7873 diag::err_unimplemented_conversion_with_fixed_point_type)
7875 return CK_IntegralCast;
7880 llvm_unreachable(
"illegal cast to pointer type");
7882 llvm_unreachable(
"Should have returned before this");
7892 return CK_NullToPointer;
7893 return CK_IntegralToPointer;
7895 return CK_IntegralToBoolean;
7897 return CK_IntegralCast;
7899 return CK_IntegralToFloating;
7904 return CK_IntegralRealToComplex;
7908 CK_IntegralToFloating);
7909 return CK_FloatingRealToComplex;
7911 llvm_unreachable(
"member pointer type in C");
7913 return CK_IntegralToFixedPoint;
7915 llvm_unreachable(
"Should have returned before this");
7920 return CK_FloatingCast;
7922 return CK_FloatingToBoolean;
7924 return CK_FloatingToIntegral;
7929 return CK_FloatingRealToComplex;
7933 CK_FloatingToIntegral);
7934 return CK_IntegralRealToComplex;
7938 llvm_unreachable(
"valid float->pointer cast?");
7940 llvm_unreachable(
"member pointer type in C");
7942 return CK_FloatingToFixedPoint;
7944 llvm_unreachable(
"Should have returned before this");
7949 return CK_FloatingComplexCast;
7951 return CK_FloatingComplexToIntegralComplex;
7954 if (
Context.hasSameType(ET, DestTy))
7955 return CK_FloatingComplexToReal;
7957 return CK_FloatingCast;
7960 return CK_FloatingComplexToBoolean;
7964 CK_FloatingComplexToReal);
7965 return CK_FloatingToIntegral;
7969 llvm_unreachable(
"valid complex float->pointer cast?");
7971 llvm_unreachable(
"member pointer type in C");
7974 diag::err_unimplemented_conversion_with_fixed_point_type)
7976 return CK_IntegralCast;
7978 llvm_unreachable(
"Should have returned before this");
7983 return CK_IntegralComplexToFloatingComplex;
7985 return CK_IntegralComplexCast;
7988 if (
Context.hasSameType(ET, DestTy))
7989 return CK_IntegralComplexToReal;
7991 return CK_IntegralCast;
7994 return CK_IntegralComplexToBoolean;
7998 CK_IntegralComplexToReal);
7999 return CK_IntegralToFloating;
8003 llvm_unreachable(
"valid complex int->pointer cast?");
8005 llvm_unreachable(
"member pointer type in C");
8008 diag::err_unimplemented_conversion_with_fixed_point_type)
8010 return CK_IntegralCast;
8012 llvm_unreachable(
"Should have returned before this");
8015 llvm_unreachable(
"Unhandled scalar cast");
8022 len = vecType->getNumElements();
8023 eltType = vecType->getElementType();
8030 if (!
type->isRealType())
return false;
8040 auto ValidScalableConversion = [](
QualType FirstType,
QualType SecondType) {
8044 const auto *VecTy = SecondType->getAs<
VectorType>();
8048 return ValidScalableConversion(srcTy, destTy) ||
8049 ValidScalableConversion(destTy, srcTy);
8059 return matSrcType->
getNumRows() == matDestType->getNumRows() &&
8060 matSrcType->
getNumColumns() == matDestType->getNumColumns();
8066 uint64_t SrcLen, DestLen;
8076 uint64_t SrcEltSize =
Context.getTypeSize(SrcEltTy);
8077 uint64_t DestEltSize =
Context.getTypeSize(DestEltTy);
8079 return (SrcLen * SrcEltSize == DestLen * DestEltSize);
8084 "expected at least one type to be a vector here");
8086 bool IsSrcTyAltivec =
8102 return (IsSrcTyAltivec || IsDestTyAltivec);
8122 switch (
Context.getLangOpts().getLaxVectorConversions()) {
8129 if (!Vec || !Vec->getElementType()->isIntegralOrEnumerationType())
8134 if (!Vec || !Vec->getElementType()->isIntegralOrEnumerationType())
8151 return Diag(R.getBegin(), diag::err_invalid_conversion_between_matrixes)
8152 << DestTy << SrcTy << R;
8155 return Diag(R.getBegin(),
8156 diag::err_invalid_conversion_between_matrix_and_type)
8157 << SrcTy << DestTy << R;
8159 return Diag(R.getBegin(),
8160 diag::err_invalid_conversion_between_matrix_and_type)
8161 << DestTy << SrcTy << R;
8164 Kind = CK_MatrixCast;
8170 assert(VectorTy->
isVectorType() &&
"Not a vector type!");
8174 return Diag(R.getBegin(),
8176 diag::err_invalid_conversion_between_vectors :
8177 diag::err_invalid_conversion_between_vector_and_integer)
8178 << VectorTy << Ty << R;
8180 return Diag(R.getBegin(),
8181 diag::err_invalid_conversion_between_vector_and_scalar)
8182 << VectorTy << Ty << R;
8191 if (DestElemTy == SplattedExpr->
getType())
8192 return SplattedExpr;
8205 CK_BooleanToSignedIntegral);
8206 SplattedExpr = CastExprRes.
get();
8207 CK = CK_IntegralToFloating;
8209 CK = CK_BooleanToSignedIntegral;
8216 SplattedExpr = CastExprRes.
get();
8224 if (DestElemTy == SplattedExpr->
getType())
8225 return SplattedExpr;
8234 SplattedExpr = CastExprRes.
get();
8252 !
Context.hasSameUnqualifiedType(DestTy, SrcTy) &&
8253 !
Context.areCompatibleVectorTypes(DestTy, SrcTy))) {
8254 Diag(R.getBegin(),diag::err_invalid_conversion_between_ext_vectors)
8255 << DestTy << SrcTy << R;
8266 return Diag(R.getBegin(),
8267 diag::err_invalid_conversion_between_vector_and_scalar)
8268 << DestTy << SrcTy << R;
8270 Kind = CK_VectorSplat;
8280 DestType == SourceType)
8288 if (!CE->getCalleeAllocSizeAttr())
8290 std::optional<llvm::APInt> AllocSize =
8291 CE->evaluateBytesReturnedByAllocSizeCall(S.
Context);
8294 if (!AllocSize || AllocSize->isZero())
8304 if (LhsSize && Size < LhsSize)
8306 << Size.getQuantity() << TargetType << LhsSize->getQuantity();
8314 "ActOnCastExpr(): missing type or expr");
8330 bool isVectorLiteral =
false;
8345 isVectorLiteral =
true;
8348 isVectorLiteral =
true;
8353 if (isVectorLiteral)
8383 "Expected paren or paren list expression");
8390 LiteralLParenLoc = PE->getLParenLoc();
8391 LiteralRParenLoc = PE->getRParenLoc();
8392 exprs = PE->getExprs();
8393 numExprs = PE->getNumExprs();
8420 if (numExprs == 1) {
8423 if (Literal.isInvalid())
8429 else if (numExprs < numElems) {
8431 diag::err_incorrect_number_of_vector_initializers);
8435 initExprs.append(exprs, exprs + numExprs);
8444 Diag(exprs[0]->getBeginLoc(), diag::err_typecheck_convert_incompatible)
8451 if (Literal.isInvalid())
8458 initExprs.append(exprs, exprs + numExprs);
8464 LiteralRParenLoc,
false);
8493 unsigned NumUserSpecifiedExprs,
8498 InitLoc, LParenLoc, RParenLoc);
8503 const Expr *NullExpr = LHSExpr;
8504 const Expr *NonPointerExpr = RHSExpr;
8511 NonPointerExpr = LHSExpr;
8533 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands_null)
8534 << NonPointerExpr->
getType() << DiagType
8546 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_nonfloat)
8554 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_scalar)
8588 bool IsBlockPointer =
false;
8592 IsBlockPointer =
true;
8617 ResultAddrSpace = LAddrSpace;
8619 ResultAddrSpace = RAddrSpace;
8621 S.
Diag(Loc, diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
8628 auto LHSCastKind = CK_BitCast, RHSCastKind = CK_BitCast;
8633 S.
Diag(Loc, diag::err_typecheck_cond_incompatible_ptrauth)
8650 LAddrSpace == ResultAddrSpace ? CK_BitCast : CK_AddressSpaceConversion;
8652 RAddrSpace == ResultAddrSpace ? CK_BitCast : CK_AddressSpaceConversion;
8660 lhptee, rhptee,
false,
false,
8663 if (CompositeTy.
isNull()) {
8680 S.
Diag(Loc, diag::ext_typecheck_cond_incompatible_pointers)
8691 QualType ResultTy = [&, ResultAddrSpace]() {
8726 S.
Diag(Loc, diag::err_typecheck_cond_incompatible_operands)
8779 bool IsIntFirstExpr) {
8781 !Int.get()->getType()->isIntegerType())
8784 Expr *Expr1 = IsIntFirstExpr ? Int.get() : PointerExpr;
8785 Expr *Expr2 = IsIntFirstExpr ? PointerExpr : Int.get();
8787 S.
Diag(Loc, diag::ext_typecheck_cond_pointer_integer_mismatch)
8791 CK_IntegralToPointer);
8825 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_int_float)
8831 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_int_float)
8837 if (LHSType == RHSType)
8847 (S, LHS, RHS, LHSType, RHSType,
false);
8881 llvm::raw_svector_ostream OS(Str);
8882 OS <<
"(vector of " << NumElements <<
" '" << EleTyName <<
"' values)";
8883 S.
Diag(QuestionLoc, diag::err_conditional_vector_element_size)
8884 << CondTy << OS.str();
8905 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_nonfloat)
8923 S.
Diag(QuestionLoc, diag::err_conditional_vector_size)
8924 << CondTy << VecResTy;
8929 QualType RVE = RV->getElementType();
8934 S.
Diag(QuestionLoc, diag::err_conditional_vector_element_size)
8935 << CondTy << VecResTy;
8961 bool IsBoolVecLang =
8990 if (
const CallExpr *CE = dyn_cast<CallExpr>(E)) {
8991 QualType Ty = CE->getCallee()->getType();
9023 if (
Context.isDependenceAllowed() &&
9029 "should only occur in error-recovery path.");
9064 Diag(QuestionLoc, diag::err_wasm_table_conditional_expression)
9073 diag::err_typecheck_cond_incompatible_operands) << LHSTy << RHSTy
9092 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands)
9108 Context.hasSameUnqualifiedType(LHSTy, RHSTy))
9148 if (!compositeType.
isNull())
9149 return compositeType;
9179 if (
Context.hasSameType(LHSTy, RHSTy))
9180 return Context.getCommonSugaredType(LHSTy, RHSTy);
9183 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands)
9202 Self.Diag(Loc,
Note) << ParenRange;
9222 const Expr **RHSExprs) {
9227 if (
const auto *MTE = dyn_cast<MaterializeTemporaryExpr>(E)) {
9228 E = MTE->getSubExpr();
9233 if (
const auto *OP = dyn_cast<BinaryOperator>(E);
9235 *Opcode = OP->getOpcode();
9236 *RHSExprs = OP->getRHS();
9241 if (
const auto *
Call = dyn_cast<CXXOperatorCallExpr>(E)) {
9242 if (
Call->getNumArgs() != 2)
9248 if (OO < OO_Plus || OO > OO_Arrow ||
9249 OO == OO_PlusPlus || OO == OO_MinusMinus)
9255 *RHSExprs =
Call->getArg(1);
9271 if (
const auto *OP = dyn_cast<BinaryOperator>(E))
9272 return OP->isComparisonOp() || OP->isLogicalOp();
9273 if (
const auto *OP = dyn_cast<UnaryOperator>(E))
9274 return OP->getOpcode() == UO_LNot;
9289 const Expr *RHSExpr) {
9291 const Expr *CondRHS;
9302 ? diag::warn_precedence_bitwise_conditional
9303 : diag::warn_precedence_conditional;
9305 Self.Diag(OpLoc, DiagID)
9311 Self.PDiag(diag::note_precedence_silence)
9316 Self.PDiag(diag::note_precedence_conditional_first),
9327 auto GetNullability = [](
QualType Ty) {
9338 auto LHSKind = GetNullability(LHSTy), RHSKind = GetNullability(RHSTy);
9346 MergedKind = RHSKind;
9353 MergedKind = RHSKind;
9355 MergedKind = LHSKind;
9361 if (GetNullability(ResTy) == MergedKind)
9379 Expr *commonExpr =
nullptr;
9381 commonExpr = CondExpr;
9388 commonExpr = result.
get();
9402 commonExpr = commonRes.
get();
9412 commonExpr = MatExpr.
get();
9420 LHSExpr = CondExpr = opaqueValue;
9426 ExprResult Cond = CondExpr, LHS = LHSExpr, RHS = RHSExpr;
9428 VK, OK, QuestionLoc);
9436 CheckBoolLikeConversion(Cond.
get(), QuestionLoc);
9444 RHS.get(), result,
VK, OK);
9447 commonExpr, opaqueValue, Cond.
get(), LHS.get(), RHS.get(), QuestionLoc,
9448 ColonLoc, result,
VK, OK);
9452 unsigned FromAttributes = 0, ToAttributes = 0;
9453 if (
const auto *FromFn =
9454 dyn_cast<FunctionProtoType>(
Context.getCanonicalType(FromType)))
9457 if (
const auto *ToFn =
9458 dyn_cast<FunctionProtoType>(
Context.getCanonicalType(ToType)))
9462 return FromAttributes != ToAttributes;
9474 assert(LHSType.
isCanonical() &&
"LHS not canonicalized!");
9475 assert(RHSType.
isCanonical() &&
"RHS not canonicalized!");
9478 const Type *lhptee, *rhptee;
9480 std::tie(lhptee, lhq) =
9482 std::tie(rhptee, rhq) =
9553 diag::warn_typecheck_convert_incompatible_function_pointer_strict,
9577 ltrans = LUnderlying;
9578 rtrans = RUnderlying;
9596 if (ltrans == rtrans) {
9612 std::tie(lhptee, lhq) =
9614 std::tie(rhptee, rhq) =
9626 return AssignConvertType::
9627 IncompatibleNestedPointerAddressSpaceMismatch;
9631 if (lhptee == rhptee)
9651 const auto *LFPT = dyn_cast<FunctionProtoType>(LFT);
9652 const auto *RFPT = dyn_cast<FunctionProtoType>(RFT);
9655 LFPT->getParamTypes(),
9656 RFPT->getExtProtoInfo());
9661 LFPT->getParamTypes(), EPI);
9666 EPI.
ExtInfo = LFT->getExtInfo();
9668 RFPT->getParamTypes(), EPI);
9687 assert(LHSType.
isCanonical() &&
"LHS not canonicalized!");
9688 assert(RHSType.
isCanonical() &&
"RHS not canonicalized!");
9709 if (LQuals != RQuals)
9738 assert(LHSType.
isCanonical() &&
"LHS was not canonicalized!");
9739 assert(RHSType.
isCanonical() &&
"RHS was not canonicalized!");
9787 return VT->getElementType().getCanonicalType() == ElementType;
9817 LHSType =
Context.getCanonicalType(LHSType).getUnqualifiedType();
9818 RHSType =
Context.getCanonicalType(RHSType).getUnqualifiedType();
9821 if (LHSType == RHSType) {
9828 if (
const auto *AT = dyn_cast<AutoType>(LHSType)) {
9829 if (AT->isGNUAutoType()) {
9835 auto OBTResult =
Context.checkOBTAssignmentCompatibility(LHSType, RHSType);
9836 switch (OBTResult) {
9841 Kind = LHSType->
isBooleanType() ? CK_IntegralToBoolean : CK_IntegralCast;
9854 !
Context.areCompatibleOverflowBehaviorTypes(LHSPointee, RHSPointee)) {
9862 if (
const AtomicType *AtomicTy = dyn_cast<AtomicType>(LHSType)) {
9867 if (Kind != CK_NoOp && ConvertRHS)
9869 Kind = CK_NonAtomicToAtomic;
9881 if (
Context.typesAreCompatible(LHSTypeRef->getPointeeType(), RHSType)) {
9882 Kind = CK_LValueBitCast;
9893 if (LHSExtType->getNumElements() != RHSExtType->getNumElements())
9897 RHSExtType->getElementType()->isIntegerType()) {
9898 Kind = CK_IntegralToBoolean;
9902 if (
Context.getLangOpts().OpenCL &&
9903 Context.areCompatibleVectorTypes(LHSType, RHSType)) {
9913 Kind = CK_VectorSplat;
9923 if (
Context.areCompatibleVectorTypes(LHSType, RHSType)) {
9935 if (
Context.getTargetInfo().getTriple().isPPC() &&
9937 !
Context.areCompatibleVectorTypes(RHSType, LHSType))
9939 << RHSType << LHSType;
9953 if (
Context.getTargetInfo().getTriple().isPPC() &&
9958 << RHSType << LHSType;
9969 if (
ARM().areCompatibleSveTypes(LHSType, RHSType) ||
9970 ARM().areLaxCompatibleSveTypes(LHSType, RHSType)) {
9978 if (
Context.areCompatibleRVVTypes(LHSType, RHSType) ||
9979 Context.areLaxCompatibleRVVTypes(LHSType, RHSType)) {
10008 if (
const PointerType *LHSPointer = dyn_cast<PointerType>(LHSType)) {
10011 LangAS AddrSpaceL = LHSPointer->getPointeeType().getAddressSpace();
10013 if (AddrSpaceL != AddrSpaceR)
10014 Kind = CK_AddressSpaceConversion;
10015 else if (
Context.hasCvrSimilarType(RHSType, LHSType))
10025 Kind = CK_IntegralToPointer;
10033 if (LHSPointer->getPointeeType()->isVoidType()) {
10041 Context.getObjCClassRedefinitionType())) {
10052 if (LHSPointer->getPointeeType()->isVoidType()) {
10053 LangAS AddrSpaceL = LHSPointer->getPointeeType().getAddressSpace();
10058 AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion : CK_BitCast;
10076 Kind = AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion : CK_BitCast;
10082 Kind = CK_IntegralToPointer;
10088 Kind = CK_AnyPointerToBlockPointerCast;
10094 if (RHSPT->getPointeeType()->isVoidType()) {
10095 Kind = CK_AnyPointerToBlockPointerCast;
10109 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
10111 !
ObjC().CheckObjCARCUnavailableWeakConversion(OrigLHSType, RHSType))
10118 Kind = CK_IntegralToPointer;
10125 Kind = CK_CPointerToObjCPointerCast;
10135 Context.getObjCClassRedefinitionType())) {
10147 Kind = CK_BlockPointerToObjCPointerCast;
10159 Kind = CK_NullToPointer;
10166 if (LHSType ==
Context.BoolTy) {
10167 Kind = CK_PointerToBoolean;
10173 Kind = CK_PointerToIntegral;
10183 if (LHSType ==
Context.BoolTy) {
10184 Kind = CK_PointerToBoolean;
10190 Kind = CK_PointerToIntegral;
10199 if (
Context.typesAreCompatible(LHSType, RHSType)) {
10206 Kind = CK_IntToOCLSampler;
10240 const RecordType *UT =
ArgType->getAsUnionType();
10245 if (!UD->
hasAttr<TransparentUnionAttr>())
10251 for (
auto *it : UD->
fields()) {
10252 if (it->getType()->isPointerType()) {
10291 bool DiagnoseCFAudited,
10295 assert((ConvertRHS || !
Diagnose) &&
"can't indicate whether we diagnosed");
10301 ExprResult &RHS = ConvertRHS ? CallerRHS : LocalRHS;
10305 if (RHSPtrType->getPointeeType()->hasAttr(attr::NoDeref) &&
10306 !LHSPtrType->getPointeeType()->hasAttr(attr::NoDeref)) {
10308 diag::warn_noderef_to_dereferenceable_pointer)
10327 AllowedExplicit::None,
10339 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
10340 !
ObjC().CheckObjCARCUnavailableWeakConversion(LHSType, RHSType))
10362 RHS.
get(), LHSType,
false, DAP))
10371 if (!
Context.hasSameUnqualifiedType(RHSType, LHSType)) {
10499 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
10509 ObjC().CheckConversionToObjCLiteral(LHSType, E,
Diagnose))) {
10529struct OriginalOperand {
10530 explicit OriginalOperand(
Expr *Op) : Orig(Op), Conversion(
nullptr) {
10531 if (
auto *MTE = dyn_cast<MaterializeTemporaryExpr>(Op))
10532 Op = MTE->getSubExpr();
10533 if (
auto *BTE = dyn_cast<CXXBindTemporaryExpr>(Op))
10534 Op = BTE->getSubExpr();
10535 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(Op)) {
10536 Orig = ICE->getSubExprAsWritten();
10537 Conversion = ICE->getConversionFunction();
10541 QualType
getType()
const {
return Orig->getType(); }
10544 NamedDecl *Conversion;
10550 OriginalOperand OrigLHS(LHS.
get()), OrigRHS(RHS.
get());
10552 Diag(Loc, diag::err_typecheck_invalid_operands)
10553 << OrigLHS.getType() << OrigRHS.getType()
10558 if (OrigLHS.Conversion) {
10559 Diag(OrigLHS.Conversion->getLocation(),
10560 diag::note_typecheck_invalid_operands_converted)
10563 if (OrigRHS.Conversion) {
10565 diag::note_typecheck_invalid_operands_converted)
10580 if (!(LHSNatVec && RHSNatVec)) {
10582 Expr *NonVector = !LHSNatVec ? LHS.
get() : RHS.
get();
10583 Diag(Loc, diag::err_typecheck_logical_vector_expr_gnu_cpp_restrict)
10585 <<
Vector->getSourceRange();
10589 Diag(Loc, diag::err_typecheck_logical_vector_expr_gnu_cpp_restrict)
10612 unsigned &DiagID) {
10618 scalarCast = CK_IntegralToBoolean;
10623 DiagID = diag::err_opencl_scalar_type_rank_greater_than_vector_type;
10628 scalarCast = CK_IntegralCast;
10633 DiagID = diag::err_opencl_scalar_type_rank_greater_than_vector_type;
10636 scalarCast = CK_FloatingCast;
10639 scalarCast = CK_IntegralToFloating;
10648 if (scalarCast != CK_NoOp)
10659 assert(VecTy &&
"Expression E must be a vector");
10664 VecTy->getVectorKind());
10668 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(E))
10669 if (ICE->getSubExpr()->getType() == NewVecTy)
10670 return ICE->getSubExpr();
10672 auto Cast = ElementType->isIntegerType() ? CK_IntegralCast : CK_FloatingCast;
10680 Expr *E = Int->get();
10684 QualType IntTy = Int->get()->getType().getUnqualifiedType();
10690 bool CstInt = Int->get()->EvaluateAsInt(EVResult, S.
Context);
10699 unsigned NumBits = IntSigned
10701 :
Result.getActiveBits())
10702 :
Result.getActiveBits();
10709 return (IntSigned != OtherIntSigned &&
10715 return (Order < 0);
10722 if (Int->get()->containsErrors())
10725 QualType IntTy = Int->get()->getType().getUnqualifiedType();
10730 bool CstInt = Int->get()->EvaluateAsInt(EVResult, S.
Context);
10742 llvm::APFloat::rmTowardZero);
10745 bool Ignored =
false;
10746 Float.convertToInteger(ConvertBack, llvm::APFloat::rmNearestTiesToEven,
10748 if (
Result != ConvertBack)
10754 unsigned FloatPrec = llvm::APFloat::semanticsPrecision(
10756 if (Bits > FloatPrec)
10769 QualType ScalarTy = Scalar->get()->getType().getUnqualifiedType();
10770 QualType VectorTy =
Vector->get()->getType().getUnqualifiedType();
10775 "ExtVectorTypes should not be handled here!");
10776 VectorEltTy = VT->getElementType();
10781 llvm_unreachable(
"Only Fixed-Length and SVE Vector types are handled here");
10807 ScalarCast = CK_IntegralCast;
10811 ScalarCast = CK_FloatingToIntegral;
10819 llvm::APFloat
Result(0.0);
10825 bool CstScalar = Scalar->get()->isValueDependent() ||
10828 if (!CstScalar && Order < 0)
10834 bool Truncated =
false;
10836 llvm::APFloat::rmNearestTiesToEven, &Truncated);
10841 ScalarCast = CK_FloatingCast;
10846 ScalarCast = CK_IntegralToFloating;
10853 if (ScalarCast != CK_NoOp)
10861 bool AllowBothBool,
10862 bool AllowBoolConversions,
10863 bool AllowBoolOperation,
10864 bool ReportInvalid) {
10865 if (!IsCompAssign) {
10881 assert(LHSVecType || RHSVecType);
10889 (RHSVecType && RHSVecType->getElementType()->isMFloat8Type()))
10894 if (!AllowBothBool && LHSVecType &&
10900 if (!AllowBoolOperation &&
10905 if (
Context.hasSameType(LHSType, RHSType))
10906 return Context.getCommonSugaredType(LHSType, RHSType);
10909 if (LHSVecType && RHSVecType &&
10910 Context.areCompatibleVectorTypes(LHSType, RHSType)) {
10924 if (AllowBoolConversions && LHSVecType && RHSVecType &&
10927 Context.getTypeSize(RHSVecType->getElementType()))) {
10934 if (!IsCompAssign &&
10937 RHSVecType->getElementType()->isIntegerType()) {
10946 unsigned &SVEorRVV) {
10967 if (IsSveRVVConversion(LHSType, RHSType, SVEorRVV) ||
10968 IsSveRVVConversion(RHSType, LHSType, SVEorRVV)) {
10969 Diag(Loc, diag::err_typecheck_sve_rvv_ambiguous)
10970 << SVEorRVV << LHSType << RHSType;
10977 unsigned &SVEorRVV) {
10982 if (FirstVecType && SecondVecType) {
10985 SecondVecType->getVectorKind() ==
10990 SecondVecType->getVectorKind() ==
10992 SecondVecType->getVectorKind() ==
10994 SecondVecType->getVectorKind() ==
11003 if (SecondVecType &&
11016 if (IsSveRVVGnuConversion(LHSType, RHSType, SVEorRVV) ||
11017 IsSveRVVGnuConversion(RHSType, LHSType, SVEorRVV)) {
11018 Diag(Loc, diag::err_typecheck_sve_rvv_gnu_ambiguous)
11019 << SVEorRVV << LHSType << RHSType;
11025 unsigned DiagID = diag::err_typecheck_vector_not_convertable;
11040 LHSType, RHSVecType->getElementType(),
11053 QualType VecType = LHSVecType ? LHSType : RHSType;
11054 const VectorType *VT = LHSVecType ? LHSVecType : RHSVecType;
11055 QualType OtherType = LHSVecType ? RHSType : LHSType;
11056 ExprResult *OtherExpr = LHSVecType ? &RHS : &LHS;
11058 if (
Context.getTargetInfo().getTriple().isPPC() &&
11060 !
Context.areCompatibleVectorTypes(RHSType, LHSType))
11061 Diag(Loc, diag::warn_deprecated_lax_vec_conv_all) << RHSType << LHSType;
11065 if (!IsCompAssign) {
11084 if ((!RHSVecType && !RHSType->
isRealType()) ||
11086 Diag(Loc, diag::err_typecheck_vector_not_convertable_non_scalar)
11087 << LHSType << RHSType
11099 Diag(Loc, diag::err_opencl_implicit_vector_conversion) << LHSType
11110 QualType Scalar = LHSVecType ? RHSType : LHSType;
11112 unsigned ScalarOrVector = LHSVecType && RHSVecType ? 1 : 0;
11114 diag::err_typecheck_vector_not_convertable_implict_truncation)
11115 << ScalarOrVector << Scalar <<
Vector;
11122 << LHSType << RHSType
11131 if (!IsCompAssign) {
11146 unsigned DiagID = diag::err_typecheck_invalid_operands;
11148 ((LHSBuiltinTy && LHSBuiltinTy->
isSVEBool()) ||
11149 (RHSBuiltinTy && RHSBuiltinTy->isSVEBool()))) {
11155 if (
Context.hasSameType(LHSType, RHSType))
11170 Diag(Loc, diag::err_typecheck_vector_not_convertable_non_scalar)
11177 Context.getBuiltinVectorTypeInfo(LHSBuiltinTy).EC !=
11178 Context.getBuiltinVectorTypeInfo(RHSBuiltinTy).EC) {
11179 Diag(Loc, diag::err_typecheck_vector_lengths_not_equal)
11188 bool ScalarOrVector =
11191 Diag(Loc, diag::err_typecheck_vector_not_convertable_implict_truncation)
11192 << ScalarOrVector << Scalar <<
Vector;
11224 S.
Diag(Loc, diag::warn_null_in_arithmetic_operation)
11236 S.
Diag(Loc, diag::warn_null_in_comparison_operation)
11237 << LHSNull << NonNullType
11249 QualType ElementType = CT->getElementType().getCanonicalType();
11250 bool IsComplexRangePromoted = S.
getLangOpts().getComplexRange() ==
11252 if (!ElementType->isFloatingType() || !IsComplexRangePromoted)
11257 const llvm::fltSemantics &ElementTypeSemantics =
11259 const llvm::fltSemantics &HigherElementTypeSemantics =
11262 if ((llvm::APFloat::semanticsMaxExponent(ElementTypeSemantics) * 2 + 1 >
11263 llvm::APFloat::semanticsMaxExponent(HigherElementTypeSemantics)) ||
11270 if (
Type == HigherElementType) {
11282 const auto *LUE = dyn_cast<UnaryExprOrTypeTraitExpr>(LHS);
11283 const auto *RUE = dyn_cast<UnaryExprOrTypeTraitExpr>(RHS);
11286 if (LUE->getKind() != UETT_SizeOf || LUE->isArgumentType() ||
11287 RUE->getKind() != UETT_SizeOf)
11294 if (RUE->isArgumentType())
11295 RHSTy = RUE->getArgumentType().getNonReferenceType();
11297 RHSTy = RUE->getArgumentExpr()->IgnoreParens()->getType();
11304 if (
const auto *DRE = dyn_cast<DeclRefExpr>(LHSArg)) {
11305 if (
const ValueDecl *LHSArgDecl = DRE->getDecl())
11306 S.
Diag(LHSArgDecl->getLocation(), diag::note_pointer_declared_here)
11310 QualType ArrayElemTy = ArrayTy->getElementType();
11316 S.
Diag(Loc, diag::warn_division_sizeof_array)
11318 if (
const auto *DRE = dyn_cast<DeclRefExpr>(LHSArg)) {
11319 if (
const ValueDecl *LHSArgDecl = DRE->getDecl())
11320 S.
Diag(LHSArgDecl->getLocation(), diag::note_array_declared_here)
11324 S.
Diag(Loc, diag::note_precedence_silence) << RHS;
11337 S.
PDiag(diag::warn_remainder_division_by_zero)
11346 const Expr *LHSExpr = LHS.
get();
11347 const Expr *RHSExpr = RHS.
get();
11352 if (!LHSIsScoped && !RHSIsScoped)
11364 ->getDefinitionOrSelf()
11365 ->getIntegerType();
11366 std::string InsertionString =
"static_cast<" + IntType.getAsString() +
">(";
11367 S.
Diag(BeginLoc, diag::note_no_implicit_conversion_for_scoped_enum)
11372 DiagnosticHelper(LHSExpr, LHSType);
11375 DiagnosticHelper(RHSExpr, RHSType);
11382 bool IsCompAssign = Opc == BO_MulAssign || Opc == BO_DivAssign;
11383 bool IsDiv = Opc == BO_Div || Opc == BO_DivAssign;
11477 if (compType.
isNull() ||
11482 IsCompAssign ? BO_RemAssign : BO_Rem);
11493 ? diag::err_typecheck_pointer_arith_void_type
11494 : diag::ext_gnu_void_ptr)
11503 ? diag::err_typecheck_pointer_arith_void_type
11504 : diag::ext_gnu_void_ptr)
11505 << 0 <<
Pointer->getSourceRange();
11516 S.
Diag(Loc, diag::warn_gnu_null_ptr_arith)
11517 <<
Pointer->getSourceRange();
11519 S.
Diag(Loc, diag::warn_pointer_arith_null_ptr)
11536 S.
PDiag(diag::warn_pointer_sub_null_ptr)
11538 <<
Pointer->getSourceRange());
11547 ? diag::err_typecheck_pointer_arith_function_type
11548 : diag::ext_gnu_ptr_func_arith)
11560 assert(
Pointer->getType()->isAnyPointerType());
11562 ? diag::err_typecheck_pointer_arith_function_type
11563 : diag::ext_gnu_ptr_func_arith)
11564 << 0 <<
Pointer->getType()->getPointeeType()
11566 <<
Pointer->getSourceRange();
11574 QualType ResType = Operand->getType();
11576 ResType = ResAtomicType->getValueType();
11582 diag::err_typecheck_arithmetic_incomplete_or_sizeless_type,
11583 Operand->getSourceRange());
11596 QualType ResType = Operand->getType();
11598 ResType = ResAtomicType->getValueType();
11630 if (!isLHSPointer && !isRHSPointer)
return true;
11632 QualType LHSPointeeTy, RHSPointeeTy;
11637 if (isLHSPointer && isRHSPointer) {
11641 diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
11649 bool isLHSVoidPtr = isLHSPointer && LHSPointeeTy->
isVoidType();
11650 bool isRHSVoidPtr = isRHSPointer && RHSPointeeTy->
isVoidType();
11651 if (isLHSVoidPtr || isRHSVoidPtr) {
11659 bool isLHSFuncPtr = isLHSPointer && LHSPointeeTy->
isFunctionType();
11660 bool isRHSFuncPtr = isRHSPointer && RHSPointeeTy->
isFunctionType();
11661 if (isLHSFuncPtr || isRHSFuncPtr) {
11683 Expr* IndexExpr = RHSExpr;
11686 IndexExpr = LHSExpr;
11689 bool IsStringPlusInt = StrExpr &&
11695 Self.Diag(OpLoc, diag::warn_string_plus_int)
11699 if (IndexExpr == RHSExpr) {
11701 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence)
11706 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence);
11712 const Expr *StringRefExpr = LHSExpr;
11717 CharExpr = dyn_cast<CharacterLiteral>(LHSExpr->
IgnoreImpCasts());
11718 StringRefExpr = RHSExpr;
11721 if (!CharExpr || !StringRefExpr)
11741 Self.Diag(OpLoc, diag::warn_string_plus_char)
11742 << DiagRange << Ctx.
CharTy;
11744 Self.Diag(OpLoc, diag::warn_string_plus_char)
11745 << DiagRange << CharExpr->
getType();
11751 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence)
11756 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence);
11765 S.
Diag(Loc, diag::err_typecheck_sub_ptr_compatible)
11784 if (CompLHSTy) *CompLHSTy = compType;
11793 *CompLHSTy = compType;
11802 *CompLHSTy = compType;
11813 if (Opc == BO_Add) {
11820 if (CompLHSTy) *CompLHSTy = compType;
11834 std::swap(PExp, IExp);
11847 if (!IExp->getType()->isIntegerType())
11856 (!IExp->isValueDependent() &&
11857 (!IExp->EvaluateAsInt(KnownVal,
Context) ||
11861 Context, BO_Add, PExp, IExp);
11875 Diag(Loc, diag::err_ptrauth_indirect_goto_addrlabel_arithmetic)
11881 CheckArrayAccess(PExp, IExp);
11887 if (
Context.isPromotableIntegerType(LHSTy))
11888 LHSTy =
Context.getPromotedIntegerType(LHSTy);
11890 *CompLHSTy = LHSTy;
11901 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT)) {
11902 if (CAT->isZeroSize())
11904 }
else if (
const auto *VAT = dyn_cast<VariableArrayType>(AT)) {
11905 if (
const Expr *Bound = VAT->getSizeExpr())
11906 if (std::optional<llvm::APSInt> Size =
11907 Bound->getIntegerConstantExpr(Ctx))
11911 T = AT->getElementType();
11931 if (CompLHSTy) *CompLHSTy = compType;
11940 *CompLHSTy = compType;
11949 *CompLHSTy = compType;
11963 if (CompLHSTy) *CompLHSTy = compType;
11980 Diag(Loc, diag::err_ptrauth_indirect_goto_addrlabel_arithmetic)
12006 CheckArrayAccess(LHS.
get(), RHS.
get(),
nullptr,
12009 if (CompLHSTy) *CompLHSTy = LHS.
get()->
getType();
12020 if (!
Context.hasSameUnqualifiedType(lpointee, rpointee)) {
12025 if (!
Context.typesAreCompatible(
12026 Context.getCanonicalType(lpointee).getUnqualifiedType(),
12027 Context.getCanonicalType(rpointee).getUnqualifiedType())) {
12043 if (LAddrSpace != RAddrSpace) {
12050 if (LAddrSpace != ResultAddrSpace) {
12057 if (RAddrSpace != ResultAddrSpace) {
12083 Diag(Loc, diag::warn_sub_ptr_zero_size_types)
12087 if (CompLHSTy) *CompLHSTy = LHS.
get()->
getType();
12088 return Context.getPointerDiffType();
12098 if (
const EnumType *ET =
T->getAsCanonical<EnumType>())
12099 return ET->getDecl()->isScoped();
12111 if (Opc == BO_Shr &&
12120 llvm::APSInt Right = RHSResult.
Val.
getInt();
12122 if (Right.isNegative()) {
12124 S.
PDiag(diag::warn_shift_negative)
12135 LeftSize = FXSema.getWidth() - (
unsigned)FXSema.hasUnsignedPadding();
12137 if (Right.uge(LeftSize)) {
12139 S.
PDiag(diag::warn_shift_gt_typewidth)
12159 llvm::APSInt Left = LHSResult.
Val.
getInt();
12170 if (Left.isNegative()) {
12172 S.
PDiag(diag::warn_shift_lhs_negative)
12177 llvm::APInt ResultBits =
12178 static_cast<llvm::APInt &
>(Right) + Left.getSignificantBits();
12179 if (ResultBits.ule(LeftSize))
12181 llvm::APSInt
Result = Left.extend(ResultBits.getLimitedValue());
12187 Result.toString(HexResult, 16,
false,
true);
12193 if (ResultBits - 1 == LeftSize) {
12194 S.
Diag(Loc, diag::warn_shift_result_sets_sign_bit)
12195 << HexResult << LHSType
12200 S.
Diag(Loc, diag::warn_shift_result_gt_typewidth)
12201 << HexResult.str() <<
Result.getSignificantBits() << LHSType
12213 S.
Diag(Loc, diag::err_shift_rhs_only_vector)
12219 if (!IsCompAssign) {
12241 S.
Diag(Loc, diag::err_typecheck_invalid_operands)
12248 if (!LHSEleType->isIntegerType()) {
12249 S.
Diag(Loc, diag::err_typecheck_expect_int)
12254 if (!RHSEleType->isIntegerType()) {
12255 S.
Diag(Loc, diag::err_typecheck_expect_int)
12264 if (LHSEleType != RHSEleType) {
12266 LHSEleType = RHSEleType;
12272 }
else if (RHSVecTy) {
12277 S.
Diag(Loc, diag::err_typecheck_vector_lengths_not_equal)
12285 if (LHSBT != RHSBT &&
12287 S.
Diag(Loc, diag::warn_typecheck_vector_element_sizes_not_equal)
12304 bool IsCompAssign) {
12305 if (!IsCompAssign) {
12328 if ((LHSBuiltinTy && LHSBuiltinTy->
isSVEBool()) ||
12329 (RHSBuiltinTy && RHSBuiltinTy->
isSVEBool())) {
12330 S.
Diag(Loc, diag::err_typecheck_invalid_operands)
12335 if (!LHSEleType->isIntegerType()) {
12336 S.
Diag(Loc, diag::err_typecheck_expect_int)
12341 if (!RHSEleType->isIntegerType()) {
12342 S.
Diag(Loc, diag::err_typecheck_expect_int)
12350 S.
Diag(Loc, diag::err_typecheck_invalid_operands)
12360 if (LHSEleType != RHSEleType) {
12362 LHSEleType = RHSEleType;
12364 const llvm::ElementCount VecSize =
12373 S.
Diag(Loc, diag::err_typecheck_vector_lengths_not_equal)
12379 const llvm::ElementCount VecSize =
12381 if (LHSEleType != RHSEleType) {
12383 RHSEleType = LHSEleType;
12396 bool IsCompAssign) {
12430 if (IsCompAssign) LHS = OldLHS;
12458 S.
Diag(Loc, IsError ? diag::err_typecheck_comparison_of_distinct_pointers
12459 : diag::ext_typecheck_comparison_of_distinct_pointers)
12499 S.
Diag(Loc, IsError ? diag::err_typecheck_comparison_of_fptr_to_void
12500 : diag::ext_typecheck_comparison_of_fptr_to_void)
12507 case Stmt::ObjCArrayLiteralClass:
12508 case Stmt::ObjCDictionaryLiteralClass:
12509 case Stmt::ObjCStringLiteralClass:
12510 case Stmt::ObjCBoxedExprClass:
12554 QualType T = Method->parameters()[0]->getType();
12555 if (!
T->isObjCObjectPointerType())
12558 QualType R = Method->getReturnType();
12559 if (!R->isScalarType())
12571 Literal = LHS.
get();
12574 Literal = RHS.
get();
12590 llvm_unreachable(
"Unknown Objective-C object literal kind");
12594 S.
Diag(Loc, diag::warn_objc_string_literal_comparison)
12595 << Literal->getSourceRange();
12597 S.
Diag(Loc, diag::warn_objc_literal_comparison)
12598 << LiteralKind << Literal->getSourceRange();
12607 S.
Diag(Loc, diag::note_objc_literal_comparison_isequal)
12620 if (!UO || UO->
getOpcode() != UO_LNot)
return;
12630 bool IsBitwiseOp = Opc == BO_And || Opc == BO_Or || Opc == BO_Xor;
12632 << Loc << IsBitwiseOp;
12659 if (
const DeclRefExpr *DR = dyn_cast<DeclRefExpr>(E)) {
12661 }
else if (
const MemberExpr *Mem = dyn_cast<MemberExpr>(E)) {
12662 if (Mem->isImplicitAccess())
12663 D = Mem->getMemberDecl();
12678 return std::nullopt;
12686 std::swap(LHS, RHS);
12690 std::swap(LHS, RHS);
12694 return std::nullopt;
12697 auto *BO = dyn_cast<BinaryOperator>(LHS);
12698 if (!BO || BO->getOpcode() != BO_Add)
12699 return std::nullopt;
12703 Other = BO->getRHS();
12705 Other = BO->getLHS();
12707 return std::nullopt;
12709 if (!
Other->getType()->isUnsignedIntegerType())
12710 return std::nullopt;
12712 return Opc == BO_GE;
12766 auto IsDeprArrayComparionIgnored =
12769 ? diag::warn_array_comparison_cxx26
12770 : !S.
getLangOpts().CPlusPlus20 || IsDeprArrayComparionIgnored
12771 ? diag::warn_array_comparison
12772 : diag::warn_depr_array_comparison;
12798 Result = AlwaysConstant;
12802 S.
PDiag(diag::warn_comparison_always)
12817 Result = AlwaysConstant;
12821 S.
PDiag(diag::warn_comparison_always)
12824 }
else if (std::optional<bool> Res =
12827 S.
PDiag(diag::warn_comparison_always)
12829 << (*Res ? AlwaysTrue : AlwaysFalse));
12840 Expr *LiteralString =
nullptr;
12841 Expr *LiteralStringStripped =
nullptr;
12845 LiteralString = LHS;
12846 LiteralStringStripped = LHSStripped;
12851 LiteralString = RHS;
12852 LiteralStringStripped = RHSStripped;
12855 if (LiteralString) {
12857 S.
PDiag(diag::warn_stringcompare)
12870 llvm_unreachable(
"unhandled cast kind");
12872 case CK_UserDefinedConversion:
12874 case CK_LValueToRValue:
12876 case CK_ArrayToPointerDecay:
12878 case CK_FunctionToPointerDecay:
12880 case CK_IntegralCast:
12882 case CK_FloatingCast:
12884 case CK_IntegralToFloating:
12885 case CK_FloatingToIntegral:
12887 case CK_IntegralComplexCast:
12888 case CK_FloatingComplexCast:
12889 case CK_FloatingComplexToIntegralComplex:
12890 case CK_IntegralComplexToFloatingComplex:
12892 case CK_FloatingComplexToReal:
12893 case CK_FloatingRealToComplex:
12894 case CK_IntegralComplexToReal:
12895 case CK_IntegralRealToComplex:
12897 case CK_HLSLArrayRValue:
12910 if (
const auto *ICE = dyn_cast<ImplicitCastExpr>(E))
12937 << 0 << FromType << ToType;
12942 llvm_unreachable(
"unhandled case in switch");
12969 if (NumEnumArgs == 1) {
12971 QualType OtherTy = LHSIsEnum ? RHSStrippedType : LHSStrippedType;
12977 if (NumEnumArgs == 2) {
12986 assert(IntType->isArithmeticType());
12996 LHSType = RHSType = IntType;
13005 if (
Type.isNull()) {
13011 std::optional<ComparisonCategoryType> CCT =
13023 assert(!
Type.isNull() &&
"composite type for <=> has not been set");
13041 if (
Type.isNull()) {
13062 int NullValue =
PP.isMacroDefined(
"NULL") ? 0 : 1;
13067 if (
const auto *
CL = dyn_cast<CharacterLiteral>(E.
get())) {
13068 if (
CL->getValue() == 0)
13072 NullValue ?
"NULL" :
"(void *)0");
13073 }
else if (
const auto *CE = dyn_cast<CStyleCastExpr>(E.
get())) {
13080 NullValue ?
"NULL" :
"(void *)0");
13090 bool IsThreeWay = Opc == BO_Cmp;
13091 bool IsOrdered = IsRelational || IsThreeWay;
13102 if (!IsThreeWay || IsAnyPointerType(LHS) || IsAnyPointerType(RHS)) {
13159 auto computeResultTy = [&]() {
13168 std::optional<ComparisonCategoryType> CCT =
13173 if (CompositeTy->
isPointerType() && LHSIsNull != RHSIsNull) {
13177 Diag(Loc, diag::err_typecheck_three_way_comparison_of_pointer_and_zero)
13178 << (LHSIsNull ? LHS.
get()->getSourceRange()
13187 if (!IsOrdered && LHSIsNull != RHSIsNull) {
13188 bool IsEquality = Opc == BO_EQ;
13200 bool IsError = Opc == BO_Cmp;
13202 IsError ? diag::err_typecheck_ordered_comparison_of_function_pointers
13204 ? diag::warn_typecheck_ordered_comparison_of_function_pointers
13205 : diag::ext_typecheck_ordered_comparison_of_function_pointers;
13234 return computeResultTy();
13250 (IsOrdered ? 2 : 1) &&
13255 return computeResultTy();
13269 if (IsRelational) {
13274 Diag(Loc, diag::ext_typecheck_compare_complete_incomplete_pointers)
13280 }
else if (!IsRelational &&
13284 && !LHSIsNull && !RHSIsNull)
13291 if (LCanPointeeTy != RCanPointeeTy) {
13297 diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
13298 << LHSType << RHSType << 0
13304 CastKind Kind = AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion
13310 bool RHSHasCFIUncheckedCallee = RFn && RFn->getCFIUncheckedCalleeAttr();
13311 bool ChangingCFIUncheckedCallee =
13312 LHSHasCFIUncheckedCallee != RHSHasCFIUncheckedCallee;
13314 if (LHSIsNull && !RHSIsNull)
13316 else if (!ChangingCFIUncheckedCallee)
13319 return computeResultTy();
13331 if (!IsOrdered && LHSIsNull && RHSIsNull) {
13334 return computeResultTy();
13338 return computeResultTy();
13349 return computeResultTy();
13353 return computeResultTy();
13362 return computeResultTy();
13367 return computeResultTy();
13371 if (IsRelational &&
13382 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
13383 if (CTSD->isInStdNamespace() &&
13384 llvm::StringSwitch<bool>(CTSD->getName())
13385 .Cases({
"less",
"less_equal",
"greater",
"greater_equal"},
true)
13391 return computeResultTy();
13404 return computeResultTy();
13414 if (!LHSIsNull && !RHSIsNull &&
13415 !
Context.typesAreCompatible(lpointee, rpointee)) {
13416 Diag(Loc, diag::err_typecheck_comparison_of_distinct_blocks)
13421 return computeResultTy();
13428 if (!LHSIsNull && !RHSIsNull) {
13433 Diag(Loc, diag::err_typecheck_comparison_of_distinct_blocks)
13437 if (LHSIsNull && !RHSIsNull)
13440 : CK_AnyPointerToBlockPointerCast);
13444 : CK_AnyPointerToBlockPointerCast);
13445 return computeResultTy();
13454 bool RPtrToVoid = RPT ? RPT->getPointeeType()->isVoidType() :
false;
13456 if (!LPtrToVoid && !RPtrToVoid &&
13457 !
Context.typesAreCompatible(LHSType, RHSType)) {
13464 if (LHSIsNull && !RHSIsNull) {
13470 RPT ? CK_BitCast :CK_CPointerToObjCPointerCast);
13480 LPT ? CK_BitCast :CK_CPointerToObjCPointerCast);
13482 return computeResultTy();
13486 if (!
Context.areComparableObjCPointerTypes(LHSType, RHSType))
13492 if (LHSIsNull && !RHSIsNull)
13496 return computeResultTy();
13502 CK_BlockPointerToObjCPointerCast);
13503 return computeResultTy();
13504 }
else if (!IsOrdered &&
13508 CK_BlockPointerToObjCPointerCast);
13509 return computeResultTy();
13514 unsigned DiagID = 0;
13515 bool isError =
false;
13524 isError ? diag::err_typecheck_ordered_comparison_of_pointer_and_zero
13525 : diag::ext_typecheck_ordered_comparison_of_pointer_and_zero;
13528 DiagID = diag::err_typecheck_comparison_of_pointer_integer;
13530 }
else if (IsOrdered)
13531 DiagID = diag::ext_typecheck_ordered_comparison_of_pointer_integer;
13533 DiagID = diag::ext_typecheck_comparison_of_pointer_integer;
13545 LHSIsNull ? CK_NullToPointer : CK_IntegralToPointer);
13548 RHSIsNull ? CK_NullToPointer : CK_IntegralToPointer);
13549 return computeResultTy();
13553 if (!IsOrdered && RHSIsNull
13556 return computeResultTy();
13558 if (!IsOrdered && LHSIsNull
13561 return computeResultTy();
13564 if (
getLangOpts().getOpenCLCompatibleVersion() >= 200) {
13566 return computeResultTy();
13570 return computeResultTy();
13573 if (LHSIsNull && RHSType->
isQueueT()) {
13575 return computeResultTy();
13578 if (LHSType->
isQueueT() && RHSIsNull) {
13580 return computeResultTy();
13605 "Unhandled vector element size in vector compare");
13625 "Unhandled vector element size in vector compare");
13635 const auto TypeSize =
Context.getTypeSize(ETy);
13637 const QualType IntTy =
Context.getIntTypeForBitwidth(TypeSize,
true);
13638 const llvm::ElementCount VecSize =
Context.getBuiltinVectorTypeInfo(VTy).EC;
13639 return Context.getScalableVectorType(IntTy, VecSize.getKnownMinValue());
13645 if (Opc == BO_Cmp) {
13646 Diag(Loc, diag::err_three_way_vector_comparison);
13675 return Context.getLogicalOperationType();
13677 Diag(Loc, diag::warn_deprecated_altivec_src_compat);
13683 return Context.getLogicalOperationType();
13706 assert(
getLangOpts().
HLSL &&
"matrix comparisons are only supported in HLSL");
13707 assert(Opc != BO_Cmp &&
"three-way comparisons are not supported in HLSL");
13728 return Context.getConstantMatrixType(
Context.BoolTy, MT->getNumRows(),
13729 MT->getNumColumns());
13736 if (Opc == BO_Cmp) {
13737 Diag(Loc, diag::err_three_way_vector_comparison);
13765 if (LHSBuiltinTy && RHSBuiltinTy && LHSBuiltinTy->
isSVEBool() &&
13766 RHSBuiltinTy->isSVEBool())
13785 bool Negative =
false;
13786 bool ExplicitPlus =
false;
13787 const auto *LHSInt = dyn_cast<IntegerLiteral>(XorLHS.
get());
13788 const auto *RHSInt = dyn_cast<IntegerLiteral>(XorRHS.
get());
13794 if (
const auto *UO = dyn_cast<UnaryOperator>(XorRHS.
get())) {
13796 if (Opc != UO_Minus && Opc != UO_Plus)
13798 RHSInt = dyn_cast<IntegerLiteral>(UO->getSubExpr());
13801 Negative = (Opc == UO_Minus);
13802 ExplicitPlus = !Negative;
13808 const llvm::APInt &LeftSideValue = LHSInt->getValue();
13809 llvm::APInt RightSideValue = RHSInt->getValue();
13810 if (LeftSideValue != 2 && LeftSideValue != 10)
13813 if (LeftSideValue.getBitWidth() != RightSideValue.getBitWidth())
13818 llvm::StringRef ExprStr =
13823 llvm::StringRef XorStr =
13826 if (XorStr ==
"xor")
13837 RightSideValue = -RightSideValue;
13838 RHSStr =
"-" + RHSStr;
13839 }
else if (ExplicitPlus) {
13840 RHSStr =
"+" + RHSStr;
13843 StringRef LHSStrRef = LHSStr;
13844 StringRef RHSStrRef = RHSStr;
13847 if (LHSStrRef.starts_with(
"0b") || LHSStrRef.starts_with(
"0B") ||
13848 RHSStrRef.starts_with(
"0b") || RHSStrRef.starts_with(
"0B") ||
13849 LHSStrRef.starts_with(
"0x") || LHSStrRef.starts_with(
"0X") ||
13850 RHSStrRef.starts_with(
"0x") || RHSStrRef.starts_with(
"0X") ||
13851 (LHSStrRef.size() > 1 && LHSStrRef.starts_with(
"0")) ||
13852 (RHSStrRef.size() > 1 && RHSStrRef.starts_with(
"0")) ||
13853 LHSStrRef.contains(
'\'') || RHSStrRef.contains(
'\''))
13858 const llvm::APInt XorValue = LeftSideValue ^ RightSideValue;
13859 int64_t RightSideIntValue = RightSideValue.getSExtValue();
13860 if (LeftSideValue == 2 && RightSideIntValue >= 0) {
13861 std::string SuggestedExpr =
"1 << " + RHSStr;
13862 bool Overflow =
false;
13863 llvm::APInt One = (LeftSideValue - 1);
13864 llvm::APInt PowValue = One.sshl_ov(RightSideValue, Overflow);
13866 if (RightSideIntValue < 64)
13867 S.
Diag(Loc, diag::warn_xor_used_as_pow_base)
13868 << ExprStr <<
toString(XorValue, 10,
true) << (
"1LL << " + RHSStr)
13870 else if (RightSideIntValue == 64)
13871 S.
Diag(Loc, diag::warn_xor_used_as_pow)
13872 << ExprStr <<
toString(XorValue, 10,
true);
13876 S.
Diag(Loc, diag::warn_xor_used_as_pow_base_extra)
13877 << ExprStr <<
toString(XorValue, 10,
true) << SuggestedExpr
13880 ExprRange, (RightSideIntValue == 0) ?
"1" : SuggestedExpr);
13883 S.
Diag(Loc, diag::note_xor_used_as_pow_silence)
13884 << (
"0x2 ^ " + RHSStr) << SuggestXor;
13885 }
else if (LeftSideValue == 10) {
13886 std::string SuggestedValue =
"1e" + std::to_string(RightSideIntValue);
13887 S.
Diag(Loc, diag::warn_xor_used_as_pow_base)
13888 << ExprStr <<
toString(XorValue, 10,
true) << SuggestedValue
13890 S.
Diag(Loc, diag::note_xor_used_as_pow_silence)
13891 << (
"0xA ^ " + RHSStr) << SuggestXor;
13908 getLangOpts().getOpenCLCompatibleVersion() < 120 &&
13935 SemaRef.Diag(Loc, diag::err_matrix_logical_operations_supported_for_hlsl);
13951 bool IsCompAssign) {
13952 if (!IsCompAssign) {
13968 assert((LHSMatType || RHSMatType) &&
"At least one operand must be a matrix");
13970 if (
Context.hasSameType(LHSType, RHSType))
13971 return Context.getCommonSugaredType(LHSType, RHSType);
13977 if (LHSMatType && !RHSMatType) {
13985 if (!LHSMatType && RHSMatType) {
13997 bool IsCompAssign) {
13998 if (!IsCompAssign) {
14009 assert((LHSMatType || RHSMatType) &&
"At least one operand must be a matrix");
14011 if (LHSMatType && RHSMatType) {
14012 if (LHSMatType->getNumColumns() != RHSMatType->
getNumRows())
14015 if (
Context.hasSameType(LHSMatType, RHSMatType))
14016 return Context.getCommonSugaredType(
14020 QualType LHSELTy = LHSMatType->getElementType(),
14022 if (!
Context.hasSameType(LHSELTy, RHSELTy))
14025 return Context.getConstantMatrixType(
14026 Context.getCommonSugaredType(LHSELTy, RHSELTy),
14051 bool IsCompAssign =
14052 Opc == BO_AndAssign || Opc == BO_OrAssign || Opc == BO_XorAssign;
14063 LegalBoolVecOperator,
14093 ExprResult LHSResult = LHS, RHSResult = RHS;
14095 LHSResult, RHSResult, Loc,
14097 if (LHSResult.
isInvalid() || RHSResult.isInvalid())
14099 LHS = LHSResult.
get();
14100 RHS = RHSResult.
get();
14125 bool EnumConstantInBoolContext =
false;
14127 if (
const auto *DREHS = dyn_cast<DeclRefExpr>(HS.get())) {
14128 const auto *ECDHS = dyn_cast<EnumConstantDecl>(DREHS->getDecl());
14129 if (ECDHS && ECDHS->getInitVal() != 0 && ECDHS->getInitVal() != 1)
14130 EnumConstantInBoolContext =
true;
14134 if (EnumConstantInBoolContext)
14135 Diag(Loc, diag::warn_enum_constant_in_bool_context);
14140 const auto *LHSATy = dyn_cast<ArrayType>(LHSTy);
14141 const auto *RHSATy = dyn_cast<ArrayType>(RHSTy);
14142 if ((LHSATy && LHSATy->getElementType().isWebAssemblyReferenceType()) ||
14143 (RHSATy && RHSATy->getElementType().isWebAssemblyReferenceType())) {
14165 Diag(Loc, diag::warn_logical_instead_of_bitwise)
14168 Diag(Loc, diag::note_logical_instead_of_bitwise_change_operator)
14169 << (Opc == BO_LAnd ?
"&" :
"|")
14172 Opc == BO_LAnd ?
"&" :
"|");
14173 if (Opc == BO_LAnd)
14175 Diag(Loc, diag::note_logical_instead_of_bitwise_remove_constant)
14183 if (!
Context.getLangOpts().CPlusPlus) {
14186 if (
Context.getLangOpts().OpenCL &&
14187 Context.getLangOpts().OpenCLVersion < 120) {
14242 const MemberExpr *ME = dyn_cast<MemberExpr>(E);
14243 if (!ME)
return false;
14247 if (!
Base)
return false;
14248 return Base->getMethodDecl() !=
nullptr;
14272 assert(S.
getLangOpts().CPlusPlus &&
"BindingDecl outside of C++?");
14283 assert(Var->
hasLocalStorage() &&
"capture added 'const' to non-local?");
14291 if (
auto *FD = dyn_cast<FunctionDecl>(DC))
14333 bool DiagnosticEmitted =
false;
14337 bool IsDereference =
false;
14338 bool NextIsDereference =
false;
14342 IsDereference = NextIsDereference;
14345 if (
const MemberExpr *ME = dyn_cast<MemberExpr>(E)) {
14346 NextIsDereference = ME->isArrow();
14347 const ValueDecl *VD = ME->getMemberDecl();
14348 if (
const FieldDecl *Field = dyn_cast<FieldDecl>(VD)) {
14350 if (Field->isMutable()) {
14351 assert(DiagnosticEmitted &&
"Expected diagnostic not emitted.");
14356 if (!DiagnosticEmitted) {
14357 S.
Diag(Loc, diag::err_typecheck_assign_const)
14359 << Field->getType();
14360 DiagnosticEmitted =
true;
14363 <<
ConstMember <<
false << Field << Field->getType()
14364 << Field->getSourceRange();
14368 }
else if (
const VarDecl *VDecl = dyn_cast<VarDecl>(VD)) {
14369 if (VDecl->getType().isConstQualified()) {
14370 if (!DiagnosticEmitted) {
14371 S.
Diag(Loc, diag::err_typecheck_assign_const)
14373 << VDecl->getType();
14374 DiagnosticEmitted =
true;
14377 <<
ConstMember <<
true << VDecl << VDecl->getType()
14378 << VDecl->getSourceRange();
14385 dyn_cast<ArraySubscriptExpr>(E)) {
14389 dyn_cast<ExtVectorElementExpr>(E)) {
14396 if (
const CallExpr *CE = dyn_cast<CallExpr>(E)) {
14400 if (!DiagnosticEmitted) {
14401 S.
Diag(Loc, diag::err_typecheck_assign_const) << ExprRange
14403 DiagnosticEmitted =
true;
14406 diag::note_typecheck_assign_const)
14410 }
else if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
14412 if (
const ValueDecl *VD = DRE->getDecl()) {
14414 if (!DiagnosticEmitted) {
14415 S.
Diag(Loc, diag::err_typecheck_assign_const)
14417 DiagnosticEmitted =
true;
14419 S.
Diag(VD->getLocation(), diag::note_typecheck_assign_const)
14420 <<
ConstVariable << VD << VD->getType() << VD->getSourceRange();
14425 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(DC)) {
14426 if (MD->isConst()) {
14427 if (!DiagnosticEmitted) {
14428 S.
Diag(Loc, diag::err_typecheck_assign_const_method)
14429 << ExprRange << MD;
14430 DiagnosticEmitted =
true;
14432 S.
Diag(MD->getLocation(), diag::note_typecheck_assign_const_method)
14433 << MD << MD->getSourceRange();
14439 if (DiagnosticEmitted)
14443 S.
Diag(Loc, diag::err_typecheck_assign_const) << ExprRange <<
ConstUnknown;
14453 const RecordType *Ty,
14456 bool &DiagnosticEmitted) {
14457 std::vector<const RecordType *> RecordTypeList;
14458 RecordTypeList.push_back(Ty);
14459 unsigned NextToCheckIndex = 0;
14462 while (RecordTypeList.size() > NextToCheckIndex) {
14463 bool IsNested = NextToCheckIndex > 0;
14464 for (
const FieldDecl *Field : RecordTypeList[NextToCheckIndex]
14466 ->getDefinitionOrSelf()
14469 QualType FieldTy = Field->getType();
14471 if (!DiagnosticEmitted) {
14472 S.
Diag(Loc, diag::err_typecheck_assign_const)
14474 << IsNested << Field;
14475 DiagnosticEmitted =
true;
14477 S.
Diag(Field->getLocation(), diag::note_typecheck_assign_const)
14479 << FieldTy << Field->getSourceRange();
14484 if (
const auto *FieldRecTy = FieldTy->
getAsCanonical<RecordType>()) {
14485 if (!llvm::is_contained(RecordTypeList, FieldRecTy))
14486 RecordTypeList.push_back(FieldRecTy);
14489 ++NextToCheckIndex;
14498 assert(Ty->
isRecordType() &&
"lvalue was not record?");
14501 bool DiagEmitted =
false;
14503 if (
const MemberExpr *ME = dyn_cast<MemberExpr>(E))
14506 else if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
14531 unsigned DiagID = 0;
14532 bool NeedType =
false;
14539 DiagID = diag::err_block_decl_ref_not_modifiable_lvalue;
14541 DiagID = diag::err_lambda_decl_ref_not_modifiable_lvalue;
14554 if (var->isARCPseudoStrong() &&
14555 (!var->getTypeSourceInfo() ||
14556 !var->getTypeSourceInfo()->getType().isConstQualified())) {
14562 ? diag::err_typecheck_arc_assign_self_class_method
14563 : diag::err_typecheck_arc_assign_self;
14566 }
else if (var->hasAttr<ObjCExternallyRetainedAttr>() ||
14568 DiagID = diag::err_typecheck_arc_assign_externally_retained;
14572 DiagID = diag::err_typecheck_arr_assign_enumeration;
14576 if (Loc != OrigLoc)
14602 DiagID = diag::err_typecheck_array_not_modifiable_lvalue;
14606 DiagID = diag::err_typecheck_non_object_not_modifiable_lvalue;
14610 DiagID = diag::err_typecheck_lvalue_casts_not_supported;
14613 llvm_unreachable(
"did not take early return for MLV_Valid");
14617 if (
const auto *UnaryOp = dyn_cast<UnaryOperator>(E)) {
14619 if (UnaryOp->getOpcode() == UO_Imag &&
14621 DiagID = diag::err_typecheck_lvalue_imag_not_modifiable_lvalue;
14627 DiagID = diag::err_typecheck_expression_not_modifiable_lvalue;
14633 diag::err_typecheck_incomplete_type_not_modifiable_lvalue, E);
14635 DiagID = diag::err_typecheck_duplicate_vector_components_not_mlvalue;
14638 DiagID = diag::err_typecheck_duplicate_matrix_components_not_mlvalue;
14641 llvm_unreachable(
"readonly properties should be processed differently");
14643 DiagID = diag::err_readonly_message_assignment;
14646 DiagID = diag::err_no_subobject_property_setting;
14651 if (Loc != OrigLoc)
14673 MemberExpr *ML = dyn_cast<MemberExpr>(LHSExpr);
14674 MemberExpr *MR = dyn_cast<MemberExpr>(RHSExpr);
14682 if (LHSDecl != RHSDecl)
14687 if (RefTy->getPointeeType().isVolatileQualified())
14690 Sema.
Diag(Loc, diag::warn_identity_field_assign) << 0;
14700 Sema.
Diag(Loc, diag::warn_identity_field_assign) << 1;
14724 bool ShowFullyQualifiedAssigneeName =
false;
14727 Assignee = DR->getDecl();
14728 }
else if (
auto *ME = dyn_cast<MemberExpr>(LHSExpr->
IgnoreParenCasts())) {
14729 Assignee = ME->getMemberDecl();
14730 ShowFullyQualifiedAssigneeName =
true;
14735 ShowFullyQualifiedAssigneeName);
14744 Diag(Loc, diag::err_opencl_half_load_store) << 1
14751 Diag(Loc, diag::err_wasm_table_art) << 0;
14756 if (CompoundType.
isNull()) {
14767 ((
Context.isObjCNSObjectType(LHSType) &&
14769 (
Context.isObjCNSObjectType(RHSType) &&
14774 Diag(Loc, diag::err_objc_object_assignment) << LHSType;
14780 RHSCheck = ICE->getSubExpr();
14781 if (
UnaryOperator *UO = dyn_cast<UnaryOperator>(RHSCheck)) {
14782 if ((UO->getOpcode() == UO_Plus || UO->getOpcode() == UO_Minus) &&
14783 Loc.
isFileID() && UO->getOperatorLoc().isFileID() &&
14789 UO->getSubExpr()->getBeginLoc().
isFileID()) {
14790 Diag(Loc, diag::warn_not_compound_assign)
14791 << (UO->getOpcode() == UO_Plus ?
"+" :
"-")
14792 <<
SourceRange(UO->getOperatorLoc(), UO->getOperatorLoc());
14802 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(InnerLHS);
14818 if (!
Diags.isIgnored(diag::warn_arc_repeated_use_of_weak,
14841 if (CompoundType.
isNull()) {
14867 if (
const CastExpr *CE = dyn_cast<CastExpr>(E)) {
14868 if (CE->getCastKind() == CK_ToVoid) {
14874 CE->getSubExpr()->getType()->isDependentType()) {
14879 if (
const auto *CE = dyn_cast<CallExpr>(E))
14880 return CE->getCallReturnType(Context)->isVoidType();
14904 while (
const BinaryOperator *BO = dyn_cast<BinaryOperator>(LHS)) {
14905 if (BO->getOpcode() != BO_Comma)
14907 LHS = BO->getRHS();
14914 Diag(Loc, diag::warn_comma_operator);
14918 LangOpts.CPlusPlus ?
"static_cast<void>("
14950 diag::err_incomplete_type);
14971 ResType = ResAtomicType->getValueType();
14973 assert(!ResType.
isNull() &&
"no type for increment/decrement expression");
14983 : diag::warn_increment_bool)
14987 S.
Diag(OpLoc, diag::err_increment_decrement_enum) << IsInc << ResType;
15005 S.
DiagCompat(OpLoc, diag_compat::increment_complex)
15022 S.
Diag(OpLoc, diag::err_typecheck_illegal_increment_decrement)
15033 S.
Diag(OpLoc, diag::warn_deprecated_increment_decrement_volatile)
15034 << IsInc << ResType;
15066 case Stmt::DeclRefExprClass:
15068 case Stmt::MemberExprClass:
15076 case Stmt::ArraySubscriptExprClass: {
15081 if (ICE->getSubExpr()->getType()->isArrayType())
15086 case Stmt::UnaryOperatorClass: {
15098 case Stmt::ParenExprClass:
15100 case Stmt::ImplicitCastExprClass:
15104 case Stmt::CXXUuidofExprClass:
15114 AO_Vector_Element = 1,
15115 AO_Property_Expansion = 2,
15116 AO_Register_Variable = 3,
15117 AO_Matrix_Element = 4,
15135 return Diag(OpLoc, diag::err_parens_pointer_member_function)
15140 return Diag(OpLoc, diag::err_typecheck_addrof_dtor)
15141 << DRE->getSourceRange();
15143 if (DRE->getQualifier())
15147 return Diag(OpLoc, diag::err_unqualified_pointer_member_function)
15148 << DRE->getSourceRange();
15151 StringRef Qual = (MD->
getParent()->getName() +
"::").toStringRef(Str);
15152 return Diag(OpLoc, diag::err_unqualified_pointer_member_function)
15153 << DRE->getSourceRange()
15159 if (PTy->getKind() == BuiltinType::Overload) {
15163 Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof_addrof_function)
15171 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
15179 if (PTy->getKind() == BuiltinType::UnknownAny)
15182 if (PTy->getKind() == BuiltinType::BoundMember) {
15183 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
15206 auto* VarRef = dyn_cast<DeclRefExpr>(op);
15207 if (VarRef && VarRef->refersToEnclosingVariableOrCapture()) {
15208 Diag(op->
getExprLoc(), diag::err_opencl_taking_address_capture);
15216 if (uOp->getOpcode() == UO_Deref)
15219 return uOp->getSubExpr()->getType();
15226 if (
auto *FD = dyn_cast_or_null<FunctionDecl>(dcl))
15232 unsigned AddressOfError = AO_No_Error;
15236 Diag(OpLoc, IsError ? diag::err_typecheck_addrof_temporary
15237 : diag::ext_typecheck_addrof_temporary)
15252 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
15270 auto ReturnOrParamTypeIsIncomplete = [&](
QualType T,
15275 diag::note_ptrauth_virtual_function_pointer_incomplete_arg_ret);
15276 Diag(RetArgTypeLoc,
15277 diag::note_ptrauth_virtual_function_incomplete_arg_ret_type)
15284 bool IsIncomplete =
15286 ReturnOrParamTypeIsIncomplete(
15289 IsIncomplete |= ReturnOrParamTypeIsIncomplete(PVD->getType(), OpLoc,
15290 PVD->getBeginLoc());
15296 if (
Context.getTargetInfo().getCXXABI().isMicrosoft())
15305 AddressOfError = AO_Property_Expansion;
15307 Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof)
15311 }
else if (
const auto *DRE = dyn_cast<DeclRefExpr>(op)) {
15312 if (
const auto *MD = dyn_cast_or_null<CXXMethodDecl>(DRE->getDecl()))
15318 AddressOfError = AO_Bit_Field;
15321 AddressOfError = AO_Vector_Element;
15324 AddressOfError = AO_Matrix_Element;
15328 if (
const VarDecl *vd = dyn_cast<VarDecl>(dcl)) {
15333 AddressOfError = AO_Register_Variable;
15336 AddressOfError = AO_Property_Expansion;
15349 if (
auto *DRE = dyn_cast<DeclRefExpr>(op);
15355 diag::err_cannot_form_pointer_to_member_of_reference_type)
15366 if (
Context.getTargetInfo().getCXXABI().isMicrosoft())
15374 llvm_unreachable(
"Unknown/unexpected decl type");
15377 if (AddressOfError != AO_No_Error) {
15394 if (
Context.getTargetInfo().getTriple().isWasm()) {
15397 Diag(OpLoc, diag::err_wasm_ca_reference)
15402 Diag(OpLoc, diag::err_wasm_table_pr)
15408 CheckAddressOfPackedMember(op);
15414 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Exp);
15420 const ParmVarDecl *Param = dyn_cast<ParmVarDecl>(D);
15423 if (
const FunctionDecl* FD = dyn_cast<FunctionDecl>(Param->getDeclContext()))
15424 if (!FD->hasAttr<NonNullAttr>() && !Param->hasAttr<NonNullAttr>())
15427 FD->ModifiedNonNullParams.insert(Param);
15433 bool IsAfterAmp =
false) {
15437 Op = ConvResult.
get();
15449 Result = PT->getPointeeType();
15453 Result = OPT->getPointeeType();
15457 if (PR.
get() != Op)
15462 S.
Diag(OpLoc, diag::err_typecheck_indirection_requires_pointer)
15467 if (
Result->isVoidType()) {
15473 S.
Diag(OpLoc, diag::err_typecheck_indirection_through_void_pointer_cpp)
15476 S.
Diag(OpLoc, diag::ext_typecheck_indirection_through_void_pointer)
15493 default: llvm_unreachable(
"Unknown binop!");
15494 case tok::periodstar: Opc = BO_PtrMemD;
break;
15495 case tok::arrowstar: Opc = BO_PtrMemI;
break;
15496 case tok::star: Opc = BO_Mul;
break;
15497 case tok::slash: Opc = BO_Div;
break;
15498 case tok::percent: Opc = BO_Rem;
break;
15499 case tok::plus: Opc = BO_Add;
break;
15500 case tok::minus: Opc = BO_Sub;
break;
15501 case tok::lessless: Opc = BO_Shl;
break;
15502 case tok::greatergreater: Opc = BO_Shr;
break;
15503 case tok::lessequal: Opc = BO_LE;
break;
15504 case tok::less: Opc = BO_LT;
break;
15505 case tok::greaterequal: Opc = BO_GE;
break;
15506 case tok::greater: Opc = BO_GT;
break;
15507 case tok::exclaimequal: Opc = BO_NE;
break;
15508 case tok::equalequal: Opc = BO_EQ;
break;
15509 case tok::spaceship: Opc = BO_Cmp;
break;
15510 case tok::amp: Opc = BO_And;
break;
15511 case tok::caret: Opc = BO_Xor;
break;
15512 case tok::pipe: Opc = BO_Or;
break;
15513 case tok::ampamp: Opc = BO_LAnd;
break;
15514 case tok::pipepipe: Opc = BO_LOr;
break;
15515 case tok::equal: Opc = BO_Assign;
break;
15516 case tok::starequal: Opc = BO_MulAssign;
break;
15517 case tok::slashequal: Opc = BO_DivAssign;
break;
15518 case tok::percentequal: Opc = BO_RemAssign;
break;
15519 case tok::plusequal: Opc = BO_AddAssign;
break;
15520 case tok::minusequal: Opc = BO_SubAssign;
break;
15521 case tok::lesslessequal: Opc = BO_ShlAssign;
break;
15522 case tok::greatergreaterequal: Opc = BO_ShrAssign;
break;
15523 case tok::ampequal: Opc = BO_AndAssign;
break;
15524 case tok::caretequal: Opc = BO_XorAssign;
break;
15525 case tok::pipeequal: Opc = BO_OrAssign;
break;
15526 case tok::comma: Opc = BO_Comma;
break;
15535 default: llvm_unreachable(
"Unknown unary op!");
15536 case tok::plusplus: Opc = UO_PreInc;
break;
15537 case tok::minusminus: Opc = UO_PreDec;
break;
15538 case tok::amp: Opc = UO_AddrOf;
break;
15539 case tok::star: Opc = UO_Deref;
break;
15540 case tok::plus: Opc = UO_Plus;
break;
15541 case tok::minus: Opc = UO_Minus;
break;
15542 case tok::tilde: Opc = UO_Not;
break;
15543 case tok::exclaim: Opc = UO_LNot;
break;
15544 case tok::kw___real: Opc = UO_Real;
break;
15545 case tok::kw___imag: Opc = UO_Imag;
break;
15546 case tok::kw___extension__: Opc = UO_Extension;
break;
15578 llvm::find_if(Parent->
fields(),
15580 return F->getDeclName() == Name;
15582 return (Field != Parent->
field_end()) ? *Field :
nullptr;
15597 const DeclRefExpr *LHSDeclRef = dyn_cast<DeclRefExpr>(LHSExpr);
15598 const DeclRefExpr *RHSDeclRef = dyn_cast<DeclRefExpr>(RHSExpr);
15599 if (!LHSDeclRef || !RHSDeclRef ||
15607 if (LHSDecl != RHSDecl)
15612 if (RefTy->getPointeeType().isVolatileQualified())
15615 auto Diag = S.
Diag(OpLoc, IsBuiltin ? diag::warn_self_assignment_builtin
15616 : diag::warn_self_assignment_overloaded)
15621 Diag << 1 << SelfAssignField
15634 const Expr *ObjCPointerExpr =
nullptr, *OtherExpr =
nullptr;
15636 const Expr *RHS = R.get();
15639 ObjCPointerExpr = LHS;
15643 ObjCPointerExpr = RHS;
15652 unsigned Diag = diag::warn_objc_pointer_masking;
15661 if (SelArg0.starts_with(
"performSelector"))
15662 Diag = diag::warn_objc_pointer_masking_performSelector;
15679 assert((
isVector(ResultTy, Context.HalfTy) ||
15680 isVector(ResultTy, Context.ShortTy)) &&
15681 "Result must be a vector of half or short");
15684 "both operands expected to be a half vector");
15691 if (
isVector(ResultTy, Context.ShortTy))
15696 ResultTy,
VK, OK, OpLoc, FPFeatures,
15697 BinOpResTy, BinOpResTy);
15701 BinOpResTy,
VK, OK, OpLoc, FPFeatures);
15709 Expr *E1 =
nullptr) {
15710 if (!OpRequiresConversion || Ctx.
getLangOpts().NativeHalfType)
15719 auto HasVectorOfHalfType = [&Ctx](
Expr *E) {
15729 return VT->getElementType().getCanonicalType() == Ctx.
HalfTy;
15734 return HasVectorOfHalfType(E0) && (!E1 || HasVectorOfHalfType(E1));
15739 Expr *RHSExpr,
bool ForFoldExpression) {
15753 if (
Init.isInvalid())
15755 RHSExpr =
Init.get();
15765 bool ConvertHalfVec =
false;
15767 if (!LHS.
isUsable() || !RHS.isUsable())
15777 if (BO_Assign == Opc)
15778 Diag(OpLoc, diag::err_opencl_atomic_init) << 0 << SR;
15806 if (!ResultTy.
isNull()) {
15823 if (
auto *BE = dyn_cast<BlockExpr>(RHS.get()->IgnoreParens()))
15825 if (
auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
15826 if (VD->hasLocalStorage() &&
getCurScope()->isDeclScope(VD))
15827 BE->getBlockDecl()->setCanAvoidCopyToHeap();
15838 Opc == BO_PtrMemI);
15842 ConvertHalfVec =
true;
15849 ConvertHalfVec =
true;
15853 ConvertHalfVec =
true;
15864 ConvertHalfVec =
true;
15867 if (
const auto *BI = dyn_cast<BinaryOperator>(LHSExpr);
15868 !ForFoldExpression && BI && BI->isComparisonOp())
15869 Diag(OpLoc, diag::warn_consecutive_comparison)
15875 ConvertHalfVec =
true;
15879 ConvertHalfVec =
true;
15892 ConvertHalfVec =
true;
15897 ConvertHalfVec =
true;
15899 CompLHSTy = CompResultTy;
15906 CompLHSTy = CompResultTy;
15912 ConvertHalfVec =
true;
15919 ConvertHalfVec =
true;
15928 CompLHSTy = CompResultTy;
15939 CompLHSTy = CompResultTy;
15947 VK = RHS.get()->getValueKind();
15948 OK = RHS.get()->getObjectKind();
15960 (Opc == BO_Comma ||
isVector(RHS.get()->getType(),
Context.HalfTy) ==
15962 "both sides are half vectors or neither sides are");
15964 LHS.
get(), RHS.get());
15967 CheckArrayAccess(LHS.
get());
15968 CheckArrayAccess(RHS.get());
15972 &
Context.Idents.get(
"object_setClass"),
15978 "object_setClass(")
15991 if (CompResultTy.
isNull()) {
15992 if (ConvertHalfVec)
16012 if (ConvertHalfVec)
16017 Context, LHS.
get(), RHS.get(), Opc, ResultTy,
VK, OK, OpLoc,
16034 if (isLeftComp == isRightComp)
16039 bool isLeftBitwise = LHSBO && LHSBO->
isBitwiseOp();
16040 bool isRightBitwise = RHSBO && RHSBO->
isBitwiseOp();
16041 if (isLeftBitwise || isRightBitwise)
16053 Self.Diag(OpLoc, diag::warn_precedence_bitwise_rel)
16056 Self.PDiag(diag::note_precedence_silence) << OpStr,
16057 (isLeftComp ? LHSExpr : RHSExpr)->getSourceRange());
16059 Self.PDiag(diag::note_precedence_bitwise_first)
16074 Self.PDiag(diag::note_precedence_silence)
16083 if (Bop->getOpcode() == BO_LAnd) {
16088 }
else if (Bop->getOpcode() == BO_LOr) {
16089 if (
BinaryOperator *RBop = dyn_cast<BinaryOperator>(Bop->getRHS())) {
16092 if (RBop->getOpcode() == BO_LAnd &&
16104 if (Bop->getOpcode() == BO_LAnd) {
16119 if (Bop->isBitwiseOp() && Bop->getOpcode() < Opc) {
16120 S.
Diag(Bop->getOperatorLoc(), diag::warn_bitwise_op_in_bitwise_op)
16122 << Bop->getSourceRange() << OpLoc;
16124 S.
PDiag(diag::note_precedence_silence)
16125 << Bop->getOpcodeStr(),
16126 Bop->getSourceRange());
16132 Expr *SubExpr, StringRef Shift) {
16134 if (Bop->getOpcode() == BO_Add || Bop->getOpcode() == BO_Sub) {
16135 StringRef Op = Bop->getOpcodeStr();
16136 S.
Diag(Bop->getOperatorLoc(), diag::warn_addition_in_bitshift)
16137 << Bop->getSourceRange() << OpLoc << Shift << Op;
16139 S.
PDiag(diag::note_precedence_silence) << Op,
16140 Bop->getSourceRange());
16156 if (Kind != OO_LessLess && Kind != OO_GreaterGreater)
16159 S.
Diag(OpLoc, diag::warn_overloaded_shift_in_comparison)
16161 << (Kind == OO_LessLess);
16163 S.
PDiag(diag::note_precedence_silence)
16164 << (Kind == OO_LessLess ?
"<<" :
">>"),
16167 S, OpLoc, S.
PDiag(diag::note_evaluate_comparison_first),
16181 if ((Opc == BO_Or || Opc == BO_Xor) &&
16189 if (Opc == BO_LOr && !OpLoc.
isMacroID()) {
16195 || Opc == BO_Shr) {
16211 assert(LHSExpr &&
"ActOnBinOp(): missing left expression");
16212 assert(RHSExpr &&
"ActOnBinOp(): missing right expression");
16221 CheckInvalidBuiltinCountedByRef(LHSExpr, K);
16222 CheckInvalidBuiltinCountedByRef(RHSExpr, K);
16224 return BuildBinOp(S, TokLoc, Opc, LHSExpr, RHSExpr);
16230 if (OverOp !=
OO_None && OverOp != OO_Equal)
16279 Expr *RHSExpr,
bool ForFoldExpression) {
16280 if (!LHSExpr || !RHSExpr)
16292 if (pty->getKind() == BuiltinType::PseudoObject &&
16305 RHSExpr = resolvedRHS.
get();
16319 (pty->getKind() == BuiltinType::BoundMember ||
16320 pty->getKind() == BuiltinType::Overload)) {
16321 auto *OE = dyn_cast<OverloadExpr>(LHSExpr);
16322 if (OE && !OE->hasTemplateKeyword() && !OE->hasExplicitTemplateArgs() &&
16323 llvm::any_of(OE->decls(), [](
NamedDecl *ND) {
16324 return isa<FunctionTemplateDecl>(ND);
16326 Diag(OE->getQualifier() ? OE->getQualifierLoc().getBeginLoc()
16327 : OE->getNameLoc(),
16328 diag::err_template_kw_missing)
16329 << OE->getName().getAsIdentifierInfo();
16336 LHSExpr = LHS.
get();
16343 if (Opc == BO_Assign && pty->getKind() == BuiltinType::Overload) {
16350 ForFoldExpression);
16360 RHSExpr = resolvedRHS.
get();
16366 if (!
HLSL().CheckResourceBinOp(Opc, LHSExpr, RHSExpr, OpLoc))
16369 std::optional<ExprResult> ConvRHS =
16371 if (ConvRHS &&
Context.hasSameUnqualifiedType(
16372 LHSExpr->
getType(), ConvRHS->get()->getType())) {
16373 assert(!ConvRHS->isInvalid());
16374 RHSExpr = ConvRHS->get();
16380 bool CanOverloadBinOp =
16384 bool TypeDependent =
16388 if (CanOverloadBinOp && (TypeDependent || Overloadable))
16396 "Should only occur in error-recovery path.");
16402 Context, LHSExpr, RHSExpr, Opc,
16422 ResultType = RHSExpr->
getType();
16425 ResultType =
Context.DependentTy;
16438 if (
T.isNull() ||
T->isDependentType())
16454 bool CanOverflow =
false;
16456 bool ConvertHalfVec =
false;
16465 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16472 if (Opc == UO_AddrOf)
16473 return ExprError(
Diag(OpLoc, diag::err_hlsl_operator_unsupported) << 0);
16474 if (Opc == UO_Deref)
16475 return ExprError(
Diag(OpLoc, diag::err_hlsl_operator_unsupported) << 1);
16480 resultType =
Context.DependentTy;
16489 Opc == UO_PreInc || Opc == UO_PostInc,
16490 Opc == UO_PreInc || Opc == UO_PreDec);
16495 CheckAddressOfNoDeref(InputExpr);
16508 CanOverflow = Opc == UO_Minus &&
16521 if (ConvertHalfVec)
16528 (!
Context.getLangOpts().ZVector ||
16538 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16549 Diag(OpLoc, diag::ext_integer_complement_complex)
16557 if (!
T->isIntegerType())
16558 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16561 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16577 resultType =
Context.FloatTy;
16583 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16589 if (
Context.getLangOpts().CPlusPlus) {
16594 }
else if (
Context.getLangOpts().OpenCL &&
16595 Context.getLangOpts().OpenCLVersion < 120) {
16599 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16612 Input.
get(), resultType,
16617 if (
Context.getLangOpts().OpenCL &&
16618 Context.getLangOpts().getOpenCLCompatibleVersion() < 120) {
16622 if (!
T->isIntegerType())
16623 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16629 }
else if (
Context.getLangOpts().CPlusPlus &&
16633 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16639 }
else if (resultType ==
Context.AMDGPUFeaturePredicateTy) {
16640 resultType =
Context.getLogicalOperationType();
16644 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16650 resultType =
Context.getLogicalOperationType();
16678 "the co_await expression must be non-dependant before "
16679 "building operator co_await");
16690 if (Opc != UO_AddrOf && Opc != UO_Deref)
16691 CheckArrayAccess(Input.
get());
16697 if (Opc == UO_Deref && UO->getType()->hasAttr(attr::NoDeref) &&
16703 if (ConvertHalfVec)
16709 if (
DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
16710 if (!DRE->getQualifier())
16720 return Method->isImplicitObjectMemberFunction();
16726 if (!ULE->getQualifier())
16731 if (
Method->isImplicitObjectMemberFunction())
16752 if (pty->getKind() == BuiltinType::PseudoObject &&
16757 if (Opc == UO_Extension)
16762 if (Opc == UO_AddrOf &&
16763 (pty->getKind() == BuiltinType::Overload ||
16764 pty->getKind() == BuiltinType::UnknownAny ||
16765 pty->getKind() == BuiltinType::BoundMember))
16790 Expr *Input,
bool IsAfterAmp) {
16800 OpLoc, LabLoc, TheDecl,
Context.getPointerType(
Context.VoidTy));
16834 assert(!
Cleanup.exprNeedsCleanups() &&
16835 "cleanups within StmtExpr not correctly bound!");
16845 bool StmtExprMayBindToTemp =
false;
16847 if (
const auto *LastStmt = dyn_cast<ValueStmt>(Compound->
body_back())) {
16848 if (
const Expr *
Value = LastStmt->getExprStmt()) {
16849 StmtExprMayBindToTemp =
true;
16857 Expr *ResStmtExpr =
16859 if (StmtExprMayBindToTemp)
16861 return ResStmtExpr;
16884 auto *Cast = dyn_cast<ImplicitCastExpr>(E);
16885 if (Cast && Cast->getCastKind() == CK_ARCConsumeObject)
16886 return Cast->getSubExpr();
16907 return ExprError(
Diag(BuiltinLoc, diag::err_offsetof_record_type)
16908 << ArgTy << TypeRange);
16914 diag::err_offsetof_incomplete_type, TypeRange))
16917 bool DidWarnAboutNonPOD =
false;
16933 CurrentType =
Context.DependentTy;
16951 Exprs.push_back(Idx);
16963 CurrentType =
Context.DependentTy;
16969 diag::err_offsetof_incomplete_type))
16986 bool IsSafe =
LangOpts.CPlusPlus11? CRD->isStandardLayout() : CRD->isPOD();
16988 LangOpts.CPlusPlus11? diag::ext_offsetof_non_standardlayout_type
16989 : diag::ext_offsetof_non_pod_type;
16992 Diag(BuiltinLoc, DiagID)
16995 DidWarnAboutNonPOD =
true;
17006 MemberDecl = IndirectMemberDecl->getAnonField();
17013 if (!R.isAmbiguous())
17014 Diag(BuiltinLoc, diag::err_no_member)
17031 if (IndirectMemberDecl)
17038 Context.getCanonicalTagType(Parent), Paths)) {
17040 Diag(D.
getEndLoc(), diag::err_offsetof_field_of_virtual_base)
17050 if (IndirectMemberDecl) {
17051 for (
auto *FI : IndirectMemberDecl->chain()) {
17063 Comps, Exprs, RParenLoc);
17087 assert((CondExpr && LHSExpr && RHSExpr) &&
"Missing type argument(s)");
17092 bool CondIsTrue =
false;
17094 resType =
Context.DependentTy;
17097 llvm::APSInt condEval(32);
17099 CondExpr, &condEval, diag::err_typecheck_choose_expr_requires_constant);
17102 CondExpr = CondICE.
get();
17103 CondIsTrue = condEval.getZExtValue();
17106 Expr *ActiveExpr = CondIsTrue ? LHSExpr : RHSExpr;
17108 resType = ActiveExpr->
getType();
17114 resType,
VK, OK, RPLoc, CondIsTrue);
17126 Decl *ManglingContextDecl;
17127 std::tie(MCtx, ManglingContextDecl) =
17131 Block->setBlockMangling(ManglingNumber, ManglingContextDecl);
17153 "block-id should have no identifier!");
17164 assert(
T->isFunctionType() &&
17165 "GetTypeForDeclarator made a non-function block signature");
17181 unsigned Size =
Result.getFullDataSize();
17182 Sig =
Context.CreateTypeSourceInfo(
Result.getType(), Size);
17193 QualType RetTy = Fn->getReturnType();
17203 if (RetTy !=
Context.DependentTy) {
17211 if (ExplicitSignature) {
17212 for (
unsigned I = 0, E = ExplicitSignature.
getNumParams(); I != E; ++I) {
17214 if (Param->getIdentifier() ==
nullptr && !Param->isImplicit() &&
17218 Diag(Param->getLocation(), diag::ext_parameter_name_omitted_c23);
17220 Params.push_back(Param);
17226 for (
const auto &I : Fn->param_types()) {
17229 Params.push_back(Param);
17234 if (!Params.empty()) {
17245 AI->setOwningFunction(CurBlock->
TheDecl);
17248 if (AI->getIdentifier()) {
17254 if (AI->isInvalidDecl())
17273 Diag(CaretLoc, diag::err_blocks_disable) <<
LangOpts.OpenCL;
17278 assert(!
Cleanup.exprNeedsCleanups() &&
17279 "cleanups within block not correctly bound!");
17294 bool NoReturn = BD->
hasAttr<NoReturnAttr>();
17302 if (NoReturn && !Ext.getNoReturn()) Ext = Ext.
withNoReturn(
true);
17308 BlockTy =
Context.getFunctionType(RetTy, {}, EPI);
17329 BlockTy =
Context.getFunctionType(RetTy, {}, EPI);
17333 BlockTy =
Context.getBlockPointerType(BlockTy);
17337 !
PP.isCodeCompletionEnabled())
17342 if (Body &&
getCurFunction()->HasPotentialAvailabilityViolations)
17368 Expr *CopyExpr =
nullptr;
17395 if (!
Result.isInvalid() &&
17396 !
Result.get()->getType().isConstQualified()) {
17398 Result.get()->getType().withConst(),
17402 if (!
Result.isInvalid()) {
17412 if (!
Result.isInvalid() &&
17416 CopyExpr =
Result.get();
17423 Captures.push_back(NewCap);
17437 if (
Result->getBlockDecl()->hasCaptures()) {
17440 Cleanup.setExprNeedsCleanups(
true);
17444 for (
const auto &CI :
Result->getBlockDecl()->captures()) {
17445 const VarDecl *var = CI.getVariable();
17460 {Result},
Result->getType());
17474 Expr *OrigExpr = E;
17488 Context.getTargetInfo().getTriple().isNVPTX())
17515 "__builtin_zos_va_list must be an array type");
17520 VaListType = ZOSVaListType;
17529 VaListType =
Context.getArrayDecayedType(VaListType);
17541 if (
Init.isInvalid())
17557 diag::err_first_argument_to_va_arg_not_of_type_va_list)
17562 diag::err_second_parameter_to_va_arg_incomplete,
17568 diag::err_second_parameter_to_va_arg_abstract,
17575 ? diag::warn_second_parameter_to_va_arg_ownership_qualified
17576 : diag::warn_second_parameter_to_va_arg_not_pod)
17583 PDiag(diag::warn_second_parameter_to_va_arg_array)
17616 UnderlyingType = ED->getIntegerType();
17617 if (
Context.typesAreCompatible(PromoteType, UnderlyingType,
17630 ?
Context.getCorrespondingSignedType(UnderlyingType)
17631 :
Context.getCorrespondingUnsignedType(UnderlyingType);
17632 if (
Context.typesAreCompatible(PromoteType, UnderlyingType,
17638 PromoteType =
Context.DoubleTy;
17639 if (!PromoteType.
isNull())
17641 PDiag(diag::warn_second_parameter_to_va_arg_never_compatible)
17656 if (pw ==
Context.getTargetInfo().getIntWidth())
17658 else if (pw ==
Context.getTargetInfo().getLongWidth())
17660 else if (pw ==
Context.getTargetInfo().getLongLongWidth())
17663 llvm_unreachable(
"I don't know size of pointer!");
17680 if ((SLDecl->isCompleteDefinition() || SLDecl->isBeingDefined()) &&
17689 S.
Diag(Loc, diag::err_std_source_location_impl_not_found);
17697 S.
Diag(Loc, diag::err_std_source_location_impl_malformed);
17701 unsigned Count = 0;
17703 StringRef Name = F->getName();
17705 if (Name ==
"_M_file_name") {
17706 if (F->getType() !=
17710 }
else if (Name ==
"_M_function_name") {
17711 if (F->getType() !=
17715 }
else if (Name ==
"_M_line") {
17716 if (!F->getType()->isIntegerType())
17719 }
else if (Name ==
"_M_column") {
17720 if (!F->getType()->isIntegerType())
17729 S.
Diag(Loc, diag::err_std_source_location_impl_malformed);
17752 ResultTy =
Context.UnsignedIntTy;
17761 ResultTy =
Context.getPointerType(
17780 Data->BinaryData = BinaryData;
17784 Data->getDataElementCount());
17788 const Expr *SrcExpr) {
17797 auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl());
17810 bool *Complained) {
17812 *Complained =
false;
17815 bool CheckInferredResultType =
false;
17817 unsigned DiagKind = 0;
17819 bool MayHaveConvFixit =
false;
17820 bool MayHaveFunctionDiff =
false;
17831 DiagKind = diag::warn_compatible_implicit_pointer_conv;
17835 DiagKind = diag::err_typecheck_convert_pointer_int;
17838 DiagKind = diag::ext_typecheck_convert_pointer_int;
17841 MayHaveConvFixit =
true;
17845 DiagKind = diag::err_typecheck_convert_int_pointer;
17848 DiagKind = diag::ext_typecheck_convert_int_pointer;
17851 MayHaveConvFixit =
true;
17855 diag::warn_typecheck_convert_incompatible_function_pointer_strict;
17857 MayHaveConvFixit =
true;
17861 DiagKind = diag::err_typecheck_convert_incompatible_function_pointer;
17864 DiagKind = diag::ext_typecheck_convert_incompatible_function_pointer;
17867 MayHaveConvFixit =
true;
17871 DiagKind = diag::err_arc_typecheck_convert_incompatible_pointer;
17873 DiagKind = diag::err_typecheck_convert_incompatible_pointer;
17876 DiagKind = diag::ext_typecheck_convert_incompatible_pointer;
17880 if (CheckInferredResultType) {
17886 MayHaveConvFixit =
true;
17890 DiagKind = diag::err_typecheck_convert_incompatible_pointer_sign;
17893 DiagKind = diag::ext_typecheck_convert_incompatible_pointer_sign;
17898 DiagKind = diag::err_typecheck_convert_pointer_void_func;
17901 DiagKind = diag::ext_typecheck_convert_pointer_void_func;
17907 SrcType =
Context.getDecayedType(SrcType);
17914 DiagKind = diag::err_typecheck_incompatible_address_space;
17917 DiagKind = diag::err_typecheck_incompatible_ownership;
17920 DiagKind = diag::err_typecheck_incompatible_ptrauth;
17924 llvm_unreachable(
"unknown error case for discarding qualifiers!");
17929 SrcType =
Context.getArrayDecayedType(SrcType);
17931 DiagKind = diag::ext_typecheck_convert_discards_overflow_behavior;
17947 DiagKind = diag::err_typecheck_convert_discards_qualifiers;
17950 DiagKind = diag::ext_typecheck_convert_discards_qualifiers;
17957 DiagKind = diag::err_nested_pointer_qualifier_mismatch;
17959 DiagKind = diag::ext_nested_pointer_qualifier_mismatch;
17963 DiagKind = diag::err_typecheck_incompatible_nested_address_space;
17967 DiagKind = diag::err_int_to_block_pointer;
17971 DiagKind = diag::err_typecheck_convert_incompatible_block_pointer;
17978 for (
auto *srcProto : srcOPT->
quals()) {
17984 IFace = IFaceT->getDecl();
17989 for (
auto *dstProto : dstOPT->
quals()) {
17995 IFace = IFaceT->getDecl();
17998 DiagKind = diag::err_incompatible_qualified_id;
18001 DiagKind = diag::warn_incompatible_qualified_id;
18007 DiagKind = diag::err_incompatible_vectors;
18010 DiagKind = diag::warn_incompatible_vectors;
18014 DiagKind = diag::err_arc_weak_unavailable_assign;
18021 "Unexpected function type found in IncompatibleOBTKinds assignment");
18023 SrcType =
Context.getDecayedType(SrcType);
18025 auto getOBTKindName = [](
QualType Ty) -> StringRef {
18026 if (Ty->isPointerType())
18027 Ty = Ty->getPointeeType();
18028 if (
const auto *OBT = Ty->getAs<OverflowBehaviorType>()) {
18029 return OBT->getBehaviorKind() ==
18030 OverflowBehaviorType::OverflowBehaviorKind::Trap
18034 llvm_unreachable(
"OBT kind unhandled");
18037 Diag(Loc, diag::err_incompatible_obt_kinds_assignment)
18038 << DstType << SrcType << getOBTKindName(DstType)
18039 << getOBTKindName(SrcType);
18046 *Complained =
true;
18050 DiagKind = diag::err_typecheck_convert_incompatible;
18052 MayHaveConvFixit =
true;
18054 MayHaveFunctionDiff =
true;
18063 FirstType = DstType;
18064 SecondType = SrcType;
18074 FirstType = SrcType;
18075 SecondType = DstType;
18084 FDiag << FirstType << SecondType << ActionForDiag
18087 if (DiagKind == diag::ext_typecheck_convert_incompatible_pointer_sign ||
18088 DiagKind == diag::err_typecheck_convert_incompatible_pointer_sign) {
18098 if (!ConvHints.
isNull()) {
18103 if (MayHaveConvFixit) { FDiag << (
unsigned) (ConvHints.
Kind); }
18105 if (MayHaveFunctionDiff)
18109 if ((DiagKind == diag::warn_incompatible_qualified_id ||
18110 DiagKind == diag::err_incompatible_qualified_id) &&
18112 Diag(IFace->
getLocation(), diag::note_incomplete_class_and_qualified_id)
18115 if (SecondType ==
Context.OverloadTy)
18119 if (CheckInferredResultType)
18127 *Complained =
true;
18138 return S.
Diag(Loc, diag::err_ice_not_integral)
18142 return S.
Diag(Loc, diag::err_expr_not_ice) << S.
LangOpts.CPlusPlus;
18157 IDDiagnoser(
unsigned DiagID)
18161 return S.
Diag(Loc, DiagID);
18163 } Diagnoser(DiagID);
18176 return S.
Diag(Loc, diag::ext_expr_not_ice) << S.
LangOpts.CPlusPlus;
18198 BaseDiagnoser(BaseDiagnoser) {}
18207 return S.
Diag(Loc, diag::err_ice_incomplete_type) <<
T;
18212 return S.
Diag(Loc, diag::err_ice_explicit_conversion) <<
T << ConvTy;
18223 return S.
Diag(Loc, diag::err_ice_ambiguous_conversion) <<
T;
18234 llvm_unreachable(
"conversion functions are permitted");
18236 } ConvertDiagnoser(Diagnoser);
18242 E = Converted.
get();
18263 E = RValueExpr.
get();
18281 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
18282 diag::note_invalid_subexpr_in_const_expr) {
18283 DiagLoc = Notes[0].first;
18306 EvalResult.
Diag = &Notes;
18321 if (!MSWarning.empty()) {
18325 for (
auto &Info : MSWarning)
18326 Diag(Info.first, Info.second);
18342 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
18343 diag::note_invalid_subexpr_in_const_expr) {
18344 DiagLoc = Notes[0].first;
18370 class TransformToPE :
public TreeTransform<TransformToPE> {
18374 TransformToPE(
Sema &SemaRef) : BaseTransform(SemaRef) { }
18377 bool AlwaysRebuild() {
return true; }
18378 bool ReplacingOriginal() {
return true; }
18387 ExprResult TransformDeclRefExpr(DeclRefExpr *E) {
18389 !SemaRef.isUnevaluatedContext())
18391 diag::err_invalid_non_static_member_use)
18394 return BaseTransform::TransformDeclRefExpr(E);
18398 ExprResult TransformUnaryOperator(UnaryOperator *E) {
18402 return BaseTransform::TransformUnaryOperator(E);
18410 return SkipLambdaBody(E, Body);
18417 "Should only transform unevaluated expressions");
18422 return TransformToPE(*this).TransformExpr(E);
18427 "Should only transform unevaluated expressions");
18431 return TransformToPE(*this).TransformType(TInfo);
18439 LambdaContextDecl, ExprContext);
18453 Prev.isImmediateFunctionContext() || Prev.isConstantEvaluated();
18456 Prev.InImmediateEscalatingFunctionContext;
18524 if (
const auto *E = dyn_cast<UnaryOperator>(PossibleDeref)) {
18525 if (E->getOpcode() == UO_Deref)
18526 return CheckPossibleDeref(S, E->getSubExpr());
18527 }
else if (
const auto *E = dyn_cast<ArraySubscriptExpr>(PossibleDeref)) {
18528 return CheckPossibleDeref(S, E->getBase());
18529 }
else if (
const auto *E = dyn_cast<MemberExpr>(PossibleDeref)) {
18530 return CheckPossibleDeref(S, E->getBase());
18531 }
else if (
const auto E = dyn_cast<DeclRefExpr>(PossibleDeref)) {
18534 if (
const auto *Ptr = Ty->
getAs<PointerType>())
18535 Inner =
Ptr->getPointeeType();
18537 Inner = Arr->getElementType();
18541 if (Inner->
hasAttr(attr::NoDeref))
18551 const DeclRefExpr *DeclRef = CheckPossibleDeref(*
this, E);
18558 Diag(E->
getExprLoc(), diag::warn_dereference_of_noderef_type_no_decl)
18573 if (BO->getOpcode() == BO_Assign) {
18575 llvm::erase(LHSs, BO->getLHS());
18583 "Cannot mark an immediate escalating expression outside of an "
18584 "immediate escalating context");
18587 if (
auto *DeclRef =
18588 dyn_cast<DeclRefExpr>(
Call->getCallee()->IgnoreImplicit()))
18589 DeclRef->setIsImmediateEscalating(
true);
18590 }
else if (
auto *Ctr = dyn_cast<CXXConstructExpr>(E->
IgnoreImplicit())) {
18591 Ctr->setIsImmediateEscalating(
true);
18592 }
else if (
auto *DeclRef = dyn_cast<DeclRefExpr>(E->
IgnoreImplicit())) {
18593 DeclRef->setIsImmediateEscalating(
true);
18595 assert(
false &&
"expected an immediately escalating expression");
18598 FI->FoundImmediateEscalatingExpression =
true;
18613 if (
auto *DeclRef =
18614 dyn_cast<DeclRefExpr>(
Call->getCallee()->IgnoreImplicit()))
18623 auto CheckConstantExpressionAndKeepResult = [&]() {
18626 Eval,
getASTContext(), ConstantExprKind::ImmediateInvocation);
18628 Cached = std::move(Eval.
Val);
18636 !CheckConstantExpressionAndKeepResult()) {
18641 if (
Cleanup.exprNeedsCleanups()) {
18658 Cleanup.cleanupsHaveSideEffects(), {});
18671 ExprEvalContexts.back().ImmediateInvocationCandidates.emplace_back(Res, 0);
18679 Eval.
Diag = &Notes;
18683 if (!
Result || !Notes.empty()) {
18686 if (
auto *
FunctionalCast = dyn_cast<CXXFunctionalCastExpr>(InnerExpr))
18689 if (
auto *
Call = dyn_cast<CallExpr>(InnerExpr))
18691 else if (
auto *
Call = dyn_cast<CXXConstructExpr>(InnerExpr))
18692 FD =
Call->getConstructor();
18693 else if (
auto *Cast = dyn_cast<CastExpr>(InnerExpr))
18694 FD = dyn_cast_or_null<FunctionDecl>(Cast->getConversionFunction());
18697 "could not find an immediate function in this expression");
18704 SemaRef.
Diag(Context->Loc, diag::note_invalid_consteval_initializer)
18706 SemaRef.
Diag(Context->Decl->getBeginLoc(), diag::note_declared_at);
18710 for (
auto &
Note : Notes)
18722 llvm::SmallPtrSetImpl<DeclRefExpr *> &DRSet;
18726 ComplexRemove(
Sema &SemaRef, llvm::SmallPtrSetImpl<DeclRefExpr *> &DR,
18730 :
Base(SemaRef), DRSet(DR), IISet(II), CurrentII(Current) {}
18732 auto It = std::find_if(CurrentII, IISet.rend(),
18734 return Elem.getPointer() == E;
18740 if (It == IISet.rend()) {
18742 CurrentII->setInt(1);
18749 return Base::TransformConstantExpr(E);
18750 RemoveImmediateInvocation(E);
18751 return Base::TransformExpr(E->
getSubExpr());
18757 return Base::TransformCXXOperatorCallExpr(E);
18771 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(
Init))
18772 Init = ICE->getSubExpr();
18773 else if (
auto *ICE = dyn_cast<MaterializeTemporaryExpr>(
Init))
18774 Init = ICE->getSubExpr();
18780 if (
auto *CE = dyn_cast<ConstantExpr>(
Init);
18781 CE && CE->isImmediateInvocation())
18782 RemoveImmediateInvocation(CE);
18783 return Base::TransformInitializer(
Init, NotCopyInit);
18799 bool AlwaysRebuild() {
return false; }
18800 bool ReplacingOriginal() {
return true; }
18801 bool AllowSkippingCXXConstructExpr() {
18802 bool Res = AllowSkippingFirstCXXConstructExpr;
18803 AllowSkippingFirstCXXConstructExpr =
true;
18806 bool AllowSkippingFirstCXXConstructExpr =
true;
18817 Transformer.AllowSkippingFirstCXXConstructExpr =
false;
18819 ExprResult Res = Transformer.TransformExpr(It->getPointer()->getSubExpr());
18825 It->getPointer()->setSubExpr(Res.
get());
18845 if (VD && (VD->isUsableInConstantExpressions(
SemaRef.
Context) ||
18846 VD->hasConstantInitialization())) {
18879 llvm::SmallPtrSetImpl<DeclRefExpr *> &DRSet;
18880 SimpleRemove(llvm::SmallPtrSetImpl<DeclRefExpr *> &S) : DRSet(S) {}
18883 return DRSet.size();
18886 Visitor.TraverseStmt(
18896 if (DR->isImmediateEscalating())
18900 if (
const auto *MD = dyn_cast<CXXMethodDecl>(ND);
18902 ND = MD->getParent();
18909 bool ImmediateEscalating =
false;
18910 bool IsPotentiallyEvaluated =
18920 SemaRef.
Diag(DR->getBeginLoc(), diag::err_invalid_consteval_take_address)
18921 << ND << isa<CXXRecordDecl>(ND) << FD->isConsteval();
18922 if (!FD->getBuiltinID())
18926 SemaRef.
Diag(Context->Loc, diag::note_invalid_consteval_initializer)
18928 SemaRef.
Diag(Context->Decl->getBeginLoc(), diag::note_declared_at);
18930 if (FD->isImmediateEscalating() && !FD->isConsteval())
18944 (Rec.
ExprContext == ExpressionKind::EK_TemplateArgument ||
18952 D = diag::err_lambda_unevaluated_operand;
18958 D = diag::err_lambda_in_constant_expression;
18959 }
else if (Rec.
ExprContext == ExpressionKind::EK_TemplateArgument) {
18962 D = diag::err_lambda_in_invalid_context;
18964 llvm_unreachable(
"Couldn't infer lambda error message.");
18966 for (
const auto *L : Rec.
Lambdas)
18967 Diag(L->getBeginLoc(), D);
18987 Diag(BO->getBeginLoc(), diag::warn_deprecated_simple_assign_volatile)
19058 llvm_unreachable(
"Invalid context");
19104 : FD(FD), Param(Param) {}
19111 CCName =
"stdcall";
19114 CCName =
"fastcall";
19117 CCName =
"vectorcall";
19120 llvm_unreachable(
"CC does not need mangling");
19123 S.
Diag(Loc, diag::err_cconv_incomplete_param_type)
19124 << Param->getDeclName() << FD->
getDeclName() << CCName;
19129 ParamIncompleteTypeDiagnoser Diagnoser(FD, Param);
19135enum class OdrUseContext {
19154 if (Context.isUnevaluated())
19155 return OdrUseContext::None;
19158 return OdrUseContext::Dependent;
19160 if (Context.isDiscardedStatementContext())
19161 return OdrUseContext::FormallyOdrUsed;
19163 else if (Context.Context ==
19165 return OdrUseContext::FormallyOdrUsed;
19167 return OdrUseContext::Used;
19171 if (!
Func->isConstexpr())
19174 if (
Func->isImplicitlyInstantiable() || !
Func->isUserProvided())
19181 auto *CCD = dyn_cast<CXXConstructorDecl>(
Func);
19182 return CCD && CCD->getInheritedConstructor();
19186 bool MightBeOdrUse) {
19187 assert(
Func &&
"No function?");
19189 Func->setReferenced();
19202 OdrUseContext OdrUse =
19204 if (IsRecursiveCall && OdrUse == OdrUseContext::Used)
19205 OdrUse = OdrUseContext::FormallyOdrUsed;
19209 if (
Func->isTrivial() && !
Func->hasAttr<DLLExportAttr>() &&
19210 OdrUse == OdrUseContext::Used) {
19213 OdrUse = OdrUseContext::FormallyOdrUsed;
19215 OdrUse = OdrUseContext::FormallyOdrUsed;
19222 bool NeededForConstantEvaluation =
19247 bool NeedDefinition =
19248 !IsRecursiveCall &&
19249 (OdrUse == OdrUseContext::Used ||
19250 (NeededForConstantEvaluation && !
Func->isPureVirtual()));
19257 if (NeedDefinition &&
19259 Func->getMemberSpecializationInfo()))
19266 if (NeedDefinition && !
Func->getBody()) {
19269 dyn_cast<CXXConstructorDecl>(
Func)) {
19282 }
else if (
Constructor->getInheritedConstructor()) {
19286 dyn_cast<CXXDestructorDecl>(
Func)) {
19296 if (MethodDecl->isOverloadedOperator() &&
19297 MethodDecl->getOverloadedOperator() == OO_Equal) {
19299 if (MethodDecl->isDefaulted() && !MethodDecl->isDeleted()) {
19300 if (MethodDecl->isCopyAssignmentOperator())
19302 else if (MethodDecl->isMoveAssignmentOperator())
19306 MethodDecl->getParent()->isLambda()) {
19313 }
else if (MethodDecl->isVirtual() &&
getLangOpts().AppleKext)
19317 if (
Func->isDefaulted() && !
Func->isDeleted()) {
19325 if (
Func->isImplicitlyInstantiable()) {
19327 Func->getTemplateSpecializationKindForInstantiation();
19329 bool FirstInstantiation = PointOfInstantiation.
isInvalid();
19330 if (FirstInstantiation) {
19331 PointOfInstantiation = Loc;
19332 if (
auto *MSI =
Func->getMemberSpecializationInfo())
19333 MSI->setPointOfInstantiation(Loc);
19336 Func->setTemplateSpecializationKind(TSK, PointOfInstantiation);
19341 PointOfInstantiation = Loc;
19345 Func->isConstexpr()) {
19350 std::make_pair(
Func, PointOfInstantiation));
19351 else if (
Func->isConstexpr())
19357 Func->setInstantiationIsPending(
true);
19359 std::make_pair(
Func, PointOfInstantiation));
19360 if (llvm::isTimeTraceVerbose()) {
19361 llvm::timeTraceAddInstantEvent(
"DeferInstantiation", [&] {
19363 llvm::raw_string_ostream
OS(Name);
19370 Consumer.HandleCXXImplicitFunctionInstantiation(
Func);
19375 for (
auto *i :
Func->redecls()) {
19376 if (!i->isUsed(
false) && i->isImplicitlyInstantiable())
19394 if (
Init->isInClassMemberInitializer())
19396 MarkDeclarationsReferencedInExpr(Init->getInit());
19417 if (
LangOpts.OffloadImplicitHostDeviceTemplates &&
LangOpts.CUDAIsDevice &&
19422 if (OdrUse == OdrUseContext::Used && !
Func->isUsed(
false)) {
19424 if (!
Func->isDefined() && !
Func->isInAnotherModuleUnit()) {
19425 if (mightHaveNonExternalLinkage(
Func))
19427 else if (
Func->getMostRecentDecl()->isInlined() &&
19429 !
Func->getMostRecentDecl()->hasAttr<GNUInlineAttr>())
19447 if (
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
19448 if (
auto *Dtor = dyn_cast<CXXDestructorDecl>(
Func)) {
19468 const unsigned *
const FunctionScopeIndexToStopAt =
nullptr) {
19471 VarDecl *Var =
V->getPotentiallyDecomposedVarDecl();
19472 assert(Var &&
"expected a capturable variable");
19482 QualType CaptureType, DeclRefType;
19488 DeclRefType, FunctionScopeIndexToStopAt);
19503 << 2 << 1 << Var << UserTarget;
19506 ? diag::note_cuda_const_var_unpromoted
19507 : diag::note_cuda_host_var);
19516 Var->
hasAttr<CUDADeviceAttr>() &&
19517 !Var->
getAttr<CUDADeviceAttr>()->isImplicit())) &&
19518 !Var->
hasAttr<CUDASharedAttr>() &&
19534 (!FD || (!FD->getDescribedFunctionTemplate() &&
19546 unsigned CapturingScopeIndex) {
19554 var->getDeclContext()->getEnclosingNonExpansionStatementContext();
19574 unsigned ContextKind = 3;
19584 S.
Diag(loc, diag::err_reference_to_local_in_enclosing_context)
19585 << var << ValueKind << ContextKind << VarDC;
19586 S.
Diag(var->getLocation(), diag::note_entity_declared_at)
19595 bool &SubCapturesAreNested,
19601 SubCapturesAreNested =
true;
19654 "Only variables and structured bindings can be captured");
19665 S.
Diag(Loc, diag::err_lambda_capture_anonymous_var);
19674 S.
Diag(Loc, diag::err_ref_vm_type);
19685 S.
Diag(Loc, diag::err_ref_flexarray_type);
19687 S.
Diag(Loc, diag::err_lambda_capture_flexarray_type) << Var;
19692 const bool HasBlocksAttr = Var->
hasAttr<BlocksAttr>();
19697 S.
Diag(Loc, diag::err_capture_block_variable) << Var << !IsLambda;
19706 S.
Diag(Loc, diag::err_opencl_block_ref_block);
19716 S.
DiagCompat(Loc, diag_compat::capture_binding) << Var;
19729 bool ByRef =
false;
19735 if (BuildAndDiagnose) {
19736 S.
Diag(Loc, diag::err_ref_array_type);
19747 if (BuildAndDiagnose) {
19748 S.
Diag(Loc, diag::err_arc_autoreleasing_capture)
19764 if (BuildAndDiagnose) {
19766 S.
Diag(Loc, diag::warn_block_capture_autoreleasing);
19767 S.
Diag(VarLoc, diag::note_declare_parameter_strong);
19772 const bool HasBlocksAttr = Var->
hasAttr<BlocksAttr>();
19781 DeclRefType = CaptureType;
19785 if (BuildAndDiagnose)
19795 const bool BuildAndDiagnose,
QualType &CaptureType,
QualType &DeclRefType,
19796 const bool RefersToCapturedVariable,
TryCaptureKind Kind,
bool IsTopScope,
19822 CaptureType = DeclRefType;
19825 if (BuildAndDiagnose)
19826 RSI->
addCapture(Var,
false, ByRef, RefersToCapturedVariable,
19836 const bool RefersToCapturedVariable,
19841 bool ByRef =
false;
19845 ByRef = (LSI->
ImpCaptureStyle == LambdaScopeInfo::ImpCap_LambdaByref);
19850 S.
Diag(Loc, diag::err_wasm_ca_reference) << 0;
19881 if (!RefType->getPointeeType()->isFunctionType())
19888 if (BuildAndDiagnose) {
19889 S.
Diag(Loc, diag::err_arc_autoreleasing_capture) << 1;
19899 if (!
Invalid && BuildAndDiagnose) {
19903 diag::err_capture_of_incomplete_or_sizeless_type,
19907 diag::err_capture_of_abstract_type))
19933 if (BuildAndDiagnose)
19934 LSI->
addCapture(Var,
false, ByRef, RefersToCapturedVariable,
19935 Loc, EllipsisLoc, CaptureType,
Invalid);
19946 if (
T.isTriviallyCopyableType(Context))
19950 if (!(RD = RD->getDefinition()))
19952 if (RD->hasSimpleCopyConstructor())
19954 if (RD->hasUserDeclaredCopyConstructor())
19956 if (Ctor->isCopyConstructor())
19957 return !Ctor->isDeleted();
19977 if (ShouldOfferCopyFix) {
19981 FixBuffer.assign({Separator, Var->
getName()});
19982 Sema.
Diag(VarInsertLoc, diag::note_lambda_variable_capture_fixit)
19987 FixBuffer.assign({Separator,
"&", Var->
getName()});
19988 Sema.
Diag(VarInsertLoc, diag::note_lambda_variable_capture_fixit)
20000 return !C.isThisCapture() && !C.isInitCapture();
20009 if (ShouldOfferCopyFix) {
20010 bool CanDefaultCopyCapture =
true;
20019 if (CanDefaultCopyCapture && llvm::none_of(LSI->
Captures, [](
Capture &
C) {
20020 return !C.isThisCapture() && !C.isInitCapture() && C.isCopyCapture();
20022 FixBuffer.assign({
"=", Separator});
20023 Sema.
Diag(DefaultInsertLoc, diag::note_lambda_default_capture_fixit)
20032 return !C.isInitCapture() && C.isReferenceCapture() &&
20033 !C.isThisCapture();
20035 FixBuffer.assign({
"&", Separator});
20036 Sema.
Diag(DefaultInsertLoc, diag::note_lambda_default_capture_fixit)
20045 QualType &DeclRefType,
const unsigned *
const FunctionScopeIndexToStopAt) {
20069 const auto *VD = dyn_cast<VarDecl>(Var);
20071 if (VD->isInitCapture())
20076 assert(VD &&
"Cannot capture a null variable");
20078 const unsigned MaxFunctionScopesIndex = FunctionScopeIndexToStopAt
20082 if (FunctionScopeIndexToStopAt) {
20083 assert(!
FunctionScopes.empty() &&
"No function scopes to stop at?");
20088 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(
FunctionScopes[FSIndex]);
20089 FSIndex && LSI && !LSI->AfterParameterList)
20091 assert(MaxFunctionScopesIndex <= FSIndex &&
20092 "FunctionScopeIndexToStopAt should be no greater than FSIndex into "
20093 "FunctionScopes.");
20094 while (FSIndex != MaxFunctionScopesIndex) {
20102 bool IsGlobal = !VD->hasLocalStorage();
20103 if (IsGlobal && !(
LangOpts.OpenMP &&
20104 OpenMP().isOpenMPCapturedDecl(Var,
true,
20105 MaxFunctionScopesIndex)))
20119 CaptureType = Var->
getType();
20121 bool Nested =
false;
20123 unsigned FunctionScopesIndex = MaxFunctionScopesIndex;
20128 LSI = dyn_cast_or_null<LambdaScopeInfo>(
20131 bool IsInScopeDeclarationContext =
20142 if (IsInScopeDeclarationContext &&
20143 FunctionScopesIndex == MaxFunctionScopesIndex && VarDC == DC)
20149 !IsInScopeDeclarationContext
20152 BuildAndDiagnose, *
this);
20158 FunctionScopesIndex = MaxFunctionScopesIndex - 1;
20177 if (
const auto *Parm = dyn_cast<ParmVarDecl>(Var);
20178 Parm && Parm->getDeclContext() == DC)
20186 if (BuildAndDiagnose) {
20189 Diag(ExprLoc, diag::err_lambda_impcap) << Var;
20204 if (
ParmVarDecl *PVD = dyn_cast_or_null<ParmVarDecl>(Var))
20205 QTy = PVD->getOriginalType();
20210 if (
auto *RSI = dyn_cast<CapturedRegionScopeInfo>(CSI)) {
20217 if (BuildAndDiagnose) {
20218 Diag(ExprLoc, diag::err_capture_binding_openmp) << Var;
20224 Var, RSI->OpenMPLevel, RSI->OpenMPCaptureLevel);
20229 if (IsOpenMPPrivateDecl != OMPC_unknown &&
20232 if (
ParmVarDecl *PVD = dyn_cast_or_null<ParmVarDecl>(Var))
20233 QTy = PVD->getOriginalType();
20235 E =
OpenMP().getNumberOfConstructScopes(RSI->OpenMPLevel);
20239 assert(RSI->OpenMPLevel == OuterRSI->OpenMPLevel &&
20240 "Wrong number of captured regions associated with the "
20241 "OpenMP construct.");
20246 IsOpenMPPrivateDecl != OMPC_private &&
20248 RSI->OpenMPCaptureLevel);
20252 Var, RSI->OpenMPLevel, RSI->OpenMPCaptureLevel);
20258 OpenMP().adjustOpenMPTargetScopeIndex(FunctionScopesIndex,
20261 if (IsTargetCap || IsOpenMPPrivateDecl == OMPC_private ||
20262 (IsGlobal && !IsGlobalCap)) {
20263 Nested = !IsTargetCap;
20269 CaptureType =
Context.getLValueReferenceType(DeclRefType);
20278 if (BuildAndDiagnose) {
20279 Diag(ExprLoc, diag::err_lambda_impcap) << Var;
20301 FunctionScopesIndex--;
20302 if (IsInScopeDeclarationContext)
20304 }
while (!VarDC->
Equals(DC));
20312 for (
unsigned I = ++FunctionScopesIndex, N = MaxFunctionScopesIndex + 1; I != N;
20325 if (
Invalid && !BuildAndDiagnose)
20330 DeclRefType, Nested, *
this,
Invalid);
20334 RSI, Var, ExprLoc, BuildAndDiagnose, CaptureType, DeclRefType, Nested,
20335 Kind, I == N - 1, *
this,
Invalid);
20341 DeclRefType, Nested, Kind, EllipsisLoc,
20346 if (
Invalid && !BuildAndDiagnose)
20358 DeclRefType,
nullptr);
20366 false, CaptureType, DeclRefType,
nullptr);
20370 assert(Var &&
"Null value cannot be captured");
20377 false, CaptureType, DeclRefType,
20381 return DeclRefType;
20389class CopiedTemplateArgs {
20393 template<
typename RefExpr>
20394 CopiedTemplateArgs(RefExpr *E) : HasArgs(E->hasExplicitTemplateArgs()) {
20396 E->copyTemplateArgumentsInto(TemplateArgStorage);
20399#ifdef __has_cpp_attribute
20400#if __has_cpp_attribute(clang::lifetimebound)
20401 [[clang::lifetimebound]]
20405 return HasArgs ? &TemplateArgStorage :
nullptr;
20431 auto Rebuild = [&](
Expr *Sub) {
20436 auto IsPotentialResultOdrUsed = [&](
NamedDecl *D) {
20439 auto *VD = dyn_cast<VarDecl>(D);
20462 llvm_unreachable(
"unexpected non-odr-use-reason");
20466 if (VD->getType()->isReferenceType())
20468 if (
auto *RD = VD->getType()->getAsCXXRecordDecl())
20469 if (RD->hasDefinition() && RD->hasMutableFields())
20471 if (!VD->isUsableInConstantExpressions(S.
Context))
20476 if (VD->getType()->isReferenceType())
20484 auto MaybeCUDAODRUsed = [&]() ->
bool {
20490 auto *DRE = dyn_cast<DeclRefExpr>(E);
20493 auto *VD = dyn_cast<VarDecl>(DRE->getDecl());
20500 auto MarkNotOdrUsed = [&] {
20501 if (!MaybeCUDAODRUsed()) {
20504 LSI->markVariableExprAsNonODRUsed(E);
20512 case Expr::DeclRefExprClass: {
20514 if (DRE->isNonOdrUse() || IsPotentialResultOdrUsed(DRE->getDecl()))
20520 S.
Context, DRE->getQualifierLoc(), DRE->getTemplateKeywordLoc(),
20521 DRE->getDecl(), DRE->refersToEnclosingVariableOrCapture(),
20522 DRE->getNameInfo(), DRE->getType(), DRE->getValueKind(),
20523 DRE->getFoundDecl(), CopiedTemplateArgs(DRE), NOUR);
20526 case Expr::FunctionParmPackExprClass: {
20531 if (IsPotentialResultOdrUsed(D))
20542 case Expr::ArraySubscriptExprClass: {
20548 if (!
Base.isUsable())
20550 Expr *LHS = ASE->getBase() == ASE->getLHS() ?
Base.get() : ASE->getLHS();
20551 Expr *RHS = ASE->getBase() == ASE->getRHS() ?
Base.get() : ASE->getRHS();
20554 ASE->getRBracketLoc());
20557 case Expr::MemberExprClass: {
20563 if (!
Base.isUsable())
20566 S.
Context,
Base.get(), ME->isArrow(), ME->getOperatorLoc(),
20567 ME->getQualifierLoc(), ME->getTemplateKeywordLoc(),
20568 ME->getMemberDecl(), ME->getFoundDecl(), ME->getMemberNameInfo(),
20569 CopiedTemplateArgs(ME), ME->getType(), ME->getValueKind(),
20570 ME->getObjectKind(), ME->isNonOdrUse());
20573 if (ME->getMemberDecl()->isCXXInstanceMember())
20578 if (ME->isNonOdrUse() || IsPotentialResultOdrUsed(ME->getMemberDecl()))
20584 S.
Context, ME->getBase(), ME->isArrow(), ME->getOperatorLoc(),
20585 ME->getQualifierLoc(), ME->getTemplateKeywordLoc(), ME->getMemberDecl(),
20586 ME->getFoundDecl(), ME->getMemberNameInfo(), CopiedTemplateArgs(ME),
20587 ME->getType(), ME->getValueKind(), ME->getObjectKind(), NOUR);
20590 case Expr::BinaryOperatorClass: {
20592 Expr *LHS = BO->getLHS();
20593 Expr *RHS = BO->getRHS();
20595 if (BO->getOpcode() == BO_PtrMemD) {
20597 if (!Sub.isUsable())
20599 BO->setLHS(Sub.get());
20601 }
else if (BO->getOpcode() == BO_Comma) {
20603 if (!Sub.isUsable())
20605 BO->setRHS(Sub.get());
20613 case Expr::ParenExprClass: {
20616 if (!Sub.isUsable())
20618 return S.
ActOnParenExpr(PE->getLParen(), PE->getRParen(), Sub.get());
20623 case Expr::ConditionalOperatorClass: {
20634 LHS = CO->getLHS();
20636 RHS = CO->getRHS();
20638 CO->getCond(), LHS.
get(), RHS.
get());
20643 case Expr::UnaryOperatorClass: {
20645 if (UO->getOpcode() != UO_Extension)
20648 if (!Sub.isUsable())
20650 return S.
BuildUnaryOp(
nullptr, UO->getOperatorLoc(), UO_Extension,
20657 case Expr::GenericSelectionExprClass: {
20661 bool AnyChanged =
false;
20662 for (
Expr *OrigAssocExpr : GSE->getAssocExprs()) {
20663 ExprResult AssocExpr = Rebuild(OrigAssocExpr);
20667 AssocExprs.push_back(AssocExpr.
get());
20670 AssocExprs.push_back(OrigAssocExpr);
20674 void *ExOrTy =
nullptr;
20675 bool IsExpr = GSE->isExprPredicate();
20677 ExOrTy = GSE->getControllingExpr();
20679 ExOrTy = GSE->getControllingType();
20681 GSE->getGenericLoc(), GSE->getDefaultLoc(),
20682 GSE->getRParenLoc(), IsExpr, ExOrTy,
20683 GSE->getAssocTypeSourceInfos(), AssocExprs)
20691 case Expr::ChooseExprClass: {
20702 if (!LHS.
get() && !RHS.
get())
20705 LHS = CE->getLHS();
20707 RHS = CE->getRHS();
20710 RHS.
get(), CE->getRParenLoc());
20714 case Expr::ConstantExprClass: {
20717 if (!Sub.isUsable())
20724 case Expr::ImplicitCastExprClass: {
20729 switch (ICE->getCastKind()) {
20731 case CK_DerivedToBase:
20732 case CK_UncheckedDerivedToBase: {
20733 ExprResult Sub = Rebuild(ICE->getSubExpr());
20734 if (!Sub.isUsable())
20738 ICE->getValueKind(), &Path);
20795 for (
Expr *E : LocalMaybeODRUseExprs) {
20796 if (
auto *DRE = dyn_cast<DeclRefExpr>(E)) {
20798 DRE->getLocation(), *
this);
20799 }
else if (
auto *ME = dyn_cast<MemberExpr>(E)) {
20802 }
else if (
auto *FP = dyn_cast<FunctionParmPackExpr>(E)) {
20806 llvm_unreachable(
"Unexpected expression");
20811 "MarkVarDeclODRUsed failed to cleanup MaybeODRUseExprs?");
20820 const bool RefersToEnclosingScope =
20823 if (RefersToEnclosingScope) {
20838 assert(E &&
"Capture variable should be used in an expression.");
20851 "Invalid Expr argument to DoMarkVarDeclReferenced");
20862 bool UsableInConstantExpr =
20881 bool NeededForConstantEvaluation =
20884 bool NeedDefinition =
20885 OdrUse == OdrUseContext::Used || NeededForConstantEvaluation ||
20887 Var->
getType()->isUndeducedType());
20890 "Can't instantiate a partial template specialization.");
20907 bool TryInstantiating =
20911 if (TryInstantiating) {
20914 bool FirstInstantiation = PointOfInstantiation.
isInvalid();
20915 if (FirstInstantiation) {
20916 PointOfInstantiation = Loc;
20918 MSI->setPointOfInstantiation(PointOfInstantiation);
20940 if (
auto *DRE = dyn_cast_or_null<DeclRefExpr>(E))
20941 DRE->setDecl(DRE->getDecl());
20942 else if (
auto *ME = dyn_cast_or_null<MemberExpr>(E))
20943 ME->setMemberDecl(ME->getMemberDecl());
20944 }
else if (FirstInstantiation) {
20946 .push_back(std::make_pair(Var, PointOfInstantiation));
20948 bool Inserted =
false;
20950 auto Iter = llvm::find_if(
20952 return P.first == Var;
20954 if (Iter != I.end()) {
20969 .push_back(std::make_pair(Var, PointOfInstantiation));
20993 if (
DeclRefExpr *DRE = dyn_cast_or_null<DeclRefExpr>(E))
20994 if (DRE->isNonOdrUse())
20996 if (
MemberExpr *ME = dyn_cast_or_null<MemberExpr>(E))
20997 if (ME->isNonOdrUse())
21001 case OdrUseContext::None:
21006 "missing non-odr-use marking for unevaluated decl ref");
21009 case OdrUseContext::FormallyOdrUsed:
21014 case OdrUseContext::Used:
21023 case OdrUseContext::Dependent:
21041 if (OdrUse == OdrUseContext::Used) {
21042 QualType CaptureType, DeclRefType;
21048 }
else if (OdrUse == OdrUseContext::Dependent) {
21064 auto *ID = dyn_cast<DeclRefExpr>(E);
21065 if (!ID || ID->isTypeDependent() || !ID->refersToEnclosingVariableOrCapture())
21072 auto IsDependent = [&]() {
21074 auto *LSI = dyn_cast<sema::LambdaScopeInfo>(
Scope);
21079 LSI->AfterParameterList)
21082 const auto *MD = LSI->CallOperator;
21083 if (MD->getType().isNull())
21087 if (!Ty || !MD->isExplicitObjectMemberFunction() ||
21091 if (
auto *
C = LSI->CaptureMap.count(D) ? &LSI->getCapture(D) :
nullptr) {
21092 if (
C->isCopyCapture())
21097 if (LSI->ImpCaptureStyle == LambdaScopeInfo::ImpCap_LambdaByval)
21103 ID->setCapturedByCopyInLambdaWithExplicitObjectParameter(
21109 bool MightBeOdrUse,
21117 if (
VarDecl *Var = dyn_cast<VarDecl>(D)) {
21136 const MemberExpr *ME = dyn_cast<MemberExpr>(E);
21143 bool IsVirtualCall = MD->
isVirtual() &&
21145 if (!IsVirtualCall)
21162 bool OdrUse =
true;
21164 if (
Method->isVirtual() &&
21168 if (
auto *FD = dyn_cast<FunctionDecl>(E->
getDecl())) {
21173 !FD->isDependentContext())
21187 bool MightBeOdrUse =
true;
21190 if (
Method->isPureVirtual())
21191 MightBeOdrUse =
false;
21210 bool MightBeOdrUse) {
21211 if (MightBeOdrUse) {
21212 if (
auto *VD = dyn_cast<VarDecl>(D)) {
21217 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
21243bool MarkReferencedDecls::TraverseTemplateArgument(
21244 const TemplateArgument &Arg) {
21247 EnterExpressionEvaluationContext
Evaluated(
21261 MarkReferencedDecls Marker(*
this, Loc);
21262 Marker.TraverseType(
T);
21268class EvaluatedExprMarker :
public UsedDeclVisitor<EvaluatedExprMarker> {
21271 bool SkipLocalVariables;
21274 EvaluatedExprMarker(
Sema &S,
bool SkipLocalVariables,
21276 : Inherited(S), SkipLocalVariables(SkipLocalVariables), StopAt(StopAt) {}
21282 void Visit(Expr *E) {
21283 if (llvm::is_contained(StopAt, E))
21285 Inherited::Visit(E);
21288 void VisitConstantExpr(ConstantExpr *E) {
21293 void VisitDeclRefExpr(DeclRefExpr *E) {
21295 if (SkipLocalVariables) {
21296 if (VarDecl *VD = dyn_cast<VarDecl>(E->
getDecl()))
21297 if (VD->hasLocalStorage())
21307 void VisitMemberExpr(MemberExpr *E) {
21315 bool SkipLocalVariables,
21317 EvaluatedExprMarker(*
this, SkipLocalVariables, StopAt).Visit(E);
21329 (
Decl->isConstexpr() || (
Decl->isStaticDataMember() &&
21333 if (Stmts.empty()) {
21344 if (
Diags.getIgnoreAllWarnings() &&
21355 if (
Decl &&
Decl->isFileVarDecl()) {
21428 class CallReturnIncompleteDiagnoser :
public TypeDiagnoser {
21434 : FD(FD), CE(CE) { }
21438 S.
Diag(Loc, diag::err_call_incomplete_return)
21443 S.
Diag(Loc, diag::err_call_function_incomplete_return)
21448 } Diagnoser(FD, CE);
21461 unsigned diagnostic = diag::warn_condition_is_assignment;
21462 bool IsOrAssign =
false;
21465 if (Op->getOpcode() != BO_Assign && Op->getOpcode() != BO_OrAssign)
21468 IsOrAssign = Op->getOpcode() == BO_OrAssign;
21476 if (
ObjC().isSelfExpr(Op->getLHS()) && ME->getMethodFamily() ==
OMF_init)
21477 diagnostic = diag::warn_condition_is_idiomatic_assignment;
21481 diagnostic = diag::warn_condition_is_idiomatic_assignment;
21484 Loc = Op->getOperatorLoc();
21486 if (Op->getOperator() != OO_Equal && Op->getOperator() != OO_PipeEqual)
21489 IsOrAssign = Op->getOperator() == OO_PipeEqual;
21490 Loc = Op->getOperatorLoc();
21502 Diag(Loc, diag::note_condition_assign_silence)
21507 Diag(Loc, diag::note_condition_or_assign_to_comparison)
21510 Diag(Loc, diag::note_condition_assign_to_comparison)
21528 if (opE->getOpcode() == BO_EQ &&
21529 opE->getLHS()->IgnoreParenImpCasts()->isModifiableLvalue(
Context)
21535 Diag(Loc, diag::note_equality_comparison_silence)
21538 Diag(Loc, diag::note_equality_comparison_to_assign)
21544 bool IsConstexpr) {
21546 if (
ParenExpr *parenE = dyn_cast<ParenExpr>(E))
21566 if (!
T->isScalarType()) {
21567 Diag(Loc, diag::err_typecheck_statement_requires_scalar)
21571 CheckBoolLikeConversion(E, Loc);
21618 struct RebuildUnknownAnyFunction
21619 :
StmtVisitor<RebuildUnknownAnyFunction, ExprResult> {
21623 RebuildUnknownAnyFunction(
Sema &S) : S(S) {}
21626 llvm_unreachable(
"unexpected statement!");
21637 template <
class T>
ExprResult rebuildSugarExpr(
T *E) {
21638 ExprResult SubResult = Visit(E->getSubExpr());
21641 Expr *SubExpr = SubResult.
get();
21642 E->setSubExpr(SubExpr);
21643 E->setType(SubExpr->
getType());
21650 return rebuildSugarExpr(E);
21653 ExprResult VisitUnaryExtension(UnaryOperator *E) {
21654 return rebuildSugarExpr(E);
21657 ExprResult VisitUnaryAddrOf(UnaryOperator *E) {
21661 Expr *SubExpr = SubResult.
get();
21669 ExprResult resolveDecl(Expr *E, ValueDecl *VD) {
21687 ExprResult VisitDeclRefExpr(DeclRefExpr *E) {
21688 return resolveDecl(E, E->
getDecl());
21706 struct RebuildUnknownAnyExpr
21707 : StmtVisitor<RebuildUnknownAnyExpr, ExprResult> {
21714 RebuildUnknownAnyExpr(Sema &S, QualType
CastType)
21718 llvm_unreachable(
"unexpected statement!");
21728 ExprResult VisitObjCMessageExpr(ObjCMessageExpr *E);
21732 template <
class T>
ExprResult rebuildSugarExpr(
T *E) {
21733 ExprResult SubResult = Visit(E->getSubExpr());
21735 Expr *SubExpr = SubResult.
get();
21736 E->setSubExpr(SubExpr);
21737 E->setType(SubExpr->
getType());
21744 return rebuildSugarExpr(E);
21747 ExprResult VisitUnaryExtension(UnaryOperator *E) {
21748 return rebuildSugarExpr(E);
21751 ExprResult VisitUnaryAddrOf(UnaryOperator *E) {
21752 const PointerType *
Ptr = DestType->
getAs<PointerType>();
21770 DestType =
Ptr->getPointeeType();
21777 ExprResult VisitImplicitCastExpr(ImplicitCastExpr *E);
21779 ExprResult resolveDecl(Expr *E, ValueDecl *VD);
21785 ExprResult VisitDeclRefExpr(DeclRefExpr *E) {
21786 return resolveDecl(E, E->
getDecl());
21792ExprResult RebuildUnknownAnyExpr::VisitCallExpr(CallExpr *E) {
21797 FK_FunctionPointer,
21802 QualType CalleeType = CalleeExpr->
getType();
21805 Kind = FK_MemberFunction;
21807 }
else if (
const PointerType *Ptr = CalleeType->
getAs<PointerType>()) {
21808 CalleeType =
Ptr->getPointeeType();
21809 Kind = FK_FunctionPointer;
21812 Kind = FK_BlockPointer;
21814 const FunctionType *FnType = CalleeType->
castAs<FunctionType>();
21819 unsigned diagID = diag::err_func_returning_array_function;
21820 if (Kind == FK_BlockPointer)
21821 diagID = diag::err_block_returning_array_function;
21834 const FunctionProtoType *Proto = dyn_cast<FunctionProtoType>(FnType);
21856 SmallVector<QualType, 8> ArgTypes;
21857 if (ParamTypes.empty() && Proto->
isVariadic()) {
21859 for (
unsigned i = 0, e = E->
getNumArgs(); i != e; ++i) {
21862 ParamTypes = ArgTypes;
21873 case FK_MemberFunction:
21877 case FK_FunctionPointer:
21881 case FK_BlockPointer:
21887 ExprResult CalleeResult = Visit(CalleeExpr);
21895ExprResult RebuildUnknownAnyExpr::VisitObjCMessageExpr(ObjCMessageExpr *E) {
21898 S.
Diag(E->
getExprLoc(), diag::err_func_returning_array_function)
21906 Method->setReturnType(DestType);
21916ExprResult RebuildUnknownAnyExpr::VisitImplicitCastExpr(ImplicitCastExpr *E) {
21918 if (E->
getCastKind() == CK_FunctionToPointerDecay) {
21932 }
else if (E->
getCastKind() == CK_LValueToRValue) {
21949 llvm_unreachable(
"Unhandled cast type!");
21953ExprResult RebuildUnknownAnyExpr::resolveDecl(Expr *E, ValueDecl *VD) {
21955 QualType
Type = DestType;
21960 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(VD)) {
21961 if (
const PointerType *Ptr =
Type->getAs<PointerType>()) {
21962 DestType =
Ptr->getPointeeType();
21969 if (!
Type->isFunctionType()) {
21974 if (
const FunctionProtoType *FT =
Type->getAs<FunctionProtoType>()) {
21978 QualType FDT = FD->getType();
21979 const FunctionType *FnType = FDT->
castAs<FunctionType>();
21980 const FunctionProtoType *Proto = dyn_cast_or_null<FunctionProtoType>(FnType);
21981 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E);
21982 if (DRE && Proto && Proto->getParamTypes().empty() && Proto->isVariadic()) {
21983 SourceLocation Loc = FD->getLocation();
21985 S.
Context, FD->getDeclContext(), Loc, Loc,
21986 FD->getNameInfo().getName(), DestType, FD->getTypeSourceInfo(),
21988 false , FD->hasPrototype(),
21991 if (FD->getQualifier())
21994 SmallVector<ParmVarDecl*, 16> Params;
21995 for (
const auto &AI : FT->param_types()) {
21996 ParmVarDecl *Param =
21999 Params.push_back(Param);
22001 NewFD->setParams(Params);
22007 if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD))
22008 if (MD->isInstance()) {
22019 if (
const ReferenceType *RefTy =
Type->getAs<ReferenceType>()) {
22020 Type = RefTy->getPointeeType();
22021 }
else if (
Type->isFunctionType()) {
22022 S.
Diag(E->
getExprLoc(), diag::err_unknown_any_var_function_type)
22048 diag::err_typecheck_cast_to_incomplete))
22063 return RebuildUnknownAnyExpr(*
this, ToType).Visit(E);
22070 ExplicitCastExpr *castArg = dyn_cast<ExplicitCastExpr>(arg->IgnoreParens());
22079 assert(!arg->hasPlaceholderType());
22091 unsigned diagID = diag::err_uncasted_use_of_unknown_any;
22094 if (
CallExpr *call = dyn_cast<CallExpr>(E)) {
22095 E = call->getCallee();
22096 diagID = diag::err_uncasted_call_of_unknown_any;
22104 if (
DeclRefExpr *ref = dyn_cast<DeclRefExpr>(E)) {
22105 loc = ref->getLocation();
22106 d = ref->getDecl();
22107 }
else if (
MemberExpr *mem = dyn_cast<MemberExpr>(E)) {
22108 loc = mem->getMemberLoc();
22109 d = mem->getMemberDecl();
22111 diagID = diag::err_uncasted_call_of_unknown_any;
22112 loc = msg->getSelectorStartLoc();
22113 d = msg->getMethodDecl();
22115 S.
Diag(loc, diag::err_uncasted_send_to_unknown_any_method)
22116 <<
static_cast<unsigned>(msg->isClassMessage()) << msg->getSelector()
22134 if (!placeholderType)
return E;
22136 switch (placeholderType->
getKind()) {
22137 case BuiltinType::UnresolvedTemplate: {
22150 if (
auto *TD = dyn_cast<TemplateDecl>(Temp))
22151 TN =
Context.getQualifiedTemplateName(NNS, ULE->hasTemplateKeyword(),
22156 Diag(NameInfo.
getLoc(), diag::err_template_kw_refers_to_type_template)
22157 << TN << ULE->getSourceRange() << IsTypeAliasTemplateDecl;
22159 << IsTypeAliasTemplateDecl;
22162 bool HasAnyDependentTA =
false;
22164 HasAnyDependentTA |= Arg.getArgument().
isDependent();
22176 TST =
Context.getTemplateSpecializationType(
22185 case BuiltinType::Overload: {
22205 case BuiltinType::BoundMember: {
22211 PD =
PDiag(diag::err_dtor_expr_without_call) << 1;
22212 }
else if (
const auto *ME = dyn_cast<MemberExpr>(BME)) {
22213 if (ME->getMemberNameInfo().getName().getNameKind() ==
22215 PD =
PDiag(diag::err_dtor_expr_without_call) << 0;
22223 case BuiltinType::ARCUnbridgedCast: {
22230 case BuiltinType::UnknownAny:
22234 case BuiltinType::PseudoObject:
22237 case BuiltinType::BuiltinFn: {
22242 unsigned BuiltinID = FD->getBuiltinID();
22243 if (BuiltinID == Builtin::BI__noop) {
22245 CK_BuiltinFnToFnPtr)
22252 if (
Context.BuiltinInfo.isInStdNamespace(BuiltinID)) {
22258 ? diag::err_use_of_unaddressable_function
22259 : diag::warn_cxx20_compat_use_of_unaddressable_function);
22260 if (FD->isImplicitlyInstantiable()) {
22287 case BuiltinType::IncompleteMatrixIdx: {
22293 MS->getBase(), MS->getRowIdx(), E->
getExprLoc());
22295 Diag(MS->getRowIdx()->getBeginLoc(), diag::err_matrix_incomplete_index);
22300 case BuiltinType::ArraySection:
22309 case BuiltinType::OMPArrayShaping:
22312 case BuiltinType::OMPIterator:
22316#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
22317 case BuiltinType::Id:
22318#include "clang/Basic/OpenCLImageTypes.def"
22319#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
22320 case BuiltinType::Id:
22321#include "clang/Basic/OpenCLExtensionTypes.def"
22322#define SVE_TYPE(Name, Id, SingletonId) \
22323 case BuiltinType::Id:
22324#include "clang/Basic/AArch64ACLETypes.def"
22325#define PPC_VECTOR_TYPE(Name, Id, Size) \
22326 case BuiltinType::Id:
22327#include "clang/Basic/PPCTypes.def"
22328#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
22329#include "clang/Basic/RISCVVTypes.def"
22330#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
22331#include "clang/Basic/WebAssemblyReferenceTypes.def"
22332#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
22333#include "clang/Basic/AMDGPUTypes.def"
22334#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
22335#include "clang/Basic/HLSLIntangibleTypes.def"
22336#define SPIRV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
22337#include "clang/Basic/SPIRVTypes.def"
22338#define BUILTIN_TYPE(Id, SingletonId) case BuiltinType::Id:
22339#define PLACEHOLDER_TYPE(Id, SingletonId)
22340#include "clang/AST/BuiltinTypes.def"
22344 llvm_unreachable(
"invalid placeholder type!");
22357 if (!
Context.getLangOpts().RecoveryAST)
22363 if (
T.isNull() ||
T->isUndeducedType() ||
22364 !
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 enumerations for traits support.
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 Decl * getPredefinedExprDecl(Sema &S, DeclContext *DC)
getPredefinedExprDecl - Returns Decl of a given DeclContext that can be used to determine the value o...
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 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 diagnoseFunctionLikeMacro(Sema &SemaRef, DeclarationName Name, SourceLocation TypoLoc)
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 bool isProvablyZeroSize(const ASTContext &Ctx, QualType T)
Determine whether the size of T is provably zero: some array dimension is provably zero or the base e...
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, QualType ResultTy, 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.
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.
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
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)
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.
Represents a pointer type decayed from an array or function type.
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.
bool isFunctionOrMethod() const
Returns true if this DeclContext is a function, Objective-C method, or block, or a DeclContext that c...
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.
DeclContext * getEnclosingNonExpansionStatementContext()
Retrieve the innermost enclosing context that doesn't belong to an expansion statement.
bool isExpansionStmt() const
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 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.
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.
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx, bool AllowRelaxedEval=false) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
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 InitializeMemberFromDefaultMemberInitializer(FieldDecl *Member)
Create the initialization entity for a default member initializer.
static InitializedEntity InitializeBlock(SourceLocation BlockVarLoc, QualType Type)
static InitializedEntity InitializeParameter(ASTContext &Context, ParmVarDecl *Parm)
Create the initialization entity for a parameter.
static InitializedEntity InitializeCompoundLiteralInit(TypeSourceInfo *TSI)
Create the entity for a compound literal initializer.
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
Represents the declaration of a label.
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
CXXMethodDecl * getCallOperator() const
Retrieve the function call operator associated with this lambda expression.
FPEvalMethodKind
Possible float expression evaluation method choices.
@ FEM_Extended
Use extended type for fp arithmetic.
@ FEM_Double
Use the type double for fp arithmetic.
@ FEM_UnsetOnCommandLine
Used only for FE option processing; this is only used to indicate that the user did not specify an ex...
@ FEM_Source
Use the declared type for fp arithmetic.
@ CX_Promoted
Implementation of complex division using algebraic formulas at higher precision.
@ None
Permit no implicit vector bitcasts.
@ Integer
Permit vector bitcasts between integer vectors with different numbers of elements but the same total ...
@ All
Permit vector bitcasts between all vectors with the same total bit-width.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
clang::ObjCRuntime ObjCRuntime
bool isSignedOverflowDefined() const
bool allowArrayReturnTypes() const
unsigned getOpenCLCompatibleVersion() const
Return the OpenCL version that kernel language is compatible with.
static StringRef getSourceText(CharSourceRange Range, const SourceManager &SM, const LangOptions &LangOpts, bool *Invalid=nullptr)
Returns a string for the source that the range encompasses.
static SourceLocation AdvanceToTokenCharacter(SourceLocation TokStart, unsigned Characters, const SourceManager &SM, const LangOptions &LangOpts)
AdvanceToTokenCharacter - If the current SourceLocation specifies a location at the start of a token,...
static std::optional< Token > findNextToken(SourceLocation Loc, const SourceManager &SM, const LangOptions &LangOpts, bool IncludeComments=false)
Finds the token that comes right after the given location.
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.
Encapsulates the data about a macro definition (e.g.
bool isFunctionLike() const
SourceLocation getDefinitionLoc() const
Return the location that the macro was defined at.
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)
unsigned getDiagID() const
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)
const MacroInfo * getMacroInfo(const IdentifierInfo *II) const
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)
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)
QualType CheckMatrixCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
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)
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)
ExprResult BuildCXXAggregateDefaultInitExpr(SourceLocation Loc, FieldDecl *Field, const InitializedEntity &MemberEntity)
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)
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)
ExprResult CheckVarOrConceptTemplateTemplateId(const DeclarationNameInfo &NameInfo, TemplateName Template, const TemplateArgumentListInfo *TemplateArgs)
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.
ExprResult BuildCXXCtorDefaultInitExpr(SourceLocation Loc, FieldDecl *Field)
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)
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.
This class handles loading and caching of source files into memory.
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.
NarrowingKind getNarrowingKind(ASTContext &Context, const Expr *Converted, APValue &ConstantValue, QualType &ConstantType, bool IgnoreFloatToIntegralConversion=false, bool AllowRelaxedEval=false) const
Check if this standard conversion sequence represents a narrowing conversion, according to C++11 [dcl...
void setToType(unsigned Idx, QualType T)
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
uint32_t getCodeUnit(size_t I) const
Return the code unit at the given position.
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...
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.
PackIndexingTemplateStorage * getAsPackIndexingTemplate() const
Retrieve the pack-index-template-name storage, if any.
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.
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.
Top level wrappers for InstallAPI frontend operations.
const char * getTraitSpelling(TypeTrait T) LLVM_READONLY
Return the spelling of the trait T. Never null.
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...
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.
const FunctionProtoType * T
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.
DefaultedComparisonKind
Kinds of defaulted comparison operator functions.
@ None
This is not a defaultable comparison operator.
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.
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.
SmallVectorImpl< PartialDiagnosticAt > * ExtendedDiag
Location where we spot ptr to int cast or null subobject while evaluating constant expression in MS c...
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.