61#include "llvm/ADT/STLExtras.h"
62#include "llvm/ADT/STLForwardCompat.h"
63#include "llvm/ADT/StringExtras.h"
64#include "llvm/Support/Casting.h"
65#include "llvm/Support/ConvertUTF.h"
66#include "llvm/Support/SaveAndRestore.h"
67#include "llvm/Support/TypeSize.h"
91 if (TreatUnavailableAsInvalid &&
101 if (isa<UnresolvedUsingIfExistsDecl>(
D))
109 if (
const auto *A =
D->
getAttr<UnusedAttr>()) {
112 if (A->getSemanticSpelling() != UnusedAttr::CXX11_maybe_unused &&
113 A->getSemanticSpelling() != UnusedAttr::C23_maybe_unused) {
115 if (DC && !DC->
hasAttr<UnusedAttr>())
116 S.
Diag(
Loc, diag::warn_used_but_marked_unused) <<
D;
124 if (
Decl->isDefaulted()) {
135 auto *Ctor = dyn_cast<CXXConstructorDecl>(
Decl);
136 if (Ctor && Ctor->isInheritingConstructor())
147 if (I->getStorageClass() !=
SC_None)
174 if (!Current->isInlined())
176 if (!Current->isExternallyVisible())
192 if (!DowngradeWarning && UsedFn)
195 S.
Diag(
Loc, DowngradeWarning ? diag::ext_internal_in_extern_inline_quiet
196 : diag::ext_internal_in_extern_inline)
211 Diag(DeclBegin, diag::note_convert_inline_to_static)
218 bool ObjCPropertyAccess,
219 bool AvoidPartialAvailabilityChecks,
221 bool SkipTrailingRequiresClause) {
229 Diag(Suppressed.first, Suppressed.second);
240 if (cast<FunctionDecl>(
D)->isMain())
241 Diag(
Loc, diag::ext_main_used);
248 if (isa<BindingDecl>(
D)) {
249 Diag(
Loc, diag::err_binding_cannot_appear_in_own_initializer)
252 Diag(
Loc, diag::err_auto_variable_cannot_appear_in_own_initializer)
253 <<
D->getDeclName() << cast<VarDecl>(
D)->getType();
260 if (FD->isDeleted()) {
261 auto *Ctor = dyn_cast<CXXConstructorDecl>(FD);
262 if (Ctor && Ctor->isInheritingConstructor())
263 Diag(
Loc, diag::err_deleted_inherited_ctor_use)
265 << Ctor->getInheritedConstructor().getConstructor()->getParent();
268 Diag(
Loc, diag::err_deleted_function_use)
269 << (Msg !=
nullptr) << (Msg ? Msg->
getString() : StringRef());
283 if (!SkipTrailingRequiresClause && FD->getTrailingRequiresClause()) {
292 diag::err_reference_to_function_with_unsatisfied_constraints)
310 if (
auto *
Concept = dyn_cast<ConceptDecl>(
D);
314 if (
auto *MD = dyn_cast<CXXMethodDecl>(
D)) {
316 if (MD->getParent()->isLambda() &&
317 ((isa<CXXConstructorDecl>(MD) &&
318 cast<CXXConstructorDecl>(MD)->isDefaultConstructor()) ||
319 MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator())) {
320 Diag(
Loc, diag::warn_cxx17_compat_lambda_def_ctor_assign)
321 << !isa<CXXConstructorDecl>(MD);
325 auto getReferencedObjCProp = [](
const NamedDecl *
D) ->
327 if (
const auto *MD = dyn_cast<ObjCMethodDecl>(
D))
342 auto *DRD = dyn_cast<OMPDeclareReductionDecl>(
CurContext);
345 Diag(
Loc, diag::err_omp_wrong_var_in_declare_reduction)
356 if (
LangOpts.OpenMP && isa<VarDecl>(
D) &&
357 !
OpenMP().isOpenMPDeclareMapperVarDeclAllowed(cast<VarDecl>(
D))) {
358 Diag(
Loc, diag::err_omp_declare_mapper_wrong_var)
364 if (
const auto *EmptyD = dyn_cast<UnresolvedUsingIfExistsDecl>(
D)) {
365 Diag(
Loc, diag::err_use_of_empty_using_if_exists);
366 Diag(EmptyD->getLocation(), diag::note_empty_using_if_exists_here);
371 AvoidPartialAvailabilityChecks, ClassReceiver);
377 if (
D->
hasAttr<AvailableOnlyInDefaultEvalMethodAttr>()) {
383 diag::err_type_available_only_in_default_eval_method)
387 if (
auto *VD = dyn_cast<ValueDecl>(
D))
393 if (
const auto *VD = dyn_cast<VarDecl>(
D))
395 targetDiag(*Locs.begin(), diag::err_thread_unsupported);
398 if (isa<ParmVarDecl>(
D) && isa<RequiresExprBodyDecl>(
D->
getDeclContext()) &&
403 Diag(
Loc, diag::err_requires_expr_parameter_referenced_in_evaluated_context)
419 unsigned NumFormalParams;
423 enum { CK_Function, CK_Method, CK_Block } CalleeKind;
425 if (
const auto *MD = dyn_cast<ObjCMethodDecl>(
D)) {
426 NumFormalParams = MD->param_size();
427 CalleeKind = CK_Method;
428 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(
D)) {
429 NumFormalParams = FD->param_size();
430 CalleeKind = CK_Function;
431 }
else if (
const auto *VD = dyn_cast<VarDecl>(
D)) {
438 CalleeKind = CK_Function;
441 CalleeKind = CK_Block;
446 if (
const auto *proto = dyn_cast<FunctionProtoType>(Fn))
447 NumFormalParams = proto->getNumParams();
458 unsigned NullPos =
Attr->getNullPos();
459 assert((NullPos == 0 || NullPos == 1) &&
"invalid null position on sentinel");
460 NumFormalParams = (NullPos > NumFormalParams ? 0 : NumFormalParams - NullPos);
463 unsigned NumArgsAfterSentinel =
Attr->getSentinel();
467 if (Args.size() < NumFormalParams + NumArgsAfterSentinel + 1) {
468 Diag(
Loc, diag::warn_not_enough_argument) <<
D->getDeclName();
474 const Expr *SentinelExpr = Args[Args.size() - NumArgsAfterSentinel - 1];
487 std::string NullValue;
491 NullValue =
"nullptr";
495 NullValue =
"(void*) 0";
498 Diag(
Loc, diag::warn_missing_sentinel) <<
int(CalleeKind);
500 Diag(MissingNilLoc, diag::warn_missing_sentinel)
525 assert(!Ty.
isNull() &&
"DefaultFunctionArrayConversion - missing type");
529 if (
auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl()))
534 CK_FunctionToPointerDecay).
get();
549 CK_ArrayToPointerDecay);
565 if (UO && UO->getOpcode() == UO_Deref &&
566 UO->getSubExpr()->getType()->isPointerType()) {
568 UO->getSubExpr()->getType()->getPointeeType().getAddressSpace();
571 UO->getSubExpr()->IgnoreParenCasts()->isNullPointerConstant(
573 !UO->getType().isVolatileQualified()) {
575 S.
PDiag(diag::warn_indirection_through_null)
576 << UO->getSubExpr()->getSourceRange());
578 S.
PDiag(diag::note_indirection_through_null));
610 if (ObjectSetClass) {
654 assert(!
T.isNull() &&
"r-value conversion on typeless expression?");
696 SourceRange(OISA->getOpLoc(), OISA->getIsaMemberLoc()),
")");
713 if (
T.hasQualifiers())
714 T =
T.getUnqualifiedType();
744 T =
Atomic->getValueType().getUnqualifiedType();
769 CK_FunctionToPointerDecay);
792 assert(!Ty.
isNull() &&
"UsualUnaryConversions - missing type");
799 switch (EvalMethod) {
801 llvm_unreachable(
"Unrecognized float evaluation method");
804 llvm_unreachable(
"Float evaluation method should be set by now");
812 CK_FloatingComplexCast)
821 CK_FloatingComplexCast)
869 assert(!Ty.
isNull() &&
"DefaultArgumentPromotion - missing type");
881 if (BTy && (BTy->
getKind() == BuiltinType::Half ||
882 BTy->
getKind() == BuiltinType::Float)) {
885 if (BTy->
getKind() == BuiltinType::Half) {
903 "Unexpected typesize for LongLongTy");
972 if (!
Record->hasNonTrivialCopyConstructor() &&
973 !
Record->hasNonTrivialMoveConstructor() &&
974 !
Record->hasNonTrivialDestructor())
1001 PDiag(diag::warn_cxx98_compat_pass_non_pod_arg_to_vararg) << Ty << CT);
1008 PDiag(diag::warn_pass_class_arg_to_vararg)
1016 PDiag(diag::warn_cannot_pass_non_pod_arg_to_vararg)
1023 diag::err_cannot_pass_non_trivial_c_struct_to_vararg)
1027 PDiag(diag::err_cannot_pass_objc_interface_to_vararg)
1031 << isa<InitListExpr>(
E) << Ty << CT;
1040 if (PlaceholderTy->getKind() == BuiltinType::ARCUnbridgedCast &&
1042 (FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>()))) {
1081 if (
Call.isInvalid())
1086 if (Comma.isInvalid())
1093 diag::err_call_incomplete_argument))
1111 if (SkipCast)
return false;
1118 CK_IntegralComplexToFloatingComplex);
1136 bool PromotePrecision) {
1141 if (PromotePrecision) {
1146 if (LongerIsComplex)
1158 QualType RHSType,
bool IsCompAssign) {
1183 bool ConvertFloat,
bool ConvertInt) {
1188 CK_IntegralToFloating);
1199 CK_IntegralComplexToFloatingComplex);
1204 CK_FloatingRealToComplex);
1213 QualType RHSType,
bool IsCompAssign) {
1223 else if (!IsCompAssign)
1225 return LHSFloat ? LHSType : RHSType;
1230 if (LHSFloat && RHSFloat) {
1237 assert(order < 0 &&
"illegal float comparison");
1271 QualType LHSElem = LHSComplex ? LHSComplex->getElementType() : LHSType;
1277 if ((&LHSSem != &llvm::APFloat::PPCDoubleDouble() ||
1278 &RHSSem != &llvm::APFloat::IEEEquad()) &&
1279 (&LHSSem != &llvm::APFloat::IEEEquad() ||
1280 &RHSSem != &llvm::APFloat::PPCDoubleDouble()))
1297 CK_IntegralComplexCast);
1303template <PerformCastFn doLHSCast, PerformCastFn doRHSCast>
1306 QualType RHSType,
bool IsCompAssign) {
1311 if (LHSSigned == RHSSigned) {
1314 RHS = (*doRHSCast)(S, RHS.
get(), LHSType);
1316 }
else if (!IsCompAssign)
1317 LHS = (*doLHSCast)(S, LHS.
get(), RHSType);
1319 }
else if (order != (LHSSigned ? 1 : -1)) {
1323 RHS = (*doRHSCast)(S, RHS.
get(), LHSType);
1325 }
else if (!IsCompAssign)
1326 LHS = (*doLHSCast)(S, LHS.
get(), RHSType);
1333 RHS = (*doRHSCast)(S, RHS.
get(), LHSType);
1335 }
else if (!IsCompAssign)
1336 LHS = (*doLHSCast)(S, LHS.
get(), RHSType);
1345 RHS = (*doRHSCast)(S, RHS.
get(), result);
1347 LHS = (*doLHSCast)(S, LHS.
get(), result);
1357 bool IsCompAssign) {
1361 if (LHSComplexInt && RHSComplexInt) {
1365 handleIntegerConversion<doComplexIntegralCast, doComplexIntegralCast>
1366 (S, LHS, RHS, LHSEltType, RHSEltType, IsCompAssign);
1371 if (LHSComplexInt) {
1374 handleIntegerConversion<doComplexIntegralCast, doIntegralCast>
1375 (S, LHS, RHS, LHSEltType, RHSType, IsCompAssign);
1378 CK_IntegralRealToComplex);
1383 assert(RHSComplexInt);
1387 handleIntegerConversion<doIntegralCast, doComplexIntegralCast>
1388 (S, LHS, RHS, LHSType, RHSEltType, IsCompAssign);
1393 CK_IntegralRealToComplex);
1402 assert(BTy &&
"Expected a builtin type.");
1404 switch (BTy->getKind()) {
1405 case BuiltinType::ShortFract:
1406 case BuiltinType::UShortFract:
1407 case BuiltinType::SatShortFract:
1408 case BuiltinType::SatUShortFract:
1410 case BuiltinType::Fract:
1411 case BuiltinType::UFract:
1412 case BuiltinType::SatFract:
1413 case BuiltinType::SatUFract:
1415 case BuiltinType::LongFract:
1416 case BuiltinType::ULongFract:
1417 case BuiltinType::SatLongFract:
1418 case BuiltinType::SatULongFract:
1420 case BuiltinType::ShortAccum:
1421 case BuiltinType::UShortAccum:
1422 case BuiltinType::SatShortAccum:
1423 case BuiltinType::SatUShortAccum:
1425 case BuiltinType::Accum:
1426 case BuiltinType::UAccum:
1427 case BuiltinType::SatAccum:
1428 case BuiltinType::SatUAccum:
1430 case BuiltinType::LongAccum:
1431 case BuiltinType::ULongAccum:
1432 case BuiltinType::SatLongAccum:
1433 case BuiltinType::SatULongAccum:
1436 if (BTy->isInteger())
1438 llvm_unreachable(
"Unexpected fixed point or integer type");
1450 "Expected at least one of the operands to be a fixed point type");
1453 "Special fixed point arithmetic operation conversions are only "
1454 "applied to ints or other fixed point types");
1476 QualType ResultTy = LHSTyRank > RHSTyRank ? LHSTy : RHSTy;
1499 REnum = R->isUnscopedEnumerationType();
1501 if ((!IsCompAssign && LEnum && R->isFloatingType()) ||
1504 ? diag::err_arith_conv_enum_float_cxx26
1506 ? diag::warn_arith_conv_enum_float_cxx20
1507 : diag::warn_arith_conv_enum_float)
1510 }
else if (!IsCompAssign && LEnum && REnum &&
1516 DiagID = diag::err_conv_mixed_enum_types_cxx26;
1518 !R->castAs<
EnumType>()->getDecl()->hasNameForLinkage()) {
1523 ? diag::warn_arith_conv_mixed_anon_enum_types_cxx20
1524 : diag::warn_arith_conv_mixed_anon_enum_types;
1529 ? diag::warn_conditional_mixed_enum_types_cxx20
1530 : diag::warn_conditional_mixed_enum_types;
1535 ? diag::warn_comparison_mixed_enum_types_cxx20
1536 : diag::warn_comparison_mixed_enum_types;
1539 ? diag::warn_arith_conv_mixed_enum_types_cxx20
1540 : diag::warn_arith_conv_mixed_enum_types;
1543 << (
int)ACK << L << R;
1573 LHSType = AtomicLHS->getValueType();
1585 QualType LHSUnpromotedType = LHSType;
1589 if (!LHSBitfieldPromoteTy.
isNull())
1590 LHSType = LHSBitfieldPromoteTy;
1624 return handleIntegerConversion<doIntegralCast, doIntegralCast>
1635 bool PredicateIsExpr,
void *ControllingExprOrType,
1637 unsigned NumAssocs = ArgTypes.size();
1638 assert(NumAssocs == ArgExprs.size());
1641 for (
unsigned i = 0; i < NumAssocs; ++i) {
1650 if (!PredicateIsExpr) {
1654 assert(ControllingType &&
"couldn't get the type out of the parser");
1655 ControllingExprOrType = ControllingType;
1659 KeyLoc, DefaultLoc, RParenLoc, PredicateIsExpr, ControllingExprOrType,
1667 bool PredicateIsExpr,
void *ControllingExprOrType,
1669 unsigned NumAssocs = Types.size();
1670 assert(NumAssocs == Exprs.size());
1671 assert(ControllingExprOrType &&
1672 "Must have either a controlling expression or a controlling type");
1674 Expr *ControllingExpr =
nullptr;
1676 if (PredicateIsExpr) {
1683 reinterpret_cast<Expr *
>(ControllingExprOrType));
1686 ControllingExpr = R.
get();
1689 ControllingType =
reinterpret_cast<TypeSourceInfo *
>(ControllingExprOrType);
1690 if (!ControllingType)
1694 bool TypeErrorFound =
false,
1695 IsResultDependent = ControllingExpr
1698 ContainsUnexpandedParameterPack =
1708 diag::warn_side_effects_unevaluated_context);
1710 for (
unsigned i = 0; i < NumAssocs; ++i) {
1711 if (Exprs[i]->containsUnexpandedParameterPack())
1712 ContainsUnexpandedParameterPack =
true;
1715 if (Types[i]->getType()->containsUnexpandedParameterPack())
1716 ContainsUnexpandedParameterPack =
true;
1718 if (Types[i]->getType()->isDependentType()) {
1719 IsResultDependent =
true;
1732 if (ControllingExpr && Types[i]->getType()->isIncompleteType())
1733 D = diag::err_assoc_type_incomplete;
1734 else if (ControllingExpr && !Types[i]->getType()->isObjectType())
1735 D = diag::err_assoc_type_nonobject;
1736 else if (Types[i]->getType()->isVariablyModifiedType())
1737 D = diag::err_assoc_type_variably_modified;
1738 else if (ControllingExpr) {
1757 unsigned Reason = 0;
1766 Diag(Types[i]->getTypeLoc().getBeginLoc(),
1767 diag::warn_unreachable_association)
1768 << QT << (Reason - 1);
1772 Diag(Types[i]->getTypeLoc().getBeginLoc(),
D)
1773 << Types[i]->getTypeLoc().getSourceRange()
1774 << Types[i]->getType();
1775 TypeErrorFound =
true;
1780 for (
unsigned j = i+1; j < NumAssocs; ++j)
1781 if (Types[j] && !Types[j]->getType()->isDependentType() &&
1783 Types[j]->getType())) {
1784 Diag(Types[j]->getTypeLoc().getBeginLoc(),
1785 diag::err_assoc_compatible_types)
1786 << Types[j]->getTypeLoc().getSourceRange()
1787 << Types[j]->getType()
1788 << Types[i]->getType();
1789 Diag(Types[i]->getTypeLoc().getBeginLoc(),
1790 diag::note_compat_assoc)
1791 << Types[i]->getTypeLoc().getSourceRange()
1792 << Types[i]->getType();
1793 TypeErrorFound =
true;
1803 if (IsResultDependent) {
1804 if (ControllingExpr)
1806 Types, Exprs, DefaultLoc, RParenLoc,
1807 ContainsUnexpandedParameterPack);
1809 Exprs, DefaultLoc, RParenLoc,
1810 ContainsUnexpandedParameterPack);
1814 unsigned DefaultIndex = -1U;
1818 for (
unsigned i = 0; i < NumAssocs; ++i) {
1821 else if (ControllingExpr &&
1824 Types[i]->getType()))
1825 CompatIndices.push_back(i);
1826 else if (ControllingType &&
1829 Types[i]->getType()))
1830 CompatIndices.push_back(i);
1833 auto GetControllingRangeAndType = [](
Expr *ControllingExpr,
1837 if (ControllingExpr)
1846 return std::make_pair(SR, QT);
1852 if (CompatIndices.size() > 1) {
1853 auto P = GetControllingRangeAndType(ControllingExpr, ControllingType);
1856 << SR <<
P.second << (
unsigned)CompatIndices.size();
1857 for (
unsigned I : CompatIndices) {
1858 Diag(Types[I]->getTypeLoc().getBeginLoc(),
1859 diag::note_compat_assoc)
1860 << Types[I]->getTypeLoc().getSourceRange()
1861 << Types[I]->getType();
1869 if (DefaultIndex == -1U && CompatIndices.size() == 0) {
1870 auto P = GetControllingRangeAndType(ControllingExpr, ControllingType);
1872 Diag(SR.
getBegin(), diag::err_generic_sel_no_match) << SR <<
P.second;
1881 unsigned ResultIndex =
1882 CompatIndices.size() ? CompatIndices[0] : DefaultIndex;
1884 if (ControllingExpr) {
1886 Context, KeyLoc, ControllingExpr, Types, Exprs, DefaultLoc, RParenLoc,
1887 ContainsUnexpandedParameterPack, ResultIndex);
1890 Context, KeyLoc, ControllingType, Types, Exprs, DefaultLoc, RParenLoc,
1891 ContainsUnexpandedParameterPack, ResultIndex);
1897 llvm_unreachable(
"unexpected TokenKind");
1898 case tok::kw___func__:
1900 case tok::kw___FUNCTION__:
1902 case tok::kw___FUNCDNAME__:
1904 case tok::kw___FUNCSIG__:
1906 case tok::kw_L__FUNCTION__:
1908 case tok::kw_L__FUNCSIG__:
1910 case tok::kw___PRETTY_FUNCTION__:
1919 while (DC && !isa<BlockDecl, CapturedDecl, FunctionDecl, ObjCMethodDecl>(DC))
1921 return cast_or_null<Decl>(DC);
1939 assert(Args.size() <= 2 &&
"too many arguments for literal operator");
1942 for (
unsigned ArgIdx = 0; ArgIdx != Args.size(); ++ArgIdx) {
1943 ArgTy[ArgIdx] = Args[ArgIdx]->getType();
1944 if (ArgTy[ArgIdx]->isArrayType())
1965 std::vector<Token> ExpandedToks;
1971 if (Literal.hadError)
1975 for (
const Token &Tok : StringToks)
1976 StringTokLocs.push_back(Tok.getLocation());
1980 &StringTokLocs[0], StringTokLocs.size());
1982 if (!Literal.getUDSuffix().empty()) {
1985 Literal.getUDSuffixOffset());
1986 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_string_udl));
2008 std::vector<Token> ExpandedToks;
2009 ExpandedToks.reserve(Toks.size());
2010 for (
const Token &Tok : Toks) {
2013 ExpandedToks.emplace_back(Tok);
2016 if (isa<TranslationUnitDecl>(CurrentDecl))
2017 Diag(Tok.getLocation(), diag::ext_predef_outside_function);
2019 Diag(Tok.getLocation(), diag::ext_string_literal_from_predefined)
2022 llvm::raw_svector_ostream
OS(Str);
2023 Token &Exp = ExpandedToks.emplace_back();
2025 if (Tok.getKind() == tok::kw_L__FUNCTION__ ||
2026 Tok.getKind() == tok::kw_L__FUNCSIG__) {
2028 Exp.
setKind(tok::wide_string_literal);
2030 Exp.
setKind(tok::string_literal);
2038 return ExpandedToks;
2043 assert(!StringToks.empty() &&
"Must have at least one string!");
2046 std::vector<Token> ExpandedToks;
2051 if (Literal.hadError)
2055 for (
const Token &Tok : StringToks)
2056 StringTokLocs.push_back(Tok.getLocation());
2060 if (Literal.isWide()) {
2063 }
else if (Literal.isUTF8()) {
2069 }
else if (Literal.isUTF16()) {
2072 }
else if (Literal.isUTF32()) {
2075 }
else if (Literal.isPascal()) {
2088 ? diag::warn_cxx20_compat_utf8_string
2089 : diag::warn_c23_compat_utf8_string);
2095 auto RemovalDiag =
PDiag(diag::note_cxx20_c23_compat_utf8_string_remove_u8);
2097 for (
const Token &Tok : StringToks) {
2098 if (Tok.getKind() == tok::utf8_string_literal) {
2100 RemovalDiagLoc = Tok.getLocation();
2107 Diag(RemovalDiagLoc, RemovalDiag);
2115 Kind, Literal.Pascal, StrTy,
2117 StringTokLocs.size());
2118 if (Literal.getUDSuffix().empty())
2125 Literal.getUDSuffixOffset());
2129 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_string_udl));
2154 Expr *Args[] = { Lit, LenArg };
2165 StringTokLocs.back(), &ExplicitArgs);
2173 llvm::APSInt
Value(CharBits, CharIsUnsigned);
2179 for (
unsigned I = 0, N = Lit->
getLength(); I != N; ++I) {
2186 StringTokLocs.back(), &ExplicitArgs);
2190 llvm_unreachable(
"unexpected literal operator lookup result");
2194 llvm_unreachable(
"unexpected literal operator lookup result");
2226 auto *DRE = dyn_cast<DeclRefExpr>(VD->
getInit());
2229 auto *Referee = dyn_cast<VarDecl>(DRE->getDecl());
2230 if (!Referee || !Referee->hasGlobalStorage() ||
2231 Referee->hasAttr<CUDADeviceAttr>())
2237 auto *MD = dyn_cast_or_null<CXXMethodDecl>(S.
CurContext);
2238 if (MD && MD->getParent()->isLambda() &&
2239 MD->getOverloadedOperator() == OO_Call && MD->hasAttr<CUDADeviceAttr>() &&
2261 if (
VarDecl *VD = dyn_cast<VarDecl>(
D)) {
2262 if (VD->getType()->isReferenceType() &&
2265 VD->isUsableInConstantExpressions(
Context))
2280 bool RefersToCapturedVariable = isa<VarDecl, BindingDecl>(
D) &&
2284 Context, NNS, TemplateKWLoc,
D, RefersToCapturedVariable, NameInfo, Ty,
2312 const auto *FD = dyn_cast<FieldDecl>(
D);
2313 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(
D))
2314 FD = IFD->getAnonField();
2318 if (FD->isBitField())
2324 if (
const auto *BD = dyn_cast<BindingDecl>(
D))
2325 if (
const auto *BE = BD->getBinding())
2341 Id.TemplateId->NumArgs);
2347 TemplateArgs = &Buffer;
2350 TemplateArgs =
nullptr;
2357 unsigned DiagnosticID,
unsigned DiagnosticSuggestID) {
2364 SemaRef.
Diag(TypoLoc, diag::err_no_member) << Typo << Ctx
2367 SemaRef.
Diag(TypoLoc, DiagnosticID) << Typo;
2372 bool DroppedSpecifier =
2375 ? diag::note_implicit_param_decl
2376 : diag::note_previous_decl;
2379 SemaRef.
PDiag(NoteID));
2382 << Typo << Ctx << DroppedSpecifier
2384 SemaRef.
PDiag(NoteID));
2391 bool isDefaultArgument =
2395 const auto *CurMethod = dyn_cast<CXXMethodDecl>(
CurContext);
2396 bool isInstance = CurMethod && CurMethod->isInstance() &&
2405 unsigned DiagID = diag::err_found_in_dependent_base;
2406 unsigned NoteID = diag::note_member_declared_at;
2408 DiagID =
getLangOpts().MSVCCompat ? diag::ext_found_later_in_class
2409 : diag::err_found_later_in_class;
2411 DiagID = diag::ext_found_in_dependent_base;
2412 NoteID = diag::note_dependent_member_use;
2437 if (isDefaultArgument && ((*R.
begin())->isCXXInstanceMember())) {
2453 unsigned diagnostic = diag::err_undeclared_var_use;
2454 unsigned diagnostic_suggest = diag::err_undeclared_var_use_suggest;
2458 diagnostic = diag::err_undeclared_use;
2459 diagnostic_suggest = diag::err_undeclared_use_suggest;
2469 if (isa<CXXRecordDecl>(DC)) {
2485 R.
addDecl(Best->FoundDecl.getDecl(), Best->FoundDecl.getAccess());
2502 assert(!ExplicitTemplateArgs &&
2503 "Diagnosing an empty lookup with explicit template args!");
2507 emitEmptyLookupTypoDiagnostic(TC, *this, SS, Name, TypoLoc, Args,
2508 diagnostic, diagnostic_suggest);
2513 }
else if (S && (Corrected =
2517 bool DroppedSpecifier =
2521 bool AcceptableWithRecovery =
false;
2522 bool AcceptableWithoutRecovery =
false;
2531 dyn_cast<FunctionTemplateDecl>(CD))
2535 else if (
FunctionDecl *FD = dyn_cast<FunctionDecl>(CD))
2536 if (!ExplicitTemplateArgs || ExplicitTemplateArgs->
size() == 0)
2542 ND = Best->FoundDecl;
2543 Corrected.setCorrectionDecl(ND);
2547 Corrected.setCorrectionDecl(ND);
2559 Record = cast<CXXRecordDecl>(
2565 AcceptableWithRecovery = isa<ValueDecl>(UnderlyingND) ||
2566 isa<FunctionTemplateDecl>(UnderlyingND);
2572 AcceptableWithoutRecovery = isa<TypeDecl>(UnderlyingND) ||
2574 isa<ObjCInterfaceDecl>(UnderlyingND);
2578 AcceptableWithoutRecovery =
true;
2581 if (AcceptableWithRecovery || AcceptableWithoutRecovery) {
2583 ? diag::note_implicit_param_decl
2584 : diag::note_previous_decl;
2587 PDiag(NoteID), AcceptableWithRecovery);
2591 << DroppedSpecifier << SS.
getRange(),
2592 PDiag(NoteID), AcceptableWithRecovery);
2595 return !AcceptableWithRecovery;
2631 else if (
auto *MD = dyn_cast<CXXMethodDecl>(S.
CurContext))
2639 auto DB = S.
Diag(
Loc, diag::ext_undeclared_unqual_id_with_dependent_base);
2640 DB << NameInfo.
getName() << RD;
2642 if (!ThisType.
isNull()) {
2645 Context,
nullptr, ThisType,
true,
2647 nullptr, NameInfo, TemplateArgs);
2664 bool HasTrailingLParen,
bool IsAddressOfOperand,
2666 bool IsInlineAsmIdentifier,
Token *KeywordReplacement) {
2667 assert(!(IsAddressOfOperand && HasTrailingLParen) &&
2668 "cannot be direct & operand and have a trailing lparen");
2697 if (
auto *VD = dyn_cast<ValueDecl>(R.
getFoundDecl())) {
2711 if (TemplateKWLoc.
isValid() || TemplateArgs) {
2719 false, TemplateKWLoc,
2725 IsAddressOfOperand, TemplateArgs);
2729 !IvarLookupFollowUp);
2735 IsAddressOfOperand, TemplateArgs);
2739 if (IvarLookupFollowUp) {
2754 if (R.
empty() && HasTrailingLParen && II &&
2764 if (R.
empty() && !ADL) {
2767 TemplateKWLoc, TemplateArgs))
2772 if (IsInlineAsmIdentifier)
2782 "Typo correction callback misconfigured");
2793 std::nullopt,
nullptr, &TE)) {
2794 if (TE && KeywordReplacement) {
2796 auto BestTC = State.Consumer->getNextCorrection();
2797 if (BestTC.isKeyword()) {
2798 auto *II = BestTC.getCorrectionAsIdentifierInfo();
2799 if (State.DiagHandler)
2800 State.DiagHandler(BestTC);
2804 KeywordReplacement->
setLocation(BestTC.getCorrectionRange().getBegin());
2810 return (
Expr*)
nullptr;
2812 State.Consumer->resetCorrectionStream();
2817 assert(!R.
empty() &&
2818 "DiagnoseEmptyLookup returned false but added no results");
2828 if (!
E.isInvalid() && !
E.get())
2835 assert(!R.
empty() || ADL);
2865 if (TemplateArgs || TemplateKWLoc.
isValid()) {
2873 "There should only be one declaration found.");
2901 if (
const auto *CD = dyn_cast<CXXRecordDecl>(DC))
2902 if (CD->isInvalidDecl())
2913 unsigned DiagID = diag::err_typename_missing;
2915 DiagID = diag::ext_typename_missing;
2959 const auto *RD = dyn_cast<CXXRecordDecl>(
Member->getDeclContext());
2967 bool PointerConversions =
false;
2968 if (isa<FieldDecl>(
Member)) {
2972 DestRecordType, FromPtrType
2979 PointerConversions =
true;
2981 DestType = DestRecordType;
2982 FromRecordType = FromType;
2984 }
else if (
const auto *Method = dyn_cast<CXXMethodDecl>(
Member)) {
2985 if (!Method->isImplicitObjectMemberFunction())
2988 DestType = Method->getThisType().getNonReferenceType();
2989 DestRecordType = Method->getFunctionObjectParameterType();
2993 PointerConversions =
true;
2995 FromRecordType = FromType;
2996 DestType = DestRecordType;
3001 if (FromAS != DestAS) {
3006 if (PointerConversions)
3047 if (Qualifier && Qualifier->getAsType()) {
3049 assert(QType->
isRecordType() &&
"lookup done with non-record type");
3059 FromLoc, FromRange, &BasePath))
3062 if (PointerConversions)
3065 VK, &BasePath).
get();
3068 FromRecordType = QRecordType;
3079 FromLoc, FromRange, &BasePath,
3089 bool HasTrailingLParen) {
3091 if (!HasTrailingLParen)
3109 if (
D->isCXXClassMember())
3118 if (isa<UsingShadowDecl>(
D))
3119 D = cast<UsingShadowDecl>(
D)->getTargetDecl();
3127 if (
const auto *FDecl = dyn_cast<FunctionDecl>(
D)) {
3129 if (FDecl->getBuiltinID() && FDecl->isImplicit())
3131 }
else if (!isa<FunctionTemplateDecl>(
D))
3144 bool AcceptInvalid) {
3148 if (isa<TypedefNameDecl>(
D)) {
3149 S.
Diag(
Loc, diag::err_unexpected_typedef) <<
D->getDeclName();
3153 if (isa<ObjCInterfaceDecl>(
D)) {
3154 S.
Diag(
Loc, diag::err_unexpected_interface) <<
D->getDeclName();
3158 if (isa<NamespaceDecl>(
D)) {
3159 S.
Diag(
Loc, diag::err_unexpected_namespace) <<
D->getDeclName();
3170 const auto *FD = dyn_cast<FunctionDecl>(R.
getFoundDecl());
3172 (FD->isCPUDispatchMultiVersion() || FD->isCPUSpecificMultiVersion());
3177 bool AcceptInvalidDecl) {
3215 bool AcceptInvalidDecl) {
3216 assert(
D &&
"Cannot refer to a NULL declaration");
3217 assert(!isa<FunctionTemplateDecl>(
D) &&
3218 "Cannot refer unambiguously to a function template");
3236 if (!isa<ValueDecl, UnresolvedUsingIfExistsDecl>(
D)) {
3249 auto *VD = cast<ValueDecl>(
D);
3252 if (VD->isInvalidDecl() && !AcceptInvalidDecl)
3258 if (
auto *IndirectField = dyn_cast<IndirectFieldDecl>(VD);
3259 IndirectField && !IndirectField->isCXXClassMember())
3271 type =
type.getNonPackExpansionType();
3275#define ABSTRACT_DECL(kind)
3276#define VALUE(type, base)
3277#define DECL(type, base) case Decl::type:
3278#include "clang/AST/DeclNodes.inc"
3279 llvm_unreachable(
"invalid value decl kind");
3282 case Decl::ObjCAtDefsField:
3283 llvm_unreachable(
"forming non-member reference to ivar?");
3287 case Decl::EnumConstant:
3288 case Decl::UnresolvedUsingValue:
3289 case Decl::OMPDeclareReduction:
3290 case Decl::OMPDeclareMapper:
3299 case Decl::IndirectField:
3300 case Decl::ObjCIvar:
3302 "building reference to field in C?");
3312 case Decl::NonTypeTemplateParm: {
3314 type = reftype->getPointeeType();
3324 if (
type->isRecordType()) {
3325 type =
type.getUnqualifiedType().withConst();
3338 case Decl::VarTemplateSpecialization:
3339 case Decl::VarTemplatePartialSpecialization:
3340 case Decl::Decomposition:
3341 case Decl::OMPCapturedExpr:
3344 type->isVoidType()) {
3350 case Decl::ImplicitParam:
3351 case Decl::ParmVar: {
3361 if (!CapturedType.
isNull())
3362 type = CapturedType;
3374 case Decl::Function: {
3375 if (
unsigned BID = cast<FunctionDecl>(VD)->getBuiltinID()) {
3404 if (!cast<FunctionDecl>(VD)->hasPrototype() && isa<FunctionProtoType>(fty))
3413 case Decl::CXXDeductionGuide:
3414 llvm_unreachable(
"building reference to deduction guide");
3416 case Decl::MSProperty:
3418 case Decl::TemplateParamObject:
3424 case Decl::UnnamedGlobalConstant:
3428 case Decl::CXXMethod:
3433 dyn_cast<FunctionProtoType>(VD->getType()))
3441 if (cast<CXXMethodDecl>(VD)->isStatic()) {
3447 case Decl::CXXConversion:
3448 case Decl::CXXDestructor:
3449 case Decl::CXXConstructor:
3461 if (VD->isInvalidDecl() &&
E)
3468 Target.resize(CharByteWidth * (Source.size() + 1));
3469 char *ResultPtr = &
Target[0];
3470 const llvm::UTF8 *ErrorPtr;
3472 llvm::ConvertUTF8toWide(CharByteWidth, Source, ResultPtr, ErrorPtr);
3482 Diag(
Loc, diag::ext_predef_outside_function);
3488 if (cast<DeclContext>(currentDecl)->isDependentContext())
3493 bool ForceElaboratedPrinting =
3497 unsigned Length = Str.length();
3499 llvm::APInt LengthI(32, Length + 1);
3539 if (Literal.hadError())
3543 if (Literal.isWide())
3549 else if (Literal.isUTF16())
3551 else if (Literal.isUTF32())
3560 if (Literal.isWide())
3562 else if (Literal.isUTF16())
3564 else if (Literal.isUTF32())
3566 else if (Literal.isUTF8())
3572 if (Literal.getUDSuffix().empty())
3582 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_character_udl));
3600 using llvm::APFloat;
3601 APFloat Val(Format);
3604 if (RM == llvm::RoundingMode::Dynamic)
3605 RM = llvm::RoundingMode::NearestTiesToEven;
3606 APFloat::opStatus result = Literal.GetFloatValue(Val, RM);
3610 if ((result & APFloat::opOverflow) ||
3611 ((result & APFloat::opUnderflow) && Val.isZero())) {
3612 unsigned diagnostic;
3614 if (result & APFloat::opOverflow) {
3615 diagnostic = diag::warn_float_overflow;
3616 APFloat::getLargest(Format).toString(buffer);
3618 diagnostic = diag::warn_float_underflow;
3619 APFloat::getSmallest(Format).toString(buffer);
3622 S.
Diag(
Loc, diagnostic) << Ty << buffer.str();
3625 bool isExact = (result == APFloat::opOK);
3630 assert(
E &&
"Invalid expression");
3637 Diag(
E->
getExprLoc(), diag::err_pragma_loop_invalid_argument_type) << QT;
3641 llvm::APSInt ValueAPS;
3652 bool ValueIsPositive =
3653 AllowZero ? ValueAPS.isNonNegative() : ValueAPS.isStrictlyPositive();
3654 if (!ValueIsPositive || ValueAPS.getActiveBits() > 31) {
3656 <<
toString(ValueAPS, 10) << ValueIsPositive;
3676 SpellingBuffer.resize(Tok.
getLength() + 1);
3687 if (Literal.hadError)
3690 if (Literal.hasUDSuffix()) {
3698 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_numeric_udl));
3701 if (Literal.isFloatingLiteral()) {
3726 !Literal.isImaginary)) {
3735 if (Literal.isFloatingLiteral()) {
3739 if (Literal.GetIntegerValue(ResultVal))
3752 unsigned Length = Literal.getUDSuffixOffset();
3759 false, StrTy, &TokLoc, 1);
3770 bool CharIsUnsigned =
Context.
CharTy->isUnsignedIntegerType();
3771 llvm::APSInt
Value(CharBits, CharIsUnsigned);
3772 for (
unsigned I = 0, N = Literal.getUDSuffixOffset(); I != N; ++I) {
3773 Value = TokSpelling[I];
3782 llvm_unreachable(
"unexpected literal operator lookup result");
3788 if (Literal.isFixedPointLiteral()) {
3791 if (Literal.isAccum) {
3792 if (Literal.isHalf) {
3794 }
else if (Literal.isLong) {
3799 }
else if (Literal.isFract) {
3800 if (Literal.isHalf) {
3802 }
else if (Literal.isLong) {
3811 bool isSigned = !Literal.isUnsigned;
3815 llvm::APInt Val(bit_width, 0, isSigned);
3816 bool Overflowed = Literal.GetFixedPointValue(Val, scale);
3817 bool ValIsZero = Val.isZero() && !Overflowed;
3820 if (Literal.isFract && Val == MaxVal + 1 && !ValIsZero)
3826 else if (Val.ugt(MaxVal) || Overflowed)
3831 }
else if (Literal.isFloatingLiteral()) {
3833 if (Literal.isHalf){
3841 }
else if (Literal.isFloat)
3843 else if (Literal.isLong)
3845 else if (Literal.isFloat16)
3847 else if (Literal.isFloat128)
3869 }
else if (!Literal.isIntegerLiteral()) {
3875 if (Literal.isSizeT)
3878 ? diag::warn_cxx20_compat_size_t_suffix
3879 : diag::ext_cxx23_size_t_suffix
3880 : diag::err_cxx23_size_t_suffix);
3887 if (Literal.isBitInt)
3891 : diag::ext_c23_bitint_suffix);
3900 unsigned BitsNeeded =
3901 Literal.isBitInt ? llvm::APInt::getSufficientBitsNeeded(
3902 Literal.getLiteralDigits(), Literal.getRadix())
3904 llvm::APInt ResultVal(BitsNeeded, 0);
3906 if (Literal.GetIntegerValue(ResultVal)) {
3912 "long long is not intmax_t?");
3919 bool AllowUnsigned = Literal.isUnsigned || Literal.getRadix() != 10;
3926 Literal.isLong =
true;
3927 Literal.isLongLong =
false;
3934 if (Literal.MicrosoftInteger) {
3935 if (Literal.MicrosoftInteger == 8 && !Literal.isUnsigned) {
3939 Width = Literal.MicrosoftInteger;
3941 !Literal.isUnsigned);
3947 if (Literal.isBitInt) {
3950 Width = std::max(ResultVal.getActiveBits(), 1u) +
3951 (Literal.isUnsigned ? 0u : 1u);
3955 unsigned int MaxBitIntWidth =
3957 if (Width > MaxBitIntWidth) {
3959 << Literal.isUnsigned;
3960 Width = MaxBitIntWidth;
3967 ResultVal = ResultVal.zextOrTrunc(Width);
3972 if (Literal.isSizeT) {
3973 assert(!Literal.MicrosoftInteger &&
3974 "size_t literals can't be Microsoft literals");
3979 if (ResultVal.isIntN(SizeTSize)) {
3981 if (!Literal.isUnsigned && ResultVal[SizeTSize - 1] == 0)
3983 else if (AllowUnsigned)
3989 if (Ty.
isNull() && !Literal.isLong && !Literal.isLongLong &&
3995 if (ResultVal.isIntN(IntSize)) {
3997 if (!Literal.isUnsigned && ResultVal[IntSize-1] == 0)
3999 else if (AllowUnsigned)
4006 if (Ty.
isNull() && !Literal.isLongLong && !Literal.isSizeT) {
4010 if (ResultVal.isIntN(LongSize)) {
4012 if (!Literal.isUnsigned && ResultVal[LongSize-1] == 0)
4014 else if (AllowUnsigned)
4019 const unsigned LongLongSize =
4024 ? diag::warn_old_implicitly_unsigned_long_cxx
4026 ext_old_implicitly_unsigned_long_cxx
4027 : diag::warn_old_implicitly_unsigned_long)
4028 << (LongLongSize > LongSize ? 0
4037 if (Ty.
isNull() && !Literal.isSizeT) {
4041 if (ResultVal.isIntN(LongLongSize)) {
4045 if (!Literal.isUnsigned && (ResultVal[LongLongSize-1] == 0 ||
4046 (
getLangOpts().MSVCCompat && Literal.isLongLong)))
4048 else if (AllowUnsigned)
4050 Width = LongLongSize;
4056 ? diag::warn_cxx98_compat_longlong
4057 : diag::ext_cxx11_longlong);
4067 if (Literal.isSizeT)
4069 << Literal.isUnsigned;
4072 diag::ext_integer_literal_too_large_for_signed);
4077 if (ResultVal.getBitWidth() != Width)
4078 ResultVal = ResultVal.trunc(Width);
4084 if (Literal.isImaginary) {
4094 assert(
E &&
"ActOnParenExpr() missing expr");
4110 S.
Diag(
Loc, diag::err_vecstep_non_scalar_vector_type)
4116 "Scalar types should always be complete");
4125 return S.
Diag(
Loc, diag::err_builtin_non_vector_type)
4127 <<
"__builtin_vectorelements" <<
T << ArgRange;
4140 S.
Diag(
Loc, diag::err_ptrauth_type_disc_undiscriminated) <<
T << ArgRange;
4157 (TraitKind == UETT_SizeOf || TraitKind == UETT_AlignOf ||
4158 TraitKind == UETT_PreferredAlignOf)) {
4160 S.
Diag(
Loc, diag::ext_sizeof_alignof_function_type)
4168 unsigned DiagID = S.
LangOpts.OpenCL ? diag::err_opencl_sizeof_alignof_type
4169 : diag::ext_sizeof_alignof_void_type;
4184 S.
Diag(
Loc, diag::err_sizeof_nonfragile_interface)
4185 <<
T << (TraitKind == UETT_SizeOf)
4202 const auto *ICE = dyn_cast<ImplicitCastExpr>(
E);
4203 if (!ICE || ICE->getCastKind() != CK_ArrayToPointerDecay)
4206 S.
Diag(
Loc, diag::warn_sizeof_array_decay) << ICE->getSourceRange()
4208 << ICE->getSubExpr()->getType();
4216 bool IsUnevaluatedOperand =
4217 (ExprKind == UETT_SizeOf || ExprKind == UETT_DataSizeOf ||
4218 ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf ||
4219 ExprKind == UETT_VecStep);
4220 if (IsUnevaluatedOperand) {
4238 if (ExprKind == UETT_VecStep)
4242 if (ExprKind == UETT_VectorElements)
4264 if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf) {
4267 diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4272 E, diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4291 if (ExprKind == UETT_SizeOf) {
4292 if (
const auto *DeclRef = dyn_cast<DeclRefExpr>(
E->
IgnoreParens())) {
4293 if (
const auto *PVD = dyn_cast<ParmVarDecl>(DeclRef->getFoundDecl())) {
4294 QualType OType = PVD->getOriginalType();
4299 Diag(PVD->getLocation(), diag::note_declared_at);
4307 if (
const auto *BO = dyn_cast<BinaryOperator>(
E->
IgnoreParens())) {
4331 if (
DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Inner)) {
4333 }
else if (
MemberExpr *ME = dyn_cast<MemberExpr>(Inner)) {
4334 D = ME->getMemberDecl();
4354 if (
FieldDecl *FD = dyn_cast_or_null<FieldDecl>(
D)) {
4357 if (!FD->getParent()->isCompleteDefinition()) {
4367 if (!FD->getType()->isReferenceType())
4387 assert(CSI !=
nullptr);
4391 const Type *Ty =
T.getTypePtr();
4393#define TYPE(Class, Base)
4394#define ABSTRACT_TYPE(Class, Base)
4395#define NON_CANONICAL_TYPE(Class, Base)
4396#define DEPENDENT_TYPE(Class, Base) case Type::Class:
4397#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)
4398#include "clang/AST/TypeNodes.inc"
4405 case Type::ExtVector:
4406 case Type::ConstantMatrix:
4409 case Type::TemplateSpecialization:
4410 case Type::ObjCObject:
4411 case Type::ObjCInterface:
4412 case Type::ObjCObjectPointer:
4413 case Type::ObjCTypeParam:
4416 llvm_unreachable(
"type class is never variably-modified!");
4417 case Type::Elaborated:
4418 T = cast<ElaboratedType>(Ty)->getNamedType();
4420 case Type::Adjusted:
4421 T = cast<AdjustedType>(Ty)->getOriginalType();
4426 case Type::ArrayParameter:
4427 T = cast<ArrayParameterType>(Ty)->getElementType();
4432 case Type::BlockPointer:
4435 case Type::LValueReference:
4436 case Type::RValueReference:
4439 case Type::MemberPointer:
4442 case Type::ConstantArray:
4443 case Type::IncompleteArray:
4445 T = cast<ArrayType>(Ty)->getElementType();
4447 case Type::VariableArray: {
4455 (isa<CapturedRegionScopeInfo>(CSI) || isa<LambdaScopeInfo>(CSI)))
4461 case Type::FunctionProto:
4462 case Type::FunctionNoProto:
4467 case Type::UnaryTransform:
4468 case Type::Attributed:
4469 case Type::BTFTagAttributed:
4470 case Type::SubstTemplateTypeParm:
4471 case Type::MacroQualified:
4472 case Type::CountAttributed:
4474 T =
T.getSingleStepDesugaredType(Context);
4477 T = cast<TypedefType>(Ty)->
desugar();
4479 case Type::Decltype:
4480 T = cast<DecltypeType>(Ty)->
desugar();
4482 case Type::PackIndexing:
4483 T = cast<PackIndexingType>(Ty)->
desugar();
4486 T = cast<UsingType>(Ty)->
desugar();
4489 case Type::DeducedTemplateSpecialization:
4490 T = cast<DeducedType>(Ty)->getDeducedType();
4492 case Type::TypeOfExpr:
4493 T = cast<TypeOfExprType>(Ty)->getUnderlyingExpr()->getType();
4496 T = cast<AtomicType>(Ty)->getValueType();
4522 if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf ||
4523 ExprKind == UETT_OpenMPRequiredSimdAlign) {
4529 ? diag::warn_c2y_compat_alignof_incomplete_array
4530 : diag::ext_c2y_alignof_incomplete_array);
4534 if (ExprKind == UETT_VecStep)
4537 if (ExprKind == UETT_VectorElements)
4541 if (ExprKind == UETT_PtrAuthTypeDiscriminator)
4551 OpLoc, ExprType, diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4556 Diag(OpLoc, diag::err_sizeof_alignof_function_type) << KWName << ExprRange;
4564 Diag(OpLoc, diag::err_wasm_table_invalid_uett_operand)
4578 auto *CSI = dyn_cast<CapturingScopeInfo>(*I);
4582 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(CSI))
4583 DC = LSI->CallOperator;
4584 else if (
auto *CRSI = dyn_cast<CapturedRegionScopeInfo>(CSI))
4585 DC = CRSI->TheCapturedDecl;
4586 else if (
auto *BSI = dyn_cast<BlockScopeInfo>(CSI))
4638 }
else if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf) {
4640 }
else if (ExprKind == UETT_VecStep) {
4642 }
else if (ExprKind == UETT_OpenMPRequiredSimdAlign) {
4648 }
else if (ExprKind == UETT_VectorElements) {
4691 UETT_AlignOf, KWName);
4704 if (
V.get()->isTypeDependent())
4716 return CT->getElementType();
4719 if (
V.get()->getType()->isArithmeticType())
4720 return V.get()->getType();
4725 if (PR.
get() !=
V.get()) {
4731 S.
Diag(
Loc, diag::err_realimag_invalid_type) <<
V.get()->getType()
4732 << (IsReal ?
"__real" :
"__imag");
4743 default: llvm_unreachable(
"Unknown unary op!");
4744 case tok::plusplus: Opc = UO_PostInc;
break;
4745 case tok::minusminus: Opc = UO_PostDec;
break;
4764 !S.
LangOpts.ObjCSubscriptingLegacyRuntime)
4767 S.
Diag(opLoc, diag::err_arithmetic_nonfragile_interface)
4774 auto *BaseNoParens =
Base->IgnoreParens();
4775 if (
auto *MSProp = dyn_cast<MSPropertyRefExpr>(BaseNoParens))
4776 return MSProp->getPropertyDecl()->getType()->isArrayType();
4777 return isa<MSPropertySubscriptExpr>(BaseNoParens);
4797 if (RTy->isIntegralOrUnscopedEnumerationType()) {
4799 Result = PT->getPointeeType();
4801 Result = AT->getElementType();
4804 Result = PT->getPointeeType();
4806 Result = AT->getElementType();
4819 auto *AS = cast<ArraySectionExpr>(base);
4820 if (AS->isOMPArraySection())
4832 if (isa<ParenListExpr>(base)) {
4836 base = result.
get();
4843 auto CheckAndReportCommaError = [
this, base, rbLoc](
Expr *
E) {
4844 if (isa<BinaryOperator>(
E) && cast<BinaryOperator>(
E)->isCommaOp()) {
4855 !isa<MatrixSubscriptExpr>(base)) {
4856 Diag(base->
getExprLoc(), diag::err_matrix_separate_incomplete_index)
4862 auto *matSubscriptE = dyn_cast<MatrixSubscriptExpr>(base);
4863 if (matSubscriptE) {
4864 assert(ArgExprs.size() == 1);
4865 if (CheckAndReportCommaError(ArgExprs.front()))
4868 assert(matSubscriptE->isIncomplete() &&
4869 "base has to be an incomplete matrix subscript");
4871 matSubscriptE->getRowIdx(),
4872 ArgExprs.front(), rbLoc);
4885 bool IsMSPropertySubscript =
false;
4888 if (!IsMSPropertySubscript) {
4892 base = result.
get();
4898 assert(ArgExprs.size() == 1);
4899 if (CheckAndReportCommaError(ArgExprs.front()))
4907 Expr *idx = ArgExprs[0];
4908 if ((isa<BinaryOperator>(idx) && cast<BinaryOperator>(idx)->isCommaOp()) ||
4909 (isa<CXXOperatorCallExpr>(idx) &&
4910 cast<CXXOperatorCallExpr>(idx)->getOperator() == OO_Comma)) {
4916 if (ArgExprs.size() == 1 &&
4917 ArgExprs[0]->getType()->isNonOverloadPlaceholderType()) {
4921 ArgExprs[0] = result.
get();
4931 !isa<PackExpansionExpr>(ArgExprs[0])) {
4933 base, ArgExprs.front(),
4946 if (IsMSPropertySubscript) {
4947 assert(ArgExprs.size() == 1);
4965 (ArgExprs.size() != 1 || isa<PackExpansionExpr>(ArgExprs[0]) ||
4966 ArgExprs[0]->getType()->isRecordType())))) {
4973 if (!Res.
isInvalid() && isa<ArraySubscriptExpr>(Res.
get()))
4974 CheckSubscriptAccessOfNoDeref(cast<ArraySubscriptExpr>(Res.
get()));
4984 return InitSeq.
Perform(*
this, Entity, Kind,
E);
4998 RowIdx = RowR.
get();
5013 ColumnIdx = ColumnR.
get();
5018 auto IsIndexValid = [&](
Expr *IndexExpr,
unsigned Dim,
5019 bool IsColumnIdx) ->
Expr * {
5027 if (std::optional<llvm::APSInt> Idx =
5029 if ((*Idx < 0 || *Idx >= Dim)) {
5031 << IsColumnIdx << Dim;
5038 "should be able to convert any integer type to size type");
5039 return ConvExpr.
get();
5043 RowIdx = IsIndexValid(RowIdx, MTy->getNumRows(),
false);
5044 ColumnIdx = IsIndexValid(ColumnIdx, MTy->getNumColumns(),
true);
5045 if (!RowIdx || !ColumnIdx)
5049 MTy->getElementType(), RBLoc);
5052void Sema::CheckAddressOfNoDeref(
const Expr *
E) {
5059 while ((
Member = dyn_cast<MemberExpr>(StrippedExpr)) && !
Member->isArrow())
5060 StrippedExpr =
Member->getBase()->IgnoreParenImpCasts();
5062 LastRecord.PossibleDerefs.erase(StrippedExpr);
5073 if (isa<ArrayType>(ResultTy))
5076 if (ResultTy->
hasAttr(attr::NoDeref)) {
5077 LastRecord.PossibleDerefs.insert(
E);
5085 if (!(isa<ArrayType>(BaseTy) || isa<PointerType>(BaseTy)))
5090 while ((
Member = dyn_cast<MemberExpr>(
Base->IgnoreParenCasts())) &&
5094 if (
const auto *Ptr = dyn_cast<PointerType>(
Base->getType())) {
5095 if (Ptr->getPointeeType()->hasAttr(attr::NoDeref))
5096 LastRecord.PossibleDerefs.insert(
E);
5112 for (
auto *Op : {LHSExp, RHSExp}) {
5113 Op = Op->IgnoreImplicit();
5114 if (Op->getType()->isArrayType() && !Op->isLValue())
5137 Expr *BaseExpr, *IndexExpr;
5172 Diag(LLoc, diag::err_subscript_nonfragile_interface)
5196 LHSExp = Materialized.
get();
5205 Qualifiers Combined = BaseQuals + MemberQuals;
5206 if (Combined != MemberQuals)
5217 CK_ArrayToPointerDecay).
get();
5223 }
else if (RHSTy->isArrayType()) {
5228 CK_ArrayToPointerDecay).
get();
5235 return ExprError(
Diag(LLoc, diag::err_typecheck_subscript_value)
5240 return ExprError(
Diag(LLoc, diag::err_typecheck_subscript_not_integer)
5246 std::optional<llvm::APSInt> IntegerContantExpr =
5248 if (!IntegerContantExpr.has_value() ||
5249 IntegerContantExpr.value().isNegative())
5265 Diag(LLoc, diag::ext_gnu_subscript_void_type)
5276 diag::err_subscript_incomplete_or_sizeless_type, BaseExpr))
5289 auto *CSI = dyn_cast<CapturingScopeInfo>(*I);
5293 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(CSI))
5294 DC = LSI->CallOperator;
5295 else if (
auto *CRSI = dyn_cast<CapturedRegionScopeInfo>(CSI))
5296 DC = CRSI->TheCapturedDecl;
5297 else if (
auto *BSI = dyn_cast<BlockScopeInfo>(CSI))
5315 bool SkipImmediateInvocations) {
5317 assert(!RewrittenInit &&
"Should not have a rewritten init expression yet");
5321 Diag(Param->
getBeginLoc(), diag::err_recursive_default_argument) << FD;
5322 Diag(CallLoc, diag::note_recursive_default_argument_used_here);
5327 Diag(CallLoc, diag::err_use_of_default_argument_to_function_declared_later)
5330 diag::note_default_argument_declared_here);
5335 assert(!RewrittenInit &&
"Should not have a rewitten init expression yet");
5341 assert(
Init &&
"default argument but no initializer?");
5350 if (
auto *InitWithCleanup = dyn_cast<ExprWithCleanups>(
Init)) {
5357 assert(!InitWithCleanup->getNumObjects() &&
5358 "default argument expression has capturing blocks?");
5371 SkipImmediateInvocations;
5382 bool HasImmediateCalls =
false;
5387 HasImmediateCalls |= FD->isImmediateFunction();
5393 HasImmediateCalls |= FD->isImmediateFunction();
5402 HasImmediateCalls =
true;
5413 return VisitCXXMethodDecl(
E->getCallOperator());
5417 return TraverseStmt(
E->getExpr());
5421 return TraverseStmt(
E->getExpr());
5444 if (
E->getParentContext() == SemaRef.CurContext)
5446 return getDerived().RebuildSourceLocExpr(
E->getIdentKind(),
E->
getType(),
5448 SemaRef.CurContext);
5455 assert(Param->
hasDefaultArg() &&
"can't build nonexistent default arg");
5459 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
5460 InitializationContext =
5462 if (!InitializationContext.has_value())
5463 InitializationContext.emplace(CallLoc, Param,
CurContext);
5489 if (!NestedDefaultChecking)
5490 V.TraverseDecl(Param);
5494 if (
V.HasImmediateCalls || InLifetimeExtendingContext) {
5495 if (
V.HasImmediateCalls)
5504 Res = Immediate.TransformInitializer(Param->
getInit(),
5518 CallLoc, FD, Param,
Init,
5519 NestedDefaultChecking))
5523 Init, InitializationContext->Context);
5527 assert(Field->hasInClassInitializer());
5530 if (Field->isInvalidDecl())
5535 auto *ParentRD = cast<CXXRecordDecl>(Field->getParent());
5537 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
5538 InitializationContext =
5540 if (!InitializationContext.has_value())
5550 if (!Field->getInClassInitializer()) {
5556 ClassPattern->
lookup(Field->getDeclName());
5559 for (
auto *L : Lookup) {
5560 if ((Pattern = dyn_cast<FieldDecl>(L)))
5563 assert(Pattern &&
"We must have set the Pattern!");
5567 Field->setInvalidDecl();
5579 if (!NestedDefaultChecking)
5580 V.TraverseDecl(Field);
5581 if (
V.HasImmediateCalls) {
5585 NestedDefaultChecking;
5590 Res = Immediate.TransformInitializer(Field->getInClassInitializer(),
5596 Field->setInvalidDecl();
5602 if (Field->getInClassInitializer()) {
5604 if (!NestedDefaultChecking)
5612 if (Res.isInvalid()) {
5613 Field->setInvalidDecl();
5619 Field, InitializationContext->Context,
5638 Diag(
Loc, diag::err_default_member_initializer_not_yet_parsed)
5639 << OutermostClass << Field;
5640 Diag(Field->getEndLoc(),
5641 diag::note_default_member_initializer_not_yet_parsed);
5644 Field->setInvalidDecl();
5652 if (isa_and_nonnull<CXXConstructorDecl>(FDecl))
5654 else if (Fn && Fn->getType()->isBlockPointerType())
5657 if (
CXXMethodDecl *Method = dyn_cast_or_null<CXXMethodDecl>(FDecl))
5658 if (Method->isInstance())
5673 FunctionName(FuncName) {}
5675 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
5684 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
5685 return std::make_unique<FunctionCallCCC>(*
this);
5705 if (
NamedDecl *ND = Corrected.getFoundDecl()) {
5706 if (Corrected.isOverloaded()) {
5716 ND = Best->FoundDecl;
5717 Corrected.setCorrectionDecl(ND);
5723 ND = ND->getUnderlyingDecl();
5724 if (isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND))
5735 if (!isa<ParenExpr>(Fn))
5738 Fn = Fn->IgnoreParens();
5740 auto *UO = dyn_cast<UnaryOperator>(Fn);
5741 if (!UO || UO->getOpcode() != clang::UO_AddrOf)
5743 if (
auto *DRE = dyn_cast<DeclRefExpr>(UO->getSubExpr()->IgnoreParens())) {
5744 return DRE->hasQualifier();
5746 if (
auto *OVL = dyn_cast<OverloadExpr>(UO->getSubExpr()->IgnoreParens()))
5747 return OVL->getQualifier();
5757 bool IsExecConfig) {
5768 bool HasExplicitObjectParameter =
5770 unsigned ExplicitObjectParameterOffset = HasExplicitObjectParameter ? 1 : 0;
5774 unsigned FnKind = Fn->getType()->isBlockPointerType()
5781 if (Args.size() < NumParams) {
5782 if (Args.size() < MinArgs) {
5787 ? diag::err_typecheck_call_too_few_args_suggest
5788 : diag::err_typecheck_call_too_few_args_at_least_suggest;
5791 << FnKind << MinArgs - ExplicitObjectParameterOffset
5792 <<
static_cast<unsigned>(Args.size()) -
5793 ExplicitObjectParameterOffset
5795 }
else if (MinArgs - ExplicitObjectParameterOffset == 1 && FDecl &&
5800 ? diag::err_typecheck_call_too_few_args_one
5801 : diag::err_typecheck_call_too_few_args_at_least_one)
5802 << FnKind << FDecl->
getParamDecl(ExplicitObjectParameterOffset)
5803 << HasExplicitObjectParameter << Fn->getSourceRange();
5806 ? diag::err_typecheck_call_too_few_args
5807 : diag::err_typecheck_call_too_few_args_at_least)
5808 << FnKind << MinArgs - ExplicitObjectParameterOffset
5809 <<
static_cast<unsigned>(Args.size()) -
5810 ExplicitObjectParameterOffset
5811 << HasExplicitObjectParameter << Fn->getSourceRange();
5814 if (!TC && FDecl && !FDecl->
getBuiltinID() && !IsExecConfig)
5822 assert((
Call->getNumArgs() == NumParams) &&
5823 "We should have reserved space for the default arguments before!");
5828 if (Args.size() > NumParams) {
5834 ? diag::err_typecheck_call_too_many_args_suggest
5835 : diag::err_typecheck_call_too_many_args_at_most_suggest;
5838 << FnKind << NumParams - ExplicitObjectParameterOffset
5839 <<
static_cast<unsigned>(Args.size()) -
5840 ExplicitObjectParameterOffset
5842 }
else if (NumParams - ExplicitObjectParameterOffset == 1 && FDecl &&
5845 Diag(Args[NumParams]->getBeginLoc(),
5846 MinArgs == NumParams
5847 ? diag::err_typecheck_call_too_many_args_one
5848 : diag::err_typecheck_call_too_many_args_at_most_one)
5849 << FnKind << FDecl->
getParamDecl(ExplicitObjectParameterOffset)
5850 <<
static_cast<unsigned>(Args.size()) -
5851 ExplicitObjectParameterOffset
5852 << HasExplicitObjectParameter << Fn->getSourceRange()
5854 Args.back()->getEndLoc());
5856 Diag(Args[NumParams]->getBeginLoc(),
5857 MinArgs == NumParams
5858 ? diag::err_typecheck_call_too_many_args
5859 : diag::err_typecheck_call_too_many_args_at_most)
5860 << FnKind << NumParams - ExplicitObjectParameterOffset
5861 <<
static_cast<unsigned>(Args.size()) -
5862 ExplicitObjectParameterOffset
5863 << HasExplicitObjectParameter << Fn->getSourceRange()
5865 Args.back()->getEndLoc());
5868 if (!TC && FDecl && !FDecl->
getBuiltinID() && !IsExecConfig)
5873 Call->shrinkNumArgs(NumParams);
5884 unsigned TotalNumArgs = AllArgs.size();
5885 for (
unsigned i = 0; i < TotalNumArgs; ++i)
5886 Call->setArg(i, AllArgs[i]);
5888 Call->computeDependence();
5897 bool IsListInitialization) {
5902 for (
unsigned i = FirstParam; i < NumParams; i++) {
5907 if (ArgIx < Args.size()) {
5908 Arg = Args[ArgIx++];
5911 diag::err_call_incomplete_argument, Arg))
5915 bool CFAudited =
false;
5917 FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>() &&
5918 (!Param || !Param->
hasAttr<CFConsumedAttr>()))
5921 FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>() &&
5922 (!Param || !Param->
hasAttr<CFConsumedAttr>()))
5928 BE->getBlockDecl()->setDoesNotEscape();
5941 Entity,
SourceLocation(), Arg, IsListInitialization, AllowExplicit);
5947 assert(Param &&
"can't use default arguments without a known callee");
5959 CheckArrayAccess(Arg);
5964 AllArgs.push_back(Arg);
5973 for (
Expr *A : Args.slice(ArgIx)) {
5977 AllArgs.push_back(arg.get());
5982 for (
Expr *A : Args.slice(ArgIx)) {
5985 AllArgs.push_back(Arg.
get());
5990 for (
Expr *A : Args.slice(ArgIx))
5991 CheckArrayAccess(A);
5999 TL = DTL.getOriginalLoc();
6002 << ATL.getLocalSourceRange();
6008 const Expr *ArgExpr) {
6038 Diag(CallLoc, diag::warn_static_array_too_small)
6046 std::optional<CharUnits> ArgSize =
6048 std::optional<CharUnits> ParmSize =
6050 if (ArgSize && ParmSize && *ArgSize < *ParmSize) {
6051 Diag(CallLoc, diag::warn_static_array_too_small)
6053 << (
unsigned)ParmSize->getQuantity() << 1;
6067 if (!placeholder)
return false;
6069 switch (placeholder->
getKind()) {
6071#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
6072 case BuiltinType::Id:
6073#include "clang/Basic/OpenCLImageTypes.def"
6074#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
6075 case BuiltinType::Id:
6076#include "clang/Basic/OpenCLExtensionTypes.def"
6079#define SVE_TYPE(Name, Id, SingletonId) \
6080 case BuiltinType::Id:
6081#include "clang/Basic/AArch64SVEACLETypes.def"
6082#define PPC_VECTOR_TYPE(Name, Id, Size) \
6083 case BuiltinType::Id:
6084#include "clang/Basic/PPCTypes.def"
6085#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6086#include "clang/Basic/RISCVVTypes.def"
6087#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6088#include "clang/Basic/WebAssemblyReferenceTypes.def"
6089#define AMDGPU_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6090#include "clang/Basic/AMDGPUTypes.def"
6091#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6092#include "clang/Basic/HLSLIntangibleTypes.def"
6093#define PLACEHOLDER_TYPE(ID, SINGLETON_ID)
6094#define BUILTIN_TYPE(ID, SINGLETON_ID) case BuiltinType::ID:
6095#include "clang/AST/BuiltinTypes.def"
6098 case BuiltinType::UnresolvedTemplate:
6101 case BuiltinType::Overload:
6106 case BuiltinType::ARCUnbridgedCast:
6110 case BuiltinType::PseudoObject:
6115 case BuiltinType::UnknownAny:
6119 case BuiltinType::BoundMember:
6120 case BuiltinType::BuiltinFn:
6121 case BuiltinType::IncompleteMatrixIdx:
6122 case BuiltinType::ArraySection:
6123 case BuiltinType::OMPArrayShaping:
6124 case BuiltinType::OMPIterator:
6128 llvm_unreachable(
"bad builtin type kind");
6134 bool hasInvalid =
false;
6135 for (
size_t i = 0, e = args.size(); i != e; i++) {
6138 if (result.
isInvalid()) hasInvalid =
true;
6139 else args[i] = result.
get();
6167 bool NeedsNewDecl =
false;
6180 if (!ParamType->isPointerType() || ParamType.hasAddressSpace() ||
6184 OverloadParams.push_back(ParamType);
6192 NeedsNewDecl =
true;
6205 OverloadParams, EPI);
6214 FT = cast<FunctionProtoType>(OverloadTy);
6215 for (
unsigned i = 0, e = FT->
getNumParams(); i != e; ++i) {
6222 Params.push_back(Parm);
6224 OverloadDecl->setParams(Params);
6226 return OverloadDecl;
6237 !Callee->isVariadic())
6239 if (Callee->getMinRequiredArguments() > ArgExprs.size())
6242 if (
const EnableIfAttr *
Attr =
6243 S.
CheckEnableIf(Callee, Fn->getBeginLoc(), ArgExprs,
true)) {
6244 S.
Diag(Fn->getBeginLoc(),
6245 isa<CXXMethodDecl>(Callee)
6246 ? diag::err_ovl_no_viable_member_function_in_call
6247 : diag::err_ovl_no_viable_function_in_call)
6248 << Callee << Callee->getSourceRange();
6249 S.
Diag(Callee->getLocation(),
6250 diag::note_ovl_candidate_disabled_by_function_cond_attr)
6251 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
6259 const auto GetFunctionLevelDCIfCXXClass =
6267 if (
const auto *MD = dyn_cast<CXXMethodDecl>(DC))
6268 return MD->
getParent()->getCanonicalDecl();
6271 if (
const auto *RD = dyn_cast<CXXRecordDecl>(DC))
6272 return RD->getCanonicalDecl();
6279 const CXXRecordDecl *
const CurParentClass = GetFunctionLevelDCIfCXXClass(S);
6280 if (!CurParentClass)
6287 assert(NamingClass &&
"Must have naming class even for implicit access");
6293 return CurParentClass == NamingClass ||
6342 if (
Call->getNumArgs() != 1)
6345 const Expr *
E =
Call->getCallee()->IgnoreParenImpCasts();
6346 if (!
E || isa<UnresolvedLookupExpr>(
E))
6348 const DeclRefExpr *DRE = dyn_cast_if_present<DeclRefExpr>(
E);
6361 if (BuiltinID != Builtin::BImove && BuiltinID != Builtin::BIforward)
6364 S.
Diag(DRE->
getLocation(), diag::warn_unqualified_call_to_std_cast_function)
6375 if (
Call.isInvalid())
6380 if (
const auto *ULE = dyn_cast<UnresolvedLookupExpr>(Fn);
6381 ULE && ULE->hasExplicitTemplateArgs() &&
6382 ULE->decls_begin() == ULE->decls_end()) {
6384 ? diag::warn_cxx17_compat_adl_only_template_id
6385 : diag::ext_adl_only_template_id)
6393 if (
const auto *CE = dyn_cast<CallExpr>(
Call.get()))
6399 if (
auto *DRE = dyn_cast<DeclRefExpr>(Fn->IgnoreParens());
6400 DRE &&
Call.get()->isValueDependent()) {
6409 Expr *ExecConfig,
bool IsExecConfig,
6410 bool AllowRecovery) {
6421 if (isa<CXXPseudoDestructorExpr>(Fn)) {
6422 if (!ArgExprs.empty()) {
6424 Diag(Fn->getBeginLoc(), diag::err_pseudo_dtor_call_with_args)
6427 ArgExprs.back()->getEndLoc()));
6444 cast<CallExpr>(ExecConfig), ArgExprs,
6450 *
this, dyn_cast<UnresolvedMemberExpr>(Fn->IgnoreParens()),
6459 if (Fn->getType()->isRecordType())
6471 RParenLoc, ExecConfig, IsExecConfig,
6488 Scope, Fn, ULE, LParenLoc, ArgExprs, RParenLoc, ExecConfig,
6491 RParenLoc, ExecConfig, IsExecConfig,
6503 Expr *NakedFn = Fn->IgnoreParens();
6505 bool CallingNDeclIndirectly =
false;
6507 if (
UnaryOperator *UnOp = dyn_cast<UnaryOperator>(NakedFn)) {
6508 if (UnOp->getOpcode() == UO_AddrOf) {
6509 CallingNDeclIndirectly =
true;
6514 if (
auto *DRE = dyn_cast<DeclRefExpr>(NakedFn)) {
6515 NDecl = DRE->getDecl();
6528 nullptr, DRE->isNonOdrUse());
6531 }
else if (
auto *ME = dyn_cast<MemberExpr>(NakedFn))
6532 NDecl = ME->getMemberDecl();
6534 if (
FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(NDecl)) {
6536 FD,
true, Fn->getBeginLoc()))
6548 FD->getBuiltinID()) {
6549 for (
unsigned Idx = 0; Idx < ArgExprs.size() && Idx < FD->param_size();
6553 !ArgExprs[Idx]->getType()->isPointerType())
6557 auto ArgTy = ArgExprs[Idx]->getType();
6558 auto ArgPtTy = ArgTy->getPointeeType();
6559 auto ArgAS = ArgPtTy.getAddressSpace();
6562 bool NeedImplicitASC =
6567 if (!NeedImplicitASC)
6571 if (ArgExprs[Idx]->isGLValue()) {
6573 Context, ArgExprs[Idx]->getType(), CK_NoOp, ArgExprs[Idx],
6578 Qualifiers ArgPtQuals = ArgPtTy.getQualifiers();
6588 CK_AddressSpaceConversion)
6597 assert((Fn->containsErrors() ||
6598 llvm::any_of(ArgExprs,
6599 [](
clang::Expr *
E) { return E->containsErrors(); })) &&
6600 "should only occur in error-recovery path.");
6605 ExecConfig, IsExecConfig);
6616 assert(BuiltInDecl &&
"failed to find builtin declaration");
6620 assert(DeclRef.
isUsable() &&
"Builtin reference cannot fail");
6625 assert(!
Call.isInvalid() &&
"Call to builtin cannot fail!");
6645 Diag(BuiltinLoc, diag::err_invalid_astype_of_different_size)
6663 FunctionDecl *FDecl = dyn_cast_or_null<FunctionDecl>(NDecl);
6664 unsigned BuiltinID = (FDecl ? FDecl->
getBuiltinID() : 0);
6668 if (FDecl->
hasAttr<AnyX86InterruptAttr>()) {
6669 Diag(Fn->getExprLoc(), diag::err_anyx86_interrupt_called);
6672 if (FDecl->
hasAttr<ARMInterruptAttr>()) {
6673 Diag(Fn->getExprLoc(), diag::err_arm_interrupt_called);
6682 if (Caller->hasAttr<AnyX86InterruptAttr>() ||
6683 Caller->hasAttr<AnyX86NoCallerSavedRegistersAttr>()) {
6685 bool HasNonGPRRegisters =
6687 if (HasNonGPRRegisters &&
6688 (!FDecl || !FDecl->
hasAttr<AnyX86NoCallerSavedRegistersAttr>())) {
6689 Diag(Fn->getExprLoc(), diag::warn_anyx86_excessive_regsave)
6690 << (Caller->hasAttr<AnyX86InterruptAttr>() ? 0 : 1);
6703 Fn->getType()->isSpecificBuiltinType(BuiltinType::BuiltinFn)) {
6730 return ExprError(
Diag(LParenLoc, diag::err_typecheck_call_not_function)
6731 << Fn->getType() << Fn->getSourceRange());
6745 return ExprError(
Diag(LParenLoc, diag::err_typecheck_call_not_function)
6746 << Fn->getType() << Fn->getSourceRange());
6753 const auto *Proto = dyn_cast_or_null<FunctionProtoType>(FuncT);
6754 unsigned NumParams = Proto ? Proto->getNumParams() : 0;
6758 assert(UsesADL == ADLCallKind::NotADL &&
6759 "CUDAKernelCallExpr should not use ADL");
6780 TheCall = dyn_cast<CallExpr>(
Result.get());
6781 bool CorrectedTypos = TheCall != TheOldCall;
6782 if (!TheCall)
return Result;
6789 if (CorrectedTypos && Args.size() < NumParams) {
6805 ExprResult E = CheckBuiltinFunctionCall(FDecl, BuiltinID, TheCall);
6814 if (FDecl && !FDecl->
hasAttr<CUDAGlobalAttr>())
6815 return ExprError(
Diag(LParenLoc,diag::err_kern_call_not_global_function)
6816 << FDecl << Fn->getSourceRange());
6822 return ExprError(
Diag(LParenLoc, diag::err_kern_type_not_void_return)
6823 << Fn->getType() << Fn->getSourceRange());
6826 if (FDecl && FDecl->
hasAttr<CUDAGlobalAttr>())
6827 return ExprError(
Diag(LParenLoc, diag::err_global_call_not_config)
6828 << FDecl << Fn->getSourceRange());
6843 for (
const Expr *Arg : Args) {
6844 if (Arg && Arg->getType()->isWebAssemblyTableType()) {
6846 diag::err_wasm_table_as_function_parameter));
6856 assert(isa<FunctionNoProtoType>(FuncT) &&
"Unknown FunctionType!");
6864 if (!Proto || !(Proto->isVariadic() && Args.size() >= Def->
param_size()))
6865 Diag(RParenLoc, diag::warn_call_wrong_number_of_arguments)
6866 << (Args.size() > Def->
param_size()) << FDecl << Fn->getSourceRange();
6885 if (!Proto && !Args.empty() &&
6889 Diag(LParenLoc, diag::warn_strict_uses_without_prototype)
6890 << (FDecl !=
nullptr) << FDecl;
6893 for (
unsigned i = 0, e = Args.size(); i != e; i++) {
6894 Expr *Arg = Args[i];
6896 if (Proto && i < Proto->getNumParams()) {
6898 Context, Proto->getParamType(i), Proto->isParamConsumed(i));
6916 diag::err_call_incomplete_argument, Arg))
6924 if (
CXXMethodDecl *Method = dyn_cast_or_null<CXXMethodDecl>(FDecl))
6925 if (!isa<RequiresExprBodyDecl>(
CurContext) &&
6926 Method->isImplicitObjectMemberFunction())
6927 return ExprError(
Diag(LParenLoc, diag::err_member_call_without_object)
6928 << Fn->getSourceRange() << 0);
6936 for (
unsigned i = 0, e = Args.size(); i != e; i++) {
6937 if (
const auto *RT =
6938 dyn_cast<RecordType>(Args[i]->getType().getCanonicalType())) {
6939 if (RT->getDecl()->isOrContainsUnion())
6940 Diag(Args[i]->getBeginLoc(), diag::warn_cmse_nonsecure_union)
6951 checkFortifiedBuiltinMemoryFunction(FDecl, TheCall);
6954 return CheckBuiltinFunctionCall(FDecl, BuiltinID, TheCall);
6956 if (CheckPointerCall(NDecl, TheCall, Proto))
6959 if (CheckOtherCall(TheCall, Proto))
6969 assert(Ty &&
"ActOnCompoundLiteral(): missing type");
6970 assert(InitExpr &&
"ActOnCompoundLiteral(): missing expression");
6988 diag::err_array_incomplete_or_sizeless_type,
7011 ? diag::err_variable_object_no_init
7012 : diag::err_compound_literal_with_vla_type;
7019 diag::err_typecheck_decl_incomplete_type,
7034 LiteralExpr =
Result.get();
7062 if (
auto ILE = dyn_cast<InitListExpr>(LiteralExpr))
7063 for (
unsigned i = 0, j = ILE->getNumInits(); i != j; i++) {
7069 VK, LiteralExpr, isFileScope);
7081 Diag(LParenLoc, diag::err_compound_literal_with_address_space)
7117 bool DiagnosedArrayDesignator =
false;
7118 bool DiagnosedNestedDesignator =
false;
7119 bool DiagnosedMixedDesignator =
false;
7123 for (
unsigned I = 0,
E = InitArgList.size(); I !=
E; ++I) {
7124 if (
auto *DIE = dyn_cast<DesignatedInitExpr>(InitArgList[I])) {
7126 FirstDesignator = DIE->getBeginLoc();
7131 if (!DiagnosedNestedDesignator && DIE->size() > 1) {
7132 DiagnosedNestedDesignator =
true;
7133 Diag(DIE->getBeginLoc(), diag::ext_designated_init_nested)
7134 << DIE->getDesignatorsSourceRange();
7137 for (
auto &Desig : DIE->designators()) {
7138 if (!Desig.isFieldDesignator() && !DiagnosedArrayDesignator) {
7139 DiagnosedArrayDesignator =
true;
7140 Diag(Desig.getBeginLoc(), diag::ext_designated_init_array)
7141 << Desig.getSourceRange();
7145 if (!DiagnosedMixedDesignator &&
7146 !isa<DesignatedInitExpr>(InitArgList[0])) {
7147 DiagnosedMixedDesignator =
true;
7148 Diag(DIE->getBeginLoc(), diag::ext_designated_init_mixed)
7149 << DIE->getSourceRange();
7150 Diag(InitArgList[0]->getBeginLoc(), diag::note_designated_init_mixed)
7151 << InitArgList[0]->getSourceRange();
7154 isa<DesignatedInitExpr>(InitArgList[0])) {
7155 DiagnosedMixedDesignator =
true;
7156 auto *DIE = cast<DesignatedInitExpr>(InitArgList[0]);
7157 Diag(DIE->getBeginLoc(), diag::ext_designated_init_mixed)
7158 << DIE->getSourceRange();
7159 Diag(InitArgList[I]->getBeginLoc(), diag::note_designated_init_mixed)
7160 << InitArgList[I]->getSourceRange();
7164 if (FirstDesignator.
isValid()) {
7168 !DiagnosedNestedDesignator && !DiagnosedMixedDesignator) {
7170 ? diag::warn_cxx17_compat_designated_init
7171 : diag::ext_cxx_designated_init);
7173 Diag(FirstDesignator, diag::ext_designated_init);
7188 for (
unsigned I = 0,
E = InitArgList.size(); I !=
E; ++I) {
7189 if (InitArgList[I]->getType()->isNonOverloadPlaceholderType()) {
7196 InitArgList[I] = result.
get();
7230 llvm_unreachable(
"member pointer type in C");
7239 if (SrcAS != DestAS)
7240 return CK_AddressSpaceConversion;
7247 ? CK_BitCast : CK_AnyPointerToBlockPointerCast);
7252 return CK_CPointerToObjCPointerCast;
7254 return CK_BlockPointerToObjCPointerCast;
7256 return CK_PointerToBoolean;
7258 return CK_PointerToIntegral;
7264 llvm_unreachable(
"illegal cast from pointer");
7266 llvm_unreachable(
"Should have returned before this");
7271 return CK_FixedPointCast;
7273 return CK_FixedPointToBoolean;
7275 return CK_FixedPointToIntegral;
7277 return CK_FixedPointToFloating;
7281 diag::err_unimplemented_conversion_with_fixed_point_type)
7283 return CK_IntegralCast;
7288 llvm_unreachable(
"illegal cast to pointer type");
7290 llvm_unreachable(
"Should have returned before this");
7300 return CK_NullToPointer;
7301 return CK_IntegralToPointer;
7303 return CK_IntegralToBoolean;
7305 return CK_IntegralCast;
7307 return CK_IntegralToFloating;
7312 return CK_IntegralRealToComplex;
7316 CK_IntegralToFloating);
7317 return CK_FloatingRealToComplex;
7319 llvm_unreachable(
"member pointer type in C");
7321 return CK_IntegralToFixedPoint;
7323 llvm_unreachable(
"Should have returned before this");
7328 return CK_FloatingCast;
7330 return CK_FloatingToBoolean;
7332 return CK_FloatingToIntegral;
7337 return CK_FloatingRealToComplex;
7341 CK_FloatingToIntegral);
7342 return CK_IntegralRealToComplex;
7346 llvm_unreachable(
"valid float->pointer cast?");
7348 llvm_unreachable(
"member pointer type in C");
7350 return CK_FloatingToFixedPoint;
7352 llvm_unreachable(
"Should have returned before this");
7357 return CK_FloatingComplexCast;
7359 return CK_FloatingComplexToIntegralComplex;
7363 return CK_FloatingComplexToReal;
7365 return CK_FloatingCast;
7368 return CK_FloatingComplexToBoolean;
7372 CK_FloatingComplexToReal);
7373 return CK_FloatingToIntegral;
7377 llvm_unreachable(
"valid complex float->pointer cast?");
7379 llvm_unreachable(
"member pointer type in C");
7382 diag::err_unimplemented_conversion_with_fixed_point_type)
7384 return CK_IntegralCast;
7386 llvm_unreachable(
"Should have returned before this");
7391 return CK_IntegralComplexToFloatingComplex;
7393 return CK_IntegralComplexCast;
7397 return CK_IntegralComplexToReal;
7399 return CK_IntegralCast;
7402 return CK_IntegralComplexToBoolean;
7406 CK_IntegralComplexToReal);
7407 return CK_IntegralToFloating;
7411 llvm_unreachable(
"valid complex int->pointer cast?");
7413 llvm_unreachable(
"member pointer type in C");
7416 diag::err_unimplemented_conversion_with_fixed_point_type)
7418 return CK_IntegralCast;
7420 llvm_unreachable(
"Should have returned before this");
7423 llvm_unreachable(
"Unhandled scalar cast");
7430 len = vecType->getNumElements();
7431 eltType = vecType->getElementType();
7438 if (!
type->isRealType())
return false;
7448 auto ValidScalableConversion = [](
QualType FirstType,
QualType SecondType) {
7452 const auto *VecTy = SecondType->getAs<
VectorType>();
7456 return ValidScalableConversion(srcTy, destTy) ||
7457 ValidScalableConversion(destTy, srcTy);
7467 return matSrcType->
getNumRows() == matDestType->getNumRows() &&
7468 matSrcType->
getNumColumns() == matDestType->getNumColumns();
7474 uint64_t SrcLen, DestLen;
7487 return (SrcLen * SrcEltSize == DestLen * DestEltSize);
7492 "expected at least one type to be a vector here");
7494 bool IsSrcTyAltivec =
7510 return (IsSrcTyAltivec || IsDestTyAltivec);
7537 if (!Vec || !Vec->getElementType()->isIntegralOrEnumerationType())
7542 if (!Vec || !Vec->getElementType()->isIntegralOrEnumerationType())
7559 return Diag(R.
getBegin(), diag::err_invalid_conversion_between_matrixes)
7560 << DestTy << SrcTy << R;
7564 diag::err_invalid_conversion_between_matrix_and_type)
7565 << SrcTy << DestTy << R;
7568 diag::err_invalid_conversion_between_matrix_and_type)
7569 << DestTy << SrcTy << R;
7572 Kind = CK_MatrixCast;
7578 assert(VectorTy->
isVectorType() &&
"Not a vector type!");
7584 diag::err_invalid_conversion_between_vectors :
7585 diag::err_invalid_conversion_between_vector_and_integer)
7586 << VectorTy << Ty << R;
7589 diag::err_invalid_conversion_between_vector_and_scalar)
7590 << VectorTy << Ty << R;
7599 if (DestElemTy == SplattedExpr->
getType())
7600 return SplattedExpr;
7613 CK_BooleanToSignedIntegral);
7614 SplattedExpr = CastExprRes.
get();
7615 CK = CK_IntegralToFloating;
7617 CK = CK_BooleanToSignedIntegral;
7624 SplattedExpr = CastExprRes.
get();
7643 Diag(R.
getBegin(),diag::err_invalid_conversion_between_ext_vectors)
7644 << DestTy << SrcTy << R;
7656 diag::err_invalid_conversion_between_vector_and_scalar)
7657 << DestTy << SrcTy << R;
7659 Kind = CK_VectorSplat;
7667 assert(!
D.isInvalidType() && (
CastExpr !=
nullptr) &&
7668 "ActOnCastExpr(): missing type or expr");
7671 if (
D.isInvalidType())
7690 bool isVectorLiteral =
false;
7705 isVectorLiteral =
true;
7708 isVectorLiteral =
true;
7713 if (isVectorLiteral)
7719 if (isa<ParenListExpr>(
CastExpr)) {
7740 assert((isa<ParenListExpr>(
E) || isa<ParenExpr>(
E)) &&
7741 "Expected paren or paren list expression");
7748 LiteralLParenLoc = PE->getLParenLoc();
7749 LiteralRParenLoc = PE->getRParenLoc();
7750 exprs = PE->getExprs();
7751 numExprs = PE->getNumExprs();
7753 LiteralLParenLoc = cast<ParenExpr>(
E)->getLParen();
7754 LiteralRParenLoc = cast<ParenExpr>(
E)->getRParen();
7755 subExpr = cast<ParenExpr>(
E)->getSubExpr();
7778 if (numExprs == 1) {
7781 if (Literal.isInvalid())
7787 else if (numExprs < numElems) {
7789 diag::err_incorrect_number_of_vector_initializers);
7793 initExprs.append(exprs, exprs + numExprs);
7802 if (Literal.isInvalid())
7809 initExprs.append(exprs, exprs + numExprs);
7814 initExprs, LiteralRParenLoc);
7827 for (
unsigned i = 1, e =
E->getNumExprs(); i != e && !
Result.isInvalid(); ++i)
7844 const Expr *NullExpr = LHSExpr;
7845 const Expr *NonPointerExpr = RHSExpr;
7852 NonPointerExpr = LHSExpr;
7874 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands_null)
7875 << NonPointerExpr->
getType() << DiagType
7887 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_nonfloat)
7895 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_scalar)
7929 bool IsBlockPointer =
false;
7933 IsBlockPointer =
true;
7958 ResultAddrSpace = LAddrSpace;
7960 ResultAddrSpace = RAddrSpace;
7962 S.
Diag(
Loc, diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
7969 auto LHSCastKind = CK_BitCast, RHSCastKind = CK_BitCast;
7984 LAddrSpace == ResultAddrSpace ? CK_BitCast : CK_AddressSpaceConversion;
7986 RAddrSpace == ResultAddrSpace ? CK_BitCast : CK_AddressSpaceConversion;
7994 lhptee, rhptee,
false,
false,
7997 if (CompositeTy.
isNull()) {
8014 S.
Diag(
Loc, diag::ext_typecheck_cond_incompatible_pointers)
8025 QualType ResultTy = [&, ResultAddrSpace]() {
8031 .withCVRQualifiers(MergedCVRQual);
8060 S.
Diag(
Loc, diag::err_typecheck_cond_incompatible_operands)
8113 bool IsIntFirstExpr) {
8115 !Int.get()->getType()->isIntegerType())
8118 Expr *Expr1 = IsIntFirstExpr ? Int.get() : PointerExpr;
8119 Expr *Expr2 = IsIntFirstExpr ? PointerExpr : Int.get();
8121 S.
Diag(
Loc, diag::ext_typecheck_cond_pointer_integer_mismatch)
8125 CK_IntegralToPointer);
8159 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_int_float)
8165 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_int_float)
8171 if (LHSType == RHSType)
8180 return handleIntegerConversion<doIntegralCast, doIntegralCast>
8181 (S, LHS, RHS, LHSType, RHSType,
false);
8215 llvm::raw_svector_ostream OS(Str);
8216 OS <<
"(vector of " << NumElements <<
" '" << EleTyName <<
"' values)";
8217 S.
Diag(QuestionLoc, diag::err_conditional_vector_element_size)
8218 << CondTy << OS.str();
8239 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_nonfloat)
8257 S.
Diag(QuestionLoc, diag::err_conditional_vector_size)
8258 << CondTy << VecResTy;
8263 QualType RVE = RV->getElementType();
8266 S.
Diag(QuestionLoc, diag::err_conditional_vector_element_size)
8267 << CondTy << VecResTy;
8293 bool IsBoolVecLang =
8317 if (
const CallExpr *CE = dyn_cast<CallExpr>(
E)) {
8318 QualType Ty = CE->getCallee()->getType();
8356 "should only occur in error-recovery path.");
8391 Diag(QuestionLoc, diag::err_wasm_table_conditional_expression)
8400 diag::err_typecheck_cond_incompatible_operands) << LHSTy << RHSTy
8419 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands)
8435 if (LHSRT->getDecl() == RHSRT->getDecl())
8479 if (!compositeType.
isNull())
8480 return compositeType;
8514 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands)
8553 const Expr **RHSExprs) {
8558 if (
const auto *MTE = dyn_cast<MaterializeTemporaryExpr>(
E)) {
8559 E = MTE->getSubExpr();
8564 if (
const auto *OP = dyn_cast<BinaryOperator>(
E);
8566 *Opcode = OP->getOpcode();
8567 *RHSExprs = OP->getRHS();
8572 if (
const auto *
Call = dyn_cast<CXXOperatorCallExpr>(
E)) {
8573 if (
Call->getNumArgs() != 2)
8579 if (OO < OO_Plus || OO > OO_Arrow ||
8580 OO == OO_PlusPlus || OO == OO_MinusMinus)
8586 *RHSExprs =
Call->getArg(1);
8602 if (
const auto *OP = dyn_cast<BinaryOperator>(
E))
8603 return OP->isComparisonOp() || OP->isLogicalOp();
8604 if (
const auto *OP = dyn_cast<UnaryOperator>(
E))
8605 return OP->getOpcode() == UO_LNot;
8620 const Expr *RHSExpr) {
8622 const Expr *CondRHS;
8633 ? diag::warn_precedence_bitwise_conditional
8634 : diag::warn_precedence_conditional;
8636 Self.Diag(OpLoc, DiagID)
8642 Self.PDiag(diag::note_precedence_silence)
8647 Self.PDiag(diag::note_precedence_conditional_first),
8658 auto GetNullability = [](
QualType Ty) {
8659 std::optional<NullabilityKind> Kind = Ty->getNullability();
8669 auto LHSKind = GetNullability(LHSTy), RHSKind = GetNullability(RHSTy);
8677 MergedKind = RHSKind;
8684 MergedKind = RHSKind;
8686 MergedKind = LHSKind;
8692 if (GetNullability(ResTy) == MergedKind)
8727 CondExpr = CondResult.
get();
8728 LHSExpr = LHSResult.
get();
8729 RHSExpr = RHSResult.
get();
8735 Expr *commonExpr =
nullptr;
8737 commonExpr = CondExpr;
8744 commonExpr = result.
get();
8758 commonExpr = commonRes.
get();
8768 commonExpr = MatExpr.
get();
8776 LHSExpr = CondExpr = opaqueValue;
8782 ExprResult Cond = CondExpr, LHS = LHSExpr, RHS = RHSExpr;
8784 VK, OK, QuestionLoc);
8792 CheckBoolLikeConversion(Cond.
get(), QuestionLoc);
8800 RHS.get(), result, VK, OK);
8803 commonExpr, opaqueValue, Cond.
get(), LHS.get(), RHS.get(), QuestionLoc,
8804 ColonLoc, result, VK, OK);
8808 unsigned FromAttributes = 0, ToAttributes = 0;
8809 if (
const auto *FromFn =
8813 if (
const auto *ToFn =
8818 return FromAttributes != ToAttributes;
8826 if (
const auto *ToFn =
8828 if (
const auto *FromFn =
8847 assert(LHSType.
isCanonical() &&
"LHS not canonicalized!");
8848 assert(RHSType.
isCanonical() &&
"RHS not canonicalized!");
8851 const Type *lhptee, *rhptee;
8853 std::tie(lhptee, lhq) =
8854 cast<PointerType>(LHSType)->getPointeeType().split().asPair();
8855 std::tie(rhptee, rhq) =
8856 cast<PointerType>(RHSType)->getPointeeType().split().asPair();
8916 diag::warn_typecheck_convert_incompatible_function_pointer_strict,
8939 if (ltrans == rtrans) {
8953 if (isa<PointerType>(lhptee) && isa<PointerType>(rhptee)) {
8955 std::tie(lhptee, lhq) =
8956 cast<PointerType>(lhptee)->getPointeeType().split().asPair();
8957 std::tie(rhptee, rhq) =
8958 cast<PointerType>(rhptee)->getPointeeType().split().asPair();
8971 }
while (isa<PointerType>(lhptee) && isa<PointerType>(rhptee));
8973 if (lhptee == rhptee)
8999 assert(LHSType.
isCanonical() &&
"LHS not canonicalized!");
9000 assert(RHSType.
isCanonical() &&
"RHS not canonicalized!");
9021 if (LQuals != RQuals)
9050 assert(LHSType.
isCanonical() &&
"LHS was not canonicalized!");
9051 assert(RHSType.
isCanonical() &&
"RHS was not canonicalized!");
9099 return VT->getElementType().getCanonicalType() == ElementType;
9132 if (LHSType == RHSType) {
9139 if (
const auto *AT = dyn_cast<AutoType>(LHSType)) {
9140 if (AT->isGNUAutoType()) {
9148 if (
const AtomicType *AtomicTy = dyn_cast<AtomicType>(LHSType)) {
9153 if (Kind != CK_NoOp && ConvertRHS)
9155 Kind = CK_NonAtomicToAtomic;
9168 Kind = CK_LValueBitCast;
9183 Kind = CK_VectorSplat;
9209 << RHSType << LHSType;
9228 << RHSType << LHSType;
9278 if (
const PointerType *LHSPointer = dyn_cast<PointerType>(LHSType)) {
9280 if (isa<PointerType>(RHSType)) {
9281 LangAS AddrSpaceL = LHSPointer->getPointeeType().getAddressSpace();
9283 if (AddrSpaceL != AddrSpaceR)
9284 Kind = CK_AddressSpaceConversion;
9295 Kind = CK_IntegralToPointer;
9301 if (isa<ObjCObjectPointerType>(RHSType)) {
9303 if (LHSPointer->getPointeeType()->isVoidType()) {
9322 if (LHSPointer->getPointeeType()->isVoidType()) {
9323 LangAS AddrSpaceL = LHSPointer->getPointeeType().getAddressSpace();
9328 AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion : CK_BitCast;
9337 if (isa<BlockPointerType>(LHSType)) {
9346 Kind = AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion : CK_BitCast;
9352 Kind = CK_IntegralToPointer;
9358 Kind = CK_AnyPointerToBlockPointerCast;
9364 if (RHSPT->getPointeeType()->isVoidType()) {
9365 Kind = CK_AnyPointerToBlockPointerCast;
9373 if (isa<ObjCObjectPointerType>(LHSType)) {
9379 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
9381 !
ObjC().CheckObjCARCUnavailableWeakConversion(OrigLHSType, RHSType))
9388 Kind = CK_IntegralToPointer;
9394 if (isa<PointerType>(RHSType)) {
9395 Kind = CK_CPointerToObjCPointerCast;
9417 Kind = CK_BlockPointerToObjCPointerCast;
9429 Kind = CK_NullToPointer;
9434 if (isa<PointerType>(RHSType)) {
9437 Kind = CK_PointerToBoolean;
9443 Kind = CK_PointerToIntegral;
9451 if (isa<ObjCObjectPointerType>(RHSType)) {
9454 Kind = CK_PointerToBoolean;
9460 Kind = CK_PointerToIntegral;
9468 if (isa<TagType>(LHSType) && isa<TagType>(RHSType)) {
9476 Kind = CK_IntToOCLSampler;
9518 for (
auto *it : UD->
fields()) {
9519 if (it->getType()->isPointerType()) {
9558 bool DiagnoseCFAudited,
9562 assert((ConvertRHS || !
Diagnose) &&
"can't indicate whether we diagnosed");
9568 ExprResult &RHS = ConvertRHS ? CallerRHS : LocalRHS;
9572 if (RHSPtrType->getPointeeType()->hasAttr(attr::NoDeref) &&
9573 !LHSPtrType->getPointeeType()->hasAttr(attr::NoDeref)) {
9575 diag::warn_noderef_to_dereferenceable_pointer)
9594 AllowedExplicit::None,
9606 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
9607 !
ObjC().CheckObjCARCUnavailableWeakConversion(LHSType, RHSType))
9621 RHS.
get(), LHSType,
false, DAP))
9712 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
9722 ObjC().CheckConversionToObjCLiteral(LHSType,
E,
Diagnose))) {
9742struct OriginalOperand {
9743 explicit OriginalOperand(
Expr *Op) : Orig(Op), Conversion(nullptr) {
9744 if (
auto *MTE = dyn_cast<MaterializeTemporaryExpr>(Op))
9745 Op = MTE->getSubExpr();
9746 if (
auto *BTE = dyn_cast<CXXBindTemporaryExpr>(Op))
9747 Op = BTE->getSubExpr();
9748 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(Op)) {
9749 Orig = ICE->getSubExprAsWritten();
9750 Conversion = ICE->getConversionFunction();
9754 QualType getType()
const {
return Orig->getType(); }
9763 OriginalOperand OrigLHS(LHS.
get()), OrigRHS(RHS.
get());
9765 Diag(
Loc, diag::err_typecheck_invalid_operands)
9766 << OrigLHS.getType() << OrigRHS.getType()
9771 if (OrigLHS.Conversion) {
9772 Diag(OrigLHS.Conversion->getLocation(),
9773 diag::note_typecheck_invalid_operands_converted)
9776 if (OrigRHS.Conversion) {
9777 Diag(OrigRHS.Conversion->getLocation(),
9778 diag::note_typecheck_invalid_operands_converted)
9793 if (!(LHSNatVec && RHSNatVec)) {
9795 Expr *NonVector = !LHSNatVec ? LHS.
get() : RHS.
get();
9796 Diag(
Loc, diag::err_typecheck_logical_vector_expr_gnu_cpp_restrict)
9798 <<
Vector->getSourceRange();
9802 Diag(
Loc, diag::err_typecheck_logical_vector_expr_gnu_cpp_restrict)
9834 DiagID = diag::err_opencl_scalar_type_rank_greater_than_vector_type;
9839 scalarCast = CK_IntegralCast;
9844 DiagID = diag::err_opencl_scalar_type_rank_greater_than_vector_type;
9847 scalarCast = CK_FloatingCast;
9850 scalarCast = CK_IntegralToFloating;
9859 if (scalarCast != CK_NoOp)
9870 assert(VecTy &&
"Expression E must be a vector");
9875 VecTy->getVectorKind());
9879 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(
E))
9880 if (ICE->getSubExpr()->getType() == NewVecTy)
9881 return ICE->getSubExpr();
9883 auto Cast = ElementType->
isIntegerType() ? CK_IntegralCast : CK_FloatingCast;
9891 QualType IntTy = Int->get()->getType().getUnqualifiedType();
9897 bool CstInt = Int->get()->EvaluateAsInt(EVResult, S.
Context);
9906 unsigned NumBits = IntSigned
9908 :
Result.getActiveBits())
9909 :
Result.getActiveBits();
9916 return (IntSigned != OtherIntSigned &&
9929 QualType IntTy = Int->get()->getType().getUnqualifiedType();
9934 bool CstInt = Int->get()->EvaluateAsInt(EVResult, S.
Context);
9946 llvm::APFloat::rmTowardZero);
9949 bool Ignored =
false;
9950 Float.convertToInteger(ConvertBack, llvm::APFloat::rmNearestTiesToEven,
9952 if (
Result != ConvertBack)
9958 unsigned FloatPrec = llvm::APFloat::semanticsPrecision(
9960 if (Bits > FloatPrec)
9973 QualType ScalarTy = Scalar->get()->getType().getUnqualifiedType();
9974 QualType VectorTy =
Vector->get()->getType().getUnqualifiedType();
9978 assert(!isa<ExtVectorType>(VT) &&
9979 "ExtVectorTypes should not be handled here!");
9980 VectorEltTy = VT->getElementType();
9985 llvm_unreachable(
"Only Fixed-Length and SVE Vector types are handled here");
10011 ScalarCast = CK_IntegralCast;
10015 ScalarCast = CK_FloatingToIntegral;
10023 llvm::APFloat
Result(0.0);
10029 bool CstScalar = Scalar->get()->isValueDependent() ||
10032 if (!CstScalar && Order < 0)
10038 bool Truncated =
false;
10040 llvm::APFloat::rmNearestTiesToEven, &Truncated);
10045 ScalarCast = CK_FloatingCast;
10050 ScalarCast = CK_IntegralToFloating;
10057 if (ScalarCast != CK_NoOp)
10065 bool AllowBothBool,
10066 bool AllowBoolConversions,
10067 bool AllowBoolOperation,
10068 bool ReportInvalid) {
10069 if (!IsCompAssign) {
10085 assert(LHSVecType || RHSVecType);
10089 if (!AllowBothBool && LHSVecType &&
10095 if (!AllowBoolOperation &&
10104 if (LHSVecType && RHSVecType &&
10106 if (isa<ExtVectorType>(LHSVecType)) {
10119 if (AllowBoolConversions && LHSVecType && RHSVecType &&
10129 if (!IsCompAssign &&
10132 RHSVecType->getElementType()->isIntegerType()) {
10141 unsigned &SVEorRVV) {
10162 if (IsSveRVVConversion(LHSType, RHSType, SVEorRVV) ||
10163 IsSveRVVConversion(RHSType, LHSType, SVEorRVV)) {
10164 Diag(
Loc, diag::err_typecheck_sve_rvv_ambiguous)
10165 << SVEorRVV << LHSType << RHSType;
10172 unsigned &SVEorRVV) {
10177 if (FirstVecType && SecondVecType) {
10180 SecondVecType->getVectorKind() ==
10185 SecondVecType->getVectorKind() ==
10187 SecondVecType->getVectorKind() ==
10189 SecondVecType->getVectorKind() ==
10198 if (SecondVecType &&
10211 if (IsSveRVVGnuConversion(LHSType, RHSType, SVEorRVV) ||
10212 IsSveRVVGnuConversion(RHSType, LHSType, SVEorRVV)) {
10213 Diag(
Loc, diag::err_typecheck_sve_rvv_gnu_ambiguous)
10214 << SVEorRVV << LHSType << RHSType;
10220 unsigned DiagID = diag::err_typecheck_vector_not_convertable;
10222 if (isa<ExtVectorType>(LHSVecType)) {
10233 if (isa<ExtVectorType>(RHSVecType)) {
10235 LHSType, RHSVecType->getElementType(),
10248 QualType VecType = LHSVecType ? LHSType : RHSType;
10249 const VectorType *VT = LHSVecType ? LHSVecType : RHSVecType;
10250 QualType OtherType = LHSVecType ? RHSType : LHSType;
10251 ExprResult *OtherExpr = LHSVecType ? &RHS : &LHS;
10256 Diag(
Loc, diag::warn_deprecated_lax_vec_conv_all) << RHSType << LHSType;
10260 if (!IsCompAssign) {
10279 if ((!RHSVecType && !RHSType->
isRealType()) ||
10281 Diag(
Loc, diag::err_typecheck_vector_not_convertable_non_scalar)
10282 << LHSType << RHSType
10292 RHSVecType && isa<ExtVectorType>(RHSVecType) &&
10293 LHSVecType && isa<ExtVectorType>(LHSVecType)) {
10294 Diag(
Loc, diag::err_opencl_implicit_vector_conversion) << LHSType
10303 if ((RHSVecType && !isa<ExtVectorType>(RHSVecType)) ||
10304 (LHSVecType && !isa<ExtVectorType>(LHSVecType))) {
10305 QualType Scalar = LHSVecType ? RHSType : LHSType;
10307 unsigned ScalarOrVector = LHSVecType && RHSVecType ? 1 : 0;
10309 diag::err_typecheck_vector_not_convertable_implict_truncation)
10310 << ScalarOrVector << Scalar <<
Vector;
10317 << LHSType << RHSType
10326 if (!IsCompAssign) {
10341 unsigned DiagID = diag::err_typecheck_invalid_operands;
10343 ((LHSBuiltinTy && LHSBuiltinTy->
isSVEBool()) ||
10344 (RHSBuiltinTy && RHSBuiltinTy->isSVEBool()))) {
10365 Diag(
Loc, diag::err_typecheck_vector_not_convertable_non_scalar)
10374 Diag(
Loc, diag::err_typecheck_vector_lengths_not_equal)
10383 bool ScalarOrVector =
10386 Diag(
Loc, diag::err_typecheck_vector_not_convertable_implict_truncation)
10387 << ScalarOrVector << Scalar <<
Vector;
10419 S.
Diag(
Loc, diag::warn_null_in_arithmetic_operation)
10431 S.
Diag(
Loc, diag::warn_null_in_comparison_operation)
10432 << LHSNull << NonNullType
10438 const auto *LUE = dyn_cast<UnaryExprOrTypeTraitExpr>(LHS);
10439 const auto *RUE = dyn_cast<UnaryExprOrTypeTraitExpr>(RHS);
10442 if (LUE->getKind() != UETT_SizeOf || LUE->isArgumentType() ||
10443 RUE->getKind() != UETT_SizeOf)
10450 if (RUE->isArgumentType())
10451 RHSTy = RUE->getArgumentType().getNonReferenceType();
10453 RHSTy = RUE->getArgumentExpr()->IgnoreParens()->getType();
10460 if (
const auto *DRE = dyn_cast<DeclRefExpr>(LHSArg)) {
10461 if (
const ValueDecl *LHSArgDecl = DRE->getDecl())
10462 S.
Diag(LHSArgDecl->getLocation(), diag::note_pointer_declared_here)
10466 QualType ArrayElemTy = ArrayTy->getElementType();
10472 S.
Diag(
Loc, diag::warn_division_sizeof_array)
10474 if (
const auto *DRE = dyn_cast<DeclRefExpr>(LHSArg)) {
10475 if (
const ValueDecl *LHSArgDecl = DRE->getDecl())
10476 S.
Diag(LHSArgDecl->getLocation(), diag::note_array_declared_here)
10480 S.
Diag(
Loc, diag::note_precedence_silence) << RHS;
10493 S.
PDiag(diag::warn_remainder_division_by_zero)
10499 bool IsCompAssign,
bool IsDiv) {
10577 ? diag::err_typecheck_pointer_arith_void_type
10578 : diag::ext_gnu_void_ptr)
10587 ? diag::err_typecheck_pointer_arith_void_type
10588 : diag::ext_gnu_void_ptr)
10589 << 0 <<
Pointer->getSourceRange();
10600 S.
Diag(
Loc, diag::warn_gnu_null_ptr_arith)
10601 <<
Pointer->getSourceRange();
10603 S.
Diag(
Loc, diag::warn_pointer_arith_null_ptr)
10620 S.
PDiag(diag::warn_pointer_sub_null_ptr)
10622 <<
Pointer->getSourceRange());
10631 ? diag::err_typecheck_pointer_arith_function_type
10632 : diag::ext_gnu_ptr_func_arith)
10644 assert(
Pointer->getType()->isAnyPointerType());
10646 ? diag::err_typecheck_pointer_arith_function_type
10647 : diag::ext_gnu_ptr_func_arith)
10648 << 0 <<
Pointer->getType()->getPointeeType()
10650 <<
Pointer->getSourceRange();
10658 QualType ResType = Operand->getType();
10660 ResType = ResAtomicType->getValueType();
10666 diag::err_typecheck_arithmetic_incomplete_or_sizeless_type,
10667 Operand->getSourceRange());
10680 QualType ResType = Operand->getType();
10682 ResType = ResAtomicType->getValueType();
10714 if (!isLHSPointer && !isRHSPointer)
return true;
10716 QualType LHSPointeeTy, RHSPointeeTy;
10721 if (isLHSPointer && isRHSPointer) {
10724 diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
10732 bool isLHSVoidPtr = isLHSPointer && LHSPointeeTy->
isVoidType();
10733 bool isRHSVoidPtr = isRHSPointer && RHSPointeeTy->
isVoidType();
10734 if (isLHSVoidPtr || isRHSVoidPtr) {
10742 bool isLHSFuncPtr = isLHSPointer && LHSPointeeTy->
isFunctionType();
10743 bool isRHSFuncPtr = isRHSPointer && RHSPointeeTy->
isFunctionType();
10744 if (isLHSFuncPtr || isRHSFuncPtr) {
10766 Expr* IndexExpr = RHSExpr;
10769 IndexExpr = LHSExpr;
10772 bool IsStringPlusInt = StrExpr &&
10778 Self.Diag(OpLoc, diag::warn_string_plus_int)
10782 if (IndexExpr == RHSExpr) {
10784 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence)
10789 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence);
10795 const Expr *StringRefExpr = LHSExpr;
10800 CharExpr = dyn_cast<CharacterLiteral>(LHSExpr->
IgnoreImpCasts());
10801 StringRefExpr = RHSExpr;
10804 if (!CharExpr || !StringRefExpr)
10824 Self.Diag(OpLoc, diag::warn_string_plus_char)
10825 << DiagRange << Ctx.
CharTy;
10827 Self.Diag(OpLoc, diag::warn_string_plus_char)
10828 << DiagRange << CharExpr->
getType();
10834 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence)
10839 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence);
10848 S.
Diag(
Loc, diag::err_typecheck_sub_ptr_compatible)
10867 if (CompLHSTy) *CompLHSTy = compType;
10876 *CompLHSTy = compType;
10885 *CompLHSTy = compType;
10895 if (Opc == BO_Add) {
10902 if (CompLHSTy) *CompLHSTy = compType;
10916 std::swap(PExp, IExp);
10927 if (!IExp->getType()->isIntegerType())
10936 (!IExp->isValueDependent() &&
10937 (!IExp->EvaluateAsInt(KnownVal,
Context) ||
10941 Context, BO_Add, PExp, IExp);
10954 if (isa<AddrLabelExpr>(PExp) &&
getLangOpts().PointerAuthIndirectGotos) {
10955 Diag(
Loc, diag::err_ptrauth_indirect_goto_addrlabel_arithmetic)
10961 CheckArrayAccess(PExp, IExp);
10970 *CompLHSTy = LHSTy;
10990 if (CompLHSTy) *CompLHSTy = compType;
10999 *CompLHSTy = compType;
11008 *CompLHSTy = compType;
11021 if (CompLHSTy) *CompLHSTy = compType;
11036 if (isa<AddrLabelExpr>(LHS.
get()) &&
11038 Diag(
Loc, diag::err_ptrauth_indirect_goto_addrlabel_arithmetic)
11064 CheckArrayAccess(LHS.
get(), RHS.
get(),
nullptr,
11067 if (CompLHSTy) *CompLHSTy = LHS.
get()->
getType();
11111 if (ElementSize.
isZero()) {
11112 Diag(
Loc,diag::warn_sub_ptr_zero_size_types)
11118 if (CompLHSTy) *CompLHSTy = LHS.
get()->
getType();
11128 return ET->getDecl()->isScoped();
11145 llvm::APSInt Right = RHSResult.
Val.
getInt();
11147 if (Right.isNegative()) {
11149 S.
PDiag(diag::warn_shift_negative)
11160 LeftSize = FXSema.getWidth() - (
unsigned)FXSema.hasUnsignedPadding();
11162 if (Right.uge(LeftSize)) {
11164 S.
PDiag(diag::warn_shift_gt_typewidth)
11184 llvm::APSInt Left = LHSResult.
Val.
getInt();
11195 if (Left.isNegative()) {
11197 S.
PDiag(diag::warn_shift_lhs_negative)
11202 llvm::APInt ResultBits =
11203 static_cast<llvm::APInt &
>(Right) + Left.getSignificantBits();
11204 if (ResultBits.ule(LeftSize))
11206 llvm::APSInt
Result = Left.extend(ResultBits.getLimitedValue());
11212 Result.toString(HexResult, 16,
false,
true);
11218 if (ResultBits - 1 == LeftSize) {
11219 S.
Diag(
Loc, diag::warn_shift_result_sets_sign_bit)
11220 << HexResult << LHSType
11225 S.
Diag(
Loc, diag::warn_shift_result_gt_typewidth)
11226 << HexResult.str() <<
Result.getSignificantBits() << LHSType
11238 S.
Diag(
Loc, diag::err_shift_rhs_only_vector)
11244 if (!IsCompAssign) {
11266 S.
Diag(
Loc, diag::err_typecheck_invalid_operands)
11273 if (!LHSEleType->isIntegerType()) {
11274 S.
Diag(
Loc, diag::err_typecheck_expect_int)
11279 if (!RHSEleType->isIntegerType()) {
11280 S.
Diag(
Loc, diag::err_typecheck_expect_int)
11289 if (LHSEleType != RHSEleType) {
11291 LHSEleType = RHSEleType;
11297 }
else if (RHSVecTy) {
11302 S.
Diag(
Loc, diag::err_typecheck_vector_lengths_not_equal)
11310 if (LHSBT != RHSBT &&
11312 S.
Diag(
Loc, diag::warn_typecheck_vector_element_sizes_not_equal)
11329 bool IsCompAssign) {
11330 if (!IsCompAssign) {
11353 if ((LHSBuiltinTy && LHSBuiltinTy->
isSVEBool()) ||
11354 (RHSBuiltinTy && RHSBuiltinTy->
isSVEBool())) {
11355 S.
Diag(
Loc, diag::err_typecheck_invalid_operands)
11360 if (!LHSEleType->isIntegerType()) {
11361 S.
Diag(
Loc, diag::err_typecheck_expect_int)
11366 if (!RHSEleType->isIntegerType()) {
11367 S.
Diag(
Loc, diag::err_typecheck_expect_int)
11375 S.
Diag(
Loc, diag::err_typecheck_invalid_operands)
11385 if (LHSEleType != RHSEleType) {
11387 LHSEleType = RHSEleType;
11389 const llvm::ElementCount VecSize =
11398 S.
Diag(
Loc, diag::err_typecheck_vector_lengths_not_equal)
11404 const llvm::ElementCount VecSize =
11406 if (LHSEleType != RHSEleType) {
11408 RHSEleType = LHSEleType;
11421 bool IsCompAssign) {
11455 if (IsCompAssign) LHS = OldLHS;
11486 S.
Diag(
Loc, IsError ? diag::err_typecheck_comparison_of_distinct_pointers
11487 : diag::ext_typecheck_comparison_of_distinct_pointers)
11527 S.
Diag(
Loc, IsError ? diag::err_typecheck_comparison_of_fptr_to_void
11528 : diag::ext_typecheck_comparison_of_fptr_to_void)
11535 case Stmt::ObjCArrayLiteralClass:
11536 case Stmt::ObjCDictionaryLiteralClass:
11537 case Stmt::ObjCStringLiteralClass:
11538 case Stmt::ObjCBoxedExprClass:
11599 Literal = LHS.
get();
11602 Literal = RHS.
get();
11618 llvm_unreachable(
"Unknown Objective-C object literal kind");
11622 S.
Diag(
Loc, diag::warn_objc_string_literal_comparison)
11623 << Literal->getSourceRange();
11625 S.
Diag(
Loc, diag::warn_objc_literal_comparison)
11626 << LiteralKind << Literal->getSourceRange();
11635 S.
Diag(
Loc, diag::note_objc_literal_comparison_isequal)
11648 if (!UO || UO->
getOpcode() != UO_LNot)
return;
11658 bool IsBitwiseOp = Opc == BO_And || Opc == BO_Or || Opc == BO_Xor;
11660 <<
Loc << IsBitwiseOp;
11687 if (
const DeclRefExpr *DR = dyn_cast<DeclRefExpr>(
E)) {
11689 }
else if (
const MemberExpr *Mem = dyn_cast<MemberExpr>(
E)) {
11690 if (Mem->isImplicitAccess())
11691 D = Mem->getMemberDecl();
11695 return D->getType()->isArrayType() && !
D->isWeak();
11746 S.
Diag(
Loc, diag::warn_depr_array_comparison)
11772 Result = AlwaysConstant;
11776 S.
PDiag(diag::warn_comparison_always)
11791 Result = AlwaysConstant;
11795 S.
PDiag(diag::warn_comparison_always)
11801 if (isa<CastExpr>(LHSStripped))
11803 if (isa<CastExpr>(RHSStripped))
11808 Expr *LiteralString =
nullptr;
11809 Expr *LiteralStringStripped =
nullptr;
11810 if ((isa<StringLiteral>(LHSStripped) || isa<ObjCEncodeExpr>(LHSStripped)) &&
11813 LiteralString = LHS;
11814 LiteralStringStripped = LHSStripped;
11815 }
else if ((isa<StringLiteral>(RHSStripped) ||
11816 isa<ObjCEncodeExpr>(RHSStripped)) &&
11819 LiteralString = RHS;
11820 LiteralStringStripped = RHSStripped;
11823 if (LiteralString) {
11825 S.
PDiag(diag::warn_stringcompare)
11826 << isa<ObjCEncodeExpr>(LiteralStringStripped)
11838 llvm_unreachable(
"unhandled cast kind");
11840 case CK_UserDefinedConversion:
11842 case CK_LValueToRValue:
11844 case CK_ArrayToPointerDecay:
11846 case CK_FunctionToPointerDecay:
11848 case CK_IntegralCast:
11850 case CK_FloatingCast:
11852 case CK_IntegralToFloating:
11853 case CK_FloatingToIntegral:
11855 case CK_IntegralComplexCast:
11856 case CK_FloatingComplexCast:
11857 case CK_FloatingComplexToIntegralComplex:
11858 case CK_IntegralComplexToFloatingComplex:
11860 case CK_FloatingComplexToReal:
11861 case CK_FloatingRealToComplex:
11862 case CK_IntegralComplexToReal:
11863 case CK_IntegralRealToComplex:
11865 case CK_HLSLArrayRValue:
11878 if (
const auto *ICE = dyn_cast<ImplicitCastExpr>(
E))
11905 << 0 << FromType << ToType;
11910 llvm_unreachable(
"unhandled case in switch");
11937 if (NumEnumArgs == 1) {
11939 QualType OtherTy = LHSIsEnum ? RHSStrippedType : LHSStrippedType;
11945 if (NumEnumArgs == 2) {
11954 LHSStrippedType->
castAs<
EnumType>()->getDecl()->getIntegerType();
11965 LHSType = RHSType = IntType;
11977 std::optional<ComparisonCategoryType> CCT =
11989 assert(!
Type.isNull() &&
"composite type for <=> has not been set");
12030 if (
const auto *CL = dyn_cast<CharacterLiteral>(
E.get())) {
12031 if (CL->getValue() == 0)
12035 NullValue ?
"NULL" :
"(void *)0");
12036 }
else if (
const auto *CE = dyn_cast<CStyleCastExpr>(
E.get())) {
12043 NullValue ?
"NULL" :
"(void *)0");
12053 bool IsThreeWay = Opc == BO_Cmp;
12054 bool IsOrdered = IsRelational || IsThreeWay;
12065 if (!IsThreeWay || IsAnyPointerType(LHS) || IsAnyPointerType(RHS)) {
12118 auto computeResultTy = [&]() {
12127 std::optional<ComparisonCategoryType> CCT =
12132 if (CompositeTy->
isPointerType() && LHSIsNull != RHSIsNull) {
12136 Diag(
Loc, diag::err_typecheck_three_way_comparison_of_pointer_and_zero)
12146 if (!IsOrdered && LHSIsNull != RHSIsNull) {
12147 bool IsEquality = Opc == BO_EQ;
12159 bool IsError = Opc == BO_Cmp;
12161 IsError ? diag::err_typecheck_ordered_comparison_of_function_pointers
12163 ? diag::warn_typecheck_ordered_comparison_of_function_pointers
12164 : diag::ext_typecheck_ordered_comparison_of_function_pointers;
12193 return computeResultTy();
12209 (IsOrdered ? 2 : 1) &&
12214 return computeResultTy();
12228 if (IsRelational) {
12233 Diag(
Loc, diag::ext_typecheck_compare_complete_incomplete_pointers)
12239 }
else if (!IsRelational &&
12243 && !LHSIsNull && !RHSIsNull)
12250 if (LCanPointeeTy != RCanPointeeTy) {
12255 diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
12256 << LHSType << RHSType << 0
12262 CastKind Kind = AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion
12264 if (LHSIsNull && !RHSIsNull)
12269 return computeResultTy();
12281 if (!IsOrdered && LHSIsNull && RHSIsNull) {
12284 return computeResultTy();
12288 return computeResultTy();
12299 return computeResultTy();
12303 return computeResultTy();
12312 return computeResultTy();
12317 return computeResultTy();
12321 if (IsRelational &&
12330 if (isa<FunctionDecl>(DC))
12332 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
12333 if (CTSD->isInStdNamespace() &&
12334 llvm::StringSwitch<bool>(CTSD->getName())
12335 .Cases(
"less",
"less_equal",
"greater",
"greater_equal",
true)
12341 return computeResultTy();
12354 return computeResultTy();
12364 if (!LHSIsNull && !RHSIsNull &&
12366 Diag(
Loc, diag::err_typecheck_comparison_of_distinct_blocks)
12371 return computeResultTy();
12378 if (!LHSIsNull && !RHSIsNull) {
12383 Diag(
Loc, diag::err_typecheck_comparison_of_distinct_blocks)
12387 if (LHSIsNull && !RHSIsNull)
12390 : CK_AnyPointerToBlockPointerCast);
12394 : CK_AnyPointerToBlockPointerCast);
12395 return computeResultTy();
12404 bool RPtrToVoid = RPT ? RPT->getPointeeType()->isVoidType() :
false;
12406 if (!LPtrToVoid && !RPtrToVoid &&
12414 if (LHSIsNull && !RHSIsNull) {
12420 RPT ? CK_BitCast :CK_CPointerToObjCPointerCast);
12430 LPT ? CK_BitCast :CK_CPointerToObjCPointerCast);
12432 return computeResultTy();
12442 if (LHSIsNull && !RHSIsNull)
12446 return computeResultTy();
12452 CK_BlockPointerToObjCPointerCast);
12453 return computeResultTy();
12454 }
else if (!IsOrdered &&
12458 CK_BlockPointerToObjCPointerCast);
12459 return computeResultTy();
12464 unsigned DiagID = 0;
12465 bool isError =
false;
12474 isError ? diag::err_typecheck_ordered_comparison_of_pointer_and_zero
12475 : diag::ext_typecheck_ordered_comparison_of_pointer_and_zero;
12478 DiagID = diag::err_typecheck_comparison_of_pointer_integer;
12480 }
else if (IsOrdered)
12481 DiagID = diag::ext_typecheck_ordered_comparison_of_pointer_integer;
12483 DiagID = diag::ext_typecheck_comparison_of_pointer_integer;
12495 LHSIsNull ? CK_NullToPointer : CK_IntegralToPointer);
12498 RHSIsNull ? CK_NullToPointer : CK_IntegralToPointer);
12499 return computeResultTy();
12503 if (!IsOrdered && RHSIsNull
12506 return computeResultTy();
12508 if (!IsOrdered && LHSIsNull
12511 return computeResultTy();
12514 if (
getLangOpts().getOpenCLCompatibleVersion() >= 200) {
12516 return computeResultTy();
12520 return computeResultTy();
12523 if (LHSIsNull && RHSType->
isQueueT()) {
12525 return computeResultTy();
12528 if (LHSType->
isQueueT() && RHSIsNull) {
12530 return computeResultTy();
12541 if (isa<ExtVectorType>(VTy)) {
12555 "Unhandled vector element size in vector compare");
12575 "Unhandled vector element size in vector compare");
12595 if (Opc == BO_Cmp) {
12596 Diag(
Loc, diag::err_three_way_vector_comparison);
12627 Diag(
Loc, diag::warn_deprecated_altivec_src_compat);
12657 if (Opc == BO_Cmp) {
12658 Diag(
Loc, diag::err_three_way_vector_comparison);
12686 if (LHSBuiltinTy && RHSBuiltinTy && LHSBuiltinTy->
isSVEBool() &&
12687 RHSBuiltinTy->isSVEBool())
12706 bool Negative =
false;
12707 bool ExplicitPlus =
false;
12708 const auto *LHSInt = dyn_cast<IntegerLiteral>(XorLHS.
get());
12709 const auto *RHSInt = dyn_cast<IntegerLiteral>(XorRHS.
get());
12715 if (
const auto *UO = dyn_cast<UnaryOperator>(XorRHS.
get())) {
12717 if (Opc != UO_Minus && Opc != UO_Plus)
12719 RHSInt = dyn_cast<IntegerLiteral>(UO->getSubExpr());
12722 Negative = (Opc == UO_Minus);
12723 ExplicitPlus = !Negative;
12729 const llvm::APInt &LeftSideValue = LHSInt->getValue();
12730 llvm::APInt RightSideValue = RHSInt->getValue();
12731 if (LeftSideValue != 2 && LeftSideValue != 10)
12734 if (LeftSideValue.getBitWidth() != RightSideValue.getBitWidth())
12739 llvm::StringRef ExprStr =
12744 llvm::StringRef XorStr =
12747 if (XorStr ==
"xor")
12758 RightSideValue = -RightSideValue;
12759 RHSStr =
"-" + RHSStr;
12760 }
else if (ExplicitPlus) {
12761 RHSStr =
"+" + RHSStr;
12764 StringRef LHSStrRef = LHSStr;
12765 StringRef RHSStrRef = RHSStr;
12768 if (LHSStrRef.starts_with(
"0b") || LHSStrRef.starts_with(
"0B") ||
12769 RHSStrRef.starts_with(
"0b") || RHSStrRef.starts_with(
"0B") ||
12770 LHSStrRef.starts_with(
"0x") || LHSStrRef.starts_with(
"0X") ||
12771 RHSStrRef.starts_with(
"0x") || RHSStrRef.starts_with(
"0X") ||
12772 (LHSStrRef.size() > 1 && LHSStrRef.starts_with(
"0")) ||
12773 (RHSStrRef.size() > 1 && RHSStrRef.starts_with(
"0")) ||
12774 LHSStrRef.contains(
'\'') || RHSStrRef.contains(
'\''))
12779 const llvm::APInt XorValue = LeftSideValue ^ RightSideValue;
12780 int64_t RightSideIntValue = RightSideValue.getSExtValue();
12781 if (LeftSideValue == 2 && RightSideIntValue >= 0) {
12782 std::string SuggestedExpr =
"1 << " + RHSStr;
12783 bool Overflow =
false;
12784 llvm::APInt One = (LeftSideValue - 1);
12785 llvm::APInt PowValue = One.sshl_ov(RightSideValue, Overflow);
12787 if (RightSideIntValue < 64)
12788 S.
Diag(
Loc, diag::warn_xor_used_as_pow_base)
12789 << ExprStr <<
toString(XorValue, 10,
true) << (
"1LL << " + RHSStr)
12791 else if (RightSideIntValue == 64)
12792 S.
Diag(
Loc, diag::warn_xor_used_as_pow)
12793 << ExprStr <<
toString(XorValue, 10,
true);
12797 S.
Diag(
Loc, diag::warn_xor_used_as_pow_base_extra)
12798 << ExprStr <<
toString(XorValue, 10,
true) << SuggestedExpr
12801 ExprRange, (RightSideIntValue == 0) ?
"1" : SuggestedExpr);
12804 S.
Diag(
Loc, diag::note_xor_used_as_pow_silence)
12805 << (
"0x2 ^ " + RHSStr) << SuggestXor;
12806 }
else if (LeftSideValue == 10) {
12807 std::string SuggestedValue =
"1e" + std::to_string(RightSideIntValue);
12808 S.
Diag(
Loc, diag::warn_xor_used_as_pow_base)
12809 << ExprStr <<
toString(XorValue, 10,
true) << SuggestedValue
12811 S.
Diag(
Loc, diag::note_xor_used_as_pow_silence)
12812 << (
"0xA ^ " + RHSStr) << SuggestXor;
12828 getLangOpts().getOpenCLCompatibleVersion() < 120 &&
12843 bool IsCompAssign) {
12844 if (!IsCompAssign) {
12860 assert((LHSMatType || RHSMatType) &&
"At least one operand must be a matrix");
12869 if (LHSMatType && !RHSMatType) {
12877 if (!LHSMatType && RHSMatType) {
12889 bool IsCompAssign) {
12890 if (!IsCompAssign) {
12901 assert((LHSMatType || RHSMatType) &&
"At least one operand must be a matrix");
12903 if (LHSMatType && RHSMatType) {
12904 if (LHSMatType->getNumColumns() != RHSMatType->
getNumRows())
12912 QualType LHSELTy = LHSMatType->getElementType(),
12943 bool IsCompAssign =
12944 Opc == BO_AndAssign || Opc == BO_OrAssign || Opc == BO_XorAssign;
12955 LegalBoolVecOperator,
12985 ExprResult LHSResult = LHS, RHSResult = RHS;
12988 if (LHSResult.
isInvalid() || RHSResult.isInvalid())
12990 LHS = LHSResult.
get();
12991 RHS = RHSResult.
get();
13010 bool EnumConstantInBoolContext =
false;
13012 if (
const auto *DREHS = dyn_cast<DeclRefExpr>(HS.get())) {
13013 const auto *ECDHS = dyn_cast<EnumConstantDecl>(DREHS->getDecl());
13014 if (ECDHS && ECDHS->getInitVal() != 0 && ECDHS->getInitVal() != 1)
13015 EnumConstantInBoolContext =
true;
13019 if (EnumConstantInBoolContext)
13020 Diag(
Loc, diag::warn_enum_constant_in_bool_context);
13025 const auto *LHSATy = dyn_cast<ArrayType>(LHSTy);
13026 const auto *RHSATy = dyn_cast<ArrayType>(RHSTy);
13027 if ((LHSATy && LHSATy->getElementType().isWebAssemblyReferenceType()) ||
13028 (RHSATy && RHSATy->getElementType().isWebAssemblyReferenceType())) {
13050 Diag(
Loc, diag::warn_logical_instead_of_bitwise)
13053 Diag(
Loc, diag::note_logical_instead_of_bitwise_change_operator)
13054 << (Opc == BO_LAnd ?
"&" :
"|")
13057 Opc == BO_LAnd ?
"&" :
"|");
13058 if (Opc == BO_LAnd)
13060 Diag(
Loc, diag::note_logical_instead_of_bitwise_remove_constant)
13117 if (!ME)
return false;
13121 if (!
Base)
return false;
13122 return Base->getMethodDecl() !=
nullptr;
13141 if (var->getType().isConstQualified())
return NCCK_None;
13142 assert(var->hasLocalStorage() &&
"capture added 'const' to non-local?");
13150 if (
auto *FD = dyn_cast<FunctionDecl>(DC))
13151 if (var->isInitCapture() &&
13152 FD->getTemplateInstantiationPattern() == var->getDeclContext())
13154 if (DC == var->getDeclContext())
13160 if (!var->isInitCapture())
13193 bool DiagnosticEmitted =
false;
13197 bool IsDereference =
false;
13198 bool NextIsDereference =
false;
13202 IsDereference = NextIsDereference;
13205 if (
const MemberExpr *ME = dyn_cast<MemberExpr>(
E)) {
13206 NextIsDereference = ME->isArrow();
13207 const ValueDecl *VD = ME->getMemberDecl();
13208 if (
const FieldDecl *Field = dyn_cast<FieldDecl>(VD)) {
13210 if (Field->isMutable()) {
13211 assert(DiagnosticEmitted &&
"Expected diagnostic not emitted.");
13216 if (!DiagnosticEmitted) {
13217 S.
Diag(
Loc, diag::err_typecheck_assign_const)
13219 << Field->getType();
13220 DiagnosticEmitted =
true;
13223 <<
ConstMember <<
false << Field << Field->getType()
13224 << Field->getSourceRange();
13228 }
else if (
const VarDecl *VDecl = dyn_cast<VarDecl>(VD)) {
13229 if (VDecl->getType().isConstQualified()) {
13230 if (!DiagnosticEmitted) {
13231 S.
Diag(
Loc, diag::err_typecheck_assign_const)
13233 << VDecl->getType();
13234 DiagnosticEmitted =
true;
13237 <<
ConstMember <<
true << VDecl << VDecl->getType()
13238 << VDecl->getSourceRange();
13245 dyn_cast<ArraySubscriptExpr>(
E)) {
13249 dyn_cast<ExtVectorElementExpr>(
E)) {
13256 if (
const CallExpr *CE = dyn_cast<CallExpr>(
E)) {
13260 if (!DiagnosticEmitted) {
13261 S.
Diag(
Loc, diag::err_typecheck_assign_const) << ExprRange
13263 DiagnosticEmitted =
true;
13266 diag::note_typecheck_assign_const)
13270 }
else if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(
E)) {
13272 if (
const ValueDecl *VD = DRE->getDecl()) {
13274 if (!DiagnosticEmitted) {
13275 S.
Diag(
Loc, diag::err_typecheck_assign_const)
13277 DiagnosticEmitted =
true;
13279 S.
Diag(VD->getLocation(), diag::note_typecheck_assign_const)
13280 <<
ConstVariable << VD << VD->getType() << VD->getSourceRange();
13283 }
else if (isa<CXXThisExpr>(
E)) {
13285 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(DC)) {
13286 if (MD->isConst()) {
13287 if (!DiagnosticEmitted) {
13288 S.
Diag(
Loc, diag::err_typecheck_assign_const) << ExprRange
13290 DiagnosticEmitted =
true;
13292 S.
Diag(MD->getLocation(), diag::note_typecheck_assign_const)
13299 if (DiagnosticEmitted)
13316 bool &DiagnosticEmitted) {
13317 std::vector<const RecordType *> RecordTypeList;
13318 RecordTypeList.push_back(Ty);
13319 unsigned NextToCheckIndex = 0;
13322 while (RecordTypeList.size() > NextToCheckIndex) {
13323 bool IsNested = NextToCheckIndex > 0;
13325 RecordTypeList[NextToCheckIndex]->getDecl()->fields()) {
13327 QualType FieldTy = Field->getType();
13329 if (!DiagnosticEmitted) {
13330 S.
Diag(
Loc, diag::err_typecheck_assign_const)
13332 << IsNested << Field;
13333 DiagnosticEmitted =
true;
13335 S.
Diag(Field->getLocation(), diag::note_typecheck_assign_const)
13337 << FieldTy << Field->getSourceRange();
13343 if (!llvm::is_contained(RecordTypeList, FieldRecTy))
13344 RecordTypeList.push_back(FieldRecTy);
13347 ++NextToCheckIndex;
13356 assert(Ty->
isRecordType() &&
"lvalue was not record?");
13359 bool DiagEmitted =
false;
13361 if (
const MemberExpr *ME = dyn_cast<MemberExpr>(
E))
13364 else if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(
E))
13389 unsigned DiagID = 0;
13390 bool NeedType =
false;
13397 DiagID = diag::err_block_decl_ref_not_modifiable_lvalue;
13399 DiagID = diag::err_lambda_decl_ref_not_modifiable_lvalue;
13407 if (declRef && isa<VarDecl>(declRef->
getDecl())) {
13412 if (var->isARCPseudoStrong() &&
13413 (!var->getTypeSourceInfo() ||
13414 !var->getTypeSourceInfo()->getType().isConstQualified())) {
13420 ? diag::err_typecheck_arc_assign_self_class_method
13421 : diag::err_typecheck_arc_assign_self;
13424 }
else if (var->hasAttr<ObjCExternallyRetainedAttr>() ||
13425 isa<ParmVarDecl>(var)) {
13426 DiagID = diag::err_typecheck_arc_assign_externally_retained;
13430 DiagID = diag::err_typecheck_arr_assign_enumeration;
13434 if (
Loc != OrigLoc)
13460 DiagID = diag::err_typecheck_array_not_modifiable_lvalue;
13464 DiagID = diag::err_typecheck_non_object_not_modifiable_lvalue;
13468 DiagID = diag::err_typecheck_lvalue_casts_not_supported;
13471 llvm_unreachable(
"did not take early return for MLV_Valid");
13475 DiagID = diag::err_typecheck_expression_not_modifiable_lvalue;
13480 diag::err_typecheck_incomplete_type_not_modifiable_lvalue,
E);
13482 DiagID = diag::err_typecheck_duplicate_vector_components_not_mlvalue;
13485 llvm_unreachable(
"readonly properties should be processed differently");
13487 DiagID = diag::err_readonly_message_assignment;
13490 DiagID = diag::err_no_subobject_property_setting;
13495 if (
Loc != OrigLoc)
13517 MemberExpr *ML = dyn_cast<MemberExpr>(LHSExpr);
13518 MemberExpr *MR = dyn_cast<MemberExpr>(RHSExpr);
13520 if (!(isa<CXXThisExpr>(ML->
getBase()) && isa<CXXThisExpr>(MR->
getBase())))
13526 if (LHSDecl != RHSDecl)
13531 if (RefTy->getPointeeType().isVolatileQualified())
13534 Sema.
Diag(
Loc, diag::warn_identity_field_assign) << 0;
13544 Sema.
Diag(
Loc, diag::warn_identity_field_assign) << 1;
13568 Diag(
Loc, diag::err_opencl_half_load_store) << 1
13575 Diag(
Loc, diag::err_wasm_table_art) << 0;
13580 if (CompoundType.
isNull()) {
13599 Diag(
Loc, diag::err_objc_object_assignment)
13606 RHSCheck = ICE->getSubExpr();
13607 if (
UnaryOperator *UO = dyn_cast<UnaryOperator>(RHSCheck)) {
13608 if ((UO->getOpcode() == UO_Plus || UO->getOpcode() == UO_Minus) &&
13609 Loc.
isFileID() && UO->getOperatorLoc().isFileID() &&
13615 UO->getSubExpr()->getBeginLoc().
isFileID()) {
13616 Diag(
Loc, diag::warn_not_compound_assign)
13617 << (UO->getOpcode() == UO_Plus ?
"+" :
"-")
13618 <<
SourceRange(UO->getOperatorLoc(), UO->getOperatorLoc());
13628 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(InnerLHS);
13667 if (CompoundType.
isNull()) {
13693 if (
const CastExpr *CE = dyn_cast<CastExpr>(
E)) {
13694 if (CE->getCastKind() == CK_ToVoid) {
13700 CE->getSubExpr()->getType()->isDependentType()) {
13705 if (
const auto *CE = dyn_cast<CallExpr>(
E))
13706 return CE->getCallReturnType(Context)->isVoidType();
13726 const unsigned ForIncrementFlags =
13732 if ((ScopeFlags & ForIncrementFlags) == ForIncrementFlags ||
13733 (ScopeFlags & ForInitFlags) == ForInitFlags)
13738 while (
const BinaryOperator *BO = dyn_cast<BinaryOperator>(LHS)) {
13739 if (BO->getOpcode() != BO_Comma)
13741 LHS = BO->getRHS();
13748 Diag(
Loc, diag::warn_comma_operator);
13752 LangOpts.CPlusPlus ?
"static_cast<void>("
13784 diag::err_incomplete_type);
13805 ResType = ResAtomicType->getValueType();
13807 assert(!ResType.
isNull() &&
"no type for increment/decrement expression");
13817 : diag::warn_increment_bool)
13821 S.
Diag(OpLoc, diag::err_increment_decrement_enum) << IsInc << ResType;
13837 S.
Diag(OpLoc, S.
getLangOpts().C2y ? diag::warn_c2y_compat_increment_complex
13838 : diag::ext_c2y_increment_complex)
13855 S.
Diag(OpLoc, diag::err_typecheck_illegal_increment_decrement)
13866 S.
Diag(OpLoc, diag::warn_deprecated_increment_decrement_volatile)
13867 << IsInc << ResType;
13899 case Stmt::DeclRefExprClass:
13900 return cast<DeclRefExpr>(
E)->getDecl();
13901 case Stmt::MemberExprClass:
13905 if (cast<MemberExpr>(
E)->isArrow())
13909 case Stmt::ArraySubscriptExprClass: {
13912 Expr*
Base = cast<ArraySubscriptExpr>(
E)->getBase();
13914 if (ICE->getSubExpr()->getType()->isArrayType())
13919 case Stmt::UnaryOperatorClass: {
13931 case Stmt::ParenExprClass:
13933 case Stmt::ImplicitCastExprClass:
13937 case Stmt::CXXUuidofExprClass:
13938 return cast<CXXUuidofExpr>(
E)->getGuidDecl();
13947 AO_Vector_Element = 1,
13948 AO_Property_Expansion = 2,
13949 AO_Register_Variable = 3,
13950 AO_Matrix_Element = 4,
13965 const auto *DRE = cast<DeclRefExpr>(Op->
IgnoreParens());
13968 return Diag(OpLoc, diag::err_parens_pointer_member_function)
13972 if (isa<CXXDestructorDecl>(MD))
13973 return Diag(OpLoc, diag::err_typecheck_addrof_dtor)
13974 << DRE->getSourceRange();
13976 if (DRE->getQualifier())
13980 return Diag(OpLoc, diag::err_unqualified_pointer_member_function)
13981 << DRE->getSourceRange();
13985 return Diag(OpLoc, diag::err_unqualified_pointer_member_function)
13986 << DRE->getSourceRange()
13992 if (PTy->getKind() == BuiltinType::Overload) {
13994 if (!isa<OverloadExpr>(
E)) {
13995 assert(cast<UnaryOperator>(
E)->getOpcode() == UO_AddrOf);
13996 Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof_addrof_function)
14002 if (isa<UnresolvedMemberExpr>(Ovl))
14004 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
14012 if (PTy->getKind() == BuiltinType::UnknownAny)
14015 if (PTy->getKind() == BuiltinType::BoundMember) {
14016 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
14039 auto* VarRef = dyn_cast<DeclRefExpr>(op);
14040 if (VarRef && VarRef->refersToEnclosingVariableOrCapture()) {
14041 Diag(op->
getExprLoc(), diag::err_opencl_taking_address_capture);
14049 if (uOp->getOpcode() == UO_Deref)
14052 return uOp->getSubExpr()->getType();
14059 if (
auto *FD = dyn_cast_or_null<FunctionDecl>(dcl))
14065 unsigned AddressOfError = AO_No_Error;
14070 : diag::ext_typecheck_addrof_temporary)
14077 }
else if (isa<ObjCSelectorExpr>(op)) {
14084 if (!isa<DeclRefExpr>(op)) {
14085 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
14104 auto ReturnOrParamTypeIsIncomplete = [&](
QualType T,
14109 diag::note_ptrauth_virtual_function_pointer_incomplete_arg_ret);
14110 Diag(RetArgTypeLoc,
14111 diag::note_ptrauth_virtual_function_incomplete_arg_ret_type)
14118 bool IsIncomplete =
14120 ReturnOrParamTypeIsIncomplete(
14123 IsIncomplete |= ReturnOrParamTypeIsIncomplete(PVD->getType(), OpLoc,
14124 PVD->getBeginLoc());
14138 if (isa<PseudoObjectExpr>(op)) {
14139 AddressOfError = AO_Property_Expansion;
14141 Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof)
14145 }
else if (
const auto *DRE = dyn_cast<DeclRefExpr>(op)) {
14146 if (
const auto *MD = dyn_cast_or_null<CXXMethodDecl>(DRE->getDecl()))
14152 AddressOfError = AO_Bit_Field;
14155 AddressOfError = AO_Vector_Element;
14158 AddressOfError = AO_Matrix_Element;
14162 if (
const VarDecl *vd = dyn_cast<VarDecl>(dcl)) {
14167 AddressOfError = AO_Register_Variable;
14169 }
else if (isa<MSPropertyDecl>(dcl)) {
14170 AddressOfError = AO_Property_Expansion;
14171 }
else if (isa<FunctionTemplateDecl>(dcl)) {
14173 }
else if (isa<FieldDecl>(dcl) || isa<IndirectFieldDecl>(dcl)) {
14183 if (isa<DeclRefExpr>(op) && cast<DeclRefExpr>(op)->getQualifier() &&
14184 !isa<ParenExpr>(OrigOp.
get())) {
14189 diag::err_cannot_form_pointer_to_member_of_reference_type)
14194 while (cast<RecordDecl>(Ctx)->isAnonymousStructOrUnion())
14208 llvm_unreachable(
"Unknown/unexpected decl type");
14211 if (AddressOfError != AO_No_Error) {
14231 Diag(OpLoc, diag::err_wasm_ca_reference)
14236 Diag(OpLoc, diag::err_wasm_table_pr)
14242 CheckAddressOfPackedMember(op);
14248 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Exp);
14258 if (!FD->hasAttr<NonNullAttr>() && !Param->
hasAttr<NonNullAttr>())
14261 FD->ModifiedNonNullParams.insert(Param);
14267 bool IsAfterAmp =
false) {
14271 Op = ConvResult.
get();
14275 if (isa<CXXReinterpretCastExpr>(Op)) {
14283 Result = PT->getPointeeType();
14287 Result = OPT->getPointeeType();
14291 if (PR.
get() != Op)
14296 S.
Diag(OpLoc, diag::err_typecheck_indirection_requires_pointer)
14301 if (
Result->isVoidType()) {
14307 S.
Diag(OpLoc, diag::err_typecheck_indirection_through_void_pointer_cpp)
14310 S.
Diag(OpLoc, diag::ext_typecheck_indirection_through_void_pointer)
14327 default: llvm_unreachable(
"Unknown binop!");
14328 case tok::periodstar: Opc = BO_PtrMemD;
break;
14329 case tok::arrowstar: Opc = BO_PtrMemI;
break;
14330 case tok::star: Opc = BO_Mul;
break;
14331 case tok::slash: Opc = BO_Div;
break;
14332 case tok::percent: Opc = BO_Rem;
break;
14333 case tok::plus: Opc = BO_Add;
break;
14334 case tok::minus: Opc = BO_Sub;
break;
14335 case tok::lessless: Opc = BO_Shl;
break;
14336 case tok::greatergreater: Opc = BO_Shr;
break;
14337 case tok::lessequal: Opc = BO_LE;
break;
14338 case tok::less: Opc = BO_LT;
break;
14339 case tok::greaterequal: Opc = BO_GE;
break;
14340 case tok::greater: Opc = BO_GT;
break;
14341 case tok::exclaimequal: Opc = BO_NE;
break;
14342 case tok::equalequal: Opc = BO_EQ;
break;
14343 case tok::spaceship: Opc = BO_Cmp;
break;
14344 case tok::amp: Opc = BO_And;
break;
14345 case tok::caret: Opc = BO_Xor;
break;
14346 case tok::pipe: Opc = BO_Or;
break;
14347 case tok::ampamp: Opc = BO_LAnd;
break;
14348 case tok::pipepipe: Opc = BO_LOr;
break;
14349 case tok::equal: Opc = BO_Assign;
break;
14350 case tok::starequal: Opc = BO_MulAssign;
break;
14351 case tok::slashequal: Opc = BO_DivAssign;
break;
14352 case tok::percentequal: Opc = BO_RemAssign;
break;
14353 case tok::plusequal: Opc = BO_AddAssign;
break;
14354 case tok::minusequal: Opc = BO_SubAssign;
break;
14355 case tok::lesslessequal: Opc = BO_ShlAssign;
break;
14356 case tok::greatergreaterequal: Opc = BO_ShrAssign;
break;
14357 case tok::ampequal: Opc = BO_AndAssign;
break;
14358 case tok::caretequal: Opc = BO_XorAssign;
break;
14359 case tok::pipeequal: Opc = BO_OrAssign;
break;
14360 case tok::comma: Opc = BO_Comma;
break;
14369 default: llvm_unreachable(
"Unknown unary op!");
14370 case tok::plusplus: Opc = UO_PreInc;
break;
14371 case tok::minusminus: Opc = UO_PreDec;
break;
14372 case tok::amp: Opc = UO_AddrOf;
break;
14373 case tok::star: Opc = UO_Deref;
break;
14374 case tok::plus: Opc = UO_Plus;
break;
14375 case tok::minus: Opc = UO_Minus;
break;
14376 case tok::tilde: Opc = UO_Not;
break;
14377 case tok::exclaim: Opc = UO_LNot;
break;
14378 case tok::kw___real: Opc = UO_Real;
break;
14379 case tok::kw___imag: Opc = UO_Imag;
break;
14380 case tok::kw___extension__: Opc = UO_Extension;
break;
14396 if (!isa<ParmVarDecl>(SelfAssigned))
14398 const auto *Method =
14412 llvm::find_if(
Parent->fields(),
14414 return F->getDeclName() == Name;
14416 return (Field !=
Parent->field_end()) ? *Field :
nullptr;
14431 const DeclRefExpr *LHSDeclRef = dyn_cast<DeclRefExpr>(LHSExpr);
14432 const DeclRefExpr *RHSDeclRef = dyn_cast<DeclRefExpr>(RHSExpr);
14433 if (!LHSDeclRef || !RHSDeclRef ||
14441 if (LHSDecl != RHSDecl)
14446 if (RefTy->getPointeeType().isVolatileQualified())
14449 auto Diag = S.
Diag(OpLoc, IsBuiltin ? diag::warn_self_assignment_builtin
14450 : diag::warn_self_assignment_overloaded)
14455 Diag << 1 << SelfAssignField
14468 const Expr *ObjCPointerExpr =
nullptr, *OtherExpr =
nullptr;
14473 ObjCPointerExpr = LHS;
14477 ObjCPointerExpr = RHS;
14485 if (ObjCPointerExpr && isa<IntegerLiteral>(OtherExpr->IgnoreParenCasts())) {
14486 unsigned Diag = diag::warn_objc_pointer_masking;
14494 StringRef SelArg0 = S.getNameForSlot(0);
14495 if (SelArg0.starts_with(
"performSelector"))
14496 Diag = diag::warn_objc_pointer_masking_performSelector;
14507 if (
auto *DRE = dyn_cast<DeclRefExpr>(
E))
14508 return DRE->getDecl();
14509 if (
auto *ME = dyn_cast<MemberExpr>(
E))
14510 return ME->getMemberDecl();
14511 if (
auto *IRE = dyn_cast<ObjCIvarRefExpr>(
E))
14512 return IRE->getDecl();
14527 "Result must be a vector of half or short");
14530 "both operands expected to be a half vector");
14542 ResultTy, VK, OK, OpLoc, FPFeatures,
14543 BinOpResTy, BinOpResTy);
14547 BinOpResTy, VK, OK, OpLoc, FPFeatures);
14551static std::pair<ExprResult, ExprResult>
14561 RHS,
nullptr,
false,
14562 [Opc, LHS](
Expr *
E) {
14563 if (Opc != BO_Assign)
14570 return std::make_pair(LHS, RHS);
14577 if (!OpRequiresConversion || Ctx.
getLangOpts().NativeHalfType ||
14581 auto HasVectorOfHalfType = [&Ctx](
Expr *
E) {
14591 return VT->getElementType().getCanonicalType() == Ctx.
HalfTy;
14596 return HasVectorOfHalfType(E0) && (!E1 || HasVectorOfHalfType(E1));
14615 if (
Init.isInvalid())
14617 RHSExpr =
Init.get();
14627 bool ConvertHalfVec =
false;
14630 if (!LHS.
isUsable() || !RHS.isUsable())
14640 if (BO_Assign == Opc)
14641 Diag(OpLoc, diag::err_opencl_atomic_init) << 0 << SR;
14669 if (!ResultTy.
isNull()) {
14686 if (
auto *BE = dyn_cast<BlockExpr>(RHS.get()->IgnoreParens()))
14688 if (
auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
14689 if (VD->hasLocalStorage() &&
getCurScope()->isDeclScope(VD))
14690 BE->getBlockDecl()->setCanAvoidCopyToHeap();
14701 Opc == BO_PtrMemI);
14705 ConvertHalfVec =
true;
14713 ConvertHalfVec =
true;
14717 ConvertHalfVec =
true;
14728 ConvertHalfVec =
true;
14731 if (
const auto *BI = dyn_cast<BinaryOperator>(LHSExpr);
14732 BI && BI->isComparisonOp())
14733 Diag(OpLoc, diag::warn_consecutive_comparison);
14738 ConvertHalfVec =
true;
14742 ConvertHalfVec =
true;
14755 ConvertHalfVec =
true;
14760 ConvertHalfVec =
true;
14762 Opc == BO_DivAssign);
14763 CompLHSTy = CompResultTy;
14770 CompLHSTy = CompResultTy;
14776 ConvertHalfVec =
true;
14783 ConvertHalfVec =
true;
14792 CompLHSTy = CompResultTy;
14803 CompLHSTy = CompResultTy;
14811 VK = RHS.get()->getValueKind();
14812 OK = RHS.get()->getObjectKind();
14826 "both sides are half vectors or neither sides are");
14831 CheckArrayAccess(LHS.
get());
14832 CheckArrayAccess(RHS.get());
14838 if (ObjectSetClass && isa<ObjCIsaExpr>(LHS.
get())) {
14842 "object_setClass(")
14855 if (CompResultTy.
isNull()) {
14856 if (ConvertHalfVec)
14876 if (ConvertHalfVec)
14881 Context, LHS.
get(), RHS.get(), Opc, ResultTy, VK, OK, OpLoc,
14898 if (isLeftComp == isRightComp)
14903 bool isLeftBitwise = LHSBO && LHSBO->
isBitwiseOp();
14904 bool isRightBitwise = RHSBO && RHSBO->
isBitwiseOp();
14905 if (isLeftBitwise || isRightBitwise)
14917 Self.Diag(OpLoc, diag::warn_precedence_bitwise_rel)
14920 Self.PDiag(diag::note_precedence_silence) << OpStr,
14921 (isLeftComp ? LHSExpr : RHSExpr)->getSourceRange());
14923 Self.PDiag(diag::note_precedence_bitwise_first)
14938 Self.PDiag(diag::note_precedence_silence)
14947 if (Bop->getOpcode() == BO_LAnd) {
14950 if (!isa<StringLiteral>(Bop->getLHS()->IgnoreParenImpCasts()))
14952 }
else if (Bop->getOpcode() == BO_LOr) {
14953 if (
BinaryOperator *RBop = dyn_cast<BinaryOperator>(Bop->getRHS())) {
14956 if (RBop->getOpcode() == BO_LAnd &&
14957 isa<StringLiteral>(RBop->getRHS()->IgnoreParenImpCasts()))
14968 if (Bop->getOpcode() == BO_LAnd) {
14971 if (!isa<StringLiteral>(Bop->getRHS()->IgnoreParenImpCasts()))
14983 if (Bop->isBitwiseOp() && Bop->getOpcode() < Opc) {
14984 S.
Diag(Bop->getOperatorLoc(), diag::warn_bitwise_op_in_bitwise_op)
14986 << Bop->getSourceRange() << OpLoc;
14988 S.
PDiag(diag::note_precedence_silence)
14989 << Bop->getOpcodeStr(),
14990 Bop->getSourceRange());
14996 Expr *SubExpr, StringRef Shift) {
14998 if (Bop->getOpcode() == BO_Add || Bop->getOpcode() == BO_Sub) {
14999 StringRef Op = Bop->getOpcodeStr();
15000 S.
Diag(Bop->getOperatorLoc(), diag::warn_addition_in_bitshift)
15001 << Bop->getSourceRange() << OpLoc << Shift << Op;
15003 S.
PDiag(diag::note_precedence_silence) << Op,
15004 Bop->getSourceRange());
15020 if (Kind != OO_LessLess && Kind != OO_GreaterGreater)
15023 S.
Diag(OpLoc, diag::warn_overloaded_shift_in_comparison)
15025 << (Kind == OO_LessLess);
15027 S.
PDiag(diag::note_precedence_silence)
15028 << (Kind == OO_LessLess ?
"<<" :
">>"),
15031 S, OpLoc, S.
PDiag(diag::note_evaluate_comparison_first),
15045 if ((Opc == BO_Or || Opc == BO_Xor) &&
15053 if (Opc == BO_LOr && !OpLoc.
isMacroID()) {
15059 || Opc == BO_Shr) {
15075 assert(LHSExpr &&
"ActOnBinOp(): missing left expression");
15076 assert(RHSExpr &&
"ActOnBinOp(): missing right expression");
15081 return BuildBinOp(S, TokLoc, Opc, LHSExpr, RHSExpr);
15087 if (OverOp !=
OO_None && OverOp != OO_Equal)
15141 LHSExpr = LHS.
get();
15142 RHSExpr = RHS.
get();
15153 if (pty->getKind() == BuiltinType::PseudoObject &&
15166 RHSExpr = resolvedRHS.
get();
15180 (pty->getKind() == BuiltinType::BoundMember ||
15181 pty->getKind() == BuiltinType::Overload)) {
15182 auto *OE = dyn_cast<OverloadExpr>(LHSExpr);
15183 if (OE && !OE->hasTemplateKeyword() && !OE->hasExplicitTemplateArgs() &&
15184 llvm::any_of(OE->decls(), [](
NamedDecl *ND) {
15185 return isa<FunctionTemplateDecl>(ND);
15187 Diag(OE->getQualifier() ? OE->getQualifierLoc().getBeginLoc()
15188 : OE->getNameLoc(),
15189 diag::err_template_kw_missing)
15190 << OE->getName().getAsString() <<
"";
15197 LHSExpr = LHS.
get();
15204 if (Opc == BO_Assign && pty->getKind() == BuiltinType::Overload) {
15220 RHSExpr = resolvedRHS.
get();
15236 "Should only occur in error-recovery path.");
15242 Context, LHSExpr, RHSExpr, Opc,
15262 ResultType = RHSExpr->
getType();
15294 bool CanOverflow =
false;
15296 bool ConvertHalfVec =
false;
15305 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15312 if (Opc == UO_AddrOf)
15313 return ExprError(
Diag(OpLoc, diag::err_hlsl_operator_unsupported) << 0);
15314 if (Opc == UO_Deref)
15315 return ExprError(
Diag(OpLoc, diag::err_hlsl_operator_unsupported) << 1);
15329 Opc == UO_PreInc || Opc == UO_PostInc,
15330 Opc == UO_PreInc || Opc == UO_PreDec);
15335 CheckAddressOfNoDeref(InputExpr);
15348 CanOverflow = Opc == UO_Minus &&
15360 if (ConvertHalfVec)
15377 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15388 Diag(OpLoc, diag::ext_integer_complement_complex)
15397 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15400 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15422 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15438 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15448 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15458 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15465 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15499 "the co_await expression must be non-dependant before "
15500 "building operator co_await");
15511 if (Opc != UO_AddrOf && Opc != UO_Deref)
15512 CheckArrayAccess(Input.
get());
15518 if (Opc == UO_Deref && UO->getType()->hasAttr(attr::NoDeref) &&
15519 !isa<ArrayType>(UO->getType().getDesugaredType(
Context)) &&
15524 if (ConvertHalfVec)
15531 if (!DRE->getQualifier())
15538 if (isa<FieldDecl>(VD) || isa<IndirectFieldDecl>(VD))
15541 return Method->isImplicitObjectMemberFunction();
15547 if (!ULE->getQualifier())
15552 if (Method->isImplicitObjectMemberFunction())
15573 if (pty->getKind() == BuiltinType::PseudoObject &&
15578 if (Opc == UO_Extension)
15583 if (Opc == UO_AddrOf &&
15584 (pty->getKind() == BuiltinType::Overload ||
15585 pty->getKind() == BuiltinType::UnknownAny ||
15586 pty->getKind() == BuiltinType::BoundMember))
15611 Expr *Input,
bool IsAfterAmp) {
15650 assert(SubStmt && isa<CompoundStmt>(SubStmt) &&
"Invalid action invocation!");
15656 "cleanups within StmtExpr not correctly bound!");
15666 bool StmtExprMayBindToTemp =
false;
15669 if (
const auto *LastStmt =
15671 if (
const Expr *
Value = LastStmt->getExprStmt()) {
15672 StmtExprMayBindToTemp =
true;
15680 Expr *ResStmtExpr =
15682 if (StmtExprMayBindToTemp)
15684 return ResStmtExpr;
15707 auto *Cast = dyn_cast<ImplicitCastExpr>(
E);
15708 if (Cast && Cast->getCastKind() == CK_ARCConsumeObject)
15709 return Cast->getSubExpr();
15730 return ExprError(
Diag(BuiltinLoc, diag::err_offsetof_record_type)
15731 << ArgTy << TypeRange);
15737 diag::err_offsetof_incomplete_type, TypeRange))
15740 bool DidWarnAboutNonPOD =
false;
15745 if (OC.isBrackets) {
15750 return ExprError(
Diag(OC.LocEnd, diag::err_offsetof_array_type)
15770 Comps.push_back(
OffsetOfNode(OC.LocStart, Exprs.size(), OC.LocEnd));
15771 Exprs.push_back(Idx);
15779 Comps.push_back(
OffsetOfNode(OC.LocStart, OC.U.IdentInfo, OC.LocEnd));
15786 diag::err_offsetof_incomplete_type))
15792 return ExprError(
Diag(OC.LocEnd, diag::err_offsetof_record_type)
15804 bool IsSafe =
LangOpts.CPlusPlus11? CRD->isStandardLayout() : CRD->isPOD();
15806 LangOpts.CPlusPlus11? diag::ext_offsetof_non_standardlayout_type
15807 : diag::ext_offsetof_non_pod_type;
15810 Diag(BuiltinLoc, DiagID)
15811 <<
SourceRange(Components[0].LocStart, OC.LocEnd) << CurrentType;
15812 DidWarnAboutNonPOD =
true;
15823 MemberDecl = IndirectMemberDecl->getAnonField();
15831 Diag(BuiltinLoc, diag::err_no_member)
15832 << OC.U.IdentInfo << RD <<
SourceRange(OC.LocStart, OC.LocEnd);
15841 Diag(OC.LocEnd, diag::err_offsetof_bitfield)
15849 if (IndirectMemberDecl)
15850 Parent = cast<RecordDecl>(IndirectMemberDecl->getDeclContext());
15857 if (Paths.getDetectedVirtual()) {
15858 Diag(OC.LocEnd, diag::err_offsetof_field_of_virtual_base)
15869 if (IndirectMemberDecl) {
15870 for (
auto *FI : IndirectMemberDecl->chain()) {
15871 assert(isa<FieldDecl>(FI));
15873 cast<FieldDecl>(FI), OC.LocEnd));
15876 Comps.push_back(
OffsetOfNode(OC.LocStart, MemberDecl, OC.LocEnd));
15882 Comps, Exprs, RParenLoc);
15908 assert((CondExpr && LHSExpr && RHSExpr) &&
"Missing type argument(s)");
15913 bool CondIsTrue =
false;
15918 llvm::APSInt condEval(32);
15920 CondExpr, &condEval, diag::err_typecheck_choose_expr_requires_constant);
15923 CondExpr = CondICE.
get();
15924 CondIsTrue = condEval.getZExtValue();
15927 Expr *ActiveExpr = CondIsTrue ? LHSExpr : RHSExpr;
15929 resType = ActiveExpr->
getType();
15935 resType, VK, OK, RPLoc, CondIsTrue);
15947 Decl *ManglingContextDecl;
15948 std::tie(MCtx, ManglingContextDecl) =
15952 Block->setBlockMangling(ManglingNumber, ManglingContextDecl);
15974 "block-id should have no identifier!");
15996 "GetTypeForDeclarator made a non-function block signature");
16012 unsigned Size =
Result.getFullDataSize();
16024 QualType RetTy = Fn->getReturnType();
16026 (isa<FunctionProtoType>(Fn) && cast<FunctionProtoType>(Fn)->isVariadic());
16042 if (ExplicitSignature) {
16043 for (
unsigned I = 0,
E = ExplicitSignature.
getNumParams(); I !=
E; ++I) {
16051 Params.push_back(Param);
16057 for (
const auto &I : Fn->param_types()) {
16060 Params.push_back(Param);
16065 if (!Params.empty()) {
16076 AI->setOwningFunction(CurBlock->
TheDecl);
16079 if (AI->getIdentifier()) {
16085 if (AI->isInvalidDecl())
16104 Diag(CaretLoc, diag::err_blocks_disable) <<
LangOpts.OpenCL;
16110 "cleanups within block not correctly bound!");
16123 bool NoReturn = BD->
hasAttr<NoReturnAttr>();
16131 if (NoReturn && !Ext.getNoReturn()) Ext = Ext.
withNoReturn(
true);
16134 if (isa<FunctionNoProtoType>(FTy)) {
16169 BD->
setBody(cast<CompoundStmt>(Body));
16171 if (Body &&
getCurFunction()->HasPotentialAvailabilityViolations)
16196 Expr *CopyExpr =
nullptr;
16205 if (isa<ParmVarDecl>(Var))
16224 if (!
Result.isInvalid() &&
16225 !
Result.get()->getType().isConstQualified()) {
16227 Result.get()->getType().withConst(),
16231 if (!
Result.isInvalid()) {
16241 if (!
Result.isInvalid() &&
16242 !cast<CXXConstructExpr>(
Result.get())->getConstructor()
16245 CopyExpr =
Result.get();
16252 Captures.push_back(NewCap);
16264 if (
Result->getBlockDecl()->hasCaptures()) {
16271 for (
const auto &CI :
Result->getBlockDecl()->captures()) {
16272 const VarDecl *var = CI.getVariable();
16285 {Result},
Result->getType());
16299 Expr *OrigExpr =
E;
16349 if (
Init.isInvalid())
16365 diag::err_first_argument_to_va_arg_not_of_type_va_list)
16370 diag::err_second_parameter_to_va_arg_incomplete,
16376 diag::err_second_parameter_to_va_arg_abstract,
16383 ? diag::warn_second_parameter_to_va_arg_ownership_qualified
16384 : diag::warn_second_parameter_to_va_arg_not_pod)
16417 UnderlyingType = ET->getDecl()->getIntegerType();
16440 if (!PromoteType.
isNull())
16442 PDiag(diag::warn_second_parameter_to_va_arg_never_compatible)
16464 llvm_unreachable(
"I don't know size of pointer!");
16481 if ((SLDecl->isCompleteDefinition() || SLDecl->isBeingDefined()) &&
16490 S.
Diag(
Loc, diag::err_std_source_location_impl_not_found);
16498 S.
Diag(
Loc, diag::err_std_source_location_impl_malformed);
16502 unsigned Count = 0;
16504 StringRef Name = F->getName();
16506 if (Name ==
"_M_file_name") {
16507 if (F->getType() !=
16511 }
else if (Name ==
"_M_function_name") {
16512 if (F->getType() !=
16516 }
else if (Name ==
"_M_line") {
16517 if (!F->getType()->isIntegerType())
16520 }
else if (Name ==
"_M_column") {
16521 if (!F->getType()->isIntegerType())
16530 S.
Diag(
Loc, diag::err_std_source_location_impl_malformed);
16581 Data->BinaryData = BinaryData;
16584 Data->getDataElementCount());
16588 const Expr *SrcExpr) {
16597 auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl());
16610 bool *Complained) {
16612 *Complained =
false;
16615 bool CheckInferredResultType =
false;
16617 unsigned DiagKind = 0;
16619 bool MayHaveConvFixit =
false;
16620 bool MayHaveFunctionDiff =
false;
16631 DiagKind = diag::err_typecheck_convert_pointer_int;
16634 DiagKind = diag::ext_typecheck_convert_pointer_int;
16637 MayHaveConvFixit =
true;
16641 DiagKind = diag::err_typecheck_convert_int_pointer;
16644 DiagKind = diag::ext_typecheck_convert_int_pointer;
16647 MayHaveConvFixit =
true;
16651 diag::warn_typecheck_convert_incompatible_function_pointer_strict;
16653 MayHaveConvFixit =
true;
16657 DiagKind = diag::err_typecheck_convert_incompatible_function_pointer;
16660 DiagKind = diag::ext_typecheck_convert_incompatible_function_pointer;
16663 MayHaveConvFixit =
true;
16667 DiagKind = diag::err_arc_typecheck_convert_incompatible_pointer;
16669 DiagKind = diag::err_typecheck_convert_incompatible_pointer;
16672 DiagKind = diag::ext_typecheck_convert_incompatible_pointer;
16676 if (CheckInferredResultType) {
16682 MayHaveConvFixit =
true;
16686 DiagKind = diag::err_typecheck_convert_incompatible_pointer_sign;
16689 DiagKind = diag::ext_typecheck_convert_incompatible_pointer_sign;
16694 DiagKind = diag::err_typecheck_convert_pointer_void_func;
16697 DiagKind = diag::ext_typecheck_convert_pointer_void_func;
16709 DiagKind = diag::err_typecheck_incompatible_address_space;
16712 DiagKind = diag::err_typecheck_incompatible_ownership;
16716 llvm_unreachable(
"unknown error case for discarding qualifiers!");
16733 DiagKind = diag::err_typecheck_convert_discards_qualifiers;
16736 DiagKind = diag::ext_typecheck_convert_discards_qualifiers;
16743 DiagKind = diag::err_nested_pointer_qualifier_mismatch;
16745 DiagKind = diag::ext_nested_pointer_qualifier_mismatch;
16749 DiagKind = diag::err_typecheck_incompatible_nested_address_space;
16753 DiagKind = diag::err_int_to_block_pointer;
16757 DiagKind = diag::err_typecheck_convert_incompatible_block_pointer;
16764 for (
auto *srcProto : srcOPT->
quals()) {
16770 IFace = IFaceT->getDecl();
16775 for (
auto *dstProto : dstOPT->
quals()) {
16781 IFace = IFaceT->getDecl();
16784 DiagKind = diag::err_incompatible_qualified_id;
16787 DiagKind = diag::warn_incompatible_qualified_id;
16793 DiagKind = diag::err_incompatible_vectors;
16796 DiagKind = diag::warn_incompatible_vectors;
16800 DiagKind = diag::err_arc_weak_unavailable_assign;
16806 *Complained =
true;
16810 DiagKind = diag::err_typecheck_convert_incompatible;
16812 MayHaveConvFixit =
true;
16814 MayHaveFunctionDiff =
true;
16823 FirstType = DstType;
16824 SecondType = SrcType;
16834 FirstType = SrcType;
16835 SecondType = DstType;
16844 FDiag << FirstType << SecondType << ActionForDiag
16847 if (DiagKind == diag::ext_typecheck_convert_incompatible_pointer_sign ||
16848 DiagKind == diag::err_typecheck_convert_incompatible_pointer_sign) {
16858 if (!ConvHints.
isNull()) {
16863 if (MayHaveConvFixit) { FDiag << (
unsigned) (ConvHints.
Kind); }
16865 if (MayHaveFunctionDiff)
16869 if ((DiagKind == diag::warn_incompatible_qualified_id ||
16870 DiagKind == diag::err_incompatible_qualified_id) &&
16872 Diag(IFace->
getLocation(), diag::note_incomplete_class_and_qualified_id)
16879 if (CheckInferredResultType)
16886 *Complained =
true;
16897 return S.
Diag(
Loc, diag::err_ice_not_integral)
16916 IDDiagnoser(
unsigned DiagID)
16922 } Diagnoser(DiagID);
16957 BaseDiagnoser(BaseDiagnoser) {}
16966 return S.
Diag(
Loc, diag::err_ice_incomplete_type) <<
T;
16971 return S.
Diag(
Loc, diag::err_ice_explicit_conversion) <<
T << ConvTy;
16982 return S.
Diag(
Loc, diag::err_ice_ambiguous_conversion) <<
T;
16993 llvm_unreachable(
"conversion functions are permitted");
16995 } ConvertDiagnoser(Diagnoser);
17001 E = Converted.
get();
17006 if (isa<RecoveryExpr>(
E))
17022 E = RValueExpr.
get();
17030 if (!isa<ConstantExpr>(
E))
17040 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
17041 diag::note_invalid_subexpr_in_const_expr) {
17042 DiagLoc = Notes[0].first;
17064 EvalResult.
Diag = &Notes;
17073 if (!isa<ConstantExpr>(
E))
17079 if (Folded &&
getLangOpts().CPlusPlus11 && Notes.empty()) {
17088 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
17089 diag::note_invalid_subexpr_in_const_expr) {
17090 DiagLoc = Notes[0].first;
17094 if (!Folded || !CanFold) {
17116 class TransformToPE :
public TreeTransform<TransformToPE> {
17120 TransformToPE(
Sema &SemaRef) : BaseTransform(SemaRef) { }
17123 bool AlwaysRebuild() {
return true; }
17124 bool ReplacingOriginal() {
return true; }
17134 if (isa<FieldDecl>(
E->getDecl()) &&
17135 !SemaRef.isUnevaluatedContext())
17136 return SemaRef.Diag(
E->getLocation(),
17137 diag::err_invalid_non_static_member_use)
17140 return BaseTransform::TransformDeclRefExpr(
E);
17148 return BaseTransform::TransformUnaryOperator(
E);
17156 return SkipLambdaBody(
E, Body);
17163 "Should only transform unevaluated expressions");
17168 return TransformToPE(*this).TransformExpr(
E);
17173 "Should only transform unevaluated expressions");
17177 return TransformToPE(*this).TransformType(TInfo);
17185 LambdaContextDecl, ExprContext);
17199 Prev.isImmediateFunctionContext() || Prev.isConstantEvaluated();
17202 Prev.InImmediateEscalatingFunctionContext;
17221 if (
const auto *
E = dyn_cast<UnaryOperator>(PossibleDeref)) {
17222 if (
E->getOpcode() == UO_Deref)
17223 return CheckPossibleDeref(S,
E->getSubExpr());
17224 }
else if (
const auto *
E = dyn_cast<ArraySubscriptExpr>(PossibleDeref)) {
17225 return CheckPossibleDeref(S,
E->getBase());
17226 }
else if (
const auto *
E = dyn_cast<MemberExpr>(PossibleDeref)) {
17227 return CheckPossibleDeref(S,
E->getBase());
17228 }
else if (
const auto E = dyn_cast<DeclRefExpr>(PossibleDeref)) {
17232 Inner = Ptr->getPointeeType();
17234 Inner = Arr->getElementType();
17238 if (Inner->hasAttr(attr::NoDeref))
17248 const DeclRefExpr *DeclRef = CheckPossibleDeref(*
this,
E);
17255 Diag(
E->
getExprLoc(), diag::warn_dereference_of_noderef_type_no_decl)
17270 if (BO->getOpcode() == BO_Assign) {
17272 llvm::erase(LHSs, BO->getLHS());
17280 "Cannot mark an immediate escalating expression outside of an "
17281 "immediate escalating context");
17284 if (
auto *DeclRef =
17285 dyn_cast<DeclRefExpr>(
Call->getCallee()->IgnoreImplicit()))
17286 DeclRef->setIsImmediateEscalating(
true);
17287 }
else if (
auto *Ctr = dyn_cast<CXXConstructExpr>(
E->
IgnoreImplicit())) {
17288 Ctr->setIsImmediateEscalating(
true);
17289 }
else if (
auto *DeclRef = dyn_cast<DeclRefExpr>(
E->
IgnoreImplicit())) {
17290 DeclRef->setIsImmediateEscalating(
true);
17292 assert(
false &&
"expected an immediately escalating expression");
17295 FI->FoundImmediateEscalatingExpression =
true;
17310 if (
auto *DeclRef =
17311 dyn_cast<DeclRefExpr>(
Call->getCallee()->IgnoreImplicit()))
17320 auto CheckConstantExpressionAndKeepResult = [&]() {
17323 Eval.
Diag = &Notes;
17325 Eval,
getASTContext(), ConstantExprKind::ImmediateInvocation);
17326 if (Res && Notes.empty()) {
17327 Cached = std::move(Eval.
Val);
17335 !CheckConstantExpressionAndKeepResult()) {
17370 ExprEvalContexts.back().ImmediateInvocationCandidates.emplace_back(Res, 0);
17378 Eval.
Diag = &Notes;
17382 if (!
Result || !Notes.empty()) {
17385 if (
auto *
FunctionalCast = dyn_cast<CXXFunctionalCastExpr>(InnerExpr))
17388 if (
auto *
Call = dyn_cast<CallExpr>(InnerExpr))
17389 FD = cast<FunctionDecl>(
Call->getCalleeDecl());
17390 else if (
auto *
Call = dyn_cast<CXXConstructExpr>(InnerExpr))
17391 FD =
Call->getConstructor();
17392 else if (
auto *Cast = dyn_cast<CastExpr>(InnerExpr))
17393 FD = dyn_cast_or_null<FunctionDecl>(Cast->getConversionFunction());
17396 "could not find an immediate function in this expression");
17409 for (
auto &
Note : Notes)
17421 llvm::SmallPtrSetImpl<DeclRefExpr *> &DRSet;
17425 ComplexRemove(
Sema &SemaRef, llvm::SmallPtrSetImpl<DeclRefExpr *> &DR,
17428 4>::reverse_iterator Current)
17429 :
Base(SemaRef), DRSet(DR), IISet(II), CurrentII(Current) {}
17431 auto It = std::find_if(CurrentII, IISet.rend(),
17433 return Elem.getPointer() == E;
17439 if (It == IISet.rend()) {
17441 CurrentII->setInt(1);
17447 if (!
E->isImmediateInvocation())
17448 return Base::TransformConstantExpr(
E);
17449 RemoveImmediateInvocation(
E);
17450 return Base::TransformExpr(
E->getSubExpr());
17456 return Base::TransformCXXOperatorCallExpr(
E);
17468 if (
auto *CE = dyn_cast<ConstantExpr>(
Init))
17469 if (CE->isImmediateInvocation())
17470 RemoveImmediateInvocation(CE);
17471 return Base::TransformInitializer(
Init, NotCopyInit);
17482 bool AlwaysRebuild() {
return false; }
17483 bool ReplacingOriginal() {
return true; }
17484 bool AllowSkippingCXXConstructExpr() {
17485 bool Res = AllowSkippingFirstCXXConstructExpr;
17486 AllowSkippingFirstCXXConstructExpr =
true;
17489 bool AllowSkippingFirstCXXConstructExpr =
true;
17499 if (isa<CXXConstructExpr>(It->getPointer()->IgnoreImplicit()))
17500 Transformer.AllowSkippingFirstCXXConstructExpr =
false;
17502 ExprResult Res = Transformer.TransformExpr(It->getPointer()->getSubExpr());
17508 It->getPointer()->setSubExpr(Res.
get());
17543 llvm::SmallPtrSetImpl<DeclRefExpr *> &DRSet;
17544 SimpleRemove(llvm::SmallPtrSetImpl<DeclRefExpr *> &S) : DRSet(S) {}
17547 return DRSet.size();
17550 Visitor.TraverseStmt(
17560 if (DR->isImmediateEscalating())
17562 auto *FD = cast<FunctionDecl>(DR->getDecl());
17564 if (
const auto *MD = dyn_cast<CXXMethodDecl>(ND);
17566 ND = MD->getParent();
17573 bool ImmediateEscalating =
false;
17574 bool IsPotentiallyEvaluated =
17584 SemaRef.
Diag(DR->getBeginLoc(), diag::err_invalid_consteval_take_address)
17585 << ND << isa<CXXRecordDecl>(ND) << FD->isConsteval();
17593 if (FD->isImmediateEscalating() && !FD->isConsteval())
17609 (Rec.
ExprContext == ExpressionKind::EK_TemplateArgument ||
17617 D = diag::err_lambda_unevaluated_operand;
17623 D = diag::err_lambda_in_constant_expression;
17624 }
else if (Rec.
ExprContext == ExpressionKind::EK_TemplateArgument) {
17627 D = diag::err_lambda_in_invalid_context;
17629 llvm_unreachable(
"Couldn't infer lambda error message.");
17631 for (
const auto *L : Rec.
Lambdas)
17632 Diag(L->getBeginLoc(),
D);
17640 PrevRecord.InLifetimeExtendingContext &&
17642 PrevRecord.ForRangeLifetimeExtendTemps.append(
17653 Diag(BO->getBeginLoc(), diag::warn_deprecated_simple_assign_volatile)
17726 llvm_unreachable(
"Invalid context");
17735 if (!TT.isOSWindows() || !TT.isX86())
17773 : FD(FD), Param(Param) {}
17780 CCName =
"stdcall";
17783 CCName =
"fastcall";
17786 CCName =
"vectorcall";
17789 llvm_unreachable(
"CC does not need mangling");
17792 S.
Diag(
Loc, diag::err_cconv_incomplete_param_type)
17798 ParamIncompleteTypeDiagnoser Diagnoser(FD, Param);
17804enum class OdrUseContext {
17826 return OdrUseContext::None;
17831 Result = OdrUseContext::Used;
17835 Result = OdrUseContext::FormallyOdrUsed;
17841 Result = OdrUseContext::FormallyOdrUsed;
17846 return OdrUseContext::Dependent;
17852 if (!
Func->isConstexpr())
17855 if (
Func->isImplicitlyInstantiable() || !
Func->isUserProvided())
17857 auto *CCD = dyn_cast<CXXConstructorDecl>(
Func);
17858 return CCD && CCD->getInheritedConstructor();
17862 bool MightBeOdrUse) {
17863 assert(
Func &&
"No function?");
17865 Func->setReferenced();
17878 OdrUseContext OdrUse =
17880 if (IsRecursiveCall && OdrUse == OdrUseContext::Used)
17881 OdrUse = OdrUseContext::FormallyOdrUsed;
17885 if (
Func->isTrivial() && !
Func->hasAttr<DLLExportAttr>() &&
17886 OdrUse == OdrUseContext::Used) {
17887 if (
auto *Constructor = dyn_cast<CXXConstructorDecl>(
Func))
17888 if (Constructor->isDefaultConstructor())
17889 OdrUse = OdrUseContext::FormallyOdrUsed;
17890 if (isa<CXXDestructorDecl>(
Func))
17891 OdrUse = OdrUseContext::FormallyOdrUsed;
17898 bool NeededForConstantEvaluation =
17923 bool NeedDefinition =
17924 !IsRecursiveCall &&
17925 (OdrUse == OdrUseContext::Used ||
17926 (NeededForConstantEvaluation && !
Func->isPureVirtual()));
17933 if (NeedDefinition &&
17935 Func->getMemberSpecializationInfo()))
17942 if (NeedDefinition && !
Func->getBody()) {
17945 dyn_cast<CXXConstructorDecl>(
Func)) {
17946 Constructor = cast<CXXConstructorDecl>(Constructor->getFirstDecl());
17947 if (Constructor->isDefaulted() && !Constructor->isDeleted()) {
17948 if (Constructor->isDefaultConstructor()) {
17949 if (Constructor->isTrivial() &&
17950 !Constructor->hasAttr<DLLExportAttr>())
17953 }
else if (Constructor->isCopyConstructor()) {
17955 }
else if (Constructor->isMoveConstructor()) {
17958 }
else if (Constructor->getInheritedConstructor()) {
17962 dyn_cast<CXXDestructorDecl>(
Func)) {
17972 if (MethodDecl->isOverloadedOperator() &&
17973 MethodDecl->getOverloadedOperator() == OO_Equal) {
17974 MethodDecl = cast<CXXMethodDecl>(MethodDecl->getFirstDecl());
17975 if (MethodDecl->isDefaulted() && !MethodDecl->isDeleted()) {
17976 if (MethodDecl->isCopyAssignmentOperator())
17978 else if (MethodDecl->isMoveAssignmentOperator())
17981 }
else if (isa<CXXConversionDecl>(MethodDecl) &&
17982 MethodDecl->getParent()->isLambda()) {
17984 cast<CXXConversionDecl>(MethodDecl->getFirstDecl());
17989 }
else if (MethodDecl->isVirtual() &&
getLangOpts().AppleKext)
17993 if (
Func->isDefaulted() && !
Func->isDeleted()) {
18001 if (
Func->isImplicitlyInstantiable()) {
18003 Func->getTemplateSpecializationKindForInstantiation();
18005 bool FirstInstantiation = PointOfInstantiation.
isInvalid();
18006 if (FirstInstantiation) {
18007 PointOfInstantiation =
Loc;
18008 if (
auto *MSI =
Func->getMemberSpecializationInfo())
18009 MSI->setPointOfInstantiation(
Loc);
18012 Func->setTemplateSpecializationKind(TSK, PointOfInstantiation);
18017 PointOfInstantiation =
Loc;
18021 Func->isConstexpr()) {
18022 if (isa<CXXRecordDecl>(
Func->getDeclContext()) &&
18023 cast<CXXRecordDecl>(
Func->getDeclContext())->isLocalClass() &&
18026 std::make_pair(
Func, PointOfInstantiation));
18027 else if (
Func->isConstexpr())
18033 Func->setInstantiationIsPending(
true);
18035 std::make_pair(
Func, PointOfInstantiation));
18042 for (
auto *i :
Func->redecls()) {
18043 if (!i->isUsed(
false) && i->isImplicitlyInstantiable())
18056 Constructor->isImmediateFunction()
18061 if (
Init->isInClassMemberInitializer())
18063 MarkDeclarationsReferencedInExpr(Init->getInit());
18084 if (
LangOpts.OffloadImplicitHostDeviceTemplates &&
LangOpts.CUDAIsDevice &&
18089 if (OdrUse == OdrUseContext::Used && !
Func->isUsed(
false)) {
18091 if (!
Func->isDefined()) {
18092 if (mightHaveNonExternalLinkage(
Func))
18094 else if (
Func->getMostRecentDecl()->isInlined() &&
18096 !
Func->getMostRecentDecl()->hasAttr<GNUInlineAttr>())
18115 if (
auto *Dtor = dyn_cast<CXXDestructorDecl>(
Func)) {
18117 if (
Parent->getNumVBases() > 0 && !Dtor->getBody())
18135 const unsigned *
const FunctionScopeIndexToStopAt =
nullptr) {
18138 VarDecl *Var =
V->getPotentiallyDecomposedVarDecl();
18139 assert(Var &&
"expected a capturable variable");
18149 QualType CaptureType, DeclRefType;
18155 DeclRefType, FunctionScopeIndexToStopAt);
18171 << llvm::to_underlying(UserTarget);
18174 ? diag::note_cuda_const_var_unpromoted
18175 : diag::note_cuda_host_var);
18178 !Var->
hasAttr<CUDASharedAttr>() &&
18194 (!FD || (!FD->getDescribedFunctionTemplate() &&
18206 unsigned CapturingScopeIndex) {
18217 if (isa<ParmVarDecl>(var) &&
18218 isa<TranslationUnitDecl>(VarDC))
18231 unsigned ValueKind = isa<BindingDecl>(var) ? 1 : 0;
18232 unsigned ContextKind = 3;
18233 if (isa<CXXMethodDecl>(VarDC) &&
18234 cast<CXXRecordDecl>(VarDC->
getParent())->isLambda()) {
18236 }
else if (isa<FunctionDecl>(VarDC)) {
18238 }
else if (isa<BlockDecl>(VarDC)) {
18242 S.
Diag(loc, diag::err_reference_to_local_in_enclosing_context)
18243 << var << ValueKind << ContextKind << VarDC;
18244 S.
Diag(var->getLocation(), diag::note_entity_declared_at)
18253 bool &SubCapturesAreNested,
18259 SubCapturesAreNested =
true;
18272 !(isa<LambdaScopeInfo>(CSI) &&
18273 !cast<LambdaScopeInfo>(CSI)->lambdaCaptureShouldBeConst()) &&
18274 !(isa<CapturedRegionScopeInfo>(CSI) &&
18275 cast<CapturedRegionScopeInfo>(CSI)->CapRegionKind ==
CR_OpenMP))
18307 assert((isa<VarDecl, BindingDecl>(Var)) &&
18308 "Only variables and structured bindings can be captured");
18310 bool IsBlock = isa<BlockScopeInfo>(CSI);
18311 bool IsLambda = isa<LambdaScopeInfo>(CSI);
18319 S.
Diag(
Loc, diag::err_lambda_capture_anonymous_var);
18328 S.
Diag(
Loc, diag::err_ref_vm_type);
18336 if (VTTy->getDecl()->hasFlexibleArrayMember()) {
18339 S.
Diag(
Loc, diag::err_ref_flexarray_type);
18341 S.
Diag(
Loc, diag::err_lambda_capture_flexarray_type) << Var;
18347 const bool HasBlocksAttr = Var->
hasAttr<BlocksAttr>();
18350 if (HasBlocksAttr && (IsLambda || isa<CapturedRegionScopeInfo>(CSI))) {
18352 S.
Diag(
Loc, diag::err_capture_block_variable) << Var << !IsLambda;
18361 S.
Diag(
Loc, diag::err_opencl_block_ref_block);
18365 if (isa<BindingDecl>(Var)) {
18372 ? diag::warn_cxx17_compat_capture_binding
18373 : diag::ext_capture_binding)
18387 bool ByRef =
false;
18393 if (BuildAndDiagnose) {
18394 S.
Diag(
Loc, diag::err_ref_array_type);
18405 if (BuildAndDiagnose) {
18406 S.
Diag(
Loc, diag::err_arc_autoreleasing_capture)
18422 if (BuildAndDiagnose) {
18424 S.
Diag(
Loc, diag::warn_block_capture_autoreleasing);
18425 S.
Diag(VarLoc, diag::note_declare_parameter_strong);
18430 const bool HasBlocksAttr = Var->
hasAttr<BlocksAttr>();
18439 DeclRefType = CaptureType;
18443 if (BuildAndDiagnose)
18453 const bool BuildAndDiagnose,
QualType &CaptureType,
QualType &DeclRefType,
18480 CaptureType = DeclRefType;
18483 if (BuildAndDiagnose)
18484 RSI->
addCapture(Var,
false, ByRef, RefersToCapturedVariable,
18494 const bool RefersToCapturedVariable,
18499 bool ByRef =
false;
18503 ByRef = (LSI->
ImpCaptureStyle == LambdaScopeInfo::ImpCap_LambdaByref);
18508 S.
Diag(
Loc, diag::err_wasm_ca_reference) << 0;
18539 if (!RefType->getPointeeType()->isFunctionType())
18546 if (BuildAndDiagnose) {
18547 S.
Diag(
Loc, diag::err_arc_autoreleasing_capture) << 1;
18557 if (!
Invalid && BuildAndDiagnose) {
18561 diag::err_capture_of_incomplete_or_sizeless_type,
18565 diag::err_capture_of_abstract_type))
18586 if (BuildAndDiagnose)
18587 LSI->
addCapture(Var,
false, ByRef, RefersToCapturedVariable,
18599 if (
T.isTriviallyCopyableType(
Context))
18603 if (!(RD = RD->getDefinition()))
18605 if (RD->hasSimpleCopyConstructor())
18607 if (RD->hasUserDeclaredCopyConstructor())
18609 if (Ctor->isCopyConstructor())
18610 return !Ctor->isDeleted();
18630 if (ShouldOfferCopyFix) {
18634 FixBuffer.assign({Separator, Var->
getName()});
18635 Sema.
Diag(VarInsertLoc, diag::note_lambda_variable_capture_fixit)
18640 FixBuffer.assign({Separator,
"&", Var->
getName()});
18641 Sema.
Diag(VarInsertLoc, diag::note_lambda_variable_capture_fixit)
18653 return !C.isThisCapture() && !C.isInitCapture();
18662 if (ShouldOfferCopyFix) {
18663 bool CanDefaultCopyCapture =
true;
18672 if (CanDefaultCopyCapture && llvm::none_of(LSI->
Captures, [](
Capture &
C) {
18673 return !C.isThisCapture() && !C.isInitCapture() && C.isCopyCapture();
18675 FixBuffer.assign({
"=", Separator});
18676 Sema.
Diag(DefaultInsertLoc, diag::note_lambda_default_capture_fixit)
18685 return !C.isInitCapture() && C.isReferenceCapture() &&
18686 !C.isThisCapture();
18688 FixBuffer.assign({
"&", Separator});
18689 Sema.
Diag(DefaultInsertLoc, diag::note_lambda_default_capture_fixit)
18698 QualType &DeclRefType,
const unsigned *
const FunctionScopeIndexToStopAt) {
18721 const auto *VD = dyn_cast<VarDecl>(Var);
18723 if (VD->isInitCapture())
18728 assert(VD &&
"Cannot capture a null variable");
18730 const unsigned MaxFunctionScopesIndex = FunctionScopeIndexToStopAt
18734 if (FunctionScopeIndexToStopAt) {
18736 while (FSIndex != MaxFunctionScopesIndex) {
18744 bool IsGlobal = !VD->hasLocalStorage();
18745 if (IsGlobal && !(
LangOpts.OpenMP &&
18746 OpenMP().isOpenMPCapturedDecl(Var,
true,
18747 MaxFunctionScopesIndex)))
18750 if (isa<VarDecl>(Var))
18761 CaptureType = Var->
getType();
18763 bool Nested =
false;
18765 unsigned FunctionScopesIndex = MaxFunctionScopesIndex;
18770 LSI = dyn_cast_or_null<LambdaScopeInfo>(
18773 bool IsInScopeDeclarationContext =
18784 if (IsInScopeDeclarationContext &&
18785 FunctionScopesIndex == MaxFunctionScopesIndex && VarDC == DC)
18791 !IsInScopeDeclarationContext
18794 BuildAndDiagnose, *
this);
18800 FunctionScopesIndex = MaxFunctionScopesIndex - 1;
18819 if (
const auto *Parm = dyn_cast<ParmVarDecl>(Var);
18820 Parm && Parm->getDeclContext() == DC)
18828 if (BuildAndDiagnose) {
18831 Diag(ExprLoc, diag::err_lambda_impcap) << Var;
18846 if (
ParmVarDecl *PVD = dyn_cast_or_null<ParmVarDecl>(Var))
18847 QTy = PVD->getOriginalType();
18852 if (
auto *RSI = dyn_cast<CapturedRegionScopeInfo>(CSI)) {
18858 if (isa<BindingDecl>(Var)) {
18859 if (BuildAndDiagnose) {
18860 Diag(ExprLoc, diag::err_capture_binding_openmp) << Var;
18866 Var, RSI->OpenMPLevel, RSI->OpenMPCaptureLevel);
18871 if (IsOpenMPPrivateDecl != OMPC_unknown &&
18874 if (
ParmVarDecl *PVD = dyn_cast_or_null<ParmVarDecl>(Var))
18875 QTy = PVD->getOriginalType();
18877 E =
OpenMP().getNumberOfConstructScopes(RSI->OpenMPLevel);
18879 auto *OuterRSI = cast<CapturedRegionScopeInfo>(
18881 assert(RSI->OpenMPLevel == OuterRSI->OpenMPLevel &&
18882 "Wrong number of captured regions associated with the "
18883 "OpenMP construct.");
18888 IsOpenMPPrivateDecl != OMPC_private &&
18890 RSI->OpenMPCaptureLevel);
18894 Var, RSI->OpenMPLevel, RSI->OpenMPCaptureLevel);
18900 OpenMP().adjustOpenMPTargetScopeIndex(FunctionScopesIndex,
18903 if (IsTargetCap || IsOpenMPPrivateDecl == OMPC_private ||
18904 (IsGlobal && !IsGlobalCap)) {
18905 Nested = !IsTargetCap;
18920 if (BuildAndDiagnose) {
18921 Diag(ExprLoc, diag::err_lambda_impcap) << Var;
18923 auto *LSI = cast<LambdaScopeInfo>(CSI);
18943 FunctionScopesIndex--;
18944 if (IsInScopeDeclarationContext)
18946 }
while (!VarDC->
Equals(DC));
18954 for (
unsigned I = ++FunctionScopesIndex, N = MaxFunctionScopesIndex + 1; I != N;
18967 if (
Invalid && !BuildAndDiagnose)
18972 DeclRefType, Nested, *
this,
Invalid);
18976 RSI, Var, ExprLoc, BuildAndDiagnose, CaptureType, DeclRefType, Nested,
18977 Kind, I == N - 1, *
this,
Invalid);
18983 DeclRefType, Nested, Kind, EllipsisLoc,
18988 if (
Invalid && !BuildAndDiagnose)
19000 DeclRefType,
nullptr);
19007 false, CaptureType,
19008 DeclRefType,
nullptr);
19017 false, CaptureType,
19018 DeclRefType,
nullptr))
19021 return DeclRefType;
19029class CopiedTemplateArgs {
19033 template<
typename RefExpr>
19034 CopiedTemplateArgs(RefExpr *
E) : HasArgs(
E->hasExplicitTemplateArgs()) {
19036 E->copyTemplateArgumentsInto(TemplateArgStorage);
19039#ifdef __has_cpp_attribute
19040#
if __has_cpp_attribute(clang::lifetimebound)
19041 [[clang::lifetimebound]]
19045 return HasArgs ? &TemplateArgStorage :
nullptr;
19071 auto Rebuild = [&](
Expr *Sub) {
19076 auto IsPotentialResultOdrUsed = [&](
NamedDecl *
D) {
19079 auto *VD = dyn_cast<VarDecl>(
D);
19102 llvm_unreachable(
"unexpected non-odr-use-reason");
19106 if (VD->getType()->isReferenceType())
19108 if (
auto *RD = VD->getType()->getAsCXXRecordDecl())
19109 if (RD->hasMutableFields())
19111 if (!VD->isUsableInConstantExpressions(S.
Context))
19116 if (VD->getType()->isReferenceType())
19124 auto MarkNotOdrUsed = [&] {
19127 LSI->markVariableExprAsNonODRUsed(
E);
19134 case Expr::DeclRefExprClass: {
19135 auto *DRE = cast<DeclRefExpr>(
E);
19136 if (DRE->isNonOdrUse() || IsPotentialResultOdrUsed(DRE->getDecl()))
19142 S.
Context, DRE->getQualifierLoc(), DRE->getTemplateKeywordLoc(),
19143 DRE->getDecl(), DRE->refersToEnclosingVariableOrCapture(),
19144 DRE->getNameInfo(), DRE->getType(), DRE->getValueKind(),
19145 DRE->getFoundDecl(), CopiedTemplateArgs(DRE), NOUR);
19148 case Expr::FunctionParmPackExprClass: {
19149 auto *FPPE = cast<FunctionParmPackExpr>(
E);
19153 if (IsPotentialResultOdrUsed(
D))
19164 case Expr::ArraySubscriptExprClass: {
19165 auto *ASE = cast<ArraySubscriptExpr>(
E);
19170 if (!
Base.isUsable())
19172 Expr *LHS = ASE->getBase() == ASE->getLHS() ?
Base.get() : ASE->getLHS();
19173 Expr *RHS = ASE->getBase() == ASE->getRHS() ?
Base.get() : ASE->getRHS();
19176 ASE->getRBracketLoc());
19179 case Expr::MemberExprClass: {
19180 auto *ME = cast<MemberExpr>(
E);
19183 if (isa<FieldDecl>(ME->getMemberDecl())) {
19185 if (!
Base.isUsable())
19188 S.
Context,
Base.get(), ME->isArrow(), ME->getOperatorLoc(),
19189 ME->getQualifierLoc(), ME->getTemplateKeywordLoc(),
19190 ME->getMemberDecl(), ME->getFoundDecl(), ME->getMemberNameInfo(),
19191 CopiedTemplateArgs(ME), ME->getType(), ME->getValueKind(),
19192 ME->getObjectKind(), ME->isNonOdrUse());
19195 if (ME->getMemberDecl()->isCXXInstanceMember())
19200 if (ME->isNonOdrUse() || IsPotentialResultOdrUsed(ME->getMemberDecl()))
19206 S.
Context, ME->getBase(), ME->isArrow(), ME->getOperatorLoc(),
19207 ME->getQualifierLoc(), ME->getTemplateKeywordLoc(), ME->getMemberDecl(),
19208 ME->getFoundDecl(), ME->getMemberNameInfo(), CopiedTemplateArgs(ME),
19209 ME->getType(), ME->getValueKind(), ME->getObjectKind(), NOUR);
19212 case Expr::BinaryOperatorClass: {
19213 auto *BO = cast<BinaryOperator>(
E);
19214 Expr *LHS = BO->getLHS();
19215 Expr *RHS = BO->getRHS();
19217 if (BO->getOpcode() == BO_PtrMemD) {
19219 if (!Sub.isUsable())
19221 BO->setLHS(Sub.get());
19223 }
else if (BO->getOpcode() == BO_Comma) {
19225 if (!Sub.isUsable())
19227 BO->setRHS(Sub.get());
19235 case Expr::ParenExprClass: {
19236 auto *PE = cast<ParenExpr>(
E);
19238 if (!Sub.isUsable())
19240 return S.
ActOnParenExpr(PE->getLParen(), PE->getRParen(), Sub.get());
19245 case Expr::ConditionalOperatorClass: {
19246 auto *CO = cast<ConditionalOperator>(
E);
19256 LHS = CO->getLHS();
19258 RHS = CO->getRHS();
19260 CO->getCond(), LHS.
get(), RHS.
get());
19265 case Expr::UnaryOperatorClass: {
19266 auto *UO = cast<UnaryOperator>(
E);
19267 if (UO->getOpcode() != UO_Extension)
19270 if (!Sub.isUsable())
19272 return S.
BuildUnaryOp(
nullptr, UO->getOperatorLoc(), UO_Extension,
19279 case Expr::GenericSelectionExprClass: {
19280 auto *GSE = cast<GenericSelectionExpr>(
E);
19283 bool AnyChanged =
false;
19284 for (
Expr *OrigAssocExpr : GSE->getAssocExprs()) {
19285 ExprResult AssocExpr = Rebuild(OrigAssocExpr);
19289 AssocExprs.push_back(AssocExpr.
get());
19292 AssocExprs.push_back(OrigAssocExpr);
19296 void *ExOrTy =
nullptr;
19297 bool IsExpr = GSE->isExprPredicate();
19299 ExOrTy = GSE->getControllingExpr();
19301 ExOrTy = GSE->getControllingType();
19303 GSE->getGenericLoc(), GSE->getDefaultLoc(),
19304 GSE->getRParenLoc(), IsExpr, ExOrTy,
19305 GSE->getAssocTypeSourceInfos(), AssocExprs)
19313 case Expr::ChooseExprClass: {
19314 auto *CE = cast<ChooseExpr>(
E);
19324 if (!LHS.
get() && !RHS.
get())
19327 LHS = CE->getLHS();
19329 RHS = CE->getRHS();
19332 RHS.
get(), CE->getRParenLoc());
19336 case Expr::ConstantExprClass: {
19337 auto *CE = cast<ConstantExpr>(
E);
19339 if (!Sub.isUsable())
19346 case Expr::ImplicitCastExprClass: {
19347 auto *ICE = cast<ImplicitCastExpr>(
E);
19351 switch (ICE->getCastKind()) {
19353 case CK_DerivedToBase:
19354 case CK_UncheckedDerivedToBase: {
19355 ExprResult Sub = Rebuild(ICE->getSubExpr());
19356 if (!Sub.isUsable())
19360 ICE->getValueKind(), &
Path);
19419 for (
Expr *
E : LocalMaybeODRUseExprs) {
19420 if (
auto *DRE = dyn_cast<DeclRefExpr>(
E)) {
19422 DRE->getLocation(), *
this);
19423 }
else if (
auto *ME = dyn_cast<MemberExpr>(
E)) {
19426 }
else if (
auto *FP = dyn_cast<FunctionParmPackExpr>(
E)) {
19430 llvm_unreachable(
"Unexpected expression");
19435 "MarkVarDeclODRUsed failed to cleanup MaybeODRUseExprs?");
19444 const bool RefersToEnclosingScope =
19447 if (RefersToEnclosingScope) {
19462 assert(
E &&
"Capture variable should be used in an expression.");
19473 assert((!
E || isa<DeclRefExpr>(
E) || isa<MemberExpr>(
E) ||
19474 isa<FunctionParmPackExpr>(
E)) &&
19475 "Invalid Expr argument to DoMarkVarDeclReferenced");
19486 bool UsableInConstantExpr =
19498 bool NeededForConstantEvaluation =
19501 bool NeedDefinition =
19502 OdrUse == OdrUseContext::Used || NeededForConstantEvaluation;
19504 assert(!isa<VarTemplatePartialSpecializationDecl>(Var) &&
19505 "Can't instantiate a partial template specialization.");
19511 !isa<VarTemplateSpecializationDecl>(Var))
19522 bool TryInstantiating =
19526 if (TryInstantiating) {
19529 bool FirstInstantiation = PointOfInstantiation.
isInvalid();
19530 if (FirstInstantiation) {
19531 PointOfInstantiation =
Loc;
19533 MSI->setPointOfInstantiation(PointOfInstantiation);
19539 if (UsableInConstantExpr) {
19548 if (
auto *DRE = dyn_cast_or_null<DeclRefExpr>(
E))
19549 DRE->setDecl(DRE->getDecl());
19550 else if (
auto *ME = dyn_cast_or_null<MemberExpr>(
E))
19551 ME->setMemberDecl(ME->getMemberDecl());
19552 }
else if (FirstInstantiation) {
19554 .push_back(std::make_pair(Var, PointOfInstantiation));
19556 bool Inserted =
false;
19558 auto Iter = llvm::find_if(
19560 return P.first == Var;
19562 if (
Iter != I.end()) {
19575 if (isa<VarTemplateSpecializationDecl>(Var) && !Inserted)
19577 .push_back(std::make_pair(Var, PointOfInstantiation));
19601 if (
DeclRefExpr *DRE = dyn_cast_or_null<DeclRefExpr>(
E))
19602 if (DRE->isNonOdrUse())
19604 if (
MemberExpr *ME = dyn_cast_or_null<MemberExpr>(
E))
19605 if (ME->isNonOdrUse())
19609 case OdrUseContext::None:
19612 assert((!
E || isa<FunctionParmPackExpr>(
E) ||
19614 "missing non-odr-use marking for unevaluated decl ref");
19617 case OdrUseContext::FormallyOdrUsed:
19622 case OdrUseContext::Used:
19631 case OdrUseContext::Dependent:
19649 if (OdrUse == OdrUseContext::Used) {
19650 QualType CaptureType, DeclRefType;
19656 }
else if (OdrUse == OdrUseContext::Dependent) {
19672 auto *ID = dyn_cast<DeclRefExpr>(
E);
19673 if (!ID || ID->isTypeDependent() || !ID->refersToEnclosingVariableOrCapture())
19680 auto IsDependent = [&]() {
19682 auto *LSI = dyn_cast<sema::LambdaScopeInfo>(
Scope);
19687 LSI->AfterParameterList)
19690 const auto *MD = LSI->CallOperator;
19691 if (MD->getType().isNull())
19695 if (!Ty || !MD->isExplicitObjectMemberFunction() ||
19699 if (
auto *
C = LSI->CaptureMap.count(
D) ? &LSI->getCapture(
D) :
nullptr) {
19700 if (
C->isCopyCapture())
19705 if (LSI->ImpCaptureStyle == LambdaScopeInfo::ImpCap_LambdaByval)
19711 ID->setCapturedByCopyInLambdaWithExplicitObjectParameter(
19717 bool MightBeOdrUse,
19722 if (
VarDecl *Var = dyn_cast<VarDecl>(
D)) {
19748 bool IsVirtualCall = MD->
isVirtual() &&
19750 if (!IsVirtualCall)
19765 bool OdrUse =
true;
19766 if (
const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(
E->getDecl()))
19767 if (Method->isVirtual() &&
19771 if (
auto *FD = dyn_cast<FunctionDecl>(
E->getDecl())) {
19776 !FD->isDependentContext())
19790 bool MightBeOdrUse =
true;
19792 if (
CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(
E->getMemberDecl()))
19793 if (Method->isPureVirtual())
19794 MightBeOdrUse =
false;
19797 E->getMemberLoc().isValid() ?
E->getMemberLoc() :
E->
getBeginLoc();
19813 bool MightBeOdrUse) {
19814 if (MightBeOdrUse) {
19815 if (
auto *VD = dyn_cast<VarDecl>(
D)) {
19820 if (
auto *FD = dyn_cast<FunctionDecl>(
D)) {
19848bool MarkReferencedDecls::TraverseTemplateArgument(
19862 return Inherited::TraverseTemplateArgument(Arg);
19866 MarkReferencedDecls Marker(*
this,
Loc);
19867 Marker.TraverseType(
T);
19873class EvaluatedExprMarker :
public UsedDeclVisitor<EvaluatedExprMarker> {
19876 bool SkipLocalVariables;
19879 EvaluatedExprMarker(
Sema &S,
bool SkipLocalVariables,
19881 : Inherited(S), SkipLocalVariables(SkipLocalVariables), StopAt(StopAt) {}
19887 void Visit(
Expr *
E) {
19888 if (llvm::is_contained(StopAt,
E))
19890 Inherited::Visit(
E);
19900 if (SkipLocalVariables) {
19901 if (
VarDecl *VD = dyn_cast<VarDecl>(
E->getDecl()))
19902 if (VD->hasLocalStorage())
19914 Visit(
E->getBase());
19920 bool SkipLocalVariables,
19922 EvaluatedExprMarker(*
this, SkipLocalVariables, StopAt).Visit(
E);
19944 if (
auto *VD = dyn_cast_or_null<VarDecl>(
19946 if (VD->isConstexpr() ||
19947 (VD->isStaticDataMember() && VD->isFirstDecl() && !VD->isInline()))
20019 class CallReturnIncompleteDiagnoser :
public TypeDiagnoser {
20025 : FD(FD), CE(CE) { }
20029 S.
Diag(
Loc, diag::err_call_incomplete_return)
20034 S.
Diag(
Loc, diag::err_call_function_incomplete_return)
20039 } Diagnoser(FD, CE);
20052 unsigned diagnostic = diag::warn_condition_is_assignment;
20053 bool IsOrAssign =
false;
20056 if (Op->getOpcode() != BO_Assign && Op->getOpcode() != BO_OrAssign)
20059 IsOrAssign = Op->getOpcode() == BO_OrAssign;
20067 if (
ObjC().isSelfExpr(Op->getLHS()) && ME->getMethodFamily() ==
OMF_init)
20068 diagnostic = diag::warn_condition_is_idiomatic_assignment;
20072 diagnostic = diag::warn_condition_is_idiomatic_assignment;
20075 Loc = Op->getOperatorLoc();
20077 if (Op->getOperator() != OO_Equal && Op->getOperator() != OO_PipeEqual)
20080 IsOrAssign = Op->getOperator() == OO_PipeEqual;
20081 Loc = Op->getOperatorLoc();
20093 Diag(
Loc, diag::note_condition_assign_silence)
20098 Diag(
Loc, diag::note_condition_or_assign_to_comparison)
20101 Diag(
Loc, diag::note_condition_assign_to_comparison)
20117 if (opE->getOpcode() == BO_EQ &&
20118 opE->getLHS()->IgnoreParenImpCasts()->isModifiableLvalue(
Context)
20124 Diag(
Loc, diag::note_equality_comparison_silence)
20127 Diag(
Loc, diag::note_equality_comparison_to_assign)
20133 bool IsConstexpr) {
20135 if (
ParenExpr *parenE = dyn_cast<ParenExpr>(
E))
20153 Diag(
Loc, diag::err_typecheck_statement_requires_scalar)
20157 CheckBoolLikeConversion(
E,
Loc);
20203 struct RebuildUnknownAnyFunction
20204 :
StmtVisitor<RebuildUnknownAnyFunction, ExprResult> {
20208 RebuildUnknownAnyFunction(
Sema &S) : S(S) {}
20211 llvm_unreachable(
"unexpected statement!");
20222 template <
class T>
ExprResult rebuildSugarExpr(
T *
E) {
20226 Expr *SubExpr = SubResult.
get();
20227 E->setSubExpr(SubExpr);
20235 return rebuildSugarExpr(
E);
20239 return rebuildSugarExpr(
E);
20246 Expr *SubExpr = SubResult.
get();
20247 E->setSubExpr(SubExpr);
20255 if (!isa<FunctionDecl>(VD))
return VisitExpr(
E);
20261 !(isa<CXXMethodDecl>(VD) &&
20262 cast<CXXMethodDecl>(VD)->isInstance()))
20269 return resolveDecl(
E,
E->getMemberDecl());
20273 return resolveDecl(
E,
E->getDecl());
20291 struct RebuildUnknownAnyExpr
20292 :
StmtVisitor<RebuildUnknownAnyExpr, ExprResult> {
20303 llvm_unreachable(
"unexpected statement!");
20317 template <
class T>
ExprResult rebuildSugarExpr(
T *
E) {
20320 Expr *SubExpr = SubResult.
get();
20321 E->setSubExpr(SubExpr);
20329 return rebuildSugarExpr(
E);
20333 return rebuildSugarExpr(
E);
20339 S.
Diag(
E->getOperatorLoc(), diag::err_unknown_any_addrof)
20344 if (isa<CallExpr>(
E->getSubExpr())) {
20345 S.
Diag(
E->getOperatorLoc(), diag::err_unknown_any_addrof_call)
20358 E->setSubExpr(SubResult.
get());
20367 return resolveDecl(
E,
E->getMemberDecl());
20371 return resolveDecl(
E,
E->getDecl());
20378 Expr *CalleeExpr =
E->getCallee();
20382 FK_FunctionPointer,
20389 assert(isa<CXXMemberCallExpr>(
E) || isa<CXXOperatorCallExpr>(
E));
20390 Kind = FK_MemberFunction;
20394 Kind = FK_FunctionPointer;
20397 Kind = FK_BlockPointer;
20403 unsigned diagID = diag::err_func_returning_array_function;
20404 if (Kind == FK_BlockPointer)
20405 diagID = diag::err_block_returning_array_function;
20441 if (ParamTypes.empty() && Proto->
isVariadic()) {
20442 ArgTypes.reserve(
E->getNumArgs());
20443 for (
unsigned i = 0, e =
E->getNumArgs(); i != e; ++i) {
20446 ParamTypes = ArgTypes;
20457 case FK_MemberFunction:
20461 case FK_FunctionPointer:
20465 case FK_BlockPointer:
20471 ExprResult CalleeResult = Visit(CalleeExpr);
20473 E->setCallee(CalleeResult.
get());
20490 Method->setReturnType(DestType);
20502 if (
E->getCastKind() == CK_FunctionToPointerDecay) {
20516 }
else if (
E->getCastKind() == CK_LValueToRValue) {
20520 assert(isa<BlockPointerType>(
E->
getType()));
20533 llvm_unreachable(
"Unhandled cast type!");
20566 if (DRE && Proto && Proto->getParamTypes().empty() && Proto->isVariadic()) {
20570 FD->getNameInfo().getName(), DestType, FD->getTypeSourceInfo(),
20572 false , FD->hasPrototype(),
20575 if (FD->getQualifier())
20579 for (
const auto &AI : FT->param_types()) {
20583 Params.push_back(Param);
20585 NewFD->setParams(Params);
20592 if (MD->isInstance()) {
20602 }
else if (isa<VarDecl>(VD)) {
20632 diag::err_typecheck_cast_to_incomplete))
20647 return RebuildUnknownAnyExpr(*
this, ToType).Visit(
E);
20654 ExplicitCastExpr *castArg = dyn_cast<ExplicitCastExpr>(arg->IgnoreParens());
20663 assert(!arg->hasPlaceholderType());
20675 unsigned diagID = diag::err_uncasted_use_of_unknown_any;
20678 if (
CallExpr *call = dyn_cast<CallExpr>(
E)) {
20679 E = call->getCallee();
20680 diagID = diag::err_uncasted_call_of_unknown_any;
20689 loc = ref->getLocation();
20690 d = ref->getDecl();
20691 }
else if (
MemberExpr *mem = dyn_cast<MemberExpr>(
E)) {
20692 loc = mem->getMemberLoc();
20693 d = mem->getMemberDecl();
20695 diagID = diag::err_uncasted_call_of_unknown_any;
20696 loc = msg->getSelectorStartLoc();
20697 d = msg->getMethodDecl();
20699 S.
Diag(loc, diag::err_uncasted_send_to_unknown_any_method)
20700 <<
static_cast<unsigned>(msg->isClassMessage()) << msg->getSelector()
20727 if (!placeholderType)
return E;
20729 switch (placeholderType->
getKind()) {
20730 case BuiltinType::UnresolvedTemplate: {
20731 auto *ULE = cast<UnresolvedLookupExpr>(
E);
20736 const bool IsTypeAliasTemplateDecl = isa<TypeAliasTemplateDecl>(Temp);
20739 Diag(NameInfo.
getLoc(), diag::err_template_kw_refers_to_type_template)
20741 <<
Loc.getSourceRange() << IsTypeAliasTemplateDecl;
20743 Diag(NameInfo.
getLoc(), diag::err_template_kw_refers_to_type_template)
20745 << IsTypeAliasTemplateDecl;
20747 << IsTypeAliasTemplateDecl;
20753 case BuiltinType::Overload: {
20773 case BuiltinType::BoundMember: {
20778 if (isa<CXXPseudoDestructorExpr>(BME)) {
20779 PD =
PDiag(diag::err_dtor_expr_without_call) << 1;
20780 }
else if (
const auto *ME = dyn_cast<MemberExpr>(BME)) {
20781 if (ME->getMemberNameInfo().getName().getNameKind() ==
20783 PD =
PDiag(diag::err_dtor_expr_without_call) << 0;
20791 case BuiltinType::ARCUnbridgedCast: {
20798 case BuiltinType::UnknownAny:
20802 case BuiltinType::PseudoObject:
20805 case BuiltinType::BuiltinFn: {
20809 auto *FD = cast<FunctionDecl>(DRE->
getDecl());
20810 unsigned BuiltinID = FD->getBuiltinID();
20811 if (BuiltinID == Builtin::BI__noop) {
20813 CK_BuiltinFnToFnPtr)
20826 ? diag::err_use_of_unaddressable_function
20827 : diag::warn_cxx20_compat_use_of_unaddressable_function);
20828 if (FD->isImplicitlyInstantiable()) {
20855 case BuiltinType::IncompleteMatrixIdx:
20859 diag::err_matrix_incomplete_index);
20863 case BuiltinType::ArraySection:
20865 << cast<ArraySectionExpr>(
E)->isOMPArraySection();
20869 case BuiltinType::OMPArrayShaping:
20872 case BuiltinType::OMPIterator:
20876#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
20877 case BuiltinType::Id:
20878#include "clang/Basic/OpenCLImageTypes.def"
20879#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
20880 case BuiltinType::Id:
20881#include "clang/Basic/OpenCLExtensionTypes.def"
20882#define SVE_TYPE(Name, Id, SingletonId) \
20883 case BuiltinType::Id:
20884#include "clang/Basic/AArch64SVEACLETypes.def"
20885#define PPC_VECTOR_TYPE(Name, Id, Size) \
20886 case BuiltinType::Id:
20887#include "clang/Basic/PPCTypes.def"
20888#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
20889#include "clang/Basic/RISCVVTypes.def"
20890#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
20891#include "clang/Basic/WebAssemblyReferenceTypes.def"
20892#define AMDGPU_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
20893#include "clang/Basic/AMDGPUTypes.def"
20894#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
20895#include "clang/Basic/HLSLIntangibleTypes.def"
20896#define BUILTIN_TYPE(Id, SingletonId) case BuiltinType::Id:
20897#define PLACEHOLDER_TYPE(Id, SingletonId)
20898#include "clang/AST/BuiltinTypes.def"
20902 llvm_unreachable(
"invalid placeholder type!");
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.
Defines the C++ template declaration subclasses.
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 for CUDA constructs.
static Sema::AssignConvertType checkObjCPointerTypesForAssignment(Sema &S, QualType LHSType, QualType RHSType)
checkObjCPointerTypesForAssignment - Compares two objective-c pointer types for assignment compatibil...
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 captureInCapturedRegion(CapturedRegionScopeInfo *RSI, ValueDecl *Var, SourceLocation Loc, const bool BuildAndDiagnose, QualType &CaptureType, QualType &DeclRefType, const bool RefersToCapturedVariable, Sema::TryCaptureKind Kind, bool IsTopScope, Sema &S, bool Invalid)
Capture the given variable in the captured region.
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 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 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 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 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 NamedDecl * getDeclFromExpr(Expr *E)
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 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 void emitEmptyLookupTypoDiagnostic(const TypoCorrection &TC, Sema &SemaRef, const CXXScopeSpec &SS, DeclarationName Typo, SourceLocation TypoLoc, ArrayRef< Expr * > Args, unsigned DiagnosticID, unsigned DiagnosticSuggestID)
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 Sema::AssignConvertType checkBlockPointerTypesForAssignment(Sema &S, QualType LHSType, QualType RHSType)
checkBlockPointerTypesForAssignment - This routine determines whether two block pointer types are com...
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 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 bool captureInLambda(LambdaScopeInfo *LSI, ValueDecl *Var, SourceLocation Loc, const bool BuildAndDiagnose, QualType &CaptureType, QualType &DeclRefType, const bool RefersToCapturedVariable, const Sema::TryCaptureKind Kind, SourceLocation EllipsisLoc, const bool IsTopScope, Sema &S, bool Invalid)
Capture the given variable in the lambda.
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 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 void diagnoseUncapturableValueReferenceOrBinding(Sema &S, SourceLocation loc, ValueDecl *var)
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 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 Sema::AssignConvertType checkPointerTypesForAssignment(Sema &S, QualType LHSType, QualType RHSType, SourceLocation Loc)
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 checkEnumArithmeticConversions(Sema &S, Expr *LHS, Expr *RHS, SourceLocation Loc, Sema::ArithConvKind ACK)
Check that the usual arithmetic conversions can be performed on this pair of expressions that might b...
static void diagnosePointerIncompatibility(Sema &S, SourceLocation Loc, Expr *LHSExpr, Expr *RHSExpr)
Emit error when two pointers are incompatible.
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 std::pair< ExprResult, ExprResult > CorrectDelayedTyposInBinOp(Sema &S, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr)
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 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, ...);.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
std::string getAsString(const ASTContext &Ctx, QualType Ty) const
virtual void HandleCXXImplicitFunctionInstantiation(FunctionDecl *D)
Invoked when a function is implicitly instantiated.
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...
TranslationUnitDecl * getTranslationUnitDecl() const
const ConstantArrayType * getAsConstantArrayType(QualType T) const
bool areLaxCompatibleSveTypes(QualType FirstType, QualType SecondType)
Return true if the given vector types are lax-compatible SVE vector types, false otherwise.
CanQualType ARCUnbridgedCastTy
unsigned getIntWidth(QualType T) const
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType) const
bool areCompatibleRVVTypes(QualType FirstType, QualType SecondType)
Return true if the given types are an RISC-V vector builtin type and a VectorType that is a fixed-len...
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.
QualType getMemberPointerType(QualType T, const Type *Cls) const
Return the uniqued reference to the type for a member pointer to the specified type in the specified ...
QualType getBuiltinVaListType() const
Retrieve the type of the __builtin_va_list type.
DeclarationNameTable DeclarationNames
int getIntegerTypeOrder(QualType LHS, QualType RHS) const
Return the highest ranked integer type, see C99 6.3.1.8p1.
QualType getRecordType(const RecordDecl *Decl) 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 getBuiltinMSVaListType() const
Retrieve the type of the __builtin_ms_va_list type.
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.
QualType getTypeDeclType(const TypeDecl *Decl, const TypeDecl *PrevDecl=nullptr) const
Return the unique reference to the type for the specified type declaration.
Builtin::Context & BuiltinInfo
QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize, const Expr *SizeExpr, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return the unique reference to the type for a constant array of the specified element type.
const LangOptions & getLangOpts() const
bool areLaxCompatibleRVVTypes(QualType FirstType, QualType SecondType)
Return true if the given vector types are lax-compatible RISC-V vector types as defined by -flax-vect...
bool typesAreBlockPointerCompatible(QualType, QualType)
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
QualType getPointerDiffType() const
Return the unique type for "ptrdiff_t" (C99 7.17) defined in <stddef.h>.
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....
QualType getIntTypeForBitwidth(unsigned DestWidth, unsigned Signed) const
getIntTypeForBitwidth - sets integer QualTy according to specified details: bitwidth,...
GVALinkage GetGVALinkageForFunction(const FunctionDecl *FD) const
CanQualType UnsignedLongTy
llvm::DenseSet< const FunctionDecl * > CUDAImplicitHostDeviceFunUsedByDevice
Keep track of CUDA/HIP implicit host device functions used on device side in device compilation.
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
CanQualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
TypeInfo getTypeInfo(const Type *T) const
Get the size and alignment of the specified complete type in bits.
QualType getStringLiteralArrayType(QualType EltTy, unsigned Length) const
Return a type for a constant array for a string literal of the specified element type and length.
QualType getCorrespondingSaturatedType(QualType Ty) const
CanQualType BoundMemberTy
QualType removeAddrSpaceQualType(QualType T) const
Remove any existing address space on the type and returns the type with qualifiers intact (or that's ...
llvm::DenseSet< const VarDecl * > CUDADeviceVarODRUsedByHost
Keep track of CUDA/HIP device-side variables ODR-used by host code.
CanQualType PseudoObjectTy
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
bool areComparableObjCPointerTypes(QualType LHS, QualType RHS)
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
llvm::FixedPointSemantics getFixedPointSemantics(QualType Ty) const
QualType mergeTypes(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false, bool BlockReturnType=false, bool IsConditionalOperator=false)
static bool isObjCNSObjectType(QualType Ty)
Return true if this is an NSObject object with its NSObject attribute set.
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.
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
CanQualType UnsignedCharTy
CanQualType UnsignedIntTy
TypeSourceInfo * CreateTypeSourceInfo(QualType T, unsigned Size=0) const
Allocate an uninitialized TypeSourceInfo.
QualType getObjCClassRedefinitionType() const
Retrieve the type that Class has been defined to, which may be different from the built-in Class if C...
CanQualType UnsignedLongLongTy
QualType getCommonSugaredType(QualType X, QualType Y, bool Unqualified=false)
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...
llvm::APFixedPoint getFixedPointMax(QualType Ty) const
QualType getComplexType(QualType T) const
Return the uniqued reference to the type for a complex number with the specified element type.
bool areCompatibleSveTypes(QualType FirstType, QualType SecondType)
Return true if the given types are an SVE builtin and a VectorType that is a fixed-length representat...
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.
bool areCompatibleVectorTypes(QualType FirstVec, QualType SecondVec)
Return true if the given vector types are of the same unqualified type or if they are equivalent to t...
DeclarationNameInfo getNameForTemplate(TemplateName Name, SourceLocation NameLoc) const
const TargetInfo & getTargetInfo() const
CanQualType IncompleteMatrixIdxTy
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 ...
QualType getCorrespondingSignedType(QualType T) const
unsigned getTargetAddressSpace(LangAS AS) const
QualType getWideCharType() const
Return the type of wide characters.
bool isPromotableIntegerType(QualType T) const
More type predicates useful for type checking/promotion.
CanQualType getSignedSizeType() const
Return the unique signed counterpart of the integer type corresponding to size_t.
QualType getLogicalOperationType() const
The result type of logical operations, '<', '>', '!=', etc.
unsigned char getFixedPointScale(QualType Ty) const
QualType adjustStringLiteralBaseType(QualType StrLTy) const
bool hasCvrSimilarType(QualType T1, QualType T2)
Determine if two types are similar, ignoring only CVR qualifiers.
bool isDependenceAllowed() const
QualType getConstantMatrixType(QualType ElementType, unsigned NumRows, unsigned NumColumns) const
Return the unique reference to the matrix type of the specified element type and size.
QualType isPromotableBitField(Expr *E) const
Whether this is a promotable bitfield reference according to C99 6.3.1.1p2, bullet 2 (and GCC extensi...
bool isSentinelNullExpr(const Expr *E)
uint64_t getCharWidth() const
Return the size of the character type, in bits.
QualType getBitIntType(bool Unsigned, unsigned NumBits) const
Return a bit-precise integer type with the specified signedness and bit count.
AddrLabelExpr - The GNU address of label extension, representing &&label.
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
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
static Kind getNullabilityAttrKind(NullabilityKind kind)
Retrieve the attribute kind corresponding to the given nullability kind.
Represents a C++11 auto or C++14 decltype(auto) type, possibly constrained by a type-constraint.
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 OverloadedOperatorKind getOverloadedOperator(Opcode Opc)
Retrieve the overloaded operator kind that corresponds to the given binary opcode.
static bool isComparisonOp(Opcode Opc)
bool isComparisonOp() const
StringRef getOpcodeStr() const
bool isRelationalOp() const
SourceLocation getOperatorLoc() const
bool isCompoundAssignmentOp() const
bool isMultiplicativeOp() const
static StringRef getOpcodeStr(Opcode Op)
getOpcodeStr - Turn an Opcode enum value into the punctuation char it corresponds to,...
bool isEqualityOp() const
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 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 isBitwiseOp(Opcode Opc)
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'.
bool hasPtrArgsOrResult(unsigned ID) const
Determines whether this builtin has a result or any arguments which are pointer types.
llvm::StringRef getName(unsigned ID) const
Return the identifier name for the specified builtin, e.g.
bool isImmediate(unsigned ID) const
Returns true if this is an immediate (consteval) function.
bool hasCustomTypechecking(unsigned ID) const
Determines whether this builtin has custom typechecking.
bool isInStdNamespace(unsigned ID) const
Determines whether this builtin is a C++ standard library function that lives in (possibly-versioned)...
bool isDirectlyAddressable(unsigned ID) const
Determines whether this builtin can have its address taken with no special action required.
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...
Represents a call to a C++ constructor.
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.
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
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.
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.
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.
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
NestedNameSpecifier * getScopeRep() const
Retrieve the representation of the nested-name-specifier.
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.
Expr ** getArgs()
Retrieve the call arguments.
void setNumArgsUnsafe(unsigned NewNumArgs)
Bluntly set a new number of arguments without doing any checks whatsoever.
void shrinkNumArgs(unsigned NewNumArgs)
Reduce the number of arguments in this call expression.
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...
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.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
unsigned getValue() const
ChooseExpr - GNU builtin-in function __builtin_choose_expr.
void mergeFrom(CleanupInfo Rhs)
void setExprNeedsCleanups(bool SideEffects)
bool cleanupsHaveSideEffects() const
bool exprNeedsCleanups() const
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 ?: ternary operator.
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)
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...
ConvertVectorExpr - Clang builtin function __builtin_convertvector This AST node provides support for...
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)
The results of name lookup within a DeclContext.
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
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 ...
void addDecl(Decl *D)
Add the declaration D into this context.
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 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.
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.
SourceLocation getBeginLoc() const LLVM_READONLY
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 getLocation() const
NestedNameSpecifier * getQualifier() const
If the name was qualified, retrieves the nested-name-specifier that precedes the name.
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)
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
DeclContext * getDeclContext()
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
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
bool isIdentifier() const
Predicate functions for querying what type of name this is.
SourceLocation getBeginLoc() const LLVM_READONLY
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
const IdentifierInfo * getIdentifier() const
static DependentScopeDeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs)
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
bool getSuppressSystemWarnings() const
void setElaboratedKeywordLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Represents a reference to #emded data.
RAII object that enters a new expression evaluation context.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of enums.
EnumDecl * getDecl() const
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,...
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...
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, e.g.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
bool isLValue() const
isLValue - True if this expression is an "l-value" according to the rules of the current language.
static bool hasAnyTypeDependentArguments(ArrayRef< Expr * > Exprs)
hasAnyTypeDependentArguments - Determines if any of the expressions in Exprs is type-dependent.
@ NPC_ValueDependentIsNull
Specifies that a value-dependent expression of integral or dependent type should be considered a null...
@ NPC_NeverValueDependent
Specifies that the expression should never be value-dependent.
@ NPC_ValueDependentIsNotNull
Specifies that a value-dependent expression should be considered to never be a null pointer constant.
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
bool EvaluateAsRValue(EvalResult &Result, const ASTContext &Ctx, bool InConstantContext=false) const
EvaluateAsRValue - Return true if this is a constant which we can fold to an rvalue using any crazy t...
bool HasSideEffects(const ASTContext &Ctx, bool IncludePossibleEffects=true) const
HasSideEffects - This routine returns true for all those expressions which have any effect other than...
bool EvaluateAsConstantExpr(EvalResult &Result, const ASTContext &Ctx, ConstantExprKind Kind=ConstantExprKind::Normal) const
Evaluate an expression that is required to be a constant expression.
bool isInstantiationDependent() const
Whether this expression is instantiation-dependent, meaning that it depends in some way on.
bool isIntegerConstantExpr(const ASTContext &Ctx, SourceLocation *Loc=nullptr) const
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.
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx, SourceLocation *Loc=nullptr) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant 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)
FullExpr - Represents a "full-expression" node.
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.
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.
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, Expr *TrailingRequiresClause=nullptr)
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 or init-capture pack that has been substituted bu...
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
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
bool getNoReturnAttr() const
Determine whether this function type includes the GNU noreturn 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.
tok::TokenKind getTokenID() const
If this is a source-language token (e.g.
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.
Describes the sequence of initializations required to initialize a given object or reference with a s...
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...
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.
@ 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 isSubscriptPointerArithmetic() const
bool isSignedOverflowDefined() 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.
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template specialization this is.
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
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>::".
static NestedNameSpecifier * Create(const ASTContext &Context, NestedNameSpecifier *Prefix, const IdentifierInfo *II)
Builds a specifier combining a prefix and an identifier.
const Type * getAsType() const
Retrieve the type stored in this nested name specifier.
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
Interfaces are the core concept in Objective-C for object oriented design.
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.
ObjCMethodDecl - Represents an instance or class method declaration.
ImplicitParamDecl * getSelfDecl() const
ArrayRef< ParmVarDecl * > parameters() const
QualType getReturnType() 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 a class type in Objective C.
Represents one property declaration in an Objective-C interface.
static ObjCPropertyDecl * findPropertyDecl(const DeclContext *DC, const IdentifierInfo *propertyID, ObjCPropertyQueryKind queryKind)
Lookup a property by name in the specified DeclContext.
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.
bool isAvailableOption(llvm::StringRef Ext, const LangOptions &LO) const
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
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.
Represents a parameter to a function.
bool hasUnparsedDefaultArg() const
Determines whether this parameter has a default argument that has not yet been parsed.
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
bool hasUninstantiatedDefaultArg() const
QualType getOriginalType() const
static ParmVarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S, Expr *DefArg)
bool hasDefaultArg() const
Determines whether this parameter has a default argument, either parsed or not.
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)
SourceLocation getLastFPEvalPragmaLocation() const
void CreateString(StringRef Str, Token &Tok, SourceLocation ExpansionLocStart=SourceLocation(), SourceLocation ExpansionLocEnd=SourceLocation())
Plop the specified string into a scratch buffer and set the specified token's location and length to ...
LangOptions::FPEvalMethodKind getCurrentFPEvalMethod() const
IdentifierInfo * getIdentifierInfo(StringRef Name) const
Return information about the specified preprocessor identifier token.
uint8_t getSpellingOfSingleCharacterNumericConstant(const Token &Tok, bool *Invalid=nullptr) const
Given a Token Tok that is a numeric constant with length 1, return the value of constant as an unsign...
SourceManager & getSourceManager() const
bool isMacroDefined(StringRef Id)
const TargetInfo & getTargetInfo() const
StringRef getSpelling(SourceLocation loc, SmallVectorImpl< char > &buffer, bool *invalid=nullptr) const
Return the 'spelling' of the token at the given location; does not go up to the spelling location or ...
bool isCodeCompletionEnabled() const
Determine if we are performing code completion.
IdentifierTable & getIdentifierTable()
const LangOptions & getLangOpts() const
DiagnosticsEngine & getDiagnostics() const
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Computes the source location just past the end of the token at this source location.
DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID) const
Forwarding function for diagnostics.
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
QualType withConst() const
void addConst()
Add the const type qualifier to this QualType.
bool isAtLeastAsQualifiedAs(QualType Other) const
Determine whether this type is at least as qualified as the other given type, requiring exact equalit...
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 isAddressSpaceOverlapping(QualType T) const
Returns true if address space qualifiers overlap with T address space qualifiers.
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.
bool hasAddressSpace() const
Check if this type has any address space qualifier.
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).
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()
void removeAddressSpace()
void setAddressSpace(LangAS space)
static bool isAddressSpaceSupersetOf(LangAS A, LangAS B)
Returns true if address space A is equal to or a superset of B.
ObjCLifetime getObjCLifetime() const
Qualifiers withoutObjCLifetime() const
Qualifiers withoutObjCGCAttr() const
bool compatiblyIncludes(Qualifiers other) const
Determines if these qualifiers compatibly include another set.
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.
field_range fields() const
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
RecordDecl * getDecl() const
static RecoveryExpr * Create(ASTContext &Ctx, QualType T, SourceLocation BeginLoc, SourceLocation EndLoc, ArrayRef< Expr * > SubExprs)
A class that does preorder or postorder depth-first traversal on the entire Clang AST and visits each...
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.
unsigned getFlags() const
getFlags - Return the flags for this 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 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.
ARCConversionResult CheckObjCConversion(SourceRange castRange, QualType castType, Expr *&op, CheckedConversionKind CCK, bool Diagnose=true, bool DiagnoseCFAudited=false, BinaryOperatorKind Opc=BO_PtrMemD)
Checks for invalid conversions and casts between retainable pointers and other pointer kinds for ARC ...
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...
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.
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 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...
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.
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.
void CheckFloatComparison(SourceLocation Loc, Expr *LHS, Expr *RHS, BinaryOperatorKind Opcode)
Check for comparisons of floating-point values using == and !=.
Scope * getCurScope() const
Retrieve the parser's current scope.
bool DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, CorrectionCandidateCallback &CCC, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr, ArrayRef< Expr * > Args=std::nullopt, DeclContext *LookupCtx=nullptr, TypoExpr **Out=nullptr)
Diagnose an empty lookup.
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 ActOnIntegerConstant(SourceLocation Loc, uint64_t Val)
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)
@ NTCUC_LValueToRValueVolatile
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.
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()
QualType UsualArithmeticConversions(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, ArithConvKind ACK)
UsualArithmeticConversions - Performs various conversions that are common to binary operators (C99 6....
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)
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)
ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, VerifyICEDiagnoser &Diagnoser, AllowFoldKind CanFold=NoFold)
VerifyIntegerConstantExpression - Verifies that an expression is an ICE, and reports the appropriate ...
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? I.e.
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.
void MarkDeclarationsReferencedInExpr(Expr *E, bool SkipLocalVariables=false, ArrayRef< const Expr * > StopAt=std::nullopt)
Mark any declarations that appear within this expression or any potentially-evaluated subexpressions ...
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.
bool CheckConceptUseInDefinition(ConceptDecl *Concept, SourceLocation Loc)
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.
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 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.
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
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()
AssignConvertType CheckTransparentUnionArgumentConstraints(QualType ArgType, ExprResult &RHS)
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".
DefaultedComparisonKind
Kinds of defaulted comparison operator functions.
@ None
This is not a defaultable comparison operator.
ExprResult ActOnParenListExpr(SourceLocation L, SourceLocation R, MultiExprArg Val)
FunctionDecl * ResolveSingleFunctionTemplateSpecialization(OverloadExpr *ovl, bool Complain=false, DeclAccessPair *Found=nullptr, TemplateSpecCandidateSet *FailedTSC=nullptr)
Given an expression that refers to an overloaded function, try to resolve that overloaded function ex...
QualType CheckMatrixMultiplyOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign)
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...
std::unique_ptr< sema::FunctionScopeInfo, PoppedFunctionScopeDeleter > PoppedFunctionScopePtr
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>.
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)
TypoExpr * CorrectTypoDelayed(const DeclarationNameInfo &Typo, Sema::LookupNameKind LookupKind, Scope *S, CXXScopeSpec *SS, CorrectionCandidateCallback &CCC, TypoDiagnosticGenerator TDG, TypoRecoveryCallback TRC, CorrectTypoKind Mode, DeclContext *MemberContext=nullptr, bool EnteringContext=false, const ObjCObjectPointerType *OPT=nullptr)
Try to "correct" a typo in the source code by finding visible declarations whose names are similar to...
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...
QualType CheckVectorLogicalOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc)
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.
QualType CheckAdditionOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc, QualType *CompLHSTy=nullptr)
VariadicCallType getVariadicCallType(FunctionDecl *FDecl, const FunctionProtoType *Proto, Expr *Fn)
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.
const LangOptions & LangOpts
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.
NamedDeclSetType UnusedPrivateFields
Set containing all declared private fields that are not used.
void DefineInheritingConstructor(SourceLocation UseLoc, CXXConstructorDecl *Constructor)
Define the specified inheriting constructor.
void CheckUnusedVolatileAssignment(Expr *E)
Check whether E, which is either a discarded-value expression or an unevaluated operand,...
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 getElaboratedType(ElaboratedTypeKeyword Keyword, const CXXScopeSpec &SS, QualType T, TagDecl *OwnedTagDecl=nullptr)
Retrieve a version of the type 'T' that is elaborated by Keyword, qualified by the nested-name-specif...
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
VarArgKind isValidVarArgType(const QualType &Ty)
Determine the degree of POD-ness for an expression.
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)
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...
bool CheckLoopHintExpr(Expr *E, SourceLocation Loc, bool AllowZero)
QualType CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, ArithConvKind OperationKind)
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.
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
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.
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.
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.
AssignConvertType
AssignConvertType - All of the 'assignment' semantic checks return this enum to indicate whether the ...
@ IncompatiblePointerDiscardsQualifiers
IncompatiblePointerDiscardsQualifiers - The assignment discards qualifiers that we don't permit to be...
@ IntToPointer
IntToPointer - The assignment converts an int to a pointer, which we accept as an extension.
@ IncompatibleBlockPointer
IncompatibleBlockPointer - The assignment is between two block pointers types that are not compatible...
@ IncompatibleObjCQualifiedId
IncompatibleObjCQualifiedId - The assignment is between a qualified id type and something else (that ...
@ IncompatibleVectors
IncompatibleVectors - The assignment is between two vector types that have the same size,...
@ CompatiblePointerDiscardsQualifiers
CompatiblePointerDiscardsQualifiers - The assignment discards c/v/r qualifiers, which we accept as an...
@ IncompatiblePointer
IncompatiblePointer - The assignment is between two pointers types that are not compatible,...
@ IncompatibleObjCWeakRef
IncompatibleObjCWeakRef - Assigning a weak-unavailable object to an object with __weak qualifier.
@ Compatible
Compatible - the types are compatible according to the standard.
@ IncompatibleFunctionPointerStrict
IncompatibleFunctionPointerStrict - The assignment is between two function pointer types that are not...
@ Incompatible
Incompatible - We reject this conversion outright, it is invalid to represent it in the AST.
@ FunctionVoidPointer
FunctionVoidPointer - The assignment is between a function pointer and void*, which the standard does...
@ 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 ...
@ IncompatibleNestedPointerQualifiers
IncompatibleNestedPointerQualifiers - The assignment is between two nested pointer types,...
@ IncompatibleNestedPointerAddressSpaceMismatch
IncompatibleNestedPointerAddressSpaceMismatch - The assignment changes address spaces in nested point...
@ PointerToInt
PointerToInt - The assignment converts a pointer to an int, which we accept as an extension.
@ IntToBlockPointer
IntToBlockPointer - The assignment converts an int to a block pointer.
void CheckShadowingDeclModification(Expr *E, SourceLocation Loc)
Warn if 'E', which is an expression that is about to be modified, refers to a shadowing declaration.
ArithConvKind
Context in which we're performing a usual arithmetic conversion.
@ ACK_Arithmetic
An arithmetic operation.
@ ACK_CompAssign
A compound assignment expression.
@ ACK_BitwiseOp
A bitwise operation.
@ ACK_Conditional
A conditional (?:) operator.
@ ACK_Comparison
A comparison.
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
@ TryCapture_ExplicitByRef
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 ?: operation.
QualType CheckVectorCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
CheckVectorCompareOperands - vector comparisons are a clang extension that operates on extended vecto...
QualType CheckMultiplyDivideOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, bool IsDivide)
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...
QualType CheckPointerToMemberOperands(ExprResult &LHS, ExprResult &RHS, ExprValueKind &VK, SourceLocation OpLoc, bool isIndirect)
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.
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=std::nullopt, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false)
AddOverloadCandidate - Adds the given function to the set of candidate functions, using the given fun...
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 keepInLifetimeExtendingContext()
keepInLifetimeExtendingContext - Pull down InLifetimeExtendingContext flag from previous context.
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 ?: under C++ semantics.
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)
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 mergeDeclAttributes(NamedDecl *New, Decl *Old, AvailabilityMergeKind AMK=AMK_Redeclaration)
mergeDeclAttributes - Copy attributes from the Old decl to the New one.
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)
ExprResult ActOnEmbedExpr(SourceLocation EmbedKeywordLoc, StringLiteral *BinaryData)
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)
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 DiagnoseAvailabilityOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass, bool ObjCPropertyAccess, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReceiver=nullptr)
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)
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.
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? That is, given that one of them is a vector,...
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
void diagnoseMissingTemplateArguments(TemplateName Name, SourceLocation Loc)
ExprResult BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field)
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)
bool GatherArgumentsForCall(SourceLocation CallLoc, FunctionDecl *FDecl, const FunctionProtoType *Proto, unsigned FirstParam, ArrayRef< Expr * > Args, SmallVectorImpl< Expr * > &AllArgs, VariadicCallType CallType=VariadicDoesNotApply, bool AllowExplicit=false, bool IsListInitialization=false)
GatherArgumentsForCall - Collector argument expressions for various form of call prototypes.
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 BuildBinOp(Scope *S, SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr)
ExprResult ActOnNumericConstant(const Token &Tok, Scope *UDLScope=nullptr)
ExprResult PerformObjectMemberConversion(Expr *From, NestedNameSpecifier *Qualifier, NamedDecl *FoundDecl, NamedDecl *Member)
Cast a base object to a member's actual type.
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)
ExprResult CreateBuiltinBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr)
CreateBuiltinBinOp - Creates a new built-in binary operation with operator Opc at location TokLoc.
AssignConvertType CheckAssignmentConstraints(SourceLocation Loc, QualType LHSType, QualType RHSType)
CheckAssignmentConstraints - Perform type checking for assignment, argument passing,...
void DiagnoseUnsatisfiedConstraint(const ConstraintSatisfaction &Satisfaction, bool First=true)
Emit diagnostics explaining why a constraint expression was deemed unsatisfied.
bool IsDerivedFrom(SourceLocation Loc, QualType Derived, QualType Base)
Determine whether the type Derived is a C++ class that is derived from the type Base.
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
void clearDelayedTypo(TypoExpr *TE)
Clears the state of the given TypoExpr.
@ 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.
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...
QualType CheckSubtractionOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, QualType *CompLHSTy=nullptr)
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.
const TypoExprState & getTypoExprState(TypoExpr *TE) const
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.
FullExprArg MakeFullExpr(Expr *Arg)
bool IsFunctionConversion(QualType FromType, QualType ToType, QualType &ResultTy)
Determine whether the conversion from FromType to ToType is a valid conversion that strips "noexcept"...
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.
ExprResult CorrectDelayedTyposInExpr(Expr *E, VarDecl *InitDecl=nullptr, bool RecoverUncorrectedTypos=false, llvm::function_ref< ExprResult(Expr *)> Filter=[](Expr *E) -> ExprResult { return E;})
Process any TypoExprs in the given Expr and its children, generating diagnostics as appropriate and r...
void DiagnoseImmediateEscalatingReason(FunctionDecl *FD)
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
void FinalizeVarWithDestructor(VarDecl *VD, const RecordType *DeclInitType)
FinalizeVarWithDestructor - Prepare for calling destructor on the constructed variable.
ExprResult CreateBuiltinMatrixSubscriptExpr(Expr *Base, Expr *RowIdx, Expr *ColumnIdx, SourceLocation RBLoc)
Represents a function call to one of __builtin_LINE(), __builtin_COLUMN(), __builtin_FUNCTION(),...
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
uint32_t getCodeUnit(size_t i) const
static StringLiteral * Create(const ASTContext &Ctx, StringRef Str, StringLiteralKind Kind, bool Pascal, QualType Ty, const SourceLocation *Loc, unsigned NumConcatenated)
This is the "fully general" constructor that allows representation of strings formed from multiple co...
StringRef getString() const
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
bool hasNameForLinkage() const
Is this tag type named, either directly or via being defined in a typedef of this type?
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
Exposes information about the current target.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
@ CharPtrBuiltinVaList
typedef char* __builtin_va_list;
virtual size_t getMaxBitIntWidth() const
virtual bool useFP16ConversionIntrinsics() const
Check whether llvm intrinsics such as llvm.convert.to.fp16 should be used to convert to and from __fp...
unsigned getTypeWidth(IntType T) const
Return the width (in bits) of the specified integer type enum.
uint64_t getPointerWidth(LangAS AddrSpace) const
Return the width of pointers on this target, for the specified address space.
unsigned getIntWidth() const
getIntWidth/Align - Return the size of 'signed int' and 'unsigned int' for this target,...
IntType getSizeType() const
unsigned getLongLongWidth() const
getLongLongWidth/Align - Return the size of 'signed long long' and 'unsigned long long' for this targ...
bool isTLSSupported() const
Whether the target supports thread-local storage.
virtual bool supportsExtendIntArgs() const
Whether the option -fextend-arguments={32,64} is supported on the target.
virtual BuiltinVaListKind getBuiltinVaListKind() const =0
Returns the kind of __builtin_va_list type that should be used with this target.
bool hasBuiltinMSVaList() const
Returns whether or not type __builtin_ms_va_list type is available on this target.
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
unsigned getIntMaxTWidth() const
Return the size of intmax_t and uintmax_t for this target, in bits.
unsigned getLongWidth() const
getLongWidth/Align - Return the size of 'signed long' and 'unsigned long' for this target,...
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.
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.
Token - This structure provides full information about a lexed token.
SourceLocation getLocation() const
Return a source location identifier for the specified offset in the current file.
unsigned getLength() const
void setKind(tok::TokenKind K)
tok::TokenKind getKind() const
void setLocation(SourceLocation L)
void startToken()
Reset all flags to cleared.
void setIdentifierInfo(IdentifierInfo *II)
Represents a declaration of a type.
const Type * getTypeForDecl() const
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.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isFixedPointOrIntegerType() const
Return true if this is a fixed point or integer type.
bool isBlockPointerType() const
bool isBooleanType() const
bool isFunctionReferenceType() const
bool isObjCBuiltinType() 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.
const RecordType * getAsUnionType() const
NOTE: getAs*ArrayType are methods on ASTContext.
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.
bool canDecayToPointerType() const
Determines whether this type can decay to a pointer type.
bool hasIntegerRepresentation() const
Determine whether this type has an integer representation of some sort, e.g., it is an integer type o...
bool isVoidPointerType() const
const ComplexType * getAsComplexIntegerType() const
bool isFunctionPointerType() const
bool isArithmeticType() const
bool isConstantMatrixType() const
bool isPointerType() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
bool isSVESizelessBuiltinType() const
Returns true for SVE scalable vector types.
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isSignedFixedPointType() const
Return true if this is a fixed point type that is signed according to ISO/IEC JTC1 SC22 WG14 N1169.
bool isEnumeralType() const
bool isScalarType() const
bool isVariableArrayType() const
bool isSizelessBuiltinType() const
bool isSveVLSBuiltinType() const
Determines if this is a sizeless type supported by the 'arm_sve_vector_bits' type attribute,...
bool isIntegralType(const ASTContext &Ctx) const
Determine whether this type is an integral type.
bool isObjCQualifiedIdType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
bool hasUnsignedIntegerRepresentation() const
Determine whether this type has an unsigned integer representation of some sort, e....
bool isExtVectorType() const
bool isAnyCharacterType() const
Determine whether this type is any of the built-in character types.
bool isExtVectorBoolType() const
QualType getSveEltType(const ASTContext &Ctx) const
Returns the representative type for the element of an SVE builtin type.
bool isNonOverloadPlaceholderType() const
Test for a placeholder type other than Overload; see BuiltinType::isNonOverloadPlaceholderType.
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isBitIntType() const
bool isSpecificBuiltinType(unsigned K) const
Test for a particular builtin type.
bool isBuiltinType() const
Helper methods to distinguish type categories.
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isAnyComplexType() const
bool isFixedPointType() const
Return true if this is a fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
bool isSaturatedFixedPointType() const
Return true if this is a saturated fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
ScalarTypeKind getScalarTypeKind() const
Given that this is a scalar type, classify it.
const BuiltinType * getAsPlaceholderType() const
bool hasSignedIntegerRepresentation() const
Determine whether this type has an signed integer representation of some sort, e.g....
bool isWebAssemblyTableType() const
Returns true if this is a WebAssembly table type: either an array of reference types,...
bool isMemberPointerType() const
bool isAtomicType() const
bool isOverloadableType() const
Determines whether this is a type for which one can define an overloaded operator.
bool isObjCIdType() const
bool isMatrixType() const
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
bool isComplexIntegerType() const
bool isUnscopedEnumerationType() const
bool isObjCObjectType() const
bool isBlockCompatibleObjCPointerType(ASTContext &ctx) const
const ArrayType * getAsArrayTypeUnsafe() const
A variant of getAs<> for array types which silently discards qualifiers from the outermost type.
bool isObjCLifetimeType() const
Returns true if objects of this type have lifetime semantics under ARC.
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
bool 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 isMemberFunctionPointerType() const
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.
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...
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 isSizelessVectorType() const
Returns true for all scalable vector types.
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.
NestedNameSpecifier * getCorrectionSpecifier() const
Gets the NestedNameSpecifier needed to use the typo correction.
bool isOverloaded() const
NamedDecl * getFoundDecl() const
Get the correction declaration found by name lookup (before we looked through using shadow declaratio...
TypoExpr - Internal placeholder for expressions where typo correction still needs to be performed and...
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 UnaryOperator * Create(const ASTContext &C, Expr *input, Opcode opc, QualType type, ExprValueKind VK, ExprObjectKind OK, SourceLocation l, bool CanOverflow, FPOptionsOverride FPFeatures)
bool isIncrementDecrementOp() const
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
Represents a C++ unqualified-id that has been parsed.
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)
VarDecl * getPotentiallyDecomposedVarDecl()
Represents a variable declaration or definition.
VarDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
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,...
Declaration of a variable template.
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
Policy getDefaultPolicy()
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.
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)
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.
void checkExprLifetime(Sema &SemaRef, const InitializedEntity &Entity, Expr *Init)
Check that the lifetime of the given expr (and its subobjects) is sufficient for initializing 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.
@ Vector
'vector' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
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)
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.
@ IK_ImplicitSelfParam
An implicit 'self' parameter.
@ IK_TemplateId
A template-id, e.g., f<int>.
llvm::omp::Clause OpenMPClauseKind
OpenMP clauses.
std::optional< ComparisonCategoryType > getComparisonCategoryForBuiltinCmp(QualType T)
Get the comparison category that should be used when comparing values of type T.
UnaryExprOrTypeTrait
Names for the "expression or type" traits.
unsigned toTargetAddressSpace(LangAS AS)
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
TemplateDecl * getAsTypeTemplateDecl(Decl *D)
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Result
The result type of a method or function.
ImplicitConversionKind
ImplicitConversionKind - The kind of implicit conversion used to convert an argument to a parameter's...
@ ICK_Complex_Conversion
Complex conversions (C99 6.3.1.6)
@ ICK_Integral_Conversion
Integral conversions (C++ [conv.integral])
@ ICK_Floating_Integral
Floating-integral conversions (C++ [conv.fpint])
@ ICK_HLSL_Array_RValue
HLSL non-decaying array rvalue cast.
@ ICK_Array_To_Pointer
Array-to-pointer conversion (C++ [conv.array])
@ ICK_Identity
Identity conversion (no conversion)
@ ICK_Lvalue_To_Rvalue
Lvalue-to-rvalue conversion (C++ [conv.lval])
@ ICK_Floating_Conversion
Floating point conversions (C++ [conv.double].
@ ICK_Complex_Real
Complex-real conversions (C99 6.3.1.7)
@ ICK_Function_To_Pointer
Function-to-pointer (C++ [conv.array])
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 ...
ActionResult< Expr * > ExprResult
LangAS
Defines the address space values used by the address space qualifier of QualType.
CastKind
CastKind - The kind of operation required for a conversion.
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.
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.
const FunctionProtoType * T
@ 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.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
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
@ None
No keyword precedes the qualified type name.
@ Other
Other implicit parameter.
@ Implicit
An implicit conversion.
bool isGenericLambdaCallOperatorSpecialization(const CXXMethodDecl *MD)
NonOdrUseReason
The reason why a DeclRefExpr does not constitute an odr-use.
@ NOUR_Discarded
This name appears as a potential result of a discarded value expression.
@ NOUR_Unevaluated
This name appears in an unevaluated operand.
@ NOUR_None
This is an odr-use.
@ NOUR_Constant
This name appears as a potential result of an lvalue-to-rvalue conversion that is a constant expressi...
Represents an element in a path from a derived class to a base class.
The class facilities generation and storage of conversion FixIts.
OverloadFixItKind Kind
The type of fix applied.
bool tryToFixConversion(const Expr *FromExpr, const QualType FromQTy, const QualType ToQTy, Sema &S)
If possible, generates and stores a fix for the given conversion.
std::vector< FixItHint > Hints
The list of Hints generated so far.
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
DeclarationName getName() const
getName - Returns the embedded declaration name.
void setCXXLiteralOperatorNameLoc(SourceLocation Loc)
setCXXLiteralOperatorNameLoc - Sets the location of the literal operator name (not the operator keywo...
SourceLocation getBeginLoc() const
getBeginLoc - Retrieve the location of the first token.
SourceLocation getEndLoc() const LLVM_READONLY
Stores data related to a single #embed directive.
EvalResult is a struct with detailed info about an evaluated expression.
APValue Val
Val - This is the value the expression can be folded to.
SmallVectorImpl< PartialDiagnosticAt > * Diag
Diag - If this is non-null, it will be filled in with a stack of notes indicating why evaluation fail...
bool HasUndefinedBehavior
Whether the evaluation hit undefined behavior.
bool HasSideEffects
Whether the evaluated expression has side effects.
Extra information about a function prototype.
unsigned HasTrailingReturn
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,...
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.
unsigned NumTypos
The number of typos encountered during this expression evaluation context (i.e.
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.
Describes an entity that is being assigned.