65#include "llvm/ADT/STLExtras.h"
66#include "llvm/ADT/StringExtras.h"
67#include "llvm/Support/ConvertUTF.h"
68#include "llvm/Support/SaveAndRestore.h"
69#include "llvm/Support/TimeProfiler.h"
70#include "llvm/Support/TypeSize.h"
95 if (TreatUnavailableAsInvalid &&
113 if (
const auto *A = D->
getAttr<UnusedAttr>()) {
116 if (A->getSemanticSpelling() != UnusedAttr::CXX11_maybe_unused &&
117 A->getSemanticSpelling() != UnusedAttr::C23_maybe_unused) {
119 if (DC && !DC->
hasAttr<UnusedAttr>())
120 S.
Diag(Loc, diag::warn_used_but_marked_unused) << D;
128 if (
Decl->isDefaulted()) {
139 auto *Ctor = dyn_cast<CXXConstructorDecl>(
Decl);
140 if (Ctor && Ctor->isInheritingConstructor())
151 if (I->getStorageClass() !=
SC_None)
202 DiagID = diag::warn_c2y_compat_internal_in_extern_inline;
203 else if ((UsedFn && (UsedFn->
isInlined() || UsedFn->
hasAttr<ConstAttr>())) ||
205 DiagID = diag::ext_internal_in_extern_inline_quiet;
207 DiagID = diag::ext_internal_in_extern_inline;
209 S.
Diag(Loc, DiagID) << !UsedFn << D;
221 Diag(DeclBegin, diag::note_convert_inline_to_static)
228 bool ObjCPropertyAccess,
229 bool AvoidPartialAvailabilityChecks,
231 bool SkipTrailingRequiresClause) {
238 for (
const auto &[DiagLoc, PD] : Pos->second) {
252 Diag(Loc, diag::ext_main_used);
260 Diag(Loc, diag::err_binding_cannot_appear_in_own_initializer)
263 Diag(Loc, diag::err_auto_variable_cannot_appear_in_own_initializer)
272 if (FD->isDeleted()) {
273 auto *Ctor = dyn_cast<CXXConstructorDecl>(FD);
274 if (Ctor && Ctor->isInheritingConstructor())
275 Diag(Loc, diag::err_deleted_inherited_ctor_use)
277 << Ctor->getInheritedConstructor().getConstructor()->getParent();
280 Diag(Loc, diag::err_deleted_function_use)
281 << (Msg !=
nullptr) << (Msg ? Msg->
getString() : StringRef());
295 if (!SkipTrailingRequiresClause && FD->getTrailingRequiresClause()) {
304 diag::err_reference_to_function_with_unsatisfied_constraints)
322 if (
auto *
Concept = dyn_cast<ConceptDecl>(D);
326 if (
auto *MD = dyn_cast<CXXMethodDecl>(D)) {
328 if (MD->getParent()->isLambda() &&
331 MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator())) {
332 Diag(Loc, diag::warn_cxx17_compat_lambda_def_ctor_assign)
337 auto getReferencedObjCProp = [](
const NamedDecl *D) ->
339 if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D))
340 return MD->findPropertyDecl();
354 auto *DRD = dyn_cast<OMPDeclareReductionDecl>(
CurContext);
357 Diag(Loc, diag::err_omp_wrong_var_in_declare_reduction)
370 Diag(Loc, diag::err_omp_declare_mapper_wrong_var)
376 if (
const auto *EmptyD = dyn_cast<UnresolvedUsingIfExistsDecl>(D)) {
377 Diag(Loc, diag::err_use_of_empty_using_if_exists);
378 Diag(EmptyD->getLocation(), diag::note_empty_using_if_exists_here);
383 AvoidPartialAvailabilityChecks, ClassReceiver);
389 if (D->
hasAttr<AvailableOnlyInDefaultEvalMethodAttr>()) {
392 PP.getLastFPEvalPragmaLocation().isValid() &&
393 PP.getCurrentFPEvalMethod() !=
getLangOpts().getFPEvalMethod())
395 diag::err_type_available_only_in_default_eval_method)
399 if (
auto *VD = dyn_cast<ValueDecl>(D))
404 if (!
Context.getTargetInfo().isTLSSupported())
405 if (
const auto *VD = dyn_cast<VarDecl>(D))
407 targetDiag(*Locs.begin(), diag::err_thread_unsupported);
418 const SentinelAttr *
Attr = D->
getAttr<SentinelAttr>();
423 unsigned NumFormalParams;
427 enum { CK_Function, CK_Method, CK_Block } CalleeKind;
429 if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D)) {
430 NumFormalParams = MD->param_size();
431 CalleeKind = CK_Method;
432 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
433 NumFormalParams = FD->param_size();
434 CalleeKind = CK_Function;
435 }
else if (
const auto *VD = dyn_cast<VarDecl>(D)) {
442 CalleeKind = CK_Function;
445 CalleeKind = CK_Block;
450 if (
const auto *proto = dyn_cast<FunctionProtoType>(Fn))
451 NumFormalParams = proto->getNumParams();
462 unsigned NullPos =
Attr->getNullPos();
463 assert((NullPos == 0 || NullPos == 1) &&
"invalid null position on sentinel");
464 NumFormalParams = (NullPos > NumFormalParams ? 0 : NumFormalParams - NullPos);
467 unsigned NumArgsAfterSentinel =
Attr->getSentinel();
471 if (Args.size() < NumFormalParams + NumArgsAfterSentinel + 1) {
478 const Expr *SentinelExpr = Args[Args.size() - NumArgsAfterSentinel - 1];
483 if (
Context.isSentinelNullExpr(SentinelExpr))
491 std::string NullValue;
492 if (CalleeKind == CK_Method &&
PP.isMacroDefined(
"nil"))
495 NullValue =
"nullptr";
496 else if (
PP.isMacroDefined(
"NULL"))
499 NullValue =
"(void*) 0";
502 Diag(Loc, diag::warn_missing_sentinel) <<
int(CalleeKind);
504 Diag(MissingNilLoc, diag::warn_missing_sentinel)
529 assert(!Ty.
isNull() &&
"DefaultFunctionArrayConversion - missing type");
533 if (
auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl()))
538 CK_FunctionToPointerDecay).
get();
553 CK_ArrayToPointerDecay);
569 if (UO && UO->getOpcode() == UO_Deref &&
570 UO->getSubExpr()->getType()->isPointerType()) {
572 UO->getSubExpr()->getType()->getPointeeType().getAddressSpace();
575 UO->getSubExpr()->IgnoreParenCasts()->isNullPointerConstant(
577 !UO->getType().isVolatileQualified()) {
579 S.
PDiag(diag::warn_indirection_through_null)
580 << UO->getSubExpr()->getSourceRange());
582 S.
PDiag(diag::note_indirection_through_null));
602 BaseType = BaseType->getPointeeType();
614 if (ObjectSetClass) {
658 assert(!T.isNull() &&
"r-value conversion on typeless expression?");
662 if (T->canDecayToPointerType())
670 (T->isDependentType() && !T->isAnyPointerType() &&
671 !T->isMemberPointerType()))
695 &
Context.Idents.get(
"object_getClass"),
701 SourceRange(OISA->getOpLoc(), OISA->getIsaMemberLoc()),
")");
718 if (T.hasQualifiers())
719 T = T.getUnqualifiedType();
722 if (T->isMemberPointerType() &&
723 Context.getTargetInfo().getCXXABI().isMicrosoft())
734 Cleanup.setExprNeedsCleanups(
true);
737 Cleanup.setExprNeedsCleanups(
true);
744 CastKind CK = T->isNullPtrType() ? CK_NullToPointer : CK_LValueToRValue;
752 T =
Atomic->getValueType().getUnqualifiedType();
777 CK_FunctionToPointerDecay);
791 assert(!Ty.
isNull() &&
"UsualUnaryFPConversions - missing type");
797 PP.getLastFPEvalPragmaLocation().isValid())) {
798 switch (EvalMethod) {
800 llvm_unreachable(
"Unrecognized float evaluation method");
803 llvm_unreachable(
"Float evaluation method should be set by now");
811 CK_FloatingComplexCast)
820 CK_FloatingComplexCast)
852 assert(!Ty.
isNull() &&
"UsualUnaryConversions - missing type");
876 if (
Context.isPromotableIntegerType(Ty)) {
891 assert(!Ty.
isNull() &&
"DefaultArgumentPromotion - missing type");
903 if (BTy && (BTy->
getKind() == BuiltinType::Half ||
904 BTy->
getKind() == BuiltinType::Float)) {
907 if (BTy->
getKind() == BuiltinType::Half) {
918 Context.getTypeSizeInChars(BTy) <
924 assert(8 ==
Context.getTypeSizeInChars(
Context.LongLongTy).getQuantity() &&
925 "Unexpected typesize for LongLongTy");
979 if (
Context.getTargetInfo().getTriple().isWasm() &&
994 if (!
Record->hasNonTrivialCopyConstructor() &&
995 !
Record->hasNonTrivialMoveConstructor() &&
996 !
Record->hasNonTrivialDestructor())
1029 PDiag(diag::warn_cxx98_compat_pass_non_pod_arg_to_vararg) << Ty << CT);
1036 PDiag(diag::warn_pass_class_arg_to_vararg)
1044 PDiag(diag::warn_cannot_pass_non_pod_arg_to_vararg)
1051 diag::err_cannot_pass_non_trivial_c_struct_to_vararg)
1055 PDiag(diag::err_cannot_pass_objc_interface_to_vararg)
1068 if (PlaceholderTy->getKind() == BuiltinType::ARCUnbridgedCast &&
1070 (FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>()))) {
1109 if (
Call.isInvalid())
1114 if (Comma.isInvalid())
1121 diag::err_call_incomplete_argument))
1139 if (SkipCast)
return false;
1146 CK_IntegralComplexToFloatingComplex);
1164 bool PromotePrecision) {
1169 if (PromotePrecision) {
1174 if (LongerIsComplex)
1186 QualType RHSType,
bool IsCompAssign) {
1211 bool ConvertFloat,
bool ConvertInt) {
1216 CK_IntegralToFloating);
1227 CK_IntegralComplexToFloatingComplex);
1232 CK_FloatingRealToComplex);
1241 QualType RHSType,
bool IsCompAssign) {
1251 else if (!IsCompAssign)
1253 return LHSFloat ? LHSType : RHSType;
1258 if (LHSFloat && RHSFloat) {
1265 assert(order < 0 &&
"illegal float comparison");
1299 QualType LHSElem = LHSComplex ? LHSComplex->getElementType() : LHSType;
1305 if ((&LHSSem != &llvm::APFloat::PPCDoubleDouble() ||
1306 &RHSSem != &llvm::APFloat::IEEEquad()) &&
1307 (&LHSSem != &llvm::APFloat::IEEEquad() ||
1308 &RHSSem != &llvm::APFloat::PPCDoubleDouble()))
1325 CK_IntegralComplexCast);
1331template <PerformCastFn doLHSCast, PerformCastFn doRHSCast>
1334 QualType RHSType,
bool IsCompAssign) {
1339 if (LHSSigned == RHSSigned) {
1342 RHS = (*doRHSCast)(S, RHS.
get(), LHSType);
1344 }
else if (!IsCompAssign)
1345 LHS = (*doLHSCast)(S, LHS.
get(), RHSType);
1347 }
else if (order != (LHSSigned ? 1 : -1)) {
1351 RHS = (*doRHSCast)(S, RHS.
get(), LHSType);
1353 }
else if (!IsCompAssign)
1354 LHS = (*doLHSCast)(S, LHS.
get(), RHSType);
1361 RHS = (*doRHSCast)(S, RHS.
get(), LHSType);
1363 }
else if (!IsCompAssign)
1364 LHS = (*doLHSCast)(S, LHS.
get(), RHSType);
1373 RHS = (*doRHSCast)(S, RHS.
get(), result);
1375 LHS = (*doLHSCast)(S, LHS.
get(), result);
1385 bool IsCompAssign) {
1389 if (LHSComplexInt && RHSComplexInt) {
1394 (S, LHS, RHS, LHSEltType, RHSEltType, IsCompAssign);
1399 if (LHSComplexInt) {
1403 (S, LHS, RHS, LHSEltType, RHSType, IsCompAssign);
1406 CK_IntegralRealToComplex);
1411 assert(RHSComplexInt);
1416 (S, LHS, RHS, LHSType, RHSEltType, IsCompAssign);
1421 CK_IntegralRealToComplex);
1429 bool IsCompAssign) {
1431 const auto *LhsOBT = LHSType->
getAs<OverflowBehaviorType>();
1432 const auto *RhsOBT = RHSType->
getAs<OverflowBehaviorType>();
1435 "Non-integer type conversion not supported for OverflowBehaviorTypes");
1438 LhsOBT && LhsOBT->getBehaviorKind() ==
1439 OverflowBehaviorType::OverflowBehaviorKind::Trap;
1441 RhsOBT && RhsOBT->getBehaviorKind() ==
1442 OverflowBehaviorType::OverflowBehaviorKind::Trap;
1444 LhsOBT && LhsOBT->getBehaviorKind() ==
1445 OverflowBehaviorType::OverflowBehaviorKind::Wrap;
1447 RhsOBT && RhsOBT->getBehaviorKind() ==
1448 OverflowBehaviorType::OverflowBehaviorKind::Wrap;
1450 QualType LHSUnderlyingType = LhsOBT ? LhsOBT->getUnderlyingType() : LHSType;
1451 QualType RHSUnderlyingType = RhsOBT ? RhsOBT->getUnderlyingType() : RHSType;
1453 std::optional<OverflowBehaviorType::OverflowBehaviorKind> DominantBehavior;
1454 if (LHSHasTrap || RHSHasTrap)
1455 DominantBehavior = OverflowBehaviorType::OverflowBehaviorKind::Trap;
1456 else if (LHSHasWrap || RHSHasWrap)
1457 DominantBehavior = OverflowBehaviorType::OverflowBehaviorKind::Wrap;
1459 QualType LHSConvType = LHSUnderlyingType;
1460 QualType RHSConvType = RHSUnderlyingType;
1461 if (DominantBehavior) {
1462 if (!LhsOBT || LhsOBT->getBehaviorKind() != *DominantBehavior)
1466 LHSConvType = LHSType;
1468 if (!RhsOBT || RhsOBT->getBehaviorKind() != *DominantBehavior)
1472 RHSConvType = RHSType;
1476 S, LHS, RHS, LHSConvType, RHSConvType, IsCompAssign);
1484 assert(BTy &&
"Expected a builtin type.");
1486 switch (BTy->getKind()) {
1487 case BuiltinType::ShortFract:
1488 case BuiltinType::UShortFract:
1489 case BuiltinType::SatShortFract:
1490 case BuiltinType::SatUShortFract:
1492 case BuiltinType::Fract:
1493 case BuiltinType::UFract:
1494 case BuiltinType::SatFract:
1495 case BuiltinType::SatUFract:
1497 case BuiltinType::LongFract:
1498 case BuiltinType::ULongFract:
1499 case BuiltinType::SatLongFract:
1500 case BuiltinType::SatULongFract:
1502 case BuiltinType::ShortAccum:
1503 case BuiltinType::UShortAccum:
1504 case BuiltinType::SatShortAccum:
1505 case BuiltinType::SatUShortAccum:
1507 case BuiltinType::Accum:
1508 case BuiltinType::UAccum:
1509 case BuiltinType::SatAccum:
1510 case BuiltinType::SatUAccum:
1512 case BuiltinType::LongAccum:
1513 case BuiltinType::ULongAccum:
1514 case BuiltinType::SatLongAccum:
1515 case BuiltinType::SatULongAccum:
1518 if (BTy->isInteger())
1520 llvm_unreachable(
"Unexpected fixed point or integer type");
1532 "Expected at least one of the operands to be a fixed point type");
1535 "Special fixed point arithmetic operation conversions are only "
1536 "applied to ints or other fixed point types");
1558 QualType ResultTy = LHSTyRank > RHSTyRank ? LHSTy : RHSTy;
1581 REnum = R->isUnscopedEnumerationType();
1583 if ((!IsCompAssign && LEnum && R->isFloatingType()) ||
1587 ? diag::warn_arith_conv_enum_float_cxx20
1588 : diag::warn_arith_conv_enum_float)
1591 }
else if (!IsCompAssign && LEnum && REnum &&
1592 !
Context.hasSameUnqualifiedType(L, R)) {
1597 DiagID = diag::warn_conv_mixed_enum_types_cxx26;
1598 else if (!L->
castAsCanonical<EnumType>()->getDecl()->hasNameForLinkage() ||
1599 !R->castAsCanonical<EnumType>()->getDecl()->hasNameForLinkage()) {
1604 ? diag::warn_arith_conv_mixed_anon_enum_types_cxx20
1605 : diag::warn_arith_conv_mixed_anon_enum_types;
1610 ? diag::warn_conditional_mixed_enum_types_cxx20
1611 : diag::warn_conditional_mixed_enum_types;
1616 ? diag::warn_comparison_mixed_enum_types_cxx20
1617 : diag::warn_comparison_mixed_enum_types;
1620 ? diag::warn_arith_conv_mixed_enum_types_cxx20
1621 : diag::warn_arith_conv_mixed_enum_types;
1624 << (int)ACK << L << R;
1642 auto IsSingleCodeUnitCP = [](
const QualType &T,
const llvm::APSInt &
Value) {
1643 if (T->isChar8Type())
1644 return llvm::IsSingleCodeUnitUTF8Codepoint(
Value.getExtValue());
1645 if (T->isChar16Type())
1646 return llvm::IsSingleCodeUnitUTF16Codepoint(
Value.getExtValue());
1647 assert(T->isChar32Type());
1648 return llvm::IsSingleCodeUnitUTF32Codepoint(
Value.getExtValue());
1661 if (LHSSuccess != RHSuccess) {
1663 if (IsSingleCodeUnitCP(LHSType, Res.
Val.
getInt()) &&
1664 IsSingleCodeUnitCP(RHSType, Res.
Val.
getInt()))
1668 if (!LHSSuccess || !RHSuccess) {
1669 SemaRef.
Diag(Loc, diag::warn_comparison_unicode_mixed_types)
1675 llvm::APSInt LHSValue(32);
1677 llvm::APSInt RHSValue(32);
1680 bool LHSSafe = IsSingleCodeUnitCP(LHSType, LHSValue);
1681 bool RHSSafe = IsSingleCodeUnitCP(RHSType, RHSValue);
1682 if (LHSSafe && RHSSafe)
1685 SemaRef.
Diag(Loc, diag::warn_comparison_unicode_mixed_types_constant)
1695 SemaRef.
Diag(Loc, diag::warn_arith_conv_mixed_unicode_types)
1729 LHSType = AtomicLHS->getValueType();
1732 if (
Context.hasSameType(LHSType, RHSType))
1733 return Context.getCommonSugaredType(LHSType, RHSType);
1741 QualType LHSUnpromotedType = LHSType;
1742 if (
Context.isPromotableIntegerType(LHSType))
1743 LHSType =
Context.getPromotedIntegerType(LHSType);
1745 if (!LHSBitfieldPromoteTy.
isNull())
1746 LHSType = LHSBitfieldPromoteTy;
1751 if (
Context.hasSameType(LHSType, RHSType))
1752 return Context.getCommonSugaredType(LHSType, RHSType);
1795 bool PredicateIsExpr,
void *ControllingExprOrType,
1797 unsigned NumAssocs = ArgTypes.size();
1798 assert(NumAssocs == ArgExprs.size());
1801 for (
unsigned i = 0; i < NumAssocs; ++i) {
1810 if (!PredicateIsExpr) {
1814 assert(ControllingType &&
"couldn't get the type out of the parser");
1815 ControllingExprOrType = ControllingType;
1819 KeyLoc, DefaultLoc, RParenLoc, PredicateIsExpr, ControllingExprOrType,
1831 const auto *TOBT = T->getAs<OverflowBehaviorType>();
1832 const auto *UOBT =
U.getCanonicalType()->getAs<OverflowBehaviorType>();
1836 if (TOBT->getBehaviorKind() == UOBT->getBehaviorKind())
1838 UOBT->getUnderlyingType());
1850 bool PredicateIsExpr,
void *ControllingExprOrType,
1852 unsigned NumAssocs = Types.size();
1853 assert(NumAssocs == Exprs.size());
1854 assert(ControllingExprOrType &&
1855 "Must have either a controlling expression or a controlling type");
1857 Expr *ControllingExpr =
nullptr;
1859 if (PredicateIsExpr) {
1866 reinterpret_cast<Expr *
>(ControllingExprOrType));
1869 ControllingExpr = R.get();
1872 ControllingType =
reinterpret_cast<TypeSourceInfo *
>(ControllingExprOrType);
1873 if (!ControllingType)
1877 bool TypeErrorFound =
false,
1878 IsResultDependent = ControllingExpr
1881 ContainsUnexpandedParameterPack =
1891 diag::warn_side_effects_unevaluated_context);
1893 for (
unsigned i = 0; i < NumAssocs; ++i) {
1894 if (Exprs[i]->containsUnexpandedParameterPack())
1895 ContainsUnexpandedParameterPack =
true;
1898 if (Types[i]->
getType()->containsUnexpandedParameterPack())
1899 ContainsUnexpandedParameterPack =
true;
1901 if (Types[i]->
getType()->isDependentType()) {
1902 IsResultDependent =
true;
1919 if (ControllingExpr && Types[i]->
getType()->isIncompleteType())
1920 D =
LangOpts.C2y ? diag::warn_c2y_compat_assoc_type_incomplete
1921 : diag::ext_assoc_type_incomplete;
1922 else if (ControllingExpr && !Types[i]->
getType()->isObjectType())
1923 D = diag::err_assoc_type_nonobject;
1924 else if (Types[i]->
getType()->isVariablyModifiedType())
1925 D = diag::err_assoc_type_variably_modified;
1926 else if (ControllingExpr) {
1945 unsigned Reason = 0;
1954 Diag(Types[i]->getTypeLoc().getBeginLoc(),
1955 diag::warn_unreachable_association)
1956 << QT << (Reason - 1);
1960 Diag(Types[i]->getTypeLoc().getBeginLoc(), D)
1961 << Types[i]->getTypeLoc().getSourceRange() << Types[i]->getType();
1963 D, Types[i]->getTypeLoc().getBeginLoc()) >=
1965 TypeErrorFound =
true;
1970 for (
unsigned j = i+1; j < NumAssocs; ++j)
1971 if (Types[j] && !Types[j]->
getType()->isDependentType() &&
1974 Diag(Types[j]->getTypeLoc().getBeginLoc(),
1975 diag::err_assoc_compatible_types)
1976 << Types[j]->getTypeLoc().getSourceRange()
1977 << Types[j]->getType()
1978 << Types[i]->getType();
1979 Diag(Types[i]->getTypeLoc().getBeginLoc(),
1980 diag::note_compat_assoc)
1981 << Types[i]->getTypeLoc().getSourceRange()
1982 << Types[i]->getType();
1983 TypeErrorFound =
true;
1993 if (IsResultDependent) {
1994 if (ControllingExpr)
1996 Types, Exprs, DefaultLoc, RParenLoc,
1997 ContainsUnexpandedParameterPack);
1999 Exprs, DefaultLoc, RParenLoc,
2000 ContainsUnexpandedParameterPack);
2004 unsigned DefaultIndex = std::numeric_limits<unsigned>::max();
2008 for (
unsigned i = 0; i < NumAssocs; ++i) {
2016 QualType AssocQT = Types[i]->getType();
2022 CompatIndices.push_back(i);
2026 auto GetControllingRangeAndType = [](
Expr *ControllingExpr,
2030 if (ControllingExpr)
2039 return std::make_pair(SR, QT);
2045 if (CompatIndices.size() > 1) {
2046 auto P = GetControllingRangeAndType(ControllingExpr, ControllingType);
2049 << SR << P.second << (
unsigned)CompatIndices.size();
2050 for (
unsigned I : CompatIndices) {
2051 Diag(Types[I]->getTypeLoc().getBeginLoc(),
2052 diag::note_compat_assoc)
2053 << Types[I]->getTypeLoc().getSourceRange()
2054 << Types[I]->getType();
2062 if (DefaultIndex == std::numeric_limits<unsigned>::max() &&
2063 CompatIndices.size() == 0) {
2064 auto P = GetControllingRangeAndType(ControllingExpr, ControllingType);
2066 Diag(SR.
getBegin(), diag::err_generic_sel_no_match) << SR << P.second;
2075 unsigned ResultIndex =
2076 CompatIndices.size() ? CompatIndices[0] : DefaultIndex;
2078 if (ControllingExpr) {
2080 Context, KeyLoc, ControllingExpr, Types, Exprs, DefaultLoc, RParenLoc,
2081 ContainsUnexpandedParameterPack, ResultIndex);
2084 Context, KeyLoc, ControllingType, Types, Exprs, DefaultLoc, RParenLoc,
2085 ContainsUnexpandedParameterPack, ResultIndex);
2091 llvm_unreachable(
"unexpected TokenKind");
2092 case tok::kw___func__:
2094 case tok::kw___FUNCTION__:
2096 case tok::kw___FUNCDNAME__:
2098 case tok::kw___FUNCSIG__:
2100 case tok::kw_L__FUNCTION__:
2102 case tok::kw_L__FUNCSIG__:
2104 case tok::kw___PRETTY_FUNCTION__:
2115 return cast_or_null<Decl>(DC);
2133 assert(Args.size() <= 2 &&
"too many arguments for literal operator");
2136 for (
unsigned ArgIdx = 0; ArgIdx != Args.size(); ++ArgIdx) {
2137 ArgTy[ArgIdx] = Args[ArgIdx]->getType();
2138 if (ArgTy[ArgIdx]->isArrayType())
2159 std::vector<Token> ExpandedToks;
2165 if (Literal.hadError)
2169 for (
const Token &
Tok : StringToks)
2170 StringTokLocs.push_back(
Tok.getLocation());
2174 false, {}, StringTokLocs);
2176 if (!Literal.getUDSuffix().empty()) {
2179 Literal.getUDSuffixOffset());
2180 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_string_udl));
2200 CurrentDecl =
Context.getTranslationUnitDecl();
2202 std::vector<Token> ExpandedToks;
2203 ExpandedToks.reserve(Toks.size());
2207 ExpandedToks.emplace_back(
Tok);
2211 Diag(
Tok.getLocation(), diag::ext_predef_outside_function);
2213 Diag(
Tok.getLocation(), diag::ext_string_literal_from_predefined)
2216 llvm::raw_svector_ostream
OS(Str);
2217 Token &Exp = ExpandedToks.emplace_back();
2219 if (
Tok.getKind() == tok::kw_L__FUNCTION__ ||
2220 Tok.getKind() == tok::kw_L__FUNCSIG__) {
2222 Exp.
setKind(tok::wide_string_literal);
2224 Exp.
setKind(tok::string_literal);
2230 PP.CreateString(
OS.str(), Exp,
Tok.getLocation(),
Tok.getEndLoc());
2232 return ExpandedToks;
2237 assert(!StringToks.empty() &&
"Must have at least one string!");
2240 std::vector<Token> ExpandedToks;
2245 if (Literal.hadError)
2249 for (
const Token &
Tok : StringToks)
2250 StringTokLocs.push_back(
Tok.getLocation());
2254 if (Literal.isWide()) {
2255 CharTy =
Context.getWideCharType();
2257 }
else if (Literal.isUTF8()) {
2261 CharTy =
Context.UnsignedCharTy;
2263 }
else if (Literal.isUTF16()) {
2266 }
else if (Literal.isUTF32()) {
2269 }
else if (Literal.isPascal()) {
2270 CharTy =
Context.UnsignedCharTy;
2282 ? diag::warn_cxx20_compat_utf8_string
2283 : diag::warn_c23_compat_utf8_string);
2289 auto RemovalDiag =
PDiag(diag::note_cxx20_c23_compat_utf8_string_remove_u8);
2291 for (
const Token &
Tok : StringToks) {
2292 if (
Tok.getKind() == tok::utf8_string_literal) {
2294 RemovalDiagLoc =
Tok.getLocation();
2301 Diag(RemovalDiagLoc, RemovalDiag);
2305 Context.getStringLiteralArrayType(CharTy, Literal.GetNumStringChars());
2309 Context, Literal.GetString(), Kind, Literal.Pascal, StrTy, StringTokLocs);
2310 if (Literal.getUDSuffix().empty())
2317 Literal.getUDSuffixOffset());
2321 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_string_udl));
2328 Context.DeclarationNames.getCXXLiteralOperatorName(UDSuffix);
2333 Context.getArrayDecayedType(StrTy), SizeType
2343 llvm::APInt Len(
Context.getIntWidth(SizeType), Literal.GetNumStringChars());
2346 Expr *Args[] = { Lit, LenArg };
2363 unsigned CharBits =
Context.getIntWidth(CharTy);
2365 llvm::APSInt
Value(CharBits, CharIsUnsigned);
2372 for (
unsigned I = 0, N = Lit->
getLength(); I != N; ++I) {
2382 llvm_unreachable(
"unexpected literal operator lookup result");
2386 llvm_unreachable(
"unexpected literal operator lookup result");
2418 auto *DRE = dyn_cast<DeclRefExpr>(VD->
getInit());
2421 auto *Referee = dyn_cast<VarDecl>(DRE->getDecl());
2422 if (!Referee || !Referee->hasGlobalStorage() ||
2423 Referee->hasAttr<CUDADeviceAttr>())
2429 auto *MD = dyn_cast_or_null<CXXMethodDecl>(S.
CurContext);
2430 if (MD && MD->getParent()->isLambda() &&
2431 MD->getOverloadedOperator() == OO_Call && MD->hasAttr<CUDADeviceAttr>() &&
2453 if (
VarDecl *VD = dyn_cast<VarDecl>(D)) {
2454 if (VD->getType()->isReferenceType() &&
2457 VD->isUsableInConstantExpressions(
Context))
2476 Context, NNS, TemplateKWLoc, D, RefersToCapturedVariable, NameInfo, Ty,
2504 const auto *FD = dyn_cast<FieldDecl>(D);
2505 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(D))
2506 FD = IFD->getAnonField();
2510 if (FD->isBitField())
2516 if (
const auto *BD = dyn_cast<BindingDecl>(D))
2517 if (
const auto *BE = BD->getBinding())
2538 NameInfo =
Context.getNameForTemplate(TName, TNameLoc);
2539 TemplateArgs = &Buffer;
2542 TemplateArgs =
nullptr;
2550 bool isDefaultArgument =
2554 const auto *CurMethod = dyn_cast<CXXMethodDecl>(
CurContext);
2555 bool isInstance = CurMethod && CurMethod->isInstance() &&
2556 R.getNamingClass() == CurMethod->getParent() &&
2564 unsigned DiagID = diag::err_found_in_dependent_base;
2565 unsigned NoteID = diag::note_member_declared_at;
2566 if (R.getRepresentativeDecl()->getDeclContext()->Equals(R.getNamingClass())) {
2567 DiagID =
getLangOpts().MSVCCompat ? diag::ext_found_later_in_class
2568 : diag::err_found_later_in_class;
2570 DiagID = diag::ext_found_in_dependent_base;
2571 NoteID = diag::note_dependent_member_use;
2576 Diag(R.getNameLoc(), DiagID)
2577 << R.getLookupName()
2583 Diag(R.getNameLoc(), DiagID) << R.getLookupName();
2587 Diag(D->getLocation(), NoteID);
2596 if (isDefaultArgument && ((*R.begin())->isCXXInstanceMember())) {
2597 Diag(R.getNameLoc(), diag::err_member_call_without_object) << 0;
2610 SourceRange NameRange = R.getLookupNameInfo().getSourceRange();
2612 unsigned diagnostic = diag::err_undeclared_var_use;
2613 unsigned diagnostic_suggest = diag::err_undeclared_var_use_suggest;
2617 diagnostic = diag::err_undeclared_use;
2618 diagnostic_suggest = diag::err_undeclared_use_suggest;
2629 if (ExplicitTemplateArgs) {
2641 R.suppressDiagnostics();
2652 R.addDecl(Best->FoundDecl.getDecl(), Best->FoundDecl.getAccess());
2667 if (S && (Corrected =
2668 CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), S, &SS,
2671 bool DroppedSpecifier =
2675 bool AcceptableWithRecovery =
false;
2676 bool AcceptableWithoutRecovery =
false;
2685 dyn_cast<FunctionTemplateDecl>(CD))
2689 else if (
FunctionDecl *FD = dyn_cast<FunctionDecl>(CD))
2690 if (!ExplicitTemplateArgs || ExplicitTemplateArgs->
size() == 0)
2696 ND = Best->FoundDecl;
2697 Corrected.setCorrectionDecl(ND);
2701 Corrected.setCorrectionDecl(ND);
2712 R.setNamingClass(
Record);
2729 AcceptableWithoutRecovery =
true;
2732 if (AcceptableWithRecovery || AcceptableWithoutRecovery) {
2734 ? diag::note_implicit_param_decl
2735 : diag::note_previous_decl;
2738 PDiag(NoteID), AcceptableWithRecovery);
2741 PDiag(diag::err_no_member_suggest)
2743 << DroppedSpecifier << NameRange,
2744 PDiag(NoteID), AcceptableWithRecovery);
2754 return !AcceptableWithRecovery;
2762 Diag(R.getNameLoc(), diag::err_no_member)
2768 Diag(R.getNameLoc(), diagnostic) << Name << NameRange;
2789 else if (
auto *MD = dyn_cast<CXXMethodDecl>(S.
CurContext))
2797 auto DB = S.
Diag(Loc, diag::ext_undeclared_unqual_id_with_dependent_base);
2798 DB << NameInfo.
getName() << RD;
2800 if (!ThisType.
isNull()) {
2803 Context,
nullptr, ThisType,
true,
2805 nullptr, NameInfo, TemplateArgs);
2821 bool IsAddressOfOperand,
2823 bool IsInlineAsmIdentifier) {
2824 assert(!(IsAddressOfOperand && HasTrailingLParen) &&
2825 "cannot be direct & operand and have a trailing lparen");
2854 if (
auto *VD = dyn_cast<ValueDecl>(R.getFoundDecl())) {
2868 if (TemplateKWLoc.
isValid() || TemplateArgs) {
2876 false, TemplateKWLoc,
2880 if (R.wasNotFoundInCurrentInstantiation() || SS.
isInvalid())
2882 IsAddressOfOperand, TemplateArgs);
2886 !IvarLookupFollowUp);
2890 if (R.wasNotFoundInCurrentInstantiation() || SS.
isInvalid())
2892 IsAddressOfOperand, TemplateArgs);
2896 if (IvarLookupFollowUp) {
2906 if (R.isAmbiguous())
2911 if (R.empty() && HasTrailingLParen && II &&
2914 if (D) R.addDecl(D);
2921 if (R.empty() && !ADL) {
2924 TemplateKWLoc, TemplateArgs))
2929 if (IsInlineAsmIdentifier)
2937 "Typo correction callback misconfigured");
2951 assert(!R.empty() &&
2952 "DiagnoseEmptyLookup returned false but added no results");
2959 ExprResult E(
ObjC().LookupInObjCMethod(R, S, Ivar->getIdentifier()));
2969 assert(!R.empty() || ADL);
2999 if (TemplateArgs || TemplateKWLoc.
isValid()) {
3008 "There should only be one declaration found.");
3023 if (R.isAmbiguous())
3026 if (R.wasNotFoundInCurrentInstantiation() || SS.
isInvalid())
3036 if (
const auto *CD = dyn_cast<CXXRecordDecl>(DC))
3037 if (CD->isInvalidDecl() || CD->isBeingDefined())
3047 if (
auto *TagD = dyn_cast<TagDecl>(TD)) {
3054 TL.setNameLoc(NameInfo.
getLoc());
3055 }
else if (
auto *TypedefD = dyn_cast<TypedefNameDecl>(TD)) {
3063 ET =
SemaRef.Context.getTypeDeclType(TD);
3071 unsigned DiagID = diag::err_typename_missing;
3073 DiagID = diag::ext_typename_missing;
3075 auto D =
Diag(Loc, DiagID);
3106 const auto *RD = dyn_cast<CXXRecordDecl>(
Member->getDeclContext());
3114 bool PointerConversions =
false;
3116 DestRecordType =
Context.getCanonicalTagType(RD);
3118 DestRecordType =
Context.getAddrSpaceQualType(
3119 DestRecordType, FromPtrType
3124 DestType =
Context.getPointerType(DestRecordType);
3126 PointerConversions =
true;
3128 DestType = DestRecordType;
3129 FromRecordType = FromType;
3131 }
else if (
const auto *
Method = dyn_cast<CXXMethodDecl>(
Member)) {
3132 if (!
Method->isImplicitObjectMemberFunction())
3135 DestType =
Method->getThisType().getNonReferenceType();
3136 DestRecordType =
Method->getFunctionObjectParameterType();
3140 PointerConversions =
true;
3142 FromRecordType = FromType;
3143 DestType = DestRecordType;
3148 if (FromAS != DestAS) {
3150 Context.removeAddrSpaceQualType(FromRecordType);
3152 Context.getAddrSpaceQualType(FromRecordTypeWithoutAS, DestAS);
3153 if (PointerConversions)
3154 FromTypeWithDestAS =
Context.getPointerType(FromTypeWithDestAS);
3168 if (
Context.hasSameUnqualifiedType(FromRecordType, DestRecordType))
3196 assert(QType->
isRecordType() &&
"lookup done with non-record type");
3206 FromLoc, FromRange, &BasePath))
3209 if (PointerConversions)
3210 QType =
Context.getPointerType(QType);
3212 VK, &BasePath).
get();
3215 FromRecordType = QRecordType;
3219 if (
Context.hasSameUnqualifiedType(FromRecordType, DestRecordType))
3226 FromLoc, FromRange, &BasePath,
3235 DestType =
Context.getQualifiedType(DestType, FromTypeQuals);
3243 bool HasTrailingLParen) {
3245 if (!HasTrailingLParen)
3263 if (D->isCXXClassMember())
3274 else if (D->getLexicalDeclContext()->isFunctionOrMethod())
3281 if (
const auto *FDecl = dyn_cast<FunctionDecl>(D)) {
3283 if (FDecl->getBuiltinID() && FDecl->isImplicit())
3298 bool AcceptInvalid) {
3323 assert(R.isSingleResult() &&
"Expected only a single result");
3324 const auto *FD = dyn_cast<FunctionDecl>(R.getFoundDecl());
3326 (FD->isCPUDispatchMultiVersion() || FD->isCPUSpecificMultiVersion());
3331 bool AcceptInvalidDecl) {
3334 if (!NeedsADL && R.isSingleResult() &&
3338 R.getRepresentativeDecl(),
nullptr,
3352 R.suppressDiagnostics();
3356 R.getLookupNameInfo(), NeedsADL, R.begin(), R.end(),
3365 bool AcceptInvalidDecl) {
3366 assert(D &&
"Cannot refer to a NULL declaration");
3368 "Cannot refer unambiguously to a function template");
3387 Diag(Loc, diag::err_ref_non_value) << D << SS.
getRange();
3402 if (VD->isInvalidDecl() && !AcceptInvalidDecl)
3408 if (
auto *IndirectField = dyn_cast<IndirectFieldDecl>(VD);
3409 IndirectField && !IndirectField->isCXXClassMember())
3421 type =
type.getNonPackExpansionType();
3425#define ABSTRACT_DECL(kind)
3426#define VALUE(type, base)
3427#define DECL(type, base) case Decl::type:
3428#include "clang/AST/DeclNodes.inc"
3429 llvm_unreachable(
"invalid value decl kind");
3432 case Decl::ObjCAtDefsField:
3433 llvm_unreachable(
"forming non-member reference to ivar?");
3437 case Decl::EnumConstant:
3438 case Decl::UnresolvedUsingValue:
3439 case Decl::OMPDeclareReduction:
3440 case Decl::OMPDeclareMapper:
3449 case Decl::IndirectField:
3450 case Decl::ObjCIvar:
3452 "building reference to field in C?");
3462 case Decl::NonTypeTemplateParm: {
3464 type = reftype->getPointeeType();
3474 if (
type->isRecordType()) {
3475 type =
type.getUnqualifiedType().withConst();
3488 case Decl::VarTemplateSpecialization:
3489 case Decl::VarTemplatePartialSpecialization:
3490 case Decl::Decomposition:
3492 case Decl::OMPCapturedExpr:
3495 type->isVoidType()) {
3501 case Decl::ImplicitParam:
3502 case Decl::ParmVar: {
3512 if (!CapturedType.
isNull())
3513 type = CapturedType;
3518 case Decl::Function: {
3520 if (!
Context.BuiltinInfo.isDirectlyAddressable(BID)) {
3557 case Decl::CXXDeductionGuide:
3558 llvm_unreachable(
"building reference to deduction guide");
3560 case Decl::MSProperty:
3562 case Decl::TemplateParamObject:
3568 case Decl::UnnamedGlobalConstant:
3572 case Decl::CXXMethod:
3577 dyn_cast<FunctionProtoType>(VD->getType()))
3578 if (proto->getReturnType() ==
Context.UnknownAnyTy) {
3591 case Decl::CXXConversion:
3592 case Decl::CXXDestructor:
3593 case Decl::CXXConstructor:
3605 if (VD->isInvalidDecl() && E)
3612 Target.resize(CharByteWidth * (Source.size() + 1));
3613 char *ResultPtr = &
Target[0];
3614 const llvm::UTF8 *ErrorPtr;
3616 llvm::ConvertUTF8toWide(CharByteWidth, Source, ResultPtr, ErrorPtr);
3626 Diag(Loc, diag::ext_predef_outside_function);
3627 currentDecl =
Context.getTranslationUnitDecl();
3637 bool ForceElaboratedPrinting =
3641 unsigned Length = Str.length();
3643 llvm::APInt LengthI(32, Length + 1);
3647 Context.adjustStringLiteralBaseType(
Context.WideCharTy.withConst());
3651 ResTy =
Context.getConstantArrayType(ResTy, LengthI,
nullptr,
3657 ResTy =
Context.adjustStringLiteralBaseType(
Context.CharTy.withConst());
3658 ResTy =
Context.getConstantArrayType(ResTy, LengthI,
nullptr,
3677 StringRef ThisTok =
PP.getSpelling(
Tok, CharBuffer, &
Invalid);
3683 if (Literal.hadError())
3687 if (Literal.isWide())
3693 else if (Literal.isUTF16())
3695 else if (Literal.isUTF32())
3704 if (Literal.isWide())
3706 else if (Literal.isUTF16())
3708 else if (Literal.isUTF32())
3710 else if (Literal.isUTF8())
3716 if (Literal.getUDSuffix().empty())
3726 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_character_udl));
3731 Lit,
Tok.getLocation());
3735 unsigned IntSize =
Context.getTargetInfo().getIntWidth();
3737 llvm::APInt(IntSize, Val,
true),
3759 using llvm::APFloat;
3760 APFloat Val(Format);
3763 if (RM == llvm::RoundingMode::Dynamic)
3764 RM = llvm::RoundingMode::NearestTiesToEven;
3765 APFloat::opStatus result = Literal.GetFloatValue(Val, RM);
3769 if ((result & APFloat::opOverflow) ||
3770 ((result & APFloat::opUnderflow) && Val.isZero())) {
3771 unsigned diagnostic;
3773 if (result & APFloat::opOverflow) {
3774 diagnostic = diag::warn_float_overflow;
3775 APFloat::getLargest(Format).toString(buffer);
3777 diagnostic = diag::warn_float_underflow;
3778 APFloat::getSmallest(Format).toString(buffer);
3781 S.
Diag(Loc, diagnostic) << Ty << buffer.str();
3784 bool isExact = (result == APFloat::opOK);
3789 assert(E &&
"Invalid expression");
3796 Diag(E->
getExprLoc(), diag::err_pragma_loop_invalid_argument_type) << QT;
3800 llvm::APSInt ValueAPS;
3811 bool ValueIsPositive =
3812 AllowZero ? ValueAPS.isNonNegative() : ValueAPS.isStrictlyPositive();
3813 if (!ValueIsPositive || ValueAPS.getActiveBits() > 31) {
3815 <<
toString(ValueAPS, 10) << ValueIsPositive;
3825 if (
Tok.getLength() == 1 ||
Tok.getKind() == tok::binary_data) {
3826 const uint8_t Val =
PP.getSpellingOfSingleCharacterNumericConstant(
Tok);
3835 SpellingBuffer.resize(
Tok.getLength() + 1);
3839 StringRef TokSpelling =
PP.getSpelling(
Tok, SpellingBuffer, &
Invalid);
3844 PP.getSourceManager(),
PP.getLangOpts(),
3845 PP.getTargetInfo(),
PP.getDiagnostics());
3846 if (Literal.hadError)
3849 if (Literal.hasUDSuffix()) {
3857 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_numeric_udl));
3860 if (Literal.isFloatingLiteral()) {
3864 CookedTy =
Context.LongDoubleTy;
3869 CookedTy =
Context.UnsignedLongLongTy;
3873 Context.DeclarationNames.getCXXLiteralOperatorName(UDSuffix);
3885 !Literal.isImaginary)) {
3894 if (Literal.isFloatingLiteral()) {
3897 llvm::APInt ResultVal(
Context.getTargetInfo().getLongLongWidth(), 0);
3898 if (Literal.GetIntegerValue(ResultVal))
3899 Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
3911 unsigned Length = Literal.getUDSuffixOffset();
3918 false, StrTy, TokLoc);
3929 bool CharIsUnsigned =
Context.CharTy->isUnsignedIntegerType();
3930 llvm::APSInt
Value(CharBits, CharIsUnsigned);
3931 for (
unsigned I = 0, N = Literal.getUDSuffixOffset(); I != N; ++I) {
3932 Value = TokSpelling[I];
3940 llvm_unreachable(
"unexpected literal operator lookup result");
3946 if (Literal.isFixedPointLiteral()) {
3949 if (Literal.isAccum) {
3950 if (Literal.isHalf) {
3952 }
else if (Literal.isLong) {
3957 }
else if (Literal.isFract) {
3958 if (Literal.isHalf) {
3960 }
else if (Literal.isLong) {
3967 if (Literal.isUnsigned) Ty =
Context.getCorrespondingUnsignedType(Ty);
3969 bool isSigned = !Literal.isUnsigned;
3970 unsigned scale =
Context.getFixedPointScale(Ty);
3971 unsigned bit_width =
Context.getTypeInfo(Ty).Width;
3973 llvm::APInt Val(bit_width, 0, isSigned);
3974 bool Overflowed = Literal.GetFixedPointValue(Val, scale);
3975 bool ValIsZero = Val.isZero() && !Overflowed;
3977 auto MaxVal =
Context.getFixedPointMax(Ty).getValue();
3978 if (Literal.isFract && Val == MaxVal + 1 && !ValIsZero)
3984 else if (Val.ugt(MaxVal) || Overflowed)
3985 Diag(
Tok.getLocation(), diag::err_too_large_for_fixed_point);
3988 Tok.getLocation(), scale);
3989 }
else if (Literal.isFloatingLiteral()) {
3991 if (Literal.isHalf){
3996 Diag(
Tok.getLocation(), diag::err_half_const_requires_fp16);
3999 }
else if (Literal.isFloat)
4001 else if (Literal.isLong)
4003 else if (Literal.isFloat16)
4005 else if (Literal.isFloat128)
4022 Diag(
Tok.getLocation(), diag::warn_double_const_requires_fp64)
4027 }
else if (!Literal.isIntegerLiteral()) {
4033 if (Literal.isSizeT)
4036 ? diag::warn_cxx20_compat_size_t_suffix
4037 : diag::ext_cxx23_size_t_suffix
4038 : diag::err_cxx23_size_t_suffix);
4045 if (Literal.isBitInt)
4046 PP.Diag(
Tok.getLocation(),
4049 : diag::ext_c23_bitint_suffix);
4058 unsigned BitsNeeded =
Context.getTargetInfo().getIntMaxTWidth();
4059 if (Literal.isBitInt)
4060 BitsNeeded = llvm::APInt::getSufficientBitsNeeded(
4061 Literal.getLiteralDigits(), Literal.getRadix());
4062 if (Literal.MicrosoftInteger) {
4063 if (Literal.MicrosoftInteger == 128 &&
4064 !
Context.getTargetInfo().hasInt128Type())
4065 PP.Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
4066 << Literal.isUnsigned;
4067 BitsNeeded = Literal.MicrosoftInteger;
4070 llvm::APInt ResultVal(BitsNeeded, 0);
4072 if (Literal.GetIntegerValue(ResultVal)) {
4074 Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
4076 Ty =
Context.UnsignedLongLongTy;
4077 assert(
Context.getTypeSize(Ty) == ResultVal.getBitWidth() &&
4078 "long long is not intmax_t?");
4085 bool AllowUnsigned = Literal.isUnsigned || Literal.getRadix() != 10;
4092 Literal.isLong =
true;
4093 Literal.isLongLong =
false;
4100 if (Literal.MicrosoftInteger) {
4101 if (Literal.MicrosoftInteger == 8 && !Literal.isUnsigned) {
4105 Width = Literal.MicrosoftInteger;
4106 Ty =
Context.getIntTypeForBitwidth(Width,
4107 !Literal.isUnsigned);
4113 if (Literal.isBitInt) {
4116 Width = std::max(ResultVal.getActiveBits(), 1u) +
4117 (Literal.isUnsigned ? 0u : 1u);
4121 unsigned int MaxBitIntWidth =
4122 Context.getTargetInfo().getMaxBitIntWidth();
4123 if (Width > MaxBitIntWidth) {
4124 Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
4125 << Literal.isUnsigned;
4126 Width = MaxBitIntWidth;
4133 ResultVal = ResultVal.zextOrTrunc(Width);
4134 Ty =
Context.getBitIntType(Literal.isUnsigned, Width);
4138 if (Literal.isSizeT) {
4139 assert(!Literal.MicrosoftInteger &&
4140 "size_t literals can't be Microsoft literals");
4141 unsigned SizeTSize =
Context.getTargetInfo().getTypeWidth(
4142 Context.getTargetInfo().getSizeType());
4145 if (ResultVal.isIntN(SizeTSize)) {
4147 if (!Literal.isUnsigned && ResultVal[SizeTSize - 1] == 0)
4148 Ty =
Context.getSignedSizeType();
4149 else if (AllowUnsigned)
4155 if (Ty.
isNull() && !Literal.isLong && !Literal.isLongLong &&
4158 unsigned IntSize =
Context.getTargetInfo().getIntWidth();
4161 if (ResultVal.isIntN(IntSize)) {
4163 if (!Literal.isUnsigned && ResultVal[IntSize-1] == 0)
4165 else if (AllowUnsigned)
4172 if (Ty.
isNull() && !Literal.isLongLong && !Literal.isSizeT) {
4173 unsigned LongSize =
Context.getTargetInfo().getLongWidth();
4176 if (ResultVal.isIntN(LongSize)) {
4178 if (!Literal.isUnsigned && ResultVal[LongSize-1] == 0)
4180 else if (AllowUnsigned)
4185 const unsigned LongLongSize =
4186 Context.getTargetInfo().getLongLongWidth();
4190 ? diag::warn_old_implicitly_unsigned_long_cxx
4192 ext_old_implicitly_unsigned_long_cxx
4193 : diag::warn_old_implicitly_unsigned_long)
4194 << (LongLongSize > LongSize ? 0
4203 if (Ty.
isNull() && !Literal.isSizeT) {
4204 unsigned LongLongSize =
Context.getTargetInfo().getLongLongWidth();
4207 if (ResultVal.isIntN(LongLongSize)) {
4211 if (!Literal.isUnsigned && (ResultVal[LongLongSize-1] == 0 ||
4212 (
getLangOpts().MSVCCompat && Literal.isLongLong)))
4214 else if (AllowUnsigned)
4215 Ty =
Context.UnsignedLongLongTy;
4216 Width = LongLongSize;
4222 ? diag::warn_cxx98_compat_longlong
4223 : diag::ext_cxx11_longlong);
4225 Diag(
Tok.getLocation(), diag::ext_c99_longlong);
4233 if (Literal.isSizeT)
4234 Diag(
Tok.getLocation(), diag::err_size_t_literal_too_large)
4235 << Literal.isUnsigned;
4238 diag::ext_integer_literal_too_large_for_signed);
4239 Ty =
Context.UnsignedLongLongTy;
4240 Width =
Context.getTargetInfo().getLongLongWidth();
4243 if (ResultVal.getBitWidth() != Width)
4244 ResultVal = ResultVal.trunc(Width);
4250 if (Literal.isImaginary) {
4257 DiagId = diag::ext_gnu_imaginary_constant;
4259 DiagId = diag::warn_c23_compat_imaginary_constant;
4261 DiagId = diag::ext_c2y_imaginary_constant;
4262 Diag(
Tok.getLocation(), DiagId);
4268 assert(E &&
"ActOnParenExpr() missing expr");
4283 if (!(T->isArithmeticType() || T->isVoidType() || T->isVectorType())) {
4284 S.
Diag(Loc, diag::err_vecstep_non_scalar_vector_type)
4289 assert((T->isVoidType() || !T->isIncompleteType()) &&
4290 "Scalar types should always be complete");
4298 if (!T->isVectorType() && !T->isSizelessVectorType())
4299 return S.
Diag(Loc, diag::err_builtin_non_vector_type)
4301 <<
"__builtin_vectorelements" << T << ArgRange;
4303 if (
auto *FD = dyn_cast<FunctionDecl>(S.
CurContext)) {
4304 if (T->isSVESizelessBuiltinType()) {
4305 llvm::StringMap<bool> CallerFeatureMap;
4320 if (!T->isFunctionType() && !T->isFunctionPointerType() &&
4321 !T->isFunctionReferenceType() && !T->isMemberFunctionPointerType()) {
4322 S.
Diag(Loc, diag::err_ptrauth_type_disc_undiscriminated) << T << ArgRange;
4338 if (TraitKind == UETT_SizeOf || TraitKind == UETT_AlignOf ||
4339 TraitKind == UETT_PreferredAlignOf) {
4342 if (T->isFunctionType()) {
4343 S.
Diag(Loc, diag::ext_sizeof_alignof_function_type)
4350 if (T->isVoidType()) {
4351 unsigned DiagID = S.
LangOpts.OpenCL ? diag::err_opencl_sizeof_alignof_type
4352 : diag::ext_sizeof_alignof_void_type;
4367 S.
Diag(Loc, diag::err_sizeof_nonfragile_interface)
4368 << T << (TraitKind == UETT_SizeOf)
4385 const auto *ICE = dyn_cast<ImplicitCastExpr>(E);
4386 if (!ICE || ICE->getCastKind() != CK_ArrayToPointerDecay)
4389 S.
Diag(Loc, diag::warn_sizeof_array_decay) << ICE->getSourceRange()
4391 << ICE->getSubExpr()->getType();
4399 bool IsUnevaluatedOperand =
4400 (ExprKind == UETT_SizeOf || ExprKind == UETT_DataSizeOf ||
4401 ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf ||
4402 ExprKind == UETT_VecStep || ExprKind == UETT_CountOf);
4403 if (IsUnevaluatedOperand) {
4419 Diag(E->
getExprLoc(), diag::warn_side_effects_unevaluated_context);
4421 if (ExprKind == UETT_VecStep)
4425 if (ExprKind == UETT_VectorElements)
4436 if (
Context.getTargetInfo().getTriple().isWasm() &&
4447 if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf) {
4450 diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4455 E, diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4474 if (ExprKind == UETT_CountOf) {
4479 Diag(E->
getExprLoc(), diag::err_countof_arg_not_array_type) << ExprType;
4489 if (ExprKind == UETT_SizeOf) {
4490 if (
const auto *DeclRef = dyn_cast<DeclRefExpr>(E->
IgnoreParens())) {
4491 if (
const auto *PVD = dyn_cast<ParmVarDecl>(DeclRef->getFoundDecl())) {
4492 QualType OType = PVD->getOriginalType();
4497 Diag(PVD->getLocation(), diag::note_declared_at);
4505 if (
const auto *BO = dyn_cast<BinaryOperator>(E->
IgnoreParens())) {
4522 S.
Diag(E->
getExprLoc(), diag::err_sizeof_alignof_typeof_bitfield)
4529 if (
DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Inner)) {
4531 }
else if (
MemberExpr *ME = dyn_cast<MemberExpr>(Inner)) {
4532 D = ME->getMemberDecl();
4552 if (
FieldDecl *FD = dyn_cast_or_null<FieldDecl>(D)) {
4555 if (!FD->getParent()->isCompleteDefinition()) {
4556 S.
Diag(E->
getExprLoc(), diag::err_alignof_member_of_incomplete_type)
4565 if (!FD->getType()->isReferenceType())
4584 assert(T->isVariablyModifiedType());
4585 assert(CSI !=
nullptr);
4589 const Type *Ty = T.getTypePtr();
4591#define TYPE(Class, Base)
4592#define ABSTRACT_TYPE(Class, Base)
4593#define NON_CANONICAL_TYPE(Class, Base)
4594#define DEPENDENT_TYPE(Class, Base) case Type::Class:
4595#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)
4596#include "clang/AST/TypeNodes.inc"
4603 case Type::ExtVector:
4604 case Type::ConstantMatrix:
4607 case Type::TemplateSpecialization:
4608 case Type::ObjCObject:
4609 case Type::ObjCInterface:
4610 case Type::ObjCObjectPointer:
4611 case Type::ObjCTypeParam:
4614 case Type::HLSLInlineSpirv:
4615 llvm_unreachable(
"type class is never variably-modified!");
4616 case Type::Adjusted:
4622 case Type::ArrayParameter:
4628 case Type::BlockPointer:
4631 case Type::LValueReference:
4632 case Type::RValueReference:
4635 case Type::MemberPointer:
4638 case Type::ConstantArray:
4639 case Type::IncompleteArray:
4643 case Type::VariableArray: {
4657 case Type::FunctionProto:
4658 case Type::FunctionNoProto:
4663 case Type::UnaryTransform:
4664 case Type::Attributed:
4665 case Type::BTFTagAttributed:
4666 case Type::OverflowBehavior:
4667 case Type::HLSLAttributedResource:
4668 case Type::SubstTemplateTypeParm:
4669 case Type::MacroQualified:
4670 case Type::CountAttributed:
4672 T = T.getSingleStepDesugaredType(Context);
4677 case Type::Decltype:
4680 case Type::PackIndexing:
4687 case Type::DeducedTemplateSpecialization:
4690 case Type::TypeOfExpr:
4696 case Type::PredefinedSugar:
4700 }
while (!T.isNull() && T->isVariablyModifiedType());
4723 if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf ||
4724 ExprKind == UETT_OpenMPRequiredSimdAlign) {
4730 ? diag::warn_c2y_compat_alignof_incomplete_array
4731 : diag::ext_c2y_alignof_incomplete_array);
4732 ExprType =
Context.getBaseElementType(ExprType);
4735 if (ExprKind == UETT_VecStep)
4738 if (ExprKind == UETT_VectorElements)
4742 if (ExprKind == UETT_PtrAuthTypeDiscriminator)
4752 OpLoc, ExprType, diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4757 Diag(OpLoc, diag::err_sizeof_alignof_function_type) << KWName << ExprRange;
4761 if (ExprKind == UETT_CountOf) {
4765 Diag(OpLoc, diag::err_countof_arg_not_array_type) << ExprType;
4772 if (
Context.getTargetInfo().getTriple().isWasm() &&
4774 Diag(OpLoc, diag::err_wasm_table_invalid_uett_operand)
4788 auto *CSI = dyn_cast<CapturingScopeInfo>(*I);
4792 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(CSI))
4793 DC = LSI->CallOperator;
4794 else if (
auto *CRSI = dyn_cast<CapturedRegionScopeInfo>(CSI))
4795 DC = CRSI->TheCapturedDecl;
4796 else if (
auto *BSI = dyn_cast<BlockScopeInfo>(CSI))
4819 if (!T->isDependentType() &&
4828 (ExprKind == UETT_SizeOf || ExprKind == UETT_CountOf) &&
4838 ExprKind, TInfo,
Context.getSizeType(), OpLoc, R.getEnd());
4854 }
else if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf) {
4856 }
else if (ExprKind == UETT_VecStep) {
4858 }
else if (ExprKind == UETT_OpenMPRequiredSimdAlign) {
4862 Diag(E->
getExprLoc(), diag::err_sizeof_alignof_typeof_bitfield) << 0;
4864 }
else if (ExprKind == UETT_VectorElements || ExprKind == UETT_SizeOf ||
4865 ExprKind == UETT_CountOf) {
4872 if ((ExprKind == UETT_SizeOf || ExprKind == UETT_CountOf) &&
4907 UETT_AlignOf, KWName);
4920 if (
V.get()->isTypeDependent())
4932 return CT->getElementType();
4935 if (
V.get()->getType()->isArithmeticType())
4936 return V.get()->getType();
4941 if (PR.
get() !=
V.get()) {
4947 S.
Diag(Loc, diag::err_realimag_invalid_type) <<
V.get()->getType()
4948 << (IsReal ?
"__real" :
"__imag");
4959 default: llvm_unreachable(
"Unknown unary op!");
4960 case tok::plusplus: Opc = UO_PostInc;
break;
4961 case tok::minusminus: Opc = UO_PostDec;
break;
4980 !S.
LangOpts.ObjCSubscriptingLegacyRuntime)
4983 S.
Diag(opLoc, diag::err_arithmetic_nonfragile_interface)
4990 auto *BaseNoParens =
Base->IgnoreParens();
4991 if (
auto *MSProp = dyn_cast<MSPropertyRefExpr>(BaseNoParens))
4992 return MSProp->getPropertyDecl()->getType()->isArrayType();
5013 if (RTy->isIntegralOrUnscopedEnumerationType()) {
5015 Result = PT->getPointeeType();
5017 Result = AT->getElementType();
5020 Result = PT->getPointeeType();
5022 Result = AT->getElementType();
5036 if (AS->isOMPArraySection())
5052 base = result.
get();
5061 auto CheckAndReportCommaError = [&](
Expr *E) {
5062 if (ArgExprs.size() > 1 ||
5064 Diag(E->getExprLoc(), diag::err_matrix_subscript_comma)
5075 Diag(base->
getExprLoc(), diag::err_matrix_separate_incomplete_index)
5081 auto *matSubscriptE = dyn_cast<MatrixSubscriptExpr>(base);
5082 if (matSubscriptE) {
5083 if (CheckAndReportCommaError(ArgExprs.front()))
5086 assert(matSubscriptE->isIncomplete() &&
5087 "base has to be an incomplete matrix subscript");
5089 matSubscriptE->getRowIdx(),
5090 ArgExprs.front(), rbLoc);
5098 CheckInvalidBuiltinCountedByRef(base,
5106 bool IsMSPropertySubscript =
false;
5109 if (!IsMSPropertySubscript) {
5113 base = result.
get();
5119 if (CheckAndReportCommaError(ArgExprs.front()))
5127 Expr *idx = ArgExprs[0];
5136 if (ArgExprs.size() == 1 &&
5137 ArgExprs[0]->getType()->isNonOverloadPlaceholderType()) {
5141 ArgExprs[0] = result.
get();
5153 base, ArgExprs.front(),
5166 if (IsMSPropertySubscript) {
5167 if (ArgExprs.size() > 1) {
5169 diag::err_ms_property_subscript_expects_single_arg);
5195 Diag(base->
getExprLoc(), diag::err_ovl_builtin_subscript_expects_single_arg)
5203 ArgExprs[0]->getType()->isRecordType())))) {
5221 return InitSeq.
Perform(*
this, Entity, Kind, E);
5235 RowIdx = RowR.
get();
5245 auto IsIndexValid = [&](
Expr *IndexExpr,
unsigned Dim,
5246 bool IsColumnIdx) ->
Expr * {
5254 if (std::optional<llvm::APSInt> Idx =
5256 if ((*Idx < 0 || *Idx >=
Dim)) {
5258 << IsColumnIdx <<
Dim;
5265 "should be able to convert any integer type to size type");
5266 return ConvExpr.
get();
5270 RowIdx = IsIndexValid(RowIdx, MTy->getNumRows(),
false);
5275 Context.getExtVectorType(MTy->getElementType(), MTy->getNumColumns());
5291 RowIdx = RowR.
get();
5295 Base, RowIdx, ColumnIdx,
Context.IncompleteMatrixIdxTy, RBLoc);
5306 ColumnIdx = ColumnR.
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);
5337 ColumnIdx = IsIndexValid(ColumnIdx, MTy->getNumColumns(),
true);
5338 if (!RowIdx || !ColumnIdx)
5342 MTy->getElementType(), RBLoc);
5345void Sema::CheckAddressOfNoDeref(
const Expr *E) {
5352 while ((
Member = dyn_cast<MemberExpr>(StrippedExpr)) && !
Member->isArrow())
5353 StrippedExpr =
Member->getBase()->IgnoreParenImpCasts();
5355 LastRecord.PossibleDerefs.erase(StrippedExpr);
5369 if (ResultTy->
hasAttr(attr::NoDeref)) {
5370 LastRecord.PossibleDerefs.insert(E);
5377 QualType BaseTy =
Base->getType();
5382 const MemberExpr *
Member =
nullptr;
5383 while ((
Member = dyn_cast<MemberExpr>(
Base->IgnoreParenCasts())) &&
5387 if (
const auto *Ptr = dyn_cast<PointerType>(
Base->getType())) {
5388 if (Ptr->getPointeeType()->hasAttr(attr::NoDeref))
5389 LastRecord.PossibleDerefs.insert(E);
5405 for (
auto *Op : {LHSExp, RHSExp}) {
5406 Op = Op->IgnoreImplicit();
5407 if (Op->getType()->isArrayType() && !Op->isLValue())
5430 Expr *BaseExpr, *IndexExpr;
5448 if (!
LangOpts.isSubscriptPointerArithmetic())
5464 if (!
LangOpts.isSubscriptPointerArithmetic()) {
5465 Diag(LLoc, diag::err_subscript_nonfragile_interface)
5489 LHSExp = Materialized.
get();
5496 Qualifiers BaseQuals = BaseType.getQualifiers();
5498 Qualifiers Combined = BaseQuals + MemberQuals;
5499 if (Combined != MemberQuals)
5500 ResultType =
Context.getQualifiedType(ResultType, Combined);
5510 CK_ArrayToPointerDecay).
get();
5516 }
else if (RHSTy->isArrayType()) {
5521 CK_ArrayToPointerDecay).
get();
5528 return ExprError(
Diag(LLoc, diag::err_typecheck_subscript_value)
5533 return ExprError(
Diag(LLoc, diag::err_typecheck_subscript_not_integer)
5539 std::optional<llvm::APSInt> IntegerContantExpr =
5541 if (!IntegerContantExpr.has_value() ||
5542 IntegerContantExpr.value().isNegative())
5558 Diag(LLoc, diag::ext_gnu_subscript_void_type)
5569 diag::err_subscript_incomplete_or_sizeless_type, BaseExpr))
5582 auto *CSI = dyn_cast<CapturingScopeInfo>(*I);
5586 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(CSI))
5587 DC = LSI->CallOperator;
5588 else if (
auto *CRSI = dyn_cast<CapturedRegionScopeInfo>(CSI))
5589 DC = CRSI->TheCapturedDecl;
5590 else if (
auto *BSI = dyn_cast<BlockScopeInfo>(CSI))
5608 bool SkipImmediateInvocations) {
5609 if (Param->hasUnparsedDefaultArg()) {
5610 assert(!RewrittenInit &&
"Should not have a rewritten init expression yet");
5614 Diag(Param->getBeginLoc(), diag::err_recursive_default_argument) << FD;
5615 Diag(CallLoc, diag::note_recursive_default_argument_used_here);
5616 Param->setInvalidDecl();
5620 Diag(CallLoc, diag::err_use_of_default_argument_to_function_declared_later)
5623 diag::note_default_argument_declared_here);
5627 if (Param->hasUninstantiatedDefaultArg()) {
5628 assert(!RewrittenInit &&
"Should not have a rewitten init expression yet");
5633 Expr *
Init = RewrittenInit ? RewrittenInit : Param->getInit();
5634 assert(
Init &&
"default argument but no initializer?");
5643 if (
auto *InitWithCleanup = dyn_cast<ExprWithCleanups>(
Init)) {
5646 Cleanup.setExprNeedsCleanups(InitWithCleanup->cleanupsHaveSideEffects());
5650 assert(!InitWithCleanup->getNumObjects() &&
5651 "default argument expression has capturing blocks?");
5664 SkipImmediateInvocations;
5752 if (!
SemaRef.CurrentInstantiationScope ||
5764 assert(Param->hasDefaultArg() &&
"can't build nonexistent default arg");
5768 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
5769 InitializationContext =
5771 if (!InitializationContext.has_value())
5772 InitializationContext.emplace(CallLoc, Param,
CurContext);
5774 if (!
Init && !Param->hasUnparsedDefaultArg()) {
5789 if (Param->hasUninstantiatedDefaultArg()) {
5798 if (!NestedDefaultChecking)
5799 V.TraverseDecl(Param);
5803 if (
V.HasImmediateCalls ||
5804 (NeedRebuild && isa_and_present<ExprWithCleanups>(Param->getInit()))) {
5805 if (
V.HasImmediateCalls)
5815 Res = Immediate.TransformInitializer(Param->getInit(),
5829 CallLoc, FD, Param,
Init,
5830 NestedDefaultChecking))
5834 Init, InitializationContext->Context);
5844 ClassPattern->
lookup(Field->getDeclName());
5845 auto Rng = llvm::make_filter_range(
5856 assert(Field->hasInClassInitializer());
5862 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
5863 InitializationContext =
5865 if (!InitializationContext.has_value())
5866 InitializationContext.emplace(Loc, Field,
CurContext);
5875 if (!Field->getInClassInitializer()) {
5881 assert(Pattern &&
"We must have set the Pattern!");
5885 Field->setInvalidDecl();
5897 if (!NestedDefaultChecking)
5898 V.TraverseDecl(Field);
5907 bool ContainsAnyTemporaries =
5908 isa_and_present<ExprWithCleanups>(Field->getInClassInitializer());
5909 if (Field->getInClassInitializer() &&
5910 !Field->getInClassInitializer()->containsErrors() &&
5911 (
V.HasImmediateCalls || (NeedRebuild && ContainsAnyTemporaries))) {
5915 NestedDefaultChecking;
5923 Res = Immediate.TransformInitializer(Field->getInClassInitializer(),
5929 Field->setInvalidDecl();
5935 if (Field->getInClassInitializer()) {
5936 Expr *E =
Init ?
Init : Field->getInClassInitializer();
5937 if (!NestedDefaultChecking)
5948 Field->setInvalidDecl();
5954 Field, InitializationContext->Context,
5973 Diag(Loc, diag::err_default_member_initializer_not_yet_parsed)
5974 << OutermostClass << Field;
5975 Diag(Field->getEndLoc(),
5976 diag::note_default_member_initializer_not_yet_parsed);
5979 Field->setInvalidDecl();
5987 if (isa_and_nonnull<CXXConstructorDecl>(FDecl))
5989 else if (Fn && Fn->getType()->isBlockPointerType())
5993 if (
Method->isInstance())
5995 }
else if (Fn && Fn->getType() ==
Context.BoundMemberTy)
6008 FunctionName(FuncName) {}
6010 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
6019 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
6020 return std::make_unique<FunctionCallCCC>(*
this);
6024 const IdentifierInfo *
const FunctionName;
6040 if (
NamedDecl *ND = Corrected.getFoundDecl()) {
6041 if (Corrected.isOverloaded()) {
6051 ND = Best->FoundDecl;
6052 Corrected.setCorrectionDecl(ND);
6058 ND = ND->getUnderlyingDecl();
6073 Fn = Fn->IgnoreParens();
6075 auto *UO = dyn_cast<UnaryOperator>(Fn);
6076 if (!UO || UO->getOpcode() != clang::UO_AddrOf)
6078 if (
auto *DRE = dyn_cast<DeclRefExpr>(UO->getSubExpr()->IgnoreParens())) {
6079 return DRE->hasQualifier();
6081 if (
auto *OVL = dyn_cast<OverloadExpr>(UO->getSubExpr()->IgnoreParens()))
6082 return bool(OVL->getQualifier());
6092 bool IsExecConfig) {
6100 if (
Context.BuiltinInfo.hasCustomTypechecking(ID) &&
6101 !(
Context.getLangOpts().HLSL && FDecl->
hasAttr<BuiltinAliasAttr>()))
6108 bool HasExplicitObjectParameter =
6110 unsigned ExplicitObjectParameterOffset = HasExplicitObjectParameter ? 1 : 0;
6114 unsigned FnKind = Fn->getType()->isBlockPointerType()
6121 if (Args.size() < NumParams) {
6122 if (Args.size() < MinArgs) {
6127 ? diag::err_typecheck_call_too_few_args_suggest
6128 : diag::err_typecheck_call_too_few_args_at_least_suggest;
6131 << FnKind << MinArgs - ExplicitObjectParameterOffset
6132 <<
static_cast<unsigned>(Args.size()) -
6133 ExplicitObjectParameterOffset
6135 }
else if (MinArgs - ExplicitObjectParameterOffset == 1 && FDecl &&
6140 ? diag::err_typecheck_call_too_few_args_one
6141 : diag::err_typecheck_call_too_few_args_at_least_one)
6142 << FnKind << FDecl->
getParamDecl(ExplicitObjectParameterOffset)
6143 << HasExplicitObjectParameter << Fn->getSourceRange();
6146 ? diag::err_typecheck_call_too_few_args
6147 : diag::err_typecheck_call_too_few_args_at_least)
6148 << FnKind << MinArgs - ExplicitObjectParameterOffset
6149 <<
static_cast<unsigned>(Args.size()) -
6150 ExplicitObjectParameterOffset
6151 << HasExplicitObjectParameter << Fn->getSourceRange();
6154 if (!TC && FDecl && !FDecl->
getBuiltinID() && !IsExecConfig)
6162 assert((
Call->getNumArgs() == NumParams) &&
6163 "We should have reserved space for the default arguments before!");
6168 if (Args.size() > NumParams) {
6174 ? diag::err_typecheck_call_too_many_args_suggest
6175 : diag::err_typecheck_call_too_many_args_at_most_suggest;
6178 << FnKind << NumParams - ExplicitObjectParameterOffset
6179 <<
static_cast<unsigned>(Args.size()) -
6180 ExplicitObjectParameterOffset
6182 }
else if (NumParams - ExplicitObjectParameterOffset == 1 && FDecl &&
6185 Diag(Args[NumParams]->getBeginLoc(),
6186 MinArgs == NumParams
6187 ? diag::err_typecheck_call_too_many_args_one
6188 : diag::err_typecheck_call_too_many_args_at_most_one)
6189 << FnKind << FDecl->
getParamDecl(ExplicitObjectParameterOffset)
6190 <<
static_cast<unsigned>(Args.size()) -
6191 ExplicitObjectParameterOffset
6192 << HasExplicitObjectParameter << Fn->getSourceRange()
6194 Args.back()->getEndLoc());
6196 Diag(Args[NumParams]->getBeginLoc(),
6197 MinArgs == NumParams
6198 ? diag::err_typecheck_call_too_many_args
6199 : diag::err_typecheck_call_too_many_args_at_most)
6200 << FnKind << NumParams - ExplicitObjectParameterOffset
6201 <<
static_cast<unsigned>(Args.size()) -
6202 ExplicitObjectParameterOffset
6203 << HasExplicitObjectParameter << Fn->getSourceRange()
6205 Args.back()->getEndLoc());
6208 if (!TC && FDecl && !FDecl->
getBuiltinID() && !IsExecConfig)
6213 Call->shrinkNumArgs(NumParams);
6224 unsigned TotalNumArgs = AllArgs.size();
6225 for (
unsigned i = 0; i < TotalNumArgs; ++i)
6226 Call->setArg(i, AllArgs[i]);
6228 Call->computeDependence();
6237 bool IsListInitialization) {
6242 for (
unsigned i = FirstParam; i < NumParams; i++) {
6247 if (ArgIx < Args.size()) {
6248 Arg = Args[ArgIx++];
6251 diag::err_call_incomplete_argument, Arg))
6255 bool CFAudited =
false;
6257 FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>() &&
6258 (!Param || !Param->hasAttr<CFConsumedAttr>()))
6261 FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>() &&
6262 (!Param || !Param->hasAttr<CFConsumedAttr>()))
6268 BE->getBlockDecl()->setDoesNotEscape();
6289 if (
const auto *OBT = Arg->
getType()->
getAs<OverflowBehaviorType>();
6292 OBT->isUnsignedIntegerOrEnumerationType() && OBT->isWrapKind();
6294 isPedantic ? diag::warn_obt_discarded_at_function_boundary_pedantic
6295 : diag::warn_obt_discarded_at_function_boundary)
6296 << Arg->
getType() << ProtoArgType;
6300 Entity,
SourceLocation(), Arg, IsListInitialization, AllowExplicit);
6306 assert(Param &&
"can't use default arguments without a known callee");
6318 CheckArrayAccess(Arg);
6323 AllArgs.push_back(Arg);
6332 for (
Expr *A : Args.slice(ArgIx)) {
6336 AllArgs.push_back(arg.get());
6341 for (
Expr *A : Args.slice(ArgIx)) {
6344 AllArgs.push_back(Arg.
get());
6349 for (
Expr *A : Args.slice(ArgIx))
6350 CheckArrayAccess(A);
6358 TL = DTL.getOriginalLoc();
6361 << ATL.getLocalSourceRange();
6367 const Expr *ArgExpr) {
6372 QualType OrigTy = Param->getOriginalType();
6397 Diag(CallLoc, diag::warn_static_array_too_small)
6405 std::optional<CharUnits> ArgSize =
6407 std::optional<CharUnits> ParmSize =
6409 if (ArgSize && ParmSize && *ArgSize < *ParmSize) {
6410 Diag(CallLoc, diag::warn_static_array_too_small)
6412 << (
unsigned)ParmSize->getQuantity() << 1;
6426 if (!placeholder)
return false;
6428 switch (placeholder->
getKind()) {
6430#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
6431 case BuiltinType::Id:
6432#include "clang/Basic/OpenCLImageTypes.def"
6433#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
6434 case BuiltinType::Id:
6435#include "clang/Basic/OpenCLExtensionTypes.def"
6438#define SVE_TYPE(Name, Id, SingletonId) \
6439 case BuiltinType::Id:
6440#include "clang/Basic/AArch64ACLETypes.def"
6441#define PPC_VECTOR_TYPE(Name, Id, Size) \
6442 case BuiltinType::Id:
6443#include "clang/Basic/PPCTypes.def"
6444#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6445#include "clang/Basic/RISCVVTypes.def"
6446#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6447#include "clang/Basic/WebAssemblyReferenceTypes.def"
6448#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
6449#include "clang/Basic/AMDGPUTypes.def"
6450#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6451#include "clang/Basic/HLSLIntangibleTypes.def"
6452#define PLACEHOLDER_TYPE(ID, SINGLETON_ID)
6453#define BUILTIN_TYPE(ID, SINGLETON_ID) case BuiltinType::ID:
6454#include "clang/AST/BuiltinTypes.def"
6457 case BuiltinType::UnresolvedTemplate:
6460 case BuiltinType::Overload:
6465 case BuiltinType::ARCUnbridgedCast:
6469 case BuiltinType::PseudoObject:
6474 case BuiltinType::UnknownAny:
6478 case BuiltinType::BoundMember:
6479 case BuiltinType::BuiltinFn:
6480 case BuiltinType::IncompleteMatrixIdx:
6481 case BuiltinType::ArraySection:
6482 case BuiltinType::OMPArrayShaping:
6483 case BuiltinType::OMPIterator:
6487 llvm_unreachable(
"bad builtin type kind");
6493 bool hasInvalid =
false;
6494 for (
size_t i = 0, e = args.size(); i != e; i++) {
6497 if (result.
isInvalid()) hasInvalid =
true;
6498 else args[i] = result.
get();
6522 if (!Context.BuiltinInfo.hasPtrArgsOrResult(FDecl->
getBuiltinID()) || !FT ||
6526 bool NeedsNewDecl =
false;
6546 if (!ParamType->isPointerType() ||
6547 ParamType->getPointeeType().hasAddressSpace() ||
6548 !ArgType->isPointerType() ||
6549 !ArgType->getPointeeType().hasAddressSpace() ||
6551 OverloadParams.push_back(ParamType);
6556 NeedsNewDecl =
true;
6557 LangAS AS = ArgType->getPointeeType().getAddressSpace();
6559 PointeeType = Context.getAddrSpaceQualType(PointeeType, AS);
6560 OverloadParams.push_back(Context.getPointerType(PointeeType));
6570 OverloadParams, EPI);
6580 for (
unsigned i = 0, e = FT->
getNumParams(); i != e; ++i) {
6587 Params.push_back(Parm);
6589 OverloadDecl->setParams(Params);
6593 if (FDecl->
hasAttr<CUDAHostAttr>())
6594 OverloadDecl->
addAttr(CUDAHostAttr::CreateImplicit(Context));
6595 if (FDecl->
hasAttr<CUDADeviceAttr>())
6596 OverloadDecl->
addAttr(CUDADeviceAttr::CreateImplicit(Context));
6599 return OverloadDecl;
6610 !Callee->isVariadic())
6612 if (Callee->getMinRequiredArguments() > ArgExprs.size())
6615 if (
const EnableIfAttr *
Attr =
6616 S.
CheckEnableIf(Callee, Fn->getBeginLoc(), ArgExprs,
true)) {
6617 S.
Diag(Fn->getBeginLoc(),
6619 ? diag::err_ovl_no_viable_member_function_in_call
6620 : diag::err_ovl_no_viable_function_in_call)
6621 << Callee << Callee->getSourceRange();
6622 S.
Diag(Callee->getLocation(),
6623 diag::note_ovl_candidate_disabled_by_function_cond_attr)
6624 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
6632 const auto GetFunctionLevelDCIfCXXClass =
6640 if (
const auto *MD = dyn_cast<CXXMethodDecl>(DC))
6641 return MD->
getParent()->getCanonicalDecl();
6644 if (
const auto *RD = dyn_cast<CXXRecordDecl>(DC))
6645 return RD->getCanonicalDecl();
6652 const CXXRecordDecl *
const CurParentClass = GetFunctionLevelDCIfCXXClass(S);
6653 if (!CurParentClass)
6660 assert(NamingClass &&
"Must have naming class even for implicit access");
6666 return CurParentClass == NamingClass ||
6715 if (
Call->getNumArgs() != 1)
6718 const Expr *E =
Call->getCallee()->IgnoreParenImpCasts();
6721 const DeclRefExpr *DRE = dyn_cast_if_present<DeclRefExpr>(E);
6734 if (BuiltinID != Builtin::BImove && BuiltinID != Builtin::BIforward)
6737 S.
Diag(DRE->
getLocation(), diag::warn_unqualified_call_to_std_cast_function)
6748 if (
Call.isInvalid())
6753 if (
const auto *ULE = dyn_cast<UnresolvedLookupExpr>(Fn);
6754 ULE && ULE->hasExplicitTemplateArgs() && ULE->decls().empty()) {
6755 DiagCompat(Fn->getExprLoc(), diag_compat::adl_only_template_id)
6763 if (
const auto *CE = dyn_cast<CallExpr>(
Call.get()))
6769 if (
auto *DRE = dyn_cast<DeclRefExpr>(Fn->IgnoreParens());
6770 DRE &&
Call.get()->isValueDependent()) {
6780 if (T->isDependentType())
6783 if (T == Context.BoundMemberTy || T == Context.UnknownAnyTy ||
6784 T == Context.BuiltinFnTy || T == Context.OverloadTy ||
6785 T->isFunctionType() || T->isFunctionReferenceType() ||
6786 T->isMemberFunctionPointerType() || T->isFunctionPointerType() ||
6787 T->isBlockPointerType() || T->isRecordType())
6796 Expr *ExecConfig,
bool IsExecConfig,
6797 bool AllowRecovery) {
6806 if (Fn->getType() ==
Context.BuiltinFnTy && ArgExprs.size() == 1 &&
6807 ArgExprs[0]->getType() ==
Context.BuiltinFnTy) {
6810 if (FD->getName() ==
"__builtin_amdgcn_is_invocable") {
6824 for (
const Expr *Arg : ArgExprs)
6825 if (CheckInvalidBuiltinCountedByRef(Arg,
6832 if (!ArgExprs.empty()) {
6834 Diag(Fn->getBeginLoc(), diag::err_pseudo_dtor_call_with_args)
6837 ArgExprs.back()->getEndLoc()));
6843 if (Fn->getType() ==
Context.PseudoObjectTy) {
6860 *
this, dyn_cast<UnresolvedMemberExpr>(Fn->IgnoreParens()),
6868 Diag(LParenLoc, diag::err_typecheck_call_not_function)
6869 << Fn->getType() << Fn->getSourceRange());
6877 if (Fn->getType()->isRecordType())
6881 if (Fn->getType() ==
Context.UnknownAnyTy) {
6887 if (Fn->getType() ==
Context.BoundMemberTy) {
6889 RParenLoc, ExecConfig, IsExecConfig,
6895 if (Fn->getType() ==
Context.OverloadTy) {
6906 Scope, Fn, ULE, LParenLoc, ArgExprs, RParenLoc, ExecConfig,
6909 RParenLoc, ExecConfig, IsExecConfig,
6915 if (Fn->getType() ==
Context.UnknownAnyTy) {
6921 Expr *NakedFn = Fn->IgnoreParens();
6923 bool CallingNDeclIndirectly =
false;
6925 if (
UnaryOperator *UnOp = dyn_cast<UnaryOperator>(NakedFn)) {
6926 if (UnOp->getOpcode() == UO_AddrOf) {
6927 CallingNDeclIndirectly =
true;
6932 if (
auto *DRE = dyn_cast<DeclRefExpr>(NakedFn)) {
6933 NDecl = DRE->getDecl();
6937 const llvm::Triple &Triple =
Context.getTargetInfo().getTriple();
6938 if (Triple.isSPIRV() && Triple.getVendor() == llvm::Triple::AMD) {
6955 Fn->getValueKind(), FDecl,
nullptr, DRE->isNonOdrUse());
6958 }
else if (
auto *ME = dyn_cast<MemberExpr>(NakedFn))
6959 NDecl = ME->getMemberDecl();
6961 if (
FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(NDecl)) {
6963 FD,
true, Fn->getBeginLoc()))
6975 for (
unsigned Idx = 0; Idx < ArgExprs.size() && Idx < FD->param_size();
6978 if (!ArgExprs[Idx] || !Param || !Param->getType()->isPointerType() ||
6979 !ArgExprs[Idx]->getType()->isPointerType())
6983 auto ArgTy = ArgExprs[Idx]->getType();
6984 auto ArgPtTy = ArgTy->getPointeeType();
6985 auto ArgAS = ArgPtTy.getAddressSpace();
6988 bool NeedImplicitASC =
6993 if (!NeedImplicitASC)
6997 if (ArgExprs[Idx]->isGLValue()) {
7001 ArgExprs[Idx] = Res.
get();
7005 Qualifiers ArgPtQuals = ArgPtTy.getQualifiers();
7008 Context.getQualifiedType(ArgPtTy.getUnqualifiedType(), ArgPtQuals);
7011 ArgTy.getQualifiers());
7015 CK_AddressSpaceConversion)
7021 if (
Context.isDependenceAllowed() &&
7024 assert((Fn->containsErrors() ||
7025 llvm::any_of(ArgExprs,
7026 [](
clang::Expr *E) { return E->containsErrors(); })) &&
7027 "should only occur in error-recovery path.");
7032 ExecConfig, IsExecConfig);
7037 std::string Name =
Context.BuiltinInfo.getName(Id);
7043 assert(BuiltInDecl &&
"failed to find builtin declaration");
7047 assert(DeclRef.
isUsable() &&
"Builtin reference cannot fail");
7052 assert(!
Call.isInvalid() &&
"Call to builtin cannot fail!");
7072 Diag(BuiltinLoc, diag::err_invalid_astype_of_different_size)
7090 FunctionDecl *FDecl = dyn_cast_or_null<FunctionDecl>(NDecl);
7091 unsigned BuiltinID = (FDecl ? FDecl->
getBuiltinID() : 0);
7094 switch (BuiltinID) {
7095 case Builtin::BI__builtin_longjmp:
7096 case Builtin::BI__builtin_setjmp:
7097 case Builtin::BI__sigsetjmp:
7098 case Builtin::BI_longjmp:
7099 case Builtin::BI_setjmp:
7100 case Builtin::BIlongjmp:
7101 case Builtin::BIsetjmp:
7102 case Builtin::BIsiglongjmp:
7103 case Builtin::BIsigsetjmp:
7116 if (DeferParent->
Contains(*CurScope) &&
7118 Diag(Fn->getExprLoc(), diag::err_defer_invalid_sjlj) << FDecl;
7123 if (FDecl->
hasAttr<AnyX86InterruptAttr>()) {
7124 Diag(Fn->getExprLoc(), diag::err_anyx86_interrupt_called);
7127 if (FDecl->
hasAttr<ARMInterruptAttr>()) {
7128 Diag(Fn->getExprLoc(), diag::err_arm_interrupt_called);
7137 if (Caller->hasAttr<AnyX86InterruptAttr>() ||
7138 Caller->hasAttr<AnyX86NoCallerSavedRegistersAttr>()) {
7140 bool HasNonGPRRegisters =
7142 if (HasNonGPRRegisters &&
7143 (!FDecl || !FDecl->
hasAttr<AnyX86NoCallerSavedRegistersAttr>())) {
7144 Diag(Fn->getExprLoc(), diag::warn_anyx86_excessive_regsave)
7145 << (Caller->hasAttr<AnyX86InterruptAttr>() ? 0 : 1);
7164 Fn->getType()->isSpecificBuiltinType(BuiltinType::BuiltinFn)) {
7180 if (!BuiltinID || !
Context.BuiltinInfo.hasCustomTypechecking(BuiltinID)) {
7187 return ExprError(
Diag(LParenLoc, diag::err_typecheck_call_not_function)
7188 << Fn->getType() << Fn->getSourceRange());
7194 if (Fn->getType() ==
Context.UnknownAnyTy) {
7202 return ExprError(
Diag(LParenLoc, diag::err_typecheck_call_not_function)
7203 << Fn->getType() << Fn->getSourceRange());
7210 const auto *Proto = dyn_cast_or_null<FunctionProtoType>(FuncT);
7211 unsigned NumParams = Proto ? Proto->getNumParams() : 0;
7215 assert(UsesADL == ADLCallKind::NotADL &&
7216 "CUDAKernelCallExpr should not use ADL");
7227 if (BuiltinID &&
Context.BuiltinInfo.hasCustomTypechecking(BuiltinID)) {
7240 ExprResult E = CheckBuiltinFunctionCall(FDecl, BuiltinID, TheCall);
7249 if (FDecl && !FDecl->
hasAttr<CUDAGlobalAttr>())
7250 return ExprError(
Diag(LParenLoc,diag::err_kern_call_not_global_function)
7251 << FDecl << Fn->getSourceRange());
7257 return ExprError(
Diag(LParenLoc, diag::err_kern_type_not_void_return)
7258 << Fn->getType() << Fn->getSourceRange());
7261 if (FDecl && FDecl->
hasAttr<CUDAGlobalAttr>())
7262 return ExprError(
Diag(LParenLoc, diag::err_global_call_not_config)
7263 << FDecl << Fn->getSourceRange());
7277 if (
Context.getTargetInfo().getTriple().isWasm()) {
7278 for (
const Expr *Arg : Args) {
7279 if (Arg && Arg->getType()->isWebAssemblyTableType()) {
7281 diag::err_wasm_table_as_function_parameter));
7299 if (!Proto || !(Proto->isVariadic() && Args.size() >= Def->
param_size()))
7300 Diag(RParenLoc, diag::warn_call_wrong_number_of_arguments)
7301 << (Args.size() > Def->
param_size()) << FDecl << Fn->getSourceRange();
7320 if (!Proto && !Args.empty() &&
7322 !
Diags.isIgnored(diag::warn_strict_uses_without_prototype,
7324 Diag(LParenLoc, diag::warn_strict_uses_without_prototype)
7325 << (FDecl !=
nullptr) << FDecl;
7328 for (
unsigned i = 0, e = Args.size(); i != e; i++) {
7329 Expr *Arg = Args[i];
7331 if (Proto && i < Proto->getNumParams()) {
7333 Context, Proto->getParamType(i), Proto->isParamConsumed(i));
7351 diag::err_call_incomplete_argument, Arg))
7360 if (
Method->isImplicitObjectMemberFunction())
7361 return ExprError(
Diag(LParenLoc, diag::err_member_call_without_object)
7362 << Fn->getSourceRange() << 0);
7370 for (
unsigned i = 0, e = Args.size(); i != e; i++) {
7371 if (
const auto *RT =
7372 dyn_cast<RecordType>(Args[i]->
getType().getCanonicalType())) {
7373 if (RT->getDecl()->isOrContainsUnion())
7374 Diag(Args[i]->getBeginLoc(), diag::warn_cmse_nonsecure_union)
7385 checkFortifiedBuiltinMemoryFunction(FDecl, TheCall);
7388 return CheckBuiltinFunctionCall(FDecl, BuiltinID, TheCall);
7390 if (CheckPointerCall(NDecl, TheCall, Proto))
7393 if (CheckOtherCall(TheCall, Proto))
7403 assert(Ty &&
"ActOnCompoundLiteral(): missing type");
7404 assert(InitExpr &&
"ActOnCompoundLiteral(): missing expression");
7409 TInfo =
Context.getTrivialTypeSourceInfo(literalType);
7421 LParenLoc,
Context.getBaseElementType(literalType),
7422 diag::err_array_incomplete_or_sizeless_type,
7445 ? diag::err_variable_object_no_init
7446 : diag::err_compound_literal_with_vla_type;
7453 diag::err_typecheck_decl_incomplete_type,
7468 LiteralExpr =
Result.get();
7475 bool IsFileScope = !
CurContext->isFunctionOrMethod() &&
7506 if (
auto ILE = dyn_cast<InitListExpr>(LiteralExpr))
7507 for (
unsigned i = 0, j = ILE->getNumInits(); i != j; i++) {
7509 if (!
Init->isTypeDependent() && !
Init->isValueDependent() &&
7511 Diag(
Init->getExprLoc(), diag::err_init_element_not_constant)
7512 <<
Init->getSourceBitField();
7520 LiteralExpr, IsFileScope);
7532 Diag(LParenLoc, diag::err_compound_literal_with_address_space)
7550 Cleanup.setExprNeedsCleanups(
true);
7569 bool DiagnosedArrayDesignator =
false;
7570 bool DiagnosedNestedDesignator =
false;
7571 bool DiagnosedMixedDesignator =
false;
7575 for (
unsigned I = 0, E = InitArgList.size(); I != E; ++I) {
7576 if (
auto *DIE = dyn_cast<DesignatedInitExpr>(InitArgList[I])) {
7578 FirstDesignator = DIE->getBeginLoc();
7583 if (!DiagnosedNestedDesignator && DIE->size() > 1) {
7584 DiagnosedNestedDesignator =
true;
7585 Diag(DIE->getBeginLoc(), diag::ext_designated_init_nested)
7586 << DIE->getDesignatorsSourceRange();
7589 for (
auto &Desig : DIE->designators()) {
7590 if (!Desig.isFieldDesignator() && !DiagnosedArrayDesignator) {
7591 DiagnosedArrayDesignator =
true;
7592 Diag(Desig.getBeginLoc(), diag::ext_designated_init_array)
7593 << Desig.getSourceRange();
7597 if (!DiagnosedMixedDesignator &&
7599 DiagnosedMixedDesignator =
true;
7600 Diag(DIE->getBeginLoc(), diag::ext_designated_init_mixed)
7601 << DIE->getSourceRange();
7602 Diag(InitArgList[0]->getBeginLoc(), diag::note_designated_init_mixed)
7603 << InitArgList[0]->getSourceRange();
7607 DiagnosedMixedDesignator =
true;
7609 Diag(DIE->getBeginLoc(), diag::ext_designated_init_mixed)
7610 << DIE->getSourceRange();
7611 Diag(InitArgList[I]->getBeginLoc(), diag::note_designated_init_mixed)
7612 << InitArgList[I]->getSourceRange();
7616 if (FirstDesignator.
isValid()) {
7620 !DiagnosedNestedDesignator && !DiagnosedMixedDesignator) {
7622 ? diag::warn_cxx17_compat_designated_init
7623 : diag::ext_cxx_designated_init);
7625 Diag(FirstDesignator, diag::ext_designated_init);
7629 return BuildInitList(LBraceLoc, InitArgList, RBraceLoc,
true);
7640 for (
unsigned I = 0, E = InitArgList.size(); I != E; ++I) {
7641 if (InitArgList[I]->
getType()->isNonOverloadPlaceholderType()) {
7648 InitArgList[I] = result.
get();
7668 Cleanup.setExprNeedsCleanups(
true);
7677 if (
Context.hasSameUnqualifiedType(SrcTy, DestTy))
7682 llvm_unreachable(
"member pointer type in C");
7691 if (SrcAS != DestAS)
7692 return CK_AddressSpaceConversion;
7693 if (
Context.hasCvrSimilarType(SrcTy, DestTy))
7699 ? CK_BitCast : CK_AnyPointerToBlockPointerCast);
7704 return CK_CPointerToObjCPointerCast;
7706 return CK_BlockPointerToObjCPointerCast;
7708 return CK_PointerToBoolean;
7710 return CK_PointerToIntegral;
7716 llvm_unreachable(
"illegal cast from pointer");
7718 llvm_unreachable(
"Should have returned before this");
7723 return CK_FixedPointCast;
7725 return CK_FixedPointToBoolean;
7727 return CK_FixedPointToIntegral;
7729 return CK_FixedPointToFloating;
7733 diag::err_unimplemented_conversion_with_fixed_point_type)
7735 return CK_IntegralCast;
7740 llvm_unreachable(
"illegal cast to pointer type");
7742 llvm_unreachable(
"Should have returned before this");
7752 return CK_NullToPointer;
7753 return CK_IntegralToPointer;
7755 return CK_IntegralToBoolean;
7757 return CK_IntegralCast;
7759 return CK_IntegralToFloating;
7764 return CK_IntegralRealToComplex;
7768 CK_IntegralToFloating);
7769 return CK_FloatingRealToComplex;
7771 llvm_unreachable(
"member pointer type in C");
7773 return CK_IntegralToFixedPoint;
7775 llvm_unreachable(
"Should have returned before this");
7780 return CK_FloatingCast;
7782 return CK_FloatingToBoolean;
7784 return CK_FloatingToIntegral;
7789 return CK_FloatingRealToComplex;
7793 CK_FloatingToIntegral);
7794 return CK_IntegralRealToComplex;
7798 llvm_unreachable(
"valid float->pointer cast?");
7800 llvm_unreachable(
"member pointer type in C");
7802 return CK_FloatingToFixedPoint;
7804 llvm_unreachable(
"Should have returned before this");
7809 return CK_FloatingComplexCast;
7811 return CK_FloatingComplexToIntegralComplex;
7814 if (
Context.hasSameType(ET, DestTy))
7815 return CK_FloatingComplexToReal;
7817 return CK_FloatingCast;
7820 return CK_FloatingComplexToBoolean;
7824 CK_FloatingComplexToReal);
7825 return CK_FloatingToIntegral;
7829 llvm_unreachable(
"valid complex float->pointer cast?");
7831 llvm_unreachable(
"member pointer type in C");
7834 diag::err_unimplemented_conversion_with_fixed_point_type)
7836 return CK_IntegralCast;
7838 llvm_unreachable(
"Should have returned before this");
7843 return CK_IntegralComplexToFloatingComplex;
7845 return CK_IntegralComplexCast;
7848 if (
Context.hasSameType(ET, DestTy))
7849 return CK_IntegralComplexToReal;
7851 return CK_IntegralCast;
7854 return CK_IntegralComplexToBoolean;
7858 CK_IntegralComplexToReal);
7859 return CK_IntegralToFloating;
7863 llvm_unreachable(
"valid complex int->pointer cast?");
7865 llvm_unreachable(
"member pointer type in C");
7868 diag::err_unimplemented_conversion_with_fixed_point_type)
7870 return CK_IntegralCast;
7872 llvm_unreachable(
"Should have returned before this");
7875 llvm_unreachable(
"Unhandled scalar cast");
7882 len = vecType->getNumElements();
7883 eltType = vecType->getElementType();
7890 if (!
type->isRealType())
return false;
7900 auto ValidScalableConversion = [](
QualType FirstType,
QualType SecondType) {
7904 const auto *VecTy = SecondType->getAs<
VectorType>();
7908 return ValidScalableConversion(srcTy, destTy) ||
7909 ValidScalableConversion(destTy, srcTy);
7919 return matSrcType->
getNumRows() == matDestType->getNumRows() &&
7920 matSrcType->
getNumColumns() == matDestType->getNumColumns();
7926 uint64_t SrcLen, DestLen;
7936 uint64_t SrcEltSize =
Context.getTypeSize(SrcEltTy);
7937 uint64_t DestEltSize =
Context.getTypeSize(DestEltTy);
7939 return (SrcLen * SrcEltSize == DestLen * DestEltSize);
7944 "expected at least one type to be a vector here");
7946 bool IsSrcTyAltivec =
7962 return (IsSrcTyAltivec || IsDestTyAltivec);
7982 switch (
Context.getLangOpts().getLaxVectorConversions()) {
7989 if (!Vec || !Vec->getElementType()->isIntegralOrEnumerationType())
7994 if (!Vec || !Vec->getElementType()->isIntegralOrEnumerationType())
8011 return Diag(R.getBegin(), diag::err_invalid_conversion_between_matrixes)
8012 << DestTy << SrcTy << R;
8015 return Diag(R.getBegin(),
8016 diag::err_invalid_conversion_between_matrix_and_type)
8017 << SrcTy << DestTy << R;
8019 return Diag(R.getBegin(),
8020 diag::err_invalid_conversion_between_matrix_and_type)
8021 << DestTy << SrcTy << R;
8024 Kind = CK_MatrixCast;
8030 assert(VectorTy->
isVectorType() &&
"Not a vector type!");
8034 return Diag(R.getBegin(),
8036 diag::err_invalid_conversion_between_vectors :
8037 diag::err_invalid_conversion_between_vector_and_integer)
8038 << VectorTy << Ty << R;
8040 return Diag(R.getBegin(),
8041 diag::err_invalid_conversion_between_vector_and_scalar)
8042 << VectorTy << Ty << R;
8051 if (DestElemTy == SplattedExpr->
getType())
8052 return SplattedExpr;
8065 CK_BooleanToSignedIntegral);
8066 SplattedExpr = CastExprRes.
get();
8067 CK = CK_IntegralToFloating;
8069 CK = CK_BooleanToSignedIntegral;
8076 SplattedExpr = CastExprRes.
get();
8084 if (DestElemTy == SplattedExpr->
getType())
8085 return SplattedExpr;
8094 SplattedExpr = CastExprRes.
get();
8112 !
Context.hasSameUnqualifiedType(DestTy, SrcTy) &&
8113 !
Context.areCompatibleVectorTypes(DestTy, SrcTy))) {
8114 Diag(R.getBegin(),diag::err_invalid_conversion_between_ext_vectors)
8115 << DestTy << SrcTy << R;
8126 return Diag(R.getBegin(),
8127 diag::err_invalid_conversion_between_vector_and_scalar)
8128 << DestTy << SrcTy << R;
8130 Kind = CK_VectorSplat;
8140 DestType == SourceType)
8148 if (!CE->getCalleeAllocSizeAttr())
8150 std::optional<llvm::APInt> AllocSize =
8151 CE->evaluateBytesReturnedByAllocSizeCall(S.
Context);
8154 if (!AllocSize || AllocSize->isZero())
8164 if (LhsSize && Size < LhsSize)
8166 << Size.getQuantity() << TargetType << LhsSize->getQuantity();
8174 "ActOnCastExpr(): missing type or expr");
8190 bool isVectorLiteral =
false;
8205 isVectorLiteral =
true;
8208 isVectorLiteral =
true;
8213 if (isVectorLiteral)
8243 "Expected paren or paren list expression");
8250 LiteralLParenLoc = PE->getLParenLoc();
8251 LiteralRParenLoc = PE->getRParenLoc();
8252 exprs = PE->getExprs();
8253 numExprs = PE->getNumExprs();
8280 if (numExprs == 1) {
8283 if (Literal.isInvalid())
8289 else if (numExprs < numElems) {
8291 diag::err_incorrect_number_of_vector_initializers);
8295 initExprs.append(exprs, exprs + numExprs);
8304 Diag(exprs[0]->getBeginLoc(), diag::err_typecheck_convert_incompatible)
8311 if (Literal.isInvalid())
8318 initExprs.append(exprs, exprs + numExprs);
8324 LiteralRParenLoc,
false);
8353 unsigned NumUserSpecifiedExprs,
8358 InitLoc, LParenLoc, RParenLoc);
8363 const Expr *NullExpr = LHSExpr;
8364 const Expr *NonPointerExpr = RHSExpr;
8371 NonPointerExpr = LHSExpr;
8393 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands_null)
8394 << NonPointerExpr->
getType() << DiagType
8406 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_nonfloat)
8407 << CondTy <<
Cond->getSourceRange();
8414 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_scalar)
8415 << CondTy <<
Cond->getSourceRange();
8448 bool IsBlockPointer =
false;
8452 IsBlockPointer =
true;
8477 ResultAddrSpace = LAddrSpace;
8479 ResultAddrSpace = RAddrSpace;
8481 S.
Diag(Loc, diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
8488 auto LHSCastKind = CK_BitCast, RHSCastKind = CK_BitCast;
8493 S.
Diag(Loc, diag::err_typecheck_cond_incompatible_ptrauth)
8510 LAddrSpace == ResultAddrSpace ? CK_BitCast : CK_AddressSpaceConversion;
8512 RAddrSpace == ResultAddrSpace ? CK_BitCast : CK_AddressSpaceConversion;
8520 lhptee, rhptee,
false,
false,
8523 if (CompositeTy.
isNull()) {
8540 S.
Diag(Loc, diag::ext_typecheck_cond_incompatible_pointers)
8551 QualType ResultTy = [&, ResultAddrSpace]() {
8586 S.
Diag(Loc, diag::err_typecheck_cond_incompatible_operands)
8639 bool IsIntFirstExpr) {
8641 !Int.get()->getType()->isIntegerType())
8644 Expr *Expr1 = IsIntFirstExpr ? Int.get() : PointerExpr;
8645 Expr *Expr2 = IsIntFirstExpr ? PointerExpr : Int.get();
8647 S.
Diag(Loc, diag::ext_typecheck_cond_pointer_integer_mismatch)
8651 CK_IntegralToPointer);
8685 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_int_float)
8691 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_int_float)
8697 if (LHSType == RHSType)
8707 (S, LHS, RHS, LHSType, RHSType,
false);
8741 llvm::raw_svector_ostream OS(Str);
8742 OS <<
"(vector of " << NumElements <<
" '" << EleTyName <<
"' values)";
8743 S.
Diag(QuestionLoc, diag::err_conditional_vector_element_size)
8744 << CondTy << OS.str();
8765 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_nonfloat)
8766 <<
Cond->getType() <<
Cond->getSourceRange();
8783 S.
Diag(QuestionLoc, diag::err_conditional_vector_size)
8784 << CondTy << VecResTy;
8789 QualType RVE = RV->getElementType();
8794 S.
Diag(QuestionLoc, diag::err_conditional_vector_element_size)
8795 << CondTy << VecResTy;
8810 if (
Cond.isInvalid())
8821 bool IsBoolVecLang =
8850 if (
const CallExpr *CE = dyn_cast<CallExpr>(E)) {
8851 QualType Ty = CE->getCallee()->getType();
8883 if (
Context.isDependenceAllowed() &&
8889 "should only occur in error-recovery path.");
8896 Cond.get()->getType()->isExtVectorType())
8901 if (
Cond.isInvalid())
8924 Diag(QuestionLoc, diag::err_wasm_table_conditional_expression)
8933 diag::err_typecheck_cond_incompatible_operands) << LHSTy << RHSTy
8952 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands)
8968 Context.hasSameUnqualifiedType(LHSTy, RHSTy))
9008 if (!compositeType.
isNull())
9009 return compositeType;
9039 if (
Context.hasSameType(LHSTy, RHSTy))
9040 return Context.getCommonSugaredType(LHSTy, RHSTy);
9043 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands)
9062 Self.Diag(Loc,
Note) << ParenRange;
9082 const Expr **RHSExprs) {
9087 if (
const auto *MTE = dyn_cast<MaterializeTemporaryExpr>(E)) {
9088 E = MTE->getSubExpr();
9093 if (
const auto *OP = dyn_cast<BinaryOperator>(E);
9095 *Opcode = OP->getOpcode();
9096 *RHSExprs = OP->getRHS();
9101 if (
const auto *
Call = dyn_cast<CXXOperatorCallExpr>(E)) {
9102 if (
Call->getNumArgs() != 2)
9108 if (OO < OO_Plus || OO > OO_Arrow ||
9109 OO == OO_PlusPlus || OO == OO_MinusMinus)
9115 *RHSExprs =
Call->getArg(1);
9131 if (
const auto *OP = dyn_cast<BinaryOperator>(E))
9132 return OP->isComparisonOp() || OP->isLogicalOp();
9133 if (
const auto *OP = dyn_cast<UnaryOperator>(E))
9134 return OP->getOpcode() == UO_LNot;
9149 const Expr *RHSExpr) {
9151 const Expr *CondRHS;
9162 ? diag::warn_precedence_bitwise_conditional
9163 : diag::warn_precedence_conditional;
9165 Self.Diag(OpLoc, DiagID)
9171 Self.PDiag(diag::note_precedence_silence)
9176 Self.PDiag(diag::note_precedence_conditional_first),
9187 auto GetNullability = [](
QualType Ty) {
9198 auto LHSKind = GetNullability(LHSTy), RHSKind = GetNullability(RHSTy);
9206 MergedKind = RHSKind;
9213 MergedKind = RHSKind;
9215 MergedKind = LHSKind;
9221 if (GetNullability(ResTy) == MergedKind)
9239 Expr *commonExpr =
nullptr;
9241 commonExpr = CondExpr;
9248 commonExpr = result.
get();
9262 commonExpr = commonRes.
get();
9272 commonExpr = MatExpr.
get();
9280 LHSExpr = CondExpr = opaqueValue;
9288 VK, OK, QuestionLoc);
9289 if (result.
isNull() ||
Cond.isInvalid() || LHS.isInvalid() ||
9296 CheckBoolLikeConversion(
Cond.get(), QuestionLoc);
9304 RHS.get(), result,
VK, OK);
9307 commonExpr, opaqueValue,
Cond.get(), LHS.get(), RHS.get(), QuestionLoc,
9308 ColonLoc, result,
VK, OK);
9312 unsigned FromAttributes = 0, ToAttributes = 0;
9313 if (
const auto *FromFn =
9314 dyn_cast<FunctionProtoType>(
Context.getCanonicalType(FromType)))
9317 if (
const auto *ToFn =
9318 dyn_cast<FunctionProtoType>(
Context.getCanonicalType(ToType)))
9322 return FromAttributes != ToAttributes;
9334 assert(LHSType.
isCanonical() &&
"LHS not canonicalized!");
9335 assert(RHSType.
isCanonical() &&
"RHS not canonicalized!");
9338 const Type *lhptee, *rhptee;
9340 std::tie(lhptee, lhq) =
9342 std::tie(rhptee, rhq) =
9413 diag::warn_typecheck_convert_incompatible_function_pointer_strict,
9437 ltrans = LUnderlying;
9438 rtrans = RUnderlying;
9456 if (ltrans == rtrans) {
9472 std::tie(lhptee, lhq) =
9474 std::tie(rhptee, rhq) =
9486 return AssignConvertType::
9487 IncompatibleNestedPointerAddressSpaceMismatch;
9491 if (lhptee == rhptee)
9511 const auto *LFPT = dyn_cast<FunctionProtoType>(LFT);
9512 const auto *RFPT = dyn_cast<FunctionProtoType>(RFT);
9515 LFPT->getParamTypes(),
9516 RFPT->getExtProtoInfo());
9521 LFPT->getParamTypes(), EPI);
9526 EPI.
ExtInfo = LFT->getExtInfo();
9528 RFPT->getParamTypes(), EPI);
9547 assert(LHSType.
isCanonical() &&
"LHS not canonicalized!");
9548 assert(RHSType.
isCanonical() &&
"RHS not canonicalized!");
9569 if (LQuals != RQuals)
9598 assert(LHSType.
isCanonical() &&
"LHS was not canonicalized!");
9599 assert(RHSType.
isCanonical() &&
"RHS was not canonicalized!");
9647 return VT->getElementType().getCanonicalType() == ElementType;
9677 LHSType =
Context.getCanonicalType(LHSType).getUnqualifiedType();
9678 RHSType =
Context.getCanonicalType(RHSType).getUnqualifiedType();
9681 if (LHSType == RHSType) {
9688 if (
const auto *AT = dyn_cast<AutoType>(LHSType)) {
9689 if (AT->isGNUAutoType()) {
9695 auto OBTResult =
Context.checkOBTAssignmentCompatibility(LHSType, RHSType);
9696 switch (OBTResult) {
9701 Kind = LHSType->
isBooleanType() ? CK_IntegralToBoolean : CK_IntegralCast;
9714 !
Context.areCompatibleOverflowBehaviorTypes(LHSPointee, RHSPointee)) {
9722 if (
const AtomicType *AtomicTy = dyn_cast<AtomicType>(LHSType)) {
9727 if (Kind != CK_NoOp && ConvertRHS)
9729 Kind = CK_NonAtomicToAtomic;
9741 if (
Context.typesAreCompatible(LHSTypeRef->getPointeeType(), RHSType)) {
9742 Kind = CK_LValueBitCast;
9753 if (LHSExtType->getNumElements() != RHSExtType->getNumElements())
9757 RHSExtType->getElementType()->isIntegerType()) {
9758 Kind = CK_IntegralToBoolean;
9762 if (
Context.getLangOpts().OpenCL &&
9763 Context.areCompatibleVectorTypes(LHSType, RHSType)) {
9773 Kind = CK_VectorSplat;
9783 if (
Context.areCompatibleVectorTypes(LHSType, RHSType)) {
9795 if (
Context.getTargetInfo().getTriple().isPPC() &&
9797 !
Context.areCompatibleVectorTypes(RHSType, LHSType))
9799 << RHSType << LHSType;
9813 if (
Context.getTargetInfo().getTriple().isPPC() &&
9818 << RHSType << LHSType;
9829 if (
ARM().areCompatibleSveTypes(LHSType, RHSType) ||
9830 ARM().areLaxCompatibleSveTypes(LHSType, RHSType)) {
9838 if (
Context.areCompatibleRVVTypes(LHSType, RHSType) ||
9839 Context.areLaxCompatibleRVVTypes(LHSType, RHSType)) {
9868 if (
const PointerType *LHSPointer = dyn_cast<PointerType>(LHSType)) {
9871 LangAS AddrSpaceL = LHSPointer->getPointeeType().getAddressSpace();
9873 if (AddrSpaceL != AddrSpaceR)
9874 Kind = CK_AddressSpaceConversion;
9875 else if (
Context.hasCvrSimilarType(RHSType, LHSType))
9885 Kind = CK_IntegralToPointer;
9893 if (LHSPointer->getPointeeType()->isVoidType()) {
9901 Context.getObjCClassRedefinitionType())) {
9912 if (LHSPointer->getPointeeType()->isVoidType()) {
9913 LangAS AddrSpaceL = LHSPointer->getPointeeType().getAddressSpace();
9918 AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion : CK_BitCast;
9936 Kind = AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion : CK_BitCast;
9942 Kind = CK_IntegralToPointer;
9948 Kind = CK_AnyPointerToBlockPointerCast;
9954 if (RHSPT->getPointeeType()->isVoidType()) {
9955 Kind = CK_AnyPointerToBlockPointerCast;
9969 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
9971 !
ObjC().CheckObjCARCUnavailableWeakConversion(OrigLHSType, RHSType))
9978 Kind = CK_IntegralToPointer;
9985 Kind = CK_CPointerToObjCPointerCast;
9995 Context.getObjCClassRedefinitionType())) {
10007 Kind = CK_BlockPointerToObjCPointerCast;
10019 Kind = CK_NullToPointer;
10026 if (LHSType ==
Context.BoolTy) {
10027 Kind = CK_PointerToBoolean;
10033 Kind = CK_PointerToIntegral;
10043 if (LHSType ==
Context.BoolTy) {
10044 Kind = CK_PointerToBoolean;
10050 Kind = CK_PointerToIntegral;
10059 if (
Context.typesAreCompatible(LHSType, RHSType)) {
10066 Kind = CK_IntToOCLSampler;
10100 const RecordType *UT =
ArgType->getAsUnionType();
10105 if (!UD->
hasAttr<TransparentUnionAttr>())
10111 for (
auto *it : UD->
fields()) {
10112 if (it->getType()->isPointerType()) {
10151 bool DiagnoseCFAudited,
10155 assert((ConvertRHS || !
Diagnose) &&
"can't indicate whether we diagnosed");
10161 ExprResult &RHS = ConvertRHS ? CallerRHS : LocalRHS;
10165 if (RHSPtrType->getPointeeType()->hasAttr(attr::NoDeref) &&
10166 !LHSPtrType->getPointeeType()->hasAttr(attr::NoDeref)) {
10168 diag::warn_noderef_to_dereferenceable_pointer)
10187 AllowedExplicit::None,
10199 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
10200 !
ObjC().CheckObjCARCUnavailableWeakConversion(LHSType, RHSType))
10222 RHS.
get(), LHSType,
false, DAP))
10231 if (!
Context.hasSameUnqualifiedType(RHSType, LHSType)) {
10359 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
10369 ObjC().CheckConversionToObjCLiteral(LHSType, E,
Diagnose))) {
10389struct OriginalOperand {
10390 explicit OriginalOperand(
Expr *Op) : Orig(Op), Conversion(
nullptr) {
10391 if (
auto *MTE = dyn_cast<MaterializeTemporaryExpr>(Op))
10392 Op = MTE->getSubExpr();
10393 if (
auto *BTE = dyn_cast<CXXBindTemporaryExpr>(Op))
10394 Op = BTE->getSubExpr();
10395 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(Op)) {
10396 Orig = ICE->getSubExprAsWritten();
10397 Conversion = ICE->getConversionFunction();
10401 QualType
getType()
const {
return Orig->getType(); }
10404 NamedDecl *Conversion;
10410 OriginalOperand OrigLHS(LHS.
get()), OrigRHS(RHS.
get());
10412 Diag(Loc, diag::err_typecheck_invalid_operands)
10413 << OrigLHS.getType() << OrigRHS.getType()
10418 if (OrigLHS.Conversion) {
10419 Diag(OrigLHS.Conversion->getLocation(),
10420 diag::note_typecheck_invalid_operands_converted)
10423 if (OrigRHS.Conversion) {
10425 diag::note_typecheck_invalid_operands_converted)
10440 if (!(LHSNatVec && RHSNatVec)) {
10442 Expr *NonVector = !LHSNatVec ? LHS.
get() : RHS.
get();
10443 Diag(Loc, diag::err_typecheck_logical_vector_expr_gnu_cpp_restrict)
10445 <<
Vector->getSourceRange();
10449 Diag(Loc, diag::err_typecheck_logical_vector_expr_gnu_cpp_restrict)
10472 unsigned &DiagID) {
10478 scalarCast = CK_IntegralToBoolean;
10483 DiagID = diag::err_opencl_scalar_type_rank_greater_than_vector_type;
10488 scalarCast = CK_IntegralCast;
10493 DiagID = diag::err_opencl_scalar_type_rank_greater_than_vector_type;
10496 scalarCast = CK_FloatingCast;
10499 scalarCast = CK_IntegralToFloating;
10508 if (scalarCast != CK_NoOp)
10519 assert(VecTy &&
"Expression E must be a vector");
10524 VecTy->getVectorKind());
10528 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(E))
10529 if (ICE->getSubExpr()->getType() == NewVecTy)
10530 return ICE->getSubExpr();
10532 auto Cast = ElementType->
isIntegerType() ? CK_IntegralCast : CK_FloatingCast;
10540 Expr *E = Int->get();
10544 QualType IntTy = Int->get()->getType().getUnqualifiedType();
10550 bool CstInt = Int->get()->EvaluateAsInt(EVResult, S.
Context);
10559 unsigned NumBits = IntSigned
10561 :
Result.getActiveBits())
10562 :
Result.getActiveBits();
10569 return (IntSigned != OtherIntSigned &&
10575 return (Order < 0);
10582 if (Int->get()->containsErrors())
10585 QualType IntTy = Int->get()->getType().getUnqualifiedType();
10590 bool CstInt = Int->get()->EvaluateAsInt(EVResult, S.
Context);
10602 llvm::APFloat::rmTowardZero);
10605 bool Ignored =
false;
10606 Float.convertToInteger(ConvertBack, llvm::APFloat::rmNearestTiesToEven,
10608 if (
Result != ConvertBack)
10614 unsigned FloatPrec = llvm::APFloat::semanticsPrecision(
10616 if (Bits > FloatPrec)
10629 QualType ScalarTy = Scalar->get()->getType().getUnqualifiedType();
10630 QualType VectorTy =
Vector->get()->getType().getUnqualifiedType();
10635 "ExtVectorTypes should not be handled here!");
10636 VectorEltTy = VT->getElementType();
10641 llvm_unreachable(
"Only Fixed-Length and SVE Vector types are handled here");
10667 ScalarCast = CK_IntegralCast;
10671 ScalarCast = CK_FloatingToIntegral;
10679 llvm::APFloat
Result(0.0);
10685 bool CstScalar = Scalar->get()->isValueDependent() ||
10688 if (!CstScalar && Order < 0)
10694 bool Truncated =
false;
10696 llvm::APFloat::rmNearestTiesToEven, &Truncated);
10701 ScalarCast = CK_FloatingCast;
10706 ScalarCast = CK_IntegralToFloating;
10713 if (ScalarCast != CK_NoOp)
10721 bool AllowBothBool,
10722 bool AllowBoolConversions,
10723 bool AllowBoolOperation,
10724 bool ReportInvalid) {
10725 if (!IsCompAssign) {
10741 assert(LHSVecType || RHSVecType);
10749 (RHSVecType && RHSVecType->getElementType()->isMFloat8Type()))
10754 if (!AllowBothBool && LHSVecType &&
10760 if (!AllowBoolOperation &&
10765 if (
Context.hasSameType(LHSType, RHSType))
10766 return Context.getCommonSugaredType(LHSType, RHSType);
10769 if (LHSVecType && RHSVecType &&
10770 Context.areCompatibleVectorTypes(LHSType, RHSType)) {
10784 if (AllowBoolConversions && LHSVecType && RHSVecType &&
10787 Context.getTypeSize(RHSVecType->getElementType()))) {
10794 if (!IsCompAssign &&
10797 RHSVecType->getElementType()->isIntegerType()) {
10806 unsigned &SVEorRVV) {
10827 if (IsSveRVVConversion(LHSType, RHSType, SVEorRVV) ||
10828 IsSveRVVConversion(RHSType, LHSType, SVEorRVV)) {
10829 Diag(Loc, diag::err_typecheck_sve_rvv_ambiguous)
10830 << SVEorRVV << LHSType << RHSType;
10837 unsigned &SVEorRVV) {
10842 if (FirstVecType && SecondVecType) {
10845 SecondVecType->getVectorKind() ==
10850 SecondVecType->getVectorKind() ==
10852 SecondVecType->getVectorKind() ==
10854 SecondVecType->getVectorKind() ==
10863 if (SecondVecType &&
10876 if (IsSveRVVGnuConversion(LHSType, RHSType, SVEorRVV) ||
10877 IsSveRVVGnuConversion(RHSType, LHSType, SVEorRVV)) {
10878 Diag(Loc, diag::err_typecheck_sve_rvv_gnu_ambiguous)
10879 << SVEorRVV << LHSType << RHSType;
10885 unsigned DiagID = diag::err_typecheck_vector_not_convertable;
10900 LHSType, RHSVecType->getElementType(),
10913 QualType VecType = LHSVecType ? LHSType : RHSType;
10914 const VectorType *VT = LHSVecType ? LHSVecType : RHSVecType;
10915 QualType OtherType = LHSVecType ? RHSType : LHSType;
10916 ExprResult *OtherExpr = LHSVecType ? &RHS : &LHS;
10918 if (
Context.getTargetInfo().getTriple().isPPC() &&
10920 !
Context.areCompatibleVectorTypes(RHSType, LHSType))
10921 Diag(Loc, diag::warn_deprecated_lax_vec_conv_all) << RHSType << LHSType;
10925 if (!IsCompAssign) {
10944 if ((!RHSVecType && !RHSType->
isRealType()) ||
10946 Diag(Loc, diag::err_typecheck_vector_not_convertable_non_scalar)
10947 << LHSType << RHSType
10959 Diag(Loc, diag::err_opencl_implicit_vector_conversion) << LHSType
10970 QualType Scalar = LHSVecType ? RHSType : LHSType;
10972 unsigned ScalarOrVector = LHSVecType && RHSVecType ? 1 : 0;
10974 diag::err_typecheck_vector_not_convertable_implict_truncation)
10975 << ScalarOrVector << Scalar <<
Vector;
10982 << LHSType << RHSType
10991 if (!IsCompAssign) {
11006 unsigned DiagID = diag::err_typecheck_invalid_operands;
11008 ((LHSBuiltinTy && LHSBuiltinTy->
isSVEBool()) ||
11009 (RHSBuiltinTy && RHSBuiltinTy->isSVEBool()))) {
11015 if (
Context.hasSameType(LHSType, RHSType))
11030 Diag(Loc, diag::err_typecheck_vector_not_convertable_non_scalar)
11037 Context.getBuiltinVectorTypeInfo(LHSBuiltinTy).EC !=
11038 Context.getBuiltinVectorTypeInfo(RHSBuiltinTy).EC) {
11039 Diag(Loc, diag::err_typecheck_vector_lengths_not_equal)
11048 bool ScalarOrVector =
11051 Diag(Loc, diag::err_typecheck_vector_not_convertable_implict_truncation)
11052 << ScalarOrVector << Scalar <<
Vector;
11084 S.
Diag(Loc, diag::warn_null_in_arithmetic_operation)
11096 S.
Diag(Loc, diag::warn_null_in_comparison_operation)
11097 << LHSNull << NonNullType
11109 QualType ElementType = CT->getElementType().getCanonicalType();
11110 bool IsComplexRangePromoted = S.
getLangOpts().getComplexRange() ==
11117 const llvm::fltSemantics &ElementTypeSemantics =
11119 const llvm::fltSemantics &HigherElementTypeSemantics =
11122 if ((llvm::APFloat::semanticsMaxExponent(ElementTypeSemantics) * 2 + 1 >
11123 llvm::APFloat::semanticsMaxExponent(HigherElementTypeSemantics)) ||
11130 if (
Type == HigherElementType) {
11142 const auto *LUE = dyn_cast<UnaryExprOrTypeTraitExpr>(LHS);
11143 const auto *RUE = dyn_cast<UnaryExprOrTypeTraitExpr>(RHS);
11146 if (LUE->getKind() != UETT_SizeOf || LUE->isArgumentType() ||
11147 RUE->getKind() != UETT_SizeOf)
11154 if (RUE->isArgumentType())
11155 RHSTy = RUE->getArgumentType().getNonReferenceType();
11157 RHSTy = RUE->getArgumentExpr()->IgnoreParens()->getType();
11164 if (
const auto *DRE = dyn_cast<DeclRefExpr>(LHSArg)) {
11165 if (
const ValueDecl *LHSArgDecl = DRE->getDecl())
11166 S.
Diag(LHSArgDecl->getLocation(), diag::note_pointer_declared_here)
11170 QualType ArrayElemTy = ArrayTy->getElementType();
11176 S.
Diag(Loc, diag::warn_division_sizeof_array)
11178 if (
const auto *DRE = dyn_cast<DeclRefExpr>(LHSArg)) {
11179 if (
const ValueDecl *LHSArgDecl = DRE->getDecl())
11180 S.
Diag(LHSArgDecl->getLocation(), diag::note_array_declared_here)
11184 S.
Diag(Loc, diag::note_precedence_silence) << RHS;
11197 S.
PDiag(diag::warn_remainder_division_by_zero)
11206 const Expr *LHSExpr = LHS.
get();
11207 const Expr *RHSExpr = RHS.
get();
11212 if (!LHSIsScoped && !RHSIsScoped)
11224 ->getDefinitionOrSelf()
11225 ->getIntegerType();
11226 std::string InsertionString =
"static_cast<" + IntType.getAsString() +
">(";
11227 S.
Diag(BeginLoc, diag::note_no_implicit_conversion_for_scoped_enum)
11232 DiagnosticHelper(LHSExpr, LHSType);
11235 DiagnosticHelper(RHSExpr, RHSType);
11242 bool IsCompAssign = Opc == BO_MulAssign || Opc == BO_DivAssign;
11243 bool IsDiv = Opc == BO_Div || Opc == BO_DivAssign;
11337 if (compType.
isNull() ||
11342 IsCompAssign ? BO_RemAssign : BO_Rem);
11353 ? diag::err_typecheck_pointer_arith_void_type
11354 : diag::ext_gnu_void_ptr)
11363 ? diag::err_typecheck_pointer_arith_void_type
11364 : diag::ext_gnu_void_ptr)
11365 << 0 <<
Pointer->getSourceRange();
11376 S.
Diag(Loc, diag::warn_gnu_null_ptr_arith)
11377 <<
Pointer->getSourceRange();
11379 S.
Diag(Loc, diag::warn_pointer_arith_null_ptr)
11396 S.
PDiag(diag::warn_pointer_sub_null_ptr)
11398 <<
Pointer->getSourceRange());
11407 ? diag::err_typecheck_pointer_arith_function_type
11408 : diag::ext_gnu_ptr_func_arith)
11420 assert(
Pointer->getType()->isAnyPointerType());
11422 ? diag::err_typecheck_pointer_arith_function_type
11423 : diag::ext_gnu_ptr_func_arith)
11424 << 0 <<
Pointer->getType()->getPointeeType()
11426 <<
Pointer->getSourceRange();
11434 QualType ResType = Operand->getType();
11436 ResType = ResAtomicType->getValueType();
11442 diag::err_typecheck_arithmetic_incomplete_or_sizeless_type,
11443 Operand->getSourceRange());
11456 QualType ResType = Operand->getType();
11458 ResType = ResAtomicType->getValueType();
11490 if (!isLHSPointer && !isRHSPointer)
return true;
11492 QualType LHSPointeeTy, RHSPointeeTy;
11497 if (isLHSPointer && isRHSPointer) {
11501 diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
11509 bool isLHSVoidPtr = isLHSPointer && LHSPointeeTy->
isVoidType();
11510 bool isRHSVoidPtr = isRHSPointer && RHSPointeeTy->
isVoidType();
11511 if (isLHSVoidPtr || isRHSVoidPtr) {
11519 bool isLHSFuncPtr = isLHSPointer && LHSPointeeTy->
isFunctionType();
11520 bool isRHSFuncPtr = isRHSPointer && RHSPointeeTy->
isFunctionType();
11521 if (isLHSFuncPtr || isRHSFuncPtr) {
11543 Expr* IndexExpr = RHSExpr;
11546 IndexExpr = LHSExpr;
11549 bool IsStringPlusInt = StrExpr &&
11555 Self.Diag(OpLoc, diag::warn_string_plus_int)
11559 if (IndexExpr == RHSExpr) {
11561 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence)
11566 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence);
11572 const Expr *StringRefExpr = LHSExpr;
11577 CharExpr = dyn_cast<CharacterLiteral>(LHSExpr->
IgnoreImpCasts());
11578 StringRefExpr = RHSExpr;
11581 if (!CharExpr || !StringRefExpr)
11601 Self.Diag(OpLoc, diag::warn_string_plus_char)
11602 << DiagRange << Ctx.
CharTy;
11604 Self.Diag(OpLoc, diag::warn_string_plus_char)
11605 << DiagRange << CharExpr->
getType();
11611 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence)
11616 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence);
11625 S.
Diag(Loc, diag::err_typecheck_sub_ptr_compatible)
11644 if (CompLHSTy) *CompLHSTy = compType;
11653 *CompLHSTy = compType;
11662 *CompLHSTy = compType;
11673 if (Opc == BO_Add) {
11680 if (CompLHSTy) *CompLHSTy = compType;
11694 std::swap(PExp, IExp);
11707 if (!IExp->getType()->isIntegerType())
11716 (!IExp->isValueDependent() &&
11717 (!IExp->EvaluateAsInt(KnownVal,
Context) ||
11721 Context, BO_Add, PExp, IExp);
11735 Diag(Loc, diag::err_ptrauth_indirect_goto_addrlabel_arithmetic)
11741 CheckArrayAccess(PExp, IExp);
11747 if (
Context.isPromotableIntegerType(LHSTy))
11748 LHSTy =
Context.getPromotedIntegerType(LHSTy);
11750 *CompLHSTy = LHSTy;
11771 if (CompLHSTy) *CompLHSTy = compType;
11780 *CompLHSTy = compType;
11789 *CompLHSTy = compType;
11803 if (CompLHSTy) *CompLHSTy = compType;
11820 Diag(Loc, diag::err_ptrauth_indirect_goto_addrlabel_arithmetic)
11846 CheckArrayAccess(LHS.
get(), RHS.
get(),
nullptr,
11849 if (CompLHSTy) *CompLHSTy = LHS.
get()->
getType();
11860 if (!
Context.hasSameUnqualifiedType(lpointee, rpointee)) {
11865 if (!
Context.typesAreCompatible(
11866 Context.getCanonicalType(lpointee).getUnqualifiedType(),
11867 Context.getCanonicalType(rpointee).getUnqualifiedType())) {
11893 if (ElementSize.
isZero()) {
11894 Diag(Loc,diag::warn_sub_ptr_zero_size_types)
11900 if (CompLHSTy) *CompLHSTy = LHS.
get()->
getType();
11901 return Context.getPointerDiffType();
11911 if (
const EnumType *ET = T->getAsCanonical<EnumType>())
11912 return ET->getDecl()->isScoped();
11924 if (Opc == BO_Shr &&
11933 llvm::APSInt Right = RHSResult.
Val.
getInt();
11935 if (Right.isNegative()) {
11937 S.
PDiag(diag::warn_shift_negative)
11948 LeftSize = FXSema.getWidth() - (
unsigned)FXSema.hasUnsignedPadding();
11950 if (Right.uge(LeftSize)) {
11952 S.
PDiag(diag::warn_shift_gt_typewidth)
11972 llvm::APSInt Left = LHSResult.
Val.
getInt();
11983 if (Left.isNegative()) {
11985 S.
PDiag(diag::warn_shift_lhs_negative)
11990 llvm::APInt ResultBits =
11991 static_cast<llvm::APInt &
>(Right) + Left.getSignificantBits();
11992 if (ResultBits.ule(LeftSize))
11994 llvm::APSInt
Result = Left.extend(ResultBits.getLimitedValue());
12000 Result.toString(HexResult, 16,
false,
true);
12006 if (ResultBits - 1 == LeftSize) {
12007 S.
Diag(Loc, diag::warn_shift_result_sets_sign_bit)
12008 << HexResult << LHSType
12013 S.
Diag(Loc, diag::warn_shift_result_gt_typewidth)
12014 << HexResult.str() <<
Result.getSignificantBits() << LHSType
12026 S.
Diag(Loc, diag::err_shift_rhs_only_vector)
12032 if (!IsCompAssign) {
12054 S.
Diag(Loc, diag::err_typecheck_invalid_operands)
12061 if (!LHSEleType->isIntegerType()) {
12062 S.
Diag(Loc, diag::err_typecheck_expect_int)
12067 if (!RHSEleType->isIntegerType()) {
12068 S.
Diag(Loc, diag::err_typecheck_expect_int)
12077 if (LHSEleType != RHSEleType) {
12079 LHSEleType = RHSEleType;
12085 }
else if (RHSVecTy) {
12090 S.
Diag(Loc, diag::err_typecheck_vector_lengths_not_equal)
12098 if (LHSBT != RHSBT &&
12100 S.
Diag(Loc, diag::warn_typecheck_vector_element_sizes_not_equal)
12117 bool IsCompAssign) {
12118 if (!IsCompAssign) {
12141 if ((LHSBuiltinTy && LHSBuiltinTy->
isSVEBool()) ||
12142 (RHSBuiltinTy && RHSBuiltinTy->
isSVEBool())) {
12143 S.
Diag(Loc, diag::err_typecheck_invalid_operands)
12148 if (!LHSEleType->isIntegerType()) {
12149 S.
Diag(Loc, diag::err_typecheck_expect_int)
12154 if (!RHSEleType->isIntegerType()) {
12155 S.
Diag(Loc, diag::err_typecheck_expect_int)
12163 S.
Diag(Loc, diag::err_typecheck_invalid_operands)
12173 if (LHSEleType != RHSEleType) {
12175 LHSEleType = RHSEleType;
12177 const llvm::ElementCount VecSize =
12186 S.
Diag(Loc, diag::err_typecheck_vector_lengths_not_equal)
12192 const llvm::ElementCount VecSize =
12194 if (LHSEleType != RHSEleType) {
12196 RHSEleType = LHSEleType;
12209 bool IsCompAssign) {
12243 if (IsCompAssign) LHS = OldLHS;
12271 S.
Diag(Loc, IsError ? diag::err_typecheck_comparison_of_distinct_pointers
12272 : diag::ext_typecheck_comparison_of_distinct_pointers)
12312 S.
Diag(Loc, IsError ? diag::err_typecheck_comparison_of_fptr_to_void
12313 : diag::ext_typecheck_comparison_of_fptr_to_void)
12320 case Stmt::ObjCArrayLiteralClass:
12321 case Stmt::ObjCDictionaryLiteralClass:
12322 case Stmt::ObjCStringLiteralClass:
12323 case Stmt::ObjCBoxedExprClass:
12367 QualType T = Method->parameters()[0]->getType();
12368 if (!T->isObjCObjectPointerType())
12371 QualType R = Method->getReturnType();
12372 if (!R->isScalarType())
12384 Literal = LHS.
get();
12387 Literal = RHS.
get();
12403 llvm_unreachable(
"Unknown Objective-C object literal kind");
12407 S.
Diag(Loc, diag::warn_objc_string_literal_comparison)
12408 << Literal->getSourceRange();
12410 S.
Diag(Loc, diag::warn_objc_literal_comparison)
12411 << LiteralKind << Literal->getSourceRange();
12420 S.
Diag(Loc, diag::note_objc_literal_comparison_isequal)
12433 if (!UO || UO->
getOpcode() != UO_LNot)
return;
12443 bool IsBitwiseOp = Opc == BO_And || Opc == BO_Or || Opc == BO_Xor;
12445 << Loc << IsBitwiseOp;
12472 if (
const DeclRefExpr *DR = dyn_cast<DeclRefExpr>(E)) {
12474 }
else if (
const MemberExpr *Mem = dyn_cast<MemberExpr>(E)) {
12475 if (Mem->isImplicitAccess())
12476 D = Mem->getMemberDecl();
12491 return std::nullopt;
12499 std::swap(LHS, RHS);
12503 std::swap(LHS, RHS);
12507 return std::nullopt;
12510 auto *BO = dyn_cast<BinaryOperator>(LHS);
12511 if (!BO || BO->getOpcode() != BO_Add)
12512 return std::nullopt;
12516 Other = BO->getRHS();
12518 Other = BO->getLHS();
12520 return std::nullopt;
12522 if (!
Other->getType()->isUnsignedIntegerType())
12523 return std::nullopt;
12525 return Opc == BO_GE;
12579 auto IsDeprArrayComparionIgnored =
12582 ? diag::warn_array_comparison_cxx26
12583 : !S.
getLangOpts().CPlusPlus20 || IsDeprArrayComparionIgnored
12584 ? diag::warn_array_comparison
12585 : diag::warn_depr_array_comparison;
12611 Result = AlwaysConstant;
12615 S.
PDiag(diag::warn_comparison_always)
12630 Result = AlwaysConstant;
12634 S.
PDiag(diag::warn_comparison_always)
12637 }
else if (std::optional<bool> Res =
12640 S.
PDiag(diag::warn_comparison_always)
12642 << (*Res ? AlwaysTrue : AlwaysFalse));
12653 Expr *LiteralString =
nullptr;
12654 Expr *LiteralStringStripped =
nullptr;
12658 LiteralString = LHS;
12659 LiteralStringStripped = LHSStripped;
12664 LiteralString = RHS;
12665 LiteralStringStripped = RHSStripped;
12668 if (LiteralString) {
12670 S.
PDiag(diag::warn_stringcompare)
12683 llvm_unreachable(
"unhandled cast kind");
12685 case CK_UserDefinedConversion:
12687 case CK_LValueToRValue:
12689 case CK_ArrayToPointerDecay:
12691 case CK_FunctionToPointerDecay:
12693 case CK_IntegralCast:
12695 case CK_FloatingCast:
12697 case CK_IntegralToFloating:
12698 case CK_FloatingToIntegral:
12700 case CK_IntegralComplexCast:
12701 case CK_FloatingComplexCast:
12702 case CK_FloatingComplexToIntegralComplex:
12703 case CK_IntegralComplexToFloatingComplex:
12705 case CK_FloatingComplexToReal:
12706 case CK_FloatingRealToComplex:
12707 case CK_IntegralComplexToReal:
12708 case CK_IntegralRealToComplex:
12710 case CK_HLSLArrayRValue:
12723 if (
const auto *ICE = dyn_cast<ImplicitCastExpr>(E))
12750 << 0 << FromType << ToType;
12755 llvm_unreachable(
"unhandled case in switch");
12782 if (NumEnumArgs == 1) {
12784 QualType OtherTy = LHSIsEnum ? RHSStrippedType : LHSStrippedType;
12790 if (NumEnumArgs == 2) {
12799 assert(IntType->isArithmeticType());
12809 LHSType = RHSType = IntType;
12818 if (
Type.isNull()) {
12824 std::optional<ComparisonCategoryType> CCT =
12836 assert(!
Type.isNull() &&
"composite type for <=> has not been set");
12854 if (
Type.isNull()) {
12875 int NullValue =
PP.isMacroDefined(
"NULL") ? 0 : 1;
12880 if (
const auto *
CL = dyn_cast<CharacterLiteral>(E.
get())) {
12881 if (
CL->getValue() == 0)
12885 NullValue ?
"NULL" :
"(void *)0");
12886 }
else if (
const auto *CE = dyn_cast<CStyleCastExpr>(E.
get())) {
12893 NullValue ?
"NULL" :
"(void *)0");
12903 bool IsThreeWay = Opc == BO_Cmp;
12904 bool IsOrdered = IsRelational || IsThreeWay;
12915 if (!IsThreeWay || IsAnyPointerType(LHS) || IsAnyPointerType(RHS)) {
12968 auto computeResultTy = [&]() {
12977 std::optional<ComparisonCategoryType> CCT =
12982 if (CompositeTy->
isPointerType() && LHSIsNull != RHSIsNull) {
12986 Diag(Loc, diag::err_typecheck_three_way_comparison_of_pointer_and_zero)
12987 << (LHSIsNull ? LHS.
get()->getSourceRange()
12996 if (!IsOrdered && LHSIsNull != RHSIsNull) {
12997 bool IsEquality = Opc == BO_EQ;
13009 bool IsError = Opc == BO_Cmp;
13011 IsError ? diag::err_typecheck_ordered_comparison_of_function_pointers
13013 ? diag::warn_typecheck_ordered_comparison_of_function_pointers
13014 : diag::ext_typecheck_ordered_comparison_of_function_pointers;
13043 return computeResultTy();
13059 (IsOrdered ? 2 : 1) &&
13064 return computeResultTy();
13078 if (IsRelational) {
13083 Diag(Loc, diag::ext_typecheck_compare_complete_incomplete_pointers)
13089 }
else if (!IsRelational &&
13093 && !LHSIsNull && !RHSIsNull)
13100 if (LCanPointeeTy != RCanPointeeTy) {
13106 diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
13107 << LHSType << RHSType << 0
13113 CastKind Kind = AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion
13119 bool RHSHasCFIUncheckedCallee = RFn && RFn->getCFIUncheckedCalleeAttr();
13120 bool ChangingCFIUncheckedCallee =
13121 LHSHasCFIUncheckedCallee != RHSHasCFIUncheckedCallee;
13123 if (LHSIsNull && !RHSIsNull)
13125 else if (!ChangingCFIUncheckedCallee)
13128 return computeResultTy();
13140 if (!IsOrdered && LHSIsNull && RHSIsNull) {
13143 return computeResultTy();
13147 return computeResultTy();
13158 return computeResultTy();
13162 return computeResultTy();
13171 return computeResultTy();
13176 return computeResultTy();
13180 if (IsRelational &&
13191 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
13192 if (CTSD->isInStdNamespace() &&
13193 llvm::StringSwitch<bool>(CTSD->getName())
13194 .Cases({
"less",
"less_equal",
"greater",
"greater_equal"},
true)
13200 return computeResultTy();
13213 return computeResultTy();
13223 if (!LHSIsNull && !RHSIsNull &&
13224 !
Context.typesAreCompatible(lpointee, rpointee)) {
13225 Diag(Loc, diag::err_typecheck_comparison_of_distinct_blocks)
13230 return computeResultTy();
13237 if (!LHSIsNull && !RHSIsNull) {
13242 Diag(Loc, diag::err_typecheck_comparison_of_distinct_blocks)
13246 if (LHSIsNull && !RHSIsNull)
13249 : CK_AnyPointerToBlockPointerCast);
13253 : CK_AnyPointerToBlockPointerCast);
13254 return computeResultTy();
13263 bool RPtrToVoid = RPT ? RPT->getPointeeType()->isVoidType() :
false;
13265 if (!LPtrToVoid && !RPtrToVoid &&
13266 !
Context.typesAreCompatible(LHSType, RHSType)) {
13273 if (LHSIsNull && !RHSIsNull) {
13279 RPT ? CK_BitCast :CK_CPointerToObjCPointerCast);
13289 LPT ? CK_BitCast :CK_CPointerToObjCPointerCast);
13291 return computeResultTy();
13295 if (!
Context.areComparableObjCPointerTypes(LHSType, RHSType))
13301 if (LHSIsNull && !RHSIsNull)
13305 return computeResultTy();
13311 CK_BlockPointerToObjCPointerCast);
13312 return computeResultTy();
13313 }
else if (!IsOrdered &&
13317 CK_BlockPointerToObjCPointerCast);
13318 return computeResultTy();
13323 unsigned DiagID = 0;
13324 bool isError =
false;
13333 isError ? diag::err_typecheck_ordered_comparison_of_pointer_and_zero
13334 : diag::ext_typecheck_ordered_comparison_of_pointer_and_zero;
13337 DiagID = diag::err_typecheck_comparison_of_pointer_integer;
13339 }
else if (IsOrdered)
13340 DiagID = diag::ext_typecheck_ordered_comparison_of_pointer_integer;
13342 DiagID = diag::ext_typecheck_comparison_of_pointer_integer;
13354 LHSIsNull ? CK_NullToPointer : CK_IntegralToPointer);
13357 RHSIsNull ? CK_NullToPointer : CK_IntegralToPointer);
13358 return computeResultTy();
13362 if (!IsOrdered && RHSIsNull
13365 return computeResultTy();
13367 if (!IsOrdered && LHSIsNull
13370 return computeResultTy();
13373 if (
getLangOpts().getOpenCLCompatibleVersion() >= 200) {
13375 return computeResultTy();
13379 return computeResultTy();
13382 if (LHSIsNull && RHSType->
isQueueT()) {
13384 return computeResultTy();
13387 if (LHSType->
isQueueT() && RHSIsNull) {
13389 return computeResultTy();
13414 "Unhandled vector element size in vector compare");
13434 "Unhandled vector element size in vector compare");
13444 const auto TypeSize =
Context.getTypeSize(ETy);
13446 const QualType IntTy =
Context.getIntTypeForBitwidth(TypeSize,
true);
13447 const llvm::ElementCount VecSize =
Context.getBuiltinVectorTypeInfo(VTy).EC;
13448 return Context.getScalableVectorType(IntTy, VecSize.getKnownMinValue());
13454 if (Opc == BO_Cmp) {
13455 Diag(Loc, diag::err_three_way_vector_comparison);
13484 return Context.getLogicalOperationType();
13486 Diag(Loc, diag::warn_deprecated_altivec_src_compat);
13492 return Context.getLogicalOperationType();
13516 if (Opc == BO_Cmp) {
13517 Diag(Loc, diag::err_three_way_vector_comparison);
13545 if (LHSBuiltinTy && RHSBuiltinTy && LHSBuiltinTy->
isSVEBool() &&
13546 RHSBuiltinTy->isSVEBool())
13565 bool Negative =
false;
13566 bool ExplicitPlus =
false;
13567 const auto *LHSInt = dyn_cast<IntegerLiteral>(XorLHS.
get());
13568 const auto *RHSInt = dyn_cast<IntegerLiteral>(XorRHS.
get());
13574 if (
const auto *UO = dyn_cast<UnaryOperator>(XorRHS.
get())) {
13576 if (Opc != UO_Minus && Opc != UO_Plus)
13578 RHSInt = dyn_cast<IntegerLiteral>(UO->getSubExpr());
13581 Negative = (Opc == UO_Minus);
13582 ExplicitPlus = !Negative;
13588 const llvm::APInt &LeftSideValue = LHSInt->getValue();
13589 llvm::APInt RightSideValue = RHSInt->getValue();
13590 if (LeftSideValue != 2 && LeftSideValue != 10)
13593 if (LeftSideValue.getBitWidth() != RightSideValue.getBitWidth())
13598 llvm::StringRef ExprStr =
13603 llvm::StringRef XorStr =
13606 if (XorStr ==
"xor")
13617 RightSideValue = -RightSideValue;
13618 RHSStr =
"-" + RHSStr;
13619 }
else if (ExplicitPlus) {
13620 RHSStr =
"+" + RHSStr;
13623 StringRef LHSStrRef = LHSStr;
13624 StringRef RHSStrRef = RHSStr;
13627 if (LHSStrRef.starts_with(
"0b") || LHSStrRef.starts_with(
"0B") ||
13628 RHSStrRef.starts_with(
"0b") || RHSStrRef.starts_with(
"0B") ||
13629 LHSStrRef.starts_with(
"0x") || LHSStrRef.starts_with(
"0X") ||
13630 RHSStrRef.starts_with(
"0x") || RHSStrRef.starts_with(
"0X") ||
13631 (LHSStrRef.size() > 1 && LHSStrRef.starts_with(
"0")) ||
13632 (RHSStrRef.size() > 1 && RHSStrRef.starts_with(
"0")) ||
13633 LHSStrRef.contains(
'\'') || RHSStrRef.contains(
'\''))
13638 const llvm::APInt XorValue = LeftSideValue ^ RightSideValue;
13639 int64_t RightSideIntValue = RightSideValue.getSExtValue();
13640 if (LeftSideValue == 2 && RightSideIntValue >= 0) {
13641 std::string SuggestedExpr =
"1 << " + RHSStr;
13642 bool Overflow =
false;
13643 llvm::APInt One = (LeftSideValue - 1);
13644 llvm::APInt PowValue = One.sshl_ov(RightSideValue, Overflow);
13646 if (RightSideIntValue < 64)
13647 S.
Diag(Loc, diag::warn_xor_used_as_pow_base)
13648 << ExprStr <<
toString(XorValue, 10,
true) << (
"1LL << " + RHSStr)
13650 else if (RightSideIntValue == 64)
13651 S.
Diag(Loc, diag::warn_xor_used_as_pow)
13652 << ExprStr <<
toString(XorValue, 10,
true);
13656 S.
Diag(Loc, diag::warn_xor_used_as_pow_base_extra)
13657 << ExprStr <<
toString(XorValue, 10,
true) << SuggestedExpr
13660 ExprRange, (RightSideIntValue == 0) ?
"1" : SuggestedExpr);
13663 S.
Diag(Loc, diag::note_xor_used_as_pow_silence)
13664 << (
"0x2 ^ " + RHSStr) << SuggestXor;
13665 }
else if (LeftSideValue == 10) {
13666 std::string SuggestedValue =
"1e" + std::to_string(RightSideIntValue);
13667 S.
Diag(Loc, diag::warn_xor_used_as_pow_base)
13668 << ExprStr <<
toString(XorValue, 10,
true) << SuggestedValue
13670 S.
Diag(Loc, diag::note_xor_used_as_pow_silence)
13671 << (
"0xA ^ " + RHSStr) << SuggestXor;
13688 getLangOpts().getOpenCLCompatibleVersion() < 120 &&
13715 assert(
false &&
"Logical operands are not supported in C\\C++");
13731 bool IsCompAssign) {
13732 if (!IsCompAssign) {
13748 assert((LHSMatType || RHSMatType) &&
"At least one operand must be a matrix");
13750 if (
Context.hasSameType(LHSType, RHSType))
13751 return Context.getCommonSugaredType(LHSType, RHSType);
13757 if (LHSMatType && !RHSMatType) {
13765 if (!LHSMatType && RHSMatType) {
13777 bool IsCompAssign) {
13778 if (!IsCompAssign) {
13789 assert((LHSMatType || RHSMatType) &&
"At least one operand must be a matrix");
13791 if (LHSMatType && RHSMatType) {
13792 if (LHSMatType->getNumColumns() != RHSMatType->
getNumRows())
13795 if (
Context.hasSameType(LHSMatType, RHSMatType))
13796 return Context.getCommonSugaredType(
13800 QualType LHSELTy = LHSMatType->getElementType(),
13802 if (!
Context.hasSameType(LHSELTy, RHSELTy))
13805 return Context.getConstantMatrixType(
13806 Context.getCommonSugaredType(LHSELTy, RHSELTy),
13831 bool IsCompAssign =
13832 Opc == BO_AndAssign || Opc == BO_OrAssign || Opc == BO_XorAssign;
13843 LegalBoolVecOperator,
13873 ExprResult LHSResult = LHS, RHSResult = RHS;
13875 LHSResult, RHSResult, Loc,
13877 if (LHSResult.
isInvalid() || RHSResult.isInvalid())
13879 LHS = LHSResult.
get();
13880 RHS = RHSResult.
get();
13905 bool EnumConstantInBoolContext =
false;
13907 if (
const auto *DREHS = dyn_cast<DeclRefExpr>(HS.get())) {
13908 const auto *ECDHS = dyn_cast<EnumConstantDecl>(DREHS->getDecl());
13909 if (ECDHS && ECDHS->getInitVal() != 0 && ECDHS->getInitVal() != 1)
13910 EnumConstantInBoolContext =
true;
13914 if (EnumConstantInBoolContext)
13915 Diag(Loc, diag::warn_enum_constant_in_bool_context);
13920 const auto *LHSATy = dyn_cast<ArrayType>(LHSTy);
13921 const auto *RHSATy = dyn_cast<ArrayType>(RHSTy);
13922 if ((LHSATy && LHSATy->getElementType().isWebAssemblyReferenceType()) ||
13923 (RHSATy && RHSATy->getElementType().isWebAssemblyReferenceType())) {
13945 Diag(Loc, diag::warn_logical_instead_of_bitwise)
13948 Diag(Loc, diag::note_logical_instead_of_bitwise_change_operator)
13949 << (Opc == BO_LAnd ?
"&" :
"|")
13952 Opc == BO_LAnd ?
"&" :
"|");
13953 if (Opc == BO_LAnd)
13955 Diag(Loc, diag::note_logical_instead_of_bitwise_remove_constant)
13963 if (!
Context.getLangOpts().CPlusPlus) {
13966 if (
Context.getLangOpts().OpenCL &&
13967 Context.getLangOpts().OpenCLVersion < 120) {
14022 const MemberExpr *ME = dyn_cast<MemberExpr>(E);
14023 if (!ME)
return false;
14027 if (!
Base)
return false;
14028 return Base->getMethodDecl() !=
nullptr;
14052 assert(S.
getLangOpts().CPlusPlus &&
"BindingDecl outside of C++?");
14063 assert(Var->
hasLocalStorage() &&
"capture added 'const' to non-local?");
14071 if (
auto *FD = dyn_cast<FunctionDecl>(DC))
14113 bool DiagnosticEmitted =
false;
14117 bool IsDereference =
false;
14118 bool NextIsDereference =
false;
14122 IsDereference = NextIsDereference;
14125 if (
const MemberExpr *ME = dyn_cast<MemberExpr>(E)) {
14126 NextIsDereference = ME->isArrow();
14127 const ValueDecl *VD = ME->getMemberDecl();
14128 if (
const FieldDecl *Field = dyn_cast<FieldDecl>(VD)) {
14130 if (Field->isMutable()) {
14131 assert(DiagnosticEmitted &&
"Expected diagnostic not emitted.");
14136 if (!DiagnosticEmitted) {
14137 S.
Diag(Loc, diag::err_typecheck_assign_const)
14139 << Field->getType();
14140 DiagnosticEmitted =
true;
14143 <<
ConstMember <<
false << Field << Field->getType()
14144 << Field->getSourceRange();
14148 }
else if (
const VarDecl *VDecl = dyn_cast<VarDecl>(VD)) {
14149 if (VDecl->getType().isConstQualified()) {
14150 if (!DiagnosticEmitted) {
14151 S.
Diag(Loc, diag::err_typecheck_assign_const)
14153 << VDecl->getType();
14154 DiagnosticEmitted =
true;
14157 <<
ConstMember <<
true << VDecl << VDecl->getType()
14158 << VDecl->getSourceRange();
14165 dyn_cast<ArraySubscriptExpr>(E)) {
14169 dyn_cast<ExtVectorElementExpr>(E)) {
14176 if (
const CallExpr *CE = dyn_cast<CallExpr>(E)) {
14180 if (!DiagnosticEmitted) {
14181 S.
Diag(Loc, diag::err_typecheck_assign_const) << ExprRange
14183 DiagnosticEmitted =
true;
14186 diag::note_typecheck_assign_const)
14190 }
else if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
14192 if (
const ValueDecl *VD = DRE->getDecl()) {
14194 if (!DiagnosticEmitted) {
14195 S.
Diag(Loc, diag::err_typecheck_assign_const)
14197 DiagnosticEmitted =
true;
14199 S.
Diag(VD->getLocation(), diag::note_typecheck_assign_const)
14200 <<
ConstVariable << VD << VD->getType() << VD->getSourceRange();
14205 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(DC)) {
14206 if (MD->isConst()) {
14207 if (!DiagnosticEmitted) {
14208 S.
Diag(Loc, diag::err_typecheck_assign_const_method)
14209 << ExprRange << MD;
14210 DiagnosticEmitted =
true;
14212 S.
Diag(MD->getLocation(), diag::note_typecheck_assign_const_method)
14213 << MD << MD->getSourceRange();
14219 if (DiagnosticEmitted)
14223 S.
Diag(Loc, diag::err_typecheck_assign_const) << ExprRange <<
ConstUnknown;
14233 const RecordType *Ty,
14236 bool &DiagnosticEmitted) {
14237 std::vector<const RecordType *> RecordTypeList;
14238 RecordTypeList.push_back(Ty);
14239 unsigned NextToCheckIndex = 0;
14242 while (RecordTypeList.size() > NextToCheckIndex) {
14243 bool IsNested = NextToCheckIndex > 0;
14244 for (
const FieldDecl *Field : RecordTypeList[NextToCheckIndex]
14246 ->getDefinitionOrSelf()
14249 QualType FieldTy = Field->getType();
14251 if (!DiagnosticEmitted) {
14252 S.
Diag(Loc, diag::err_typecheck_assign_const)
14254 << IsNested << Field;
14255 DiagnosticEmitted =
true;
14257 S.
Diag(Field->getLocation(), diag::note_typecheck_assign_const)
14259 << FieldTy << Field->getSourceRange();
14264 if (
const auto *FieldRecTy = FieldTy->
getAsCanonical<RecordType>()) {
14265 if (!llvm::is_contained(RecordTypeList, FieldRecTy))
14266 RecordTypeList.push_back(FieldRecTy);
14269 ++NextToCheckIndex;
14278 assert(Ty->
isRecordType() &&
"lvalue was not record?");
14281 bool DiagEmitted =
false;
14283 if (
const MemberExpr *ME = dyn_cast<MemberExpr>(E))
14286 else if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
14311 unsigned DiagID = 0;
14312 bool NeedType =
false;
14319 DiagID = diag::err_block_decl_ref_not_modifiable_lvalue;
14321 DiagID = diag::err_lambda_decl_ref_not_modifiable_lvalue;
14334 if (var->isARCPseudoStrong() &&
14335 (!var->getTypeSourceInfo() ||
14336 !var->getTypeSourceInfo()->getType().isConstQualified())) {
14342 ? diag::err_typecheck_arc_assign_self_class_method
14343 : diag::err_typecheck_arc_assign_self;
14346 }
else if (var->hasAttr<ObjCExternallyRetainedAttr>() ||
14348 DiagID = diag::err_typecheck_arc_assign_externally_retained;
14352 DiagID = diag::err_typecheck_arr_assign_enumeration;
14356 if (Loc != OrigLoc)
14382 DiagID = diag::err_typecheck_array_not_modifiable_lvalue;
14386 DiagID = diag::err_typecheck_non_object_not_modifiable_lvalue;
14390 DiagID = diag::err_typecheck_lvalue_casts_not_supported;
14393 llvm_unreachable(
"did not take early return for MLV_Valid");
14397 DiagID = diag::err_typecheck_expression_not_modifiable_lvalue;
14402 diag::err_typecheck_incomplete_type_not_modifiable_lvalue, E);
14404 DiagID = diag::err_typecheck_duplicate_vector_components_not_mlvalue;
14407 DiagID = diag::err_typecheck_duplicate_matrix_components_not_mlvalue;
14410 llvm_unreachable(
"readonly properties should be processed differently");
14412 DiagID = diag::err_readonly_message_assignment;
14415 DiagID = diag::err_no_subobject_property_setting;
14420 if (Loc != OrigLoc)
14442 MemberExpr *ML = dyn_cast<MemberExpr>(LHSExpr);
14443 MemberExpr *MR = dyn_cast<MemberExpr>(RHSExpr);
14451 if (LHSDecl != RHSDecl)
14456 if (RefTy->getPointeeType().isVolatileQualified())
14459 Sema.
Diag(Loc, diag::warn_identity_field_assign) << 0;
14469 Sema.
Diag(Loc, diag::warn_identity_field_assign) << 1;
14493 bool ShowFullyQualifiedAssigneeName =
false;
14496 Assignee = DR->getDecl();
14497 }
else if (
auto *ME = dyn_cast<MemberExpr>(LHSExpr->
IgnoreParenCasts())) {
14498 Assignee = ME->getMemberDecl();
14499 ShowFullyQualifiedAssigneeName =
true;
14504 ShowFullyQualifiedAssigneeName);
14513 Diag(Loc, diag::err_opencl_half_load_store) << 1
14520 Diag(Loc, diag::err_wasm_table_art) << 0;
14525 if (CompoundType.
isNull()) {
14536 ((
Context.isObjCNSObjectType(LHSType) &&
14538 (
Context.isObjCNSObjectType(RHSType) &&
14543 Diag(Loc, diag::err_objc_object_assignment) << LHSType;
14549 RHSCheck = ICE->getSubExpr();
14550 if (
UnaryOperator *UO = dyn_cast<UnaryOperator>(RHSCheck)) {
14551 if ((UO->getOpcode() == UO_Plus || UO->getOpcode() == UO_Minus) &&
14552 Loc.
isFileID() && UO->getOperatorLoc().isFileID() &&
14558 UO->getSubExpr()->getBeginLoc().
isFileID()) {
14559 Diag(Loc, diag::warn_not_compound_assign)
14560 << (UO->getOpcode() == UO_Plus ?
"+" :
"-")
14561 <<
SourceRange(UO->getOperatorLoc(), UO->getOperatorLoc());
14571 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(InnerLHS);
14587 if (!
Diags.isIgnored(diag::warn_arc_repeated_use_of_weak,
14610 if (CompoundType.
isNull()) {
14636 if (
const CastExpr *CE = dyn_cast<CastExpr>(E)) {
14637 if (CE->getCastKind() == CK_ToVoid) {
14643 CE->getSubExpr()->getType()->isDependentType()) {
14648 if (
const auto *CE = dyn_cast<CallExpr>(E))
14649 return CE->getCallReturnType(Context)->isVoidType();
14673 while (
const BinaryOperator *BO = dyn_cast<BinaryOperator>(LHS)) {
14674 if (BO->getOpcode() != BO_Comma)
14676 LHS = BO->getRHS();
14683 Diag(Loc, diag::warn_comma_operator);
14687 LangOpts.CPlusPlus ?
"static_cast<void>("
14719 diag::err_incomplete_type);
14740 ResType = ResAtomicType->getValueType();
14742 assert(!ResType.
isNull() &&
"no type for increment/decrement expression");
14752 : diag::warn_increment_bool)
14756 S.
Diag(OpLoc, diag::err_increment_decrement_enum) << IsInc << ResType;
14774 S.
Diag(OpLoc, S.
getLangOpts().C2y ? diag::warn_c2y_compat_increment_complex
14775 : diag::ext_c2y_increment_complex)
14792 S.
Diag(OpLoc, diag::err_typecheck_illegal_increment_decrement)
14803 S.
Diag(OpLoc, diag::warn_deprecated_increment_decrement_volatile)
14804 << IsInc << ResType;
14836 case Stmt::DeclRefExprClass:
14838 case Stmt::MemberExprClass:
14846 case Stmt::ArraySubscriptExprClass: {
14851 if (ICE->getSubExpr()->getType()->isArrayType())
14856 case Stmt::UnaryOperatorClass: {
14868 case Stmt::ParenExprClass:
14870 case Stmt::ImplicitCastExprClass:
14874 case Stmt::CXXUuidofExprClass:
14884 AO_Vector_Element = 1,
14885 AO_Property_Expansion = 2,
14886 AO_Register_Variable = 3,
14887 AO_Matrix_Element = 4,
14905 return Diag(OpLoc, diag::err_parens_pointer_member_function)
14910 return Diag(OpLoc, diag::err_typecheck_addrof_dtor)
14911 << DRE->getSourceRange();
14913 if (DRE->getQualifier())
14917 return Diag(OpLoc, diag::err_unqualified_pointer_member_function)
14918 << DRE->getSourceRange();
14921 StringRef Qual = (MD->
getParent()->getName() +
"::").toStringRef(Str);
14922 return Diag(OpLoc, diag::err_unqualified_pointer_member_function)
14923 << DRE->getSourceRange()
14929 if (PTy->getKind() == BuiltinType::Overload) {
14933 Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof_addrof_function)
14941 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
14949 if (PTy->getKind() == BuiltinType::UnknownAny)
14952 if (PTy->getKind() == BuiltinType::BoundMember) {
14953 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
14976 auto* VarRef = dyn_cast<DeclRefExpr>(op);
14977 if (VarRef && VarRef->refersToEnclosingVariableOrCapture()) {
14978 Diag(op->
getExprLoc(), diag::err_opencl_taking_address_capture);
14986 if (uOp->getOpcode() == UO_Deref)
14989 return uOp->getSubExpr()->getType();
14996 if (
auto *FD = dyn_cast_or_null<FunctionDecl>(dcl))
15002 unsigned AddressOfError = AO_No_Error;
15006 Diag(OpLoc, IsError ? diag::err_typecheck_addrof_temporary
15007 : diag::ext_typecheck_addrof_temporary)
15022 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
15040 auto ReturnOrParamTypeIsIncomplete = [&](
QualType T,
15045 diag::note_ptrauth_virtual_function_pointer_incomplete_arg_ret);
15046 Diag(RetArgTypeLoc,
15047 diag::note_ptrauth_virtual_function_incomplete_arg_ret_type)
15054 bool IsIncomplete =
15056 ReturnOrParamTypeIsIncomplete(
15059 IsIncomplete |= ReturnOrParamTypeIsIncomplete(PVD->getType(), OpLoc,
15060 PVD->getBeginLoc());
15066 if (
Context.getTargetInfo().getCXXABI().isMicrosoft())
15075 AddressOfError = AO_Property_Expansion;
15077 Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof)
15081 }
else if (
const auto *DRE = dyn_cast<DeclRefExpr>(op)) {
15082 if (
const auto *MD = dyn_cast_or_null<CXXMethodDecl>(DRE->getDecl()))
15088 AddressOfError = AO_Bit_Field;
15091 AddressOfError = AO_Vector_Element;
15094 AddressOfError = AO_Matrix_Element;
15098 if (
const VarDecl *vd = dyn_cast<VarDecl>(dcl)) {
15103 AddressOfError = AO_Register_Variable;
15106 AddressOfError = AO_Property_Expansion;
15119 if (
auto *DRE = dyn_cast<DeclRefExpr>(op);
15125 diag::err_cannot_form_pointer_to_member_of_reference_type)
15136 if (
Context.getTargetInfo().getCXXABI().isMicrosoft())
15144 llvm_unreachable(
"Unknown/unexpected decl type");
15147 if (AddressOfError != AO_No_Error) {
15164 if (
Context.getTargetInfo().getTriple().isWasm()) {
15167 Diag(OpLoc, diag::err_wasm_ca_reference)
15172 Diag(OpLoc, diag::err_wasm_table_pr)
15178 CheckAddressOfPackedMember(op);
15184 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Exp);
15190 const ParmVarDecl *Param = dyn_cast<ParmVarDecl>(D);
15193 if (
const FunctionDecl* FD = dyn_cast<FunctionDecl>(Param->getDeclContext()))
15194 if (!FD->hasAttr<NonNullAttr>() && !Param->hasAttr<NonNullAttr>())
15197 FD->ModifiedNonNullParams.insert(Param);
15203 bool IsAfterAmp =
false) {
15207 Op = ConvResult.
get();
15219 Result = PT->getPointeeType();
15223 Result = OPT->getPointeeType();
15227 if (PR.
get() != Op)
15232 S.
Diag(OpLoc, diag::err_typecheck_indirection_requires_pointer)
15237 if (
Result->isVoidType()) {
15243 S.
Diag(OpLoc, diag::err_typecheck_indirection_through_void_pointer_cpp)
15246 S.
Diag(OpLoc, diag::ext_typecheck_indirection_through_void_pointer)
15263 default: llvm_unreachable(
"Unknown binop!");
15264 case tok::periodstar: Opc = BO_PtrMemD;
break;
15265 case tok::arrowstar: Opc = BO_PtrMemI;
break;
15266 case tok::star: Opc = BO_Mul;
break;
15267 case tok::slash: Opc = BO_Div;
break;
15268 case tok::percent: Opc = BO_Rem;
break;
15269 case tok::plus: Opc = BO_Add;
break;
15270 case tok::minus: Opc = BO_Sub;
break;
15271 case tok::lessless: Opc = BO_Shl;
break;
15272 case tok::greatergreater: Opc = BO_Shr;
break;
15273 case tok::lessequal: Opc = BO_LE;
break;
15274 case tok::less: Opc = BO_LT;
break;
15275 case tok::greaterequal: Opc = BO_GE;
break;
15276 case tok::greater: Opc = BO_GT;
break;
15277 case tok::exclaimequal: Opc = BO_NE;
break;
15278 case tok::equalequal: Opc = BO_EQ;
break;
15279 case tok::spaceship: Opc = BO_Cmp;
break;
15280 case tok::amp: Opc = BO_And;
break;
15281 case tok::caret: Opc = BO_Xor;
break;
15282 case tok::pipe: Opc = BO_Or;
break;
15283 case tok::ampamp: Opc = BO_LAnd;
break;
15284 case tok::pipepipe: Opc = BO_LOr;
break;
15285 case tok::equal: Opc = BO_Assign;
break;
15286 case tok::starequal: Opc = BO_MulAssign;
break;
15287 case tok::slashequal: Opc = BO_DivAssign;
break;
15288 case tok::percentequal: Opc = BO_RemAssign;
break;
15289 case tok::plusequal: Opc = BO_AddAssign;
break;
15290 case tok::minusequal: Opc = BO_SubAssign;
break;
15291 case tok::lesslessequal: Opc = BO_ShlAssign;
break;
15292 case tok::greatergreaterequal: Opc = BO_ShrAssign;
break;
15293 case tok::ampequal: Opc = BO_AndAssign;
break;
15294 case tok::caretequal: Opc = BO_XorAssign;
break;
15295 case tok::pipeequal: Opc = BO_OrAssign;
break;
15296 case tok::comma: Opc = BO_Comma;
break;
15305 default: llvm_unreachable(
"Unknown unary op!");
15306 case tok::plusplus: Opc = UO_PreInc;
break;
15307 case tok::minusminus: Opc = UO_PreDec;
break;
15308 case tok::amp: Opc = UO_AddrOf;
break;
15309 case tok::star: Opc = UO_Deref;
break;
15310 case tok::plus: Opc = UO_Plus;
break;
15311 case tok::minus: Opc = UO_Minus;
break;
15312 case tok::tilde: Opc = UO_Not;
break;
15313 case tok::exclaim: Opc = UO_LNot;
break;
15314 case tok::kw___real: Opc = UO_Real;
break;
15315 case tok::kw___imag: Opc = UO_Imag;
break;
15316 case tok::kw___extension__: Opc = UO_Extension;
break;
15348 llvm::find_if(Parent->
fields(),
15350 return F->getDeclName() == Name;
15352 return (Field != Parent->
field_end()) ? *Field :
nullptr;
15367 const DeclRefExpr *LHSDeclRef = dyn_cast<DeclRefExpr>(LHSExpr);
15368 const DeclRefExpr *RHSDeclRef = dyn_cast<DeclRefExpr>(RHSExpr);
15369 if (!LHSDeclRef || !RHSDeclRef ||
15377 if (LHSDecl != RHSDecl)
15382 if (RefTy->getPointeeType().isVolatileQualified())
15385 auto Diag = S.
Diag(OpLoc, IsBuiltin ? diag::warn_self_assignment_builtin
15386 : diag::warn_self_assignment_overloaded)
15391 Diag << 1 << SelfAssignField
15404 const Expr *ObjCPointerExpr =
nullptr, *OtherExpr =
nullptr;
15406 const Expr *RHS = R.get();
15409 ObjCPointerExpr = LHS;
15413 ObjCPointerExpr = RHS;
15422 unsigned Diag = diag::warn_objc_pointer_masking;
15431 if (SelArg0.starts_with(
"performSelector"))
15432 Diag = diag::warn_objc_pointer_masking_performSelector;
15449 assert((
isVector(ResultTy, Context.HalfTy) ||
15450 isVector(ResultTy, Context.ShortTy)) &&
15451 "Result must be a vector of half or short");
15454 "both operands expected to be a half vector");
15461 if (
isVector(ResultTy, Context.ShortTy))
15466 ResultTy,
VK, OK, OpLoc, FPFeatures,
15467 BinOpResTy, BinOpResTy);
15471 BinOpResTy,
VK, OK, OpLoc, FPFeatures);
15479 if (!OpRequiresConversion || Ctx.
getLangOpts().NativeHalfType ||
15483 auto HasVectorOfHalfType = [&Ctx](
Expr *E) {
15493 return VT->getElementType().getCanonicalType() == Ctx.
HalfTy;
15498 return HasVectorOfHalfType(E0) && (!E1 || HasVectorOfHalfType(E1));
15503 Expr *RHSExpr,
bool ForFoldExpression) {
15517 if (
Init.isInvalid())
15519 RHSExpr =
Init.get();
15529 bool ConvertHalfVec =
false;
15531 if (!LHS.
isUsable() || !RHS.isUsable())
15541 if (BO_Assign == Opc)
15542 Diag(OpLoc, diag::err_opencl_atomic_init) << 0 << SR;
15570 if (!ResultTy.
isNull()) {
15587 if (
auto *BE = dyn_cast<BlockExpr>(RHS.get()->IgnoreParens()))
15589 if (
auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
15590 if (VD->hasLocalStorage() &&
getCurScope()->isDeclScope(VD))
15591 BE->getBlockDecl()->setCanAvoidCopyToHeap();
15602 Opc == BO_PtrMemI);
15606 ConvertHalfVec =
true;
15613 ConvertHalfVec =
true;
15617 ConvertHalfVec =
true;
15628 ConvertHalfVec =
true;
15631 if (
const auto *BI = dyn_cast<BinaryOperator>(LHSExpr);
15632 !ForFoldExpression && BI && BI->isComparisonOp())
15633 Diag(OpLoc, diag::warn_consecutive_comparison)
15639 ConvertHalfVec =
true;
15643 ConvertHalfVec =
true;
15656 ConvertHalfVec =
true;
15661 ConvertHalfVec =
true;
15663 CompLHSTy = CompResultTy;
15670 CompLHSTy = CompResultTy;
15676 ConvertHalfVec =
true;
15683 ConvertHalfVec =
true;
15692 CompLHSTy = CompResultTy;
15703 CompLHSTy = CompResultTy;
15711 VK = RHS.get()->getValueKind();
15712 OK = RHS.get()->getObjectKind();
15724 (Opc == BO_Comma ||
isVector(RHS.get()->getType(),
Context.HalfTy) ==
15726 "both sides are half vectors or neither sides are");
15731 CheckArrayAccess(LHS.
get());
15732 CheckArrayAccess(RHS.get());
15736 &
Context.Idents.get(
"object_setClass"),
15742 "object_setClass(")
15755 if (CompResultTy.
isNull()) {
15756 if (ConvertHalfVec)
15776 if (ConvertHalfVec)
15781 Context, LHS.
get(), RHS.get(), Opc, ResultTy,
VK, OK, OpLoc,
15798 if (isLeftComp == isRightComp)
15803 bool isLeftBitwise = LHSBO && LHSBO->
isBitwiseOp();
15804 bool isRightBitwise = RHSBO && RHSBO->
isBitwiseOp();
15805 if (isLeftBitwise || isRightBitwise)
15817 Self.Diag(OpLoc, diag::warn_precedence_bitwise_rel)
15820 Self.PDiag(diag::note_precedence_silence) << OpStr,
15821 (isLeftComp ? LHSExpr : RHSExpr)->getSourceRange());
15823 Self.PDiag(diag::note_precedence_bitwise_first)
15838 Self.PDiag(diag::note_precedence_silence)
15847 if (Bop->getOpcode() == BO_LAnd) {
15852 }
else if (Bop->getOpcode() == BO_LOr) {
15853 if (
BinaryOperator *RBop = dyn_cast<BinaryOperator>(Bop->getRHS())) {
15856 if (RBop->getOpcode() == BO_LAnd &&
15868 if (Bop->getOpcode() == BO_LAnd) {
15883 if (Bop->isBitwiseOp() && Bop->getOpcode() < Opc) {
15884 S.
Diag(Bop->getOperatorLoc(), diag::warn_bitwise_op_in_bitwise_op)
15886 << Bop->getSourceRange() << OpLoc;
15888 S.
PDiag(diag::note_precedence_silence)
15889 << Bop->getOpcodeStr(),
15890 Bop->getSourceRange());
15896 Expr *SubExpr, StringRef Shift) {
15898 if (Bop->getOpcode() == BO_Add || Bop->getOpcode() == BO_Sub) {
15899 StringRef Op = Bop->getOpcodeStr();
15900 S.
Diag(Bop->getOperatorLoc(), diag::warn_addition_in_bitshift)
15901 << Bop->getSourceRange() << OpLoc << Shift << Op;
15903 S.
PDiag(diag::note_precedence_silence) << Op,
15904 Bop->getSourceRange());
15920 if (Kind != OO_LessLess && Kind != OO_GreaterGreater)
15923 S.
Diag(OpLoc, diag::warn_overloaded_shift_in_comparison)
15925 << (Kind == OO_LessLess);
15927 S.
PDiag(diag::note_precedence_silence)
15928 << (Kind == OO_LessLess ?
"<<" :
">>"),
15931 S, OpLoc, S.
PDiag(diag::note_evaluate_comparison_first),
15945 if ((Opc == BO_Or || Opc == BO_Xor) &&
15953 if (Opc == BO_LOr && !OpLoc.
isMacroID()) {
15959 || Opc == BO_Shr) {
15975 assert(LHSExpr &&
"ActOnBinOp(): missing left expression");
15976 assert(RHSExpr &&
"ActOnBinOp(): missing right expression");
15985 CheckInvalidBuiltinCountedByRef(LHSExpr, K);
15986 CheckInvalidBuiltinCountedByRef(RHSExpr, K);
15988 return BuildBinOp(S, TokLoc, Opc, LHSExpr, RHSExpr);
15994 if (OverOp !=
OO_None && OverOp != OO_Equal)
16043 Expr *RHSExpr,
bool ForFoldExpression) {
16044 if (!LHSExpr || !RHSExpr)
16056 if (pty->getKind() == BuiltinType::PseudoObject &&
16069 RHSExpr = resolvedRHS.
get();
16083 (pty->getKind() == BuiltinType::BoundMember ||
16084 pty->getKind() == BuiltinType::Overload)) {
16085 auto *OE = dyn_cast<OverloadExpr>(LHSExpr);
16086 if (OE && !OE->hasTemplateKeyword() && !OE->hasExplicitTemplateArgs() &&
16087 llvm::any_of(OE->decls(), [](
NamedDecl *ND) {
16088 return isa<FunctionTemplateDecl>(ND);
16090 Diag(OE->getQualifier() ? OE->getQualifierLoc().getBeginLoc()
16091 : OE->getNameLoc(),
16092 diag::err_template_kw_missing)
16093 << OE->getName().getAsIdentifierInfo();
16100 LHSExpr = LHS.
get();
16107 if (Opc == BO_Assign && pty->getKind() == BuiltinType::Overload) {
16114 ForFoldExpression);
16124 RHSExpr = resolvedRHS.
get();
16129 if (!
HLSL().CheckResourceBinOp(Opc, LHSExpr, RHSExpr, OpLoc))
16134 bool CanOverloadBinOp =
16138 bool TypeDependent =
16142 if (CanOverloadBinOp && (TypeDependent || Overloadable))
16150 "Should only occur in error-recovery path.");
16156 Context, LHSExpr, RHSExpr, Opc,
16176 ResultType = RHSExpr->
getType();
16179 ResultType =
Context.DependentTy;
16192 if (T.isNull() || T->isDependentType())
16208 bool CanOverflow =
false;
16210 bool ConvertHalfVec =
false;
16219 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16226 if (Opc == UO_AddrOf)
16227 return ExprError(
Diag(OpLoc, diag::err_hlsl_operator_unsupported) << 0);
16228 if (Opc == UO_Deref)
16229 return ExprError(
Diag(OpLoc, diag::err_hlsl_operator_unsupported) << 1);
16234 resultType =
Context.DependentTy;
16243 Opc == UO_PreInc || Opc == UO_PostInc,
16244 Opc == UO_PreInc || Opc == UO_PreDec);
16249 CheckAddressOfNoDeref(InputExpr);
16262 CanOverflow = Opc == UO_Minus &&
16274 if (ConvertHalfVec)
16281 (!
Context.getLangOpts().ZVector ||
16291 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16302 Diag(OpLoc, diag::ext_integer_complement_complex)
16310 if (!T->isIntegerType())
16311 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16314 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16330 resultType =
Context.FloatTy;
16336 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16342 if (
Context.getLangOpts().CPlusPlus) {
16347 }
else if (
Context.getLangOpts().OpenCL &&
16348 Context.getLangOpts().OpenCLVersion < 120) {
16352 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16365 Input.
get(), resultType,
16370 if (
Context.getLangOpts().OpenCL &&
16371 Context.getLangOpts().getOpenCLCompatibleVersion() < 120) {
16375 if (!T->isIntegerType())
16376 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16382 }
else if (
Context.getLangOpts().CPlusPlus &&
16386 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16392 }
else if (resultType ==
Context.AMDGPUFeaturePredicateTy) {
16393 resultType =
Context.getLogicalOperationType();
16397 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16403 resultType =
Context.getLogicalOperationType();
16431 "the co_await expression must be non-dependant before "
16432 "building operator co_await");
16443 if (Opc != UO_AddrOf && Opc != UO_Deref)
16444 CheckArrayAccess(Input.
get());
16450 if (Opc == UO_Deref && UO->getType()->hasAttr(attr::NoDeref) &&
16456 if (ConvertHalfVec)
16462 if (
DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
16463 if (!DRE->getQualifier())
16473 return Method->isImplicitObjectMemberFunction();
16479 if (!ULE->getQualifier())
16484 if (
Method->isImplicitObjectMemberFunction())
16505 if (pty->getKind() == BuiltinType::PseudoObject &&
16510 if (Opc == UO_Extension)
16515 if (Opc == UO_AddrOf &&
16516 (pty->getKind() == BuiltinType::Overload ||
16517 pty->getKind() == BuiltinType::UnknownAny ||
16518 pty->getKind() == BuiltinType::BoundMember))
16543 Expr *Input,
bool IsAfterAmp) {
16553 OpLoc, LabLoc, TheDecl,
Context.getPointerType(
Context.VoidTy));
16587 assert(!
Cleanup.exprNeedsCleanups() &&
16588 "cleanups within StmtExpr not correctly bound!");
16598 bool StmtExprMayBindToTemp =
false;
16600 if (
const auto *LastStmt = dyn_cast<ValueStmt>(Compound->
body_back())) {
16601 if (
const Expr *
Value = LastStmt->getExprStmt()) {
16602 StmtExprMayBindToTemp =
true;
16610 Expr *ResStmtExpr =
16612 if (StmtExprMayBindToTemp)
16614 return ResStmtExpr;
16637 auto *Cast = dyn_cast<ImplicitCastExpr>(E);
16638 if (Cast && Cast->getCastKind() == CK_ARCConsumeObject)
16639 return Cast->getSubExpr();
16660 return ExprError(
Diag(BuiltinLoc, diag::err_offsetof_record_type)
16661 << ArgTy << TypeRange);
16667 diag::err_offsetof_incomplete_type, TypeRange))
16670 bool DidWarnAboutNonPOD =
false;
16675 if (OC.isBrackets) {
16680 return ExprError(
Diag(OC.LocEnd, diag::err_offsetof_array_type)
16684 CurrentType =
Context.DependentTy;
16700 Comps.push_back(
OffsetOfNode(OC.LocStart, Exprs.size(), OC.LocEnd));
16701 Exprs.push_back(Idx);
16709 Comps.push_back(
OffsetOfNode(OC.LocStart, OC.U.IdentInfo, OC.LocEnd));
16710 CurrentType =
Context.DependentTy;
16716 diag::err_offsetof_incomplete_type))
16722 return ExprError(
Diag(OC.LocEnd, diag::err_offsetof_record_type)
16733 bool IsSafe =
LangOpts.CPlusPlus11? CRD->isStandardLayout() : CRD->isPOD();
16735 LangOpts.CPlusPlus11? diag::ext_offsetof_non_standardlayout_type
16736 : diag::ext_offsetof_non_pod_type;
16739 Diag(BuiltinLoc, DiagID)
16740 <<
SourceRange(Components[0].LocStart, OC.LocEnd) << CurrentType;
16741 DidWarnAboutNonPOD =
true;
16752 MemberDecl = IndirectMemberDecl->getAnonField();
16759 if (!R.isAmbiguous())
16760 Diag(BuiltinLoc, diag::err_no_member)
16761 << OC.U.IdentInfo << RD <<
SourceRange(OC.LocStart, OC.LocEnd);
16770 Diag(OC.LocEnd, diag::err_offsetof_bitfield)
16778 if (IndirectMemberDecl)
16785 Context.getCanonicalTagType(Parent), Paths)) {
16787 Diag(OC.LocEnd, diag::err_offsetof_field_of_virtual_base)
16798 if (IndirectMemberDecl) {
16799 for (
auto *FI : IndirectMemberDecl->chain()) {
16805 Comps.push_back(
OffsetOfNode(OC.LocStart, MemberDecl, OC.LocEnd));
16811 Comps, Exprs, RParenLoc);
16837 assert((CondExpr && LHSExpr && RHSExpr) &&
"Missing type argument(s)");
16842 bool CondIsTrue =
false;
16844 resType =
Context.DependentTy;
16847 llvm::APSInt condEval(32);
16849 CondExpr, &condEval, diag::err_typecheck_choose_expr_requires_constant);
16852 CondExpr = CondICE.
get();
16853 CondIsTrue = condEval.getZExtValue();
16856 Expr *ActiveExpr = CondIsTrue ? LHSExpr : RHSExpr;
16858 resType = ActiveExpr->
getType();
16864 resType,
VK, OK, RPLoc, CondIsTrue);
16876 Decl *ManglingContextDecl;
16877 std::tie(MCtx, ManglingContextDecl) =
16881 Block->setBlockMangling(ManglingNumber, ManglingContextDecl);
16903 "block-id should have no identifier!");
16914 assert(T->isFunctionType() &&
16915 "GetTypeForDeclarator made a non-function block signature");
16931 unsigned Size =
Result.getFullDataSize();
16932 Sig =
Context.CreateTypeSourceInfo(
Result.getType(), Size);
16943 QualType RetTy = Fn->getReturnType();
16953 if (RetTy !=
Context.DependentTy) {
16961 if (ExplicitSignature) {
16962 for (
unsigned I = 0, E = ExplicitSignature.
getNumParams(); I != E; ++I) {
16964 if (Param->getIdentifier() ==
nullptr && !Param->isImplicit() &&
16968 Diag(Param->getLocation(), diag::ext_parameter_name_omitted_c23);
16970 Params.push_back(Param);
16976 for (
const auto &I : Fn->param_types()) {
16979 Params.push_back(Param);
16984 if (!Params.empty()) {
16995 AI->setOwningFunction(CurBlock->
TheDecl);
16998 if (AI->getIdentifier()) {
17004 if (AI->isInvalidDecl())
17023 Diag(CaretLoc, diag::err_blocks_disable) <<
LangOpts.OpenCL;
17028 assert(!
Cleanup.exprNeedsCleanups() &&
17029 "cleanups within block not correctly bound!");
17044 bool NoReturn = BD->
hasAttr<NoReturnAttr>();
17052 if (NoReturn && !Ext.getNoReturn()) Ext = Ext.
withNoReturn(
true);
17058 BlockTy =
Context.getFunctionType(RetTy, {}, EPI);
17079 BlockTy =
Context.getFunctionType(RetTy, {}, EPI);
17083 BlockTy =
Context.getBlockPointerType(BlockTy);
17087 !
PP.isCodeCompletionEnabled())
17092 if (Body &&
getCurFunction()->HasPotentialAvailabilityViolations)
17118 Expr *CopyExpr =
nullptr;
17145 if (!
Result.isInvalid() &&
17146 !
Result.get()->getType().isConstQualified()) {
17148 Result.get()->getType().withConst(),
17152 if (!
Result.isInvalid()) {
17162 if (!
Result.isInvalid() &&
17166 CopyExpr =
Result.get();
17173 Captures.push_back(NewCap);
17187 if (
Result->getBlockDecl()->hasCaptures()) {
17190 Cleanup.setExprNeedsCleanups(
true);
17194 for (
const auto &CI :
Result->getBlockDecl()->captures()) {
17195 const VarDecl *var = CI.getVariable();
17210 {Result},
Result->getType());
17224 Expr *OrigExpr = E;
17238 Context.getTargetInfo().getTriple().isNVPTX())
17261 VaListType =
Context.getArrayDecayedType(VaListType);
17273 if (
Init.isInvalid())
17289 diag::err_first_argument_to_va_arg_not_of_type_va_list)
17294 diag::err_second_parameter_to_va_arg_incomplete,
17300 diag::err_second_parameter_to_va_arg_abstract,
17307 ? diag::warn_second_parameter_to_va_arg_ownership_qualified
17308 : diag::warn_second_parameter_to_va_arg_not_pod)
17315 PDiag(diag::warn_second_parameter_to_va_arg_array)
17348 UnderlyingType = ED->getIntegerType();
17349 if (
Context.typesAreCompatible(PromoteType, UnderlyingType,
17362 ?
Context.getCorrespondingSignedType(UnderlyingType)
17363 :
Context.getCorrespondingUnsignedType(UnderlyingType);
17364 if (
Context.typesAreCompatible(PromoteType, UnderlyingType,
17370 PromoteType =
Context.DoubleTy;
17371 if (!PromoteType.
isNull())
17373 PDiag(diag::warn_second_parameter_to_va_arg_never_compatible)
17388 if (pw ==
Context.getTargetInfo().getIntWidth())
17390 else if (pw ==
Context.getTargetInfo().getLongWidth())
17392 else if (pw ==
Context.getTargetInfo().getLongLongWidth())
17395 llvm_unreachable(
"I don't know size of pointer!");
17412 if ((SLDecl->isCompleteDefinition() || SLDecl->isBeingDefined()) &&
17421 S.
Diag(Loc, diag::err_std_source_location_impl_not_found);
17429 S.
Diag(Loc, diag::err_std_source_location_impl_malformed);
17433 unsigned Count = 0;
17435 StringRef Name = F->getName();
17437 if (Name ==
"_M_file_name") {
17438 if (F->getType() !=
17442 }
else if (Name ==
"_M_function_name") {
17443 if (F->getType() !=
17447 }
else if (Name ==
"_M_line") {
17448 if (!F->getType()->isIntegerType())
17451 }
else if (Name ==
"_M_column") {
17452 if (!F->getType()->isIntegerType())
17461 S.
Diag(Loc, diag::err_std_source_location_impl_malformed);
17484 ResultTy =
Context.UnsignedIntTy;
17493 ResultTy =
Context.getPointerType(
17512 Data->BinaryData = BinaryData;
17516 Data->getDataElementCount());
17520 const Expr *SrcExpr) {
17529 auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl());
17542 bool *Complained) {
17544 *Complained =
false;
17547 bool CheckInferredResultType =
false;
17549 unsigned DiagKind = 0;
17551 bool MayHaveConvFixit =
false;
17552 bool MayHaveFunctionDiff =
false;
17563 DiagKind = diag::warn_compatible_implicit_pointer_conv;
17567 DiagKind = diag::err_typecheck_convert_pointer_int;
17570 DiagKind = diag::ext_typecheck_convert_pointer_int;
17573 MayHaveConvFixit =
true;
17577 DiagKind = diag::err_typecheck_convert_int_pointer;
17580 DiagKind = diag::ext_typecheck_convert_int_pointer;
17583 MayHaveConvFixit =
true;
17587 diag::warn_typecheck_convert_incompatible_function_pointer_strict;
17589 MayHaveConvFixit =
true;
17593 DiagKind = diag::err_typecheck_convert_incompatible_function_pointer;
17596 DiagKind = diag::ext_typecheck_convert_incompatible_function_pointer;
17599 MayHaveConvFixit =
true;
17603 DiagKind = diag::err_arc_typecheck_convert_incompatible_pointer;
17605 DiagKind = diag::err_typecheck_convert_incompatible_pointer;
17608 DiagKind = diag::ext_typecheck_convert_incompatible_pointer;
17612 if (CheckInferredResultType) {
17618 MayHaveConvFixit =
true;
17622 DiagKind = diag::err_typecheck_convert_incompatible_pointer_sign;
17625 DiagKind = diag::ext_typecheck_convert_incompatible_pointer_sign;
17630 DiagKind = diag::err_typecheck_convert_pointer_void_func;
17633 DiagKind = diag::ext_typecheck_convert_pointer_void_func;
17639 SrcType =
Context.getDecayedType(SrcType);
17646 DiagKind = diag::err_typecheck_incompatible_address_space;
17649 DiagKind = diag::err_typecheck_incompatible_ownership;
17652 DiagKind = diag::err_typecheck_incompatible_ptrauth;
17656 llvm_unreachable(
"unknown error case for discarding qualifiers!");
17661 SrcType =
Context.getArrayDecayedType(SrcType);
17663 DiagKind = diag::ext_typecheck_convert_discards_overflow_behavior;
17679 DiagKind = diag::err_typecheck_convert_discards_qualifiers;
17682 DiagKind = diag::ext_typecheck_convert_discards_qualifiers;
17689 DiagKind = diag::err_nested_pointer_qualifier_mismatch;
17691 DiagKind = diag::ext_nested_pointer_qualifier_mismatch;
17695 DiagKind = diag::err_typecheck_incompatible_nested_address_space;
17699 DiagKind = diag::err_int_to_block_pointer;
17703 DiagKind = diag::err_typecheck_convert_incompatible_block_pointer;
17710 for (
auto *srcProto : srcOPT->
quals()) {
17716 IFace = IFaceT->getDecl();
17721 for (
auto *dstProto : dstOPT->
quals()) {
17727 IFace = IFaceT->getDecl();
17730 DiagKind = diag::err_incompatible_qualified_id;
17733 DiagKind = diag::warn_incompatible_qualified_id;
17739 DiagKind = diag::err_incompatible_vectors;
17742 DiagKind = diag::warn_incompatible_vectors;
17746 DiagKind = diag::err_arc_weak_unavailable_assign;
17753 "Unexpected function type found in IncompatibleOBTKinds assignment");
17755 SrcType =
Context.getDecayedType(SrcType);
17757 auto getOBTKindName = [](
QualType Ty) -> StringRef {
17758 if (Ty->isPointerType())
17759 Ty = Ty->getPointeeType();
17760 if (
const auto *OBT = Ty->getAs<OverflowBehaviorType>()) {
17761 return OBT->getBehaviorKind() ==
17762 OverflowBehaviorType::OverflowBehaviorKind::Trap
17766 llvm_unreachable(
"OBT kind unhandled");
17769 Diag(Loc, diag::err_incompatible_obt_kinds_assignment)
17770 << DstType << SrcType << getOBTKindName(DstType)
17771 << getOBTKindName(SrcType);
17778 *Complained =
true;
17782 DiagKind = diag::err_typecheck_convert_incompatible;
17784 MayHaveConvFixit =
true;
17786 MayHaveFunctionDiff =
true;
17795 FirstType = DstType;
17796 SecondType = SrcType;
17806 FirstType = SrcType;
17807 SecondType = DstType;
17816 FDiag << FirstType << SecondType << ActionForDiag
17819 if (DiagKind == diag::ext_typecheck_convert_incompatible_pointer_sign ||
17820 DiagKind == diag::err_typecheck_convert_incompatible_pointer_sign) {
17830 if (!ConvHints.
isNull()) {
17835 if (MayHaveConvFixit) { FDiag << (
unsigned) (ConvHints.
Kind); }
17837 if (MayHaveFunctionDiff)
17841 if ((DiagKind == diag::warn_incompatible_qualified_id ||
17842 DiagKind == diag::err_incompatible_qualified_id) &&
17844 Diag(IFace->
getLocation(), diag::note_incomplete_class_and_qualified_id)
17847 if (SecondType ==
Context.OverloadTy)
17851 if (CheckInferredResultType)
17859 *Complained =
true;
17870 return S.
Diag(Loc, diag::err_ice_not_integral)
17874 return S.
Diag(Loc, diag::err_expr_not_ice) << S.
LangOpts.CPlusPlus;
17889 IDDiagnoser(
unsigned DiagID)
17893 return S.
Diag(Loc, DiagID);
17895 } Diagnoser(DiagID);
17908 return S.
Diag(Loc, diag::ext_expr_not_ice) << S.
LangOpts.CPlusPlus;
17930 BaseDiagnoser(BaseDiagnoser) {}
17939 return S.
Diag(Loc, diag::err_ice_incomplete_type) << T;
17944 return S.
Diag(Loc, diag::err_ice_explicit_conversion) << T << ConvTy;
17955 return S.
Diag(Loc, diag::err_ice_ambiguous_conversion) << T;
17966 llvm_unreachable(
"conversion functions are permitted");
17968 } ConvertDiagnoser(Diagnoser);
17974 E = Converted.
get();
17995 E = RValueExpr.
get();
18013 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
18014 diag::note_invalid_subexpr_in_const_expr) {
18015 DiagLoc = Notes[0].first;
18037 EvalResult.
Diag = &Notes;
18061 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
18062 diag::note_invalid_subexpr_in_const_expr) {
18063 DiagLoc = Notes[0].first;
18089 class TransformToPE :
public TreeTransform<TransformToPE> {
18093 TransformToPE(
Sema &SemaRef) : BaseTransform(SemaRef) { }
18096 bool AlwaysRebuild() {
return true; }
18097 bool ReplacingOriginal() {
return true; }
18106 ExprResult TransformDeclRefExpr(DeclRefExpr *E) {
18108 !SemaRef.isUnevaluatedContext())
18110 diag::err_invalid_non_static_member_use)
18113 return BaseTransform::TransformDeclRefExpr(E);
18117 ExprResult TransformUnaryOperator(UnaryOperator *E) {
18121 return BaseTransform::TransformUnaryOperator(E);
18129 return SkipLambdaBody(E, Body);
18136 "Should only transform unevaluated expressions");
18141 return TransformToPE(*this).TransformExpr(E);
18146 "Should only transform unevaluated expressions");
18150 return TransformToPE(*this).TransformType(TInfo);
18158 LambdaContextDecl, ExprContext);
18172 Prev.isImmediateFunctionContext() || Prev.isConstantEvaluated();
18175 Prev.InImmediateEscalatingFunctionContext;
18243 if (
const auto *E = dyn_cast<UnaryOperator>(PossibleDeref)) {
18244 if (E->getOpcode() == UO_Deref)
18245 return CheckPossibleDeref(S, E->getSubExpr());
18246 }
else if (
const auto *E = dyn_cast<ArraySubscriptExpr>(PossibleDeref)) {
18247 return CheckPossibleDeref(S, E->getBase());
18248 }
else if (
const auto *E = dyn_cast<MemberExpr>(PossibleDeref)) {
18249 return CheckPossibleDeref(S, E->getBase());
18250 }
else if (
const auto E = dyn_cast<DeclRefExpr>(PossibleDeref)) {
18253 if (
const auto *Ptr = Ty->
getAs<PointerType>())
18256 Inner = Arr->getElementType();
18260 if (Inner->
hasAttr(attr::NoDeref))
18270 const DeclRefExpr *DeclRef = CheckPossibleDeref(*
this, E);
18277 Diag(E->
getExprLoc(), diag::warn_dereference_of_noderef_type_no_decl)
18292 if (BO->getOpcode() == BO_Assign) {
18294 llvm::erase(LHSs, BO->getLHS());
18302 "Cannot mark an immediate escalating expression outside of an "
18303 "immediate escalating context");
18306 if (
auto *DeclRef =
18307 dyn_cast<DeclRefExpr>(
Call->getCallee()->IgnoreImplicit()))
18308 DeclRef->setIsImmediateEscalating(
true);
18309 }
else if (
auto *Ctr = dyn_cast<CXXConstructExpr>(E->
IgnoreImplicit())) {
18310 Ctr->setIsImmediateEscalating(
true);
18311 }
else if (
auto *DeclRef = dyn_cast<DeclRefExpr>(E->
IgnoreImplicit())) {
18312 DeclRef->setIsImmediateEscalating(
true);
18314 assert(
false &&
"expected an immediately escalating expression");
18317 FI->FoundImmediateEscalatingExpression =
true;
18332 if (
auto *DeclRef =
18333 dyn_cast<DeclRefExpr>(
Call->getCallee()->IgnoreImplicit()))
18342 auto CheckConstantExpressionAndKeepResult = [&]() {
18345 Eval,
getASTContext(), ConstantExprKind::ImmediateInvocation);
18347 Cached = std::move(Eval.
Val);
18355 !CheckConstantExpressionAndKeepResult()) {
18360 if (
Cleanup.exprNeedsCleanups()) {
18377 Cleanup.cleanupsHaveSideEffects(), {});
18390 ExprEvalContexts.back().ImmediateInvocationCandidates.emplace_back(Res, 0);
18398 Eval.
Diag = &Notes;
18402 if (!
Result || !Notes.empty()) {
18405 if (
auto *
FunctionalCast = dyn_cast<CXXFunctionalCastExpr>(InnerExpr))
18408 if (
auto *
Call = dyn_cast<CallExpr>(InnerExpr))
18410 else if (
auto *
Call = dyn_cast<CXXConstructExpr>(InnerExpr))
18411 FD =
Call->getConstructor();
18412 else if (
auto *Cast = dyn_cast<CastExpr>(InnerExpr))
18413 FD = dyn_cast_or_null<FunctionDecl>(Cast->getConversionFunction());
18416 "could not find an immediate function in this expression");
18423 SemaRef.
Diag(Context->Loc, diag::note_invalid_consteval_initializer)
18425 SemaRef.
Diag(Context->Decl->getBeginLoc(), diag::note_declared_at);
18429 for (
auto &
Note : Notes)
18441 llvm::SmallPtrSetImpl<DeclRefExpr *> &DRSet;
18445 ComplexRemove(
Sema &SemaRef, llvm::SmallPtrSetImpl<DeclRefExpr *> &DR,
18449 :
Base(SemaRef), DRSet(DR), IISet(II), CurrentII(Current) {}
18451 auto It = std::find_if(CurrentII, IISet.rend(),
18453 return Elem.getPointer() == E;
18459 if (It == IISet.rend()) {
18461 CurrentII->setInt(1);
18468 return Base::TransformConstantExpr(E);
18469 RemoveImmediateInvocation(E);
18470 return Base::TransformExpr(E->
getSubExpr());
18476 return Base::TransformCXXOperatorCallExpr(E);
18490 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(
Init))
18491 Init = ICE->getSubExpr();
18492 else if (
auto *ICE = dyn_cast<MaterializeTemporaryExpr>(
Init))
18493 Init = ICE->getSubExpr();
18499 if (
auto *CE = dyn_cast<ConstantExpr>(
Init);
18500 CE && CE->isImmediateInvocation())
18501 RemoveImmediateInvocation(CE);
18502 return Base::TransformInitializer(
Init, NotCopyInit);
18518 bool AlwaysRebuild() {
return false; }
18519 bool ReplacingOriginal() {
return true; }
18520 bool AllowSkippingCXXConstructExpr() {
18521 bool Res = AllowSkippingFirstCXXConstructExpr;
18522 AllowSkippingFirstCXXConstructExpr =
true;
18525 bool AllowSkippingFirstCXXConstructExpr =
true;
18536 Transformer.AllowSkippingFirstCXXConstructExpr =
false;
18538 ExprResult Res = Transformer.TransformExpr(It->getPointer()->getSubExpr());
18544 It->getPointer()->setSubExpr(Res.
get());
18564 if (VD && (VD->isUsableInConstantExpressions(
SemaRef.
Context) ||
18565 VD->hasConstantInitialization())) {
18598 llvm::SmallPtrSetImpl<DeclRefExpr *> &DRSet;
18599 SimpleRemove(llvm::SmallPtrSetImpl<DeclRefExpr *> &S) : DRSet(S) {}
18602 return DRSet.size();
18605 Visitor.TraverseStmt(
18615 if (DR->isImmediateEscalating())
18619 if (
const auto *MD = dyn_cast<CXXMethodDecl>(ND);
18621 ND = MD->getParent();
18628 bool ImmediateEscalating =
false;
18629 bool IsPotentiallyEvaluated =
18639 SemaRef.
Diag(DR->getBeginLoc(), diag::err_invalid_consteval_take_address)
18640 << ND << isa<CXXRecordDecl>(ND) << FD->isConsteval();
18641 if (!FD->getBuiltinID())
18645 SemaRef.
Diag(Context->Loc, diag::note_invalid_consteval_initializer)
18647 SemaRef.
Diag(Context->Decl->getBeginLoc(), diag::note_declared_at);
18649 if (FD->isImmediateEscalating() && !FD->isConsteval())
18663 (Rec.
ExprContext == ExpressionKind::EK_TemplateArgument ||
18671 D = diag::err_lambda_unevaluated_operand;
18677 D = diag::err_lambda_in_constant_expression;
18678 }
else if (Rec.
ExprContext == ExpressionKind::EK_TemplateArgument) {
18681 D = diag::err_lambda_in_invalid_context;
18683 llvm_unreachable(
"Couldn't infer lambda error message.");
18685 for (
const auto *L : Rec.
Lambdas)
18686 Diag(L->getBeginLoc(), D);
18706 Diag(BO->getBeginLoc(), diag::warn_deprecated_simple_assign_volatile)
18777 llvm_unreachable(
"Invalid context");
18823 : FD(FD), Param(Param) {}
18830 CCName =
"stdcall";
18833 CCName =
"fastcall";
18836 CCName =
"vectorcall";
18839 llvm_unreachable(
"CC does not need mangling");
18842 S.
Diag(Loc, diag::err_cconv_incomplete_param_type)
18843 << Param->getDeclName() << FD->
getDeclName() << CCName;
18848 ParamIncompleteTypeDiagnoser Diagnoser(FD, Param);
18854enum class OdrUseContext {
18873 if (Context.isUnevaluated())
18874 return OdrUseContext::None;
18877 return OdrUseContext::Dependent;
18879 if (Context.isDiscardedStatementContext())
18880 return OdrUseContext::FormallyOdrUsed;
18882 else if (Context.Context ==
18884 return OdrUseContext::FormallyOdrUsed;
18886 return OdrUseContext::Used;
18890 if (!
Func->isConstexpr())
18893 if (
Func->isImplicitlyInstantiable() || !
Func->isUserProvided())
18900 auto *CCD = dyn_cast<CXXConstructorDecl>(
Func);
18901 return CCD && CCD->getInheritedConstructor();
18905 bool MightBeOdrUse) {
18906 assert(
Func &&
"No function?");
18908 Func->setReferenced();
18921 OdrUseContext OdrUse =
18923 if (IsRecursiveCall && OdrUse == OdrUseContext::Used)
18924 OdrUse = OdrUseContext::FormallyOdrUsed;
18928 if (
Func->isTrivial() && !
Func->hasAttr<DLLExportAttr>() &&
18929 OdrUse == OdrUseContext::Used) {
18932 OdrUse = OdrUseContext::FormallyOdrUsed;
18934 OdrUse = OdrUseContext::FormallyOdrUsed;
18941 bool NeededForConstantEvaluation =
18966 bool NeedDefinition =
18967 !IsRecursiveCall &&
18968 (OdrUse == OdrUseContext::Used ||
18969 (NeededForConstantEvaluation && !
Func->isPureVirtual()));
18976 if (NeedDefinition &&
18978 Func->getMemberSpecializationInfo()))
18985 if (NeedDefinition && !
Func->getBody()) {
18988 dyn_cast<CXXConstructorDecl>(
Func)) {
19001 }
else if (
Constructor->getInheritedConstructor()) {
19005 dyn_cast<CXXDestructorDecl>(
Func)) {
19015 if (MethodDecl->isOverloadedOperator() &&
19016 MethodDecl->getOverloadedOperator() == OO_Equal) {
19018 if (MethodDecl->isDefaulted() && !MethodDecl->isDeleted()) {
19019 if (MethodDecl->isCopyAssignmentOperator())
19021 else if (MethodDecl->isMoveAssignmentOperator())
19025 MethodDecl->getParent()->isLambda()) {
19032 }
else if (MethodDecl->isVirtual() &&
getLangOpts().AppleKext)
19036 if (
Func->isDefaulted() && !
Func->isDeleted()) {
19044 if (
Func->isImplicitlyInstantiable()) {
19046 Func->getTemplateSpecializationKindForInstantiation();
19048 bool FirstInstantiation = PointOfInstantiation.
isInvalid();
19049 if (FirstInstantiation) {
19050 PointOfInstantiation = Loc;
19051 if (
auto *MSI =
Func->getMemberSpecializationInfo())
19052 MSI->setPointOfInstantiation(Loc);
19055 Func->setTemplateSpecializationKind(TSK, PointOfInstantiation);
19060 PointOfInstantiation = Loc;
19064 Func->isConstexpr()) {
19069 std::make_pair(
Func, PointOfInstantiation));
19070 else if (
Func->isConstexpr())
19076 Func->setInstantiationIsPending(
true);
19078 std::make_pair(
Func, PointOfInstantiation));
19079 if (llvm::isTimeTraceVerbose()) {
19080 llvm::timeTraceAddInstantEvent(
"DeferInstantiation", [&] {
19082 llvm::raw_string_ostream
OS(Name);
19089 Consumer.HandleCXXImplicitFunctionInstantiation(
Func);
19094 for (
auto *i :
Func->redecls()) {
19095 if (!i->isUsed(
false) && i->isImplicitlyInstantiable())
19113 if (
Init->isInClassMemberInitializer())
19115 MarkDeclarationsReferencedInExpr(Init->getInit());
19136 if (
LangOpts.OffloadImplicitHostDeviceTemplates &&
LangOpts.CUDAIsDevice &&
19141 if (OdrUse == OdrUseContext::Used && !
Func->isUsed(
false)) {
19143 if (!
Func->isDefined() && !
Func->isInAnotherModuleUnit()) {
19144 if (mightHaveNonExternalLinkage(
Func))
19146 else if (
Func->getMostRecentDecl()->isInlined() &&
19148 !
Func->getMostRecentDecl()->hasAttr<GNUInlineAttr>())
19166 if (
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
19167 if (
auto *Dtor = dyn_cast<CXXDestructorDecl>(
Func)) {
19187 const unsigned *
const FunctionScopeIndexToStopAt =
nullptr) {
19190 VarDecl *Var =
V->getPotentiallyDecomposedVarDecl();
19191 assert(Var &&
"expected a capturable variable");
19201 QualType CaptureType, DeclRefType;
19207 DeclRefType, FunctionScopeIndexToStopAt);
19222 << 2 << 1 << Var << UserTarget;
19225 ? diag::note_cuda_const_var_unpromoted
19226 : diag::note_cuda_host_var);
19235 Var->
hasAttr<CUDADeviceAttr>() &&
19236 !Var->
getAttr<CUDADeviceAttr>()->isImplicit())) &&
19237 !Var->
hasAttr<CUDASharedAttr>() &&
19253 (!FD || (!FD->getDescribedFunctionTemplate() &&
19265 unsigned CapturingScopeIndex) {
19292 unsigned ContextKind = 3;
19302 S.
Diag(loc, diag::err_reference_to_local_in_enclosing_context)
19303 << var << ValueKind << ContextKind << VarDC;
19304 S.
Diag(var->getLocation(), diag::note_entity_declared_at)
19313 bool &SubCapturesAreNested,
19319 SubCapturesAreNested =
true;
19372 "Only variables and structured bindings can be captured");
19383 S.
Diag(Loc, diag::err_lambda_capture_anonymous_var);
19392 S.
Diag(Loc, diag::err_ref_vm_type);
19403 S.
Diag(Loc, diag::err_ref_flexarray_type);
19405 S.
Diag(Loc, diag::err_lambda_capture_flexarray_type) << Var;
19410 const bool HasBlocksAttr = Var->
hasAttr<BlocksAttr>();
19415 S.
Diag(Loc, diag::err_capture_block_variable) << Var << !IsLambda;
19424 S.
Diag(Loc, diag::err_opencl_block_ref_block);
19435 ? diag::warn_cxx17_compat_capture_binding
19436 : diag::ext_capture_binding)
19450 bool ByRef =
false;
19456 if (BuildAndDiagnose) {
19457 S.
Diag(Loc, diag::err_ref_array_type);
19468 if (BuildAndDiagnose) {
19469 S.
Diag(Loc, diag::err_arc_autoreleasing_capture)
19485 if (BuildAndDiagnose) {
19487 S.
Diag(Loc, diag::warn_block_capture_autoreleasing);
19488 S.
Diag(VarLoc, diag::note_declare_parameter_strong);
19493 const bool HasBlocksAttr = Var->
hasAttr<BlocksAttr>();
19502 DeclRefType = CaptureType;
19506 if (BuildAndDiagnose)
19516 const bool BuildAndDiagnose,
QualType &CaptureType,
QualType &DeclRefType,
19517 const bool RefersToCapturedVariable,
TryCaptureKind Kind,
bool IsTopScope,
19543 CaptureType = DeclRefType;
19546 if (BuildAndDiagnose)
19547 RSI->
addCapture(Var,
false, ByRef, RefersToCapturedVariable,
19557 const bool RefersToCapturedVariable,
19562 bool ByRef =
false;
19566 ByRef = (LSI->
ImpCaptureStyle == LambdaScopeInfo::ImpCap_LambdaByref);
19571 S.
Diag(Loc, diag::err_wasm_ca_reference) << 0;
19602 if (!RefType->getPointeeType()->isFunctionType())
19609 if (BuildAndDiagnose) {
19610 S.
Diag(Loc, diag::err_arc_autoreleasing_capture) << 1;
19620 if (!
Invalid && BuildAndDiagnose) {
19624 diag::err_capture_of_incomplete_or_sizeless_type,
19628 diag::err_capture_of_abstract_type))
19654 if (BuildAndDiagnose)
19655 LSI->
addCapture(Var,
false, ByRef, RefersToCapturedVariable,
19656 Loc, EllipsisLoc, CaptureType,
Invalid);
19667 if (T.isTriviallyCopyableType(Context))
19671 if (!(RD = RD->getDefinition()))
19673 if (RD->hasSimpleCopyConstructor())
19675 if (RD->hasUserDeclaredCopyConstructor())
19677 if (Ctor->isCopyConstructor())
19678 return !Ctor->isDeleted();
19698 if (ShouldOfferCopyFix) {
19702 FixBuffer.assign({Separator, Var->
getName()});
19703 Sema.
Diag(VarInsertLoc, diag::note_lambda_variable_capture_fixit)
19708 FixBuffer.assign({Separator,
"&", Var->
getName()});
19709 Sema.
Diag(VarInsertLoc, diag::note_lambda_variable_capture_fixit)
19721 return !C.isThisCapture() && !C.isInitCapture();
19730 if (ShouldOfferCopyFix) {
19731 bool CanDefaultCopyCapture =
true;
19740 if (CanDefaultCopyCapture && llvm::none_of(LSI->
Captures, [](
Capture &
C) {
19741 return !C.isThisCapture() && !C.isInitCapture() && C.isCopyCapture();
19743 FixBuffer.assign({
"=", Separator});
19744 Sema.
Diag(DefaultInsertLoc, diag::note_lambda_default_capture_fixit)
19753 return !C.isInitCapture() && C.isReferenceCapture() &&
19754 !C.isThisCapture();
19756 FixBuffer.assign({
"&", Separator});
19757 Sema.
Diag(DefaultInsertLoc, diag::note_lambda_default_capture_fixit)
19766 QualType &DeclRefType,
const unsigned *
const FunctionScopeIndexToStopAt) {
19789 const auto *VD = dyn_cast<VarDecl>(Var);
19791 if (VD->isInitCapture())
19796 assert(VD &&
"Cannot capture a null variable");
19798 const unsigned MaxFunctionScopesIndex = FunctionScopeIndexToStopAt
19802 if (FunctionScopeIndexToStopAt) {
19803 assert(!
FunctionScopes.empty() &&
"No function scopes to stop at?");
19808 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(
FunctionScopes[FSIndex]);
19809 FSIndex && LSI && !LSI->AfterParameterList)
19811 assert(MaxFunctionScopesIndex <= FSIndex &&
19812 "FunctionScopeIndexToStopAt should be no greater than FSIndex into "
19813 "FunctionScopes.");
19814 while (FSIndex != MaxFunctionScopesIndex) {
19822 bool IsGlobal = !VD->hasLocalStorage();
19823 if (IsGlobal && !(
LangOpts.OpenMP &&
19824 OpenMP().isOpenMPCapturedDecl(Var,
true,
19825 MaxFunctionScopesIndex)))
19839 CaptureType = Var->
getType();
19841 bool Nested =
false;
19843 unsigned FunctionScopesIndex = MaxFunctionScopesIndex;
19848 LSI = dyn_cast_or_null<LambdaScopeInfo>(
19851 bool IsInScopeDeclarationContext =
19862 if (IsInScopeDeclarationContext &&
19863 FunctionScopesIndex == MaxFunctionScopesIndex && VarDC == DC)
19869 !IsInScopeDeclarationContext
19872 BuildAndDiagnose, *
this);
19878 FunctionScopesIndex = MaxFunctionScopesIndex - 1;
19897 if (
const auto *Parm = dyn_cast<ParmVarDecl>(Var);
19898 Parm && Parm->getDeclContext() == DC)
19906 if (BuildAndDiagnose) {
19909 Diag(ExprLoc, diag::err_lambda_impcap) << Var;
19924 if (
ParmVarDecl *PVD = dyn_cast_or_null<ParmVarDecl>(Var))
19925 QTy = PVD->getOriginalType();
19930 if (
auto *RSI = dyn_cast<CapturedRegionScopeInfo>(CSI)) {
19937 if (BuildAndDiagnose) {
19938 Diag(ExprLoc, diag::err_capture_binding_openmp) << Var;
19944 Var, RSI->OpenMPLevel, RSI->OpenMPCaptureLevel);
19949 if (IsOpenMPPrivateDecl != OMPC_unknown &&
19952 if (
ParmVarDecl *PVD = dyn_cast_or_null<ParmVarDecl>(Var))
19953 QTy = PVD->getOriginalType();
19955 E =
OpenMP().getNumberOfConstructScopes(RSI->OpenMPLevel);
19959 assert(RSI->OpenMPLevel == OuterRSI->OpenMPLevel &&
19960 "Wrong number of captured regions associated with the "
19961 "OpenMP construct.");
19966 IsOpenMPPrivateDecl != OMPC_private &&
19968 RSI->OpenMPCaptureLevel);
19972 Var, RSI->OpenMPLevel, RSI->OpenMPCaptureLevel);
19978 OpenMP().adjustOpenMPTargetScopeIndex(FunctionScopesIndex,
19981 if (IsTargetCap || IsOpenMPPrivateDecl == OMPC_private ||
19982 (IsGlobal && !IsGlobalCap)) {
19983 Nested = !IsTargetCap;
19989 CaptureType =
Context.getLValueReferenceType(DeclRefType);
19998 if (BuildAndDiagnose) {
19999 Diag(ExprLoc, diag::err_lambda_impcap) << Var;
20021 FunctionScopesIndex--;
20022 if (IsInScopeDeclarationContext)
20024 }
while (!VarDC->
Equals(DC));
20032 for (
unsigned I = ++FunctionScopesIndex, N = MaxFunctionScopesIndex + 1; I != N;
20045 if (
Invalid && !BuildAndDiagnose)
20050 DeclRefType, Nested, *
this,
Invalid);
20054 RSI, Var, ExprLoc, BuildAndDiagnose, CaptureType, DeclRefType, Nested,
20055 Kind, I == N - 1, *
this,
Invalid);
20061 DeclRefType, Nested, Kind, EllipsisLoc,
20066 if (
Invalid && !BuildAndDiagnose)
20078 DeclRefType,
nullptr);
20086 false, CaptureType, DeclRefType,
nullptr);
20090 assert(Var &&
"Null value cannot be captured");
20097 false, CaptureType, DeclRefType,
20101 return DeclRefType;
20109class CopiedTemplateArgs {
20113 template<
typename RefExpr>
20114 CopiedTemplateArgs(RefExpr *E) : HasArgs(E->hasExplicitTemplateArgs()) {
20116 E->copyTemplateArgumentsInto(TemplateArgStorage);
20119#ifdef __has_cpp_attribute
20120#if __has_cpp_attribute(clang::lifetimebound)
20121 [[clang::lifetimebound]]
20125 return HasArgs ? &TemplateArgStorage :
nullptr;
20151 auto Rebuild = [&](
Expr *Sub) {
20156 auto IsPotentialResultOdrUsed = [&](
NamedDecl *D) {
20159 auto *VD = dyn_cast<VarDecl>(D);
20182 llvm_unreachable(
"unexpected non-odr-use-reason");
20186 if (VD->getType()->isReferenceType())
20188 if (
auto *RD = VD->getType()->getAsCXXRecordDecl())
20189 if (RD->hasDefinition() && RD->hasMutableFields())
20191 if (!VD->isUsableInConstantExpressions(S.
Context))
20196 if (VD->getType()->isReferenceType())
20204 auto MaybeCUDAODRUsed = [&]() ->
bool {
20210 auto *DRE = dyn_cast<DeclRefExpr>(E);
20213 auto *VD = dyn_cast<VarDecl>(DRE->getDecl());
20220 auto MarkNotOdrUsed = [&] {
20221 if (!MaybeCUDAODRUsed()) {
20224 LSI->markVariableExprAsNonODRUsed(E);
20232 case Expr::DeclRefExprClass: {
20234 if (DRE->isNonOdrUse() || IsPotentialResultOdrUsed(DRE->getDecl()))
20240 S.
Context, DRE->getQualifierLoc(), DRE->getTemplateKeywordLoc(),
20241 DRE->getDecl(), DRE->refersToEnclosingVariableOrCapture(),
20242 DRE->getNameInfo(), DRE->getType(), DRE->getValueKind(),
20243 DRE->getFoundDecl(), CopiedTemplateArgs(DRE), NOUR);
20246 case Expr::FunctionParmPackExprClass: {
20251 if (IsPotentialResultOdrUsed(D))
20262 case Expr::ArraySubscriptExprClass: {
20268 if (!
Base.isUsable())
20270 Expr *LHS = ASE->getBase() == ASE->getLHS() ?
Base.get() : ASE->getLHS();
20271 Expr *RHS = ASE->getBase() == ASE->getRHS() ?
Base.get() : ASE->getRHS();
20274 ASE->getRBracketLoc());
20277 case Expr::MemberExprClass: {
20283 if (!
Base.isUsable())
20286 S.
Context,
Base.get(), ME->isArrow(), ME->getOperatorLoc(),
20287 ME->getQualifierLoc(), ME->getTemplateKeywordLoc(),
20288 ME->getMemberDecl(), ME->getFoundDecl(), ME->getMemberNameInfo(),
20289 CopiedTemplateArgs(ME), ME->getType(), ME->getValueKind(),
20290 ME->getObjectKind(), ME->isNonOdrUse());
20293 if (ME->getMemberDecl()->isCXXInstanceMember())
20298 if (ME->isNonOdrUse() || IsPotentialResultOdrUsed(ME->getMemberDecl()))
20304 S.
Context, ME->getBase(), ME->isArrow(), ME->getOperatorLoc(),
20305 ME->getQualifierLoc(), ME->getTemplateKeywordLoc(), ME->getMemberDecl(),
20306 ME->getFoundDecl(), ME->getMemberNameInfo(), CopiedTemplateArgs(ME),
20307 ME->getType(), ME->getValueKind(), ME->getObjectKind(), NOUR);
20310 case Expr::BinaryOperatorClass: {
20312 Expr *LHS = BO->getLHS();
20313 Expr *RHS = BO->getRHS();
20315 if (BO->getOpcode() == BO_PtrMemD) {
20317 if (!Sub.isUsable())
20319 BO->setLHS(Sub.get());
20321 }
else if (BO->getOpcode() == BO_Comma) {
20323 if (!Sub.isUsable())
20325 BO->setRHS(Sub.get());
20333 case Expr::ParenExprClass: {
20336 if (!Sub.isUsable())
20338 return S.
ActOnParenExpr(PE->getLParen(), PE->getRParen(), Sub.get());
20343 case Expr::ConditionalOperatorClass: {
20354 LHS = CO->getLHS();
20356 RHS = CO->getRHS();
20358 CO->getCond(), LHS.
get(), RHS.
get());
20363 case Expr::UnaryOperatorClass: {
20365 if (UO->getOpcode() != UO_Extension)
20368 if (!Sub.isUsable())
20370 return S.
BuildUnaryOp(
nullptr, UO->getOperatorLoc(), UO_Extension,
20377 case Expr::GenericSelectionExprClass: {
20381 bool AnyChanged =
false;
20382 for (
Expr *OrigAssocExpr : GSE->getAssocExprs()) {
20383 ExprResult AssocExpr = Rebuild(OrigAssocExpr);
20387 AssocExprs.push_back(AssocExpr.
get());
20390 AssocExprs.push_back(OrigAssocExpr);
20394 void *ExOrTy =
nullptr;
20395 bool IsExpr = GSE->isExprPredicate();
20397 ExOrTy = GSE->getControllingExpr();
20399 ExOrTy = GSE->getControllingType();
20401 GSE->getGenericLoc(), GSE->getDefaultLoc(),
20402 GSE->getRParenLoc(), IsExpr, ExOrTy,
20403 GSE->getAssocTypeSourceInfos(), AssocExprs)
20411 case Expr::ChooseExprClass: {
20422 if (!LHS.
get() && !RHS.
get())
20425 LHS = CE->getLHS();
20427 RHS = CE->getRHS();
20430 RHS.
get(), CE->getRParenLoc());
20434 case Expr::ConstantExprClass: {
20437 if (!Sub.isUsable())
20444 case Expr::ImplicitCastExprClass: {
20449 switch (ICE->getCastKind()) {
20451 case CK_DerivedToBase:
20452 case CK_UncheckedDerivedToBase: {
20453 ExprResult Sub = Rebuild(ICE->getSubExpr());
20454 if (!Sub.isUsable())
20458 ICE->getValueKind(), &Path);
20515 for (
Expr *E : LocalMaybeODRUseExprs) {
20516 if (
auto *DRE = dyn_cast<DeclRefExpr>(E)) {
20518 DRE->getLocation(), *
this);
20519 }
else if (
auto *ME = dyn_cast<MemberExpr>(E)) {
20522 }
else if (
auto *FP = dyn_cast<FunctionParmPackExpr>(E)) {
20526 llvm_unreachable(
"Unexpected expression");
20531 "MarkVarDeclODRUsed failed to cleanup MaybeODRUseExprs?");
20540 const bool RefersToEnclosingScope =
20543 if (RefersToEnclosingScope) {
20558 assert(E &&
"Capture variable should be used in an expression.");
20571 "Invalid Expr argument to DoMarkVarDeclReferenced");
20582 bool UsableInConstantExpr =
20601 bool NeededForConstantEvaluation =
20604 bool NeedDefinition =
20605 OdrUse == OdrUseContext::Used || NeededForConstantEvaluation ||
20607 Var->
getType()->isUndeducedType());
20610 "Can't instantiate a partial template specialization.");
20627 bool TryInstantiating =
20631 if (TryInstantiating) {
20634 bool FirstInstantiation = PointOfInstantiation.
isInvalid();
20635 if (FirstInstantiation) {
20636 PointOfInstantiation = Loc;
20638 MSI->setPointOfInstantiation(PointOfInstantiation);
20660 if (
auto *DRE = dyn_cast_or_null<DeclRefExpr>(E))
20661 DRE->setDecl(DRE->getDecl());
20662 else if (
auto *ME = dyn_cast_or_null<MemberExpr>(E))
20663 ME->setMemberDecl(ME->getMemberDecl());
20664 }
else if (FirstInstantiation) {
20666 .push_back(std::make_pair(Var, PointOfInstantiation));
20668 bool Inserted =
false;
20670 auto Iter = llvm::find_if(
20672 return P.first == Var;
20674 if (Iter != I.end()) {
20689 .push_back(std::make_pair(Var, PointOfInstantiation));
20713 if (
DeclRefExpr *DRE = dyn_cast_or_null<DeclRefExpr>(E))
20714 if (DRE->isNonOdrUse())
20716 if (
MemberExpr *ME = dyn_cast_or_null<MemberExpr>(E))
20717 if (ME->isNonOdrUse())
20721 case OdrUseContext::None:
20726 "missing non-odr-use marking for unevaluated decl ref");
20729 case OdrUseContext::FormallyOdrUsed:
20734 case OdrUseContext::Used:
20743 case OdrUseContext::Dependent:
20761 if (OdrUse == OdrUseContext::Used) {
20762 QualType CaptureType, DeclRefType;
20768 }
else if (OdrUse == OdrUseContext::Dependent) {
20784 auto *ID = dyn_cast<DeclRefExpr>(E);
20785 if (!ID || ID->isTypeDependent() || !ID->refersToEnclosingVariableOrCapture())
20792 auto IsDependent = [&]() {
20794 auto *LSI = dyn_cast<sema::LambdaScopeInfo>(
Scope);
20799 LSI->AfterParameterList)
20802 const auto *MD = LSI->CallOperator;
20803 if (MD->getType().isNull())
20807 if (!Ty || !MD->isExplicitObjectMemberFunction() ||
20811 if (
auto *
C = LSI->CaptureMap.count(D) ? &LSI->getCapture(D) :
nullptr) {
20812 if (
C->isCopyCapture())
20817 if (LSI->ImpCaptureStyle == LambdaScopeInfo::ImpCap_LambdaByval)
20823 ID->setCapturedByCopyInLambdaWithExplicitObjectParameter(
20829 bool MightBeOdrUse,
20837 if (
VarDecl *Var = dyn_cast<VarDecl>(D)) {
20856 const MemberExpr *ME = dyn_cast<MemberExpr>(E);
20863 bool IsVirtualCall = MD->
isVirtual() &&
20865 if (!IsVirtualCall)
20882 bool OdrUse =
true;
20884 if (
Method->isVirtual() &&
20888 if (
auto *FD = dyn_cast<FunctionDecl>(E->
getDecl())) {
20893 !FD->isDependentContext())
20907 bool MightBeOdrUse =
true;
20910 if (
Method->isPureVirtual())
20911 MightBeOdrUse =
false;
20930 bool MightBeOdrUse) {
20931 if (MightBeOdrUse) {
20932 if (
auto *VD = dyn_cast<VarDecl>(D)) {
20937 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
20963bool MarkReferencedDecls::TraverseTemplateArgument(
20964 const TemplateArgument &Arg) {
20967 EnterExpressionEvaluationContext
Evaluated(
20981 MarkReferencedDecls Marker(*
this, Loc);
20982 Marker.TraverseType(T);
20988class EvaluatedExprMarker :
public UsedDeclVisitor<EvaluatedExprMarker> {
20991 bool SkipLocalVariables;
20994 EvaluatedExprMarker(
Sema &S,
bool SkipLocalVariables,
20996 : Inherited(S), SkipLocalVariables(SkipLocalVariables), StopAt(StopAt) {}
21002 void Visit(Expr *E) {
21003 if (llvm::is_contained(StopAt, E))
21005 Inherited::Visit(E);
21008 void VisitConstantExpr(ConstantExpr *E) {
21013 void VisitDeclRefExpr(DeclRefExpr *E) {
21015 if (SkipLocalVariables) {
21016 if (VarDecl *VD = dyn_cast<VarDecl>(E->
getDecl()))
21017 if (VD->hasLocalStorage())
21027 void VisitMemberExpr(MemberExpr *E) {
21035 bool SkipLocalVariables,
21037 EvaluatedExprMarker(*
this, SkipLocalVariables, StopAt).Visit(E);
21049 (
Decl->isConstexpr() || (
Decl->isStaticDataMember() &&
21053 if (Stmts.empty()) {
21067 if (
Decl &&
Decl->isFileVarDecl()) {
21140 class CallReturnIncompleteDiagnoser :
public TypeDiagnoser {
21146 : FD(FD), CE(CE) { }
21150 S.
Diag(Loc, diag::err_call_incomplete_return)
21155 S.
Diag(Loc, diag::err_call_function_incomplete_return)
21160 } Diagnoser(FD, CE);
21173 unsigned diagnostic = diag::warn_condition_is_assignment;
21174 bool IsOrAssign =
false;
21177 if (Op->getOpcode() != BO_Assign && Op->getOpcode() != BO_OrAssign)
21180 IsOrAssign = Op->getOpcode() == BO_OrAssign;
21188 if (
ObjC().isSelfExpr(Op->getLHS()) && ME->getMethodFamily() ==
OMF_init)
21189 diagnostic = diag::warn_condition_is_idiomatic_assignment;
21193 diagnostic = diag::warn_condition_is_idiomatic_assignment;
21196 Loc = Op->getOperatorLoc();
21198 if (Op->getOperator() != OO_Equal && Op->getOperator() != OO_PipeEqual)
21201 IsOrAssign = Op->getOperator() == OO_PipeEqual;
21202 Loc = Op->getOperatorLoc();
21214 Diag(Loc, diag::note_condition_assign_silence)
21219 Diag(Loc, diag::note_condition_or_assign_to_comparison)
21222 Diag(Loc, diag::note_condition_assign_to_comparison)
21240 if (opE->getOpcode() == BO_EQ &&
21241 opE->getLHS()->IgnoreParenImpCasts()->isModifiableLvalue(
Context)
21247 Diag(Loc, diag::note_equality_comparison_silence)
21250 Diag(Loc, diag::note_equality_comparison_to_assign)
21256 bool IsConstexpr) {
21258 if (
ParenExpr *parenE = dyn_cast<ParenExpr>(E))
21278 if (!T->isScalarType()) {
21279 Diag(Loc, diag::err_typecheck_statement_requires_scalar)
21283 CheckBoolLikeConversion(E, Loc);
21312 if (
Cond.isInvalid()) {
21320 if (!
Cond.isUsable())
21330 struct RebuildUnknownAnyFunction
21331 :
StmtVisitor<RebuildUnknownAnyFunction, ExprResult> {
21335 RebuildUnknownAnyFunction(
Sema &S) : S(S) {}
21338 llvm_unreachable(
"unexpected statement!");
21349 template <
class T>
ExprResult rebuildSugarExpr(T *E) {
21350 ExprResult SubResult = Visit(E->getSubExpr());
21353 Expr *SubExpr = SubResult.
get();
21354 E->setSubExpr(SubExpr);
21355 E->setType(SubExpr->
getType());
21362 return rebuildSugarExpr(E);
21365 ExprResult VisitUnaryExtension(UnaryOperator *E) {
21366 return rebuildSugarExpr(E);
21369 ExprResult VisitUnaryAddrOf(UnaryOperator *E) {
21373 Expr *SubExpr = SubResult.
get();
21381 ExprResult resolveDecl(Expr *E, ValueDecl *VD) {
21399 ExprResult VisitDeclRefExpr(DeclRefExpr *E) {
21400 return resolveDecl(E, E->
getDecl());
21418 struct RebuildUnknownAnyExpr
21419 : StmtVisitor<RebuildUnknownAnyExpr, ExprResult> {
21426 RebuildUnknownAnyExpr(Sema &S, QualType
CastType)
21430 llvm_unreachable(
"unexpected statement!");
21440 ExprResult VisitObjCMessageExpr(ObjCMessageExpr *E);
21444 template <
class T>
ExprResult rebuildSugarExpr(T *E) {
21445 ExprResult SubResult = Visit(E->getSubExpr());
21447 Expr *SubExpr = SubResult.
get();
21448 E->setSubExpr(SubExpr);
21449 E->setType(SubExpr->
getType());
21456 return rebuildSugarExpr(E);
21459 ExprResult VisitUnaryExtension(UnaryOperator *E) {
21460 return rebuildSugarExpr(E);
21463 ExprResult VisitUnaryAddrOf(UnaryOperator *E) {
21464 const PointerType *Ptr = DestType->
getAs<PointerType>();
21489 ExprResult VisitImplicitCastExpr(ImplicitCastExpr *E);
21491 ExprResult resolveDecl(Expr *E, ValueDecl *VD);
21497 ExprResult VisitDeclRefExpr(DeclRefExpr *E) {
21498 return resolveDecl(E, E->
getDecl());
21504ExprResult RebuildUnknownAnyExpr::VisitCallExpr(CallExpr *E) {
21509 FK_FunctionPointer,
21514 QualType CalleeType = CalleeExpr->
getType();
21517 Kind = FK_MemberFunction;
21519 }
else if (
const PointerType *Ptr = CalleeType->
getAs<PointerType>()) {
21521 Kind = FK_FunctionPointer;
21524 Kind = FK_BlockPointer;
21526 const FunctionType *FnType = CalleeType->
castAs<FunctionType>();
21531 unsigned diagID = diag::err_func_returning_array_function;
21532 if (Kind == FK_BlockPointer)
21533 diagID = diag::err_block_returning_array_function;
21546 const FunctionProtoType *Proto = dyn_cast<FunctionProtoType>(FnType);
21568 SmallVector<QualType, 8> ArgTypes;
21569 if (ParamTypes.empty() && Proto->
isVariadic()) {
21571 for (
unsigned i = 0, e = E->
getNumArgs(); i != e; ++i) {
21574 ParamTypes = ArgTypes;
21585 case FK_MemberFunction:
21589 case FK_FunctionPointer:
21593 case FK_BlockPointer:
21599 ExprResult CalleeResult = Visit(CalleeExpr);
21607ExprResult RebuildUnknownAnyExpr::VisitObjCMessageExpr(ObjCMessageExpr *E) {
21610 S.
Diag(E->
getExprLoc(), diag::err_func_returning_array_function)
21618 Method->setReturnType(DestType);
21628ExprResult RebuildUnknownAnyExpr::VisitImplicitCastExpr(ImplicitCastExpr *E) {
21630 if (E->
getCastKind() == CK_FunctionToPointerDecay) {
21644 }
else if (E->
getCastKind() == CK_LValueToRValue) {
21661 llvm_unreachable(
"Unhandled cast type!");
21665ExprResult RebuildUnknownAnyExpr::resolveDecl(Expr *E, ValueDecl *VD) {
21667 QualType
Type = DestType;
21672 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(VD)) {
21673 if (
const PointerType *Ptr =
Type->getAs<PointerType>()) {
21681 if (!
Type->isFunctionType()) {
21686 if (
const FunctionProtoType *FT =
Type->getAs<FunctionProtoType>()) {
21690 QualType FDT = FD->getType();
21691 const FunctionType *FnType = FDT->
castAs<FunctionType>();
21692 const FunctionProtoType *Proto = dyn_cast_or_null<FunctionProtoType>(FnType);
21693 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E);
21694 if (DRE && Proto && Proto->getParamTypes().empty() && Proto->isVariadic()) {
21695 SourceLocation Loc = FD->getLocation();
21697 S.
Context, FD->getDeclContext(), Loc, Loc,
21698 FD->getNameInfo().getName(), DestType, FD->getTypeSourceInfo(),
21700 false , FD->hasPrototype(),
21703 if (FD->getQualifier())
21706 SmallVector<ParmVarDecl*, 16> Params;
21707 for (
const auto &AI : FT->param_types()) {
21708 ParmVarDecl *Param =
21711 Params.push_back(Param);
21713 NewFD->setParams(Params);
21719 if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD))
21720 if (MD->isInstance()) {
21731 if (
const ReferenceType *RefTy =
Type->getAs<ReferenceType>()) {
21732 Type = RefTy->getPointeeType();
21733 }
else if (
Type->isFunctionType()) {
21734 S.
Diag(E->
getExprLoc(), diag::err_unknown_any_var_function_type)
21760 diag::err_typecheck_cast_to_incomplete))
21775 return RebuildUnknownAnyExpr(*
this, ToType).Visit(E);
21782 ExplicitCastExpr *castArg = dyn_cast<ExplicitCastExpr>(arg->IgnoreParens());
21791 assert(!arg->hasPlaceholderType());
21803 unsigned diagID = diag::err_uncasted_use_of_unknown_any;
21806 if (
CallExpr *call = dyn_cast<CallExpr>(E)) {
21807 E = call->getCallee();
21808 diagID = diag::err_uncasted_call_of_unknown_any;
21816 if (
DeclRefExpr *ref = dyn_cast<DeclRefExpr>(E)) {
21817 loc = ref->getLocation();
21818 d = ref->getDecl();
21819 }
else if (
MemberExpr *mem = dyn_cast<MemberExpr>(E)) {
21820 loc = mem->getMemberLoc();
21821 d = mem->getMemberDecl();
21823 diagID = diag::err_uncasted_call_of_unknown_any;
21824 loc = msg->getSelectorStartLoc();
21825 d = msg->getMethodDecl();
21827 S.
Diag(loc, diag::err_uncasted_send_to_unknown_any_method)
21828 <<
static_cast<unsigned>(msg->isClassMessage()) << msg->getSelector()
21846 if (!placeholderType)
return E;
21848 switch (placeholderType->
getKind()) {
21849 case BuiltinType::UnresolvedTemplate: {
21862 if (
auto *TD = dyn_cast<TemplateDecl>(Temp))
21863 TN =
Context.getQualifiedTemplateName(NNS, ULE->hasTemplateKeyword(),
21868 Diag(NameInfo.
getLoc(), diag::err_template_kw_refers_to_type_template)
21869 << TN << ULE->getSourceRange() << IsTypeAliasTemplateDecl;
21871 << IsTypeAliasTemplateDecl;
21874 bool HasAnyDependentTA =
false;
21876 HasAnyDependentTA |= Arg.getArgument().
isDependent();
21888 TST =
Context.getTemplateSpecializationType(
21897 case BuiltinType::Overload: {
21917 case BuiltinType::BoundMember: {
21923 PD =
PDiag(diag::err_dtor_expr_without_call) << 1;
21924 }
else if (
const auto *ME = dyn_cast<MemberExpr>(BME)) {
21925 if (ME->getMemberNameInfo().getName().getNameKind() ==
21927 PD =
PDiag(diag::err_dtor_expr_without_call) << 0;
21935 case BuiltinType::ARCUnbridgedCast: {
21942 case BuiltinType::UnknownAny:
21946 case BuiltinType::PseudoObject:
21949 case BuiltinType::BuiltinFn: {
21954 unsigned BuiltinID = FD->getBuiltinID();
21955 if (BuiltinID == Builtin::BI__noop) {
21957 CK_BuiltinFnToFnPtr)
21964 if (
Context.BuiltinInfo.isInStdNamespace(BuiltinID)) {
21970 ? diag::err_use_of_unaddressable_function
21971 : diag::warn_cxx20_compat_use_of_unaddressable_function);
21972 if (FD->isImplicitlyInstantiable()) {
21999 case BuiltinType::IncompleteMatrixIdx: {
22005 MS->getBase(), MS->getRowIdx(), E->
getExprLoc());
22007 Diag(MS->getRowIdx()->getBeginLoc(), diag::err_matrix_incomplete_index);
22012 case BuiltinType::ArraySection:
22021 case BuiltinType::OMPArrayShaping:
22024 case BuiltinType::OMPIterator:
22028#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
22029 case BuiltinType::Id:
22030#include "clang/Basic/OpenCLImageTypes.def"
22031#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
22032 case BuiltinType::Id:
22033#include "clang/Basic/OpenCLExtensionTypes.def"
22034#define SVE_TYPE(Name, Id, SingletonId) \
22035 case BuiltinType::Id:
22036#include "clang/Basic/AArch64ACLETypes.def"
22037#define PPC_VECTOR_TYPE(Name, Id, Size) \
22038 case BuiltinType::Id:
22039#include "clang/Basic/PPCTypes.def"
22040#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
22041#include "clang/Basic/RISCVVTypes.def"
22042#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
22043#include "clang/Basic/WebAssemblyReferenceTypes.def"
22044#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
22045#include "clang/Basic/AMDGPUTypes.def"
22046#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
22047#include "clang/Basic/HLSLIntangibleTypes.def"
22048#define BUILTIN_TYPE(Id, SingletonId) case BuiltinType::Id:
22049#define PLACEHOLDER_TYPE(Id, SingletonId)
22050#include "clang/AST/BuiltinTypes.def"
22054 llvm_unreachable(
"invalid placeholder type!");
22067 if (!
Context.getLangOpts().RecoveryAST)
22073 if (T.isNull() || T->isUndeducedType() ||
22074 !
Context.getLangOpts().RecoveryASTType)
Defines the clang::ASTContext interface.
This file provides some common utility functions for processing Lambda related AST Constructs.
static bool isObjCPointer(const MemRegion *R)
Defines enum values for all the target-independent builtin functions.
This file defines the classes used to store parsed information about declaration-specifiers and decla...
Defines the C++ template declaration subclasses.
Defines the classes clang::DelayedDiagnostic and clang::AccessedEntity.
Defines the clang::Expr interface and subclasses for C++ expressions.
Result
Implement __builtin_bit_cast and related operations.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Target Target
llvm::MachO::Record Record
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
Defines the clang::Preprocessor interface.
static QualType getUnderlyingType(const SubRegion *R)
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
This file declares semantic analysis functions specific to AMDGPU.
This file declares semantic analysis functions specific to ARM.
This file declares semantic analysis for CUDA constructs.
static void DetectPrecisionLossInComplexDivision(Sema &S, QualType DivisorTy, SourceLocation OpLoc)
static void HandleImmediateInvocations(Sema &SemaRef, Sema::ExpressionEvaluationContextRecord &Rec)
static ExprResult BuildCookedLiteralOperatorCall(Sema &S, Scope *Scope, IdentifierInfo *UDSuffix, SourceLocation UDSuffixLoc, ArrayRef< Expr * > Args, SourceLocation LitEndLoc)
BuildCookedLiteralOperatorCall - A user-defined literal was found.
static ExprResult BuildOverloadedBinOp(Sema &S, Scope *Sc, SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHS, Expr *RHS)
Build an overloaded binary operator expression in the given scope.
static bool canConvertIntTyToFloatTy(Sema &S, ExprResult *Int, QualType FloatTy)
Test if a (constant) integer Int can be casted to floating point type FloatTy without losing precisio...
static bool checkArithmeticOpPointerOperand(Sema &S, SourceLocation Loc, Expr *Operand)
Check the validity of an arithmetic pointer operand.
static void DiagnoseBitwisePrecedence(Sema &Self, BinaryOperatorKind Opc, SourceLocation OpLoc, Expr *LHSExpr, Expr *RHSExpr)
DiagnoseBitwisePrecedence - Emit a warning when bitwise and comparison operators are mixed in a way t...
static bool isPlaceholderToRemoveAsArg(QualType type)
Is the given type a placeholder that we need to lower out immediately during argument processing?
static void diagnoseArithmeticOnNullPointer(Sema &S, SourceLocation Loc, Expr *Pointer, bool IsGNUIdiom)
Diagnose invalid arithmetic on a null pointer.
static void DiagnoseConditionalPrecedence(Sema &Self, SourceLocation OpLoc, Expr *Condition, const Expr *LHSExpr, const Expr *RHSExpr)
DiagnoseConditionalPrecedence - Emit a warning when a conditional operator and binary operator are mi...
static bool CheckDeclInExpr(Sema &S, SourceLocation Loc, NamedDecl *D, bool AcceptInvalid)
Diagnoses obvious problems with the use of the given declaration as an expression.
static void diagnoseUncapturableValueReferenceOrBinding(Sema &S, SourceLocation loc, ValueDecl *var)
static QualType checkConditionalObjectPointersCompatibility(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc)
Return the resulting type when the operands are both pointers.
static QualType OpenCLCheckVectorConditional(Sema &S, ExprResult &Cond, ExprResult &LHS, ExprResult &RHS, SourceLocation QuestionLoc)
Return the resulting type for the conditional operator in OpenCL (aka "ternary selection operator",...
static void diagnoseLogicalNotOnLHSofCheck(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
Warns on !x < y, !x & y where !(x < y), !(x & y) was probably intended.
static void diagnoseArithmeticOnFunctionPointer(Sema &S, SourceLocation Loc, Expr *Pointer)
Diagnose invalid arithmetic on a function pointer.
static AssignConvertType checkObjCPointerTypesForAssignment(Sema &S, QualType LHSType, QualType RHSType)
checkObjCPointerTypesForAssignment - Compares two objective-c pointer types for assignment compatibil...
static void diagnoseObjCLiteralComparison(Sema &S, SourceLocation Loc, ExprResult &LHS, ExprResult &RHS, BinaryOperator::Opcode Opc)
static bool isParenthetizedAndQualifiedAddressOfExpr(Expr *Fn)
static bool isCapturingReferenceToHostVarInCUDADeviceLambda(const Sema &S, VarDecl *VD)
static UnaryOperatorKind ConvertTokenKindToUnaryOpcode(tok::TokenKind Kind)
static bool isImplicitlyDefinableConstexprFunction(FunctionDecl *Func)
NonConstCaptureKind
Is the given expression (which must be 'const') a reference to a variable which was originally non-co...
static bool tryVectorConvertAndSplat(Sema &S, ExprResult *scalar, QualType scalarTy, QualType vectorEltTy, QualType vectorTy, unsigned &DiagID)
Try to convert a value of non-vector type to a vector type by converting the type to the element type...
static bool isVector(QualType QT, QualType ElementType)
This helper function returns true if QT is a vector type that has element type ElementType.
static void DiagnoseCalleeStaticArrayParam(Sema &S, ParmVarDecl *PVD)
static Expr * recoverFromMSUnqualifiedLookup(Sema &S, ASTContext &Context, DeclarationNameInfo &NameInfo, SourceLocation TemplateKWLoc, const TemplateArgumentListInfo *TemplateArgs)
In Microsoft mode, if we are inside a template class whose parent class has dependent base classes,...
static AssignConvertType checkBlockPointerTypesForAssignment(Sema &S, QualType LHSType, QualType RHSType)
checkBlockPointerTypesForAssignment - This routine determines whether two block pointer types are com...
static void FixDependencyOfIdExpressionsInLambdaWithDependentObjectParameter(Sema &SemaRef, ValueDecl *D, Expr *E)
static bool isVariableCapturable(CapturingScopeInfo *CSI, ValueDecl *Var, SourceLocation Loc, const bool Diagnose, Sema &S)
static bool maybeDiagnoseAssignmentToFunction(Sema &S, QualType DstType, const Expr *SrcExpr)
static void SuggestParentheses(Sema &Self, SourceLocation Loc, const PartialDiagnostic &Note, SourceRange ParenRange)
SuggestParentheses - Emit a note with a fixit hint that wraps ParenRange in parentheses.
static Decl * getPredefinedExprDecl(DeclContext *DC)
getPredefinedExprDecl - Returns Decl of a given DeclContext that can be used to determine the value o...
static CXXRecordDecl * LookupStdSourceLocationImpl(Sema &S, SourceLocation Loc)
static bool IgnoreCommaOperand(const Expr *E, const ASTContext &Context)
static QualType CheckRealImagOperand(Sema &S, ExprResult &V, SourceLocation Loc, bool IsReal)
static QualType checkArithmeticOrEnumeralCompare(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
static QualType CheckIndirectionOperand(Sema &S, Expr *Op, ExprValueKind &VK, SourceLocation OpLoc, bool IsAfterAmp=false)
CheckIndirectionOperand - Type check unary indirection (prefix '*').
static bool CheckAlignOfExpr(Sema &S, Expr *E, UnaryExprOrTypeTrait ExprKind)
static bool ExprLooksBoolean(const Expr *E)
ExprLooksBoolean - Returns true if E looks boolean, i.e.
static bool isPotentiallyConstantEvaluatedContext(Sema &SemaRef)
Are we in a context that is potentially constant evaluated per C++20 [expr.const]p12?
static void DiagnoseSelfAssignment(Sema &S, Expr *LHSExpr, Expr *RHSExpr, SourceLocation OpLoc, bool IsBuiltin)
DiagnoseSelfAssignment - Emits a warning if a value is assigned to itself.
static void diagnoseStringPlusInt(Sema &Self, SourceLocation OpLoc, Expr *LHSExpr, Expr *RHSExpr)
diagnoseStringPlusInt - Emit a warning when adding an integer to a string literal.
static QualType checkConditionalPointerCompatibility(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc)
Checks compatibility between two pointers and return the resulting type.
static void DoMarkVarDeclReferenced(Sema &SemaRef, SourceLocation Loc, VarDecl *Var, Expr *E, llvm::DenseMap< const VarDecl *, int > &RefsMinusAssignments)
static bool ShouldLookupResultBeMultiVersionOverload(const LookupResult &R)
static bool checkCondition(Sema &S, const Expr *Cond, SourceLocation QuestionLoc)
Return false if the condition expression is valid, true otherwise.
static bool checkForArray(const Expr *E)
static void DiagnosedUnqualifiedCallsToStdFunctions(Sema &S, const CallExpr *Call)
static void DiagnoseRecursiveConstFields(Sema &S, const ValueDecl *VD, const RecordType *Ty, SourceLocation Loc, SourceRange Range, OriginalExprKind OEK, bool &DiagnosticEmitted)
static bool areTypesCompatibleForGeneric(ASTContext &Ctx, QualType T, QualType U)
static void MarkExprReferenced(Sema &SemaRef, SourceLocation Loc, Decl *D, Expr *E, bool MightBeOdrUse, llvm::DenseMap< const VarDecl *, int > &RefsMinusAssignments)
static bool MayBeFunctionType(const ASTContext &Context, const Expr *E)
static ExprResult convertVector(Expr *E, QualType ElementType, Sema &S)
Convert vector E to a vector with the same number of elements but different element type.
static void DoMarkPotentialCapture(Sema &SemaRef, SourceLocation Loc, ValueDecl *Var, Expr *E)
static void RecordModifiableNonNullParam(Sema &S, const Expr *Exp)
static void EvaluateAndDiagnoseImmediateInvocation(Sema &SemaRef, Sema::ImmediateInvocationCandidate Candidate)
static bool checkThreeWayNarrowingConversion(Sema &S, QualType ToType, Expr *E, QualType FromType, SourceLocation Loc)
static bool IsArithmeticBinaryExpr(const Expr *E, BinaryOperatorKind *Opcode, const Expr **RHSExprs)
IsArithmeticBinaryExpr - Returns true if E is an arithmetic binary expression, either using a built-i...
static ExprResult convertHalfVecBinOp(Sema &S, ExprResult LHS, ExprResult RHS, BinaryOperatorKind Opc, QualType ResultTy, ExprValueKind VK, ExprObjectKind OK, bool IsCompAssign, SourceLocation OpLoc, FPOptionsOverride FPFeatures)
static QualType handleIntegerConversion(Sema &S, ExprResult &LHS, ExprResult &RHS, QualType LHSType, QualType RHSType, bool IsCompAssign)
Handle integer arithmetic conversions.
static void checkDirectCallValidity(Sema &S, const Expr *Fn, FunctionDecl *Callee, MultiExprArg ArgExprs)
static void ConstructTransparentUnion(Sema &S, ASTContext &C, ExprResult &EResult, QualType UnionType, FieldDecl *Field)
Constructs a transparent union from an expression that is used to initialize the transparent union.
static QualType OpenCLConvertScalarsToVectors(Sema &S, ExprResult &LHS, ExprResult &RHS, QualType CondTy, SourceLocation QuestionLoc)
Convert scalar operands to a vector that matches the condition in length.
static bool checkConditionalNullPointer(Sema &S, ExprResult &NullExpr, QualType PointerTy)
Return false if the NullExpr can be promoted to PointerTy, true otherwise.
static void diagnoseSubtractionOnNullPointer(Sema &S, SourceLocation Loc, Expr *Pointer, bool BothNull)
Diagnose invalid subraction on a null pointer.
static bool checkArithmeticOnObjCPointer(Sema &S, SourceLocation opLoc, Expr *op)
Diagnose if arithmetic on the given ObjC pointer is illegal.
static void RemoveNestedImmediateInvocation(Sema &SemaRef, Sema::ExpressionEvaluationContextRecord &Rec, SmallVector< Sema::ImmediateInvocationCandidate, 4 >::reverse_iterator It)
static void CheckUnicodeArithmeticConversions(Sema &SemaRef, Expr *LHS, Expr *RHS, SourceLocation Loc, ArithConvKind ACK)
static void DiagnoseBitwiseOpInBitwiseOp(Sema &S, BinaryOperatorKind Opc, SourceLocation OpLoc, Expr *SubExpr)
Look for bitwise op in the left or right hand of a bitwise op with lower precedence and emit a diagno...
static QualType CheckIncrementDecrementOperand(Sema &S, Expr *Op, ExprValueKind &VK, ExprObjectKind &OK, SourceLocation OpLoc, bool IsInc, bool IsPrefix)
CheckIncrementDecrementOperand - unlike most "Check" methods, this routine doesn't need to call Usual...
static QualType OpenCLArithmeticConversions(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation QuestionLoc)
Simple conversion between integer and floating point types.
static bool checkVectorResult(Sema &S, QualType CondTy, QualType VecResTy, SourceLocation QuestionLoc)
Return false if the vector condition type and the vector result type are compatible.
static void DiagnoseDivisionSizeofPointerOrArray(Sema &S, Expr *LHS, Expr *RHS, SourceLocation Loc)
static void diagnoseTautologicalComparison(Sema &S, SourceLocation Loc, Expr *LHS, Expr *RHS, BinaryOperatorKind Opc)
Diagnose some forms of syntactically-obvious tautological comparison.
static void warnOnSizeofOnArrayDecay(Sema &S, SourceLocation Loc, QualType T, const Expr *E)
Check whether E is a pointer from a decayed array type (the decayed pointer type is equal to T) and e...
static void DiagnoseBadDivideOrRemainderValues(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsDiv)
static void ConvertUTF8ToWideString(unsigned CharByteWidth, StringRef Source, SmallString< 32 > &Target)
static TypoCorrection TryTypoCorrectionForCall(Sema &S, Expr *Fn, FunctionDecl *FDecl, ArrayRef< Expr * > Args)
static bool hasAnyExplicitStorageClass(const FunctionDecl *D)
Determine whether a FunctionDecl was ever declared with an explicit storage class.
static void DiagnoseBadShiftValues(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc, QualType LHSType)
static bool CheckVecStepTraitOperandType(Sema &S, QualType T, SourceLocation Loc, SourceRange ArgRange)
static bool captureInLambda(LambdaScopeInfo *LSI, ValueDecl *Var, SourceLocation Loc, const bool BuildAndDiagnose, QualType &CaptureType, QualType &DeclRefType, const bool RefersToCapturedVariable, const TryCaptureKind Kind, SourceLocation EllipsisLoc, const bool IsTopScope, Sema &S, bool Invalid)
Capture the given variable in the lambda.
static bool unsupportedTypeConversion(const Sema &S, QualType LHSType, QualType RHSType)
Diagnose attempts to convert between __float128, __ibm128 and long double if there is no support for ...
static void MarkVarDeclODRUsed(ValueDecl *V, SourceLocation Loc, Sema &SemaRef, const unsigned *const FunctionScopeIndexToStopAt=nullptr)
Directly mark a variable odr-used.
static void diagnoseStringPlusChar(Sema &Self, SourceLocation OpLoc, Expr *LHSExpr, Expr *RHSExpr)
Emit a warning when adding a char literal to a string.
static bool CheckForModifiableLvalue(Expr *E, SourceLocation Loc, Sema &S)
CheckForModifiableLvalue - Verify that E is a modifiable lvalue.
static ValueDecl * getPrimaryDecl(Expr *E)
getPrimaryDecl - Helper function for CheckAddressOfOperand().
static void diagnoseUseOfInternalDeclInInlineFunction(Sema &S, const NamedDecl *D, SourceLocation Loc)
Check whether we're in an extern inline function and referring to a variable or function with interna...
static bool funcHasParameterSizeMangling(Sema &S, FunctionDecl *FD)
Return true if this function has a calling convention that requires mangling in the size of the param...
static bool convertPointersToCompositeType(Sema &S, SourceLocation Loc, ExprResult &LHS, ExprResult &RHS)
Returns false if the pointers are converted to a composite type, true otherwise.
static void DiagnoseBinOpPrecedence(Sema &Self, BinaryOperatorKind Opc, SourceLocation OpLoc, Expr *LHSExpr, Expr *RHSExpr)
DiagnoseBinOpPrecedence - Emit warnings for expressions with tricky precedence.
static void diagnoseAddressOfInvalidType(Sema &S, SourceLocation Loc, Expr *E, unsigned Type)
Diagnose invalid operand for address of operations.
static QualType handleComplexIntConversion(Sema &S, ExprResult &LHS, ExprResult &RHS, QualType LHSType, QualType RHSType, bool IsCompAssign)
Handle conversions with GCC complex int extension.
static AssignConvertType checkPointerTypesForAssignment(Sema &S, QualType LHSType, QualType RHSType, SourceLocation Loc)
static bool isMSPropertySubscriptExpr(Sema &S, Expr *Base)
static bool tryGCCVectorConvertAndSplat(Sema &S, ExprResult *Scalar, ExprResult *Vector)
Attempt to convert and splat Scalar into a vector whose types matches Vector following GCC conversion...
static void diagnoseScopedEnums(Sema &S, const SourceLocation Loc, const ExprResult &LHS, const ExprResult &RHS, BinaryOperatorKind Opc)
static void DiagnoseLogicalAndInLogicalOrLHS(Sema &S, SourceLocation OpLoc, Expr *LHSExpr, Expr *RHSExpr)
Look for '&&' in the left hand of a '||' expr.
static void CheckForNullPointerDereference(Sema &S, Expr *E)
static QualType computeConditionalNullability(QualType ResTy, bool IsBin, QualType LHSTy, QualType RHSTy, ASTContext &Ctx)
Compute the nullability of a conditional expression.
static OdrUseContext isOdrUseContext(Sema &SemaRef)
Are we within a context in which references to resolved functions or to variables result in odr-use?
static void DiagnoseConstAssignment(Sema &S, const Expr *E, SourceLocation Loc)
Emit the "read-only variable not assignable" error and print notes to give more information about why...
static Expr * BuildFloatingLiteral(Sema &S, NumericLiteralParser &Literal, QualType Ty, SourceLocation Loc)
static bool IsTypeModifiable(QualType Ty, bool IsDereference)
static bool isVariableAlreadyCapturedInScopeInfo(CapturingScopeInfo *CSI, ValueDecl *Var, bool &SubCapturesAreNested, QualType &CaptureType, QualType &DeclRefType)
static bool checkArithmeticIncompletePointerType(Sema &S, SourceLocation Loc, Expr *Operand)
Emit error if Operand is incomplete pointer type.
static bool CheckExtensionTraitOperandType(Sema &S, QualType T, SourceLocation Loc, SourceRange ArgRange, UnaryExprOrTypeTrait TraitKind)
static void CheckSufficientAllocSize(Sema &S, QualType DestType, const Expr *E)
Check that a call to alloc_size function specifies sufficient space for the destination type.
static QualType checkSizelessVectorShift(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign)
static QualType checkArithmeticOrEnumeralThreeWayCompare(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc)
static ExprResult diagnoseUnknownAnyExpr(Sema &S, Expr *E)
static QualType handleOverflowBehaviorTypeConversion(Sema &S, ExprResult &LHS, ExprResult &RHS, QualType LHSType, QualType RHSType, bool IsCompAssign)
static SourceLocation getUDSuffixLoc(Sema &S, SourceLocation TokLoc, unsigned Offset)
getUDSuffixLoc - Create a SourceLocation for a ud-suffix, given the location of the token and the off...
static bool checkBlockType(Sema &S, const Expr *E)
Return true if the Expr is block type.
static bool captureInBlock(BlockScopeInfo *BSI, ValueDecl *Var, SourceLocation Loc, const bool BuildAndDiagnose, QualType &CaptureType, QualType &DeclRefType, const bool Nested, Sema &S, bool Invalid)
static QualType handleFloatConversion(Sema &S, ExprResult &LHS, ExprResult &RHS, QualType LHSType, QualType RHSType, bool IsCompAssign)
Handle arithmethic conversion with floating point types.
static void diagnoseArithmeticOnVoidPointer(Sema &S, SourceLocation Loc, Expr *Pointer)
Diagnose invalid arithmetic on a void pointer.
static QualType checkVectorShift(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign)
Return the resulting type when a vector is shifted by a scalar or vector shift amount.
static FieldDecl * FindFieldDeclInstantiationPattern(const ASTContext &Ctx, FieldDecl *Field)
ExprResult PerformCastFn(Sema &S, Expr *operand, QualType toType)
static void checkArithmeticNull(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompare)
static bool IsReadonlyMessage(Expr *E, Sema &S)
static std::optional< bool > isTautologicalBoundsCheck(Sema &S, const Expr *LHS, const Expr *RHS, BinaryOperatorKind Opc)
Detect patterns ptr + size >= ptr and ptr + size < ptr, where ptr is a pointer and size is an unsigne...
static void buildLambdaCaptureFixit(Sema &Sema, LambdaScopeInfo *LSI, ValueDecl *Var)
Create up to 4 fix-its for explicit reference and value capture of Var or default capture.
static void tryImplicitlyCaptureThisIfImplicitMemberFunctionAccessWithDependentArgs(Sema &S, const UnresolvedMemberExpr *const UME, SourceLocation CallLoc)
static bool checkPtrAuthTypeDiscriminatorOperandType(Sema &S, QualType T, SourceLocation Loc, SourceRange ArgRange)
static bool CheckVectorElementsTraitOperandType(Sema &S, QualType T, SourceLocation Loc, SourceRange ArgRange)
static void DiagnoseLogicalAndInLogicalOrRHS(Sema &S, SourceLocation OpLoc, Expr *LHSExpr, Expr *RHSExpr)
Look for '&&' in the right hand of a '||' expr.
static QualType getDependentArraySubscriptType(Expr *LHS, Expr *RHS, const ASTContext &Ctx)
static void diagnosePointerIncompatibility(Sema &S, SourceLocation Loc, Expr *LHSExpr, Expr *RHSExpr)
Emit error when two pointers are incompatible.
static bool captureInCapturedRegion(CapturedRegionScopeInfo *RSI, ValueDecl *Var, SourceLocation Loc, const bool BuildAndDiagnose, QualType &CaptureType, QualType &DeclRefType, const bool RefersToCapturedVariable, TryCaptureKind Kind, bool IsTopScope, Sema &S, bool Invalid)
Capture the given variable in the captured region.
static bool enclosingClassIsRelatedToClassInWhichMembersWereFound(const UnresolvedMemberExpr *const UME, Sema &S)
static unsigned GetFixedPointRank(QualType Ty)
Return the rank of a given fixed point or integer type.
static bool CheckObjCTraitOperandConstraints(Sema &S, QualType T, SourceLocation Loc, SourceRange ArgRange, UnaryExprOrTypeTrait TraitKind)
static void diagnoseArithmeticOnTwoFunctionPointers(Sema &S, SourceLocation Loc, Expr *LHS, Expr *RHS)
Diagnose invalid arithmetic on two function pointers.
static bool checkPointerIntegerMismatch(Sema &S, ExprResult &Int, Expr *PointerExpr, SourceLocation Loc, bool IsIntFirstExpr)
Return false if the first expression is not an integer and the second expression is not a pointer,...
static ImplicitConversionKind castKindToImplicitConversionKind(CastKind CK)
static void diagnoseXorMisusedAsPow(Sema &S, const ExprResult &XorLHS, const ExprResult &XorRHS, const SourceLocation Loc)
static bool checkOpenCLConditionVector(Sema &S, Expr *Cond, SourceLocation QuestionLoc)
Return false if this is a valid OpenCL condition vector.
static bool IsArithmeticOp(BinaryOperatorKind Opc)
static bool handleComplexIntegerToFloatConversion(Sema &S, ExprResult &IntExpr, ExprResult &ComplexExpr, QualType IntTy, QualType ComplexTy, bool SkipCast)
Convert complex integers to complex floats and real integers to real floats as required for complex a...
static void checkObjCPointerIntrospection(Sema &S, ExprResult &L, ExprResult &R, SourceLocation OpLoc)
Check if a bitwise-& is performed on an Objective-C pointer.
static void DiagnoseDirectIsaAccess(Sema &S, const ObjCIvarRefExpr *OIRE, SourceLocation AssignLoc, const Expr *RHS)
static ExprResult rebuildUnknownAnyFunction(Sema &S, Expr *fn)
Given a function expression of unknown-any type, try to rebuild it to have a function type.
static QualType handleIntToFloatConversion(Sema &S, ExprResult &FloatExpr, ExprResult &IntExpr, QualType FloatTy, QualType IntTy, bool ConvertFloat, bool ConvertInt)
Handle arithmetic conversion from integer to float.
static bool hasIsEqualMethod(Sema &S, const Expr *LHS, const Expr *RHS)
static QualType handleComplexFloatConversion(Sema &S, ExprResult &Shorter, QualType ShorterType, QualType LongerType, bool PromotePrecision)
static FunctionDecl * rewriteBuiltinFunctionDecl(Sema *Sema, ASTContext &Context, FunctionDecl *FDecl, MultiExprArg ArgExprs)
If a builtin function has a pointer argument with no explicit address space, then it should be able t...
static void DoMarkBindingDeclReferenced(Sema &SemaRef, SourceLocation Loc, BindingDecl *BD, Expr *E)
static PredefinedIdentKind getPredefinedExprKind(tok::TokenKind Kind)
static void DiagnoseUnusedOfDecl(Sema &S, NamedDecl *D, SourceLocation Loc)
static QualType handleFixedPointConversion(Sema &S, QualType LHSTy, QualType RHSTy)
handleFixedPointConversion - Fixed point operations between fixed point types and integers or other f...
static QualType handleComplexConversion(Sema &S, ExprResult &LHS, ExprResult &RHS, QualType LHSType, QualType RHSType, bool IsCompAssign)
Handle arithmetic conversion with complex types.
static QualType CheckCommaOperands(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc)
static bool canCaptureVariableByCopy(ValueDecl *Var, const ASTContext &Context)
static void diagnoseArithmeticOnTwoVoidPointers(Sema &S, SourceLocation Loc, Expr *LHSExpr, Expr *RHSExpr)
Diagnose invalid arithmetic on two void pointers.
static void diagnoseDistinctPointerComparison(Sema &S, SourceLocation Loc, ExprResult &LHS, ExprResult &RHS, bool IsError)
Diagnose bad pointer comparisons.
static bool needsConversionOfHalfVec(bool OpRequiresConversion, ASTContext &Ctx, Expr *E0, Expr *E1=nullptr)
Returns true if conversion between vectors of halfs and vectors of floats is needed.
static bool isObjCObjectLiteral(ExprResult &E)
static NonConstCaptureKind isReferenceToNonConstCapture(Sema &S, Expr *E)
static QualType checkConditionalBlockPointerCompatibility(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc)
Return the resulting type when the operands are both block pointers.
static void DiagnoseShiftCompare(Sema &S, SourceLocation OpLoc, Expr *LHSExpr, Expr *RHSExpr)
static void DiagnoseAdditionInShift(Sema &S, SourceLocation OpLoc, Expr *SubExpr, StringRef Shift)
static void diagnoseFunctionPointerToVoidComparison(Sema &S, SourceLocation Loc, ExprResult &LHS, ExprResult &RHS, bool IsError)
static void EmitDiagnosticForLogicalAndInLogicalOr(Sema &Self, SourceLocation OpLoc, BinaryOperator *Bop)
It accepts a '&&' expr that is inside a '||' one.
static void captureVariablyModifiedType(ASTContext &Context, QualType T, CapturingScopeInfo *CSI)
static bool canConvertIntToOtherIntTy(Sema &S, ExprResult *Int, QualType OtherIntTy)
Test if a (constant) integer Int can be casted to another integer type IntTy without losing precision...
static DeclContext * getParentOfCapturingContextOrNull(DeclContext *DC, ValueDecl *Var, SourceLocation Loc, const bool Diagnose, Sema &S)
static bool isOverflowingIntegerType(ASTContext &Ctx, QualType T)
static void CheckIdentityFieldAssignment(Expr *LHSExpr, Expr *RHSExpr, SourceLocation Loc, Sema &Sema)
static bool isLegalBoolVectorBinaryOp(BinaryOperatorKind Opc)
static ExprResult rebuildPotentialResultsAsNonOdrUsed(Sema &S, Expr *E, NonOdrUseReason NOUR)
Walk the set of potential results of an expression and mark them all as non-odr-uses if they satisfy ...
static void CheckCompleteParameterTypesForMangler(Sema &S, FunctionDecl *FD, SourceLocation Loc)
Require that all of the parameter types of function be complete.
static bool isScopedEnumerationType(QualType T)
static bool checkArithmeticBinOpPointerOperands(Sema &S, SourceLocation Loc, Expr *LHSExpr, Expr *RHSExpr)
Check the validity of a binary arithmetic operation w.r.t.
static bool breakDownVectorType(QualType type, uint64_t &len, QualType &eltType)
This file declares semantic analysis for HLSL constructs.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis for OpenMP constructs and clauses.
This file declares semantic analysis for expressions involving.
static bool isInvalid(LocType Loc, bool *Invalid)
Defines the SourceManager interface.
Defines various enumerations that describe declaration and type specifiers.
static QualType getPointeeType(const MemRegion *R)
Defines the clang::TypeLoc interface and its subclasses.
Defines enumerations for the type traits support.
C Language Family Type Representation.
@ Open
The standard open() call: int open(const char *path, int oflag, ...);.
a trap message and trap category.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
std::string getAsString(const ASTContext &Ctx, QualType Ty) const
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
BuiltinVectorTypeInfo getBuiltinVectorTypeInfo(const BuiltinType *VecTy) const
Returns the element type, element count and number of vectors (in case of tuple) for a builtin vector...
unsigned getIntWidth(QualType T) const
const llvm::fltSemantics & getFloatTypeSemantics(QualType T) const
Return the APFloat 'semantics' for the specified scalar floating point type.
QualType getBlockPointerType(QualType T) const
Return the uniqued reference to the type for a block of the specified type.
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
DeclarationNameTable DeclarationNames
int getIntegerTypeOrder(QualType LHS, QualType RHS) const
Return the highest ranked integer type, see C99 6.3.1.8p1.
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType, const Attr *attr=nullptr) const
QualType getScalableVectorType(QualType EltTy, unsigned NumElts, unsigned NumFields=1) const
Return the unique reference to a scalable vector type of the specified element type and scalable numb...
QualType getFunctionNoProtoType(QualType ResultTy, const FunctionType::ExtInfo &Info) const
Return a K&R style C function type like 'int()'.
QualType getCorrespondingSignedFixedPointType(QualType Ty) const
QualType getVectorType(QualType VectorType, unsigned NumElts, VectorKind VecKind) const
Return the unique reference to a vector type of the specified element type and size.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
QualType getReferenceQualifiedType(const Expr *e) const
getReferenceQualifiedType - Given an expr, will return the type for that expression,...
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const
Return the uniqued reference to the type for an lvalue reference to the specified type.
const LangOptions & getLangOpts() const
CanQualType getLogicalOperationType() const
The result type of logical operations, '<', '>', '!=', etc.
const QualType GetHigherPrecisionFPType(QualType ElementType) const
bool typesAreBlockPointerCompatible(QualType, QualType)
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
llvm::SetVector< const VarDecl * > CUDADeviceVarODRUsedByHost
Keep track of CUDA/HIP device-side variables ODR-used by host code.
llvm::SetVector< const ValueDecl * > CUDAExternalDeviceDeclODRUsedByHost
Keep track of CUDA/HIP external kernels or device variables ODR-used by host code.
int getFloatingTypeOrder(QualType LHS, QualType RHS) const
Compare the rank of the two specified floating point types, ignoring the domain of the type (i....
GVALinkage GetGVALinkageForFunction(const FunctionDecl *FD) const
QualType getCorrespondingSaturatedType(QualType Ty) const
CanQualType BoundMemberTy
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
llvm::FixedPointSemantics getFixedPointSemantics(QualType Ty) const
QualType mergeTypes(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false, bool BlockReturnType=false, bool IsConditionalOperator=false)
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CanQualType UnsignedCharTy
FieldDecl * getInstantiatedFromUnnamedFieldDecl(FieldDecl *Field) const
QualType getArrayDecayedType(QualType T) const
Return the properly qualified result of decaying the specified array type to a pointer.
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
QualType getPromotedIntegerType(QualType PromotableType) const
Return the type that PromotableType will promote to: C99 6.3.1.1p2, assuming that PromotableType is a...
QualType getComplexType(QualType T) const
Return the uniqued reference to the type for a complex number with the specified element type.
bool hasDirectOwnershipQualifier(QualType Ty) const
Return true if the type has been explicitly qualified with ObjC ownership.
QualType getExtVectorType(QualType VectorType, unsigned NumElts) const
Return the unique reference to an extended vector type of the specified element type and size.
const TargetInfo & getTargetInfo() const
QualType getOverflowBehaviorType(const OverflowBehaviorAttr *Attr, QualType Wrapped) const
std::optional< CharUnits > getTypeSizeInCharsIfKnown(QualType Ty) const
void getFunctionFeatureMap(llvm::StringMap< bool > &FeatureMap, const FunctionDecl *) const
QualType getCorrespondingUnsignedType(QualType T) const
bool typesAreCompatible(QualType T1, QualType T2, bool CompareUnqualified=false)
Compatibility predicates used to check assignment expressions.
QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const
Return the uniqued reference to the type for an address space qualified type with the specified type ...
unsigned getTargetAddressSpace(LangAS AS) const
bool isPromotableIntegerType(QualType T) const
More type predicates useful for type checking/promotion.
static bool hasSameUnqualifiedType(QualType T1, QualType T2)
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
QualType getCommonSugaredType(QualType X, QualType Y, bool Unqualified=false) const
uint64_t getCharWidth() const
Return the size of the character type, in bits.
AddrLabelExpr - The GNU address of label extension, representing &&label.
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
SourceLocation getExprLoc() const LLVM_READONLY
Wrapper for source info for arrays.
Represents an array type, per C99 6.7.5.2 - Array Declarators.
ArraySizeModifier getSizeModifier() const
QualType getElementType() const
AsTypeExpr - Clang builtin function __builtin_astype [OpenCL 6.2.4.2] This AST node provides support ...
Attr - This represents one attribute.
SourceRange getRange() const
BinaryConditionalOperator - The GNU extension to the conditional operator which allows the middle ope...
A builtin binary operation expression such as "x + y" or "x <= y".
static bool isRelationalOp(Opcode Opc)
static OverloadedOperatorKind getOverloadedOperator(Opcode Opc)
Retrieve the overloaded operator kind that corresponds to the given binary opcode.
static bool isComparisonOp(Opcode Opc)
StringRef getOpcodeStr() const
bool isRelationalOp() const
SourceLocation getOperatorLoc() const
bool isMultiplicativeOp() const
static StringRef getOpcodeStr(Opcode Op)
getOpcodeStr - Turn an Opcode enum value into the punctuation char it corresponds to,...
static BinaryOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)
bool isAdditiveOp() const
static bool isAssignmentOp(Opcode Opc)
static bool isCompoundAssignmentOp(Opcode Opc)
static bool isNullPointerArithmeticExtension(ASTContext &Ctx, Opcode Opc, const Expr *LHS, const Expr *RHS)
Return true if a binary operator using the specified opcode and operands would match the 'p = (i8*)nu...
bool isAssignmentOp() const
static Opcode getOverloadedOpcode(OverloadedOperatorKind OO)
Retrieve the binary opcode that corresponds to the given overloaded operator.
static bool isEqualityOp(Opcode Opc)
static bool isBitwiseOp(Opcode Opc)
BinaryOperatorKind Opcode
A binding in a decomposition declaration.
A class which contains all the information about a particular captured value.
Represents a block literal declaration, which is like an unnamed FunctionDecl.
void setParams(ArrayRef< ParmVarDecl * > NewParamInfo)
void setSignatureAsWritten(TypeSourceInfo *Sig)
void setBlockMissingReturnType(bool val=true)
void setIsVariadic(bool value)
SourceLocation getCaretLocation() const
void setBody(CompoundStmt *B)
ArrayRef< ParmVarDecl * > parameters() const
void setCaptures(ASTContext &Context, ArrayRef< Capture > Captures, bool CapturesCXXThis)
static BlockDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L)
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
This class is used for builtin types like 'int'.
static CUDAKernelCallExpr * Create(const ASTContext &Ctx, Expr *Fn, CallExpr *Config, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RP, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0)
Represents a path from a specific derived class (which is not represented as part of the path) to a p...
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
const RecordType * getDetectedVirtual() const
The virtual base discovered on the path (if we are merely detecting virtuals).
Represents a call to a C++ constructor.
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
Represents a C++ constructor within a class.
Represents a C++ conversion function within a class.
bool isLambdaToBlockPointerConversion() const
Determine whether this conversion function is a conversion from a lambda closure type to a block poin...
Represents a C++ base or member initializer.
A default argument (C++ [dcl.fct.default]).
static CXXDefaultArgExpr * Create(const ASTContext &C, SourceLocation Loc, ParmVarDecl *Param, Expr *RewrittenExpr, DeclContext *UsedContext)
A use of a default initializer in a constructor or in aggregate initialization.
static CXXDefaultInitExpr * Create(const ASTContext &Ctx, SourceLocation Loc, FieldDecl *Field, DeclContext *UsedContext, Expr *RewrittenInitExpr)
Field is the non-static data member whose default initializer is used by this expression.
Expr * getExpr()
Get the initialization expression that will be used.
static CXXDependentScopeMemberExpr * Create(const ASTContext &Ctx, Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierFoundInScope, DeclarationNameInfo MemberNameInfo, const TemplateArgumentListInfo *TemplateArgs)
Represents a C++ destructor within a class.
Represents a static or instance method of a struct/union/class.
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
CXXMethodDecl * getDevirtualizedMethod(const Expr *Base, bool IsAppleKext)
If it's possible to devirtualize a call to this method, return the called function.
A call to an overloaded operator written using operator syntax.
SourceLocation getOperatorLoc() const
Returns the location of the operator symbol in the expression.
SourceRange getSourceRange() const
static CXXParenListInitExpr * Create(ASTContext &C, ArrayRef< Expr * > Args, QualType T, unsigned NumUserSpecifiedExprs, SourceLocation InitLoc, SourceLocation LParenLoc, SourceLocation RParenLoc)
Represents a C++ pseudo-destructor (C++ [expr.pseudo]).
Represents a C++ struct/union/class.
bool isStandardLayout() const
Determine whether this class is standard-layout per C++ [class]p7.
bool hasAnyDependentBases() const
Determine whether this class has any dependent base classes which are not the current instantiation.
bool isLambda() const
Determine whether this class describes a lambda function object.
unsigned getNumBases() const
Retrieves the number of base classes of this class.
const CXXRecordDecl * getTemplateInstantiationPattern() const
Retrieve the record declaration from which this record could be instantiated.
bool hasDefinition() const
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
unsigned getNumVBases() const
Retrieves the number of virtual base classes of this class.
bool isDerivedFrom(const CXXRecordDecl *Base) const
Determine whether this class is derived from the class Base.
static CXXReflectExpr * Create(ASTContext &C, SourceLocation OperatorLoc, TypeSourceInfo *TL)
Represents a C++ nested-name-specifier or a global scope specifier.
bool isNotEmpty() const
A scope specifier is present, but may be valid or invalid.
bool isValid() const
A scope specifier is present, and it refers to a real scope.
void MakeTrivial(ASTContext &Context, NestedNameSpecifier Qualifier, SourceRange R)
Make a new nested-name-specifier from incomplete source-location information.
SourceRange getRange() const
SourceLocation getBeginLoc() const
bool isSet() const
Deprecated.
NestedNameSpecifier getScopeRep() const
Retrieve the representation of the nested-name-specifier.
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
bool isInvalid() const
An error occurred during parsing of the scope specifier.
bool isEmpty() const
No scope specifier.
void Adopt(NestedNameSpecifierLoc Other)
Adopt an existing nested-name-specifier (with source-range information).
Represents the this expression in C++.
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
void setArg(unsigned Arg, Expr *ArgExpr)
setArg - Set the specified argument.
static CallExpr * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RParenLoc, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0, ADLCallKind UsesADL=NotADL)
Create a call expression.
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
void computeDependence()
Compute and set dependence bits.
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this call.
QualType withConst() const
Retrieves a version of this type with const applied.
CanQual< T > getUnqualifiedType() const
Retrieve the unqualified form of this type.
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
CastKind getCastKind() const
const char * getCastKindName() const
CharLiteralParser - Perform interpretation and semantic analysis of a character literal.
Represents a byte-granular source range.
static CharSourceRange getCharRange(SourceRange R)
static CharSourceRange getTokenRange(SourceRange R)
CharUnits - This is an opaque type for sizes expressed in character units.
bool isZero() const
isZero - Test whether the quantity equals zero.
static CharUnits One()
One - Construct a CharUnits quantity of one.
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
unsigned getValue() const
ChooseExpr - GNU builtin-in function __builtin_choose_expr.
Complex values, per C99 6.2.5p11.
QualType getElementType() const
static CompoundAssignOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures, QualType CompLHSType=QualType(), QualType CompResultType=QualType())
CompoundLiteralExpr - [C99 6.5.2.5].
CompoundStmt - This represents a group of statements like { stmt stmt }.
ConditionalOperator - The ?
Represents the canonical version of C arrays with a specified constant size.
llvm::APInt getSize() const
Return the constant array size as an APInt.
uint64_t getZExtSize() const
Return the size zero-extended as a uint64_t.
ConstantExpr - An expression that occurs in a constant context and optionally the result of evaluatin...
static ConstantResultStorageKind getStorageKind(const APValue &Value)
void MoveIntoResult(APValue &Value, const ASTContext &Context)
SourceLocation getBeginLoc() const LLVM_READONLY
static ConstantExpr * Create(const ASTContext &Context, Expr *E, const APValue &Result)
bool isImmediateInvocation() const
Represents a concrete matrix type with constant number of rows and columns.
unsigned getNumColumns() const
Returns the number of columns in the matrix.
unsigned getNumRows() const
Returns the number of rows in the matrix.
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Base class for callback objects used by Sema::CorrectTypo to check the validity of a potential typo c...
void setTypoName(const IdentifierInfo *II)
void setTypoNNS(NestedNameSpecifier NNS)
Wrapper for source info for pointers decayed from arrays and functions.
A POD class for pairing a NamedDecl* with an access specifier.
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
bool isRequiresExprBody() const
DeclContextLookupResult lookup_result
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
bool containsDecl(Decl *D) const
Checks whether a declaration is in this context.
RecordDecl * getOuterLexicalRecordContext()
Retrieve the outermost lexically enclosing record context.
bool isFunctionOrMethod() const
DeclContext * getLookupParent()
Find the parent context of this context that will be used for unqualified name lookup.
bool Encloses(const DeclContext *DC) const
Determine whether this declaration context semantically encloses the declaration context DC.
A reference to a declared variable, function, enum, etc.
NamedDecl * getFoundDecl()
Get the NamedDecl through which this reference occurred.
bool hasExplicitTemplateArgs() const
Determines whether this declaration reference was followed by an explicit template argument list.
NestedNameSpecifier getQualifier() const
If the name was qualified, retrieves the nested-name-specifier that precedes the name.
bool refersToEnclosingVariableOrCapture() const
Does this DeclRefExpr refer to an enclosing local or a captured variable?
void setDecl(ValueDecl *NewD)
void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const
Copies the template arguments (if present) into the given structure.
DeclarationNameInfo getNameInfo() const
SourceLocation getTemplateKeywordLoc() const
Retrieve the location of the template keyword preceding this name, if any.
static DeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *D, bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc, QualType T, ExprValueKind VK, NamedDecl *FoundD=nullptr, const TemplateArgumentListInfo *TemplateArgs=nullptr, NonOdrUseReason NOUR=NOUR_None)
bool hasQualifier() const
Determine whether this declaration reference was preceded by a C++ nested-name-specifier,...
NestedNameSpecifierLoc getQualifierLoc() const
If the name was qualified, retrieves the nested-name-specifier that precedes the name,...
SourceLocation getBeginLoc() const
SourceLocation getLocation() const
Decl - This represents one declaration (or definition), e.g.
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
AvailabilityResult getAvailability(std::string *Message=nullptr, VersionTuple EnclosingVersion=VersionTuple(), StringRef *RealizedPlatform=nullptr) const
Determine the availability of the given declaration.
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
void markUsed(ASTContext &C)
Mark the declaration used, in the sense of odr-use.
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
bool isInvalidDecl() const
SourceLocation getLocation() const
void setReferenced(bool R=true)
DeclContext * getDeclContext()
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
std::string getAsString() const
Retrieve the human-readable string for this name.
@ CXXConversionFunctionName
NameKind getNameKind() const
Determine what kind of name this is.
bool isIdentifier() const
Predicate functions for querying what type of name this is.
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
TypeSourceInfo * getTypeSourceInfo() const
Information about one declarator, including the parsed type information and the identifier.
DeclaratorContext getContext() const
SourceLocation getBeginLoc() const LLVM_READONLY
bool isInvalidType() const
const IdentifierInfo * getIdentifier() const
static DependentScopeDeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs)
A little helper class used to produce diagnostics.
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
bool getSuppressSystemWarnings() const
bool ShouldVisitImplicitCode
virtual bool VisitStmt(MaybeConst< Stmt > *S)
virtual bool TraverseStmt(MaybeConst< Stmt > *S)
virtual bool TraverseTemplateArgument(const TemplateArgument &Arg)
Represents a reference to emded data.
RAII object that enters a new expression evaluation context.
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
ExplicitCastExpr - An explicit cast written in the source code.
QualType getTypeAsWritten() const
getTypeAsWritten - Returns the type that this expression is casting to, as written in the source code...
static ExprWithCleanups * Create(const ASTContext &C, EmptyShell empty, unsigned numObjects)
This represents one expression.
bool EvaluateAsInt(EvalResult &Result, const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects, bool InConstantContext=false) const
EvaluateAsInt - Return true if this is a constant which we can fold and convert to an integer,...
bool isIntegerConstantExpr(const ASTContext &Ctx) const
Expr * IgnoreParenNoopCasts(const ASTContext &Ctx) LLVM_READONLY
Skip past any parentheses and casts which do not change the value (including ptr->int casts of the sa...
isModifiableLvalueResult isModifiableLvalue(ASTContext &Ctx, SourceLocation *Loc=nullptr) const
isModifiableLvalue - C99 6.3.2.1: an lvalue that does not have array type, does not have an incomplet...
@ SE_AllowSideEffects
Allow any unmodeled side effect.
static QualType findBoundMemberType(const Expr *expr)
Given an expression of bound-member type, find the type of the member.
llvm::APSInt EvaluateKnownConstIntCheckOverflow(const ASTContext &Ctx, SmallVectorImpl< PartialDiagnosticAt > *Diag=nullptr) const
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
LValueClassification ClassifyLValue(ASTContext &Ctx) const
Reasons why an expression might not be an l-value.
bool isValueDependent() const
Determines whether the value of this expression depends on.
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
bool containsUnexpandedParameterPack() const
Whether this expression contains an unexpanded parameter pack (for C++11 variadic templates).
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
Expr * IgnoreImplicit() LLVM_READONLY
Skip past any implicit AST nodes which might surround this expression until reaching a fixed point.
Expr * IgnoreConversionOperatorSingleStep() LLVM_READONLY
Skip conversion operators.
bool containsErrors() const
Whether this expression contains subexpressions which had errors.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
bool isLValue() const
isLValue - True if this expression is an "l-value" according to the rules of the current language.
static bool hasAnyTypeDependentArguments(ArrayRef< Expr * > Exprs)
hasAnyTypeDependentArguments - Determines if any of the expressions in Exprs is type-dependent.
@ NPC_ValueDependentIsNull
Specifies that a value-dependent expression of integral or dependent type should be considered a null...
@ NPC_NeverValueDependent
Specifies that the expression should never be value-dependent.
@ NPC_ValueDependentIsNotNull
Specifies that a value-dependent expression should be considered to never be a null pointer constant.
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
bool EvaluateAsRValue(EvalResult &Result, const ASTContext &Ctx, bool InConstantContext=false) const
EvaluateAsRValue - Return true if this is a constant which we can fold to an rvalue using any crazy t...
bool HasSideEffects(const ASTContext &Ctx, bool IncludePossibleEffects=true) const
HasSideEffects - This routine returns true for all those expressions which have any effect other than...
bool EvaluateAsConstantExpr(EvalResult &Result, const ASTContext &Ctx, ConstantExprKind Kind=ConstantExprKind::Normal) const
Evaluate an expression that is required to be a constant expression.
bool isInstantiationDependent() const
Whether this expression is instantiation-dependent, meaning that it depends in some way on.
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
NullPointerConstantKind
Enumeration used to describe the kind of Null pointer constant returned from isNullPointerConstant().
@ NPCK_ZeroExpression
Expression is a Null pointer constant built from a zero integer expression that is not a simple,...
@ NPCK_ZeroLiteral
Expression is a Null pointer constant built from a literal zero.
@ NPCK_CXX11_nullptr
Expression is a C++11 nullptr.
@ NPCK_NotNull
Expression is not a Null pointer constant.
NullPointerConstantKind isNullPointerConstant(ASTContext &Ctx, NullPointerConstantValueDependence NPC) const
isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to a Null pointer constant.
QualType getEnumCoercedType(const ASTContext &Ctx) const
If this expression is an enumeration constant, return the enumeration type under which said constant ...
void setValueKind(ExprValueKind Cat)
setValueKind - Set the value kind produced by this expression.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
static bool isSameComparisonOperand(const Expr *E1, const Expr *E2)
Checks that the two Expr's will refer to the same value as a comparison operand.
void setObjectKind(ExprObjectKind Cat)
setObjectKind - Set the object kind produced by this expression.
bool refersToBitField() const
Returns true if this expression is a gl-value that potentially refers to a bit-field.
@ MLV_DuplicateVectorComponents
@ MLV_InvalidMessageExpression
@ MLV_DuplicateMatrixComponents
@ MLV_ConstQualifiedField
@ MLV_SubObjCPropertySetting
bool isOrdinaryOrBitFieldObject() const
bool hasPlaceholderType() const
Returns whether this expression has a placeholder type.
static ExprValueKind getValueKindForType(QualType T)
getValueKindForType - Given a formal return or parameter type, give its value kind.
bool isKnownToHaveBooleanValue(bool Semantic=true) const
isKnownToHaveBooleanValue - Return true if this is an integer expression that is known to return 0 or...
ExtVectorElementExpr - This represents access to specific elements of a vector, and may occur on the ...
ExtVectorType - Extended vector type.
Represents difference between two FPOptions values.
bool isFPConstrained() const
RoundingMode getRoundingMode() const
Represents a member of a struct/union/class.
bool isBitField() const
Determines whether this field is a bitfield.
bool hasInClassInitializer() const
Determine whether this member has a C++11 default member initializer.
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
static FixItHint CreateRemoval(CharSourceRange RemoveRange)
Create a code modification hint that removes the given source range.
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
static FixedPointLiteral * CreateFromRawInt(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l, unsigned Scale)
static FloatingLiteral * Create(const ASTContext &C, const llvm::APFloat &V, bool isexact, QualType Type, SourceLocation L)
const Expr * getSubExpr() const
bool ValidateCandidate(const TypoCorrection &candidate) override
Simple predicate used by the default RankCandidate to determine whether to return an edit distance of...
Represents a function declaration or definition.
static FunctionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation NLoc, DeclarationName N, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin=false, bool isInlineSpecified=false, bool hasWrittenPrototype=true, ConstexprSpecKind ConstexprKind=ConstexprSpecKind::Unspecified, const AssociatedConstraint &TrailingRequiresClause={})
const ParmVarDecl * getParamDecl(unsigned i) const
unsigned getMinRequiredArguments() const
Returns the minimum number of arguments needed to call this function.
bool isImmediateFunction() const
SourceRange getReturnTypeSourceRange() const
Attempt to compute an informative source range covering the function return type.
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
bool hasCXXExplicitFunctionObjectParameter() const
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
QualType getReturnType() const
ArrayRef< ParmVarDecl * > parameters() const
bool hasPrototype() const
Whether this function has a prototype, either because one was explicitly written or because it was "i...
bool isExternC() const
Determines whether this function is a function with external, C linkage.
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
bool isImmediateEscalating() const
bool isOverloadedOperator() const
Whether this function declaration represents an C++ overloaded operator, e.g., "operator+".
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
size_t param_size() const
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
SourceRange getParametersSourceRange() const
Attempt to compute an informative source range covering the function parameters, including the ellips...
QualType getCallResultType() const
Determine the type of an expression that calls this function.
Represents a reference to a function parameter pack, init-capture pack, or binding pack that has been...
SourceLocation getParameterPackLocation() const
Get the location of the parameter pack.
Represents a prototype with parameter type info, e.g.
ExtParameterInfo getExtParameterInfo(unsigned I) const
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
bool isParamConsumed(unsigned I) const
unsigned getNumParams() const
QualType getParamType(unsigned i) const
bool isVariadic() const
Whether this function prototype is variadic.
ExtProtoInfo getExtProtoInfo() const
ArrayRef< QualType > getParamTypes() const
ArrayRef< QualType > param_types() const
Declaration of a template function.
unsigned getNumParams() const
ParmVarDecl * getParam(unsigned i) const
SourceLocation getLocalRangeEnd() const
TypeLoc getReturnLoc() const
SourceLocation getLocalRangeBegin() const
A class which abstracts out some details necessary for making a call.
ExtInfo withNoReturn(bool noReturn) const
ParameterABI getABI() const
Return the ABI treatment of this parameter.
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
bool getNoReturnAttr() const
Determine whether this function type includes the GNU noreturn attribute.
bool getCFIUncheckedCalleeAttr() const
Determine whether this is a function prototype that includes the cfi_unchecked_callee attribute.
QualType getReturnType() const
bool getCmseNSCallAttr() const
QualType getCallResultType(const ASTContext &Context) const
Determine the type of an expression that calls a function of this type.
GNUNullExpr - Implements the GNU __null extension, which is a name for a null pointer constant that h...
static GenericSelectionExpr * Create(const ASTContext &Context, SourceLocation GenericLoc, Expr *ControllingExpr, ArrayRef< TypeSourceInfo * > AssocTypes, ArrayRef< Expr * > AssocExprs, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack, unsigned ResultIndex)
Create a non-result-dependent generic selection expression accepting an expression predicate.
One of these records is kept for each identifier that is lexed.
bool isEditorPlaceholder() const
Return true if this identifier is an editor placeholder.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
ImaginaryLiteral - We support imaginary integer and floating point literals, like "1....
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
ImplicitConversionSequence - Represents an implicit conversion sequence, which may be a standard conv...
Represents a field injected from an anonymous union/struct into the parent scope.
Describes an C or C++ initializer list.
Describes the kind of initialization being performed, along with location information for tokens rela...
static InitializationKind CreateCopy(SourceLocation InitLoc, SourceLocation EqualLoc, bool AllowExplicitConvs=false)
Create a copy initialization.
static InitializationKind CreateDirectList(SourceLocation InitLoc)
static InitializationKind CreateCStyleCast(SourceLocation StartLoc, SourceRange TypeRange, bool InitList)
Create a direct initialization for a C-style cast.
ExprResult Perform(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, QualType *ResultType=nullptr)
Perform the actual initialization of the given entity based on the computed initialization sequence.
Describes an entity that is being initialized.
void setParameterCFAudited()
static InitializedEntity InitializeStmtExprResult(SourceLocation ReturnLoc, QualType Type)
static InitializedEntity InitializeTemporary(QualType Type)
Create the initialization entity for a temporary.
static InitializedEntity InitializeBlock(SourceLocation BlockVarLoc, QualType Type)
static InitializedEntity InitializeParameter(ASTContext &Context, ParmVarDecl *Parm)
Create the initialization entity for a parameter.
static InitializedEntity InitializeCompoundLiteralInit(TypeSourceInfo *TSI)
Create the entity for a compound literal initializer.
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
Represents the declaration of a label.
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
CXXMethodDecl * getCallOperator() const
Retrieve the function call operator associated with this lambda expression.
FPEvalMethodKind
Possible float expression evaluation method choices.
@ FEM_Extended
Use extended type for fp arithmetic.
@ FEM_Double
Use the type double for fp arithmetic.
@ FEM_UnsetOnCommandLine
Used only for FE option processing; this is only used to indicate that the user did not specify an ex...
@ FEM_Source
Use the declared type for fp arithmetic.
@ CX_Promoted
Implementation of complex division using algebraic formulas at higher precision.
@ None
Permit no implicit vector bitcasts.
@ Integer
Permit vector bitcasts between integer vectors with different numbers of elements but the same total ...
@ All
Permit vector bitcasts between all vectors with the same total bit-width.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
clang::ObjCRuntime ObjCRuntime
bool isSignedOverflowDefined() const
bool allowArrayReturnTypes() const
unsigned getOpenCLCompatibleVersion() const
Return the OpenCL version that kernel language is compatible with.
static StringRef getSourceText(CharSourceRange Range, const SourceManager &SM, const LangOptions &LangOpts, bool *Invalid=nullptr)
Returns a string for the source that the range encompasses.
static SourceLocation AdvanceToTokenCharacter(SourceLocation TokStart, unsigned Characters, const SourceManager &SM, const LangOptions &LangOpts)
AdvanceToTokenCharacter - If the current SourceLocation specifies a location at the start of a token,...
static std::string Stringify(StringRef Str, bool Charify=false)
Stringify - Convert the specified string into a C string by i) escaping '\' and " characters and ii) ...
Represents the results of name lookup.
DeclClass * getAsSingle() const
MS property subscript expression.
Keeps track of the mangled names of lambda expressions and block literals within a particular context...
virtual unsigned getManglingNumber(const CXXMethodDecl *CallOperator)=0
Retrieve the mangling number of a new lambda expression with the given call operator within this cont...
MatrixSingleSubscriptExpr - Matrix single subscript expression for the MatrixType extension when you ...
MatrixSubscriptExpr - Matrix subscript expression for the MatrixType extension.
Represents a matrix type, as defined in the Matrix Types clang extensions.
QualType getElementType() const
Returns type of the elements being stored in the matrix.
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
SourceLocation getMemberLoc() const
getMemberLoc - Return the location of the "member", in X->F, it is the location of 'F'.
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
static MemberExpr * Create(const ASTContext &C, Expr *Base, bool IsArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *MemberDecl, DeclAccessPair FoundDecl, DeclarationNameInfo MemberNameInfo, const TemplateArgumentListInfo *TemplateArgs, QualType T, ExprValueKind VK, ExprObjectKind OK, NonOdrUseReason NOUR)
bool performsVirtualDispatch(const LangOptions &LO) const
Returns true if virtual dispatch is performed.
SourceLocation getBeginLoc() const LLVM_READONLY
This represents a decl that may have a name.
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
std::string getQualifiedNameAsString() const
Linkage getFormalLinkage() const
Get the linkage from a semantic point of view.
bool isExternallyVisible() const
bool isCXXClassMember() const
Determine whether this declaration is a C++ class member.
Represent a C++ namespace.
A C++ nested-name-specifier augmented with source location information.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
CXXRecordDecl * getAsRecordDecl() const
Retrieve the record declaration stored in this nested name specifier, or null.
@ Type
A type, stored as a Type*.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
NumericLiteralParser - This performs strict semantic analysis of the content of a ppnumber,...
Represents an ObjC class declaration.
bool hasDefinition() const
Determine whether this class has been defined.
ivar_iterator ivar_begin() const
ObjCInterfaceDecl * getSuperClass() const
Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...
ObjCIsaExpr - Represent X->isa and X.isa when X is an ObjC 'id' type.
ObjCIvarDecl - Represents an ObjC instance variable.
ObjCIvarRefExpr - A reference to an ObjC instance variable.
SourceLocation getBeginLoc() const LLVM_READONLY
SourceLocation getLocation() const
SourceLocation getOpLoc() const
SourceLocation getEndLoc() const LLVM_READONLY
const Expr * getBase() const
An expression that sends a message to the given Objective-C object or class.
const ObjCMethodDecl * getMethodDecl() const
ObjCMethodDecl - Represents an instance or class method declaration.
ImplicitParamDecl * getSelfDecl() const
bool isClassMethod() const
Represents a pointer to an Objective C object.
const ObjCInterfaceType * getInterfaceType() const
If this pointer points to an Objective C @interface type, gets the type for that interface.
Represents one property declaration in an Objective-C interface.
Represents an Objective-C protocol declaration.
bool allowsSizeofAlignof() const
Does this runtime allow sizeof or alignof on object types?
bool allowsPointerArithmetic() const
Does this runtime allow pointer arithmetic on objects?
static OffsetOfExpr * Create(const ASTContext &C, QualType type, SourceLocation OperatorLoc, TypeSourceInfo *tsi, ArrayRef< OffsetOfNode > comps, ArrayRef< Expr * > exprs, SourceLocation RParenLoc)
Helper class for OffsetOfExpr.
void * getAsOpaquePtr() const
static OpaquePtr getFromOpaquePtr(void *P)
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
@ CSK_Normal
Normal lookup.
SmallVectorImpl< OverloadCandidate >::iterator iterator
OverloadingResult BestViableFunction(Sema &S, SourceLocation Loc, OverloadCandidateSet::iterator &Best)
Find the best viable function on this overload set, if it exists.
A reference to an overloaded function set, either an UnresolvedLookupExpr or an UnresolvedMemberExpr.
static FindResult find(Expr *E)
Finds the overloaded expression in the given expression E of OverloadTy.
ParenExpr - This represents a parenthesized expression, e.g.
SourceLocation getBeginLoc() const LLVM_READONLY
const Expr * getSubExpr() const
bool isProducedByFoldExpansion() const
Expr * getExpr(unsigned Init)
static ParenListExpr * Create(const ASTContext &Ctx, SourceLocation LParenLoc, ArrayRef< Expr * > Exprs, SourceLocation RParenLoc)
Create a paren list.
unsigned getNumExprs() const
Return the number of expressions in this paren list.
SourceLocation getLParenLoc() const
SourceLocation getRParenLoc() const
Represents a parameter to a function.
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
static ParmVarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S, Expr *DefArg)
bool isEquivalent(PointerAuthQualifier Other) const
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
static PredefinedExpr * Create(const ASTContext &Ctx, SourceLocation L, QualType FNTy, PredefinedIdentKind IK, bool IsTransparent, StringLiteral *SL)
Create a PredefinedExpr.
static std::string ComputeName(PredefinedIdentKind IK, const Decl *CurrentDecl, bool ForceElaboratedPrinting=false)
bool isMacroDefined(StringRef Id)
IdentifierTable & getIdentifierTable()
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool hasQualifiers() const
Determine whether this type has any qualifiers.
bool hasNonTrivialToPrimitiveCopyCUnion() const
Check if this is or contains a C union that is non-trivial to copy, which is a union that has a membe...
QualType getNonLValueExprType(const ASTContext &Context) const
Determine the type of a (typically non-lvalue) expression with the specified result type.
bool isNonWeakInMRRWithObjCWeak(const ASTContext &Context) const
bool isAddressSpaceOverlapping(QualType T, const ASTContext &Ctx) const
Returns true if address space qualifiers overlap with T address space qualifiers.
QualType withConst() const
void addConst()
Add the const type qualifier to this QualType.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
LangAS getAddressSpace() const
Return the address space of this type.
bool hasNonTrivialToPrimitiveDestructCUnion() const
Check if this is or contains a C union that is non-trivial to destruct, which is a union that has a m...
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
bool isCXX98PODType(const ASTContext &Context) const
Return true if this is a POD type according to the rules of the C++98 standard, regardless of the cur...
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
bool isWebAssemblyReferenceType() const
Returns true if it is a WebAssembly Reference Type.
QualType withCVRQualifiers(unsigned CVR) const
bool isCForbiddenLValueType() const
Determine whether expressions of the given type are forbidden from being lvalues in C.
bool isConstQualified() const
Determine whether this type is const-qualified.
QualType getAtomicUnqualifiedType() const
Remove all qualifiers including _Atomic.
DestructionKind isDestructedType() const
Returns a nonzero value if objects of this type require non-trivial work to clean up after.
QualType getSingleStepDesugaredType(const ASTContext &Context) const
Return the specified type with one level of "sugar" removed from the type.
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
bool isPODType(const ASTContext &Context) const
Determine whether this is a Plain Old Data (POD) type (C++ 3.9p10).
bool isAtLeastAsQualifiedAs(QualType Other, const ASTContext &Ctx) const
Determine whether this type is at least as qualified as the other given type, requiring exact equalit...
Qualifiers getLocalQualifiers() const
Retrieve the set of qualifiers local to this particular QualType instance, not including any qualifie...
bool hasNonTrivialToPrimitiveDefaultInitializeCUnion() const
Check if this is or contains a C union that is non-trivial to default-initialize, which is a union th...
The collection of all-type qualifiers we support.
unsigned getCVRQualifiers() const
void removeCVRQualifiers(unsigned mask)
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
@ OCL_Weak
Reading or writing from this object requires a barrier call.
@ OCL_Autoreleasing
Assigning into this object requires a lifetime extension.
void removeObjCLifetime()
bool compatiblyIncludes(Qualifiers other, const ASTContext &Ctx) const
Determines if these qualifiers compatibly include another set.
static bool isAddressSpaceSupersetOf(LangAS A, LangAS B, const ASTContext &Ctx)
Returns true if address space A is equal to or a superset of B.
void removeAddressSpace()
void setAddressSpace(LangAS space)
PointerAuthQualifier getPointerAuth() const
ObjCLifetime getObjCLifetime() const
Qualifiers withoutObjCLifetime() const
Qualifiers withoutObjCGCAttr() const
LangAS getAddressSpace() const
bool compatiblyIncludesObjCLifetime(Qualifiers other) const
Determines if these qualifiers compatibly include another set of qualifiers from the narrow perspecti...
Represents a struct/union/class.
bool hasFlexibleArrayMember() const
field_iterator field_end() const
field_range fields() const
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)
ObjCMethodDecl * LookupInstanceMethodInGlobalPool(Selector Sel, SourceRange R, bool receiverIdOrClass=false)
LookupInstanceMethodInGlobalPool - Returns the method and warns if there are multiple signatures.
ObjCLiteralKind CheckLiteralKind(Expr *FromE)
ObjCMethodDecl * LookupMethodInObjectType(Selector Sel, QualType Ty, bool IsInstance)
LookupMethodInType - Look up a method in an ObjCObjectType.
void CheckObjCBridgeRelatedCast(QualType castType, Expr *castExpr)
QualType FindCompositeObjCPointerType(ExprResult &LHS, ExprResult &RHS, SourceLocation QuestionLoc)
FindCompositeObjCPointerType - Helper method to find composite type of two objective-c pointer types ...
void CheckTollFreeBridgeCast(QualType castType, Expr *castExpr)
const DeclContext * getCurObjCLexicalContext() const
void checkRetainCycles(ObjCMessageExpr *msg)
checkRetainCycles - Check whether an Objective-C message send might create an obvious retain cycle.
void EmitRelatedResultTypeNote(const Expr *E)
If the given expression involves a message send to a method with a related result type,...
void EmitRelatedResultTypeNoteForReturn(QualType destType)
Given that we had incompatible pointer types in a return statement, check whether we're in a method w...
void diagnoseARCUnbridgedCast(Expr *e)
Given that we saw an expression with the ARCUnbridgedCastTy placeholder type, complain bitterly.
ObjCMethodDecl * LookupMethodInQualifiedType(Selector Sel, const ObjCObjectPointerType *OPT, bool IsInstance)
LookupMethodInQualifiedType - Lookups up a method in protocol qualifier list of a qualified objective...
ARCConversionResult CheckObjCConversion(SourceRange castRange, QualType castType, Expr *&op, CheckedConversionKind CCK, bool Diagnose=true, bool DiagnoseCFAudited=false, BinaryOperatorKind Opc=BO_PtrMemD, bool IsReinterpretCast=false)
Checks for invalid conversions and casts between retainable pointers and other pointer kinds for ARC ...
Expr * stripARCUnbridgedCast(Expr *e)
stripARCUnbridgedCast - Given an expression of ARCUnbridgedCast type, remove the placeholder cast.
ExprResult BuildObjCSubscriptExpression(SourceLocation RB, Expr *BaseExpr, Expr *IndexExpr, ObjCMethodDecl *getterMethod, ObjCMethodDecl *setterMethod)
Build an ObjC subscript pseudo-object expression, given that that's supported by the runtime.
std::unique_ptr< NSAPI > NSAPIObj
Caches identifiers/selectors for NSFoundation APIs.
void CheckDeclReference(SourceLocation Loc, Expr *E, Decl *D)
ExprResult ActOnArraySectionExpr(Expr *Base, SourceLocation LBLoc, Expr *LowerBound, SourceLocation ColonLocFirst, Expr *Length, SourceLocation RBLoc)
Checks and creates an Array Section used in an OpenACC construct/clause.
ExprResult ActOnOpenMPCall(ExprResult Call, Scope *Scope, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig)
Given the potential call expression Call, determine if there is a specialization via the OpenMP decla...
void tryCaptureOpenMPLambdas(ValueDecl *V)
Function tries to capture lambda's captured variables in the OpenMP region before the original lambda...
OpenMPClauseKind isOpenMPPrivateDecl(ValueDecl *D, unsigned Level, unsigned CapLevel) const
Check if the specified variable is used in 'private' clause.
VarDecl * isOpenMPCapturedDecl(ValueDecl *D, bool CheckScopeInfo=false, unsigned StopAt=0)
Check if the specified variable is used in one of the private clauses (private, firstprivate,...
ExprResult ActOnOMPArraySectionExpr(Expr *Base, SourceLocation LBLoc, Expr *LowerBound, SourceLocation ColonLocFirst, SourceLocation ColonLocSecond, Expr *Length, Expr *Stride, SourceLocation RBLoc)
bool isOpenMPCapturedByRef(const ValueDecl *D, unsigned Level, unsigned OpenMPCaptureLevel) const
Return true if the provided declaration VD should be captured by reference.
bool isOpenMPTargetCapturedDecl(const ValueDecl *D, unsigned Level, unsigned CaptureLevel) const
Check if the specified variable is captured by 'target' directive.
bool isOpenMPGlobalCapturedDecl(ValueDecl *D, unsigned Level, unsigned CaptureLevel) const
Check if the specified global variable must be captured by outer capture regions.
bool isInOpenMPDeclareTargetContext() const
Return true inside OpenMP declare target region.
void checkDeclIsAllowedInOpenMPTarget(Expr *E, Decl *D, SourceLocation IdLoc=SourceLocation())
Check declaration inside target region.
const ValueDecl * getOpenMPDeclareMapperVarName() const
ExprResult checkAssignment(Scope *S, SourceLocation OpLoc, BinaryOperatorKind Opcode, Expr *LHS, Expr *RHS)
ExprResult checkIncDec(Scope *S, SourceLocation OpLoc, UnaryOperatorKind Opcode, Expr *Op)
Check an increment or decrement of a pseudo-object expression.
ExprResult checkRValue(Expr *E)
void CheckDeviceUseOfDecl(NamedDecl *ND, SourceLocation Loc)
Issues a deferred diagnostic if use of the declaration designated by 'ND' is invalid in a device cont...
RAII object used to temporarily allow the C++ 'this' expression to be used, with the given qualifiers...
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
RAII class used to indicate that we are performing provisional semantic analysis to determine the val...
Abstract base class used for diagnosing integer constant expression violations.
virtual SemaDiagnosticBuilder diagnoseNotICE(Sema &S, SourceLocation Loc)=0
virtual SemaDiagnosticBuilder diagnoseNotICEType(Sema &S, SourceLocation Loc, QualType T)
virtual SemaDiagnosticBuilder diagnoseFold(Sema &S, SourceLocation Loc)
Sema - This implements semantic analysis and AST building for C.
const FieldDecl * getSelfAssignmentClassMemberCandidate(const ValueDecl *SelfAssigned)
Returns a field in a CXXRecordDecl that has the same name as the decl SelfAssigned when inside a CXXM...
bool TryFunctionConversion(QualType FromType, QualType ToType, QualType &ResultTy) const
Same as IsFunctionConversion, but if this would return true, it sets ResultTy to ToType.
void DefineImplicitLambdaToFunctionPointerConversion(SourceLocation CurrentLoc, CXXConversionDecl *Conv)
Define the "body" of the conversion from a lambda object to a function pointer.
ParsedType CreateParsedType(QualType T, TypeSourceInfo *TInfo)
Package the given type and TSI into a ParsedType.
ExprResult ActOnCXXParenListInitExpr(ArrayRef< Expr * > Args, QualType T, unsigned NumUserSpecifiedExprs, SourceLocation InitLoc, SourceLocation LParenLoc, SourceLocation RParenLoc)
QualType getCurrentThisType()
Try to retrieve the type of the 'this' pointer.
std::optional< ExpressionEvaluationContextRecord::InitializationContext > InnermostDeclarationWithDelayedImmediateInvocations() const
SmallVector< CodeSynthesisContext, 16 > CodeSynthesisContexts
List of active code synthesis contexts.
Scope * getCurScope() const
Retrieve the parser's current scope.
ExprResult ActOnUnaryOp(Scope *S, SourceLocation OpLoc, tok::TokenKind Op, Expr *Input, bool IsAfterAmp=false)
Unary Operators. 'Tok' is the token for the operator.
bool RequireCompleteSizedExprType(Expr *E, unsigned DiagID, const Ts &...Args)
ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp=false)
void BuildBasePathArray(const CXXBasePaths &Paths, CXXCastPath &BasePath)
bool isAlwaysConstantEvaluatedContext() const
bool isExternalWithNoLinkageType(const ValueDecl *VD) const
Determine if VD, which must be a variable or function, is an external symbol that nonetheless can't b...
bool isAttrContext() const
void DiagnoseUnusedParameters(ArrayRef< ParmVarDecl * > Parameters)
Diagnose any unused parameters in the given sequence of ParmVarDecl pointers.
ExprResult BuildBoolLiteral(SourceLocation Loc, bool Value)
Build a boolean-typed literal expression.
ExprResult IgnoredValueConversions(Expr *E)
IgnoredValueConversions - Given that an expression's result is syntactically ignored,...
bool RequireCompleteSizedType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupObjCImplicitSelfParam
Look up implicit 'self' parameter of an objective-c method.
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
void DiagnoseSentinelCalls(const NamedDecl *D, SourceLocation Loc, ArrayRef< Expr * > Args)
DiagnoseSentinelCalls - This routine checks whether a call or message-send is to a declaration with t...
ExprResult CreateBuiltinMatrixSingleSubscriptExpr(Expr *Base, Expr *RowIdx, SourceLocation RBLoc)
ExprResult ActOnConstantExpression(ExprResult Res)
QualType CheckLogicalOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
ExprResult ActOnCompoundLiteral(SourceLocation LParenLoc, ParsedType Ty, SourceLocation RParenLoc, Expr *InitExpr)
bool LookupTemplateName(LookupResult &R, Scope *S, CXXScopeSpec &SS, QualType ObjectType, bool EnteringContext, RequiredTemplateKind RequiredTemplate=SourceLocation(), AssumedTemplateKind *ATK=nullptr, bool AllowTypoCorrection=true)
ImplicitConversionSequence TryImplicitConversion(Expr *From, QualType ToType, bool SuppressUserConversions, AllowedExplicit AllowExplicit, bool InOverloadResolution, bool CStyle, bool AllowObjCWritebackConversion)
ExprResult BuildLiteralOperatorCall(LookupResult &R, DeclarationNameInfo &SuffixInfo, ArrayRef< Expr * > Args, SourceLocation LitEndLoc, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr)
BuildLiteralOperatorCall - Build a UserDefinedLiteral by creating a call to a literal operator descri...
bool areVectorTypesSameSize(QualType srcType, QualType destType)
void DiagnoseAlwaysNonNullPointer(Expr *E, Expr::NullPointerConstantKind NullType, bool IsEqual, SourceRange Range)
Diagnose pointers that are always non-null.
void DefineImplicitMoveAssignment(SourceLocation CurrentLocation, CXXMethodDecl *MethodDecl)
Defines an implicitly-declared move assignment operator.
VariadicCallType getVariadicCallType(FunctionDecl *FDecl, const FunctionProtoType *Proto, Expr *Fn)
ExprResult CreateBuiltinBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr, bool ForFoldExpression=false)
CreateBuiltinBinOp - Creates a new built-in binary operation with operator Opc at location TokLoc.
void DecomposeUnqualifiedId(const UnqualifiedId &Id, TemplateArgumentListInfo &Buffer, DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *&TemplateArgs)
Decomposes the given name into a DeclarationNameInfo, its location, and possibly a list of template a...
bool InstantiateDefaultArgument(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param)
void ActOnStartStmtExpr()
ExprResult CreateOverloadedArraySubscriptExpr(SourceLocation LLoc, SourceLocation RLoc, Expr *Base, MultiExprArg Args)
void WarnOnPendingNoDerefs(ExpressionEvaluationContextRecord &Rec)
Emit a warning for all pending noderef expressions that we recorded.
void ActOnStmtExprError()
void MarkDeclarationsReferencedInExpr(Expr *E, bool SkipLocalVariables=false, ArrayRef< const Expr * > StopAt={})
Mark any declarations that appear within this expression or any potentially-evaluated subexpressions ...
bool BoundsSafetyCheckAssignmentToCountAttrPtr(QualType LHSTy, Expr *RHSExpr, AssignmentAction Action, SourceLocation Loc, const ValueDecl *Assignee, bool ShowFullyQualifiedAssigneeName)
Perform Bounds Safety Semantic checks for assigning to a __counted_by or __counted_by_or_null pointer...
QualType UsualArithmeticConversions(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, ArithConvKind ACK)
UsualArithmeticConversions - Performs various conversions that are common to binary operators (C99 6....
void CheckFloatComparison(SourceLocation Loc, const Expr *LHS, const Expr *RHS, BinaryOperatorKind Opcode)
Check for comparisons of floating-point values using == and !=.
void CheckPtrComparisonWithNullChar(ExprResult &E, ExprResult &NullE)
NamedDecl * ImplicitlyDefineFunction(SourceLocation Loc, IdentifierInfo &II, Scope *S)
ImplicitlyDefineFunction - An undeclared identifier was used in a function call, forming a call to an...
unsigned CapturingFunctionScopes
Track the number of currently active capturing scopes.
void PushExpressionEvaluationContext(ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl=nullptr, ExpressionEvaluationContextRecord::ExpressionKind Type=ExpressionEvaluationContextRecord::EK_Other)
ExprResult CheckBooleanCondition(SourceLocation Loc, Expr *E, bool IsConstexpr=false)
CheckBooleanCondition - Diagnose problems involving the use of the given expression as a boolean cond...
@ Boolean
A boolean condition, from 'if', 'while', 'for', or 'do'.
@ Switch
An integral condition for a 'switch' statement.
@ ConstexprIf
A constant boolean condition from 'if constexpr'.
bool needsRebuildOfDefaultArgOrInit() const
bool GatherArgumentsForCall(SourceLocation CallLoc, FunctionDecl *FDecl, const FunctionProtoType *Proto, unsigned FirstParam, ArrayRef< Expr * > Args, SmallVectorImpl< Expr * > &AllArgs, VariadicCallType CallType=VariadicCallType::DoesNotApply, bool AllowExplicit=false, bool IsListInitialization=false)
GatherArgumentsForCall - Collector argument expressions for various form of call prototypes.
SourceLocation LocationOfExcessPrecisionNotSatisfied
SmallVector< sema::FunctionScopeInfo *, 4 > FunctionScopes
Stack containing information about each of the nested function, block, and method scopes that are cur...
Preprocessor & getPreprocessor() const
const ExpressionEvaluationContextRecord & currentEvaluationContext() const
Scope * getScopeForContext(DeclContext *Ctx)
Determines the active Scope associated with the given declaration context.
QualType GetSignedSizelessVectorType(QualType V)
bool CheckCXXThisCapture(SourceLocation Loc, bool Explicit=false, bool BuildAndDiagnose=true, const unsigned *const FunctionScopeIndexToStopAt=nullptr, bool ByCopy=false)
Make sure the value of 'this' is actually available in the current context, if it is a potentially ev...
llvm::SmallPtrSet< ConstantExpr *, 4 > FailedImmediateInvocations
ExprResult ActOnCharacterConstant(const Token &Tok, Scope *UDLScope=nullptr)
DefaultedComparisonKind getDefaultedComparisonKind(const FunctionDecl *FD)
ExprResult MaybeBindToTemporary(Expr *E)
MaybeBindToTemporary - If the passed in expression has a record type with a non-trivial destructor,...
void CheckCompleteDestructorVariant(SourceLocation CurrentLocation, CXXDestructorDecl *Dtor)
Do semantic checks to allow the complete destructor variant to be emitted when the destructor is defi...
void MarkCaptureUsedInEnclosingContext(ValueDecl *Capture, SourceLocation Loc, unsigned CapturingScopeIndex)
llvm::SmallSetVector< Expr *, 4 > MaybeODRUseExprSet
Store a set of either DeclRefExprs or MemberExprs that contain a reference to a variable (constant) t...
Expr * BuildBuiltinCallExpr(SourceLocation Loc, Builtin::ID Id, MultiExprArg CallArgs)
BuildBuiltinCallExpr - Create a call to a builtin function specified by Id.
QualType CheckVectorOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, bool AllowBothBool, bool AllowBoolConversion, bool AllowBoolOperation, bool ReportInvalid)
type checking for vector binary operators.
LiteralOperatorLookupResult LookupLiteralOperator(Scope *S, LookupResult &R, ArrayRef< QualType > ArgTys, bool AllowRaw, bool AllowTemplate, bool AllowStringTemplate, bool DiagnoseMissing, StringLiteral *StringLit=nullptr)
LookupLiteralOperator - Determine which literal operator should be used for a user-defined literal,...
FPOptionsOverride CurFPFeatureOverrides()
bool isValidSveBitcast(QualType srcType, QualType destType)
Are the two types SVE-bitcast-compatible types?
ExprResult ActOnDependentIdExpression(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, bool isAddressOfOperand, const TemplateArgumentListInfo *TemplateArgs)
ActOnDependentIdExpression - Handle a dependent id-expression that was just parsed.
ExprResult BuildStmtExpr(SourceLocation LPLoc, Stmt *SubStmt, SourceLocation RPLoc, unsigned TemplateDepth)
ExprResult BuildCallToMemberFunction(Scope *S, Expr *MemExpr, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallToMemberFunction - Build a call to a member function.
NamedDecl * LookupSingleName(Scope *S, DeclarationName Name, SourceLocation Loc, LookupNameKind NameKind, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)
Look up a name, looking for a single declaration.
AssignConvertType CheckSingleAssignmentConstraints(QualType LHSType, ExprResult &RHS, bool Diagnose=true, bool DiagnoseCFAudited=false, bool ConvertRHS=true)
Check assignment constraints for an assignment of RHS to LHSType.
ExprResult BuildVAArgExpr(SourceLocation BuiltinLoc, Expr *E, TypeSourceInfo *TInfo, SourceLocation RPLoc)
ExpressionEvaluationContextRecord & parentEvaluationContext()
FunctionDecl * getCurFunctionDecl(bool AllowLambda=false) const
Returns a pointer to the innermost enclosing function, or nullptr if the current context is not insid...
ExprResult PerformContextualImplicitConversion(SourceLocation Loc, Expr *FromE, ContextualImplicitConverter &Converter)
Perform a contextual implicit conversion.
bool CheckConceptUseInDefinition(NamedDecl *Concept, SourceLocation Loc)
ExprResult UsualUnaryConversions(Expr *E)
UsualUnaryConversions - Performs various conversions that are common to most operators (C99 6....
bool checkPointerAuthEnabled(SourceLocation Loc, SourceRange Range)
ExprResult CheckUnevaluatedOperand(Expr *E)
ExprResult DefaultVariadicArgumentPromotion(Expr *E, VariadicCallType CT, FunctionDecl *FDecl)
void DiagnoseCommaOperator(const Expr *LHS, SourceLocation Loc)
Look for instances where it is likely the comma operator is confused with another operator.
ExprResult tryConvertExprToType(Expr *E, QualType Ty)
Try to convert an expression E to type Ty.
bool DeduceReturnType(FunctionDecl *FD, SourceLocation Loc, bool Diagnose=true)
std::vector< Token > ExpandFunctionLocalPredefinedMacros(ArrayRef< Token > Toks)
bool CheckMatrixCast(SourceRange R, QualType DestTy, QualType SrcTy, CastKind &Kind)
QualType CheckAddressOfOperand(ExprResult &Operand, SourceLocation OpLoc)
CheckAddressOfOperand - The operand of & must be either a function designator or an lvalue designatin...
ParmVarDecl * BuildParmVarDeclForTypedef(DeclContext *DC, SourceLocation Loc, QualType T)
Synthesizes a variable for a parameter arising from a typedef.
ExprResult CheckSwitchCondition(SourceLocation SwitchLoc, Expr *Cond)
static bool TooManyArguments(size_t NumParams, size_t NumArgs, bool PartialOverloading=false)
To be used for checking whether the arguments being passed to function exceeds the number of paramete...
bool ShouldSplatAltivecScalarInCast(const VectorType *VecTy)
QualType CheckVectorLogicalOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
QualType InvalidOperands(SourceLocation Loc, ExprResult &LHS, ExprResult &RHS)
the following "Check" methods will return a valid/converted QualType or a null QualType (indicating a...
bool DiagIfReachable(SourceLocation Loc, ArrayRef< const Stmt * > Stmts, const PartialDiagnostic &PD)
Conditionally issue a diagnostic based on the statements's reachability analysis.
bool BoundsSafetyCheckUseOfCountAttrPtr(const Expr *E)
Perform Bounds Safety semantic checks for uses of invalid uses counted_by or counted_by_or_null point...
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReceiver=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
QualType CheckShiftOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc, bool IsCompAssign=false)
DiagnosticsEngine & getDiagnostics() const
ExprResult MaybeConvertParenListExprToParenExpr(Scope *S, Expr *ME)
This is not an AltiVec-style cast or or C++ direct-initialization, so turn the ParenListExpr into a s...
bool checkAddressOfFunctionIsAvailable(const FunctionDecl *Function, bool Complain=false, SourceLocation Loc=SourceLocation())
Returns whether the given function's address can be taken or not, optionally emitting a diagnostic if...
bool CheckCaseExpression(Expr *E)
QualType CheckMatrixElementwiseOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign)
Type checking for matrix binary operators.
bool tryToRecoverWithCall(ExprResult &E, const PartialDiagnostic &PD, bool ForceComplain=false, bool(*IsPlausibleResult)(QualType)=nullptr)
Try to recover by turning the given expression into a call.
FunctionDecl * ResolveAddressOfOverloadedFunction(Expr *AddressOfExpr, QualType TargetType, bool Complain, DeclAccessPair &Found, bool *pHadMultipleCandidates=nullptr)
ResolveAddressOfOverloadedFunction - Try to resolve the address of an overloaded function (C++ [over....
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
void LookupOverloadedOperatorName(OverloadedOperatorKind Op, Scope *S, UnresolvedSetImpl &Functions)
void checkSpecializationReachability(SourceLocation Loc, NamedDecl *Spec)
void CleanupVarDeclMarking()
ExprResult DefaultFunctionArrayLvalueConversion(Expr *E, bool Diagnose=true)
bool isImmediateFunctionContext() const
ASTContext & getASTContext() const
std::unique_ptr< sema::FunctionScopeInfo, PoppedFunctionScopeDeleter > PoppedFunctionScopePtr
ExprResult CallExprUnaryConversions(Expr *E)
CallExprUnaryConversions - a special case of an unary conversion performed on a function designator o...
void translateTemplateArguments(const ASTTemplateArgsPtr &In, TemplateArgumentListInfo &Out)
Translates template arguments as provided by the parser into template arguments used by semantic anal...
ExprResult BuildUnaryOp(Scope *S, SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *Input, bool IsAfterAmp=false)
bool tryCaptureVariable(ValueDecl *Var, SourceLocation Loc, TryCaptureKind Kind, SourceLocation EllipsisLoc, bool BuildAndDiagnose, QualType &CaptureType, QualType &DeclRefType, const unsigned *const FunctionScopeIndexToStopAt)
Try to capture the given variable.
void MarkVariableReferenced(SourceLocation Loc, VarDecl *Var)
Mark a variable referenced, and check whether it is odr-used (C++ [basic.def.odr]p2,...
void LookupBinOp(Scope *S, SourceLocation OpLoc, BinaryOperatorKind Opc, UnresolvedSetImpl &Functions)
ExprResult BuildTemplateIdExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, bool RequiresADL, const TemplateArgumentListInfo *TemplateArgs)
void DiagnoseUnguardedAvailabilityViolations(Decl *FD)
Issue any -Wunguarded-availability warnings in FD.
void PopExpressionEvaluationContext()
ExprResult CreateOverloadedBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, const UnresolvedSetImpl &Fns, Expr *LHS, Expr *RHS, bool RequiresADL=true, bool AllowRewrittenCandidates=true, FunctionDecl *DefaultedFn=nullptr)
Create a binary operation that may resolve to an overloaded operator.
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
ExprResult DefaultArgumentPromotion(Expr *E)
DefaultArgumentPromotion (C99 6.5.2.2p6).
ExprResult BuildPredefinedExpr(SourceLocation Loc, PredefinedIdentKind IK)
bool CheckArgsForPlaceholders(MultiExprArg args)
Check an argument list for placeholders that we won't try to handle later.
bool UseArgumentDependentLookup(const CXXScopeSpec &SS, const LookupResult &R, bool HasTrailingLParen)
void InstantiateVariableDefinition(SourceLocation PointOfInstantiation, VarDecl *Var, bool Recursive=false, bool DefinitionRequired=false, bool AtEndOfTU=false)
Instantiate the definition of the given variable from its template.
ExprResult BuildCompoundLiteralExpr(SourceLocation LParenLoc, TypeSourceInfo *TInfo, SourceLocation RParenLoc, Expr *LiteralExpr)
ExprResult ActOnAddrLabel(SourceLocation OpLoc, SourceLocation LabLoc, LabelDecl *TheDecl)
ActOnAddrLabel - Parse the GNU address of label extension: "&&foo".
QualType CheckSubtractionOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc, QualType *CompLHSTy=nullptr)
DefaultedComparisonKind
Kinds of defaulted comparison operator functions.
@ None
This is not a defaultable comparison operator.
ExprResult ActOnParenListExpr(SourceLocation L, SourceLocation R, MultiExprArg Val)
QualType CheckMatrixMultiplyOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign)
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
ObjCMethodDecl * getCurMethodDecl()
getCurMethodDecl - If inside of a method body, this returns a pointer to the method decl for the meth...
DeclRefExpr * BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK, SourceLocation Loc, const CXXScopeSpec *SS=nullptr)
void DefineImplicitMoveConstructor(SourceLocation CurrentLocation, CXXConstructorDecl *Constructor)
DefineImplicitMoveConstructor - Checks for feasibility of defining this constructor as the move const...
ExprResult ActOnChooseExpr(SourceLocation BuiltinLoc, Expr *CondExpr, Expr *LHSExpr, Expr *RHSExpr, SourceLocation RPLoc)
ExprResult CreateGenericSelectionExpr(SourceLocation KeyLoc, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool PredicateIsExpr, void *ControllingExprOrType, ArrayRef< TypeSourceInfo * > Types, ArrayRef< Expr * > Exprs)
ControllingExprOrType is either a TypeSourceInfo * or an Expr *.
ExprResult ActOnUnevaluatedStringLiteral(ArrayRef< Token > StringToks)
void DiagnoseSelfMove(const Expr *LHSExpr, const Expr *RHSExpr, SourceLocation OpLoc)
DiagnoseSelfMove - Emits a warning if a value is moved to itself.
SourceRange getExprRange(Expr *E) const
void AddTemplateOverloadCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false)
Add a C++ function template specialization as a candidate in the candidate set, using template argume...
void DefineImplicitCopyConstructor(SourceLocation CurrentLocation, CXXConstructorDecl *Constructor)
DefineImplicitCopyConstructor - Checks for feasibility of defining this constructor as the copy const...
std::optional< ExpressionEvaluationContextRecord::InitializationContext > OutermostDeclarationWithDelayedImmediateInvocations() const
void DiagnoseUnusedExprResult(const Stmt *S, unsigned DiagID)
DiagnoseUnusedExprResult - If the statement passed in is an expression whose result is unused,...
FPOptions & getCurFPFeatures()
RecordDecl * StdSourceLocationImplDecl
The C++ "std::source_location::__impl" struct, defined in <source_location>.
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
ConditionResult ActOnCondition(Scope *S, SourceLocation Loc, Expr *SubExpr, ConditionKind CK, bool MissingOK=false)
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
@ UPPC_Block
Block expression.
const LangOptions & getLangOpts() const
TypoCorrection CorrectTypo(const DeclarationNameInfo &Typo, Sema::LookupNameKind LookupKind, Scope *S, CXXScopeSpec *SS, CorrectionCandidateCallback &CCC, CorrectTypoKind Mode, DeclContext *MemberContext=nullptr, bool EnteringContext=false, const ObjCObjectPointerType *OPT=nullptr, bool RecordFailure=true)
Try to "correct" a typo in the source code by finding visible declarations whose names are similar to...
QualType CheckComparisonCategoryType(ComparisonCategoryType Kind, SourceLocation Loc, ComparisonCategoryUsage Usage)
Lookup the specified comparison category types in the standard library, an check the VarDecls possibl...
void DiagnoseInvalidJumps(Stmt *Body)
PoppedFunctionScopePtr PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, Decl *D=nullptr, QualType BlockType=QualType())
Pop a function (or block or lambda or captured region) scope from the stack.
QualType CheckCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
CastKind PrepareScalarCast(ExprResult &src, QualType destType)
Prepares for a scalar cast, performing all the necessary stages except the final cast and returning t...
bool tryToFixVariablyModifiedVarType(TypeSourceInfo *&TInfo, QualType &T, SourceLocation Loc, unsigned FailedFoldDiagID)
Attempt to fold a variable-sized type to a constant-sized type, returning true if we were successful.
const FunctionProtoType * ResolveExceptionSpec(SourceLocation Loc, const FunctionProtoType *FPT)
void MarkExpressionAsImmediateEscalating(Expr *E)
NonOdrUseReason getNonOdrUseReasonInCurrentContext(ValueDecl *D)
If D cannot be odr-used in the current expression evaluation context, return a reason explaining why.
void DefineDefaultedComparison(SourceLocation Loc, FunctionDecl *FD, DefaultedComparisonKind DCK)
void diagnoseUnavailableAlignedAllocation(const FunctionDecl &FD, SourceLocation Loc)
Produce diagnostics if FD is an aligned allocation or deallocation function that is unavailable.
bool LookupParsedName(LookupResult &R, Scope *S, CXXScopeSpec *SS, QualType ObjectType, bool AllowBuiltinCreation=false, bool EnteringContext=false)
Performs name lookup for a name that was parsed in the source code, and may contain a C++ scope speci...
void MarkFunctionParmPackReferenced(FunctionParmPackExpr *E)
Perform reference-marking and odr-use handling for a FunctionParmPackExpr.
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)
ExprResult BuildBuiltinOffsetOf(SourceLocation BuiltinLoc, TypeSourceInfo *TInfo, ArrayRef< OffsetOfComponent > Components, SourceLocation RParenLoc)
__builtin_offsetof(type, a.b[123][456].c)
sema::LambdaScopeInfo * getCurLambda(bool IgnoreNonLambdaCapturingScope=false)
Retrieve the current lambda scope info, if any.
ExprResult BuildResolvedCallExpr(Expr *Fn, NamedDecl *NDecl, SourceLocation LParenLoc, ArrayRef< Expr * > Arg, SourceLocation RParenLoc, Expr *Config=nullptr, bool IsExecConfig=false, ADLCallKind UsesADL=ADLCallKind::NotADL)
BuildResolvedCallExpr - Build a call to a resolved expression, i.e.
ExprResult CheckForImmediateInvocation(ExprResult E, FunctionDecl *Decl)
Wrap the expression in a ConstantExpr if it is a potential immediate invocation.
ExprResult TemporaryMaterializationConversion(Expr *E)
If E is a prvalue denoting an unmaterialized temporary, materialize it as an xvalue.
VarArgKind isValidVarArgType(const QualType &Ty)
Determine the degree of POD-ness for an expression.
NamedDeclSetType UnusedPrivateFields
Set containing all declared private fields that are not used.
void DefineInheritingConstructor(SourceLocation UseLoc, CXXConstructorDecl *Constructor)
Define the specified inheriting constructor.
ExprResult ConvertVectorExpr(Expr *E, TypeSourceInfo *TInfo, SourceLocation BuiltinLoc, SourceLocation RParenLoc)
ConvertVectorExpr - Handle __builtin_convertvector.
void CheckUnusedVolatileAssignment(Expr *E)
Check whether E, which is either a discarded-value expression or an unevaluated operand,...
void maybeAddDeclWithEffects(FuncOrBlockDecl *D)
Inline checks from the start of maybeAddDeclWithEffects, to minimize performance impact on code not u...
ExprResult prepareMatrixSplat(QualType MatrixTy, Expr *SplattedExpr)
Prepare SplattedExpr for a matrix splat operation, adding implicit casts if necessary.
void MaybeSuggestAddingStaticToDecl(const FunctionDecl *D)
@ OperatorInExpression
The '<=>' operator was used in an expression and a builtin operator was selected.
ExprResult BuildCXXReflectExpr(SourceLocation OperatorLoc, TypeSourceInfo *TSI)
bool CanUseDecl(NamedDecl *D, bool TreatUnavailableAsInvalid)
Determine whether the use of this declaration is valid, without emitting diagnostics.
void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse)
Perform marking for a reference to an arbitrary declaration.
void MarkVTableUsed(SourceLocation Loc, CXXRecordDecl *Class, bool DefinitionRequired=false)
Note that the vtable for the given class was used at the given location.
QualType InvalidLogicalVectorOperands(SourceLocation Loc, ExprResult &LHS, ExprResult &RHS)
Diagnose cases where a scalar was implicitly converted to a vector and diagnose the underlying types.
bool diagnoseArgIndependentDiagnoseIfAttrs(const NamedDecl *ND, SourceLocation Loc)
Emit diagnostics for the diagnose_if attributes on Function, ignoring any ArgDependent DiagnoseIfAttr...
CleanupInfo Cleanup
Used to control the generation of ExprWithCleanups.
llvm::DenseMap< ParmVarDecl *, SourceLocation > UnparsedDefaultArgLocs
QualType CheckMultiplyDivideOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
QualType FindCompositePointerType(SourceLocation Loc, Expr *&E1, Expr *&E2, bool ConvertArgs=true)
Find a merged pointer type and convert the two expressions to it.
SmallVector< std::deque< PendingImplicitInstantiation >, 8 > SavedPendingInstantiations
bool isQualifiedMemberAccess(Expr *E)
Determine whether the given expression is a qualified member access expression, of a form that could ...
static CastKind ScalarTypeToBooleanCastKind(QualType ScalarTy)
ScalarTypeToBooleanCastKind - Returns the cast kind corresponding to the conversion from scalar type ...
void DefineImplicitLambdaToBlockPointerConversion(SourceLocation CurrentLoc, CXXConversionDecl *Conv)
Define the "body" of the conversion from a lambda object to a block pointer.
void DefineImplicitDestructor(SourceLocation CurrentLocation, CXXDestructorDecl *Destructor)
DefineImplicitDestructor - Checks for feasibility of defining this destructor as the default destruct...
ExprResult BuildCStyleCastExpr(SourceLocation LParenLoc, TypeSourceInfo *Ty, SourceLocation RParenLoc, Expr *Op)
void DiagnoseMisalignedMembers()
Diagnoses the current set of gathered accesses.
sema::FunctionScopeInfo * getCurFunction() const
void checkUnsafeExprAssigns(SourceLocation Loc, Expr *LHS, Expr *RHS)
checkUnsafeExprAssigns - Check whether +1 expr is being assigned to weak/__unsafe_unretained expressi...
ExprResult ActOnEmbedExpr(SourceLocation EmbedKeywordLoc, StringLiteral *BinaryData, StringRef FileName)
bool CheckLoopHintExpr(Expr *E, SourceLocation Loc, bool AllowZero)
QualType CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, ArithConvKind OperationKind)
void DiagnoseAssignmentEnum(QualType DstType, QualType SrcType, Expr *SrcExpr)
DiagnoseAssignmentEnum - Warn if assignment to enum is a constant integer not in the range of enum va...
llvm::DenseMap< const VarDecl *, int > RefsMinusAssignments
Increment when we find a reference; decrement when we find an ignored assignment.
ExprResult CreateOverloadedUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, const UnresolvedSetImpl &Fns, Expr *input, bool RequiresADL=true)
Create a unary operation that may resolve to an overloaded operator.
bool findMacroSpelling(SourceLocation &loc, StringRef name)
Looks through the macro-expansion chain for the given location, looking for a macro expansion with th...
void DefineImplicitDefaultConstructor(SourceLocation CurrentLocation, CXXConstructorDecl *Constructor)
DefineImplicitDefaultConstructor - Checks for feasibility of defining this constructor as the default...
void AddOverloadedCallCandidates(UnresolvedLookupExpr *ULE, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool PartialOverloading=false)
Add the overload candidates named by callee and/or found by argument dependent lookup to the given ov...
ExprResult DefaultLvalueConversion(Expr *E)
ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R, bool NeedsADL, bool AcceptInvalidDecl=false)
bool CheckDerivedToBaseConversion(QualType Derived, QualType Base, SourceLocation Loc, SourceRange Range, CXXCastPath *BasePath=nullptr, bool IgnoreAccess=false)
bool isInLifetimeExtendingContext() const
AssignConvertType CheckTransparentUnionArgumentConstraints(QualType ArgType, ExprResult &RHS)
void maybeExtendBlockObject(ExprResult &E)
Do an explicit extend of the given block pointer if we're in ARC.
ExprResult ActOnGenericSelectionExpr(SourceLocation KeyLoc, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool PredicateIsExpr, void *ControllingExprOrType, ArrayRef< ParsedType > ArgTypes, ArrayRef< Expr * > ArgExprs)
ControllingExprOrType is either an opaque pointer coming out of a ParsedType or an Expr *.
void ActOnBlockError(SourceLocation CaretLoc, Scope *CurScope)
ActOnBlockError - If there is an error parsing a block, this callback is invoked to pop the informati...
ExprResult prepareVectorSplat(QualType VectorTy, Expr *SplattedExpr)
Prepare SplattedExpr for a vector splat operation, adding implicit casts if necessary.
bool IsAssignConvertCompatible(AssignConvertType ConvTy)
sema::BlockScopeInfo * getCurBlock()
Retrieve the current block, if any.
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
MaterializeTemporaryExpr * CreateMaterializeTemporaryExpr(QualType T, Expr *Temporary, bool BoundToLvalueReference)
ExprResult checkUnknownAnyCast(SourceRange TypeRange, QualType CastType, Expr *CastExpr, CastKind &CastKind, ExprValueKind &VK, CXXCastPath &Path)
Check a cast of an unknown-any type.
MultiLevelTemplateArgumentList getTemplateInstantiationArgs(const NamedDecl *D, const DeclContext *DC=nullptr, bool Final=false, std::optional< ArrayRef< TemplateArgument > > Innermost=std::nullopt, bool RelativeToPrimary=false, const FunctionDecl *Pattern=nullptr, bool ForConstraintInstantiation=false, bool SkipForSpecialization=false, bool ForDefaultArgumentSubstitution=false)
Retrieve the template argument list(s) that should be used to instantiate the definition of the given...
SuppressedDiagnosticsMap SuppressedDiagnostics
DeclarationNameInfo GetNameFromUnqualifiedId(const UnqualifiedId &Name)
Retrieves the declaration name from a parsed unqualified-id.
std::deque< PendingImplicitInstantiation > PendingLocalImplicitInstantiations
The queue of implicit template instantiations that are required and must be performed within the curr...
void DiagnoseUnsatisfiedConstraint(const ConstraintSatisfaction &Satisfaction, SourceLocation Loc={}, bool First=true)
Emit diagnostics explaining why a constraint expression was deemed unsatisfied.
ExprResult ActOnGNUNullExpr(SourceLocation TokenLoc)
ExprResult PerformContextuallyConvertToBool(Expr *From)
PerformContextuallyConvertToBool - Perform a contextual conversion of the expression From to bool (C+...
void DefineImplicitCopyAssignment(SourceLocation CurrentLocation, CXXMethodDecl *MethodDecl)
Defines an implicitly-declared copy assignment operator.
bool DiagnoseConditionalForNull(const Expr *LHSExpr, const Expr *RHSExpr, SourceLocation QuestionLoc)
Emit a specialized diagnostic when one expression is a null pointer constant and the other is not a p...
bool CheckFunctionConstraints(const FunctionDecl *FD, ConstraintSatisfaction &Satisfaction, SourceLocation UsageLoc=SourceLocation(), bool ForOverloadResolution=false)
Check whether the given function decl's trailing requires clause is satisfied, if any.
bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived, CXXRecordDecl *Base, CXXBasePaths &Paths)
Determine whether the type Derived is a C++ class that is derived from the type Base.
void MarkDeclarationsReferencedInType(SourceLocation Loc, QualType T)
Mark all of the declarations referenced within a particular AST node as referenced.
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
DeclContext * getFunctionLevelDeclContext(bool AllowLambda=false) const
If AllowLambda is true, treat lambda as function.
FunctionDecl * ResolveSingleFunctionTemplateSpecialization(OverloadExpr *ovl, bool Complain=false, DeclAccessPair *Found=nullptr, TemplateSpecCandidateSet *FailedTSC=nullptr, bool ForTypeDeduction=false)
Given an expression that refers to an overloaded function, try to resolve that overloaded function ex...
void CheckShadowingDeclModification(Expr *E, SourceLocation Loc)
Warn if 'E', which is an expression that is about to be modified, refers to a shadowing declaration.
void MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base=nullptr)
Perform reference-marking and odr-use handling for a DeclRefExpr.
ExprResult BuildQualifiedDeclarationNameExpr(CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, bool IsAddressOfOperand, TypeSourceInfo **RecoveryTSI=nullptr)
BuildQualifiedDeclarationNameExpr - Build a C++ qualified declaration name, generally during template...
ExprResult ActOnParenExpr(SourceLocation L, SourceLocation R, Expr *E)
ExprResult ActOnSourceLocExpr(SourceLocIdentKind Kind, SourceLocation BuiltinLoc, SourceLocation RPLoc)
llvm::PointerIntPair< ConstantExpr *, 1 > ImmediateInvocationCandidate
ExprResult CheckPlaceholderExpr(Expr *E)
Check for operands with placeholder types and complain if found.
ExprResult TransformToPotentiallyEvaluated(Expr *E)
EnableIfAttr * CheckEnableIf(FunctionDecl *Function, SourceLocation CallLoc, ArrayRef< Expr * > Args, bool MissingImplicitThis=false)
Check the enable_if expressions on the given function.
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
SourceManager & getSourceManager() const
ExprResult BuildAsTypeExpr(Expr *E, QualType DestTy, SourceLocation BuiltinLoc, SourceLocation RParenLoc)
Create a new AsTypeExpr node (bitcast) from the arguments.
bool CheckVecStepExpr(Expr *E)
ExprResult FixOverloadedFunctionReference(Expr *E, DeclAccessPair FoundDecl, FunctionDecl *Fn)
FixOverloadedFunctionReference - E is an expression that refers to a C++ overloaded function (possibl...
ExprResult ActOnConditionalOp(SourceLocation QuestionLoc, SourceLocation ColonLoc, Expr *CondExpr, Expr *LHSExpr, Expr *RHSExpr)
ActOnConditionalOp - Parse a ?
QualType CheckVectorCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
CheckVectorCompareOperands - vector comparisons are a clang extension that operates on extended vecto...
ExprResult CheckCXXBooleanCondition(Expr *CondExpr, bool IsConstexpr=false)
CheckCXXBooleanCondition - Returns true if conversion to bool is invalid.
ExprResult CheckLValueToRValueConversionOperand(Expr *E)
QualType CheckAssignmentOperands(Expr *LHSExpr, ExprResult &RHS, SourceLocation Loc, QualType CompoundType, BinaryOperatorKind Opc)
void DiscardMisalignedMemberAddress(const Type *T, Expr *E)
This function checks if the expression is in the sef of potentially misaligned members and it is conv...
ExprResult BuildPossibleImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, const TemplateArgumentListInfo *TemplateArgs, const Scope *S)
Builds an expression which might be an implicit member expression.
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
bool resolveAndFixAddressOfSingleOverloadCandidate(ExprResult &SrcExpr, bool DoFunctionPointerConversion=false)
Given an overloaded function, tries to turn it into a non-overloaded function reference using resolve...
void DiagnoseAvailabilityOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass, bool ObjCPropertyAccess, bool AvoidPartialAvailabilityChecks, ObjCInterfaceDecl *ClassReceiver)
CallExpr::ADLCallKind ADLCallKind
QualType CheckPointerToMemberOperands(ExprResult &LHS, ExprResult &RHS, ExprValueKind &VK, SourceLocation OpLoc, bool isIndirect)
std::vector< std::pair< QualType, unsigned > > ExcessPrecisionNotSatisfied
bool DiagRuntimeBehavior(SourceLocation Loc, const Stmt *Statement, const PartialDiagnostic &PD)
Conditionally issue a diagnostic based on the current evaluation context.
ExprResult BuildCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *Init=nullptr)
BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating the default expr if needed.
bool anyAltivecTypes(QualType srcType, QualType destType)
bool isLaxVectorConversion(QualType srcType, QualType destType)
Is this a legal conversion between two types, one of which is known to be a vector type?
void PushBlockScope(Scope *BlockScope, BlockDecl *Block)
ExprResult BuildOverloadedCallExpr(Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig, bool AllowTypoCorrection=true, bool CalleesAddressIsTaken=false)
BuildOverloadedCallExpr - Given the call expression that calls Fn (which eventually refers to the dec...
QualType CXXCheckConditionalOperands(ExprResult &cond, ExprResult &lhs, ExprResult &rhs, ExprValueKind &VK, ExprObjectKind &OK, SourceLocation questionLoc)
Check the operands of ?
ExprResult BuildAnonymousStructUnionMemberReference(const CXXScopeSpec &SS, SourceLocation nameLoc, IndirectFieldDecl *indirectField, DeclAccessPair FoundDecl=DeclAccessPair::make(nullptr, AS_none), Expr *baseObjectExpr=nullptr, SourceLocation opLoc=SourceLocation())
MaybeODRUseExprSet MaybeODRUseExprs
ExprResult PerformImplicitConversion(Expr *From, QualType ToType, const ImplicitConversionSequence &ICS, AssignmentAction Action, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
PerformImplicitConversion - Perform an implicit conversion of the expression From to the type ToType ...
bool isSFINAEContext() const
bool InstantiateInClassInitializer(SourceLocation PointOfInstantiation, FieldDecl *Instantiation, FieldDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs)
Instantiate the definition of a field from the given pattern.
bool CheckParmsForFunctionDef(ArrayRef< ParmVarDecl * > Parameters, bool CheckParameterNames)
CheckParmsForFunctionDef - Check that the parameters of the given function are appropriate for the de...
void CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl, const LookupResult &R)
Diagnose variable or built-in function shadowing.
ExprResult BuildCallToObjectOfClassType(Scope *S, Expr *Object, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc)
BuildCallToObjectOfClassType - Build a call to an object of class type (C++ [over....
ExprResult ActOnStringLiteral(ArrayRef< Token > StringToks, Scope *UDLScope=nullptr)
ActOnStringLiteral - The specified tokens were lexed as pasted string fragments (e....
ExprResult ActOnCXXReflectExpr(SourceLocation OpLoc, TypeSourceInfo *TSI)
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
ExprResult ActOnBinOp(Scope *S, SourceLocation TokLoc, tok::TokenKind Kind, Expr *LHSExpr, Expr *RHSExpr)
Binary Operators. 'Tok' is the token for the operator.
void checkUnusedDeclAttributes(Declarator &D)
checkUnusedDeclAttributes - Given a declarator which is not being used to build a declaration,...
ExprResult CheckExtVectorCast(SourceRange R, QualType DestTy, Expr *CastExpr, CastKind &Kind)
QualType CheckTemplateIdType(ElaboratedTypeKeyword Keyword, TemplateName Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs, Scope *Scope, bool ForNestedNameSpecifier)
void setFunctionHasBranchProtectedScope()
bool isConstantEvaluatedContext() const
void InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, FunctionDecl *Function, bool Recursive=false, bool DefinitionRequired=false, bool AtEndOfTU=false)
Instantiate the definition of the given function from its template.
void FinalizeVarWithDestructor(VarDecl *VD, CXXRecordDecl *DeclInit)
FinalizeVarWithDestructor - Prepare for calling destructor on the constructed variable.
ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, VerifyICEDiagnoser &Diagnoser, AllowFoldKind CanFold=AllowFoldKind::No)
VerifyIntegerConstantExpression - Verifies that an expression is an ICE, and reports the appropriate ...
bool CheckForConstantInitializer(Expr *Init, unsigned DiagID=diag::err_init_element_not_constant)
type checking declaration initializers (C99 6.7.8)
llvm::SmallPtrSet< const Decl *, 4 > ParsingInitForAutoVars
ParsingInitForAutoVars - a set of declarations with auto types for which we are currently parsing the...
bool CheckPointerConversion(Expr *From, QualType ToType, CastKind &Kind, CXXCastPath &BasePath, bool IgnoreBaseAccess, bool Diagnose=true)
CheckPointerConversion - Check the pointer conversion from the expression From to the type ToType.
SmallVector< ExprWithCleanups::CleanupObject, 8 > ExprCleanupObjects
ExprCleanupObjects - This is the stack of objects requiring cleanup that are created by the current f...
void NoteDeletedFunction(FunctionDecl *FD)
Emit a note explaining that this function is deleted.
sema::AnalysisBasedWarnings AnalysisWarnings
Worker object for performing CFG-based warnings.
std::deque< PendingImplicitInstantiation > PendingInstantiations
The queue of implicit template instantiations that are required but have not yet been performed.
ExprResult CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc, Expr *Idx, SourceLocation RLoc)
void NoteAllOverloadCandidates(Expr *E, QualType DestType=QualType(), bool TakingAddress=false)
ExprResult ActOnPredefinedExpr(SourceLocation Loc, tok::TokenKind Kind)
QualType GetSignedVectorType(QualType V)
Return a signed ext_vector_type that is of identical size and number of elements.
QualType CheckConditionalOperands(ExprResult &Cond, ExprResult &LHS, ExprResult &RHS, ExprValueKind &VK, ExprObjectKind &OK, SourceLocation QuestionLoc)
Note that LHS is not null here, even if this is the gnu "x ?: y" extension.
ExpressionEvaluationContext
Describes how the expressions currently being parsed are evaluated at run-time, if at all.
@ UnevaluatedAbstract
The current expression occurs within an unevaluated operand that unconditionally permits abstract ref...
@ UnevaluatedList
The current expression occurs within a braced-init-list within an unevaluated operand.
@ ConstantEvaluated
The current context is "potentially evaluated" in C++11 terms, but the expression is evaluated at com...
@ DiscardedStatement
The current expression occurs within a discarded statement.
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
@ ImmediateFunctionContext
In addition of being constant evaluated, the current expression occurs in an immediate function conte...
@ PotentiallyEvaluatedIfUsed
The current expression is potentially evaluated, but any declarations referenced inside that expressi...
void CheckCompatibleReinterpretCast(QualType SrcType, QualType DestType, bool IsDereference, SourceRange Range)
ExprResult BuildDependentDeclRefExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs)
ExprResult ActOnAsTypeExpr(Expr *E, ParsedType ParsedDestTy, SourceLocation BuiltinLoc, SourceLocation RParenLoc)
Parse a __builtin_astype expression.
ExprResult CreateUnaryExprOrTypeTraitExpr(TypeSourceInfo *TInfo, SourceLocation OpLoc, UnaryExprOrTypeTrait ExprKind, SourceRange R)
Build a sizeof or alignof expression given a type operand.
TypeSourceInfo * GetTypeForDeclarator(Declarator &D)
GetTypeForDeclarator - Convert the type for the specified declarator to Type instances.
void diagnoseTypo(const TypoCorrection &Correction, const PartialDiagnostic &TypoDiag, bool ErrorRecovery=true)
bool CheckCallReturnType(QualType ReturnType, SourceLocation Loc, CallExpr *CE, FunctionDecl *FD)
CheckCallReturnType - Checks that a call expression's return type is complete.
bool CheckUnaryExprOrTypeTraitOperand(Expr *E, UnaryExprOrTypeTrait ExprKind)
Check the constraints on expression operands to unary type expression and type traits.
ExprResult ActOnVAArg(SourceLocation BuiltinLoc, Expr *E, ParsedType Ty, SourceLocation RPLoc)
TypeSourceInfo * GetTypeForDeclaratorCast(Declarator &D, QualType FromTy)
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
Scope * TUScope
Translation Unit Scope - useful to Objective-C actions that need to lookup file scope declarations in...
ExprResult forceUnknownAnyToType(Expr *E, QualType ToType)
Force an expression with unknown-type to an expression of the given type.
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
void NoteDeletedInheritingConstructor(CXXConstructorDecl *CD)
QualType getCapturedDeclRefType(ValueDecl *Var, SourceLocation Loc)
Given a variable, determine the type that a reference to that variable will have in the given scope.
ExprResult ActOnCastExpr(Scope *S, SourceLocation LParenLoc, Declarator &D, ParsedType &Ty, SourceLocation RParenLoc, Expr *CastExpr)
ExprResult PerformObjectMemberConversion(Expr *From, NestedNameSpecifier Qualifier, NamedDecl *FoundDecl, NamedDecl *Member)
Cast a base object to a member's actual type.
Expr * MaybeCreateExprWithCleanups(Expr *SubExpr)
MaybeCreateExprWithCleanups - If the current full-expression requires any cleanups,...
bool RebuildingImmediateInvocation
Whether the AST is currently being rebuilt to correct immediate invocations.
void DiscardCleanupsInEvaluationContext()
bool NeedToCaptureVariable(ValueDecl *Var, SourceLocation Loc)
Checks if the variable must be captured.
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
void PushDeclContext(Scope *S, DeclContext *DC)
Set the current declaration context until it gets popped.
bool CheckVectorCast(SourceRange R, QualType VectorTy, QualType Ty, CastKind &Kind)
QualType getCompletedType(Expr *E)
Get the type of expression E, triggering instantiation to complete the type if necessary – that is,...
void mergeDeclAttributes(NamedDecl *New, Decl *Old, AvailabilityMergeKind AMK=AvailabilityMergeKind::Redeclaration)
mergeDeclAttributes - Copy attributes from the Old decl to the New one.
SourceManager & SourceMgr
bool CheckAlignasTypeArgument(StringRef KWName, TypeSourceInfo *TInfo, SourceLocation OpLoc, SourceRange R)
ExprResult BuildVectorLiteral(SourceLocation LParenLoc, SourceLocation RParenLoc, Expr *E, TypeSourceInfo *TInfo)
Build an altivec or OpenCL literal.
ExprResult UsualUnaryFPConversions(Expr *E)
UsualUnaryFPConversions - Promotes floating-point types according to the current language semantics.
bool isUnavailableAlignedAllocationFunction(const FunctionDecl &FD) const
Determine whether FD is an aligned allocation or deallocation function that is unavailable.
bool DiagnoseDependentMemberLookup(const LookupResult &R)
Diagnose a lookup that found results in an enclosing class during error recovery.
DiagnosticsEngine & Diags
OpenCLOptions & getOpenCLOptions()
NamespaceDecl * getStdNamespace() const
ExprResult DefaultFunctionArrayConversion(Expr *E, bool Diagnose=true)
DefaultFunctionArrayConversion (C99 6.3.2.1p3, C99 6.3.2.1p4).
void deduceClosureReturnType(sema::CapturingScopeInfo &CSI)
Deduce a block or lambda's return type based on the return statements present in the body.
bool areLaxCompatibleVectorTypes(QualType srcType, QualType destType)
Are the two types lax-compatible vector types?
ExprResult BuildBinOp(Scope *S, SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr, bool ForFoldExpression=false)
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
void diagnoseMissingTemplateArguments(TemplateName Name, SourceLocation Loc)
ExprResult BuildInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList, SourceLocation RBraceLoc, bool IsExplicit)
ExprResult ActOnIntegerConstant(SourceLocation Loc, int64_t Val)
ExprResult BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field)
friend class InitializationSequence
void DiagnoseAssignmentAsCondition(Expr *E)
DiagnoseAssignmentAsCondition - Given that an expression is being used as a boolean condition,...
void checkSpecializationVisibility(SourceLocation Loc, NamedDecl *Spec)
We've found a use of a templated declaration that would trigger an implicit instantiation.
QualType CheckBitwiseOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
llvm::MapVector< NamedDecl *, SourceLocation > UndefinedButUsed
UndefinedInternals - all the used, undefined objects which require a definition in this translation u...
ExprResult ActOnStmtExpr(Scope *S, SourceLocation LPLoc, Stmt *SubStmt, SourceLocation RPLoc)
bool ResolveAndFixSingleFunctionTemplateSpecialization(ExprResult &SrcExpr, bool DoFunctionPointerConversion=false, bool Complain=false, SourceRange OpRangeForComplaining=SourceRange(), QualType DestTypeForComplaining=QualType(), unsigned DiagIDForComplaining=0)
ExprResult ConvertParamDefaultArgument(ParmVarDecl *Param, Expr *DefaultArg, SourceLocation EqualLoc)
void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD)
ProcessDeclAttributes - Given a declarator (PD) with attributes indicated in it, apply them to D.
void checkVariadicArgument(const Expr *E, VariadicCallType CT)
Check to see if the given expression is a valid argument to a variadic function, issuing a diagnostic...
void CheckStaticArrayArgument(SourceLocation CallLoc, ParmVarDecl *Param, const Expr *ArgExpr)
CheckStaticArrayArgument - If the given argument corresponds to a static array parameter,...
QualType CheckSizelessVectorCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
ExprResult ConvertMemberDefaultInitExpression(FieldDecl *FD, Expr *InitExpr, SourceLocation InitLoc)
bool IsInvalidSMECallConversion(QualType FromType, QualType ToType)
void checkNonTrivialCUnionInInitializer(const Expr *Init, SourceLocation Loc)
Emit diagnostics if the initializer or any of its explicit or implicitly-generated subexpressions req...
ExprResult ActOnBlockStmtExpr(SourceLocation CaretLoc, Stmt *Body, Scope *CurScope)
ActOnBlockStmtExpr - This is called when the body of a block statement literal was successfully compl...
void DiagnoseDeletedDefaultedFunction(FunctionDecl *FD)
Produce notes explaining why a defaulted function was defined as deleted.
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
Run some code with "sufficient" stack space.
void MarkMemberReferenced(MemberExpr *E)
Perform reference-marking and odr-use handling for a MemberExpr.
bool DiagnoseAssignmentResult(AssignConvertType ConvTy, SourceLocation Loc, QualType DstType, QualType SrcType, Expr *SrcExpr, AssignmentAction Action, bool *Complained=nullptr)
DiagnoseAssignmentResult - Emit a diagnostic, if required, for the assignment conversion type specifi...
void MarkFunctionReferenced(SourceLocation Loc, FunctionDecl *Func, bool MightBeOdrUse=true)
Mark a function referenced, and check whether it is odr-used (C++ [basic.def.odr]p2,...
ExprResult ActOnStmtExprResult(ExprResult E)
ExprResult ActOnPostfixUnaryOp(Scope *S, SourceLocation OpLoc, tok::TokenKind Kind, Expr *Input)
std::tuple< MangleNumberingContext *, Decl * > getCurrentMangleNumberContext(const DeclContext *DC)
Compute the mangling number context for a lambda expression or block literal.
void DiagnoseEqualityWithExtraParens(ParenExpr *ParenE)
Redundant parentheses over an equality comparison can indicate that the user intended an assignment u...
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD=nullptr)
ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())
Attempts to produce a RecoveryExpr after some AST node cannot be created.
ExprResult ActOnNumericConstant(const Token &Tok, Scope *UDLScope=nullptr)
QualType CheckMatrixLogicalOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
void ActOnBlockStart(SourceLocation CaretLoc, Scope *CurScope)
ActOnBlockStart - This callback is invoked when a block literal is started.
bool IsFunctionConversion(QualType FromType, QualType ToType) const
Determine whether the conversion from FromType to ToType is a valid conversion of ExtInfo/ExtProtoInf...
ExprResult ActOnArraySubscriptExpr(Scope *S, Expr *Base, SourceLocation LLoc, MultiExprArg ArgExprs, SourceLocation RLoc)
ExprResult ActOnCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig=nullptr)
ActOnCallExpr - Handle a call to Fn with the specified array of arguments.
ExprResult ActOnUnaryExprOrTypeTraitExpr(SourceLocation OpLoc, UnaryExprOrTypeTrait ExprKind, bool IsType, void *TyOrEx, SourceRange ArgRange)
ActOnUnaryExprOrTypeTraitExpr - Handle sizeof(type) and sizeof expr and the same for alignof and __al...
QualType PreferredConditionType(ConditionKind K) const
@ LOLR_ErrorNoDiagnostic
The lookup found no match but no diagnostic was issued.
@ LOLR_Raw
The lookup found a single 'raw' literal operator, which expects a string literal containing the spell...
@ LOLR_Error
The lookup resulted in an error.
@ LOLR_Cooked
The lookup found a single 'cooked' literal operator, which expects a normal literal to be built and p...
@ LOLR_StringTemplatePack
The lookup found an overload set of literal operator templates, which expect the character type and c...
@ LOLR_Template
The lookup found an overload set of literal operator templates, which expect the characters of the sp...
void ActOnBlockArguments(SourceLocation CaretLoc, Declarator &ParamInfo, Scope *CurScope)
ActOnBlockArguments - This callback allows processing of block arguments.
QualType CheckRemainderOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign=false)
@ Diagnose
Diagnose issues that are non-constant or that are extensions.
std::pair< ValueDecl *, SourceLocation > PendingImplicitInstantiation
An entity for which implicit template instantiation is required.
unsigned getTemplateDepth(Scope *S) const
Determine the number of levels of enclosing template parameters.
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
void checkEnumArithmeticConversions(Expr *LHS, Expr *RHS, SourceLocation Loc, ArithConvKind ACK)
Check that the usual arithmetic conversions can be performed on this pair of expressions that might b...
static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo=nullptr)
bool IsStringLiteralToNonConstPointerConversion(Expr *From, QualType ToType)
Helper function to determine whether this is the (deprecated) C++ conversion from a string literal to...
void computeNRVO(Stmt *Body, sema::FunctionScopeInfo *Scope)
Given the set of return statements within a function body, compute the variables that are subject to ...
void checkNonTrivialCUnion(QualType QT, SourceLocation Loc, NonTrivialCUnionContext UseContext, unsigned NonTrivialKind)
Emit diagnostics if a non-trivial C union type or a struct that contains a non-trivial C union is use...
static ConditionResult ConditionError()
ExprResult ActOnConvertVectorExpr(Expr *E, ParsedType ParsedDestTy, SourceLocation BuiltinLoc, SourceLocation RParenLoc)
ActOnConvertVectorExpr - create a new convert-vector expression from the provided arguments.
void HandleFunctionTypeMismatch(PartialDiagnostic &PDiag, QualType FromType, QualType ToType)
HandleFunctionTypeMismatch - Gives diagnostic information for differeing function types.
ExprResult checkUnknownAnyArg(SourceLocation callLoc, Expr *result, QualType ¶mType)
Type-check an expression that's being passed to an __unknown_anytype parameter.
bool ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, FunctionDecl *FDecl, const FunctionProtoType *Proto, ArrayRef< Expr * > Args, SourceLocation RParenLoc, bool ExecConfig=false)
ConvertArgumentsForCall - Converts the arguments specified in Args/NumArgs to the parameter types of ...
ExprResult ActOnBuiltinOffsetOf(Scope *S, SourceLocation BuiltinLoc, SourceLocation TypeLoc, ParsedType ParsedArgTy, ArrayRef< OffsetOfComponent > Components, SourceLocation RParenLoc)
SemaPseudoObject & PseudoObject()
bool hasAnyUnrecoverableErrorsInThisFunction() const
Determine whether any errors occurred within this function/method/ block.
bool CheckAltivecInitFromScalar(SourceRange R, QualType VecTy, QualType SrcTy)
ExprResult HandleExprEvaluationContextForTypeof(Expr *E)
ExprResult ActOnInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList, SourceLocation RBraceLoc)
bool isCheckingDefaultArgumentOrInitializer() const
bool CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall, const FunctionProtoType *Proto)
CheckFunctionCall - Check a direct function call for various correctness and safety properties not st...
SmallVector< std::pair< Scope *, SourceLocation >, 2 > CurrentDefer
Stack of '_Defer' statements that are currently being parsed, as well as the locations of their '_Def...
bool CheckCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *Init=nullptr, bool SkipImmediateInvocations=true)
Instantiate or parse a C++ default argument expression as necessary.
void DiagnoseImmediateEscalatingReason(FunctionDecl *FD)
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
ExprResult CreateBuiltinMatrixSubscriptExpr(Expr *Base, Expr *RowIdx, Expr *ColumnIdx, SourceLocation RBLoc)
Represents a function call to one of __builtin_LINE(), __builtin_COLUMN(), __builtin_FUNCTION(),...
SourceLocation getBeginLoc() const
const DeclContext * getParentContext() const
If the SourceLocExpr has been resolved return the subexpression representing the resolved value.
SourceLocation getEndLoc() const
SourceLocIdentKind getIdentKind() const
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
bool isInMainFile(SourceLocation Loc) const
Returns whether the PresumedLoc for a given SourceLocation is in the main file.
bool isInSystemMacro(SourceLocation loc) const
Returns whether Loc is expanded from a macro in a system header.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
StandardConversionSequence - represents a standard conversion sequence (C++ 13.3.3....
ImplicitConversionKind Second
Second - The second conversion can be an integral promotion, floating point promotion,...
void setAsIdentityConversion()
StandardConversionSequence - Set the standard conversion sequence to the identity conversion.
void setToType(unsigned Idx, QualType T)
NarrowingKind getNarrowingKind(ASTContext &Context, const Expr *Converted, APValue &ConstantValue, QualType &ConstantType, bool IgnoreFloatToIntegralConversion=false) const
Check if this standard conversion sequence represents a narrowing conversion, according to C++11 [dcl...
StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
StmtVisitor - This class implements a simple visitor for Stmt subclasses.
Stmt - This represents one statement.
SourceLocation getEndLoc() const LLVM_READONLY
StmtClass getStmtClass() const
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteralParser - This decodes string escape characters and performs wide string analysis and Tra...
StringLiteral - This represents a string literal expression, e.g.
unsigned getLength() const
static StringLiteral * Create(const ASTContext &Ctx, StringRef Str, StringLiteralKind Kind, bool Pascal, QualType Ty, ArrayRef< SourceLocation > Locs)
This is the "fully general" constructor that allows representation of strings formed from one or more...
uint32_t getCodeUnit(size_t i) const
StringRef getString() const
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
void setElaboratedKeywordLoc(SourceLocation Loc)
Exposes information about the current target.
virtual bool hasLongDoubleType() const
Determine whether the long double type is supported on this target.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
@ CharPtrBuiltinVaList
typedef char* __builtin_va_list;
virtual bool useFP16ConversionIntrinsics() const
Check whether conversions to and from __fp16 should go through an integer bitcast with i16.
bool shouldUseMicrosoftCCforMangling() const
Should the Microsoft mangling scheme be used for C Calling Convention.
virtual bool hasFeature(StringRef Feature) const
Determine whether the given target has the given feature.
A convenient class for passing around template argument information.
void setLAngleLoc(SourceLocation Loc)
void setRAngleLoc(SourceLocation Loc)
void addArgument(const TemplateArgumentLoc &Loc)
Location wrapper for a TemplateArgument.
Represents a template argument.
Expr * getAsExpr() const
Retrieve the template argument as an expression.
bool isDependent() const
Whether this template argument is dependent on a template parameter such that its result can change f...
ValueDecl * getAsDecl() const
Retrieve the declaration for a declaration non-type template argument.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
The base class of all kinds of template declarations (e.g., class, function, etc.).
Represents a C++ template name within the type system.
A template parameter object.
Token - This structure provides full information about a lexed token.
void setKind(tok::TokenKind K)
void startToken()
Reset all flags to cleared.
Represents a declaration of a type.
SourceLocation getBeginLoc() const LLVM_READONLY
TyLocType push(QualType T)
Pushes space for a new TypeLoc of the given type.
TypeSpecTypeLoc pushTypeSpec(QualType T)
Pushes space for a typespec TypeLoc.
TypeSourceInfo * getTypeSourceInfo(ASTContext &Context, QualType T)
Creates a TypeSourceInfo for the given type.
Base wrapper for a particular "section" of type source info.
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
void initializeFullCopy(TypeLoc Other)
Initializes this by copying its information from another TypeLoc of the same type.
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
SourceRange getLocalSourceRange() const
Get the local source range.
T getAsAdjusted() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
SourceLocation getBeginLoc() const
Get the begin source location.
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
QualType getType() const
Return the type wrapped by this type source info.
void setNameLoc(SourceLocation Loc)
The base class of the type hierarchy.
bool isIncompleteOrObjectType() const
Return true if this is an incomplete or object type, in other words, not a function type.
bool isFixedPointOrIntegerType() const
Return true if this is a fixed point or integer type.
bool isBlockPointerType() const
bool isBooleanType() const
bool isObjCBuiltinType() const
bool isMFloat8Type() const
bool hasAttr(attr::Kind AK) const
Determine whether this type had the specified attribute applied to it (looking through top-level type...
const Type * getPointeeOrArrayElementType() const
If this is a pointer type, return the pointee type.
bool isIncompleteArrayType() const
bool isPlaceholderType() const
Test for a type which does not represent an actual type-system type but is instead used as a placehol...
bool isComplexType() const
isComplexType() does not include complex integers (a GCC extension).
bool isIntegralOrUnscopedEnumerationType() const
Determine whether this type is an integral or unscoped enumeration type.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool canDecayToPointerType() const
Determines whether this type can decay to a pointer type.
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool hasIntegerRepresentation() const
Determine whether this type has an integer representation of some sort, e.g., it is an integer type o...
bool isVoidPointerType() const
const ComplexType * getAsComplexIntegerType() const
bool isFunctionPointerType() const
bool isArithmeticType() const
bool isConstantMatrixType() const
bool isPointerType() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
bool isSVESizelessBuiltinType() const
Returns true for SVE scalable vector types.
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isSignedFixedPointType() const
Return true if this is a fixed point type that is signed according to ISO/IEC JTC1 SC22 WG14 N1169.
bool isEnumeralType() const
bool isScalarType() const
bool isVariableArrayType() const
bool isSizelessBuiltinType() const
bool isSveVLSBuiltinType() const
Determines if this is a sizeless type supported by the 'arm_sve_vector_bits' type attribute,...
bool isIntegralType(const ASTContext &Ctx) const
Determine whether this type is an integral type.
bool isObjCQualifiedIdType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
bool hasUnsignedIntegerRepresentation() const
Determine whether this type has an unsigned integer representation of some sort, e....
bool isExtVectorType() const
bool isAnyCharacterType() const
Determine whether this type is any of the built-in character types.
bool isExtVectorBoolType() const
QualType getSveEltType(const ASTContext &Ctx) const
Returns the representative type for the element of an SVE builtin type.
bool isNonOverloadPlaceholderType() const
Test for a placeholder type other than Overload; see BuiltinType::isNonOverloadPlaceholderType.
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isBitIntType() const
bool isSpecificBuiltinType(unsigned K) const
Test for a particular builtin type.
bool isBuiltinType() const
Helper methods to distinguish type categories.
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isAnyComplexType() const
bool isFixedPointType() const
Return true if this is a fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
bool isSaturatedFixedPointType() const
Return true if this is a saturated fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
ScalarTypeKind getScalarTypeKind() const
Given that this is a scalar type, classify it.
const BuiltinType * getAsPlaceholderType() const
bool hasSignedIntegerRepresentation() const
Determine whether this type has an signed integer representation of some sort, e.g....
bool isWebAssemblyTableType() const
Returns true if this is a WebAssembly table type: either an array of reference types,...
bool isMemberPointerType() const
bool isAtomicType() const
bool isOverloadableType() const
Determines whether this is a type for which one can define an overloaded operator.
bool isObjCIdType() const
bool isMatrixType() const
bool isOverflowBehaviorType() const
EnumDecl * castAsEnumDecl() const
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
bool isComplexIntegerType() const
bool isUnscopedEnumerationType() const
bool isObjCObjectType() const
bool isBlockCompatibleObjCPointerType(ASTContext &ctx) const
const ArrayType * getAsArrayTypeUnsafe() const
A variant of getAs<> for array types which silently discards qualifiers from the outermost type.
bool isObjCLifetimeType() const
Returns true if objects of this type have lifetime semantics under ARC.
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
bool isHLSLResourceRecord() const
EnumDecl * getAsEnumDecl() const
Retrieves the EnumDecl this type refers to.
bool isDoubleType() const
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isFunctionType() const
bool isObjCObjectPointerType() const
bool hasFloatingRepresentation() const
Determine whether this type has a floating-point representation of some sort, e.g....
bool isUnsignedFixedPointType() const
Return true if this is a fixed point type that is unsigned according to ISO/IEC JTC1 SC22 WG14 N1169.
bool isVectorType() const
bool isObjCQualifiedClassType() const
bool isObjCClassType() const
bool isRealFloatingType() const
Floating point categories.
bool isRVVSizelessBuiltinType() const
Returns true for RVV scalable vector types.
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
bool isFloatingType() const
bool isUnsignedIntegerType() const
Return true if this is an integer type that is unsigned, according to C99 6.2.5p6 [which returns true...
const T * castAsCanonical() const
Return this type's canonical type cast to the specified type.
bool isAnyPointerType() const
TypeClass getTypeClass() const
bool isSubscriptableVectorType() const
const T * getAs() const
Member-template getAs<specific type>'.
bool isNullPtrType() const
bool isRecordType() const
bool isHLSLResourceRecordArray() const
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.
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ OO_None
Not an overloaded operator.
bool isa(CodeGen::Address addr)
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
@ OR_Success
Overload resolution succeeded.
bool isTargetAddressSpace(LangAS AS)
DeclContext * getLambdaAwareParentOfDeclContext(DeclContext *DC)
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
ArithConvKind
Context in which we're performing a usual arithmetic conversion.
@ BitwiseOp
A bitwise operation.
@ Arithmetic
An arithmetic operation.
@ Conditional
A conditional (?:) operator.
@ CompAssign
A compound assignment expression.
@ Comparison
A comparison.
NullabilityKind
Describes the nullability of a particular type.
@ Nullable
Values of this type can be null.
@ Unspecified
Whether values of this type can be null is (explicitly) unspecified.
@ NonNull
Values of this type can never be null.
ExprObjectKind
A further classification of the kind of object referenced by an l-value or x-value.
@ OK_VectorComponent
A vector component is an element or range of elements of a vector.
@ OK_ObjCProperty
An Objective-C property is a logical field of an Objective-C object which is read and written via Obj...
@ OK_Ordinary
An ordinary object is located at an address in memory.
@ OK_BitField
A bitfield object is a bitfield on a C or C++ record.
@ OK_MatrixComponent
A matrix component is a single element or range of elements of a matrix.
std::string FormatUTFCodeUnitAsCodepoint(unsigned Value, QualType T)
@ Vector
'vector' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ IK_ImplicitSelfParam
An implicit 'self' parameter.
@ IK_TemplateId
A template-id, e.g., f<int>.
std::optional< ComparisonCategoryType > getComparisonCategoryForBuiltinCmp(QualType T)
Get the comparison category that should be used when comparing values of type T.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
@ Dependent
Parse the block as a dependent block, which may be used in some template instantiations but not other...
UnaryExprOrTypeTrait
Names for the "expression or type" traits.
unsigned toTargetAddressSpace(LangAS AS)
MutableArrayRef< Expr * > MultiExprArg
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
TemplateDecl * getAsTypeTemplateDecl(Decl *D)
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Result
The result type of a method or function.
ImplicitConversionKind
ImplicitConversionKind - The kind of implicit conversion used to convert an argument to a parameter's...
@ ICK_Complex_Conversion
Complex conversions (C99 6.3.1.6)
@ ICK_Integral_Conversion
Integral conversions (C++ [conv.integral])
@ ICK_Floating_Integral
Floating-integral conversions (C++ [conv.fpint])
@ ICK_HLSL_Array_RValue
HLSL non-decaying array rvalue cast.
@ ICK_Array_To_Pointer
Array-to-pointer conversion (C++ [conv.array])
@ ICK_Identity
Identity conversion (no conversion)
@ ICK_Lvalue_To_Rvalue
Lvalue-to-rvalue conversion (C++ [conv.lval])
@ ICK_Floating_Conversion
Floating point conversions (C++ [conv.double].
@ ICK_Complex_Real
Complex-real conversions (C99 6.3.1.7)
@ ICK_Function_To_Pointer
Function-to-pointer (C++ [conv.array])
AssignConvertType
AssignConvertType - All of the 'assignment' semantic checks return this enum to indicate whether the ...
@ IncompatiblePointer
IncompatiblePointer - The assignment is between two pointers types that are not compatible,...
@ Incompatible
Incompatible - We reject this conversion outright, it is invalid to represent it in the AST.
@ IntToPointer
IntToPointer - The assignment converts an int to a pointer, which we accept as an extension.
@ IncompatibleVectors
IncompatibleVectors - The assignment is between two vector types that have the same size,...
@ IncompatibleNestedPointerAddressSpaceMismatch
IncompatibleNestedPointerAddressSpaceMismatch - The assignment changes address spaces in nested point...
@ IncompatibleObjCWeakRef
IncompatibleObjCWeakRef - Assigning a weak-unavailable object to an object with __weak qualifier.
@ IntToBlockPointer
IntToBlockPointer - The assignment converts an int to a block pointer.
@ CompatibleOBTDiscards
CompatibleOBTDiscards - Assignment discards overflow behavior.
@ IncompatibleOBTKinds
IncompatibleOBTKinds - Assigning between incompatible OverflowBehaviorType kinds, e....
@ CompatibleVoidPtrToNonVoidPtr
CompatibleVoidPtrToNonVoidPtr - The types are compatible in C because a void * can implicitly convert...
@ IncompatiblePointerDiscardsQualifiers
IncompatiblePointerDiscardsQualifiers - The assignment discards qualifiers that we don't permit to be...
@ CompatiblePointerDiscardsQualifiers
CompatiblePointerDiscardsQualifiers - The assignment discards c/v/r qualifiers, which we accept as an...
@ IncompatibleObjCQualifiedId
IncompatibleObjCQualifiedId - The assignment is between a qualified id type and something else (that ...
@ Compatible
Compatible - the types are compatible according to the standard.
@ IncompatibleFunctionPointerStrict
IncompatibleFunctionPointerStrict - The assignment is between two function pointer types that are not...
@ IncompatiblePointerDiscardsOverflowBehavior
IncompatiblePointerDiscardsOverflowBehavior - The assignment discards overflow behavior annotations b...
@ PointerToInt
PointerToInt - The assignment converts a pointer to an int, which we accept as an extension.
@ FunctionVoidPointer
FunctionVoidPointer - The assignment is between a function pointer and void*, which the standard does...
@ IncompatibleNestedPointerQualifiers
IncompatibleNestedPointerQualifiers - The assignment is between two nested pointer types,...
@ IncompatibleFunctionPointer
IncompatibleFunctionPointer - The assignment is between two function pointers types that are not comp...
@ IncompatiblePointerSign
IncompatiblePointerSign - The assignment is between two pointers types which point to integers which ...
@ IncompatibleBlockPointer
IncompatibleBlockPointer - The assignment is between two block pointers types that are not compatible...
bool isFunctionLocalStringLiteralMacro(tok::TokenKind K, const LangOptions &LO)
Return true if the token corresponds to a function local predefined macro, which expands to a string ...
@ Type
The name was classified as a type.
LangAS
Defines the address space values used by the address space qualifier of QualType.
CastKind
CastKind - The kind of operation required for a conversion.
MutableArrayRef< ParsedTemplateArgument > ASTTemplateArgsPtr
bool isLambdaConversionOperator(CXXConversionDecl *C)
OverloadedOperatorKind getRewrittenOverloadedOperator(OverloadedOperatorKind Kind)
Get the other overloaded operator that the given operator can be rewritten into, if any such operator...
@ TNK_Var_template
The name refers to a variable template whose specialization produces a variable.
@ TNK_Concept_template
The name refers to a concept.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
bool isPtrSizeAddressSpace(LangAS AS)
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
const char * getTraitSpelling(ExpressionTrait T) LLVM_READONLY
Return the spelling of the type trait TT. Never null.
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
@ NK_Not_Narrowing
Not a narrowing conversion.
@ NK_Constant_Narrowing
A narrowing conversion, because a constant expression got narrowed.
@ NK_Dependent_Narrowing
Cannot tell whether this is a narrowing conversion because the expression is value-dependent.
@ NK_Type_Narrowing
A narrowing conversion by virtue of the source and destination types.
@ NK_Variable_Narrowing
A narrowing conversion, because a non-constant-expression variable might have got narrowed.
DynamicRecursiveASTVisitorBase< false > DynamicRecursiveASTVisitor
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
CallingConv
CallingConv - Specifies the calling convention that a function uses.
@ AltiVecBool
is AltiVec 'vector bool ...'
@ SveFixedLengthData
is AArch64 SVE fixed-length data vector
@ AltiVecVector
is AltiVec vector
@ AltiVecPixel
is AltiVec 'vector Pixel'
@ Generic
not a target-specific vector type
@ RVVFixedLengthData
is RISC-V RVV fixed-length data vector
@ RVVFixedLengthMask
is RISC-V RVV fixed-length mask vector
@ SveFixedLengthPredicate
is AArch64 SVE fixed-length predicate vector
U cast(CodeGen::Address addr)
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
@ None
No keyword precedes the qualified type name.
bool isLambdaMethod(const DeclContext *DC)
llvm::omp::Clause OpenMPClauseKind
OpenMP clauses.
ActionResult< Expr * > ExprResult
@ Other
Other implicit parameter.
@ Implicit
An implicit conversion.
OptionalUnsigned< NullabilityKind > NullabilityKindOrNone
ActionResult< Stmt * > StmtResult
bool isGenericLambdaCallOperatorSpecialization(const CXXMethodDecl *MD)
NonOdrUseReason
The reason why a DeclRefExpr does not constitute an odr-use.
@ NOUR_Discarded
This name appears as a potential result of a discarded value expression.
@ NOUR_Unevaluated
This name appears in an unevaluated operand.
@ NOUR_None
This is an odr-use.
@ NOUR_Constant
This name appears as a potential result of an lvalue-to-rvalue conversion that is a constant expressi...
Represents an element in a path from a derived class to a base class.
The class facilities generation and storage of conversion FixIts.
OverloadFixItKind Kind
The type of fix applied.
bool tryToFixConversion(const Expr *FromExpr, const QualType FromQTy, const QualType ToQTy, Sema &S)
If possible, generates and stores a fix for the given conversion.
std::vector< FixItHint > Hints
The list of Hints generated so far.
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
DeclarationName getName() const
getName - Returns the embedded declaration name.
void setCXXLiteralOperatorNameLoc(SourceLocation Loc)
setCXXLiteralOperatorNameLoc - Sets the location of the literal operator name (not the operator keywo...
SourceLocation getBeginLoc() const
getBeginLoc - Retrieve the location of the first token.
SourceLocation getEndLoc() const LLVM_READONLY
Stores data related to a single embed directive.
EvalResult is a struct with detailed info about an evaluated expression.
APValue Val
Val - This is the value the expression can be folded to.
SmallVectorImpl< PartialDiagnosticAt > * Diag
Diag - If this is non-null, it will be filled in with a stack of notes indicating why evaluation fail...
bool DiagEmitted
Whether any diagnostic has been emitted.
bool HasUndefinedBehavior
Whether the evaluation hit undefined behavior.
bool HasSideEffects
Whether the evaluated expression has side effects.
Extra information about a function prototype.
FunctionType::ExtInfo ExtInfo
bool IsAddressOfOperandWithParen
bool HasFormOfMemberPointer
OverloadExpr * Expression
@ DefaultFunctionArgumentInstantiation
We are instantiating a default argument for a function.
Data structure used to record current or nested expression evaluation contexts.
llvm::SmallPtrSet< const Expr *, 8 > PossibleDerefs
bool InLifetimeExtendingContext
Whether we are currently in a context in which all temporaries must be lifetime-extended,...
Decl * ManglingContextDecl
The declaration that provides context for lambda expressions and block literals if the normal declara...
bool InDiscardedStatement
bool InImmediateFunctionContext
SmallVector< Expr *, 2 > VolatileAssignmentLHSs
Expressions appearing as the LHS of a volatile assignment in this context.
bool isUnevaluated() const
llvm::SmallPtrSet< DeclRefExpr *, 4 > ReferenceToConsteval
Set of DeclRefExprs referencing a consteval function when used in a context not already known to be i...
llvm::SmallVector< ImmediateInvocationCandidate, 4 > ImmediateInvocationCandidates
Set of candidates for starting an immediate invocation.
bool isImmediateFunctionContext() const
SmallVector< MaterializeTemporaryExpr *, 8 > ForRangeLifetimeExtendTemps
P2718R0 - Lifetime extension in range-based for loops.
enum clang::Sema::ExpressionEvaluationContextRecord::ExpressionKind ExprContext
SmallVector< LambdaExpr *, 2 > Lambdas
The lambdas that are present within this context, if it is indeed an unevaluated context.
ExpressionKind
Describes whether we are in an expression constext which we have to handle differently.
MaybeODRUseExprSet SavedMaybeODRUseExprs
CleanupInfo ParentCleanup
Whether the enclosing context needed a cleanup.
bool isConstantEvaluated() const
bool isDiscardedStatementContext() const
ExpressionEvaluationContext Context
The expression evaluation context.
bool InImmediateEscalatingFunctionContext
unsigned NumCleanupObjects
The number of active cleanup objects when we entered this expression evaluation context.
Abstract class used to diagnose incomplete types.
Location information for a TemplateArgument.
TemplateNameKind Kind
The kind of template that Template refers to.
unsigned NumArgs
NumArgs - The number of template arguments.
SourceLocation TemplateNameLoc
TemplateNameLoc - The location of the template name within the source.
ParsedTemplateArgument * getTemplateArgs()
Retrieves a pointer to the template arguments.
SourceLocation RAngleLoc
The location of the '>' after the template argument list.
SourceLocation LAngleLoc
The location of the '<' before the template argument list.
ParsedTemplateTy Template
The declaration of the template corresponding to the template-name.
Describes an entity that is being assigned.