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)
194 if (!DowngradeWarning && UsedFn)
197 S.
Diag(Loc, DowngradeWarning ? diag::ext_internal_in_extern_inline_quiet
198 : diag::ext_internal_in_extern_inline)
213 Diag(DeclBegin, diag::note_convert_inline_to_static)
220 bool ObjCPropertyAccess,
221 bool AvoidPartialAvailabilityChecks,
223 bool SkipTrailingRequiresClause) {
230 for (
const auto &[DiagLoc, PD] : Pos->second) {
244 Diag(Loc, diag::ext_main_used);
252 Diag(Loc, diag::err_binding_cannot_appear_in_own_initializer)
255 Diag(Loc, diag::err_auto_variable_cannot_appear_in_own_initializer)
264 if (FD->isDeleted()) {
265 auto *Ctor = dyn_cast<CXXConstructorDecl>(FD);
266 if (Ctor && Ctor->isInheritingConstructor())
267 Diag(Loc, diag::err_deleted_inherited_ctor_use)
269 << Ctor->getInheritedConstructor().getConstructor()->getParent();
272 Diag(Loc, diag::err_deleted_function_use)
273 << (Msg !=
nullptr) << (Msg ? Msg->
getString() : StringRef());
287 if (!SkipTrailingRequiresClause && FD->getTrailingRequiresClause()) {
296 diag::err_reference_to_function_with_unsatisfied_constraints)
314 if (
auto *
Concept = dyn_cast<ConceptDecl>(D);
318 if (
auto *MD = dyn_cast<CXXMethodDecl>(D)) {
320 if (MD->getParent()->isLambda() &&
323 MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator())) {
324 Diag(Loc, diag::warn_cxx17_compat_lambda_def_ctor_assign)
329 auto getReferencedObjCProp = [](
const NamedDecl *D) ->
331 if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D))
332 return MD->findPropertyDecl();
346 auto *DRD = dyn_cast<OMPDeclareReductionDecl>(
CurContext);
349 Diag(Loc, diag::err_omp_wrong_var_in_declare_reduction)
362 Diag(Loc, diag::err_omp_declare_mapper_wrong_var)
368 if (
const auto *EmptyD = dyn_cast<UnresolvedUsingIfExistsDecl>(D)) {
369 Diag(Loc, diag::err_use_of_empty_using_if_exists);
370 Diag(EmptyD->getLocation(), diag::note_empty_using_if_exists_here);
375 AvoidPartialAvailabilityChecks, ClassReceiver);
381 if (D->
hasAttr<AvailableOnlyInDefaultEvalMethodAttr>()) {
384 PP.getLastFPEvalPragmaLocation().isValid() &&
385 PP.getCurrentFPEvalMethod() !=
getLangOpts().getFPEvalMethod())
387 diag::err_type_available_only_in_default_eval_method)
391 if (
auto *VD = dyn_cast<ValueDecl>(D))
396 if (!
Context.getTargetInfo().isTLSSupported())
397 if (
const auto *VD = dyn_cast<VarDecl>(D))
399 targetDiag(*Locs.begin(), diag::err_thread_unsupported);
407 const SentinelAttr *
Attr = D->
getAttr<SentinelAttr>();
412 unsigned NumFormalParams;
416 enum { CK_Function, CK_Method, CK_Block } CalleeKind;
418 if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D)) {
419 NumFormalParams = MD->param_size();
420 CalleeKind = CK_Method;
421 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
422 NumFormalParams = FD->param_size();
423 CalleeKind = CK_Function;
424 }
else if (
const auto *VD = dyn_cast<VarDecl>(D)) {
431 CalleeKind = CK_Function;
434 CalleeKind = CK_Block;
439 if (
const auto *proto = dyn_cast<FunctionProtoType>(Fn))
440 NumFormalParams = proto->getNumParams();
451 unsigned NullPos =
Attr->getNullPos();
452 assert((NullPos == 0 || NullPos == 1) &&
"invalid null position on sentinel");
453 NumFormalParams = (NullPos > NumFormalParams ? 0 : NumFormalParams - NullPos);
456 unsigned NumArgsAfterSentinel =
Attr->getSentinel();
460 if (Args.size() < NumFormalParams + NumArgsAfterSentinel + 1) {
467 const Expr *SentinelExpr = Args[Args.size() - NumArgsAfterSentinel - 1];
472 if (
Context.isSentinelNullExpr(SentinelExpr))
480 std::string NullValue;
481 if (CalleeKind == CK_Method &&
PP.isMacroDefined(
"nil"))
484 NullValue =
"nullptr";
485 else if (
PP.isMacroDefined(
"NULL"))
488 NullValue =
"(void*) 0";
491 Diag(Loc, diag::warn_missing_sentinel) <<
int(CalleeKind);
493 Diag(MissingNilLoc, diag::warn_missing_sentinel)
518 assert(!Ty.
isNull() &&
"DefaultFunctionArrayConversion - missing type");
522 if (
auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl()))
527 CK_FunctionToPointerDecay).
get();
542 CK_ArrayToPointerDecay);
558 if (UO && UO->getOpcode() == UO_Deref &&
559 UO->getSubExpr()->getType()->isPointerType()) {
561 UO->getSubExpr()->getType()->getPointeeType().getAddressSpace();
564 UO->getSubExpr()->IgnoreParenCasts()->isNullPointerConstant(
566 !UO->getType().isVolatileQualified()) {
568 S.
PDiag(diag::warn_indirection_through_null)
569 << UO->getSubExpr()->getSourceRange());
571 S.
PDiag(diag::note_indirection_through_null));
591 BaseType = BaseType->getPointeeType();
603 if (ObjectSetClass) {
647 assert(!
T.isNull() &&
"r-value conversion on typeless expression?");
651 if (
T->canDecayToPointerType())
657 if (
T ==
Context.OverloadTy ||
T->isRecordType() ||
658 (
T->isDependentType() && !
T->isAnyPointerType() &&
659 !
T->isMemberPointerType()))
683 &
Context.Idents.get(
"object_getClass"),
689 SourceRange(OISA->getOpLoc(), OISA->getIsaMemberLoc()),
")");
706 if (
T.hasQualifiers())
707 T =
T.getUnqualifiedType();
710 if (
T->isMemberPointerType() &&
711 Context.getTargetInfo().getCXXABI().isMicrosoft())
722 Cleanup.setExprNeedsCleanups(
true);
725 Cleanup.setExprNeedsCleanups(
true);
732 CastKind CK =
T->isNullPtrType() ? CK_NullToPointer : CK_LValueToRValue;
740 T =
Atomic->getValueType().getUnqualifiedType();
765 CK_FunctionToPointerDecay);
779 assert(!Ty.
isNull() &&
"UsualUnaryFPConversions - missing type");
785 PP.getLastFPEvalPragmaLocation().isValid())) {
786 switch (EvalMethod) {
788 llvm_unreachable(
"Unrecognized float evaluation method");
791 llvm_unreachable(
"Float evaluation method should be set by now");
799 CK_FloatingComplexCast)
808 CK_FloatingComplexCast)
840 assert(!Ty.
isNull() &&
"UsualUnaryConversions - missing type");
864 if (
Context.isPromotableIntegerType(Ty)) {
879 assert(!Ty.
isNull() &&
"DefaultArgumentPromotion - missing type");
891 if (BTy && (BTy->
getKind() == BuiltinType::Half ||
892 BTy->
getKind() == BuiltinType::Float)) {
895 if (BTy->
getKind() == BuiltinType::Half) {
906 Context.getTypeSizeInChars(BTy) <
912 assert(8 ==
Context.getTypeSizeInChars(
Context.LongLongTy).getQuantity() &&
913 "Unexpected typesize for LongLongTy");
967 if (
Context.getTargetInfo().getTriple().isWasm() &&
982 if (!
Record->hasNonTrivialCopyConstructor() &&
983 !
Record->hasNonTrivialMoveConstructor() &&
984 !
Record->hasNonTrivialDestructor())
1017 PDiag(diag::warn_cxx98_compat_pass_non_pod_arg_to_vararg) << Ty << CT);
1024 PDiag(diag::warn_pass_class_arg_to_vararg)
1032 PDiag(diag::warn_cannot_pass_non_pod_arg_to_vararg)
1039 diag::err_cannot_pass_non_trivial_c_struct_to_vararg)
1043 PDiag(diag::err_cannot_pass_objc_interface_to_vararg)
1056 if (PlaceholderTy->getKind() == BuiltinType::ARCUnbridgedCast &&
1058 (FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>()))) {
1097 if (
Call.isInvalid())
1102 if (Comma.isInvalid())
1109 diag::err_call_incomplete_argument))
1127 if (SkipCast)
return false;
1134 CK_IntegralComplexToFloatingComplex);
1152 bool PromotePrecision) {
1157 if (PromotePrecision) {
1162 if (LongerIsComplex)
1174 QualType RHSType,
bool IsCompAssign) {
1199 bool ConvertFloat,
bool ConvertInt) {
1204 CK_IntegralToFloating);
1215 CK_IntegralComplexToFloatingComplex);
1220 CK_FloatingRealToComplex);
1229 QualType RHSType,
bool IsCompAssign) {
1239 else if (!IsCompAssign)
1241 return LHSFloat ? LHSType : RHSType;
1246 if (LHSFloat && RHSFloat) {
1253 assert(order < 0 &&
"illegal float comparison");
1287 QualType LHSElem = LHSComplex ? LHSComplex->getElementType() : LHSType;
1293 if ((&LHSSem != &llvm::APFloat::PPCDoubleDouble() ||
1294 &RHSSem != &llvm::APFloat::IEEEquad()) &&
1295 (&LHSSem != &llvm::APFloat::IEEEquad() ||
1296 &RHSSem != &llvm::APFloat::PPCDoubleDouble()))
1313 CK_IntegralComplexCast);
1319template <PerformCastFn doLHSCast, PerformCastFn doRHSCast>
1322 QualType RHSType,
bool IsCompAssign) {
1327 if (LHSSigned == RHSSigned) {
1330 RHS = (*doRHSCast)(S, RHS.
get(), LHSType);
1332 }
else if (!IsCompAssign)
1333 LHS = (*doLHSCast)(S, LHS.
get(), RHSType);
1335 }
else if (order != (LHSSigned ? 1 : -1)) {
1339 RHS = (*doRHSCast)(S, RHS.
get(), LHSType);
1341 }
else if (!IsCompAssign)
1342 LHS = (*doLHSCast)(S, LHS.
get(), RHSType);
1349 RHS = (*doRHSCast)(S, RHS.
get(), LHSType);
1351 }
else if (!IsCompAssign)
1352 LHS = (*doLHSCast)(S, LHS.
get(), RHSType);
1361 RHS = (*doRHSCast)(S, RHS.
get(), result);
1363 LHS = (*doLHSCast)(S, LHS.
get(), result);
1373 bool IsCompAssign) {
1377 if (LHSComplexInt && RHSComplexInt) {
1382 (S, LHS, RHS, LHSEltType, RHSEltType, IsCompAssign);
1387 if (LHSComplexInt) {
1391 (S, LHS, RHS, LHSEltType, RHSType, IsCompAssign);
1394 CK_IntegralRealToComplex);
1399 assert(RHSComplexInt);
1404 (S, LHS, RHS, LHSType, RHSEltType, IsCompAssign);
1409 CK_IntegralRealToComplex);
1418 assert(BTy &&
"Expected a builtin type.");
1420 switch (BTy->getKind()) {
1421 case BuiltinType::ShortFract:
1422 case BuiltinType::UShortFract:
1423 case BuiltinType::SatShortFract:
1424 case BuiltinType::SatUShortFract:
1426 case BuiltinType::Fract:
1427 case BuiltinType::UFract:
1428 case BuiltinType::SatFract:
1429 case BuiltinType::SatUFract:
1431 case BuiltinType::LongFract:
1432 case BuiltinType::ULongFract:
1433 case BuiltinType::SatLongFract:
1434 case BuiltinType::SatULongFract:
1436 case BuiltinType::ShortAccum:
1437 case BuiltinType::UShortAccum:
1438 case BuiltinType::SatShortAccum:
1439 case BuiltinType::SatUShortAccum:
1441 case BuiltinType::Accum:
1442 case BuiltinType::UAccum:
1443 case BuiltinType::SatAccum:
1444 case BuiltinType::SatUAccum:
1446 case BuiltinType::LongAccum:
1447 case BuiltinType::ULongAccum:
1448 case BuiltinType::SatLongAccum:
1449 case BuiltinType::SatULongAccum:
1452 if (BTy->isInteger())
1454 llvm_unreachable(
"Unexpected fixed point or integer type");
1466 "Expected at least one of the operands to be a fixed point type");
1469 "Special fixed point arithmetic operation conversions are only "
1470 "applied to ints or other fixed point types");
1492 QualType ResultTy = LHSTyRank > RHSTyRank ? LHSTy : RHSTy;
1515 REnum = R->isUnscopedEnumerationType();
1517 if ((!IsCompAssign && LEnum && R->isFloatingType()) ||
1521 ? diag::warn_arith_conv_enum_float_cxx20
1522 : diag::warn_arith_conv_enum_float)
1525 }
else if (!IsCompAssign && LEnum && REnum &&
1526 !
Context.hasSameUnqualifiedType(L, R)) {
1531 DiagID = diag::warn_conv_mixed_enum_types_cxx26;
1534 ->hasNameForLinkage() ||
1535 !R->castAsCanonical<EnumType>()
1537 ->hasNameForLinkage()) {
1542 ? diag::warn_arith_conv_mixed_anon_enum_types_cxx20
1543 : diag::warn_arith_conv_mixed_anon_enum_types;
1548 ? diag::warn_conditional_mixed_enum_types_cxx20
1549 : diag::warn_conditional_mixed_enum_types;
1554 ? diag::warn_comparison_mixed_enum_types_cxx20
1555 : diag::warn_comparison_mixed_enum_types;
1558 ? diag::warn_arith_conv_mixed_enum_types_cxx20
1559 : diag::warn_arith_conv_mixed_enum_types;
1562 << (int)ACK << L << R;
1580 auto IsSingleCodeUnitCP = [](
const QualType &
T,
const llvm::APSInt &
Value) {
1581 if (
T->isChar8Type())
1582 return llvm::IsSingleCodeUnitUTF8Codepoint(
Value.getExtValue());
1583 if (
T->isChar16Type())
1584 return llvm::IsSingleCodeUnitUTF16Codepoint(
Value.getExtValue());
1585 assert(
T->isChar32Type());
1586 return llvm::IsSingleCodeUnitUTF32Codepoint(
Value.getExtValue());
1599 if (LHSSuccess != RHSuccess) {
1601 if (IsSingleCodeUnitCP(LHSType, Res.
Val.
getInt()) &&
1602 IsSingleCodeUnitCP(RHSType, Res.
Val.
getInt()))
1606 if (!LHSSuccess || !RHSuccess) {
1607 SemaRef.
Diag(Loc, diag::warn_comparison_unicode_mixed_types)
1613 llvm::APSInt LHSValue(32);
1615 llvm::APSInt RHSValue(32);
1618 bool LHSSafe = IsSingleCodeUnitCP(LHSType, LHSValue);
1619 bool RHSSafe = IsSingleCodeUnitCP(RHSType, RHSValue);
1620 if (LHSSafe && RHSSafe)
1623 SemaRef.
Diag(Loc, diag::warn_comparison_unicode_mixed_types_constant)
1633 SemaRef.
Diag(Loc, diag::warn_arith_conv_mixed_unicode_types)
1667 LHSType = AtomicLHS->getValueType();
1670 if (
Context.hasSameType(LHSType, RHSType))
1671 return Context.getCommonSugaredType(LHSType, RHSType);
1679 QualType LHSUnpromotedType = LHSType;
1680 if (
Context.isPromotableIntegerType(LHSType))
1681 LHSType =
Context.getPromotedIntegerType(LHSType);
1683 if (!LHSBitfieldPromoteTy.
isNull())
1684 LHSType = LHSBitfieldPromoteTy;
1689 if (
Context.hasSameType(LHSType, RHSType))
1690 return Context.getCommonSugaredType(LHSType, RHSType);
1729 bool PredicateIsExpr,
void *ControllingExprOrType,
1731 unsigned NumAssocs = ArgTypes.size();
1732 assert(NumAssocs == ArgExprs.size());
1735 for (
unsigned i = 0; i < NumAssocs; ++i) {
1744 if (!PredicateIsExpr) {
1748 assert(ControllingType &&
"couldn't get the type out of the parser");
1749 ControllingExprOrType = ControllingType;
1753 KeyLoc, DefaultLoc, RParenLoc, PredicateIsExpr, ControllingExprOrType,
1761 bool PredicateIsExpr,
void *ControllingExprOrType,
1763 unsigned NumAssocs = Types.size();
1764 assert(NumAssocs == Exprs.size());
1765 assert(ControllingExprOrType &&
1766 "Must have either a controlling expression or a controlling type");
1768 Expr *ControllingExpr =
nullptr;
1770 if (PredicateIsExpr) {
1777 reinterpret_cast<Expr *
>(ControllingExprOrType));
1780 ControllingExpr = R.
get();
1783 ControllingType =
reinterpret_cast<TypeSourceInfo *
>(ControllingExprOrType);
1784 if (!ControllingType)
1788 bool TypeErrorFound =
false,
1789 IsResultDependent = ControllingExpr
1792 ContainsUnexpandedParameterPack =
1802 diag::warn_side_effects_unevaluated_context);
1804 for (
unsigned i = 0; i < NumAssocs; ++i) {
1805 if (Exprs[i]->containsUnexpandedParameterPack())
1806 ContainsUnexpandedParameterPack =
true;
1809 if (Types[i]->
getType()->containsUnexpandedParameterPack())
1810 ContainsUnexpandedParameterPack =
true;
1812 if (Types[i]->
getType()->isDependentType()) {
1813 IsResultDependent =
true;
1830 if (ControllingExpr && Types[i]->
getType()->isIncompleteType())
1831 D =
LangOpts.C2y ? diag::warn_c2y_compat_assoc_type_incomplete
1832 : diag::ext_assoc_type_incomplete;
1833 else if (ControllingExpr && !Types[i]->
getType()->isObjectType())
1834 D = diag::err_assoc_type_nonobject;
1835 else if (Types[i]->
getType()->isVariablyModifiedType())
1836 D = diag::err_assoc_type_variably_modified;
1837 else if (ControllingExpr) {
1856 unsigned Reason = 0;
1865 Diag(Types[i]->getTypeLoc().getBeginLoc(),
1866 diag::warn_unreachable_association)
1867 << QT << (Reason - 1);
1871 Diag(Types[i]->getTypeLoc().getBeginLoc(), D)
1872 << Types[i]->getTypeLoc().getSourceRange() << Types[i]->getType();
1874 D, Types[i]->getTypeLoc().getBeginLoc()) >=
1876 TypeErrorFound =
true;
1881 for (
unsigned j = i+1; j < NumAssocs; ++j)
1882 if (Types[j] && !Types[j]->
getType()->isDependentType() &&
1883 Context.typesAreCompatible(Types[i]->getType(),
1884 Types[j]->getType())) {
1885 Diag(Types[j]->getTypeLoc().getBeginLoc(),
1886 diag::err_assoc_compatible_types)
1887 << Types[j]->getTypeLoc().getSourceRange()
1888 << Types[j]->getType()
1889 << Types[i]->getType();
1890 Diag(Types[i]->getTypeLoc().getBeginLoc(),
1891 diag::note_compat_assoc)
1892 << Types[i]->getTypeLoc().getSourceRange()
1893 << Types[i]->getType();
1894 TypeErrorFound =
true;
1904 if (IsResultDependent) {
1905 if (ControllingExpr)
1907 Types, Exprs, DefaultLoc, RParenLoc,
1908 ContainsUnexpandedParameterPack);
1910 Exprs, DefaultLoc, RParenLoc,
1911 ContainsUnexpandedParameterPack);
1915 unsigned DefaultIndex = std::numeric_limits<unsigned>::max();
1919 for (
unsigned i = 0; i < NumAssocs; ++i) {
1922 else if (ControllingExpr &&
1925 Types[i]->getType()))
1926 CompatIndices.push_back(i);
1927 else if (ControllingType &&
1930 Types[i]->getType()))
1931 CompatIndices.push_back(i);
1934 auto GetControllingRangeAndType = [](
Expr *ControllingExpr,
1938 if (ControllingExpr)
1947 return std::make_pair(SR, QT);
1953 if (CompatIndices.size() > 1) {
1954 auto P = GetControllingRangeAndType(ControllingExpr, ControllingType);
1957 << SR << P.second << (
unsigned)CompatIndices.size();
1958 for (
unsigned I : CompatIndices) {
1959 Diag(Types[I]->getTypeLoc().getBeginLoc(),
1960 diag::note_compat_assoc)
1961 << Types[I]->getTypeLoc().getSourceRange()
1962 << Types[I]->getType();
1970 if (DefaultIndex == std::numeric_limits<unsigned>::max() &&
1971 CompatIndices.size() == 0) {
1972 auto P = GetControllingRangeAndType(ControllingExpr, ControllingType);
1974 Diag(SR.
getBegin(), diag::err_generic_sel_no_match) << SR << P.second;
1983 unsigned ResultIndex =
1984 CompatIndices.size() ? CompatIndices[0] : DefaultIndex;
1986 if (ControllingExpr) {
1988 Context, KeyLoc, ControllingExpr, Types, Exprs, DefaultLoc, RParenLoc,
1989 ContainsUnexpandedParameterPack, ResultIndex);
1992 Context, KeyLoc, ControllingType, Types, Exprs, DefaultLoc, RParenLoc,
1993 ContainsUnexpandedParameterPack, ResultIndex);
1999 llvm_unreachable(
"unexpected TokenKind");
2000 case tok::kw___func__:
2002 case tok::kw___FUNCTION__:
2004 case tok::kw___FUNCDNAME__:
2006 case tok::kw___FUNCSIG__:
2008 case tok::kw_L__FUNCTION__:
2010 case tok::kw_L__FUNCSIG__:
2012 case tok::kw___PRETTY_FUNCTION__:
2023 return cast_or_null<Decl>(DC);
2041 assert(Args.size() <= 2 &&
"too many arguments for literal operator");
2044 for (
unsigned ArgIdx = 0; ArgIdx != Args.size(); ++ArgIdx) {
2045 ArgTy[ArgIdx] = Args[ArgIdx]->getType();
2046 if (ArgTy[ArgIdx]->isArrayType())
2067 std::vector<Token> ExpandedToks;
2073 if (Literal.hadError)
2077 for (
const Token &
Tok : StringToks)
2078 StringTokLocs.push_back(
Tok.getLocation());
2082 false, {}, StringTokLocs);
2084 if (!Literal.getUDSuffix().empty()) {
2087 Literal.getUDSuffixOffset());
2088 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_string_udl));
2108 CurrentDecl =
Context.getTranslationUnitDecl();
2110 std::vector<Token> ExpandedToks;
2111 ExpandedToks.reserve(Toks.size());
2115 ExpandedToks.emplace_back(
Tok);
2119 Diag(
Tok.getLocation(), diag::ext_predef_outside_function);
2121 Diag(
Tok.getLocation(), diag::ext_string_literal_from_predefined)
2124 llvm::raw_svector_ostream
OS(Str);
2125 Token &Exp = ExpandedToks.emplace_back();
2127 if (
Tok.getKind() == tok::kw_L__FUNCTION__ ||
2128 Tok.getKind() == tok::kw_L__FUNCSIG__) {
2130 Exp.
setKind(tok::wide_string_literal);
2132 Exp.
setKind(tok::string_literal);
2138 PP.CreateString(
OS.str(), Exp,
Tok.getLocation(),
Tok.getEndLoc());
2140 return ExpandedToks;
2145 assert(!StringToks.empty() &&
"Must have at least one string!");
2148 std::vector<Token> ExpandedToks;
2153 if (Literal.hadError)
2157 for (
const Token &
Tok : StringToks)
2158 StringTokLocs.push_back(
Tok.getLocation());
2162 if (Literal.isWide()) {
2163 CharTy =
Context.getWideCharType();
2165 }
else if (Literal.isUTF8()) {
2169 CharTy =
Context.UnsignedCharTy;
2171 }
else if (Literal.isUTF16()) {
2174 }
else if (Literal.isUTF32()) {
2177 }
else if (Literal.isPascal()) {
2178 CharTy =
Context.UnsignedCharTy;
2190 ? diag::warn_cxx20_compat_utf8_string
2191 : diag::warn_c23_compat_utf8_string);
2197 auto RemovalDiag =
PDiag(diag::note_cxx20_c23_compat_utf8_string_remove_u8);
2199 for (
const Token &
Tok : StringToks) {
2200 if (
Tok.getKind() == tok::utf8_string_literal) {
2202 RemovalDiagLoc =
Tok.getLocation();
2209 Diag(RemovalDiagLoc, RemovalDiag);
2213 Context.getStringLiteralArrayType(CharTy, Literal.GetNumStringChars());
2217 Context, Literal.GetString(), Kind, Literal.Pascal, StrTy, StringTokLocs);
2218 if (Literal.getUDSuffix().empty())
2225 Literal.getUDSuffixOffset());
2229 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_string_udl));
2236 Context.DeclarationNames.getCXXLiteralOperatorName(UDSuffix);
2241 Context.getArrayDecayedType(StrTy), SizeType
2251 llvm::APInt Len(
Context.getIntWidth(SizeType), Literal.GetNumStringChars());
2254 Expr *Args[] = { Lit, LenArg };
2271 unsigned CharBits =
Context.getIntWidth(CharTy);
2273 llvm::APSInt
Value(CharBits, CharIsUnsigned);
2279 for (
unsigned I = 0, N = Lit->
getLength(); I != N; ++I) {
2290 llvm_unreachable(
"unexpected literal operator lookup result");
2294 llvm_unreachable(
"unexpected literal operator lookup result");
2326 auto *DRE = dyn_cast<DeclRefExpr>(VD->
getInit());
2329 auto *Referee = dyn_cast<VarDecl>(DRE->getDecl());
2330 if (!Referee || !Referee->hasGlobalStorage() ||
2331 Referee->hasAttr<CUDADeviceAttr>())
2337 auto *MD = dyn_cast_or_null<CXXMethodDecl>(S.
CurContext);
2338 if (MD && MD->getParent()->isLambda() &&
2339 MD->getOverloadedOperator() == OO_Call && MD->hasAttr<CUDADeviceAttr>() &&
2361 if (
VarDecl *VD = dyn_cast<VarDecl>(D)) {
2362 if (VD->getType()->isReferenceType() &&
2365 VD->isUsableInConstantExpressions(
Context))
2384 Context, NNS, TemplateKWLoc, D, RefersToCapturedVariable, NameInfo, Ty,
2412 const auto *FD = dyn_cast<FieldDecl>(D);
2413 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(D))
2414 FD = IFD->getAnonField();
2418 if (FD->isBitField())
2424 if (
const auto *BD = dyn_cast<BindingDecl>(D))
2425 if (
const auto *BE = BD->getBinding())
2446 NameInfo =
Context.getNameForTemplate(TName, TNameLoc);
2447 TemplateArgs = &Buffer;
2450 TemplateArgs =
nullptr;
2458 bool isDefaultArgument =
2462 const auto *CurMethod = dyn_cast<CXXMethodDecl>(
CurContext);
2463 bool isInstance = CurMethod && CurMethod->isInstance() &&
2472 unsigned DiagID = diag::err_found_in_dependent_base;
2473 unsigned NoteID = diag::note_member_declared_at;
2475 DiagID =
getLangOpts().MSVCCompat ? diag::ext_found_later_in_class
2476 : diag::err_found_later_in_class;
2478 DiagID = diag::ext_found_in_dependent_base;
2479 NoteID = diag::note_dependent_member_use;
2495 Diag(D->getLocation(), NoteID);
2504 if (isDefaultArgument && ((*R.
begin())->isCXXInstanceMember())) {
2520 unsigned diagnostic = diag::err_undeclared_var_use;
2521 unsigned diagnostic_suggest = diag::err_undeclared_var_use_suggest;
2525 diagnostic = diag::err_undeclared_use;
2526 diagnostic_suggest = diag::err_undeclared_use_suggest;
2537 if (ExplicitTemplateArgs) {
2560 R.
addDecl(Best->FoundDecl.getDecl(), Best->FoundDecl.getAccess());
2575 if (S && (Corrected =
2579 bool DroppedSpecifier =
2583 bool AcceptableWithRecovery =
false;
2584 bool AcceptableWithoutRecovery =
false;
2593 dyn_cast<FunctionTemplateDecl>(CD))
2597 else if (
FunctionDecl *FD = dyn_cast<FunctionDecl>(CD))
2598 if (!ExplicitTemplateArgs || ExplicitTemplateArgs->
size() == 0)
2604 ND = Best->FoundDecl;
2605 Corrected.setCorrectionDecl(ND);
2609 Corrected.setCorrectionDecl(ND);
2637 AcceptableWithoutRecovery =
true;
2640 if (AcceptableWithRecovery || AcceptableWithoutRecovery) {
2642 ? diag::note_implicit_param_decl
2643 : diag::note_previous_decl;
2646 PDiag(NoteID), AcceptableWithRecovery);
2649 PDiag(diag::err_no_member_suggest)
2651 << DroppedSpecifier << NameRange,
2652 PDiag(NoteID), AcceptableWithRecovery);
2655 return !AcceptableWithRecovery;
2690 else if (
auto *MD = dyn_cast<CXXMethodDecl>(S.
CurContext))
2698 auto DB = S.
Diag(Loc, diag::ext_undeclared_unqual_id_with_dependent_base);
2699 DB << NameInfo.
getName() << RD;
2701 if (!ThisType.
isNull()) {
2704 Context,
nullptr, ThisType,
true,
2706 nullptr, NameInfo, TemplateArgs);
2722 bool HasTrailingLParen,
bool IsAddressOfOperand,
2724 bool IsInlineAsmIdentifier,
Token *KeywordReplacement) {
2725 assert(!(IsAddressOfOperand && HasTrailingLParen) &&
2726 "cannot be direct & operand and have a trailing lparen");
2755 if (
auto *VD = dyn_cast<ValueDecl>(R.
getFoundDecl())) {
2769 if (TemplateKWLoc.
isValid() || TemplateArgs) {
2777 false, TemplateKWLoc,
2783 IsAddressOfOperand, TemplateArgs);
2787 !IvarLookupFollowUp);
2793 IsAddressOfOperand, TemplateArgs);
2797 if (IvarLookupFollowUp) {
2812 if (R.
empty() && HasTrailingLParen && II &&
2822 if (R.
empty() && !ADL) {
2825 TemplateKWLoc, TemplateArgs))
2830 if (IsInlineAsmIdentifier)
2838 "Typo correction callback misconfigured");
2852 assert(!R.
empty() &&
2853 "DiagnoseEmptyLookup returned false but added no results");
2860 ExprResult E(
ObjC().LookupInObjCMethod(R, S, Ivar->getIdentifier()));
2870 assert(!R.
empty() || ADL);
2900 if (TemplateArgs || TemplateKWLoc.
isValid()) {
2909 "There should only be one declaration found.");
2937 if (
const auto *CD = dyn_cast<CXXRecordDecl>(DC))
2938 if (CD->isInvalidDecl())
2948 if (
auto *TagD = dyn_cast<TagDecl>(TD)) {
2955 TL.setNameLoc(NameInfo.
getLoc());
2956 }
else if (
auto *TypedefD = dyn_cast<TypedefNameDecl>(TD)) {
2964 ET =
SemaRef.Context.getTypeDeclType(TD);
2972 unsigned DiagID = diag::err_typename_missing;
2974 DiagID = diag::ext_typename_missing;
2976 auto D =
Diag(Loc, DiagID);
3007 const auto *RD = dyn_cast<CXXRecordDecl>(
Member->getDeclContext());
3015 bool PointerConversions =
false;
3017 DestRecordType =
Context.getCanonicalTagType(RD);
3019 DestRecordType =
Context.getAddrSpaceQualType(
3020 DestRecordType, FromPtrType
3025 DestType =
Context.getPointerType(DestRecordType);
3027 PointerConversions =
true;
3029 DestType = DestRecordType;
3030 FromRecordType = FromType;
3032 }
else if (
const auto *
Method = dyn_cast<CXXMethodDecl>(
Member)) {
3033 if (!
Method->isImplicitObjectMemberFunction())
3036 DestType =
Method->getThisType().getNonReferenceType();
3037 DestRecordType =
Method->getFunctionObjectParameterType();
3041 PointerConversions =
true;
3043 FromRecordType = FromType;
3044 DestType = DestRecordType;
3049 if (FromAS != DestAS) {
3051 Context.removeAddrSpaceQualType(FromRecordType);
3053 Context.getAddrSpaceQualType(FromRecordTypeWithoutAS, DestAS);
3054 if (PointerConversions)
3055 FromTypeWithDestAS =
Context.getPointerType(FromTypeWithDestAS);
3069 if (
Context.hasSameUnqualifiedType(FromRecordType, DestRecordType))
3097 assert(QType->
isRecordType() &&
"lookup done with non-record type");
3107 FromLoc, FromRange, &BasePath))
3110 if (PointerConversions)
3111 QType =
Context.getPointerType(QType);
3113 VK, &BasePath).
get();
3116 FromRecordType = QRecordType;
3120 if (
Context.hasSameUnqualifiedType(FromRecordType, DestRecordType))
3127 FromLoc, FromRange, &BasePath,
3136 DestType =
Context.getQualifiedType(DestType, FromTypeQuals);
3144 bool HasTrailingLParen) {
3146 if (!HasTrailingLParen)
3164 if (D->isCXXClassMember())
3175 else if (D->getLexicalDeclContext()->isFunctionOrMethod())
3182 if (
const auto *FDecl = dyn_cast<FunctionDecl>(D)) {
3184 if (FDecl->getBuiltinID() && FDecl->isImplicit())
3199 bool AcceptInvalid) {
3225 const auto *FD = dyn_cast<FunctionDecl>(R.
getFoundDecl());
3227 (FD->isCPUDispatchMultiVersion() || FD->isCPUSpecificMultiVersion());
3232 bool AcceptInvalidDecl) {
3266 bool AcceptInvalidDecl) {
3267 assert(D &&
"Cannot refer to a NULL declaration");
3269 "Cannot refer unambiguously to a function template");
3288 Diag(Loc, diag::err_ref_non_value) << D << SS.
getRange();
3303 if (VD->isInvalidDecl() && !AcceptInvalidDecl)
3309 if (
auto *IndirectField = dyn_cast<IndirectFieldDecl>(VD);
3310 IndirectField && !IndirectField->isCXXClassMember())
3322 type =
type.getNonPackExpansionType();
3326#define ABSTRACT_DECL(kind)
3327#define VALUE(type, base)
3328#define DECL(type, base) case Decl::type:
3329#include "clang/AST/DeclNodes.inc"
3330 llvm_unreachable(
"invalid value decl kind");
3333 case Decl::ObjCAtDefsField:
3334 llvm_unreachable(
"forming non-member reference to ivar?");
3338 case Decl::EnumConstant:
3339 case Decl::UnresolvedUsingValue:
3340 case Decl::OMPDeclareReduction:
3341 case Decl::OMPDeclareMapper:
3350 case Decl::IndirectField:
3351 case Decl::ObjCIvar:
3353 "building reference to field in C?");
3363 case Decl::NonTypeTemplateParm: {
3365 type = reftype->getPointeeType();
3375 if (
type->isRecordType()) {
3376 type =
type.getUnqualifiedType().withConst();
3389 case Decl::VarTemplateSpecialization:
3390 case Decl::VarTemplatePartialSpecialization:
3391 case Decl::Decomposition:
3393 case Decl::OMPCapturedExpr:
3396 type->isVoidType()) {
3402 case Decl::ImplicitParam:
3403 case Decl::ParmVar: {
3413 if (!CapturedType.
isNull())
3414 type = CapturedType;
3419 case Decl::Function: {
3421 if (!
Context.BuiltinInfo.isDirectlyAddressable(BID)) {
3458 case Decl::CXXDeductionGuide:
3459 llvm_unreachable(
"building reference to deduction guide");
3461 case Decl::MSProperty:
3463 case Decl::TemplateParamObject:
3469 case Decl::UnnamedGlobalConstant:
3473 case Decl::CXXMethod:
3478 dyn_cast<FunctionProtoType>(VD->getType()))
3479 if (proto->getReturnType() ==
Context.UnknownAnyTy) {
3492 case Decl::CXXConversion:
3493 case Decl::CXXDestructor:
3494 case Decl::CXXConstructor:
3506 if (VD->isInvalidDecl() && E)
3513 Target.resize(CharByteWidth * (Source.size() + 1));
3514 char *ResultPtr = &
Target[0];
3515 const llvm::UTF8 *ErrorPtr;
3517 llvm::ConvertUTF8toWide(CharByteWidth, Source, ResultPtr, ErrorPtr);
3527 Diag(Loc, diag::ext_predef_outside_function);
3528 currentDecl =
Context.getTranslationUnitDecl();
3538 bool ForceElaboratedPrinting =
3542 unsigned Length = Str.length();
3544 llvm::APInt LengthI(32, Length + 1);
3548 Context.adjustStringLiteralBaseType(
Context.WideCharTy.withConst());
3552 ResTy =
Context.getConstantArrayType(ResTy, LengthI,
nullptr,
3558 ResTy =
Context.adjustStringLiteralBaseType(
Context.CharTy.withConst());
3559 ResTy =
Context.getConstantArrayType(ResTy, LengthI,
nullptr,
3578 StringRef ThisTok =
PP.getSpelling(
Tok, CharBuffer, &
Invalid);
3584 if (Literal.hadError())
3588 if (Literal.isWide())
3594 else if (Literal.isUTF16())
3596 else if (Literal.isUTF32())
3605 if (Literal.isWide())
3607 else if (Literal.isUTF16())
3609 else if (Literal.isUTF32())
3611 else if (Literal.isUTF8())
3617 if (Literal.getUDSuffix().empty())
3627 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_character_udl));
3632 Lit,
Tok.getLocation());
3636 unsigned IntSize =
Context.getTargetInfo().getIntWidth();
3638 llvm::APInt(IntSize, Val,
true),
3646 using llvm::APFloat;
3647 APFloat Val(Format);
3650 if (RM == llvm::RoundingMode::Dynamic)
3651 RM = llvm::RoundingMode::NearestTiesToEven;
3652 APFloat::opStatus result = Literal.GetFloatValue(Val, RM);
3656 if ((result & APFloat::opOverflow) ||
3657 ((result & APFloat::opUnderflow) && Val.isZero())) {
3658 unsigned diagnostic;
3660 if (result & APFloat::opOverflow) {
3661 diagnostic = diag::warn_float_overflow;
3662 APFloat::getLargest(Format).toString(buffer);
3664 diagnostic = diag::warn_float_underflow;
3665 APFloat::getSmallest(Format).toString(buffer);
3668 S.
Diag(Loc, diagnostic) << Ty << buffer.str();
3671 bool isExact = (result == APFloat::opOK);
3676 assert(E &&
"Invalid expression");
3683 Diag(E->
getExprLoc(), diag::err_pragma_loop_invalid_argument_type) << QT;
3687 llvm::APSInt ValueAPS;
3698 bool ValueIsPositive =
3699 AllowZero ? ValueAPS.isNonNegative() : ValueAPS.isStrictlyPositive();
3700 if (!ValueIsPositive || ValueAPS.getActiveBits() > 31) {
3702 <<
toString(ValueAPS, 10) << ValueIsPositive;
3712 if (
Tok.getLength() == 1 ||
Tok.getKind() == tok::binary_data) {
3713 const uint8_t Val =
PP.getSpellingOfSingleCharacterNumericConstant(
Tok);
3722 SpellingBuffer.resize(
Tok.getLength() + 1);
3726 StringRef TokSpelling =
PP.getSpelling(
Tok, SpellingBuffer, &
Invalid);
3731 PP.getSourceManager(),
PP.getLangOpts(),
3732 PP.getTargetInfo(),
PP.getDiagnostics());
3733 if (Literal.hadError)
3736 if (Literal.hasUDSuffix()) {
3744 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_numeric_udl));
3747 if (Literal.isFloatingLiteral()) {
3751 CookedTy =
Context.LongDoubleTy;
3756 CookedTy =
Context.UnsignedLongLongTy;
3760 Context.DeclarationNames.getCXXLiteralOperatorName(UDSuffix);
3772 !Literal.isImaginary)) {
3781 if (Literal.isFloatingLiteral()) {
3784 llvm::APInt ResultVal(
Context.getTargetInfo().getLongLongWidth(), 0);
3785 if (Literal.GetIntegerValue(ResultVal))
3786 Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
3798 unsigned Length = Literal.getUDSuffixOffset();
3805 false, StrTy, TokLoc);
3816 bool CharIsUnsigned =
Context.CharTy->isUnsignedIntegerType();
3817 llvm::APSInt
Value(CharBits, CharIsUnsigned);
3818 for (
unsigned I = 0, N = Literal.getUDSuffixOffset(); I != N; ++I) {
3819 Value = TokSpelling[I];
3827 llvm_unreachable(
"unexpected literal operator lookup result");
3833 if (Literal.isFixedPointLiteral()) {
3836 if (Literal.isAccum) {
3837 if (Literal.isHalf) {
3839 }
else if (Literal.isLong) {
3844 }
else if (Literal.isFract) {
3845 if (Literal.isHalf) {
3847 }
else if (Literal.isLong) {
3854 if (Literal.isUnsigned) Ty =
Context.getCorrespondingUnsignedType(Ty);
3856 bool isSigned = !Literal.isUnsigned;
3857 unsigned scale =
Context.getFixedPointScale(Ty);
3858 unsigned bit_width =
Context.getTypeInfo(Ty).Width;
3860 llvm::APInt Val(bit_width, 0, isSigned);
3861 bool Overflowed = Literal.GetFixedPointValue(Val, scale);
3862 bool ValIsZero = Val.isZero() && !Overflowed;
3864 auto MaxVal =
Context.getFixedPointMax(Ty).getValue();
3865 if (Literal.isFract && Val == MaxVal + 1 && !ValIsZero)
3871 else if (Val.ugt(MaxVal) || Overflowed)
3872 Diag(
Tok.getLocation(), diag::err_too_large_for_fixed_point);
3875 Tok.getLocation(), scale);
3876 }
else if (Literal.isFloatingLiteral()) {
3878 if (Literal.isHalf){
3883 Diag(
Tok.getLocation(), diag::err_half_const_requires_fp16);
3886 }
else if (Literal.isFloat)
3888 else if (Literal.isLong)
3890 else if (Literal.isFloat16)
3892 else if (Literal.isFloat128)
3909 Diag(
Tok.getLocation(), diag::warn_double_const_requires_fp64)
3914 }
else if (!Literal.isIntegerLiteral()) {
3920 if (Literal.isSizeT)
3923 ? diag::warn_cxx20_compat_size_t_suffix
3924 : diag::ext_cxx23_size_t_suffix
3925 : diag::err_cxx23_size_t_suffix);
3932 if (Literal.isBitInt)
3933 PP.Diag(
Tok.getLocation(),
3936 : diag::ext_c23_bitint_suffix);
3945 unsigned BitsNeeded =
Context.getTargetInfo().getIntMaxTWidth();
3946 if (Literal.isBitInt)
3947 BitsNeeded = llvm::APInt::getSufficientBitsNeeded(
3948 Literal.getLiteralDigits(), Literal.getRadix());
3949 if (Literal.MicrosoftInteger) {
3950 if (Literal.MicrosoftInteger == 128 &&
3951 !
Context.getTargetInfo().hasInt128Type())
3952 PP.Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
3953 << Literal.isUnsigned;
3954 BitsNeeded = Literal.MicrosoftInteger;
3957 llvm::APInt ResultVal(BitsNeeded, 0);
3959 if (Literal.GetIntegerValue(ResultVal)) {
3961 Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
3963 Ty =
Context.UnsignedLongLongTy;
3964 assert(
Context.getTypeSize(Ty) == ResultVal.getBitWidth() &&
3965 "long long is not intmax_t?");
3972 bool AllowUnsigned = Literal.isUnsigned || Literal.getRadix() != 10;
3979 Literal.isLong =
true;
3980 Literal.isLongLong =
false;
3987 if (Literal.MicrosoftInteger) {
3988 if (Literal.MicrosoftInteger == 8 && !Literal.isUnsigned) {
3992 Width = Literal.MicrosoftInteger;
3993 Ty =
Context.getIntTypeForBitwidth(Width,
3994 !Literal.isUnsigned);
4000 if (Literal.isBitInt) {
4003 Width = std::max(ResultVal.getActiveBits(), 1u) +
4004 (Literal.isUnsigned ? 0u : 1u);
4008 unsigned int MaxBitIntWidth =
4009 Context.getTargetInfo().getMaxBitIntWidth();
4010 if (Width > MaxBitIntWidth) {
4011 Diag(
Tok.getLocation(), diag::err_integer_literal_too_large)
4012 << Literal.isUnsigned;
4013 Width = MaxBitIntWidth;
4020 ResultVal = ResultVal.zextOrTrunc(Width);
4021 Ty =
Context.getBitIntType(Literal.isUnsigned, Width);
4025 if (Literal.isSizeT) {
4026 assert(!Literal.MicrosoftInteger &&
4027 "size_t literals can't be Microsoft literals");
4028 unsigned SizeTSize =
Context.getTargetInfo().getTypeWidth(
4029 Context.getTargetInfo().getSizeType());
4032 if (ResultVal.isIntN(SizeTSize)) {
4034 if (!Literal.isUnsigned && ResultVal[SizeTSize - 1] == 0)
4035 Ty =
Context.getSignedSizeType();
4036 else if (AllowUnsigned)
4042 if (Ty.
isNull() && !Literal.isLong && !Literal.isLongLong &&
4045 unsigned IntSize =
Context.getTargetInfo().getIntWidth();
4048 if (ResultVal.isIntN(IntSize)) {
4050 if (!Literal.isUnsigned && ResultVal[IntSize-1] == 0)
4052 else if (AllowUnsigned)
4059 if (Ty.
isNull() && !Literal.isLongLong && !Literal.isSizeT) {
4060 unsigned LongSize =
Context.getTargetInfo().getLongWidth();
4063 if (ResultVal.isIntN(LongSize)) {
4065 if (!Literal.isUnsigned && ResultVal[LongSize-1] == 0)
4067 else if (AllowUnsigned)
4072 const unsigned LongLongSize =
4073 Context.getTargetInfo().getLongLongWidth();
4077 ? diag::warn_old_implicitly_unsigned_long_cxx
4079 ext_old_implicitly_unsigned_long_cxx
4080 : diag::warn_old_implicitly_unsigned_long)
4081 << (LongLongSize > LongSize ? 0
4090 if (Ty.
isNull() && !Literal.isSizeT) {
4091 unsigned LongLongSize =
Context.getTargetInfo().getLongLongWidth();
4094 if (ResultVal.isIntN(LongLongSize)) {
4098 if (!Literal.isUnsigned && (ResultVal[LongLongSize-1] == 0 ||
4099 (
getLangOpts().MSVCCompat && Literal.isLongLong)))
4101 else if (AllowUnsigned)
4102 Ty =
Context.UnsignedLongLongTy;
4103 Width = LongLongSize;
4109 ? diag::warn_cxx98_compat_longlong
4110 : diag::ext_cxx11_longlong);
4112 Diag(
Tok.getLocation(), diag::ext_c99_longlong);
4120 if (Literal.isSizeT)
4121 Diag(
Tok.getLocation(), diag::err_size_t_literal_too_large)
4122 << Literal.isUnsigned;
4125 diag::ext_integer_literal_too_large_for_signed);
4126 Ty =
Context.UnsignedLongLongTy;
4127 Width =
Context.getTargetInfo().getLongLongWidth();
4130 if (ResultVal.getBitWidth() != Width)
4131 ResultVal = ResultVal.trunc(Width);
4137 if (Literal.isImaginary) {
4144 DiagId = diag::ext_gnu_imaginary_constant;
4146 DiagId = diag::warn_c23_compat_imaginary_constant;
4148 DiagId = diag::ext_c2y_imaginary_constant;
4149 Diag(
Tok.getLocation(), DiagId);
4155 assert(E &&
"ActOnParenExpr() missing expr");
4170 if (!(
T->isArithmeticType() ||
T->isVoidType() ||
T->isVectorType())) {
4171 S.
Diag(Loc, diag::err_vecstep_non_scalar_vector_type)
4176 assert((
T->isVoidType() || !
T->isIncompleteType()) &&
4177 "Scalar types should always be complete");
4185 if (!
T->isVectorType() && !
T->isSizelessVectorType())
4186 return S.
Diag(Loc, diag::err_builtin_non_vector_type)
4188 <<
"__builtin_vectorelements" <<
T << ArgRange;
4199 if (!
T->isFunctionType() && !
T->isFunctionPointerType() &&
4200 !
T->isFunctionReferenceType() && !
T->isMemberFunctionPointerType()) {
4201 S.
Diag(Loc, diag::err_ptrauth_type_disc_undiscriminated) <<
T << ArgRange;
4217 if (
T->isFunctionType() &&
4218 (TraitKind == UETT_SizeOf || TraitKind == UETT_AlignOf ||
4219 TraitKind == UETT_PreferredAlignOf)) {
4221 S.
Diag(Loc, diag::ext_sizeof_alignof_function_type)
4228 if (
T->isVoidType()) {
4229 unsigned DiagID = S.
LangOpts.OpenCL ? diag::err_opencl_sizeof_alignof_type
4230 : diag::ext_sizeof_alignof_void_type;
4245 S.
Diag(Loc, diag::err_sizeof_nonfragile_interface)
4246 <<
T << (TraitKind == UETT_SizeOf)
4263 const auto *ICE = dyn_cast<ImplicitCastExpr>(E);
4264 if (!ICE || ICE->getCastKind() != CK_ArrayToPointerDecay)
4267 S.
Diag(Loc, diag::warn_sizeof_array_decay) << ICE->getSourceRange()
4269 << ICE->getSubExpr()->getType();
4277 bool IsUnevaluatedOperand =
4278 (ExprKind == UETT_SizeOf || ExprKind == UETT_DataSizeOf ||
4279 ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf ||
4280 ExprKind == UETT_VecStep || ExprKind == UETT_CountOf);
4281 if (IsUnevaluatedOperand) {
4297 Diag(E->
getExprLoc(), diag::warn_side_effects_unevaluated_context);
4299 if (ExprKind == UETT_VecStep)
4303 if (ExprKind == UETT_VectorElements)
4314 if (
Context.getTargetInfo().getTriple().isWasm() &&
4325 if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf) {
4328 diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4333 E, diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4352 if (ExprKind == UETT_CountOf) {
4357 Diag(E->
getExprLoc(), diag::err_countof_arg_not_array_type) << ExprType;
4367 if (ExprKind == UETT_SizeOf) {
4368 if (
const auto *DeclRef = dyn_cast<DeclRefExpr>(E->
IgnoreParens())) {
4369 if (
const auto *PVD = dyn_cast<ParmVarDecl>(DeclRef->getFoundDecl())) {
4370 QualType OType = PVD->getOriginalType();
4375 Diag(PVD->getLocation(), diag::note_declared_at);
4383 if (
const auto *BO = dyn_cast<BinaryOperator>(E->
IgnoreParens())) {
4400 S.
Diag(E->
getExprLoc(), diag::err_sizeof_alignof_typeof_bitfield)
4407 if (
DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Inner)) {
4409 }
else if (
MemberExpr *ME = dyn_cast<MemberExpr>(Inner)) {
4410 D = ME->getMemberDecl();
4430 if (
FieldDecl *FD = dyn_cast_or_null<FieldDecl>(D)) {
4433 if (!FD->getParent()->isCompleteDefinition()) {
4434 S.
Diag(E->
getExprLoc(), diag::err_alignof_member_of_incomplete_type)
4443 if (!FD->getType()->isReferenceType())
4462 assert(
T->isVariablyModifiedType());
4463 assert(CSI !=
nullptr);
4467 const Type *Ty =
T.getTypePtr();
4469#define TYPE(Class, Base)
4470#define ABSTRACT_TYPE(Class, Base)
4471#define NON_CANONICAL_TYPE(Class, Base)
4472#define DEPENDENT_TYPE(Class, Base) case Type::Class:
4473#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)
4474#include "clang/AST/TypeNodes.inc"
4481 case Type::ExtVector:
4482 case Type::ConstantMatrix:
4485 case Type::TemplateSpecialization:
4486 case Type::ObjCObject:
4487 case Type::ObjCInterface:
4488 case Type::ObjCObjectPointer:
4489 case Type::ObjCTypeParam:
4492 case Type::HLSLInlineSpirv:
4493 llvm_unreachable(
"type class is never variably-modified!");
4494 case Type::Adjusted:
4500 case Type::ArrayParameter:
4506 case Type::BlockPointer:
4509 case Type::LValueReference:
4510 case Type::RValueReference:
4513 case Type::MemberPointer:
4516 case Type::ConstantArray:
4517 case Type::IncompleteArray:
4521 case Type::VariableArray: {
4535 case Type::FunctionProto:
4536 case Type::FunctionNoProto:
4541 case Type::UnaryTransform:
4542 case Type::Attributed:
4543 case Type::BTFTagAttributed:
4544 case Type::HLSLAttributedResource:
4545 case Type::SubstTemplateTypeParm:
4546 case Type::MacroQualified:
4547 case Type::CountAttributed:
4549 T =
T.getSingleStepDesugaredType(Context);
4554 case Type::Decltype:
4557 case Type::PackIndexing:
4564 case Type::DeducedTemplateSpecialization:
4567 case Type::TypeOfExpr:
4573 case Type::PredefinedSugar:
4577 }
while (!
T.isNull() &&
T->isVariablyModifiedType());
4600 if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf ||
4601 ExprKind == UETT_OpenMPRequiredSimdAlign) {
4607 ? diag::warn_c2y_compat_alignof_incomplete_array
4608 : diag::ext_c2y_alignof_incomplete_array);
4609 ExprType =
Context.getBaseElementType(ExprType);
4612 if (ExprKind == UETT_VecStep)
4615 if (ExprKind == UETT_VectorElements)
4619 if (ExprKind == UETT_PtrAuthTypeDiscriminator)
4629 OpLoc, ExprType, diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4634 Diag(OpLoc, diag::err_sizeof_alignof_function_type) << KWName << ExprRange;
4638 if (ExprKind == UETT_CountOf) {
4642 Diag(OpLoc, diag::err_countof_arg_not_array_type) << ExprType;
4649 if (
Context.getTargetInfo().getTriple().isWasm() &&
4651 Diag(OpLoc, diag::err_wasm_table_invalid_uett_operand)
4665 auto *CSI = dyn_cast<CapturingScopeInfo>(*I);
4669 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(CSI))
4670 DC = LSI->CallOperator;
4671 else if (
auto *CRSI = dyn_cast<CapturedRegionScopeInfo>(CSI))
4672 DC = CRSI->TheCapturedDecl;
4673 else if (
auto *BSI = dyn_cast<BlockScopeInfo>(CSI))
4696 if (!
T->isDependentType() &&
4705 (ExprKind == UETT_SizeOf || ExprKind == UETT_CountOf) &&
4731 }
else if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf) {
4733 }
else if (ExprKind == UETT_VecStep) {
4735 }
else if (ExprKind == UETT_OpenMPRequiredSimdAlign) {
4739 Diag(E->
getExprLoc(), diag::err_sizeof_alignof_typeof_bitfield) << 0;
4741 }
else if (ExprKind == UETT_VectorElements || ExprKind == UETT_SizeOf ||
4742 ExprKind == UETT_CountOf) {
4749 if ((ExprKind == UETT_SizeOf || ExprKind == UETT_CountOf) &&
4784 UETT_AlignOf, KWName);
4797 if (
V.get()->isTypeDependent())
4809 return CT->getElementType();
4812 if (
V.get()->getType()->isArithmeticType())
4813 return V.get()->getType();
4818 if (PR.
get() !=
V.get()) {
4824 S.
Diag(Loc, diag::err_realimag_invalid_type) <<
V.get()->getType()
4825 << (IsReal ?
"__real" :
"__imag");
4836 default: llvm_unreachable(
"Unknown unary op!");
4837 case tok::plusplus: Opc = UO_PostInc;
break;
4838 case tok::minusminus: Opc = UO_PostDec;
break;
4857 !S.
LangOpts.ObjCSubscriptingLegacyRuntime)
4860 S.
Diag(opLoc, diag::err_arithmetic_nonfragile_interface)
4867 auto *BaseNoParens =
Base->IgnoreParens();
4868 if (
auto *MSProp = dyn_cast<MSPropertyRefExpr>(BaseNoParens))
4869 return MSProp->getPropertyDecl()->getType()->isArrayType();
4890 if (RTy->isIntegralOrUnscopedEnumerationType()) {
4892 Result = PT->getPointeeType();
4894 Result = AT->getElementType();
4897 Result = PT->getPointeeType();
4899 Result = AT->getElementType();
4902 return Result->isDependentType() ? Result : Ctx.
DependentTy;
4913 if (AS->isOMPArraySection())
4929 base = result.
get();
4936 auto CheckAndReportCommaError = [
this, base, rbLoc](
Expr *E) {
4938 Diag(E->getExprLoc(), diag::err_matrix_subscript_comma)
4949 Diag(base->
getExprLoc(), diag::err_matrix_separate_incomplete_index)
4955 auto *matSubscriptE = dyn_cast<MatrixSubscriptExpr>(base);
4956 if (matSubscriptE) {
4957 assert(ArgExprs.size() == 1);
4958 if (CheckAndReportCommaError(ArgExprs.front()))
4961 assert(matSubscriptE->isIncomplete() &&
4962 "base has to be an incomplete matrix subscript");
4964 matSubscriptE->getRowIdx(),
4965 ArgExprs.front(), rbLoc);
4973 CheckInvalidBuiltinCountedByRef(base,
4981 bool IsMSPropertySubscript =
false;
4984 if (!IsMSPropertySubscript) {
4988 base = result.
get();
4994 assert(ArgExprs.size() == 1);
4995 if (CheckAndReportCommaError(ArgExprs.front()))
5003 Expr *idx = ArgExprs[0];
5012 if (ArgExprs.size() == 1 &&
5013 ArgExprs[0]->getType()->isNonOverloadPlaceholderType()) {
5017 ArgExprs[0] = result.
get();
5029 base, ArgExprs.front(),
5042 if (IsMSPropertySubscript) {
5043 assert(ArgExprs.size() == 1);
5062 ArgExprs[0]->getType()->isRecordType())))) {
5080 return InitSeq.
Perform(*
this, Entity, Kind, E);
5094 RowIdx = RowR.
get();
5098 Base, RowIdx, ColumnIdx,
Context.IncompleteMatrixIdxTy, RBLoc);
5109 ColumnIdx = ColumnR.
get();
5114 auto IsIndexValid = [&](
Expr *IndexExpr,
unsigned Dim,
5115 bool IsColumnIdx) ->
Expr * {
5123 if (std::optional<llvm::APSInt> Idx =
5125 if ((*Idx < 0 || *Idx >=
Dim)) {
5127 << IsColumnIdx <<
Dim;
5134 "should be able to convert any integer type to size type");
5135 return ConvExpr.
get();
5139 RowIdx = IsIndexValid(RowIdx, MTy->getNumRows(),
false);
5140 ColumnIdx = IsIndexValid(ColumnIdx, MTy->getNumColumns(),
true);
5141 if (!RowIdx || !ColumnIdx)
5145 MTy->getElementType(), RBLoc);
5148void Sema::CheckAddressOfNoDeref(
const Expr *E) {
5155 while ((
Member = dyn_cast<MemberExpr>(StrippedExpr)) && !
Member->isArrow())
5156 StrippedExpr =
Member->getBase()->IgnoreParenImpCasts();
5158 LastRecord.PossibleDerefs.erase(StrippedExpr);
5172 if (ResultTy->
hasAttr(attr::NoDeref)) {
5173 LastRecord.PossibleDerefs.insert(E);
5180 QualType BaseTy =
Base->getType();
5185 const MemberExpr *
Member =
nullptr;
5186 while ((
Member = dyn_cast<MemberExpr>(
Base->IgnoreParenCasts())) &&
5190 if (
const auto *Ptr = dyn_cast<PointerType>(
Base->getType())) {
5191 if (Ptr->getPointeeType()->hasAttr(attr::NoDeref))
5192 LastRecord.PossibleDerefs.insert(E);
5208 for (
auto *Op : {LHSExp, RHSExp}) {
5209 Op = Op->IgnoreImplicit();
5210 if (Op->getType()->isArrayType() && !Op->isLValue())
5233 Expr *BaseExpr, *IndexExpr;
5251 if (!
LangOpts.isSubscriptPointerArithmetic())
5267 if (!
LangOpts.isSubscriptPointerArithmetic()) {
5268 Diag(LLoc, diag::err_subscript_nonfragile_interface)
5292 LHSExp = Materialized.
get();
5299 Qualifiers BaseQuals = BaseType.getQualifiers();
5301 Qualifiers Combined = BaseQuals + MemberQuals;
5302 if (Combined != MemberQuals)
5303 ResultType =
Context.getQualifiedType(ResultType, Combined);
5313 CK_ArrayToPointerDecay).
get();
5319 }
else if (RHSTy->isArrayType()) {
5324 CK_ArrayToPointerDecay).
get();
5331 return ExprError(
Diag(LLoc, diag::err_typecheck_subscript_value)
5336 return ExprError(
Diag(LLoc, diag::err_typecheck_subscript_not_integer)
5342 std::optional<llvm::APSInt> IntegerContantExpr =
5344 if (!IntegerContantExpr.has_value() ||
5345 IntegerContantExpr.value().isNegative())
5361 Diag(LLoc, diag::ext_gnu_subscript_void_type)
5372 diag::err_subscript_incomplete_or_sizeless_type, BaseExpr))
5385 auto *CSI = dyn_cast<CapturingScopeInfo>(*I);
5389 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(CSI))
5390 DC = LSI->CallOperator;
5391 else if (
auto *CRSI = dyn_cast<CapturedRegionScopeInfo>(CSI))
5392 DC = CRSI->TheCapturedDecl;
5393 else if (
auto *BSI = dyn_cast<BlockScopeInfo>(CSI))
5411 bool SkipImmediateInvocations) {
5412 if (Param->hasUnparsedDefaultArg()) {
5413 assert(!RewrittenInit &&
"Should not have a rewritten init expression yet");
5417 Diag(Param->getBeginLoc(), diag::err_recursive_default_argument) << FD;
5418 Diag(CallLoc, diag::note_recursive_default_argument_used_here);
5419 Param->setInvalidDecl();
5423 Diag(CallLoc, diag::err_use_of_default_argument_to_function_declared_later)
5426 diag::note_default_argument_declared_here);
5430 if (Param->hasUninstantiatedDefaultArg()) {
5431 assert(!RewrittenInit &&
"Should not have a rewitten init expression yet");
5436 Expr *
Init = RewrittenInit ? RewrittenInit : Param->getInit();
5437 assert(
Init &&
"default argument but no initializer?");
5446 if (
auto *InitWithCleanup = dyn_cast<ExprWithCleanups>(
Init)) {
5449 Cleanup.setExprNeedsCleanups(InitWithCleanup->cleanupsHaveSideEffects());
5453 assert(!InitWithCleanup->getNumObjects() &&
5454 "default argument expression has capturing blocks?");
5467 SkipImmediateInvocations;
5555 if (!
SemaRef.CurrentInstantiationScope ||
5567 assert(Param->hasDefaultArg() &&
"can't build nonexistent default arg");
5571 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
5572 InitializationContext =
5574 if (!InitializationContext.has_value())
5575 InitializationContext.emplace(CallLoc, Param,
CurContext);
5577 if (!
Init && !Param->hasUnparsedDefaultArg()) {
5592 if (Param->hasUninstantiatedDefaultArg()) {
5601 if (!NestedDefaultChecking)
5602 V.TraverseDecl(Param);
5606 if (
V.HasImmediateCalls ||
5607 (NeedRebuild && isa_and_present<ExprWithCleanups>(Param->getInit()))) {
5608 if (
V.HasImmediateCalls)
5618 Res = Immediate.TransformInitializer(Param->getInit(),
5632 CallLoc, FD, Param,
Init,
5633 NestedDefaultChecking))
5637 Init, InitializationContext->Context);
5647 ClassPattern->
lookup(Field->getDeclName());
5648 auto Rng = llvm::make_filter_range(
5659 assert(Field->hasInClassInitializer());
5665 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
5666 InitializationContext =
5668 if (!InitializationContext.has_value())
5669 InitializationContext.emplace(Loc, Field,
CurContext);
5678 if (!Field->getInClassInitializer()) {
5684 assert(Pattern &&
"We must have set the Pattern!");
5688 Field->setInvalidDecl();
5700 if (!NestedDefaultChecking)
5701 V.TraverseDecl(Field);
5710 bool ContainsAnyTemporaries =
5711 isa_and_present<ExprWithCleanups>(Field->getInClassInitializer());
5712 if (Field->getInClassInitializer() &&
5713 !Field->getInClassInitializer()->containsErrors() &&
5714 (
V.HasImmediateCalls || (NeedRebuild && ContainsAnyTemporaries))) {
5718 NestedDefaultChecking;
5726 Res = Immediate.TransformInitializer(Field->getInClassInitializer(),
5732 Field->setInvalidDecl();
5738 if (Field->getInClassInitializer()) {
5739 Expr *E =
Init ?
Init : Field->getInClassInitializer();
5740 if (!NestedDefaultChecking)
5751 Field->setInvalidDecl();
5757 Field, InitializationContext->Context,
5776 Diag(Loc, diag::err_default_member_initializer_not_yet_parsed)
5777 << OutermostClass << Field;
5778 Diag(Field->getEndLoc(),
5779 diag::note_default_member_initializer_not_yet_parsed);
5782 Field->setInvalidDecl();
5790 if (isa_and_nonnull<CXXConstructorDecl>(FDecl))
5792 else if (Fn && Fn->getType()->isBlockPointerType())
5796 if (
Method->isInstance())
5798 }
else if (Fn && Fn->getType() ==
Context.BoundMemberTy)
5811 FunctionName(FuncName) {}
5813 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
5822 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
5823 return std::make_unique<FunctionCallCCC>(*
this);
5827 const IdentifierInfo *
const FunctionName;
5843 if (
NamedDecl *ND = Corrected.getFoundDecl()) {
5844 if (Corrected.isOverloaded()) {
5854 ND = Best->FoundDecl;
5855 Corrected.setCorrectionDecl(ND);
5861 ND = ND->getUnderlyingDecl();
5876 Fn = Fn->IgnoreParens();
5878 auto *UO = dyn_cast<UnaryOperator>(Fn);
5879 if (!UO || UO->getOpcode() != clang::UO_AddrOf)
5881 if (
auto *DRE = dyn_cast<DeclRefExpr>(UO->getSubExpr()->IgnoreParens())) {
5882 return DRE->hasQualifier();
5884 if (
auto *OVL = dyn_cast<OverloadExpr>(UO->getSubExpr()->IgnoreParens()))
5885 return bool(OVL->getQualifier());
5895 bool IsExecConfig) {
5899 if (
Context.BuiltinInfo.hasCustomTypechecking(ID))
5906 bool HasExplicitObjectParameter =
5908 unsigned ExplicitObjectParameterOffset = HasExplicitObjectParameter ? 1 : 0;
5912 unsigned FnKind = Fn->getType()->isBlockPointerType()
5919 if (Args.size() < NumParams) {
5920 if (Args.size() < MinArgs) {
5925 ? diag::err_typecheck_call_too_few_args_suggest
5926 : diag::err_typecheck_call_too_few_args_at_least_suggest;
5929 << FnKind << MinArgs - ExplicitObjectParameterOffset
5930 <<
static_cast<unsigned>(Args.size()) -
5931 ExplicitObjectParameterOffset
5933 }
else if (MinArgs - ExplicitObjectParameterOffset == 1 && FDecl &&
5938 ? diag::err_typecheck_call_too_few_args_one
5939 : diag::err_typecheck_call_too_few_args_at_least_one)
5940 << FnKind << FDecl->
getParamDecl(ExplicitObjectParameterOffset)
5941 << HasExplicitObjectParameter << Fn->getSourceRange();
5944 ? diag::err_typecheck_call_too_few_args
5945 : diag::err_typecheck_call_too_few_args_at_least)
5946 << FnKind << MinArgs - ExplicitObjectParameterOffset
5947 <<
static_cast<unsigned>(Args.size()) -
5948 ExplicitObjectParameterOffset
5949 << HasExplicitObjectParameter << Fn->getSourceRange();
5952 if (!TC && FDecl && !FDecl->
getBuiltinID() && !IsExecConfig)
5960 assert((
Call->getNumArgs() == NumParams) &&
5961 "We should have reserved space for the default arguments before!");
5966 if (Args.size() > NumParams) {
5972 ? diag::err_typecheck_call_too_many_args_suggest
5973 : diag::err_typecheck_call_too_many_args_at_most_suggest;
5976 << FnKind << NumParams - ExplicitObjectParameterOffset
5977 <<
static_cast<unsigned>(Args.size()) -
5978 ExplicitObjectParameterOffset
5980 }
else if (NumParams - ExplicitObjectParameterOffset == 1 && FDecl &&
5983 Diag(Args[NumParams]->getBeginLoc(),
5984 MinArgs == NumParams
5985 ? diag::err_typecheck_call_too_many_args_one
5986 : diag::err_typecheck_call_too_many_args_at_most_one)
5987 << FnKind << FDecl->
getParamDecl(ExplicitObjectParameterOffset)
5988 <<
static_cast<unsigned>(Args.size()) -
5989 ExplicitObjectParameterOffset
5990 << HasExplicitObjectParameter << Fn->getSourceRange()
5992 Args.back()->getEndLoc());
5994 Diag(Args[NumParams]->getBeginLoc(),
5995 MinArgs == NumParams
5996 ? diag::err_typecheck_call_too_many_args
5997 : diag::err_typecheck_call_too_many_args_at_most)
5998 << FnKind << NumParams - ExplicitObjectParameterOffset
5999 <<
static_cast<unsigned>(Args.size()) -
6000 ExplicitObjectParameterOffset
6001 << HasExplicitObjectParameter << Fn->getSourceRange()
6003 Args.back()->getEndLoc());
6006 if (!TC && FDecl && !FDecl->
getBuiltinID() && !IsExecConfig)
6011 Call->shrinkNumArgs(NumParams);
6022 unsigned TotalNumArgs = AllArgs.size();
6023 for (
unsigned i = 0; i < TotalNumArgs; ++i)
6024 Call->setArg(i, AllArgs[i]);
6026 Call->computeDependence();
6035 bool IsListInitialization) {
6040 for (
unsigned i = FirstParam; i < NumParams; i++) {
6045 if (ArgIx < Args.size()) {
6046 Arg = Args[ArgIx++];
6049 diag::err_call_incomplete_argument, Arg))
6053 bool CFAudited =
false;
6055 FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>() &&
6056 (!Param || !Param->hasAttr<CFConsumedAttr>()))
6059 FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>() &&
6060 (!Param || !Param->hasAttr<CFConsumedAttr>()))
6066 BE->getBlockDecl()->setDoesNotEscape();
6086 Entity,
SourceLocation(), Arg, IsListInitialization, AllowExplicit);
6092 assert(Param &&
"can't use default arguments without a known callee");
6104 CheckArrayAccess(Arg);
6109 AllArgs.push_back(Arg);
6118 for (
Expr *A : Args.slice(ArgIx)) {
6122 AllArgs.push_back(arg.get());
6127 for (
Expr *A : Args.slice(ArgIx)) {
6130 AllArgs.push_back(Arg.
get());
6135 for (
Expr *A : Args.slice(ArgIx))
6136 CheckArrayAccess(A);
6144 TL = DTL.getOriginalLoc();
6147 << ATL.getLocalSourceRange();
6153 const Expr *ArgExpr) {
6158 QualType OrigTy = Param->getOriginalType();
6183 Diag(CallLoc, diag::warn_static_array_too_small)
6191 std::optional<CharUnits> ArgSize =
6193 std::optional<CharUnits> ParmSize =
6195 if (ArgSize && ParmSize && *ArgSize < *ParmSize) {
6196 Diag(CallLoc, diag::warn_static_array_too_small)
6198 << (
unsigned)ParmSize->getQuantity() << 1;
6212 if (!placeholder)
return false;
6214 switch (placeholder->
getKind()) {
6216#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
6217 case BuiltinType::Id:
6218#include "clang/Basic/OpenCLImageTypes.def"
6219#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
6220 case BuiltinType::Id:
6221#include "clang/Basic/OpenCLExtensionTypes.def"
6224#define SVE_TYPE(Name, Id, SingletonId) \
6225 case BuiltinType::Id:
6226#include "clang/Basic/AArch64ACLETypes.def"
6227#define PPC_VECTOR_TYPE(Name, Id, Size) \
6228 case BuiltinType::Id:
6229#include "clang/Basic/PPCTypes.def"
6230#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6231#include "clang/Basic/RISCVVTypes.def"
6232#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6233#include "clang/Basic/WebAssemblyReferenceTypes.def"
6234#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
6235#include "clang/Basic/AMDGPUTypes.def"
6236#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6237#include "clang/Basic/HLSLIntangibleTypes.def"
6238#define PLACEHOLDER_TYPE(ID, SINGLETON_ID)
6239#define BUILTIN_TYPE(ID, SINGLETON_ID) case BuiltinType::ID:
6240#include "clang/AST/BuiltinTypes.def"
6243 case BuiltinType::UnresolvedTemplate:
6246 case BuiltinType::Overload:
6251 case BuiltinType::ARCUnbridgedCast:
6255 case BuiltinType::PseudoObject:
6260 case BuiltinType::UnknownAny:
6264 case BuiltinType::BoundMember:
6265 case BuiltinType::BuiltinFn:
6266 case BuiltinType::IncompleteMatrixIdx:
6267 case BuiltinType::ArraySection:
6268 case BuiltinType::OMPArrayShaping:
6269 case BuiltinType::OMPIterator:
6273 llvm_unreachable(
"bad builtin type kind");
6279 bool hasInvalid =
false;
6280 for (
size_t i = 0, e = args.size(); i != e; i++) {
6283 if (result.
isInvalid()) hasInvalid =
true;
6284 else args[i] = result.
get();
6308 if (!Context.BuiltinInfo.hasPtrArgsOrResult(FDecl->
getBuiltinID()) || !FT ||
6312 bool NeedsNewDecl =
false;
6332 if (!ParamType->isPointerType() ||
6333 ParamType->getPointeeType().hasAddressSpace() ||
6334 !ArgType->isPointerType() ||
6335 !ArgType->getPointeeType().hasAddressSpace() ||
6337 OverloadParams.push_back(ParamType);
6342 NeedsNewDecl =
true;
6343 LangAS AS = ArgType->getPointeeType().getAddressSpace();
6345 PointeeType = Context.getAddrSpaceQualType(PointeeType, AS);
6346 OverloadParams.push_back(Context.getPointerType(PointeeType));
6356 OverloadParams, EPI);
6366 for (
unsigned i = 0, e = FT->
getNumParams(); i != e; ++i) {
6373 Params.push_back(Parm);
6375 OverloadDecl->setParams(Params);
6379 if (FDecl->
hasAttr<CUDAHostAttr>())
6380 OverloadDecl->
addAttr(CUDAHostAttr::CreateImplicit(Context));
6381 if (FDecl->
hasAttr<CUDADeviceAttr>())
6382 OverloadDecl->
addAttr(CUDADeviceAttr::CreateImplicit(Context));
6385 return OverloadDecl;
6396 !Callee->isVariadic())
6398 if (Callee->getMinRequiredArguments() > ArgExprs.size())
6401 if (
const EnableIfAttr *
Attr =
6402 S.
CheckEnableIf(Callee, Fn->getBeginLoc(), ArgExprs,
true)) {
6403 S.
Diag(Fn->getBeginLoc(),
6405 ? diag::err_ovl_no_viable_member_function_in_call
6406 : diag::err_ovl_no_viable_function_in_call)
6407 << Callee << Callee->getSourceRange();
6408 S.
Diag(Callee->getLocation(),
6409 diag::note_ovl_candidate_disabled_by_function_cond_attr)
6410 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
6418 const auto GetFunctionLevelDCIfCXXClass =
6426 if (
const auto *MD = dyn_cast<CXXMethodDecl>(DC))
6427 return MD->
getParent()->getCanonicalDecl();
6430 if (
const auto *RD = dyn_cast<CXXRecordDecl>(DC))
6431 return RD->getCanonicalDecl();
6438 const CXXRecordDecl *
const CurParentClass = GetFunctionLevelDCIfCXXClass(S);
6439 if (!CurParentClass)
6446 assert(NamingClass &&
"Must have naming class even for implicit access");
6452 return CurParentClass == NamingClass ||
6501 if (
Call->getNumArgs() != 1)
6504 const Expr *E =
Call->getCallee()->IgnoreParenImpCasts();
6507 const DeclRefExpr *DRE = dyn_cast_if_present<DeclRefExpr>(E);
6520 if (BuiltinID != Builtin::BImove && BuiltinID != Builtin::BIforward)
6523 S.
Diag(DRE->
getLocation(), diag::warn_unqualified_call_to_std_cast_function)
6534 if (
Call.isInvalid())
6539 if (
const auto *ULE = dyn_cast<UnresolvedLookupExpr>(Fn);
6540 ULE && ULE->hasExplicitTemplateArgs() && ULE->decls().empty()) {
6541 DiagCompat(Fn->getExprLoc(), diag_compat::adl_only_template_id)
6549 if (
const auto *CE = dyn_cast<CallExpr>(
Call.get()))
6555 if (
auto *DRE = dyn_cast<DeclRefExpr>(Fn->IgnoreParens());
6556 DRE &&
Call.get()->isValueDependent()) {
6566 if (
T->isDependentType())
6569 if (
T == Context.BoundMemberTy ||
T == Context.UnknownAnyTy ||
6570 T == Context.BuiltinFnTy ||
T == Context.OverloadTy ||
6571 T->isFunctionType() ||
T->isFunctionReferenceType() ||
6572 T->isMemberFunctionPointerType() ||
T->isFunctionPointerType() ||
6573 T->isBlockPointerType() ||
T->isRecordType())
6582 Expr *ExecConfig,
bool IsExecConfig,
6583 bool AllowRecovery) {
6594 for (
const Expr *Arg : ArgExprs)
6595 if (CheckInvalidBuiltinCountedByRef(Arg,
6602 if (!ArgExprs.empty()) {
6604 Diag(Fn->getBeginLoc(), diag::err_pseudo_dtor_call_with_args)
6607 ArgExprs.back()->getEndLoc()));
6613 if (Fn->getType() ==
Context.PseudoObjectTy) {
6630 *
this, dyn_cast<UnresolvedMemberExpr>(Fn->IgnoreParens()),
6638 Diag(LParenLoc, diag::err_typecheck_call_not_function)
6639 << Fn->getType() << Fn->getSourceRange());
6647 if (Fn->getType()->isRecordType())
6651 if (Fn->getType() ==
Context.UnknownAnyTy) {
6657 if (Fn->getType() ==
Context.BoundMemberTy) {
6659 RParenLoc, ExecConfig, IsExecConfig,
6665 if (Fn->getType() ==
Context.OverloadTy) {
6676 Scope, Fn, ULE, LParenLoc, ArgExprs, RParenLoc, ExecConfig,
6679 RParenLoc, ExecConfig, IsExecConfig,
6685 if (Fn->getType() ==
Context.UnknownAnyTy) {
6691 Expr *NakedFn = Fn->IgnoreParens();
6693 bool CallingNDeclIndirectly =
false;
6695 if (
UnaryOperator *UnOp = dyn_cast<UnaryOperator>(NakedFn)) {
6696 if (UnOp->getOpcode() == UO_AddrOf) {
6697 CallingNDeclIndirectly =
true;
6702 if (
auto *DRE = dyn_cast<DeclRefExpr>(NakedFn)) {
6703 NDecl = DRE->getDecl();
6716 nullptr, DRE->isNonOdrUse());
6719 }
else if (
auto *ME = dyn_cast<MemberExpr>(NakedFn))
6720 NDecl = ME->getMemberDecl();
6722 if (
FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(NDecl)) {
6724 FD,
true, Fn->getBeginLoc()))
6736 FD->getBuiltinID()) {
6737 for (
unsigned Idx = 0; Idx < ArgExprs.size() && Idx < FD->param_size();
6740 if (!ArgExprs[Idx] || !Param || !Param->getType()->isPointerType() ||
6741 !ArgExprs[Idx]->getType()->isPointerType())
6745 auto ArgTy = ArgExprs[Idx]->getType();
6746 auto ArgPtTy = ArgTy->getPointeeType();
6747 auto ArgAS = ArgPtTy.getAddressSpace();
6750 bool NeedImplicitASC =
6755 if (!NeedImplicitASC)
6759 if (ArgExprs[Idx]->isGLValue()) {
6766 Qualifiers ArgPtQuals = ArgPtTy.getQualifiers();
6769 Context.getQualifiedType(ArgPtTy.getUnqualifiedType(), ArgPtQuals);
6772 ArgTy.getQualifiers());
6776 CK_AddressSpaceConversion)
6782 if (
Context.isDependenceAllowed() &&
6785 assert((Fn->containsErrors() ||
6786 llvm::any_of(ArgExprs,
6787 [](
clang::Expr *E) { return E->containsErrors(); })) &&
6788 "should only occur in error-recovery path.");
6793 ExecConfig, IsExecConfig);
6798 std::string Name =
Context.BuiltinInfo.getName(Id);
6804 assert(BuiltInDecl &&
"failed to find builtin declaration");
6808 assert(DeclRef.
isUsable() &&
"Builtin reference cannot fail");
6813 assert(!
Call.isInvalid() &&
"Call to builtin cannot fail!");
6833 Diag(BuiltinLoc, diag::err_invalid_astype_of_different_size)
6851 FunctionDecl *FDecl = dyn_cast_or_null<FunctionDecl>(NDecl);
6852 unsigned BuiltinID = (FDecl ? FDecl->
getBuiltinID() : 0);
6856 if (FDecl->
hasAttr<AnyX86InterruptAttr>()) {
6857 Diag(Fn->getExprLoc(), diag::err_anyx86_interrupt_called);
6860 if (FDecl->
hasAttr<ARMInterruptAttr>()) {
6861 Diag(Fn->getExprLoc(), diag::err_arm_interrupt_called);
6870 if (Caller->hasAttr<AnyX86InterruptAttr>() ||
6871 Caller->hasAttr<AnyX86NoCallerSavedRegistersAttr>()) {
6873 bool HasNonGPRRegisters =
6875 if (HasNonGPRRegisters &&
6876 (!FDecl || !FDecl->
hasAttr<AnyX86NoCallerSavedRegistersAttr>())) {
6877 Diag(Fn->getExprLoc(), diag::warn_anyx86_excessive_regsave)
6878 << (Caller->hasAttr<AnyX86InterruptAttr>() ? 0 : 1);
6891 Fn->getType()->isSpecificBuiltinType(BuiltinType::BuiltinFn)) {
6911 if (!BuiltinID || !
Context.BuiltinInfo.hasCustomTypechecking(BuiltinID)) {
6918 return ExprError(
Diag(LParenLoc, diag::err_typecheck_call_not_function)
6919 << Fn->getType() << Fn->getSourceRange());
6925 if (Fn->getType() ==
Context.UnknownAnyTy) {
6933 return ExprError(
Diag(LParenLoc, diag::err_typecheck_call_not_function)
6934 << Fn->getType() << Fn->getSourceRange());
6941 const auto *Proto = dyn_cast_or_null<FunctionProtoType>(FuncT);
6942 unsigned NumParams = Proto ? Proto->getNumParams() : 0;
6946 assert(UsesADL == ADLCallKind::NotADL &&
6947 "CUDAKernelCallExpr should not use ADL");
6958 if (BuiltinID &&
Context.BuiltinInfo.hasCustomTypechecking(BuiltinID)) {
6959 ExprResult E = CheckBuiltinFunctionCall(FDecl, BuiltinID, TheCall);
6968 if (FDecl && !FDecl->
hasAttr<CUDAGlobalAttr>())
6969 return ExprError(
Diag(LParenLoc,diag::err_kern_call_not_global_function)
6970 << FDecl << Fn->getSourceRange());
6976 return ExprError(
Diag(LParenLoc, diag::err_kern_type_not_void_return)
6977 << Fn->getType() << Fn->getSourceRange());
6980 if (FDecl && FDecl->
hasAttr<CUDAGlobalAttr>())
6981 return ExprError(
Diag(LParenLoc, diag::err_global_call_not_config)
6982 << FDecl << Fn->getSourceRange());
6996 if (
Context.getTargetInfo().getTriple().isWasm()) {
6997 for (
const Expr *Arg : Args) {
6998 if (Arg && Arg->getType()->isWebAssemblyTableType()) {
7000 diag::err_wasm_table_as_function_parameter));
7018 if (!Proto || !(Proto->isVariadic() && Args.size() >= Def->
param_size()))
7019 Diag(RParenLoc, diag::warn_call_wrong_number_of_arguments)
7020 << (Args.size() > Def->
param_size()) << FDecl << Fn->getSourceRange();
7039 if (!Proto && !Args.empty() &&
7041 !
Diags.isIgnored(diag::warn_strict_uses_without_prototype,
7043 Diag(LParenLoc, diag::warn_strict_uses_without_prototype)
7044 << (FDecl !=
nullptr) << FDecl;
7047 for (
unsigned i = 0, e = Args.size(); i != e; i++) {
7048 Expr *Arg = Args[i];
7050 if (Proto && i < Proto->getNumParams()) {
7052 Context, Proto->getParamType(i), Proto->isParamConsumed(i));
7070 diag::err_call_incomplete_argument, Arg))
7079 if (
Method->isImplicitObjectMemberFunction())
7080 return ExprError(
Diag(LParenLoc, diag::err_member_call_without_object)
7081 << Fn->getSourceRange() << 0);
7089 for (
unsigned i = 0, e = Args.size(); i != e; i++) {
7090 if (
const auto *RT =
7091 dyn_cast<RecordType>(Args[i]->
getType().getCanonicalType())) {
7092 if (RT->getOriginalDecl()->isOrContainsUnion())
7093 Diag(Args[i]->getBeginLoc(), diag::warn_cmse_nonsecure_union)
7104 checkFortifiedBuiltinMemoryFunction(FDecl, TheCall);
7107 return CheckBuiltinFunctionCall(FDecl, BuiltinID, TheCall);
7109 if (CheckPointerCall(NDecl, TheCall, Proto))
7112 if (CheckOtherCall(TheCall, Proto))
7122 assert(Ty &&
"ActOnCompoundLiteral(): missing type");
7123 assert(InitExpr &&
"ActOnCompoundLiteral(): missing expression");
7128 TInfo =
Context.getTrivialTypeSourceInfo(literalType);
7140 LParenLoc,
Context.getBaseElementType(literalType),
7141 diag::err_array_incomplete_or_sizeless_type,
7164 ? diag::err_variable_object_no_init
7165 : diag::err_compound_literal_with_vla_type;
7172 diag::err_typecheck_decl_incomplete_type,
7187 LiteralExpr =
Result.get();
7194 bool IsFileScope = !
CurContext->isFunctionOrMethod() &&
7225 if (
auto ILE = dyn_cast<InitListExpr>(LiteralExpr))
7226 for (
unsigned i = 0, j = ILE->getNumInits(); i != j; i++) {
7228 if (!
Init->isTypeDependent() && !
Init->isValueDependent() &&
7230 Diag(
Init->getExprLoc(), diag::err_init_element_not_constant)
7231 <<
Init->getSourceBitField();
7239 LiteralExpr, IsFileScope);
7251 Diag(LParenLoc, diag::err_compound_literal_with_address_space)
7269 Cleanup.setExprNeedsCleanups(
true);
7288 bool DiagnosedArrayDesignator =
false;
7289 bool DiagnosedNestedDesignator =
false;
7290 bool DiagnosedMixedDesignator =
false;
7294 for (
unsigned I = 0, E = InitArgList.size(); I != E; ++I) {
7295 if (
auto *DIE = dyn_cast<DesignatedInitExpr>(InitArgList[I])) {
7297 FirstDesignator = DIE->getBeginLoc();
7302 if (!DiagnosedNestedDesignator && DIE->size() > 1) {
7303 DiagnosedNestedDesignator =
true;
7304 Diag(DIE->getBeginLoc(), diag::ext_designated_init_nested)
7305 << DIE->getDesignatorsSourceRange();
7308 for (
auto &Desig : DIE->designators()) {
7309 if (!Desig.isFieldDesignator() && !DiagnosedArrayDesignator) {
7310 DiagnosedArrayDesignator =
true;
7311 Diag(Desig.getBeginLoc(), diag::ext_designated_init_array)
7312 << Desig.getSourceRange();
7316 if (!DiagnosedMixedDesignator &&
7318 DiagnosedMixedDesignator =
true;
7319 Diag(DIE->getBeginLoc(), diag::ext_designated_init_mixed)
7320 << DIE->getSourceRange();
7321 Diag(InitArgList[0]->getBeginLoc(), diag::note_designated_init_mixed)
7322 << InitArgList[0]->getSourceRange();
7326 DiagnosedMixedDesignator =
true;
7328 Diag(DIE->getBeginLoc(), diag::ext_designated_init_mixed)
7329 << DIE->getSourceRange();
7330 Diag(InitArgList[I]->getBeginLoc(), diag::note_designated_init_mixed)
7331 << InitArgList[I]->getSourceRange();
7335 if (FirstDesignator.
isValid()) {
7339 !DiagnosedNestedDesignator && !DiagnosedMixedDesignator) {
7341 ? diag::warn_cxx17_compat_designated_init
7342 : diag::ext_cxx_designated_init);
7344 Diag(FirstDesignator, diag::ext_designated_init);
7359 for (
unsigned I = 0, E = InitArgList.size(); I != E; ++I) {
7360 if (InitArgList[I]->
getType()->isNonOverloadPlaceholderType()) {
7367 InitArgList[I] = result.
get();
7387 Cleanup.setExprNeedsCleanups(
true);
7396 if (
Context.hasSameUnqualifiedType(SrcTy, DestTy))
7401 llvm_unreachable(
"member pointer type in C");
7410 if (SrcAS != DestAS)
7411 return CK_AddressSpaceConversion;
7412 if (
Context.hasCvrSimilarType(SrcTy, DestTy))
7418 ? CK_BitCast : CK_AnyPointerToBlockPointerCast);
7423 return CK_CPointerToObjCPointerCast;
7425 return CK_BlockPointerToObjCPointerCast;
7427 return CK_PointerToBoolean;
7429 return CK_PointerToIntegral;
7435 llvm_unreachable(
"illegal cast from pointer");
7437 llvm_unreachable(
"Should have returned before this");
7442 return CK_FixedPointCast;
7444 return CK_FixedPointToBoolean;
7446 return CK_FixedPointToIntegral;
7448 return CK_FixedPointToFloating;
7452 diag::err_unimplemented_conversion_with_fixed_point_type)
7454 return CK_IntegralCast;
7459 llvm_unreachable(
"illegal cast to pointer type");
7461 llvm_unreachable(
"Should have returned before this");
7471 return CK_NullToPointer;
7472 return CK_IntegralToPointer;
7474 return CK_IntegralToBoolean;
7476 return CK_IntegralCast;
7478 return CK_IntegralToFloating;
7483 return CK_IntegralRealToComplex;
7487 CK_IntegralToFloating);
7488 return CK_FloatingRealToComplex;
7490 llvm_unreachable(
"member pointer type in C");
7492 return CK_IntegralToFixedPoint;
7494 llvm_unreachable(
"Should have returned before this");
7499 return CK_FloatingCast;
7501 return CK_FloatingToBoolean;
7503 return CK_FloatingToIntegral;
7508 return CK_FloatingRealToComplex;
7512 CK_FloatingToIntegral);
7513 return CK_IntegralRealToComplex;
7517 llvm_unreachable(
"valid float->pointer cast?");
7519 llvm_unreachable(
"member pointer type in C");
7521 return CK_FloatingToFixedPoint;
7523 llvm_unreachable(
"Should have returned before this");
7528 return CK_FloatingComplexCast;
7530 return CK_FloatingComplexToIntegralComplex;
7533 if (
Context.hasSameType(ET, DestTy))
7534 return CK_FloatingComplexToReal;
7536 return CK_FloatingCast;
7539 return CK_FloatingComplexToBoolean;
7543 CK_FloatingComplexToReal);
7544 return CK_FloatingToIntegral;
7548 llvm_unreachable(
"valid complex float->pointer cast?");
7550 llvm_unreachable(
"member pointer type in C");
7553 diag::err_unimplemented_conversion_with_fixed_point_type)
7555 return CK_IntegralCast;
7557 llvm_unreachable(
"Should have returned before this");
7562 return CK_IntegralComplexToFloatingComplex;
7564 return CK_IntegralComplexCast;
7567 if (
Context.hasSameType(ET, DestTy))
7568 return CK_IntegralComplexToReal;
7570 return CK_IntegralCast;
7573 return CK_IntegralComplexToBoolean;
7577 CK_IntegralComplexToReal);
7578 return CK_IntegralToFloating;
7582 llvm_unreachable(
"valid complex int->pointer cast?");
7584 llvm_unreachable(
"member pointer type in C");
7587 diag::err_unimplemented_conversion_with_fixed_point_type)
7589 return CK_IntegralCast;
7591 llvm_unreachable(
"Should have returned before this");
7594 llvm_unreachable(
"Unhandled scalar cast");
7601 len = vecType->getNumElements();
7602 eltType = vecType->getElementType();
7609 if (!
type->isRealType())
return false;
7619 auto ValidScalableConversion = [](
QualType FirstType,
QualType SecondType) {
7623 const auto *VecTy = SecondType->getAs<
VectorType>();
7627 return ValidScalableConversion(srcTy, destTy) ||
7628 ValidScalableConversion(destTy, srcTy);
7638 return matSrcType->
getNumRows() == matDestType->getNumRows() &&
7639 matSrcType->
getNumColumns() == matDestType->getNumColumns();
7645 uint64_t SrcLen, DestLen;
7655 uint64_t SrcEltSize =
Context.getTypeSize(SrcEltTy);
7656 uint64_t DestEltSize =
Context.getTypeSize(DestEltTy);
7658 return (SrcLen * SrcEltSize == DestLen * DestEltSize);
7663 "expected at least one type to be a vector here");
7665 bool IsSrcTyAltivec =
7681 return (IsSrcTyAltivec || IsDestTyAltivec);
7701 switch (
Context.getLangOpts().getLaxVectorConversions()) {
7708 if (!Vec || !Vec->getElementType()->isIntegralOrEnumerationType())
7713 if (!Vec || !Vec->getElementType()->isIntegralOrEnumerationType())
7730 return Diag(R.
getBegin(), diag::err_invalid_conversion_between_matrixes)
7731 << DestTy << SrcTy << R;
7735 diag::err_invalid_conversion_between_matrix_and_type)
7736 << SrcTy << DestTy << R;
7739 diag::err_invalid_conversion_between_matrix_and_type)
7740 << DestTy << SrcTy << R;
7743 Kind = CK_MatrixCast;
7749 assert(VectorTy->
isVectorType() &&
"Not a vector type!");
7755 diag::err_invalid_conversion_between_vectors :
7756 diag::err_invalid_conversion_between_vector_and_integer)
7757 << VectorTy << Ty << R;
7760 diag::err_invalid_conversion_between_vector_and_scalar)
7761 << VectorTy << Ty << R;
7770 if (DestElemTy == SplattedExpr->
getType())
7771 return SplattedExpr;
7784 CK_BooleanToSignedIntegral);
7785 SplattedExpr = CastExprRes.
get();
7786 CK = CK_IntegralToFloating;
7788 CK = CK_BooleanToSignedIntegral;
7795 SplattedExpr = CastExprRes.
get();
7813 !
Context.hasSameUnqualifiedType(DestTy, SrcTy))) {
7814 Diag(R.
getBegin(),diag::err_invalid_conversion_between_ext_vectors)
7815 << DestTy << SrcTy << R;
7827 diag::err_invalid_conversion_between_vector_and_scalar)
7828 << DestTy << SrcTy << R;
7830 Kind = CK_VectorSplat;
7840 DestType == SourceType)
7848 if (!CE->getCalleeAllocSizeAttr())
7850 std::optional<llvm::APInt> AllocSize =
7851 CE->evaluateBytesReturnedByAllocSizeCall(S.
Context);
7854 if (!AllocSize || AllocSize->isZero())
7864 if (LhsSize && Size < LhsSize)
7866 << Size.getQuantity() << TargetType << LhsSize->getQuantity();
7874 "ActOnCastExpr(): missing type or expr");
7890 bool isVectorLiteral =
false;
7905 isVectorLiteral =
true;
7908 isVectorLiteral =
true;
7913 if (isVectorLiteral)
7943 "Expected paren or paren list expression");
7950 LiteralLParenLoc = PE->getLParenLoc();
7951 LiteralRParenLoc = PE->getRParenLoc();
7952 exprs = PE->getExprs();
7953 numExprs = PE->getNumExprs();
7980 if (numExprs == 1) {
7983 if (Literal.isInvalid())
7989 else if (numExprs < numElems) {
7991 diag::err_incorrect_number_of_vector_initializers);
7995 initExprs.append(exprs, exprs + numExprs);
8004 if (Literal.isInvalid())
8011 initExprs.append(exprs, exprs + numExprs);
8016 initExprs, LiteralRParenLoc);
8045 unsigned NumUserSpecifiedExprs,
8050 InitLoc, LParenLoc, RParenLoc);
8055 const Expr *NullExpr = LHSExpr;
8056 const Expr *NonPointerExpr = RHSExpr;
8063 NonPointerExpr = LHSExpr;
8085 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands_null)
8086 << NonPointerExpr->
getType() << DiagType
8098 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_nonfloat)
8099 << CondTy <<
Cond->getSourceRange();
8106 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_scalar)
8107 << CondTy <<
Cond->getSourceRange();
8140 bool IsBlockPointer =
false;
8144 IsBlockPointer =
true;
8169 ResultAddrSpace = LAddrSpace;
8171 ResultAddrSpace = RAddrSpace;
8173 S.
Diag(Loc, diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
8180 auto LHSCastKind = CK_BitCast, RHSCastKind = CK_BitCast;
8185 S.
Diag(Loc, diag::err_typecheck_cond_incompatible_ptrauth)
8202 LAddrSpace == ResultAddrSpace ? CK_BitCast : CK_AddressSpaceConversion;
8204 RAddrSpace == ResultAddrSpace ? CK_BitCast : CK_AddressSpaceConversion;
8212 lhptee, rhptee,
false,
false,
8215 if (CompositeTy.
isNull()) {
8232 S.
Diag(Loc, diag::ext_typecheck_cond_incompatible_pointers)
8243 QualType ResultTy = [&, ResultAddrSpace]() {
8278 S.
Diag(Loc, diag::err_typecheck_cond_incompatible_operands)
8331 bool IsIntFirstExpr) {
8333 !Int.get()->getType()->isIntegerType())
8336 Expr *Expr1 = IsIntFirstExpr ? Int.get() : PointerExpr;
8337 Expr *Expr2 = IsIntFirstExpr ? PointerExpr : Int.get();
8339 S.
Diag(Loc, diag::ext_typecheck_cond_pointer_integer_mismatch)
8343 CK_IntegralToPointer);
8377 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_int_float)
8383 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_int_float)
8389 if (LHSType == RHSType)
8399 (S, LHS, RHS, LHSType, RHSType,
false);
8433 llvm::raw_svector_ostream OS(Str);
8434 OS <<
"(vector of " << NumElements <<
" '" << EleTyName <<
"' values)";
8435 S.
Diag(QuestionLoc, diag::err_conditional_vector_element_size)
8436 << CondTy << OS.str();
8457 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_nonfloat)
8458 <<
Cond->getType() <<
Cond->getSourceRange();
8475 S.
Diag(QuestionLoc, diag::err_conditional_vector_size)
8476 << CondTy << VecResTy;
8481 QualType RVE = RV->getElementType();
8486 S.
Diag(QuestionLoc, diag::err_conditional_vector_element_size)
8487 << CondTy << VecResTy;
8502 if (
Cond.isInvalid())
8513 bool IsBoolVecLang =
8542 if (
const CallExpr *CE = dyn_cast<CallExpr>(E)) {
8543 QualType Ty = CE->getCallee()->getType();
8575 if (
Context.isDependenceAllowed() &&
8581 "should only occur in error-recovery path.");
8588 Cond.get()->getType()->isExtVectorType())
8593 if (
Cond.isInvalid())
8616 Diag(QuestionLoc, diag::err_wasm_table_conditional_expression)
8625 diag::err_typecheck_cond_incompatible_operands) << LHSTy << RHSTy
8644 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands)
8660 Context.hasSameUnqualifiedType(LHSTy, RHSTy))
8669 ResTy =
Context.getCommonSugaredType(LHSTy, RHSTy);
8700 if (!compositeType.
isNull())
8701 return compositeType;
8731 if (
Context.hasSameType(LHSTy, RHSTy))
8732 return Context.getCommonSugaredType(LHSTy, RHSTy);
8735 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands)
8754 Self.Diag(Loc,
Note) << ParenRange;
8774 const Expr **RHSExprs) {
8779 if (
const auto *MTE = dyn_cast<MaterializeTemporaryExpr>(E)) {
8780 E = MTE->getSubExpr();
8785 if (
const auto *OP = dyn_cast<BinaryOperator>(E);
8787 *Opcode = OP->getOpcode();
8788 *RHSExprs = OP->getRHS();
8793 if (
const auto *
Call = dyn_cast<CXXOperatorCallExpr>(E)) {
8794 if (
Call->getNumArgs() != 2)
8800 if (OO < OO_Plus || OO > OO_Arrow ||
8801 OO == OO_PlusPlus || OO == OO_MinusMinus)
8807 *RHSExprs =
Call->getArg(1);
8823 if (
const auto *OP = dyn_cast<BinaryOperator>(E))
8824 return OP->isComparisonOp() || OP->isLogicalOp();
8825 if (
const auto *OP = dyn_cast<UnaryOperator>(E))
8826 return OP->getOpcode() == UO_LNot;
8841 const Expr *RHSExpr) {
8843 const Expr *CondRHS;
8854 ? diag::warn_precedence_bitwise_conditional
8855 : diag::warn_precedence_conditional;
8857 Self.Diag(OpLoc, DiagID)
8863 Self.PDiag(diag::note_precedence_silence)
8868 Self.PDiag(diag::note_precedence_conditional_first),
8879 auto GetNullability = [](
QualType Ty) {
8880 std::optional<NullabilityKind> Kind = Ty->getNullability();
8890 auto LHSKind = GetNullability(LHSTy), RHSKind = GetNullability(RHSTy);
8898 MergedKind = RHSKind;
8905 MergedKind = RHSKind;
8907 MergedKind = LHSKind;
8913 if (GetNullability(ResTy) == MergedKind)
8931 Expr *commonExpr =
nullptr;
8933 commonExpr = CondExpr;
8940 commonExpr = result.
get();
8954 commonExpr = commonRes.
get();
8964 commonExpr = MatExpr.
get();
8972 LHSExpr = CondExpr = opaqueValue;
8980 VK, OK, QuestionLoc);
8981 if (result.
isNull() ||
Cond.isInvalid() || LHS.isInvalid() ||
8988 CheckBoolLikeConversion(
Cond.get(), QuestionLoc);
8996 RHS.get(), result,
VK, OK);
8999 commonExpr, opaqueValue,
Cond.get(), LHS.get(), RHS.get(), QuestionLoc,
9000 ColonLoc, result,
VK, OK);
9004 unsigned FromAttributes = 0, ToAttributes = 0;
9005 if (
const auto *FromFn =
9006 dyn_cast<FunctionProtoType>(
Context.getCanonicalType(FromType)))
9009 if (
const auto *ToFn =
9010 dyn_cast<FunctionProtoType>(
Context.getCanonicalType(ToType)))
9014 return FromAttributes != ToAttributes;
9022 if (
const auto *ToFn =
9024 if (
const auto *FromFn =
9044 assert(LHSType.
isCanonical() &&
"LHS not canonicalized!");
9045 assert(RHSType.
isCanonical() &&
"RHS not canonicalized!");
9048 const Type *lhptee, *rhptee;
9050 std::tie(lhptee, lhq) =
9052 std::tie(rhptee, rhq) =
9123 diag::warn_typecheck_convert_incompatible_function_pointer_strict,
9146 if (ltrans == rtrans) {
9162 std::tie(lhptee, lhq) =
9164 std::tie(rhptee, rhq) =
9176 return AssignConvertType::
9177 IncompatibleNestedPointerAddressSpaceMismatch;
9181 if (lhptee == rhptee)
9190 bool DiscardingCFIUncheckedCallee, AddingCFIUncheckedCallee;
9193 &AddingCFIUncheckedCallee)) {
9195 if (!DiscardingCFIUncheckedCallee && !AddingCFIUncheckedCallee)
9212 assert(LHSType.
isCanonical() &&
"LHS not canonicalized!");
9213 assert(RHSType.
isCanonical() &&
"RHS not canonicalized!");
9234 if (LQuals != RQuals)
9263 assert(LHSType.
isCanonical() &&
"LHS was not canonicalized!");
9264 assert(RHSType.
isCanonical() &&
"RHS was not canonicalized!");
9312 return VT->getElementType().getCanonicalType() == ElementType;
9342 LHSType =
Context.getCanonicalType(LHSType).getUnqualifiedType();
9343 RHSType =
Context.getCanonicalType(RHSType).getUnqualifiedType();
9346 if (LHSType == RHSType) {
9353 if (
const auto *AT = dyn_cast<AutoType>(LHSType)) {
9354 if (AT->isGNUAutoType()) {
9362 if (
const AtomicType *AtomicTy = dyn_cast<AtomicType>(LHSType)) {
9367 if (Kind != CK_NoOp && ConvertRHS)
9369 Kind = CK_NonAtomicToAtomic;
9381 if (
Context.typesAreCompatible(LHSTypeRef->getPointeeType(), RHSType)) {
9382 Kind = CK_LValueBitCast;
9393 if (LHSExtType->getNumElements() != RHSExtType->getNumElements())
9397 RHSExtType->getElementType()->isIntegerType()) {
9398 Kind = CK_IntegralToBoolean;
9407 Kind = CK_VectorSplat;
9417 if (
Context.areCompatibleVectorTypes(LHSType, RHSType)) {
9429 if (
Context.getTargetInfo().getTriple().isPPC() &&
9431 !
Context.areCompatibleVectorTypes(RHSType, LHSType))
9433 << RHSType << LHSType;
9447 if (
Context.getTargetInfo().getTriple().isPPC() &&
9452 << RHSType << LHSType;
9463 if (
ARM().areCompatibleSveTypes(LHSType, RHSType) ||
9464 ARM().areLaxCompatibleSveTypes(LHSType, RHSType)) {
9472 if (
Context.areCompatibleRVVTypes(LHSType, RHSType) ||
9473 Context.areLaxCompatibleRVVTypes(LHSType, RHSType)) {
9502 if (
const PointerType *LHSPointer = dyn_cast<PointerType>(LHSType)) {
9505 LangAS AddrSpaceL = LHSPointer->getPointeeType().getAddressSpace();
9507 if (AddrSpaceL != AddrSpaceR)
9508 Kind = CK_AddressSpaceConversion;
9509 else if (
Context.hasCvrSimilarType(RHSType, LHSType))
9519 Kind = CK_IntegralToPointer;
9527 if (LHSPointer->getPointeeType()->isVoidType()) {
9535 Context.getObjCClassRedefinitionType())) {
9546 if (LHSPointer->getPointeeType()->isVoidType()) {
9547 LangAS AddrSpaceL = LHSPointer->getPointeeType().getAddressSpace();
9552 AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion : CK_BitCast;
9570 Kind = AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion : CK_BitCast;
9576 Kind = CK_IntegralToPointer;
9582 Kind = CK_AnyPointerToBlockPointerCast;
9588 if (RHSPT->getPointeeType()->isVoidType()) {
9589 Kind = CK_AnyPointerToBlockPointerCast;
9603 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
9605 !
ObjC().CheckObjCARCUnavailableWeakConversion(OrigLHSType, RHSType))
9612 Kind = CK_IntegralToPointer;
9619 Kind = CK_CPointerToObjCPointerCast;
9629 Context.getObjCClassRedefinitionType())) {
9641 Kind = CK_BlockPointerToObjCPointerCast;
9653 Kind = CK_NullToPointer;
9660 if (LHSType ==
Context.BoolTy) {
9661 Kind = CK_PointerToBoolean;
9667 Kind = CK_PointerToIntegral;
9677 if (LHSType ==
Context.BoolTy) {
9678 Kind = CK_PointerToBoolean;
9684 Kind = CK_PointerToIntegral;
9693 if (
Context.typesAreCompatible(LHSType, RHSType)) {
9700 Kind = CK_IntToOCLSampler;
9734 const RecordType *UT =
ArgType->getAsUnionType();
9738 RecordDecl *UD = UT->getOriginalDecl()->getDefinitionOrSelf();
9739 if (!UD->
hasAttr<TransparentUnionAttr>())
9745 for (
auto *it : UD->
fields()) {
9746 if (it->getType()->isPointerType()) {
9785 bool DiagnoseCFAudited,
9789 assert((ConvertRHS || !
Diagnose) &&
"can't indicate whether we diagnosed");
9795 ExprResult &RHS = ConvertRHS ? CallerRHS : LocalRHS;
9799 if (RHSPtrType->getPointeeType()->hasAttr(attr::NoDeref) &&
9800 !LHSPtrType->getPointeeType()->hasAttr(attr::NoDeref)) {
9802 diag::warn_noderef_to_dereferenceable_pointer)
9821 AllowedExplicit::None,
9833 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
9834 !
ObjC().CheckObjCARCUnavailableWeakConversion(LHSType, RHSType))
9848 RHS.
get(), LHSType,
false, DAP))
9971 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
9981 ObjC().CheckConversionToObjCLiteral(LHSType, E,
Diagnose))) {
10001struct OriginalOperand {
10002 explicit OriginalOperand(
Expr *Op) : Orig(Op), Conversion(
nullptr) {
10003 if (
auto *MTE = dyn_cast<MaterializeTemporaryExpr>(Op))
10004 Op = MTE->getSubExpr();
10005 if (
auto *BTE = dyn_cast<CXXBindTemporaryExpr>(Op))
10006 Op = BTE->getSubExpr();
10007 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(Op)) {
10008 Orig = ICE->getSubExprAsWritten();
10009 Conversion = ICE->getConversionFunction();
10013 QualType
getType()
const {
return Orig->getType(); }
10016 NamedDecl *Conversion;
10022 OriginalOperand OrigLHS(LHS.
get()), OrigRHS(RHS.
get());
10024 Diag(Loc, diag::err_typecheck_invalid_operands)
10025 << OrigLHS.getType() << OrigRHS.getType()
10030 if (OrigLHS.Conversion) {
10031 Diag(OrigLHS.Conversion->getLocation(),
10032 diag::note_typecheck_invalid_operands_converted)
10035 if (OrigRHS.Conversion) {
10037 diag::note_typecheck_invalid_operands_converted)
10052 if (!(LHSNatVec && RHSNatVec)) {
10054 Expr *NonVector = !LHSNatVec ? LHS.
get() : RHS.
get();
10055 Diag(Loc, diag::err_typecheck_logical_vector_expr_gnu_cpp_restrict)
10057 <<
Vector->getSourceRange();
10061 Diag(Loc, diag::err_typecheck_logical_vector_expr_gnu_cpp_restrict)
10084 unsigned &DiagID) {
10090 scalarCast = CK_IntegralToBoolean;
10095 DiagID = diag::err_opencl_scalar_type_rank_greater_than_vector_type;
10100 scalarCast = CK_IntegralCast;
10105 DiagID = diag::err_opencl_scalar_type_rank_greater_than_vector_type;
10108 scalarCast = CK_FloatingCast;
10111 scalarCast = CK_IntegralToFloating;
10120 if (scalarCast != CK_NoOp)
10131 assert(VecTy &&
"Expression E must be a vector");
10136 VecTy->getVectorKind());
10140 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(E))
10141 if (ICE->getSubExpr()->getType() == NewVecTy)
10142 return ICE->getSubExpr();
10144 auto Cast = ElementType->
isIntegerType() ? CK_IntegralCast : CK_FloatingCast;
10152 if (Int->get()->containsErrors())
10155 QualType IntTy = Int->get()->getType().getUnqualifiedType();
10161 bool CstInt = Int->get()->EvaluateAsInt(EVResult, S.
Context);
10169 llvm::APSInt Result = EVResult.
Val.
getInt();
10170 unsigned NumBits = IntSigned
10171 ? (Result.isNegative() ? Result.getSignificantBits()
10172 : Result.getActiveBits())
10173 : Result.getActiveBits();
10180 return (IntSigned != OtherIntSigned &&
10186 return (Order < 0);
10193 if (Int->get()->containsErrors())
10196 QualType IntTy = Int->get()->getType().getUnqualifiedType();
10201 bool CstInt = Int->get()->EvaluateAsInt(EVResult, S.
Context);
10210 llvm::APSInt Result = EVResult.
Val.
getInt();
10213 llvm::APFloat::rmTowardZero);
10216 bool Ignored =
false;
10217 Float.convertToInteger(ConvertBack, llvm::APFloat::rmNearestTiesToEven,
10219 if (Result != ConvertBack)
10225 unsigned FloatPrec = llvm::APFloat::semanticsPrecision(
10227 if (Bits > FloatPrec)
10240 QualType ScalarTy = Scalar->get()->getType().getUnqualifiedType();
10241 QualType VectorTy =
Vector->get()->getType().getUnqualifiedType();
10246 "ExtVectorTypes should not be handled here!");
10247 VectorEltTy = VT->getElementType();
10252 llvm_unreachable(
"Only Fixed-Length and SVE Vector types are handled here");
10278 ScalarCast = CK_IntegralCast;
10282 ScalarCast = CK_FloatingToIntegral;
10290 llvm::APFloat
Result(0.0);
10296 bool CstScalar = Scalar->get()->isValueDependent() ||
10297 Scalar->get()->EvaluateAsFloat(Result, S.
Context);
10299 if (!CstScalar && Order < 0)
10305 bool Truncated =
false;
10307 llvm::APFloat::rmNearestTiesToEven, &Truncated);
10312 ScalarCast = CK_FloatingCast;
10317 ScalarCast = CK_IntegralToFloating;
10324 if (ScalarCast != CK_NoOp)
10332 bool AllowBothBool,
10333 bool AllowBoolConversions,
10334 bool AllowBoolOperation,
10335 bool ReportInvalid) {
10336 if (!IsCompAssign) {
10352 assert(LHSVecType || RHSVecType);
10360 (RHSVecType && RHSVecType->getElementType()->isMFloat8Type()))
10365 if (!AllowBothBool && LHSVecType &&
10371 if (!AllowBoolOperation &&
10376 if (
Context.hasSameType(LHSType, RHSType))
10377 return Context.getCommonSugaredType(LHSType, RHSType);
10380 if (LHSVecType && RHSVecType &&
10381 Context.areCompatibleVectorTypes(LHSType, RHSType)) {
10395 if (AllowBoolConversions && LHSVecType && RHSVecType &&
10398 Context.getTypeSize(RHSVecType->getElementType()))) {
10405 if (!IsCompAssign &&
10408 RHSVecType->getElementType()->isIntegerType()) {
10417 unsigned &SVEorRVV) {
10438 if (IsSveRVVConversion(LHSType, RHSType, SVEorRVV) ||
10439 IsSveRVVConversion(RHSType, LHSType, SVEorRVV)) {
10440 Diag(Loc, diag::err_typecheck_sve_rvv_ambiguous)
10441 << SVEorRVV << LHSType << RHSType;
10448 unsigned &SVEorRVV) {
10453 if (FirstVecType && SecondVecType) {
10456 SecondVecType->getVectorKind() ==
10461 SecondVecType->getVectorKind() ==
10463 SecondVecType->getVectorKind() ==
10465 SecondVecType->getVectorKind() ==
10474 if (SecondVecType &&
10487 if (IsSveRVVGnuConversion(LHSType, RHSType, SVEorRVV) ||
10488 IsSveRVVGnuConversion(RHSType, LHSType, SVEorRVV)) {
10489 Diag(Loc, diag::err_typecheck_sve_rvv_gnu_ambiguous)
10490 << SVEorRVV << LHSType << RHSType;
10496 unsigned DiagID = diag::err_typecheck_vector_not_convertable;
10511 LHSType, RHSVecType->getElementType(),
10524 QualType VecType = LHSVecType ? LHSType : RHSType;
10525 const VectorType *VT = LHSVecType ? LHSVecType : RHSVecType;
10526 QualType OtherType = LHSVecType ? RHSType : LHSType;
10527 ExprResult *OtherExpr = LHSVecType ? &RHS : &LHS;
10529 if (
Context.getTargetInfo().getTriple().isPPC() &&
10531 !
Context.areCompatibleVectorTypes(RHSType, LHSType))
10532 Diag(Loc, diag::warn_deprecated_lax_vec_conv_all) << RHSType << LHSType;
10536 if (!IsCompAssign) {
10555 if ((!RHSVecType && !RHSType->
isRealType()) ||
10557 Diag(Loc, diag::err_typecheck_vector_not_convertable_non_scalar)
10558 << LHSType << RHSType
10570 Diag(Loc, diag::err_opencl_implicit_vector_conversion) << LHSType
10581 QualType Scalar = LHSVecType ? RHSType : LHSType;
10583 unsigned ScalarOrVector = LHSVecType && RHSVecType ? 1 : 0;
10585 diag::err_typecheck_vector_not_convertable_implict_truncation)
10586 << ScalarOrVector << Scalar <<
Vector;
10593 << LHSType << RHSType
10602 if (!IsCompAssign) {
10617 unsigned DiagID = diag::err_typecheck_invalid_operands;
10619 ((LHSBuiltinTy && LHSBuiltinTy->
isSVEBool()) ||
10620 (RHSBuiltinTy && RHSBuiltinTy->isSVEBool()))) {
10626 if (
Context.hasSameType(LHSType, RHSType))
10641 Diag(Loc, diag::err_typecheck_vector_not_convertable_non_scalar)
10648 Context.getBuiltinVectorTypeInfo(LHSBuiltinTy).EC !=
10649 Context.getBuiltinVectorTypeInfo(RHSBuiltinTy).EC) {
10650 Diag(Loc, diag::err_typecheck_vector_lengths_not_equal)
10659 bool ScalarOrVector =
10662 Diag(Loc, diag::err_typecheck_vector_not_convertable_implict_truncation)
10663 << ScalarOrVector << Scalar <<
Vector;
10695 S.
Diag(Loc, diag::warn_null_in_arithmetic_operation)
10707 S.
Diag(Loc, diag::warn_null_in_comparison_operation)
10708 << LHSNull << NonNullType
10720 QualType ElementType = CT->getElementType();
10721 bool IsComplexRangePromoted = S.
getLangOpts().getComplexRange() ==
10728 const llvm::fltSemantics &ElementTypeSemantics =
10730 const llvm::fltSemantics &HigherElementTypeSemantics =
10733 if ((llvm::APFloat::semanticsMaxExponent(ElementTypeSemantics) * 2 + 1 >
10734 llvm::APFloat::semanticsMaxExponent(HigherElementTypeSemantics)) ||
10741 if (
Type == HigherElementType) {
10753 const auto *LUE = dyn_cast<UnaryExprOrTypeTraitExpr>(LHS);
10754 const auto *RUE = dyn_cast<UnaryExprOrTypeTraitExpr>(RHS);
10757 if (LUE->getKind() != UETT_SizeOf || LUE->isArgumentType() ||
10758 RUE->getKind() != UETT_SizeOf)
10765 if (RUE->isArgumentType())
10766 RHSTy = RUE->getArgumentType().getNonReferenceType();
10768 RHSTy = RUE->getArgumentExpr()->IgnoreParens()->getType();
10775 if (
const auto *DRE = dyn_cast<DeclRefExpr>(LHSArg)) {
10776 if (
const ValueDecl *LHSArgDecl = DRE->getDecl())
10777 S.
Diag(LHSArgDecl->getLocation(), diag::note_pointer_declared_here)
10781 QualType ArrayElemTy = ArrayTy->getElementType();
10787 S.
Diag(Loc, diag::warn_division_sizeof_array)
10789 if (
const auto *DRE = dyn_cast<DeclRefExpr>(LHSArg)) {
10790 if (
const ValueDecl *LHSArgDecl = DRE->getDecl())
10791 S.
Diag(LHSArgDecl->getLocation(), diag::note_array_declared_here)
10795 S.
Diag(Loc, diag::note_precedence_silence) << RHS;
10808 S.
PDiag(diag::warn_remainder_division_by_zero)
10817 const Expr *LHSExpr = LHS.
get();
10818 const Expr *RHSExpr = RHS.
get();
10823 if (!LHSIsScoped && !RHSIsScoped)
10834 ->getOriginalDecl()
10835 ->getDefinitionOrSelf()
10836 ->getIntegerType();
10837 std::string InsertionString =
"static_cast<" + IntType.getAsString() +
">(";
10838 S.
Diag(BeginLoc, diag::note_no_implicit_conversion_for_scoped_enum)
10843 DiagnosticHelper(LHSExpr, LHSType);
10846 DiagnosticHelper(RHSExpr, RHSType);
10853 bool IsCompAssign = Opc == BO_MulAssign || Opc == BO_DivAssign;
10854 bool IsDiv = Opc == BO_Div || Opc == BO_DivAssign;
10948 if (compType.
isNull() ||
10953 IsCompAssign ? BO_RemAssign : BO_Rem);
10964 ? diag::err_typecheck_pointer_arith_void_type
10965 : diag::ext_gnu_void_ptr)
10974 ? diag::err_typecheck_pointer_arith_void_type
10975 : diag::ext_gnu_void_ptr)
10976 << 0 <<
Pointer->getSourceRange();
10987 S.
Diag(Loc, diag::warn_gnu_null_ptr_arith)
10988 <<
Pointer->getSourceRange();
10990 S.
Diag(Loc, diag::warn_pointer_arith_null_ptr)
11007 S.
PDiag(diag::warn_pointer_sub_null_ptr)
11009 <<
Pointer->getSourceRange());
11018 ? diag::err_typecheck_pointer_arith_function_type
11019 : diag::ext_gnu_ptr_func_arith)
11031 assert(
Pointer->getType()->isAnyPointerType());
11033 ? diag::err_typecheck_pointer_arith_function_type
11034 : diag::ext_gnu_ptr_func_arith)
11035 << 0 <<
Pointer->getType()->getPointeeType()
11037 <<
Pointer->getSourceRange();
11045 QualType ResType = Operand->getType();
11047 ResType = ResAtomicType->getValueType();
11053 diag::err_typecheck_arithmetic_incomplete_or_sizeless_type,
11054 Operand->getSourceRange());
11067 QualType ResType = Operand->getType();
11069 ResType = ResAtomicType->getValueType();
11101 if (!isLHSPointer && !isRHSPointer)
return true;
11103 QualType LHSPointeeTy, RHSPointeeTy;
11108 if (isLHSPointer && isRHSPointer) {
11112 diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
11120 bool isLHSVoidPtr = isLHSPointer && LHSPointeeTy->
isVoidType();
11121 bool isRHSVoidPtr = isRHSPointer && RHSPointeeTy->
isVoidType();
11122 if (isLHSVoidPtr || isRHSVoidPtr) {
11130 bool isLHSFuncPtr = isLHSPointer && LHSPointeeTy->
isFunctionType();
11131 bool isRHSFuncPtr = isRHSPointer && RHSPointeeTy->
isFunctionType();
11132 if (isLHSFuncPtr || isRHSFuncPtr) {
11154 Expr* IndexExpr = RHSExpr;
11157 IndexExpr = LHSExpr;
11160 bool IsStringPlusInt = StrExpr &&
11166 Self.Diag(OpLoc, diag::warn_string_plus_int)
11170 if (IndexExpr == RHSExpr) {
11172 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence)
11177 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence);
11183 const Expr *StringRefExpr = LHSExpr;
11188 CharExpr = dyn_cast<CharacterLiteral>(LHSExpr->
IgnoreImpCasts());
11189 StringRefExpr = RHSExpr;
11192 if (!CharExpr || !StringRefExpr)
11212 Self.Diag(OpLoc, diag::warn_string_plus_char)
11213 << DiagRange << Ctx.
CharTy;
11215 Self.Diag(OpLoc, diag::warn_string_plus_char)
11216 << DiagRange << CharExpr->
getType();
11222 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence)
11227 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence);
11236 S.
Diag(Loc, diag::err_typecheck_sub_ptr_compatible)
11255 if (CompLHSTy) *CompLHSTy = compType;
11264 *CompLHSTy = compType;
11273 *CompLHSTy = compType;
11284 if (Opc == BO_Add) {
11291 if (CompLHSTy) *CompLHSTy = compType;
11305 std::swap(PExp, IExp);
11318 if (!IExp->getType()->isIntegerType())
11327 (!IExp->isValueDependent() &&
11328 (!IExp->EvaluateAsInt(KnownVal,
Context) ||
11332 Context, BO_Add, PExp, IExp);
11346 Diag(Loc, diag::err_ptrauth_indirect_goto_addrlabel_arithmetic)
11352 CheckArrayAccess(PExp, IExp);
11358 if (
Context.isPromotableIntegerType(LHSTy))
11359 LHSTy =
Context.getPromotedIntegerType(LHSTy);
11361 *CompLHSTy = LHSTy;
11382 if (CompLHSTy) *CompLHSTy = compType;
11391 *CompLHSTy = compType;
11400 *CompLHSTy = compType;
11414 if (CompLHSTy) *CompLHSTy = compType;
11431 Diag(Loc, diag::err_ptrauth_indirect_goto_addrlabel_arithmetic)
11457 CheckArrayAccess(LHS.
get(), RHS.
get(),
nullptr,
11460 if (CompLHSTy) *CompLHSTy = LHS.
get()->
getType();
11471 if (!
Context.hasSameUnqualifiedType(lpointee, rpointee)) {
11476 if (!
Context.typesAreCompatible(
11477 Context.getCanonicalType(lpointee).getUnqualifiedType(),
11478 Context.getCanonicalType(rpointee).getUnqualifiedType())) {
11504 if (ElementSize.
isZero()) {
11505 Diag(Loc,diag::warn_sub_ptr_zero_size_types)
11511 if (CompLHSTy) *CompLHSTy = LHS.
get()->
getType();
11512 return Context.getPointerDiffType();
11522 if (
const EnumType *ET =
T->getAsCanonical<EnumType>())
11523 return ET->getOriginalDecl()->isScoped();
11535 if (Opc == BO_Shr &&
11544 llvm::APSInt Right = RHSResult.
Val.
getInt();
11546 if (Right.isNegative()) {
11548 S.
PDiag(diag::warn_shift_negative)
11559 LeftSize = FXSema.getWidth() - (
unsigned)FXSema.hasUnsignedPadding();
11561 if (Right.uge(LeftSize)) {
11563 S.
PDiag(diag::warn_shift_gt_typewidth)
11583 llvm::APSInt Left = LHSResult.
Val.
getInt();
11594 if (Left.isNegative()) {
11596 S.
PDiag(diag::warn_shift_lhs_negative)
11601 llvm::APInt ResultBits =
11602 static_cast<llvm::APInt &
>(Right) + Left.getSignificantBits();
11603 if (ResultBits.ule(LeftSize))
11605 llvm::APSInt Result = Left.extend(ResultBits.getLimitedValue());
11606 Result = Result.shl(Right);
11611 Result.toString(HexResult, 16,
false,
true);
11617 if (ResultBits - 1 == LeftSize) {
11618 S.
Diag(Loc, diag::warn_shift_result_sets_sign_bit)
11619 << HexResult << LHSType
11624 S.
Diag(Loc, diag::warn_shift_result_gt_typewidth)
11625 << HexResult.str() << Result.getSignificantBits() << LHSType
11637 S.
Diag(Loc, diag::err_shift_rhs_only_vector)
11643 if (!IsCompAssign) {
11665 S.
Diag(Loc, diag::err_typecheck_invalid_operands)
11672 if (!LHSEleType->isIntegerType()) {
11673 S.
Diag(Loc, diag::err_typecheck_expect_int)
11678 if (!RHSEleType->isIntegerType()) {
11679 S.
Diag(Loc, diag::err_typecheck_expect_int)
11688 if (LHSEleType != RHSEleType) {
11690 LHSEleType = RHSEleType;
11696 }
else if (RHSVecTy) {
11701 S.
Diag(Loc, diag::err_typecheck_vector_lengths_not_equal)
11709 if (LHSBT != RHSBT &&
11711 S.
Diag(Loc, diag::warn_typecheck_vector_element_sizes_not_equal)
11728 bool IsCompAssign) {
11729 if (!IsCompAssign) {
11752 if ((LHSBuiltinTy && LHSBuiltinTy->
isSVEBool()) ||
11753 (RHSBuiltinTy && RHSBuiltinTy->
isSVEBool())) {
11754 S.
Diag(Loc, diag::err_typecheck_invalid_operands)
11759 if (!LHSEleType->isIntegerType()) {
11760 S.
Diag(Loc, diag::err_typecheck_expect_int)
11765 if (!RHSEleType->isIntegerType()) {
11766 S.
Diag(Loc, diag::err_typecheck_expect_int)
11774 S.
Diag(Loc, diag::err_typecheck_invalid_operands)
11784 if (LHSEleType != RHSEleType) {
11786 LHSEleType = RHSEleType;
11788 const llvm::ElementCount VecSize =
11797 S.
Diag(Loc, diag::err_typecheck_vector_lengths_not_equal)
11803 const llvm::ElementCount VecSize =
11805 if (LHSEleType != RHSEleType) {
11807 RHSEleType = LHSEleType;
11820 bool IsCompAssign) {
11854 if (IsCompAssign) LHS = OldLHS;
11882 S.
Diag(Loc, IsError ? diag::err_typecheck_comparison_of_distinct_pointers
11883 : diag::ext_typecheck_comparison_of_distinct_pointers)
11923 S.
Diag(Loc, IsError ? diag::err_typecheck_comparison_of_fptr_to_void
11924 : diag::ext_typecheck_comparison_of_fptr_to_void)
11931 case Stmt::ObjCArrayLiteralClass:
11932 case Stmt::ObjCDictionaryLiteralClass:
11933 case Stmt::ObjCStringLiteralClass:
11934 case Stmt::ObjCBoxedExprClass:
11978 QualType T = Method->parameters()[0]->getType();
11979 if (!
T->isObjCObjectPointerType())
11982 QualType R = Method->getReturnType();
11995 Literal = LHS.
get();
11998 Literal = RHS.
get();
12014 llvm_unreachable(
"Unknown Objective-C object literal kind");
12018 S.
Diag(Loc, diag::warn_objc_string_literal_comparison)
12019 << Literal->getSourceRange();
12021 S.
Diag(Loc, diag::warn_objc_literal_comparison)
12022 << LiteralKind << Literal->getSourceRange();
12031 S.
Diag(Loc, diag::note_objc_literal_comparison_isequal)
12044 if (!UO || UO->
getOpcode() != UO_LNot)
return;
12054 bool IsBitwiseOp = Opc == BO_And || Opc == BO_Or || Opc == BO_Xor;
12056 << Loc << IsBitwiseOp;
12083 if (
const DeclRefExpr *DR = dyn_cast<DeclRefExpr>(E)) {
12085 }
else if (
const MemberExpr *Mem = dyn_cast<MemberExpr>(E)) {
12086 if (Mem->isImplicitAccess())
12087 D = Mem->getMemberDecl();
12102 return std::nullopt;
12110 std::swap(LHS, RHS);
12114 std::swap(LHS, RHS);
12118 return std::nullopt;
12121 auto *BO = dyn_cast<BinaryOperator>(LHS);
12122 if (!BO || BO->getOpcode() != BO_Add)
12123 return std::nullopt;
12127 Other = BO->getRHS();
12129 Other = BO->getLHS();
12131 return std::nullopt;
12133 if (!
Other->getType()->isUnsignedIntegerType())
12134 return std::nullopt;
12136 return Opc == BO_GE;
12190 auto IsDeprArrayComparionIgnored =
12193 ? diag::warn_array_comparison_cxx26
12194 : !S.
getLangOpts().CPlusPlus20 || IsDeprArrayComparionIgnored
12195 ? diag::warn_array_comparison
12196 : diag::warn_depr_array_comparison;
12211 Result = AlwaysTrue;
12216 Result = AlwaysFalse;
12219 Result = AlwaysEqual;
12222 Result = AlwaysConstant;
12226 S.
PDiag(diag::warn_comparison_always)
12234 Result = AlwaysFalse;
12237 Result = AlwaysTrue;
12241 Result = AlwaysConstant;
12245 S.
PDiag(diag::warn_comparison_always)
12248 }
else if (std::optional<bool> Res =
12251 S.
PDiag(diag::warn_comparison_always)
12253 << (*Res ? AlwaysTrue : AlwaysFalse));
12264 Expr *LiteralString =
nullptr;
12265 Expr *LiteralStringStripped =
nullptr;
12269 LiteralString = LHS;
12270 LiteralStringStripped = LHSStripped;
12275 LiteralString = RHS;
12276 LiteralStringStripped = RHSStripped;
12279 if (LiteralString) {
12281 S.
PDiag(diag::warn_stringcompare)
12294 llvm_unreachable(
"unhandled cast kind");
12296 case CK_UserDefinedConversion:
12298 case CK_LValueToRValue:
12300 case CK_ArrayToPointerDecay:
12302 case CK_FunctionToPointerDecay:
12304 case CK_IntegralCast:
12306 case CK_FloatingCast:
12308 case CK_IntegralToFloating:
12309 case CK_FloatingToIntegral:
12311 case CK_IntegralComplexCast:
12312 case CK_FloatingComplexCast:
12313 case CK_FloatingComplexToIntegralComplex:
12314 case CK_IntegralComplexToFloatingComplex:
12316 case CK_FloatingComplexToReal:
12317 case CK_FloatingRealToComplex:
12318 case CK_IntegralComplexToReal:
12319 case CK_IntegralRealToComplex:
12321 case CK_HLSLArrayRValue:
12334 if (
const auto *ICE = dyn_cast<ImplicitCastExpr>(E))
12361 << 0 << FromType << ToType;
12366 llvm_unreachable(
"unhandled case in switch");
12393 if (NumEnumArgs == 1) {
12395 QualType OtherTy = LHSIsEnum ? RHSStrippedType : LHSStrippedType;
12401 if (NumEnumArgs == 2) {
12410 assert(IntType->isArithmeticType());
12420 LHSType = RHSType = IntType;
12429 if (
Type.isNull()) {
12435 std::optional<ComparisonCategoryType> CCT =
12447 assert(!
Type.isNull() &&
"composite type for <=> has not been set");
12465 if (
Type.isNull()) {
12486 int NullValue =
PP.isMacroDefined(
"NULL") ? 0 : 1;
12491 if (
const auto *
CL = dyn_cast<CharacterLiteral>(E.
get())) {
12492 if (
CL->getValue() == 0)
12496 NullValue ?
"NULL" :
"(void *)0");
12497 }
else if (
const auto *CE = dyn_cast<CStyleCastExpr>(E.
get())) {
12504 NullValue ?
"NULL" :
"(void *)0");
12514 bool IsThreeWay = Opc == BO_Cmp;
12515 bool IsOrdered = IsRelational || IsThreeWay;
12526 if (!IsThreeWay || IsAnyPointerType(LHS) || IsAnyPointerType(RHS)) {
12579 auto computeResultTy = [&]() {
12588 std::optional<ComparisonCategoryType> CCT =
12593 if (CompositeTy->
isPointerType() && LHSIsNull != RHSIsNull) {
12597 Diag(Loc, diag::err_typecheck_three_way_comparison_of_pointer_and_zero)
12598 << (LHSIsNull ? LHS.
get()->getSourceRange()
12607 if (!IsOrdered && LHSIsNull != RHSIsNull) {
12608 bool IsEquality = Opc == BO_EQ;
12620 bool IsError = Opc == BO_Cmp;
12622 IsError ? diag::err_typecheck_ordered_comparison_of_function_pointers
12624 ? diag::warn_typecheck_ordered_comparison_of_function_pointers
12625 : diag::ext_typecheck_ordered_comparison_of_function_pointers;
12654 return computeResultTy();
12670 (IsOrdered ? 2 : 1) &&
12675 return computeResultTy();
12689 if (IsRelational) {
12694 Diag(Loc, diag::ext_typecheck_compare_complete_incomplete_pointers)
12700 }
else if (!IsRelational &&
12704 && !LHSIsNull && !RHSIsNull)
12711 if (LCanPointeeTy != RCanPointeeTy) {
12717 diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
12718 << LHSType << RHSType << 0
12724 CastKind Kind = AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion
12730 bool RHSHasCFIUncheckedCallee = RFn && RFn->getCFIUncheckedCalleeAttr();
12731 bool ChangingCFIUncheckedCallee =
12732 LHSHasCFIUncheckedCallee != RHSHasCFIUncheckedCallee;
12734 if (LHSIsNull && !RHSIsNull)
12736 else if (!ChangingCFIUncheckedCallee)
12739 return computeResultTy();
12751 if (!IsOrdered && LHSIsNull && RHSIsNull) {
12754 return computeResultTy();
12758 return computeResultTy();
12769 return computeResultTy();
12773 return computeResultTy();
12782 return computeResultTy();
12787 return computeResultTy();
12791 if (IsRelational &&
12802 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
12803 if (CTSD->isInStdNamespace() &&
12804 llvm::StringSwitch<bool>(CTSD->getName())
12805 .Cases(
"less",
"less_equal",
"greater",
"greater_equal",
true)
12811 return computeResultTy();
12824 return computeResultTy();
12834 if (!LHSIsNull && !RHSIsNull &&
12835 !
Context.typesAreCompatible(lpointee, rpointee)) {
12836 Diag(Loc, diag::err_typecheck_comparison_of_distinct_blocks)
12841 return computeResultTy();
12848 if (!LHSIsNull && !RHSIsNull) {
12853 Diag(Loc, diag::err_typecheck_comparison_of_distinct_blocks)
12857 if (LHSIsNull && !RHSIsNull)
12860 : CK_AnyPointerToBlockPointerCast);
12864 : CK_AnyPointerToBlockPointerCast);
12865 return computeResultTy();
12874 bool RPtrToVoid = RPT ? RPT->getPointeeType()->isVoidType() :
false;
12876 if (!LPtrToVoid && !RPtrToVoid &&
12877 !
Context.typesAreCompatible(LHSType, RHSType)) {
12884 if (LHSIsNull && !RHSIsNull) {
12890 RPT ? CK_BitCast :CK_CPointerToObjCPointerCast);
12900 LPT ? CK_BitCast :CK_CPointerToObjCPointerCast);
12902 return computeResultTy();
12906 if (!
Context.areComparableObjCPointerTypes(LHSType, RHSType))
12912 if (LHSIsNull && !RHSIsNull)
12916 return computeResultTy();
12922 CK_BlockPointerToObjCPointerCast);
12923 return computeResultTy();
12924 }
else if (!IsOrdered &&
12928 CK_BlockPointerToObjCPointerCast);
12929 return computeResultTy();
12934 unsigned DiagID = 0;
12935 bool isError =
false;
12944 isError ? diag::err_typecheck_ordered_comparison_of_pointer_and_zero
12945 : diag::ext_typecheck_ordered_comparison_of_pointer_and_zero;
12948 DiagID = diag::err_typecheck_comparison_of_pointer_integer;
12950 }
else if (IsOrdered)
12951 DiagID = diag::ext_typecheck_ordered_comparison_of_pointer_integer;
12953 DiagID = diag::ext_typecheck_comparison_of_pointer_integer;
12965 LHSIsNull ? CK_NullToPointer : CK_IntegralToPointer);
12968 RHSIsNull ? CK_NullToPointer : CK_IntegralToPointer);
12969 return computeResultTy();
12973 if (!IsOrdered && RHSIsNull
12976 return computeResultTy();
12978 if (!IsOrdered && LHSIsNull
12981 return computeResultTy();
12984 if (
getLangOpts().getOpenCLCompatibleVersion() >= 200) {
12986 return computeResultTy();
12990 return computeResultTy();
12993 if (LHSIsNull && RHSType->
isQueueT()) {
12995 return computeResultTy();
12998 if (LHSType->
isQueueT() && RHSIsNull) {
13000 return computeResultTy();
13025 "Unhandled vector element size in vector compare");
13045 "Unhandled vector element size in vector compare");
13055 const auto TypeSize =
Context.getTypeSize(ETy);
13057 const QualType IntTy =
Context.getIntTypeForBitwidth(TypeSize,
true);
13058 const llvm::ElementCount VecSize =
Context.getBuiltinVectorTypeInfo(VTy).EC;
13059 return Context.getScalableVectorType(IntTy, VecSize.getKnownMinValue());
13065 if (Opc == BO_Cmp) {
13066 Diag(Loc, diag::err_three_way_vector_comparison);
13095 return Context.getLogicalOperationType();
13097 Diag(Loc, diag::warn_deprecated_altivec_src_compat);
13103 return Context.getLogicalOperationType();
13127 if (Opc == BO_Cmp) {
13128 Diag(Loc, diag::err_three_way_vector_comparison);
13156 if (LHSBuiltinTy && RHSBuiltinTy && LHSBuiltinTy->
isSVEBool() &&
13157 RHSBuiltinTy->isSVEBool())
13176 bool Negative =
false;
13177 bool ExplicitPlus =
false;
13178 const auto *LHSInt = dyn_cast<IntegerLiteral>(XorLHS.
get());
13179 const auto *RHSInt = dyn_cast<IntegerLiteral>(XorRHS.
get());
13185 if (
const auto *UO = dyn_cast<UnaryOperator>(XorRHS.
get())) {
13187 if (Opc != UO_Minus && Opc != UO_Plus)
13189 RHSInt = dyn_cast<IntegerLiteral>(UO->getSubExpr());
13192 Negative = (Opc == UO_Minus);
13193 ExplicitPlus = !Negative;
13199 const llvm::APInt &LeftSideValue = LHSInt->getValue();
13200 llvm::APInt RightSideValue = RHSInt->getValue();
13201 if (LeftSideValue != 2 && LeftSideValue != 10)
13204 if (LeftSideValue.getBitWidth() != RightSideValue.getBitWidth())
13209 llvm::StringRef ExprStr =
13214 llvm::StringRef XorStr =
13217 if (XorStr ==
"xor")
13228 RightSideValue = -RightSideValue;
13229 RHSStr =
"-" + RHSStr;
13230 }
else if (ExplicitPlus) {
13231 RHSStr =
"+" + RHSStr;
13234 StringRef LHSStrRef = LHSStr;
13235 StringRef RHSStrRef = RHSStr;
13238 if (LHSStrRef.starts_with(
"0b") || LHSStrRef.starts_with(
"0B") ||
13239 RHSStrRef.starts_with(
"0b") || RHSStrRef.starts_with(
"0B") ||
13240 LHSStrRef.starts_with(
"0x") || LHSStrRef.starts_with(
"0X") ||
13241 RHSStrRef.starts_with(
"0x") || RHSStrRef.starts_with(
"0X") ||
13242 (LHSStrRef.size() > 1 && LHSStrRef.starts_with(
"0")) ||
13243 (RHSStrRef.size() > 1 && RHSStrRef.starts_with(
"0")) ||
13244 LHSStrRef.contains(
'\'') || RHSStrRef.contains(
'\''))
13249 const llvm::APInt XorValue = LeftSideValue ^ RightSideValue;
13250 int64_t RightSideIntValue = RightSideValue.getSExtValue();
13251 if (LeftSideValue == 2 && RightSideIntValue >= 0) {
13252 std::string SuggestedExpr =
"1 << " + RHSStr;
13253 bool Overflow =
false;
13254 llvm::APInt One = (LeftSideValue - 1);
13255 llvm::APInt PowValue = One.sshl_ov(RightSideValue, Overflow);
13257 if (RightSideIntValue < 64)
13258 S.
Diag(Loc, diag::warn_xor_used_as_pow_base)
13259 << ExprStr <<
toString(XorValue, 10,
true) << (
"1LL << " + RHSStr)
13261 else if (RightSideIntValue == 64)
13262 S.
Diag(Loc, diag::warn_xor_used_as_pow)
13263 << ExprStr <<
toString(XorValue, 10,
true);
13267 S.
Diag(Loc, diag::warn_xor_used_as_pow_base_extra)
13268 << ExprStr <<
toString(XorValue, 10,
true) << SuggestedExpr
13271 ExprRange, (RightSideIntValue == 0) ?
"1" : SuggestedExpr);
13274 S.
Diag(Loc, diag::note_xor_used_as_pow_silence)
13275 << (
"0x2 ^ " + RHSStr) << SuggestXor;
13276 }
else if (LeftSideValue == 10) {
13277 std::string SuggestedValue =
"1e" + std::to_string(RightSideIntValue);
13278 S.
Diag(Loc, diag::warn_xor_used_as_pow_base)
13279 << ExprStr <<
toString(XorValue, 10,
true) << SuggestedValue
13281 S.
Diag(Loc, diag::note_xor_used_as_pow_silence)
13282 << (
"0xA ^ " + RHSStr) << SuggestXor;
13299 getLangOpts().getOpenCLCompatibleVersion() < 120 &&
13323 bool IsCompAssign) {
13324 if (!IsCompAssign) {
13340 assert((LHSMatType || RHSMatType) &&
"At least one operand must be a matrix");
13342 if (
Context.hasSameType(LHSType, RHSType))
13343 return Context.getCommonSugaredType(LHSType, RHSType);
13349 if (LHSMatType && !RHSMatType) {
13357 if (!LHSMatType && RHSMatType) {
13369 bool IsCompAssign) {
13370 if (!IsCompAssign) {
13381 assert((LHSMatType || RHSMatType) &&
"At least one operand must be a matrix");
13383 if (LHSMatType && RHSMatType) {
13384 if (LHSMatType->getNumColumns() != RHSMatType->
getNumRows())
13387 if (
Context.hasSameType(LHSMatType, RHSMatType))
13388 return Context.getCommonSugaredType(
13392 QualType LHSELTy = LHSMatType->getElementType(),
13394 if (!
Context.hasSameType(LHSELTy, RHSELTy))
13397 return Context.getConstantMatrixType(
13398 Context.getCommonSugaredType(LHSELTy, RHSELTy),
13423 bool IsCompAssign =
13424 Opc == BO_AndAssign || Opc == BO_OrAssign || Opc == BO_XorAssign;
13435 LegalBoolVecOperator,
13465 ExprResult LHSResult = LHS, RHSResult = RHS;
13467 LHSResult, RHSResult, Loc,
13469 if (LHSResult.
isInvalid() || RHSResult.isInvalid())
13471 LHS = LHSResult.
get();
13472 RHS = RHSResult.
get();
13493 bool EnumConstantInBoolContext =
false;
13495 if (
const auto *DREHS = dyn_cast<DeclRefExpr>(HS.get())) {
13496 const auto *ECDHS = dyn_cast<EnumConstantDecl>(DREHS->getDecl());
13497 if (ECDHS && ECDHS->getInitVal() != 0 && ECDHS->getInitVal() != 1)
13498 EnumConstantInBoolContext =
true;
13502 if (EnumConstantInBoolContext)
13503 Diag(Loc, diag::warn_enum_constant_in_bool_context);
13508 const auto *LHSATy = dyn_cast<ArrayType>(LHSTy);
13509 const auto *RHSATy = dyn_cast<ArrayType>(RHSTy);
13510 if ((LHSATy && LHSATy->getElementType().isWebAssemblyReferenceType()) ||
13511 (RHSATy && RHSATy->getElementType().isWebAssemblyReferenceType())) {
13533 Diag(Loc, diag::warn_logical_instead_of_bitwise)
13536 Diag(Loc, diag::note_logical_instead_of_bitwise_change_operator)
13537 << (Opc == BO_LAnd ?
"&" :
"|")
13540 Opc == BO_LAnd ?
"&" :
"|");
13541 if (Opc == BO_LAnd)
13543 Diag(Loc, diag::note_logical_instead_of_bitwise_remove_constant)
13551 if (!
Context.getLangOpts().CPlusPlus) {
13554 if (
Context.getLangOpts().OpenCL &&
13555 Context.getLangOpts().OpenCLVersion < 120) {
13605 const MemberExpr *ME = dyn_cast<MemberExpr>(E);
13606 if (!ME)
return false;
13610 if (!
Base)
return false;
13611 return Base->getMethodDecl() !=
nullptr;
13635 assert(S.
getLangOpts().CPlusPlus &&
"BindingDecl outside of C++?");
13646 assert(Var->
hasLocalStorage() &&
"capture added 'const' to non-local?");
13654 if (
auto *FD = dyn_cast<FunctionDecl>(DC))
13697 bool DiagnosticEmitted =
false;
13701 bool IsDereference =
false;
13702 bool NextIsDereference =
false;
13706 IsDereference = NextIsDereference;
13709 if (
const MemberExpr *ME = dyn_cast<MemberExpr>(E)) {
13710 NextIsDereference = ME->isArrow();
13711 const ValueDecl *VD = ME->getMemberDecl();
13712 if (
const FieldDecl *Field = dyn_cast<FieldDecl>(VD)) {
13714 if (Field->isMutable()) {
13715 assert(DiagnosticEmitted &&
"Expected diagnostic not emitted.");
13720 if (!DiagnosticEmitted) {
13721 S.
Diag(Loc, diag::err_typecheck_assign_const)
13723 << Field->getType();
13724 DiagnosticEmitted =
true;
13727 <<
ConstMember <<
false << Field << Field->getType()
13728 << Field->getSourceRange();
13732 }
else if (
const VarDecl *VDecl = dyn_cast<VarDecl>(VD)) {
13733 if (VDecl->getType().isConstQualified()) {
13734 if (!DiagnosticEmitted) {
13735 S.
Diag(Loc, diag::err_typecheck_assign_const)
13737 << VDecl->getType();
13738 DiagnosticEmitted =
true;
13741 <<
ConstMember <<
true << VDecl << VDecl->getType()
13742 << VDecl->getSourceRange();
13749 dyn_cast<ArraySubscriptExpr>(E)) {
13753 dyn_cast<ExtVectorElementExpr>(E)) {
13760 if (
const CallExpr *CE = dyn_cast<CallExpr>(E)) {
13764 if (!DiagnosticEmitted) {
13765 S.
Diag(Loc, diag::err_typecheck_assign_const) << ExprRange
13767 DiagnosticEmitted =
true;
13770 diag::note_typecheck_assign_const)
13774 }
else if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
13776 if (
const ValueDecl *VD = DRE->getDecl()) {
13778 if (!DiagnosticEmitted) {
13779 S.
Diag(Loc, diag::err_typecheck_assign_const)
13781 DiagnosticEmitted =
true;
13783 S.
Diag(VD->getLocation(), diag::note_typecheck_assign_const)
13784 <<
ConstVariable << VD << VD->getType() << VD->getSourceRange();
13789 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(DC)) {
13790 if (MD->isConst()) {
13791 if (!DiagnosticEmitted) {
13792 S.
Diag(Loc, diag::err_typecheck_assign_const) << ExprRange
13794 DiagnosticEmitted =
true;
13796 S.
Diag(MD->getLocation(), diag::note_typecheck_assign_const)
13803 if (DiagnosticEmitted)
13807 S.
Diag(Loc, diag::err_typecheck_assign_const) << ExprRange <<
ConstUnknown;
13817 const RecordType *Ty,
13820 bool &DiagnosticEmitted) {
13821 std::vector<const RecordType *> RecordTypeList;
13822 RecordTypeList.push_back(Ty);
13823 unsigned NextToCheckIndex = 0;
13826 while (RecordTypeList.size() > NextToCheckIndex) {
13827 bool IsNested = NextToCheckIndex > 0;
13828 for (
const FieldDecl *Field : RecordTypeList[NextToCheckIndex]
13829 ->getOriginalDecl()
13833 QualType FieldTy = Field->getType();
13835 if (!DiagnosticEmitted) {
13836 S.
Diag(Loc, diag::err_typecheck_assign_const)
13838 << IsNested << Field;
13839 DiagnosticEmitted =
true;
13841 S.
Diag(Field->getLocation(), diag::note_typecheck_assign_const)
13843 << FieldTy << Field->getSourceRange();
13848 if (
const auto *FieldRecTy = FieldTy->
getAsCanonical<RecordType>()) {
13849 if (!llvm::is_contained(RecordTypeList, FieldRecTy))
13850 RecordTypeList.push_back(FieldRecTy);
13853 ++NextToCheckIndex;
13862 assert(Ty->
isRecordType() &&
"lvalue was not record?");
13865 bool DiagEmitted =
false;
13867 if (
const MemberExpr *ME = dyn_cast<MemberExpr>(E))
13870 else if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
13895 unsigned DiagID = 0;
13896 bool NeedType =
false;
13903 DiagID = diag::err_block_decl_ref_not_modifiable_lvalue;
13905 DiagID = diag::err_lambda_decl_ref_not_modifiable_lvalue;
13918 if (var->isARCPseudoStrong() &&
13919 (!var->getTypeSourceInfo() ||
13920 !var->getTypeSourceInfo()->getType().isConstQualified())) {
13926 ? diag::err_typecheck_arc_assign_self_class_method
13927 : diag::err_typecheck_arc_assign_self;
13930 }
else if (var->hasAttr<ObjCExternallyRetainedAttr>() ||
13932 DiagID = diag::err_typecheck_arc_assign_externally_retained;
13936 DiagID = diag::err_typecheck_arr_assign_enumeration;
13940 if (Loc != OrigLoc)
13966 DiagID = diag::err_typecheck_array_not_modifiable_lvalue;
13970 DiagID = diag::err_typecheck_non_object_not_modifiable_lvalue;
13974 DiagID = diag::err_typecheck_lvalue_casts_not_supported;
13977 llvm_unreachable(
"did not take early return for MLV_Valid");
13981 DiagID = diag::err_typecheck_expression_not_modifiable_lvalue;
13986 diag::err_typecheck_incomplete_type_not_modifiable_lvalue, E);
13988 DiagID = diag::err_typecheck_duplicate_vector_components_not_mlvalue;
13991 llvm_unreachable(
"readonly properties should be processed differently");
13993 DiagID = diag::err_readonly_message_assignment;
13996 DiagID = diag::err_no_subobject_property_setting;
14001 if (Loc != OrigLoc)
14023 MemberExpr *ML = dyn_cast<MemberExpr>(LHSExpr);
14024 MemberExpr *MR = dyn_cast<MemberExpr>(RHSExpr);
14032 if (LHSDecl != RHSDecl)
14037 if (RefTy->getPointeeType().isVolatileQualified())
14040 Sema.
Diag(Loc, diag::warn_identity_field_assign) << 0;
14050 Sema.
Diag(Loc, diag::warn_identity_field_assign) << 1;
14074 bool ShowFullyQualifiedAssigneeName =
false;
14077 Assignee = DR->getDecl();
14078 }
else if (
auto *ME = dyn_cast<MemberExpr>(LHSExpr->
IgnoreParenCasts())) {
14079 Assignee = ME->getMemberDecl();
14080 ShowFullyQualifiedAssigneeName =
true;
14085 ShowFullyQualifiedAssigneeName);
14094 Diag(Loc, diag::err_opencl_half_load_store) << 1
14101 Diag(Loc, diag::err_wasm_table_art) << 0;
14106 if (CompoundType.
isNull()) {
14117 ((
Context.isObjCNSObjectType(LHSType) &&
14119 (
Context.isObjCNSObjectType(RHSType) &&
14124 Diag(Loc, diag::err_objc_object_assignment) << LHSType;
14130 RHSCheck = ICE->getSubExpr();
14131 if (
UnaryOperator *UO = dyn_cast<UnaryOperator>(RHSCheck)) {
14132 if ((UO->getOpcode() == UO_Plus || UO->getOpcode() == UO_Minus) &&
14133 Loc.
isFileID() && UO->getOperatorLoc().isFileID() &&
14139 UO->getSubExpr()->getBeginLoc().
isFileID()) {
14140 Diag(Loc, diag::warn_not_compound_assign)
14141 << (UO->getOpcode() == UO_Plus ?
"+" :
"-")
14142 <<
SourceRange(UO->getOperatorLoc(), UO->getOperatorLoc());
14152 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(InnerLHS);
14168 if (!
Diags.isIgnored(diag::warn_arc_repeated_use_of_weak,
14191 if (CompoundType.
isNull()) {
14217 if (
const CastExpr *CE = dyn_cast<CastExpr>(E)) {
14218 if (CE->getCastKind() == CK_ToVoid) {
14224 CE->getSubExpr()->getType()->isDependentType()) {
14229 if (
const auto *CE = dyn_cast<CallExpr>(E))
14230 return CE->getCallReturnType(Context)->isVoidType();
14250 const unsigned ForIncrementFlags =
14256 if ((ScopeFlags & ForIncrementFlags) == ForIncrementFlags ||
14257 (ScopeFlags & ForInitFlags) == ForInitFlags)
14262 while (
const BinaryOperator *BO = dyn_cast<BinaryOperator>(LHS)) {
14263 if (BO->getOpcode() != BO_Comma)
14265 LHS = BO->getRHS();
14272 Diag(Loc, diag::warn_comma_operator);
14276 LangOpts.CPlusPlus ?
"static_cast<void>("
14308 diag::err_incomplete_type);
14329 ResType = ResAtomicType->getValueType();
14331 assert(!ResType.
isNull() &&
"no type for increment/decrement expression");
14341 : diag::warn_increment_bool)
14345 S.
Diag(OpLoc, diag::err_increment_decrement_enum) << IsInc << ResType;
14361 S.
Diag(OpLoc, S.
getLangOpts().C2y ? diag::warn_c2y_compat_increment_complex
14362 : diag::ext_c2y_increment_complex)
14379 S.
Diag(OpLoc, diag::err_typecheck_illegal_increment_decrement)
14390 S.
Diag(OpLoc, diag::warn_deprecated_increment_decrement_volatile)
14391 << IsInc << ResType;
14423 case Stmt::DeclRefExprClass:
14425 case Stmt::MemberExprClass:
14433 case Stmt::ArraySubscriptExprClass: {
14438 if (ICE->getSubExpr()->getType()->isArrayType())
14443 case Stmt::UnaryOperatorClass: {
14455 case Stmt::ParenExprClass:
14457 case Stmt::ImplicitCastExprClass:
14461 case Stmt::CXXUuidofExprClass:
14471 AO_Vector_Element = 1,
14472 AO_Property_Expansion = 2,
14473 AO_Register_Variable = 3,
14474 AO_Matrix_Element = 4,
14492 return Diag(OpLoc, diag::err_parens_pointer_member_function)
14497 return Diag(OpLoc, diag::err_typecheck_addrof_dtor)
14498 << DRE->getSourceRange();
14500 if (DRE->getQualifier())
14504 return Diag(OpLoc, diag::err_unqualified_pointer_member_function)
14505 << DRE->getSourceRange();
14508 StringRef Qual = (MD->
getParent()->getName() +
"::").toStringRef(Str);
14509 return Diag(OpLoc, diag::err_unqualified_pointer_member_function)
14510 << DRE->getSourceRange()
14516 if (PTy->getKind() == BuiltinType::Overload) {
14520 Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof_addrof_function)
14528 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
14536 if (PTy->getKind() == BuiltinType::UnknownAny)
14539 if (PTy->getKind() == BuiltinType::BoundMember) {
14540 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
14563 auto* VarRef = dyn_cast<DeclRefExpr>(op);
14564 if (VarRef && VarRef->refersToEnclosingVariableOrCapture()) {
14565 Diag(op->
getExprLoc(), diag::err_opencl_taking_address_capture);
14573 if (uOp->getOpcode() == UO_Deref)
14576 return uOp->getSubExpr()->getType();
14583 if (
auto *FD = dyn_cast_or_null<FunctionDecl>(dcl))
14589 unsigned AddressOfError = AO_No_Error;
14594 : diag::ext_typecheck_addrof_temporary)
14609 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
14627 auto ReturnOrParamTypeIsIncomplete = [&](
QualType T,
14632 diag::note_ptrauth_virtual_function_pointer_incomplete_arg_ret);
14633 Diag(RetArgTypeLoc,
14634 diag::note_ptrauth_virtual_function_incomplete_arg_ret_type)
14641 bool IsIncomplete =
14643 ReturnOrParamTypeIsIncomplete(
14646 IsIncomplete |= ReturnOrParamTypeIsIncomplete(PVD->getType(), OpLoc,
14647 PVD->getBeginLoc());
14653 if (
Context.getTargetInfo().getCXXABI().isMicrosoft())
14662 AddressOfError = AO_Property_Expansion;
14664 Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof)
14668 }
else if (
const auto *DRE = dyn_cast<DeclRefExpr>(op)) {
14669 if (
const auto *MD = dyn_cast_or_null<CXXMethodDecl>(DRE->getDecl()))
14675 AddressOfError = AO_Bit_Field;
14678 AddressOfError = AO_Vector_Element;
14681 AddressOfError = AO_Matrix_Element;
14685 if (
const VarDecl *vd = dyn_cast<VarDecl>(dcl)) {
14690 AddressOfError = AO_Register_Variable;
14693 AddressOfError = AO_Property_Expansion;
14706 if (
auto *DRE = dyn_cast<DeclRefExpr>(op);
14712 diag::err_cannot_form_pointer_to_member_of_reference_type)
14723 if (
Context.getTargetInfo().getCXXABI().isMicrosoft())
14731 llvm_unreachable(
"Unknown/unexpected decl type");
14734 if (AddressOfError != AO_No_Error) {
14751 if (
Context.getTargetInfo().getTriple().isWasm()) {
14754 Diag(OpLoc, diag::err_wasm_ca_reference)
14759 Diag(OpLoc, diag::err_wasm_table_pr)
14765 CheckAddressOfPackedMember(op);
14771 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Exp);
14777 const ParmVarDecl *Param = dyn_cast<ParmVarDecl>(D);
14780 if (
const FunctionDecl* FD = dyn_cast<FunctionDecl>(Param->getDeclContext()))
14781 if (!FD->hasAttr<NonNullAttr>() && !Param->hasAttr<NonNullAttr>())
14784 FD->ModifiedNonNullParams.insert(Param);
14790 bool IsAfterAmp =
false) {
14794 Op = ConvResult.
get();
14806 Result = PT->getPointeeType();
14814 if (PR.
get() != Op)
14818 if (Result.isNull()) {
14819 S.
Diag(OpLoc, diag::err_typecheck_indirection_requires_pointer)
14824 if (Result->isVoidType()) {
14830 S.
Diag(OpLoc, diag::err_typecheck_indirection_through_void_pointer_cpp)
14833 S.
Diag(OpLoc, diag::ext_typecheck_indirection_through_void_pointer)
14841 if (!S.
getLangOpts().CPlusPlus && Result.isCForbiddenLValueType())
14850 default: llvm_unreachable(
"Unknown binop!");
14851 case tok::periodstar: Opc = BO_PtrMemD;
break;
14852 case tok::arrowstar: Opc = BO_PtrMemI;
break;
14853 case tok::star: Opc = BO_Mul;
break;
14854 case tok::slash: Opc = BO_Div;
break;
14855 case tok::percent: Opc = BO_Rem;
break;
14856 case tok::plus: Opc = BO_Add;
break;
14857 case tok::minus: Opc = BO_Sub;
break;
14858 case tok::lessless: Opc = BO_Shl;
break;
14859 case tok::greatergreater: Opc = BO_Shr;
break;
14860 case tok::lessequal: Opc = BO_LE;
break;
14861 case tok::less: Opc = BO_LT;
break;
14862 case tok::greaterequal: Opc = BO_GE;
break;
14863 case tok::greater: Opc = BO_GT;
break;
14864 case tok::exclaimequal: Opc = BO_NE;
break;
14865 case tok::equalequal: Opc = BO_EQ;
break;
14866 case tok::spaceship: Opc = BO_Cmp;
break;
14867 case tok::amp: Opc = BO_And;
break;
14868 case tok::caret: Opc = BO_Xor;
break;
14869 case tok::pipe: Opc = BO_Or;
break;
14870 case tok::ampamp: Opc = BO_LAnd;
break;
14871 case tok::pipepipe: Opc = BO_LOr;
break;
14872 case tok::equal: Opc = BO_Assign;
break;
14873 case tok::starequal: Opc = BO_MulAssign;
break;
14874 case tok::slashequal: Opc = BO_DivAssign;
break;
14875 case tok::percentequal: Opc = BO_RemAssign;
break;
14876 case tok::plusequal: Opc = BO_AddAssign;
break;
14877 case tok::minusequal: Opc = BO_SubAssign;
break;
14878 case tok::lesslessequal: Opc = BO_ShlAssign;
break;
14879 case tok::greatergreaterequal: Opc = BO_ShrAssign;
break;
14880 case tok::ampequal: Opc = BO_AndAssign;
break;
14881 case tok::caretequal: Opc = BO_XorAssign;
break;
14882 case tok::pipeequal: Opc = BO_OrAssign;
break;
14883 case tok::comma: Opc = BO_Comma;
break;
14892 default: llvm_unreachable(
"Unknown unary op!");
14893 case tok::plusplus: Opc = UO_PreInc;
break;
14894 case tok::minusminus: Opc = UO_PreDec;
break;
14895 case tok::amp: Opc = UO_AddrOf;
break;
14896 case tok::star: Opc = UO_Deref;
break;
14897 case tok::plus: Opc = UO_Plus;
break;
14898 case tok::minus: Opc = UO_Minus;
break;
14899 case tok::tilde: Opc = UO_Not;
break;
14900 case tok::exclaim: Opc = UO_LNot;
break;
14901 case tok::kw___real: Opc = UO_Real;
break;
14902 case tok::kw___imag: Opc = UO_Imag;
break;
14903 case tok::kw___extension__: Opc = UO_Extension;
break;
14935 llvm::find_if(Parent->
fields(),
14937 return F->getDeclName() == Name;
14939 return (Field != Parent->
field_end()) ? *Field :
nullptr;
14954 const DeclRefExpr *LHSDeclRef = dyn_cast<DeclRefExpr>(LHSExpr);
14955 const DeclRefExpr *RHSDeclRef = dyn_cast<DeclRefExpr>(RHSExpr);
14956 if (!LHSDeclRef || !RHSDeclRef ||
14964 if (LHSDecl != RHSDecl)
14969 if (RefTy->getPointeeType().isVolatileQualified())
14972 auto Diag = S.
Diag(OpLoc, IsBuiltin ? diag::warn_self_assignment_builtin
14973 : diag::warn_self_assignment_overloaded)
14978 Diag << 1 << SelfAssignField
14991 const Expr *ObjCPointerExpr =
nullptr, *OtherExpr =
nullptr;
14996 ObjCPointerExpr = LHS;
15000 ObjCPointerExpr = RHS;
15009 unsigned Diag = diag::warn_objc_pointer_masking;
15018 if (SelArg0.starts_with(
"performSelector"))
15019 Diag = diag::warn_objc_pointer_masking_performSelector;
15036 assert((
isVector(ResultTy, Context.HalfTy) ||
15037 isVector(ResultTy, Context.ShortTy)) &&
15038 "Result must be a vector of half or short");
15041 "both operands expected to be a half vector");
15048 if (
isVector(ResultTy, Context.ShortTy))
15053 ResultTy,
VK, OK, OpLoc, FPFeatures,
15054 BinOpResTy, BinOpResTy);
15058 BinOpResTy,
VK, OK, OpLoc, FPFeatures);
15066 if (!OpRequiresConversion || Ctx.
getLangOpts().NativeHalfType ||
15070 auto HasVectorOfHalfType = [&Ctx](
Expr *E) {
15080 return VT->getElementType().getCanonicalType() == Ctx.
HalfTy;
15085 return HasVectorOfHalfType(E0) && (!E1 || HasVectorOfHalfType(E1));
15090 Expr *RHSExpr,
bool ForFoldExpression) {
15104 if (
Init.isInvalid())
15106 RHSExpr =
Init.get();
15116 bool ConvertHalfVec =
false;
15118 if (!LHS.
isUsable() || !RHS.isUsable())
15128 if (BO_Assign == Opc)
15129 Diag(OpLoc, diag::err_opencl_atomic_init) << 0 << SR;
15157 if (!ResultTy.
isNull()) {
15174 if (
auto *BE = dyn_cast<BlockExpr>(RHS.get()->IgnoreParens()))
15176 if (
auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
15177 if (VD->hasLocalStorage() &&
getCurScope()->isDeclScope(VD))
15178 BE->getBlockDecl()->setCanAvoidCopyToHeap();
15189 Opc == BO_PtrMemI);
15193 ConvertHalfVec =
true;
15200 ConvertHalfVec =
true;
15204 ConvertHalfVec =
true;
15215 ConvertHalfVec =
true;
15218 if (
const auto *BI = dyn_cast<BinaryOperator>(LHSExpr);
15219 !ForFoldExpression && BI && BI->isComparisonOp())
15220 Diag(OpLoc, diag::warn_consecutive_comparison)
15226 ConvertHalfVec =
true;
15230 ConvertHalfVec =
true;
15243 ConvertHalfVec =
true;
15248 ConvertHalfVec =
true;
15250 CompLHSTy = CompResultTy;
15257 CompLHSTy = CompResultTy;
15263 ConvertHalfVec =
true;
15270 ConvertHalfVec =
true;
15279 CompLHSTy = CompResultTy;
15290 CompLHSTy = CompResultTy;
15298 VK = RHS.get()->getValueKind();
15299 OK = RHS.get()->getObjectKind();
15311 (Opc == BO_Comma ||
isVector(RHS.get()->getType(),
Context.HalfTy) ==
15313 "both sides are half vectors or neither sides are");
15318 CheckArrayAccess(LHS.
get());
15319 CheckArrayAccess(RHS.get());
15323 &
Context.Idents.get(
"object_setClass"),
15329 "object_setClass(")
15342 if (CompResultTy.
isNull()) {
15343 if (ConvertHalfVec)
15363 if (ConvertHalfVec)
15368 Context, LHS.
get(), RHS.get(), Opc, ResultTy,
VK, OK, OpLoc,
15385 if (isLeftComp == isRightComp)
15390 bool isLeftBitwise = LHSBO && LHSBO->
isBitwiseOp();
15391 bool isRightBitwise = RHSBO && RHSBO->
isBitwiseOp();
15392 if (isLeftBitwise || isRightBitwise)
15404 Self.Diag(OpLoc, diag::warn_precedence_bitwise_rel)
15407 Self.PDiag(diag::note_precedence_silence) << OpStr,
15408 (isLeftComp ? LHSExpr : RHSExpr)->getSourceRange());
15410 Self.PDiag(diag::note_precedence_bitwise_first)
15425 Self.PDiag(diag::note_precedence_silence)
15434 if (Bop->getOpcode() == BO_LAnd) {
15439 }
else if (Bop->getOpcode() == BO_LOr) {
15440 if (
BinaryOperator *RBop = dyn_cast<BinaryOperator>(Bop->getRHS())) {
15443 if (RBop->getOpcode() == BO_LAnd &&
15455 if (Bop->getOpcode() == BO_LAnd) {
15470 if (Bop->isBitwiseOp() && Bop->getOpcode() < Opc) {
15471 S.
Diag(Bop->getOperatorLoc(), diag::warn_bitwise_op_in_bitwise_op)
15473 << Bop->getSourceRange() << OpLoc;
15475 S.
PDiag(diag::note_precedence_silence)
15476 << Bop->getOpcodeStr(),
15477 Bop->getSourceRange());
15483 Expr *SubExpr, StringRef Shift) {
15485 if (Bop->getOpcode() == BO_Add || Bop->getOpcode() == BO_Sub) {
15486 StringRef Op = Bop->getOpcodeStr();
15487 S.
Diag(Bop->getOperatorLoc(), diag::warn_addition_in_bitshift)
15488 << Bop->getSourceRange() << OpLoc << Shift << Op;
15490 S.
PDiag(diag::note_precedence_silence) << Op,
15491 Bop->getSourceRange());
15507 if (Kind != OO_LessLess && Kind != OO_GreaterGreater)
15510 S.
Diag(OpLoc, diag::warn_overloaded_shift_in_comparison)
15512 << (Kind == OO_LessLess);
15514 S.
PDiag(diag::note_precedence_silence)
15515 << (Kind == OO_LessLess ?
"<<" :
">>"),
15518 S, OpLoc, S.
PDiag(diag::note_evaluate_comparison_first),
15532 if ((Opc == BO_Or || Opc == BO_Xor) &&
15540 if (Opc == BO_LOr && !OpLoc.
isMacroID()) {
15546 || Opc == BO_Shr) {
15562 assert(LHSExpr &&
"ActOnBinOp(): missing left expression");
15563 assert(RHSExpr &&
"ActOnBinOp(): missing right expression");
15572 CheckInvalidBuiltinCountedByRef(LHSExpr, K);
15573 CheckInvalidBuiltinCountedByRef(RHSExpr, K);
15575 return BuildBinOp(S, TokLoc, Opc, LHSExpr, RHSExpr);
15581 if (OverOp !=
OO_None && OverOp != OO_Equal)
15630 Expr *RHSExpr,
bool ForFoldExpression) {
15631 if (!LHSExpr || !RHSExpr)
15643 if (pty->getKind() == BuiltinType::PseudoObject &&
15656 RHSExpr = resolvedRHS.
get();
15670 (pty->getKind() == BuiltinType::BoundMember ||
15671 pty->getKind() == BuiltinType::Overload)) {
15672 auto *OE = dyn_cast<OverloadExpr>(LHSExpr);
15673 if (OE && !OE->hasTemplateKeyword() && !OE->hasExplicitTemplateArgs() &&
15674 llvm::any_of(OE->decls(), [](
NamedDecl *ND) {
15675 return isa<FunctionTemplateDecl>(ND);
15677 Diag(OE->getQualifier() ? OE->getQualifierLoc().getBeginLoc()
15678 : OE->getNameLoc(),
15679 diag::err_template_kw_missing)
15680 << OE->getName().getAsIdentifierInfo();
15687 LHSExpr = LHS.
get();
15694 if (Opc == BO_Assign && pty->getKind() == BuiltinType::Overload) {
15701 ForFoldExpression);
15711 RHSExpr = resolvedRHS.
get();
15727 "Should only occur in error-recovery path.");
15733 Context, LHSExpr, RHSExpr, Opc,
15753 ResultType = RHSExpr->
getType();
15756 ResultType =
Context.DependentTy;
15769 if (
T.isNull() ||
T->isDependentType())
15785 bool CanOverflow =
false;
15787 bool ConvertHalfVec =
false;
15796 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15803 if (Opc == UO_AddrOf)
15804 return ExprError(
Diag(OpLoc, diag::err_hlsl_operator_unsupported) << 0);
15805 if (Opc == UO_Deref)
15806 return ExprError(
Diag(OpLoc, diag::err_hlsl_operator_unsupported) << 1);
15811 resultType =
Context.DependentTy;
15820 Opc == UO_PreInc || Opc == UO_PostInc,
15821 Opc == UO_PreInc || Opc == UO_PreDec);
15826 CheckAddressOfNoDeref(InputExpr);
15839 CanOverflow = Opc == UO_Minus &&
15851 if (ConvertHalfVec)
15858 (!
Context.getLangOpts().ZVector ||
15868 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15879 Diag(OpLoc, diag::ext_integer_complement_complex)
15887 if (!
T->isIntegerType())
15888 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15891 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15907 resultType =
Context.FloatTy;
15913 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15919 if (
Context.getLangOpts().CPlusPlus) {
15924 }
else if (
Context.getLangOpts().OpenCL &&
15925 Context.getLangOpts().OpenCLVersion < 120) {
15929 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15933 if (
Context.getLangOpts().OpenCL &&
15934 Context.getLangOpts().getOpenCLCompatibleVersion() < 120) {
15938 if (!
T->isIntegerType())
15939 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15945 }
else if (
Context.getLangOpts().CPlusPlus &&
15949 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15956 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15962 resultType =
Context.getLogicalOperationType();
15990 "the co_await expression must be non-dependant before "
15991 "building operator co_await");
16002 if (Opc != UO_AddrOf && Opc != UO_Deref)
16003 CheckArrayAccess(Input.
get());
16009 if (Opc == UO_Deref && UO->getType()->hasAttr(attr::NoDeref) &&
16015 if (ConvertHalfVec)
16021 if (
DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
16022 if (!DRE->getQualifier())
16032 return Method->isImplicitObjectMemberFunction();
16038 if (!ULE->getQualifier())
16043 if (
Method->isImplicitObjectMemberFunction())
16064 if (pty->getKind() == BuiltinType::PseudoObject &&
16069 if (Opc == UO_Extension)
16074 if (Opc == UO_AddrOf &&
16075 (pty->getKind() == BuiltinType::Overload ||
16076 pty->getKind() == BuiltinType::UnknownAny ||
16077 pty->getKind() == BuiltinType::BoundMember))
16102 Expr *Input,
bool IsAfterAmp) {
16112 OpLoc, LabLoc, TheDecl,
Context.getPointerType(
Context.VoidTy));
16146 assert(!
Cleanup.exprNeedsCleanups() &&
16147 "cleanups within StmtExpr not correctly bound!");
16157 bool StmtExprMayBindToTemp =
false;
16160 if (
const auto *LastStmt =
16162 if (
const Expr *
Value = LastStmt->getExprStmt()) {
16163 StmtExprMayBindToTemp =
true;
16171 Expr *ResStmtExpr =
16173 if (StmtExprMayBindToTemp)
16175 return ResStmtExpr;
16198 auto *Cast = dyn_cast<ImplicitCastExpr>(E);
16199 if (Cast && Cast->getCastKind() == CK_ARCConsumeObject)
16200 return Cast->getSubExpr();
16221 return ExprError(
Diag(BuiltinLoc, diag::err_offsetof_record_type)
16222 << ArgTy << TypeRange);
16228 diag::err_offsetof_incomplete_type, TypeRange))
16231 bool DidWarnAboutNonPOD =
false;
16236 if (OC.isBrackets) {
16241 return ExprError(
Diag(OC.LocEnd, diag::err_offsetof_array_type)
16245 CurrentType =
Context.DependentTy;
16261 Comps.push_back(
OffsetOfNode(OC.LocStart, Exprs.size(), OC.LocEnd));
16262 Exprs.push_back(Idx);
16270 Comps.push_back(
OffsetOfNode(OC.LocStart, OC.U.IdentInfo, OC.LocEnd));
16271 CurrentType =
Context.DependentTy;
16277 diag::err_offsetof_incomplete_type))
16283 return ExprError(
Diag(OC.LocEnd, diag::err_offsetof_record_type)
16294 bool IsSafe =
LangOpts.CPlusPlus11? CRD->isStandardLayout() : CRD->isPOD();
16296 LangOpts.CPlusPlus11? diag::ext_offsetof_non_standardlayout_type
16297 : diag::ext_offsetof_non_pod_type;
16300 Diag(BuiltinLoc, DiagID)
16301 <<
SourceRange(Components[0].LocStart, OC.LocEnd) << CurrentType;
16302 DidWarnAboutNonPOD =
true;
16313 MemberDecl = IndirectMemberDecl->getAnonField();
16321 Diag(BuiltinLoc, diag::err_no_member)
16322 << OC.U.IdentInfo << RD <<
SourceRange(OC.LocStart, OC.LocEnd);
16331 Diag(OC.LocEnd, diag::err_offsetof_bitfield)
16339 if (IndirectMemberDecl)
16346 Context.getCanonicalTagType(Parent), Paths)) {
16348 Diag(OC.LocEnd, diag::err_offsetof_field_of_virtual_base)
16359 if (IndirectMemberDecl) {
16360 for (
auto *FI : IndirectMemberDecl->chain()) {
16366 Comps.push_back(
OffsetOfNode(OC.LocStart, MemberDecl, OC.LocEnd));
16372 Comps, Exprs, RParenLoc);
16398 assert((CondExpr && LHSExpr && RHSExpr) &&
"Missing type argument(s)");
16403 bool CondIsTrue =
false;
16405 resType =
Context.DependentTy;
16408 llvm::APSInt condEval(32);
16410 CondExpr, &condEval, diag::err_typecheck_choose_expr_requires_constant);
16413 CondExpr = CondICE.
get();
16414 CondIsTrue = condEval.getZExtValue();
16417 Expr *ActiveExpr = CondIsTrue ? LHSExpr : RHSExpr;
16419 resType = ActiveExpr->
getType();
16425 resType,
VK, OK, RPLoc, CondIsTrue);
16437 Decl *ManglingContextDecl;
16438 std::tie(MCtx, ManglingContextDecl) =
16442 Block->setBlockMangling(ManglingNumber, ManglingContextDecl);
16464 "block-id should have no identifier!");
16475 assert(
T->isFunctionType() &&
16476 "GetTypeForDeclarator made a non-function block signature");
16492 unsigned Size =
Result.getFullDataSize();
16493 Sig =
Context.CreateTypeSourceInfo(
Result.getType(), Size);
16504 QualType RetTy = Fn->getReturnType();
16514 if (RetTy !=
Context.DependentTy) {
16522 if (ExplicitSignature) {
16523 for (
unsigned I = 0, E = ExplicitSignature.
getNumParams(); I != E; ++I) {
16525 if (Param->getIdentifier() ==
nullptr && !Param->isImplicit() &&
16529 Diag(Param->getLocation(), diag::ext_parameter_name_omitted_c23);
16531 Params.push_back(Param);
16537 for (
const auto &I : Fn->param_types()) {
16540 Params.push_back(Param);
16545 if (!Params.empty()) {
16556 AI->setOwningFunction(CurBlock->
TheDecl);
16559 if (AI->getIdentifier()) {
16565 if (AI->isInvalidDecl())
16584 Diag(CaretLoc, diag::err_blocks_disable) <<
LangOpts.OpenCL;
16589 assert(!
Cleanup.exprNeedsCleanups() &&
16590 "cleanups within block not correctly bound!");
16605 bool NoReturn = BD->
hasAttr<NoReturnAttr>();
16613 if (NoReturn && !Ext.getNoReturn()) Ext = Ext.
withNoReturn(
true);
16619 BlockTy =
Context.getFunctionType(RetTy, {}, EPI);
16640 BlockTy =
Context.getFunctionType(RetTy, {}, EPI);
16644 BlockTy =
Context.getBlockPointerType(BlockTy);
16648 !
PP.isCodeCompletionEnabled())
16653 if (Body &&
getCurFunction()->HasPotentialAvailabilityViolations)
16679 Expr *CopyExpr =
nullptr;
16706 if (!
Result.isInvalid() &&
16707 !
Result.get()->getType().isConstQualified()) {
16709 Result.get()->getType().withConst(),
16713 if (!
Result.isInvalid()) {
16723 if (!
Result.isInvalid() &&
16727 CopyExpr =
Result.get();
16734 Captures.push_back(NewCap);
16748 if (
Result->getBlockDecl()->hasCaptures()) {
16751 Cleanup.setExprNeedsCleanups(
true);
16755 for (
const auto &CI :
Result->getBlockDecl()->captures()) {
16756 const VarDecl *var = CI.getVariable();
16771 {Result},
Result->getType());
16785 Expr *OrigExpr = E;
16800 Context.getTargetInfo().getTriple().isNVPTX())
16823 VaListType =
Context.getArrayDecayedType(VaListType);
16835 if (
Init.isInvalid())
16851 diag::err_first_argument_to_va_arg_not_of_type_va_list)
16856 diag::err_second_parameter_to_va_arg_incomplete,
16862 diag::err_second_parameter_to_va_arg_abstract,
16869 ? diag::warn_second_parameter_to_va_arg_ownership_qualified
16870 : diag::warn_second_parameter_to_va_arg_not_pod)
16877 PDiag(diag::warn_second_parameter_to_va_arg_array)
16910 UnderlyingType = ED->getIntegerType();
16911 if (
Context.typesAreCompatible(PromoteType, UnderlyingType,
16924 ?
Context.getCorrespondingSignedType(UnderlyingType)
16925 :
Context.getCorrespondingUnsignedType(UnderlyingType);
16926 if (
Context.typesAreCompatible(PromoteType, UnderlyingType,
16932 PromoteType =
Context.DoubleTy;
16933 if (!PromoteType.
isNull())
16935 PDiag(diag::warn_second_parameter_to_va_arg_never_compatible)
16950 if (pw ==
Context.getTargetInfo().getIntWidth())
16952 else if (pw ==
Context.getTargetInfo().getLongWidth())
16954 else if (pw ==
Context.getTargetInfo().getLongLongWidth())
16957 llvm_unreachable(
"I don't know size of pointer!");
16974 if ((SLDecl->isCompleteDefinition() || SLDecl->isBeingDefined()) &&
16983 S.
Diag(Loc, diag::err_std_source_location_impl_not_found);
16991 S.
Diag(Loc, diag::err_std_source_location_impl_malformed);
16995 unsigned Count = 0;
16997 StringRef Name = F->getName();
16999 if (Name ==
"_M_file_name") {
17000 if (F->getType() !=
17004 }
else if (Name ==
"_M_function_name") {
17005 if (F->getType() !=
17009 }
else if (Name ==
"_M_line") {
17010 if (!F->getType()->isIntegerType())
17013 }
else if (Name ==
"_M_column") {
17014 if (!F->getType()->isIntegerType())
17023 S.
Diag(Loc, diag::err_std_source_location_impl_malformed);
17046 ResultTy =
Context.UnsignedIntTy;
17055 ResultTy =
Context.getPointerType(
17074 Data->BinaryData = BinaryData;
17078 Data->getDataElementCount());
17082 const Expr *SrcExpr) {
17091 auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl());
17104 bool *Complained) {
17106 *Complained =
false;
17109 bool CheckInferredResultType =
false;
17111 unsigned DiagKind = 0;
17113 bool MayHaveConvFixit =
false;
17114 bool MayHaveFunctionDiff =
false;
17125 DiagKind = diag::warn_compatible_implicit_pointer_conv;
17129 DiagKind = diag::err_typecheck_convert_pointer_int;
17132 DiagKind = diag::ext_typecheck_convert_pointer_int;
17135 MayHaveConvFixit =
true;
17139 DiagKind = diag::err_typecheck_convert_int_pointer;
17142 DiagKind = diag::ext_typecheck_convert_int_pointer;
17145 MayHaveConvFixit =
true;
17149 diag::warn_typecheck_convert_incompatible_function_pointer_strict;
17151 MayHaveConvFixit =
true;
17155 DiagKind = diag::err_typecheck_convert_incompatible_function_pointer;
17158 DiagKind = diag::ext_typecheck_convert_incompatible_function_pointer;
17161 MayHaveConvFixit =
true;
17165 DiagKind = diag::err_arc_typecheck_convert_incompatible_pointer;
17167 DiagKind = diag::err_typecheck_convert_incompatible_pointer;
17170 DiagKind = diag::ext_typecheck_convert_incompatible_pointer;
17174 if (CheckInferredResultType) {
17180 MayHaveConvFixit =
true;
17184 DiagKind = diag::err_typecheck_convert_incompatible_pointer_sign;
17187 DiagKind = diag::ext_typecheck_convert_incompatible_pointer_sign;
17192 DiagKind = diag::err_typecheck_convert_pointer_void_func;
17195 DiagKind = diag::ext_typecheck_convert_pointer_void_func;
17207 DiagKind = diag::err_typecheck_incompatible_address_space;
17210 DiagKind = diag::err_typecheck_incompatible_ownership;
17213 DiagKind = diag::err_typecheck_incompatible_ptrauth;
17217 llvm_unreachable(
"unknown error case for discarding qualifiers!");
17234 DiagKind = diag::err_typecheck_convert_discards_qualifiers;
17237 DiagKind = diag::ext_typecheck_convert_discards_qualifiers;
17244 DiagKind = diag::err_nested_pointer_qualifier_mismatch;
17246 DiagKind = diag::ext_nested_pointer_qualifier_mismatch;
17250 DiagKind = diag::err_typecheck_incompatible_nested_address_space;
17254 DiagKind = diag::err_int_to_block_pointer;
17258 DiagKind = diag::err_typecheck_convert_incompatible_block_pointer;
17265 for (
auto *srcProto : srcOPT->
quals()) {
17271 IFace = IFaceT->getDecl();
17276 for (
auto *dstProto : dstOPT->
quals()) {
17282 IFace = IFaceT->getDecl();
17285 DiagKind = diag::err_incompatible_qualified_id;
17288 DiagKind = diag::warn_incompatible_qualified_id;
17294 DiagKind = diag::err_incompatible_vectors;
17297 DiagKind = diag::warn_incompatible_vectors;
17301 DiagKind = diag::err_arc_weak_unavailable_assign;
17307 *Complained =
true;
17311 DiagKind = diag::err_typecheck_convert_incompatible;
17313 MayHaveConvFixit =
true;
17315 MayHaveFunctionDiff =
true;
17324 FirstType = DstType;
17325 SecondType = SrcType;
17335 FirstType = SrcType;
17336 SecondType = DstType;
17345 FDiag << FirstType << SecondType << ActionForDiag
17348 if (DiagKind == diag::ext_typecheck_convert_incompatible_pointer_sign ||
17349 DiagKind == diag::err_typecheck_convert_incompatible_pointer_sign) {
17359 if (!ConvHints.
isNull()) {
17364 if (MayHaveConvFixit) { FDiag << (
unsigned) (ConvHints.
Kind); }
17366 if (MayHaveFunctionDiff)
17370 if ((DiagKind == diag::warn_incompatible_qualified_id ||
17371 DiagKind == diag::err_incompatible_qualified_id) &&
17373 Diag(IFace->
getLocation(), diag::note_incomplete_class_and_qualified_id)
17376 if (SecondType ==
Context.OverloadTy)
17380 if (CheckInferredResultType)
17388 *Complained =
true;
17399 return S.
Diag(Loc, diag::err_ice_not_integral)
17403 return S.
Diag(Loc, diag::err_expr_not_ice) << S.
LangOpts.CPlusPlus;
17418 IDDiagnoser(
unsigned DiagID)
17422 return S.
Diag(Loc, DiagID);
17424 } Diagnoser(DiagID);
17437 return S.
Diag(Loc, diag::ext_expr_not_ice) << S.
LangOpts.CPlusPlus;
17459 BaseDiagnoser(BaseDiagnoser) {}
17468 return S.
Diag(Loc, diag::err_ice_incomplete_type) <<
T;
17473 return S.
Diag(Loc, diag::err_ice_explicit_conversion) <<
T << ConvTy;
17484 return S.
Diag(Loc, diag::err_ice_ambiguous_conversion) <<
T;
17495 llvm_unreachable(
"conversion functions are permitted");
17497 } ConvertDiagnoser(Diagnoser);
17503 E = Converted.
get();
17524 E = RValueExpr.
get();
17542 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
17543 diag::note_invalid_subexpr_in_const_expr) {
17544 DiagLoc = Notes[0].first;
17566 EvalResult.
Diag = &Notes;
17590 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
17591 diag::note_invalid_subexpr_in_const_expr) {
17592 DiagLoc = Notes[0].first;
17618 class TransformToPE :
public TreeTransform<TransformToPE> {
17622 TransformToPE(
Sema &SemaRef) : BaseTransform(SemaRef) { }
17625 bool AlwaysRebuild() {
return true; }
17626 bool ReplacingOriginal() {
return true; }
17635 ExprResult TransformDeclRefExpr(DeclRefExpr *E) {
17637 !SemaRef.isUnevaluatedContext())
17639 diag::err_invalid_non_static_member_use)
17642 return BaseTransform::TransformDeclRefExpr(E);
17646 ExprResult TransformUnaryOperator(UnaryOperator *E) {
17650 return BaseTransform::TransformUnaryOperator(E);
17658 return SkipLambdaBody(E, Body);
17665 "Should only transform unevaluated expressions");
17670 return TransformToPE(*this).TransformExpr(E);
17675 "Should only transform unevaluated expressions");
17679 return TransformToPE(*this).TransformType(TInfo);
17687 LambdaContextDecl, ExprContext);
17701 Prev.isImmediateFunctionContext() || Prev.isConstantEvaluated();
17704 Prev.InImmediateEscalatingFunctionContext;
17762 if (
const auto *E = dyn_cast<UnaryOperator>(PossibleDeref)) {
17763 if (E->getOpcode() == UO_Deref)
17764 return CheckPossibleDeref(S, E->getSubExpr());
17765 }
else if (
const auto *E = dyn_cast<ArraySubscriptExpr>(PossibleDeref)) {
17766 return CheckPossibleDeref(S, E->getBase());
17767 }
else if (
const auto *E = dyn_cast<MemberExpr>(PossibleDeref)) {
17768 return CheckPossibleDeref(S, E->getBase());
17769 }
else if (
const auto E = dyn_cast<DeclRefExpr>(PossibleDeref)) {
17772 if (
const auto *Ptr = Ty->
getAs<PointerType>())
17775 Inner = Arr->getElementType();
17779 if (Inner->
hasAttr(attr::NoDeref))
17789 const DeclRefExpr *DeclRef = CheckPossibleDeref(*
this, E);
17796 Diag(E->
getExprLoc(), diag::warn_dereference_of_noderef_type_no_decl)
17811 if (BO->getOpcode() == BO_Assign) {
17813 llvm::erase(LHSs, BO->getLHS());
17821 "Cannot mark an immediate escalating expression outside of an "
17822 "immediate escalating context");
17825 if (
auto *DeclRef =
17826 dyn_cast<DeclRefExpr>(
Call->getCallee()->IgnoreImplicit()))
17827 DeclRef->setIsImmediateEscalating(
true);
17828 }
else if (
auto *Ctr = dyn_cast<CXXConstructExpr>(E->
IgnoreImplicit())) {
17829 Ctr->setIsImmediateEscalating(
true);
17830 }
else if (
auto *DeclRef = dyn_cast<DeclRefExpr>(E->
IgnoreImplicit())) {
17831 DeclRef->setIsImmediateEscalating(
true);
17833 assert(
false &&
"expected an immediately escalating expression");
17836 FI->FoundImmediateEscalatingExpression =
true;
17851 if (
auto *DeclRef =
17852 dyn_cast<DeclRefExpr>(
Call->getCallee()->IgnoreImplicit()))
17861 auto CheckConstantExpressionAndKeepResult = [&]() {
17864 Eval.
Diag = &Notes;
17866 Eval,
getASTContext(), ConstantExprKind::ImmediateInvocation);
17867 if (Res && Notes.empty()) {
17868 Cached = std::move(Eval.
Val);
17876 !CheckConstantExpressionAndKeepResult()) {
17881 if (
Cleanup.exprNeedsCleanups()) {
17898 Cleanup.cleanupsHaveSideEffects(), {});
17911 ExprEvalContexts.back().ImmediateInvocationCandidates.emplace_back(Res, 0);
17919 Eval.
Diag = &Notes;
17923 if (!Result || !Notes.empty()) {
17926 if (
auto *
FunctionalCast = dyn_cast<CXXFunctionalCastExpr>(InnerExpr))
17929 if (
auto *
Call = dyn_cast<CallExpr>(InnerExpr))
17931 else if (
auto *
Call = dyn_cast<CXXConstructExpr>(InnerExpr))
17932 FD =
Call->getConstructor();
17933 else if (
auto *Cast = dyn_cast<CastExpr>(InnerExpr))
17934 FD = dyn_cast_or_null<FunctionDecl>(Cast->getConversionFunction());
17937 "could not find an immediate function in this expression");
17944 SemaRef.
Diag(Context->Loc, diag::note_invalid_consteval_initializer)
17946 SemaRef.
Diag(Context->Decl->getBeginLoc(), diag::note_declared_at);
17950 for (
auto &
Note : Notes)
17962 llvm::SmallPtrSetImpl<DeclRefExpr *> &DRSet;
17966 ComplexRemove(
Sema &SemaRef, llvm::SmallPtrSetImpl<DeclRefExpr *> &DR,
17970 :
Base(SemaRef), DRSet(DR), IISet(II), CurrentII(Current) {}
17972 auto It = std::find_if(CurrentII, IISet.rend(),
17974 return Elem.getPointer() == E;
17980 if (It == IISet.rend()) {
17982 CurrentII->setInt(1);
17989 return Base::TransformConstantExpr(E);
17990 RemoveImmediateInvocation(E);
17991 return Base::TransformExpr(E->
getSubExpr());
17997 return Base::TransformCXXOperatorCallExpr(E);
18011 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(
Init))
18012 Init = ICE->getSubExpr();
18013 else if (
auto *ICE = dyn_cast<MaterializeTemporaryExpr>(
Init))
18014 Init = ICE->getSubExpr();
18020 if (
auto *CE = dyn_cast<ConstantExpr>(
Init);
18021 CE && CE->isImmediateInvocation())
18022 RemoveImmediateInvocation(CE);
18023 return Base::TransformInitializer(
Init, NotCopyInit);
18034 bool AlwaysRebuild() {
return false; }
18035 bool ReplacingOriginal() {
return true; }
18036 bool AllowSkippingCXXConstructExpr() {
18037 bool Res = AllowSkippingFirstCXXConstructExpr;
18038 AllowSkippingFirstCXXConstructExpr =
true;
18041 bool AllowSkippingFirstCXXConstructExpr =
true;
18052 Transformer.AllowSkippingFirstCXXConstructExpr =
false;
18054 ExprResult Res = Transformer.TransformExpr(It->getPointer()->getSubExpr());
18060 It->getPointer()->setSubExpr(Res.
get());
18081 VD->hasConstantInitialization()) {
18114 llvm::SmallPtrSetImpl<DeclRefExpr *> &DRSet;
18115 SimpleRemove(llvm::SmallPtrSetImpl<DeclRefExpr *> &S) : DRSet(S) {}
18118 return DRSet.size();
18121 Visitor.TraverseStmt(
18131 if (DR->isImmediateEscalating())
18135 if (
const auto *MD = dyn_cast<CXXMethodDecl>(ND);
18137 ND = MD->getParent();
18144 bool ImmediateEscalating =
false;
18145 bool IsPotentiallyEvaluated =
18155 SemaRef.
Diag(DR->getBeginLoc(), diag::err_invalid_consteval_take_address)
18156 << ND << isa<CXXRecordDecl>(ND) << FD->isConsteval();
18157 if (!FD->getBuiltinID())
18161 SemaRef.
Diag(Context->Loc, diag::note_invalid_consteval_initializer)
18163 SemaRef.
Diag(Context->Decl->getBeginLoc(), diag::note_declared_at);
18165 if (FD->isImmediateEscalating() && !FD->isConsteval())
18179 (Rec.
ExprContext == ExpressionKind::EK_TemplateArgument ||
18187 D = diag::err_lambda_unevaluated_operand;
18193 D = diag::err_lambda_in_constant_expression;
18194 }
else if (Rec.
ExprContext == ExpressionKind::EK_TemplateArgument) {
18197 D = diag::err_lambda_in_invalid_context;
18199 llvm_unreachable(
"Couldn't infer lambda error message.");
18201 for (
const auto *L : Rec.
Lambdas)
18202 Diag(L->getBeginLoc(), D);
18222 Diag(BO->getBeginLoc(), diag::warn_deprecated_simple_assign_volatile)
18293 llvm_unreachable(
"Invalid context");
18339 : FD(FD), Param(Param) {}
18346 CCName =
"stdcall";
18349 CCName =
"fastcall";
18352 CCName =
"vectorcall";
18355 llvm_unreachable(
"CC does not need mangling");
18358 S.
Diag(Loc, diag::err_cconv_incomplete_param_type)
18359 << Param->getDeclName() << FD->
getDeclName() << CCName;
18364 ParamIncompleteTypeDiagnoser Diagnoser(FD, Param);
18370enum class OdrUseContext {
18389 if (Context.isUnevaluated())
18390 return OdrUseContext::None;
18393 return OdrUseContext::Dependent;
18395 if (Context.isDiscardedStatementContext())
18396 return OdrUseContext::FormallyOdrUsed;
18398 else if (Context.Context ==
18400 return OdrUseContext::FormallyOdrUsed;
18402 return OdrUseContext::Used;
18406 if (!
Func->isConstexpr())
18409 if (
Func->isImplicitlyInstantiable() || !
Func->isUserProvided())
18416 auto *CCD = dyn_cast<CXXConstructorDecl>(
Func);
18417 return CCD && CCD->getInheritedConstructor();
18421 bool MightBeOdrUse) {
18422 assert(
Func &&
"No function?");
18424 Func->setReferenced();
18437 OdrUseContext OdrUse =
18439 if (IsRecursiveCall && OdrUse == OdrUseContext::Used)
18440 OdrUse = OdrUseContext::FormallyOdrUsed;
18444 if (
Func->isTrivial() && !
Func->hasAttr<DLLExportAttr>() &&
18445 OdrUse == OdrUseContext::Used) {
18448 OdrUse = OdrUseContext::FormallyOdrUsed;
18450 OdrUse = OdrUseContext::FormallyOdrUsed;
18457 bool NeededForConstantEvaluation =
18482 bool NeedDefinition =
18483 !IsRecursiveCall &&
18484 (OdrUse == OdrUseContext::Used ||
18485 (NeededForConstantEvaluation && !
Func->isPureVirtual()));
18492 if (NeedDefinition &&
18494 Func->getMemberSpecializationInfo()))
18501 if (NeedDefinition && !
Func->getBody()) {
18504 dyn_cast<CXXConstructorDecl>(
Func)) {
18517 }
else if (
Constructor->getInheritedConstructor()) {
18521 dyn_cast<CXXDestructorDecl>(
Func)) {
18531 if (MethodDecl->isOverloadedOperator() &&
18532 MethodDecl->getOverloadedOperator() == OO_Equal) {
18534 if (MethodDecl->isDefaulted() && !MethodDecl->isDeleted()) {
18535 if (MethodDecl->isCopyAssignmentOperator())
18537 else if (MethodDecl->isMoveAssignmentOperator())
18541 MethodDecl->getParent()->isLambda()) {
18548 }
else if (MethodDecl->isVirtual() &&
getLangOpts().AppleKext)
18552 if (
Func->isDefaulted() && !
Func->isDeleted()) {
18560 if (
Func->isImplicitlyInstantiable()) {
18562 Func->getTemplateSpecializationKindForInstantiation();
18564 bool FirstInstantiation = PointOfInstantiation.
isInvalid();
18565 if (FirstInstantiation) {
18566 PointOfInstantiation = Loc;
18567 if (
auto *MSI =
Func->getMemberSpecializationInfo())
18568 MSI->setPointOfInstantiation(Loc);
18571 Func->setTemplateSpecializationKind(TSK, PointOfInstantiation);
18576 PointOfInstantiation = Loc;
18580 Func->isConstexpr()) {
18585 std::make_pair(
Func, PointOfInstantiation));
18586 else if (
Func->isConstexpr())
18592 Func->setInstantiationIsPending(
true);
18594 std::make_pair(
Func, PointOfInstantiation));
18595 if (llvm::isTimeTraceVerbose()) {
18596 llvm::timeTraceAddInstantEvent(
"DeferInstantiation", [&] {
18598 llvm::raw_string_ostream
OS(Name);
18605 Consumer.HandleCXXImplicitFunctionInstantiation(
Func);
18610 for (
auto *i :
Func->redecls()) {
18611 if (!i->isUsed(
false) && i->isImplicitlyInstantiable())
18629 if (
Init->isInClassMemberInitializer())
18631 MarkDeclarationsReferencedInExpr(Init->getInit());
18652 if (
LangOpts.OffloadImplicitHostDeviceTemplates &&
LangOpts.CUDAIsDevice &&
18657 if (OdrUse == OdrUseContext::Used && !
Func->isUsed(
false)) {
18659 if (!
Func->isDefined() && !
Func->isInAnotherModuleUnit()) {
18660 if (mightHaveNonExternalLinkage(
Func))
18662 else if (
Func->getMostRecentDecl()->isInlined() &&
18664 !
Func->getMostRecentDecl()->hasAttr<GNUInlineAttr>())
18682 if (
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
18683 if (
auto *Dtor = dyn_cast<CXXDestructorDecl>(
Func)) {
18703 const unsigned *
const FunctionScopeIndexToStopAt =
nullptr) {
18706 VarDecl *Var =
V->getPotentiallyDecomposedVarDecl();
18707 assert(Var &&
"expected a capturable variable");
18717 QualType CaptureType, DeclRefType;
18723 DeclRefType, FunctionScopeIndexToStopAt);
18738 << 2 << 1 << Var << UserTarget;
18741 ? diag::note_cuda_const_var_unpromoted
18742 : diag::note_cuda_host_var);
18745 !Var->
hasAttr<CUDASharedAttr>() &&
18761 (!FD || (!FD->getDescribedFunctionTemplate() &&
18773 unsigned CapturingScopeIndex) {
18800 unsigned ContextKind = 3;
18810 S.
Diag(loc, diag::err_reference_to_local_in_enclosing_context)
18811 << var << ValueKind << ContextKind << VarDC;
18812 S.
Diag(var->getLocation(), diag::note_entity_declared_at)
18821 bool &SubCapturesAreNested,
18827 SubCapturesAreNested =
true;
18880 "Only variables and structured bindings can be captured");
18891 S.
Diag(Loc, diag::err_lambda_capture_anonymous_var);
18900 S.
Diag(Loc, diag::err_ref_vm_type);
18911 S.
Diag(Loc, diag::err_ref_flexarray_type);
18913 S.
Diag(Loc, diag::err_lambda_capture_flexarray_type) << Var;
18918 const bool HasBlocksAttr = Var->
hasAttr<BlocksAttr>();
18923 S.
Diag(Loc, diag::err_capture_block_variable) << Var << !IsLambda;
18932 S.
Diag(Loc, diag::err_opencl_block_ref_block);
18943 ? diag::warn_cxx17_compat_capture_binding
18944 : diag::ext_capture_binding)
18958 bool ByRef =
false;
18964 if (BuildAndDiagnose) {
18965 S.
Diag(Loc, diag::err_ref_array_type);
18976 if (BuildAndDiagnose) {
18977 S.
Diag(Loc, diag::err_arc_autoreleasing_capture)
18993 if (BuildAndDiagnose) {
18995 S.
Diag(Loc, diag::warn_block_capture_autoreleasing);
18996 S.
Diag(VarLoc, diag::note_declare_parameter_strong);
19001 const bool HasBlocksAttr = Var->
hasAttr<BlocksAttr>();
19010 DeclRefType = CaptureType;
19014 if (BuildAndDiagnose)
19024 const bool BuildAndDiagnose,
QualType &CaptureType,
QualType &DeclRefType,
19025 const bool RefersToCapturedVariable,
TryCaptureKind Kind,
bool IsTopScope,
19051 CaptureType = DeclRefType;
19054 if (BuildAndDiagnose)
19055 RSI->
addCapture(Var,
false, ByRef, RefersToCapturedVariable,
19065 const bool RefersToCapturedVariable,
19070 bool ByRef =
false;
19074 ByRef = (LSI->
ImpCaptureStyle == LambdaScopeInfo::ImpCap_LambdaByref);
19079 S.
Diag(Loc, diag::err_wasm_ca_reference) << 0;
19110 if (!RefType->getPointeeType()->isFunctionType())
19117 if (BuildAndDiagnose) {
19118 S.
Diag(Loc, diag::err_arc_autoreleasing_capture) << 1;
19128 if (!
Invalid && BuildAndDiagnose) {
19132 diag::err_capture_of_incomplete_or_sizeless_type,
19136 diag::err_capture_of_abstract_type))
19162 if (BuildAndDiagnose)
19163 LSI->
addCapture(Var,
false, ByRef, RefersToCapturedVariable,
19164 Loc, EllipsisLoc, CaptureType,
Invalid);
19175 if (
T.isTriviallyCopyableType(Context))
19179 if (!(RD = RD->getDefinition()))
19181 if (RD->hasSimpleCopyConstructor())
19183 if (RD->hasUserDeclaredCopyConstructor())
19185 if (Ctor->isCopyConstructor())
19186 return !Ctor->isDeleted();
19206 if (ShouldOfferCopyFix) {
19210 FixBuffer.assign({Separator, Var->
getName()});
19211 Sema.
Diag(VarInsertLoc, diag::note_lambda_variable_capture_fixit)
19216 FixBuffer.assign({Separator,
"&", Var->
getName()});
19217 Sema.
Diag(VarInsertLoc, diag::note_lambda_variable_capture_fixit)
19229 return !C.isThisCapture() && !C.isInitCapture();
19238 if (ShouldOfferCopyFix) {
19239 bool CanDefaultCopyCapture =
true;
19248 if (CanDefaultCopyCapture && llvm::none_of(LSI->
Captures, [](
Capture &
C) {
19249 return !C.isThisCapture() && !C.isInitCapture() && C.isCopyCapture();
19251 FixBuffer.assign({
"=", Separator});
19252 Sema.
Diag(DefaultInsertLoc, diag::note_lambda_default_capture_fixit)
19261 return !C.isInitCapture() && C.isReferenceCapture() &&
19262 !C.isThisCapture();
19264 FixBuffer.assign({
"&", Separator});
19265 Sema.
Diag(DefaultInsertLoc, diag::note_lambda_default_capture_fixit)
19274 QualType &DeclRefType,
const unsigned *
const FunctionScopeIndexToStopAt) {
19297 const auto *VD = dyn_cast<VarDecl>(Var);
19299 if (VD->isInitCapture())
19304 assert(VD &&
"Cannot capture a null variable");
19306 const unsigned MaxFunctionScopesIndex = FunctionScopeIndexToStopAt
19310 if (FunctionScopeIndexToStopAt) {
19311 assert(!
FunctionScopes.empty() &&
"No function scopes to stop at?");
19316 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(
FunctionScopes[FSIndex]);
19317 FSIndex && LSI && !LSI->AfterParameterList)
19319 assert(MaxFunctionScopesIndex <= FSIndex &&
19320 "FunctionScopeIndexToStopAt should be no greater than FSIndex into "
19321 "FunctionScopes.");
19322 while (FSIndex != MaxFunctionScopesIndex) {
19330 bool IsGlobal = !VD->hasLocalStorage();
19331 if (IsGlobal && !(
LangOpts.OpenMP &&
19332 OpenMP().isOpenMPCapturedDecl(Var,
true,
19333 MaxFunctionScopesIndex)))
19347 CaptureType = Var->
getType();
19349 bool Nested =
false;
19351 unsigned FunctionScopesIndex = MaxFunctionScopesIndex;
19356 LSI = dyn_cast_or_null<LambdaScopeInfo>(
19359 bool IsInScopeDeclarationContext =
19370 if (IsInScopeDeclarationContext &&
19371 FunctionScopesIndex == MaxFunctionScopesIndex && VarDC == DC)
19377 !IsInScopeDeclarationContext
19380 BuildAndDiagnose, *
this);
19386 FunctionScopesIndex = MaxFunctionScopesIndex - 1;
19405 if (
const auto *Parm = dyn_cast<ParmVarDecl>(Var);
19406 Parm && Parm->getDeclContext() == DC)
19414 if (BuildAndDiagnose) {
19417 Diag(ExprLoc, diag::err_lambda_impcap) << Var;
19432 if (
ParmVarDecl *PVD = dyn_cast_or_null<ParmVarDecl>(Var))
19433 QTy = PVD->getOriginalType();
19438 if (
auto *RSI = dyn_cast<CapturedRegionScopeInfo>(CSI)) {
19445 if (BuildAndDiagnose) {
19446 Diag(ExprLoc, diag::err_capture_binding_openmp) << Var;
19452 Var, RSI->OpenMPLevel, RSI->OpenMPCaptureLevel);
19457 if (IsOpenMPPrivateDecl != OMPC_unknown &&
19460 if (
ParmVarDecl *PVD = dyn_cast_or_null<ParmVarDecl>(Var))
19461 QTy = PVD->getOriginalType();
19463 E =
OpenMP().getNumberOfConstructScopes(RSI->OpenMPLevel);
19467 assert(RSI->OpenMPLevel == OuterRSI->OpenMPLevel &&
19468 "Wrong number of captured regions associated with the "
19469 "OpenMP construct.");
19474 IsOpenMPPrivateDecl != OMPC_private &&
19476 RSI->OpenMPCaptureLevel);
19480 Var, RSI->OpenMPLevel, RSI->OpenMPCaptureLevel);
19486 OpenMP().adjustOpenMPTargetScopeIndex(FunctionScopesIndex,
19489 if (IsTargetCap || IsOpenMPPrivateDecl == OMPC_private ||
19490 (IsGlobal && !IsGlobalCap)) {
19491 Nested = !IsTargetCap;
19497 CaptureType =
Context.getLValueReferenceType(DeclRefType);
19506 if (BuildAndDiagnose) {
19507 Diag(ExprLoc, diag::err_lambda_impcap) << Var;
19529 FunctionScopesIndex--;
19530 if (IsInScopeDeclarationContext)
19532 }
while (!VarDC->
Equals(DC));
19540 for (
unsigned I = ++FunctionScopesIndex, N = MaxFunctionScopesIndex + 1; I != N;
19553 if (
Invalid && !BuildAndDiagnose)
19558 DeclRefType, Nested, *
this,
Invalid);
19562 RSI, Var, ExprLoc, BuildAndDiagnose, CaptureType, DeclRefType, Nested,
19563 Kind, I == N - 1, *
this,
Invalid);
19569 DeclRefType, Nested, Kind, EllipsisLoc,
19574 if (
Invalid && !BuildAndDiagnose)
19586 DeclRefType,
nullptr);
19594 false, CaptureType, DeclRefType,
nullptr);
19598 assert(Var &&
"Null value cannot be captured");
19605 false, CaptureType, DeclRefType,
19609 return DeclRefType;
19617class CopiedTemplateArgs {
19621 template<
typename RefExpr>
19622 CopiedTemplateArgs(RefExpr *E) : HasArgs(E->hasExplicitTemplateArgs()) {
19624 E->copyTemplateArgumentsInto(TemplateArgStorage);
19627#ifdef __has_cpp_attribute
19628#if __has_cpp_attribute(clang::lifetimebound)
19629 [[clang::lifetimebound]]
19633 return HasArgs ? &TemplateArgStorage :
nullptr;
19659 auto Rebuild = [&](
Expr *Sub) {
19664 auto IsPotentialResultOdrUsed = [&](
NamedDecl *D) {
19667 auto *VD = dyn_cast<VarDecl>(D);
19690 llvm_unreachable(
"unexpected non-odr-use-reason");
19694 if (VD->getType()->isReferenceType())
19696 if (
auto *RD = VD->getType()->getAsCXXRecordDecl())
19697 if (RD->hasDefinition() && RD->hasMutableFields())
19699 if (!VD->isUsableInConstantExpressions(S.
Context))
19704 if (VD->getType()->isReferenceType())
19712 auto MaybeCUDAODRUsed = [&]() ->
bool {
19718 auto *DRE = dyn_cast<DeclRefExpr>(E);
19721 auto *VD = dyn_cast<VarDecl>(DRE->getDecl());
19728 auto MarkNotOdrUsed = [&] {
19729 if (!MaybeCUDAODRUsed()) {
19732 LSI->markVariableExprAsNonODRUsed(E);
19740 case Expr::DeclRefExprClass: {
19742 if (DRE->isNonOdrUse() || IsPotentialResultOdrUsed(DRE->getDecl()))
19748 S.
Context, DRE->getQualifierLoc(), DRE->getTemplateKeywordLoc(),
19749 DRE->getDecl(), DRE->refersToEnclosingVariableOrCapture(),
19750 DRE->getNameInfo(), DRE->getType(), DRE->getValueKind(),
19751 DRE->getFoundDecl(), CopiedTemplateArgs(DRE), NOUR);
19754 case Expr::FunctionParmPackExprClass: {
19759 if (IsPotentialResultOdrUsed(D))
19770 case Expr::ArraySubscriptExprClass: {
19776 if (!
Base.isUsable())
19778 Expr *LHS = ASE->getBase() == ASE->getLHS() ?
Base.get() : ASE->getLHS();
19779 Expr *RHS = ASE->getBase() == ASE->getRHS() ?
Base.get() : ASE->getRHS();
19782 ASE->getRBracketLoc());
19785 case Expr::MemberExprClass: {
19791 if (!
Base.isUsable())
19794 S.
Context,
Base.get(), ME->isArrow(), ME->getOperatorLoc(),
19795 ME->getQualifierLoc(), ME->getTemplateKeywordLoc(),
19796 ME->getMemberDecl(), ME->getFoundDecl(), ME->getMemberNameInfo(),
19797 CopiedTemplateArgs(ME), ME->getType(), ME->getValueKind(),
19798 ME->getObjectKind(), ME->isNonOdrUse());
19801 if (ME->getMemberDecl()->isCXXInstanceMember())
19806 if (ME->isNonOdrUse() || IsPotentialResultOdrUsed(ME->getMemberDecl()))
19812 S.
Context, ME->getBase(), ME->isArrow(), ME->getOperatorLoc(),
19813 ME->getQualifierLoc(), ME->getTemplateKeywordLoc(), ME->getMemberDecl(),
19814 ME->getFoundDecl(), ME->getMemberNameInfo(), CopiedTemplateArgs(ME),
19815 ME->getType(), ME->getValueKind(), ME->getObjectKind(), NOUR);
19818 case Expr::BinaryOperatorClass: {
19820 Expr *LHS = BO->getLHS();
19821 Expr *RHS = BO->getRHS();
19823 if (BO->getOpcode() == BO_PtrMemD) {
19825 if (!Sub.isUsable())
19827 BO->setLHS(Sub.get());
19829 }
else if (BO->getOpcode() == BO_Comma) {
19831 if (!Sub.isUsable())
19833 BO->setRHS(Sub.get());
19841 case Expr::ParenExprClass: {
19844 if (!Sub.isUsable())
19846 return S.
ActOnParenExpr(PE->getLParen(), PE->getRParen(), Sub.get());
19851 case Expr::ConditionalOperatorClass: {
19862 LHS = CO->getLHS();
19864 RHS = CO->getRHS();
19866 CO->getCond(), LHS.
get(), RHS.
get());
19871 case Expr::UnaryOperatorClass: {
19873 if (UO->getOpcode() != UO_Extension)
19876 if (!Sub.isUsable())
19878 return S.
BuildUnaryOp(
nullptr, UO->getOperatorLoc(), UO_Extension,
19885 case Expr::GenericSelectionExprClass: {
19889 bool AnyChanged =
false;
19890 for (
Expr *OrigAssocExpr : GSE->getAssocExprs()) {
19891 ExprResult AssocExpr = Rebuild(OrigAssocExpr);
19895 AssocExprs.push_back(AssocExpr.
get());
19898 AssocExprs.push_back(OrigAssocExpr);
19902 void *ExOrTy =
nullptr;
19903 bool IsExpr = GSE->isExprPredicate();
19905 ExOrTy = GSE->getControllingExpr();
19907 ExOrTy = GSE->getControllingType();
19909 GSE->getGenericLoc(), GSE->getDefaultLoc(),
19910 GSE->getRParenLoc(), IsExpr, ExOrTy,
19911 GSE->getAssocTypeSourceInfos(), AssocExprs)
19919 case Expr::ChooseExprClass: {
19930 if (!LHS.
get() && !RHS.
get())
19933 LHS = CE->getLHS();
19935 RHS = CE->getRHS();
19938 RHS.
get(), CE->getRParenLoc());
19942 case Expr::ConstantExprClass: {
19945 if (!Sub.isUsable())
19952 case Expr::ImplicitCastExprClass: {
19957 switch (ICE->getCastKind()) {
19959 case CK_DerivedToBase:
19960 case CK_UncheckedDerivedToBase: {
19961 ExprResult Sub = Rebuild(ICE->getSubExpr());
19962 if (!Sub.isUsable())
19966 ICE->getValueKind(), &Path);
20023 for (
Expr *E : LocalMaybeODRUseExprs) {
20024 if (
auto *DRE = dyn_cast<DeclRefExpr>(E)) {
20026 DRE->getLocation(), *
this);
20027 }
else if (
auto *ME = dyn_cast<MemberExpr>(E)) {
20030 }
else if (
auto *FP = dyn_cast<FunctionParmPackExpr>(E)) {
20034 llvm_unreachable(
"Unexpected expression");
20039 "MarkVarDeclODRUsed failed to cleanup MaybeODRUseExprs?");
20048 const bool RefersToEnclosingScope =
20051 if (RefersToEnclosingScope) {
20066 assert(E &&
"Capture variable should be used in an expression.");
20079 "Invalid Expr argument to DoMarkVarDeclReferenced");
20090 bool UsableInConstantExpr =
20102 bool NeededForConstantEvaluation =
20105 bool NeedDefinition =
20106 OdrUse == OdrUseContext::Used || NeededForConstantEvaluation;
20109 "Can't instantiate a partial template specialization.");
20126 bool TryInstantiating =
20130 if (TryInstantiating) {
20133 bool FirstInstantiation = PointOfInstantiation.
isInvalid();
20134 if (FirstInstantiation) {
20135 PointOfInstantiation = Loc;
20137 MSI->setPointOfInstantiation(PointOfInstantiation);
20159 if (
auto *DRE = dyn_cast_or_null<DeclRefExpr>(E))
20160 DRE->setDecl(DRE->getDecl());
20161 else if (
auto *ME = dyn_cast_or_null<MemberExpr>(E))
20162 ME->setMemberDecl(ME->getMemberDecl());
20163 }
else if (FirstInstantiation) {
20165 .push_back(std::make_pair(Var, PointOfInstantiation));
20167 bool Inserted =
false;
20169 auto Iter = llvm::find_if(
20171 return P.first == Var;
20173 if (Iter != I.end()) {
20188 .push_back(std::make_pair(Var, PointOfInstantiation));
20212 if (
DeclRefExpr *DRE = dyn_cast_or_null<DeclRefExpr>(E))
20213 if (DRE->isNonOdrUse())
20215 if (
MemberExpr *ME = dyn_cast_or_null<MemberExpr>(E))
20216 if (ME->isNonOdrUse())
20220 case OdrUseContext::None:
20225 "missing non-odr-use marking for unevaluated decl ref");
20228 case OdrUseContext::FormallyOdrUsed:
20233 case OdrUseContext::Used:
20242 case OdrUseContext::Dependent:
20260 if (OdrUse == OdrUseContext::Used) {
20261 QualType CaptureType, DeclRefType;
20267 }
else if (OdrUse == OdrUseContext::Dependent) {
20283 auto *ID = dyn_cast<DeclRefExpr>(E);
20284 if (!ID || ID->isTypeDependent() || !ID->refersToEnclosingVariableOrCapture())
20291 auto IsDependent = [&]() {
20293 auto *LSI = dyn_cast<sema::LambdaScopeInfo>(
Scope);
20298 LSI->AfterParameterList)
20301 const auto *MD = LSI->CallOperator;
20302 if (MD->getType().isNull())
20306 if (!Ty || !MD->isExplicitObjectMemberFunction() ||
20310 if (
auto *
C = LSI->CaptureMap.count(D) ? &LSI->getCapture(D) :
nullptr) {
20311 if (
C->isCopyCapture())
20316 if (LSI->ImpCaptureStyle == LambdaScopeInfo::ImpCap_LambdaByval)
20322 ID->setCapturedByCopyInLambdaWithExplicitObjectParameter(
20328 bool MightBeOdrUse,
20336 if (
VarDecl *Var = dyn_cast<VarDecl>(D)) {
20355 const MemberExpr *ME = dyn_cast<MemberExpr>(E);
20362 bool IsVirtualCall = MD->
isVirtual() &&
20364 if (!IsVirtualCall)
20381 bool OdrUse =
true;
20383 if (
Method->isVirtual() &&
20387 if (
auto *FD = dyn_cast<FunctionDecl>(E->
getDecl())) {
20392 !FD->isDependentContext())
20406 bool MightBeOdrUse =
true;
20409 if (
Method->isPureVirtual())
20410 MightBeOdrUse =
false;
20429 bool MightBeOdrUse) {
20430 if (MightBeOdrUse) {
20431 if (
auto *VD = dyn_cast<VarDecl>(D)) {
20436 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
20462bool MarkReferencedDecls::TraverseTemplateArgument(
20463 const TemplateArgument &Arg) {
20466 EnterExpressionEvaluationContext
Evaluated(
20480 MarkReferencedDecls Marker(*
this, Loc);
20481 Marker.TraverseType(
T);
20487class EvaluatedExprMarker :
public UsedDeclVisitor<EvaluatedExprMarker> {
20490 bool SkipLocalVariables;
20493 EvaluatedExprMarker(
Sema &S,
bool SkipLocalVariables,
20495 : Inherited(S), SkipLocalVariables(SkipLocalVariables), StopAt(StopAt) {}
20501 void Visit(Expr *E) {
20502 if (llvm::is_contained(StopAt, E))
20504 Inherited::Visit(E);
20507 void VisitConstantExpr(ConstantExpr *E) {
20512 void VisitDeclRefExpr(DeclRefExpr *E) {
20514 if (SkipLocalVariables) {
20515 if (VarDecl *VD = dyn_cast<VarDecl>(E->
getDecl()))
20516 if (VD->hasLocalStorage())
20526 void VisitMemberExpr(MemberExpr *E) {
20534 bool SkipLocalVariables,
20536 EvaluatedExprMarker(*
this, SkipLocalVariables, StopAt).Visit(E);
20558 if (
auto *VD = dyn_cast_or_null<VarDecl>(
20560 if (VD->isConstexpr() ||
20561 (VD->isStaticDataMember() && VD->isFirstDecl() && !VD->isInline()))
20634 class CallReturnIncompleteDiagnoser :
public TypeDiagnoser {
20640 : FD(FD), CE(CE) { }
20644 S.
Diag(Loc, diag::err_call_incomplete_return)
20649 S.
Diag(Loc, diag::err_call_function_incomplete_return)
20654 } Diagnoser(FD, CE);
20667 unsigned diagnostic = diag::warn_condition_is_assignment;
20668 bool IsOrAssign =
false;
20671 if (Op->getOpcode() != BO_Assign && Op->getOpcode() != BO_OrAssign)
20674 IsOrAssign = Op->getOpcode() == BO_OrAssign;
20682 if (
ObjC().isSelfExpr(Op->getLHS()) && ME->getMethodFamily() ==
OMF_init)
20683 diagnostic = diag::warn_condition_is_idiomatic_assignment;
20687 diagnostic = diag::warn_condition_is_idiomatic_assignment;
20690 Loc = Op->getOperatorLoc();
20692 if (Op->getOperator() != OO_Equal && Op->getOperator() != OO_PipeEqual)
20695 IsOrAssign = Op->getOperator() == OO_PipeEqual;
20696 Loc = Op->getOperatorLoc();
20708 Diag(Loc, diag::note_condition_assign_silence)
20713 Diag(Loc, diag::note_condition_or_assign_to_comparison)
20716 Diag(Loc, diag::note_condition_assign_to_comparison)
20734 if (opE->getOpcode() == BO_EQ &&
20735 opE->getLHS()->IgnoreParenImpCasts()->isModifiableLvalue(
Context)
20741 Diag(Loc, diag::note_equality_comparison_silence)
20744 Diag(Loc, diag::note_equality_comparison_to_assign)
20750 bool IsConstexpr) {
20752 if (
ParenExpr *parenE = dyn_cast<ParenExpr>(E))
20769 if (!
T->isScalarType()) {
20770 Diag(Loc, diag::err_typecheck_statement_requires_scalar)
20774 CheckBoolLikeConversion(E, Loc);
20803 if (
Cond.isInvalid()) {
20811 if (!
Cond.isUsable())
20821 struct RebuildUnknownAnyFunction
20822 :
StmtVisitor<RebuildUnknownAnyFunction, ExprResult> {
20826 RebuildUnknownAnyFunction(
Sema &S) : S(S) {}
20829 llvm_unreachable(
"unexpected statement!");
20840 template <
class T>
ExprResult rebuildSugarExpr(
T *E) {
20841 ExprResult SubResult = Visit(E->getSubExpr());
20844 Expr *SubExpr = SubResult.
get();
20845 E->setSubExpr(SubExpr);
20846 E->setType(SubExpr->
getType());
20853 return rebuildSugarExpr(E);
20856 ExprResult VisitUnaryExtension(UnaryOperator *E) {
20857 return rebuildSugarExpr(E);
20860 ExprResult VisitUnaryAddrOf(UnaryOperator *E) {
20864 Expr *SubExpr = SubResult.
get();
20872 ExprResult resolveDecl(Expr *E, ValueDecl *VD) {
20890 ExprResult VisitDeclRefExpr(DeclRefExpr *E) {
20891 return resolveDecl(E, E->
getDecl());
20899 ExprResult Result = RebuildUnknownAnyFunction(S).Visit(FunctionExpr);
20900 if (Result.isInvalid())
return ExprError();
20909 struct RebuildUnknownAnyExpr
20910 : StmtVisitor<RebuildUnknownAnyExpr, ExprResult> {
20917 RebuildUnknownAnyExpr(Sema &S, QualType
CastType)
20921 llvm_unreachable(
"unexpected statement!");
20931 ExprResult VisitObjCMessageExpr(ObjCMessageExpr *E);
20935 template <
class T>
ExprResult rebuildSugarExpr(
T *E) {
20936 ExprResult SubResult = Visit(E->getSubExpr());
20938 Expr *SubExpr = SubResult.
get();
20939 E->setSubExpr(SubExpr);
20940 E->setType(SubExpr->
getType());
20947 return rebuildSugarExpr(E);
20950 ExprResult VisitUnaryExtension(UnaryOperator *E) {
20951 return rebuildSugarExpr(E);
20954 ExprResult VisitUnaryAddrOf(UnaryOperator *E) {
20955 const PointerType *Ptr = DestType->
getAs<PointerType>();
20980 ExprResult VisitImplicitCastExpr(ImplicitCastExpr *E);
20982 ExprResult resolveDecl(Expr *E, ValueDecl *VD);
20988 ExprResult VisitDeclRefExpr(DeclRefExpr *E) {
20989 return resolveDecl(E, E->
getDecl());
20995ExprResult RebuildUnknownAnyExpr::VisitCallExpr(CallExpr *E) {
21000 FK_FunctionPointer,
21005 QualType CalleeType = CalleeExpr->
getType();
21008 Kind = FK_MemberFunction;
21010 }
else if (
const PointerType *Ptr = CalleeType->
getAs<PointerType>()) {
21012 Kind = FK_FunctionPointer;
21015 Kind = FK_BlockPointer;
21017 const FunctionType *FnType = CalleeType->
castAs<FunctionType>();
21022 unsigned diagID = diag::err_func_returning_array_function;
21023 if (Kind == FK_BlockPointer)
21024 diagID = diag::err_block_returning_array_function;
21037 const FunctionProtoType *Proto = dyn_cast<FunctionProtoType>(FnType);
21059 SmallVector<QualType, 8> ArgTypes;
21060 if (ParamTypes.empty() && Proto->
isVariadic()) {
21062 for (
unsigned i = 0, e = E->
getNumArgs(); i != e; ++i) {
21065 ParamTypes = ArgTypes;
21076 case FK_MemberFunction:
21080 case FK_FunctionPointer:
21084 case FK_BlockPointer:
21090 ExprResult CalleeResult = Visit(CalleeExpr);
21098ExprResult RebuildUnknownAnyExpr::VisitObjCMessageExpr(ObjCMessageExpr *E) {
21101 S.
Diag(E->
getExprLoc(), diag::err_func_returning_array_function)
21109 Method->setReturnType(DestType);
21119ExprResult RebuildUnknownAnyExpr::VisitImplicitCastExpr(ImplicitCastExpr *E) {
21121 if (E->
getCastKind() == CK_FunctionToPointerDecay) {
21135 }
else if (E->
getCastKind() == CK_LValueToRValue) {
21152 llvm_unreachable(
"Unhandled cast type!");
21156ExprResult RebuildUnknownAnyExpr::resolveDecl(Expr *E, ValueDecl *VD) {
21158 QualType
Type = DestType;
21163 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(VD)) {
21164 if (
const PointerType *Ptr =
Type->getAs<PointerType>()) {
21172 if (!
Type->isFunctionType()) {
21177 if (
const FunctionProtoType *FT =
Type->getAs<FunctionProtoType>()) {
21181 QualType FDT = FD->getType();
21182 const FunctionType *FnType = FDT->
castAs<FunctionType>();
21183 const FunctionProtoType *Proto = dyn_cast_or_null<FunctionProtoType>(FnType);
21184 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E);
21185 if (DRE && Proto && Proto->getParamTypes().empty() && Proto->isVariadic()) {
21186 SourceLocation Loc = FD->getLocation();
21188 S.
Context, FD->getDeclContext(), Loc, Loc,
21189 FD->getNameInfo().getName(), DestType, FD->getTypeSourceInfo(),
21191 false , FD->hasPrototype(),
21194 if (FD->getQualifier())
21197 SmallVector<ParmVarDecl*, 16> Params;
21198 for (
const auto &AI : FT->param_types()) {
21199 ParmVarDecl *Param =
21202 Params.push_back(Param);
21204 NewFD->setParams(Params);
21210 if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD))
21211 if (MD->isInstance()) {
21222 if (
const ReferenceType *RefTy =
Type->getAs<ReferenceType>()) {
21223 Type = RefTy->getPointeeType();
21224 }
else if (
Type->isFunctionType()) {
21225 S.
Diag(E->
getExprLoc(), diag::err_unknown_any_var_function_type)
21251 diag::err_typecheck_cast_to_incomplete))
21266 return RebuildUnknownAnyExpr(*
this, ToType).Visit(E);
21273 ExplicitCastExpr *castArg = dyn_cast<ExplicitCastExpr>(arg->IgnoreParens());
21282 assert(!arg->hasPlaceholderType());
21294 unsigned diagID = diag::err_uncasted_use_of_unknown_any;
21297 if (
CallExpr *call = dyn_cast<CallExpr>(E)) {
21298 E = call->getCallee();
21299 diagID = diag::err_uncasted_call_of_unknown_any;
21307 if (
DeclRefExpr *ref = dyn_cast<DeclRefExpr>(E)) {
21308 loc = ref->getLocation();
21309 d = ref->getDecl();
21310 }
else if (
MemberExpr *mem = dyn_cast<MemberExpr>(E)) {
21311 loc = mem->getMemberLoc();
21312 d = mem->getMemberDecl();
21314 diagID = diag::err_uncasted_call_of_unknown_any;
21315 loc = msg->getSelectorStartLoc();
21316 d = msg->getMethodDecl();
21318 S.
Diag(loc, diag::err_uncasted_send_to_unknown_any_method)
21319 <<
static_cast<unsigned>(msg->isClassMessage()) << msg->getSelector()
21337 if (!placeholderType)
return E;
21339 switch (placeholderType->
getKind()) {
21340 case BuiltinType::UnresolvedTemplate: {
21353 if (
auto *TD = dyn_cast<TemplateDecl>(Temp))
21354 TN =
Context.getQualifiedTemplateName(NNS, ULE->hasTemplateKeyword(),
21359 Diag(NameInfo.
getLoc(), diag::err_template_kw_refers_to_type_template)
21360 << TN << ULE->getSourceRange() << IsTypeAliasTemplateDecl;
21362 << IsTypeAliasTemplateDecl;
21365 bool HasAnyDependentTA =
false;
21367 HasAnyDependentTA |= Arg.getArgument().
isDependent();
21379 TST =
Context.getTemplateSpecializationType(
21388 case BuiltinType::Overload: {
21408 case BuiltinType::BoundMember: {
21414 PD =
PDiag(diag::err_dtor_expr_without_call) << 1;
21415 }
else if (
const auto *ME = dyn_cast<MemberExpr>(BME)) {
21416 if (ME->getMemberNameInfo().getName().getNameKind() ==
21418 PD =
PDiag(diag::err_dtor_expr_without_call) << 0;
21426 case BuiltinType::ARCUnbridgedCast: {
21433 case BuiltinType::UnknownAny:
21437 case BuiltinType::PseudoObject:
21440 case BuiltinType::BuiltinFn: {
21445 unsigned BuiltinID = FD->getBuiltinID();
21446 if (BuiltinID == Builtin::BI__noop) {
21448 CK_BuiltinFnToFnPtr)
21455 if (
Context.BuiltinInfo.isInStdNamespace(BuiltinID)) {
21461 ? diag::err_use_of_unaddressable_function
21462 : diag::warn_cxx20_compat_use_of_unaddressable_function);
21463 if (FD->isImplicitlyInstantiable()) {
21490 case BuiltinType::IncompleteMatrixIdx:
21494 diag::err_matrix_incomplete_index);
21498 case BuiltinType::ArraySection:
21507 case BuiltinType::OMPArrayShaping:
21510 case BuiltinType::OMPIterator:
21514#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
21515 case BuiltinType::Id:
21516#include "clang/Basic/OpenCLImageTypes.def"
21517#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
21518 case BuiltinType::Id:
21519#include "clang/Basic/OpenCLExtensionTypes.def"
21520#define SVE_TYPE(Name, Id, SingletonId) \
21521 case BuiltinType::Id:
21522#include "clang/Basic/AArch64ACLETypes.def"
21523#define PPC_VECTOR_TYPE(Name, Id, Size) \
21524 case BuiltinType::Id:
21525#include "clang/Basic/PPCTypes.def"
21526#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
21527#include "clang/Basic/RISCVVTypes.def"
21528#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
21529#include "clang/Basic/WebAssemblyReferenceTypes.def"
21530#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
21531#include "clang/Basic/AMDGPUTypes.def"
21532#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
21533#include "clang/Basic/HLSLIntangibleTypes.def"
21534#define BUILTIN_TYPE(Id, SingletonId) case BuiltinType::Id:
21535#define PLACEHOLDER_TYPE(Id, SingletonId)
21536#include "clang/AST/BuiltinTypes.def"
21540 llvm_unreachable(
"invalid placeholder type!");
21553 if (!
Context.getLangOpts().RecoveryAST)
21559 if (
T.isNull() ||
T->isUndeducedType() ||
21560 !
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 bool IsInvalidCmseNSCallConversion(Sema &S, QualType FromType, QualType ToType)
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.
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
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
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)
bool hasSameUnqualifiedType(QualType T1, QualType T2) const
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
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.
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.
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.
bool getCmseNSCall() const
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.
SemaDiagnosticBuilder DiagCompat(SourceLocation Loc, unsigned CompatDiagId, bool DeferHint=false)
Emit a compatibility diagnostic.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial 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...
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 ?
bool IsFunctionConversion(QualType FromType, QualType ToType, bool *DiscardingCFIUncheckedCallee=nullptr, bool *AddingCFIUncheckedCallee=nullptr) const
Determine whether the conversion from FromType to ToType is a valid conversion that strips "noexcept"...
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.
ExprResult ActOnArraySubscriptExpr(Scope *S, Expr *Base, SourceLocation LLoc, MultiExprArg ArgExprs, SourceLocation RLoc)
void DiagnoseUnsatisfiedConstraint(const ConstraintSatisfaction &Satisfaction, bool First=true)
Emit diagnostics explaining why a constraint expression was deemed unsatisfied.
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...
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
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
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.