21#include "clang/AST/Attrs.inc"
64#include "llvm/ADT/STLExtras.h"
65#include "llvm/ADT/StringExtras.h"
66#include "llvm/Support/ConvertUTF.h"
67#include "llvm/Support/SaveAndRestore.h"
68#include "llvm/Support/TimeProfiler.h"
69#include "llvm/Support/TypeSize.h"
94 if (TreatUnavailableAsInvalid &&
112 if (
const auto *A = D->
getAttr<UnusedAttr>()) {
115 if (A->getSemanticSpelling() != UnusedAttr::CXX11_maybe_unused &&
116 A->getSemanticSpelling() != UnusedAttr::C23_maybe_unused) {
118 if (DC && !DC->
hasAttr<UnusedAttr>())
119 S.
Diag(Loc, diag::warn_used_but_marked_unused) << D;
127 if (
Decl->isDefaulted()) {
138 auto *Ctor = dyn_cast<CXXConstructorDecl>(
Decl);
139 if (Ctor && Ctor->isInheritingConstructor())
150 if (I->getStorageClass() !=
SC_None)
201 DiagID = diag::warn_c2y_compat_internal_in_extern_inline;
202 else if ((UsedFn && (UsedFn->
isInlined() || UsedFn->
hasAttr<ConstAttr>())) ||
204 DiagID = diag::ext_internal_in_extern_inline_quiet;
206 DiagID = diag::ext_internal_in_extern_inline;
208 S.
Diag(Loc, DiagID) << !UsedFn << D;
220 Diag(DeclBegin, diag::note_convert_inline_to_static)
227 bool ObjCPropertyAccess,
228 bool AvoidPartialAvailabilityChecks,
230 bool SkipTrailingRequiresClause) {
237 for (
const auto &[DiagLoc, PD] : Pos->second) {
251 Diag(Loc, diag::ext_main_used);
259 Diag(Loc, diag::err_binding_cannot_appear_in_own_initializer)
262 Diag(Loc, diag::err_auto_variable_cannot_appear_in_own_initializer)
271 if (FD->isDeleted()) {
272 auto *Ctor = dyn_cast<CXXConstructorDecl>(FD);
273 if (Ctor && Ctor->isInheritingConstructor())
274 Diag(Loc, diag::err_deleted_inherited_ctor_use)
276 << Ctor->getInheritedConstructor().getConstructor()->getParent();
279 Diag(Loc, diag::err_deleted_function_use)
280 << (Msg !=
nullptr) << (Msg ? Msg->
getString() : StringRef());
294 if (!SkipTrailingRequiresClause && FD->getTrailingRequiresClause()) {
303 diag::err_reference_to_function_with_unsatisfied_constraints)
321 if (
auto *
Concept = dyn_cast<ConceptDecl>(D);
325 if (
auto *MD = dyn_cast<CXXMethodDecl>(D)) {
327 if (MD->getParent()->isLambda() &&
330 MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator())) {
331 Diag(Loc, diag::warn_cxx17_compat_lambda_def_ctor_assign)
336 auto getReferencedObjCProp = [](
const NamedDecl *D) ->
338 if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D))
339 return MD->findPropertyDecl();
353 auto *DRD = dyn_cast<OMPDeclareReductionDecl>(
CurContext);
356 Diag(Loc, diag::err_omp_wrong_var_in_declare_reduction)
369 Diag(Loc, diag::err_omp_declare_mapper_wrong_var)
375 if (
const auto *EmptyD = dyn_cast<UnresolvedUsingIfExistsDecl>(D)) {
376 Diag(Loc, diag::err_use_of_empty_using_if_exists);
377 Diag(EmptyD->getLocation(), diag::note_empty_using_if_exists_here);
382 AvoidPartialAvailabilityChecks, ClassReceiver);
388 if (D->
hasAttr<AvailableOnlyInDefaultEvalMethodAttr>()) {
391 PP.getLastFPEvalPragmaLocation().isValid() &&
392 PP.getCurrentFPEvalMethod() !=
getLangOpts().getFPEvalMethod())
394 diag::err_type_available_only_in_default_eval_method)
398 if (
auto *VD = dyn_cast<ValueDecl>(D))
403 if (!
Context.getTargetInfo().isTLSSupported())
404 if (
const auto *VD = dyn_cast<VarDecl>(D))
406 targetDiag(*Locs.begin(), diag::err_thread_unsupported);
414 const SentinelAttr *
Attr = D->
getAttr<SentinelAttr>();
419 unsigned NumFormalParams;
423 enum { CK_Function, CK_Method, CK_Block } CalleeKind;
425 if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D)) {
426 NumFormalParams = MD->param_size();
427 CalleeKind = CK_Method;
428 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
429 NumFormalParams = FD->param_size();
430 CalleeKind = CK_Function;
431 }
else if (
const auto *VD = dyn_cast<VarDecl>(D)) {
438 CalleeKind = CK_Function;
441 CalleeKind = CK_Block;
446 if (
const auto *proto = dyn_cast<FunctionProtoType>(Fn))
447 NumFormalParams = proto->getNumParams();
458 unsigned NullPos =
Attr->getNullPos();
459 assert((NullPos == 0 || NullPos == 1) &&
"invalid null position on sentinel");
460 NumFormalParams = (NullPos > NumFormalParams ? 0 : NumFormalParams - NullPos);
463 unsigned NumArgsAfterSentinel =
Attr->getSentinel();
467 if (Args.size() < NumFormalParams + NumArgsAfterSentinel + 1) {
474 const Expr *SentinelExpr = Args[Args.size() - NumArgsAfterSentinel - 1];
479 if (
Context.isSentinelNullExpr(SentinelExpr))
487 std::string NullValue;
488 if (CalleeKind == CK_Method &&
PP.isMacroDefined(
"nil"))
491 NullValue =
"nullptr";
492 else if (
PP.isMacroDefined(
"NULL"))
495 NullValue =
"(void*) 0";
498 Diag(Loc, diag::warn_missing_sentinel) <<
int(CalleeKind);
500 Diag(MissingNilLoc, diag::warn_missing_sentinel)
525 assert(!Ty.
isNull() &&
"DefaultFunctionArrayConversion - missing type");
529 if (
auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl()))
534 CK_FunctionToPointerDecay).
get();
549 CK_ArrayToPointerDecay);
565 if (UO && UO->getOpcode() == UO_Deref &&
566 UO->getSubExpr()->getType()->isPointerType()) {
568 UO->getSubExpr()->getType()->getPointeeType().getAddressSpace();
571 UO->getSubExpr()->IgnoreParenCasts()->isNullPointerConstant(
573 !UO->getType().isVolatileQualified()) {
575 S.
PDiag(diag::warn_indirection_through_null)
576 << UO->getSubExpr()->getSourceRange());
578 S.
PDiag(diag::note_indirection_through_null));
598 BaseType = BaseType->getPointeeType();
610 if (ObjectSetClass) {
654 assert(!
T.isNull() &&
"r-value conversion on typeless expression?");
658 if (
T->canDecayToPointerType())
664 if (
T ==
Context.OverloadTy ||
T->isRecordType() ||
665 (
T->isDependentType() && !
T->isAnyPointerType() &&
666 !
T->isMemberPointerType()))
690 &
Context.Idents.get(
"object_getClass"),
696 SourceRange(OISA->getOpLoc(), OISA->getIsaMemberLoc()),
")");
713 if (
T.hasQualifiers())
714 T =
T.getUnqualifiedType();
717 if (
T->isMemberPointerType() &&
718 Context.getTargetInfo().getCXXABI().isMicrosoft())
729 Cleanup.setExprNeedsCleanups(
true);
732 Cleanup.setExprNeedsCleanups(
true);
739 CastKind CK =
T->isNullPtrType() ? CK_NullToPointer : CK_LValueToRValue;
747 T =
Atomic->getValueType().getUnqualifiedType();
772 CK_FunctionToPointerDecay);
786 assert(!Ty.
isNull() &&
"UsualUnaryFPConversions - missing type");
792 PP.getLastFPEvalPragmaLocation().isValid())) {
793 switch (EvalMethod) {
795 llvm_unreachable(
"Unrecognized float evaluation method");
798 llvm_unreachable(
"Float evaluation method should be set by now");
806 CK_FloatingComplexCast)
815 CK_FloatingComplexCast)
847 assert(!Ty.
isNull() &&
"UsualUnaryConversions - missing type");
871 if (
Context.isPromotableIntegerType(Ty)) {
886 assert(!Ty.
isNull() &&
"DefaultArgumentPromotion - missing type");
898 if (BTy && (BTy->
getKind() == BuiltinType::Half ||
899 BTy->
getKind() == BuiltinType::Float)) {
902 if (BTy->
getKind() == BuiltinType::Half) {
913 Context.getTypeSizeInChars(BTy) <
919 assert(8 ==
Context.getTypeSizeInChars(
Context.LongLongTy).getQuantity() &&
920 "Unexpected typesize for LongLongTy");
974 if (
Context.getTargetInfo().getTriple().isWasm() &&
989 if (!
Record->hasNonTrivialCopyConstructor() &&
990 !
Record->hasNonTrivialMoveConstructor() &&
991 !
Record->hasNonTrivialDestructor())
1024 PDiag(diag::warn_cxx98_compat_pass_non_pod_arg_to_vararg) << Ty << CT);
1031 PDiag(diag::warn_pass_class_arg_to_vararg)
1039 PDiag(diag::warn_cannot_pass_non_pod_arg_to_vararg)
1046 diag::err_cannot_pass_non_trivial_c_struct_to_vararg)
1050 PDiag(diag::err_cannot_pass_objc_interface_to_vararg)
1063 if (PlaceholderTy->getKind() == BuiltinType::ARCUnbridgedCast &&
1065 (FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>()))) {
1104 if (
Call.isInvalid())
1109 if (Comma.isInvalid())
1116 diag::err_call_incomplete_argument))
1134 if (SkipCast)
return false;
1141 CK_IntegralComplexToFloatingComplex);
1159 bool PromotePrecision) {
1164 if (PromotePrecision) {
1169 if (LongerIsComplex)
1181 QualType RHSType,
bool IsCompAssign) {
1206 bool ConvertFloat,
bool ConvertInt) {
1211 CK_IntegralToFloating);
1222 CK_IntegralComplexToFloatingComplex);
1227 CK_FloatingRealToComplex);
1236 QualType RHSType,
bool IsCompAssign) {
1246 else if (!IsCompAssign)
1248 return LHSFloat ? LHSType : RHSType;
1253 if (LHSFloat && RHSFloat) {
1260 assert(order < 0 &&
"illegal float comparison");
1294 QualType LHSElem = LHSComplex ? LHSComplex->getElementType() : LHSType;
1300 if ((&LHSSem != &llvm::APFloat::PPCDoubleDouble() ||
1301 &RHSSem != &llvm::APFloat::IEEEquad()) &&
1302 (&LHSSem != &llvm::APFloat::IEEEquad() ||
1303 &RHSSem != &llvm::APFloat::PPCDoubleDouble()))
1320 CK_IntegralComplexCast);
1326template <PerformCastFn doLHSCast, PerformCastFn doRHSCast>
1329 QualType RHSType,
bool IsCompAssign) {
1334 if (LHSSigned == RHSSigned) {
1337 RHS = (*doRHSCast)(S, RHS.
get(), LHSType);
1339 }
else if (!IsCompAssign)
1340 LHS = (*doLHSCast)(S, LHS.
get(), RHSType);
1342 }
else if (order != (LHSSigned ? 1 : -1)) {
1346 RHS = (*doRHSCast)(S, RHS.
get(), LHSType);
1348 }
else if (!IsCompAssign)
1349 LHS = (*doLHSCast)(S, LHS.
get(), RHSType);
1356 RHS = (*doRHSCast)(S, RHS.
get(), LHSType);
1358 }
else if (!IsCompAssign)
1359 LHS = (*doLHSCast)(S, LHS.
get(), RHSType);
1368 RHS = (*doRHSCast)(S, RHS.
get(), result);
1370 LHS = (*doLHSCast)(S, LHS.
get(), result);
1380 bool IsCompAssign) {
1384 if (LHSComplexInt && RHSComplexInt) {
1389 (S, LHS, RHS, LHSEltType, RHSEltType, IsCompAssign);
1394 if (LHSComplexInt) {
1398 (S, LHS, RHS, LHSEltType, RHSType, IsCompAssign);
1401 CK_IntegralRealToComplex);
1406 assert(RHSComplexInt);
1411 (S, LHS, RHS, LHSType, RHSEltType, IsCompAssign);
1416 CK_IntegralRealToComplex);
1425 assert(BTy &&
"Expected a builtin type.");
1427 switch (BTy->getKind()) {
1428 case BuiltinType::ShortFract:
1429 case BuiltinType::UShortFract:
1430 case BuiltinType::SatShortFract:
1431 case BuiltinType::SatUShortFract:
1433 case BuiltinType::Fract:
1434 case BuiltinType::UFract:
1435 case BuiltinType::SatFract:
1436 case BuiltinType::SatUFract:
1438 case BuiltinType::LongFract:
1439 case BuiltinType::ULongFract:
1440 case BuiltinType::SatLongFract:
1441 case BuiltinType::SatULongFract:
1443 case BuiltinType::ShortAccum:
1444 case BuiltinType::UShortAccum:
1445 case BuiltinType::SatShortAccum:
1446 case BuiltinType::SatUShortAccum:
1448 case BuiltinType::Accum:
1449 case BuiltinType::UAccum:
1450 case BuiltinType::SatAccum:
1451 case BuiltinType::SatUAccum:
1453 case BuiltinType::LongAccum:
1454 case BuiltinType::ULongAccum:
1455 case BuiltinType::SatLongAccum:
1456 case BuiltinType::SatULongAccum:
1459 if (BTy->isInteger())
1461 llvm_unreachable(
"Unexpected fixed point or integer type");
1473 "Expected at least one of the operands to be a fixed point type");
1476 "Special fixed point arithmetic operation conversions are only "
1477 "applied to ints or other fixed point types");
1499 QualType ResultTy = LHSTyRank > RHSTyRank ? LHSTy : RHSTy;
1522 REnum = R->isUnscopedEnumerationType();
1524 if ((!IsCompAssign && LEnum && R->isFloatingType()) ||
1528 ? diag::warn_arith_conv_enum_float_cxx20
1529 : diag::warn_arith_conv_enum_float)
1532 }
else if (!IsCompAssign && LEnum && REnum &&
1533 !
Context.hasSameUnqualifiedType(L, R)) {
1538 DiagID = diag::warn_conv_mixed_enum_types_cxx26;
1539 else if (!L->
castAsCanonical<EnumType>()->getDecl()->hasNameForLinkage() ||
1540 !R->castAsCanonical<EnumType>()->getDecl()->hasNameForLinkage()) {
1545 ? diag::warn_arith_conv_mixed_anon_enum_types_cxx20
1546 : diag::warn_arith_conv_mixed_anon_enum_types;
1551 ? diag::warn_conditional_mixed_enum_types_cxx20
1552 : diag::warn_conditional_mixed_enum_types;
1557 ? diag::warn_comparison_mixed_enum_types_cxx20
1558 : diag::warn_comparison_mixed_enum_types;
1561 ? diag::warn_arith_conv_mixed_enum_types_cxx20
1562 : diag::warn_arith_conv_mixed_enum_types;
1565 << (int)ACK << L << R;
1583 auto IsSingleCodeUnitCP = [](
const QualType &
T,
const llvm::APSInt &
Value) {
1584 if (
T->isChar8Type())
1585 return llvm::IsSingleCodeUnitUTF8Codepoint(
Value.getExtValue());
1586 if (
T->isChar16Type())
1587 return llvm::IsSingleCodeUnitUTF16Codepoint(
Value.getExtValue());
1588 assert(
T->isChar32Type());
1589 return llvm::IsSingleCodeUnitUTF32Codepoint(
Value.getExtValue());
1602 if (LHSSuccess != RHSuccess) {
1604 if (IsSingleCodeUnitCP(LHSType, Res.
Val.
getInt()) &&
1605 IsSingleCodeUnitCP(RHSType, Res.
Val.
getInt()))
1609 if (!LHSSuccess || !RHSuccess) {
1610 SemaRef.
Diag(Loc, diag::warn_comparison_unicode_mixed_types)
1616 llvm::APSInt LHSValue(32);
1618 llvm::APSInt RHSValue(32);
1621 bool LHSSafe = IsSingleCodeUnitCP(LHSType, LHSValue);
1622 bool RHSSafe = IsSingleCodeUnitCP(RHSType, RHSValue);
1623 if (LHSSafe && RHSSafe)
1626 SemaRef.
Diag(Loc, diag::warn_comparison_unicode_mixed_types_constant)
1636 SemaRef.
Diag(Loc, diag::warn_arith_conv_mixed_unicode_types)
1670 LHSType = AtomicLHS->getValueType();
1673 if (
Context.hasSameType(LHSType, RHSType))
1674 return Context.getCommonSugaredType(LHSType, RHSType);
1682 QualType LHSUnpromotedType = LHSType;
1683 if (
Context.isPromotableIntegerType(LHSType))
1684 LHSType =
Context.getPromotedIntegerType(LHSType);
1686 if (!LHSBitfieldPromoteTy.
isNull())
1687 LHSType = LHSBitfieldPromoteTy;
1692 if (
Context.hasSameType(LHSType, RHSType))
1693 return Context.getCommonSugaredType(LHSType, RHSType);
1732 bool PredicateIsExpr,
void *ControllingExprOrType,
1734 unsigned NumAssocs = ArgTypes.size();
1735 assert(NumAssocs == ArgExprs.size());
1738 for (
unsigned i = 0; i < NumAssocs; ++i) {
1747 if (!PredicateIsExpr) {
1751 assert(ControllingType &&
"couldn't get the type out of the parser");
1752 ControllingExprOrType = ControllingType;
1756 KeyLoc, DefaultLoc, RParenLoc, PredicateIsExpr, ControllingExprOrType,
1764 bool PredicateIsExpr,
void *ControllingExprOrType,
1766 unsigned NumAssocs = Types.size();
1767 assert(NumAssocs == Exprs.size());
1768 assert(ControllingExprOrType &&
1769 "Must have either a controlling expression or a controlling type");
1771 Expr *ControllingExpr =
nullptr;
1773 if (PredicateIsExpr) {
1780 reinterpret_cast<Expr *
>(ControllingExprOrType));
1783 ControllingExpr = R.
get();
1786 ControllingType =
reinterpret_cast<TypeSourceInfo *
>(ControllingExprOrType);
1787 if (!ControllingType)
1791 bool TypeErrorFound =
false,
1792 IsResultDependent = ControllingExpr
1795 ContainsUnexpandedParameterPack =
1805 diag::warn_side_effects_unevaluated_context);
1807 for (
unsigned i = 0; i < NumAssocs; ++i) {
1808 if (Exprs[i]->containsUnexpandedParameterPack())
1809 ContainsUnexpandedParameterPack =
true;
1812 if (Types[i]->
getType()->containsUnexpandedParameterPack())
1813 ContainsUnexpandedParameterPack =
true;
1815 if (Types[i]->
getType()->isDependentType()) {
1816 IsResultDependent =
true;
1833 if (ControllingExpr && Types[i]->
getType()->isIncompleteType())
1834 D =
LangOpts.C2y ? diag::warn_c2y_compat_assoc_type_incomplete
1835 : diag::ext_assoc_type_incomplete;
1836 else if (ControllingExpr && !Types[i]->
getType()->isObjectType())
1837 D = diag::err_assoc_type_nonobject;
1838 else if (Types[i]->
getType()->isVariablyModifiedType())
1839 D = diag::err_assoc_type_variably_modified;
1840 else if (ControllingExpr) {
1859 unsigned Reason = 0;
1868 Diag(Types[i]->getTypeLoc().getBeginLoc(),
1869 diag::warn_unreachable_association)
1870 << QT << (Reason - 1);
1874 Diag(Types[i]->getTypeLoc().getBeginLoc(), D)
1875 << Types[i]->getTypeLoc().getSourceRange() << Types[i]->getType();
1877 D, Types[i]->getTypeLoc().getBeginLoc()) >=
1879 TypeErrorFound =
true;
1884 for (
unsigned j = i+1; j < NumAssocs; ++j)
1885 if (Types[j] && !Types[j]->
getType()->isDependentType() &&
1886 Context.typesAreCompatible(Types[i]->getType(),
1887 Types[j]->getType())) {
1888 Diag(Types[j]->getTypeLoc().getBeginLoc(),
1889 diag::err_assoc_compatible_types)
1890 << Types[j]->getTypeLoc().getSourceRange()
1891 << Types[j]->getType()
1892 << Types[i]->getType();
1893 Diag(Types[i]->getTypeLoc().getBeginLoc(),
1894 diag::note_compat_assoc)
1895 << Types[i]->getTypeLoc().getSourceRange()
1896 << Types[i]->getType();
1897 TypeErrorFound =
true;
1907 if (IsResultDependent) {
1908 if (ControllingExpr)
1910 Types, Exprs, DefaultLoc, RParenLoc,
1911 ContainsUnexpandedParameterPack);
1913 Exprs, DefaultLoc, RParenLoc,
1914 ContainsUnexpandedParameterPack);
1918 unsigned DefaultIndex = std::numeric_limits<unsigned>::max();
1922 for (
unsigned i = 0; i < NumAssocs; ++i) {
1925 else if (ControllingExpr &&
1928 Types[i]->getType()))
1929 CompatIndices.push_back(i);
1930 else if (ControllingType &&
1933 Types[i]->getType()))
1934 CompatIndices.push_back(i);
1937 auto GetControllingRangeAndType = [](
Expr *ControllingExpr,
1941 if (ControllingExpr)
1950 return std::make_pair(SR, QT);
1956 if (CompatIndices.size() > 1) {
1957 auto P = GetControllingRangeAndType(ControllingExpr, ControllingType);
1960 << SR << P.second << (
unsigned)CompatIndices.size();
1961 for (
unsigned I : CompatIndices) {
1962 Diag(Types[I]->getTypeLoc().getBeginLoc(),
1963 diag::note_compat_assoc)
1964 << Types[I]->getTypeLoc().getSourceRange()
1965 << Types[I]->getType();
1973 if (DefaultIndex == std::numeric_limits<unsigned>::max() &&
1974 CompatIndices.size() == 0) {
1975 auto P = GetControllingRangeAndType(ControllingExpr, ControllingType);
1977 Diag(SR.
getBegin(), diag::err_generic_sel_no_match) << SR << P.second;
1986 unsigned ResultIndex =
1987 CompatIndices.size() ? CompatIndices[0] : DefaultIndex;
1989 if (ControllingExpr) {
1991 Context, KeyLoc, ControllingExpr, Types, Exprs, DefaultLoc, RParenLoc,
1992 ContainsUnexpandedParameterPack, ResultIndex);
1995 Context, KeyLoc, ControllingType, Types, Exprs, DefaultLoc, RParenLoc,
1996 ContainsUnexpandedParameterPack, ResultIndex);
2002 llvm_unreachable(
"unexpected TokenKind");
2003 case tok::kw___func__:
2005 case tok::kw___FUNCTION__:
2007 case tok::kw___FUNCDNAME__:
2009 case tok::kw___FUNCSIG__:
2011 case tok::kw_L__FUNCTION__:
2013 case tok::kw_L__FUNCSIG__:
2015 case tok::kw___PRETTY_FUNCTION__:
2026 return cast_or_null<Decl>(DC);
2044 assert(Args.size() <= 2 &&
"too many arguments for literal operator");
2047 for (
unsigned ArgIdx = 0; ArgIdx != Args.size(); ++ArgIdx) {
2048 ArgTy[ArgIdx] = Args[ArgIdx]->getType();
2049 if (ArgTy[ArgIdx]->isArrayType())
2070 std::vector<Token> ExpandedToks;
2076 if (Literal.hadError)
2080 for (
const Token &
Tok : StringToks)
2081 StringTokLocs.push_back(
Tok.getLocation());
2085 false, {}, StringTokLocs);
2087 if (!Literal.getUDSuffix().empty()) {
2090 Literal.getUDSuffixOffset());
2091 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_string_udl));
2111 CurrentDecl =
Context.getTranslationUnitDecl();
2113 std::vector<Token> ExpandedToks;
2114 ExpandedToks.reserve(Toks.size());
2118 ExpandedToks.emplace_back(
Tok);
2122 Diag(
Tok.getLocation(), diag::ext_predef_outside_function);
2124 Diag(
Tok.getLocation(), diag::ext_string_literal_from_predefined)
2127 llvm::raw_svector_ostream
OS(Str);
2128 Token &Exp = ExpandedToks.emplace_back();
2130 if (
Tok.getKind() == tok::kw_L__FUNCTION__ ||
2131 Tok.getKind() == tok::kw_L__FUNCSIG__) {
2133 Exp.
setKind(tok::wide_string_literal);
2135 Exp.
setKind(tok::string_literal);
2141 PP.CreateString(
OS.str(), Exp,
Tok.getLocation(),
Tok.getEndLoc());
2143 return ExpandedToks;
2148 assert(!StringToks.empty() &&
"Must have at least one string!");
2151 std::vector<Token> ExpandedToks;
2156 if (Literal.hadError)
2160 for (
const Token &
Tok : StringToks)
2161 StringTokLocs.push_back(
Tok.getLocation());
2165 if (Literal.isWide()) {
2166 CharTy =
Context.getWideCharType();
2168 }
else if (Literal.isUTF8()) {
2172 CharTy =
Context.UnsignedCharTy;
2174 }
else if (Literal.isUTF16()) {
2177 }
else if (Literal.isUTF32()) {
2180 }
else if (Literal.isPascal()) {
2181 CharTy =
Context.UnsignedCharTy;
2193 ? diag::warn_cxx20_compat_utf8_string
2194 : diag::warn_c23_compat_utf8_string);
2200 auto RemovalDiag =
PDiag(diag::note_cxx20_c23_compat_utf8_string_remove_u8);
2202 for (
const Token &
Tok : StringToks) {
2203 if (
Tok.getKind() == tok::utf8_string_literal) {
2205 RemovalDiagLoc =
Tok.getLocation();
2212 Diag(RemovalDiagLoc, RemovalDiag);
2216 Context.getStringLiteralArrayType(CharTy, Literal.GetNumStringChars());
2220 Context, Literal.GetString(), Kind, Literal.Pascal, StrTy, StringTokLocs);
2221 if (Literal.getUDSuffix().empty())
2228 Literal.getUDSuffixOffset());
2232 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_string_udl));
2239 Context.DeclarationNames.getCXXLiteralOperatorName(UDSuffix);
2244 Context.getArrayDecayedType(StrTy), SizeType
2254 llvm::APInt Len(
Context.getIntWidth(SizeType), Literal.GetNumStringChars());
2257 Expr *Args[] = { Lit, LenArg };
2274 unsigned CharBits =
Context.getIntWidth(CharTy);
2276 llvm::APSInt
Value(CharBits, CharIsUnsigned);
2282 for (
unsigned I = 0, N = Lit->
getLength(); I != N; ++I) {
2293 llvm_unreachable(
"unexpected literal operator lookup result");
2297 llvm_unreachable(
"unexpected literal operator lookup result");
2329 auto *DRE = dyn_cast<DeclRefExpr>(VD->
getInit());
2332 auto *Referee = dyn_cast<VarDecl>(DRE->getDecl());
2333 if (!Referee || !Referee->hasGlobalStorage() ||
2334 Referee->hasAttr<CUDADeviceAttr>())
2340 auto *MD = dyn_cast_or_null<CXXMethodDecl>(S.
CurContext);
2341 if (MD && MD->getParent()->isLambda() &&
2342 MD->getOverloadedOperator() == OO_Call && MD->hasAttr<CUDADeviceAttr>() &&
2364 if (
VarDecl *VD = dyn_cast<VarDecl>(D)) {
2365 if (VD->getType()->isReferenceType() &&
2368 VD->isUsableInConstantExpressions(
Context))
2387 Context, NNS, TemplateKWLoc, D, RefersToCapturedVariable, NameInfo, Ty,
2415 const auto *FD = dyn_cast<FieldDecl>(D);
2416 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(D))
2417 FD = IFD->getAnonField();
2421 if (FD->isBitField())
2427 if (
const auto *BD = dyn_cast<BindingDecl>(D))
2428 if (
const auto *BE = BD->getBinding())
2449 NameInfo =
Context.getNameForTemplate(TName, TNameLoc);
2450 TemplateArgs = &Buffer;
2453 TemplateArgs =
nullptr;
2461 bool isDefaultArgument =
2465 const auto *CurMethod = dyn_cast<CXXMethodDecl>(
CurContext);
2466 bool isInstance = CurMethod && CurMethod->isInstance() &&
2475 unsigned DiagID = diag::err_found_in_dependent_base;
2476 unsigned NoteID = diag::note_member_declared_at;
2478 DiagID =
getLangOpts().MSVCCompat ? diag::ext_found_later_in_class
2479 : diag::err_found_later_in_class;
2481 DiagID = diag::ext_found_in_dependent_base;
2482 NoteID = diag::note_dependent_member_use;
2498 Diag(D->getLocation(), NoteID);
2507 if (isDefaultArgument && ((*R.
begin())->isCXXInstanceMember())) {
2523 unsigned diagnostic = diag::err_undeclared_var_use;
2524 unsigned diagnostic_suggest = diag::err_undeclared_var_use_suggest;
2528 diagnostic = diag::err_undeclared_use;
2529 diagnostic_suggest = diag::err_undeclared_use_suggest;
2540 if (ExplicitTemplateArgs) {
2563 R.
addDecl(Best->FoundDecl.getDecl(), Best->FoundDecl.getAccess());
2578 if (S && (Corrected =
2582 bool DroppedSpecifier =
2586 bool AcceptableWithRecovery =
false;
2587 bool AcceptableWithoutRecovery =
false;
2596 dyn_cast<FunctionTemplateDecl>(CD))
2600 else if (
FunctionDecl *FD = dyn_cast<FunctionDecl>(CD))
2601 if (!ExplicitTemplateArgs || ExplicitTemplateArgs->
size() == 0)
2607 ND = Best->FoundDecl;
2608 Corrected.setCorrectionDecl(ND);
2612 Corrected.setCorrectionDecl(ND);
2640 AcceptableWithoutRecovery =
true;
2643 if (AcceptableWithRecovery || AcceptableWithoutRecovery) {
2645 ? diag::note_implicit_param_decl
2646 : diag::note_previous_decl;
2649 PDiag(NoteID), AcceptableWithRecovery);
2652 PDiag(diag::err_no_member_suggest)
2654 << DroppedSpecifier << NameRange,
2655 PDiag(NoteID), AcceptableWithRecovery);
2658 return !AcceptableWithRecovery;
2693 else if (
auto *MD = dyn_cast<CXXMethodDecl>(S.
CurContext))
2701 auto DB = S.
Diag(Loc, diag::ext_undeclared_unqual_id_with_dependent_base);
2702 DB << NameInfo.
getName() << RD;
2704 if (!ThisType.
isNull()) {
2707 Context,
nullptr, ThisType,
true,
2709 nullptr, NameInfo, TemplateArgs);
2725 bool HasTrailingLParen,
bool IsAddressOfOperand,
2727 bool IsInlineAsmIdentifier,
Token *KeywordReplacement) {
2728 assert(!(IsAddressOfOperand && HasTrailingLParen) &&
2729 "cannot be direct & operand and have a trailing lparen");
2758 if (
auto *VD = dyn_cast<ValueDecl>(R.
getFoundDecl())) {
2772 if (TemplateKWLoc.
isValid() || TemplateArgs) {
2780 false, TemplateKWLoc,
2786 IsAddressOfOperand, TemplateArgs);
2790 !IvarLookupFollowUp);
2796 IsAddressOfOperand, TemplateArgs);
2800 if (IvarLookupFollowUp) {
2815 if (R.
empty() && HasTrailingLParen && II &&
2825 if (R.
empty() && !ADL) {
2828 TemplateKWLoc, TemplateArgs))
2833 if (IsInlineAsmIdentifier)
2841 "Typo correction callback misconfigured");
2855 assert(!R.
empty() &&
2856 "DiagnoseEmptyLookup returned false but added no results");
2863 ExprResult E(
ObjC().LookupInObjCMethod(R, S, Ivar->getIdentifier()));
2873 assert(!R.
empty() || ADL);
2903 if (TemplateArgs || TemplateKWLoc.
isValid()) {
2912 "There should only be one declaration found.");
2940 if (
const auto *CD = dyn_cast<CXXRecordDecl>(DC))
2941 if (CD->isInvalidDecl())
2951 if (
auto *TagD = dyn_cast<TagDecl>(TD)) {
2958 TL.setNameLoc(NameInfo.
getLoc());
2959 }
else if (
auto *TypedefD = dyn_cast<TypedefNameDecl>(TD)) {
2967 ET =
SemaRef.Context.getTypeDeclType(TD);
2975 unsigned DiagID = diag::err_typename_missing;
2977 DiagID = diag::ext_typename_missing;
2979 auto D =
Diag(Loc, DiagID);
3010 const auto *RD = dyn_cast<CXXRecordDecl>(
Member->getDeclContext());
3018 bool PointerConversions =
false;
3020 DestRecordType =
Context.getCanonicalTagType(RD);
3022 DestRecordType =
Context.getAddrSpaceQualType(
3023 DestRecordType, FromPtrType
3028 DestType =
Context.getPointerType(DestRecordType);
3030 PointerConversions =
true;
3032 DestType = DestRecordType;
3033 FromRecordType = FromType;
3035 }
else if (
const auto *
Method = dyn_cast<CXXMethodDecl>(
Member)) {
3036 if (!
Method->isImplicitObjectMemberFunction())
3039 DestType =
Method->getThisType().getNonReferenceType();
3040 DestRecordType =
Method->getFunctionObjectParameterType();
3044 PointerConversions =
true;
3046 FromRecordType = FromType;
3047 DestType = DestRecordType;
3052 if (FromAS != DestAS) {
3054 Context.removeAddrSpaceQualType(FromRecordType);
3056 Context.getAddrSpaceQualType(FromRecordTypeWithoutAS, DestAS);
3057 if (PointerConversions)
3058 FromTypeWithDestAS =
Context.getPointerType(FromTypeWithDestAS);
3072 if (
Context.hasSameUnqualifiedType(FromRecordType, DestRecordType))
3100 assert(QType->
isRecordType() &&
"lookup done with non-record type");
3110 FromLoc, FromRange, &BasePath))
3113 if (PointerConversions)
3114 QType =
Context.getPointerType(QType);
3116 VK, &BasePath).
get();
3119 FromRecordType = QRecordType;
3123 if (
Context.hasSameUnqualifiedType(FromRecordType, DestRecordType))
3130 FromLoc, FromRange, &BasePath,
3139 DestType =
Context.getQualifiedType(DestType, FromTypeQuals);
3147 bool HasTrailingLParen) {
3149 if (!HasTrailingLParen)
3167 if (D->isCXXClassMember())
3178 else if (D->getLexicalDeclContext()->isFunctionOrMethod())
3185 if (
const auto *FDecl = dyn_cast<FunctionDecl>(D)) {
3187 if (FDecl->getBuiltinID() && FDecl->isImplicit())
3202 bool AcceptInvalid) {
3228 const auto *FD = dyn_cast<FunctionDecl>(R.
getFoundDecl());
3230 (FD->isCPUDispatchMultiVersion() || FD->isCPUSpecificMultiVersion());
3235 bool AcceptInvalidDecl) {
3269 bool AcceptInvalidDecl) {
3270 assert(D &&
"Cannot refer to a NULL declaration");
3272 "Cannot refer unambiguously to a function template");
3291 Diag(Loc, diag::err_ref_non_value) << D << SS.
getRange();
3306 if (VD->isInvalidDecl() && !AcceptInvalidDecl)
3312 if (
auto *IndirectField = dyn_cast<IndirectFieldDecl>(VD);
3313 IndirectField && !IndirectField->isCXXClassMember())
3325 type =
type.getNonPackExpansionType();
3329#define ABSTRACT_DECL(kind)
3330#define VALUE(type, base)
3331#define DECL(type, base) case Decl::type:
3332#include "clang/AST/DeclNodes.inc"
3333 llvm_unreachable(
"invalid value decl kind");
3336 case Decl::ObjCAtDefsField:
3337 llvm_unreachable(
"forming non-member reference to ivar?");
3341 case Decl::EnumConstant:
3342 case Decl::UnresolvedUsingValue:
3343 case Decl::OMPDeclareReduction:
3344 case Decl::OMPDeclareMapper:
3353 case Decl::IndirectField:
3354 case Decl::ObjCIvar:
3356 "building reference to field in C?");
3366 case Decl::NonTypeTemplateParm: {
3368 type = reftype->getPointeeType();
3378 if (
type->isRecordType()) {
3379 type =
type.getUnqualifiedType().withConst();
3392 case Decl::VarTemplateSpecialization:
3393 case Decl::VarTemplatePartialSpecialization:
3394 case Decl::Decomposition:
3396 case Decl::OMPCapturedExpr:
3399 type->isVoidType()) {
3405 case Decl::ImplicitParam:
3406 case Decl::ParmVar: {
3416 if (!CapturedType.
isNull())
3417 type = CapturedType;
3422 case Decl::Function: {
3424 if (!
Context.BuiltinInfo.isDirectlyAddressable(BID)) {
3461 case Decl::CXXDeductionGuide:
3462 llvm_unreachable(
"building reference to deduction guide");
3464 case Decl::MSProperty:
3466 case Decl::TemplateParamObject:
3472 case Decl::UnnamedGlobalConstant:
3476 case Decl::CXXMethod:
3481 dyn_cast<FunctionProtoType>(VD->getType()))
3482 if (proto->getReturnType() ==
Context.UnknownAnyTy) {
3495 case Decl::CXXConversion:
3496 case Decl::CXXDestructor:
3497 case Decl::CXXConstructor:
3509 if (VD->isInvalidDecl() && E)
3516 Target.resize(CharByteWidth * (Source.size() + 1));
3517 char *ResultPtr = &
Target[0];
3518 const llvm::UTF8 *ErrorPtr;
3520 llvm::ConvertUTF8toWide(CharByteWidth, Source, ResultPtr, ErrorPtr);
3530 Diag(Loc, diag::ext_predef_outside_function);
3531 currentDecl =
Context.getTranslationUnitDecl();
3541 bool ForceElaboratedPrinting =
3545 unsigned Length = Str.length();
3547 llvm::APInt LengthI(32, Length + 1);
3551 Context.adjustStringLiteralBaseType(
Context.WideCharTy.withConst());
3555 ResTy =
Context.getConstantArrayType(ResTy, LengthI,
nullptr,
3561 ResTy =
Context.adjustStringLiteralBaseType(
Context.CharTy.withConst());
3562 ResTy =
Context.getConstantArrayType(ResTy, LengthI,
nullptr,
3581 StringRef ThisTok =
PP.getSpelling(
Tok, CharBuffer, &
Invalid);
3587 if (Literal.hadError())
3591 if (Literal.isWide())
3597 else if (Literal.isUTF16())
3599 else if (Literal.isUTF32())
3608 if (Literal.isWide())
3610 else if (Literal.isUTF16())
3612 else if (Literal.isUTF32())
3614 else if (Literal.isUTF8())
3620 if (Literal.getUDSuffix().empty())
3630 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_character_udl));
3635 Lit,
Tok.getLocation());
3639 unsigned IntSize =
Context.getTargetInfo().getIntWidth();
3641 llvm::APInt(IntSize, Val,
true),
3649 using llvm::APFloat;
3650 APFloat Val(Format);
3653 if (RM == llvm::RoundingMode::Dynamic)
3654 RM = llvm::RoundingMode::NearestTiesToEven;
3655 APFloat::opStatus result = Literal.GetFloatValue(Val, RM);
3659 if ((result & APFloat::opOverflow) ||
3660 ((result & APFloat::opUnderflow) && Val.isZero())) {
3661 unsigned diagnostic;
3663 if (result & APFloat::opOverflow) {
3664 diagnostic = diag::warn_float_overflow;
3665 APFloat::getLargest(Format).toString(buffer);
3667 diagnostic = diag::warn_float_underflow;
3668 APFloat::getSmallest(Format).toString(buffer);
3671 S.
Diag(Loc, diagnostic) << Ty << buffer.str();
3674 bool isExact = (result == APFloat::opOK);
3679 assert(E &&
"Invalid expression");
3686 Diag(E->
getExprLoc(), diag::err_pragma_loop_invalid_argument_type) << QT;
3690 llvm::APSInt ValueAPS;
3701 bool ValueIsPositive =
3702 AllowZero ? ValueAPS.isNonNegative() : ValueAPS.isStrictlyPositive();
3703 if (!ValueIsPositive || ValueAPS.getActiveBits() > 31) {
3705 <<
toString(ValueAPS, 10) << ValueIsPositive;
3715 if (
Tok.getLength() == 1 ||
Tok.getKind() == tok::binary_data) {
3716 const uint8_t Val =
PP.getSpellingOfSingleCharacterNumericConstant(
Tok);
3725 SpellingBuffer.resize(
Tok.getLength() + 1);
3729 StringRef TokSpelling =
PP.getSpelling(
Tok, SpellingBuffer, &
Invalid);
3734 PP.getSourceManager(),
PP.getLangOpts(),
3735 PP.getTargetInfo(),
PP.getDiagnostics());
3736 if (Literal.hadError)
3739 if (Literal.hasUDSuffix()) {
3747 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_numeric_udl));
3750 if (Literal.isFloatingLiteral()) {
3754 CookedTy =
Context.LongDoubleTy;
3759 CookedTy =
Context.UnsignedLongLongTy;
3763 Context.DeclarationNames.getCXXLiteralOperatorName(UDSuffix);
3775 !Literal.isImaginary)) {
3784 if (Literal.isFloatingLiteral()) {
3787 llvm::APInt ResultVal(
Context.getTargetInfo().getLongLongWidth(), 0);
3788 if (Literal.GetIntegerValue(ResultVal))
3789 Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
3801 unsigned Length = Literal.getUDSuffixOffset();
3808 false, StrTy, TokLoc);
3819 bool CharIsUnsigned =
Context.CharTy->isUnsignedIntegerType();
3820 llvm::APSInt
Value(CharBits, CharIsUnsigned);
3821 for (
unsigned I = 0, N = Literal.getUDSuffixOffset(); I != N; ++I) {
3822 Value = TokSpelling[I];
3830 llvm_unreachable(
"unexpected literal operator lookup result");
3836 if (Literal.isFixedPointLiteral()) {
3839 if (Literal.isAccum) {
3840 if (Literal.isHalf) {
3842 }
else if (Literal.isLong) {
3847 }
else if (Literal.isFract) {
3848 if (Literal.isHalf) {
3850 }
else if (Literal.isLong) {
3857 if (Literal.isUnsigned) Ty =
Context.getCorrespondingUnsignedType(Ty);
3859 bool isSigned = !Literal.isUnsigned;
3860 unsigned scale =
Context.getFixedPointScale(Ty);
3861 unsigned bit_width =
Context.getTypeInfo(Ty).Width;
3863 llvm::APInt Val(bit_width, 0, isSigned);
3864 bool Overflowed = Literal.GetFixedPointValue(Val, scale);
3865 bool ValIsZero = Val.isZero() && !Overflowed;
3867 auto MaxVal =
Context.getFixedPointMax(Ty).getValue();
3868 if (Literal.isFract && Val == MaxVal + 1 && !ValIsZero)
3874 else if (Val.ugt(MaxVal) || Overflowed)
3875 Diag(
Tok.getLocation(), diag::err_too_large_for_fixed_point);
3878 Tok.getLocation(), scale);
3879 }
else if (Literal.isFloatingLiteral()) {
3881 if (Literal.isHalf){
3886 Diag(
Tok.getLocation(), diag::err_half_const_requires_fp16);
3889 }
else if (Literal.isFloat)
3891 else if (Literal.isLong)
3893 else if (Literal.isFloat16)
3895 else if (Literal.isFloat128)
3912 Diag(
Tok.getLocation(), diag::warn_double_const_requires_fp64)
3917 }
else if (!Literal.isIntegerLiteral()) {
3923 if (Literal.isSizeT)
3926 ? diag::warn_cxx20_compat_size_t_suffix
3927 : diag::ext_cxx23_size_t_suffix
3928 : diag::err_cxx23_size_t_suffix);
3935 if (Literal.isBitInt)
3936 PP.Diag(
Tok.getLocation(),
3939 : diag::ext_c23_bitint_suffix);
3948 unsigned BitsNeeded =
Context.getTargetInfo().getIntMaxTWidth();
3949 if (Literal.isBitInt)
3950 BitsNeeded = llvm::APInt::getSufficientBitsNeeded(
3951 Literal.getLiteralDigits(), Literal.getRadix());
3952 if (Literal.MicrosoftInteger) {
3953 if (Literal.MicrosoftInteger == 128 &&
3954 !
Context.getTargetInfo().hasInt128Type())
3955 PP.Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
3956 << Literal.isUnsigned;
3957 BitsNeeded = Literal.MicrosoftInteger;
3960 llvm::APInt ResultVal(BitsNeeded, 0);
3962 if (Literal.GetIntegerValue(ResultVal)) {
3964 Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
3966 Ty =
Context.UnsignedLongLongTy;
3967 assert(
Context.getTypeSize(Ty) == ResultVal.getBitWidth() &&
3968 "long long is not intmax_t?");
3975 bool AllowUnsigned = Literal.isUnsigned || Literal.getRadix() != 10;
3982 Literal.isLong =
true;
3983 Literal.isLongLong =
false;
3990 if (Literal.MicrosoftInteger) {
3991 if (Literal.MicrosoftInteger == 8 && !Literal.isUnsigned) {
3995 Width = Literal.MicrosoftInteger;
3996 Ty =
Context.getIntTypeForBitwidth(Width,
3997 !Literal.isUnsigned);
4003 if (Literal.isBitInt) {
4006 Width = std::max(ResultVal.getActiveBits(), 1u) +
4007 (Literal.isUnsigned ? 0u : 1u);
4011 unsigned int MaxBitIntWidth =
4012 Context.getTargetInfo().getMaxBitIntWidth();
4013 if (Width > MaxBitIntWidth) {
4014 Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
4015 << Literal.isUnsigned;
4016 Width = MaxBitIntWidth;
4023 ResultVal = ResultVal.zextOrTrunc(Width);
4024 Ty =
Context.getBitIntType(Literal.isUnsigned, Width);
4028 if (Literal.isSizeT) {
4029 assert(!Literal.MicrosoftInteger &&
4030 "size_t literals can't be Microsoft literals");
4031 unsigned SizeTSize =
Context.getTargetInfo().getTypeWidth(
4032 Context.getTargetInfo().getSizeType());
4035 if (ResultVal.isIntN(SizeTSize)) {
4037 if (!Literal.isUnsigned && ResultVal[SizeTSize - 1] == 0)
4038 Ty =
Context.getSignedSizeType();
4039 else if (AllowUnsigned)
4045 if (Ty.
isNull() && !Literal.isLong && !Literal.isLongLong &&
4048 unsigned IntSize =
Context.getTargetInfo().getIntWidth();
4051 if (ResultVal.isIntN(IntSize)) {
4053 if (!Literal.isUnsigned && ResultVal[IntSize-1] == 0)
4055 else if (AllowUnsigned)
4062 if (Ty.
isNull() && !Literal.isLongLong && !Literal.isSizeT) {
4063 unsigned LongSize =
Context.getTargetInfo().getLongWidth();
4066 if (ResultVal.isIntN(LongSize)) {
4068 if (!Literal.isUnsigned && ResultVal[LongSize-1] == 0)
4070 else if (AllowUnsigned)
4075 const unsigned LongLongSize =
4076 Context.getTargetInfo().getLongLongWidth();
4080 ? diag::warn_old_implicitly_unsigned_long_cxx
4082 ext_old_implicitly_unsigned_long_cxx
4083 : diag::warn_old_implicitly_unsigned_long)
4084 << (LongLongSize > LongSize ? 0
4093 if (Ty.
isNull() && !Literal.isSizeT) {
4094 unsigned LongLongSize =
Context.getTargetInfo().getLongLongWidth();
4097 if (ResultVal.isIntN(LongLongSize)) {
4101 if (!Literal.isUnsigned && (ResultVal[LongLongSize-1] == 0 ||
4102 (
getLangOpts().MSVCCompat && Literal.isLongLong)))
4104 else if (AllowUnsigned)
4105 Ty =
Context.UnsignedLongLongTy;
4106 Width = LongLongSize;
4112 ? diag::warn_cxx98_compat_longlong
4113 : diag::ext_cxx11_longlong);
4115 Diag(
Tok.getLocation(), diag::ext_c99_longlong);
4123 if (Literal.isSizeT)
4124 Diag(
Tok.getLocation(), diag::err_size_t_literal_too_large)
4125 << Literal.isUnsigned;
4128 diag::ext_integer_literal_too_large_for_signed);
4129 Ty =
Context.UnsignedLongLongTy;
4130 Width =
Context.getTargetInfo().getLongLongWidth();
4133 if (ResultVal.getBitWidth() != Width)
4134 ResultVal = ResultVal.trunc(Width);
4140 if (Literal.isImaginary) {
4147 DiagId = diag::ext_gnu_imaginary_constant;
4149 DiagId = diag::warn_c23_compat_imaginary_constant;
4151 DiagId = diag::ext_c2y_imaginary_constant;
4152 Diag(
Tok.getLocation(), DiagId);
4158 assert(E &&
"ActOnParenExpr() missing expr");
4173 if (!(
T->isArithmeticType() ||
T->isVoidType() ||
T->isVectorType())) {
4174 S.
Diag(Loc, diag::err_vecstep_non_scalar_vector_type)
4179 assert((
T->isVoidType() || !
T->isIncompleteType()) &&
4180 "Scalar types should always be complete");
4188 if (!
T->isVectorType() && !
T->isSizelessVectorType())
4189 return S.
Diag(Loc, diag::err_builtin_non_vector_type)
4191 <<
"__builtin_vectorelements" <<
T << ArgRange;
4193 if (
auto *FD = dyn_cast<FunctionDecl>(S.
CurContext)) {
4194 if (
T->isSVESizelessBuiltinType()) {
4195 llvm::StringMap<bool> CallerFeatureMap;
4210 if (!
T->isFunctionType() && !
T->isFunctionPointerType() &&
4211 !
T->isFunctionReferenceType() && !
T->isMemberFunctionPointerType()) {
4212 S.
Diag(Loc, diag::err_ptrauth_type_disc_undiscriminated) <<
T << ArgRange;
4228 if (
T->isFunctionType() &&
4229 (TraitKind == UETT_SizeOf || TraitKind == UETT_AlignOf ||
4230 TraitKind == UETT_PreferredAlignOf)) {
4232 S.
Diag(Loc, diag::ext_sizeof_alignof_function_type)
4239 if (
T->isVoidType()) {
4240 unsigned DiagID = S.
LangOpts.OpenCL ? diag::err_opencl_sizeof_alignof_type
4241 : diag::ext_sizeof_alignof_void_type;
4256 S.
Diag(Loc, diag::err_sizeof_nonfragile_interface)
4257 <<
T << (TraitKind == UETT_SizeOf)
4274 const auto *ICE = dyn_cast<ImplicitCastExpr>(E);
4275 if (!ICE || ICE->getCastKind() != CK_ArrayToPointerDecay)
4278 S.
Diag(Loc, diag::warn_sizeof_array_decay) << ICE->getSourceRange()
4280 << ICE->getSubExpr()->getType();
4288 bool IsUnevaluatedOperand =
4289 (ExprKind == UETT_SizeOf || ExprKind == UETT_DataSizeOf ||
4290 ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf ||
4291 ExprKind == UETT_VecStep || ExprKind == UETT_CountOf);
4292 if (IsUnevaluatedOperand) {
4308 Diag(E->
getExprLoc(), diag::warn_side_effects_unevaluated_context);
4310 if (ExprKind == UETT_VecStep)
4314 if (ExprKind == UETT_VectorElements)
4325 if (
Context.getTargetInfo().getTriple().isWasm() &&
4336 if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf) {
4339 diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4344 E, diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4363 if (ExprKind == UETT_CountOf) {
4368 Diag(E->
getExprLoc(), diag::err_countof_arg_not_array_type) << ExprType;
4378 if (ExprKind == UETT_SizeOf) {
4379 if (
const auto *DeclRef = dyn_cast<DeclRefExpr>(E->
IgnoreParens())) {
4380 if (
const auto *PVD = dyn_cast<ParmVarDecl>(DeclRef->getFoundDecl())) {
4381 QualType OType = PVD->getOriginalType();
4386 Diag(PVD->getLocation(), diag::note_declared_at);
4394 if (
const auto *BO = dyn_cast<BinaryOperator>(E->
IgnoreParens())) {
4411 S.
Diag(E->
getExprLoc(), diag::err_sizeof_alignof_typeof_bitfield)
4418 if (
DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Inner)) {
4420 }
else if (
MemberExpr *ME = dyn_cast<MemberExpr>(Inner)) {
4421 D = ME->getMemberDecl();
4441 if (
FieldDecl *FD = dyn_cast_or_null<FieldDecl>(D)) {
4444 if (!FD->getParent()->isCompleteDefinition()) {
4445 S.
Diag(E->
getExprLoc(), diag::err_alignof_member_of_incomplete_type)
4454 if (!FD->getType()->isReferenceType())
4473 assert(
T->isVariablyModifiedType());
4474 assert(CSI !=
nullptr);
4478 const Type *Ty =
T.getTypePtr();
4480#define TYPE(Class, Base)
4481#define ABSTRACT_TYPE(Class, Base)
4482#define NON_CANONICAL_TYPE(Class, Base)
4483#define DEPENDENT_TYPE(Class, Base) case Type::Class:
4484#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)
4485#include "clang/AST/TypeNodes.inc"
4492 case Type::ExtVector:
4493 case Type::ConstantMatrix:
4496 case Type::TemplateSpecialization:
4497 case Type::ObjCObject:
4498 case Type::ObjCInterface:
4499 case Type::ObjCObjectPointer:
4500 case Type::ObjCTypeParam:
4503 case Type::HLSLInlineSpirv:
4504 llvm_unreachable(
"type class is never variably-modified!");
4505 case Type::Adjusted:
4511 case Type::ArrayParameter:
4517 case Type::BlockPointer:
4520 case Type::LValueReference:
4521 case Type::RValueReference:
4524 case Type::MemberPointer:
4527 case Type::ConstantArray:
4528 case Type::IncompleteArray:
4532 case Type::VariableArray: {
4546 case Type::FunctionProto:
4547 case Type::FunctionNoProto:
4552 case Type::UnaryTransform:
4553 case Type::Attributed:
4554 case Type::BTFTagAttributed:
4555 case Type::HLSLAttributedResource:
4556 case Type::SubstTemplateTypeParm:
4557 case Type::MacroQualified:
4558 case Type::CountAttributed:
4560 T =
T.getSingleStepDesugaredType(Context);
4565 case Type::Decltype:
4568 case Type::PackIndexing:
4575 case Type::DeducedTemplateSpecialization:
4578 case Type::TypeOfExpr:
4584 case Type::PredefinedSugar:
4588 }
while (!
T.isNull() &&
T->isVariablyModifiedType());
4611 if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf ||
4612 ExprKind == UETT_OpenMPRequiredSimdAlign) {
4618 ? diag::warn_c2y_compat_alignof_incomplete_array
4619 : diag::ext_c2y_alignof_incomplete_array);
4620 ExprType =
Context.getBaseElementType(ExprType);
4623 if (ExprKind == UETT_VecStep)
4626 if (ExprKind == UETT_VectorElements)
4630 if (ExprKind == UETT_PtrAuthTypeDiscriminator)
4640 OpLoc, ExprType, diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4645 Diag(OpLoc, diag::err_sizeof_alignof_function_type) << KWName << ExprRange;
4649 if (ExprKind == UETT_CountOf) {
4653 Diag(OpLoc, diag::err_countof_arg_not_array_type) << ExprType;
4660 if (
Context.getTargetInfo().getTriple().isWasm() &&
4662 Diag(OpLoc, diag::err_wasm_table_invalid_uett_operand)
4676 auto *CSI = dyn_cast<CapturingScopeInfo>(*I);
4680 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(CSI))
4681 DC = LSI->CallOperator;
4682 else if (
auto *CRSI = dyn_cast<CapturedRegionScopeInfo>(CSI))
4683 DC = CRSI->TheCapturedDecl;
4684 else if (
auto *BSI = dyn_cast<BlockScopeInfo>(CSI))
4707 if (!
T->isDependentType() &&
4716 (ExprKind == UETT_SizeOf || ExprKind == UETT_CountOf) &&
4742 }
else if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf) {
4744 }
else if (ExprKind == UETT_VecStep) {
4746 }
else if (ExprKind == UETT_OpenMPRequiredSimdAlign) {
4750 Diag(E->
getExprLoc(), diag::err_sizeof_alignof_typeof_bitfield) << 0;
4752 }
else if (ExprKind == UETT_VectorElements || ExprKind == UETT_SizeOf ||
4753 ExprKind == UETT_CountOf) {
4760 if ((ExprKind == UETT_SizeOf || ExprKind == UETT_CountOf) &&
4795 UETT_AlignOf, KWName);
4808 if (
V.get()->isTypeDependent())
4820 return CT->getElementType();
4823 if (
V.get()->getType()->isArithmeticType())
4824 return V.get()->getType();
4829 if (PR.
get() !=
V.get()) {
4835 S.
Diag(Loc, diag::err_realimag_invalid_type) <<
V.get()->getType()
4836 << (IsReal ?
"__real" :
"__imag");
4847 default: llvm_unreachable(
"Unknown unary op!");
4848 case tok::plusplus: Opc = UO_PostInc;
break;
4849 case tok::minusminus: Opc = UO_PostDec;
break;
4868 !S.
LangOpts.ObjCSubscriptingLegacyRuntime)
4871 S.
Diag(opLoc, diag::err_arithmetic_nonfragile_interface)
4878 auto *BaseNoParens =
Base->IgnoreParens();
4879 if (
auto *MSProp = dyn_cast<MSPropertyRefExpr>(BaseNoParens))
4880 return MSProp->getPropertyDecl()->getType()->isArrayType();
4901 if (RTy->isIntegralOrUnscopedEnumerationType()) {
4903 Result = PT->getPointeeType();
4905 Result = AT->getElementType();
4908 Result = PT->getPointeeType();
4910 Result = AT->getElementType();
4913 return Result->isDependentType() ? Result : Ctx.
DependentTy;
4924 if (AS->isOMPArraySection())
4940 base = result.
get();
4947 auto CheckAndReportCommaError = [
this, base, rbLoc](
Expr *E) {
4949 Diag(E->getExprLoc(), diag::err_matrix_subscript_comma)
4960 Diag(base->
getExprLoc(), diag::err_matrix_separate_incomplete_index)
4966 auto *matSubscriptE = dyn_cast<MatrixSubscriptExpr>(base);
4967 if (matSubscriptE) {
4968 assert(ArgExprs.size() == 1);
4969 if (CheckAndReportCommaError(ArgExprs.front()))
4972 assert(matSubscriptE->isIncomplete() &&
4973 "base has to be an incomplete matrix subscript");
4975 matSubscriptE->getRowIdx(),
4976 ArgExprs.front(), rbLoc);
4984 CheckInvalidBuiltinCountedByRef(base,
4992 bool IsMSPropertySubscript =
false;
4995 if (!IsMSPropertySubscript) {
4999 base = result.
get();
5005 assert(ArgExprs.size() == 1);
5006 if (CheckAndReportCommaError(ArgExprs.front()))
5014 Expr *idx = ArgExprs[0];
5023 if (ArgExprs.size() == 1 &&
5024 ArgExprs[0]->getType()->isNonOverloadPlaceholderType()) {
5028 ArgExprs[0] = result.
get();
5040 base, ArgExprs.front(),
5053 if (IsMSPropertySubscript) {
5054 assert(ArgExprs.size() == 1);
5073 ArgExprs[0]->getType()->isRecordType())))) {
5091 return InitSeq.
Perform(*
this, Entity, Kind, E);
5105 RowIdx = RowR.
get();
5115 auto IsIndexValid = [&](
Expr *IndexExpr,
unsigned Dim,
5116 bool IsColumnIdx) ->
Expr * {
5124 if (std::optional<llvm::APSInt> Idx =
5126 if ((*Idx < 0 || *Idx >=
Dim)) {
5128 << IsColumnIdx <<
Dim;
5135 "should be able to convert any integer type to size type");
5136 return ConvExpr.
get();
5140 RowIdx = IsIndexValid(RowIdx, MTy->getNumRows(),
false);
5145 Context.getExtVectorType(MTy->getElementType(), MTy->getNumColumns());
5161 RowIdx = RowR.
get();
5165 Base, RowIdx, ColumnIdx,
Context.IncompleteMatrixIdxTy, RBLoc);
5176 ColumnIdx = ColumnR.
get();
5181 auto IsIndexValid = [&](
Expr *IndexExpr,
unsigned Dim,
5182 bool IsColumnIdx) ->
Expr * {
5190 if (std::optional<llvm::APSInt> Idx =
5192 if ((*Idx < 0 || *Idx >=
Dim)) {
5194 << IsColumnIdx <<
Dim;
5201 "should be able to convert any integer type to size type");
5202 return ConvExpr.
get();
5206 RowIdx = IsIndexValid(RowIdx, MTy->getNumRows(),
false);
5207 ColumnIdx = IsIndexValid(ColumnIdx, MTy->getNumColumns(),
true);
5208 if (!RowIdx || !ColumnIdx)
5212 MTy->getElementType(), RBLoc);
5215void Sema::CheckAddressOfNoDeref(
const Expr *E) {
5222 while ((
Member = dyn_cast<MemberExpr>(StrippedExpr)) && !
Member->isArrow())
5223 StrippedExpr =
Member->getBase()->IgnoreParenImpCasts();
5225 LastRecord.PossibleDerefs.erase(StrippedExpr);
5239 if (ResultTy->
hasAttr(attr::NoDeref)) {
5240 LastRecord.PossibleDerefs.insert(E);
5247 QualType BaseTy =
Base->getType();
5252 const MemberExpr *
Member =
nullptr;
5253 while ((
Member = dyn_cast<MemberExpr>(
Base->IgnoreParenCasts())) &&
5257 if (
const auto *Ptr = dyn_cast<PointerType>(
Base->getType())) {
5258 if (Ptr->getPointeeType()->hasAttr(attr::NoDeref))
5259 LastRecord.PossibleDerefs.insert(E);
5275 for (
auto *Op : {LHSExp, RHSExp}) {
5276 Op = Op->IgnoreImplicit();
5277 if (Op->getType()->isArrayType() && !Op->isLValue())
5300 Expr *BaseExpr, *IndexExpr;
5318 if (!
LangOpts.isSubscriptPointerArithmetic())
5334 if (!
LangOpts.isSubscriptPointerArithmetic()) {
5335 Diag(LLoc, diag::err_subscript_nonfragile_interface)
5359 LHSExp = Materialized.
get();
5366 Qualifiers BaseQuals = BaseType.getQualifiers();
5368 Qualifiers Combined = BaseQuals + MemberQuals;
5369 if (Combined != MemberQuals)
5370 ResultType =
Context.getQualifiedType(ResultType, Combined);
5380 CK_ArrayToPointerDecay).
get();
5386 }
else if (RHSTy->isArrayType()) {
5391 CK_ArrayToPointerDecay).
get();
5398 return ExprError(
Diag(LLoc, diag::err_typecheck_subscript_value)
5403 return ExprError(
Diag(LLoc, diag::err_typecheck_subscript_not_integer)
5409 std::optional<llvm::APSInt> IntegerContantExpr =
5411 if (!IntegerContantExpr.has_value() ||
5412 IntegerContantExpr.value().isNegative())
5428 Diag(LLoc, diag::ext_gnu_subscript_void_type)
5439 diag::err_subscript_incomplete_or_sizeless_type, BaseExpr))
5452 auto *CSI = dyn_cast<CapturingScopeInfo>(*I);
5456 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(CSI))
5457 DC = LSI->CallOperator;
5458 else if (
auto *CRSI = dyn_cast<CapturedRegionScopeInfo>(CSI))
5459 DC = CRSI->TheCapturedDecl;
5460 else if (
auto *BSI = dyn_cast<BlockScopeInfo>(CSI))
5478 bool SkipImmediateInvocations) {
5479 if (Param->hasUnparsedDefaultArg()) {
5480 assert(!RewrittenInit &&
"Should not have a rewritten init expression yet");
5484 Diag(Param->getBeginLoc(), diag::err_recursive_default_argument) << FD;
5485 Diag(CallLoc, diag::note_recursive_default_argument_used_here);
5486 Param->setInvalidDecl();
5490 Diag(CallLoc, diag::err_use_of_default_argument_to_function_declared_later)
5493 diag::note_default_argument_declared_here);
5497 if (Param->hasUninstantiatedDefaultArg()) {
5498 assert(!RewrittenInit &&
"Should not have a rewitten init expression yet");
5503 Expr *
Init = RewrittenInit ? RewrittenInit : Param->getInit();
5504 assert(
Init &&
"default argument but no initializer?");
5513 if (
auto *InitWithCleanup = dyn_cast<ExprWithCleanups>(
Init)) {
5516 Cleanup.setExprNeedsCleanups(InitWithCleanup->cleanupsHaveSideEffects());
5520 assert(!InitWithCleanup->getNumObjects() &&
5521 "default argument expression has capturing blocks?");
5534 SkipImmediateInvocations;
5622 if (!
SemaRef.CurrentInstantiationScope ||
5634 assert(Param->hasDefaultArg() &&
"can't build nonexistent default arg");
5638 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
5639 InitializationContext =
5641 if (!InitializationContext.has_value())
5642 InitializationContext.emplace(CallLoc, Param,
CurContext);
5644 if (!
Init && !Param->hasUnparsedDefaultArg()) {
5659 if (Param->hasUninstantiatedDefaultArg()) {
5668 if (!NestedDefaultChecking)
5669 V.TraverseDecl(Param);
5673 if (
V.HasImmediateCalls ||
5674 (NeedRebuild && isa_and_present<ExprWithCleanups>(Param->getInit()))) {
5675 if (
V.HasImmediateCalls)
5685 Res = Immediate.TransformInitializer(Param->getInit(),
5699 CallLoc, FD, Param,
Init,
5700 NestedDefaultChecking))
5704 Init, InitializationContext->Context);
5714 ClassPattern->
lookup(Field->getDeclName());
5715 auto Rng = llvm::make_filter_range(
5726 assert(Field->hasInClassInitializer());
5732 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
5733 InitializationContext =
5735 if (!InitializationContext.has_value())
5736 InitializationContext.emplace(Loc, Field,
CurContext);
5745 if (!Field->getInClassInitializer()) {
5751 assert(Pattern &&
"We must have set the Pattern!");
5755 Field->setInvalidDecl();
5767 if (!NestedDefaultChecking)
5768 V.TraverseDecl(Field);
5777 bool ContainsAnyTemporaries =
5778 isa_and_present<ExprWithCleanups>(Field->getInClassInitializer());
5779 if (Field->getInClassInitializer() &&
5780 !Field->getInClassInitializer()->containsErrors() &&
5781 (
V.HasImmediateCalls || (NeedRebuild && ContainsAnyTemporaries))) {
5785 NestedDefaultChecking;
5793 Res = Immediate.TransformInitializer(Field->getInClassInitializer(),
5799 Field->setInvalidDecl();
5805 if (Field->getInClassInitializer()) {
5806 Expr *E =
Init ?
Init : Field->getInClassInitializer();
5807 if (!NestedDefaultChecking)
5818 Field->setInvalidDecl();
5824 Field, InitializationContext->Context,
5843 Diag(Loc, diag::err_default_member_initializer_not_yet_parsed)
5844 << OutermostClass << Field;
5845 Diag(Field->getEndLoc(),
5846 diag::note_default_member_initializer_not_yet_parsed);
5849 Field->setInvalidDecl();
5857 if (isa_and_nonnull<CXXConstructorDecl>(FDecl))
5859 else if (Fn && Fn->getType()->isBlockPointerType())
5863 if (
Method->isInstance())
5865 }
else if (Fn && Fn->getType() ==
Context.BoundMemberTy)
5878 FunctionName(FuncName) {}
5880 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
5889 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
5890 return std::make_unique<FunctionCallCCC>(*
this);
5894 const IdentifierInfo *
const FunctionName;
5910 if (
NamedDecl *ND = Corrected.getFoundDecl()) {
5911 if (Corrected.isOverloaded()) {
5921 ND = Best->FoundDecl;
5922 Corrected.setCorrectionDecl(ND);
5928 ND = ND->getUnderlyingDecl();
5943 Fn = Fn->IgnoreParens();
5945 auto *UO = dyn_cast<UnaryOperator>(Fn);
5946 if (!UO || UO->getOpcode() != clang::UO_AddrOf)
5948 if (
auto *DRE = dyn_cast<DeclRefExpr>(UO->getSubExpr()->IgnoreParens())) {
5949 return DRE->hasQualifier();
5951 if (
auto *OVL = dyn_cast<OverloadExpr>(UO->getSubExpr()->IgnoreParens()))
5952 return bool(OVL->getQualifier());
5962 bool IsExecConfig) {
5966 if (
Context.BuiltinInfo.hasCustomTypechecking(ID))
5973 bool HasExplicitObjectParameter =
5975 unsigned ExplicitObjectParameterOffset = HasExplicitObjectParameter ? 1 : 0;
5979 unsigned FnKind = Fn->getType()->isBlockPointerType()
5986 if (Args.size() < NumParams) {
5987 if (Args.size() < MinArgs) {
5992 ? diag::err_typecheck_call_too_few_args_suggest
5993 : diag::err_typecheck_call_too_few_args_at_least_suggest;
5996 << FnKind << MinArgs - ExplicitObjectParameterOffset
5997 <<
static_cast<unsigned>(Args.size()) -
5998 ExplicitObjectParameterOffset
6000 }
else if (MinArgs - ExplicitObjectParameterOffset == 1 && FDecl &&
6005 ? diag::err_typecheck_call_too_few_args_one
6006 : diag::err_typecheck_call_too_few_args_at_least_one)
6007 << FnKind << FDecl->
getParamDecl(ExplicitObjectParameterOffset)
6008 << HasExplicitObjectParameter << Fn->getSourceRange();
6011 ? diag::err_typecheck_call_too_few_args
6012 : diag::err_typecheck_call_too_few_args_at_least)
6013 << FnKind << MinArgs - ExplicitObjectParameterOffset
6014 <<
static_cast<unsigned>(Args.size()) -
6015 ExplicitObjectParameterOffset
6016 << HasExplicitObjectParameter << Fn->getSourceRange();
6019 if (!TC && FDecl && !FDecl->
getBuiltinID() && !IsExecConfig)
6027 assert((
Call->getNumArgs() == NumParams) &&
6028 "We should have reserved space for the default arguments before!");
6033 if (Args.size() > NumParams) {
6039 ? diag::err_typecheck_call_too_many_args_suggest
6040 : diag::err_typecheck_call_too_many_args_at_most_suggest;
6043 << FnKind << NumParams - ExplicitObjectParameterOffset
6044 <<
static_cast<unsigned>(Args.size()) -
6045 ExplicitObjectParameterOffset
6047 }
else if (NumParams - ExplicitObjectParameterOffset == 1 && FDecl &&
6050 Diag(Args[NumParams]->getBeginLoc(),
6051 MinArgs == NumParams
6052 ? diag::err_typecheck_call_too_many_args_one
6053 : diag::err_typecheck_call_too_many_args_at_most_one)
6054 << FnKind << FDecl->
getParamDecl(ExplicitObjectParameterOffset)
6055 <<
static_cast<unsigned>(Args.size()) -
6056 ExplicitObjectParameterOffset
6057 << HasExplicitObjectParameter << Fn->getSourceRange()
6059 Args.back()->getEndLoc());
6061 Diag(Args[NumParams]->getBeginLoc(),
6062 MinArgs == NumParams
6063 ? diag::err_typecheck_call_too_many_args
6064 : diag::err_typecheck_call_too_many_args_at_most)
6065 << FnKind << NumParams - ExplicitObjectParameterOffset
6066 <<
static_cast<unsigned>(Args.size()) -
6067 ExplicitObjectParameterOffset
6068 << HasExplicitObjectParameter << Fn->getSourceRange()
6070 Args.back()->getEndLoc());
6073 if (!TC && FDecl && !FDecl->
getBuiltinID() && !IsExecConfig)
6078 Call->shrinkNumArgs(NumParams);
6089 unsigned TotalNumArgs = AllArgs.size();
6090 for (
unsigned i = 0; i < TotalNumArgs; ++i)
6091 Call->setArg(i, AllArgs[i]);
6093 Call->computeDependence();
6102 bool IsListInitialization) {
6107 for (
unsigned i = FirstParam; i < NumParams; i++) {
6112 if (ArgIx < Args.size()) {
6113 Arg = Args[ArgIx++];
6116 diag::err_call_incomplete_argument, Arg))
6120 bool CFAudited =
false;
6122 FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>() &&
6123 (!Param || !Param->hasAttr<CFConsumedAttr>()))
6126 FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>() &&
6127 (!Param || !Param->hasAttr<CFConsumedAttr>()))
6133 BE->getBlockDecl()->setDoesNotEscape();
6153 Entity,
SourceLocation(), Arg, IsListInitialization, AllowExplicit);
6159 assert(Param &&
"can't use default arguments without a known callee");
6171 CheckArrayAccess(Arg);
6176 AllArgs.push_back(Arg);
6185 for (
Expr *A : Args.slice(ArgIx)) {
6189 AllArgs.push_back(arg.get());
6194 for (
Expr *A : Args.slice(ArgIx)) {
6197 AllArgs.push_back(Arg.
get());
6202 for (
Expr *A : Args.slice(ArgIx))
6203 CheckArrayAccess(A);
6211 TL = DTL.getOriginalLoc();
6214 << ATL.getLocalSourceRange();
6220 const Expr *ArgExpr) {
6225 QualType OrigTy = Param->getOriginalType();
6250 Diag(CallLoc, diag::warn_static_array_too_small)
6258 std::optional<CharUnits> ArgSize =
6260 std::optional<CharUnits> ParmSize =
6262 if (ArgSize && ParmSize && *ArgSize < *ParmSize) {
6263 Diag(CallLoc, diag::warn_static_array_too_small)
6265 << (
unsigned)ParmSize->getQuantity() << 1;
6279 if (!placeholder)
return false;
6281 switch (placeholder->
getKind()) {
6283#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
6284 case BuiltinType::Id:
6285#include "clang/Basic/OpenCLImageTypes.def"
6286#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
6287 case BuiltinType::Id:
6288#include "clang/Basic/OpenCLExtensionTypes.def"
6291#define SVE_TYPE(Name, Id, SingletonId) \
6292 case BuiltinType::Id:
6293#include "clang/Basic/AArch64ACLETypes.def"
6294#define PPC_VECTOR_TYPE(Name, Id, Size) \
6295 case BuiltinType::Id:
6296#include "clang/Basic/PPCTypes.def"
6297#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6298#include "clang/Basic/RISCVVTypes.def"
6299#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6300#include "clang/Basic/WebAssemblyReferenceTypes.def"
6301#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
6302#include "clang/Basic/AMDGPUTypes.def"
6303#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6304#include "clang/Basic/HLSLIntangibleTypes.def"
6305#define PLACEHOLDER_TYPE(ID, SINGLETON_ID)
6306#define BUILTIN_TYPE(ID, SINGLETON_ID) case BuiltinType::ID:
6307#include "clang/AST/BuiltinTypes.def"
6310 case BuiltinType::UnresolvedTemplate:
6313 case BuiltinType::Overload:
6318 case BuiltinType::ARCUnbridgedCast:
6322 case BuiltinType::PseudoObject:
6327 case BuiltinType::UnknownAny:
6331 case BuiltinType::BoundMember:
6332 case BuiltinType::BuiltinFn:
6333 case BuiltinType::IncompleteMatrixIdx:
6334 case BuiltinType::ArraySection:
6335 case BuiltinType::OMPArrayShaping:
6336 case BuiltinType::OMPIterator:
6340 llvm_unreachable(
"bad builtin type kind");
6346 bool hasInvalid =
false;
6347 for (
size_t i = 0, e = args.size(); i != e; i++) {
6350 if (result.
isInvalid()) hasInvalid =
true;
6351 else args[i] = result.
get();
6375 if (!Context.BuiltinInfo.hasPtrArgsOrResult(FDecl->
getBuiltinID()) || !FT ||
6379 bool NeedsNewDecl =
false;
6399 if (!ParamType->isPointerType() ||
6400 ParamType->getPointeeType().hasAddressSpace() ||
6401 !ArgType->isPointerType() ||
6402 !ArgType->getPointeeType().hasAddressSpace() ||
6404 OverloadParams.push_back(ParamType);
6409 NeedsNewDecl =
true;
6410 LangAS AS = ArgType->getPointeeType().getAddressSpace();
6412 PointeeType = Context.getAddrSpaceQualType(PointeeType, AS);
6413 OverloadParams.push_back(Context.getPointerType(PointeeType));
6423 OverloadParams, EPI);
6433 for (
unsigned i = 0, e = FT->
getNumParams(); i != e; ++i) {
6440 Params.push_back(Parm);
6442 OverloadDecl->setParams(Params);
6446 if (FDecl->
hasAttr<CUDAHostAttr>())
6447 OverloadDecl->
addAttr(CUDAHostAttr::CreateImplicit(Context));
6448 if (FDecl->
hasAttr<CUDADeviceAttr>())
6449 OverloadDecl->
addAttr(CUDADeviceAttr::CreateImplicit(Context));
6452 return OverloadDecl;
6463 !Callee->isVariadic())
6465 if (Callee->getMinRequiredArguments() > ArgExprs.size())
6468 if (
const EnableIfAttr *
Attr =
6469 S.
CheckEnableIf(Callee, Fn->getBeginLoc(), ArgExprs,
true)) {
6470 S.
Diag(Fn->getBeginLoc(),
6472 ? diag::err_ovl_no_viable_member_function_in_call
6473 : diag::err_ovl_no_viable_function_in_call)
6474 << Callee << Callee->getSourceRange();
6475 S.
Diag(Callee->getLocation(),
6476 diag::note_ovl_candidate_disabled_by_function_cond_attr)
6477 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
6485 const auto GetFunctionLevelDCIfCXXClass =
6493 if (
const auto *MD = dyn_cast<CXXMethodDecl>(DC))
6494 return MD->
getParent()->getCanonicalDecl();
6497 if (
const auto *RD = dyn_cast<CXXRecordDecl>(DC))
6498 return RD->getCanonicalDecl();
6505 const CXXRecordDecl *
const CurParentClass = GetFunctionLevelDCIfCXXClass(S);
6506 if (!CurParentClass)
6513 assert(NamingClass &&
"Must have naming class even for implicit access");
6519 return CurParentClass == NamingClass ||
6568 if (
Call->getNumArgs() != 1)
6571 const Expr *E =
Call->getCallee()->IgnoreParenImpCasts();
6574 const DeclRefExpr *DRE = dyn_cast_if_present<DeclRefExpr>(E);
6587 if (BuiltinID != Builtin::BImove && BuiltinID != Builtin::BIforward)
6590 S.
Diag(DRE->
getLocation(), diag::warn_unqualified_call_to_std_cast_function)
6601 if (
Call.isInvalid())
6606 if (
const auto *ULE = dyn_cast<UnresolvedLookupExpr>(Fn);
6607 ULE && ULE->hasExplicitTemplateArgs() && ULE->decls().empty()) {
6608 DiagCompat(Fn->getExprLoc(), diag_compat::adl_only_template_id)
6616 if (
const auto *CE = dyn_cast<CallExpr>(
Call.get()))
6622 if (
auto *DRE = dyn_cast<DeclRefExpr>(Fn->IgnoreParens());
6623 DRE &&
Call.get()->isValueDependent()) {
6633 if (
T->isDependentType())
6636 if (
T == Context.BoundMemberTy ||
T == Context.UnknownAnyTy ||
6637 T == Context.BuiltinFnTy ||
T == Context.OverloadTy ||
6638 T->isFunctionType() ||
T->isFunctionReferenceType() ||
6639 T->isMemberFunctionPointerType() ||
T->isFunctionPointerType() ||
6640 T->isBlockPointerType() ||
T->isRecordType())
6649 Expr *ExecConfig,
bool IsExecConfig,
6650 bool AllowRecovery) {
6661 for (
const Expr *Arg : ArgExprs)
6662 if (CheckInvalidBuiltinCountedByRef(Arg,
6669 if (!ArgExprs.empty()) {
6671 Diag(Fn->getBeginLoc(), diag::err_pseudo_dtor_call_with_args)
6674 ArgExprs.back()->getEndLoc()));
6680 if (Fn->getType() ==
Context.PseudoObjectTy) {
6697 *
this, dyn_cast<UnresolvedMemberExpr>(Fn->IgnoreParens()),
6705 Diag(LParenLoc, diag::err_typecheck_call_not_function)
6706 << Fn->getType() << Fn->getSourceRange());
6714 if (Fn->getType()->isRecordType())
6718 if (Fn->getType() ==
Context.UnknownAnyTy) {
6724 if (Fn->getType() ==
Context.BoundMemberTy) {
6726 RParenLoc, ExecConfig, IsExecConfig,
6732 if (Fn->getType() ==
Context.OverloadTy) {
6743 Scope, Fn, ULE, LParenLoc, ArgExprs, RParenLoc, ExecConfig,
6746 RParenLoc, ExecConfig, IsExecConfig,
6752 if (Fn->getType() ==
Context.UnknownAnyTy) {
6758 Expr *NakedFn = Fn->IgnoreParens();
6760 bool CallingNDeclIndirectly =
false;
6762 if (
UnaryOperator *UnOp = dyn_cast<UnaryOperator>(NakedFn)) {
6763 if (UnOp->getOpcode() == UO_AddrOf) {
6764 CallingNDeclIndirectly =
true;
6769 if (
auto *DRE = dyn_cast<DeclRefExpr>(NakedFn)) {
6770 NDecl = DRE->getDecl();
6783 nullptr, DRE->isNonOdrUse());
6786 }
else if (
auto *ME = dyn_cast<MemberExpr>(NakedFn))
6787 NDecl = ME->getMemberDecl();
6789 if (
FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(NDecl)) {
6791 FD,
true, Fn->getBeginLoc()))
6803 for (
unsigned Idx = 0; Idx < ArgExprs.size() && Idx < FD->param_size();
6806 if (!ArgExprs[Idx] || !Param || !Param->getType()->isPointerType() ||
6807 !ArgExprs[Idx]->getType()->isPointerType())
6811 auto ArgTy = ArgExprs[Idx]->getType();
6812 auto ArgPtTy = ArgTy->getPointeeType();
6813 auto ArgAS = ArgPtTy.getAddressSpace();
6816 bool NeedImplicitASC =
6821 if (!NeedImplicitASC)
6825 if (ArgExprs[Idx]->isGLValue()) {
6832 Qualifiers ArgPtQuals = ArgPtTy.getQualifiers();
6835 Context.getQualifiedType(ArgPtTy.getUnqualifiedType(), ArgPtQuals);
6838 ArgTy.getQualifiers());
6842 CK_AddressSpaceConversion)
6848 if (
Context.isDependenceAllowed() &&
6851 assert((Fn->containsErrors() ||
6852 llvm::any_of(ArgExprs,
6853 [](
clang::Expr *E) { return E->containsErrors(); })) &&
6854 "should only occur in error-recovery path.");
6859 ExecConfig, IsExecConfig);
6864 std::string Name =
Context.BuiltinInfo.getName(Id);
6870 assert(BuiltInDecl &&
"failed to find builtin declaration");
6874 assert(DeclRef.
isUsable() &&
"Builtin reference cannot fail");
6879 assert(!
Call.isInvalid() &&
"Call to builtin cannot fail!");
6899 Diag(BuiltinLoc, diag::err_invalid_astype_of_different_size)
6917 FunctionDecl *FDecl = dyn_cast_or_null<FunctionDecl>(NDecl);
6918 unsigned BuiltinID = (FDecl ? FDecl->
getBuiltinID() : 0);
6921 switch (BuiltinID) {
6922 case Builtin::BI__builtin_longjmp:
6923 case Builtin::BI__builtin_setjmp:
6924 case Builtin::BI__sigsetjmp:
6925 case Builtin::BI_longjmp:
6926 case Builtin::BI_setjmp:
6927 case Builtin::BIlongjmp:
6928 case Builtin::BIsetjmp:
6929 case Builtin::BIsiglongjmp:
6930 case Builtin::BIsigsetjmp:
6943 if (DeferParent->
Contains(*CurScope) &&
6945 Diag(Fn->getExprLoc(), diag::err_defer_invalid_sjlj) << FDecl;
6950 if (FDecl->
hasAttr<AnyX86InterruptAttr>()) {
6951 Diag(Fn->getExprLoc(), diag::err_anyx86_interrupt_called);
6954 if (FDecl->
hasAttr<ARMInterruptAttr>()) {
6955 Diag(Fn->getExprLoc(), diag::err_arm_interrupt_called);
6964 if (Caller->hasAttr<AnyX86InterruptAttr>() ||
6965 Caller->hasAttr<AnyX86NoCallerSavedRegistersAttr>()) {
6967 bool HasNonGPRRegisters =
6969 if (HasNonGPRRegisters &&
6970 (!FDecl || !FDecl->
hasAttr<AnyX86NoCallerSavedRegistersAttr>())) {
6971 Diag(Fn->getExprLoc(), diag::warn_anyx86_excessive_regsave)
6972 << (Caller->hasAttr<AnyX86InterruptAttr>() ? 0 : 1);
6985 Fn->getType()->isSpecificBuiltinType(BuiltinType::BuiltinFn)) {
7005 if (!BuiltinID || !
Context.BuiltinInfo.hasCustomTypechecking(BuiltinID)) {
7012 return ExprError(
Diag(LParenLoc, diag::err_typecheck_call_not_function)
7013 << Fn->getType() << Fn->getSourceRange());
7019 if (Fn->getType() ==
Context.UnknownAnyTy) {
7027 return ExprError(
Diag(LParenLoc, diag::err_typecheck_call_not_function)
7028 << Fn->getType() << Fn->getSourceRange());
7035 const auto *Proto = dyn_cast_or_null<FunctionProtoType>(FuncT);
7036 unsigned NumParams = Proto ? Proto->getNumParams() : 0;
7040 assert(UsesADL == ADLCallKind::NotADL &&
7041 "CUDAKernelCallExpr should not use ADL");
7052 if (BuiltinID &&
Context.BuiltinInfo.hasCustomTypechecking(BuiltinID)) {
7053 ExprResult E = CheckBuiltinFunctionCall(FDecl, BuiltinID, TheCall);
7062 if (FDecl && !FDecl->
hasAttr<CUDAGlobalAttr>())
7063 return ExprError(
Diag(LParenLoc,diag::err_kern_call_not_global_function)
7064 << FDecl << Fn->getSourceRange());
7070 return ExprError(
Diag(LParenLoc, diag::err_kern_type_not_void_return)
7071 << Fn->getType() << Fn->getSourceRange());
7074 if (FDecl && FDecl->
hasAttr<CUDAGlobalAttr>())
7075 return ExprError(
Diag(LParenLoc, diag::err_global_call_not_config)
7076 << FDecl << Fn->getSourceRange());
7090 if (
Context.getTargetInfo().getTriple().isWasm()) {
7091 for (
const Expr *Arg : Args) {
7092 if (Arg && Arg->getType()->isWebAssemblyTableType()) {
7094 diag::err_wasm_table_as_function_parameter));
7112 if (!Proto || !(Proto->isVariadic() && Args.size() >= Def->
param_size()))
7113 Diag(RParenLoc, diag::warn_call_wrong_number_of_arguments)
7114 << (Args.size() > Def->
param_size()) << FDecl << Fn->getSourceRange();
7133 if (!Proto && !Args.empty() &&
7135 !
Diags.isIgnored(diag::warn_strict_uses_without_prototype,
7137 Diag(LParenLoc, diag::warn_strict_uses_without_prototype)
7138 << (FDecl !=
nullptr) << FDecl;
7141 for (
unsigned i = 0, e = Args.size(); i != e; i++) {
7142 Expr *Arg = Args[i];
7144 if (Proto && i < Proto->getNumParams()) {
7146 Context, Proto->getParamType(i), Proto->isParamConsumed(i));
7164 diag::err_call_incomplete_argument, Arg))
7173 if (
Method->isImplicitObjectMemberFunction())
7174 return ExprError(
Diag(LParenLoc, diag::err_member_call_without_object)
7175 << Fn->getSourceRange() << 0);
7183 for (
unsigned i = 0, e = Args.size(); i != e; i++) {
7184 if (
const auto *RT =
7185 dyn_cast<RecordType>(Args[i]->
getType().getCanonicalType())) {
7186 if (RT->getDecl()->isOrContainsUnion())
7187 Diag(Args[i]->getBeginLoc(), diag::warn_cmse_nonsecure_union)
7198 checkFortifiedBuiltinMemoryFunction(FDecl, TheCall);
7201 return CheckBuiltinFunctionCall(FDecl, BuiltinID, TheCall);
7203 if (CheckPointerCall(NDecl, TheCall, Proto))
7206 if (CheckOtherCall(TheCall, Proto))
7216 assert(Ty &&
"ActOnCompoundLiteral(): missing type");
7217 assert(InitExpr &&
"ActOnCompoundLiteral(): missing expression");
7222 TInfo =
Context.getTrivialTypeSourceInfo(literalType);
7234 LParenLoc,
Context.getBaseElementType(literalType),
7235 diag::err_array_incomplete_or_sizeless_type,
7258 ? diag::err_variable_object_no_init
7259 : diag::err_compound_literal_with_vla_type;
7266 diag::err_typecheck_decl_incomplete_type,
7281 LiteralExpr =
Result.get();
7288 bool IsFileScope = !
CurContext->isFunctionOrMethod() &&
7319 if (
auto ILE = dyn_cast<InitListExpr>(LiteralExpr))
7320 for (
unsigned i = 0, j = ILE->getNumInits(); i != j; i++) {
7322 if (!
Init->isTypeDependent() && !
Init->isValueDependent() &&
7324 Diag(
Init->getExprLoc(), diag::err_init_element_not_constant)
7325 <<
Init->getSourceBitField();
7333 LiteralExpr, IsFileScope);
7345 Diag(LParenLoc, diag::err_compound_literal_with_address_space)
7363 Cleanup.setExprNeedsCleanups(
true);
7382 bool DiagnosedArrayDesignator =
false;
7383 bool DiagnosedNestedDesignator =
false;
7384 bool DiagnosedMixedDesignator =
false;
7388 for (
unsigned I = 0, E = InitArgList.size(); I != E; ++I) {
7389 if (
auto *DIE = dyn_cast<DesignatedInitExpr>(InitArgList[I])) {
7391 FirstDesignator = DIE->getBeginLoc();
7396 if (!DiagnosedNestedDesignator && DIE->size() > 1) {
7397 DiagnosedNestedDesignator =
true;
7398 Diag(DIE->getBeginLoc(), diag::ext_designated_init_nested)
7399 << DIE->getDesignatorsSourceRange();
7402 for (
auto &Desig : DIE->designators()) {
7403 if (!Desig.isFieldDesignator() && !DiagnosedArrayDesignator) {
7404 DiagnosedArrayDesignator =
true;
7405 Diag(Desig.getBeginLoc(), diag::ext_designated_init_array)
7406 << Desig.getSourceRange();
7410 if (!DiagnosedMixedDesignator &&
7412 DiagnosedMixedDesignator =
true;
7413 Diag(DIE->getBeginLoc(), diag::ext_designated_init_mixed)
7414 << DIE->getSourceRange();
7415 Diag(InitArgList[0]->getBeginLoc(), diag::note_designated_init_mixed)
7416 << InitArgList[0]->getSourceRange();
7420 DiagnosedMixedDesignator =
true;
7422 Diag(DIE->getBeginLoc(), diag::ext_designated_init_mixed)
7423 << DIE->getSourceRange();
7424 Diag(InitArgList[I]->getBeginLoc(), diag::note_designated_init_mixed)
7425 << InitArgList[I]->getSourceRange();
7429 if (FirstDesignator.
isValid()) {
7433 !DiagnosedNestedDesignator && !DiagnosedMixedDesignator) {
7435 ? diag::warn_cxx17_compat_designated_init
7436 : diag::ext_cxx_designated_init);
7438 Diag(FirstDesignator, diag::ext_designated_init);
7453 for (
unsigned I = 0, E = InitArgList.size(); I != E; ++I) {
7454 if (InitArgList[I]->
getType()->isNonOverloadPlaceholderType()) {
7461 InitArgList[I] = result.
get();
7481 Cleanup.setExprNeedsCleanups(
true);
7490 if (
Context.hasSameUnqualifiedType(SrcTy, DestTy))
7495 llvm_unreachable(
"member pointer type in C");
7504 if (SrcAS != DestAS)
7505 return CK_AddressSpaceConversion;
7506 if (
Context.hasCvrSimilarType(SrcTy, DestTy))
7512 ? CK_BitCast : CK_AnyPointerToBlockPointerCast);
7517 return CK_CPointerToObjCPointerCast;
7519 return CK_BlockPointerToObjCPointerCast;
7521 return CK_PointerToBoolean;
7523 return CK_PointerToIntegral;
7529 llvm_unreachable(
"illegal cast from pointer");
7531 llvm_unreachable(
"Should have returned before this");
7536 return CK_FixedPointCast;
7538 return CK_FixedPointToBoolean;
7540 return CK_FixedPointToIntegral;
7542 return CK_FixedPointToFloating;
7546 diag::err_unimplemented_conversion_with_fixed_point_type)
7548 return CK_IntegralCast;
7553 llvm_unreachable(
"illegal cast to pointer type");
7555 llvm_unreachable(
"Should have returned before this");
7565 return CK_NullToPointer;
7566 return CK_IntegralToPointer;
7568 return CK_IntegralToBoolean;
7570 return CK_IntegralCast;
7572 return CK_IntegralToFloating;
7577 return CK_IntegralRealToComplex;
7581 CK_IntegralToFloating);
7582 return CK_FloatingRealToComplex;
7584 llvm_unreachable(
"member pointer type in C");
7586 return CK_IntegralToFixedPoint;
7588 llvm_unreachable(
"Should have returned before this");
7593 return CK_FloatingCast;
7595 return CK_FloatingToBoolean;
7597 return CK_FloatingToIntegral;
7602 return CK_FloatingRealToComplex;
7606 CK_FloatingToIntegral);
7607 return CK_IntegralRealToComplex;
7611 llvm_unreachable(
"valid float->pointer cast?");
7613 llvm_unreachable(
"member pointer type in C");
7615 return CK_FloatingToFixedPoint;
7617 llvm_unreachable(
"Should have returned before this");
7622 return CK_FloatingComplexCast;
7624 return CK_FloatingComplexToIntegralComplex;
7627 if (
Context.hasSameType(ET, DestTy))
7628 return CK_FloatingComplexToReal;
7630 return CK_FloatingCast;
7633 return CK_FloatingComplexToBoolean;
7637 CK_FloatingComplexToReal);
7638 return CK_FloatingToIntegral;
7642 llvm_unreachable(
"valid complex float->pointer cast?");
7644 llvm_unreachable(
"member pointer type in C");
7647 diag::err_unimplemented_conversion_with_fixed_point_type)
7649 return CK_IntegralCast;
7651 llvm_unreachable(
"Should have returned before this");
7656 return CK_IntegralComplexToFloatingComplex;
7658 return CK_IntegralComplexCast;
7661 if (
Context.hasSameType(ET, DestTy))
7662 return CK_IntegralComplexToReal;
7664 return CK_IntegralCast;
7667 return CK_IntegralComplexToBoolean;
7671 CK_IntegralComplexToReal);
7672 return CK_IntegralToFloating;
7676 llvm_unreachable(
"valid complex int->pointer cast?");
7678 llvm_unreachable(
"member pointer type in C");
7681 diag::err_unimplemented_conversion_with_fixed_point_type)
7683 return CK_IntegralCast;
7685 llvm_unreachable(
"Should have returned before this");
7688 llvm_unreachable(
"Unhandled scalar cast");
7695 len = vecType->getNumElements();
7696 eltType = vecType->getElementType();
7703 if (!
type->isRealType())
return false;
7713 auto ValidScalableConversion = [](
QualType FirstType,
QualType SecondType) {
7717 const auto *VecTy = SecondType->getAs<
VectorType>();
7721 return ValidScalableConversion(srcTy, destTy) ||
7722 ValidScalableConversion(destTy, srcTy);
7732 return matSrcType->
getNumRows() == matDestType->getNumRows() &&
7733 matSrcType->
getNumColumns() == matDestType->getNumColumns();
7739 uint64_t SrcLen, DestLen;
7749 uint64_t SrcEltSize =
Context.getTypeSize(SrcEltTy);
7750 uint64_t DestEltSize =
Context.getTypeSize(DestEltTy);
7752 return (SrcLen * SrcEltSize == DestLen * DestEltSize);
7757 "expected at least one type to be a vector here");
7759 bool IsSrcTyAltivec =
7775 return (IsSrcTyAltivec || IsDestTyAltivec);
7795 switch (
Context.getLangOpts().getLaxVectorConversions()) {
7802 if (!Vec || !Vec->getElementType()->isIntegralOrEnumerationType())
7807 if (!Vec || !Vec->getElementType()->isIntegralOrEnumerationType())
7824 return Diag(R.
getBegin(), diag::err_invalid_conversion_between_matrixes)
7825 << DestTy << SrcTy << R;
7829 diag::err_invalid_conversion_between_matrix_and_type)
7830 << SrcTy << DestTy << R;
7833 diag::err_invalid_conversion_between_matrix_and_type)
7834 << DestTy << SrcTy << R;
7837 Kind = CK_MatrixCast;
7843 assert(VectorTy->
isVectorType() &&
"Not a vector type!");
7849 diag::err_invalid_conversion_between_vectors :
7850 diag::err_invalid_conversion_between_vector_and_integer)
7851 << VectorTy << Ty << R;
7854 diag::err_invalid_conversion_between_vector_and_scalar)
7855 << VectorTy << Ty << R;
7864 if (DestElemTy == SplattedExpr->
getType())
7865 return SplattedExpr;
7878 CK_BooleanToSignedIntegral);
7879 SplattedExpr = CastExprRes.
get();
7880 CK = CK_IntegralToFloating;
7882 CK = CK_BooleanToSignedIntegral;
7889 SplattedExpr = CastExprRes.
get();
7897 if (DestElemTy == SplattedExpr->
getType())
7898 return SplattedExpr;
7907 SplattedExpr = CastExprRes.
get();
7925 !
Context.hasSameUnqualifiedType(DestTy, SrcTy) &&
7926 !
Context.areCompatibleVectorTypes(DestTy, SrcTy))) {
7927 Diag(R.
getBegin(),diag::err_invalid_conversion_between_ext_vectors)
7928 << DestTy << SrcTy << R;
7940 diag::err_invalid_conversion_between_vector_and_scalar)
7941 << DestTy << SrcTy << R;
7943 Kind = CK_VectorSplat;
7953 DestType == SourceType)
7961 if (!CE->getCalleeAllocSizeAttr())
7963 std::optional<llvm::APInt> AllocSize =
7964 CE->evaluateBytesReturnedByAllocSizeCall(S.
Context);
7967 if (!AllocSize || AllocSize->isZero())
7977 if (LhsSize && Size < LhsSize)
7979 << Size.getQuantity() << TargetType << LhsSize->getQuantity();
7987 "ActOnCastExpr(): missing type or expr");
8003 bool isVectorLiteral =
false;
8018 isVectorLiteral =
true;
8021 isVectorLiteral =
true;
8026 if (isVectorLiteral)
8056 "Expected paren or paren list expression");
8063 LiteralLParenLoc = PE->getLParenLoc();
8064 LiteralRParenLoc = PE->getRParenLoc();
8065 exprs = PE->getExprs();
8066 numExprs = PE->getNumExprs();
8093 if (numExprs == 1) {
8096 if (Literal.isInvalid())
8102 else if (numExprs < numElems) {
8104 diag::err_incorrect_number_of_vector_initializers);
8108 initExprs.append(exprs, exprs + numExprs);
8117 if (Literal.isInvalid())
8124 initExprs.append(exprs, exprs + numExprs);
8129 initExprs, LiteralRParenLoc);
8158 unsigned NumUserSpecifiedExprs,
8163 InitLoc, LParenLoc, RParenLoc);
8168 const Expr *NullExpr = LHSExpr;
8169 const Expr *NonPointerExpr = RHSExpr;
8176 NonPointerExpr = LHSExpr;
8198 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands_null)
8199 << NonPointerExpr->
getType() << DiagType
8211 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_nonfloat)
8212 << CondTy <<
Cond->getSourceRange();
8219 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_scalar)
8220 << CondTy <<
Cond->getSourceRange();
8253 bool IsBlockPointer =
false;
8257 IsBlockPointer =
true;
8282 ResultAddrSpace = LAddrSpace;
8284 ResultAddrSpace = RAddrSpace;
8286 S.
Diag(Loc, diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
8293 auto LHSCastKind = CK_BitCast, RHSCastKind = CK_BitCast;
8298 S.
Diag(Loc, diag::err_typecheck_cond_incompatible_ptrauth)
8315 LAddrSpace == ResultAddrSpace ? CK_BitCast : CK_AddressSpaceConversion;
8317 RAddrSpace == ResultAddrSpace ? CK_BitCast : CK_AddressSpaceConversion;
8325 lhptee, rhptee,
false,
false,
8328 if (CompositeTy.
isNull()) {
8345 S.
Diag(Loc, diag::ext_typecheck_cond_incompatible_pointers)
8356 QualType ResultTy = [&, ResultAddrSpace]() {
8391 S.
Diag(Loc, diag::err_typecheck_cond_incompatible_operands)
8444 bool IsIntFirstExpr) {
8446 !Int.get()->getType()->isIntegerType())
8449 Expr *Expr1 = IsIntFirstExpr ? Int.get() : PointerExpr;
8450 Expr *Expr2 = IsIntFirstExpr ? PointerExpr : Int.get();
8452 S.
Diag(Loc, diag::ext_typecheck_cond_pointer_integer_mismatch)
8456 CK_IntegralToPointer);
8490 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_int_float)
8496 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_int_float)
8502 if (LHSType == RHSType)
8512 (S, LHS, RHS, LHSType, RHSType,
false);
8546 llvm::raw_svector_ostream OS(Str);
8547 OS <<
"(vector of " << NumElements <<
" '" << EleTyName <<
"' values)";
8548 S.
Diag(QuestionLoc, diag::err_conditional_vector_element_size)
8549 << CondTy << OS.str();
8570 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_nonfloat)
8571 <<
Cond->getType() <<
Cond->getSourceRange();
8588 S.
Diag(QuestionLoc, diag::err_conditional_vector_size)
8589 << CondTy << VecResTy;
8594 QualType RVE = RV->getElementType();
8599 S.
Diag(QuestionLoc, diag::err_conditional_vector_element_size)
8600 << CondTy << VecResTy;
8615 if (
Cond.isInvalid())
8626 bool IsBoolVecLang =
8655 if (
const CallExpr *CE = dyn_cast<CallExpr>(E)) {
8656 QualType Ty = CE->getCallee()->getType();
8688 if (
Context.isDependenceAllowed() &&
8694 "should only occur in error-recovery path.");
8701 Cond.get()->getType()->isExtVectorType())
8706 if (
Cond.isInvalid())
8729 Diag(QuestionLoc, diag::err_wasm_table_conditional_expression)
8738 diag::err_typecheck_cond_incompatible_operands) << LHSTy << RHSTy
8757 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands)
8773 Context.hasSameUnqualifiedType(LHSTy, RHSTy))
8782 ResTy =
Context.getCommonSugaredType(LHSTy, RHSTy);
8813 if (!compositeType.
isNull())
8814 return compositeType;
8844 if (
Context.hasSameType(LHSTy, RHSTy))
8845 return Context.getCommonSugaredType(LHSTy, RHSTy);
8848 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands)
8867 Self.Diag(Loc,
Note) << ParenRange;
8887 const Expr **RHSExprs) {
8892 if (
const auto *MTE = dyn_cast<MaterializeTemporaryExpr>(E)) {
8893 E = MTE->getSubExpr();
8898 if (
const auto *OP = dyn_cast<BinaryOperator>(E);
8900 *Opcode = OP->getOpcode();
8901 *RHSExprs = OP->getRHS();
8906 if (
const auto *
Call = dyn_cast<CXXOperatorCallExpr>(E)) {
8907 if (
Call->getNumArgs() != 2)
8913 if (OO < OO_Plus || OO > OO_Arrow ||
8914 OO == OO_PlusPlus || OO == OO_MinusMinus)
8920 *RHSExprs =
Call->getArg(1);
8936 if (
const auto *OP = dyn_cast<BinaryOperator>(E))
8937 return OP->isComparisonOp() || OP->isLogicalOp();
8938 if (
const auto *OP = dyn_cast<UnaryOperator>(E))
8939 return OP->getOpcode() == UO_LNot;
8954 const Expr *RHSExpr) {
8956 const Expr *CondRHS;
8967 ? diag::warn_precedence_bitwise_conditional
8968 : diag::warn_precedence_conditional;
8970 Self.Diag(OpLoc, DiagID)
8976 Self.PDiag(diag::note_precedence_silence)
8981 Self.PDiag(diag::note_precedence_conditional_first),
8992 auto GetNullability = [](
QualType Ty) {
8993 std::optional<NullabilityKind> Kind = Ty->getNullability();
9003 auto LHSKind = GetNullability(LHSTy), RHSKind = GetNullability(RHSTy);
9011 MergedKind = RHSKind;
9018 MergedKind = RHSKind;
9020 MergedKind = LHSKind;
9026 if (GetNullability(ResTy) == MergedKind)
9044 Expr *commonExpr =
nullptr;
9046 commonExpr = CondExpr;
9053 commonExpr = result.
get();
9067 commonExpr = commonRes.
get();
9077 commonExpr = MatExpr.
get();
9085 LHSExpr = CondExpr = opaqueValue;
9093 VK, OK, QuestionLoc);
9094 if (result.
isNull() ||
Cond.isInvalid() || LHS.isInvalid() ||
9101 CheckBoolLikeConversion(
Cond.get(), QuestionLoc);
9109 RHS.get(), result,
VK, OK);
9112 commonExpr, opaqueValue,
Cond.get(), LHS.get(), RHS.get(), QuestionLoc,
9113 ColonLoc, result,
VK, OK);
9117 unsigned FromAttributes = 0, ToAttributes = 0;
9118 if (
const auto *FromFn =
9119 dyn_cast<FunctionProtoType>(
Context.getCanonicalType(FromType)))
9122 if (
const auto *ToFn =
9123 dyn_cast<FunctionProtoType>(
Context.getCanonicalType(ToType)))
9127 return FromAttributes != ToAttributes;
9139 assert(LHSType.
isCanonical() &&
"LHS not canonicalized!");
9140 assert(RHSType.
isCanonical() &&
"RHS not canonicalized!");
9143 const Type *lhptee, *rhptee;
9145 std::tie(lhptee, lhq) =
9147 std::tie(rhptee, rhq) =
9218 diag::warn_typecheck_convert_incompatible_function_pointer_strict,
9241 if (ltrans == rtrans) {
9257 std::tie(lhptee, lhq) =
9259 std::tie(rhptee, rhq) =
9271 return AssignConvertType::
9272 IncompatibleNestedPointerAddressSpaceMismatch;
9276 if (lhptee == rhptee)
9296 const auto *LFPT = dyn_cast<FunctionProtoType>(LFT);
9297 const auto *RFPT = dyn_cast<FunctionProtoType>(RFT);
9300 LFPT->getParamTypes(),
9301 RFPT->getExtProtoInfo());
9306 LFPT->getParamTypes(), EPI);
9311 EPI.
ExtInfo = LFT->getExtInfo();
9313 RFPT->getParamTypes(), EPI);
9332 assert(LHSType.
isCanonical() &&
"LHS not canonicalized!");
9333 assert(RHSType.
isCanonical() &&
"RHS not canonicalized!");
9354 if (LQuals != RQuals)
9383 assert(LHSType.
isCanonical() &&
"LHS was not canonicalized!");
9384 assert(RHSType.
isCanonical() &&
"RHS was not canonicalized!");
9432 return VT->getElementType().getCanonicalType() == ElementType;
9462 LHSType =
Context.getCanonicalType(LHSType).getUnqualifiedType();
9463 RHSType =
Context.getCanonicalType(RHSType).getUnqualifiedType();
9466 if (LHSType == RHSType) {
9473 if (
const auto *AT = dyn_cast<AutoType>(LHSType)) {
9474 if (AT->isGNUAutoType()) {
9482 if (
const AtomicType *AtomicTy = dyn_cast<AtomicType>(LHSType)) {
9487 if (Kind != CK_NoOp && ConvertRHS)
9489 Kind = CK_NonAtomicToAtomic;
9501 if (
Context.typesAreCompatible(LHSTypeRef->getPointeeType(), RHSType)) {
9502 Kind = CK_LValueBitCast;
9513 if (LHSExtType->getNumElements() != RHSExtType->getNumElements())
9517 RHSExtType->getElementType()->isIntegerType()) {
9518 Kind = CK_IntegralToBoolean;
9522 if (
Context.getLangOpts().OpenCL &&
9523 Context.areCompatibleVectorTypes(LHSType, RHSType)) {
9533 Kind = CK_VectorSplat;
9543 if (
Context.areCompatibleVectorTypes(LHSType, RHSType)) {
9555 if (
Context.getTargetInfo().getTriple().isPPC() &&
9557 !
Context.areCompatibleVectorTypes(RHSType, LHSType))
9559 << RHSType << LHSType;
9573 if (
Context.getTargetInfo().getTriple().isPPC() &&
9578 << RHSType << LHSType;
9589 if (
ARM().areCompatibleSveTypes(LHSType, RHSType) ||
9590 ARM().areLaxCompatibleSveTypes(LHSType, RHSType)) {
9598 if (
Context.areCompatibleRVVTypes(LHSType, RHSType) ||
9599 Context.areLaxCompatibleRVVTypes(LHSType, RHSType)) {
9628 if (
const PointerType *LHSPointer = dyn_cast<PointerType>(LHSType)) {
9631 LangAS AddrSpaceL = LHSPointer->getPointeeType().getAddressSpace();
9633 if (AddrSpaceL != AddrSpaceR)
9634 Kind = CK_AddressSpaceConversion;
9635 else if (
Context.hasCvrSimilarType(RHSType, LHSType))
9645 Kind = CK_IntegralToPointer;
9653 if (LHSPointer->getPointeeType()->isVoidType()) {
9661 Context.getObjCClassRedefinitionType())) {
9672 if (LHSPointer->getPointeeType()->isVoidType()) {
9673 LangAS AddrSpaceL = LHSPointer->getPointeeType().getAddressSpace();
9678 AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion : CK_BitCast;
9696 Kind = AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion : CK_BitCast;
9702 Kind = CK_IntegralToPointer;
9708 Kind = CK_AnyPointerToBlockPointerCast;
9714 if (RHSPT->getPointeeType()->isVoidType()) {
9715 Kind = CK_AnyPointerToBlockPointerCast;
9729 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
9731 !
ObjC().CheckObjCARCUnavailableWeakConversion(OrigLHSType, RHSType))
9738 Kind = CK_IntegralToPointer;
9745 Kind = CK_CPointerToObjCPointerCast;
9755 Context.getObjCClassRedefinitionType())) {
9767 Kind = CK_BlockPointerToObjCPointerCast;
9779 Kind = CK_NullToPointer;
9786 if (LHSType ==
Context.BoolTy) {
9787 Kind = CK_PointerToBoolean;
9793 Kind = CK_PointerToIntegral;
9803 if (LHSType ==
Context.BoolTy) {
9804 Kind = CK_PointerToBoolean;
9810 Kind = CK_PointerToIntegral;
9819 if (
Context.typesAreCompatible(LHSType, RHSType)) {
9826 Kind = CK_IntToOCLSampler;
9860 const RecordType *UT =
ArgType->getAsUnionType();
9864 RecordDecl *UD = UT->getDecl()->getDefinitionOrSelf();
9865 if (!UD->
hasAttr<TransparentUnionAttr>())
9871 for (
auto *it : UD->
fields()) {
9872 if (it->getType()->isPointerType()) {
9911 bool DiagnoseCFAudited,
9915 assert((ConvertRHS || !
Diagnose) &&
"can't indicate whether we diagnosed");
9921 ExprResult &RHS = ConvertRHS ? CallerRHS : LocalRHS;
9925 if (RHSPtrType->getPointeeType()->hasAttr(attr::NoDeref) &&
9926 !LHSPtrType->getPointeeType()->hasAttr(attr::NoDeref)) {
9928 diag::warn_noderef_to_dereferenceable_pointer)
9947 AllowedExplicit::None,
9959 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
9960 !
ObjC().CheckObjCARCUnavailableWeakConversion(LHSType, RHSType))
9974 RHS.
get(), LHSType,
false, DAP))
10097 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
10107 ObjC().CheckConversionToObjCLiteral(LHSType, E,
Diagnose))) {
10127struct OriginalOperand {
10128 explicit OriginalOperand(
Expr *Op) : Orig(Op), Conversion(
nullptr) {
10129 if (
auto *MTE = dyn_cast<MaterializeTemporaryExpr>(Op))
10130 Op = MTE->getSubExpr();
10131 if (
auto *BTE = dyn_cast<CXXBindTemporaryExpr>(Op))
10132 Op = BTE->getSubExpr();
10133 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(Op)) {
10134 Orig = ICE->getSubExprAsWritten();
10135 Conversion = ICE->getConversionFunction();
10139 QualType
getType()
const {
return Orig->getType(); }
10142 NamedDecl *Conversion;
10148 OriginalOperand OrigLHS(LHS.
get()), OrigRHS(RHS.
get());
10150 Diag(Loc, diag::err_typecheck_invalid_operands)
10151 << OrigLHS.getType() << OrigRHS.getType()
10156 if (OrigLHS.Conversion) {
10157 Diag(OrigLHS.Conversion->getLocation(),
10158 diag::note_typecheck_invalid_operands_converted)
10161 if (OrigRHS.Conversion) {
10163 diag::note_typecheck_invalid_operands_converted)
10178 if (!(LHSNatVec && RHSNatVec)) {
10180 Expr *NonVector = !LHSNatVec ? LHS.
get() : RHS.
get();
10181 Diag(Loc, diag::err_typecheck_logical_vector_expr_gnu_cpp_restrict)
10183 <<
Vector->getSourceRange();
10187 Diag(Loc, diag::err_typecheck_logical_vector_expr_gnu_cpp_restrict)
10210 unsigned &DiagID) {
10216 scalarCast = CK_IntegralToBoolean;
10221 DiagID = diag::err_opencl_scalar_type_rank_greater_than_vector_type;
10226 scalarCast = CK_IntegralCast;
10231 DiagID = diag::err_opencl_scalar_type_rank_greater_than_vector_type;
10234 scalarCast = CK_FloatingCast;
10237 scalarCast = CK_IntegralToFloating;
10246 if (scalarCast != CK_NoOp)
10257 assert(VecTy &&
"Expression E must be a vector");
10262 VecTy->getVectorKind());
10266 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(E))
10267 if (ICE->getSubExpr()->getType() == NewVecTy)
10268 return ICE->getSubExpr();
10270 auto Cast = ElementType->
isIntegerType() ? CK_IntegralCast : CK_FloatingCast;
10278 Expr *E = Int->get();
10282 QualType IntTy = Int->get()->getType().getUnqualifiedType();
10288 bool CstInt = Int->get()->EvaluateAsInt(EVResult, S.
Context);
10296 llvm::APSInt Result = EVResult.
Val.
getInt();
10297 unsigned NumBits = IntSigned
10298 ? (Result.isNegative() ? Result.getSignificantBits()
10299 : Result.getActiveBits())
10300 : Result.getActiveBits();
10307 return (IntSigned != OtherIntSigned &&
10313 return (Order < 0);
10320 if (Int->get()->containsErrors())
10323 QualType IntTy = Int->get()->getType().getUnqualifiedType();
10328 bool CstInt = Int->get()->EvaluateAsInt(EVResult, S.
Context);
10337 llvm::APSInt Result = EVResult.
Val.
getInt();
10340 llvm::APFloat::rmTowardZero);
10343 bool Ignored =
false;
10344 Float.convertToInteger(ConvertBack, llvm::APFloat::rmNearestTiesToEven,
10346 if (Result != ConvertBack)
10352 unsigned FloatPrec = llvm::APFloat::semanticsPrecision(
10354 if (Bits > FloatPrec)
10367 QualType ScalarTy = Scalar->get()->getType().getUnqualifiedType();
10368 QualType VectorTy =
Vector->get()->getType().getUnqualifiedType();
10373 "ExtVectorTypes should not be handled here!");
10374 VectorEltTy = VT->getElementType();
10379 llvm_unreachable(
"Only Fixed-Length and SVE Vector types are handled here");
10405 ScalarCast = CK_IntegralCast;
10409 ScalarCast = CK_FloatingToIntegral;
10417 llvm::APFloat
Result(0.0);
10423 bool CstScalar = Scalar->get()->isValueDependent() ||
10424 Scalar->get()->EvaluateAsFloat(Result, S.
Context);
10426 if (!CstScalar && Order < 0)
10432 bool Truncated =
false;
10434 llvm::APFloat::rmNearestTiesToEven, &Truncated);
10439 ScalarCast = CK_FloatingCast;
10444 ScalarCast = CK_IntegralToFloating;
10451 if (ScalarCast != CK_NoOp)
10459 bool AllowBothBool,
10460 bool AllowBoolConversions,
10461 bool AllowBoolOperation,
10462 bool ReportInvalid) {
10463 if (!IsCompAssign) {
10479 assert(LHSVecType || RHSVecType);
10487 (RHSVecType && RHSVecType->getElementType()->isMFloat8Type()))
10492 if (!AllowBothBool && LHSVecType &&
10498 if (!AllowBoolOperation &&
10503 if (
Context.hasSameType(LHSType, RHSType))
10504 return Context.getCommonSugaredType(LHSType, RHSType);
10507 if (LHSVecType && RHSVecType &&
10508 Context.areCompatibleVectorTypes(LHSType, RHSType)) {
10522 if (AllowBoolConversions && LHSVecType && RHSVecType &&
10525 Context.getTypeSize(RHSVecType->getElementType()))) {
10532 if (!IsCompAssign &&
10535 RHSVecType->getElementType()->isIntegerType()) {
10544 unsigned &SVEorRVV) {
10565 if (IsSveRVVConversion(LHSType, RHSType, SVEorRVV) ||
10566 IsSveRVVConversion(RHSType, LHSType, SVEorRVV)) {
10567 Diag(Loc, diag::err_typecheck_sve_rvv_ambiguous)
10568 << SVEorRVV << LHSType << RHSType;
10575 unsigned &SVEorRVV) {
10580 if (FirstVecType && SecondVecType) {
10583 SecondVecType->getVectorKind() ==
10588 SecondVecType->getVectorKind() ==
10590 SecondVecType->getVectorKind() ==
10592 SecondVecType->getVectorKind() ==
10601 if (SecondVecType &&
10614 if (IsSveRVVGnuConversion(LHSType, RHSType, SVEorRVV) ||
10615 IsSveRVVGnuConversion(RHSType, LHSType, SVEorRVV)) {
10616 Diag(Loc, diag::err_typecheck_sve_rvv_gnu_ambiguous)
10617 << SVEorRVV << LHSType << RHSType;
10623 unsigned DiagID = diag::err_typecheck_vector_not_convertable;
10638 LHSType, RHSVecType->getElementType(),
10651 QualType VecType = LHSVecType ? LHSType : RHSType;
10652 const VectorType *VT = LHSVecType ? LHSVecType : RHSVecType;
10653 QualType OtherType = LHSVecType ? RHSType : LHSType;
10654 ExprResult *OtherExpr = LHSVecType ? &RHS : &LHS;
10656 if (
Context.getTargetInfo().getTriple().isPPC() &&
10658 !
Context.areCompatibleVectorTypes(RHSType, LHSType))
10659 Diag(Loc, diag::warn_deprecated_lax_vec_conv_all) << RHSType << LHSType;
10663 if (!IsCompAssign) {
10682 if ((!RHSVecType && !RHSType->
isRealType()) ||
10684 Diag(Loc, diag::err_typecheck_vector_not_convertable_non_scalar)
10685 << LHSType << RHSType
10697 Diag(Loc, diag::err_opencl_implicit_vector_conversion) << LHSType
10708 QualType Scalar = LHSVecType ? RHSType : LHSType;
10710 unsigned ScalarOrVector = LHSVecType && RHSVecType ? 1 : 0;
10712 diag::err_typecheck_vector_not_convertable_implict_truncation)
10713 << ScalarOrVector << Scalar <<
Vector;
10720 << LHSType << RHSType
10729 if (!IsCompAssign) {
10744 unsigned DiagID = diag::err_typecheck_invalid_operands;
10746 ((LHSBuiltinTy && LHSBuiltinTy->
isSVEBool()) ||
10747 (RHSBuiltinTy && RHSBuiltinTy->isSVEBool()))) {
10753 if (
Context.hasSameType(LHSType, RHSType))
10768 Diag(Loc, diag::err_typecheck_vector_not_convertable_non_scalar)
10775 Context.getBuiltinVectorTypeInfo(LHSBuiltinTy).EC !=
10776 Context.getBuiltinVectorTypeInfo(RHSBuiltinTy).EC) {
10777 Diag(Loc, diag::err_typecheck_vector_lengths_not_equal)
10786 bool ScalarOrVector =
10789 Diag(Loc, diag::err_typecheck_vector_not_convertable_implict_truncation)
10790 << ScalarOrVector << Scalar <<
Vector;
10822 S.
Diag(Loc, diag::warn_null_in_arithmetic_operation)
10834 S.
Diag(Loc, diag::warn_null_in_comparison_operation)
10835 << LHSNull << NonNullType
10847 QualType ElementType = CT->getElementType().getCanonicalType();
10848 bool IsComplexRangePromoted = S.
getLangOpts().getComplexRange() ==
10855 const llvm::fltSemantics &ElementTypeSemantics =
10857 const llvm::fltSemantics &HigherElementTypeSemantics =
10860 if ((llvm::APFloat::semanticsMaxExponent(ElementTypeSemantics) * 2 + 1 >
10861 llvm::APFloat::semanticsMaxExponent(HigherElementTypeSemantics)) ||
10868 if (
Type == HigherElementType) {
10880 const auto *LUE = dyn_cast<UnaryExprOrTypeTraitExpr>(LHS);
10881 const auto *RUE = dyn_cast<UnaryExprOrTypeTraitExpr>(RHS);
10884 if (LUE->getKind() != UETT_SizeOf || LUE->isArgumentType() ||
10885 RUE->getKind() != UETT_SizeOf)
10892 if (RUE->isArgumentType())
10893 RHSTy = RUE->getArgumentType().getNonReferenceType();
10895 RHSTy = RUE->getArgumentExpr()->IgnoreParens()->getType();
10902 if (
const auto *DRE = dyn_cast<DeclRefExpr>(LHSArg)) {
10903 if (
const ValueDecl *LHSArgDecl = DRE->getDecl())
10904 S.
Diag(LHSArgDecl->getLocation(), diag::note_pointer_declared_here)
10908 QualType ArrayElemTy = ArrayTy->getElementType();
10914 S.
Diag(Loc, diag::warn_division_sizeof_array)
10916 if (
const auto *DRE = dyn_cast<DeclRefExpr>(LHSArg)) {
10917 if (
const ValueDecl *LHSArgDecl = DRE->getDecl())
10918 S.
Diag(LHSArgDecl->getLocation(), diag::note_array_declared_here)
10922 S.
Diag(Loc, diag::note_precedence_silence) << RHS;
10935 S.
PDiag(diag::warn_remainder_division_by_zero)
10944 const Expr *LHSExpr = LHS.
get();
10945 const Expr *RHSExpr = RHS.
get();
10950 if (!LHSIsScoped && !RHSIsScoped)
10962 ->getDefinitionOrSelf()
10963 ->getIntegerType();
10964 std::string InsertionString =
"static_cast<" + IntType.getAsString() +
">(";
10965 S.
Diag(BeginLoc, diag::note_no_implicit_conversion_for_scoped_enum)
10970 DiagnosticHelper(LHSExpr, LHSType);
10973 DiagnosticHelper(RHSExpr, RHSType);
10980 bool IsCompAssign = Opc == BO_MulAssign || Opc == BO_DivAssign;
10981 bool IsDiv = Opc == BO_Div || Opc == BO_DivAssign;
11075 if (compType.
isNull() ||
11080 IsCompAssign ? BO_RemAssign : BO_Rem);
11091 ? diag::err_typecheck_pointer_arith_void_type
11092 : diag::ext_gnu_void_ptr)
11101 ? diag::err_typecheck_pointer_arith_void_type
11102 : diag::ext_gnu_void_ptr)
11103 << 0 <<
Pointer->getSourceRange();
11114 S.
Diag(Loc, diag::warn_gnu_null_ptr_arith)
11115 <<
Pointer->getSourceRange();
11117 S.
Diag(Loc, diag::warn_pointer_arith_null_ptr)
11134 S.
PDiag(diag::warn_pointer_sub_null_ptr)
11136 <<
Pointer->getSourceRange());
11145 ? diag::err_typecheck_pointer_arith_function_type
11146 : diag::ext_gnu_ptr_func_arith)
11158 assert(
Pointer->getType()->isAnyPointerType());
11160 ? diag::err_typecheck_pointer_arith_function_type
11161 : diag::ext_gnu_ptr_func_arith)
11162 << 0 <<
Pointer->getType()->getPointeeType()
11164 <<
Pointer->getSourceRange();
11172 QualType ResType = Operand->getType();
11174 ResType = ResAtomicType->getValueType();
11180 diag::err_typecheck_arithmetic_incomplete_or_sizeless_type,
11181 Operand->getSourceRange());
11194 QualType ResType = Operand->getType();
11196 ResType = ResAtomicType->getValueType();
11228 if (!isLHSPointer && !isRHSPointer)
return true;
11230 QualType LHSPointeeTy, RHSPointeeTy;
11235 if (isLHSPointer && isRHSPointer) {
11239 diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
11247 bool isLHSVoidPtr = isLHSPointer && LHSPointeeTy->
isVoidType();
11248 bool isRHSVoidPtr = isRHSPointer && RHSPointeeTy->
isVoidType();
11249 if (isLHSVoidPtr || isRHSVoidPtr) {
11257 bool isLHSFuncPtr = isLHSPointer && LHSPointeeTy->
isFunctionType();
11258 bool isRHSFuncPtr = isRHSPointer && RHSPointeeTy->
isFunctionType();
11259 if (isLHSFuncPtr || isRHSFuncPtr) {
11281 Expr* IndexExpr = RHSExpr;
11284 IndexExpr = LHSExpr;
11287 bool IsStringPlusInt = StrExpr &&
11293 Self.Diag(OpLoc, diag::warn_string_plus_int)
11297 if (IndexExpr == RHSExpr) {
11299 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence)
11304 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence);
11310 const Expr *StringRefExpr = LHSExpr;
11315 CharExpr = dyn_cast<CharacterLiteral>(LHSExpr->
IgnoreImpCasts());
11316 StringRefExpr = RHSExpr;
11319 if (!CharExpr || !StringRefExpr)
11339 Self.Diag(OpLoc, diag::warn_string_plus_char)
11340 << DiagRange << Ctx.
CharTy;
11342 Self.Diag(OpLoc, diag::warn_string_plus_char)
11343 << DiagRange << CharExpr->
getType();
11349 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence)
11354 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence);
11363 S.
Diag(Loc, diag::err_typecheck_sub_ptr_compatible)
11382 if (CompLHSTy) *CompLHSTy = compType;
11391 *CompLHSTy = compType;
11400 *CompLHSTy = compType;
11411 if (Opc == BO_Add) {
11418 if (CompLHSTy) *CompLHSTy = compType;
11432 std::swap(PExp, IExp);
11445 if (!IExp->getType()->isIntegerType())
11454 (!IExp->isValueDependent() &&
11455 (!IExp->EvaluateAsInt(KnownVal,
Context) ||
11459 Context, BO_Add, PExp, IExp);
11473 Diag(Loc, diag::err_ptrauth_indirect_goto_addrlabel_arithmetic)
11479 CheckArrayAccess(PExp, IExp);
11485 if (
Context.isPromotableIntegerType(LHSTy))
11486 LHSTy =
Context.getPromotedIntegerType(LHSTy);
11488 *CompLHSTy = LHSTy;
11509 if (CompLHSTy) *CompLHSTy = compType;
11518 *CompLHSTy = compType;
11527 *CompLHSTy = compType;
11541 if (CompLHSTy) *CompLHSTy = compType;
11558 Diag(Loc, diag::err_ptrauth_indirect_goto_addrlabel_arithmetic)
11584 CheckArrayAccess(LHS.
get(), RHS.
get(),
nullptr,
11587 if (CompLHSTy) *CompLHSTy = LHS.
get()->
getType();
11598 if (!
Context.hasSameUnqualifiedType(lpointee, rpointee)) {
11603 if (!
Context.typesAreCompatible(
11604 Context.getCanonicalType(lpointee).getUnqualifiedType(),
11605 Context.getCanonicalType(rpointee).getUnqualifiedType())) {
11631 if (ElementSize.
isZero()) {
11632 Diag(Loc,diag::warn_sub_ptr_zero_size_types)
11638 if (CompLHSTy) *CompLHSTy = LHS.
get()->
getType();
11639 return Context.getPointerDiffType();
11649 if (
const EnumType *ET =
T->getAsCanonical<EnumType>())
11650 return ET->getDecl()->isScoped();
11662 if (Opc == BO_Shr &&
11671 llvm::APSInt Right = RHSResult.
Val.
getInt();
11673 if (Right.isNegative()) {
11675 S.
PDiag(diag::warn_shift_negative)
11686 LeftSize = FXSema.getWidth() - (
unsigned)FXSema.hasUnsignedPadding();
11688 if (Right.uge(LeftSize)) {
11690 S.
PDiag(diag::warn_shift_gt_typewidth)
11710 llvm::APSInt Left = LHSResult.
Val.
getInt();
11721 if (Left.isNegative()) {
11723 S.
PDiag(diag::warn_shift_lhs_negative)
11728 llvm::APInt ResultBits =
11729 static_cast<llvm::APInt &
>(Right) + Left.getSignificantBits();
11730 if (ResultBits.ule(LeftSize))
11732 llvm::APSInt Result = Left.extend(ResultBits.getLimitedValue());
11733 Result = Result.shl(Right);
11738 Result.toString(HexResult, 16,
false,
true);
11744 if (ResultBits - 1 == LeftSize) {
11745 S.
Diag(Loc, diag::warn_shift_result_sets_sign_bit)
11746 << HexResult << LHSType
11751 S.
Diag(Loc, diag::warn_shift_result_gt_typewidth)
11752 << HexResult.str() << Result.getSignificantBits() << LHSType
11764 S.
Diag(Loc, diag::err_shift_rhs_only_vector)
11770 if (!IsCompAssign) {
11792 S.
Diag(Loc, diag::err_typecheck_invalid_operands)
11799 if (!LHSEleType->isIntegerType()) {
11800 S.
Diag(Loc, diag::err_typecheck_expect_int)
11805 if (!RHSEleType->isIntegerType()) {
11806 S.
Diag(Loc, diag::err_typecheck_expect_int)
11815 if (LHSEleType != RHSEleType) {
11817 LHSEleType = RHSEleType;
11823 }
else if (RHSVecTy) {
11828 S.
Diag(Loc, diag::err_typecheck_vector_lengths_not_equal)
11836 if (LHSBT != RHSBT &&
11838 S.
Diag(Loc, diag::warn_typecheck_vector_element_sizes_not_equal)
11855 bool IsCompAssign) {
11856 if (!IsCompAssign) {
11879 if ((LHSBuiltinTy && LHSBuiltinTy->
isSVEBool()) ||
11880 (RHSBuiltinTy && RHSBuiltinTy->
isSVEBool())) {
11881 S.
Diag(Loc, diag::err_typecheck_invalid_operands)
11886 if (!LHSEleType->isIntegerType()) {
11887 S.
Diag(Loc, diag::err_typecheck_expect_int)
11892 if (!RHSEleType->isIntegerType()) {
11893 S.
Diag(Loc, diag::err_typecheck_expect_int)
11901 S.
Diag(Loc, diag::err_typecheck_invalid_operands)
11911 if (LHSEleType != RHSEleType) {
11913 LHSEleType = RHSEleType;
11915 const llvm::ElementCount VecSize =
11924 S.
Diag(Loc, diag::err_typecheck_vector_lengths_not_equal)
11930 const llvm::ElementCount VecSize =
11932 if (LHSEleType != RHSEleType) {
11934 RHSEleType = LHSEleType;
11947 bool IsCompAssign) {
11981 if (IsCompAssign) LHS = OldLHS;
12009 S.
Diag(Loc, IsError ? diag::err_typecheck_comparison_of_distinct_pointers
12010 : diag::ext_typecheck_comparison_of_distinct_pointers)
12050 S.
Diag(Loc, IsError ? diag::err_typecheck_comparison_of_fptr_to_void
12051 : diag::ext_typecheck_comparison_of_fptr_to_void)
12058 case Stmt::ObjCArrayLiteralClass:
12059 case Stmt::ObjCDictionaryLiteralClass:
12060 case Stmt::ObjCStringLiteralClass:
12061 case Stmt::ObjCBoxedExprClass:
12105 QualType T = Method->parameters()[0]->getType();
12106 if (!
T->isObjCObjectPointerType())
12109 QualType R = Method->getReturnType();
12122 Literal = LHS.
get();
12125 Literal = RHS.
get();
12141 llvm_unreachable(
"Unknown Objective-C object literal kind");
12145 S.
Diag(Loc, diag::warn_objc_string_literal_comparison)
12146 << Literal->getSourceRange();
12148 S.
Diag(Loc, diag::warn_objc_literal_comparison)
12149 << LiteralKind << Literal->getSourceRange();
12158 S.
Diag(Loc, diag::note_objc_literal_comparison_isequal)
12171 if (!UO || UO->
getOpcode() != UO_LNot)
return;
12181 bool IsBitwiseOp = Opc == BO_And || Opc == BO_Or || Opc == BO_Xor;
12183 << Loc << IsBitwiseOp;
12210 if (
const DeclRefExpr *DR = dyn_cast<DeclRefExpr>(E)) {
12212 }
else if (
const MemberExpr *Mem = dyn_cast<MemberExpr>(E)) {
12213 if (Mem->isImplicitAccess())
12214 D = Mem->getMemberDecl();
12229 return std::nullopt;
12237 std::swap(LHS, RHS);
12241 std::swap(LHS, RHS);
12245 return std::nullopt;
12248 auto *BO = dyn_cast<BinaryOperator>(LHS);
12249 if (!BO || BO->getOpcode() != BO_Add)
12250 return std::nullopt;
12254 Other = BO->getRHS();
12256 Other = BO->getLHS();
12258 return std::nullopt;
12260 if (!
Other->getType()->isUnsignedIntegerType())
12261 return std::nullopt;
12263 return Opc == BO_GE;
12317 auto IsDeprArrayComparionIgnored =
12320 ? diag::warn_array_comparison_cxx26
12321 : !S.
getLangOpts().CPlusPlus20 || IsDeprArrayComparionIgnored
12322 ? diag::warn_array_comparison
12323 : diag::warn_depr_array_comparison;
12338 Result = AlwaysTrue;
12343 Result = AlwaysFalse;
12346 Result = AlwaysEqual;
12349 Result = AlwaysConstant;
12353 S.
PDiag(diag::warn_comparison_always)
12361 Result = AlwaysFalse;
12364 Result = AlwaysTrue;
12368 Result = AlwaysConstant;
12372 S.
PDiag(diag::warn_comparison_always)
12375 }
else if (std::optional<bool> Res =
12378 S.
PDiag(diag::warn_comparison_always)
12380 << (*Res ? AlwaysTrue : AlwaysFalse));
12391 Expr *LiteralString =
nullptr;
12392 Expr *LiteralStringStripped =
nullptr;
12396 LiteralString = LHS;
12397 LiteralStringStripped = LHSStripped;
12402 LiteralString = RHS;
12403 LiteralStringStripped = RHSStripped;
12406 if (LiteralString) {
12408 S.
PDiag(diag::warn_stringcompare)
12421 llvm_unreachable(
"unhandled cast kind");
12423 case CK_UserDefinedConversion:
12425 case CK_LValueToRValue:
12427 case CK_ArrayToPointerDecay:
12429 case CK_FunctionToPointerDecay:
12431 case CK_IntegralCast:
12433 case CK_FloatingCast:
12435 case CK_IntegralToFloating:
12436 case CK_FloatingToIntegral:
12438 case CK_IntegralComplexCast:
12439 case CK_FloatingComplexCast:
12440 case CK_FloatingComplexToIntegralComplex:
12441 case CK_IntegralComplexToFloatingComplex:
12443 case CK_FloatingComplexToReal:
12444 case CK_FloatingRealToComplex:
12445 case CK_IntegralComplexToReal:
12446 case CK_IntegralRealToComplex:
12448 case CK_HLSLArrayRValue:
12461 if (
const auto *ICE = dyn_cast<ImplicitCastExpr>(E))
12488 << 0 << FromType << ToType;
12493 llvm_unreachable(
"unhandled case in switch");
12520 if (NumEnumArgs == 1) {
12522 QualType OtherTy = LHSIsEnum ? RHSStrippedType : LHSStrippedType;
12528 if (NumEnumArgs == 2) {
12537 assert(IntType->isArithmeticType());
12547 LHSType = RHSType = IntType;
12556 if (
Type.isNull()) {
12562 std::optional<ComparisonCategoryType> CCT =
12574 assert(!
Type.isNull() &&
"composite type for <=> has not been set");
12592 if (
Type.isNull()) {
12613 int NullValue =
PP.isMacroDefined(
"NULL") ? 0 : 1;
12618 if (
const auto *
CL = dyn_cast<CharacterLiteral>(E.
get())) {
12619 if (
CL->getValue() == 0)
12623 NullValue ?
"NULL" :
"(void *)0");
12624 }
else if (
const auto *CE = dyn_cast<CStyleCastExpr>(E.
get())) {
12631 NullValue ?
"NULL" :
"(void *)0");
12641 bool IsThreeWay = Opc == BO_Cmp;
12642 bool IsOrdered = IsRelational || IsThreeWay;
12653 if (!IsThreeWay || IsAnyPointerType(LHS) || IsAnyPointerType(RHS)) {
12706 auto computeResultTy = [&]() {
12715 std::optional<ComparisonCategoryType> CCT =
12720 if (CompositeTy->
isPointerType() && LHSIsNull != RHSIsNull) {
12724 Diag(Loc, diag::err_typecheck_three_way_comparison_of_pointer_and_zero)
12725 << (LHSIsNull ? LHS.
get()->getSourceRange()
12734 if (!IsOrdered && LHSIsNull != RHSIsNull) {
12735 bool IsEquality = Opc == BO_EQ;
12747 bool IsError = Opc == BO_Cmp;
12749 IsError ? diag::err_typecheck_ordered_comparison_of_function_pointers
12751 ? diag::warn_typecheck_ordered_comparison_of_function_pointers
12752 : diag::ext_typecheck_ordered_comparison_of_function_pointers;
12781 return computeResultTy();
12797 (IsOrdered ? 2 : 1) &&
12802 return computeResultTy();
12816 if (IsRelational) {
12821 Diag(Loc, diag::ext_typecheck_compare_complete_incomplete_pointers)
12827 }
else if (!IsRelational &&
12831 && !LHSIsNull && !RHSIsNull)
12838 if (LCanPointeeTy != RCanPointeeTy) {
12844 diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
12845 << LHSType << RHSType << 0
12851 CastKind Kind = AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion
12857 bool RHSHasCFIUncheckedCallee = RFn && RFn->getCFIUncheckedCalleeAttr();
12858 bool ChangingCFIUncheckedCallee =
12859 LHSHasCFIUncheckedCallee != RHSHasCFIUncheckedCallee;
12861 if (LHSIsNull && !RHSIsNull)
12863 else if (!ChangingCFIUncheckedCallee)
12866 return computeResultTy();
12878 if (!IsOrdered && LHSIsNull && RHSIsNull) {
12881 return computeResultTy();
12885 return computeResultTy();
12896 return computeResultTy();
12900 return computeResultTy();
12909 return computeResultTy();
12914 return computeResultTy();
12918 if (IsRelational &&
12929 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
12930 if (CTSD->isInStdNamespace() &&
12931 llvm::StringSwitch<bool>(CTSD->getName())
12932 .Cases({
"less",
"less_equal",
"greater",
"greater_equal"},
true)
12938 return computeResultTy();
12951 return computeResultTy();
12961 if (!LHSIsNull && !RHSIsNull &&
12962 !
Context.typesAreCompatible(lpointee, rpointee)) {
12963 Diag(Loc, diag::err_typecheck_comparison_of_distinct_blocks)
12968 return computeResultTy();
12975 if (!LHSIsNull && !RHSIsNull) {
12980 Diag(Loc, diag::err_typecheck_comparison_of_distinct_blocks)
12984 if (LHSIsNull && !RHSIsNull)
12987 : CK_AnyPointerToBlockPointerCast);
12991 : CK_AnyPointerToBlockPointerCast);
12992 return computeResultTy();
13001 bool RPtrToVoid = RPT ? RPT->getPointeeType()->isVoidType() :
false;
13003 if (!LPtrToVoid && !RPtrToVoid &&
13004 !
Context.typesAreCompatible(LHSType, RHSType)) {
13011 if (LHSIsNull && !RHSIsNull) {
13017 RPT ? CK_BitCast :CK_CPointerToObjCPointerCast);
13027 LPT ? CK_BitCast :CK_CPointerToObjCPointerCast);
13029 return computeResultTy();
13033 if (!
Context.areComparableObjCPointerTypes(LHSType, RHSType))
13039 if (LHSIsNull && !RHSIsNull)
13043 return computeResultTy();
13049 CK_BlockPointerToObjCPointerCast);
13050 return computeResultTy();
13051 }
else if (!IsOrdered &&
13055 CK_BlockPointerToObjCPointerCast);
13056 return computeResultTy();
13061 unsigned DiagID = 0;
13062 bool isError =
false;
13071 isError ? diag::err_typecheck_ordered_comparison_of_pointer_and_zero
13072 : diag::ext_typecheck_ordered_comparison_of_pointer_and_zero;
13075 DiagID = diag::err_typecheck_comparison_of_pointer_integer;
13077 }
else if (IsOrdered)
13078 DiagID = diag::ext_typecheck_ordered_comparison_of_pointer_integer;
13080 DiagID = diag::ext_typecheck_comparison_of_pointer_integer;
13092 LHSIsNull ? CK_NullToPointer : CK_IntegralToPointer);
13095 RHSIsNull ? CK_NullToPointer : CK_IntegralToPointer);
13096 return computeResultTy();
13100 if (!IsOrdered && RHSIsNull
13103 return computeResultTy();
13105 if (!IsOrdered && LHSIsNull
13108 return computeResultTy();
13111 if (
getLangOpts().getOpenCLCompatibleVersion() >= 200) {
13113 return computeResultTy();
13117 return computeResultTy();
13120 if (LHSIsNull && RHSType->
isQueueT()) {
13122 return computeResultTy();
13125 if (LHSType->
isQueueT() && RHSIsNull) {
13127 return computeResultTy();
13152 "Unhandled vector element size in vector compare");
13172 "Unhandled vector element size in vector compare");
13182 const auto TypeSize =
Context.getTypeSize(ETy);
13184 const QualType IntTy =
Context.getIntTypeForBitwidth(TypeSize,
true);
13185 const llvm::ElementCount VecSize =
Context.getBuiltinVectorTypeInfo(VTy).EC;
13186 return Context.getScalableVectorType(IntTy, VecSize.getKnownMinValue());
13192 if (Opc == BO_Cmp) {
13193 Diag(Loc, diag::err_three_way_vector_comparison);
13222 return Context.getLogicalOperationType();
13224 Diag(Loc, diag::warn_deprecated_altivec_src_compat);
13230 return Context.getLogicalOperationType();
13254 if (Opc == BO_Cmp) {
13255 Diag(Loc, diag::err_three_way_vector_comparison);
13283 if (LHSBuiltinTy && RHSBuiltinTy && LHSBuiltinTy->
isSVEBool() &&
13284 RHSBuiltinTy->isSVEBool())
13303 bool Negative =
false;
13304 bool ExplicitPlus =
false;
13305 const auto *LHSInt = dyn_cast<IntegerLiteral>(XorLHS.
get());
13306 const auto *RHSInt = dyn_cast<IntegerLiteral>(XorRHS.
get());
13312 if (
const auto *UO = dyn_cast<UnaryOperator>(XorRHS.
get())) {
13314 if (Opc != UO_Minus && Opc != UO_Plus)
13316 RHSInt = dyn_cast<IntegerLiteral>(UO->getSubExpr());
13319 Negative = (Opc == UO_Minus);
13320 ExplicitPlus = !Negative;
13326 const llvm::APInt &LeftSideValue = LHSInt->getValue();
13327 llvm::APInt RightSideValue = RHSInt->getValue();
13328 if (LeftSideValue != 2 && LeftSideValue != 10)
13331 if (LeftSideValue.getBitWidth() != RightSideValue.getBitWidth())
13336 llvm::StringRef ExprStr =
13341 llvm::StringRef XorStr =
13344 if (XorStr ==
"xor")
13355 RightSideValue = -RightSideValue;
13356 RHSStr =
"-" + RHSStr;
13357 }
else if (ExplicitPlus) {
13358 RHSStr =
"+" + RHSStr;
13361 StringRef LHSStrRef = LHSStr;
13362 StringRef RHSStrRef = RHSStr;
13365 if (LHSStrRef.starts_with(
"0b") || LHSStrRef.starts_with(
"0B") ||
13366 RHSStrRef.starts_with(
"0b") || RHSStrRef.starts_with(
"0B") ||
13367 LHSStrRef.starts_with(
"0x") || LHSStrRef.starts_with(
"0X") ||
13368 RHSStrRef.starts_with(
"0x") || RHSStrRef.starts_with(
"0X") ||
13369 (LHSStrRef.size() > 1 && LHSStrRef.starts_with(
"0")) ||
13370 (RHSStrRef.size() > 1 && RHSStrRef.starts_with(
"0")) ||
13371 LHSStrRef.contains(
'\'') || RHSStrRef.contains(
'\''))
13376 const llvm::APInt XorValue = LeftSideValue ^ RightSideValue;
13377 int64_t RightSideIntValue = RightSideValue.getSExtValue();
13378 if (LeftSideValue == 2 && RightSideIntValue >= 0) {
13379 std::string SuggestedExpr =
"1 << " + RHSStr;
13380 bool Overflow =
false;
13381 llvm::APInt One = (LeftSideValue - 1);
13382 llvm::APInt PowValue = One.sshl_ov(RightSideValue, Overflow);
13384 if (RightSideIntValue < 64)
13385 S.
Diag(Loc, diag::warn_xor_used_as_pow_base)
13386 << ExprStr <<
toString(XorValue, 10,
true) << (
"1LL << " + RHSStr)
13388 else if (RightSideIntValue == 64)
13389 S.
Diag(Loc, diag::warn_xor_used_as_pow)
13390 << ExprStr <<
toString(XorValue, 10,
true);
13394 S.
Diag(Loc, diag::warn_xor_used_as_pow_base_extra)
13395 << ExprStr <<
toString(XorValue, 10,
true) << SuggestedExpr
13398 ExprRange, (RightSideIntValue == 0) ?
"1" : SuggestedExpr);
13401 S.
Diag(Loc, diag::note_xor_used_as_pow_silence)
13402 << (
"0x2 ^ " + RHSStr) << SuggestXor;
13403 }
else if (LeftSideValue == 10) {
13404 std::string SuggestedValue =
"1e" + std::to_string(RightSideIntValue);
13405 S.
Diag(Loc, diag::warn_xor_used_as_pow_base)
13406 << ExprStr <<
toString(XorValue, 10,
true) << SuggestedValue
13408 S.
Diag(Loc, diag::note_xor_used_as_pow_silence)
13409 << (
"0xA ^ " + RHSStr) << SuggestXor;
13426 getLangOpts().getOpenCLCompatibleVersion() < 120 &&
13453 assert(
false &&
"Logical operands are not supported in C\\C++");
13469 bool IsCompAssign) {
13470 if (!IsCompAssign) {
13486 assert((LHSMatType || RHSMatType) &&
"At least one operand must be a matrix");
13488 if (
Context.hasSameType(LHSType, RHSType))
13489 return Context.getCommonSugaredType(LHSType, RHSType);
13495 if (LHSMatType && !RHSMatType) {
13503 if (!LHSMatType && RHSMatType) {
13515 bool IsCompAssign) {
13516 if (!IsCompAssign) {
13527 assert((LHSMatType || RHSMatType) &&
"At least one operand must be a matrix");
13529 if (LHSMatType && RHSMatType) {
13530 if (LHSMatType->getNumColumns() != RHSMatType->
getNumRows())
13533 if (
Context.hasSameType(LHSMatType, RHSMatType))
13534 return Context.getCommonSugaredType(
13538 QualType LHSELTy = LHSMatType->getElementType(),
13540 if (!
Context.hasSameType(LHSELTy, RHSELTy))
13543 return Context.getConstantMatrixType(
13544 Context.getCommonSugaredType(LHSELTy, RHSELTy),
13569 bool IsCompAssign =
13570 Opc == BO_AndAssign || Opc == BO_OrAssign || Opc == BO_XorAssign;
13581 LegalBoolVecOperator,
13611 ExprResult LHSResult = LHS, RHSResult = RHS;
13613 LHSResult, RHSResult, Loc,
13615 if (LHSResult.
isInvalid() || RHSResult.isInvalid())
13617 LHS = LHSResult.
get();
13618 RHS = RHSResult.
get();
13643 bool EnumConstantInBoolContext =
false;
13645 if (
const auto *DREHS = dyn_cast<DeclRefExpr>(HS.get())) {
13646 const auto *ECDHS = dyn_cast<EnumConstantDecl>(DREHS->getDecl());
13647 if (ECDHS && ECDHS->getInitVal() != 0 && ECDHS->getInitVal() != 1)
13648 EnumConstantInBoolContext =
true;
13652 if (EnumConstantInBoolContext)
13653 Diag(Loc, diag::warn_enum_constant_in_bool_context);
13658 const auto *LHSATy = dyn_cast<ArrayType>(LHSTy);
13659 const auto *RHSATy = dyn_cast<ArrayType>(RHSTy);
13660 if ((LHSATy && LHSATy->getElementType().isWebAssemblyReferenceType()) ||
13661 (RHSATy && RHSATy->getElementType().isWebAssemblyReferenceType())) {
13683 Diag(Loc, diag::warn_logical_instead_of_bitwise)
13686 Diag(Loc, diag::note_logical_instead_of_bitwise_change_operator)
13687 << (Opc == BO_LAnd ?
"&" :
"|")
13690 Opc == BO_LAnd ?
"&" :
"|");
13691 if (Opc == BO_LAnd)
13693 Diag(Loc, diag::note_logical_instead_of_bitwise_remove_constant)
13701 if (!
Context.getLangOpts().CPlusPlus) {
13704 if (
Context.getLangOpts().OpenCL &&
13705 Context.getLangOpts().OpenCLVersion < 120) {
13755 const MemberExpr *ME = dyn_cast<MemberExpr>(E);
13756 if (!ME)
return false;
13760 if (!
Base)
return false;
13761 return Base->getMethodDecl() !=
nullptr;
13785 assert(S.
getLangOpts().CPlusPlus &&
"BindingDecl outside of C++?");
13796 assert(Var->
hasLocalStorage() &&
"capture added 'const' to non-local?");
13804 if (
auto *FD = dyn_cast<FunctionDecl>(DC))
13847 bool DiagnosticEmitted =
false;
13851 bool IsDereference =
false;
13852 bool NextIsDereference =
false;
13856 IsDereference = NextIsDereference;
13859 if (
const MemberExpr *ME = dyn_cast<MemberExpr>(E)) {
13860 NextIsDereference = ME->isArrow();
13861 const ValueDecl *VD = ME->getMemberDecl();
13862 if (
const FieldDecl *Field = dyn_cast<FieldDecl>(VD)) {
13864 if (Field->isMutable()) {
13865 assert(DiagnosticEmitted &&
"Expected diagnostic not emitted.");
13870 if (!DiagnosticEmitted) {
13871 S.
Diag(Loc, diag::err_typecheck_assign_const)
13873 << Field->getType();
13874 DiagnosticEmitted =
true;
13877 <<
ConstMember <<
false << Field << Field->getType()
13878 << Field->getSourceRange();
13882 }
else if (
const VarDecl *VDecl = dyn_cast<VarDecl>(VD)) {
13883 if (VDecl->getType().isConstQualified()) {
13884 if (!DiagnosticEmitted) {
13885 S.
Diag(Loc, diag::err_typecheck_assign_const)
13887 << VDecl->getType();
13888 DiagnosticEmitted =
true;
13891 <<
ConstMember <<
true << VDecl << VDecl->getType()
13892 << VDecl->getSourceRange();
13899 dyn_cast<ArraySubscriptExpr>(E)) {
13903 dyn_cast<ExtVectorElementExpr>(E)) {
13910 if (
const CallExpr *CE = dyn_cast<CallExpr>(E)) {
13914 if (!DiagnosticEmitted) {
13915 S.
Diag(Loc, diag::err_typecheck_assign_const) << ExprRange
13917 DiagnosticEmitted =
true;
13920 diag::note_typecheck_assign_const)
13924 }
else if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
13926 if (
const ValueDecl *VD = DRE->getDecl()) {
13928 if (!DiagnosticEmitted) {
13929 S.
Diag(Loc, diag::err_typecheck_assign_const)
13931 DiagnosticEmitted =
true;
13933 S.
Diag(VD->getLocation(), diag::note_typecheck_assign_const)
13934 <<
ConstVariable << VD << VD->getType() << VD->getSourceRange();
13939 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(DC)) {
13940 if (MD->isConst()) {
13941 if (!DiagnosticEmitted) {
13942 S.
Diag(Loc, diag::err_typecheck_assign_const) << ExprRange
13944 DiagnosticEmitted =
true;
13946 S.
Diag(MD->getLocation(), diag::note_typecheck_assign_const)
13953 if (DiagnosticEmitted)
13957 S.
Diag(Loc, diag::err_typecheck_assign_const) << ExprRange <<
ConstUnknown;
13967 const RecordType *Ty,
13970 bool &DiagnosticEmitted) {
13971 std::vector<const RecordType *> RecordTypeList;
13972 RecordTypeList.push_back(Ty);
13973 unsigned NextToCheckIndex = 0;
13976 while (RecordTypeList.size() > NextToCheckIndex) {
13977 bool IsNested = NextToCheckIndex > 0;
13978 for (
const FieldDecl *Field : RecordTypeList[NextToCheckIndex]
13983 QualType FieldTy = Field->getType();
13985 if (!DiagnosticEmitted) {
13986 S.
Diag(Loc, diag::err_typecheck_assign_const)
13988 << IsNested << Field;
13989 DiagnosticEmitted =
true;
13991 S.
Diag(Field->getLocation(), diag::note_typecheck_assign_const)
13993 << FieldTy << Field->getSourceRange();
13998 if (
const auto *FieldRecTy = FieldTy->
getAsCanonical<RecordType>()) {
13999 if (!llvm::is_contained(RecordTypeList, FieldRecTy))
14000 RecordTypeList.push_back(FieldRecTy);
14003 ++NextToCheckIndex;
14012 assert(Ty->
isRecordType() &&
"lvalue was not record?");
14015 bool DiagEmitted =
false;
14017 if (
const MemberExpr *ME = dyn_cast<MemberExpr>(E))
14020 else if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
14045 unsigned DiagID = 0;
14046 bool NeedType =
false;
14053 DiagID = diag::err_block_decl_ref_not_modifiable_lvalue;
14055 DiagID = diag::err_lambda_decl_ref_not_modifiable_lvalue;
14068 if (var->isARCPseudoStrong() &&
14069 (!var->getTypeSourceInfo() ||
14070 !var->getTypeSourceInfo()->getType().isConstQualified())) {
14076 ? diag::err_typecheck_arc_assign_self_class_method
14077 : diag::err_typecheck_arc_assign_self;
14080 }
else if (var->hasAttr<ObjCExternallyRetainedAttr>() ||
14082 DiagID = diag::err_typecheck_arc_assign_externally_retained;
14086 DiagID = diag::err_typecheck_arr_assign_enumeration;
14090 if (Loc != OrigLoc)
14116 DiagID = diag::err_typecheck_array_not_modifiable_lvalue;
14120 DiagID = diag::err_typecheck_non_object_not_modifiable_lvalue;
14124 DiagID = diag::err_typecheck_lvalue_casts_not_supported;
14127 llvm_unreachable(
"did not take early return for MLV_Valid");
14131 DiagID = diag::err_typecheck_expression_not_modifiable_lvalue;
14136 diag::err_typecheck_incomplete_type_not_modifiable_lvalue, E);
14138 DiagID = diag::err_typecheck_duplicate_vector_components_not_mlvalue;
14141 llvm_unreachable(
"readonly properties should be processed differently");
14143 DiagID = diag::err_readonly_message_assignment;
14146 DiagID = diag::err_no_subobject_property_setting;
14151 if (Loc != OrigLoc)
14173 MemberExpr *ML = dyn_cast<MemberExpr>(LHSExpr);
14174 MemberExpr *MR = dyn_cast<MemberExpr>(RHSExpr);
14182 if (LHSDecl != RHSDecl)
14187 if (RefTy->getPointeeType().isVolatileQualified())
14190 Sema.
Diag(Loc, diag::warn_identity_field_assign) << 0;
14200 Sema.
Diag(Loc, diag::warn_identity_field_assign) << 1;
14224 bool ShowFullyQualifiedAssigneeName =
false;
14227 Assignee = DR->getDecl();
14228 }
else if (
auto *ME = dyn_cast<MemberExpr>(LHSExpr->
IgnoreParenCasts())) {
14229 Assignee = ME->getMemberDecl();
14230 ShowFullyQualifiedAssigneeName =
true;
14235 ShowFullyQualifiedAssigneeName);
14244 Diag(Loc, diag::err_opencl_half_load_store) << 1
14251 Diag(Loc, diag::err_wasm_table_art) << 0;
14256 if (CompoundType.
isNull()) {
14267 ((
Context.isObjCNSObjectType(LHSType) &&
14269 (
Context.isObjCNSObjectType(RHSType) &&
14274 Diag(Loc, diag::err_objc_object_assignment) << LHSType;
14280 RHSCheck = ICE->getSubExpr();
14281 if (
UnaryOperator *UO = dyn_cast<UnaryOperator>(RHSCheck)) {
14282 if ((UO->getOpcode() == UO_Plus || UO->getOpcode() == UO_Minus) &&
14283 Loc.
isFileID() && UO->getOperatorLoc().isFileID() &&
14289 UO->getSubExpr()->getBeginLoc().
isFileID()) {
14290 Diag(Loc, diag::warn_not_compound_assign)
14291 << (UO->getOpcode() == UO_Plus ?
"+" :
"-")
14292 <<
SourceRange(UO->getOperatorLoc(), UO->getOperatorLoc());
14302 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(InnerLHS);
14318 if (!
Diags.isIgnored(diag::warn_arc_repeated_use_of_weak,
14341 if (CompoundType.
isNull()) {
14367 if (
const CastExpr *CE = dyn_cast<CastExpr>(E)) {
14368 if (CE->getCastKind() == CK_ToVoid) {
14374 CE->getSubExpr()->getType()->isDependentType()) {
14379 if (
const auto *CE = dyn_cast<CallExpr>(E))
14380 return CE->getCallReturnType(Context)->isVoidType();
14400 const unsigned ForIncrementFlags =
14406 if ((ScopeFlags & ForIncrementFlags) == ForIncrementFlags ||
14407 (ScopeFlags & ForInitFlags) == ForInitFlags)
14412 while (
const BinaryOperator *BO = dyn_cast<BinaryOperator>(LHS)) {
14413 if (BO->getOpcode() != BO_Comma)
14415 LHS = BO->getRHS();
14422 Diag(Loc, diag::warn_comma_operator);
14426 LangOpts.CPlusPlus ?
"static_cast<void>("
14458 diag::err_incomplete_type);
14479 ResType = ResAtomicType->getValueType();
14481 assert(!ResType.
isNull() &&
"no type for increment/decrement expression");
14491 : diag::warn_increment_bool)
14495 S.
Diag(OpLoc, diag::err_increment_decrement_enum) << IsInc << ResType;
14511 S.
Diag(OpLoc, S.
getLangOpts().C2y ? diag::warn_c2y_compat_increment_complex
14512 : diag::ext_c2y_increment_complex)
14529 S.
Diag(OpLoc, diag::err_typecheck_illegal_increment_decrement)
14540 S.
Diag(OpLoc, diag::warn_deprecated_increment_decrement_volatile)
14541 << IsInc << ResType;
14573 case Stmt::DeclRefExprClass:
14575 case Stmt::MemberExprClass:
14583 case Stmt::ArraySubscriptExprClass: {
14588 if (ICE->getSubExpr()->getType()->isArrayType())
14593 case Stmt::UnaryOperatorClass: {
14605 case Stmt::ParenExprClass:
14607 case Stmt::ImplicitCastExprClass:
14611 case Stmt::CXXUuidofExprClass:
14621 AO_Vector_Element = 1,
14622 AO_Property_Expansion = 2,
14623 AO_Register_Variable = 3,
14624 AO_Matrix_Element = 4,
14642 return Diag(OpLoc, diag::err_parens_pointer_member_function)
14647 return Diag(OpLoc, diag::err_typecheck_addrof_dtor)
14648 << DRE->getSourceRange();
14650 if (DRE->getQualifier())
14654 return Diag(OpLoc, diag::err_unqualified_pointer_member_function)
14655 << DRE->getSourceRange();
14658 StringRef Qual = (MD->
getParent()->getName() +
"::").toStringRef(Str);
14659 return Diag(OpLoc, diag::err_unqualified_pointer_member_function)
14660 << DRE->getSourceRange()
14666 if (PTy->getKind() == BuiltinType::Overload) {
14670 Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof_addrof_function)
14678 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
14686 if (PTy->getKind() == BuiltinType::UnknownAny)
14689 if (PTy->getKind() == BuiltinType::BoundMember) {
14690 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
14713 auto* VarRef = dyn_cast<DeclRefExpr>(op);
14714 if (VarRef && VarRef->refersToEnclosingVariableOrCapture()) {
14715 Diag(op->
getExprLoc(), diag::err_opencl_taking_address_capture);
14723 if (uOp->getOpcode() == UO_Deref)
14726 return uOp->getSubExpr()->getType();
14733 if (
auto *FD = dyn_cast_or_null<FunctionDecl>(dcl))
14739 unsigned AddressOfError = AO_No_Error;
14743 Diag(OpLoc, IsError ? diag::err_typecheck_addrof_temporary
14744 : diag::ext_typecheck_addrof_temporary)
14759 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
14777 auto ReturnOrParamTypeIsIncomplete = [&](
QualType T,
14782 diag::note_ptrauth_virtual_function_pointer_incomplete_arg_ret);
14783 Diag(RetArgTypeLoc,
14784 diag::note_ptrauth_virtual_function_incomplete_arg_ret_type)
14791 bool IsIncomplete =
14793 ReturnOrParamTypeIsIncomplete(
14796 IsIncomplete |= ReturnOrParamTypeIsIncomplete(PVD->getType(), OpLoc,
14797 PVD->getBeginLoc());
14803 if (
Context.getTargetInfo().getCXXABI().isMicrosoft())
14812 AddressOfError = AO_Property_Expansion;
14814 Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof)
14818 }
else if (
const auto *DRE = dyn_cast<DeclRefExpr>(op)) {
14819 if (
const auto *MD = dyn_cast_or_null<CXXMethodDecl>(DRE->getDecl()))
14825 AddressOfError = AO_Bit_Field;
14828 AddressOfError = AO_Vector_Element;
14831 AddressOfError = AO_Matrix_Element;
14835 if (
const VarDecl *vd = dyn_cast<VarDecl>(dcl)) {
14840 AddressOfError = AO_Register_Variable;
14843 AddressOfError = AO_Property_Expansion;
14856 if (
auto *DRE = dyn_cast<DeclRefExpr>(op);
14862 diag::err_cannot_form_pointer_to_member_of_reference_type)
14873 if (
Context.getTargetInfo().getCXXABI().isMicrosoft())
14881 llvm_unreachable(
"Unknown/unexpected decl type");
14884 if (AddressOfError != AO_No_Error) {
14901 if (
Context.getTargetInfo().getTriple().isWasm()) {
14904 Diag(OpLoc, diag::err_wasm_ca_reference)
14909 Diag(OpLoc, diag::err_wasm_table_pr)
14915 CheckAddressOfPackedMember(op);
14921 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Exp);
14927 const ParmVarDecl *Param = dyn_cast<ParmVarDecl>(D);
14930 if (
const FunctionDecl* FD = dyn_cast<FunctionDecl>(Param->getDeclContext()))
14931 if (!FD->hasAttr<NonNullAttr>() && !Param->hasAttr<NonNullAttr>())
14934 FD->ModifiedNonNullParams.insert(Param);
14940 bool IsAfterAmp =
false) {
14944 Op = ConvResult.
get();
14956 Result = PT->getPointeeType();
14964 if (PR.
get() != Op)
14968 if (Result.isNull()) {
14969 S.
Diag(OpLoc, diag::err_typecheck_indirection_requires_pointer)
14974 if (Result->isVoidType()) {
14980 S.
Diag(OpLoc, diag::err_typecheck_indirection_through_void_pointer_cpp)
14983 S.
Diag(OpLoc, diag::ext_typecheck_indirection_through_void_pointer)
14991 if (!S.
getLangOpts().CPlusPlus && Result.isCForbiddenLValueType())
15000 default: llvm_unreachable(
"Unknown binop!");
15001 case tok::periodstar: Opc = BO_PtrMemD;
break;
15002 case tok::arrowstar: Opc = BO_PtrMemI;
break;
15003 case tok::star: Opc = BO_Mul;
break;
15004 case tok::slash: Opc = BO_Div;
break;
15005 case tok::percent: Opc = BO_Rem;
break;
15006 case tok::plus: Opc = BO_Add;
break;
15007 case tok::minus: Opc = BO_Sub;
break;
15008 case tok::lessless: Opc = BO_Shl;
break;
15009 case tok::greatergreater: Opc = BO_Shr;
break;
15010 case tok::lessequal: Opc = BO_LE;
break;
15011 case tok::less: Opc = BO_LT;
break;
15012 case tok::greaterequal: Opc = BO_GE;
break;
15013 case tok::greater: Opc = BO_GT;
break;
15014 case tok::exclaimequal: Opc = BO_NE;
break;
15015 case tok::equalequal: Opc = BO_EQ;
break;
15016 case tok::spaceship: Opc = BO_Cmp;
break;
15017 case tok::amp: Opc = BO_And;
break;
15018 case tok::caret: Opc = BO_Xor;
break;
15019 case tok::pipe: Opc = BO_Or;
break;
15020 case tok::ampamp: Opc = BO_LAnd;
break;
15021 case tok::pipepipe: Opc = BO_LOr;
break;
15022 case tok::equal: Opc = BO_Assign;
break;
15023 case tok::starequal: Opc = BO_MulAssign;
break;
15024 case tok::slashequal: Opc = BO_DivAssign;
break;
15025 case tok::percentequal: Opc = BO_RemAssign;
break;
15026 case tok::plusequal: Opc = BO_AddAssign;
break;
15027 case tok::minusequal: Opc = BO_SubAssign;
break;
15028 case tok::lesslessequal: Opc = BO_ShlAssign;
break;
15029 case tok::greatergreaterequal: Opc = BO_ShrAssign;
break;
15030 case tok::ampequal: Opc = BO_AndAssign;
break;
15031 case tok::caretequal: Opc = BO_XorAssign;
break;
15032 case tok::pipeequal: Opc = BO_OrAssign;
break;
15033 case tok::comma: Opc = BO_Comma;
break;
15042 default: llvm_unreachable(
"Unknown unary op!");
15043 case tok::plusplus: Opc = UO_PreInc;
break;
15044 case tok::minusminus: Opc = UO_PreDec;
break;
15045 case tok::amp: Opc = UO_AddrOf;
break;
15046 case tok::star: Opc = UO_Deref;
break;
15047 case tok::plus: Opc = UO_Plus;
break;
15048 case tok::minus: Opc = UO_Minus;
break;
15049 case tok::tilde: Opc = UO_Not;
break;
15050 case tok::exclaim: Opc = UO_LNot;
break;
15051 case tok::kw___real: Opc = UO_Real;
break;
15052 case tok::kw___imag: Opc = UO_Imag;
break;
15053 case tok::kw___extension__: Opc = UO_Extension;
break;
15085 llvm::find_if(Parent->
fields(),
15087 return F->getDeclName() == Name;
15089 return (Field != Parent->
field_end()) ? *Field :
nullptr;
15104 const DeclRefExpr *LHSDeclRef = dyn_cast<DeclRefExpr>(LHSExpr);
15105 const DeclRefExpr *RHSDeclRef = dyn_cast<DeclRefExpr>(RHSExpr);
15106 if (!LHSDeclRef || !RHSDeclRef ||
15114 if (LHSDecl != RHSDecl)
15119 if (RefTy->getPointeeType().isVolatileQualified())
15122 auto Diag = S.
Diag(OpLoc, IsBuiltin ? diag::warn_self_assignment_builtin
15123 : diag::warn_self_assignment_overloaded)
15128 Diag << 1 << SelfAssignField
15141 const Expr *ObjCPointerExpr =
nullptr, *OtherExpr =
nullptr;
15146 ObjCPointerExpr = LHS;
15150 ObjCPointerExpr = RHS;
15159 unsigned Diag = diag::warn_objc_pointer_masking;
15168 if (SelArg0.starts_with(
"performSelector"))
15169 Diag = diag::warn_objc_pointer_masking_performSelector;
15186 assert((
isVector(ResultTy, Context.HalfTy) ||
15187 isVector(ResultTy, Context.ShortTy)) &&
15188 "Result must be a vector of half or short");
15191 "both operands expected to be a half vector");
15198 if (
isVector(ResultTy, Context.ShortTy))
15203 ResultTy,
VK, OK, OpLoc, FPFeatures,
15204 BinOpResTy, BinOpResTy);
15208 BinOpResTy,
VK, OK, OpLoc, FPFeatures);
15216 if (!OpRequiresConversion || Ctx.
getLangOpts().NativeHalfType ||
15220 auto HasVectorOfHalfType = [&Ctx](
Expr *E) {
15230 return VT->getElementType().getCanonicalType() == Ctx.
HalfTy;
15235 return HasVectorOfHalfType(E0) && (!E1 || HasVectorOfHalfType(E1));
15240 Expr *RHSExpr,
bool ForFoldExpression) {
15254 if (
Init.isInvalid())
15256 RHSExpr =
Init.get();
15266 bool ConvertHalfVec =
false;
15268 if (!LHS.
isUsable() || !RHS.isUsable())
15278 if (BO_Assign == Opc)
15279 Diag(OpLoc, diag::err_opencl_atomic_init) << 0 << SR;
15307 if (!ResultTy.
isNull()) {
15324 if (
auto *BE = dyn_cast<BlockExpr>(RHS.get()->IgnoreParens()))
15326 if (
auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
15327 if (VD->hasLocalStorage() &&
getCurScope()->isDeclScope(VD))
15328 BE->getBlockDecl()->setCanAvoidCopyToHeap();
15339 Opc == BO_PtrMemI);
15343 ConvertHalfVec =
true;
15350 ConvertHalfVec =
true;
15354 ConvertHalfVec =
true;
15365 ConvertHalfVec =
true;
15368 if (
const auto *BI = dyn_cast<BinaryOperator>(LHSExpr);
15369 !ForFoldExpression && BI && BI->isComparisonOp())
15370 Diag(OpLoc, diag::warn_consecutive_comparison)
15376 ConvertHalfVec =
true;
15380 ConvertHalfVec =
true;
15393 ConvertHalfVec =
true;
15398 ConvertHalfVec =
true;
15400 CompLHSTy = CompResultTy;
15407 CompLHSTy = CompResultTy;
15413 ConvertHalfVec =
true;
15420 ConvertHalfVec =
true;
15429 CompLHSTy = CompResultTy;
15440 CompLHSTy = CompResultTy;
15448 VK = RHS.get()->getValueKind();
15449 OK = RHS.get()->getObjectKind();
15461 (Opc == BO_Comma ||
isVector(RHS.get()->getType(),
Context.HalfTy) ==
15463 "both sides are half vectors or neither sides are");
15468 CheckArrayAccess(LHS.
get());
15469 CheckArrayAccess(RHS.get());
15473 &
Context.Idents.get(
"object_setClass"),
15479 "object_setClass(")
15492 if (CompResultTy.
isNull()) {
15493 if (ConvertHalfVec)
15513 if (ConvertHalfVec)
15518 Context, LHS.
get(), RHS.get(), Opc, ResultTy,
VK, OK, OpLoc,
15535 if (isLeftComp == isRightComp)
15540 bool isLeftBitwise = LHSBO && LHSBO->
isBitwiseOp();
15541 bool isRightBitwise = RHSBO && RHSBO->
isBitwiseOp();
15542 if (isLeftBitwise || isRightBitwise)
15554 Self.Diag(OpLoc, diag::warn_precedence_bitwise_rel)
15557 Self.PDiag(diag::note_precedence_silence) << OpStr,
15558 (isLeftComp ? LHSExpr : RHSExpr)->getSourceRange());
15560 Self.PDiag(diag::note_precedence_bitwise_first)
15575 Self.PDiag(diag::note_precedence_silence)
15584 if (Bop->getOpcode() == BO_LAnd) {
15589 }
else if (Bop->getOpcode() == BO_LOr) {
15590 if (
BinaryOperator *RBop = dyn_cast<BinaryOperator>(Bop->getRHS())) {
15593 if (RBop->getOpcode() == BO_LAnd &&
15605 if (Bop->getOpcode() == BO_LAnd) {
15620 if (Bop->isBitwiseOp() && Bop->getOpcode() < Opc) {
15621 S.
Diag(Bop->getOperatorLoc(), diag::warn_bitwise_op_in_bitwise_op)
15623 << Bop->getSourceRange() << OpLoc;
15625 S.
PDiag(diag::note_precedence_silence)
15626 << Bop->getOpcodeStr(),
15627 Bop->getSourceRange());
15633 Expr *SubExpr, StringRef Shift) {
15635 if (Bop->getOpcode() == BO_Add || Bop->getOpcode() == BO_Sub) {
15636 StringRef Op = Bop->getOpcodeStr();
15637 S.
Diag(Bop->getOperatorLoc(), diag::warn_addition_in_bitshift)
15638 << Bop->getSourceRange() << OpLoc << Shift << Op;
15640 S.
PDiag(diag::note_precedence_silence) << Op,
15641 Bop->getSourceRange());
15657 if (Kind != OO_LessLess && Kind != OO_GreaterGreater)
15660 S.
Diag(OpLoc, diag::warn_overloaded_shift_in_comparison)
15662 << (Kind == OO_LessLess);
15664 S.
PDiag(diag::note_precedence_silence)
15665 << (Kind == OO_LessLess ?
"<<" :
">>"),
15668 S, OpLoc, S.
PDiag(diag::note_evaluate_comparison_first),
15682 if ((Opc == BO_Or || Opc == BO_Xor) &&
15690 if (Opc == BO_LOr && !OpLoc.
isMacroID()) {
15696 || Opc == BO_Shr) {
15712 assert(LHSExpr &&
"ActOnBinOp(): missing left expression");
15713 assert(RHSExpr &&
"ActOnBinOp(): missing right expression");
15722 CheckInvalidBuiltinCountedByRef(LHSExpr, K);
15723 CheckInvalidBuiltinCountedByRef(RHSExpr, K);
15725 return BuildBinOp(S, TokLoc, Opc, LHSExpr, RHSExpr);
15731 if (OverOp !=
OO_None && OverOp != OO_Equal)
15780 Expr *RHSExpr,
bool ForFoldExpression) {
15781 if (!LHSExpr || !RHSExpr)
15793 if (pty->getKind() == BuiltinType::PseudoObject &&
15806 RHSExpr = resolvedRHS.
get();
15820 (pty->getKind() == BuiltinType::BoundMember ||
15821 pty->getKind() == BuiltinType::Overload)) {
15822 auto *OE = dyn_cast<OverloadExpr>(LHSExpr);
15823 if (OE && !OE->hasTemplateKeyword() && !OE->hasExplicitTemplateArgs() &&
15824 llvm::any_of(OE->decls(), [](
NamedDecl *ND) {
15825 return isa<FunctionTemplateDecl>(ND);
15827 Diag(OE->getQualifier() ? OE->getQualifierLoc().getBeginLoc()
15828 : OE->getNameLoc(),
15829 diag::err_template_kw_missing)
15830 << OE->getName().getAsIdentifierInfo();
15837 LHSExpr = LHS.
get();
15844 if (Opc == BO_Assign && pty->getKind() == BuiltinType::Overload) {
15851 ForFoldExpression);
15861 RHSExpr = resolvedRHS.
get();
15866 if (!
HLSL().CheckResourceBinOp(Opc, LHSExpr, RHSExpr, OpLoc))
15883 "Should only occur in error-recovery path.");
15889 Context, LHSExpr, RHSExpr, Opc,
15909 ResultType = RHSExpr->
getType();
15912 ResultType =
Context.DependentTy;
15925 if (
T.isNull() ||
T->isDependentType())
15941 bool CanOverflow =
false;
15943 bool ConvertHalfVec =
false;
15952 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15959 if (Opc == UO_AddrOf)
15960 return ExprError(
Diag(OpLoc, diag::err_hlsl_operator_unsupported) << 0);
15961 if (Opc == UO_Deref)
15962 return ExprError(
Diag(OpLoc, diag::err_hlsl_operator_unsupported) << 1);
15967 resultType =
Context.DependentTy;
15976 Opc == UO_PreInc || Opc == UO_PostInc,
15977 Opc == UO_PreInc || Opc == UO_PreDec);
15982 CheckAddressOfNoDeref(InputExpr);
15995 CanOverflow = Opc == UO_Minus &&
16007 if (ConvertHalfVec)
16014 (!
Context.getLangOpts().ZVector ||
16024 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16035 Diag(OpLoc, diag::ext_integer_complement_complex)
16043 if (!
T->isIntegerType())
16044 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16047 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16063 resultType =
Context.FloatTy;
16069 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16075 if (
Context.getLangOpts().CPlusPlus) {
16080 }
else if (
Context.getLangOpts().OpenCL &&
16081 Context.getLangOpts().OpenCLVersion < 120) {
16085 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16098 Input.
get(), resultType,
16103 if (
Context.getLangOpts().OpenCL &&
16104 Context.getLangOpts().getOpenCLCompatibleVersion() < 120) {
16108 if (!
T->isIntegerType())
16109 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16115 }
else if (
Context.getLangOpts().CPlusPlus &&
16119 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16126 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
16132 resultType =
Context.getLogicalOperationType();
16160 "the co_await expression must be non-dependant before "
16161 "building operator co_await");
16172 if (Opc != UO_AddrOf && Opc != UO_Deref)
16173 CheckArrayAccess(Input.
get());
16179 if (Opc == UO_Deref && UO->getType()->hasAttr(attr::NoDeref) &&
16185 if (ConvertHalfVec)
16191 if (
DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
16192 if (!DRE->getQualifier())
16202 return Method->isImplicitObjectMemberFunction();
16208 if (!ULE->getQualifier())
16213 if (
Method->isImplicitObjectMemberFunction())
16234 if (pty->getKind() == BuiltinType::PseudoObject &&
16239 if (Opc == UO_Extension)
16244 if (Opc == UO_AddrOf &&
16245 (pty->getKind() == BuiltinType::Overload ||
16246 pty->getKind() == BuiltinType::UnknownAny ||
16247 pty->getKind() == BuiltinType::BoundMember))
16272 Expr *Input,
bool IsAfterAmp) {
16282 OpLoc, LabLoc, TheDecl,
Context.getPointerType(
Context.VoidTy));
16316 assert(!
Cleanup.exprNeedsCleanups() &&
16317 "cleanups within StmtExpr not correctly bound!");
16327 bool StmtExprMayBindToTemp =
false;
16329 if (
const auto *LastStmt = dyn_cast<ValueStmt>(Compound->
body_back())) {
16330 if (
const Expr *
Value = LastStmt->getExprStmt()) {
16331 StmtExprMayBindToTemp =
true;
16339 Expr *ResStmtExpr =
16341 if (StmtExprMayBindToTemp)
16343 return ResStmtExpr;
16366 auto *Cast = dyn_cast<ImplicitCastExpr>(E);
16367 if (Cast && Cast->getCastKind() == CK_ARCConsumeObject)
16368 return Cast->getSubExpr();
16389 return ExprError(
Diag(BuiltinLoc, diag::err_offsetof_record_type)
16390 << ArgTy << TypeRange);
16396 diag::err_offsetof_incomplete_type, TypeRange))
16399 bool DidWarnAboutNonPOD =
false;
16404 if (OC.isBrackets) {
16409 return ExprError(
Diag(OC.LocEnd, diag::err_offsetof_array_type)
16413 CurrentType =
Context.DependentTy;
16429 Comps.push_back(
OffsetOfNode(OC.LocStart, Exprs.size(), OC.LocEnd));
16430 Exprs.push_back(Idx);
16438 Comps.push_back(
OffsetOfNode(OC.LocStart, OC.U.IdentInfo, OC.LocEnd));
16439 CurrentType =
Context.DependentTy;
16445 diag::err_offsetof_incomplete_type))
16451 return ExprError(
Diag(OC.LocEnd, diag::err_offsetof_record_type)
16462 bool IsSafe =
LangOpts.CPlusPlus11? CRD->isStandardLayout() : CRD->isPOD();
16464 LangOpts.CPlusPlus11? diag::ext_offsetof_non_standardlayout_type
16465 : diag::ext_offsetof_non_pod_type;
16468 Diag(BuiltinLoc, DiagID)
16469 <<
SourceRange(Components[0].LocStart, OC.LocEnd) << CurrentType;
16470 DidWarnAboutNonPOD =
true;
16481 MemberDecl = IndirectMemberDecl->getAnonField();
16489 Diag(BuiltinLoc, diag::err_no_member)
16490 << OC.U.IdentInfo << RD <<
SourceRange(OC.LocStart, OC.LocEnd);
16499 Diag(OC.LocEnd, diag::err_offsetof_bitfield)
16507 if (IndirectMemberDecl)
16514 Context.getCanonicalTagType(Parent), Paths)) {
16516 Diag(OC.LocEnd, diag::err_offsetof_field_of_virtual_base)
16527 if (IndirectMemberDecl) {
16528 for (
auto *FI : IndirectMemberDecl->chain()) {
16534 Comps.push_back(
OffsetOfNode(OC.LocStart, MemberDecl, OC.LocEnd));
16540 Comps, Exprs, RParenLoc);
16566 assert((CondExpr && LHSExpr && RHSExpr) &&
"Missing type argument(s)");
16571 bool CondIsTrue =
false;
16573 resType =
Context.DependentTy;
16576 llvm::APSInt condEval(32);
16578 CondExpr, &condEval, diag::err_typecheck_choose_expr_requires_constant);
16581 CondExpr = CondICE.
get();
16582 CondIsTrue = condEval.getZExtValue();
16585 Expr *ActiveExpr = CondIsTrue ? LHSExpr : RHSExpr;
16587 resType = ActiveExpr->
getType();
16593 resType,
VK, OK, RPLoc, CondIsTrue);
16605 Decl *ManglingContextDecl;
16606 std::tie(MCtx, ManglingContextDecl) =
16610 Block->setBlockMangling(ManglingNumber, ManglingContextDecl);
16632 "block-id should have no identifier!");
16643 assert(
T->isFunctionType() &&
16644 "GetTypeForDeclarator made a non-function block signature");
16660 unsigned Size =
Result.getFullDataSize();
16661 Sig =
Context.CreateTypeSourceInfo(
Result.getType(), Size);
16672 QualType RetTy = Fn->getReturnType();
16682 if (RetTy !=
Context.DependentTy) {
16690 if (ExplicitSignature) {
16691 for (
unsigned I = 0, E = ExplicitSignature.
getNumParams(); I != E; ++I) {
16693 if (Param->getIdentifier() ==
nullptr && !Param->isImplicit() &&
16697 Diag(Param->getLocation(), diag::ext_parameter_name_omitted_c23);
16699 Params.push_back(Param);
16705 for (
const auto &I : Fn->param_types()) {
16708 Params.push_back(Param);
16713 if (!Params.empty()) {
16724 AI->setOwningFunction(CurBlock->
TheDecl);
16727 if (AI->getIdentifier()) {
16733 if (AI->isInvalidDecl())
16752 Diag(CaretLoc, diag::err_blocks_disable) <<
LangOpts.OpenCL;
16757 assert(!
Cleanup.exprNeedsCleanups() &&
16758 "cleanups within block not correctly bound!");
16773 bool NoReturn = BD->
hasAttr<NoReturnAttr>();
16781 if (NoReturn && !Ext.getNoReturn()) Ext = Ext.
withNoReturn(
true);
16787 BlockTy =
Context.getFunctionType(RetTy, {}, EPI);
16808 BlockTy =
Context.getFunctionType(RetTy, {}, EPI);
16812 BlockTy =
Context.getBlockPointerType(BlockTy);
16816 !
PP.isCodeCompletionEnabled())
16821 if (Body &&
getCurFunction()->HasPotentialAvailabilityViolations)
16847 Expr *CopyExpr =
nullptr;
16874 if (!
Result.isInvalid() &&
16875 !
Result.get()->getType().isConstQualified()) {
16877 Result.get()->getType().withConst(),
16881 if (!
Result.isInvalid()) {
16891 if (!
Result.isInvalid() &&
16895 CopyExpr =
Result.get();
16902 Captures.push_back(NewCap);
16916 if (
Result->getBlockDecl()->hasCaptures()) {
16919 Cleanup.setExprNeedsCleanups(
true);
16923 for (
const auto &CI :
Result->getBlockDecl()->captures()) {
16924 const VarDecl *var = CI.getVariable();
16939 {Result},
Result->getType());
16953 Expr *OrigExpr = E;
16967 Context.getTargetInfo().getTriple().isNVPTX())
16990 VaListType =
Context.getArrayDecayedType(VaListType);
17002 if (
Init.isInvalid())
17018 diag::err_first_argument_to_va_arg_not_of_type_va_list)
17023 diag::err_second_parameter_to_va_arg_incomplete,
17029 diag::err_second_parameter_to_va_arg_abstract,
17036 ? diag::warn_second_parameter_to_va_arg_ownership_qualified
17037 : diag::warn_second_parameter_to_va_arg_not_pod)
17044 PDiag(diag::warn_second_parameter_to_va_arg_array)
17077 UnderlyingType = ED->getIntegerType();
17078 if (
Context.typesAreCompatible(PromoteType, UnderlyingType,
17091 ?
Context.getCorrespondingSignedType(UnderlyingType)
17092 :
Context.getCorrespondingUnsignedType(UnderlyingType);
17093 if (
Context.typesAreCompatible(PromoteType, UnderlyingType,
17099 PromoteType =
Context.DoubleTy;
17100 if (!PromoteType.
isNull())
17102 PDiag(diag::warn_second_parameter_to_va_arg_never_compatible)
17117 if (pw ==
Context.getTargetInfo().getIntWidth())
17119 else if (pw ==
Context.getTargetInfo().getLongWidth())
17121 else if (pw ==
Context.getTargetInfo().getLongLongWidth())
17124 llvm_unreachable(
"I don't know size of pointer!");
17141 if ((SLDecl->isCompleteDefinition() || SLDecl->isBeingDefined()) &&
17150 S.
Diag(Loc, diag::err_std_source_location_impl_not_found);
17158 S.
Diag(Loc, diag::err_std_source_location_impl_malformed);
17162 unsigned Count = 0;
17164 StringRef Name = F->getName();
17166 if (Name ==
"_M_file_name") {
17167 if (F->getType() !=
17171 }
else if (Name ==
"_M_function_name") {
17172 if (F->getType() !=
17176 }
else if (Name ==
"_M_line") {
17177 if (!F->getType()->isIntegerType())
17180 }
else if (Name ==
"_M_column") {
17181 if (!F->getType()->isIntegerType())
17190 S.
Diag(Loc, diag::err_std_source_location_impl_malformed);
17213 ResultTy =
Context.UnsignedIntTy;
17222 ResultTy =
Context.getPointerType(
17241 Data->BinaryData = BinaryData;
17245 Data->getDataElementCount());
17249 const Expr *SrcExpr) {
17258 auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl());
17271 bool *Complained) {
17273 *Complained =
false;
17276 bool CheckInferredResultType =
false;
17278 unsigned DiagKind = 0;
17280 bool MayHaveConvFixit =
false;
17281 bool MayHaveFunctionDiff =
false;
17292 DiagKind = diag::warn_compatible_implicit_pointer_conv;
17296 DiagKind = diag::err_typecheck_convert_pointer_int;
17299 DiagKind = diag::ext_typecheck_convert_pointer_int;
17302 MayHaveConvFixit =
true;
17306 DiagKind = diag::err_typecheck_convert_int_pointer;
17309 DiagKind = diag::ext_typecheck_convert_int_pointer;
17312 MayHaveConvFixit =
true;
17316 diag::warn_typecheck_convert_incompatible_function_pointer_strict;
17318 MayHaveConvFixit =
true;
17322 DiagKind = diag::err_typecheck_convert_incompatible_function_pointer;
17325 DiagKind = diag::ext_typecheck_convert_incompatible_function_pointer;
17328 MayHaveConvFixit =
true;
17332 DiagKind = diag::err_arc_typecheck_convert_incompatible_pointer;
17334 DiagKind = diag::err_typecheck_convert_incompatible_pointer;
17337 DiagKind = diag::ext_typecheck_convert_incompatible_pointer;
17341 if (CheckInferredResultType) {
17347 MayHaveConvFixit =
true;
17351 DiagKind = diag::err_typecheck_convert_incompatible_pointer_sign;
17354 DiagKind = diag::ext_typecheck_convert_incompatible_pointer_sign;
17359 DiagKind = diag::err_typecheck_convert_pointer_void_func;
17362 DiagKind = diag::ext_typecheck_convert_pointer_void_func;
17374 DiagKind = diag::err_typecheck_incompatible_address_space;
17377 DiagKind = diag::err_typecheck_incompatible_ownership;
17380 DiagKind = diag::err_typecheck_incompatible_ptrauth;
17384 llvm_unreachable(
"unknown error case for discarding qualifiers!");
17401 DiagKind = diag::err_typecheck_convert_discards_qualifiers;
17404 DiagKind = diag::ext_typecheck_convert_discards_qualifiers;
17411 DiagKind = diag::err_nested_pointer_qualifier_mismatch;
17413 DiagKind = diag::ext_nested_pointer_qualifier_mismatch;
17417 DiagKind = diag::err_typecheck_incompatible_nested_address_space;
17421 DiagKind = diag::err_int_to_block_pointer;
17425 DiagKind = diag::err_typecheck_convert_incompatible_block_pointer;
17432 for (
auto *srcProto : srcOPT->
quals()) {
17438 IFace = IFaceT->getDecl();
17443 for (
auto *dstProto : dstOPT->
quals()) {
17449 IFace = IFaceT->getDecl();
17452 DiagKind = diag::err_incompatible_qualified_id;
17455 DiagKind = diag::warn_incompatible_qualified_id;
17461 DiagKind = diag::err_incompatible_vectors;
17464 DiagKind = diag::warn_incompatible_vectors;
17468 DiagKind = diag::err_arc_weak_unavailable_assign;
17474 *Complained =
true;
17478 DiagKind = diag::err_typecheck_convert_incompatible;
17480 MayHaveConvFixit =
true;
17482 MayHaveFunctionDiff =
true;
17491 FirstType = DstType;
17492 SecondType = SrcType;
17502 FirstType = SrcType;
17503 SecondType = DstType;
17512 FDiag << FirstType << SecondType << ActionForDiag
17515 if (DiagKind == diag::ext_typecheck_convert_incompatible_pointer_sign ||
17516 DiagKind == diag::err_typecheck_convert_incompatible_pointer_sign) {
17526 if (!ConvHints.
isNull()) {
17531 if (MayHaveConvFixit) { FDiag << (
unsigned) (ConvHints.
Kind); }
17533 if (MayHaveFunctionDiff)
17537 if ((DiagKind == diag::warn_incompatible_qualified_id ||
17538 DiagKind == diag::err_incompatible_qualified_id) &&
17540 Diag(IFace->
getLocation(), diag::note_incomplete_class_and_qualified_id)
17543 if (SecondType ==
Context.OverloadTy)
17547 if (CheckInferredResultType)
17555 *Complained =
true;
17566 return S.
Diag(Loc, diag::err_ice_not_integral)
17570 return S.
Diag(Loc, diag::err_expr_not_ice) << S.
LangOpts.CPlusPlus;
17585 IDDiagnoser(
unsigned DiagID)
17589 return S.
Diag(Loc, DiagID);
17591 } Diagnoser(DiagID);
17604 return S.
Diag(Loc, diag::ext_expr_not_ice) << S.
LangOpts.CPlusPlus;
17626 BaseDiagnoser(BaseDiagnoser) {}
17635 return S.
Diag(Loc, diag::err_ice_incomplete_type) <<
T;
17640 return S.
Diag(Loc, diag::err_ice_explicit_conversion) <<
T << ConvTy;
17651 return S.
Diag(Loc, diag::err_ice_ambiguous_conversion) <<
T;
17662 llvm_unreachable(
"conversion functions are permitted");
17664 } ConvertDiagnoser(Diagnoser);
17670 E = Converted.
get();
17691 E = RValueExpr.
get();
17709 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
17710 diag::note_invalid_subexpr_in_const_expr) {
17711 DiagLoc = Notes[0].first;
17733 EvalResult.
Diag = &Notes;
17757 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
17758 diag::note_invalid_subexpr_in_const_expr) {
17759 DiagLoc = Notes[0].first;
17785 class TransformToPE :
public TreeTransform<TransformToPE> {
17789 TransformToPE(
Sema &SemaRef) : BaseTransform(SemaRef) { }
17792 bool AlwaysRebuild() {
return true; }
17793 bool ReplacingOriginal() {
return true; }
17802 ExprResult TransformDeclRefExpr(DeclRefExpr *E) {
17804 !SemaRef.isUnevaluatedContext())
17806 diag::err_invalid_non_static_member_use)
17809 return BaseTransform::TransformDeclRefExpr(E);
17813 ExprResult TransformUnaryOperator(UnaryOperator *E) {
17817 return BaseTransform::TransformUnaryOperator(E);
17825 return SkipLambdaBody(E, Body);
17832 "Should only transform unevaluated expressions");
17837 return TransformToPE(*this).TransformExpr(E);
17842 "Should only transform unevaluated expressions");
17846 return TransformToPE(*this).TransformType(TInfo);
17854 LambdaContextDecl, ExprContext);
17868 Prev.isImmediateFunctionContext() || Prev.isConstantEvaluated();
17871 Prev.InImmediateEscalatingFunctionContext;
17929 if (
const auto *E = dyn_cast<UnaryOperator>(PossibleDeref)) {
17930 if (E->getOpcode() == UO_Deref)
17931 return CheckPossibleDeref(S, E->getSubExpr());
17932 }
else if (
const auto *E = dyn_cast<ArraySubscriptExpr>(PossibleDeref)) {
17933 return CheckPossibleDeref(S, E->getBase());
17934 }
else if (
const auto *E = dyn_cast<MemberExpr>(PossibleDeref)) {
17935 return CheckPossibleDeref(S, E->getBase());
17936 }
else if (
const auto E = dyn_cast<DeclRefExpr>(PossibleDeref)) {
17939 if (
const auto *Ptr = Ty->
getAs<PointerType>())
17942 Inner = Arr->getElementType();
17946 if (Inner->
hasAttr(attr::NoDeref))
17956 const DeclRefExpr *DeclRef = CheckPossibleDeref(*
this, E);
17963 Diag(E->
getExprLoc(), diag::warn_dereference_of_noderef_type_no_decl)
17978 if (BO->getOpcode() == BO_Assign) {
17980 llvm::erase(LHSs, BO->getLHS());
17988 "Cannot mark an immediate escalating expression outside of an "
17989 "immediate escalating context");
17992 if (
auto *DeclRef =
17993 dyn_cast<DeclRefExpr>(
Call->getCallee()->IgnoreImplicit()))
17994 DeclRef->setIsImmediateEscalating(
true);
17995 }
else if (
auto *Ctr = dyn_cast<CXXConstructExpr>(E->
IgnoreImplicit())) {
17996 Ctr->setIsImmediateEscalating(
true);
17997 }
else if (
auto *DeclRef = dyn_cast<DeclRefExpr>(E->
IgnoreImplicit())) {
17998 DeclRef->setIsImmediateEscalating(
true);
18000 assert(
false &&
"expected an immediately escalating expression");
18003 FI->FoundImmediateEscalatingExpression =
true;
18018 if (
auto *DeclRef =
18019 dyn_cast<DeclRefExpr>(
Call->getCallee()->IgnoreImplicit()))
18028 auto CheckConstantExpressionAndKeepResult = [&]() {
18031 Eval.
Diag = &Notes;
18033 Eval,
getASTContext(), ConstantExprKind::ImmediateInvocation);
18034 if (Res && Notes.empty()) {
18035 Cached = std::move(Eval.
Val);
18043 !CheckConstantExpressionAndKeepResult()) {
18048 if (
Cleanup.exprNeedsCleanups()) {
18065 Cleanup.cleanupsHaveSideEffects(), {});
18078 ExprEvalContexts.back().ImmediateInvocationCandidates.emplace_back(Res, 0);
18086 Eval.
Diag = &Notes;
18090 if (!Result || !Notes.empty()) {
18093 if (
auto *
FunctionalCast = dyn_cast<CXXFunctionalCastExpr>(InnerExpr))
18096 if (
auto *
Call = dyn_cast<CallExpr>(InnerExpr))
18098 else if (
auto *
Call = dyn_cast<CXXConstructExpr>(InnerExpr))
18099 FD =
Call->getConstructor();
18100 else if (
auto *Cast = dyn_cast<CastExpr>(InnerExpr))
18101 FD = dyn_cast_or_null<FunctionDecl>(Cast->getConversionFunction());
18104 "could not find an immediate function in this expression");
18111 SemaRef.
Diag(Context->Loc, diag::note_invalid_consteval_initializer)
18113 SemaRef.
Diag(Context->Decl->getBeginLoc(), diag::note_declared_at);
18117 for (
auto &
Note : Notes)
18129 llvm::SmallPtrSetImpl<DeclRefExpr *> &DRSet;
18133 ComplexRemove(
Sema &SemaRef, llvm::SmallPtrSetImpl<DeclRefExpr *> &DR,
18137 :
Base(SemaRef), DRSet(DR), IISet(II), CurrentII(Current) {}
18139 auto It = std::find_if(CurrentII, IISet.rend(),
18141 return Elem.getPointer() == E;
18147 if (It == IISet.rend()) {
18149 CurrentII->setInt(1);
18156 return Base::TransformConstantExpr(E);
18157 RemoveImmediateInvocation(E);
18158 return Base::TransformExpr(E->
getSubExpr());
18164 return Base::TransformCXXOperatorCallExpr(E);
18178 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(
Init))
18179 Init = ICE->getSubExpr();
18180 else if (
auto *ICE = dyn_cast<MaterializeTemporaryExpr>(
Init))
18181 Init = ICE->getSubExpr();
18187 if (
auto *CE = dyn_cast<ConstantExpr>(
Init);
18188 CE && CE->isImmediateInvocation())
18189 RemoveImmediateInvocation(CE);
18190 return Base::TransformInitializer(
Init, NotCopyInit);
18201 bool AlwaysRebuild() {
return false; }
18202 bool ReplacingOriginal() {
return true; }
18203 bool AllowSkippingCXXConstructExpr() {
18204 bool Res = AllowSkippingFirstCXXConstructExpr;
18205 AllowSkippingFirstCXXConstructExpr =
true;
18208 bool AllowSkippingFirstCXXConstructExpr =
true;
18219 Transformer.AllowSkippingFirstCXXConstructExpr =
false;
18221 ExprResult Res = Transformer.TransformExpr(It->getPointer()->getSubExpr());
18227 It->getPointer()->setSubExpr(Res.
get());
18248 VD->hasConstantInitialization()) {
18281 llvm::SmallPtrSetImpl<DeclRefExpr *> &DRSet;
18282 SimpleRemove(llvm::SmallPtrSetImpl<DeclRefExpr *> &S) : DRSet(S) {}
18285 return DRSet.size();
18288 Visitor.TraverseStmt(
18298 if (DR->isImmediateEscalating())
18302 if (
const auto *MD = dyn_cast<CXXMethodDecl>(ND);
18304 ND = MD->getParent();
18311 bool ImmediateEscalating =
false;
18312 bool IsPotentiallyEvaluated =
18322 SemaRef.
Diag(DR->getBeginLoc(), diag::err_invalid_consteval_take_address)
18323 << ND << isa<CXXRecordDecl>(ND) << FD->isConsteval();
18324 if (!FD->getBuiltinID())
18328 SemaRef.
Diag(Context->Loc, diag::note_invalid_consteval_initializer)
18330 SemaRef.
Diag(Context->Decl->getBeginLoc(), diag::note_declared_at);
18332 if (FD->isImmediateEscalating() && !FD->isConsteval())
18346 (Rec.
ExprContext == ExpressionKind::EK_TemplateArgument ||
18354 D = diag::err_lambda_unevaluated_operand;
18360 D = diag::err_lambda_in_constant_expression;
18361 }
else if (Rec.
ExprContext == ExpressionKind::EK_TemplateArgument) {
18364 D = diag::err_lambda_in_invalid_context;
18366 llvm_unreachable(
"Couldn't infer lambda error message.");
18368 for (
const auto *L : Rec.
Lambdas)
18369 Diag(L->getBeginLoc(), D);
18389 Diag(BO->getBeginLoc(), diag::warn_deprecated_simple_assign_volatile)
18460 llvm_unreachable(
"Invalid context");
18506 : FD(FD), Param(Param) {}
18513 CCName =
"stdcall";
18516 CCName =
"fastcall";
18519 CCName =
"vectorcall";
18522 llvm_unreachable(
"CC does not need mangling");
18525 S.
Diag(Loc, diag::err_cconv_incomplete_param_type)
18526 << Param->getDeclName() << FD->
getDeclName() << CCName;
18531 ParamIncompleteTypeDiagnoser Diagnoser(FD, Param);
18537enum class OdrUseContext {
18556 if (Context.isUnevaluated())
18557 return OdrUseContext::None;
18560 return OdrUseContext::Dependent;
18562 if (Context.isDiscardedStatementContext())
18563 return OdrUseContext::FormallyOdrUsed;
18565 else if (Context.Context ==
18567 return OdrUseContext::FormallyOdrUsed;
18569 return OdrUseContext::Used;
18573 if (!
Func->isConstexpr())
18576 if (
Func->isImplicitlyInstantiable() || !
Func->isUserProvided())
18583 auto *CCD = dyn_cast<CXXConstructorDecl>(
Func);
18584 return CCD && CCD->getInheritedConstructor();
18588 bool MightBeOdrUse) {
18589 assert(
Func &&
"No function?");
18591 Func->setReferenced();
18604 OdrUseContext OdrUse =
18606 if (IsRecursiveCall && OdrUse == OdrUseContext::Used)
18607 OdrUse = OdrUseContext::FormallyOdrUsed;
18611 if (
Func->isTrivial() && !
Func->hasAttr<DLLExportAttr>() &&
18612 OdrUse == OdrUseContext::Used) {
18615 OdrUse = OdrUseContext::FormallyOdrUsed;
18617 OdrUse = OdrUseContext::FormallyOdrUsed;
18624 bool NeededForConstantEvaluation =
18649 bool NeedDefinition =
18650 !IsRecursiveCall &&
18651 (OdrUse == OdrUseContext::Used ||
18652 (NeededForConstantEvaluation && !
Func->isPureVirtual()));
18659 if (NeedDefinition &&
18661 Func->getMemberSpecializationInfo()))
18668 if (NeedDefinition && !
Func->getBody()) {
18671 dyn_cast<CXXConstructorDecl>(
Func)) {
18684 }
else if (
Constructor->getInheritedConstructor()) {
18688 dyn_cast<CXXDestructorDecl>(
Func)) {
18698 if (MethodDecl->isOverloadedOperator() &&
18699 MethodDecl->getOverloadedOperator() == OO_Equal) {
18701 if (MethodDecl->isDefaulted() && !MethodDecl->isDeleted()) {
18702 if (MethodDecl->isCopyAssignmentOperator())
18704 else if (MethodDecl->isMoveAssignmentOperator())
18708 MethodDecl->getParent()->isLambda()) {
18715 }
else if (MethodDecl->isVirtual() &&
getLangOpts().AppleKext)
18719 if (
Func->isDefaulted() && !
Func->isDeleted()) {
18727 if (
Func->isImplicitlyInstantiable()) {
18729 Func->getTemplateSpecializationKindForInstantiation();
18731 bool FirstInstantiation = PointOfInstantiation.
isInvalid();
18732 if (FirstInstantiation) {
18733 PointOfInstantiation = Loc;
18734 if (
auto *MSI =
Func->getMemberSpecializationInfo())
18735 MSI->setPointOfInstantiation(Loc);
18738 Func->setTemplateSpecializationKind(TSK, PointOfInstantiation);
18743 PointOfInstantiation = Loc;
18747 Func->isConstexpr()) {
18752 std::make_pair(
Func, PointOfInstantiation));
18753 else if (
Func->isConstexpr())
18759 Func->setInstantiationIsPending(
true);
18761 std::make_pair(
Func, PointOfInstantiation));
18762 if (llvm::isTimeTraceVerbose()) {
18763 llvm::timeTraceAddInstantEvent(
"DeferInstantiation", [&] {
18765 llvm::raw_string_ostream
OS(Name);
18772 Consumer.HandleCXXImplicitFunctionInstantiation(
Func);
18777 for (
auto *i :
Func->redecls()) {
18778 if (!i->isUsed(
false) && i->isImplicitlyInstantiable())
18796 if (
Init->isInClassMemberInitializer())
18798 MarkDeclarationsReferencedInExpr(Init->getInit());
18819 if (
LangOpts.OffloadImplicitHostDeviceTemplates &&
LangOpts.CUDAIsDevice &&
18824 if (OdrUse == OdrUseContext::Used && !
Func->isUsed(
false)) {
18826 if (!
Func->isDefined() && !
Func->isInAnotherModuleUnit()) {
18827 if (mightHaveNonExternalLinkage(
Func))
18829 else if (
Func->getMostRecentDecl()->isInlined() &&
18831 !
Func->getMostRecentDecl()->hasAttr<GNUInlineAttr>())
18849 if (
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
18850 if (
auto *Dtor = dyn_cast<CXXDestructorDecl>(
Func)) {
18870 const unsigned *
const FunctionScopeIndexToStopAt =
nullptr) {
18873 VarDecl *Var =
V->getPotentiallyDecomposedVarDecl();
18874 assert(Var &&
"expected a capturable variable");
18884 QualType CaptureType, DeclRefType;
18890 DeclRefType, FunctionScopeIndexToStopAt);
18905 << 2 << 1 << Var << UserTarget;
18908 ? diag::note_cuda_const_var_unpromoted
18909 : diag::note_cuda_host_var);
18912 !Var->
hasAttr<CUDASharedAttr>() &&
18928 (!FD || (!FD->getDescribedFunctionTemplate() &&
18940 unsigned CapturingScopeIndex) {
18967 unsigned ContextKind = 3;
18977 S.
Diag(loc, diag::err_reference_to_local_in_enclosing_context)
18978 << var << ValueKind << ContextKind << VarDC;
18979 S.
Diag(var->getLocation(), diag::note_entity_declared_at)
18988 bool &SubCapturesAreNested,
18994 SubCapturesAreNested =
true;
19047 "Only variables and structured bindings can be captured");
19058 S.
Diag(Loc, diag::err_lambda_capture_anonymous_var);
19067 S.
Diag(Loc, diag::err_ref_vm_type);
19078 S.
Diag(Loc, diag::err_ref_flexarray_type);
19080 S.
Diag(Loc, diag::err_lambda_capture_flexarray_type) << Var;
19085 const bool HasBlocksAttr = Var->
hasAttr<BlocksAttr>();
19090 S.
Diag(Loc, diag::err_capture_block_variable) << Var << !IsLambda;
19099 S.
Diag(Loc, diag::err_opencl_block_ref_block);
19110 ? diag::warn_cxx17_compat_capture_binding
19111 : diag::ext_capture_binding)
19125 bool ByRef =
false;
19131 if (BuildAndDiagnose) {
19132 S.
Diag(Loc, diag::err_ref_array_type);
19143 if (BuildAndDiagnose) {
19144 S.
Diag(Loc, diag::err_arc_autoreleasing_capture)
19160 if (BuildAndDiagnose) {
19162 S.
Diag(Loc, diag::warn_block_capture_autoreleasing);
19163 S.
Diag(VarLoc, diag::note_declare_parameter_strong);
19168 const bool HasBlocksAttr = Var->
hasAttr<BlocksAttr>();
19177 DeclRefType = CaptureType;
19181 if (BuildAndDiagnose)
19191 const bool BuildAndDiagnose,
QualType &CaptureType,
QualType &DeclRefType,
19192 const bool RefersToCapturedVariable,
TryCaptureKind Kind,
bool IsTopScope,
19218 CaptureType = DeclRefType;
19221 if (BuildAndDiagnose)
19222 RSI->
addCapture(Var,
false, ByRef, RefersToCapturedVariable,
19232 const bool RefersToCapturedVariable,
19237 bool ByRef =
false;
19241 ByRef = (LSI->
ImpCaptureStyle == LambdaScopeInfo::ImpCap_LambdaByref);
19246 S.
Diag(Loc, diag::err_wasm_ca_reference) << 0;
19277 if (!RefType->getPointeeType()->isFunctionType())
19284 if (BuildAndDiagnose) {
19285 S.
Diag(Loc, diag::err_arc_autoreleasing_capture) << 1;
19295 if (!
Invalid && BuildAndDiagnose) {
19299 diag::err_capture_of_incomplete_or_sizeless_type,
19303 diag::err_capture_of_abstract_type))
19329 if (BuildAndDiagnose)
19330 LSI->
addCapture(Var,
false, ByRef, RefersToCapturedVariable,
19331 Loc, EllipsisLoc, CaptureType,
Invalid);
19342 if (
T.isTriviallyCopyableType(Context))
19346 if (!(RD = RD->getDefinition()))
19348 if (RD->hasSimpleCopyConstructor())
19350 if (RD->hasUserDeclaredCopyConstructor())
19352 if (Ctor->isCopyConstructor())
19353 return !Ctor->isDeleted();
19373 if (ShouldOfferCopyFix) {
19377 FixBuffer.assign({Separator, Var->
getName()});
19378 Sema.
Diag(VarInsertLoc, diag::note_lambda_variable_capture_fixit)
19383 FixBuffer.assign({Separator,
"&", Var->
getName()});
19384 Sema.
Diag(VarInsertLoc, diag::note_lambda_variable_capture_fixit)
19396 return !C.isThisCapture() && !C.isInitCapture();
19405 if (ShouldOfferCopyFix) {
19406 bool CanDefaultCopyCapture =
true;
19415 if (CanDefaultCopyCapture && llvm::none_of(LSI->
Captures, [](
Capture &
C) {
19416 return !C.isThisCapture() && !C.isInitCapture() && C.isCopyCapture();
19418 FixBuffer.assign({
"=", Separator});
19419 Sema.
Diag(DefaultInsertLoc, diag::note_lambda_default_capture_fixit)
19428 return !C.isInitCapture() && C.isReferenceCapture() &&
19429 !C.isThisCapture();
19431 FixBuffer.assign({
"&", Separator});
19432 Sema.
Diag(DefaultInsertLoc, diag::note_lambda_default_capture_fixit)
19441 QualType &DeclRefType,
const unsigned *
const FunctionScopeIndexToStopAt) {
19464 const auto *VD = dyn_cast<VarDecl>(Var);
19466 if (VD->isInitCapture())
19471 assert(VD &&
"Cannot capture a null variable");
19473 const unsigned MaxFunctionScopesIndex = FunctionScopeIndexToStopAt
19477 if (FunctionScopeIndexToStopAt) {
19478 assert(!
FunctionScopes.empty() &&
"No function scopes to stop at?");
19483 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(
FunctionScopes[FSIndex]);
19484 FSIndex && LSI && !LSI->AfterParameterList)
19486 assert(MaxFunctionScopesIndex <= FSIndex &&
19487 "FunctionScopeIndexToStopAt should be no greater than FSIndex into "
19488 "FunctionScopes.");
19489 while (FSIndex != MaxFunctionScopesIndex) {
19497 bool IsGlobal = !VD->hasLocalStorage();
19498 if (IsGlobal && !(
LangOpts.OpenMP &&
19499 OpenMP().isOpenMPCapturedDecl(Var,
true,
19500 MaxFunctionScopesIndex)))
19514 CaptureType = Var->
getType();
19516 bool Nested =
false;
19518 unsigned FunctionScopesIndex = MaxFunctionScopesIndex;
19523 LSI = dyn_cast_or_null<LambdaScopeInfo>(
19526 bool IsInScopeDeclarationContext =
19537 if (IsInScopeDeclarationContext &&
19538 FunctionScopesIndex == MaxFunctionScopesIndex && VarDC == DC)
19544 !IsInScopeDeclarationContext
19547 BuildAndDiagnose, *
this);
19553 FunctionScopesIndex = MaxFunctionScopesIndex - 1;
19572 if (
const auto *Parm = dyn_cast<ParmVarDecl>(Var);
19573 Parm && Parm->getDeclContext() == DC)
19581 if (BuildAndDiagnose) {
19584 Diag(ExprLoc, diag::err_lambda_impcap) << Var;
19599 if (
ParmVarDecl *PVD = dyn_cast_or_null<ParmVarDecl>(Var))
19600 QTy = PVD->getOriginalType();
19605 if (
auto *RSI = dyn_cast<CapturedRegionScopeInfo>(CSI)) {
19612 if (BuildAndDiagnose) {
19613 Diag(ExprLoc, diag::err_capture_binding_openmp) << Var;
19619 Var, RSI->OpenMPLevel, RSI->OpenMPCaptureLevel);
19624 if (IsOpenMPPrivateDecl != OMPC_unknown &&
19627 if (
ParmVarDecl *PVD = dyn_cast_or_null<ParmVarDecl>(Var))
19628 QTy = PVD->getOriginalType();
19630 E =
OpenMP().getNumberOfConstructScopes(RSI->OpenMPLevel);
19634 assert(RSI->OpenMPLevel == OuterRSI->OpenMPLevel &&
19635 "Wrong number of captured regions associated with the "
19636 "OpenMP construct.");
19641 IsOpenMPPrivateDecl != OMPC_private &&
19643 RSI->OpenMPCaptureLevel);
19647 Var, RSI->OpenMPLevel, RSI->OpenMPCaptureLevel);
19653 OpenMP().adjustOpenMPTargetScopeIndex(FunctionScopesIndex,
19656 if (IsTargetCap || IsOpenMPPrivateDecl == OMPC_private ||
19657 (IsGlobal && !IsGlobalCap)) {
19658 Nested = !IsTargetCap;
19664 CaptureType =
Context.getLValueReferenceType(DeclRefType);
19673 if (BuildAndDiagnose) {
19674 Diag(ExprLoc, diag::err_lambda_impcap) << Var;
19696 FunctionScopesIndex--;
19697 if (IsInScopeDeclarationContext)
19699 }
while (!VarDC->
Equals(DC));
19707 for (
unsigned I = ++FunctionScopesIndex, N = MaxFunctionScopesIndex + 1; I != N;
19720 if (
Invalid && !BuildAndDiagnose)
19725 DeclRefType, Nested, *
this,
Invalid);
19729 RSI, Var, ExprLoc, BuildAndDiagnose, CaptureType, DeclRefType, Nested,
19730 Kind, I == N - 1, *
this,
Invalid);
19736 DeclRefType, Nested, Kind, EllipsisLoc,
19741 if (
Invalid && !BuildAndDiagnose)
19753 DeclRefType,
nullptr);
19761 false, CaptureType, DeclRefType,
nullptr);
19765 assert(Var &&
"Null value cannot be captured");
19772 false, CaptureType, DeclRefType,
19776 return DeclRefType;
19784class CopiedTemplateArgs {
19788 template<
typename RefExpr>
19789 CopiedTemplateArgs(RefExpr *E) : HasArgs(E->hasExplicitTemplateArgs()) {
19791 E->copyTemplateArgumentsInto(TemplateArgStorage);
19794#ifdef __has_cpp_attribute
19795#if __has_cpp_attribute(clang::lifetimebound)
19796 [[clang::lifetimebound]]
19800 return HasArgs ? &TemplateArgStorage :
nullptr;
19826 auto Rebuild = [&](
Expr *Sub) {
19831 auto IsPotentialResultOdrUsed = [&](
NamedDecl *D) {
19834 auto *VD = dyn_cast<VarDecl>(D);
19857 llvm_unreachable(
"unexpected non-odr-use-reason");
19861 if (VD->getType()->isReferenceType())
19863 if (
auto *RD = VD->getType()->getAsCXXRecordDecl())
19864 if (RD->hasDefinition() && RD->hasMutableFields())
19866 if (!VD->isUsableInConstantExpressions(S.
Context))
19871 if (VD->getType()->isReferenceType())
19879 auto MaybeCUDAODRUsed = [&]() ->
bool {
19885 auto *DRE = dyn_cast<DeclRefExpr>(E);
19888 auto *VD = dyn_cast<VarDecl>(DRE->getDecl());
19895 auto MarkNotOdrUsed = [&] {
19896 if (!MaybeCUDAODRUsed()) {
19899 LSI->markVariableExprAsNonODRUsed(E);
19907 case Expr::DeclRefExprClass: {
19909 if (DRE->isNonOdrUse() || IsPotentialResultOdrUsed(DRE->getDecl()))
19915 S.
Context, DRE->getQualifierLoc(), DRE->getTemplateKeywordLoc(),
19916 DRE->getDecl(), DRE->refersToEnclosingVariableOrCapture(),
19917 DRE->getNameInfo(), DRE->getType(), DRE->getValueKind(),
19918 DRE->getFoundDecl(), CopiedTemplateArgs(DRE), NOUR);
19921 case Expr::FunctionParmPackExprClass: {
19926 if (IsPotentialResultOdrUsed(D))
19937 case Expr::ArraySubscriptExprClass: {
19943 if (!
Base.isUsable())
19945 Expr *LHS = ASE->getBase() == ASE->getLHS() ?
Base.get() : ASE->getLHS();
19946 Expr *RHS = ASE->getBase() == ASE->getRHS() ?
Base.get() : ASE->getRHS();
19949 ASE->getRBracketLoc());
19952 case Expr::MemberExprClass: {
19958 if (!
Base.isUsable())
19961 S.
Context,
Base.get(), ME->isArrow(), ME->getOperatorLoc(),
19962 ME->getQualifierLoc(), ME->getTemplateKeywordLoc(),
19963 ME->getMemberDecl(), ME->getFoundDecl(), ME->getMemberNameInfo(),
19964 CopiedTemplateArgs(ME), ME->getType(), ME->getValueKind(),
19965 ME->getObjectKind(), ME->isNonOdrUse());
19968 if (ME->getMemberDecl()->isCXXInstanceMember())
19973 if (ME->isNonOdrUse() || IsPotentialResultOdrUsed(ME->getMemberDecl()))
19979 S.
Context, ME->getBase(), ME->isArrow(), ME->getOperatorLoc(),
19980 ME->getQualifierLoc(), ME->getTemplateKeywordLoc(), ME->getMemberDecl(),
19981 ME->getFoundDecl(), ME->getMemberNameInfo(), CopiedTemplateArgs(ME),
19982 ME->getType(), ME->getValueKind(), ME->getObjectKind(), NOUR);
19985 case Expr::BinaryOperatorClass: {
19987 Expr *LHS = BO->getLHS();
19988 Expr *RHS = BO->getRHS();
19990 if (BO->getOpcode() == BO_PtrMemD) {
19992 if (!Sub.isUsable())
19994 BO->setLHS(Sub.get());
19996 }
else if (BO->getOpcode() == BO_Comma) {
19998 if (!Sub.isUsable())
20000 BO->setRHS(Sub.get());
20008 case Expr::ParenExprClass: {
20011 if (!Sub.isUsable())
20013 return S.
ActOnParenExpr(PE->getLParen(), PE->getRParen(), Sub.get());
20018 case Expr::ConditionalOperatorClass: {
20029 LHS = CO->getLHS();
20031 RHS = CO->getRHS();
20033 CO->getCond(), LHS.
get(), RHS.
get());
20038 case Expr::UnaryOperatorClass: {
20040 if (UO->getOpcode() != UO_Extension)
20043 if (!Sub.isUsable())
20045 return S.
BuildUnaryOp(
nullptr, UO->getOperatorLoc(), UO_Extension,
20052 case Expr::GenericSelectionExprClass: {
20056 bool AnyChanged =
false;
20057 for (
Expr *OrigAssocExpr : GSE->getAssocExprs()) {
20058 ExprResult AssocExpr = Rebuild(OrigAssocExpr);
20062 AssocExprs.push_back(AssocExpr.
get());
20065 AssocExprs.push_back(OrigAssocExpr);
20069 void *ExOrTy =
nullptr;
20070 bool IsExpr = GSE->isExprPredicate();
20072 ExOrTy = GSE->getControllingExpr();
20074 ExOrTy = GSE->getControllingType();
20076 GSE->getGenericLoc(), GSE->getDefaultLoc(),
20077 GSE->getRParenLoc(), IsExpr, ExOrTy,
20078 GSE->getAssocTypeSourceInfos(), AssocExprs)
20086 case Expr::ChooseExprClass: {
20097 if (!LHS.
get() && !RHS.
get())
20100 LHS = CE->getLHS();
20102 RHS = CE->getRHS();
20105 RHS.
get(), CE->getRParenLoc());
20109 case Expr::ConstantExprClass: {
20112 if (!Sub.isUsable())
20119 case Expr::ImplicitCastExprClass: {
20124 switch (ICE->getCastKind()) {
20126 case CK_DerivedToBase:
20127 case CK_UncheckedDerivedToBase: {
20128 ExprResult Sub = Rebuild(ICE->getSubExpr());
20129 if (!Sub.isUsable())
20133 ICE->getValueKind(), &Path);
20190 for (
Expr *E : LocalMaybeODRUseExprs) {
20191 if (
auto *DRE = dyn_cast<DeclRefExpr>(E)) {
20193 DRE->getLocation(), *
this);
20194 }
else if (
auto *ME = dyn_cast<MemberExpr>(E)) {
20197 }
else if (
auto *FP = dyn_cast<FunctionParmPackExpr>(E)) {
20201 llvm_unreachable(
"Unexpected expression");
20206 "MarkVarDeclODRUsed failed to cleanup MaybeODRUseExprs?");
20215 const bool RefersToEnclosingScope =
20218 if (RefersToEnclosingScope) {
20233 assert(E &&
"Capture variable should be used in an expression.");
20246 "Invalid Expr argument to DoMarkVarDeclReferenced");
20257 bool UsableInConstantExpr =
20269 bool NeededForConstantEvaluation =
20272 bool NeedDefinition =
20273 OdrUse == OdrUseContext::Used || NeededForConstantEvaluation ||
20275 Var->
getType()->isUndeducedType());
20278 "Can't instantiate a partial template specialization.");
20295 bool TryInstantiating =
20299 if (TryInstantiating) {
20302 bool FirstInstantiation = PointOfInstantiation.
isInvalid();
20303 if (FirstInstantiation) {
20304 PointOfInstantiation = Loc;
20306 MSI->setPointOfInstantiation(PointOfInstantiation);
20328 if (
auto *DRE = dyn_cast_or_null<DeclRefExpr>(E))
20329 DRE->setDecl(DRE->getDecl());
20330 else if (
auto *ME = dyn_cast_or_null<MemberExpr>(E))
20331 ME->setMemberDecl(ME->getMemberDecl());
20332 }
else if (FirstInstantiation) {
20334 .push_back(std::make_pair(Var, PointOfInstantiation));
20336 bool Inserted =
false;
20338 auto Iter = llvm::find_if(
20340 return P.first == Var;
20342 if (Iter != I.end()) {
20357 .push_back(std::make_pair(Var, PointOfInstantiation));
20381 if (
DeclRefExpr *DRE = dyn_cast_or_null<DeclRefExpr>(E))
20382 if (DRE->isNonOdrUse())
20384 if (
MemberExpr *ME = dyn_cast_or_null<MemberExpr>(E))
20385 if (ME->isNonOdrUse())
20389 case OdrUseContext::None:
20394 "missing non-odr-use marking for unevaluated decl ref");
20397 case OdrUseContext::FormallyOdrUsed:
20402 case OdrUseContext::Used:
20411 case OdrUseContext::Dependent:
20429 if (OdrUse == OdrUseContext::Used) {
20430 QualType CaptureType, DeclRefType;
20436 }
else if (OdrUse == OdrUseContext::Dependent) {
20452 auto *ID = dyn_cast<DeclRefExpr>(E);
20453 if (!ID || ID->isTypeDependent() || !ID->refersToEnclosingVariableOrCapture())
20460 auto IsDependent = [&]() {
20462 auto *LSI = dyn_cast<sema::LambdaScopeInfo>(
Scope);
20467 LSI->AfterParameterList)
20470 const auto *MD = LSI->CallOperator;
20471 if (MD->getType().isNull())
20475 if (!Ty || !MD->isExplicitObjectMemberFunction() ||
20479 if (
auto *
C = LSI->CaptureMap.count(D) ? &LSI->getCapture(D) :
nullptr) {
20480 if (
C->isCopyCapture())
20485 if (LSI->ImpCaptureStyle == LambdaScopeInfo::ImpCap_LambdaByval)
20491 ID->setCapturedByCopyInLambdaWithExplicitObjectParameter(
20497 bool MightBeOdrUse,
20505 if (
VarDecl *Var = dyn_cast<VarDecl>(D)) {
20524 const MemberExpr *ME = dyn_cast<MemberExpr>(E);
20531 bool IsVirtualCall = MD->
isVirtual() &&
20533 if (!IsVirtualCall)
20550 bool OdrUse =
true;
20552 if (
Method->isVirtual() &&
20556 if (
auto *FD = dyn_cast<FunctionDecl>(E->
getDecl())) {
20561 !FD->isDependentContext())
20575 bool MightBeOdrUse =
true;
20578 if (
Method->isPureVirtual())
20579 MightBeOdrUse =
false;
20598 bool MightBeOdrUse) {
20599 if (MightBeOdrUse) {
20600 if (
auto *VD = dyn_cast<VarDecl>(D)) {
20605 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
20631bool MarkReferencedDecls::TraverseTemplateArgument(
20632 const TemplateArgument &Arg) {
20635 EnterExpressionEvaluationContext
Evaluated(
20649 MarkReferencedDecls Marker(*
this, Loc);
20650 Marker.TraverseType(
T);
20656class EvaluatedExprMarker :
public UsedDeclVisitor<EvaluatedExprMarker> {
20659 bool SkipLocalVariables;
20662 EvaluatedExprMarker(
Sema &S,
bool SkipLocalVariables,
20664 : Inherited(S), SkipLocalVariables(SkipLocalVariables), StopAt(StopAt) {}
20670 void Visit(Expr *E) {
20671 if (llvm::is_contained(StopAt, E))
20673 Inherited::Visit(E);
20676 void VisitConstantExpr(ConstantExpr *E) {
20681 void VisitDeclRefExpr(DeclRefExpr *E) {
20683 if (SkipLocalVariables) {
20684 if (VarDecl *VD = dyn_cast<VarDecl>(E->
getDecl()))
20685 if (VD->hasLocalStorage())
20695 void VisitMemberExpr(MemberExpr *E) {
20703 bool SkipLocalVariables,
20705 EvaluatedExprMarker(*
this, SkipLocalVariables, StopAt).Visit(E);
20717 (
Decl->isConstexpr() || (
Decl->isStaticDataMember() &&
20721 if (Stmts.empty()) {
20735 if (
Decl &&
Decl->isFileVarDecl()) {
20808 class CallReturnIncompleteDiagnoser :
public TypeDiagnoser {
20814 : FD(FD), CE(CE) { }
20818 S.
Diag(Loc, diag::err_call_incomplete_return)
20823 S.
Diag(Loc, diag::err_call_function_incomplete_return)
20828 } Diagnoser(FD, CE);
20841 unsigned diagnostic = diag::warn_condition_is_assignment;
20842 bool IsOrAssign =
false;
20845 if (Op->getOpcode() != BO_Assign && Op->getOpcode() != BO_OrAssign)
20848 IsOrAssign = Op->getOpcode() == BO_OrAssign;
20856 if (
ObjC().isSelfExpr(Op->getLHS()) && ME->getMethodFamily() ==
OMF_init)
20857 diagnostic = diag::warn_condition_is_idiomatic_assignment;
20861 diagnostic = diag::warn_condition_is_idiomatic_assignment;
20864 Loc = Op->getOperatorLoc();
20866 if (Op->getOperator() != OO_Equal && Op->getOperator() != OO_PipeEqual)
20869 IsOrAssign = Op->getOperator() == OO_PipeEqual;
20870 Loc = Op->getOperatorLoc();
20882 Diag(Loc, diag::note_condition_assign_silence)
20887 Diag(Loc, diag::note_condition_or_assign_to_comparison)
20890 Diag(Loc, diag::note_condition_assign_to_comparison)
20908 if (opE->getOpcode() == BO_EQ &&
20909 opE->getLHS()->IgnoreParenImpCasts()->isModifiableLvalue(
Context)
20915 Diag(Loc, diag::note_equality_comparison_silence)
20918 Diag(Loc, diag::note_equality_comparison_to_assign)
20924 bool IsConstexpr) {
20926 if (
ParenExpr *parenE = dyn_cast<ParenExpr>(E))
20943 if (!
T->isScalarType()) {
20944 Diag(Loc, diag::err_typecheck_statement_requires_scalar)
20948 CheckBoolLikeConversion(E, Loc);
20977 if (
Cond.isInvalid()) {
20985 if (!
Cond.isUsable())
20995 struct RebuildUnknownAnyFunction
20996 :
StmtVisitor<RebuildUnknownAnyFunction, ExprResult> {
21000 RebuildUnknownAnyFunction(
Sema &S) : S(S) {}
21003 llvm_unreachable(
"unexpected statement!");
21014 template <
class T>
ExprResult rebuildSugarExpr(
T *E) {
21015 ExprResult SubResult = Visit(E->getSubExpr());
21018 Expr *SubExpr = SubResult.
get();
21019 E->setSubExpr(SubExpr);
21020 E->setType(SubExpr->
getType());
21027 return rebuildSugarExpr(E);
21030 ExprResult VisitUnaryExtension(UnaryOperator *E) {
21031 return rebuildSugarExpr(E);
21034 ExprResult VisitUnaryAddrOf(UnaryOperator *E) {
21038 Expr *SubExpr = SubResult.
get();
21046 ExprResult resolveDecl(Expr *E, ValueDecl *VD) {
21064 ExprResult VisitDeclRefExpr(DeclRefExpr *E) {
21065 return resolveDecl(E, E->
getDecl());
21073 ExprResult Result = RebuildUnknownAnyFunction(S).Visit(FunctionExpr);
21074 if (Result.isInvalid())
return ExprError();
21083 struct RebuildUnknownAnyExpr
21084 : StmtVisitor<RebuildUnknownAnyExpr, ExprResult> {
21091 RebuildUnknownAnyExpr(Sema &S, QualType
CastType)
21095 llvm_unreachable(
"unexpected statement!");
21105 ExprResult VisitObjCMessageExpr(ObjCMessageExpr *E);
21109 template <
class T>
ExprResult rebuildSugarExpr(
T *E) {
21110 ExprResult SubResult = Visit(E->getSubExpr());
21112 Expr *SubExpr = SubResult.
get();
21113 E->setSubExpr(SubExpr);
21114 E->setType(SubExpr->
getType());
21121 return rebuildSugarExpr(E);
21124 ExprResult VisitUnaryExtension(UnaryOperator *E) {
21125 return rebuildSugarExpr(E);
21128 ExprResult VisitUnaryAddrOf(UnaryOperator *E) {
21129 const PointerType *Ptr = DestType->
getAs<PointerType>();
21154 ExprResult VisitImplicitCastExpr(ImplicitCastExpr *E);
21156 ExprResult resolveDecl(Expr *E, ValueDecl *VD);
21162 ExprResult VisitDeclRefExpr(DeclRefExpr *E) {
21163 return resolveDecl(E, E->
getDecl());
21169ExprResult RebuildUnknownAnyExpr::VisitCallExpr(CallExpr *E) {
21174 FK_FunctionPointer,
21179 QualType CalleeType = CalleeExpr->
getType();
21182 Kind = FK_MemberFunction;
21184 }
else if (
const PointerType *Ptr = CalleeType->
getAs<PointerType>()) {
21186 Kind = FK_FunctionPointer;
21189 Kind = FK_BlockPointer;
21191 const FunctionType *FnType = CalleeType->
castAs<FunctionType>();
21196 unsigned diagID = diag::err_func_returning_array_function;
21197 if (Kind == FK_BlockPointer)
21198 diagID = diag::err_block_returning_array_function;
21211 const FunctionProtoType *Proto = dyn_cast<FunctionProtoType>(FnType);
21233 SmallVector<QualType, 8> ArgTypes;
21234 if (ParamTypes.empty() && Proto->
isVariadic()) {
21236 for (
unsigned i = 0, e = E->
getNumArgs(); i != e; ++i) {
21239 ParamTypes = ArgTypes;
21250 case FK_MemberFunction:
21254 case FK_FunctionPointer:
21258 case FK_BlockPointer:
21264 ExprResult CalleeResult = Visit(CalleeExpr);
21272ExprResult RebuildUnknownAnyExpr::VisitObjCMessageExpr(ObjCMessageExpr *E) {
21275 S.
Diag(E->
getExprLoc(), diag::err_func_returning_array_function)
21283 Method->setReturnType(DestType);
21293ExprResult RebuildUnknownAnyExpr::VisitImplicitCastExpr(ImplicitCastExpr *E) {
21295 if (E->
getCastKind() == CK_FunctionToPointerDecay) {
21309 }
else if (E->
getCastKind() == CK_LValueToRValue) {
21326 llvm_unreachable(
"Unhandled cast type!");
21330ExprResult RebuildUnknownAnyExpr::resolveDecl(Expr *E, ValueDecl *VD) {
21332 QualType
Type = DestType;
21337 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(VD)) {
21338 if (
const PointerType *Ptr =
Type->getAs<PointerType>()) {
21346 if (!
Type->isFunctionType()) {
21351 if (
const FunctionProtoType *FT =
Type->getAs<FunctionProtoType>()) {
21355 QualType FDT = FD->getType();
21356 const FunctionType *FnType = FDT->
castAs<FunctionType>();
21357 const FunctionProtoType *Proto = dyn_cast_or_null<FunctionProtoType>(FnType);
21358 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E);
21359 if (DRE && Proto && Proto->getParamTypes().empty() && Proto->isVariadic()) {
21360 SourceLocation Loc = FD->getLocation();
21362 S.
Context, FD->getDeclContext(), Loc, Loc,
21363 FD->getNameInfo().getName(), DestType, FD->getTypeSourceInfo(),
21365 false , FD->hasPrototype(),
21368 if (FD->getQualifier())
21371 SmallVector<ParmVarDecl*, 16> Params;
21372 for (
const auto &AI : FT->param_types()) {
21373 ParmVarDecl *Param =
21376 Params.push_back(Param);
21378 NewFD->setParams(Params);
21384 if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD))
21385 if (MD->isInstance()) {
21396 if (
const ReferenceType *RefTy =
Type->getAs<ReferenceType>()) {
21397 Type = RefTy->getPointeeType();
21398 }
else if (
Type->isFunctionType()) {
21399 S.
Diag(E->
getExprLoc(), diag::err_unknown_any_var_function_type)
21425 diag::err_typecheck_cast_to_incomplete))
21440 return RebuildUnknownAnyExpr(*
this, ToType).Visit(E);
21447 ExplicitCastExpr *castArg = dyn_cast<ExplicitCastExpr>(arg->IgnoreParens());
21456 assert(!arg->hasPlaceholderType());
21468 unsigned diagID = diag::err_uncasted_use_of_unknown_any;
21471 if (
CallExpr *call = dyn_cast<CallExpr>(E)) {
21472 E = call->getCallee();
21473 diagID = diag::err_uncasted_call_of_unknown_any;
21481 if (
DeclRefExpr *ref = dyn_cast<DeclRefExpr>(E)) {
21482 loc = ref->getLocation();
21483 d = ref->getDecl();
21484 }
else if (
MemberExpr *mem = dyn_cast<MemberExpr>(E)) {
21485 loc = mem->getMemberLoc();
21486 d = mem->getMemberDecl();
21488 diagID = diag::err_uncasted_call_of_unknown_any;
21489 loc = msg->getSelectorStartLoc();
21490 d = msg->getMethodDecl();
21492 S.
Diag(loc, diag::err_uncasted_send_to_unknown_any_method)
21493 <<
static_cast<unsigned>(msg->isClassMessage()) << msg->getSelector()
21511 if (!placeholderType)
return E;
21513 switch (placeholderType->
getKind()) {
21514 case BuiltinType::UnresolvedTemplate: {
21527 if (
auto *TD = dyn_cast<TemplateDecl>(Temp))
21528 TN =
Context.getQualifiedTemplateName(NNS, ULE->hasTemplateKeyword(),
21533 Diag(NameInfo.
getLoc(), diag::err_template_kw_refers_to_type_template)
21534 << TN << ULE->getSourceRange() << IsTypeAliasTemplateDecl;
21536 << IsTypeAliasTemplateDecl;
21539 bool HasAnyDependentTA =
false;
21541 HasAnyDependentTA |= Arg.getArgument().
isDependent();
21553 TST =
Context.getTemplateSpecializationType(
21562 case BuiltinType::Overload: {
21582 case BuiltinType::BoundMember: {
21588 PD =
PDiag(diag::err_dtor_expr_without_call) << 1;
21589 }
else if (
const auto *ME = dyn_cast<MemberExpr>(BME)) {
21590 if (ME->getMemberNameInfo().getName().getNameKind() ==
21592 PD =
PDiag(diag::err_dtor_expr_without_call) << 0;
21600 case BuiltinType::ARCUnbridgedCast: {
21607 case BuiltinType::UnknownAny:
21611 case BuiltinType::PseudoObject:
21614 case BuiltinType::BuiltinFn: {
21619 unsigned BuiltinID = FD->getBuiltinID();
21620 if (BuiltinID == Builtin::BI__noop) {
21622 CK_BuiltinFnToFnPtr)
21629 if (
Context.BuiltinInfo.isInStdNamespace(BuiltinID)) {
21635 ? diag::err_use_of_unaddressable_function
21636 : diag::warn_cxx20_compat_use_of_unaddressable_function);
21637 if (FD->isImplicitlyInstantiable()) {
21664 case BuiltinType::IncompleteMatrixIdx: {
21670 MS->getBase(), MS->getRowIdx(), E->
getExprLoc());
21672 Diag(MS->getRowIdx()->getBeginLoc(), diag::err_matrix_incomplete_index);
21677 case BuiltinType::ArraySection:
21686 case BuiltinType::OMPArrayShaping:
21689 case BuiltinType::OMPIterator:
21693#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
21694 case BuiltinType::Id:
21695#include "clang/Basic/OpenCLImageTypes.def"
21696#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
21697 case BuiltinType::Id:
21698#include "clang/Basic/OpenCLExtensionTypes.def"
21699#define SVE_TYPE(Name, Id, SingletonId) \
21700 case BuiltinType::Id:
21701#include "clang/Basic/AArch64ACLETypes.def"
21702#define PPC_VECTOR_TYPE(Name, Id, Size) \
21703 case BuiltinType::Id:
21704#include "clang/Basic/PPCTypes.def"
21705#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
21706#include "clang/Basic/RISCVVTypes.def"
21707#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
21708#include "clang/Basic/WebAssemblyReferenceTypes.def"
21709#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
21710#include "clang/Basic/AMDGPUTypes.def"
21711#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
21712#include "clang/Basic/HLSLIntangibleTypes.def"
21713#define BUILTIN_TYPE(Id, SingletonId) case BuiltinType::Id:
21714#define PLACEHOLDER_TYPE(Id, SingletonId)
21715#include "clang/AST/BuiltinTypes.def"
21719 llvm_unreachable(
"invalid placeholder type!");
21732 if (!
Context.getLangOpts().RecoveryAST)
21738 if (
T.isNull() ||
T->isUndeducedType() ||
21739 !
Context.getLangOpts().RecoveryASTType)
Defines the clang::ASTContext interface.
This file provides some common utility functions for processing Lambda related AST Constructs.
static bool isObjCPointer(const MemRegion *R)
Defines enum values for all the target-independent builtin functions.
This file defines the classes used to store parsed information about declaration-specifiers and decla...
Defines the C++ template declaration subclasses.
static DeclT * getDefinitionOrSelf(DeclT *D)
Defines the classes clang::DelayedDiagnostic and clang::AccessedEntity.
Defines the clang::Expr interface and subclasses for C++ expressions.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Target Target
llvm::MachO::Record Record
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
Defines the clang::Preprocessor interface.
static 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 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 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 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 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
llvm::DenseSet< const VarDecl * > CUDADeviceVarODRUsedByHost
Keep track of CUDA/HIP device-side variables ODR-used by host code.
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
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.
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 character-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)
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier (with source-location information) that qualifies the name of this...
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_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.
bool wasNotFoundInCurrentInstantiation() const
Determine whether no result was found because we could not search into dependent base classes of the ...
LLVM_ATTRIBUTE_REINITIALIZES void clear()
Clears out any current state.
DeclClass * getAsSingle() const
void addDecl(NamedDecl *D)
Add a declaration to these results with its natural access.
void setLookupName(DeclarationName Name)
Sets the name to look up.
bool empty() const
Return true if no decls were found.
void resolveKind()
Resolves the result kind of the lookup, possibly hiding decls.
SourceLocation getNameLoc() const
Gets the location of the identifier.
NamedDecl * getFoundDecl() const
Fetch the unique decl found by this lookup.
bool isSingleResult() const
Determines if this names a single result which is not an unresolved value using decl.
CXXRecordDecl * getNamingClass() const
Returns the 'naming class' for this lookup, i.e.
Sema::LookupNameKind getLookupKind() const
Gets the kind of lookup to perform.
void setNamingClass(CXXRecordDecl *Record)
Sets the 'naming class' for this lookup.
NamedDecl * getRepresentativeDecl() const
Fetches a representative decl. Useful for lazy diagnostics.
void suppressDiagnostics()
Suppress the diagnostics that would normally fire because of this lookup.
DeclarationName getLookupName() const
Gets the name to look up.
const DeclarationNameInfo & getLookupNameInfo() const
Gets the name info to look up.
MS property subscript expression.
Keeps track of the mangled names of lambda expressions and block literals within a particular context...
virtual unsigned getManglingNumber(const CXXMethodDecl *CallOperator)=0
Retrieve the mangling number of a new lambda expression with the given call operator within this cont...
MatrixSingleSubscriptExpr - Matrix single subscript expression for the MatrixType extension when you ...
MatrixSubscriptExpr - Matrix subscript expression for the MatrixType extension.
Represents a matrix type, as defined in the Matrix Types clang extensions.
QualType getElementType() const
Returns type of the elements being stored in the matrix.
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
SourceLocation getMemberLoc() const
getMemberLoc - Return the location of the "member", in X->F, it is the location of 'F'.
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
static MemberExpr * Create(const ASTContext &C, Expr *Base, bool IsArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *MemberDecl, DeclAccessPair FoundDecl, DeclarationNameInfo MemberNameInfo, const TemplateArgumentListInfo *TemplateArgs, QualType T, ExprValueKind VK, ExprObjectKind OK, NonOdrUseReason NOUR)
bool performsVirtualDispatch(const LangOptions &LO) const
Returns true if virtual dispatch is performed.
SourceLocation getBeginLoc() const LLVM_READONLY
This represents a decl that may have a name.
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
std::string getQualifiedNameAsString() const
Linkage getFormalLinkage() const
Get the linkage from a semantic point of view.
bool isExternallyVisible() const
bool isCXXClassMember() const
Determine whether this declaration is a C++ class member.
Represent a C++ namespace.
A C++ nested-name-specifier augmented with source location information.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
CXXRecordDecl * getAsRecordDecl() const
Retrieve the record declaration stored in this nested name specifier, or null.
@ Type
A type, stored as a Type*.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
NumericLiteralParser - This performs strict semantic analysis of the content of a ppnumber,...
Represents an ObjC class declaration.
bool hasDefinition() const
Determine whether this class has been defined.
ivar_iterator ivar_begin() const
ObjCInterfaceDecl * getSuperClass() const
Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...
ObjCIsaExpr - Represent X->isa and X.isa when X is an ObjC 'id' type.
ObjCIvarDecl - Represents an ObjC instance variable.
ObjCIvarRefExpr - A reference to an ObjC instance variable.
SourceLocation getBeginLoc() const LLVM_READONLY
SourceLocation getLocation() const
SourceLocation getOpLoc() const
SourceLocation getEndLoc() const LLVM_READONLY
const Expr * getBase() const
An expression that sends a message to the given Objective-C object or class.
const ObjCMethodDecl * getMethodDecl() const
ObjCMethodDecl - Represents an instance or class method declaration.
ImplicitParamDecl * getSelfDecl() const
bool isClassMethod() const
Represents a pointer to an Objective C object.
const ObjCInterfaceType * getInterfaceType() const
If this pointer points to an Objective C @interface type, gets the type for that interface.
Represents one property declaration in an Objective-C interface.
Represents an Objective-C protocol declaration.
bool allowsSizeofAlignof() const
Does this runtime allow sizeof or alignof on object types?
bool allowsPointerArithmetic() const
Does this runtime allow pointer arithmetic on objects?
static OffsetOfExpr * Create(const ASTContext &C, QualType type, SourceLocation OperatorLoc, TypeSourceInfo *tsi, ArrayRef< OffsetOfNode > comps, ArrayRef< Expr * > exprs, SourceLocation RParenLoc)
Helper class for OffsetOfExpr.
void * getAsOpaquePtr() const
static OpaquePtr getFromOpaquePtr(void *P)
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
@ CSK_Normal
Normal lookup.
SmallVectorImpl< OverloadCandidate >::iterator iterator
OverloadingResult BestViableFunction(Sema &S, SourceLocation Loc, OverloadCandidateSet::iterator &Best)
Find the best viable function on this overload set, if it exists.
A reference to an overloaded function set, either an UnresolvedLookupExpr or an UnresolvedMemberExpr.
static FindResult find(Expr *E)
Finds the overloaded expression in the given expression E of OverloadTy.
ParenExpr - This represents a parenthesized expression, e.g.
SourceLocation getBeginLoc() const LLVM_READONLY
const Expr * getSubExpr() const
bool isProducedByFoldExpansion() const
Expr * getExpr(unsigned Init)
static ParenListExpr * Create(const ASTContext &Ctx, SourceLocation LParenLoc, ArrayRef< Expr * > Exprs, SourceLocation RParenLoc)
Create a paren list.
unsigned getNumExprs() const
Return the number of expressions in this paren list.
SourceLocation getLParenLoc() const
SourceLocation getRParenLoc() const
Represents a parameter to a function.
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
static ParmVarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S, Expr *DefArg)
bool isEquivalent(PointerAuthQualifier Other) const
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
static PredefinedExpr * Create(const ASTContext &Ctx, SourceLocation L, QualType FNTy, PredefinedIdentKind IK, bool IsTransparent, StringLiteral *SL)
Create a PredefinedExpr.
static std::string ComputeName(PredefinedIdentKind IK, const Decl *CurrentDecl, bool ForceElaboratedPrinting=false)
bool isMacroDefined(StringRef Id)
IdentifierTable & getIdentifierTable()
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool hasQualifiers() const
Determine whether this type has any qualifiers.
bool hasNonTrivialToPrimitiveCopyCUnion() const
Check if this is or contains a C union that is non-trivial to copy, which is a union that has a membe...
QualType getNonLValueExprType(const ASTContext &Context) const
Determine the type of a (typically non-lvalue) expression with the specified result type.
bool isNonWeakInMRRWithObjCWeak(const ASTContext &Context) const
bool isAddressSpaceOverlapping(QualType T, const ASTContext &Ctx) const
Returns true if address space qualifiers overlap with T address space qualifiers.
QualType withConst() const
void addConst()
Add the const type qualifier to this QualType.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
LangAS getAddressSpace() const
Return the address space of this type.
bool hasNonTrivialToPrimitiveDestructCUnion() const
Check if this is or contains a C union that is non-trivial to destruct, which is a union that has a m...
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
bool isCXX98PODType(const ASTContext &Context) const
Return true if this is a POD type according to the rules of the C++98 standard, regardless of the cur...
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
bool isWebAssemblyReferenceType() const
Returns true if it is a WebAssembly Reference Type.
QualType withCVRQualifiers(unsigned CVR) const
bool isCForbiddenLValueType() const
Determine whether expressions of the given type are forbidden from being lvalues in C.
bool isConstQualified() const
Determine whether this type is const-qualified.
QualType getAtomicUnqualifiedType() const
Remove all qualifiers including _Atomic.
DestructionKind isDestructedType() const
Returns a nonzero value if objects of this type require non-trivial work to clean up after.
QualType getSingleStepDesugaredType(const ASTContext &Context) const
Return the specified type with one level of "sugar" removed from the type.
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
bool isPODType(const ASTContext &Context) const
Determine whether this is a Plain Old Data (POD) type (C++ 3.9p10).
bool isAtLeastAsQualifiedAs(QualType Other, const ASTContext &Ctx) const
Determine whether this type is at least as qualified as the other given type, requiring exact equalit...
Qualifiers getLocalQualifiers() const
Retrieve the set of qualifiers local to this particular QualType instance, not including any qualifie...
bool hasNonTrivialToPrimitiveDefaultInitializeCUnion() const
Check if this is or contains a C union that is non-trivial to default-initialize, which is a union th...
The collection of all-type qualifiers we support.
unsigned getCVRQualifiers() const
void removeCVRQualifiers(unsigned mask)
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
@ OCL_Weak
Reading or writing from this object requires a barrier call.
@ OCL_Autoreleasing
Assigning into this object requires a lifetime extension.
void removeObjCLifetime()
bool compatiblyIncludes(Qualifiers other, const ASTContext &Ctx) const
Determines if these qualifiers compatibly include another set.
static bool isAddressSpaceSupersetOf(LangAS A, LangAS B, const ASTContext &Ctx)
Returns true if address space A is equal to or a superset of B.
void removeAddressSpace()
void setAddressSpace(LangAS space)
PointerAuthQualifier getPointerAuth() const
ObjCLifetime getObjCLifetime() const
Qualifiers withoutObjCLifetime() const
Qualifiers withoutObjCGCAttr() const
LangAS getAddressSpace() const
bool compatiblyIncludesObjCLifetime(Qualifiers other) const
Determines if these qualifiers compatibly include another set of qualifiers from the narrow perspecti...
Represents a struct/union/class.
bool hasFlexibleArrayMember() const
field_iterator field_end() const
field_range fields() const
static RecoveryExpr * Create(ASTContext &Ctx, QualType T, SourceLocation BeginLoc, SourceLocation EndLoc, ArrayRef< Expr * > SubExprs)
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
Base for LValueReferenceType and RValueReferenceType.
Scope - A scope is a transient data structure that is used while parsing the program.
bool isClassScope() const
isClassScope - Return true if this scope is a class/struct/union scope.
bool Contains(const Scope &rhs) const
Returns if rhs has a higher scope depth than this.
unsigned getFlags() const
getFlags - Return the flags for this scope.
bool isInCFunctionScope() const
isInObjcMethodScope - Return true if this scope is, or is contained, in an C function body.
bool isFunctionPrototypeScope() const
isFunctionPrototypeScope - Return true if this scope is a function prototype scope.
@ ContinueScope
This is a while, do, for, which can have continue statements embedded into it.
@ ControlScope
The controlling scope in a if/switch/while/for statement.
@ BreakScope
This is a while, do, switch, for, etc that can have break statements embedded into it.
@ DeclScope
This is a scope that can contain a declaration.
Smart pointer class that efficiently represents Objective-C method names.
StringRef getNameForSlot(unsigned argIndex) const
Retrieve the name at a given position in the selector.
bool isUnarySelector() const
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.
ExprResult ActOnOutParamExpr(ParmVarDecl *Param, Expr *Arg)
void emitLogicalOperatorFixIt(Expr *LHS, Expr *RHS, BinaryOperatorKind Opc)
QualType handleVectorBinOpConversion(ExprResult &LHS, ExprResult &RHS, QualType LHSType, QualType RHSType, bool IsCompAssign)
ObjCMethodDecl * LookupInstanceMethodInGlobalPool(Selector Sel, SourceRange R, bool receiverIdOrClass=false)
LookupInstanceMethodInGlobalPool - Returns the method and warns if there are multiple signatures.
ObjCLiteralKind CheckLiteralKind(Expr *FromE)
ObjCMethodDecl * LookupMethodInObjectType(Selector Sel, QualType Ty, bool IsInstance)
LookupMethodInType - Look up a method in an ObjCObjectType.
void CheckObjCBridgeRelatedCast(QualType castType, Expr *castExpr)
QualType FindCompositeObjCPointerType(ExprResult &LHS, ExprResult &RHS, SourceLocation QuestionLoc)
FindCompositeObjCPointerType - Helper method to find composite type of two objective-c pointer types ...
void CheckTollFreeBridgeCast(QualType castType, Expr *castExpr)
const DeclContext * getCurObjCLexicalContext() const
void checkRetainCycles(ObjCMessageExpr *msg)
checkRetainCycles - Check whether an Objective-C message send might create an obvious retain cycle.
void EmitRelatedResultTypeNote(const Expr *E)
If the given expression involves a message send to a method with a related result type,...
void EmitRelatedResultTypeNoteForReturn(QualType destType)
Given that we had incompatible pointer types in a return statement, check whether we're in a method w...
void diagnoseARCUnbridgedCast(Expr *e)
Given that we saw an expression with the ARCUnbridgedCastTy placeholder type, complain bitterly.
ObjCMethodDecl * LookupMethodInQualifiedType(Selector Sel, const ObjCObjectPointerType *OPT, bool IsInstance)
LookupMethodInQualifiedType - Lookups up a method in protocol qualifier list of a qualified objective...
ARCConversionResult CheckObjCConversion(SourceRange castRange, QualType castType, Expr *&op, CheckedConversionKind CCK, bool Diagnose=true, bool DiagnoseCFAudited=false, BinaryOperatorKind Opc=BO_PtrMemD, bool IsReinterpretCast=false)
Checks for invalid conversions and casts between retainable pointers and other pointer kinds for ARC ...
Expr * stripARCUnbridgedCast(Expr *e)
stripARCUnbridgedCast - Given an expression of ARCUnbridgedCast type, remove the placeholder cast.
ExprResult BuildObjCSubscriptExpression(SourceLocation RB, Expr *BaseExpr, Expr *IndexExpr, ObjCMethodDecl *getterMethod, ObjCMethodDecl *setterMethod)
Build an ObjC subscript pseudo-object expression, given that that's supported by the runtime.
std::unique_ptr< NSAPI > NSAPIObj
Caches identifiers/selectors for NSFoundation APIs.
void CheckDeclReference(SourceLocation Loc, Expr *E, Decl *D)
ExprResult ActOnArraySectionExpr(Expr *Base, SourceLocation LBLoc, Expr *LowerBound, SourceLocation ColonLocFirst, Expr *Length, SourceLocation RBLoc)
Checks and creates an Array Section used in an OpenACC construct/clause.
ExprResult ActOnOpenMPCall(ExprResult Call, Scope *Scope, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig)
Given the potential call expression Call, determine if there is a specialization via the OpenMP decla...
void tryCaptureOpenMPLambdas(ValueDecl *V)
Function tries to capture lambda's captured variables in the OpenMP region before the original lambda...
OpenMPClauseKind isOpenMPPrivateDecl(ValueDecl *D, unsigned Level, unsigned CapLevel) const
Check if the specified variable is used in 'private' clause.
VarDecl * isOpenMPCapturedDecl(ValueDecl *D, bool CheckScopeInfo=false, unsigned StopAt=0)
Check if the specified variable is used in one of the private clauses (private, firstprivate,...
ExprResult ActOnOMPArraySectionExpr(Expr *Base, SourceLocation LBLoc, Expr *LowerBound, SourceLocation ColonLocFirst, SourceLocation ColonLocSecond, Expr *Length, Expr *Stride, SourceLocation RBLoc)
bool isOpenMPCapturedByRef(const ValueDecl *D, unsigned Level, unsigned OpenMPCaptureLevel) const
Return true if the provided declaration VD should be captured by reference.
bool isOpenMPTargetCapturedDecl(const ValueDecl *D, unsigned Level, unsigned CaptureLevel) const
Check if the specified variable is captured by 'target' directive.
bool isOpenMPGlobalCapturedDecl(ValueDecl *D, unsigned Level, unsigned CaptureLevel) const
Check if the specified global variable must be captured by outer capture regions.
bool isInOpenMPDeclareTargetContext() const
Return true inside OpenMP declare target region.
void checkDeclIsAllowedInOpenMPTarget(Expr *E, Decl *D, SourceLocation IdLoc=SourceLocation())
Check declaration inside target region.
const ValueDecl * getOpenMPDeclareMapperVarName() const
ExprResult checkAssignment(Scope *S, SourceLocation OpLoc, BinaryOperatorKind Opcode, Expr *LHS, Expr *RHS)
ExprResult checkIncDec(Scope *S, SourceLocation OpLoc, UnaryOperatorKind Opcode, Expr *Op)
Check an increment or decrement of a pseudo-object expression.
ExprResult checkRValue(Expr *E)
RAII object used to temporarily allow the C++ 'this' expression to be used, with the given qualifiers...
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
RAII class used to indicate that we are performing provisional semantic analysis to determine the val...
Abstract base class used for diagnosing integer constant expression violations.
virtual SemaDiagnosticBuilder diagnoseNotICE(Sema &S, SourceLocation Loc)=0
virtual SemaDiagnosticBuilder diagnoseNotICEType(Sema &S, SourceLocation Loc, QualType T)
virtual SemaDiagnosticBuilder diagnoseFold(Sema &S, SourceLocation Loc)
Sema - This implements semantic analysis and AST building for C.
const FieldDecl * getSelfAssignmentClassMemberCandidate(const ValueDecl *SelfAssigned)
Returns a field in a CXXRecordDecl that has the same name as the decl SelfAssigned when inside a CXXM...
bool TryFunctionConversion(QualType FromType, QualType ToType, QualType &ResultTy) const
Same as IsFunctionConversion, but if this would return true, it sets ResultTy to ToType.
void DefineImplicitLambdaToFunctionPointerConversion(SourceLocation CurrentLoc, CXXConversionDecl *Conv)
Define the "body" of the conversion from a lambda object to a function pointer.
ParsedType CreateParsedType(QualType T, TypeSourceInfo *TInfo)
Package the given type and TSI into a ParsedType.
ExprResult ActOnCXXParenListInitExpr(ArrayRef< Expr * > Args, QualType T, unsigned NumUserSpecifiedExprs, SourceLocation InitLoc, SourceLocation LParenLoc, SourceLocation RParenLoc)
QualType getCurrentThisType()
Try to retrieve the type of the 'this' pointer.
std::optional< ExpressionEvaluationContextRecord::InitializationContext > InnermostDeclarationWithDelayedImmediateInvocations() const
SmallVector< CodeSynthesisContext, 16 > CodeSynthesisContexts
List of active code synthesis contexts.
Scope * getCurScope() const
Retrieve the parser's current scope.
ExprResult ActOnUnaryOp(Scope *S, SourceLocation OpLoc, tok::TokenKind Op, Expr *Input, bool IsAfterAmp=false)
Unary Operators. 'Tok' is the token for the operator.
bool RequireCompleteSizedExprType(Expr *E, unsigned DiagID, const Ts &...Args)
ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp=false)
bool isAlwaysConstantEvaluatedContext() const
bool isExternalWithNoLinkageType(const ValueDecl *VD) const
Determine if VD, which must be a variable or function, is an external symbol that nonetheless can't b...
bool isAttrContext() const
void DiagnoseUnusedParameters(ArrayRef< ParmVarDecl * > Parameters)
Diagnose any unused parameters in the given sequence of ParmVarDecl pointers.
ExprResult IgnoredValueConversions(Expr *E)
IgnoredValueConversions - Given that an expression's result is syntactically ignored,...
bool RequireCompleteSizedType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupObjCImplicitSelfParam
Look up implicit 'self' parameter of an objective-c method.
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
void DiagnoseSentinelCalls(const NamedDecl *D, SourceLocation Loc, ArrayRef< Expr * > Args)
DiagnoseSentinelCalls - This routine checks whether a call or message-send is to a declaration with t...
ExprResult CreateBuiltinMatrixSingleSubscriptExpr(Expr *Base, Expr *RowIdx, SourceLocation RBLoc)
ExprResult ActOnConstantExpression(ExprResult Res)
QualType CheckLogicalOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
ExprResult ActOnCompoundLiteral(SourceLocation LParenLoc, ParsedType Ty, SourceLocation RParenLoc, Expr *InitExpr)
bool LookupTemplateName(LookupResult &R, Scope *S, CXXScopeSpec &SS, QualType ObjectType, bool EnteringContext, RequiredTemplateKind RequiredTemplate=SourceLocation(), AssumedTemplateKind *ATK=nullptr, bool AllowTypoCorrection=true)
ImplicitConversionSequence TryImplicitConversion(Expr *From, QualType ToType, bool SuppressUserConversions, AllowedExplicit AllowExplicit, bool InOverloadResolution, bool CStyle, bool AllowObjCWritebackConversion)
ExprResult BuildLiteralOperatorCall(LookupResult &R, DeclarationNameInfo &SuffixInfo, ArrayRef< Expr * > Args, SourceLocation LitEndLoc, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr)
BuildLiteralOperatorCall - Build a UserDefinedLiteral by creating a call to a literal operator descri...
bool areVectorTypesSameSize(QualType srcType, QualType destType)
void DiagnoseAlwaysNonNullPointer(Expr *E, Expr::NullPointerConstantKind NullType, bool IsEqual, SourceRange Range)
Diagnose pointers that are always non-null.
void DefineImplicitMoveAssignment(SourceLocation CurrentLocation, CXXMethodDecl *MethodDecl)
Defines an implicitly-declared move assignment operator.
VariadicCallType getVariadicCallType(FunctionDecl *FDecl, const FunctionProtoType *Proto, Expr *Fn)
ExprResult CreateBuiltinBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr, bool ForFoldExpression=false)
CreateBuiltinBinOp - Creates a new built-in binary operation with operator Opc at location TokLoc.
void DecomposeUnqualifiedId(const UnqualifiedId &Id, TemplateArgumentListInfo &Buffer, DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *&TemplateArgs)
Decomposes the given name into a DeclarationNameInfo, its location, and possibly a list of template a...
bool InstantiateDefaultArgument(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param)
void ActOnStartStmtExpr()
ExprResult CreateOverloadedArraySubscriptExpr(SourceLocation LLoc, SourceLocation RLoc, Expr *Base, MultiExprArg Args)
void WarnOnPendingNoDerefs(ExpressionEvaluationContextRecord &Rec)
Emit a warning for all pending noderef expressions that we recorded.
void ActOnStmtExprError()
void MarkDeclarationsReferencedInExpr(Expr *E, bool SkipLocalVariables=false, ArrayRef< const Expr * > StopAt={})
Mark any declarations that appear within this expression or any potentially-evaluated subexpressions ...
bool BoundsSafetyCheckAssignmentToCountAttrPtr(QualType LHSTy, Expr *RHSExpr, AssignmentAction Action, SourceLocation Loc, const ValueDecl *Assignee, bool ShowFullyQualifiedAssigneeName)
Perform Bounds Safety Semantic checks for assigning to a __counted_by or __counted_by_or_null pointer...
QualType UsualArithmeticConversions(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, ArithConvKind ACK)
UsualArithmeticConversions - Performs various conversions that are common to binary operators (C99 6....
void CheckFloatComparison(SourceLocation Loc, const Expr *LHS, const Expr *RHS, BinaryOperatorKind Opcode)
Check for comparisons of floating-point values using == and !=.
void CheckPtrComparisonWithNullChar(ExprResult &E, ExprResult &NullE)
NamedDecl * ImplicitlyDefineFunction(SourceLocation Loc, IdentifierInfo &II, Scope *S)
ImplicitlyDefineFunction - An undeclared identifier was used in a function call, forming a call to an...
unsigned CapturingFunctionScopes
Track the number of currently active capturing scopes.
void PushExpressionEvaluationContext(ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl=nullptr, ExpressionEvaluationContextRecord::ExpressionKind Type=ExpressionEvaluationContextRecord::EK_Other)
ExprResult CheckBooleanCondition(SourceLocation Loc, Expr *E, bool IsConstexpr=false)
CheckBooleanCondition - Diagnose problems involving the use of the given expression as a boolean cond...
@ Boolean
A boolean condition, from 'if', 'while', 'for', or 'do'.
@ Switch
An integral condition for a 'switch' statement.
@ ConstexprIf
A constant boolean condition from 'if constexpr'.
ExprResult ActOnIdExpression(Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, UnqualifiedId &Id, bool HasTrailingLParen, bool IsAddressOfOperand, CorrectionCandidateCallback *CCC=nullptr, bool IsInlineAsmIdentifier=false, Token *KeywordReplacement=nullptr)
bool needsRebuildOfDefaultArgOrInit() const
bool GatherArgumentsForCall(SourceLocation CallLoc, FunctionDecl *FDecl, const FunctionProtoType *Proto, unsigned FirstParam, ArrayRef< Expr * > Args, SmallVectorImpl< Expr * > &AllArgs, VariadicCallType CallType=VariadicCallType::DoesNotApply, bool AllowExplicit=false, bool IsListInitialization=false)
GatherArgumentsForCall - Collector argument expressions for various form of call prototypes.
SourceLocation LocationOfExcessPrecisionNotSatisfied
SmallVector< sema::FunctionScopeInfo *, 4 > FunctionScopes
Stack containing information about each of the nested function, block, and method scopes that are cur...
Preprocessor & getPreprocessor() const
const ExpressionEvaluationContextRecord & currentEvaluationContext() const
Scope * getScopeForContext(DeclContext *Ctx)
Determines the active Scope associated with the given declaration context.
QualType GetSignedSizelessVectorType(QualType V)
bool CheckCXXThisCapture(SourceLocation Loc, bool Explicit=false, bool BuildAndDiagnose=true, const unsigned *const FunctionScopeIndexToStopAt=nullptr, bool ByCopy=false)
Make sure the value of 'this' is actually available in the current context, if it is a potentially ev...
llvm::SmallPtrSet< ConstantExpr *, 4 > FailedImmediateInvocations
ExprResult ActOnCharacterConstant(const Token &Tok, Scope *UDLScope=nullptr)
DefaultedComparisonKind getDefaultedComparisonKind(const FunctionDecl *FD)
ExprResult MaybeBindToTemporary(Expr *E)
MaybeBindToTemporary - If the passed in expression has a record type with a non-trivial destructor,...
void CheckCompleteDestructorVariant(SourceLocation CurrentLocation, CXXDestructorDecl *Dtor)
Do semantic checks to allow the complete destructor variant to be emitted when the destructor is defi...
void MarkCaptureUsedInEnclosingContext(ValueDecl *Capture, SourceLocation Loc, unsigned CapturingScopeIndex)
llvm::SmallSetVector< Expr *, 4 > MaybeODRUseExprSet
Store a set of either DeclRefExprs or MemberExprs that contain a reference to a variable (constant) t...
Expr * BuildBuiltinCallExpr(SourceLocation Loc, Builtin::ID Id, MultiExprArg CallArgs)
BuildBuiltinCallExpr - Create a call to a builtin function specified by Id.
QualType CheckVectorOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, bool AllowBothBool, bool AllowBoolConversion, bool AllowBoolOperation, bool ReportInvalid)
type checking for vector binary operators.
LiteralOperatorLookupResult LookupLiteralOperator(Scope *S, LookupResult &R, ArrayRef< QualType > ArgTys, bool AllowRaw, bool AllowTemplate, bool AllowStringTemplate, bool DiagnoseMissing, StringLiteral *StringLit=nullptr)
LookupLiteralOperator - Determine which literal operator should be used for a user-defined literal,...
FPOptionsOverride CurFPFeatureOverrides()
bool isValidSveBitcast(QualType srcType, QualType destType)
Are the two types SVE-bitcast-compatible types?
ExprResult ActOnDependentIdExpression(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, bool isAddressOfOperand, const TemplateArgumentListInfo *TemplateArgs)
ActOnDependentIdExpression - Handle a dependent id-expression that was just parsed.
ExprResult BuildStmtExpr(SourceLocation LPLoc, Stmt *SubStmt, SourceLocation RPLoc, unsigned TemplateDepth)
ExprResult BuildCallToMemberFunction(Scope *S, Expr *MemExpr, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallToMemberFunction - Build a call to a member function.
NamedDecl * LookupSingleName(Scope *S, DeclarationName Name, SourceLocation Loc, LookupNameKind NameKind, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)
Look up a name, looking for a single declaration.
AssignConvertType CheckSingleAssignmentConstraints(QualType LHSType, ExprResult &RHS, bool Diagnose=true, bool DiagnoseCFAudited=false, bool ConvertRHS=true)
Check assignment constraints for an assignment of RHS to LHSType.
ExprResult BuildVAArgExpr(SourceLocation BuiltinLoc, Expr *E, TypeSourceInfo *TInfo, SourceLocation RPLoc)
ExpressionEvaluationContextRecord & parentEvaluationContext()
FunctionDecl * getCurFunctionDecl(bool AllowLambda=false) const
Returns a pointer to the innermost enclosing function, or nullptr if the current context is not insid...
ExprResult PerformContextualImplicitConversion(SourceLocation Loc, Expr *FromE, ContextualImplicitConverter &Converter)
Perform a contextual implicit conversion.
bool CheckConceptUseInDefinition(NamedDecl *Concept, SourceLocation Loc)
ExprResult UsualUnaryConversions(Expr *E)
UsualUnaryConversions - Performs various conversions that are common to most operators (C99 6....
bool checkPointerAuthEnabled(SourceLocation Loc, SourceRange Range)
ExprResult CheckUnevaluatedOperand(Expr *E)
ExprResult DefaultVariadicArgumentPromotion(Expr *E, VariadicCallType CT, FunctionDecl *FDecl)
void DiagnoseCommaOperator(const Expr *LHS, SourceLocation Loc)
Look for instances where it is likely the comma operator is confused with another operator.
ExprResult tryConvertExprToType(Expr *E, QualType Ty)
Try to convert an expression E to type Ty.
bool DeduceReturnType(FunctionDecl *FD, SourceLocation Loc, bool Diagnose=true)
std::vector< Token > ExpandFunctionLocalPredefinedMacros(ArrayRef< Token > Toks)
bool CheckMatrixCast(SourceRange R, QualType DestTy, QualType SrcTy, CastKind &Kind)
QualType CheckAddressOfOperand(ExprResult &Operand, SourceLocation OpLoc)
CheckAddressOfOperand - The operand of & must be either a function designator or an lvalue designatin...
ParmVarDecl * BuildParmVarDeclForTypedef(DeclContext *DC, SourceLocation Loc, QualType T)
Synthesizes a variable for a parameter arising from a typedef.
ExprResult CheckSwitchCondition(SourceLocation SwitchLoc, Expr *Cond)
static bool TooManyArguments(size_t NumParams, size_t NumArgs, bool PartialOverloading=false)
To be used for checking whether the arguments being passed to function exceeds the number of paramete...
bool ShouldSplatAltivecScalarInCast(const VectorType *VecTy)
QualType CheckVectorLogicalOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
QualType InvalidOperands(SourceLocation Loc, ExprResult &LHS, ExprResult &RHS)
the following "Check" methods will return a valid/converted QualType or a null QualType (indicating a...
bool DiagIfReachable(SourceLocation Loc, ArrayRef< const Stmt * > Stmts, const PartialDiagnostic &PD)
Conditionally issue a diagnostic based on the statements's reachability analysis.
bool BoundsSafetyCheckUseOfCountAttrPtr(const Expr *E)
Perform Bounds Safety semantic checks for uses of invalid uses counted_by or counted_by_or_null point...
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReceiver=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
QualType CheckShiftOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc, bool IsCompAssign=false)
DiagnosticsEngine & getDiagnostics() const
ExprResult MaybeConvertParenListExprToParenExpr(Scope *S, Expr *ME)
This is not an AltiVec-style cast or or C++ direct-initialization, so turn the ParenListExpr into a s...
bool checkAddressOfFunctionIsAvailable(const FunctionDecl *Function, bool Complain=false, SourceLocation Loc=SourceLocation())
Returns whether the given function's address can be taken or not, optionally emitting a diagnostic if...
bool CheckCaseExpression(Expr *E)
QualType CheckMatrixElementwiseOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign)
Type checking for matrix binary operators.
bool tryToRecoverWithCall(ExprResult &E, const PartialDiagnostic &PD, bool ForceComplain=false, bool(*IsPlausibleResult)(QualType)=nullptr)
Try to recover by turning the given expression into a call.
FunctionDecl * ResolveAddressOfOverloadedFunction(Expr *AddressOfExpr, QualType TargetType, bool Complain, DeclAccessPair &Found, bool *pHadMultipleCandidates=nullptr)
ResolveAddressOfOverloadedFunction - Try to resolve the address of an overloaded function (C++ [over....
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
void LookupOverloadedOperatorName(OverloadedOperatorKind Op, Scope *S, UnresolvedSetImpl &Functions)
void checkSpecializationReachability(SourceLocation Loc, NamedDecl *Spec)
void CleanupVarDeclMarking()
ExprResult DefaultFunctionArrayLvalueConversion(Expr *E, bool Diagnose=true)
bool isImmediateFunctionContext() const
ASTContext & getASTContext() const
std::unique_ptr< sema::FunctionScopeInfo, PoppedFunctionScopeDeleter > PoppedFunctionScopePtr
ExprResult CallExprUnaryConversions(Expr *E)
CallExprUnaryConversions - a special case of an unary conversion performed on a function designator o...
void translateTemplateArguments(const ASTTemplateArgsPtr &In, TemplateArgumentListInfo &Out)
Translates template arguments as provided by the parser into template arguments used by semantic anal...
ExprResult BuildUnaryOp(Scope *S, SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *Input, bool IsAfterAmp=false)
bool tryCaptureVariable(ValueDecl *Var, SourceLocation Loc, TryCaptureKind Kind, SourceLocation EllipsisLoc, bool BuildAndDiagnose, QualType &CaptureType, QualType &DeclRefType, const unsigned *const FunctionScopeIndexToStopAt)
Try to capture the given variable.
void MarkVariableReferenced(SourceLocation Loc, VarDecl *Var)
Mark a variable referenced, and check whether it is odr-used (C++ [basic.def.odr]p2,...
void LookupBinOp(Scope *S, SourceLocation OpLoc, BinaryOperatorKind Opc, UnresolvedSetImpl &Functions)
ExprResult BuildTemplateIdExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, bool RequiresADL, const TemplateArgumentListInfo *TemplateArgs)
void DiagnoseUnguardedAvailabilityViolations(Decl *FD)
Issue any -Wunguarded-availability warnings in FD.
void PopExpressionEvaluationContext()
ExprResult CreateOverloadedBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, const UnresolvedSetImpl &Fns, Expr *LHS, Expr *RHS, bool RequiresADL=true, bool AllowRewrittenCandidates=true, FunctionDecl *DefaultedFn=nullptr)
Create a binary operation that may resolve to an overloaded operator.
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
ExprResult DefaultArgumentPromotion(Expr *E)
DefaultArgumentPromotion (C99 6.5.2.2p6).
ExprResult BuildPredefinedExpr(SourceLocation Loc, PredefinedIdentKind IK)
bool CheckArgsForPlaceholders(MultiExprArg args)
Check an argument list for placeholders that we won't try to handle later.
bool UseArgumentDependentLookup(const CXXScopeSpec &SS, const LookupResult &R, bool HasTrailingLParen)
void InstantiateVariableDefinition(SourceLocation PointOfInstantiation, VarDecl *Var, bool Recursive=false, bool DefinitionRequired=false, bool AtEndOfTU=false)
Instantiate the definition of the given variable from its template.
ExprResult BuildCompoundLiteralExpr(SourceLocation LParenLoc, TypeSourceInfo *TInfo, SourceLocation RParenLoc, Expr *LiteralExpr)
ExprResult ActOnAddrLabel(SourceLocation OpLoc, SourceLocation LabLoc, LabelDecl *TheDecl)
ActOnAddrLabel - Parse the GNU address of label extension: "&&foo".
QualType CheckSubtractionOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc, QualType *CompLHSTy=nullptr)
DefaultedComparisonKind
Kinds of defaulted comparison operator functions.
@ None
This is not a defaultable comparison operator.
ExprResult ActOnParenListExpr(SourceLocation L, SourceLocation R, MultiExprArg Val)
QualType CheckMatrixMultiplyOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign)
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
ObjCMethodDecl * getCurMethodDecl()
getCurMethodDecl - If inside of a method body, this returns a pointer to the method decl for the meth...
DeclRefExpr * BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK, SourceLocation Loc, const CXXScopeSpec *SS=nullptr)
void DefineImplicitMoveConstructor(SourceLocation CurrentLocation, CXXConstructorDecl *Constructor)
DefineImplicitMoveConstructor - Checks for feasibility of defining this constructor as the move const...
ExprResult ActOnChooseExpr(SourceLocation BuiltinLoc, Expr *CondExpr, Expr *LHSExpr, Expr *RHSExpr, SourceLocation RPLoc)
ExprResult CreateGenericSelectionExpr(SourceLocation KeyLoc, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool PredicateIsExpr, void *ControllingExprOrType, ArrayRef< TypeSourceInfo * > Types, ArrayRef< Expr * > Exprs)
ControllingExprOrType is either a TypeSourceInfo * or an Expr *.
ExprResult ActOnUnevaluatedStringLiteral(ArrayRef< Token > StringToks)
void DiagnoseSelfMove(const Expr *LHSExpr, const Expr *RHSExpr, SourceLocation OpLoc)
DiagnoseSelfMove - Emits a warning if a value is moved to itself.
SourceRange getExprRange(Expr *E) const
void AddTemplateOverloadCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false)
Add a C++ function template specialization as a candidate in the candidate set, using template argume...
void DefineImplicitCopyConstructor(SourceLocation CurrentLocation, CXXConstructorDecl *Constructor)
DefineImplicitCopyConstructor - Checks for feasibility of defining this constructor as the copy const...
std::optional< ExpressionEvaluationContextRecord::InitializationContext > OutermostDeclarationWithDelayedImmediateInvocations() const
void DiagnoseUnusedExprResult(const Stmt *S, unsigned DiagID)
DiagnoseUnusedExprResult - If the statement passed in is an expression whose result is unused,...
FPOptions & getCurFPFeatures()
RecordDecl * StdSourceLocationImplDecl
The C++ "std::source_location::__impl" struct, defined in <source_location>.
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
ConditionResult ActOnCondition(Scope *S, SourceLocation Loc, Expr *SubExpr, ConditionKind CK, bool MissingOK=false)
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
@ UPPC_Block
Block expression.
const LangOptions & getLangOpts() const
TypoCorrection CorrectTypo(const DeclarationNameInfo &Typo, Sema::LookupNameKind LookupKind, Scope *S, CXXScopeSpec *SS, CorrectionCandidateCallback &CCC, CorrectTypoKind Mode, DeclContext *MemberContext=nullptr, bool EnteringContext=false, const ObjCObjectPointerType *OPT=nullptr, bool RecordFailure=true)
Try to "correct" a typo in the source code by finding visible declarations whose names are similar to...
QualType CheckComparisonCategoryType(ComparisonCategoryType Kind, SourceLocation Loc, ComparisonCategoryUsage Usage)
Lookup the specified comparison category types in the standard library, an check the VarDecls possibl...
void DiagnoseInvalidJumps(Stmt *Body)
PoppedFunctionScopePtr PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, Decl *D=nullptr, QualType BlockType=QualType())
Pop a function (or block or lambda or captured region) scope from the stack.
QualType CheckCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
CastKind PrepareScalarCast(ExprResult &src, QualType destType)
Prepares for a scalar cast, performing all the necessary stages except the final cast and returning t...
bool tryToFixVariablyModifiedVarType(TypeSourceInfo *&TInfo, QualType &T, SourceLocation Loc, unsigned FailedFoldDiagID)
Attempt to fold a variable-sized type to a constant-sized type, returning true if we were successful.
const FunctionProtoType * ResolveExceptionSpec(SourceLocation Loc, const FunctionProtoType *FPT)
void MarkExpressionAsImmediateEscalating(Expr *E)
NonOdrUseReason getNonOdrUseReasonInCurrentContext(ValueDecl *D)
If D cannot be odr-used in the current expression evaluation context, return a reason explaining why.
void DefineDefaultedComparison(SourceLocation Loc, FunctionDecl *FD, DefaultedComparisonKind DCK)
void diagnoseUnavailableAlignedAllocation(const FunctionDecl &FD, SourceLocation Loc)
Produce diagnostics if FD is an aligned allocation or deallocation function that is unavailable.
bool LookupParsedName(LookupResult &R, Scope *S, CXXScopeSpec *SS, QualType ObjectType, bool AllowBuiltinCreation=false, bool EnteringContext=false)
Performs name lookup for a name that was parsed in the source code, and may contain a C++ scope speci...
void MarkFunctionParmPackReferenced(FunctionParmPackExpr *E)
Perform reference-marking and odr-use handling for a FunctionParmPackExpr.
bool DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, CorrectionCandidateCallback &CCC, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr, ArrayRef< Expr * > Args={}, DeclContext *LookupCtx=nullptr)
Diagnose an empty lookup.
QualType CheckAdditionOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc, QualType *CompLHSTy=nullptr)
bool isPotentialImplicitMemberAccess(const CXXScopeSpec &SS, LookupResult &R, bool IsAddressOfOperand)
Check whether an expression might be an implicit class member access.
ExprResult BuildCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallExpr - Handle a call to Fn with the specified array of arguments.
bool CheckUseOfCXXMethodAsAddressOfOperand(SourceLocation OpLoc, const Expr *Op, const CXXMethodDecl *MD)
ExprResult BuildSourceLocExpr(SourceLocIdentKind Kind, QualType ResultTy, SourceLocation BuiltinLoc, SourceLocation RPLoc, DeclContext *ParentContext)
bool ActOnAlignasTypeArgument(StringRef KWName, ParsedType Ty, SourceLocation OpLoc, SourceRange R)
ActOnAlignasTypeArgument - Handle alignas(type-id) and _Alignas(type-name) .
bool DiagnoseUnexpandedParameterPack(SourceLocation Loc, TypeSourceInfo *T, UnexpandedParameterPackContext UPPC)
If the given type contains an unexpanded parameter pack, diagnose the error.
bool RequireNonAbstractType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
void checkTypeSupport(QualType Ty, SourceLocation Loc, ValueDecl *D=nullptr)
Check if the type is allowed to be used for the current target.
bool areMatrixTypesOfTheSameDimension(QualType srcTy, QualType destTy)
Are the two types matrix types and do they have the same dimensions i.e.
void CheckExtraCXXDefaultArguments(Declarator &D)
CheckExtraCXXDefaultArguments - Check for any extra default arguments in the declarator,...
bool hasCStrMethod(const Expr *E)
Check to see if a given expression could have '.c_str()' called on it.
AssignConvertType CheckAssignmentConstraints(SourceLocation Loc, QualType LHSType, QualType RHSType)
CheckAssignmentConstraints - Perform type checking for assignment, argument passing,...
void AddOverloadCandidate(FunctionDecl *Function, DeclAccessPair FoundDecl, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, bool AllowExplicitConversion=false, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, ConversionSequenceList EarlyConversions={}, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false, bool StrictPackMatch=false)
AddOverloadCandidate - Adds the given function to the set of candidate functions, using the given fun...
const LangOptions & LangOpts
void PushExpressionEvaluationContextForFunction(ExpressionEvaluationContext NewContext, FunctionDecl *FD)
ExprResult BuildBuiltinOffsetOf(SourceLocation BuiltinLoc, TypeSourceInfo *TInfo, ArrayRef< OffsetOfComponent > Components, SourceLocation RParenLoc)
__builtin_offsetof(type, a.b[123][456].c)
sema::LambdaScopeInfo * getCurLambda(bool IgnoreNonLambdaCapturingScope=false)
Retrieve the current lambda scope info, if any.
ExprResult BuildResolvedCallExpr(Expr *Fn, NamedDecl *NDecl, SourceLocation LParenLoc, ArrayRef< Expr * > Arg, SourceLocation RParenLoc, Expr *Config=nullptr, bool IsExecConfig=false, ADLCallKind UsesADL=ADLCallKind::NotADL)
BuildResolvedCallExpr - Build a call to a resolved expression, i.e.
ExprResult CheckForImmediateInvocation(ExprResult E, FunctionDecl *Decl)
Wrap the expression in a ConstantExpr if it is a potential immediate invocation.
ExprResult TemporaryMaterializationConversion(Expr *E)
If E is a prvalue denoting an unmaterialized temporary, materialize it as an xvalue.
VarArgKind isValidVarArgType(const QualType &Ty)
Determine the degree of POD-ness for an expression.
NamedDeclSetType UnusedPrivateFields
Set containing all declared private fields that are not used.
void DefineInheritingConstructor(SourceLocation UseLoc, CXXConstructorDecl *Constructor)
Define the specified inheriting constructor.
ExprResult ConvertVectorExpr(Expr *E, TypeSourceInfo *TInfo, SourceLocation BuiltinLoc, SourceLocation RParenLoc)
ConvertVectorExpr - Handle __builtin_convertvector.
void CheckUnusedVolatileAssignment(Expr *E)
Check whether E, which is either a discarded-value expression or an unevaluated operand,...
void maybeAddDeclWithEffects(FuncOrBlockDecl *D)
Inline checks from the start of maybeAddDeclWithEffects, to minimize performance impact on code not u...
ExprResult prepareMatrixSplat(QualType MatrixTy, Expr *SplattedExpr)
Prepare SplattedExpr for a matrix splat operation, adding implicit casts if necessary.
void MaybeSuggestAddingStaticToDecl(const FunctionDecl *D)
@ OperatorInExpression
The '<=>' operator was used in an expression and a builtin operator was selected.
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....
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
ExprResult ActOnBinOp(Scope *S, SourceLocation TokLoc, tok::TokenKind Kind, Expr *LHSExpr, Expr *RHSExpr)
Binary Operators. 'Tok' is the token for the operator.
void checkUnusedDeclAttributes(Declarator &D)
checkUnusedDeclAttributes - Given a declarator which is not being used to build a declaration,...
ExprResult CheckExtVectorCast(SourceRange R, QualType DestTy, Expr *CastExpr, CastKind &Kind)
QualType CheckTemplateIdType(ElaboratedTypeKeyword Keyword, TemplateName Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs, Scope *Scope, bool ForNestedNameSpecifier)
void setFunctionHasBranchProtectedScope()
bool isConstantEvaluatedContext() const
void InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, FunctionDecl *Function, bool Recursive=false, bool DefinitionRequired=false, bool AtEndOfTU=false)
Instantiate the definition of the given function from its template.
void FinalizeVarWithDestructor(VarDecl *VD, CXXRecordDecl *DeclInit)
FinalizeVarWithDestructor - Prepare for calling destructor on the constructed variable.
ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, VerifyICEDiagnoser &Diagnoser, AllowFoldKind CanFold=AllowFoldKind::No)
VerifyIntegerConstantExpression - Verifies that an expression is an ICE, and reports the appropriate ...
bool CheckForConstantInitializer(Expr *Init, unsigned DiagID=diag::err_init_element_not_constant)
type checking declaration initializers (C99 6.7.8)
llvm::SmallPtrSet< const Decl *, 4 > ParsingInitForAutoVars
ParsingInitForAutoVars - a set of declarations with auto types for which we are currently parsing the...
bool CheckPointerConversion(Expr *From, QualType ToType, CastKind &Kind, CXXCastPath &BasePath, bool IgnoreBaseAccess, bool Diagnose=true)
CheckPointerConversion - Check the pointer conversion from the expression From to the type ToType.
SmallVector< ExprWithCleanups::CleanupObject, 8 > ExprCleanupObjects
ExprCleanupObjects - This is the stack of objects requiring cleanup that are created by the current f...
void NoteDeletedFunction(FunctionDecl *FD)
Emit a note explaining that this function is deleted.
sema::AnalysisBasedWarnings AnalysisWarnings
Worker object for performing CFG-based warnings.
std::deque< PendingImplicitInstantiation > PendingInstantiations
The queue of implicit template instantiations that are required but have not yet been performed.
ExprResult CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc, Expr *Idx, SourceLocation RLoc)
void NoteAllOverloadCandidates(Expr *E, QualType DestType=QualType(), bool TakingAddress=false)
ExprResult ActOnPredefinedExpr(SourceLocation Loc, tok::TokenKind Kind)
QualType GetSignedVectorType(QualType V)
Return a signed ext_vector_type that is of identical size and number of elements.
QualType CheckConditionalOperands(ExprResult &Cond, ExprResult &LHS, ExprResult &RHS, ExprValueKind &VK, ExprObjectKind &OK, SourceLocation QuestionLoc)
Note that LHS is not null here, even if this is the gnu "x ?: y" extension.
ExpressionEvaluationContext
Describes how the expressions currently being parsed are evaluated at run-time, if at all.
@ UnevaluatedAbstract
The current expression occurs within an unevaluated operand that unconditionally permits abstract ref...
@ UnevaluatedList
The current expression occurs within a braced-init-list within an unevaluated operand.
@ ConstantEvaluated
The current context is "potentially evaluated" in C++11 terms, but the expression is evaluated at com...
@ DiscardedStatement
The current expression occurs within a discarded statement.
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
@ ImmediateFunctionContext
In addition of being constant evaluated, the current expression occurs in an immediate function conte...
@ PotentiallyEvaluatedIfUsed
The current expression is potentially evaluated, but any declarations referenced inside that expressi...
void CheckCompatibleReinterpretCast(QualType SrcType, QualType DestType, bool IsDereference, SourceRange Range)
ExprResult BuildDependentDeclRefExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs)
ExprResult ActOnAsTypeExpr(Expr *E, ParsedType ParsedDestTy, SourceLocation BuiltinLoc, SourceLocation RParenLoc)
Parse a __builtin_astype expression.
ExprResult CreateUnaryExprOrTypeTraitExpr(TypeSourceInfo *TInfo, SourceLocation OpLoc, UnaryExprOrTypeTrait ExprKind, SourceRange R)
Build a sizeof or alignof expression given a type operand.
TypeSourceInfo * GetTypeForDeclarator(Declarator &D)
GetTypeForDeclarator - Convert the type for the specified declarator to Type instances.
void diagnoseTypo(const TypoCorrection &Correction, const PartialDiagnostic &TypoDiag, bool ErrorRecovery=true)
bool CheckCallReturnType(QualType ReturnType, SourceLocation Loc, CallExpr *CE, FunctionDecl *FD)
CheckCallReturnType - Checks that a call expression's return type is complete.
bool CheckUnaryExprOrTypeTraitOperand(Expr *E, UnaryExprOrTypeTrait ExprKind)
Check the constraints on expression operands to unary type expression and type traits.
ExprResult ActOnVAArg(SourceLocation BuiltinLoc, Expr *E, ParsedType Ty, SourceLocation RPLoc)
TypeSourceInfo * GetTypeForDeclaratorCast(Declarator &D, QualType FromTy)
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
Scope * TUScope
Translation Unit Scope - useful to Objective-C actions that need to lookup file scope declarations in...
ExprResult forceUnknownAnyToType(Expr *E, QualType ToType)
Force an expression with unknown-type to an expression of the given type.
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
void NoteDeletedInheritingConstructor(CXXConstructorDecl *CD)
QualType getCapturedDeclRefType(ValueDecl *Var, SourceLocation Loc)
Given a variable, determine the type that a reference to that variable will have in the given scope.
ExprResult ActOnCastExpr(Scope *S, SourceLocation LParenLoc, Declarator &D, ParsedType &Ty, SourceLocation RParenLoc, Expr *CastExpr)
ExprResult PerformObjectMemberConversion(Expr *From, NestedNameSpecifier Qualifier, NamedDecl *FoundDecl, NamedDecl *Member)
Cast a base object to a member's actual type.
Expr * MaybeCreateExprWithCleanups(Expr *SubExpr)
MaybeCreateExprWithCleanups - If the current full-expression requires any cleanups,...
bool RebuildingImmediateInvocation
Whether the AST is currently being rebuilt to correct immediate invocations.
void DiscardCleanupsInEvaluationContext()
bool NeedToCaptureVariable(ValueDecl *Var, SourceLocation Loc)
Checks if the variable must be captured.
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
void PushDeclContext(Scope *S, DeclContext *DC)
Set the current declaration context until it gets popped.
bool CheckVectorCast(SourceRange R, QualType VectorTy, QualType Ty, CastKind &Kind)
QualType getCompletedType(Expr *E)
Get the type of expression E, triggering instantiation to complete the type if necessary – that is,...
void mergeDeclAttributes(NamedDecl *New, Decl *Old, AvailabilityMergeKind AMK=AvailabilityMergeKind::Redeclaration)
mergeDeclAttributes - Copy attributes from the Old decl to the New one.
SourceManager & SourceMgr
bool CheckAlignasTypeArgument(StringRef KWName, TypeSourceInfo *TInfo, SourceLocation OpLoc, SourceRange R)
ExprResult BuildVectorLiteral(SourceLocation LParenLoc, SourceLocation RParenLoc, Expr *E, TypeSourceInfo *TInfo)
Build an altivec or OpenCL literal.
ExprResult UsualUnaryFPConversions(Expr *E)
UsualUnaryFPConversions - Promotes floating-point types according to the current language semantics.
bool isUnavailableAlignedAllocationFunction(const FunctionDecl &FD) const
Determine whether FD is an aligned allocation or deallocation function that is unavailable.
bool DiagnoseDependentMemberLookup(const LookupResult &R)
Diagnose a lookup that found results in an enclosing class during error recovery.
DiagnosticsEngine & Diags
OpenCLOptions & getOpenCLOptions()
NamespaceDecl * getStdNamespace() const
ExprResult DefaultFunctionArrayConversion(Expr *E, bool Diagnose=true)
DefaultFunctionArrayConversion (C99 6.3.2.1p3, C99 6.3.2.1p4).
void deduceClosureReturnType(sema::CapturingScopeInfo &CSI)
Deduce a block or lambda's return type based on the return statements present in the body.
bool areLaxCompatibleVectorTypes(QualType srcType, QualType destType)
Are the two types lax-compatible vector types?
ExprResult BuildBinOp(Scope *S, SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr, bool ForFoldExpression=false)
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
void diagnoseMissingTemplateArguments(TemplateName Name, SourceLocation Loc)
ExprResult ActOnIntegerConstant(SourceLocation Loc, int64_t Val)
ExprResult BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field)
friend class InitializationSequence
void DiagnoseAssignmentAsCondition(Expr *E)
DiagnoseAssignmentAsCondition - Given that an expression is being used as a boolean condition,...
void checkSpecializationVisibility(SourceLocation Loc, NamedDecl *Spec)
We've found a use of a templated declaration that would trigger an implicit instantiation.
QualType CheckBitwiseOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
llvm::MapVector< NamedDecl *, SourceLocation > UndefinedButUsed
UndefinedInternals - all the used, undefined objects which require a definition in this translation u...
ExprResult ActOnStmtExpr(Scope *S, SourceLocation LPLoc, Stmt *SubStmt, SourceLocation RPLoc)
bool ResolveAndFixSingleFunctionTemplateSpecialization(ExprResult &SrcExpr, bool DoFunctionPointerConversion=false, bool Complain=false, SourceRange OpRangeForComplaining=SourceRange(), QualType DestTypeForComplaining=QualType(), unsigned DiagIDForComplaining=0)
ExprResult ConvertParamDefaultArgument(ParmVarDecl *Param, Expr *DefaultArg, SourceLocation EqualLoc)
void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD)
ProcessDeclAttributes - Given a declarator (PD) with attributes indicated in it, apply them to D.
void checkVariadicArgument(const Expr *E, VariadicCallType CT)
Check to see if the given expression is a valid argument to a variadic function, issuing a diagnostic...
void CheckStaticArrayArgument(SourceLocation CallLoc, ParmVarDecl *Param, const Expr *ArgExpr)
CheckStaticArrayArgument - If the given argument corresponds to a static array parameter,...
QualType CheckSizelessVectorCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
ExprResult ConvertMemberDefaultInitExpression(FieldDecl *FD, Expr *InitExpr, SourceLocation InitLoc)
bool IsInvalidSMECallConversion(QualType FromType, QualType ToType)
void checkNonTrivialCUnionInInitializer(const Expr *Init, SourceLocation Loc)
Emit diagnostics if the initializer or any of its explicit or implicitly-generated subexpressions req...
ExprResult ActOnBlockStmtExpr(SourceLocation CaretLoc, Stmt *Body, Scope *CurScope)
ActOnBlockStmtExpr - This is called when the body of a block statement literal was successfully compl...
void DiagnoseDeletedDefaultedFunction(FunctionDecl *FD)
Produce notes explaining why a defaulted function was defined as deleted.
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
Run some code with "sufficient" stack space.
void MarkMemberReferenced(MemberExpr *E)
Perform reference-marking and odr-use handling for a MemberExpr.
bool DiagnoseAssignmentResult(AssignConvertType ConvTy, SourceLocation Loc, QualType DstType, QualType SrcType, Expr *SrcExpr, AssignmentAction Action, bool *Complained=nullptr)
DiagnoseAssignmentResult - Emit a diagnostic, if required, for the assignment conversion type specifi...
void MarkFunctionReferenced(SourceLocation Loc, FunctionDecl *Func, bool MightBeOdrUse=true)
Mark a function referenced, and check whether it is odr-used (C++ [basic.def.odr]p2,...
ExprResult ActOnStmtExprResult(ExprResult E)
ExprResult ActOnPostfixUnaryOp(Scope *S, SourceLocation OpLoc, tok::TokenKind Kind, Expr *Input)
std::tuple< MangleNumberingContext *, Decl * > getCurrentMangleNumberContext(const DeclContext *DC)
Compute the mangling number context for a lambda expression or block literal.
void DiagnoseEqualityWithExtraParens(ParenExpr *ParenE)
Redundant parentheses over an equality comparison can indicate that the user intended an assignment u...
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD=nullptr)
ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())
Attempts to produce a RecoveryExpr after some AST node cannot be created.
ExprResult ActOnNumericConstant(const Token &Tok, Scope *UDLScope=nullptr)
QualType CheckMatrixLogicalOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
ExprResult BuildInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList, SourceLocation RBraceLoc)
void ActOnBlockStart(SourceLocation CaretLoc, Scope *CurScope)
ActOnBlockStart - This callback is invoked when a block literal is started.
bool IsFunctionConversion(QualType FromType, QualType ToType) const
Determine whether the conversion from FromType to ToType is a valid conversion of ExtInfo/ExtProtoInf...
ExprResult ActOnArraySubscriptExpr(Scope *S, Expr *Base, SourceLocation LLoc, MultiExprArg ArgExprs, SourceLocation RLoc)
ExprResult ActOnCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig=nullptr)
ActOnCallExpr - Handle a call to Fn with the specified array of arguments.
ExprResult ActOnUnaryExprOrTypeTraitExpr(SourceLocation OpLoc, UnaryExprOrTypeTrait ExprKind, bool IsType, void *TyOrEx, SourceRange ArgRange)
ActOnUnaryExprOrTypeTraitExpr - Handle sizeof(type) and sizeof expr and the same for alignof and __al...
QualType PreferredConditionType(ConditionKind K) const
@ LOLR_ErrorNoDiagnostic
The lookup found no match but no diagnostic was issued.
@ LOLR_Raw
The lookup found a single 'raw' literal operator, which expects a string literal containing the spell...
@ LOLR_Error
The lookup resulted in an error.
@ LOLR_Cooked
The lookup found a single 'cooked' literal operator, which expects a normal literal to be built and p...
@ LOLR_StringTemplatePack
The lookup found an overload set of literal operator templates, which expect the character type and c...
@ LOLR_Template
The lookup found an overload set of literal operator templates, which expect the characters of the sp...
void ActOnBlockArguments(SourceLocation CaretLoc, Declarator &ParamInfo, Scope *CurScope)
ActOnBlockArguments - This callback allows processing of block arguments.
QualType CheckRemainderOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign=false)
@ Diagnose
Diagnose issues that are non-constant or that are extensions.
std::pair< ValueDecl *, SourceLocation > PendingImplicitInstantiation
An entity for which implicit template instantiation is required.
unsigned getTemplateDepth(Scope *S) const
Determine the number of levels of enclosing template parameters.
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
void checkEnumArithmeticConversions(Expr *LHS, Expr *RHS, SourceLocation Loc, ArithConvKind ACK)
Check that the usual arithmetic conversions can be performed on this pair of expressions that might b...
static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo=nullptr)
bool IsStringLiteralToNonConstPointerConversion(Expr *From, QualType ToType)
Helper function to determine whether this is the (deprecated) C++ conversion from a string literal to...
void computeNRVO(Stmt *Body, sema::FunctionScopeInfo *Scope)
Given the set of return statements within a function body, compute the variables that are subject to ...
void checkNonTrivialCUnion(QualType QT, SourceLocation Loc, NonTrivialCUnionContext UseContext, unsigned NonTrivialKind)
Emit diagnostics if a non-trivial C union type or a struct that contains a non-trivial C union is use...
static ConditionResult ConditionError()
ExprResult ActOnConvertVectorExpr(Expr *E, ParsedType ParsedDestTy, SourceLocation BuiltinLoc, SourceLocation RParenLoc)
ActOnConvertVectorExpr - create a new convert-vector expression from the provided arguments.
void HandleFunctionTypeMismatch(PartialDiagnostic &PDiag, QualType FromType, QualType ToType)
HandleFunctionTypeMismatch - Gives diagnostic information for differeing function types.
ExprResult checkUnknownAnyArg(SourceLocation callLoc, Expr *result, QualType ¶mType)
Type-check an expression that's being passed to an __unknown_anytype parameter.
bool ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, FunctionDecl *FDecl, const FunctionProtoType *Proto, ArrayRef< Expr * > Args, SourceLocation RParenLoc, bool ExecConfig=false)
ConvertArgumentsForCall - Converts the arguments specified in Args/NumArgs to the parameter types of ...
ExprResult ActOnBuiltinOffsetOf(Scope *S, SourceLocation BuiltinLoc, SourceLocation TypeLoc, ParsedType ParsedArgTy, ArrayRef< OffsetOfComponent > Components, SourceLocation RParenLoc)
SemaPseudoObject & PseudoObject()
bool hasAnyUnrecoverableErrorsInThisFunction() const
Determine whether any errors occurred within this function/method/ block.
bool CheckAltivecInitFromScalar(SourceRange R, QualType VecTy, QualType SrcTy)
ExprResult HandleExprEvaluationContextForTypeof(Expr *E)
ExprResult ActOnInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList, SourceLocation RBraceLoc)
bool isCheckingDefaultArgumentOrInitializer() const
bool CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall, const FunctionProtoType *Proto)
CheckFunctionCall - Check a direct function call for various correctness and safety properties not st...
SmallVector< std::pair< Scope *, SourceLocation >, 2 > CurrentDefer
Stack of '_Defer' statements that are currently being parsed, as well as the locations of their '_Def...
bool CheckCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *Init=nullptr, bool SkipImmediateInvocations=true)
Instantiate or parse a C++ default argument expression as necessary.
void DiagnoseImmediateEscalatingReason(FunctionDecl *FD)
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
ExprResult CreateBuiltinMatrixSubscriptExpr(Expr *Base, Expr *RowIdx, Expr *ColumnIdx, SourceLocation RBLoc)
Represents a function call to one of __builtin_LINE(), __builtin_COLUMN(), __builtin_FUNCTION(),...
SourceLocation getBeginLoc() const
const DeclContext * getParentContext() const
If the SourceLocExpr has been resolved return the subexpression representing the resolved value.
SourceLocation getEndLoc() const
SourceLocIdentKind getIdentKind() const
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
bool isInMainFile(SourceLocation Loc) const
Returns whether the PresumedLoc for a given SourceLocation is in the main file.
bool isInSystemMacro(SourceLocation loc) const
Returns whether Loc is expanded from a macro in a system header.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
StandardConversionSequence - represents a standard conversion sequence (C++ 13.3.3....
ImplicitConversionKind Second
Second - The second conversion can be an integral promotion, floating point promotion,...
void setAsIdentityConversion()
StandardConversionSequence - Set the standard conversion sequence to the identity conversion.
void setToType(unsigned Idx, QualType T)
NarrowingKind getNarrowingKind(ASTContext &Context, const Expr *Converted, APValue &ConstantValue, QualType &ConstantType, bool IgnoreFloatToIntegralConversion=false) const
Check if this standard conversion sequence represents a narrowing conversion, according to C++11 [dcl...
StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
StmtVisitor - This class implements a simple visitor for Stmt subclasses.
Stmt - This represents one statement.
SourceLocation getEndLoc() const LLVM_READONLY
StmtClass getStmtClass() const
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteralParser - This decodes string escape characters and performs wide string analysis and Tra...
StringLiteral - This represents a string literal expression, e.g.
unsigned getLength() const
static StringLiteral * Create(const ASTContext &Ctx, StringRef Str, StringLiteralKind Kind, bool Pascal, QualType Ty, ArrayRef< SourceLocation > Locs)
This is the "fully general" constructor that allows representation of strings formed from one or more...
uint32_t getCodeUnit(size_t i) const
StringRef getString() const
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
void setElaboratedKeywordLoc(SourceLocation Loc)
Exposes information about the current target.
virtual bool hasLongDoubleType() const
Determine whether the long double type is supported on this target.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
@ CharPtrBuiltinVaList
typedef char* __builtin_va_list;
virtual bool useFP16ConversionIntrinsics() const
Check whether conversions to and from __fp16 should go through an integer bitcast with i16.
bool shouldUseMicrosoftCCforMangling() const
Should the Microsoft mangling scheme be used for C Calling Convention.
virtual bool hasFeature(StringRef Feature) const
Determine whether the given target has the given feature.
A convenient class for passing around template argument information.
void setLAngleLoc(SourceLocation Loc)
void setRAngleLoc(SourceLocation Loc)
void addArgument(const TemplateArgumentLoc &Loc)
Location wrapper for a TemplateArgument.
Represents a template argument.
Expr * getAsExpr() const
Retrieve the template argument as an expression.
bool isDependent() const
Whether this template argument is dependent on a template parameter such that its result can change f...
ValueDecl * getAsDecl() const
Retrieve the declaration for a declaration non-type template argument.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
The base class of all kinds of template declarations (e.g., class, function, etc.).
Represents a C++ template name within the type system.
A template parameter object.
Token - This structure provides full information about a lexed token.
void setKind(tok::TokenKind K)
void startToken()
Reset all flags to cleared.
Represents a declaration of a type.
SourceLocation getBeginLoc() const LLVM_READONLY
TyLocType push(QualType T)
Pushes space for a new TypeLoc of the given type.
TypeSpecTypeLoc pushTypeSpec(QualType T)
Pushes space for a typespec TypeLoc.
TypeSourceInfo * getTypeSourceInfo(ASTContext &Context, QualType T)
Creates a TypeSourceInfo for the given type.
Base wrapper for a particular "section" of type source info.
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
void initializeFullCopy(TypeLoc Other)
Initializes this by copying its information from another TypeLoc of the same type.
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
SourceRange getLocalSourceRange() const
Get the local source range.
T getAsAdjusted() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
SourceLocation getBeginLoc() const
Get the begin source location.
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
QualType getType() const
Return the type wrapped by this type source info.
void setNameLoc(SourceLocation Loc)
The base class of the type hierarchy.
bool isIncompleteOrObjectType() const
Return true if this is an incomplete or object type, in other words, not a function type.
bool isFixedPointOrIntegerType() const
Return true if this is a fixed point or integer type.
bool isBlockPointerType() const
bool isBooleanType() const
bool isObjCBuiltinType() const
bool isMFloat8Type() const
bool hasAttr(attr::Kind AK) const
Determine whether this type had the specified attribute applied to it (looking through top-level type...
const Type * getPointeeOrArrayElementType() const
If this is a pointer type, return the pointee type.
bool isIncompleteArrayType() const
bool isPlaceholderType() const
Test for a type which does not represent an actual type-system type but is instead used as a placehol...
bool isComplexType() const
isComplexType() does not include complex integers (a GCC extension).
bool isIntegralOrUnscopedEnumerationType() const
Determine whether this type is an integral or unscoped enumeration type.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool canDecayToPointerType() const
Determines whether this type can decay to a pointer type.
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool hasIntegerRepresentation() const
Determine whether this type has an integer representation of some sort, e.g., it is an integer type o...
bool isVoidPointerType() const
const ComplexType * getAsComplexIntegerType() const
bool isFunctionPointerType() const
bool isArithmeticType() const
bool isConstantMatrixType() const
bool isPointerType() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
bool isSVESizelessBuiltinType() const
Returns true for SVE scalable vector types.
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isSignedFixedPointType() const
Return true if this is a fixed point type that is signed according to ISO/IEC JTC1 SC22 WG14 N1169.
bool isEnumeralType() const
bool isScalarType() const
bool isVariableArrayType() const
bool isSizelessBuiltinType() const
bool isSveVLSBuiltinType() const
Determines if this is a sizeless type supported by the 'arm_sve_vector_bits' type attribute,...
bool isIntegralType(const ASTContext &Ctx) const
Determine whether this type is an integral type.
bool isObjCQualifiedIdType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
bool hasUnsignedIntegerRepresentation() const
Determine whether this type has an unsigned integer representation of some sort, e....
bool isExtVectorType() const
bool isAnyCharacterType() const
Determine whether this type is any of the built-in character types.
bool isExtVectorBoolType() const
QualType getSveEltType(const ASTContext &Ctx) const
Returns the representative type for the element of an SVE builtin type.
bool isNonOverloadPlaceholderType() const
Test for a placeholder type other than Overload; see BuiltinType::isNonOverloadPlaceholderType.
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isBitIntType() const
bool isSpecificBuiltinType(unsigned K) const
Test for a particular builtin type.
bool isBuiltinType() const
Helper methods to distinguish type categories.
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isAnyComplexType() const
bool isFixedPointType() const
Return true if this is a fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
bool isSaturatedFixedPointType() const
Return true if this is a saturated fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
ScalarTypeKind getScalarTypeKind() const
Given that this is a scalar type, classify it.
const BuiltinType * getAsPlaceholderType() const
bool hasSignedIntegerRepresentation() const
Determine whether this type has an signed integer representation of some sort, e.g....
bool isWebAssemblyTableType() const
Returns true if this is a WebAssembly table type: either an array of reference types,...
bool isMemberPointerType() const
bool isAtomicType() const
bool isOverloadableType() const
Determines whether this is a type for which one can define an overloaded operator.
bool isObjCIdType() const
bool isMatrixType() const
EnumDecl * castAsEnumDecl() const
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
bool isComplexIntegerType() const
bool isUnscopedEnumerationType() const
bool isObjCObjectType() const
bool isBlockCompatibleObjCPointerType(ASTContext &ctx) const
const ArrayType * getAsArrayTypeUnsafe() const
A variant of getAs<> for array types which silently discards qualifiers from the outermost type.
bool isObjCLifetimeType() const
Returns true if objects of this type have lifetime semantics under ARC.
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
bool isHLSLResourceRecord() const
EnumDecl * getAsEnumDecl() const
Retrieves the EnumDecl this type refers to.
bool isDoubleType() const
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isFunctionType() const
bool isObjCObjectPointerType() const
bool hasFloatingRepresentation() const
Determine whether this type has a floating-point representation of some sort, e.g....
bool isUnsignedFixedPointType() const
Return true if this is a fixed point type that is unsigned according to ISO/IEC JTC1 SC22 WG14 N1169.
bool isVectorType() const
bool isObjCQualifiedClassType() const
bool isObjCClassType() const
bool isRealFloatingType() const
Floating point categories.
bool isRVVSizelessBuiltinType() const
Returns true for RVV scalable vector types.
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
bool isFloatingType() const
bool isUnsignedIntegerType() const
Return true if this is an integer type that is unsigned, according to C99 6.2.5p6 [which returns true...
const T * castAsCanonical() const
Return this type's canonical type cast to the specified type.
bool isAnyPointerType() const
TypeClass getTypeClass() const
bool isSubscriptableVectorType() const
const T * getAs() const
Member-template getAs<specific type>'.
bool isNullPtrType() const
bool isRecordType() const
bool isHLSLResourceRecordArray() const
std::optional< NullabilityKind > getNullability() const
Determine the nullability of the given type.
bool isScopedEnumeralType() const
Determine whether this type is a scoped enumeration type.
bool isUnicodeCharacterType() const
bool hasBooleanRepresentation() const
Determine whether this type has a boolean representation – i.e., it is a boolean type,...
Wrapper for source info for typedefs.
Simple class containing the result of Sema::CorrectTypo.
IdentifierInfo * getCorrectionAsIdentifierInfo() const
std::string getAsString(const LangOptions &LO) const
SourceRange getCorrectionRange() const
void WillReplaceSpecifier(bool ForceReplacement)
DeclClass * getCorrectionDeclAs() const
DeclarationName getCorrection() const
Gets the DeclarationName of the typo correction.
bool isOverloaded() const
NestedNameSpecifier getCorrectionSpecifier() const
Gets the NestedNameSpecifier needed to use the typo correction.
NamedDecl * getFoundDecl() const
Get the correction declaration found by name lookup (before we looked through using shadow declaratio...
UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated) expression operand.
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
SourceLocation getOperatorLoc() const
getOperatorLoc - Return the location of the operator.
Expr * getSubExpr() const
static OverloadedOperatorKind getOverloadedOperator(Opcode Opc)
Retrieve the overloaded operator kind that corresponds to the given unary opcode.
static bool isIncrementDecrementOp(Opcode Op)
static UnaryOperator * Create(const ASTContext &C, Expr *input, Opcode opc, QualType type, ExprValueKind VK, ExprObjectKind OK, SourceLocation l, bool CanOverflow, FPOptionsOverride FPFeatures)
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
Represents a C++ unqualified-id that has been parsed.
void setIdentifier(const IdentifierInfo *Id, SourceLocation IdLoc)
Specify that this unqualified-id was parsed as an identifier.
UnqualifiedIdKind getKind() const
Determine what kind of name we have.
TemplateIdAnnotation * TemplateId
When Kind == IK_TemplateId or IK_ConstructorTemplateId, the template-id annotation that contains the ...
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
static UnresolvedLookupExpr * Create(const ASTContext &Context, CXXRecordDecl *NamingClass, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool RequiresADL, UnresolvedSetIterator Begin, UnresolvedSetIterator End, bool KnownDependent, bool KnownInstantiationDependent)
Represents a C++ member access expression for which lookup produced a set of overloaded functions.
CXXRecordDecl * getNamingClass()
Retrieve the naming class of this lookup.
bool isImplicitAccess() const
True if this is an implicit access, i.e., one in which the member being accessed was not written in t...
A set of unresolved declarations.
A set of unresolved declarations.
A call to a literal operator (C++11 [over.literal]) written as a user-defined literal (C++11 [lit....
Represents a call to the builtin function __builtin_va_arg.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
void setType(QualType newType)
bool isWeak() const
Determine whether this symbol is weakly-imported, or declared with the weak or weak-ref attr.
VarDecl * getPotentiallyDecomposedVarDecl()
Represents a variable declaration or definition.
VarDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool isInitCapture() const
Whether this variable is the implicit variable for a lambda init-capture.
bool 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.
const FunctionProtoType * T
ImplicitConversionKind
ImplicitConversionKind - The kind of implicit conversion used to convert an argument to a parameter's...
@ ICK_Complex_Conversion
Complex conversions (C99 6.3.1.6)
@ ICK_Integral_Conversion
Integral conversions (C++ [conv.integral])
@ ICK_Floating_Integral
Floating-integral conversions (C++ [conv.fpint])
@ ICK_HLSL_Array_RValue
HLSL non-decaying array rvalue cast.
@ ICK_Array_To_Pointer
Array-to-pointer conversion (C++ [conv.array])
@ ICK_Identity
Identity conversion (no conversion)
@ ICK_Lvalue_To_Rvalue
Lvalue-to-rvalue conversion (C++ [conv.lval])
@ ICK_Floating_Conversion
Floating point conversions (C++ [conv.double].
@ ICK_Complex_Real
Complex-real conversions (C99 6.3.1.7)
@ ICK_Function_To_Pointer
Function-to-pointer (C++ [conv.array])
AssignConvertType
AssignConvertType - All of the 'assignment' semantic checks return this enum to indicate whether the ...
@ IncompatiblePointer
IncompatiblePointer - The assignment is between two pointers types that are not compatible,...
@ Incompatible
Incompatible - We reject this conversion outright, it is invalid to represent it in the AST.
@ IntToPointer
IntToPointer - The assignment converts an int to a pointer, which we accept as an extension.
@ IncompatibleVectors
IncompatibleVectors - The assignment is between two vector types that have the same size,...
@ IncompatibleNestedPointerAddressSpaceMismatch
IncompatibleNestedPointerAddressSpaceMismatch - The assignment changes address spaces in nested point...
@ IncompatibleObjCWeakRef
IncompatibleObjCWeakRef - Assigning a weak-unavailable object to an object with __weak qualifier.
@ IntToBlockPointer
IntToBlockPointer - The assignment converts an int to a block pointer.
@ 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...
@ PointerToInt
PointerToInt - The assignment converts a pointer to an int, which we accept as an extension.
@ FunctionVoidPointer
FunctionVoidPointer - The assignment is between a function pointer and void*, which the standard does...
@ IncompatibleNestedPointerQualifiers
IncompatibleNestedPointerQualifiers - The assignment is between two nested pointer types,...
@ IncompatibleFunctionPointer
IncompatibleFunctionPointer - The assignment is between two function pointers types that are not comp...
@ IncompatiblePointerSign
IncompatiblePointerSign - The assignment is between two pointers types which point to integers which ...
@ IncompatibleBlockPointer
IncompatibleBlockPointer - The assignment is between two block pointers types that are not compatible...
bool isFunctionLocalStringLiteralMacro(tok::TokenKind K, const LangOptions &LO)
Return true if the token corresponds to a function local predefined macro, which expands to a string ...
@ Type
The name was classified as a type.
LangAS
Defines the address space values used by the address space qualifier of QualType.
CastKind
CastKind - The kind of operation required for a conversion.
MutableArrayRef< ParsedTemplateArgument > ASTTemplateArgsPtr
bool isLambdaConversionOperator(CXXConversionDecl *C)
OverloadedOperatorKind getRewrittenOverloadedOperator(OverloadedOperatorKind Kind)
Get the other overloaded operator that the given operator can be rewritten into, if any such operator...
@ TNK_Var_template
The name refers to a variable template whose specialization produces a variable.
@ TNK_Concept_template
The name refers to a concept.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
bool isPtrSizeAddressSpace(LangAS AS)
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
const char * getTraitSpelling(ExpressionTrait T) LLVM_READONLY
Return the spelling of the type trait TT. Never null.
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
@ NK_Not_Narrowing
Not a narrowing conversion.
@ NK_Constant_Narrowing
A narrowing conversion, because a constant expression got narrowed.
@ NK_Dependent_Narrowing
Cannot tell whether this is a narrowing conversion because the expression is value-dependent.
@ NK_Type_Narrowing
A narrowing conversion by virtue of the source and destination types.
@ NK_Variable_Narrowing
A narrowing conversion, because a non-constant-expression variable might have got narrowed.
DynamicRecursiveASTVisitorBase< false > DynamicRecursiveASTVisitor
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
CallingConv
CallingConv - Specifies the calling convention that a function uses.
@ AltiVecBool
is AltiVec 'vector bool ...'
@ SveFixedLengthData
is AArch64 SVE fixed-length data vector
@ AltiVecVector
is AltiVec vector
@ AltiVecPixel
is AltiVec 'vector Pixel'
@ Generic
not a target-specific vector type
@ RVVFixedLengthData
is RISC-V RVV fixed-length data vector
@ RVVFixedLengthMask
is RISC-V RVV fixed-length mask vector
@ SveFixedLengthPredicate
is AArch64 SVE fixed-length predicate vector
U cast(CodeGen::Address addr)
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
@ None
No keyword precedes the qualified type name.
bool isLambdaMethod(const DeclContext *DC)
llvm::omp::Clause OpenMPClauseKind
OpenMP clauses.
ActionResult< Expr * > ExprResult
@ Other
Other implicit parameter.
@ Implicit
An implicit conversion.
ActionResult< Stmt * > StmtResult
bool isGenericLambdaCallOperatorSpecialization(const CXXMethodDecl *MD)
NonOdrUseReason
The reason why a DeclRefExpr does not constitute an odr-use.
@ NOUR_Discarded
This name appears as a potential result of a discarded value expression.
@ NOUR_Unevaluated
This name appears in an unevaluated operand.
@ NOUR_None
This is an odr-use.
@ NOUR_Constant
This name appears as a potential result of an lvalue-to-rvalue conversion that is a constant expressi...
Represents an element in a path from a derived class to a base class.
The class facilities generation and storage of conversion FixIts.
OverloadFixItKind Kind
The type of fix applied.
bool tryToFixConversion(const Expr *FromExpr, const QualType FromQTy, const QualType ToQTy, Sema &S)
If possible, generates and stores a fix for the given conversion.
std::vector< FixItHint > Hints
The list of Hints generated so far.
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
DeclarationName getName() const
getName - Returns the embedded declaration name.
void setCXXLiteralOperatorNameLoc(SourceLocation Loc)
setCXXLiteralOperatorNameLoc - Sets the location of the literal operator name (not the operator keywo...
SourceLocation getBeginLoc() const
getBeginLoc - Retrieve the location of the first token.
SourceRange getSourceRange() const LLVM_READONLY
getSourceRange - The range of the declaration name.
SourceLocation getEndLoc() const LLVM_READONLY
Stores data related to a single embed directive.
EvalResult is a struct with detailed info about an evaluated expression.
APValue Val
Val - This is the value the expression can be folded to.
SmallVectorImpl< PartialDiagnosticAt > * Diag
Diag - If this is non-null, it will be filled in with a stack of notes indicating why evaluation fail...
bool HasUndefinedBehavior
Whether the evaluation hit undefined behavior.
bool HasSideEffects
Whether the evaluated expression has side effects.
Extra information about a function prototype.
FunctionType::ExtInfo ExtInfo
bool IsAddressOfOperandWithParen
bool HasFormOfMemberPointer
OverloadExpr * Expression
@ DefaultFunctionArgumentInstantiation
We are instantiating a default argument for a function.
Data structure used to record current or nested expression evaluation contexts.
llvm::SmallPtrSet< const Expr *, 8 > PossibleDerefs
bool InLifetimeExtendingContext
Whether we are currently in a context in which all temporaries must be lifetime-extended,...
Decl * ManglingContextDecl
The declaration that provides context for lambda expressions and block literals if the normal declara...
bool InDiscardedStatement
bool InImmediateFunctionContext
SmallVector< Expr *, 2 > VolatileAssignmentLHSs
Expressions appearing as the LHS of a volatile assignment in this context.
bool isUnevaluated() const
llvm::SmallPtrSet< DeclRefExpr *, 4 > ReferenceToConsteval
Set of DeclRefExprs referencing a consteval function when used in a context not already known to be i...
llvm::SmallVector< ImmediateInvocationCandidate, 4 > ImmediateInvocationCandidates
Set of candidates for starting an immediate invocation.
bool isImmediateFunctionContext() const
SmallVector< MaterializeTemporaryExpr *, 8 > ForRangeLifetimeExtendTemps
P2718R0 - Lifetime extension in range-based for loops.
enum clang::Sema::ExpressionEvaluationContextRecord::ExpressionKind ExprContext
SmallVector< LambdaExpr *, 2 > Lambdas
The lambdas that are present within this context, if it is indeed an unevaluated context.
ExpressionKind
Describes whether we are in an expression constext which we have to handle differently.
MaybeODRUseExprSet SavedMaybeODRUseExprs
CleanupInfo ParentCleanup
Whether the enclosing context needed a cleanup.
bool isConstantEvaluated() const
bool isDiscardedStatementContext() const
ExpressionEvaluationContext Context
The expression evaluation context.
bool InImmediateEscalatingFunctionContext
unsigned NumCleanupObjects
The number of active cleanup objects when we entered this expression evaluation context.
Abstract class used to diagnose incomplete types.
Location information for a TemplateArgument.
TemplateNameKind Kind
The kind of template that Template refers to.
unsigned NumArgs
NumArgs - The number of template arguments.
SourceLocation TemplateNameLoc
TemplateNameLoc - The location of the template name within the source.
ParsedTemplateArgument * getTemplateArgs()
Retrieves a pointer to the template arguments.
SourceLocation RAngleLoc
The location of the '>' after the template argument list.
SourceLocation LAngleLoc
The location of the '<' before the template argument list.
ParsedTemplateTy Template
The declaration of the template corresponding to the template-name.
Describes an entity that is being assigned.