21#include "clang/AST/Attrs.inc"
63#include "llvm/ADT/STLExtras.h"
64#include "llvm/ADT/StringExtras.h"
65#include "llvm/Support/ConvertUTF.h"
66#include "llvm/Support/SaveAndRestore.h"
67#include "llvm/Support/TimeProfiler.h"
68#include "llvm/Support/TypeSize.h"
93 if (TreatUnavailableAsInvalid &&
111 if (
const auto *A = D->
getAttr<UnusedAttr>()) {
114 if (A->getSemanticSpelling() != UnusedAttr::CXX11_maybe_unused &&
115 A->getSemanticSpelling() != UnusedAttr::C23_maybe_unused) {
117 if (DC && !DC->
hasAttr<UnusedAttr>())
118 S.
Diag(Loc, diag::warn_used_but_marked_unused) << D;
126 if (
Decl->isDefaulted()) {
137 auto *Ctor = dyn_cast<CXXConstructorDecl>(
Decl);
138 if (Ctor && Ctor->isInheritingConstructor())
149 if (I->getStorageClass() !=
SC_None)
200 DiagID = diag::warn_c2y_compat_internal_in_extern_inline;
201 else if ((UsedFn && (UsedFn->
isInlined() || UsedFn->
hasAttr<ConstAttr>())) ||
203 DiagID = diag::ext_internal_in_extern_inline_quiet;
205 DiagID = diag::ext_internal_in_extern_inline;
207 S.
Diag(Loc, DiagID) << !UsedFn << D;
219 Diag(DeclBegin, diag::note_convert_inline_to_static)
226 bool ObjCPropertyAccess,
227 bool AvoidPartialAvailabilityChecks,
229 bool SkipTrailingRequiresClause) {
236 for (
const auto &[DiagLoc, PD] : Pos->second) {
250 Diag(Loc, diag::ext_main_used);
258 Diag(Loc, diag::err_binding_cannot_appear_in_own_initializer)
261 Diag(Loc, diag::err_auto_variable_cannot_appear_in_own_initializer)
270 if (FD->isDeleted()) {
271 auto *Ctor = dyn_cast<CXXConstructorDecl>(FD);
272 if (Ctor && Ctor->isInheritingConstructor())
273 Diag(Loc, diag::err_deleted_inherited_ctor_use)
275 << Ctor->getInheritedConstructor().getConstructor()->getParent();
278 Diag(Loc, diag::err_deleted_function_use)
279 << (Msg !=
nullptr) << (Msg ? Msg->
getString() : StringRef());
293 if (!SkipTrailingRequiresClause && FD->getTrailingRequiresClause()) {
302 diag::err_reference_to_function_with_unsatisfied_constraints)
320 if (
auto *
Concept = dyn_cast<ConceptDecl>(D);
324 if (
auto *MD = dyn_cast<CXXMethodDecl>(D)) {
326 if (MD->getParent()->isLambda() &&
329 MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator())) {
330 Diag(Loc, diag::warn_cxx17_compat_lambda_def_ctor_assign)
335 auto getReferencedObjCProp = [](
const NamedDecl *D) ->
337 if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D))
338 return MD->findPropertyDecl();
352 auto *DRD = dyn_cast<OMPDeclareReductionDecl>(
CurContext);
355 Diag(Loc, diag::err_omp_wrong_var_in_declare_reduction)
368 Diag(Loc, diag::err_omp_declare_mapper_wrong_var)
374 if (
const auto *EmptyD = dyn_cast<UnresolvedUsingIfExistsDecl>(D)) {
375 Diag(Loc, diag::err_use_of_empty_using_if_exists);
376 Diag(EmptyD->getLocation(), diag::note_empty_using_if_exists_here);
381 AvoidPartialAvailabilityChecks, ClassReceiver);
387 if (D->
hasAttr<AvailableOnlyInDefaultEvalMethodAttr>()) {
390 PP.getLastFPEvalPragmaLocation().isValid() &&
391 PP.getCurrentFPEvalMethod() !=
getLangOpts().getFPEvalMethod())
393 diag::err_type_available_only_in_default_eval_method)
397 if (
auto *VD = dyn_cast<ValueDecl>(D))
402 if (!
Context.getTargetInfo().isTLSSupported())
403 if (
const auto *VD = dyn_cast<VarDecl>(D))
405 targetDiag(*Locs.begin(), diag::err_thread_unsupported);
413 const SentinelAttr *
Attr = D->
getAttr<SentinelAttr>();
418 unsigned NumFormalParams;
422 enum { CK_Function, CK_Method, CK_Block } CalleeKind;
424 if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D)) {
425 NumFormalParams = MD->param_size();
426 CalleeKind = CK_Method;
427 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
428 NumFormalParams = FD->param_size();
429 CalleeKind = CK_Function;
430 }
else if (
const auto *VD = dyn_cast<VarDecl>(D)) {
437 CalleeKind = CK_Function;
440 CalleeKind = CK_Block;
445 if (
const auto *proto = dyn_cast<FunctionProtoType>(Fn))
446 NumFormalParams = proto->getNumParams();
457 unsigned NullPos =
Attr->getNullPos();
458 assert((NullPos == 0 || NullPos == 1) &&
"invalid null position on sentinel");
459 NumFormalParams = (NullPos > NumFormalParams ? 0 : NumFormalParams - NullPos);
462 unsigned NumArgsAfterSentinel =
Attr->getSentinel();
466 if (Args.size() < NumFormalParams + NumArgsAfterSentinel + 1) {
473 const Expr *SentinelExpr = Args[Args.size() - NumArgsAfterSentinel - 1];
478 if (
Context.isSentinelNullExpr(SentinelExpr))
486 std::string NullValue;
487 if (CalleeKind == CK_Method &&
PP.isMacroDefined(
"nil"))
490 NullValue =
"nullptr";
491 else if (
PP.isMacroDefined(
"NULL"))
494 NullValue =
"(void*) 0";
497 Diag(Loc, diag::warn_missing_sentinel) <<
int(CalleeKind);
499 Diag(MissingNilLoc, diag::warn_missing_sentinel)
524 assert(!Ty.
isNull() &&
"DefaultFunctionArrayConversion - missing type");
528 if (
auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl()))
533 CK_FunctionToPointerDecay).
get();
548 CK_ArrayToPointerDecay);
564 if (UO && UO->getOpcode() == UO_Deref &&
565 UO->getSubExpr()->getType()->isPointerType()) {
567 UO->getSubExpr()->getType()->getPointeeType().getAddressSpace();
570 UO->getSubExpr()->IgnoreParenCasts()->isNullPointerConstant(
572 !UO->getType().isVolatileQualified()) {
574 S.
PDiag(diag::warn_indirection_through_null)
575 << UO->getSubExpr()->getSourceRange());
577 S.
PDiag(diag::note_indirection_through_null));
597 BaseType = BaseType->getPointeeType();
609 if (ObjectSetClass) {
653 assert(!
T.isNull() &&
"r-value conversion on typeless expression?");
657 if (
T->canDecayToPointerType())
663 if (
T ==
Context.OverloadTy ||
T->isRecordType() ||
664 (
T->isDependentType() && !
T->isAnyPointerType() &&
665 !
T->isMemberPointerType()))
689 &
Context.Idents.get(
"object_getClass"),
695 SourceRange(OISA->getOpLoc(), OISA->getIsaMemberLoc()),
")");
712 if (
T.hasQualifiers())
713 T =
T.getUnqualifiedType();
716 if (
T->isMemberPointerType() &&
717 Context.getTargetInfo().getCXXABI().isMicrosoft())
728 Cleanup.setExprNeedsCleanups(
true);
731 Cleanup.setExprNeedsCleanups(
true);
738 CastKind CK =
T->isNullPtrType() ? CK_NullToPointer : CK_LValueToRValue;
746 T =
Atomic->getValueType().getUnqualifiedType();
771 CK_FunctionToPointerDecay);
785 assert(!Ty.
isNull() &&
"UsualUnaryFPConversions - missing type");
791 PP.getLastFPEvalPragmaLocation().isValid())) {
792 switch (EvalMethod) {
794 llvm_unreachable(
"Unrecognized float evaluation method");
797 llvm_unreachable(
"Float evaluation method should be set by now");
805 CK_FloatingComplexCast)
814 CK_FloatingComplexCast)
846 assert(!Ty.
isNull() &&
"UsualUnaryConversions - missing type");
870 if (
Context.isPromotableIntegerType(Ty)) {
885 assert(!Ty.
isNull() &&
"DefaultArgumentPromotion - missing type");
897 if (BTy && (BTy->
getKind() == BuiltinType::Half ||
898 BTy->
getKind() == BuiltinType::Float)) {
901 if (BTy->
getKind() == BuiltinType::Half) {
912 Context.getTypeSizeInChars(BTy) <
918 assert(8 ==
Context.getTypeSizeInChars(
Context.LongLongTy).getQuantity() &&
919 "Unexpected typesize for LongLongTy");
973 if (
Context.getTargetInfo().getTriple().isWasm() &&
988 if (!
Record->hasNonTrivialCopyConstructor() &&
989 !
Record->hasNonTrivialMoveConstructor() &&
990 !
Record->hasNonTrivialDestructor())
1023 PDiag(diag::warn_cxx98_compat_pass_non_pod_arg_to_vararg) << Ty << CT);
1030 PDiag(diag::warn_pass_class_arg_to_vararg)
1038 PDiag(diag::warn_cannot_pass_non_pod_arg_to_vararg)
1045 diag::err_cannot_pass_non_trivial_c_struct_to_vararg)
1049 PDiag(diag::err_cannot_pass_objc_interface_to_vararg)
1062 if (PlaceholderTy->getKind() == BuiltinType::ARCUnbridgedCast &&
1064 (FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>()))) {
1103 if (
Call.isInvalid())
1108 if (Comma.isInvalid())
1115 diag::err_call_incomplete_argument))
1133 if (SkipCast)
return false;
1140 CK_IntegralComplexToFloatingComplex);
1158 bool PromotePrecision) {
1163 if (PromotePrecision) {
1168 if (LongerIsComplex)
1180 QualType RHSType,
bool IsCompAssign) {
1205 bool ConvertFloat,
bool ConvertInt) {
1210 CK_IntegralToFloating);
1221 CK_IntegralComplexToFloatingComplex);
1226 CK_FloatingRealToComplex);
1235 QualType RHSType,
bool IsCompAssign) {
1245 else if (!IsCompAssign)
1247 return LHSFloat ? LHSType : RHSType;
1252 if (LHSFloat && RHSFloat) {
1259 assert(order < 0 &&
"illegal float comparison");
1293 QualType LHSElem = LHSComplex ? LHSComplex->getElementType() : LHSType;
1299 if ((&LHSSem != &llvm::APFloat::PPCDoubleDouble() ||
1300 &RHSSem != &llvm::APFloat::IEEEquad()) &&
1301 (&LHSSem != &llvm::APFloat::IEEEquad() ||
1302 &RHSSem != &llvm::APFloat::PPCDoubleDouble()))
1319 CK_IntegralComplexCast);
1325template <PerformCastFn doLHSCast, PerformCastFn doRHSCast>
1328 QualType RHSType,
bool IsCompAssign) {
1333 if (LHSSigned == RHSSigned) {
1336 RHS = (*doRHSCast)(S, RHS.
get(), LHSType);
1338 }
else if (!IsCompAssign)
1339 LHS = (*doLHSCast)(S, LHS.
get(), RHSType);
1341 }
else if (order != (LHSSigned ? 1 : -1)) {
1345 RHS = (*doRHSCast)(S, RHS.
get(), LHSType);
1347 }
else if (!IsCompAssign)
1348 LHS = (*doLHSCast)(S, LHS.
get(), RHSType);
1355 RHS = (*doRHSCast)(S, RHS.
get(), LHSType);
1357 }
else if (!IsCompAssign)
1358 LHS = (*doLHSCast)(S, LHS.
get(), RHSType);
1367 RHS = (*doRHSCast)(S, RHS.
get(), result);
1369 LHS = (*doLHSCast)(S, LHS.
get(), result);
1379 bool IsCompAssign) {
1383 if (LHSComplexInt && RHSComplexInt) {
1388 (S, LHS, RHS, LHSEltType, RHSEltType, IsCompAssign);
1393 if (LHSComplexInt) {
1397 (S, LHS, RHS, LHSEltType, RHSType, IsCompAssign);
1400 CK_IntegralRealToComplex);
1405 assert(RHSComplexInt);
1410 (S, LHS, RHS, LHSType, RHSEltType, IsCompAssign);
1415 CK_IntegralRealToComplex);
1424 assert(BTy &&
"Expected a builtin type.");
1426 switch (BTy->getKind()) {
1427 case BuiltinType::ShortFract:
1428 case BuiltinType::UShortFract:
1429 case BuiltinType::SatShortFract:
1430 case BuiltinType::SatUShortFract:
1432 case BuiltinType::Fract:
1433 case BuiltinType::UFract:
1434 case BuiltinType::SatFract:
1435 case BuiltinType::SatUFract:
1437 case BuiltinType::LongFract:
1438 case BuiltinType::ULongFract:
1439 case BuiltinType::SatLongFract:
1440 case BuiltinType::SatULongFract:
1442 case BuiltinType::ShortAccum:
1443 case BuiltinType::UShortAccum:
1444 case BuiltinType::SatShortAccum:
1445 case BuiltinType::SatUShortAccum:
1447 case BuiltinType::Accum:
1448 case BuiltinType::UAccum:
1449 case BuiltinType::SatAccum:
1450 case BuiltinType::SatUAccum:
1452 case BuiltinType::LongAccum:
1453 case BuiltinType::ULongAccum:
1454 case BuiltinType::SatLongAccum:
1455 case BuiltinType::SatULongAccum:
1458 if (BTy->isInteger())
1460 llvm_unreachable(
"Unexpected fixed point or integer type");
1472 "Expected at least one of the operands to be a fixed point type");
1475 "Special fixed point arithmetic operation conversions are only "
1476 "applied to ints or other fixed point types");
1498 QualType ResultTy = LHSTyRank > RHSTyRank ? LHSTy : RHSTy;
1521 REnum = R->isUnscopedEnumerationType();
1523 if ((!IsCompAssign && LEnum && R->isFloatingType()) ||
1527 ? diag::warn_arith_conv_enum_float_cxx20
1528 : diag::warn_arith_conv_enum_float)
1531 }
else if (!IsCompAssign && LEnum && REnum &&
1532 !
Context.hasSameUnqualifiedType(L, R)) {
1537 DiagID = diag::warn_conv_mixed_enum_types_cxx26;
1538 else if (!L->
castAsCanonical<EnumType>()->getDecl()->hasNameForLinkage() ||
1539 !R->castAsCanonical<EnumType>()->getDecl()->hasNameForLinkage()) {
1544 ? diag::warn_arith_conv_mixed_anon_enum_types_cxx20
1545 : diag::warn_arith_conv_mixed_anon_enum_types;
1550 ? diag::warn_conditional_mixed_enum_types_cxx20
1551 : diag::warn_conditional_mixed_enum_types;
1556 ? diag::warn_comparison_mixed_enum_types_cxx20
1557 : diag::warn_comparison_mixed_enum_types;
1560 ? diag::warn_arith_conv_mixed_enum_types_cxx20
1561 : diag::warn_arith_conv_mixed_enum_types;
1564 << (int)ACK << L << R;
1582 auto IsSingleCodeUnitCP = [](
const QualType &
T,
const llvm::APSInt &
Value) {
1583 if (
T->isChar8Type())
1584 return llvm::IsSingleCodeUnitUTF8Codepoint(
Value.getExtValue());
1585 if (
T->isChar16Type())
1586 return llvm::IsSingleCodeUnitUTF16Codepoint(
Value.getExtValue());
1587 assert(
T->isChar32Type());
1588 return llvm::IsSingleCodeUnitUTF32Codepoint(
Value.getExtValue());
1601 if (LHSSuccess != RHSuccess) {
1603 if (IsSingleCodeUnitCP(LHSType, Res.
Val.
getInt()) &&
1604 IsSingleCodeUnitCP(RHSType, Res.
Val.
getInt()))
1608 if (!LHSSuccess || !RHSuccess) {
1609 SemaRef.
Diag(Loc, diag::warn_comparison_unicode_mixed_types)
1615 llvm::APSInt LHSValue(32);
1617 llvm::APSInt RHSValue(32);
1620 bool LHSSafe = IsSingleCodeUnitCP(LHSType, LHSValue);
1621 bool RHSSafe = IsSingleCodeUnitCP(RHSType, RHSValue);
1622 if (LHSSafe && RHSSafe)
1625 SemaRef.
Diag(Loc, diag::warn_comparison_unicode_mixed_types_constant)
1635 SemaRef.
Diag(Loc, diag::warn_arith_conv_mixed_unicode_types)
1669 LHSType = AtomicLHS->getValueType();
1672 if (
Context.hasSameType(LHSType, RHSType))
1673 return Context.getCommonSugaredType(LHSType, RHSType);
1681 QualType LHSUnpromotedType = LHSType;
1682 if (
Context.isPromotableIntegerType(LHSType))
1683 LHSType =
Context.getPromotedIntegerType(LHSType);
1685 if (!LHSBitfieldPromoteTy.
isNull())
1686 LHSType = LHSBitfieldPromoteTy;
1691 if (
Context.hasSameType(LHSType, RHSType))
1692 return Context.getCommonSugaredType(LHSType, RHSType);
1731 bool PredicateIsExpr,
void *ControllingExprOrType,
1733 unsigned NumAssocs = ArgTypes.size();
1734 assert(NumAssocs == ArgExprs.size());
1737 for (
unsigned i = 0; i < NumAssocs; ++i) {
1746 if (!PredicateIsExpr) {
1750 assert(ControllingType &&
"couldn't get the type out of the parser");
1751 ControllingExprOrType = ControllingType;
1755 KeyLoc, DefaultLoc, RParenLoc, PredicateIsExpr, ControllingExprOrType,
1763 bool PredicateIsExpr,
void *ControllingExprOrType,
1765 unsigned NumAssocs = Types.size();
1766 assert(NumAssocs == Exprs.size());
1767 assert(ControllingExprOrType &&
1768 "Must have either a controlling expression or a controlling type");
1770 Expr *ControllingExpr =
nullptr;
1772 if (PredicateIsExpr) {
1779 reinterpret_cast<Expr *
>(ControllingExprOrType));
1782 ControllingExpr = R.
get();
1785 ControllingType =
reinterpret_cast<TypeSourceInfo *
>(ControllingExprOrType);
1786 if (!ControllingType)
1790 bool TypeErrorFound =
false,
1791 IsResultDependent = ControllingExpr
1794 ContainsUnexpandedParameterPack =
1804 diag::warn_side_effects_unevaluated_context);
1806 for (
unsigned i = 0; i < NumAssocs; ++i) {
1807 if (Exprs[i]->containsUnexpandedParameterPack())
1808 ContainsUnexpandedParameterPack =
true;
1811 if (Types[i]->
getType()->containsUnexpandedParameterPack())
1812 ContainsUnexpandedParameterPack =
true;
1814 if (Types[i]->
getType()->isDependentType()) {
1815 IsResultDependent =
true;
1832 if (ControllingExpr && Types[i]->
getType()->isIncompleteType())
1833 D =
LangOpts.C2y ? diag::warn_c2y_compat_assoc_type_incomplete
1834 : diag::ext_assoc_type_incomplete;
1835 else if (ControllingExpr && !Types[i]->
getType()->isObjectType())
1836 D = diag::err_assoc_type_nonobject;
1837 else if (Types[i]->
getType()->isVariablyModifiedType())
1838 D = diag::err_assoc_type_variably_modified;
1839 else if (ControllingExpr) {
1858 unsigned Reason = 0;
1867 Diag(Types[i]->getTypeLoc().getBeginLoc(),
1868 diag::warn_unreachable_association)
1869 << QT << (Reason - 1);
1873 Diag(Types[i]->getTypeLoc().getBeginLoc(), D)
1874 << Types[i]->getTypeLoc().getSourceRange() << Types[i]->getType();
1876 D, Types[i]->getTypeLoc().getBeginLoc()) >=
1878 TypeErrorFound =
true;
1883 for (
unsigned j = i+1; j < NumAssocs; ++j)
1884 if (Types[j] && !Types[j]->
getType()->isDependentType() &&
1885 Context.typesAreCompatible(Types[i]->getType(),
1886 Types[j]->getType())) {
1887 Diag(Types[j]->getTypeLoc().getBeginLoc(),
1888 diag::err_assoc_compatible_types)
1889 << Types[j]->getTypeLoc().getSourceRange()
1890 << Types[j]->getType()
1891 << Types[i]->getType();
1892 Diag(Types[i]->getTypeLoc().getBeginLoc(),
1893 diag::note_compat_assoc)
1894 << Types[i]->getTypeLoc().getSourceRange()
1895 << Types[i]->getType();
1896 TypeErrorFound =
true;
1906 if (IsResultDependent) {
1907 if (ControllingExpr)
1909 Types, Exprs, DefaultLoc, RParenLoc,
1910 ContainsUnexpandedParameterPack);
1912 Exprs, DefaultLoc, RParenLoc,
1913 ContainsUnexpandedParameterPack);
1917 unsigned DefaultIndex = std::numeric_limits<unsigned>::max();
1921 for (
unsigned i = 0; i < NumAssocs; ++i) {
1924 else if (ControllingExpr &&
1927 Types[i]->getType()))
1928 CompatIndices.push_back(i);
1929 else if (ControllingType &&
1932 Types[i]->getType()))
1933 CompatIndices.push_back(i);
1936 auto GetControllingRangeAndType = [](
Expr *ControllingExpr,
1940 if (ControllingExpr)
1949 return std::make_pair(SR, QT);
1955 if (CompatIndices.size() > 1) {
1956 auto P = GetControllingRangeAndType(ControllingExpr, ControllingType);
1959 << SR << P.second << (
unsigned)CompatIndices.size();
1960 for (
unsigned I : CompatIndices) {
1961 Diag(Types[I]->getTypeLoc().getBeginLoc(),
1962 diag::note_compat_assoc)
1963 << Types[I]->getTypeLoc().getSourceRange()
1964 << Types[I]->getType();
1972 if (DefaultIndex == std::numeric_limits<unsigned>::max() &&
1973 CompatIndices.size() == 0) {
1974 auto P = GetControllingRangeAndType(ControllingExpr, ControllingType);
1976 Diag(SR.
getBegin(), diag::err_generic_sel_no_match) << SR << P.second;
1985 unsigned ResultIndex =
1986 CompatIndices.size() ? CompatIndices[0] : DefaultIndex;
1988 if (ControllingExpr) {
1990 Context, KeyLoc, ControllingExpr, Types, Exprs, DefaultLoc, RParenLoc,
1991 ContainsUnexpandedParameterPack, ResultIndex);
1994 Context, KeyLoc, ControllingType, Types, Exprs, DefaultLoc, RParenLoc,
1995 ContainsUnexpandedParameterPack, ResultIndex);
2001 llvm_unreachable(
"unexpected TokenKind");
2002 case tok::kw___func__:
2004 case tok::kw___FUNCTION__:
2006 case tok::kw___FUNCDNAME__:
2008 case tok::kw___FUNCSIG__:
2010 case tok::kw_L__FUNCTION__:
2012 case tok::kw_L__FUNCSIG__:
2014 case tok::kw___PRETTY_FUNCTION__:
2025 return cast_or_null<Decl>(DC);
2043 assert(Args.size() <= 2 &&
"too many arguments for literal operator");
2046 for (
unsigned ArgIdx = 0; ArgIdx != Args.size(); ++ArgIdx) {
2047 ArgTy[ArgIdx] = Args[ArgIdx]->getType();
2048 if (ArgTy[ArgIdx]->isArrayType())
2069 std::vector<Token> ExpandedToks;
2075 if (Literal.hadError)
2079 for (
const Token &
Tok : StringToks)
2080 StringTokLocs.push_back(
Tok.getLocation());
2084 false, {}, StringTokLocs);
2086 if (!Literal.getUDSuffix().empty()) {
2089 Literal.getUDSuffixOffset());
2090 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_string_udl));
2110 CurrentDecl =
Context.getTranslationUnitDecl();
2112 std::vector<Token> ExpandedToks;
2113 ExpandedToks.reserve(Toks.size());
2117 ExpandedToks.emplace_back(
Tok);
2121 Diag(
Tok.getLocation(), diag::ext_predef_outside_function);
2123 Diag(
Tok.getLocation(), diag::ext_string_literal_from_predefined)
2126 llvm::raw_svector_ostream
OS(Str);
2127 Token &Exp = ExpandedToks.emplace_back();
2129 if (
Tok.getKind() == tok::kw_L__FUNCTION__ ||
2130 Tok.getKind() == tok::kw_L__FUNCSIG__) {
2132 Exp.
setKind(tok::wide_string_literal);
2134 Exp.
setKind(tok::string_literal);
2140 PP.CreateString(
OS.str(), Exp,
Tok.getLocation(),
Tok.getEndLoc());
2142 return ExpandedToks;
2147 assert(!StringToks.empty() &&
"Must have at least one string!");
2150 std::vector<Token> ExpandedToks;
2155 if (Literal.hadError)
2159 for (
const Token &
Tok : StringToks)
2160 StringTokLocs.push_back(
Tok.getLocation());
2164 if (Literal.isWide()) {
2165 CharTy =
Context.getWideCharType();
2167 }
else if (Literal.isUTF8()) {
2171 CharTy =
Context.UnsignedCharTy;
2173 }
else if (Literal.isUTF16()) {
2176 }
else if (Literal.isUTF32()) {
2179 }
else if (Literal.isPascal()) {
2180 CharTy =
Context.UnsignedCharTy;
2192 ? diag::warn_cxx20_compat_utf8_string
2193 : diag::warn_c23_compat_utf8_string);
2199 auto RemovalDiag =
PDiag(diag::note_cxx20_c23_compat_utf8_string_remove_u8);
2201 for (
const Token &
Tok : StringToks) {
2202 if (
Tok.getKind() == tok::utf8_string_literal) {
2204 RemovalDiagLoc =
Tok.getLocation();
2211 Diag(RemovalDiagLoc, RemovalDiag);
2215 Context.getStringLiteralArrayType(CharTy, Literal.GetNumStringChars());
2219 Context, Literal.GetString(), Kind, Literal.Pascal, StrTy, StringTokLocs);
2220 if (Literal.getUDSuffix().empty())
2227 Literal.getUDSuffixOffset());
2231 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_string_udl));
2238 Context.DeclarationNames.getCXXLiteralOperatorName(UDSuffix);
2243 Context.getArrayDecayedType(StrTy), SizeType
2253 llvm::APInt Len(
Context.getIntWidth(SizeType), Literal.GetNumStringChars());
2256 Expr *Args[] = { Lit, LenArg };
2273 unsigned CharBits =
Context.getIntWidth(CharTy);
2275 llvm::APSInt
Value(CharBits, CharIsUnsigned);
2281 for (
unsigned I = 0, N = Lit->
getLength(); I != N; ++I) {
2292 llvm_unreachable(
"unexpected literal operator lookup result");
2296 llvm_unreachable(
"unexpected literal operator lookup result");
2328 auto *DRE = dyn_cast<DeclRefExpr>(VD->
getInit());
2331 auto *Referee = dyn_cast<VarDecl>(DRE->getDecl());
2332 if (!Referee || !Referee->hasGlobalStorage() ||
2333 Referee->hasAttr<CUDADeviceAttr>())
2339 auto *MD = dyn_cast_or_null<CXXMethodDecl>(S.
CurContext);
2340 if (MD && MD->getParent()->isLambda() &&
2341 MD->getOverloadedOperator() == OO_Call && MD->hasAttr<CUDADeviceAttr>() &&
2363 if (
VarDecl *VD = dyn_cast<VarDecl>(D)) {
2364 if (VD->getType()->isReferenceType() &&
2367 VD->isUsableInConstantExpressions(
Context))
2386 Context, NNS, TemplateKWLoc, D, RefersToCapturedVariable, NameInfo, Ty,
2414 const auto *FD = dyn_cast<FieldDecl>(D);
2415 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(D))
2416 FD = IFD->getAnonField();
2420 if (FD->isBitField())
2426 if (
const auto *BD = dyn_cast<BindingDecl>(D))
2427 if (
const auto *BE = BD->getBinding())
2448 NameInfo =
Context.getNameForTemplate(TName, TNameLoc);
2449 TemplateArgs = &Buffer;
2452 TemplateArgs =
nullptr;
2460 bool isDefaultArgument =
2464 const auto *CurMethod = dyn_cast<CXXMethodDecl>(
CurContext);
2465 bool isInstance = CurMethod && CurMethod->isInstance() &&
2474 unsigned DiagID = diag::err_found_in_dependent_base;
2475 unsigned NoteID = diag::note_member_declared_at;
2477 DiagID =
getLangOpts().MSVCCompat ? diag::ext_found_later_in_class
2478 : diag::err_found_later_in_class;
2480 DiagID = diag::ext_found_in_dependent_base;
2481 NoteID = diag::note_dependent_member_use;
2497 Diag(D->getLocation(), NoteID);
2506 if (isDefaultArgument && ((*R.
begin())->isCXXInstanceMember())) {
2522 unsigned diagnostic = diag::err_undeclared_var_use;
2523 unsigned diagnostic_suggest = diag::err_undeclared_var_use_suggest;
2527 diagnostic = diag::err_undeclared_use;
2528 diagnostic_suggest = diag::err_undeclared_use_suggest;
2539 if (ExplicitTemplateArgs) {
2562 R.
addDecl(Best->FoundDecl.getDecl(), Best->FoundDecl.getAccess());
2577 if (S && (Corrected =
2581 bool DroppedSpecifier =
2585 bool AcceptableWithRecovery =
false;
2586 bool AcceptableWithoutRecovery =
false;
2595 dyn_cast<FunctionTemplateDecl>(CD))
2599 else if (
FunctionDecl *FD = dyn_cast<FunctionDecl>(CD))
2600 if (!ExplicitTemplateArgs || ExplicitTemplateArgs->
size() == 0)
2606 ND = Best->FoundDecl;
2607 Corrected.setCorrectionDecl(ND);
2611 Corrected.setCorrectionDecl(ND);
2639 AcceptableWithoutRecovery =
true;
2642 if (AcceptableWithRecovery || AcceptableWithoutRecovery) {
2644 ? diag::note_implicit_param_decl
2645 : diag::note_previous_decl;
2648 PDiag(NoteID), AcceptableWithRecovery);
2651 PDiag(diag::err_no_member_suggest)
2653 << DroppedSpecifier << NameRange,
2654 PDiag(NoteID), AcceptableWithRecovery);
2657 return !AcceptableWithRecovery;
2692 else if (
auto *MD = dyn_cast<CXXMethodDecl>(S.
CurContext))
2700 auto DB = S.
Diag(Loc, diag::ext_undeclared_unqual_id_with_dependent_base);
2701 DB << NameInfo.
getName() << RD;
2703 if (!ThisType.
isNull()) {
2706 Context,
nullptr, ThisType,
true,
2708 nullptr, NameInfo, TemplateArgs);
2724 bool HasTrailingLParen,
bool IsAddressOfOperand,
2726 bool IsInlineAsmIdentifier,
Token *KeywordReplacement) {
2727 assert(!(IsAddressOfOperand && HasTrailingLParen) &&
2728 "cannot be direct & operand and have a trailing lparen");
2757 if (
auto *VD = dyn_cast<ValueDecl>(R.
getFoundDecl())) {
2771 if (TemplateKWLoc.
isValid() || TemplateArgs) {
2779 false, TemplateKWLoc,
2785 IsAddressOfOperand, TemplateArgs);
2789 !IvarLookupFollowUp);
2795 IsAddressOfOperand, TemplateArgs);
2799 if (IvarLookupFollowUp) {
2814 if (R.
empty() && HasTrailingLParen && II &&
2824 if (R.
empty() && !ADL) {
2827 TemplateKWLoc, TemplateArgs))
2832 if (IsInlineAsmIdentifier)
2840 "Typo correction callback misconfigured");
2854 assert(!R.
empty() &&
2855 "DiagnoseEmptyLookup returned false but added no results");
2862 ExprResult E(
ObjC().LookupInObjCMethod(R, S, Ivar->getIdentifier()));
2872 assert(!R.
empty() || ADL);
2902 if (TemplateArgs || TemplateKWLoc.
isValid()) {
2911 "There should only be one declaration found.");
2939 if (
const auto *CD = dyn_cast<CXXRecordDecl>(DC))
2940 if (CD->isInvalidDecl())
2950 if (
auto *TagD = dyn_cast<TagDecl>(TD)) {
2957 TL.setNameLoc(NameInfo.
getLoc());
2958 }
else if (
auto *TypedefD = dyn_cast<TypedefNameDecl>(TD)) {
2966 ET =
SemaRef.Context.getTypeDeclType(TD);
2974 unsigned DiagID = diag::err_typename_missing;
2976 DiagID = diag::ext_typename_missing;
2978 auto D =
Diag(Loc, DiagID);
3009 const auto *RD = dyn_cast<CXXRecordDecl>(
Member->getDeclContext());
3017 bool PointerConversions =
false;
3019 DestRecordType =
Context.getCanonicalTagType(RD);
3021 DestRecordType =
Context.getAddrSpaceQualType(
3022 DestRecordType, FromPtrType
3027 DestType =
Context.getPointerType(DestRecordType);
3029 PointerConversions =
true;
3031 DestType = DestRecordType;
3032 FromRecordType = FromType;
3034 }
else if (
const auto *
Method = dyn_cast<CXXMethodDecl>(
Member)) {
3035 if (!
Method->isImplicitObjectMemberFunction())
3038 DestType =
Method->getThisType().getNonReferenceType();
3039 DestRecordType =
Method->getFunctionObjectParameterType();
3043 PointerConversions =
true;
3045 FromRecordType = FromType;
3046 DestType = DestRecordType;
3051 if (FromAS != DestAS) {
3053 Context.removeAddrSpaceQualType(FromRecordType);
3055 Context.getAddrSpaceQualType(FromRecordTypeWithoutAS, DestAS);
3056 if (PointerConversions)
3057 FromTypeWithDestAS =
Context.getPointerType(FromTypeWithDestAS);
3071 if (
Context.hasSameUnqualifiedType(FromRecordType, DestRecordType))
3099 assert(QType->
isRecordType() &&
"lookup done with non-record type");
3109 FromLoc, FromRange, &BasePath))
3112 if (PointerConversions)
3113 QType =
Context.getPointerType(QType);
3115 VK, &BasePath).
get();
3118 FromRecordType = QRecordType;
3122 if (
Context.hasSameUnqualifiedType(FromRecordType, DestRecordType))
3129 FromLoc, FromRange, &BasePath,
3138 DestType =
Context.getQualifiedType(DestType, FromTypeQuals);
3146 bool HasTrailingLParen) {
3148 if (!HasTrailingLParen)
3166 if (D->isCXXClassMember())
3177 else if (D->getLexicalDeclContext()->isFunctionOrMethod())
3184 if (
const auto *FDecl = dyn_cast<FunctionDecl>(D)) {
3186 if (FDecl->getBuiltinID() && FDecl->isImplicit())
3201 bool AcceptInvalid) {
3227 const auto *FD = dyn_cast<FunctionDecl>(R.
getFoundDecl());
3229 (FD->isCPUDispatchMultiVersion() || FD->isCPUSpecificMultiVersion());
3234 bool AcceptInvalidDecl) {
3268 bool AcceptInvalidDecl) {
3269 assert(D &&
"Cannot refer to a NULL declaration");
3271 "Cannot refer unambiguously to a function template");
3290 Diag(Loc, diag::err_ref_non_value) << D << SS.
getRange();
3305 if (VD->isInvalidDecl() && !AcceptInvalidDecl)
3311 if (
auto *IndirectField = dyn_cast<IndirectFieldDecl>(VD);
3312 IndirectField && !IndirectField->isCXXClassMember())
3324 type =
type.getNonPackExpansionType();
3328#define ABSTRACT_DECL(kind)
3329#define VALUE(type, base)
3330#define DECL(type, base) case Decl::type:
3331#include "clang/AST/DeclNodes.inc"
3332 llvm_unreachable(
"invalid value decl kind");
3335 case Decl::ObjCAtDefsField:
3336 llvm_unreachable(
"forming non-member reference to ivar?");
3340 case Decl::EnumConstant:
3341 case Decl::UnresolvedUsingValue:
3342 case Decl::OMPDeclareReduction:
3343 case Decl::OMPDeclareMapper:
3352 case Decl::IndirectField:
3353 case Decl::ObjCIvar:
3355 "building reference to field in C?");
3365 case Decl::NonTypeTemplateParm: {
3367 type = reftype->getPointeeType();
3377 if (
type->isRecordType()) {
3378 type =
type.getUnqualifiedType().withConst();
3391 case Decl::VarTemplateSpecialization:
3392 case Decl::VarTemplatePartialSpecialization:
3393 case Decl::Decomposition:
3395 case Decl::OMPCapturedExpr:
3398 type->isVoidType()) {
3404 case Decl::ImplicitParam:
3405 case Decl::ParmVar: {
3415 if (!CapturedType.
isNull())
3416 type = CapturedType;
3421 case Decl::Function: {
3423 if (!
Context.BuiltinInfo.isDirectlyAddressable(BID)) {
3460 case Decl::CXXDeductionGuide:
3461 llvm_unreachable(
"building reference to deduction guide");
3463 case Decl::MSProperty:
3465 case Decl::TemplateParamObject:
3471 case Decl::UnnamedGlobalConstant:
3475 case Decl::CXXMethod:
3480 dyn_cast<FunctionProtoType>(VD->getType()))
3481 if (proto->getReturnType() ==
Context.UnknownAnyTy) {
3494 case Decl::CXXConversion:
3495 case Decl::CXXDestructor:
3496 case Decl::CXXConstructor:
3508 if (VD->isInvalidDecl() && E)
3515 Target.resize(CharByteWidth * (Source.size() + 1));
3516 char *ResultPtr = &
Target[0];
3517 const llvm::UTF8 *ErrorPtr;
3519 llvm::ConvertUTF8toWide(CharByteWidth, Source, ResultPtr, ErrorPtr);
3529 Diag(Loc, diag::ext_predef_outside_function);
3530 currentDecl =
Context.getTranslationUnitDecl();
3540 bool ForceElaboratedPrinting =
3544 unsigned Length = Str.length();
3546 llvm::APInt LengthI(32, Length + 1);
3550 Context.adjustStringLiteralBaseType(
Context.WideCharTy.withConst());
3554 ResTy =
Context.getConstantArrayType(ResTy, LengthI,
nullptr,
3560 ResTy =
Context.adjustStringLiteralBaseType(
Context.CharTy.withConst());
3561 ResTy =
Context.getConstantArrayType(ResTy, LengthI,
nullptr,
3580 StringRef ThisTok =
PP.getSpelling(
Tok, CharBuffer, &
Invalid);
3586 if (Literal.hadError())
3590 if (Literal.isWide())
3596 else if (Literal.isUTF16())
3598 else if (Literal.isUTF32())
3607 if (Literal.isWide())
3609 else if (Literal.isUTF16())
3611 else if (Literal.isUTF32())
3613 else if (Literal.isUTF8())
3619 if (Literal.getUDSuffix().empty())
3629 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_character_udl));
3634 Lit,
Tok.getLocation());
3638 unsigned IntSize =
Context.getTargetInfo().getIntWidth();
3640 llvm::APInt(IntSize, Val,
true),
3648 using llvm::APFloat;
3649 APFloat Val(Format);
3652 if (RM == llvm::RoundingMode::Dynamic)
3653 RM = llvm::RoundingMode::NearestTiesToEven;
3654 APFloat::opStatus result = Literal.GetFloatValue(Val, RM);
3658 if ((result & APFloat::opOverflow) ||
3659 ((result & APFloat::opUnderflow) && Val.isZero())) {
3660 unsigned diagnostic;
3662 if (result & APFloat::opOverflow) {
3663 diagnostic = diag::warn_float_overflow;
3664 APFloat::getLargest(Format).toString(buffer);
3666 diagnostic = diag::warn_float_underflow;
3667 APFloat::getSmallest(Format).toString(buffer);
3670 S.
Diag(Loc, diagnostic) << Ty << buffer.str();
3673 bool isExact = (result == APFloat::opOK);
3678 assert(E &&
"Invalid expression");
3685 Diag(E->
getExprLoc(), diag::err_pragma_loop_invalid_argument_type) << QT;
3689 llvm::APSInt ValueAPS;
3700 bool ValueIsPositive =
3701 AllowZero ? ValueAPS.isNonNegative() : ValueAPS.isStrictlyPositive();
3702 if (!ValueIsPositive || ValueAPS.getActiveBits() > 31) {
3704 <<
toString(ValueAPS, 10) << ValueIsPositive;
3714 if (
Tok.getLength() == 1 ||
Tok.getKind() == tok::binary_data) {
3715 const uint8_t Val =
PP.getSpellingOfSingleCharacterNumericConstant(
Tok);
3724 SpellingBuffer.resize(
Tok.getLength() + 1);
3728 StringRef TokSpelling =
PP.getSpelling(
Tok, SpellingBuffer, &
Invalid);
3733 PP.getSourceManager(),
PP.getLangOpts(),
3734 PP.getTargetInfo(),
PP.getDiagnostics());
3735 if (Literal.hadError)
3738 if (Literal.hasUDSuffix()) {
3746 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_numeric_udl));
3749 if (Literal.isFloatingLiteral()) {
3753 CookedTy =
Context.LongDoubleTy;
3758 CookedTy =
Context.UnsignedLongLongTy;
3762 Context.DeclarationNames.getCXXLiteralOperatorName(UDSuffix);
3774 !Literal.isImaginary)) {
3783 if (Literal.isFloatingLiteral()) {
3786 llvm::APInt ResultVal(
Context.getTargetInfo().getLongLongWidth(), 0);
3787 if (Literal.GetIntegerValue(ResultVal))
3788 Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
3800 unsigned Length = Literal.getUDSuffixOffset();
3807 false, StrTy, TokLoc);
3818 bool CharIsUnsigned =
Context.CharTy->isUnsignedIntegerType();
3819 llvm::APSInt
Value(CharBits, CharIsUnsigned);
3820 for (
unsigned I = 0, N = Literal.getUDSuffixOffset(); I != N; ++I) {
3821 Value = TokSpelling[I];
3829 llvm_unreachable(
"unexpected literal operator lookup result");
3835 if (Literal.isFixedPointLiteral()) {
3838 if (Literal.isAccum) {
3839 if (Literal.isHalf) {
3841 }
else if (Literal.isLong) {
3846 }
else if (Literal.isFract) {
3847 if (Literal.isHalf) {
3849 }
else if (Literal.isLong) {
3856 if (Literal.isUnsigned) Ty =
Context.getCorrespondingUnsignedType(Ty);
3858 bool isSigned = !Literal.isUnsigned;
3859 unsigned scale =
Context.getFixedPointScale(Ty);
3860 unsigned bit_width =
Context.getTypeInfo(Ty).Width;
3862 llvm::APInt Val(bit_width, 0, isSigned);
3863 bool Overflowed = Literal.GetFixedPointValue(Val, scale);
3864 bool ValIsZero = Val.isZero() && !Overflowed;
3866 auto MaxVal =
Context.getFixedPointMax(Ty).getValue();
3867 if (Literal.isFract && Val == MaxVal + 1 && !ValIsZero)
3873 else if (Val.ugt(MaxVal) || Overflowed)
3874 Diag(
Tok.getLocation(), diag::err_too_large_for_fixed_point);
3877 Tok.getLocation(), scale);
3878 }
else if (Literal.isFloatingLiteral()) {
3880 if (Literal.isHalf){
3885 Diag(
Tok.getLocation(), diag::err_half_const_requires_fp16);
3888 }
else if (Literal.isFloat)
3890 else if (Literal.isLong)
3892 else if (Literal.isFloat16)
3894 else if (Literal.isFloat128)
3911 Diag(
Tok.getLocation(), diag::warn_double_const_requires_fp64)
3916 }
else if (!Literal.isIntegerLiteral()) {
3922 if (Literal.isSizeT)
3925 ? diag::warn_cxx20_compat_size_t_suffix
3926 : diag::ext_cxx23_size_t_suffix
3927 : diag::err_cxx23_size_t_suffix);
3934 if (Literal.isBitInt)
3935 PP.Diag(
Tok.getLocation(),
3938 : diag::ext_c23_bitint_suffix);
3947 unsigned BitsNeeded =
Context.getTargetInfo().getIntMaxTWidth();
3948 if (Literal.isBitInt)
3949 BitsNeeded = llvm::APInt::getSufficientBitsNeeded(
3950 Literal.getLiteralDigits(), Literal.getRadix());
3951 if (Literal.MicrosoftInteger) {
3952 if (Literal.MicrosoftInteger == 128 &&
3953 !
Context.getTargetInfo().hasInt128Type())
3954 PP.Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
3955 << Literal.isUnsigned;
3956 BitsNeeded = Literal.MicrosoftInteger;
3959 llvm::APInt ResultVal(BitsNeeded, 0);
3961 if (Literal.GetIntegerValue(ResultVal)) {
3963 Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
3965 Ty =
Context.UnsignedLongLongTy;
3966 assert(
Context.getTypeSize(Ty) == ResultVal.getBitWidth() &&
3967 "long long is not intmax_t?");
3974 bool AllowUnsigned = Literal.isUnsigned || Literal.getRadix() != 10;
3981 Literal.isLong =
true;
3982 Literal.isLongLong =
false;
3989 if (Literal.MicrosoftInteger) {
3990 if (Literal.MicrosoftInteger == 8 && !Literal.isUnsigned) {
3994 Width = Literal.MicrosoftInteger;
3995 Ty =
Context.getIntTypeForBitwidth(Width,
3996 !Literal.isUnsigned);
4002 if (Literal.isBitInt) {
4005 Width = std::max(ResultVal.getActiveBits(), 1u) +
4006 (Literal.isUnsigned ? 0u : 1u);
4010 unsigned int MaxBitIntWidth =
4011 Context.getTargetInfo().getMaxBitIntWidth();
4012 if (Width > MaxBitIntWidth) {
4013 Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
4014 << Literal.isUnsigned;
4015 Width = MaxBitIntWidth;
4022 ResultVal = ResultVal.zextOrTrunc(Width);
4023 Ty =
Context.getBitIntType(Literal.isUnsigned, Width);
4027 if (Literal.isSizeT) {
4028 assert(!Literal.MicrosoftInteger &&
4029 "size_t literals can't be Microsoft literals");
4030 unsigned SizeTSize =
Context.getTargetInfo().getTypeWidth(
4031 Context.getTargetInfo().getSizeType());
4034 if (ResultVal.isIntN(SizeTSize)) {
4036 if (!Literal.isUnsigned && ResultVal[SizeTSize - 1] == 0)
4037 Ty =
Context.getSignedSizeType();
4038 else if (AllowUnsigned)
4044 if (Ty.
isNull() && !Literal.isLong && !Literal.isLongLong &&
4047 unsigned IntSize =
Context.getTargetInfo().getIntWidth();
4050 if (ResultVal.isIntN(IntSize)) {
4052 if (!Literal.isUnsigned && ResultVal[IntSize-1] == 0)
4054 else if (AllowUnsigned)
4061 if (Ty.
isNull() && !Literal.isLongLong && !Literal.isSizeT) {
4062 unsigned LongSize =
Context.getTargetInfo().getLongWidth();
4065 if (ResultVal.isIntN(LongSize)) {
4067 if (!Literal.isUnsigned && ResultVal[LongSize-1] == 0)
4069 else if (AllowUnsigned)
4074 const unsigned LongLongSize =
4075 Context.getTargetInfo().getLongLongWidth();
4079 ? diag::warn_old_implicitly_unsigned_long_cxx
4081 ext_old_implicitly_unsigned_long_cxx
4082 : diag::warn_old_implicitly_unsigned_long)
4083 << (LongLongSize > LongSize ? 0
4092 if (Ty.
isNull() && !Literal.isSizeT) {
4093 unsigned LongLongSize =
Context.getTargetInfo().getLongLongWidth();
4096 if (ResultVal.isIntN(LongLongSize)) {
4100 if (!Literal.isUnsigned && (ResultVal[LongLongSize-1] == 0 ||
4101 (
getLangOpts().MSVCCompat && Literal.isLongLong)))
4103 else if (AllowUnsigned)
4104 Ty =
Context.UnsignedLongLongTy;
4105 Width = LongLongSize;
4111 ? diag::warn_cxx98_compat_longlong
4112 : diag::ext_cxx11_longlong);
4114 Diag(
Tok.getLocation(), diag::ext_c99_longlong);
4122 if (Literal.isSizeT)
4123 Diag(
Tok.getLocation(), diag::err_size_t_literal_too_large)
4124 << Literal.isUnsigned;
4127 diag::ext_integer_literal_too_large_for_signed);
4128 Ty =
Context.UnsignedLongLongTy;
4129 Width =
Context.getTargetInfo().getLongLongWidth();
4132 if (ResultVal.getBitWidth() != Width)
4133 ResultVal = ResultVal.trunc(Width);
4139 if (Literal.isImaginary) {
4146 DiagId = diag::ext_gnu_imaginary_constant;
4148 DiagId = diag::warn_c23_compat_imaginary_constant;
4150 DiagId = diag::ext_c2y_imaginary_constant;
4151 Diag(
Tok.getLocation(), DiagId);
4157 assert(E &&
"ActOnParenExpr() missing expr");
4172 if (!(
T->isArithmeticType() ||
T->isVoidType() ||
T->isVectorType())) {
4173 S.
Diag(Loc, diag::err_vecstep_non_scalar_vector_type)
4178 assert((
T->isVoidType() || !
T->isIncompleteType()) &&
4179 "Scalar types should always be complete");
4187 if (!
T->isVectorType() && !
T->isSizelessVectorType())
4188 return S.
Diag(Loc, diag::err_builtin_non_vector_type)
4190 <<
"__builtin_vectorelements" <<
T << ArgRange;
4201 if (!
T->isFunctionType() && !
T->isFunctionPointerType() &&
4202 !
T->isFunctionReferenceType() && !
T->isMemberFunctionPointerType()) {
4203 S.
Diag(Loc, diag::err_ptrauth_type_disc_undiscriminated) <<
T << ArgRange;
4219 if (
T->isFunctionType() &&
4220 (TraitKind == UETT_SizeOf || TraitKind == UETT_AlignOf ||
4221 TraitKind == UETT_PreferredAlignOf)) {
4223 S.
Diag(Loc, diag::ext_sizeof_alignof_function_type)
4230 if (
T->isVoidType()) {
4231 unsigned DiagID = S.
LangOpts.OpenCL ? diag::err_opencl_sizeof_alignof_type
4232 : diag::ext_sizeof_alignof_void_type;
4247 S.
Diag(Loc, diag::err_sizeof_nonfragile_interface)
4248 <<
T << (TraitKind == UETT_SizeOf)
4265 const auto *ICE = dyn_cast<ImplicitCastExpr>(E);
4266 if (!ICE || ICE->getCastKind() != CK_ArrayToPointerDecay)
4269 S.
Diag(Loc, diag::warn_sizeof_array_decay) << ICE->getSourceRange()
4271 << ICE->getSubExpr()->getType();
4279 bool IsUnevaluatedOperand =
4280 (ExprKind == UETT_SizeOf || ExprKind == UETT_DataSizeOf ||
4281 ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf ||
4282 ExprKind == UETT_VecStep || ExprKind == UETT_CountOf);
4283 if (IsUnevaluatedOperand) {
4299 Diag(E->
getExprLoc(), diag::warn_side_effects_unevaluated_context);
4301 if (ExprKind == UETT_VecStep)
4305 if (ExprKind == UETT_VectorElements)
4316 if (
Context.getTargetInfo().getTriple().isWasm() &&
4327 if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf) {
4330 diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4335 E, diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4354 if (ExprKind == UETT_CountOf) {
4359 Diag(E->
getExprLoc(), diag::err_countof_arg_not_array_type) << ExprType;
4369 if (ExprKind == UETT_SizeOf) {
4370 if (
const auto *DeclRef = dyn_cast<DeclRefExpr>(E->
IgnoreParens())) {
4371 if (
const auto *PVD = dyn_cast<ParmVarDecl>(DeclRef->getFoundDecl())) {
4372 QualType OType = PVD->getOriginalType();
4377 Diag(PVD->getLocation(), diag::note_declared_at);
4385 if (
const auto *BO = dyn_cast<BinaryOperator>(E->
IgnoreParens())) {
4402 S.
Diag(E->
getExprLoc(), diag::err_sizeof_alignof_typeof_bitfield)
4409 if (
DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Inner)) {
4411 }
else if (
MemberExpr *ME = dyn_cast<MemberExpr>(Inner)) {
4412 D = ME->getMemberDecl();
4432 if (
FieldDecl *FD = dyn_cast_or_null<FieldDecl>(D)) {
4435 if (!FD->getParent()->isCompleteDefinition()) {
4436 S.
Diag(E->
getExprLoc(), diag::err_alignof_member_of_incomplete_type)
4445 if (!FD->getType()->isReferenceType())
4464 assert(
T->isVariablyModifiedType());
4465 assert(CSI !=
nullptr);
4469 const Type *Ty =
T.getTypePtr();
4471#define TYPE(Class, Base)
4472#define ABSTRACT_TYPE(Class, Base)
4473#define NON_CANONICAL_TYPE(Class, Base)
4474#define DEPENDENT_TYPE(Class, Base) case Type::Class:
4475#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)
4476#include "clang/AST/TypeNodes.inc"
4483 case Type::ExtVector:
4484 case Type::ConstantMatrix:
4487 case Type::TemplateSpecialization:
4488 case Type::ObjCObject:
4489 case Type::ObjCInterface:
4490 case Type::ObjCObjectPointer:
4491 case Type::ObjCTypeParam:
4494 case Type::HLSLInlineSpirv:
4495 llvm_unreachable(
"type class is never variably-modified!");
4496 case Type::Adjusted:
4502 case Type::ArrayParameter:
4508 case Type::BlockPointer:
4511 case Type::LValueReference:
4512 case Type::RValueReference:
4515 case Type::MemberPointer:
4518 case Type::ConstantArray:
4519 case Type::IncompleteArray:
4523 case Type::VariableArray: {
4537 case Type::FunctionProto:
4538 case Type::FunctionNoProto:
4543 case Type::UnaryTransform:
4544 case Type::Attributed:
4545 case Type::BTFTagAttributed:
4546 case Type::HLSLAttributedResource:
4547 case Type::SubstTemplateTypeParm:
4548 case Type::MacroQualified:
4549 case Type::CountAttributed:
4551 T =
T.getSingleStepDesugaredType(Context);
4556 case Type::Decltype:
4559 case Type::PackIndexing:
4566 case Type::DeducedTemplateSpecialization:
4569 case Type::TypeOfExpr:
4575 case Type::PredefinedSugar:
4579 }
while (!
T.isNull() &&
T->isVariablyModifiedType());
4602 if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf ||
4603 ExprKind == UETT_OpenMPRequiredSimdAlign) {
4609 ? diag::warn_c2y_compat_alignof_incomplete_array
4610 : diag::ext_c2y_alignof_incomplete_array);
4611 ExprType =
Context.getBaseElementType(ExprType);
4614 if (ExprKind == UETT_VecStep)
4617 if (ExprKind == UETT_VectorElements)
4621 if (ExprKind == UETT_PtrAuthTypeDiscriminator)
4631 OpLoc, ExprType, diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4636 Diag(OpLoc, diag::err_sizeof_alignof_function_type) << KWName << ExprRange;
4640 if (ExprKind == UETT_CountOf) {
4644 Diag(OpLoc, diag::err_countof_arg_not_array_type) << ExprType;
4651 if (
Context.getTargetInfo().getTriple().isWasm() &&
4653 Diag(OpLoc, diag::err_wasm_table_invalid_uett_operand)
4667 auto *CSI = dyn_cast<CapturingScopeInfo>(*I);
4671 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(CSI))
4672 DC = LSI->CallOperator;
4673 else if (
auto *CRSI = dyn_cast<CapturedRegionScopeInfo>(CSI))
4674 DC = CRSI->TheCapturedDecl;
4675 else if (
auto *BSI = dyn_cast<BlockScopeInfo>(CSI))
4698 if (!
T->isDependentType() &&
4707 (ExprKind == UETT_SizeOf || ExprKind == UETT_CountOf) &&
4733 }
else if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf) {
4735 }
else if (ExprKind == UETT_VecStep) {
4737 }
else if (ExprKind == UETT_OpenMPRequiredSimdAlign) {
4741 Diag(E->
getExprLoc(), diag::err_sizeof_alignof_typeof_bitfield) << 0;
4743 }
else if (ExprKind == UETT_VectorElements || ExprKind == UETT_SizeOf ||
4744 ExprKind == UETT_CountOf) {
4751 if ((ExprKind == UETT_SizeOf || ExprKind == UETT_CountOf) &&
4786 UETT_AlignOf, KWName);
4799 if (
V.get()->isTypeDependent())
4811 return CT->getElementType();
4814 if (
V.get()->getType()->isArithmeticType())
4815 return V.get()->getType();
4820 if (PR.
get() !=
V.get()) {
4826 S.
Diag(Loc, diag::err_realimag_invalid_type) <<
V.get()->getType()
4827 << (IsReal ?
"__real" :
"__imag");
4838 default: llvm_unreachable(
"Unknown unary op!");
4839 case tok::plusplus: Opc = UO_PostInc;
break;
4840 case tok::minusminus: Opc = UO_PostDec;
break;
4859 !S.
LangOpts.ObjCSubscriptingLegacyRuntime)
4862 S.
Diag(opLoc, diag::err_arithmetic_nonfragile_interface)
4869 auto *BaseNoParens =
Base->IgnoreParens();
4870 if (
auto *MSProp = dyn_cast<MSPropertyRefExpr>(BaseNoParens))
4871 return MSProp->getPropertyDecl()->getType()->isArrayType();
4892 if (RTy->isIntegralOrUnscopedEnumerationType()) {
4894 Result = PT->getPointeeType();
4896 Result = AT->getElementType();
4899 Result = PT->getPointeeType();
4901 Result = AT->getElementType();
4904 return Result->isDependentType() ? Result : Ctx.
DependentTy;
4915 if (AS->isOMPArraySection())
4931 base = result.
get();
4938 auto CheckAndReportCommaError = [
this, base, rbLoc](
Expr *E) {
4940 Diag(E->getExprLoc(), diag::err_matrix_subscript_comma)
4951 Diag(base->
getExprLoc(), diag::err_matrix_separate_incomplete_index)
4957 auto *matSubscriptE = dyn_cast<MatrixSubscriptExpr>(base);
4958 if (matSubscriptE) {
4959 assert(ArgExprs.size() == 1);
4960 if (CheckAndReportCommaError(ArgExprs.front()))
4963 assert(matSubscriptE->isIncomplete() &&
4964 "base has to be an incomplete matrix subscript");
4966 matSubscriptE->getRowIdx(),
4967 ArgExprs.front(), rbLoc);
4975 CheckInvalidBuiltinCountedByRef(base,
4983 bool IsMSPropertySubscript =
false;
4986 if (!IsMSPropertySubscript) {
4990 base = result.
get();
4996 assert(ArgExprs.size() == 1);
4997 if (CheckAndReportCommaError(ArgExprs.front()))
5005 Expr *idx = ArgExprs[0];
5014 if (ArgExprs.size() == 1 &&
5015 ArgExprs[0]->getType()->isNonOverloadPlaceholderType()) {
5019 ArgExprs[0] = result.
get();
5031 base, ArgExprs.front(),
5044 if (IsMSPropertySubscript) {
5045 assert(ArgExprs.size() == 1);
5064 ArgExprs[0]->getType()->isRecordType())))) {
5082 return InitSeq.
Perform(*
this, Entity, Kind, E);
5096 RowIdx = RowR.
get();
5100 Base, RowIdx, ColumnIdx,
Context.IncompleteMatrixIdxTy, RBLoc);
5111 ColumnIdx = ColumnR.
get();
5116 auto IsIndexValid = [&](
Expr *IndexExpr,
unsigned Dim,
5117 bool IsColumnIdx) ->
Expr * {
5125 if (std::optional<llvm::APSInt> Idx =
5127 if ((*Idx < 0 || *Idx >=
Dim)) {
5129 << IsColumnIdx <<
Dim;
5136 "should be able to convert any integer type to size type");
5137 return ConvExpr.
get();
5141 RowIdx = IsIndexValid(RowIdx, MTy->getNumRows(),
false);
5142 ColumnIdx = IsIndexValid(ColumnIdx, MTy->getNumColumns(),
true);
5143 if (!RowIdx || !ColumnIdx)
5147 MTy->getElementType(), RBLoc);
5150void Sema::CheckAddressOfNoDeref(
const Expr *E) {
5157 while ((
Member = dyn_cast<MemberExpr>(StrippedExpr)) && !
Member->isArrow())
5158 StrippedExpr =
Member->getBase()->IgnoreParenImpCasts();
5160 LastRecord.PossibleDerefs.erase(StrippedExpr);
5174 if (ResultTy->
hasAttr(attr::NoDeref)) {
5175 LastRecord.PossibleDerefs.insert(E);
5182 QualType BaseTy =
Base->getType();
5187 const MemberExpr *
Member =
nullptr;
5188 while ((
Member = dyn_cast<MemberExpr>(
Base->IgnoreParenCasts())) &&
5192 if (
const auto *Ptr = dyn_cast<PointerType>(
Base->getType())) {
5193 if (Ptr->getPointeeType()->hasAttr(attr::NoDeref))
5194 LastRecord.PossibleDerefs.insert(E);
5210 for (
auto *Op : {LHSExp, RHSExp}) {
5211 Op = Op->IgnoreImplicit();
5212 if (Op->getType()->isArrayType() && !Op->isLValue())
5235 Expr *BaseExpr, *IndexExpr;
5253 if (!
LangOpts.isSubscriptPointerArithmetic())
5269 if (!
LangOpts.isSubscriptPointerArithmetic()) {
5270 Diag(LLoc, diag::err_subscript_nonfragile_interface)
5294 LHSExp = Materialized.
get();
5301 Qualifiers BaseQuals = BaseType.getQualifiers();
5303 Qualifiers Combined = BaseQuals + MemberQuals;
5304 if (Combined != MemberQuals)
5305 ResultType =
Context.getQualifiedType(ResultType, Combined);
5315 CK_ArrayToPointerDecay).
get();
5321 }
else if (RHSTy->isArrayType()) {
5326 CK_ArrayToPointerDecay).
get();
5333 return ExprError(
Diag(LLoc, diag::err_typecheck_subscript_value)
5338 return ExprError(
Diag(LLoc, diag::err_typecheck_subscript_not_integer)
5344 std::optional<llvm::APSInt> IntegerContantExpr =
5346 if (!IntegerContantExpr.has_value() ||
5347 IntegerContantExpr.value().isNegative())
5363 Diag(LLoc, diag::ext_gnu_subscript_void_type)
5374 diag::err_subscript_incomplete_or_sizeless_type, BaseExpr))
5387 auto *CSI = dyn_cast<CapturingScopeInfo>(*I);
5391 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(CSI))
5392 DC = LSI->CallOperator;
5393 else if (
auto *CRSI = dyn_cast<CapturedRegionScopeInfo>(CSI))
5394 DC = CRSI->TheCapturedDecl;
5395 else if (
auto *BSI = dyn_cast<BlockScopeInfo>(CSI))
5413 bool SkipImmediateInvocations) {
5414 if (Param->hasUnparsedDefaultArg()) {
5415 assert(!RewrittenInit &&
"Should not have a rewritten init expression yet");
5419 Diag(Param->getBeginLoc(), diag::err_recursive_default_argument) << FD;
5420 Diag(CallLoc, diag::note_recursive_default_argument_used_here);
5421 Param->setInvalidDecl();
5425 Diag(CallLoc, diag::err_use_of_default_argument_to_function_declared_later)
5428 diag::note_default_argument_declared_here);
5432 if (Param->hasUninstantiatedDefaultArg()) {
5433 assert(!RewrittenInit &&
"Should not have a rewitten init expression yet");
5438 Expr *
Init = RewrittenInit ? RewrittenInit : Param->getInit();
5439 assert(
Init &&
"default argument but no initializer?");
5448 if (
auto *InitWithCleanup = dyn_cast<ExprWithCleanups>(
Init)) {
5451 Cleanup.setExprNeedsCleanups(InitWithCleanup->cleanupsHaveSideEffects());
5455 assert(!InitWithCleanup->getNumObjects() &&
5456 "default argument expression has capturing blocks?");
5469 SkipImmediateInvocations;
5557 if (!
SemaRef.CurrentInstantiationScope ||
5569 assert(Param->hasDefaultArg() &&
"can't build nonexistent default arg");
5573 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
5574 InitializationContext =
5576 if (!InitializationContext.has_value())
5577 InitializationContext.emplace(CallLoc, Param,
CurContext);
5579 if (!
Init && !Param->hasUnparsedDefaultArg()) {
5594 if (Param->hasUninstantiatedDefaultArg()) {
5603 if (!NestedDefaultChecking)
5604 V.TraverseDecl(Param);
5608 if (
V.HasImmediateCalls ||
5609 (NeedRebuild && isa_and_present<ExprWithCleanups>(Param->getInit()))) {
5610 if (
V.HasImmediateCalls)
5620 Res = Immediate.TransformInitializer(Param->getInit(),
5634 CallLoc, FD, Param,
Init,
5635 NestedDefaultChecking))
5639 Init, InitializationContext->Context);
5649 ClassPattern->
lookup(Field->getDeclName());
5650 auto Rng = llvm::make_filter_range(
5661 assert(Field->hasInClassInitializer());
5667 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
5668 InitializationContext =
5670 if (!InitializationContext.has_value())
5671 InitializationContext.emplace(Loc, Field,
CurContext);
5680 if (!Field->getInClassInitializer()) {
5686 assert(Pattern &&
"We must have set the Pattern!");
5690 Field->setInvalidDecl();
5702 if (!NestedDefaultChecking)
5703 V.TraverseDecl(Field);
5712 bool ContainsAnyTemporaries =
5713 isa_and_present<ExprWithCleanups>(Field->getInClassInitializer());
5714 if (Field->getInClassInitializer() &&
5715 !Field->getInClassInitializer()->containsErrors() &&
5716 (
V.HasImmediateCalls || (NeedRebuild && ContainsAnyTemporaries))) {
5720 NestedDefaultChecking;
5728 Res = Immediate.TransformInitializer(Field->getInClassInitializer(),
5734 Field->setInvalidDecl();
5740 if (Field->getInClassInitializer()) {
5741 Expr *E =
Init ?
Init : Field->getInClassInitializer();
5742 if (!NestedDefaultChecking)
5753 Field->setInvalidDecl();
5759 Field, InitializationContext->Context,
5778 Diag(Loc, diag::err_default_member_initializer_not_yet_parsed)
5779 << OutermostClass << Field;
5780 Diag(Field->getEndLoc(),
5781 diag::note_default_member_initializer_not_yet_parsed);
5784 Field->setInvalidDecl();
5792 if (isa_and_nonnull<CXXConstructorDecl>(FDecl))
5794 else if (Fn && Fn->getType()->isBlockPointerType())
5798 if (
Method->isInstance())
5800 }
else if (Fn && Fn->getType() ==
Context.BoundMemberTy)
5813 FunctionName(FuncName) {}
5815 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
5824 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
5825 return std::make_unique<FunctionCallCCC>(*
this);
5829 const IdentifierInfo *
const FunctionName;
5845 if (
NamedDecl *ND = Corrected.getFoundDecl()) {
5846 if (Corrected.isOverloaded()) {
5856 ND = Best->FoundDecl;
5857 Corrected.setCorrectionDecl(ND);
5863 ND = ND->getUnderlyingDecl();
5878 Fn = Fn->IgnoreParens();
5880 auto *UO = dyn_cast<UnaryOperator>(Fn);
5881 if (!UO || UO->getOpcode() != clang::UO_AddrOf)
5883 if (
auto *DRE = dyn_cast<DeclRefExpr>(UO->getSubExpr()->IgnoreParens())) {
5884 return DRE->hasQualifier();
5886 if (
auto *OVL = dyn_cast<OverloadExpr>(UO->getSubExpr()->IgnoreParens()))
5887 return bool(OVL->getQualifier());
5897 bool IsExecConfig) {
5901 if (
Context.BuiltinInfo.hasCustomTypechecking(ID))
5908 bool HasExplicitObjectParameter =
5910 unsigned ExplicitObjectParameterOffset = HasExplicitObjectParameter ? 1 : 0;
5914 unsigned FnKind = Fn->getType()->isBlockPointerType()
5921 if (Args.size() < NumParams) {
5922 if (Args.size() < MinArgs) {
5927 ? diag::err_typecheck_call_too_few_args_suggest
5928 : diag::err_typecheck_call_too_few_args_at_least_suggest;
5931 << FnKind << MinArgs - ExplicitObjectParameterOffset
5932 <<
static_cast<unsigned>(Args.size()) -
5933 ExplicitObjectParameterOffset
5935 }
else if (MinArgs - ExplicitObjectParameterOffset == 1 && FDecl &&
5940 ? diag::err_typecheck_call_too_few_args_one
5941 : diag::err_typecheck_call_too_few_args_at_least_one)
5942 << FnKind << FDecl->
getParamDecl(ExplicitObjectParameterOffset)
5943 << HasExplicitObjectParameter << Fn->getSourceRange();
5946 ? diag::err_typecheck_call_too_few_args
5947 : diag::err_typecheck_call_too_few_args_at_least)
5948 << FnKind << MinArgs - ExplicitObjectParameterOffset
5949 <<
static_cast<unsigned>(Args.size()) -
5950 ExplicitObjectParameterOffset
5951 << HasExplicitObjectParameter << Fn->getSourceRange();
5954 if (!TC && FDecl && !FDecl->
getBuiltinID() && !IsExecConfig)
5962 assert((
Call->getNumArgs() == NumParams) &&
5963 "We should have reserved space for the default arguments before!");
5968 if (Args.size() > NumParams) {
5974 ? diag::err_typecheck_call_too_many_args_suggest
5975 : diag::err_typecheck_call_too_many_args_at_most_suggest;
5978 << FnKind << NumParams - ExplicitObjectParameterOffset
5979 <<
static_cast<unsigned>(Args.size()) -
5980 ExplicitObjectParameterOffset
5982 }
else if (NumParams - ExplicitObjectParameterOffset == 1 && FDecl &&
5985 Diag(Args[NumParams]->getBeginLoc(),
5986 MinArgs == NumParams
5987 ? diag::err_typecheck_call_too_many_args_one
5988 : diag::err_typecheck_call_too_many_args_at_most_one)
5989 << FnKind << FDecl->
getParamDecl(ExplicitObjectParameterOffset)
5990 <<
static_cast<unsigned>(Args.size()) -
5991 ExplicitObjectParameterOffset
5992 << HasExplicitObjectParameter << Fn->getSourceRange()
5994 Args.back()->getEndLoc());
5996 Diag(Args[NumParams]->getBeginLoc(),
5997 MinArgs == NumParams
5998 ? diag::err_typecheck_call_too_many_args
5999 : diag::err_typecheck_call_too_many_args_at_most)
6000 << FnKind << NumParams - ExplicitObjectParameterOffset
6001 <<
static_cast<unsigned>(Args.size()) -
6002 ExplicitObjectParameterOffset
6003 << HasExplicitObjectParameter << Fn->getSourceRange()
6005 Args.back()->getEndLoc());
6008 if (!TC && FDecl && !FDecl->
getBuiltinID() && !IsExecConfig)
6013 Call->shrinkNumArgs(NumParams);
6024 unsigned TotalNumArgs = AllArgs.size();
6025 for (
unsigned i = 0; i < TotalNumArgs; ++i)
6026 Call->setArg(i, AllArgs[i]);
6028 Call->computeDependence();
6037 bool IsListInitialization) {
6042 for (
unsigned i = FirstParam; i < NumParams; i++) {
6047 if (ArgIx < Args.size()) {
6048 Arg = Args[ArgIx++];
6051 diag::err_call_incomplete_argument, Arg))
6055 bool CFAudited =
false;
6057 FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>() &&
6058 (!Param || !Param->hasAttr<CFConsumedAttr>()))
6061 FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>() &&
6062 (!Param || !Param->hasAttr<CFConsumedAttr>()))
6068 BE->getBlockDecl()->setDoesNotEscape();
6088 Entity,
SourceLocation(), Arg, IsListInitialization, AllowExplicit);
6094 assert(Param &&
"can't use default arguments without a known callee");
6106 CheckArrayAccess(Arg);
6111 AllArgs.push_back(Arg);
6120 for (
Expr *A : Args.slice(ArgIx)) {
6124 AllArgs.push_back(arg.get());
6129 for (
Expr *A : Args.slice(ArgIx)) {
6132 AllArgs.push_back(Arg.
get());
6137 for (
Expr *A : Args.slice(ArgIx))
6138 CheckArrayAccess(A);
6146 TL = DTL.getOriginalLoc();
6149 << ATL.getLocalSourceRange();
6155 const Expr *ArgExpr) {
6160 QualType OrigTy = Param->getOriginalType();
6185 Diag(CallLoc, diag::warn_static_array_too_small)
6193 std::optional<CharUnits> ArgSize =
6195 std::optional<CharUnits> ParmSize =
6197 if (ArgSize && ParmSize && *ArgSize < *ParmSize) {
6198 Diag(CallLoc, diag::warn_static_array_too_small)
6200 << (
unsigned)ParmSize->getQuantity() << 1;
6214 if (!placeholder)
return false;
6216 switch (placeholder->
getKind()) {
6218#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
6219 case BuiltinType::Id:
6220#include "clang/Basic/OpenCLImageTypes.def"
6221#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
6222 case BuiltinType::Id:
6223#include "clang/Basic/OpenCLExtensionTypes.def"
6226#define SVE_TYPE(Name, Id, SingletonId) \
6227 case BuiltinType::Id:
6228#include "clang/Basic/AArch64ACLETypes.def"
6229#define PPC_VECTOR_TYPE(Name, Id, Size) \
6230 case BuiltinType::Id:
6231#include "clang/Basic/PPCTypes.def"
6232#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6233#include "clang/Basic/RISCVVTypes.def"
6234#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6235#include "clang/Basic/WebAssemblyReferenceTypes.def"
6236#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
6237#include "clang/Basic/AMDGPUTypes.def"
6238#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6239#include "clang/Basic/HLSLIntangibleTypes.def"
6240#define PLACEHOLDER_TYPE(ID, SINGLETON_ID)
6241#define BUILTIN_TYPE(ID, SINGLETON_ID) case BuiltinType::ID:
6242#include "clang/AST/BuiltinTypes.def"
6245 case BuiltinType::UnresolvedTemplate:
6248 case BuiltinType::Overload:
6253 case BuiltinType::ARCUnbridgedCast:
6257 case BuiltinType::PseudoObject:
6262 case BuiltinType::UnknownAny:
6266 case BuiltinType::BoundMember:
6267 case BuiltinType::BuiltinFn:
6268 case BuiltinType::IncompleteMatrixIdx:
6269 case BuiltinType::ArraySection:
6270 case BuiltinType::OMPArrayShaping:
6271 case BuiltinType::OMPIterator:
6275 llvm_unreachable(
"bad builtin type kind");
6281 bool hasInvalid =
false;
6282 for (
size_t i = 0, e = args.size(); i != e; i++) {
6285 if (result.
isInvalid()) hasInvalid =
true;
6286 else args[i] = result.
get();
6310 if (!Context.BuiltinInfo.hasPtrArgsOrResult(FDecl->
getBuiltinID()) || !FT ||
6314 bool NeedsNewDecl =
false;
6334 if (!ParamType->isPointerType() ||
6335 ParamType->getPointeeType().hasAddressSpace() ||
6336 !ArgType->isPointerType() ||
6337 !ArgType->getPointeeType().hasAddressSpace() ||
6339 OverloadParams.push_back(ParamType);
6344 NeedsNewDecl =
true;
6345 LangAS AS = ArgType->getPointeeType().getAddressSpace();
6347 PointeeType = Context.getAddrSpaceQualType(PointeeType, AS);
6348 OverloadParams.push_back(Context.getPointerType(PointeeType));
6358 OverloadParams, EPI);
6368 for (
unsigned i = 0, e = FT->
getNumParams(); i != e; ++i) {
6375 Params.push_back(Parm);
6377 OverloadDecl->setParams(Params);
6381 if (FDecl->
hasAttr<CUDAHostAttr>())
6382 OverloadDecl->
addAttr(CUDAHostAttr::CreateImplicit(Context));
6383 if (FDecl->
hasAttr<CUDADeviceAttr>())
6384 OverloadDecl->
addAttr(CUDADeviceAttr::CreateImplicit(Context));
6387 return OverloadDecl;
6398 !Callee->isVariadic())
6400 if (Callee->getMinRequiredArguments() > ArgExprs.size())
6403 if (
const EnableIfAttr *
Attr =
6404 S.
CheckEnableIf(Callee, Fn->getBeginLoc(), ArgExprs,
true)) {
6405 S.
Diag(Fn->getBeginLoc(),
6407 ? diag::err_ovl_no_viable_member_function_in_call
6408 : diag::err_ovl_no_viable_function_in_call)
6409 << Callee << Callee->getSourceRange();
6410 S.
Diag(Callee->getLocation(),
6411 diag::note_ovl_candidate_disabled_by_function_cond_attr)
6412 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
6420 const auto GetFunctionLevelDCIfCXXClass =
6428 if (
const auto *MD = dyn_cast<CXXMethodDecl>(DC))
6429 return MD->
getParent()->getCanonicalDecl();
6432 if (
const auto *RD = dyn_cast<CXXRecordDecl>(DC))
6433 return RD->getCanonicalDecl();
6440 const CXXRecordDecl *
const CurParentClass = GetFunctionLevelDCIfCXXClass(S);
6441 if (!CurParentClass)
6448 assert(NamingClass &&
"Must have naming class even for implicit access");
6454 return CurParentClass == NamingClass ||
6503 if (
Call->getNumArgs() != 1)
6506 const Expr *E =
Call->getCallee()->IgnoreParenImpCasts();
6509 const DeclRefExpr *DRE = dyn_cast_if_present<DeclRefExpr>(E);
6522 if (BuiltinID != Builtin::BImove && BuiltinID != Builtin::BIforward)
6525 S.
Diag(DRE->
getLocation(), diag::warn_unqualified_call_to_std_cast_function)
6536 if (
Call.isInvalid())
6541 if (
const auto *ULE = dyn_cast<UnresolvedLookupExpr>(Fn);
6542 ULE && ULE->hasExplicitTemplateArgs() && ULE->decls().empty()) {
6543 DiagCompat(Fn->getExprLoc(), diag_compat::adl_only_template_id)
6551 if (
const auto *CE = dyn_cast<CallExpr>(
Call.get()))
6557 if (
auto *DRE = dyn_cast<DeclRefExpr>(Fn->IgnoreParens());
6558 DRE &&
Call.get()->isValueDependent()) {
6568 if (
T->isDependentType())
6571 if (
T == Context.BoundMemberTy ||
T == Context.UnknownAnyTy ||
6572 T == Context.BuiltinFnTy ||
T == Context.OverloadTy ||
6573 T->isFunctionType() ||
T->isFunctionReferenceType() ||
6574 T->isMemberFunctionPointerType() ||
T->isFunctionPointerType() ||
6575 T->isBlockPointerType() ||
T->isRecordType())
6584 Expr *ExecConfig,
bool IsExecConfig,
6585 bool AllowRecovery) {
6596 for (
const Expr *Arg : ArgExprs)
6597 if (CheckInvalidBuiltinCountedByRef(Arg,
6604 if (!ArgExprs.empty()) {
6606 Diag(Fn->getBeginLoc(), diag::err_pseudo_dtor_call_with_args)
6609 ArgExprs.back()->getEndLoc()));
6615 if (Fn->getType() ==
Context.PseudoObjectTy) {
6632 *
this, dyn_cast<UnresolvedMemberExpr>(Fn->IgnoreParens()),
6640 Diag(LParenLoc, diag::err_typecheck_call_not_function)
6641 << Fn->getType() << Fn->getSourceRange());
6649 if (Fn->getType()->isRecordType())
6653 if (Fn->getType() ==
Context.UnknownAnyTy) {
6659 if (Fn->getType() ==
Context.BoundMemberTy) {
6661 RParenLoc, ExecConfig, IsExecConfig,
6667 if (Fn->getType() ==
Context.OverloadTy) {
6678 Scope, Fn, ULE, LParenLoc, ArgExprs, RParenLoc, ExecConfig,
6681 RParenLoc, ExecConfig, IsExecConfig,
6687 if (Fn->getType() ==
Context.UnknownAnyTy) {
6693 Expr *NakedFn = Fn->IgnoreParens();
6695 bool CallingNDeclIndirectly =
false;
6697 if (
UnaryOperator *UnOp = dyn_cast<UnaryOperator>(NakedFn)) {
6698 if (UnOp->getOpcode() == UO_AddrOf) {
6699 CallingNDeclIndirectly =
true;
6704 if (
auto *DRE = dyn_cast<DeclRefExpr>(NakedFn)) {
6705 NDecl = DRE->getDecl();
6718 nullptr, DRE->isNonOdrUse());
6721 }
else if (
auto *ME = dyn_cast<MemberExpr>(NakedFn))
6722 NDecl = ME->getMemberDecl();
6724 if (
FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(NDecl)) {
6726 FD,
true, Fn->getBeginLoc()))
6738 FD->getBuiltinID()) {
6739 for (
unsigned Idx = 0; Idx < ArgExprs.size() && Idx < FD->param_size();
6742 if (!ArgExprs[Idx] || !Param || !Param->getType()->isPointerType() ||
6743 !ArgExprs[Idx]->getType()->isPointerType())
6747 auto ArgTy = ArgExprs[Idx]->getType();
6748 auto ArgPtTy = ArgTy->getPointeeType();
6749 auto ArgAS = ArgPtTy.getAddressSpace();
6752 bool NeedImplicitASC =
6757 if (!NeedImplicitASC)
6761 if (ArgExprs[Idx]->isGLValue()) {
6768 Qualifiers ArgPtQuals = ArgPtTy.getQualifiers();
6771 Context.getQualifiedType(ArgPtTy.getUnqualifiedType(), ArgPtQuals);
6774 ArgTy.getQualifiers());
6778 CK_AddressSpaceConversion)
6784 if (
Context.isDependenceAllowed() &&
6787 assert((Fn->containsErrors() ||
6788 llvm::any_of(ArgExprs,
6789 [](
clang::Expr *E) { return E->containsErrors(); })) &&
6790 "should only occur in error-recovery path.");
6795 ExecConfig, IsExecConfig);
6800 std::string Name =
Context.BuiltinInfo.getName(Id);
6806 assert(BuiltInDecl &&
"failed to find builtin declaration");
6810 assert(DeclRef.
isUsable() &&
"Builtin reference cannot fail");
6815 assert(!
Call.isInvalid() &&
"Call to builtin cannot fail!");
6835 Diag(BuiltinLoc, diag::err_invalid_astype_of_different_size)
6853 FunctionDecl *FDecl = dyn_cast_or_null<FunctionDecl>(NDecl);
6854 unsigned BuiltinID = (FDecl ? FDecl->
getBuiltinID() : 0);
6858 if (FDecl->
hasAttr<AnyX86InterruptAttr>()) {
6859 Diag(Fn->getExprLoc(), diag::err_anyx86_interrupt_called);
6862 if (FDecl->
hasAttr<ARMInterruptAttr>()) {
6863 Diag(Fn->getExprLoc(), diag::err_arm_interrupt_called);
6872 if (Caller->hasAttr<AnyX86InterruptAttr>() ||
6873 Caller->hasAttr<AnyX86NoCallerSavedRegistersAttr>()) {
6875 bool HasNonGPRRegisters =
6877 if (HasNonGPRRegisters &&
6878 (!FDecl || !FDecl->
hasAttr<AnyX86NoCallerSavedRegistersAttr>())) {
6879 Diag(Fn->getExprLoc(), diag::warn_anyx86_excessive_regsave)
6880 << (Caller->hasAttr<AnyX86InterruptAttr>() ? 0 : 1);
6893 Fn->getType()->isSpecificBuiltinType(BuiltinType::BuiltinFn)) {
6913 if (!BuiltinID || !
Context.BuiltinInfo.hasCustomTypechecking(BuiltinID)) {
6920 return ExprError(
Diag(LParenLoc, diag::err_typecheck_call_not_function)
6921 << Fn->getType() << Fn->getSourceRange());
6927 if (Fn->getType() ==
Context.UnknownAnyTy) {
6935 return ExprError(
Diag(LParenLoc, diag::err_typecheck_call_not_function)
6936 << Fn->getType() << Fn->getSourceRange());
6943 const auto *Proto = dyn_cast_or_null<FunctionProtoType>(FuncT);
6944 unsigned NumParams = Proto ? Proto->getNumParams() : 0;
6948 assert(UsesADL == ADLCallKind::NotADL &&
6949 "CUDAKernelCallExpr should not use ADL");
6960 if (BuiltinID &&
Context.BuiltinInfo.hasCustomTypechecking(BuiltinID)) {
6961 ExprResult E = CheckBuiltinFunctionCall(FDecl, BuiltinID, TheCall);
6970 if (FDecl && !FDecl->
hasAttr<CUDAGlobalAttr>())
6971 return ExprError(
Diag(LParenLoc,diag::err_kern_call_not_global_function)
6972 << FDecl << Fn->getSourceRange());
6978 return ExprError(
Diag(LParenLoc, diag::err_kern_type_not_void_return)
6979 << Fn->getType() << Fn->getSourceRange());
6982 if (FDecl && FDecl->
hasAttr<CUDAGlobalAttr>())
6983 return ExprError(
Diag(LParenLoc, diag::err_global_call_not_config)
6984 << FDecl << Fn->getSourceRange());
6998 if (
Context.getTargetInfo().getTriple().isWasm()) {
6999 for (
const Expr *Arg : Args) {
7000 if (Arg && Arg->getType()->isWebAssemblyTableType()) {
7002 diag::err_wasm_table_as_function_parameter));
7020 if (!Proto || !(Proto->isVariadic() && Args.size() >= Def->
param_size()))
7021 Diag(RParenLoc, diag::warn_call_wrong_number_of_arguments)
7022 << (Args.size() > Def->
param_size()) << FDecl << Fn->getSourceRange();
7041 if (!Proto && !Args.empty() &&
7043 !
Diags.isIgnored(diag::warn_strict_uses_without_prototype,
7045 Diag(LParenLoc, diag::warn_strict_uses_without_prototype)
7046 << (FDecl !=
nullptr) << FDecl;
7049 for (
unsigned i = 0, e = Args.size(); i != e; i++) {
7050 Expr *Arg = Args[i];
7052 if (Proto && i < Proto->getNumParams()) {
7054 Context, Proto->getParamType(i), Proto->isParamConsumed(i));
7072 diag::err_call_incomplete_argument, Arg))
7081 if (
Method->isImplicitObjectMemberFunction())
7082 return ExprError(
Diag(LParenLoc, diag::err_member_call_without_object)
7083 << Fn->getSourceRange() << 0);
7091 for (
unsigned i = 0, e = Args.size(); i != e; i++) {
7092 if (
const auto *RT =
7093 dyn_cast<RecordType>(Args[i]->
getType().getCanonicalType())) {
7094 if (RT->getDecl()->isOrContainsUnion())
7095 Diag(Args[i]->getBeginLoc(), diag::warn_cmse_nonsecure_union)
7106 checkFortifiedBuiltinMemoryFunction(FDecl, TheCall);
7109 return CheckBuiltinFunctionCall(FDecl, BuiltinID, TheCall);
7111 if (CheckPointerCall(NDecl, TheCall, Proto))
7114 if (CheckOtherCall(TheCall, Proto))
7124 assert(Ty &&
"ActOnCompoundLiteral(): missing type");
7125 assert(InitExpr &&
"ActOnCompoundLiteral(): missing expression");
7130 TInfo =
Context.getTrivialTypeSourceInfo(literalType);
7142 LParenLoc,
Context.getBaseElementType(literalType),
7143 diag::err_array_incomplete_or_sizeless_type,
7166 ? diag::err_variable_object_no_init
7167 : diag::err_compound_literal_with_vla_type;
7174 diag::err_typecheck_decl_incomplete_type,
7189 LiteralExpr =
Result.get();
7196 bool IsFileScope = !
CurContext->isFunctionOrMethod() &&
7227 if (
auto ILE = dyn_cast<InitListExpr>(LiteralExpr))
7228 for (
unsigned i = 0, j = ILE->getNumInits(); i != j; i++) {
7230 if (!
Init->isTypeDependent() && !
Init->isValueDependent() &&
7232 Diag(
Init->getExprLoc(), diag::err_init_element_not_constant)
7233 <<
Init->getSourceBitField();
7241 LiteralExpr, IsFileScope);
7253 Diag(LParenLoc, diag::err_compound_literal_with_address_space)
7271 Cleanup.setExprNeedsCleanups(
true);
7290 bool DiagnosedArrayDesignator =
false;
7291 bool DiagnosedNestedDesignator =
false;
7292 bool DiagnosedMixedDesignator =
false;
7296 for (
unsigned I = 0, E = InitArgList.size(); I != E; ++I) {
7297 if (
auto *DIE = dyn_cast<DesignatedInitExpr>(InitArgList[I])) {
7299 FirstDesignator = DIE->getBeginLoc();
7304 if (!DiagnosedNestedDesignator && DIE->size() > 1) {
7305 DiagnosedNestedDesignator =
true;
7306 Diag(DIE->getBeginLoc(), diag::ext_designated_init_nested)
7307 << DIE->getDesignatorsSourceRange();
7310 for (
auto &Desig : DIE->designators()) {
7311 if (!Desig.isFieldDesignator() && !DiagnosedArrayDesignator) {
7312 DiagnosedArrayDesignator =
true;
7313 Diag(Desig.getBeginLoc(), diag::ext_designated_init_array)
7314 << Desig.getSourceRange();
7318 if (!DiagnosedMixedDesignator &&
7320 DiagnosedMixedDesignator =
true;
7321 Diag(DIE->getBeginLoc(), diag::ext_designated_init_mixed)
7322 << DIE->getSourceRange();
7323 Diag(InitArgList[0]->getBeginLoc(), diag::note_designated_init_mixed)
7324 << InitArgList[0]->getSourceRange();
7328 DiagnosedMixedDesignator =
true;
7330 Diag(DIE->getBeginLoc(), diag::ext_designated_init_mixed)
7331 << DIE->getSourceRange();
7332 Diag(InitArgList[I]->getBeginLoc(), diag::note_designated_init_mixed)
7333 << InitArgList[I]->getSourceRange();
7337 if (FirstDesignator.
isValid()) {
7341 !DiagnosedNestedDesignator && !DiagnosedMixedDesignator) {
7343 ? diag::warn_cxx17_compat_designated_init
7344 : diag::ext_cxx_designated_init);
7346 Diag(FirstDesignator, diag::ext_designated_init);
7361 for (
unsigned I = 0, E = InitArgList.size(); I != E; ++I) {
7362 if (InitArgList[I]->
getType()->isNonOverloadPlaceholderType()) {
7369 InitArgList[I] = result.
get();
7389 Cleanup.setExprNeedsCleanups(
true);
7398 if (
Context.hasSameUnqualifiedType(SrcTy, DestTy))
7403 llvm_unreachable(
"member pointer type in C");
7412 if (SrcAS != DestAS)
7413 return CK_AddressSpaceConversion;
7414 if (
Context.hasCvrSimilarType(SrcTy, DestTy))
7420 ? CK_BitCast : CK_AnyPointerToBlockPointerCast);
7425 return CK_CPointerToObjCPointerCast;
7427 return CK_BlockPointerToObjCPointerCast;
7429 return CK_PointerToBoolean;
7431 return CK_PointerToIntegral;
7437 llvm_unreachable(
"illegal cast from pointer");
7439 llvm_unreachable(
"Should have returned before this");
7444 return CK_FixedPointCast;
7446 return CK_FixedPointToBoolean;
7448 return CK_FixedPointToIntegral;
7450 return CK_FixedPointToFloating;
7454 diag::err_unimplemented_conversion_with_fixed_point_type)
7456 return CK_IntegralCast;
7461 llvm_unreachable(
"illegal cast to pointer type");
7463 llvm_unreachable(
"Should have returned before this");
7473 return CK_NullToPointer;
7474 return CK_IntegralToPointer;
7476 return CK_IntegralToBoolean;
7478 return CK_IntegralCast;
7480 return CK_IntegralToFloating;
7485 return CK_IntegralRealToComplex;
7489 CK_IntegralToFloating);
7490 return CK_FloatingRealToComplex;
7492 llvm_unreachable(
"member pointer type in C");
7494 return CK_IntegralToFixedPoint;
7496 llvm_unreachable(
"Should have returned before this");
7501 return CK_FloatingCast;
7503 return CK_FloatingToBoolean;
7505 return CK_FloatingToIntegral;
7510 return CK_FloatingRealToComplex;
7514 CK_FloatingToIntegral);
7515 return CK_IntegralRealToComplex;
7519 llvm_unreachable(
"valid float->pointer cast?");
7521 llvm_unreachable(
"member pointer type in C");
7523 return CK_FloatingToFixedPoint;
7525 llvm_unreachable(
"Should have returned before this");
7530 return CK_FloatingComplexCast;
7532 return CK_FloatingComplexToIntegralComplex;
7535 if (
Context.hasSameType(ET, DestTy))
7536 return CK_FloatingComplexToReal;
7538 return CK_FloatingCast;
7541 return CK_FloatingComplexToBoolean;
7545 CK_FloatingComplexToReal);
7546 return CK_FloatingToIntegral;
7550 llvm_unreachable(
"valid complex float->pointer cast?");
7552 llvm_unreachable(
"member pointer type in C");
7555 diag::err_unimplemented_conversion_with_fixed_point_type)
7557 return CK_IntegralCast;
7559 llvm_unreachable(
"Should have returned before this");
7564 return CK_IntegralComplexToFloatingComplex;
7566 return CK_IntegralComplexCast;
7569 if (
Context.hasSameType(ET, DestTy))
7570 return CK_IntegralComplexToReal;
7572 return CK_IntegralCast;
7575 return CK_IntegralComplexToBoolean;
7579 CK_IntegralComplexToReal);
7580 return CK_IntegralToFloating;
7584 llvm_unreachable(
"valid complex int->pointer cast?");
7586 llvm_unreachable(
"member pointer type in C");
7589 diag::err_unimplemented_conversion_with_fixed_point_type)
7591 return CK_IntegralCast;
7593 llvm_unreachable(
"Should have returned before this");
7596 llvm_unreachable(
"Unhandled scalar cast");
7603 len = vecType->getNumElements();
7604 eltType = vecType->getElementType();
7611 if (!
type->isRealType())
return false;
7621 auto ValidScalableConversion = [](
QualType FirstType,
QualType SecondType) {
7625 const auto *VecTy = SecondType->getAs<
VectorType>();
7629 return ValidScalableConversion(srcTy, destTy) ||
7630 ValidScalableConversion(destTy, srcTy);
7640 return matSrcType->
getNumRows() == matDestType->getNumRows() &&
7641 matSrcType->
getNumColumns() == matDestType->getNumColumns();
7647 uint64_t SrcLen, DestLen;
7657 uint64_t SrcEltSize =
Context.getTypeSize(SrcEltTy);
7658 uint64_t DestEltSize =
Context.getTypeSize(DestEltTy);
7660 return (SrcLen * SrcEltSize == DestLen * DestEltSize);
7665 "expected at least one type to be a vector here");
7667 bool IsSrcTyAltivec =
7683 return (IsSrcTyAltivec || IsDestTyAltivec);
7703 switch (
Context.getLangOpts().getLaxVectorConversions()) {
7710 if (!Vec || !Vec->getElementType()->isIntegralOrEnumerationType())
7715 if (!Vec || !Vec->getElementType()->isIntegralOrEnumerationType())
7732 return Diag(R.
getBegin(), diag::err_invalid_conversion_between_matrixes)
7733 << DestTy << SrcTy << R;
7737 diag::err_invalid_conversion_between_matrix_and_type)
7738 << SrcTy << DestTy << R;
7741 diag::err_invalid_conversion_between_matrix_and_type)
7742 << DestTy << SrcTy << R;
7745 Kind = CK_MatrixCast;
7751 assert(VectorTy->
isVectorType() &&
"Not a vector type!");
7757 diag::err_invalid_conversion_between_vectors :
7758 diag::err_invalid_conversion_between_vector_and_integer)
7759 << VectorTy << Ty << R;
7762 diag::err_invalid_conversion_between_vector_and_scalar)
7763 << VectorTy << Ty << R;
7772 if (DestElemTy == SplattedExpr->
getType())
7773 return SplattedExpr;
7786 CK_BooleanToSignedIntegral);
7787 SplattedExpr = CastExprRes.
get();
7788 CK = CK_IntegralToFloating;
7790 CK = CK_BooleanToSignedIntegral;
7797 SplattedExpr = CastExprRes.
get();
7815 !
Context.hasSameUnqualifiedType(DestTy, SrcTy))) {
7816 Diag(R.
getBegin(),diag::err_invalid_conversion_between_ext_vectors)
7817 << DestTy << SrcTy << R;
7829 diag::err_invalid_conversion_between_vector_and_scalar)
7830 << DestTy << SrcTy << R;
7832 Kind = CK_VectorSplat;
7842 DestType == SourceType)
7850 if (!CE->getCalleeAllocSizeAttr())
7852 std::optional<llvm::APInt> AllocSize =
7853 CE->evaluateBytesReturnedByAllocSizeCall(S.
Context);
7856 if (!AllocSize || AllocSize->isZero())
7866 if (LhsSize && Size < LhsSize)
7868 << Size.getQuantity() << TargetType << LhsSize->getQuantity();
7876 "ActOnCastExpr(): missing type or expr");
7892 bool isVectorLiteral =
false;
7907 isVectorLiteral =
true;
7910 isVectorLiteral =
true;
7915 if (isVectorLiteral)
7945 "Expected paren or paren list expression");
7952 LiteralLParenLoc = PE->getLParenLoc();
7953 LiteralRParenLoc = PE->getRParenLoc();
7954 exprs = PE->getExprs();
7955 numExprs = PE->getNumExprs();
7982 if (numExprs == 1) {
7985 if (Literal.isInvalid())
7991 else if (numExprs < numElems) {
7993 diag::err_incorrect_number_of_vector_initializers);
7997 initExprs.append(exprs, exprs + numExprs);
8006 if (Literal.isInvalid())
8013 initExprs.append(exprs, exprs + numExprs);
8018 initExprs, LiteralRParenLoc);
8047 unsigned NumUserSpecifiedExprs,
8052 InitLoc, LParenLoc, RParenLoc);
8057 const Expr *NullExpr = LHSExpr;
8058 const Expr *NonPointerExpr = RHSExpr;
8065 NonPointerExpr = LHSExpr;
8087 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands_null)
8088 << NonPointerExpr->
getType() << DiagType
8100 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_nonfloat)
8101 << CondTy <<
Cond->getSourceRange();
8108 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_scalar)
8109 << CondTy <<
Cond->getSourceRange();
8142 bool IsBlockPointer =
false;
8146 IsBlockPointer =
true;
8171 ResultAddrSpace = LAddrSpace;
8173 ResultAddrSpace = RAddrSpace;
8175 S.
Diag(Loc, diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
8182 auto LHSCastKind = CK_BitCast, RHSCastKind = CK_BitCast;
8187 S.
Diag(Loc, diag::err_typecheck_cond_incompatible_ptrauth)
8204 LAddrSpace == ResultAddrSpace ? CK_BitCast : CK_AddressSpaceConversion;
8206 RAddrSpace == ResultAddrSpace ? CK_BitCast : CK_AddressSpaceConversion;
8214 lhptee, rhptee,
false,
false,
8217 if (CompositeTy.
isNull()) {
8234 S.
Diag(Loc, diag::ext_typecheck_cond_incompatible_pointers)
8245 QualType ResultTy = [&, ResultAddrSpace]() {
8280 S.
Diag(Loc, diag::err_typecheck_cond_incompatible_operands)
8333 bool IsIntFirstExpr) {
8335 !Int.get()->getType()->isIntegerType())
8338 Expr *Expr1 = IsIntFirstExpr ? Int.get() : PointerExpr;
8339 Expr *Expr2 = IsIntFirstExpr ? PointerExpr : Int.get();
8341 S.
Diag(Loc, diag::ext_typecheck_cond_pointer_integer_mismatch)
8345 CK_IntegralToPointer);
8379 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_int_float)
8385 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_int_float)
8391 if (LHSType == RHSType)
8401 (S, LHS, RHS, LHSType, RHSType,
false);
8435 llvm::raw_svector_ostream OS(Str);
8436 OS <<
"(vector of " << NumElements <<
" '" << EleTyName <<
"' values)";
8437 S.
Diag(QuestionLoc, diag::err_conditional_vector_element_size)
8438 << CondTy << OS.str();
8459 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_nonfloat)
8460 <<
Cond->getType() <<
Cond->getSourceRange();
8477 S.
Diag(QuestionLoc, diag::err_conditional_vector_size)
8478 << CondTy << VecResTy;
8483 QualType RVE = RV->getElementType();
8488 S.
Diag(QuestionLoc, diag::err_conditional_vector_element_size)
8489 << CondTy << VecResTy;
8504 if (
Cond.isInvalid())
8515 bool IsBoolVecLang =
8544 if (
const CallExpr *CE = dyn_cast<CallExpr>(E)) {
8545 QualType Ty = CE->getCallee()->getType();
8577 if (
Context.isDependenceAllowed() &&
8583 "should only occur in error-recovery path.");
8590 Cond.get()->getType()->isExtVectorType())
8595 if (
Cond.isInvalid())
8618 Diag(QuestionLoc, diag::err_wasm_table_conditional_expression)
8627 diag::err_typecheck_cond_incompatible_operands) << LHSTy << RHSTy
8646 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands)
8662 Context.hasSameUnqualifiedType(LHSTy, RHSTy))
8671 ResTy =
Context.getCommonSugaredType(LHSTy, RHSTy);
8702 if (!compositeType.
isNull())
8703 return compositeType;
8733 if (
Context.hasSameType(LHSTy, RHSTy))
8734 return Context.getCommonSugaredType(LHSTy, RHSTy);
8737 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands)
8756 Self.Diag(Loc,
Note) << ParenRange;
8776 const Expr **RHSExprs) {
8781 if (
const auto *MTE = dyn_cast<MaterializeTemporaryExpr>(E)) {
8782 E = MTE->getSubExpr();
8787 if (
const auto *OP = dyn_cast<BinaryOperator>(E);
8789 *Opcode = OP->getOpcode();
8790 *RHSExprs = OP->getRHS();
8795 if (
const auto *
Call = dyn_cast<CXXOperatorCallExpr>(E)) {
8796 if (
Call->getNumArgs() != 2)
8802 if (OO < OO_Plus || OO > OO_Arrow ||
8803 OO == OO_PlusPlus || OO == OO_MinusMinus)
8809 *RHSExprs =
Call->getArg(1);
8825 if (
const auto *OP = dyn_cast<BinaryOperator>(E))
8826 return OP->isComparisonOp() || OP->isLogicalOp();
8827 if (
const auto *OP = dyn_cast<UnaryOperator>(E))
8828 return OP->getOpcode() == UO_LNot;
8843 const Expr *RHSExpr) {
8845 const Expr *CondRHS;
8856 ? diag::warn_precedence_bitwise_conditional
8857 : diag::warn_precedence_conditional;
8859 Self.Diag(OpLoc, DiagID)
8865 Self.PDiag(diag::note_precedence_silence)
8870 Self.PDiag(diag::note_precedence_conditional_first),
8881 auto GetNullability = [](
QualType Ty) {
8882 std::optional<NullabilityKind> Kind = Ty->getNullability();
8892 auto LHSKind = GetNullability(LHSTy), RHSKind = GetNullability(RHSTy);
8900 MergedKind = RHSKind;
8907 MergedKind = RHSKind;
8909 MergedKind = LHSKind;
8915 if (GetNullability(ResTy) == MergedKind)
8933 Expr *commonExpr =
nullptr;
8935 commonExpr = CondExpr;
8942 commonExpr = result.
get();
8956 commonExpr = commonRes.
get();
8966 commonExpr = MatExpr.
get();
8974 LHSExpr = CondExpr = opaqueValue;
8982 VK, OK, QuestionLoc);
8983 if (result.
isNull() ||
Cond.isInvalid() || LHS.isInvalid() ||
8990 CheckBoolLikeConversion(
Cond.get(), QuestionLoc);
8998 RHS.get(), result,
VK, OK);
9001 commonExpr, opaqueValue,
Cond.get(), LHS.get(), RHS.get(), QuestionLoc,
9002 ColonLoc, result,
VK, OK);
9006 unsigned FromAttributes = 0, ToAttributes = 0;
9007 if (
const auto *FromFn =
9008 dyn_cast<FunctionProtoType>(
Context.getCanonicalType(FromType)))
9011 if (
const auto *ToFn =
9012 dyn_cast<FunctionProtoType>(
Context.getCanonicalType(ToType)))
9016 return FromAttributes != ToAttributes;
9028 assert(LHSType.
isCanonical() &&
"LHS not canonicalized!");
9029 assert(RHSType.
isCanonical() &&
"RHS not canonicalized!");
9032 const Type *lhptee, *rhptee;
9034 std::tie(lhptee, lhq) =
9036 std::tie(rhptee, rhq) =
9107 diag::warn_typecheck_convert_incompatible_function_pointer_strict,
9130 if (ltrans == rtrans) {
9146 std::tie(lhptee, lhq) =
9148 std::tie(rhptee, rhq) =
9160 return AssignConvertType::
9161 IncompatibleNestedPointerAddressSpaceMismatch;
9165 if (lhptee == rhptee)
9185 const auto *LFPT = dyn_cast<FunctionProtoType>(LFT);
9186 const auto *RFPT = dyn_cast<FunctionProtoType>(RFT);
9189 LFPT->getParamTypes(),
9190 RFPT->getExtProtoInfo());
9195 LFPT->getParamTypes(), EPI);
9200 EPI.
ExtInfo = LFT->getExtInfo();
9202 RFPT->getParamTypes(), EPI);
9221 assert(LHSType.
isCanonical() &&
"LHS not canonicalized!");
9222 assert(RHSType.
isCanonical() &&
"RHS not canonicalized!");
9243 if (LQuals != RQuals)
9272 assert(LHSType.
isCanonical() &&
"LHS was not canonicalized!");
9273 assert(RHSType.
isCanonical() &&
"RHS was not canonicalized!");
9321 return VT->getElementType().getCanonicalType() == ElementType;
9351 LHSType =
Context.getCanonicalType(LHSType).getUnqualifiedType();
9352 RHSType =
Context.getCanonicalType(RHSType).getUnqualifiedType();
9355 if (LHSType == RHSType) {
9362 if (
const auto *AT = dyn_cast<AutoType>(LHSType)) {
9363 if (AT->isGNUAutoType()) {
9371 if (
const AtomicType *AtomicTy = dyn_cast<AtomicType>(LHSType)) {
9376 if (Kind != CK_NoOp && ConvertRHS)
9378 Kind = CK_NonAtomicToAtomic;
9390 if (
Context.typesAreCompatible(LHSTypeRef->getPointeeType(), RHSType)) {
9391 Kind = CK_LValueBitCast;
9402 if (LHSExtType->getNumElements() != RHSExtType->getNumElements())
9406 RHSExtType->getElementType()->isIntegerType()) {
9407 Kind = CK_IntegralToBoolean;
9416 Kind = CK_VectorSplat;
9426 if (
Context.areCompatibleVectorTypes(LHSType, RHSType)) {
9438 if (
Context.getTargetInfo().getTriple().isPPC() &&
9440 !
Context.areCompatibleVectorTypes(RHSType, LHSType))
9442 << RHSType << LHSType;
9456 if (
Context.getTargetInfo().getTriple().isPPC() &&
9461 << RHSType << LHSType;
9472 if (
ARM().areCompatibleSveTypes(LHSType, RHSType) ||
9473 ARM().areLaxCompatibleSveTypes(LHSType, RHSType)) {
9481 if (
Context.areCompatibleRVVTypes(LHSType, RHSType) ||
9482 Context.areLaxCompatibleRVVTypes(LHSType, RHSType)) {
9511 if (
const PointerType *LHSPointer = dyn_cast<PointerType>(LHSType)) {
9514 LangAS AddrSpaceL = LHSPointer->getPointeeType().getAddressSpace();
9516 if (AddrSpaceL != AddrSpaceR)
9517 Kind = CK_AddressSpaceConversion;
9518 else if (
Context.hasCvrSimilarType(RHSType, LHSType))
9528 Kind = CK_IntegralToPointer;
9536 if (LHSPointer->getPointeeType()->isVoidType()) {
9544 Context.getObjCClassRedefinitionType())) {
9555 if (LHSPointer->getPointeeType()->isVoidType()) {
9556 LangAS AddrSpaceL = LHSPointer->getPointeeType().getAddressSpace();
9561 AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion : CK_BitCast;
9579 Kind = AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion : CK_BitCast;
9585 Kind = CK_IntegralToPointer;
9591 Kind = CK_AnyPointerToBlockPointerCast;
9597 if (RHSPT->getPointeeType()->isVoidType()) {
9598 Kind = CK_AnyPointerToBlockPointerCast;
9612 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
9614 !
ObjC().CheckObjCARCUnavailableWeakConversion(OrigLHSType, RHSType))
9621 Kind = CK_IntegralToPointer;
9628 Kind = CK_CPointerToObjCPointerCast;
9638 Context.getObjCClassRedefinitionType())) {
9650 Kind = CK_BlockPointerToObjCPointerCast;
9662 Kind = CK_NullToPointer;
9669 if (LHSType ==
Context.BoolTy) {
9670 Kind = CK_PointerToBoolean;
9676 Kind = CK_PointerToIntegral;
9686 if (LHSType ==
Context.BoolTy) {
9687 Kind = CK_PointerToBoolean;
9693 Kind = CK_PointerToIntegral;
9702 if (
Context.typesAreCompatible(LHSType, RHSType)) {
9709 Kind = CK_IntToOCLSampler;
9743 const RecordType *UT =
ArgType->getAsUnionType();
9747 RecordDecl *UD = UT->getDecl()->getDefinitionOrSelf();
9748 if (!UD->
hasAttr<TransparentUnionAttr>())
9754 for (
auto *it : UD->
fields()) {
9755 if (it->getType()->isPointerType()) {
9794 bool DiagnoseCFAudited,
9798 assert((ConvertRHS || !
Diagnose) &&
"can't indicate whether we diagnosed");
9804 ExprResult &RHS = ConvertRHS ? CallerRHS : LocalRHS;
9808 if (RHSPtrType->getPointeeType()->hasAttr(attr::NoDeref) &&
9809 !LHSPtrType->getPointeeType()->hasAttr(attr::NoDeref)) {
9811 diag::warn_noderef_to_dereferenceable_pointer)
9830 AllowedExplicit::None,
9842 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
9843 !
ObjC().CheckObjCARCUnavailableWeakConversion(LHSType, RHSType))
9857 RHS.
get(), LHSType,
false, DAP))
9980 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
9990 ObjC().CheckConversionToObjCLiteral(LHSType, E,
Diagnose))) {
10010struct OriginalOperand {
10011 explicit OriginalOperand(
Expr *Op) : Orig(Op), Conversion(
nullptr) {
10012 if (
auto *MTE = dyn_cast<MaterializeTemporaryExpr>(Op))
10013 Op = MTE->getSubExpr();
10014 if (
auto *BTE = dyn_cast<CXXBindTemporaryExpr>(Op))
10015 Op = BTE->getSubExpr();
10016 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(Op)) {
10017 Orig = ICE->getSubExprAsWritten();
10018 Conversion = ICE->getConversionFunction();
10022 QualType
getType()
const {
return Orig->getType(); }
10025 NamedDecl *Conversion;
10031 OriginalOperand OrigLHS(LHS.
get()), OrigRHS(RHS.
get());
10033 Diag(Loc, diag::err_typecheck_invalid_operands)
10034 << OrigLHS.getType() << OrigRHS.getType()
10039 if (OrigLHS.Conversion) {
10040 Diag(OrigLHS.Conversion->getLocation(),
10041 diag::note_typecheck_invalid_operands_converted)
10044 if (OrigRHS.Conversion) {
10046 diag::note_typecheck_invalid_operands_converted)
10061 if (!(LHSNatVec && RHSNatVec)) {
10063 Expr *NonVector = !LHSNatVec ? LHS.
get() : RHS.
get();
10064 Diag(Loc, diag::err_typecheck_logical_vector_expr_gnu_cpp_restrict)
10066 <<
Vector->getSourceRange();
10070 Diag(Loc, diag::err_typecheck_logical_vector_expr_gnu_cpp_restrict)
10093 unsigned &DiagID) {
10099 scalarCast = CK_IntegralToBoolean;
10104 DiagID = diag::err_opencl_scalar_type_rank_greater_than_vector_type;
10109 scalarCast = CK_IntegralCast;
10114 DiagID = diag::err_opencl_scalar_type_rank_greater_than_vector_type;
10117 scalarCast = CK_FloatingCast;
10120 scalarCast = CK_IntegralToFloating;
10129 if (scalarCast != CK_NoOp)
10140 assert(VecTy &&
"Expression E must be a vector");
10145 VecTy->getVectorKind());
10149 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(E))
10150 if (ICE->getSubExpr()->getType() == NewVecTy)
10151 return ICE->getSubExpr();
10153 auto Cast = ElementType->
isIntegerType() ? CK_IntegralCast : CK_FloatingCast;
10161 if (Int->get()->containsErrors())
10164 QualType IntTy = Int->get()->getType().getUnqualifiedType();
10170 bool CstInt = Int->get()->EvaluateAsInt(EVResult, S.
Context);
10178 llvm::APSInt Result = EVResult.
Val.
getInt();
10179 unsigned NumBits = IntSigned
10180 ? (Result.isNegative() ? Result.getSignificantBits()
10181 : Result.getActiveBits())
10182 : Result.getActiveBits();
10189 return (IntSigned != OtherIntSigned &&
10195 return (Order < 0);
10202 if (Int->get()->containsErrors())
10205 QualType IntTy = Int->get()->getType().getUnqualifiedType();
10210 bool CstInt = Int->get()->EvaluateAsInt(EVResult, S.
Context);
10219 llvm::APSInt Result = EVResult.
Val.
getInt();
10222 llvm::APFloat::rmTowardZero);
10225 bool Ignored =
false;
10226 Float.convertToInteger(ConvertBack, llvm::APFloat::rmNearestTiesToEven,
10228 if (Result != ConvertBack)
10234 unsigned FloatPrec = llvm::APFloat::semanticsPrecision(
10236 if (Bits > FloatPrec)
10249 QualType ScalarTy = Scalar->get()->getType().getUnqualifiedType();
10250 QualType VectorTy =
Vector->get()->getType().getUnqualifiedType();
10255 "ExtVectorTypes should not be handled here!");
10256 VectorEltTy = VT->getElementType();
10261 llvm_unreachable(
"Only Fixed-Length and SVE Vector types are handled here");
10287 ScalarCast = CK_IntegralCast;
10291 ScalarCast = CK_FloatingToIntegral;
10299 llvm::APFloat
Result(0.0);
10305 bool CstScalar = Scalar->get()->isValueDependent() ||
10306 Scalar->get()->EvaluateAsFloat(Result, S.
Context);
10308 if (!CstScalar && Order < 0)
10314 bool Truncated =
false;
10316 llvm::APFloat::rmNearestTiesToEven, &Truncated);
10321 ScalarCast = CK_FloatingCast;
10326 ScalarCast = CK_IntegralToFloating;
10333 if (ScalarCast != CK_NoOp)
10341 bool AllowBothBool,
10342 bool AllowBoolConversions,
10343 bool AllowBoolOperation,
10344 bool ReportInvalid) {
10345 if (!IsCompAssign) {
10361 assert(LHSVecType || RHSVecType);
10369 (RHSVecType && RHSVecType->getElementType()->isMFloat8Type()))
10374 if (!AllowBothBool && LHSVecType &&
10380 if (!AllowBoolOperation &&
10385 if (
Context.hasSameType(LHSType, RHSType))
10386 return Context.getCommonSugaredType(LHSType, RHSType);
10389 if (LHSVecType && RHSVecType &&
10390 Context.areCompatibleVectorTypes(LHSType, RHSType)) {
10404 if (AllowBoolConversions && LHSVecType && RHSVecType &&
10407 Context.getTypeSize(RHSVecType->getElementType()))) {
10414 if (!IsCompAssign &&
10417 RHSVecType->getElementType()->isIntegerType()) {
10426 unsigned &SVEorRVV) {
10447 if (IsSveRVVConversion(LHSType, RHSType, SVEorRVV) ||
10448 IsSveRVVConversion(RHSType, LHSType, SVEorRVV)) {
10449 Diag(Loc, diag::err_typecheck_sve_rvv_ambiguous)
10450 << SVEorRVV << LHSType << RHSType;
10457 unsigned &SVEorRVV) {
10462 if (FirstVecType && SecondVecType) {
10465 SecondVecType->getVectorKind() ==
10470 SecondVecType->getVectorKind() ==
10472 SecondVecType->getVectorKind() ==
10474 SecondVecType->getVectorKind() ==
10483 if (SecondVecType &&
10496 if (IsSveRVVGnuConversion(LHSType, RHSType, SVEorRVV) ||
10497 IsSveRVVGnuConversion(RHSType, LHSType, SVEorRVV)) {
10498 Diag(Loc, diag::err_typecheck_sve_rvv_gnu_ambiguous)
10499 << SVEorRVV << LHSType << RHSType;
10505 unsigned DiagID = diag::err_typecheck_vector_not_convertable;
10520 LHSType, RHSVecType->getElementType(),
10533 QualType VecType = LHSVecType ? LHSType : RHSType;
10534 const VectorType *VT = LHSVecType ? LHSVecType : RHSVecType;
10535 QualType OtherType = LHSVecType ? RHSType : LHSType;
10536 ExprResult *OtherExpr = LHSVecType ? &RHS : &LHS;
10538 if (
Context.getTargetInfo().getTriple().isPPC() &&
10540 !
Context.areCompatibleVectorTypes(RHSType, LHSType))
10541 Diag(Loc, diag::warn_deprecated_lax_vec_conv_all) << RHSType << LHSType;
10545 if (!IsCompAssign) {
10564 if ((!RHSVecType && !RHSType->
isRealType()) ||
10566 Diag(Loc, diag::err_typecheck_vector_not_convertable_non_scalar)
10567 << LHSType << RHSType
10579 Diag(Loc, diag::err_opencl_implicit_vector_conversion) << LHSType
10590 QualType Scalar = LHSVecType ? RHSType : LHSType;
10592 unsigned ScalarOrVector = LHSVecType && RHSVecType ? 1 : 0;
10594 diag::err_typecheck_vector_not_convertable_implict_truncation)
10595 << ScalarOrVector << Scalar <<
Vector;
10602 << LHSType << RHSType
10611 if (!IsCompAssign) {
10626 unsigned DiagID = diag::err_typecheck_invalid_operands;
10628 ((LHSBuiltinTy && LHSBuiltinTy->
isSVEBool()) ||
10629 (RHSBuiltinTy && RHSBuiltinTy->isSVEBool()))) {
10635 if (
Context.hasSameType(LHSType, RHSType))
10650 Diag(Loc, diag::err_typecheck_vector_not_convertable_non_scalar)
10657 Context.getBuiltinVectorTypeInfo(LHSBuiltinTy).EC !=
10658 Context.getBuiltinVectorTypeInfo(RHSBuiltinTy).EC) {
10659 Diag(Loc, diag::err_typecheck_vector_lengths_not_equal)
10668 bool ScalarOrVector =
10671 Diag(Loc, diag::err_typecheck_vector_not_convertable_implict_truncation)
10672 << ScalarOrVector << Scalar <<
Vector;
10704 S.
Diag(Loc, diag::warn_null_in_arithmetic_operation)
10716 S.
Diag(Loc, diag::warn_null_in_comparison_operation)
10717 << LHSNull << NonNullType
10729 QualType ElementType = CT->getElementType();
10730 bool IsComplexRangePromoted = S.
getLangOpts().getComplexRange() ==
10737 const llvm::fltSemantics &ElementTypeSemantics =
10739 const llvm::fltSemantics &HigherElementTypeSemantics =
10742 if ((llvm::APFloat::semanticsMaxExponent(ElementTypeSemantics) * 2 + 1 >
10743 llvm::APFloat::semanticsMaxExponent(HigherElementTypeSemantics)) ||
10750 if (
Type == HigherElementType) {
10762 const auto *LUE = dyn_cast<UnaryExprOrTypeTraitExpr>(LHS);
10763 const auto *RUE = dyn_cast<UnaryExprOrTypeTraitExpr>(RHS);
10766 if (LUE->getKind() != UETT_SizeOf || LUE->isArgumentType() ||
10767 RUE->getKind() != UETT_SizeOf)
10774 if (RUE->isArgumentType())
10775 RHSTy = RUE->getArgumentType().getNonReferenceType();
10777 RHSTy = RUE->getArgumentExpr()->IgnoreParens()->getType();
10784 if (
const auto *DRE = dyn_cast<DeclRefExpr>(LHSArg)) {
10785 if (
const ValueDecl *LHSArgDecl = DRE->getDecl())
10786 S.
Diag(LHSArgDecl->getLocation(), diag::note_pointer_declared_here)
10790 QualType ArrayElemTy = ArrayTy->getElementType();
10796 S.
Diag(Loc, diag::warn_division_sizeof_array)
10798 if (
const auto *DRE = dyn_cast<DeclRefExpr>(LHSArg)) {
10799 if (
const ValueDecl *LHSArgDecl = DRE->getDecl())
10800 S.
Diag(LHSArgDecl->getLocation(), diag::note_array_declared_here)
10804 S.
Diag(Loc, diag::note_precedence_silence) << RHS;
10817 S.
PDiag(diag::warn_remainder_division_by_zero)
10826 const Expr *LHSExpr = LHS.
get();
10827 const Expr *RHSExpr = RHS.
get();
10832 if (!LHSIsScoped && !RHSIsScoped)
10844 ->getDefinitionOrSelf()
10845 ->getIntegerType();
10846 std::string InsertionString =
"static_cast<" + IntType.getAsString() +
">(";
10847 S.
Diag(BeginLoc, diag::note_no_implicit_conversion_for_scoped_enum)
10852 DiagnosticHelper(LHSExpr, LHSType);
10855 DiagnosticHelper(RHSExpr, RHSType);
10862 bool IsCompAssign = Opc == BO_MulAssign || Opc == BO_DivAssign;
10863 bool IsDiv = Opc == BO_Div || Opc == BO_DivAssign;
10957 if (compType.
isNull() ||
10962 IsCompAssign ? BO_RemAssign : BO_Rem);
10973 ? diag::err_typecheck_pointer_arith_void_type
10974 : diag::ext_gnu_void_ptr)
10983 ? diag::err_typecheck_pointer_arith_void_type
10984 : diag::ext_gnu_void_ptr)
10985 << 0 <<
Pointer->getSourceRange();
10996 S.
Diag(Loc, diag::warn_gnu_null_ptr_arith)
10997 <<
Pointer->getSourceRange();
10999 S.
Diag(Loc, diag::warn_pointer_arith_null_ptr)
11016 S.
PDiag(diag::warn_pointer_sub_null_ptr)
11018 <<
Pointer->getSourceRange());
11027 ? diag::err_typecheck_pointer_arith_function_type
11028 : diag::ext_gnu_ptr_func_arith)
11040 assert(
Pointer->getType()->isAnyPointerType());
11042 ? diag::err_typecheck_pointer_arith_function_type
11043 : diag::ext_gnu_ptr_func_arith)
11044 << 0 <<
Pointer->getType()->getPointeeType()
11046 <<
Pointer->getSourceRange();
11054 QualType ResType = Operand->getType();
11056 ResType = ResAtomicType->getValueType();
11062 diag::err_typecheck_arithmetic_incomplete_or_sizeless_type,
11063 Operand->getSourceRange());
11076 QualType ResType = Operand->getType();
11078 ResType = ResAtomicType->getValueType();
11110 if (!isLHSPointer && !isRHSPointer)
return true;
11112 QualType LHSPointeeTy, RHSPointeeTy;
11117 if (isLHSPointer && isRHSPointer) {
11121 diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
11129 bool isLHSVoidPtr = isLHSPointer && LHSPointeeTy->
isVoidType();
11130 bool isRHSVoidPtr = isRHSPointer && RHSPointeeTy->
isVoidType();
11131 if (isLHSVoidPtr || isRHSVoidPtr) {
11139 bool isLHSFuncPtr = isLHSPointer && LHSPointeeTy->
isFunctionType();
11140 bool isRHSFuncPtr = isRHSPointer && RHSPointeeTy->
isFunctionType();
11141 if (isLHSFuncPtr || isRHSFuncPtr) {
11163 Expr* IndexExpr = RHSExpr;
11166 IndexExpr = LHSExpr;
11169 bool IsStringPlusInt = StrExpr &&
11175 Self.Diag(OpLoc, diag::warn_string_plus_int)
11179 if (IndexExpr == RHSExpr) {
11181 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence)
11186 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence);
11192 const Expr *StringRefExpr = LHSExpr;
11197 CharExpr = dyn_cast<CharacterLiteral>(LHSExpr->
IgnoreImpCasts());
11198 StringRefExpr = RHSExpr;
11201 if (!CharExpr || !StringRefExpr)
11221 Self.Diag(OpLoc, diag::warn_string_plus_char)
11222 << DiagRange << Ctx.
CharTy;
11224 Self.Diag(OpLoc, diag::warn_string_plus_char)
11225 << DiagRange << CharExpr->
getType();
11231 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence)
11236 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence);
11245 S.
Diag(Loc, diag::err_typecheck_sub_ptr_compatible)
11264 if (CompLHSTy) *CompLHSTy = compType;
11273 *CompLHSTy = compType;
11282 *CompLHSTy = compType;
11293 if (Opc == BO_Add) {
11300 if (CompLHSTy) *CompLHSTy = compType;
11314 std::swap(PExp, IExp);
11327 if (!IExp->getType()->isIntegerType())
11336 (!IExp->isValueDependent() &&
11337 (!IExp->EvaluateAsInt(KnownVal,
Context) ||
11341 Context, BO_Add, PExp, IExp);
11355 Diag(Loc, diag::err_ptrauth_indirect_goto_addrlabel_arithmetic)
11361 CheckArrayAccess(PExp, IExp);
11367 if (
Context.isPromotableIntegerType(LHSTy))
11368 LHSTy =
Context.getPromotedIntegerType(LHSTy);
11370 *CompLHSTy = LHSTy;
11391 if (CompLHSTy) *CompLHSTy = compType;
11400 *CompLHSTy = compType;
11409 *CompLHSTy = compType;
11423 if (CompLHSTy) *CompLHSTy = compType;
11440 Diag(Loc, diag::err_ptrauth_indirect_goto_addrlabel_arithmetic)
11466 CheckArrayAccess(LHS.
get(), RHS.
get(),
nullptr,
11469 if (CompLHSTy) *CompLHSTy = LHS.
get()->
getType();
11480 if (!
Context.hasSameUnqualifiedType(lpointee, rpointee)) {
11485 if (!
Context.typesAreCompatible(
11486 Context.getCanonicalType(lpointee).getUnqualifiedType(),
11487 Context.getCanonicalType(rpointee).getUnqualifiedType())) {
11513 if (ElementSize.
isZero()) {
11514 Diag(Loc,diag::warn_sub_ptr_zero_size_types)
11520 if (CompLHSTy) *CompLHSTy = LHS.
get()->
getType();
11521 return Context.getPointerDiffType();
11531 if (
const EnumType *ET =
T->getAsCanonical<EnumType>())
11532 return ET->getDecl()->isScoped();
11544 if (Opc == BO_Shr &&
11553 llvm::APSInt Right = RHSResult.
Val.
getInt();
11555 if (Right.isNegative()) {
11557 S.
PDiag(diag::warn_shift_negative)
11568 LeftSize = FXSema.getWidth() - (
unsigned)FXSema.hasUnsignedPadding();
11570 if (Right.uge(LeftSize)) {
11572 S.
PDiag(diag::warn_shift_gt_typewidth)
11592 llvm::APSInt Left = LHSResult.
Val.
getInt();
11603 if (Left.isNegative()) {
11605 S.
PDiag(diag::warn_shift_lhs_negative)
11610 llvm::APInt ResultBits =
11611 static_cast<llvm::APInt &
>(Right) + Left.getSignificantBits();
11612 if (ResultBits.ule(LeftSize))
11614 llvm::APSInt Result = Left.extend(ResultBits.getLimitedValue());
11615 Result = Result.shl(Right);
11620 Result.toString(HexResult, 16,
false,
true);
11626 if (ResultBits - 1 == LeftSize) {
11627 S.
Diag(Loc, diag::warn_shift_result_sets_sign_bit)
11628 << HexResult << LHSType
11633 S.
Diag(Loc, diag::warn_shift_result_gt_typewidth)
11634 << HexResult.str() << Result.getSignificantBits() << LHSType
11646 S.
Diag(Loc, diag::err_shift_rhs_only_vector)
11652 if (!IsCompAssign) {
11674 S.
Diag(Loc, diag::err_typecheck_invalid_operands)
11681 if (!LHSEleType->isIntegerType()) {
11682 S.
Diag(Loc, diag::err_typecheck_expect_int)
11687 if (!RHSEleType->isIntegerType()) {
11688 S.
Diag(Loc, diag::err_typecheck_expect_int)
11697 if (LHSEleType != RHSEleType) {
11699 LHSEleType = RHSEleType;
11705 }
else if (RHSVecTy) {
11710 S.
Diag(Loc, diag::err_typecheck_vector_lengths_not_equal)
11718 if (LHSBT != RHSBT &&
11720 S.
Diag(Loc, diag::warn_typecheck_vector_element_sizes_not_equal)
11737 bool IsCompAssign) {
11738 if (!IsCompAssign) {
11761 if ((LHSBuiltinTy && LHSBuiltinTy->
isSVEBool()) ||
11762 (RHSBuiltinTy && RHSBuiltinTy->
isSVEBool())) {
11763 S.
Diag(Loc, diag::err_typecheck_invalid_operands)
11768 if (!LHSEleType->isIntegerType()) {
11769 S.
Diag(Loc, diag::err_typecheck_expect_int)
11774 if (!RHSEleType->isIntegerType()) {
11775 S.
Diag(Loc, diag::err_typecheck_expect_int)
11783 S.
Diag(Loc, diag::err_typecheck_invalid_operands)
11793 if (LHSEleType != RHSEleType) {
11795 LHSEleType = RHSEleType;
11797 const llvm::ElementCount VecSize =
11806 S.
Diag(Loc, diag::err_typecheck_vector_lengths_not_equal)
11812 const llvm::ElementCount VecSize =
11814 if (LHSEleType != RHSEleType) {
11816 RHSEleType = LHSEleType;
11829 bool IsCompAssign) {
11863 if (IsCompAssign) LHS = OldLHS;
11891 S.
Diag(Loc, IsError ? diag::err_typecheck_comparison_of_distinct_pointers
11892 : diag::ext_typecheck_comparison_of_distinct_pointers)
11932 S.
Diag(Loc, IsError ? diag::err_typecheck_comparison_of_fptr_to_void
11933 : diag::ext_typecheck_comparison_of_fptr_to_void)
11940 case Stmt::ObjCArrayLiteralClass:
11941 case Stmt::ObjCDictionaryLiteralClass:
11942 case Stmt::ObjCStringLiteralClass:
11943 case Stmt::ObjCBoxedExprClass:
11987 QualType T = Method->parameters()[0]->getType();
11988 if (!
T->isObjCObjectPointerType())
11991 QualType R = Method->getReturnType();
12004 Literal = LHS.
get();
12007 Literal = RHS.
get();
12023 llvm_unreachable(
"Unknown Objective-C object literal kind");
12027 S.
Diag(Loc, diag::warn_objc_string_literal_comparison)
12028 << Literal->getSourceRange();
12030 S.
Diag(Loc, diag::warn_objc_literal_comparison)
12031 << LiteralKind << Literal->getSourceRange();
12040 S.
Diag(Loc, diag::note_objc_literal_comparison_isequal)
12053 if (!UO || UO->
getOpcode() != UO_LNot)
return;
12063 bool IsBitwiseOp = Opc == BO_And || Opc == BO_Or || Opc == BO_Xor;
12065 << Loc << IsBitwiseOp;
12092 if (
const DeclRefExpr *DR = dyn_cast<DeclRefExpr>(E)) {
12094 }
else if (
const MemberExpr *Mem = dyn_cast<MemberExpr>(E)) {
12095 if (Mem->isImplicitAccess())
12096 D = Mem->getMemberDecl();
12111 return std::nullopt;
12119 std::swap(LHS, RHS);
12123 std::swap(LHS, RHS);
12127 return std::nullopt;
12130 auto *BO = dyn_cast<BinaryOperator>(LHS);
12131 if (!BO || BO->getOpcode() != BO_Add)
12132 return std::nullopt;
12136 Other = BO->getRHS();
12138 Other = BO->getLHS();
12140 return std::nullopt;
12142 if (!
Other->getType()->isUnsignedIntegerType())
12143 return std::nullopt;
12145 return Opc == BO_GE;
12199 auto IsDeprArrayComparionIgnored =
12202 ? diag::warn_array_comparison_cxx26
12203 : !S.
getLangOpts().CPlusPlus20 || IsDeprArrayComparionIgnored
12204 ? diag::warn_array_comparison
12205 : diag::warn_depr_array_comparison;
12220 Result = AlwaysTrue;
12225 Result = AlwaysFalse;
12228 Result = AlwaysEqual;
12231 Result = AlwaysConstant;
12235 S.
PDiag(diag::warn_comparison_always)
12243 Result = AlwaysFalse;
12246 Result = AlwaysTrue;
12250 Result = AlwaysConstant;
12254 S.
PDiag(diag::warn_comparison_always)
12257 }
else if (std::optional<bool> Res =
12260 S.
PDiag(diag::warn_comparison_always)
12262 << (*Res ? AlwaysTrue : AlwaysFalse));
12273 Expr *LiteralString =
nullptr;
12274 Expr *LiteralStringStripped =
nullptr;
12278 LiteralString = LHS;
12279 LiteralStringStripped = LHSStripped;
12284 LiteralString = RHS;
12285 LiteralStringStripped = RHSStripped;
12288 if (LiteralString) {
12290 S.
PDiag(diag::warn_stringcompare)
12303 llvm_unreachable(
"unhandled cast kind");
12305 case CK_UserDefinedConversion:
12307 case CK_LValueToRValue:
12309 case CK_ArrayToPointerDecay:
12311 case CK_FunctionToPointerDecay:
12313 case CK_IntegralCast:
12315 case CK_FloatingCast:
12317 case CK_IntegralToFloating:
12318 case CK_FloatingToIntegral:
12320 case CK_IntegralComplexCast:
12321 case CK_FloatingComplexCast:
12322 case CK_FloatingComplexToIntegralComplex:
12323 case CK_IntegralComplexToFloatingComplex:
12325 case CK_FloatingComplexToReal:
12326 case CK_FloatingRealToComplex:
12327 case CK_IntegralComplexToReal:
12328 case CK_IntegralRealToComplex:
12330 case CK_HLSLArrayRValue:
12343 if (
const auto *ICE = dyn_cast<ImplicitCastExpr>(E))
12370 << 0 << FromType << ToType;
12375 llvm_unreachable(
"unhandled case in switch");
12402 if (NumEnumArgs == 1) {
12404 QualType OtherTy = LHSIsEnum ? RHSStrippedType : LHSStrippedType;
12410 if (NumEnumArgs == 2) {
12419 assert(IntType->isArithmeticType());
12429 LHSType = RHSType = IntType;
12438 if (
Type.isNull()) {
12444 std::optional<ComparisonCategoryType> CCT =
12456 assert(!
Type.isNull() &&
"composite type for <=> has not been set");
12474 if (
Type.isNull()) {
12495 int NullValue =
PP.isMacroDefined(
"NULL") ? 0 : 1;
12500 if (
const auto *
CL = dyn_cast<CharacterLiteral>(E.
get())) {
12501 if (
CL->getValue() == 0)
12505 NullValue ?
"NULL" :
"(void *)0");
12506 }
else if (
const auto *CE = dyn_cast<CStyleCastExpr>(E.
get())) {
12513 NullValue ?
"NULL" :
"(void *)0");
12523 bool IsThreeWay = Opc == BO_Cmp;
12524 bool IsOrdered = IsRelational || IsThreeWay;
12535 if (!IsThreeWay || IsAnyPointerType(LHS) || IsAnyPointerType(RHS)) {
12588 auto computeResultTy = [&]() {
12597 std::optional<ComparisonCategoryType> CCT =
12602 if (CompositeTy->
isPointerType() && LHSIsNull != RHSIsNull) {
12606 Diag(Loc, diag::err_typecheck_three_way_comparison_of_pointer_and_zero)
12607 << (LHSIsNull ? LHS.
get()->getSourceRange()
12616 if (!IsOrdered && LHSIsNull != RHSIsNull) {
12617 bool IsEquality = Opc == BO_EQ;
12629 bool IsError = Opc == BO_Cmp;
12631 IsError ? diag::err_typecheck_ordered_comparison_of_function_pointers
12633 ? diag::warn_typecheck_ordered_comparison_of_function_pointers
12634 : diag::ext_typecheck_ordered_comparison_of_function_pointers;
12663 return computeResultTy();
12679 (IsOrdered ? 2 : 1) &&
12684 return computeResultTy();
12698 if (IsRelational) {
12703 Diag(Loc, diag::ext_typecheck_compare_complete_incomplete_pointers)
12709 }
else if (!IsRelational &&
12713 && !LHSIsNull && !RHSIsNull)
12720 if (LCanPointeeTy != RCanPointeeTy) {
12726 diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
12727 << LHSType << RHSType << 0
12733 CastKind Kind = AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion
12739 bool RHSHasCFIUncheckedCallee = RFn && RFn->getCFIUncheckedCalleeAttr();
12740 bool ChangingCFIUncheckedCallee =
12741 LHSHasCFIUncheckedCallee != RHSHasCFIUncheckedCallee;
12743 if (LHSIsNull && !RHSIsNull)
12745 else if (!ChangingCFIUncheckedCallee)
12748 return computeResultTy();
12760 if (!IsOrdered && LHSIsNull && RHSIsNull) {
12763 return computeResultTy();
12767 return computeResultTy();
12778 return computeResultTy();
12782 return computeResultTy();
12791 return computeResultTy();
12796 return computeResultTy();
12800 if (IsRelational &&
12811 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
12812 if (CTSD->isInStdNamespace() &&
12813 llvm::StringSwitch<bool>(CTSD->getName())
12814 .Cases({
"less",
"less_equal",
"greater",
"greater_equal"},
true)
12820 return computeResultTy();
12833 return computeResultTy();
12843 if (!LHSIsNull && !RHSIsNull &&
12844 !
Context.typesAreCompatible(lpointee, rpointee)) {
12845 Diag(Loc, diag::err_typecheck_comparison_of_distinct_blocks)
12850 return computeResultTy();
12857 if (!LHSIsNull && !RHSIsNull) {
12862 Diag(Loc, diag::err_typecheck_comparison_of_distinct_blocks)
12866 if (LHSIsNull && !RHSIsNull)
12869 : CK_AnyPointerToBlockPointerCast);
12873 : CK_AnyPointerToBlockPointerCast);
12874 return computeResultTy();
12883 bool RPtrToVoid = RPT ? RPT->getPointeeType()->isVoidType() :
false;
12885 if (!LPtrToVoid && !RPtrToVoid &&
12886 !
Context.typesAreCompatible(LHSType, RHSType)) {
12893 if (LHSIsNull && !RHSIsNull) {
12899 RPT ? CK_BitCast :CK_CPointerToObjCPointerCast);
12909 LPT ? CK_BitCast :CK_CPointerToObjCPointerCast);
12911 return computeResultTy();
12915 if (!
Context.areComparableObjCPointerTypes(LHSType, RHSType))
12921 if (LHSIsNull && !RHSIsNull)
12925 return computeResultTy();
12931 CK_BlockPointerToObjCPointerCast);
12932 return computeResultTy();
12933 }
else if (!IsOrdered &&
12937 CK_BlockPointerToObjCPointerCast);
12938 return computeResultTy();
12943 unsigned DiagID = 0;
12944 bool isError =
false;
12953 isError ? diag::err_typecheck_ordered_comparison_of_pointer_and_zero
12954 : diag::ext_typecheck_ordered_comparison_of_pointer_and_zero;
12957 DiagID = diag::err_typecheck_comparison_of_pointer_integer;
12959 }
else if (IsOrdered)
12960 DiagID = diag::ext_typecheck_ordered_comparison_of_pointer_integer;
12962 DiagID = diag::ext_typecheck_comparison_of_pointer_integer;
12974 LHSIsNull ? CK_NullToPointer : CK_IntegralToPointer);
12977 RHSIsNull ? CK_NullToPointer : CK_IntegralToPointer);
12978 return computeResultTy();
12982 if (!IsOrdered && RHSIsNull
12985 return computeResultTy();
12987 if (!IsOrdered && LHSIsNull
12990 return computeResultTy();
12993 if (
getLangOpts().getOpenCLCompatibleVersion() >= 200) {
12995 return computeResultTy();
12999 return computeResultTy();
13002 if (LHSIsNull && RHSType->
isQueueT()) {
13004 return computeResultTy();
13007 if (LHSType->
isQueueT() && RHSIsNull) {
13009 return computeResultTy();
13034 "Unhandled vector element size in vector compare");
13054 "Unhandled vector element size in vector compare");
13064 const auto TypeSize =
Context.getTypeSize(ETy);
13066 const QualType IntTy =
Context.getIntTypeForBitwidth(TypeSize,
true);
13067 const llvm::ElementCount VecSize =
Context.getBuiltinVectorTypeInfo(VTy).EC;
13068 return Context.getScalableVectorType(IntTy, VecSize.getKnownMinValue());
13074 if (Opc == BO_Cmp) {
13075 Diag(Loc, diag::err_three_way_vector_comparison);
13104 return Context.getLogicalOperationType();
13106 Diag(Loc, diag::warn_deprecated_altivec_src_compat);
13112 return Context.getLogicalOperationType();
13136 if (Opc == BO_Cmp) {
13137 Diag(Loc, diag::err_three_way_vector_comparison);
13165 if (LHSBuiltinTy && RHSBuiltinTy && LHSBuiltinTy->
isSVEBool() &&
13166 RHSBuiltinTy->isSVEBool())
13185 bool Negative =
false;
13186 bool ExplicitPlus =
false;
13187 const auto *LHSInt = dyn_cast<IntegerLiteral>(XorLHS.
get());
13188 const auto *RHSInt = dyn_cast<IntegerLiteral>(XorRHS.
get());
13194 if (
const auto *UO = dyn_cast<UnaryOperator>(XorRHS.
get())) {
13196 if (Opc != UO_Minus && Opc != UO_Plus)
13198 RHSInt = dyn_cast<IntegerLiteral>(UO->getSubExpr());
13201 Negative = (Opc == UO_Minus);
13202 ExplicitPlus = !Negative;
13208 const llvm::APInt &LeftSideValue = LHSInt->getValue();
13209 llvm::APInt RightSideValue = RHSInt->getValue();
13210 if (LeftSideValue != 2 && LeftSideValue != 10)
13213 if (LeftSideValue.getBitWidth() != RightSideValue.getBitWidth())
13218 llvm::StringRef ExprStr =
13223 llvm::StringRef XorStr =
13226 if (XorStr ==
"xor")
13237 RightSideValue = -RightSideValue;
13238 RHSStr =
"-" + RHSStr;
13239 }
else if (ExplicitPlus) {
13240 RHSStr =
"+" + RHSStr;
13243 StringRef LHSStrRef = LHSStr;
13244 StringRef RHSStrRef = RHSStr;
13247 if (LHSStrRef.starts_with(
"0b") || LHSStrRef.starts_with(
"0B") ||
13248 RHSStrRef.starts_with(
"0b") || RHSStrRef.starts_with(
"0B") ||
13249 LHSStrRef.starts_with(
"0x") || LHSStrRef.starts_with(
"0X") ||
13250 RHSStrRef.starts_with(
"0x") || RHSStrRef.starts_with(
"0X") ||
13251 (LHSStrRef.size() > 1 && LHSStrRef.starts_with(
"0")) ||
13252 (RHSStrRef.size() > 1 && RHSStrRef.starts_with(
"0")) ||
13253 LHSStrRef.contains(
'\'') || RHSStrRef.contains(
'\''))
13258 const llvm::APInt XorValue = LeftSideValue ^ RightSideValue;
13259 int64_t RightSideIntValue = RightSideValue.getSExtValue();
13260 if (LeftSideValue == 2 && RightSideIntValue >= 0) {
13261 std::string SuggestedExpr =
"1 << " + RHSStr;
13262 bool Overflow =
false;
13263 llvm::APInt One = (LeftSideValue - 1);
13264 llvm::APInt PowValue = One.sshl_ov(RightSideValue, Overflow);
13266 if (RightSideIntValue < 64)
13267 S.
Diag(Loc, diag::warn_xor_used_as_pow_base)
13268 << ExprStr <<
toString(XorValue, 10,
true) << (
"1LL << " + RHSStr)
13270 else if (RightSideIntValue == 64)
13271 S.
Diag(Loc, diag::warn_xor_used_as_pow)
13272 << ExprStr <<
toString(XorValue, 10,
true);
13276 S.
Diag(Loc, diag::warn_xor_used_as_pow_base_extra)
13277 << ExprStr <<
toString(XorValue, 10,
true) << SuggestedExpr
13280 ExprRange, (RightSideIntValue == 0) ?
"1" : SuggestedExpr);
13283 S.
Diag(Loc, diag::note_xor_used_as_pow_silence)
13284 << (
"0x2 ^ " + RHSStr) << SuggestXor;
13285 }
else if (LeftSideValue == 10) {
13286 std::string SuggestedValue =
"1e" + std::to_string(RightSideIntValue);
13287 S.
Diag(Loc, diag::warn_xor_used_as_pow_base)
13288 << ExprStr <<
toString(XorValue, 10,
true) << SuggestedValue
13290 S.
Diag(Loc, diag::note_xor_used_as_pow_silence)
13291 << (
"0xA ^ " + RHSStr) << SuggestXor;
13308 getLangOpts().getOpenCLCompatibleVersion() < 120 &&
13332 bool IsCompAssign) {
13333 if (!IsCompAssign) {
13349 assert((LHSMatType || RHSMatType) &&
"At least one operand must be a matrix");
13351 if (
Context.hasSameType(LHSType, RHSType))
13352 return Context.getCommonSugaredType(LHSType, RHSType);
13358 if (LHSMatType && !RHSMatType) {
13366 if (!LHSMatType && RHSMatType) {
13378 bool IsCompAssign) {
13379 if (!IsCompAssign) {
13390 assert((LHSMatType || RHSMatType) &&
"At least one operand must be a matrix");
13392 if (LHSMatType && RHSMatType) {
13393 if (LHSMatType->getNumColumns() != RHSMatType->
getNumRows())
13396 if (
Context.hasSameType(LHSMatType, RHSMatType))
13397 return Context.getCommonSugaredType(
13401 QualType LHSELTy = LHSMatType->getElementType(),
13403 if (!
Context.hasSameType(LHSELTy, RHSELTy))
13406 return Context.getConstantMatrixType(
13407 Context.getCommonSugaredType(LHSELTy, RHSELTy),
13432 bool IsCompAssign =
13433 Opc == BO_AndAssign || Opc == BO_OrAssign || Opc == BO_XorAssign;
13444 LegalBoolVecOperator,
13474 ExprResult LHSResult = LHS, RHSResult = RHS;
13476 LHSResult, RHSResult, Loc,
13478 if (LHSResult.
isInvalid() || RHSResult.isInvalid())
13480 LHS = LHSResult.
get();
13481 RHS = RHSResult.
get();
13502 bool EnumConstantInBoolContext =
false;
13504 if (
const auto *DREHS = dyn_cast<DeclRefExpr>(HS.get())) {
13505 const auto *ECDHS = dyn_cast<EnumConstantDecl>(DREHS->getDecl());
13506 if (ECDHS && ECDHS->getInitVal() != 0 && ECDHS->getInitVal() != 1)
13507 EnumConstantInBoolContext =
true;
13511 if (EnumConstantInBoolContext)
13512 Diag(Loc, diag::warn_enum_constant_in_bool_context);
13517 const auto *LHSATy = dyn_cast<ArrayType>(LHSTy);
13518 const auto *RHSATy = dyn_cast<ArrayType>(RHSTy);
13519 if ((LHSATy && LHSATy->getElementType().isWebAssemblyReferenceType()) ||
13520 (RHSATy && RHSATy->getElementType().isWebAssemblyReferenceType())) {
13542 Diag(Loc, diag::warn_logical_instead_of_bitwise)
13545 Diag(Loc, diag::note_logical_instead_of_bitwise_change_operator)
13546 << (Opc == BO_LAnd ?
"&" :
"|")
13549 Opc == BO_LAnd ?
"&" :
"|");
13550 if (Opc == BO_LAnd)
13552 Diag(Loc, diag::note_logical_instead_of_bitwise_remove_constant)
13560 if (!
Context.getLangOpts().CPlusPlus) {
13563 if (
Context.getLangOpts().OpenCL &&
13564 Context.getLangOpts().OpenCLVersion < 120) {
13614 const MemberExpr *ME = dyn_cast<MemberExpr>(E);
13615 if (!ME)
return false;
13619 if (!
Base)
return false;
13620 return Base->getMethodDecl() !=
nullptr;
13644 assert(S.
getLangOpts().CPlusPlus &&
"BindingDecl outside of C++?");
13655 assert(Var->
hasLocalStorage() &&
"capture added 'const' to non-local?");
13663 if (
auto *FD = dyn_cast<FunctionDecl>(DC))
13706 bool DiagnosticEmitted =
false;
13710 bool IsDereference =
false;
13711 bool NextIsDereference =
false;
13715 IsDereference = NextIsDereference;
13718 if (
const MemberExpr *ME = dyn_cast<MemberExpr>(E)) {
13719 NextIsDereference = ME->isArrow();
13720 const ValueDecl *VD = ME->getMemberDecl();
13721 if (
const FieldDecl *Field = dyn_cast<FieldDecl>(VD)) {
13723 if (Field->isMutable()) {
13724 assert(DiagnosticEmitted &&
"Expected diagnostic not emitted.");
13729 if (!DiagnosticEmitted) {
13730 S.
Diag(Loc, diag::err_typecheck_assign_const)
13732 << Field->getType();
13733 DiagnosticEmitted =
true;
13736 <<
ConstMember <<
false << Field << Field->getType()
13737 << Field->getSourceRange();
13741 }
else if (
const VarDecl *VDecl = dyn_cast<VarDecl>(VD)) {
13742 if (VDecl->getType().isConstQualified()) {
13743 if (!DiagnosticEmitted) {
13744 S.
Diag(Loc, diag::err_typecheck_assign_const)
13746 << VDecl->getType();
13747 DiagnosticEmitted =
true;
13750 <<
ConstMember <<
true << VDecl << VDecl->getType()
13751 << VDecl->getSourceRange();
13758 dyn_cast<ArraySubscriptExpr>(E)) {
13762 dyn_cast<ExtVectorElementExpr>(E)) {
13769 if (
const CallExpr *CE = dyn_cast<CallExpr>(E)) {
13773 if (!DiagnosticEmitted) {
13774 S.
Diag(Loc, diag::err_typecheck_assign_const) << ExprRange
13776 DiagnosticEmitted =
true;
13779 diag::note_typecheck_assign_const)
13783 }
else if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
13785 if (
const ValueDecl *VD = DRE->getDecl()) {
13787 if (!DiagnosticEmitted) {
13788 S.
Diag(Loc, diag::err_typecheck_assign_const)
13790 DiagnosticEmitted =
true;
13792 S.
Diag(VD->getLocation(), diag::note_typecheck_assign_const)
13793 <<
ConstVariable << VD << VD->getType() << VD->getSourceRange();
13798 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(DC)) {
13799 if (MD->isConst()) {
13800 if (!DiagnosticEmitted) {
13801 S.
Diag(Loc, diag::err_typecheck_assign_const) << ExprRange
13803 DiagnosticEmitted =
true;
13805 S.
Diag(MD->getLocation(), diag::note_typecheck_assign_const)
13812 if (DiagnosticEmitted)
13816 S.
Diag(Loc, diag::err_typecheck_assign_const) << ExprRange <<
ConstUnknown;
13826 const RecordType *Ty,
13829 bool &DiagnosticEmitted) {
13830 std::vector<const RecordType *> RecordTypeList;
13831 RecordTypeList.push_back(Ty);
13832 unsigned NextToCheckIndex = 0;
13835 while (RecordTypeList.size() > NextToCheckIndex) {
13836 bool IsNested = NextToCheckIndex > 0;
13837 for (
const FieldDecl *Field : RecordTypeList[NextToCheckIndex]
13842 QualType FieldTy = Field->getType();
13844 if (!DiagnosticEmitted) {
13845 S.
Diag(Loc, diag::err_typecheck_assign_const)
13847 << IsNested << Field;
13848 DiagnosticEmitted =
true;
13850 S.
Diag(Field->getLocation(), diag::note_typecheck_assign_const)
13852 << FieldTy << Field->getSourceRange();
13857 if (
const auto *FieldRecTy = FieldTy->
getAsCanonical<RecordType>()) {
13858 if (!llvm::is_contained(RecordTypeList, FieldRecTy))
13859 RecordTypeList.push_back(FieldRecTy);
13862 ++NextToCheckIndex;
13871 assert(Ty->
isRecordType() &&
"lvalue was not record?");
13874 bool DiagEmitted =
false;
13876 if (
const MemberExpr *ME = dyn_cast<MemberExpr>(E))
13879 else if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
13904 unsigned DiagID = 0;
13905 bool NeedType =
false;
13912 DiagID = diag::err_block_decl_ref_not_modifiable_lvalue;
13914 DiagID = diag::err_lambda_decl_ref_not_modifiable_lvalue;
13927 if (var->isARCPseudoStrong() &&
13928 (!var->getTypeSourceInfo() ||
13929 !var->getTypeSourceInfo()->getType().isConstQualified())) {
13935 ? diag::err_typecheck_arc_assign_self_class_method
13936 : diag::err_typecheck_arc_assign_self;
13939 }
else if (var->hasAttr<ObjCExternallyRetainedAttr>() ||
13941 DiagID = diag::err_typecheck_arc_assign_externally_retained;
13945 DiagID = diag::err_typecheck_arr_assign_enumeration;
13949 if (Loc != OrigLoc)
13975 DiagID = diag::err_typecheck_array_not_modifiable_lvalue;
13979 DiagID = diag::err_typecheck_non_object_not_modifiable_lvalue;
13983 DiagID = diag::err_typecheck_lvalue_casts_not_supported;
13986 llvm_unreachable(
"did not take early return for MLV_Valid");
13990 DiagID = diag::err_typecheck_expression_not_modifiable_lvalue;
13995 diag::err_typecheck_incomplete_type_not_modifiable_lvalue, E);
13997 DiagID = diag::err_typecheck_duplicate_vector_components_not_mlvalue;
14000 llvm_unreachable(
"readonly properties should be processed differently");
14002 DiagID = diag::err_readonly_message_assignment;
14005 DiagID = diag::err_no_subobject_property_setting;
14010 if (Loc != OrigLoc)
14032 MemberExpr *ML = dyn_cast<MemberExpr>(LHSExpr);
14033 MemberExpr *MR = dyn_cast<MemberExpr>(RHSExpr);
14041 if (LHSDecl != RHSDecl)
14046 if (RefTy->getPointeeType().isVolatileQualified())
14049 Sema.
Diag(Loc, diag::warn_identity_field_assign) << 0;
14059 Sema.
Diag(Loc, diag::warn_identity_field_assign) << 1;
14083 bool ShowFullyQualifiedAssigneeName =
false;
14086 Assignee = DR->getDecl();
14087 }
else if (
auto *ME = dyn_cast<MemberExpr>(LHSExpr->
IgnoreParenCasts())) {
14088 Assignee = ME->getMemberDecl();
14089 ShowFullyQualifiedAssigneeName =
true;
14094 ShowFullyQualifiedAssigneeName);
14103 Diag(Loc, diag::err_opencl_half_load_store) << 1
14110 Diag(Loc, diag::err_wasm_table_art) << 0;
14115 if (CompoundType.
isNull()) {
14126 ((
Context.isObjCNSObjectType(LHSType) &&
14128 (
Context.isObjCNSObjectType(RHSType) &&
14133 Diag(Loc, diag::err_objc_object_assignment) << LHSType;
14139 RHSCheck = ICE->getSubExpr();
14140 if (
UnaryOperator *UO = dyn_cast<UnaryOperator>(RHSCheck)) {
14141 if ((UO->getOpcode() == UO_Plus || UO->getOpcode() == UO_Minus) &&
14142 Loc.
isFileID() && UO->getOperatorLoc().isFileID() &&
14148 UO->getSubExpr()->getBeginLoc().
isFileID()) {
14149 Diag(Loc, diag::warn_not_compound_assign)
14150 << (UO->getOpcode() == UO_Plus ?
"+" :
"-")
14151 <<
SourceRange(UO->getOperatorLoc(), UO->getOperatorLoc());
14161 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(InnerLHS);
14177 if (!
Diags.isIgnored(diag::warn_arc_repeated_use_of_weak,
14200 if (CompoundType.
isNull()) {
14226 if (
const CastExpr *CE = dyn_cast<CastExpr>(E)) {
14227 if (CE->getCastKind() == CK_ToVoid) {
14233 CE->getSubExpr()->getType()->isDependentType()) {
14238 if (
const auto *CE = dyn_cast<CallExpr>(E))
14239 return CE->getCallReturnType(Context)->isVoidType();
14259 const unsigned ForIncrementFlags =
14265 if ((ScopeFlags & ForIncrementFlags) == ForIncrementFlags ||
14266 (ScopeFlags & ForInitFlags) == ForInitFlags)
14271 while (
const BinaryOperator *BO = dyn_cast<BinaryOperator>(LHS)) {
14272 if (BO->getOpcode() != BO_Comma)
14274 LHS = BO->getRHS();
14281 Diag(Loc, diag::warn_comma_operator);
14285 LangOpts.CPlusPlus ?
"static_cast<void>("
14317 diag::err_incomplete_type);
14338 ResType = ResAtomicType->getValueType();
14340 assert(!ResType.
isNull() &&
"no type for increment/decrement expression");
14350 : diag::warn_increment_bool)
14354 S.
Diag(OpLoc, diag::err_increment_decrement_enum) << IsInc << ResType;
14370 S.
Diag(OpLoc, S.
getLangOpts().C2y ? diag::warn_c2y_compat_increment_complex
14371 : diag::ext_c2y_increment_complex)
14388 S.
Diag(OpLoc, diag::err_typecheck_illegal_increment_decrement)
14399 S.
Diag(OpLoc, diag::warn_deprecated_increment_decrement_volatile)
14400 << IsInc << ResType;
14432 case Stmt::DeclRefExprClass:
14434 case Stmt::MemberExprClass:
14442 case Stmt::ArraySubscriptExprClass: {
14447 if (ICE->getSubExpr()->getType()->isArrayType())
14452 case Stmt::UnaryOperatorClass: {
14464 case Stmt::ParenExprClass:
14466 case Stmt::ImplicitCastExprClass:
14470 case Stmt::CXXUuidofExprClass:
14480 AO_Vector_Element = 1,
14481 AO_Property_Expansion = 2,
14482 AO_Register_Variable = 3,
14483 AO_Matrix_Element = 4,
14501 return Diag(OpLoc, diag::err_parens_pointer_member_function)
14506 return Diag(OpLoc, diag::err_typecheck_addrof_dtor)
14507 << DRE->getSourceRange();
14509 if (DRE->getQualifier())
14513 return Diag(OpLoc, diag::err_unqualified_pointer_member_function)
14514 << DRE->getSourceRange();
14517 StringRef Qual = (MD->
getParent()->getName() +
"::").toStringRef(Str);
14518 return Diag(OpLoc, diag::err_unqualified_pointer_member_function)
14519 << DRE->getSourceRange()
14525 if (PTy->getKind() == BuiltinType::Overload) {
14529 Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof_addrof_function)
14537 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
14545 if (PTy->getKind() == BuiltinType::UnknownAny)
14548 if (PTy->getKind() == BuiltinType::BoundMember) {
14549 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
14572 auto* VarRef = dyn_cast<DeclRefExpr>(op);
14573 if (VarRef && VarRef->refersToEnclosingVariableOrCapture()) {
14574 Diag(op->
getExprLoc(), diag::err_opencl_taking_address_capture);
14582 if (uOp->getOpcode() == UO_Deref)
14585 return uOp->getSubExpr()->getType();
14592 if (
auto *FD = dyn_cast_or_null<FunctionDecl>(dcl))
14598 unsigned AddressOfError = AO_No_Error;
14603 : diag::ext_typecheck_addrof_temporary)
14618 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
14636 auto ReturnOrParamTypeIsIncomplete = [&](
QualType T,
14641 diag::note_ptrauth_virtual_function_pointer_incomplete_arg_ret);
14642 Diag(RetArgTypeLoc,
14643 diag::note_ptrauth_virtual_function_incomplete_arg_ret_type)
14650 bool IsIncomplete =
14652 ReturnOrParamTypeIsIncomplete(
14655 IsIncomplete |= ReturnOrParamTypeIsIncomplete(PVD->getType(), OpLoc,
14656 PVD->getBeginLoc());
14662 if (
Context.getTargetInfo().getCXXABI().isMicrosoft())
14671 AddressOfError = AO_Property_Expansion;
14673 Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof)
14677 }
else if (
const auto *DRE = dyn_cast<DeclRefExpr>(op)) {
14678 if (
const auto *MD = dyn_cast_or_null<CXXMethodDecl>(DRE->getDecl()))
14684 AddressOfError = AO_Bit_Field;
14687 AddressOfError = AO_Vector_Element;
14690 AddressOfError = AO_Matrix_Element;
14694 if (
const VarDecl *vd = dyn_cast<VarDecl>(dcl)) {
14699 AddressOfError = AO_Register_Variable;
14702 AddressOfError = AO_Property_Expansion;
14715 if (
auto *DRE = dyn_cast<DeclRefExpr>(op);
14721 diag::err_cannot_form_pointer_to_member_of_reference_type)
14732 if (
Context.getTargetInfo().getCXXABI().isMicrosoft())
14740 llvm_unreachable(
"Unknown/unexpected decl type");
14743 if (AddressOfError != AO_No_Error) {
14760 if (
Context.getTargetInfo().getTriple().isWasm()) {
14763 Diag(OpLoc, diag::err_wasm_ca_reference)
14768 Diag(OpLoc, diag::err_wasm_table_pr)
14774 CheckAddressOfPackedMember(op);
14780 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Exp);
14786 const ParmVarDecl *Param = dyn_cast<ParmVarDecl>(D);
14789 if (
const FunctionDecl* FD = dyn_cast<FunctionDecl>(Param->getDeclContext()))
14790 if (!FD->hasAttr<NonNullAttr>() && !Param->hasAttr<NonNullAttr>())
14793 FD->ModifiedNonNullParams.insert(Param);
14799 bool IsAfterAmp =
false) {
14803 Op = ConvResult.
get();
14815 Result = PT->getPointeeType();
14823 if (PR.
get() != Op)
14827 if (Result.isNull()) {
14828 S.
Diag(OpLoc, diag::err_typecheck_indirection_requires_pointer)
14833 if (Result->isVoidType()) {
14839 S.
Diag(OpLoc, diag::err_typecheck_indirection_through_void_pointer_cpp)
14842 S.
Diag(OpLoc, diag::ext_typecheck_indirection_through_void_pointer)
14850 if (!S.
getLangOpts().CPlusPlus && Result.isCForbiddenLValueType())
14859 default: llvm_unreachable(
"Unknown binop!");
14860 case tok::periodstar: Opc = BO_PtrMemD;
break;
14861 case tok::arrowstar: Opc = BO_PtrMemI;
break;
14862 case tok::star: Opc = BO_Mul;
break;
14863 case tok::slash: Opc = BO_Div;
break;
14864 case tok::percent: Opc = BO_Rem;
break;
14865 case tok::plus: Opc = BO_Add;
break;
14866 case tok::minus: Opc = BO_Sub;
break;
14867 case tok::lessless: Opc = BO_Shl;
break;
14868 case tok::greatergreater: Opc = BO_Shr;
break;
14869 case tok::lessequal: Opc = BO_LE;
break;
14870 case tok::less: Opc = BO_LT;
break;
14871 case tok::greaterequal: Opc = BO_GE;
break;
14872 case tok::greater: Opc = BO_GT;
break;
14873 case tok::exclaimequal: Opc = BO_NE;
break;
14874 case tok::equalequal: Opc = BO_EQ;
break;
14875 case tok::spaceship: Opc = BO_Cmp;
break;
14876 case tok::amp: Opc = BO_And;
break;
14877 case tok::caret: Opc = BO_Xor;
break;
14878 case tok::pipe: Opc = BO_Or;
break;
14879 case tok::ampamp: Opc = BO_LAnd;
break;
14880 case tok::pipepipe: Opc = BO_LOr;
break;
14881 case tok::equal: Opc = BO_Assign;
break;
14882 case tok::starequal: Opc = BO_MulAssign;
break;
14883 case tok::slashequal: Opc = BO_DivAssign;
break;
14884 case tok::percentequal: Opc = BO_RemAssign;
break;
14885 case tok::plusequal: Opc = BO_AddAssign;
break;
14886 case tok::minusequal: Opc = BO_SubAssign;
break;
14887 case tok::lesslessequal: Opc = BO_ShlAssign;
break;
14888 case tok::greatergreaterequal: Opc = BO_ShrAssign;
break;
14889 case tok::ampequal: Opc = BO_AndAssign;
break;
14890 case tok::caretequal: Opc = BO_XorAssign;
break;
14891 case tok::pipeequal: Opc = BO_OrAssign;
break;
14892 case tok::comma: Opc = BO_Comma;
break;
14901 default: llvm_unreachable(
"Unknown unary op!");
14902 case tok::plusplus: Opc = UO_PreInc;
break;
14903 case tok::minusminus: Opc = UO_PreDec;
break;
14904 case tok::amp: Opc = UO_AddrOf;
break;
14905 case tok::star: Opc = UO_Deref;
break;
14906 case tok::plus: Opc = UO_Plus;
break;
14907 case tok::minus: Opc = UO_Minus;
break;
14908 case tok::tilde: Opc = UO_Not;
break;
14909 case tok::exclaim: Opc = UO_LNot;
break;
14910 case tok::kw___real: Opc = UO_Real;
break;
14911 case tok::kw___imag: Opc = UO_Imag;
break;
14912 case tok::kw___extension__: Opc = UO_Extension;
break;
14944 llvm::find_if(Parent->
fields(),
14946 return F->getDeclName() == Name;
14948 return (Field != Parent->
field_end()) ? *Field :
nullptr;
14963 const DeclRefExpr *LHSDeclRef = dyn_cast<DeclRefExpr>(LHSExpr);
14964 const DeclRefExpr *RHSDeclRef = dyn_cast<DeclRefExpr>(RHSExpr);
14965 if (!LHSDeclRef || !RHSDeclRef ||
14973 if (LHSDecl != RHSDecl)
14978 if (RefTy->getPointeeType().isVolatileQualified())
14981 auto Diag = S.
Diag(OpLoc, IsBuiltin ? diag::warn_self_assignment_builtin
14982 : diag::warn_self_assignment_overloaded)
14987 Diag << 1 << SelfAssignField
15000 const Expr *ObjCPointerExpr =
nullptr, *OtherExpr =
nullptr;
15005 ObjCPointerExpr = LHS;
15009 ObjCPointerExpr = RHS;
15018 unsigned Diag = diag::warn_objc_pointer_masking;
15027 if (SelArg0.starts_with(
"performSelector"))
15028 Diag = diag::warn_objc_pointer_masking_performSelector;
15045 assert((
isVector(ResultTy, Context.HalfTy) ||
15046 isVector(ResultTy, Context.ShortTy)) &&
15047 "Result must be a vector of half or short");
15050 "both operands expected to be a half vector");
15057 if (
isVector(ResultTy, Context.ShortTy))
15062 ResultTy,
VK, OK, OpLoc, FPFeatures,
15063 BinOpResTy, BinOpResTy);
15067 BinOpResTy,
VK, OK, OpLoc, FPFeatures);
15075 if (!OpRequiresConversion || Ctx.
getLangOpts().NativeHalfType ||
15079 auto HasVectorOfHalfType = [&Ctx](
Expr *E) {
15089 return VT->getElementType().getCanonicalType() == Ctx.
HalfTy;
15094 return HasVectorOfHalfType(E0) && (!E1 || HasVectorOfHalfType(E1));
15099 Expr *RHSExpr,
bool ForFoldExpression) {
15113 if (
Init.isInvalid())
15115 RHSExpr =
Init.get();
15125 bool ConvertHalfVec =
false;
15127 if (!LHS.
isUsable() || !RHS.isUsable())
15137 if (BO_Assign == Opc)
15138 Diag(OpLoc, diag::err_opencl_atomic_init) << 0 << SR;
15166 if (!ResultTy.
isNull()) {
15183 if (
auto *BE = dyn_cast<BlockExpr>(RHS.get()->IgnoreParens()))
15185 if (
auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
15186 if (VD->hasLocalStorage() &&
getCurScope()->isDeclScope(VD))
15187 BE->getBlockDecl()->setCanAvoidCopyToHeap();
15198 Opc == BO_PtrMemI);
15202 ConvertHalfVec =
true;
15209 ConvertHalfVec =
true;
15213 ConvertHalfVec =
true;
15224 ConvertHalfVec =
true;
15227 if (
const auto *BI = dyn_cast<BinaryOperator>(LHSExpr);
15228 !ForFoldExpression && BI && BI->isComparisonOp())
15229 Diag(OpLoc, diag::warn_consecutive_comparison)
15235 ConvertHalfVec =
true;
15239 ConvertHalfVec =
true;
15252 ConvertHalfVec =
true;
15257 ConvertHalfVec =
true;
15259 CompLHSTy = CompResultTy;
15266 CompLHSTy = CompResultTy;
15272 ConvertHalfVec =
true;
15279 ConvertHalfVec =
true;
15288 CompLHSTy = CompResultTy;
15299 CompLHSTy = CompResultTy;
15307 VK = RHS.get()->getValueKind();
15308 OK = RHS.get()->getObjectKind();
15320 (Opc == BO_Comma ||
isVector(RHS.get()->getType(),
Context.HalfTy) ==
15322 "both sides are half vectors or neither sides are");
15327 CheckArrayAccess(LHS.
get());
15328 CheckArrayAccess(RHS.get());
15332 &
Context.Idents.get(
"object_setClass"),
15338 "object_setClass(")
15351 if (CompResultTy.
isNull()) {
15352 if (ConvertHalfVec)
15372 if (ConvertHalfVec)
15377 Context, LHS.
get(), RHS.get(), Opc, ResultTy,
VK, OK, OpLoc,
15394 if (isLeftComp == isRightComp)
15399 bool isLeftBitwise = LHSBO && LHSBO->
isBitwiseOp();
15400 bool isRightBitwise = RHSBO && RHSBO->
isBitwiseOp();
15401 if (isLeftBitwise || isRightBitwise)
15413 Self.Diag(OpLoc, diag::warn_precedence_bitwise_rel)
15416 Self.PDiag(diag::note_precedence_silence) << OpStr,
15417 (isLeftComp ? LHSExpr : RHSExpr)->getSourceRange());
15419 Self.PDiag(diag::note_precedence_bitwise_first)
15434 Self.PDiag(diag::note_precedence_silence)
15443 if (Bop->getOpcode() == BO_LAnd) {
15448 }
else if (Bop->getOpcode() == BO_LOr) {
15449 if (
BinaryOperator *RBop = dyn_cast<BinaryOperator>(Bop->getRHS())) {
15452 if (RBop->getOpcode() == BO_LAnd &&
15464 if (Bop->getOpcode() == BO_LAnd) {
15479 if (Bop->isBitwiseOp() && Bop->getOpcode() < Opc) {
15480 S.
Diag(Bop->getOperatorLoc(), diag::warn_bitwise_op_in_bitwise_op)
15482 << Bop->getSourceRange() << OpLoc;
15484 S.
PDiag(diag::note_precedence_silence)
15485 << Bop->getOpcodeStr(),
15486 Bop->getSourceRange());
15492 Expr *SubExpr, StringRef Shift) {
15494 if (Bop->getOpcode() == BO_Add || Bop->getOpcode() == BO_Sub) {
15495 StringRef Op = Bop->getOpcodeStr();
15496 S.
Diag(Bop->getOperatorLoc(), diag::warn_addition_in_bitshift)
15497 << Bop->getSourceRange() << OpLoc << Shift << Op;
15499 S.
PDiag(diag::note_precedence_silence) << Op,
15500 Bop->getSourceRange());
15516 if (Kind != OO_LessLess && Kind != OO_GreaterGreater)
15519 S.
Diag(OpLoc, diag::warn_overloaded_shift_in_comparison)
15521 << (Kind == OO_LessLess);
15523 S.
PDiag(diag::note_precedence_silence)
15524 << (Kind == OO_LessLess ?
"<<" :
">>"),
15527 S, OpLoc, S.
PDiag(diag::note_evaluate_comparison_first),
15541 if ((Opc == BO_Or || Opc == BO_Xor) &&
15549 if (Opc == BO_LOr && !OpLoc.
isMacroID()) {
15555 || Opc == BO_Shr) {
15571 assert(LHSExpr &&
"ActOnBinOp(): missing left expression");
15572 assert(RHSExpr &&
"ActOnBinOp(): missing right expression");
15581 CheckInvalidBuiltinCountedByRef(LHSExpr, K);
15582 CheckInvalidBuiltinCountedByRef(RHSExpr, K);
15584 return BuildBinOp(S, TokLoc, Opc, LHSExpr, RHSExpr);
15590 if (OverOp !=
OO_None && OverOp != OO_Equal)
15639 Expr *RHSExpr,
bool ForFoldExpression) {
15640 if (!LHSExpr || !RHSExpr)
15652 if (pty->getKind() == BuiltinType::PseudoObject &&
15665 RHSExpr = resolvedRHS.
get();
15679 (pty->getKind() == BuiltinType::BoundMember ||
15680 pty->getKind() == BuiltinType::Overload)) {
15681 auto *OE = dyn_cast<OverloadExpr>(LHSExpr);
15682 if (OE && !OE->hasTemplateKeyword() && !OE->hasExplicitTemplateArgs() &&
15683 llvm::any_of(OE->decls(), [](
NamedDecl *ND) {
15684 return isa<FunctionTemplateDecl>(ND);
15686 Diag(OE->getQualifier() ? OE->getQualifierLoc().getBeginLoc()
15687 : OE->getNameLoc(),
15688 diag::err_template_kw_missing)
15689 << OE->getName().getAsIdentifierInfo();
15696 LHSExpr = LHS.
get();
15703 if (Opc == BO_Assign && pty->getKind() == BuiltinType::Overload) {
15710 ForFoldExpression);
15720 RHSExpr = resolvedRHS.
get();
15725 if (!
HLSL().CheckResourceBinOp(Opc, LHSExpr, RHSExpr, OpLoc))
15742 "Should only occur in error-recovery path.");
15748 Context, LHSExpr, RHSExpr, Opc,
15768 ResultType = RHSExpr->
getType();
15771 ResultType =
Context.DependentTy;
15784 if (
T.isNull() ||
T->isDependentType())
15800 bool CanOverflow =
false;
15802 bool ConvertHalfVec =
false;
15811 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15818 if (Opc == UO_AddrOf)
15819 return ExprError(
Diag(OpLoc, diag::err_hlsl_operator_unsupported) << 0);
15820 if (Opc == UO_Deref)
15821 return ExprError(
Diag(OpLoc, diag::err_hlsl_operator_unsupported) << 1);
15826 resultType =
Context.DependentTy;
15835 Opc == UO_PreInc || Opc == UO_PostInc,
15836 Opc == UO_PreInc || Opc == UO_PreDec);
15841 CheckAddressOfNoDeref(InputExpr);
15854 CanOverflow = Opc == UO_Minus &&
15866 if (ConvertHalfVec)
15873 (!
Context.getLangOpts().ZVector ||
15883 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15894 Diag(OpLoc, diag::ext_integer_complement_complex)
15902 if (!
T->isIntegerType())
15903 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15906 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15922 resultType =
Context.FloatTy;
15928 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15934 if (
Context.getLangOpts().CPlusPlus) {
15939 }
else if (
Context.getLangOpts().OpenCL &&
15940 Context.getLangOpts().OpenCLVersion < 120) {
15944 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15957 Input.
get(), resultType,
15962 if (
Context.getLangOpts().OpenCL &&
15963 Context.getLangOpts().getOpenCLCompatibleVersion() < 120) {
15967 if (!
T->isIntegerType())
15968 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15974 }
else if (
Context.getLangOpts().CPlusPlus &&
15978 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15985 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15991 resultType =
Context.getLogicalOperationType();
16019 "the co_await expression must be non-dependant before "
16020 "building operator co_await");
16031 if (Opc != UO_AddrOf && Opc != UO_Deref)
16032 CheckArrayAccess(Input.
get());
16038 if (Opc == UO_Deref && UO->getType()->hasAttr(attr::NoDeref) &&
16044 if (ConvertHalfVec)
16050 if (
DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
16051 if (!DRE->getQualifier())
16061 return Method->isImplicitObjectMemberFunction();
16067 if (!ULE->getQualifier())
16072 if (
Method->isImplicitObjectMemberFunction())
16093 if (pty->getKind() == BuiltinType::PseudoObject &&
16098 if (Opc == UO_Extension)
16103 if (Opc == UO_AddrOf &&
16104 (pty->getKind() == BuiltinType::Overload ||
16105 pty->getKind() == BuiltinType::UnknownAny ||
16106 pty->getKind() == BuiltinType::BoundMember))
16131 Expr *Input,
bool IsAfterAmp) {
16141 OpLoc, LabLoc, TheDecl,
Context.getPointerType(
Context.VoidTy));
16175 assert(!
Cleanup.exprNeedsCleanups() &&
16176 "cleanups within StmtExpr not correctly bound!");
16186 bool StmtExprMayBindToTemp =
false;
16189 if (
const auto *LastStmt =
16191 if (
const Expr *
Value = LastStmt->getExprStmt()) {
16192 StmtExprMayBindToTemp =
true;
16200 Expr *ResStmtExpr =
16202 if (StmtExprMayBindToTemp)
16204 return ResStmtExpr;
16227 auto *Cast = dyn_cast<ImplicitCastExpr>(E);
16228 if (Cast && Cast->getCastKind() == CK_ARCConsumeObject)
16229 return Cast->getSubExpr();
16250 return ExprError(
Diag(BuiltinLoc, diag::err_offsetof_record_type)
16251 << ArgTy << TypeRange);
16257 diag::err_offsetof_incomplete_type, TypeRange))
16260 bool DidWarnAboutNonPOD =
false;
16265 if (OC.isBrackets) {
16270 return ExprError(
Diag(OC.LocEnd, diag::err_offsetof_array_type)
16274 CurrentType =
Context.DependentTy;
16290 Comps.push_back(
OffsetOfNode(OC.LocStart, Exprs.size(), OC.LocEnd));
16291 Exprs.push_back(Idx);
16299 Comps.push_back(
OffsetOfNode(OC.LocStart, OC.U.IdentInfo, OC.LocEnd));
16300 CurrentType =
Context.DependentTy;
16306 diag::err_offsetof_incomplete_type))
16312 return ExprError(
Diag(OC.LocEnd, diag::err_offsetof_record_type)
16323 bool IsSafe =
LangOpts.CPlusPlus11? CRD->isStandardLayout() : CRD->isPOD();
16325 LangOpts.CPlusPlus11? diag::ext_offsetof_non_standardlayout_type
16326 : diag::ext_offsetof_non_pod_type;
16329 Diag(BuiltinLoc, DiagID)
16330 <<
SourceRange(Components[0].LocStart, OC.LocEnd) << CurrentType;
16331 DidWarnAboutNonPOD =
true;
16342 MemberDecl = IndirectMemberDecl->getAnonField();
16350 Diag(BuiltinLoc, diag::err_no_member)
16351 << OC.U.IdentInfo << RD <<
SourceRange(OC.LocStart, OC.LocEnd);
16360 Diag(OC.LocEnd, diag::err_offsetof_bitfield)
16368 if (IndirectMemberDecl)
16375 Context.getCanonicalTagType(Parent), Paths)) {
16377 Diag(OC.LocEnd, diag::err_offsetof_field_of_virtual_base)
16388 if (IndirectMemberDecl) {
16389 for (
auto *FI : IndirectMemberDecl->chain()) {
16395 Comps.push_back(
OffsetOfNode(OC.LocStart, MemberDecl, OC.LocEnd));
16401 Comps, Exprs, RParenLoc);
16427 assert((CondExpr && LHSExpr && RHSExpr) &&
"Missing type argument(s)");
16432 bool CondIsTrue =
false;
16434 resType =
Context.DependentTy;
16437 llvm::APSInt condEval(32);
16439 CondExpr, &condEval, diag::err_typecheck_choose_expr_requires_constant);
16442 CondExpr = CondICE.
get();
16443 CondIsTrue = condEval.getZExtValue();
16446 Expr *ActiveExpr = CondIsTrue ? LHSExpr : RHSExpr;
16448 resType = ActiveExpr->
getType();
16454 resType,
VK, OK, RPLoc, CondIsTrue);
16466 Decl *ManglingContextDecl;
16467 std::tie(MCtx, ManglingContextDecl) =
16471 Block->setBlockMangling(ManglingNumber, ManglingContextDecl);
16493 "block-id should have no identifier!");
16504 assert(
T->isFunctionType() &&
16505 "GetTypeForDeclarator made a non-function block signature");
16521 unsigned Size =
Result.getFullDataSize();
16522 Sig =
Context.CreateTypeSourceInfo(
Result.getType(), Size);
16533 QualType RetTy = Fn->getReturnType();
16543 if (RetTy !=
Context.DependentTy) {
16551 if (ExplicitSignature) {
16552 for (
unsigned I = 0, E = ExplicitSignature.
getNumParams(); I != E; ++I) {
16554 if (Param->getIdentifier() ==
nullptr && !Param->isImplicit() &&
16558 Diag(Param->getLocation(), diag::ext_parameter_name_omitted_c23);
16560 Params.push_back(Param);
16566 for (
const auto &I : Fn->param_types()) {
16569 Params.push_back(Param);
16574 if (!Params.empty()) {
16585 AI->setOwningFunction(CurBlock->
TheDecl);
16588 if (AI->getIdentifier()) {
16594 if (AI->isInvalidDecl())
16613 Diag(CaretLoc, diag::err_blocks_disable) <<
LangOpts.OpenCL;
16618 assert(!
Cleanup.exprNeedsCleanups() &&
16619 "cleanups within block not correctly bound!");
16634 bool NoReturn = BD->
hasAttr<NoReturnAttr>();
16642 if (NoReturn && !Ext.getNoReturn()) Ext = Ext.
withNoReturn(
true);
16648 BlockTy =
Context.getFunctionType(RetTy, {}, EPI);
16669 BlockTy =
Context.getFunctionType(RetTy, {}, EPI);
16673 BlockTy =
Context.getBlockPointerType(BlockTy);
16677 !
PP.isCodeCompletionEnabled())
16682 if (Body &&
getCurFunction()->HasPotentialAvailabilityViolations)
16708 Expr *CopyExpr =
nullptr;
16735 if (!
Result.isInvalid() &&
16736 !
Result.get()->getType().isConstQualified()) {
16738 Result.get()->getType().withConst(),
16742 if (!
Result.isInvalid()) {
16752 if (!
Result.isInvalid() &&
16756 CopyExpr =
Result.get();
16763 Captures.push_back(NewCap);
16777 if (
Result->getBlockDecl()->hasCaptures()) {
16780 Cleanup.setExprNeedsCleanups(
true);
16784 for (
const auto &CI :
Result->getBlockDecl()->captures()) {
16785 const VarDecl *var = CI.getVariable();
16800 {Result},
Result->getType());
16814 Expr *OrigExpr = E;
16828 Context.getTargetInfo().getTriple().isNVPTX())
16851 VaListType =
Context.getArrayDecayedType(VaListType);
16863 if (
Init.isInvalid())
16879 diag::err_first_argument_to_va_arg_not_of_type_va_list)
16884 diag::err_second_parameter_to_va_arg_incomplete,
16890 diag::err_second_parameter_to_va_arg_abstract,
16897 ? diag::warn_second_parameter_to_va_arg_ownership_qualified
16898 : diag::warn_second_parameter_to_va_arg_not_pod)
16905 PDiag(diag::warn_second_parameter_to_va_arg_array)
16938 UnderlyingType = ED->getIntegerType();
16939 if (
Context.typesAreCompatible(PromoteType, UnderlyingType,
16952 ?
Context.getCorrespondingSignedType(UnderlyingType)
16953 :
Context.getCorrespondingUnsignedType(UnderlyingType);
16954 if (
Context.typesAreCompatible(PromoteType, UnderlyingType,
16960 PromoteType =
Context.DoubleTy;
16961 if (!PromoteType.
isNull())
16963 PDiag(diag::warn_second_parameter_to_va_arg_never_compatible)
16978 if (pw ==
Context.getTargetInfo().getIntWidth())
16980 else if (pw ==
Context.getTargetInfo().getLongWidth())
16982 else if (pw ==
Context.getTargetInfo().getLongLongWidth())
16985 llvm_unreachable(
"I don't know size of pointer!");
17002 if ((SLDecl->isCompleteDefinition() || SLDecl->isBeingDefined()) &&
17011 S.
Diag(Loc, diag::err_std_source_location_impl_not_found);
17019 S.
Diag(Loc, diag::err_std_source_location_impl_malformed);
17023 unsigned Count = 0;
17025 StringRef Name = F->getName();
17027 if (Name ==
"_M_file_name") {
17028 if (F->getType() !=
17032 }
else if (Name ==
"_M_function_name") {
17033 if (F->getType() !=
17037 }
else if (Name ==
"_M_line") {
17038 if (!F->getType()->isIntegerType())
17041 }
else if (Name ==
"_M_column") {
17042 if (!F->getType()->isIntegerType())
17051 S.
Diag(Loc, diag::err_std_source_location_impl_malformed);
17074 ResultTy =
Context.UnsignedIntTy;
17083 ResultTy =
Context.getPointerType(
17102 Data->BinaryData = BinaryData;
17106 Data->getDataElementCount());
17110 const Expr *SrcExpr) {
17119 auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl());
17132 bool *Complained) {
17134 *Complained =
false;
17137 bool CheckInferredResultType =
false;
17139 unsigned DiagKind = 0;
17141 bool MayHaveConvFixit =
false;
17142 bool MayHaveFunctionDiff =
false;
17153 DiagKind = diag::warn_compatible_implicit_pointer_conv;
17157 DiagKind = diag::err_typecheck_convert_pointer_int;
17160 DiagKind = diag::ext_typecheck_convert_pointer_int;
17163 MayHaveConvFixit =
true;
17167 DiagKind = diag::err_typecheck_convert_int_pointer;
17170 DiagKind = diag::ext_typecheck_convert_int_pointer;
17173 MayHaveConvFixit =
true;
17177 diag::warn_typecheck_convert_incompatible_function_pointer_strict;
17179 MayHaveConvFixit =
true;
17183 DiagKind = diag::err_typecheck_convert_incompatible_function_pointer;
17186 DiagKind = diag::ext_typecheck_convert_incompatible_function_pointer;
17189 MayHaveConvFixit =
true;
17193 DiagKind = diag::err_arc_typecheck_convert_incompatible_pointer;
17195 DiagKind = diag::err_typecheck_convert_incompatible_pointer;
17198 DiagKind = diag::ext_typecheck_convert_incompatible_pointer;
17202 if (CheckInferredResultType) {
17208 MayHaveConvFixit =
true;
17212 DiagKind = diag::err_typecheck_convert_incompatible_pointer_sign;
17215 DiagKind = diag::ext_typecheck_convert_incompatible_pointer_sign;
17220 DiagKind = diag::err_typecheck_convert_pointer_void_func;
17223 DiagKind = diag::ext_typecheck_convert_pointer_void_func;
17235 DiagKind = diag::err_typecheck_incompatible_address_space;
17238 DiagKind = diag::err_typecheck_incompatible_ownership;
17241 DiagKind = diag::err_typecheck_incompatible_ptrauth;
17245 llvm_unreachable(
"unknown error case for discarding qualifiers!");
17262 DiagKind = diag::err_typecheck_convert_discards_qualifiers;
17265 DiagKind = diag::ext_typecheck_convert_discards_qualifiers;
17272 DiagKind = diag::err_nested_pointer_qualifier_mismatch;
17274 DiagKind = diag::ext_nested_pointer_qualifier_mismatch;
17278 DiagKind = diag::err_typecheck_incompatible_nested_address_space;
17282 DiagKind = diag::err_int_to_block_pointer;
17286 DiagKind = diag::err_typecheck_convert_incompatible_block_pointer;
17293 for (
auto *srcProto : srcOPT->
quals()) {
17299 IFace = IFaceT->getDecl();
17304 for (
auto *dstProto : dstOPT->
quals()) {
17310 IFace = IFaceT->getDecl();
17313 DiagKind = diag::err_incompatible_qualified_id;
17316 DiagKind = diag::warn_incompatible_qualified_id;
17322 DiagKind = diag::err_incompatible_vectors;
17325 DiagKind = diag::warn_incompatible_vectors;
17329 DiagKind = diag::err_arc_weak_unavailable_assign;
17335 *Complained =
true;
17339 DiagKind = diag::err_typecheck_convert_incompatible;
17341 MayHaveConvFixit =
true;
17343 MayHaveFunctionDiff =
true;
17352 FirstType = DstType;
17353 SecondType = SrcType;
17363 FirstType = SrcType;
17364 SecondType = DstType;
17373 FDiag << FirstType << SecondType << ActionForDiag
17376 if (DiagKind == diag::ext_typecheck_convert_incompatible_pointer_sign ||
17377 DiagKind == diag::err_typecheck_convert_incompatible_pointer_sign) {
17387 if (!ConvHints.
isNull()) {
17392 if (MayHaveConvFixit) { FDiag << (
unsigned) (ConvHints.
Kind); }
17394 if (MayHaveFunctionDiff)
17398 if ((DiagKind == diag::warn_incompatible_qualified_id ||
17399 DiagKind == diag::err_incompatible_qualified_id) &&
17401 Diag(IFace->
getLocation(), diag::note_incomplete_class_and_qualified_id)
17404 if (SecondType ==
Context.OverloadTy)
17408 if (CheckInferredResultType)
17416 *Complained =
true;
17427 return S.
Diag(Loc, diag::err_ice_not_integral)
17431 return S.
Diag(Loc, diag::err_expr_not_ice) << S.
LangOpts.CPlusPlus;
17446 IDDiagnoser(
unsigned DiagID)
17450 return S.
Diag(Loc, DiagID);
17452 } Diagnoser(DiagID);
17465 return S.
Diag(Loc, diag::ext_expr_not_ice) << S.
LangOpts.CPlusPlus;
17487 BaseDiagnoser(BaseDiagnoser) {}
17496 return S.
Diag(Loc, diag::err_ice_incomplete_type) <<
T;
17501 return S.
Diag(Loc, diag::err_ice_explicit_conversion) <<
T << ConvTy;
17512 return S.
Diag(Loc, diag::err_ice_ambiguous_conversion) <<
T;
17523 llvm_unreachable(
"conversion functions are permitted");
17525 } ConvertDiagnoser(Diagnoser);
17531 E = Converted.
get();
17552 E = RValueExpr.
get();
17570 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
17571 diag::note_invalid_subexpr_in_const_expr) {
17572 DiagLoc = Notes[0].first;
17594 EvalResult.
Diag = &Notes;
17618 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
17619 diag::note_invalid_subexpr_in_const_expr) {
17620 DiagLoc = Notes[0].first;
17646 class TransformToPE :
public TreeTransform<TransformToPE> {
17650 TransformToPE(
Sema &SemaRef) : BaseTransform(SemaRef) { }
17653 bool AlwaysRebuild() {
return true; }
17654 bool ReplacingOriginal() {
return true; }
17663 ExprResult TransformDeclRefExpr(DeclRefExpr *E) {
17665 !SemaRef.isUnevaluatedContext())
17667 diag::err_invalid_non_static_member_use)
17670 return BaseTransform::TransformDeclRefExpr(E);
17674 ExprResult TransformUnaryOperator(UnaryOperator *E) {
17678 return BaseTransform::TransformUnaryOperator(E);
17686 return SkipLambdaBody(E, Body);
17693 "Should only transform unevaluated expressions");
17698 return TransformToPE(*this).TransformExpr(E);
17703 "Should only transform unevaluated expressions");
17707 return TransformToPE(*this).TransformType(TInfo);
17715 LambdaContextDecl, ExprContext);
17729 Prev.isImmediateFunctionContext() || Prev.isConstantEvaluated();
17732 Prev.InImmediateEscalatingFunctionContext;
17790 if (
const auto *E = dyn_cast<UnaryOperator>(PossibleDeref)) {
17791 if (E->getOpcode() == UO_Deref)
17792 return CheckPossibleDeref(S, E->getSubExpr());
17793 }
else if (
const auto *E = dyn_cast<ArraySubscriptExpr>(PossibleDeref)) {
17794 return CheckPossibleDeref(S, E->getBase());
17795 }
else if (
const auto *E = dyn_cast<MemberExpr>(PossibleDeref)) {
17796 return CheckPossibleDeref(S, E->getBase());
17797 }
else if (
const auto E = dyn_cast<DeclRefExpr>(PossibleDeref)) {
17800 if (
const auto *Ptr = Ty->
getAs<PointerType>())
17803 Inner = Arr->getElementType();
17807 if (Inner->
hasAttr(attr::NoDeref))
17817 const DeclRefExpr *DeclRef = CheckPossibleDeref(*
this, E);
17824 Diag(E->
getExprLoc(), diag::warn_dereference_of_noderef_type_no_decl)
17839 if (BO->getOpcode() == BO_Assign) {
17841 llvm::erase(LHSs, BO->getLHS());
17849 "Cannot mark an immediate escalating expression outside of an "
17850 "immediate escalating context");
17853 if (
auto *DeclRef =
17854 dyn_cast<DeclRefExpr>(
Call->getCallee()->IgnoreImplicit()))
17855 DeclRef->setIsImmediateEscalating(
true);
17856 }
else if (
auto *Ctr = dyn_cast<CXXConstructExpr>(E->
IgnoreImplicit())) {
17857 Ctr->setIsImmediateEscalating(
true);
17858 }
else if (
auto *DeclRef = dyn_cast<DeclRefExpr>(E->
IgnoreImplicit())) {
17859 DeclRef->setIsImmediateEscalating(
true);
17861 assert(
false &&
"expected an immediately escalating expression");
17864 FI->FoundImmediateEscalatingExpression =
true;
17879 if (
auto *DeclRef =
17880 dyn_cast<DeclRefExpr>(
Call->getCallee()->IgnoreImplicit()))
17889 auto CheckConstantExpressionAndKeepResult = [&]() {
17892 Eval.
Diag = &Notes;
17894 Eval,
getASTContext(), ConstantExprKind::ImmediateInvocation);
17895 if (Res && Notes.empty()) {
17896 Cached = std::move(Eval.
Val);
17904 !CheckConstantExpressionAndKeepResult()) {
17909 if (
Cleanup.exprNeedsCleanups()) {
17926 Cleanup.cleanupsHaveSideEffects(), {});
17939 ExprEvalContexts.back().ImmediateInvocationCandidates.emplace_back(Res, 0);
17947 Eval.
Diag = &Notes;
17951 if (!Result || !Notes.empty()) {
17954 if (
auto *
FunctionalCast = dyn_cast<CXXFunctionalCastExpr>(InnerExpr))
17957 if (
auto *
Call = dyn_cast<CallExpr>(InnerExpr))
17959 else if (
auto *
Call = dyn_cast<CXXConstructExpr>(InnerExpr))
17960 FD =
Call->getConstructor();
17961 else if (
auto *Cast = dyn_cast<CastExpr>(InnerExpr))
17962 FD = dyn_cast_or_null<FunctionDecl>(Cast->getConversionFunction());
17965 "could not find an immediate function in this expression");
17972 SemaRef.
Diag(Context->Loc, diag::note_invalid_consteval_initializer)
17974 SemaRef.
Diag(Context->Decl->getBeginLoc(), diag::note_declared_at);
17978 for (
auto &
Note : Notes)
17990 llvm::SmallPtrSetImpl<DeclRefExpr *> &DRSet;
17994 ComplexRemove(
Sema &SemaRef, llvm::SmallPtrSetImpl<DeclRefExpr *> &DR,
17998 :
Base(SemaRef), DRSet(DR), IISet(II), CurrentII(Current) {}
18000 auto It = std::find_if(CurrentII, IISet.rend(),
18002 return Elem.getPointer() == E;
18008 if (It == IISet.rend()) {
18010 CurrentII->setInt(1);
18017 return Base::TransformConstantExpr(E);
18018 RemoveImmediateInvocation(E);
18019 return Base::TransformExpr(E->
getSubExpr());
18025 return Base::TransformCXXOperatorCallExpr(E);
18039 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(
Init))
18040 Init = ICE->getSubExpr();
18041 else if (
auto *ICE = dyn_cast<MaterializeTemporaryExpr>(
Init))
18042 Init = ICE->getSubExpr();
18048 if (
auto *CE = dyn_cast<ConstantExpr>(
Init);
18049 CE && CE->isImmediateInvocation())
18050 RemoveImmediateInvocation(CE);
18051 return Base::TransformInitializer(
Init, NotCopyInit);
18062 bool AlwaysRebuild() {
return false; }
18063 bool ReplacingOriginal() {
return true; }
18064 bool AllowSkippingCXXConstructExpr() {
18065 bool Res = AllowSkippingFirstCXXConstructExpr;
18066 AllowSkippingFirstCXXConstructExpr =
true;
18069 bool AllowSkippingFirstCXXConstructExpr =
true;
18080 Transformer.AllowSkippingFirstCXXConstructExpr =
false;
18082 ExprResult Res = Transformer.TransformExpr(It->getPointer()->getSubExpr());
18088 It->getPointer()->setSubExpr(Res.
get());
18109 VD->hasConstantInitialization()) {
18142 llvm::SmallPtrSetImpl<DeclRefExpr *> &DRSet;
18143 SimpleRemove(llvm::SmallPtrSetImpl<DeclRefExpr *> &S) : DRSet(S) {}
18146 return DRSet.size();
18149 Visitor.TraverseStmt(
18159 if (DR->isImmediateEscalating())
18163 if (
const auto *MD = dyn_cast<CXXMethodDecl>(ND);
18165 ND = MD->getParent();
18172 bool ImmediateEscalating =
false;
18173 bool IsPotentiallyEvaluated =
18183 SemaRef.
Diag(DR->getBeginLoc(), diag::err_invalid_consteval_take_address)
18184 << ND << isa<CXXRecordDecl>(ND) << FD->isConsteval();
18185 if (!FD->getBuiltinID())
18189 SemaRef.
Diag(Context->Loc, diag::note_invalid_consteval_initializer)
18191 SemaRef.
Diag(Context->Decl->getBeginLoc(), diag::note_declared_at);
18193 if (FD->isImmediateEscalating() && !FD->isConsteval())
18207 (Rec.
ExprContext == ExpressionKind::EK_TemplateArgument ||
18215 D = diag::err_lambda_unevaluated_operand;
18221 D = diag::err_lambda_in_constant_expression;
18222 }
else if (Rec.
ExprContext == ExpressionKind::EK_TemplateArgument) {
18225 D = diag::err_lambda_in_invalid_context;
18227 llvm_unreachable(
"Couldn't infer lambda error message.");
18229 for (
const auto *L : Rec.
Lambdas)
18230 Diag(L->getBeginLoc(), D);
18250 Diag(BO->getBeginLoc(), diag::warn_deprecated_simple_assign_volatile)
18321 llvm_unreachable(
"Invalid context");
18367 : FD(FD), Param(Param) {}
18374 CCName =
"stdcall";
18377 CCName =
"fastcall";
18380 CCName =
"vectorcall";
18383 llvm_unreachable(
"CC does not need mangling");
18386 S.
Diag(Loc, diag::err_cconv_incomplete_param_type)
18387 << Param->getDeclName() << FD->
getDeclName() << CCName;
18392 ParamIncompleteTypeDiagnoser Diagnoser(FD, Param);
18398enum class OdrUseContext {
18417 if (Context.isUnevaluated())
18418 return OdrUseContext::None;
18421 return OdrUseContext::Dependent;
18423 if (Context.isDiscardedStatementContext())
18424 return OdrUseContext::FormallyOdrUsed;
18426 else if (Context.Context ==
18428 return OdrUseContext::FormallyOdrUsed;
18430 return OdrUseContext::Used;
18434 if (!
Func->isConstexpr())
18437 if (
Func->isImplicitlyInstantiable() || !
Func->isUserProvided())
18444 auto *CCD = dyn_cast<CXXConstructorDecl>(
Func);
18445 return CCD && CCD->getInheritedConstructor();
18449 bool MightBeOdrUse) {
18450 assert(
Func &&
"No function?");
18452 Func->setReferenced();
18465 OdrUseContext OdrUse =
18467 if (IsRecursiveCall && OdrUse == OdrUseContext::Used)
18468 OdrUse = OdrUseContext::FormallyOdrUsed;
18472 if (
Func->isTrivial() && !
Func->hasAttr<DLLExportAttr>() &&
18473 OdrUse == OdrUseContext::Used) {
18476 OdrUse = OdrUseContext::FormallyOdrUsed;
18478 OdrUse = OdrUseContext::FormallyOdrUsed;
18485 bool NeededForConstantEvaluation =
18510 bool NeedDefinition =
18511 !IsRecursiveCall &&
18512 (OdrUse == OdrUseContext::Used ||
18513 (NeededForConstantEvaluation && !
Func->isPureVirtual()));
18520 if (NeedDefinition &&
18522 Func->getMemberSpecializationInfo()))
18529 if (NeedDefinition && !
Func->getBody()) {
18532 dyn_cast<CXXConstructorDecl>(
Func)) {
18545 }
else if (
Constructor->getInheritedConstructor()) {
18549 dyn_cast<CXXDestructorDecl>(
Func)) {
18559 if (MethodDecl->isOverloadedOperator() &&
18560 MethodDecl->getOverloadedOperator() == OO_Equal) {
18562 if (MethodDecl->isDefaulted() && !MethodDecl->isDeleted()) {
18563 if (MethodDecl->isCopyAssignmentOperator())
18565 else if (MethodDecl->isMoveAssignmentOperator())
18569 MethodDecl->getParent()->isLambda()) {
18576 }
else if (MethodDecl->isVirtual() &&
getLangOpts().AppleKext)
18580 if (
Func->isDefaulted() && !
Func->isDeleted()) {
18588 if (
Func->isImplicitlyInstantiable()) {
18590 Func->getTemplateSpecializationKindForInstantiation();
18592 bool FirstInstantiation = PointOfInstantiation.
isInvalid();
18593 if (FirstInstantiation) {
18594 PointOfInstantiation = Loc;
18595 if (
auto *MSI =
Func->getMemberSpecializationInfo())
18596 MSI->setPointOfInstantiation(Loc);
18599 Func->setTemplateSpecializationKind(TSK, PointOfInstantiation);
18604 PointOfInstantiation = Loc;
18608 Func->isConstexpr()) {
18613 std::make_pair(
Func, PointOfInstantiation));
18614 else if (
Func->isConstexpr())
18620 Func->setInstantiationIsPending(
true);
18622 std::make_pair(
Func, PointOfInstantiation));
18623 if (llvm::isTimeTraceVerbose()) {
18624 llvm::timeTraceAddInstantEvent(
"DeferInstantiation", [&] {
18626 llvm::raw_string_ostream
OS(Name);
18633 Consumer.HandleCXXImplicitFunctionInstantiation(
Func);
18638 for (
auto *i :
Func->redecls()) {
18639 if (!i->isUsed(
false) && i->isImplicitlyInstantiable())
18657 if (
Init->isInClassMemberInitializer())
18659 MarkDeclarationsReferencedInExpr(Init->getInit());
18680 if (
LangOpts.OffloadImplicitHostDeviceTemplates &&
LangOpts.CUDAIsDevice &&
18685 if (OdrUse == OdrUseContext::Used && !
Func->isUsed(
false)) {
18687 if (!
Func->isDefined() && !
Func->isInAnotherModuleUnit()) {
18688 if (mightHaveNonExternalLinkage(
Func))
18690 else if (
Func->getMostRecentDecl()->isInlined() &&
18692 !
Func->getMostRecentDecl()->hasAttr<GNUInlineAttr>())
18710 if (
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
18711 if (
auto *Dtor = dyn_cast<CXXDestructorDecl>(
Func)) {
18731 const unsigned *
const FunctionScopeIndexToStopAt =
nullptr) {
18734 VarDecl *Var =
V->getPotentiallyDecomposedVarDecl();
18735 assert(Var &&
"expected a capturable variable");
18745 QualType CaptureType, DeclRefType;
18751 DeclRefType, FunctionScopeIndexToStopAt);
18766 << 2 << 1 << Var << UserTarget;
18769 ? diag::note_cuda_const_var_unpromoted
18770 : diag::note_cuda_host_var);
18773 !Var->
hasAttr<CUDASharedAttr>() &&
18789 (!FD || (!FD->getDescribedFunctionTemplate() &&
18801 unsigned CapturingScopeIndex) {
18828 unsigned ContextKind = 3;
18838 S.
Diag(loc, diag::err_reference_to_local_in_enclosing_context)
18839 << var << ValueKind << ContextKind << VarDC;
18840 S.
Diag(var->getLocation(), diag::note_entity_declared_at)
18849 bool &SubCapturesAreNested,
18855 SubCapturesAreNested =
true;
18908 "Only variables and structured bindings can be captured");
18919 S.
Diag(Loc, diag::err_lambda_capture_anonymous_var);
18928 S.
Diag(Loc, diag::err_ref_vm_type);
18939 S.
Diag(Loc, diag::err_ref_flexarray_type);
18941 S.
Diag(Loc, diag::err_lambda_capture_flexarray_type) << Var;
18946 const bool HasBlocksAttr = Var->
hasAttr<BlocksAttr>();
18951 S.
Diag(Loc, diag::err_capture_block_variable) << Var << !IsLambda;
18960 S.
Diag(Loc, diag::err_opencl_block_ref_block);
18971 ? diag::warn_cxx17_compat_capture_binding
18972 : diag::ext_capture_binding)
18986 bool ByRef =
false;
18992 if (BuildAndDiagnose) {
18993 S.
Diag(Loc, diag::err_ref_array_type);
19004 if (BuildAndDiagnose) {
19005 S.
Diag(Loc, diag::err_arc_autoreleasing_capture)
19021 if (BuildAndDiagnose) {
19023 S.
Diag(Loc, diag::warn_block_capture_autoreleasing);
19024 S.
Diag(VarLoc, diag::note_declare_parameter_strong);
19029 const bool HasBlocksAttr = Var->
hasAttr<BlocksAttr>();
19038 DeclRefType = CaptureType;
19042 if (BuildAndDiagnose)
19052 const bool BuildAndDiagnose,
QualType &CaptureType,
QualType &DeclRefType,
19053 const bool RefersToCapturedVariable,
TryCaptureKind Kind,
bool IsTopScope,
19079 CaptureType = DeclRefType;
19082 if (BuildAndDiagnose)
19083 RSI->
addCapture(Var,
false, ByRef, RefersToCapturedVariable,
19093 const bool RefersToCapturedVariable,
19098 bool ByRef =
false;
19102 ByRef = (LSI->
ImpCaptureStyle == LambdaScopeInfo::ImpCap_LambdaByref);
19107 S.
Diag(Loc, diag::err_wasm_ca_reference) << 0;
19138 if (!RefType->getPointeeType()->isFunctionType())
19145 if (BuildAndDiagnose) {
19146 S.
Diag(Loc, diag::err_arc_autoreleasing_capture) << 1;
19156 if (!
Invalid && BuildAndDiagnose) {
19160 diag::err_capture_of_incomplete_or_sizeless_type,
19164 diag::err_capture_of_abstract_type))
19190 if (BuildAndDiagnose)
19191 LSI->
addCapture(Var,
false, ByRef, RefersToCapturedVariable,
19192 Loc, EllipsisLoc, CaptureType,
Invalid);
19203 if (
T.isTriviallyCopyableType(Context))
19207 if (!(RD = RD->getDefinition()))
19209 if (RD->hasSimpleCopyConstructor())
19211 if (RD->hasUserDeclaredCopyConstructor())
19213 if (Ctor->isCopyConstructor())
19214 return !Ctor->isDeleted();
19234 if (ShouldOfferCopyFix) {
19238 FixBuffer.assign({Separator, Var->
getName()});
19239 Sema.
Diag(VarInsertLoc, diag::note_lambda_variable_capture_fixit)
19244 FixBuffer.assign({Separator,
"&", Var->
getName()});
19245 Sema.
Diag(VarInsertLoc, diag::note_lambda_variable_capture_fixit)
19257 return !C.isThisCapture() && !C.isInitCapture();
19266 if (ShouldOfferCopyFix) {
19267 bool CanDefaultCopyCapture =
true;
19276 if (CanDefaultCopyCapture && llvm::none_of(LSI->
Captures, [](
Capture &
C) {
19277 return !C.isThisCapture() && !C.isInitCapture() && C.isCopyCapture();
19279 FixBuffer.assign({
"=", Separator});
19280 Sema.
Diag(DefaultInsertLoc, diag::note_lambda_default_capture_fixit)
19289 return !C.isInitCapture() && C.isReferenceCapture() &&
19290 !C.isThisCapture();
19292 FixBuffer.assign({
"&", Separator});
19293 Sema.
Diag(DefaultInsertLoc, diag::note_lambda_default_capture_fixit)
19302 QualType &DeclRefType,
const unsigned *
const FunctionScopeIndexToStopAt) {
19325 const auto *VD = dyn_cast<VarDecl>(Var);
19327 if (VD->isInitCapture())
19332 assert(VD &&
"Cannot capture a null variable");
19334 const unsigned MaxFunctionScopesIndex = FunctionScopeIndexToStopAt
19338 if (FunctionScopeIndexToStopAt) {
19339 assert(!
FunctionScopes.empty() &&
"No function scopes to stop at?");
19344 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(
FunctionScopes[FSIndex]);
19345 FSIndex && LSI && !LSI->AfterParameterList)
19347 assert(MaxFunctionScopesIndex <= FSIndex &&
19348 "FunctionScopeIndexToStopAt should be no greater than FSIndex into "
19349 "FunctionScopes.");
19350 while (FSIndex != MaxFunctionScopesIndex) {
19358 bool IsGlobal = !VD->hasLocalStorage();
19359 if (IsGlobal && !(
LangOpts.OpenMP &&
19360 OpenMP().isOpenMPCapturedDecl(Var,
true,
19361 MaxFunctionScopesIndex)))
19375 CaptureType = Var->
getType();
19377 bool Nested =
false;
19379 unsigned FunctionScopesIndex = MaxFunctionScopesIndex;
19384 LSI = dyn_cast_or_null<LambdaScopeInfo>(
19387 bool IsInScopeDeclarationContext =
19398 if (IsInScopeDeclarationContext &&
19399 FunctionScopesIndex == MaxFunctionScopesIndex && VarDC == DC)
19405 !IsInScopeDeclarationContext
19408 BuildAndDiagnose, *
this);
19414 FunctionScopesIndex = MaxFunctionScopesIndex - 1;
19433 if (
const auto *Parm = dyn_cast<ParmVarDecl>(Var);
19434 Parm && Parm->getDeclContext() == DC)
19442 if (BuildAndDiagnose) {
19445 Diag(ExprLoc, diag::err_lambda_impcap) << Var;
19460 if (
ParmVarDecl *PVD = dyn_cast_or_null<ParmVarDecl>(Var))
19461 QTy = PVD->getOriginalType();
19466 if (
auto *RSI = dyn_cast<CapturedRegionScopeInfo>(CSI)) {
19473 if (BuildAndDiagnose) {
19474 Diag(ExprLoc, diag::err_capture_binding_openmp) << Var;
19480 Var, RSI->OpenMPLevel, RSI->OpenMPCaptureLevel);
19485 if (IsOpenMPPrivateDecl != OMPC_unknown &&
19488 if (
ParmVarDecl *PVD = dyn_cast_or_null<ParmVarDecl>(Var))
19489 QTy = PVD->getOriginalType();
19491 E =
OpenMP().getNumberOfConstructScopes(RSI->OpenMPLevel);
19495 assert(RSI->OpenMPLevel == OuterRSI->OpenMPLevel &&
19496 "Wrong number of captured regions associated with the "
19497 "OpenMP construct.");
19502 IsOpenMPPrivateDecl != OMPC_private &&
19504 RSI->OpenMPCaptureLevel);
19508 Var, RSI->OpenMPLevel, RSI->OpenMPCaptureLevel);
19514 OpenMP().adjustOpenMPTargetScopeIndex(FunctionScopesIndex,
19517 if (IsTargetCap || IsOpenMPPrivateDecl == OMPC_private ||
19518 (IsGlobal && !IsGlobalCap)) {
19519 Nested = !IsTargetCap;
19525 CaptureType =
Context.getLValueReferenceType(DeclRefType);
19534 if (BuildAndDiagnose) {
19535 Diag(ExprLoc, diag::err_lambda_impcap) << Var;
19557 FunctionScopesIndex--;
19558 if (IsInScopeDeclarationContext)
19560 }
while (!VarDC->
Equals(DC));
19568 for (
unsigned I = ++FunctionScopesIndex, N = MaxFunctionScopesIndex + 1; I != N;
19581 if (
Invalid && !BuildAndDiagnose)
19586 DeclRefType, Nested, *
this,
Invalid);
19590 RSI, Var, ExprLoc, BuildAndDiagnose, CaptureType, DeclRefType, Nested,
19591 Kind, I == N - 1, *
this,
Invalid);
19597 DeclRefType, Nested, Kind, EllipsisLoc,
19602 if (
Invalid && !BuildAndDiagnose)
19614 DeclRefType,
nullptr);
19622 false, CaptureType, DeclRefType,
nullptr);
19626 assert(Var &&
"Null value cannot be captured");
19633 false, CaptureType, DeclRefType,
19637 return DeclRefType;
19645class CopiedTemplateArgs {
19649 template<
typename RefExpr>
19650 CopiedTemplateArgs(RefExpr *E) : HasArgs(E->hasExplicitTemplateArgs()) {
19652 E->copyTemplateArgumentsInto(TemplateArgStorage);
19655#ifdef __has_cpp_attribute
19656#if __has_cpp_attribute(clang::lifetimebound)
19657 [[clang::lifetimebound]]
19661 return HasArgs ? &TemplateArgStorage :
nullptr;
19687 auto Rebuild = [&](
Expr *Sub) {
19692 auto IsPotentialResultOdrUsed = [&](
NamedDecl *D) {
19695 auto *VD = dyn_cast<VarDecl>(D);
19718 llvm_unreachable(
"unexpected non-odr-use-reason");
19722 if (VD->getType()->isReferenceType())
19724 if (
auto *RD = VD->getType()->getAsCXXRecordDecl())
19725 if (RD->hasDefinition() && RD->hasMutableFields())
19727 if (!VD->isUsableInConstantExpressions(S.
Context))
19732 if (VD->getType()->isReferenceType())
19740 auto MaybeCUDAODRUsed = [&]() ->
bool {
19746 auto *DRE = dyn_cast<DeclRefExpr>(E);
19749 auto *VD = dyn_cast<VarDecl>(DRE->getDecl());
19756 auto MarkNotOdrUsed = [&] {
19757 if (!MaybeCUDAODRUsed()) {
19760 LSI->markVariableExprAsNonODRUsed(E);
19768 case Expr::DeclRefExprClass: {
19770 if (DRE->isNonOdrUse() || IsPotentialResultOdrUsed(DRE->getDecl()))
19776 S.
Context, DRE->getQualifierLoc(), DRE->getTemplateKeywordLoc(),
19777 DRE->getDecl(), DRE->refersToEnclosingVariableOrCapture(),
19778 DRE->getNameInfo(), DRE->getType(), DRE->getValueKind(),
19779 DRE->getFoundDecl(), CopiedTemplateArgs(DRE), NOUR);
19782 case Expr::FunctionParmPackExprClass: {
19787 if (IsPotentialResultOdrUsed(D))
19798 case Expr::ArraySubscriptExprClass: {
19804 if (!
Base.isUsable())
19806 Expr *LHS = ASE->getBase() == ASE->getLHS() ?
Base.get() : ASE->getLHS();
19807 Expr *RHS = ASE->getBase() == ASE->getRHS() ?
Base.get() : ASE->getRHS();
19810 ASE->getRBracketLoc());
19813 case Expr::MemberExprClass: {
19819 if (!
Base.isUsable())
19822 S.
Context,
Base.get(), ME->isArrow(), ME->getOperatorLoc(),
19823 ME->getQualifierLoc(), ME->getTemplateKeywordLoc(),
19824 ME->getMemberDecl(), ME->getFoundDecl(), ME->getMemberNameInfo(),
19825 CopiedTemplateArgs(ME), ME->getType(), ME->getValueKind(),
19826 ME->getObjectKind(), ME->isNonOdrUse());
19829 if (ME->getMemberDecl()->isCXXInstanceMember())
19834 if (ME->isNonOdrUse() || IsPotentialResultOdrUsed(ME->getMemberDecl()))
19840 S.
Context, ME->getBase(), ME->isArrow(), ME->getOperatorLoc(),
19841 ME->getQualifierLoc(), ME->getTemplateKeywordLoc(), ME->getMemberDecl(),
19842 ME->getFoundDecl(), ME->getMemberNameInfo(), CopiedTemplateArgs(ME),
19843 ME->getType(), ME->getValueKind(), ME->getObjectKind(), NOUR);
19846 case Expr::BinaryOperatorClass: {
19848 Expr *LHS = BO->getLHS();
19849 Expr *RHS = BO->getRHS();
19851 if (BO->getOpcode() == BO_PtrMemD) {
19853 if (!Sub.isUsable())
19855 BO->setLHS(Sub.get());
19857 }
else if (BO->getOpcode() == BO_Comma) {
19859 if (!Sub.isUsable())
19861 BO->setRHS(Sub.get());
19869 case Expr::ParenExprClass: {
19872 if (!Sub.isUsable())
19874 return S.
ActOnParenExpr(PE->getLParen(), PE->getRParen(), Sub.get());
19879 case Expr::ConditionalOperatorClass: {
19890 LHS = CO->getLHS();
19892 RHS = CO->getRHS();
19894 CO->getCond(), LHS.
get(), RHS.
get());
19899 case Expr::UnaryOperatorClass: {
19901 if (UO->getOpcode() != UO_Extension)
19904 if (!Sub.isUsable())
19906 return S.
BuildUnaryOp(
nullptr, UO->getOperatorLoc(), UO_Extension,
19913 case Expr::GenericSelectionExprClass: {
19917 bool AnyChanged =
false;
19918 for (
Expr *OrigAssocExpr : GSE->getAssocExprs()) {
19919 ExprResult AssocExpr = Rebuild(OrigAssocExpr);
19923 AssocExprs.push_back(AssocExpr.
get());
19926 AssocExprs.push_back(OrigAssocExpr);
19930 void *ExOrTy =
nullptr;
19931 bool IsExpr = GSE->isExprPredicate();
19933 ExOrTy = GSE->getControllingExpr();
19935 ExOrTy = GSE->getControllingType();
19937 GSE->getGenericLoc(), GSE->getDefaultLoc(),
19938 GSE->getRParenLoc(), IsExpr, ExOrTy,
19939 GSE->getAssocTypeSourceInfos(), AssocExprs)
19947 case Expr::ChooseExprClass: {
19958 if (!LHS.
get() && !RHS.
get())
19961 LHS = CE->getLHS();
19963 RHS = CE->getRHS();
19966 RHS.
get(), CE->getRParenLoc());
19970 case Expr::ConstantExprClass: {
19973 if (!Sub.isUsable())
19980 case Expr::ImplicitCastExprClass: {
19985 switch (ICE->getCastKind()) {
19987 case CK_DerivedToBase:
19988 case CK_UncheckedDerivedToBase: {
19989 ExprResult Sub = Rebuild(ICE->getSubExpr());
19990 if (!Sub.isUsable())
19994 ICE->getValueKind(), &Path);
20051 for (
Expr *E : LocalMaybeODRUseExprs) {
20052 if (
auto *DRE = dyn_cast<DeclRefExpr>(E)) {
20054 DRE->getLocation(), *
this);
20055 }
else if (
auto *ME = dyn_cast<MemberExpr>(E)) {
20058 }
else if (
auto *FP = dyn_cast<FunctionParmPackExpr>(E)) {
20062 llvm_unreachable(
"Unexpected expression");
20067 "MarkVarDeclODRUsed failed to cleanup MaybeODRUseExprs?");
20076 const bool RefersToEnclosingScope =
20079 if (RefersToEnclosingScope) {
20094 assert(E &&
"Capture variable should be used in an expression.");
20107 "Invalid Expr argument to DoMarkVarDeclReferenced");
20118 bool UsableInConstantExpr =
20130 bool NeededForConstantEvaluation =
20133 bool NeedDefinition =
20134 OdrUse == OdrUseContext::Used || NeededForConstantEvaluation ||
20136 Var->
getType()->isUndeducedType());
20139 "Can't instantiate a partial template specialization.");
20156 bool TryInstantiating =
20160 if (TryInstantiating) {
20163 bool FirstInstantiation = PointOfInstantiation.
isInvalid();
20164 if (FirstInstantiation) {
20165 PointOfInstantiation = Loc;
20167 MSI->setPointOfInstantiation(PointOfInstantiation);
20189 if (
auto *DRE = dyn_cast_or_null<DeclRefExpr>(E))
20190 DRE->setDecl(DRE->getDecl());
20191 else if (
auto *ME = dyn_cast_or_null<MemberExpr>(E))
20192 ME->setMemberDecl(ME->getMemberDecl());
20193 }
else if (FirstInstantiation) {
20195 .push_back(std::make_pair(Var, PointOfInstantiation));
20197 bool Inserted =
false;
20199 auto Iter = llvm::find_if(
20201 return P.first == Var;
20203 if (Iter != I.end()) {
20218 .push_back(std::make_pair(Var, PointOfInstantiation));
20242 if (
DeclRefExpr *DRE = dyn_cast_or_null<DeclRefExpr>(E))
20243 if (DRE->isNonOdrUse())
20245 if (
MemberExpr *ME = dyn_cast_or_null<MemberExpr>(E))
20246 if (ME->isNonOdrUse())
20250 case OdrUseContext::None:
20255 "missing non-odr-use marking for unevaluated decl ref");
20258 case OdrUseContext::FormallyOdrUsed:
20263 case OdrUseContext::Used:
20272 case OdrUseContext::Dependent:
20290 if (OdrUse == OdrUseContext::Used) {
20291 QualType CaptureType, DeclRefType;
20297 }
else if (OdrUse == OdrUseContext::Dependent) {
20313 auto *ID = dyn_cast<DeclRefExpr>(E);
20314 if (!ID || ID->isTypeDependent() || !ID->refersToEnclosingVariableOrCapture())
20321 auto IsDependent = [&]() {
20323 auto *LSI = dyn_cast<sema::LambdaScopeInfo>(
Scope);
20328 LSI->AfterParameterList)
20331 const auto *MD = LSI->CallOperator;
20332 if (MD->getType().isNull())
20336 if (!Ty || !MD->isExplicitObjectMemberFunction() ||
20340 if (
auto *
C = LSI->CaptureMap.count(D) ? &LSI->getCapture(D) :
nullptr) {
20341 if (
C->isCopyCapture())
20346 if (LSI->ImpCaptureStyle == LambdaScopeInfo::ImpCap_LambdaByval)
20352 ID->setCapturedByCopyInLambdaWithExplicitObjectParameter(
20358 bool MightBeOdrUse,
20366 if (
VarDecl *Var = dyn_cast<VarDecl>(D)) {
20385 const MemberExpr *ME = dyn_cast<MemberExpr>(E);
20392 bool IsVirtualCall = MD->
isVirtual() &&
20394 if (!IsVirtualCall)
20411 bool OdrUse =
true;
20413 if (
Method->isVirtual() &&
20417 if (
auto *FD = dyn_cast<FunctionDecl>(E->
getDecl())) {
20422 !FD->isDependentContext())
20436 bool MightBeOdrUse =
true;
20439 if (
Method->isPureVirtual())
20440 MightBeOdrUse =
false;
20459 bool MightBeOdrUse) {
20460 if (MightBeOdrUse) {
20461 if (
auto *VD = dyn_cast<VarDecl>(D)) {
20466 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
20492bool MarkReferencedDecls::TraverseTemplateArgument(
20493 const TemplateArgument &Arg) {
20496 EnterExpressionEvaluationContext
Evaluated(
20510 MarkReferencedDecls Marker(*
this, Loc);
20511 Marker.TraverseType(
T);
20517class EvaluatedExprMarker :
public UsedDeclVisitor<EvaluatedExprMarker> {
20520 bool SkipLocalVariables;
20523 EvaluatedExprMarker(
Sema &S,
bool SkipLocalVariables,
20525 : Inherited(S), SkipLocalVariables(SkipLocalVariables), StopAt(StopAt) {}
20531 void Visit(Expr *E) {
20532 if (llvm::is_contained(StopAt, E))
20534 Inherited::Visit(E);
20537 void VisitConstantExpr(ConstantExpr *E) {
20542 void VisitDeclRefExpr(DeclRefExpr *E) {
20544 if (SkipLocalVariables) {
20545 if (VarDecl *VD = dyn_cast<VarDecl>(E->
getDecl()))
20546 if (VD->hasLocalStorage())
20556 void VisitMemberExpr(MemberExpr *E) {
20564 bool SkipLocalVariables,
20566 EvaluatedExprMarker(*
this, SkipLocalVariables, StopAt).Visit(E);
20588 if (
auto *VD = dyn_cast_or_null<VarDecl>(
20590 if (VD->isConstexpr() ||
20591 (VD->isStaticDataMember() && VD->isFirstDecl() && !VD->isInline()))
20664 class CallReturnIncompleteDiagnoser :
public TypeDiagnoser {
20670 : FD(FD), CE(CE) { }
20674 S.
Diag(Loc, diag::err_call_incomplete_return)
20679 S.
Diag(Loc, diag::err_call_function_incomplete_return)
20684 } Diagnoser(FD, CE);
20697 unsigned diagnostic = diag::warn_condition_is_assignment;
20698 bool IsOrAssign =
false;
20701 if (Op->getOpcode() != BO_Assign && Op->getOpcode() != BO_OrAssign)
20704 IsOrAssign = Op->getOpcode() == BO_OrAssign;
20712 if (
ObjC().isSelfExpr(Op->getLHS()) && ME->getMethodFamily() ==
OMF_init)
20713 diagnostic = diag::warn_condition_is_idiomatic_assignment;
20717 diagnostic = diag::warn_condition_is_idiomatic_assignment;
20720 Loc = Op->getOperatorLoc();
20722 if (Op->getOperator() != OO_Equal && Op->getOperator() != OO_PipeEqual)
20725 IsOrAssign = Op->getOperator() == OO_PipeEqual;
20726 Loc = Op->getOperatorLoc();
20738 Diag(Loc, diag::note_condition_assign_silence)
20743 Diag(Loc, diag::note_condition_or_assign_to_comparison)
20746 Diag(Loc, diag::note_condition_assign_to_comparison)
20764 if (opE->getOpcode() == BO_EQ &&
20765 opE->getLHS()->IgnoreParenImpCasts()->isModifiableLvalue(
Context)
20771 Diag(Loc, diag::note_equality_comparison_silence)
20774 Diag(Loc, diag::note_equality_comparison_to_assign)
20780 bool IsConstexpr) {
20782 if (
ParenExpr *parenE = dyn_cast<ParenExpr>(E))
20799 if (!
T->isScalarType()) {
20800 Diag(Loc, diag::err_typecheck_statement_requires_scalar)
20804 CheckBoolLikeConversion(E, Loc);
20833 if (
Cond.isInvalid()) {
20841 if (!
Cond.isUsable())
20851 struct RebuildUnknownAnyFunction
20852 :
StmtVisitor<RebuildUnknownAnyFunction, ExprResult> {
20856 RebuildUnknownAnyFunction(
Sema &S) : S(S) {}
20859 llvm_unreachable(
"unexpected statement!");
20870 template <
class T>
ExprResult rebuildSugarExpr(
T *E) {
20871 ExprResult SubResult = Visit(E->getSubExpr());
20874 Expr *SubExpr = SubResult.
get();
20875 E->setSubExpr(SubExpr);
20876 E->setType(SubExpr->
getType());
20883 return rebuildSugarExpr(E);
20886 ExprResult VisitUnaryExtension(UnaryOperator *E) {
20887 return rebuildSugarExpr(E);
20890 ExprResult VisitUnaryAddrOf(UnaryOperator *E) {
20894 Expr *SubExpr = SubResult.
get();
20902 ExprResult resolveDecl(Expr *E, ValueDecl *VD) {
20920 ExprResult VisitDeclRefExpr(DeclRefExpr *E) {
20921 return resolveDecl(E, E->
getDecl());
20929 ExprResult Result = RebuildUnknownAnyFunction(S).Visit(FunctionExpr);
20930 if (Result.isInvalid())
return ExprError();
20939 struct RebuildUnknownAnyExpr
20940 : StmtVisitor<RebuildUnknownAnyExpr, ExprResult> {
20947 RebuildUnknownAnyExpr(Sema &S, QualType
CastType)
20951 llvm_unreachable(
"unexpected statement!");
20961 ExprResult VisitObjCMessageExpr(ObjCMessageExpr *E);
20965 template <
class T>
ExprResult rebuildSugarExpr(
T *E) {
20966 ExprResult SubResult = Visit(E->getSubExpr());
20968 Expr *SubExpr = SubResult.
get();
20969 E->setSubExpr(SubExpr);
20970 E->setType(SubExpr->
getType());
20977 return rebuildSugarExpr(E);
20980 ExprResult VisitUnaryExtension(UnaryOperator *E) {
20981 return rebuildSugarExpr(E);
20984 ExprResult VisitUnaryAddrOf(UnaryOperator *E) {
20985 const PointerType *Ptr = DestType->
getAs<PointerType>();
21010 ExprResult VisitImplicitCastExpr(ImplicitCastExpr *E);
21012 ExprResult resolveDecl(Expr *E, ValueDecl *VD);
21018 ExprResult VisitDeclRefExpr(DeclRefExpr *E) {
21019 return resolveDecl(E, E->
getDecl());
21025ExprResult RebuildUnknownAnyExpr::VisitCallExpr(CallExpr *E) {
21030 FK_FunctionPointer,
21035 QualType CalleeType = CalleeExpr->
getType();
21038 Kind = FK_MemberFunction;
21040 }
else if (
const PointerType *Ptr = CalleeType->
getAs<PointerType>()) {
21042 Kind = FK_FunctionPointer;
21045 Kind = FK_BlockPointer;
21047 const FunctionType *FnType = CalleeType->
castAs<FunctionType>();
21052 unsigned diagID = diag::err_func_returning_array_function;
21053 if (Kind == FK_BlockPointer)
21054 diagID = diag::err_block_returning_array_function;
21067 const FunctionProtoType *Proto = dyn_cast<FunctionProtoType>(FnType);
21089 SmallVector<QualType, 8> ArgTypes;
21090 if (ParamTypes.empty() && Proto->
isVariadic()) {
21092 for (
unsigned i = 0, e = E->
getNumArgs(); i != e; ++i) {
21095 ParamTypes = ArgTypes;
21106 case FK_MemberFunction:
21110 case FK_FunctionPointer:
21114 case FK_BlockPointer:
21120 ExprResult CalleeResult = Visit(CalleeExpr);
21128ExprResult RebuildUnknownAnyExpr::VisitObjCMessageExpr(ObjCMessageExpr *E) {
21131 S.
Diag(E->
getExprLoc(), diag::err_func_returning_array_function)
21139 Method->setReturnType(DestType);
21149ExprResult RebuildUnknownAnyExpr::VisitImplicitCastExpr(ImplicitCastExpr *E) {
21151 if (E->
getCastKind() == CK_FunctionToPointerDecay) {
21165 }
else if (E->
getCastKind() == CK_LValueToRValue) {
21182 llvm_unreachable(
"Unhandled cast type!");
21186ExprResult RebuildUnknownAnyExpr::resolveDecl(Expr *E, ValueDecl *VD) {
21188 QualType
Type = DestType;
21193 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(VD)) {
21194 if (
const PointerType *Ptr =
Type->getAs<PointerType>()) {
21202 if (!
Type->isFunctionType()) {
21207 if (
const FunctionProtoType *FT =
Type->getAs<FunctionProtoType>()) {
21211 QualType FDT = FD->getType();
21212 const FunctionType *FnType = FDT->
castAs<FunctionType>();
21213 const FunctionProtoType *Proto = dyn_cast_or_null<FunctionProtoType>(FnType);
21214 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E);
21215 if (DRE && Proto && Proto->getParamTypes().empty() && Proto->isVariadic()) {
21216 SourceLocation Loc = FD->getLocation();
21218 S.
Context, FD->getDeclContext(), Loc, Loc,
21219 FD->getNameInfo().getName(), DestType, FD->getTypeSourceInfo(),
21221 false , FD->hasPrototype(),
21224 if (FD->getQualifier())
21227 SmallVector<ParmVarDecl*, 16> Params;
21228 for (
const auto &AI : FT->param_types()) {
21229 ParmVarDecl *Param =
21232 Params.push_back(Param);
21234 NewFD->setParams(Params);
21240 if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD))
21241 if (MD->isInstance()) {
21252 if (
const ReferenceType *RefTy =
Type->getAs<ReferenceType>()) {
21253 Type = RefTy->getPointeeType();
21254 }
else if (
Type->isFunctionType()) {
21255 S.
Diag(E->
getExprLoc(), diag::err_unknown_any_var_function_type)
21281 diag::err_typecheck_cast_to_incomplete))
21296 return RebuildUnknownAnyExpr(*
this, ToType).Visit(E);
21303 ExplicitCastExpr *castArg = dyn_cast<ExplicitCastExpr>(arg->IgnoreParens());
21312 assert(!arg->hasPlaceholderType());
21324 unsigned diagID = diag::err_uncasted_use_of_unknown_any;
21327 if (
CallExpr *call = dyn_cast<CallExpr>(E)) {
21328 E = call->getCallee();
21329 diagID = diag::err_uncasted_call_of_unknown_any;
21337 if (
DeclRefExpr *ref = dyn_cast<DeclRefExpr>(E)) {
21338 loc = ref->getLocation();
21339 d = ref->getDecl();
21340 }
else if (
MemberExpr *mem = dyn_cast<MemberExpr>(E)) {
21341 loc = mem->getMemberLoc();
21342 d = mem->getMemberDecl();
21344 diagID = diag::err_uncasted_call_of_unknown_any;
21345 loc = msg->getSelectorStartLoc();
21346 d = msg->getMethodDecl();
21348 S.
Diag(loc, diag::err_uncasted_send_to_unknown_any_method)
21349 <<
static_cast<unsigned>(msg->isClassMessage()) << msg->getSelector()
21367 if (!placeholderType)
return E;
21369 switch (placeholderType->
getKind()) {
21370 case BuiltinType::UnresolvedTemplate: {
21383 if (
auto *TD = dyn_cast<TemplateDecl>(Temp))
21384 TN =
Context.getQualifiedTemplateName(NNS, ULE->hasTemplateKeyword(),
21389 Diag(NameInfo.
getLoc(), diag::err_template_kw_refers_to_type_template)
21390 << TN << ULE->getSourceRange() << IsTypeAliasTemplateDecl;
21392 << IsTypeAliasTemplateDecl;
21395 bool HasAnyDependentTA =
false;
21397 HasAnyDependentTA |= Arg.getArgument().
isDependent();
21409 TST =
Context.getTemplateSpecializationType(
21418 case BuiltinType::Overload: {
21438 case BuiltinType::BoundMember: {
21444 PD =
PDiag(diag::err_dtor_expr_without_call) << 1;
21445 }
else if (
const auto *ME = dyn_cast<MemberExpr>(BME)) {
21446 if (ME->getMemberNameInfo().getName().getNameKind() ==
21448 PD =
PDiag(diag::err_dtor_expr_without_call) << 0;
21456 case BuiltinType::ARCUnbridgedCast: {
21463 case BuiltinType::UnknownAny:
21467 case BuiltinType::PseudoObject:
21470 case BuiltinType::BuiltinFn: {
21475 unsigned BuiltinID = FD->getBuiltinID();
21476 if (BuiltinID == Builtin::BI__noop) {
21478 CK_BuiltinFnToFnPtr)
21485 if (
Context.BuiltinInfo.isInStdNamespace(BuiltinID)) {
21491 ? diag::err_use_of_unaddressable_function
21492 : diag::warn_cxx20_compat_use_of_unaddressable_function);
21493 if (FD->isImplicitlyInstantiable()) {
21520 case BuiltinType::IncompleteMatrixIdx:
21524 diag::err_matrix_incomplete_index);
21528 case BuiltinType::ArraySection:
21537 case BuiltinType::OMPArrayShaping:
21540 case BuiltinType::OMPIterator:
21544#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
21545 case BuiltinType::Id:
21546#include "clang/Basic/OpenCLImageTypes.def"
21547#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
21548 case BuiltinType::Id:
21549#include "clang/Basic/OpenCLExtensionTypes.def"
21550#define SVE_TYPE(Name, Id, SingletonId) \
21551 case BuiltinType::Id:
21552#include "clang/Basic/AArch64ACLETypes.def"
21553#define PPC_VECTOR_TYPE(Name, Id, Size) \
21554 case BuiltinType::Id:
21555#include "clang/Basic/PPCTypes.def"
21556#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
21557#include "clang/Basic/RISCVVTypes.def"
21558#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
21559#include "clang/Basic/WebAssemblyReferenceTypes.def"
21560#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
21561#include "clang/Basic/AMDGPUTypes.def"
21562#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
21563#include "clang/Basic/HLSLIntangibleTypes.def"
21564#define BUILTIN_TYPE(Id, SingletonId) case BuiltinType::Id:
21565#define PLACEHOLDER_TYPE(Id, SingletonId)
21566#include "clang/AST/BuiltinTypes.def"
21570 llvm_unreachable(
"invalid placeholder type!");
21583 if (!
Context.getLangOpts().RecoveryAST)
21589 if (
T.isNull() ||
T->isUndeducedType() ||
21590 !
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
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 }.
Stmt * getStmtExprResult()
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 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...
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.
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
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 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...
PoppedFunctionScopePtr PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, const Decl *D=nullptr, QualType BlockType=QualType())
Pop a function (or block or lambda or captured region) scope from the stack.
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...
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)
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...
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
NamedDecl * getCurFunctionOrMethodDecl() const
getCurFunctionOrMethodDecl - Return the Decl for the current ObjC method or C function we're in,...
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.
std::optional< sema::TemplateDeductionInfo * > isSFINAEContext() const
Determines whether we are currently in a context where template argument substitution failures are no...
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 InstantiateInClassInitializer(SourceLocation PointOfInstantiation, FieldDecl *Instantiation, FieldDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs)
Instantiate the definition of a field from the given pattern.
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReciever=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
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)
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...
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 llvm intrinsics such as llvm.convert.to.fp16 should be used to convert to and from __fp...
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 on 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 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.