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;
5039 "should be able to convert any integer type to size type");
5040 return ConvExpr.
get();
5044 RowIdx = IsIndexValid(RowIdx, MTy->getNumRows(),
false);
5045 ColumnIdx = IsIndexValid(ColumnIdx, MTy->getNumColumns(),
true);
5046 if (!RowIdx || !ColumnIdx)
5050 MTy->getElementType(), RBLoc);
5053void Sema::CheckAddressOfNoDeref(
const Expr *
E) {
5060 while ((
Member = dyn_cast<MemberExpr>(StrippedExpr)) && !
Member->isArrow())
5061 StrippedExpr =
Member->getBase()->IgnoreParenImpCasts();
5063 LastRecord.PossibleDerefs.erase(StrippedExpr);
5074 if (isa<ArrayType>(ResultTy))
5077 if (ResultTy->
hasAttr(attr::NoDeref)) {
5078 LastRecord.PossibleDerefs.insert(
E);
5086 if (!(isa<ArrayType>(BaseTy) || isa<PointerType>(BaseTy)))
5091 while ((
Member = dyn_cast<MemberExpr>(
Base->IgnoreParenCasts())) &&
5095 if (
const auto *Ptr = dyn_cast<PointerType>(
Base->getType())) {
5096 if (Ptr->getPointeeType()->hasAttr(attr::NoDeref))
5097 LastRecord.PossibleDerefs.insert(
E);
5113 for (
auto *Op : {LHSExp, RHSExp}) {
5114 Op = Op->IgnoreImplicit();
5115 if (Op->getType()->isArrayType() && !Op->isLValue())
5138 Expr *BaseExpr, *IndexExpr;
5173 Diag(LLoc, diag::err_subscript_nonfragile_interface)
5197 LHSExp = Materialized.
get();
5206 Qualifiers Combined = BaseQuals + MemberQuals;
5207 if (Combined != MemberQuals)
5218 CK_ArrayToPointerDecay).
get();
5224 }
else if (RHSTy->isArrayType()) {
5229 CK_ArrayToPointerDecay).
get();
5236 return ExprError(
Diag(LLoc, diag::err_typecheck_subscript_value)
5241 return ExprError(
Diag(LLoc, diag::err_typecheck_subscript_not_integer)
5247 std::optional<llvm::APSInt> IntegerContantExpr =
5249 if (!IntegerContantExpr.has_value() ||
5250 IntegerContantExpr.value().isNegative())
5266 Diag(LLoc, diag::ext_gnu_subscript_void_type)
5277 diag::err_subscript_incomplete_or_sizeless_type, BaseExpr))
5290 auto *CSI = dyn_cast<CapturingScopeInfo>(*I);
5294 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(CSI))
5295 DC = LSI->CallOperator;
5296 else if (
auto *CRSI = dyn_cast<CapturedRegionScopeInfo>(CSI))
5297 DC = CRSI->TheCapturedDecl;
5298 else if (
auto *BSI = dyn_cast<BlockScopeInfo>(CSI))
5316 bool SkipImmediateInvocations) {
5318 assert(!RewrittenInit &&
"Should not have a rewritten init expression yet");
5322 Diag(Param->
getBeginLoc(), diag::err_recursive_default_argument) << FD;
5323 Diag(CallLoc, diag::note_recursive_default_argument_used_here);
5328 Diag(CallLoc, diag::err_use_of_default_argument_to_function_declared_later)
5331 diag::note_default_argument_declared_here);
5336 assert(!RewrittenInit &&
"Should not have a rewitten init expression yet");
5342 assert(
Init &&
"default argument but no initializer?");
5351 if (
auto *InitWithCleanup = dyn_cast<ExprWithCleanups>(
Init)) {
5358 assert(!InitWithCleanup->getNumObjects() &&
5359 "default argument expression has capturing blocks?");
5372 SkipImmediateInvocations;
5383 bool HasImmediateCalls =
false;
5388 HasImmediateCalls |= FD->isImmediateFunction();
5394 HasImmediateCalls |= FD->isImmediateFunction();
5403 HasImmediateCalls =
true;
5414 return VisitCXXMethodDecl(
E->getCallOperator());
5418 return TraverseStmt(
E->getExpr());
5422 return TraverseStmt(
E->getExpr());
5445 if (
E->getParentContext() == SemaRef.CurContext)
5447 return getDerived().RebuildSourceLocExpr(
E->getIdentKind(),
E->
getType(),
5449 SemaRef.CurContext);
5456 assert(Param->
hasDefaultArg() &&
"can't build nonexistent default arg");
5460 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
5461 InitializationContext =
5463 if (!InitializationContext.has_value())
5464 InitializationContext.emplace(CallLoc, Param,
CurContext);
5490 if (!NestedDefaultChecking)
5491 V.TraverseDecl(Param);
5495 if (
V.HasImmediateCalls || InLifetimeExtendingContext) {
5496 if (
V.HasImmediateCalls)
5505 Res = Immediate.TransformInitializer(Param->
getInit(),
5519 CallLoc, FD, Param,
Init,
5520 NestedDefaultChecking))
5524 Init, InitializationContext->Context);
5528 assert(Field->hasInClassInitializer());
5531 if (Field->isInvalidDecl())
5536 auto *ParentRD = cast<CXXRecordDecl>(Field->getParent());
5538 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
5539 InitializationContext =
5541 if (!InitializationContext.has_value())
5551 if (!Field->getInClassInitializer()) {
5557 ClassPattern->
lookup(Field->getDeclName());
5560 for (
auto *L : Lookup) {
5561 if ((Pattern = dyn_cast<FieldDecl>(L)))
5564 assert(Pattern &&
"We must have set the Pattern!");
5568 Field->setInvalidDecl();
5580 if (!NestedDefaultChecking)
5581 V.TraverseDecl(Field);
5582 if (
V.HasImmediateCalls) {
5586 NestedDefaultChecking;
5591 Res = Immediate.TransformInitializer(Field->getInClassInitializer(),
5597 Field->setInvalidDecl();
5603 if (Field->getInClassInitializer()) {
5605 if (!NestedDefaultChecking)
5613 if (Res.isInvalid()) {
5614 Field->setInvalidDecl();
5620 Field, InitializationContext->Context,
5639 Diag(
Loc, diag::err_default_member_initializer_not_yet_parsed)
5640 << OutermostClass << Field;
5641 Diag(Field->getEndLoc(),
5642 diag::note_default_member_initializer_not_yet_parsed);
5645 Field->setInvalidDecl();
5653 if (isa_and_nonnull<CXXConstructorDecl>(FDecl))
5655 else if (Fn && Fn->getType()->isBlockPointerType())
5658 if (
CXXMethodDecl *Method = dyn_cast_or_null<CXXMethodDecl>(FDecl))
5659 if (Method->isInstance())
5674 FunctionName(FuncName) {}
5676 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
5685 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
5686 return std::make_unique<FunctionCallCCC>(*
this);
5706 if (
NamedDecl *ND = Corrected.getFoundDecl()) {
5707 if (Corrected.isOverloaded()) {
5717 ND = Best->FoundDecl;
5718 Corrected.setCorrectionDecl(ND);
5724 ND = ND->getUnderlyingDecl();
5725 if (isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND))
5736 if (!isa<ParenExpr>(Fn))
5739 Fn = Fn->IgnoreParens();
5741 auto *UO = dyn_cast<UnaryOperator>(Fn);
5742 if (!UO || UO->getOpcode() != clang::UO_AddrOf)
5744 if (
auto *DRE = dyn_cast<DeclRefExpr>(UO->getSubExpr()->IgnoreParens())) {
5745 return DRE->hasQualifier();
5747 if (
auto *OVL = dyn_cast<OverloadExpr>(UO->getSubExpr()->IgnoreParens()))
5748 return OVL->getQualifier();
5758 bool IsExecConfig) {
5769 bool HasExplicitObjectParameter =
5771 unsigned ExplicitObjectParameterOffset = HasExplicitObjectParameter ? 1 : 0;
5775 unsigned FnKind = Fn->getType()->isBlockPointerType()
5782 if (Args.size() < NumParams) {
5783 if (Args.size() < MinArgs) {
5788 ? diag::err_typecheck_call_too_few_args_suggest
5789 : diag::err_typecheck_call_too_few_args_at_least_suggest;
5792 << FnKind << MinArgs - ExplicitObjectParameterOffset
5793 <<
static_cast<unsigned>(Args.size()) -
5794 ExplicitObjectParameterOffset
5796 }
else if (MinArgs - ExplicitObjectParameterOffset == 1 && FDecl &&
5801 ? diag::err_typecheck_call_too_few_args_one
5802 : diag::err_typecheck_call_too_few_args_at_least_one)
5803 << FnKind << FDecl->
getParamDecl(ExplicitObjectParameterOffset)
5804 << HasExplicitObjectParameter << Fn->getSourceRange();
5807 ? diag::err_typecheck_call_too_few_args
5808 : diag::err_typecheck_call_too_few_args_at_least)
5809 << FnKind << MinArgs - ExplicitObjectParameterOffset
5810 <<
static_cast<unsigned>(Args.size()) -
5811 ExplicitObjectParameterOffset
5812 << HasExplicitObjectParameter << Fn->getSourceRange();
5815 if (!TC && FDecl && !FDecl->
getBuiltinID() && !IsExecConfig)
5823 assert((
Call->getNumArgs() == NumParams) &&
5824 "We should have reserved space for the default arguments before!");
5829 if (Args.size() > NumParams) {
5835 ? diag::err_typecheck_call_too_many_args_suggest
5836 : diag::err_typecheck_call_too_many_args_at_most_suggest;
5839 << FnKind << NumParams - ExplicitObjectParameterOffset
5840 <<
static_cast<unsigned>(Args.size()) -
5841 ExplicitObjectParameterOffset
5843 }
else if (NumParams - ExplicitObjectParameterOffset == 1 && FDecl &&
5846 Diag(Args[NumParams]->getBeginLoc(),
5847 MinArgs == NumParams
5848 ? diag::err_typecheck_call_too_many_args_one
5849 : diag::err_typecheck_call_too_many_args_at_most_one)
5850 << FnKind << FDecl->
getParamDecl(ExplicitObjectParameterOffset)
5851 <<
static_cast<unsigned>(Args.size()) -
5852 ExplicitObjectParameterOffset
5853 << HasExplicitObjectParameter << Fn->getSourceRange()
5855 Args.back()->getEndLoc());
5857 Diag(Args[NumParams]->getBeginLoc(),
5858 MinArgs == NumParams
5859 ? diag::err_typecheck_call_too_many_args
5860 : diag::err_typecheck_call_too_many_args_at_most)
5861 << FnKind << NumParams - ExplicitObjectParameterOffset
5862 <<
static_cast<unsigned>(Args.size()) -
5863 ExplicitObjectParameterOffset
5864 << HasExplicitObjectParameter << Fn->getSourceRange()
5866 Args.back()->getEndLoc());
5869 if (!TC && FDecl && !FDecl->
getBuiltinID() && !IsExecConfig)
5874 Call->shrinkNumArgs(NumParams);
5885 unsigned TotalNumArgs = AllArgs.size();
5886 for (
unsigned i = 0; i < TotalNumArgs; ++i)
5887 Call->setArg(i, AllArgs[i]);
5889 Call->computeDependence();
5898 bool IsListInitialization) {
5903 for (
unsigned i = FirstParam; i < NumParams; i++) {
5908 if (ArgIx < Args.size()) {
5909 Arg = Args[ArgIx++];
5912 diag::err_call_incomplete_argument, Arg))
5916 bool CFAudited =
false;
5918 FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>() &&
5919 (!Param || !Param->
hasAttr<CFConsumedAttr>()))
5922 FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>() &&
5923 (!Param || !Param->
hasAttr<CFConsumedAttr>()))
5929 BE->getBlockDecl()->setDoesNotEscape();
5942 Entity,
SourceLocation(), Arg, IsListInitialization, AllowExplicit);
5948 assert(Param &&
"can't use default arguments without a known callee");
5960 CheckArrayAccess(Arg);
5965 AllArgs.push_back(Arg);
5974 for (
Expr *A : Args.slice(ArgIx)) {
5978 AllArgs.push_back(arg.get());
5983 for (
Expr *A : Args.slice(ArgIx)) {
5986 AllArgs.push_back(Arg.
get());
5991 for (
Expr *A : Args.slice(ArgIx))
5992 CheckArrayAccess(A);
6000 TL = DTL.getOriginalLoc();
6003 << ATL.getLocalSourceRange();
6009 const Expr *ArgExpr) {
6039 Diag(CallLoc, diag::warn_static_array_too_small)
6047 std::optional<CharUnits> ArgSize =
6049 std::optional<CharUnits> ParmSize =
6051 if (ArgSize && ParmSize && *ArgSize < *ParmSize) {
6052 Diag(CallLoc, diag::warn_static_array_too_small)
6054 << (
unsigned)ParmSize->getQuantity() << 1;
6068 if (!placeholder)
return false;
6070 switch (placeholder->
getKind()) {
6072#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
6073 case BuiltinType::Id:
6074#include "clang/Basic/OpenCLImageTypes.def"
6075#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
6076 case BuiltinType::Id:
6077#include "clang/Basic/OpenCLExtensionTypes.def"
6080#define SVE_TYPE(Name, Id, SingletonId) \
6081 case BuiltinType::Id:
6082#include "clang/Basic/AArch64SVEACLETypes.def"
6083#define PPC_VECTOR_TYPE(Name, Id, Size) \
6084 case BuiltinType::Id:
6085#include "clang/Basic/PPCTypes.def"
6086#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6087#include "clang/Basic/RISCVVTypes.def"
6088#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6089#include "clang/Basic/WebAssemblyReferenceTypes.def"
6090#define AMDGPU_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6091#include "clang/Basic/AMDGPUTypes.def"
6092#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6093#include "clang/Basic/HLSLIntangibleTypes.def"
6094#define PLACEHOLDER_TYPE(ID, SINGLETON_ID)
6095#define BUILTIN_TYPE(ID, SINGLETON_ID) case BuiltinType::ID:
6096#include "clang/AST/BuiltinTypes.def"
6099 case BuiltinType::UnresolvedTemplate:
6102 case BuiltinType::Overload:
6107 case BuiltinType::ARCUnbridgedCast:
6111 case BuiltinType::PseudoObject:
6116 case BuiltinType::UnknownAny:
6120 case BuiltinType::BoundMember:
6121 case BuiltinType::BuiltinFn:
6122 case BuiltinType::IncompleteMatrixIdx:
6123 case BuiltinType::ArraySection:
6124 case BuiltinType::OMPArrayShaping:
6125 case BuiltinType::OMPIterator:
6129 llvm_unreachable(
"bad builtin type kind");
6135 bool hasInvalid =
false;
6136 for (
size_t i = 0, e = args.size(); i != e; i++) {
6139 if (result.
isInvalid()) hasInvalid =
true;
6140 else args[i] = result.
get();
6168 bool NeedsNewDecl =
false;
6181 if (!ParamType->isPointerType() || ParamType.hasAddressSpace() ||
6185 OverloadParams.push_back(ParamType);
6193 NeedsNewDecl =
true;
6206 OverloadParams, EPI);
6215 FT = cast<FunctionProtoType>(OverloadTy);
6216 for (
unsigned i = 0, e = FT->
getNumParams(); i != e; ++i) {
6223 Params.push_back(Parm);
6225 OverloadDecl->setParams(Params);
6227 return OverloadDecl;
6238 !Callee->isVariadic())
6240 if (Callee->getMinRequiredArguments() > ArgExprs.size())
6243 if (
const EnableIfAttr *
Attr =
6244 S.
CheckEnableIf(Callee, Fn->getBeginLoc(), ArgExprs,
true)) {
6245 S.
Diag(Fn->getBeginLoc(),
6246 isa<CXXMethodDecl>(Callee)
6247 ? diag::err_ovl_no_viable_member_function_in_call
6248 : diag::err_ovl_no_viable_function_in_call)
6249 << Callee << Callee->getSourceRange();
6250 S.
Diag(Callee->getLocation(),
6251 diag::note_ovl_candidate_disabled_by_function_cond_attr)
6252 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
6260 const auto GetFunctionLevelDCIfCXXClass =
6268 if (
const auto *MD = dyn_cast<CXXMethodDecl>(DC))
6269 return MD->
getParent()->getCanonicalDecl();
6272 if (
const auto *RD = dyn_cast<CXXRecordDecl>(DC))
6273 return RD->getCanonicalDecl();
6280 const CXXRecordDecl *
const CurParentClass = GetFunctionLevelDCIfCXXClass(S);
6281 if (!CurParentClass)
6288 assert(NamingClass &&
"Must have naming class even for implicit access");
6294 return CurParentClass == NamingClass ||
6343 if (
Call->getNumArgs() != 1)
6346 const Expr *
E =
Call->getCallee()->IgnoreParenImpCasts();
6347 if (!
E || isa<UnresolvedLookupExpr>(
E))
6349 const DeclRefExpr *DRE = dyn_cast_if_present<DeclRefExpr>(
E);
6362 if (BuiltinID != Builtin::BImove && BuiltinID != Builtin::BIforward)
6365 S.
Diag(DRE->
getLocation(), diag::warn_unqualified_call_to_std_cast_function)
6376 if (
Call.isInvalid())
6381 if (
const auto *ULE = dyn_cast<UnresolvedLookupExpr>(Fn);
6382 ULE && ULE->hasExplicitTemplateArgs() &&
6383 ULE->decls_begin() == ULE->decls_end()) {
6385 ? diag::warn_cxx17_compat_adl_only_template_id
6386 : diag::ext_adl_only_template_id)
6394 if (
const auto *CE = dyn_cast<CallExpr>(
Call.get()))
6400 if (
auto *DRE = dyn_cast<DeclRefExpr>(Fn->IgnoreParens());
6401 DRE &&
Call.get()->isValueDependent()) {
6410 Expr *ExecConfig,
bool IsExecConfig,
6411 bool AllowRecovery) {
6422 if (isa<CXXPseudoDestructorExpr>(Fn)) {
6423 if (!ArgExprs.empty()) {
6425 Diag(Fn->getBeginLoc(), diag::err_pseudo_dtor_call_with_args)
6428 ArgExprs.back()->getEndLoc()));
6445 cast<CallExpr>(ExecConfig), ArgExprs,
6451 *
this, dyn_cast<UnresolvedMemberExpr>(Fn->IgnoreParens()),
6460 if (Fn->getType()->isRecordType())
6472 RParenLoc, ExecConfig, IsExecConfig,
6489 Scope, Fn, ULE, LParenLoc, ArgExprs, RParenLoc, ExecConfig,
6492 RParenLoc, ExecConfig, IsExecConfig,
6504 Expr *NakedFn = Fn->IgnoreParens();
6506 bool CallingNDeclIndirectly =
false;
6508 if (
UnaryOperator *UnOp = dyn_cast<UnaryOperator>(NakedFn)) {
6509 if (UnOp->getOpcode() == UO_AddrOf) {
6510 CallingNDeclIndirectly =
true;
6515 if (
auto *DRE = dyn_cast<DeclRefExpr>(NakedFn)) {
6516 NDecl = DRE->getDecl();
6529 nullptr, DRE->isNonOdrUse());
6532 }
else if (
auto *ME = dyn_cast<MemberExpr>(NakedFn))
6533 NDecl = ME->getMemberDecl();
6535 if (
FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(NDecl)) {
6537 FD,
true, Fn->getBeginLoc()))
6549 FD->getBuiltinID()) {
6550 for (
unsigned Idx = 0; Idx < ArgExprs.size() && Idx < FD->param_size();
6554 !ArgExprs[Idx]->getType()->isPointerType())
6558 auto ArgTy = ArgExprs[Idx]->getType();
6559 auto ArgPtTy = ArgTy->getPointeeType();
6560 auto ArgAS = ArgPtTy.getAddressSpace();
6563 bool NeedImplicitASC =
6568 if (!NeedImplicitASC)
6572 if (ArgExprs[Idx]->isGLValue()) {
6574 Context, ArgExprs[Idx]->getType(), CK_NoOp, ArgExprs[Idx],
6579 Qualifiers ArgPtQuals = ArgPtTy.getQualifiers();
6589 CK_AddressSpaceConversion)
6598 assert((Fn->containsErrors() ||
6599 llvm::any_of(ArgExprs,
6600 [](
clang::Expr *
E) { return E->containsErrors(); })) &&
6601 "should only occur in error-recovery path.");
6606 ExecConfig, IsExecConfig);
6617 assert(BuiltInDecl &&
"failed to find builtin declaration");
6621 assert(DeclRef.
isUsable() &&
"Builtin reference cannot fail");
6626 assert(!
Call.isInvalid() &&
"Call to builtin cannot fail!");
6646 Diag(BuiltinLoc, diag::err_invalid_astype_of_different_size)
6664 FunctionDecl *FDecl = dyn_cast_or_null<FunctionDecl>(NDecl);
6665 unsigned BuiltinID = (FDecl ? FDecl->
getBuiltinID() : 0);
6669 if (FDecl->
hasAttr<AnyX86InterruptAttr>()) {
6670 Diag(Fn->getExprLoc(), diag::err_anyx86_interrupt_called);
6673 if (FDecl->
hasAttr<ARMInterruptAttr>()) {
6674 Diag(Fn->getExprLoc(), diag::err_arm_interrupt_called);
6683 if (Caller->hasAttr<AnyX86InterruptAttr>() ||
6684 Caller->hasAttr<AnyX86NoCallerSavedRegistersAttr>()) {
6686 bool HasNonGPRRegisters =
6688 if (HasNonGPRRegisters &&
6689 (!FDecl || !FDecl->
hasAttr<AnyX86NoCallerSavedRegistersAttr>())) {
6690 Diag(Fn->getExprLoc(), diag::warn_anyx86_excessive_regsave)
6691 << (Caller->hasAttr<AnyX86InterruptAttr>() ? 0 : 1);
6704 Fn->getType()->isSpecificBuiltinType(BuiltinType::BuiltinFn)) {
6731 return ExprError(
Diag(LParenLoc, diag::err_typecheck_call_not_function)
6732 << Fn->getType() << Fn->getSourceRange());
6746 return ExprError(
Diag(LParenLoc, diag::err_typecheck_call_not_function)
6747 << Fn->getType() << Fn->getSourceRange());
6754 const auto *Proto = dyn_cast_or_null<FunctionProtoType>(FuncT);
6755 unsigned NumParams = Proto ? Proto->getNumParams() : 0;
6759 assert(UsesADL == ADLCallKind::NotADL &&
6760 "CUDAKernelCallExpr should not use ADL");
6781 TheCall = dyn_cast<CallExpr>(
Result.get());
6782 bool CorrectedTypos = TheCall != TheOldCall;
6783 if (!TheCall)
return Result;
6790 if (CorrectedTypos && Args.size() < NumParams) {
6806 ExprResult E = CheckBuiltinFunctionCall(FDecl, BuiltinID, TheCall);
6815 if (FDecl && !FDecl->
hasAttr<CUDAGlobalAttr>())
6816 return ExprError(
Diag(LParenLoc,diag::err_kern_call_not_global_function)
6817 << FDecl << Fn->getSourceRange());
6823 return ExprError(
Diag(LParenLoc, diag::err_kern_type_not_void_return)
6824 << Fn->getType() << Fn->getSourceRange());
6827 if (FDecl && FDecl->
hasAttr<CUDAGlobalAttr>())
6828 return ExprError(
Diag(LParenLoc, diag::err_global_call_not_config)
6829 << FDecl << Fn->getSourceRange());
6844 for (
const Expr *Arg : Args) {
6845 if (Arg && Arg->getType()->isWebAssemblyTableType()) {
6847 diag::err_wasm_table_as_function_parameter));
6857 assert(isa<FunctionNoProtoType>(FuncT) &&
"Unknown FunctionType!");
6865 if (!Proto || !(Proto->isVariadic() && Args.size() >= Def->
param_size()))
6866 Diag(RParenLoc, diag::warn_call_wrong_number_of_arguments)
6867 << (Args.size() > Def->
param_size()) << FDecl << Fn->getSourceRange();
6886 if (!Proto && !Args.empty() &&
6890 Diag(LParenLoc, diag::warn_strict_uses_without_prototype)
6891 << (FDecl !=
nullptr) << FDecl;
6894 for (
unsigned i = 0, e = Args.size(); i != e; i++) {
6895 Expr *Arg = Args[i];
6897 if (Proto && i < Proto->getNumParams()) {
6899 Context, Proto->getParamType(i), Proto->isParamConsumed(i));
6917 diag::err_call_incomplete_argument, Arg))
6925 if (
CXXMethodDecl *Method = dyn_cast_or_null<CXXMethodDecl>(FDecl))
6926 if (!isa<RequiresExprBodyDecl>(
CurContext) &&
6927 Method->isImplicitObjectMemberFunction())
6928 return ExprError(
Diag(LParenLoc, diag::err_member_call_without_object)
6929 << Fn->getSourceRange() << 0);
6937 for (
unsigned i = 0, e = Args.size(); i != e; i++) {
6938 if (
const auto *RT =
6939 dyn_cast<RecordType>(Args[i]->getType().getCanonicalType())) {
6940 if (RT->getDecl()->isOrContainsUnion())
6941 Diag(Args[i]->getBeginLoc(), diag::warn_cmse_nonsecure_union)
6952 checkFortifiedBuiltinMemoryFunction(FDecl, TheCall);
6955 return CheckBuiltinFunctionCall(FDecl, BuiltinID, TheCall);
6957 if (CheckPointerCall(NDecl, TheCall, Proto))
6960 if (CheckOtherCall(TheCall, Proto))
6970 assert(Ty &&
"ActOnCompoundLiteral(): missing type");
6971 assert(InitExpr &&
"ActOnCompoundLiteral(): missing expression");
6989 diag::err_array_incomplete_or_sizeless_type,
7012 ? diag::err_variable_object_no_init
7013 : diag::err_compound_literal_with_vla_type;
7020 diag::err_typecheck_decl_incomplete_type,
7035 LiteralExpr =
Result.get();
7063 if (
auto ILE = dyn_cast<InitListExpr>(LiteralExpr))
7064 for (
unsigned i = 0, j = ILE->getNumInits(); i != j; i++) {
7070 VK, LiteralExpr, isFileScope);
7082 Diag(LParenLoc, diag::err_compound_literal_with_address_space)
7118 bool DiagnosedArrayDesignator =
false;
7119 bool DiagnosedNestedDesignator =
false;
7120 bool DiagnosedMixedDesignator =
false;
7124 for (
unsigned I = 0,
E = InitArgList.size(); I !=
E; ++I) {
7125 if (
auto *DIE = dyn_cast<DesignatedInitExpr>(InitArgList[I])) {
7127 FirstDesignator = DIE->getBeginLoc();
7132 if (!DiagnosedNestedDesignator && DIE->size() > 1) {
7133 DiagnosedNestedDesignator =
true;
7134 Diag(DIE->getBeginLoc(), diag::ext_designated_init_nested)
7135 << DIE->getDesignatorsSourceRange();
7138 for (
auto &Desig : DIE->designators()) {
7139 if (!Desig.isFieldDesignator() && !DiagnosedArrayDesignator) {
7140 DiagnosedArrayDesignator =
true;
7141 Diag(Desig.getBeginLoc(), diag::ext_designated_init_array)
7142 << Desig.getSourceRange();
7146 if (!DiagnosedMixedDesignator &&
7147 !isa<DesignatedInitExpr>(InitArgList[0])) {
7148 DiagnosedMixedDesignator =
true;
7149 Diag(DIE->getBeginLoc(), diag::ext_designated_init_mixed)
7150 << DIE->getSourceRange();
7151 Diag(InitArgList[0]->getBeginLoc(), diag::note_designated_init_mixed)
7152 << InitArgList[0]->getSourceRange();
7155 isa<DesignatedInitExpr>(InitArgList[0])) {
7156 DiagnosedMixedDesignator =
true;
7157 auto *DIE = cast<DesignatedInitExpr>(InitArgList[0]);
7158 Diag(DIE->getBeginLoc(), diag::ext_designated_init_mixed)
7159 << DIE->getSourceRange();
7160 Diag(InitArgList[I]->getBeginLoc(), diag::note_designated_init_mixed)
7161 << InitArgList[I]->getSourceRange();
7165 if (FirstDesignator.
isValid()) {
7169 !DiagnosedNestedDesignator && !DiagnosedMixedDesignator) {
7171 ? diag::warn_cxx17_compat_designated_init
7172 : diag::ext_cxx_designated_init);
7174 Diag(FirstDesignator, diag::ext_designated_init);
7189 for (
unsigned I = 0,
E = InitArgList.size(); I !=
E; ++I) {
7190 if (InitArgList[I]->getType()->isNonOverloadPlaceholderType()) {
7197 InitArgList[I] = result.
get();
7231 llvm_unreachable(
"member pointer type in C");
7240 if (SrcAS != DestAS)
7241 return CK_AddressSpaceConversion;
7248 ? CK_BitCast : CK_AnyPointerToBlockPointerCast);
7253 return CK_CPointerToObjCPointerCast;
7255 return CK_BlockPointerToObjCPointerCast;
7257 return CK_PointerToBoolean;
7259 return CK_PointerToIntegral;
7265 llvm_unreachable(
"illegal cast from pointer");
7267 llvm_unreachable(
"Should have returned before this");
7272 return CK_FixedPointCast;
7274 return CK_FixedPointToBoolean;
7276 return CK_FixedPointToIntegral;
7278 return CK_FixedPointToFloating;
7282 diag::err_unimplemented_conversion_with_fixed_point_type)
7284 return CK_IntegralCast;
7289 llvm_unreachable(
"illegal cast to pointer type");
7291 llvm_unreachable(
"Should have returned before this");
7301 return CK_NullToPointer;
7302 return CK_IntegralToPointer;
7304 return CK_IntegralToBoolean;
7306 return CK_IntegralCast;
7308 return CK_IntegralToFloating;
7313 return CK_IntegralRealToComplex;
7317 CK_IntegralToFloating);
7318 return CK_FloatingRealToComplex;
7320 llvm_unreachable(
"member pointer type in C");
7322 return CK_IntegralToFixedPoint;
7324 llvm_unreachable(
"Should have returned before this");
7329 return CK_FloatingCast;
7331 return CK_FloatingToBoolean;
7333 return CK_FloatingToIntegral;
7338 return CK_FloatingRealToComplex;
7342 CK_FloatingToIntegral);
7343 return CK_IntegralRealToComplex;
7347 llvm_unreachable(
"valid float->pointer cast?");
7349 llvm_unreachable(
"member pointer type in C");
7351 return CK_FloatingToFixedPoint;
7353 llvm_unreachable(
"Should have returned before this");
7358 return CK_FloatingComplexCast;
7360 return CK_FloatingComplexToIntegralComplex;
7364 return CK_FloatingComplexToReal;
7366 return CK_FloatingCast;
7369 return CK_FloatingComplexToBoolean;
7373 CK_FloatingComplexToReal);
7374 return CK_FloatingToIntegral;
7378 llvm_unreachable(
"valid complex float->pointer cast?");
7380 llvm_unreachable(
"member pointer type in C");
7383 diag::err_unimplemented_conversion_with_fixed_point_type)
7385 return CK_IntegralCast;
7387 llvm_unreachable(
"Should have returned before this");
7392 return CK_IntegralComplexToFloatingComplex;
7394 return CK_IntegralComplexCast;
7398 return CK_IntegralComplexToReal;
7400 return CK_IntegralCast;
7403 return CK_IntegralComplexToBoolean;
7407 CK_IntegralComplexToReal);
7408 return CK_IntegralToFloating;
7412 llvm_unreachable(
"valid complex int->pointer cast?");
7414 llvm_unreachable(
"member pointer type in C");
7417 diag::err_unimplemented_conversion_with_fixed_point_type)
7419 return CK_IntegralCast;
7421 llvm_unreachable(
"Should have returned before this");
7424 llvm_unreachable(
"Unhandled scalar cast");
7431 len = vecType->getNumElements();
7432 eltType = vecType->getElementType();
7439 if (!
type->isRealType())
return false;
7449 auto ValidScalableConversion = [](
QualType FirstType,
QualType SecondType) {
7453 const auto *VecTy = SecondType->getAs<
VectorType>();
7457 return ValidScalableConversion(srcTy, destTy) ||
7458 ValidScalableConversion(destTy, srcTy);
7468 return matSrcType->
getNumRows() == matDestType->getNumRows() &&
7469 matSrcType->
getNumColumns() == matDestType->getNumColumns();
7475 uint64_t SrcLen, DestLen;
7488 return (SrcLen * SrcEltSize == DestLen * DestEltSize);
7493 "expected at least one type to be a vector here");
7495 bool IsSrcTyAltivec =
7511 return (IsSrcTyAltivec || IsDestTyAltivec);
7538 if (!Vec || !Vec->getElementType()->isIntegralOrEnumerationType())
7543 if (!Vec || !Vec->getElementType()->isIntegralOrEnumerationType())
7560 return Diag(R.
getBegin(), diag::err_invalid_conversion_between_matrixes)
7561 << DestTy << SrcTy << R;
7565 diag::err_invalid_conversion_between_matrix_and_type)
7566 << SrcTy << DestTy << R;
7569 diag::err_invalid_conversion_between_matrix_and_type)
7570 << DestTy << SrcTy << R;
7573 Kind = CK_MatrixCast;
7579 assert(VectorTy->
isVectorType() &&
"Not a vector type!");
7585 diag::err_invalid_conversion_between_vectors :
7586 diag::err_invalid_conversion_between_vector_and_integer)
7587 << VectorTy << Ty << R;
7590 diag::err_invalid_conversion_between_vector_and_scalar)
7591 << VectorTy << Ty << R;
7600 if (DestElemTy == SplattedExpr->
getType())
7601 return SplattedExpr;
7614 CK_BooleanToSignedIntegral);
7615 SplattedExpr = CastExprRes.
get();
7616 CK = CK_IntegralToFloating;
7618 CK = CK_BooleanToSignedIntegral;
7625 SplattedExpr = CastExprRes.
get();
7644 Diag(R.
getBegin(),diag::err_invalid_conversion_between_ext_vectors)
7645 << DestTy << SrcTy << R;
7657 diag::err_invalid_conversion_between_vector_and_scalar)
7658 << DestTy << SrcTy << R;
7660 Kind = CK_VectorSplat;
7668 assert(!
D.isInvalidType() && (
CastExpr !=
nullptr) &&
7669 "ActOnCastExpr(): missing type or expr");
7672 if (
D.isInvalidType())
7691 bool isVectorLiteral =
false;
7706 isVectorLiteral =
true;
7709 isVectorLiteral =
true;
7714 if (isVectorLiteral)
7720 if (isa<ParenListExpr>(
CastExpr)) {
7741 assert((isa<ParenListExpr>(
E) || isa<ParenExpr>(
E)) &&
7742 "Expected paren or paren list expression");
7749 LiteralLParenLoc = PE->getLParenLoc();
7750 LiteralRParenLoc = PE->getRParenLoc();
7751 exprs = PE->getExprs();
7752 numExprs = PE->getNumExprs();
7754 LiteralLParenLoc = cast<ParenExpr>(
E)->getLParen();
7755 LiteralRParenLoc = cast<ParenExpr>(
E)->getRParen();
7756 subExpr = cast<ParenExpr>(
E)->getSubExpr();
7779 if (numExprs == 1) {
7782 if (Literal.isInvalid())
7788 else if (numExprs < numElems) {
7790 diag::err_incorrect_number_of_vector_initializers);
7794 initExprs.append(exprs, exprs + numExprs);
7803 if (Literal.isInvalid())
7810 initExprs.append(exprs, exprs + numExprs);
7815 initExprs, LiteralRParenLoc);
7828 for (
unsigned i = 1, e =
E->getNumExprs(); i != e && !
Result.isInvalid(); ++i)
7845 const Expr *NullExpr = LHSExpr;
7846 const Expr *NonPointerExpr = RHSExpr;
7853 NonPointerExpr = LHSExpr;
7875 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands_null)
7876 << NonPointerExpr->
getType() << DiagType
7888 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_nonfloat)
7896 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_scalar)
7930 bool IsBlockPointer =
false;
7934 IsBlockPointer =
true;
7959 ResultAddrSpace = LAddrSpace;
7961 ResultAddrSpace = RAddrSpace;
7963 S.
Diag(
Loc, diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
7970 auto LHSCastKind = CK_BitCast, RHSCastKind = CK_BitCast;
7985 LAddrSpace == ResultAddrSpace ? CK_BitCast : CK_AddressSpaceConversion;
7987 RAddrSpace == ResultAddrSpace ? CK_BitCast : CK_AddressSpaceConversion;
7995 lhptee, rhptee,
false,
false,
7998 if (CompositeTy.
isNull()) {
8015 S.
Diag(
Loc, diag::ext_typecheck_cond_incompatible_pointers)
8026 QualType ResultTy = [&, ResultAddrSpace]() {
8032 .withCVRQualifiers(MergedCVRQual);
8061 S.
Diag(
Loc, diag::err_typecheck_cond_incompatible_operands)
8114 bool IsIntFirstExpr) {
8116 !Int.get()->getType()->isIntegerType())
8119 Expr *Expr1 = IsIntFirstExpr ? Int.get() : PointerExpr;
8120 Expr *Expr2 = IsIntFirstExpr ? PointerExpr : Int.get();
8122 S.
Diag(
Loc, diag::ext_typecheck_cond_pointer_integer_mismatch)
8126 CK_IntegralToPointer);
8160 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_int_float)
8166 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_int_float)
8172 if (LHSType == RHSType)
8181 return handleIntegerConversion<doIntegralCast, doIntegralCast>
8182 (S, LHS, RHS, LHSType, RHSType,
false);
8216 llvm::raw_svector_ostream OS(Str);
8217 OS <<
"(vector of " << NumElements <<
" '" << EleTyName <<
"' values)";
8218 S.
Diag(QuestionLoc, diag::err_conditional_vector_element_size)
8219 << CondTy << OS.str();
8240 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_nonfloat)
8258 S.
Diag(QuestionLoc, diag::err_conditional_vector_size)
8259 << CondTy << VecResTy;
8264 QualType RVE = RV->getElementType();
8267 S.
Diag(QuestionLoc, diag::err_conditional_vector_element_size)
8268 << CondTy << VecResTy;
8294 bool IsBoolVecLang =
8318 if (
const CallExpr *CE = dyn_cast<CallExpr>(
E)) {
8319 QualType Ty = CE->getCallee()->getType();
8357 "should only occur in error-recovery path.");
8392 Diag(QuestionLoc, diag::err_wasm_table_conditional_expression)
8401 diag::err_typecheck_cond_incompatible_operands) << LHSTy << RHSTy
8420 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands)
8436 if (LHSRT->getDecl() == RHSRT->getDecl())
8480 if (!compositeType.
isNull())
8481 return compositeType;
8515 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands)
8554 const Expr **RHSExprs) {
8559 if (
const auto *MTE = dyn_cast<MaterializeTemporaryExpr>(
E)) {
8560 E = MTE->getSubExpr();
8565 if (
const auto *OP = dyn_cast<BinaryOperator>(
E);
8567 *Opcode = OP->getOpcode();
8568 *RHSExprs = OP->getRHS();
8573 if (
const auto *
Call = dyn_cast<CXXOperatorCallExpr>(
E)) {
8574 if (
Call->getNumArgs() != 2)
8580 if (OO < OO_Plus || OO > OO_Arrow ||
8581 OO == OO_PlusPlus || OO == OO_MinusMinus)
8587 *RHSExprs =
Call->getArg(1);
8603 if (
const auto *OP = dyn_cast<BinaryOperator>(
E))
8604 return OP->isComparisonOp() || OP->isLogicalOp();
8605 if (
const auto *OP = dyn_cast<UnaryOperator>(
E))
8606 return OP->getOpcode() == UO_LNot;
8621 const Expr *RHSExpr) {
8623 const Expr *CondRHS;
8634 ? diag::warn_precedence_bitwise_conditional
8635 : diag::warn_precedence_conditional;
8637 Self.Diag(OpLoc, DiagID)
8643 Self.PDiag(diag::note_precedence_silence)
8648 Self.PDiag(diag::note_precedence_conditional_first),
8659 auto GetNullability = [](
QualType Ty) {
8660 std::optional<NullabilityKind> Kind = Ty->getNullability();
8670 auto LHSKind = GetNullability(LHSTy), RHSKind = GetNullability(RHSTy);
8678 MergedKind = RHSKind;
8685 MergedKind = RHSKind;
8687 MergedKind = LHSKind;
8693 if (GetNullability(ResTy) == MergedKind)
8728 CondExpr = CondResult.
get();
8729 LHSExpr = LHSResult.
get();
8730 RHSExpr = RHSResult.
get();
8736 Expr *commonExpr =
nullptr;
8738 commonExpr = CondExpr;
8745 commonExpr = result.
get();
8759 commonExpr = commonRes.
get();
8769 commonExpr = MatExpr.
get();
8777 LHSExpr = CondExpr = opaqueValue;
8783 ExprResult Cond = CondExpr, LHS = LHSExpr, RHS = RHSExpr;
8785 VK, OK, QuestionLoc);
8793 CheckBoolLikeConversion(Cond.
get(), QuestionLoc);
8801 RHS.get(), result, VK, OK);
8804 commonExpr, opaqueValue, Cond.
get(), LHS.get(), RHS.get(), QuestionLoc,
8805 ColonLoc, result, VK, OK);
8809 unsigned FromAttributes = 0, ToAttributes = 0;
8810 if (
const auto *FromFn =
8814 if (
const auto *ToFn =
8819 return FromAttributes != ToAttributes;
8827 if (
const auto *ToFn =
8829 if (
const auto *FromFn =
8848 assert(LHSType.
isCanonical() &&
"LHS not canonicalized!");
8849 assert(RHSType.
isCanonical() &&
"RHS not canonicalized!");
8852 const Type *lhptee, *rhptee;
8854 std::tie(lhptee, lhq) =
8855 cast<PointerType>(LHSType)->getPointeeType().split().asPair();
8856 std::tie(rhptee, rhq) =
8857 cast<PointerType>(RHSType)->getPointeeType().split().asPair();
8917 diag::warn_typecheck_convert_incompatible_function_pointer_strict,
8940 if (ltrans == rtrans) {
8954 if (isa<PointerType>(lhptee) && isa<PointerType>(rhptee)) {
8956 std::tie(lhptee, lhq) =
8957 cast<PointerType>(lhptee)->getPointeeType().split().asPair();
8958 std::tie(rhptee, rhq) =
8959 cast<PointerType>(rhptee)->getPointeeType().split().asPair();
8972 }
while (isa<PointerType>(lhptee) && isa<PointerType>(rhptee));
8974 if (lhptee == rhptee)
9000 assert(LHSType.
isCanonical() &&
"LHS not canonicalized!");
9001 assert(RHSType.
isCanonical() &&
"RHS not canonicalized!");
9022 if (LQuals != RQuals)
9051 assert(LHSType.
isCanonical() &&
"LHS was not canonicalized!");
9052 assert(RHSType.
isCanonical() &&
"RHS was not canonicalized!");
9100 return VT->getElementType().getCanonicalType() == ElementType;
9133 if (LHSType == RHSType) {
9140 if (
const auto *AT = dyn_cast<AutoType>(LHSType)) {
9141 if (AT->isGNUAutoType()) {
9149 if (
const AtomicType *AtomicTy = dyn_cast<AtomicType>(LHSType)) {
9154 if (Kind != CK_NoOp && ConvertRHS)
9156 Kind = CK_NonAtomicToAtomic;
9169 Kind = CK_LValueBitCast;
9184 Kind = CK_VectorSplat;
9210 << RHSType << LHSType;
9229 << RHSType << LHSType;
9279 if (
const PointerType *LHSPointer = dyn_cast<PointerType>(LHSType)) {
9281 if (isa<PointerType>(RHSType)) {
9282 LangAS AddrSpaceL = LHSPointer->getPointeeType().getAddressSpace();
9284 if (AddrSpaceL != AddrSpaceR)
9285 Kind = CK_AddressSpaceConversion;
9296 Kind = CK_IntegralToPointer;
9302 if (isa<ObjCObjectPointerType>(RHSType)) {
9304 if (LHSPointer->getPointeeType()->isVoidType()) {
9323 if (LHSPointer->getPointeeType()->isVoidType()) {
9324 LangAS AddrSpaceL = LHSPointer->getPointeeType().getAddressSpace();
9329 AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion : CK_BitCast;
9338 if (isa<BlockPointerType>(LHSType)) {
9347 Kind = AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion : CK_BitCast;
9353 Kind = CK_IntegralToPointer;
9359 Kind = CK_AnyPointerToBlockPointerCast;
9365 if (RHSPT->getPointeeType()->isVoidType()) {
9366 Kind = CK_AnyPointerToBlockPointerCast;
9374 if (isa<ObjCObjectPointerType>(LHSType)) {
9380 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
9382 !
ObjC().CheckObjCARCUnavailableWeakConversion(OrigLHSType, RHSType))
9389 Kind = CK_IntegralToPointer;
9395 if (isa<PointerType>(RHSType)) {
9396 Kind = CK_CPointerToObjCPointerCast;
9418 Kind = CK_BlockPointerToObjCPointerCast;
9430 Kind = CK_NullToPointer;
9435 if (isa<PointerType>(RHSType)) {
9438 Kind = CK_PointerToBoolean;
9444 Kind = CK_PointerToIntegral;
9452 if (isa<ObjCObjectPointerType>(RHSType)) {
9455 Kind = CK_PointerToBoolean;
9461 Kind = CK_PointerToIntegral;
9469 if (isa<TagType>(LHSType) && isa<TagType>(RHSType)) {
9477 Kind = CK_IntToOCLSampler;
9519 for (
auto *it : UD->
fields()) {
9520 if (it->getType()->isPointerType()) {
9559 bool DiagnoseCFAudited,
9563 assert((ConvertRHS || !
Diagnose) &&
"can't indicate whether we diagnosed");
9569 ExprResult &RHS = ConvertRHS ? CallerRHS : LocalRHS;
9573 if (RHSPtrType->getPointeeType()->hasAttr(attr::NoDeref) &&
9574 !LHSPtrType->getPointeeType()->hasAttr(attr::NoDeref)) {
9576 diag::warn_noderef_to_dereferenceable_pointer)
9595 AllowedExplicit::None,
9607 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
9608 !
ObjC().CheckObjCARCUnavailableWeakConversion(LHSType, RHSType))
9622 RHS.
get(), LHSType,
false, DAP))
9713 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
9723 ObjC().CheckConversionToObjCLiteral(LHSType,
E,
Diagnose))) {
9743struct OriginalOperand {
9744 explicit OriginalOperand(
Expr *Op) : Orig(Op), Conversion(nullptr) {
9745 if (
auto *MTE = dyn_cast<MaterializeTemporaryExpr>(Op))
9746 Op = MTE->getSubExpr();
9747 if (
auto *BTE = dyn_cast<CXXBindTemporaryExpr>(Op))
9748 Op = BTE->getSubExpr();
9749 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(Op)) {
9750 Orig = ICE->getSubExprAsWritten();
9751 Conversion = ICE->getConversionFunction();
9755 QualType getType()
const {
return Orig->getType(); }
9764 OriginalOperand OrigLHS(LHS.
get()), OrigRHS(RHS.
get());
9766 Diag(
Loc, diag::err_typecheck_invalid_operands)
9767 << OrigLHS.getType() << OrigRHS.getType()
9772 if (OrigLHS.Conversion) {
9773 Diag(OrigLHS.Conversion->getLocation(),
9774 diag::note_typecheck_invalid_operands_converted)
9777 if (OrigRHS.Conversion) {
9778 Diag(OrigRHS.Conversion->getLocation(),
9779 diag::note_typecheck_invalid_operands_converted)
9794 if (!(LHSNatVec && RHSNatVec)) {
9796 Expr *NonVector = !LHSNatVec ? LHS.
get() : RHS.
get();
9797 Diag(
Loc, diag::err_typecheck_logical_vector_expr_gnu_cpp_restrict)
9799 <<
Vector->getSourceRange();
9803 Diag(
Loc, diag::err_typecheck_logical_vector_expr_gnu_cpp_restrict)
9835 DiagID = diag::err_opencl_scalar_type_rank_greater_than_vector_type;
9840 scalarCast = CK_IntegralCast;
9845 DiagID = diag::err_opencl_scalar_type_rank_greater_than_vector_type;
9848 scalarCast = CK_FloatingCast;
9851 scalarCast = CK_IntegralToFloating;
9860 if (scalarCast != CK_NoOp)
9871 assert(VecTy &&
"Expression E must be a vector");
9876 VecTy->getVectorKind());
9880 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(
E))
9881 if (ICE->getSubExpr()->getType() == NewVecTy)
9882 return ICE->getSubExpr();
9884 auto Cast = ElementType->
isIntegerType() ? CK_IntegralCast : CK_FloatingCast;
9892 QualType IntTy = Int->get()->getType().getUnqualifiedType();
9898 bool CstInt = Int->get()->EvaluateAsInt(EVResult, S.
Context);
9907 unsigned NumBits = IntSigned
9909 :
Result.getActiveBits())
9910 :
Result.getActiveBits();
9917 return (IntSigned != OtherIntSigned &&
9930 QualType IntTy = Int->get()->getType().getUnqualifiedType();
9935 bool CstInt = Int->get()->EvaluateAsInt(EVResult, S.
Context);
9947 llvm::APFloat::rmTowardZero);
9950 bool Ignored =
false;
9951 Float.convertToInteger(ConvertBack, llvm::APFloat::rmNearestTiesToEven,
9953 if (
Result != ConvertBack)
9959 unsigned FloatPrec = llvm::APFloat::semanticsPrecision(
9961 if (Bits > FloatPrec)
9974 QualType ScalarTy = Scalar->get()->getType().getUnqualifiedType();
9975 QualType VectorTy =
Vector->get()->getType().getUnqualifiedType();
9979 assert(!isa<ExtVectorType>(VT) &&
9980 "ExtVectorTypes should not be handled here!");
9981 VectorEltTy = VT->getElementType();
9986 llvm_unreachable(
"Only Fixed-Length and SVE Vector types are handled here");
10012 ScalarCast = CK_IntegralCast;
10016 ScalarCast = CK_FloatingToIntegral;
10024 llvm::APFloat
Result(0.0);
10030 bool CstScalar = Scalar->get()->isValueDependent() ||
10033 if (!CstScalar && Order < 0)
10039 bool Truncated =
false;
10041 llvm::APFloat::rmNearestTiesToEven, &Truncated);
10046 ScalarCast = CK_FloatingCast;
10051 ScalarCast = CK_IntegralToFloating;
10058 if (ScalarCast != CK_NoOp)
10066 bool AllowBothBool,
10067 bool AllowBoolConversions,
10068 bool AllowBoolOperation,
10069 bool ReportInvalid) {
10070 if (!IsCompAssign) {
10086 assert(LHSVecType || RHSVecType);
10090 if (!AllowBothBool && LHSVecType &&
10096 if (!AllowBoolOperation &&
10105 if (LHSVecType && RHSVecType &&
10107 if (isa<ExtVectorType>(LHSVecType)) {
10120 if (AllowBoolConversions && LHSVecType && RHSVecType &&
10130 if (!IsCompAssign &&
10133 RHSVecType->getElementType()->isIntegerType()) {
10142 unsigned &SVEorRVV) {
10163 if (IsSveRVVConversion(LHSType, RHSType, SVEorRVV) ||
10164 IsSveRVVConversion(RHSType, LHSType, SVEorRVV)) {
10165 Diag(
Loc, diag::err_typecheck_sve_rvv_ambiguous)
10166 << SVEorRVV << LHSType << RHSType;
10173 unsigned &SVEorRVV) {
10178 if (FirstVecType && SecondVecType) {
10181 SecondVecType->getVectorKind() ==
10186 SecondVecType->getVectorKind() ==
10188 SecondVecType->getVectorKind() ==
10190 SecondVecType->getVectorKind() ==
10199 if (SecondVecType &&
10212 if (IsSveRVVGnuConversion(LHSType, RHSType, SVEorRVV) ||
10213 IsSveRVVGnuConversion(RHSType, LHSType, SVEorRVV)) {
10214 Diag(
Loc, diag::err_typecheck_sve_rvv_gnu_ambiguous)
10215 << SVEorRVV << LHSType << RHSType;
10221 unsigned DiagID = diag::err_typecheck_vector_not_convertable;
10223 if (isa<ExtVectorType>(LHSVecType)) {
10234 if (isa<ExtVectorType>(RHSVecType)) {
10236 LHSType, RHSVecType->getElementType(),
10249 QualType VecType = LHSVecType ? LHSType : RHSType;
10250 const VectorType *VT = LHSVecType ? LHSVecType : RHSVecType;
10251 QualType OtherType = LHSVecType ? RHSType : LHSType;
10252 ExprResult *OtherExpr = LHSVecType ? &RHS : &LHS;
10257 Diag(
Loc, diag::warn_deprecated_lax_vec_conv_all) << RHSType << LHSType;
10261 if (!IsCompAssign) {
10280 if ((!RHSVecType && !RHSType->
isRealType()) ||
10282 Diag(
Loc, diag::err_typecheck_vector_not_convertable_non_scalar)
10283 << LHSType << RHSType
10293 RHSVecType && isa<ExtVectorType>(RHSVecType) &&
10294 LHSVecType && isa<ExtVectorType>(LHSVecType)) {
10295 Diag(
Loc, diag::err_opencl_implicit_vector_conversion) << LHSType
10304 if ((RHSVecType && !isa<ExtVectorType>(RHSVecType)) ||
10305 (LHSVecType && !isa<ExtVectorType>(LHSVecType))) {
10306 QualType Scalar = LHSVecType ? RHSType : LHSType;
10308 unsigned ScalarOrVector = LHSVecType && RHSVecType ? 1 : 0;
10310 diag::err_typecheck_vector_not_convertable_implict_truncation)
10311 << ScalarOrVector << Scalar <<
Vector;
10318 << LHSType << RHSType
10327 if (!IsCompAssign) {
10342 unsigned DiagID = diag::err_typecheck_invalid_operands;
10344 ((LHSBuiltinTy && LHSBuiltinTy->
isSVEBool()) ||
10345 (RHSBuiltinTy && RHSBuiltinTy->isSVEBool()))) {
10366 Diag(
Loc, diag::err_typecheck_vector_not_convertable_non_scalar)
10375 Diag(
Loc, diag::err_typecheck_vector_lengths_not_equal)
10384 bool ScalarOrVector =
10387 Diag(
Loc, diag::err_typecheck_vector_not_convertable_implict_truncation)
10388 << ScalarOrVector << Scalar <<
Vector;
10420 S.
Diag(
Loc, diag::warn_null_in_arithmetic_operation)
10432 S.
Diag(
Loc, diag::warn_null_in_comparison_operation)
10433 << LHSNull << NonNullType
10439 const auto *LUE = dyn_cast<UnaryExprOrTypeTraitExpr>(LHS);
10440 const auto *RUE = dyn_cast<UnaryExprOrTypeTraitExpr>(RHS);
10443 if (LUE->getKind() != UETT_SizeOf || LUE->isArgumentType() ||
10444 RUE->getKind() != UETT_SizeOf)
10451 if (RUE->isArgumentType())
10452 RHSTy = RUE->getArgumentType().getNonReferenceType();
10454 RHSTy = RUE->getArgumentExpr()->IgnoreParens()->getType();
10461 if (
const auto *DRE = dyn_cast<DeclRefExpr>(LHSArg)) {
10462 if (
const ValueDecl *LHSArgDecl = DRE->getDecl())
10463 S.
Diag(LHSArgDecl->getLocation(), diag::note_pointer_declared_here)
10467 QualType ArrayElemTy = ArrayTy->getElementType();
10473 S.
Diag(
Loc, diag::warn_division_sizeof_array)
10475 if (
const auto *DRE = dyn_cast<DeclRefExpr>(LHSArg)) {
10476 if (
const ValueDecl *LHSArgDecl = DRE->getDecl())
10477 S.
Diag(LHSArgDecl->getLocation(), diag::note_array_declared_here)
10481 S.
Diag(
Loc, diag::note_precedence_silence) << RHS;
10494 S.
PDiag(diag::warn_remainder_division_by_zero)
10500 bool IsCompAssign,
bool IsDiv) {
10578 ? diag::err_typecheck_pointer_arith_void_type
10579 : diag::ext_gnu_void_ptr)
10588 ? diag::err_typecheck_pointer_arith_void_type
10589 : diag::ext_gnu_void_ptr)
10590 << 0 <<
Pointer->getSourceRange();
10601 S.
Diag(
Loc, diag::warn_gnu_null_ptr_arith)
10602 <<
Pointer->getSourceRange();
10604 S.
Diag(
Loc, diag::warn_pointer_arith_null_ptr)
10621 S.
PDiag(diag::warn_pointer_sub_null_ptr)
10623 <<
Pointer->getSourceRange());
10632 ? diag::err_typecheck_pointer_arith_function_type
10633 : diag::ext_gnu_ptr_func_arith)
10645 assert(
Pointer->getType()->isAnyPointerType());
10647 ? diag::err_typecheck_pointer_arith_function_type
10648 : diag::ext_gnu_ptr_func_arith)
10649 << 0 <<
Pointer->getType()->getPointeeType()
10651 <<
Pointer->getSourceRange();
10659 QualType ResType = Operand->getType();
10661 ResType = ResAtomicType->getValueType();
10667 diag::err_typecheck_arithmetic_incomplete_or_sizeless_type,
10668 Operand->getSourceRange());
10681 QualType ResType = Operand->getType();
10683 ResType = ResAtomicType->getValueType();
10715 if (!isLHSPointer && !isRHSPointer)
return true;
10717 QualType LHSPointeeTy, RHSPointeeTy;
10722 if (isLHSPointer && isRHSPointer) {
10725 diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
10733 bool isLHSVoidPtr = isLHSPointer && LHSPointeeTy->
isVoidType();
10734 bool isRHSVoidPtr = isRHSPointer && RHSPointeeTy->
isVoidType();
10735 if (isLHSVoidPtr || isRHSVoidPtr) {
10743 bool isLHSFuncPtr = isLHSPointer && LHSPointeeTy->
isFunctionType();
10744 bool isRHSFuncPtr = isRHSPointer && RHSPointeeTy->
isFunctionType();
10745 if (isLHSFuncPtr || isRHSFuncPtr) {
10767 Expr* IndexExpr = RHSExpr;
10770 IndexExpr = LHSExpr;
10773 bool IsStringPlusInt = StrExpr &&
10779 Self.Diag(OpLoc, diag::warn_string_plus_int)
10783 if (IndexExpr == RHSExpr) {
10785 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence)
10790 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence);
10796 const Expr *StringRefExpr = LHSExpr;
10801 CharExpr = dyn_cast<CharacterLiteral>(LHSExpr->
IgnoreImpCasts());
10802 StringRefExpr = RHSExpr;
10805 if (!CharExpr || !StringRefExpr)
10825 Self.Diag(OpLoc, diag::warn_string_plus_char)
10826 << DiagRange << Ctx.
CharTy;
10828 Self.Diag(OpLoc, diag::warn_string_plus_char)
10829 << DiagRange << CharExpr->
getType();
10835 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence)
10840 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence);
10849 S.
Diag(
Loc, diag::err_typecheck_sub_ptr_compatible)
10868 if (CompLHSTy) *CompLHSTy = compType;
10877 *CompLHSTy = compType;
10886 *CompLHSTy = compType;
10896 if (Opc == BO_Add) {
10903 if (CompLHSTy) *CompLHSTy = compType;
10917 std::swap(PExp, IExp);
10928 if (!IExp->getType()->isIntegerType())
10937 (!IExp->isValueDependent() &&
10938 (!IExp->EvaluateAsInt(KnownVal,
Context) ||
10942 Context, BO_Add, PExp, IExp);
10955 if (isa<AddrLabelExpr>(PExp) &&
getLangOpts().PointerAuthIndirectGotos) {
10956 Diag(
Loc, diag::err_ptrauth_indirect_goto_addrlabel_arithmetic)
10962 CheckArrayAccess(PExp, IExp);
10971 *CompLHSTy = LHSTy;
10991 if (CompLHSTy) *CompLHSTy = compType;
11000 *CompLHSTy = compType;
11009 *CompLHSTy = compType;
11022 if (CompLHSTy) *CompLHSTy = compType;
11037 if (isa<AddrLabelExpr>(LHS.
get()) &&
11039 Diag(
Loc, diag::err_ptrauth_indirect_goto_addrlabel_arithmetic)
11065 CheckArrayAccess(LHS.
get(), RHS.
get(),
nullptr,
11068 if (CompLHSTy) *CompLHSTy = LHS.
get()->
getType();
11112 if (ElementSize.
isZero()) {
11113 Diag(
Loc,diag::warn_sub_ptr_zero_size_types)
11119 if (CompLHSTy) *CompLHSTy = LHS.
get()->
getType();
11129 return ET->getDecl()->isScoped();
11146 llvm::APSInt Right = RHSResult.
Val.
getInt();
11148 if (Right.isNegative()) {
11150 S.
PDiag(diag::warn_shift_negative)
11161 LeftSize = FXSema.getWidth() - (
unsigned)FXSema.hasUnsignedPadding();
11163 if (Right.uge(LeftSize)) {
11165 S.
PDiag(diag::warn_shift_gt_typewidth)
11185 llvm::APSInt Left = LHSResult.
Val.
getInt();
11196 if (Left.isNegative()) {
11198 S.
PDiag(diag::warn_shift_lhs_negative)
11203 llvm::APInt ResultBits =
11204 static_cast<llvm::APInt &
>(Right) + Left.getSignificantBits();
11205 if (ResultBits.ule(LeftSize))
11207 llvm::APSInt
Result = Left.extend(ResultBits.getLimitedValue());
11213 Result.toString(HexResult, 16,
false,
true);
11219 if (ResultBits - 1 == LeftSize) {
11220 S.
Diag(
Loc, diag::warn_shift_result_sets_sign_bit)
11221 << HexResult << LHSType
11226 S.
Diag(
Loc, diag::warn_shift_result_gt_typewidth)
11227 << HexResult.str() <<
Result.getSignificantBits() << LHSType
11239 S.
Diag(
Loc, diag::err_shift_rhs_only_vector)
11245 if (!IsCompAssign) {
11267 S.
Diag(
Loc, diag::err_typecheck_invalid_operands)
11274 if (!LHSEleType->isIntegerType()) {
11275 S.
Diag(
Loc, diag::err_typecheck_expect_int)
11280 if (!RHSEleType->isIntegerType()) {
11281 S.
Diag(
Loc, diag::err_typecheck_expect_int)
11290 if (LHSEleType != RHSEleType) {
11292 LHSEleType = RHSEleType;
11298 }
else if (RHSVecTy) {
11303 S.
Diag(
Loc, diag::err_typecheck_vector_lengths_not_equal)
11311 if (LHSBT != RHSBT &&
11313 S.
Diag(
Loc, diag::warn_typecheck_vector_element_sizes_not_equal)
11330 bool IsCompAssign) {
11331 if (!IsCompAssign) {
11354 if ((LHSBuiltinTy && LHSBuiltinTy->
isSVEBool()) ||
11355 (RHSBuiltinTy && RHSBuiltinTy->
isSVEBool())) {
11356 S.
Diag(
Loc, diag::err_typecheck_invalid_operands)
11361 if (!LHSEleType->isIntegerType()) {
11362 S.
Diag(
Loc, diag::err_typecheck_expect_int)
11367 if (!RHSEleType->isIntegerType()) {
11368 S.
Diag(
Loc, diag::err_typecheck_expect_int)
11376 S.
Diag(
Loc, diag::err_typecheck_invalid_operands)
11386 if (LHSEleType != RHSEleType) {
11388 LHSEleType = RHSEleType;
11390 const llvm::ElementCount VecSize =
11399 S.
Diag(
Loc, diag::err_typecheck_vector_lengths_not_equal)
11405 const llvm::ElementCount VecSize =
11407 if (LHSEleType != RHSEleType) {
11409 RHSEleType = LHSEleType;
11422 bool IsCompAssign) {
11456 if (IsCompAssign) LHS = OldLHS;
11487 S.
Diag(
Loc, IsError ? diag::err_typecheck_comparison_of_distinct_pointers
11488 : diag::ext_typecheck_comparison_of_distinct_pointers)
11528 S.
Diag(
Loc, IsError ? diag::err_typecheck_comparison_of_fptr_to_void
11529 : diag::ext_typecheck_comparison_of_fptr_to_void)
11536 case Stmt::ObjCArrayLiteralClass:
11537 case Stmt::ObjCDictionaryLiteralClass:
11538 case Stmt::ObjCStringLiteralClass:
11539 case Stmt::ObjCBoxedExprClass:
11600 Literal = LHS.
get();
11603 Literal = RHS.
get();
11619 llvm_unreachable(
"Unknown Objective-C object literal kind");
11623 S.
Diag(
Loc, diag::warn_objc_string_literal_comparison)
11624 << Literal->getSourceRange();
11626 S.
Diag(
Loc, diag::warn_objc_literal_comparison)
11627 << LiteralKind << Literal->getSourceRange();
11636 S.
Diag(
Loc, diag::note_objc_literal_comparison_isequal)
11649 if (!UO || UO->
getOpcode() != UO_LNot)
return;
11659 bool IsBitwiseOp = Opc == BO_And || Opc == BO_Or || Opc == BO_Xor;
11661 <<
Loc << IsBitwiseOp;
11688 if (
const DeclRefExpr *DR = dyn_cast<DeclRefExpr>(
E)) {
11690 }
else if (
const MemberExpr *Mem = dyn_cast<MemberExpr>(
E)) {
11691 if (Mem->isImplicitAccess())
11692 D = Mem->getMemberDecl();
11696 return D->getType()->isArrayType() && !
D->isWeak();
11747 S.
Diag(
Loc, diag::warn_depr_array_comparison)
11773 Result = AlwaysConstant;
11777 S.
PDiag(diag::warn_comparison_always)
11792 Result = AlwaysConstant;
11796 S.
PDiag(diag::warn_comparison_always)
11802 if (isa<CastExpr>(LHSStripped))
11804 if (isa<CastExpr>(RHSStripped))
11809 Expr *LiteralString =
nullptr;
11810 Expr *LiteralStringStripped =
nullptr;
11811 if ((isa<StringLiteral>(LHSStripped) || isa<ObjCEncodeExpr>(LHSStripped)) &&
11814 LiteralString = LHS;
11815 LiteralStringStripped = LHSStripped;
11816 }
else if ((isa<StringLiteral>(RHSStripped) ||
11817 isa<ObjCEncodeExpr>(RHSStripped)) &&
11820 LiteralString = RHS;
11821 LiteralStringStripped = RHSStripped;
11824 if (LiteralString) {
11826 S.
PDiag(diag::warn_stringcompare)
11827 << isa<ObjCEncodeExpr>(LiteralStringStripped)
11839 llvm_unreachable(
"unhandled cast kind");
11841 case CK_UserDefinedConversion:
11843 case CK_LValueToRValue:
11845 case CK_ArrayToPointerDecay:
11847 case CK_FunctionToPointerDecay:
11849 case CK_IntegralCast:
11851 case CK_FloatingCast:
11853 case CK_IntegralToFloating:
11854 case CK_FloatingToIntegral:
11856 case CK_IntegralComplexCast:
11857 case CK_FloatingComplexCast:
11858 case CK_FloatingComplexToIntegralComplex:
11859 case CK_IntegralComplexToFloatingComplex:
11861 case CK_FloatingComplexToReal:
11862 case CK_FloatingRealToComplex:
11863 case CK_IntegralComplexToReal:
11864 case CK_IntegralRealToComplex:
11866 case CK_HLSLArrayRValue:
11879 if (
const auto *ICE = dyn_cast<ImplicitCastExpr>(
E))
11906 << 0 << FromType << ToType;
11911 llvm_unreachable(
"unhandled case in switch");
11938 if (NumEnumArgs == 1) {
11940 QualType OtherTy = LHSIsEnum ? RHSStrippedType : LHSStrippedType;
11946 if (NumEnumArgs == 2) {
11955 LHSStrippedType->
castAs<
EnumType>()->getDecl()->getIntegerType();
11966 LHSType = RHSType = IntType;
11978 std::optional<ComparisonCategoryType> CCT =
11990 assert(!
Type.isNull() &&
"composite type for <=> has not been set");
12031 if (
const auto *CL = dyn_cast<CharacterLiteral>(
E.get())) {
12032 if (CL->getValue() == 0)
12036 NullValue ?
"NULL" :
"(void *)0");
12037 }
else if (
const auto *CE = dyn_cast<CStyleCastExpr>(
E.get())) {
12044 NullValue ?
"NULL" :
"(void *)0");
12054 bool IsThreeWay = Opc == BO_Cmp;
12055 bool IsOrdered = IsRelational || IsThreeWay;
12066 if (!IsThreeWay || IsAnyPointerType(LHS) || IsAnyPointerType(RHS)) {
12119 auto computeResultTy = [&]() {
12128 std::optional<ComparisonCategoryType> CCT =
12133 if (CompositeTy->
isPointerType() && LHSIsNull != RHSIsNull) {
12137 Diag(
Loc, diag::err_typecheck_three_way_comparison_of_pointer_and_zero)
12147 if (!IsOrdered && LHSIsNull != RHSIsNull) {
12148 bool IsEquality = Opc == BO_EQ;
12160 bool IsError = Opc == BO_Cmp;
12162 IsError ? diag::err_typecheck_ordered_comparison_of_function_pointers
12164 ? diag::warn_typecheck_ordered_comparison_of_function_pointers
12165 : diag::ext_typecheck_ordered_comparison_of_function_pointers;
12194 return computeResultTy();
12210 (IsOrdered ? 2 : 1) &&
12215 return computeResultTy();
12229 if (IsRelational) {
12234 Diag(
Loc, diag::ext_typecheck_compare_complete_incomplete_pointers)
12240 }
else if (!IsRelational &&
12244 && !LHSIsNull && !RHSIsNull)
12251 if (LCanPointeeTy != RCanPointeeTy) {
12256 diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
12257 << LHSType << RHSType << 0
12263 CastKind Kind = AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion
12265 if (LHSIsNull && !RHSIsNull)
12270 return computeResultTy();
12282 if (!IsOrdered && LHSIsNull && RHSIsNull) {
12285 return computeResultTy();
12289 return computeResultTy();
12300 return computeResultTy();
12304 return computeResultTy();
12313 return computeResultTy();
12318 return computeResultTy();
12322 if (IsRelational &&
12331 if (isa<FunctionDecl>(DC))
12333 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
12334 if (CTSD->isInStdNamespace() &&
12335 llvm::StringSwitch<bool>(CTSD->getName())
12336 .Cases(
"less",
"less_equal",
"greater",
"greater_equal",
true)
12342 return computeResultTy();
12355 return computeResultTy();
12365 if (!LHSIsNull && !RHSIsNull &&
12367 Diag(
Loc, diag::err_typecheck_comparison_of_distinct_blocks)
12372 return computeResultTy();
12379 if (!LHSIsNull && !RHSIsNull) {
12384 Diag(
Loc, diag::err_typecheck_comparison_of_distinct_blocks)
12388 if (LHSIsNull && !RHSIsNull)
12391 : CK_AnyPointerToBlockPointerCast);
12395 : CK_AnyPointerToBlockPointerCast);
12396 return computeResultTy();
12405 bool RPtrToVoid = RPT ? RPT->getPointeeType()->isVoidType() :
false;
12407 if (!LPtrToVoid && !RPtrToVoid &&
12415 if (LHSIsNull && !RHSIsNull) {
12421 RPT ? CK_BitCast :CK_CPointerToObjCPointerCast);
12431 LPT ? CK_BitCast :CK_CPointerToObjCPointerCast);
12433 return computeResultTy();
12443 if (LHSIsNull && !RHSIsNull)
12447 return computeResultTy();
12453 CK_BlockPointerToObjCPointerCast);
12454 return computeResultTy();
12455 }
else if (!IsOrdered &&
12459 CK_BlockPointerToObjCPointerCast);
12460 return computeResultTy();
12465 unsigned DiagID = 0;
12466 bool isError =
false;
12475 isError ? diag::err_typecheck_ordered_comparison_of_pointer_and_zero
12476 : diag::ext_typecheck_ordered_comparison_of_pointer_and_zero;
12479 DiagID = diag::err_typecheck_comparison_of_pointer_integer;
12481 }
else if (IsOrdered)
12482 DiagID = diag::ext_typecheck_ordered_comparison_of_pointer_integer;
12484 DiagID = diag::ext_typecheck_comparison_of_pointer_integer;
12496 LHSIsNull ? CK_NullToPointer : CK_IntegralToPointer);
12499 RHSIsNull ? CK_NullToPointer : CK_IntegralToPointer);
12500 return computeResultTy();
12504 if (!IsOrdered && RHSIsNull
12507 return computeResultTy();
12509 if (!IsOrdered && LHSIsNull
12512 return computeResultTy();
12515 if (
getLangOpts().getOpenCLCompatibleVersion() >= 200) {
12517 return computeResultTy();
12521 return computeResultTy();
12524 if (LHSIsNull && RHSType->
isQueueT()) {
12526 return computeResultTy();
12529 if (LHSType->
isQueueT() && RHSIsNull) {
12531 return computeResultTy();
12542 if (isa<ExtVectorType>(VTy)) {
12556 "Unhandled vector element size in vector compare");
12576 "Unhandled vector element size in vector compare");
12596 if (Opc == BO_Cmp) {
12597 Diag(
Loc, diag::err_three_way_vector_comparison);
12628 Diag(
Loc, diag::warn_deprecated_altivec_src_compat);
12658 if (Opc == BO_Cmp) {
12659 Diag(
Loc, diag::err_three_way_vector_comparison);
12687 if (LHSBuiltinTy && RHSBuiltinTy && LHSBuiltinTy->
isSVEBool() &&
12688 RHSBuiltinTy->isSVEBool())
12707 bool Negative =
false;
12708 bool ExplicitPlus =
false;
12709 const auto *LHSInt = dyn_cast<IntegerLiteral>(XorLHS.
get());
12710 const auto *RHSInt = dyn_cast<IntegerLiteral>(XorRHS.
get());
12716 if (
const auto *UO = dyn_cast<UnaryOperator>(XorRHS.
get())) {
12718 if (Opc != UO_Minus && Opc != UO_Plus)
12720 RHSInt = dyn_cast<IntegerLiteral>(UO->getSubExpr());
12723 Negative = (Opc == UO_Minus);
12724 ExplicitPlus = !Negative;
12730 const llvm::APInt &LeftSideValue = LHSInt->getValue();
12731 llvm::APInt RightSideValue = RHSInt->getValue();
12732 if (LeftSideValue != 2 && LeftSideValue != 10)
12735 if (LeftSideValue.getBitWidth() != RightSideValue.getBitWidth())
12740 llvm::StringRef ExprStr =
12745 llvm::StringRef XorStr =
12748 if (XorStr ==
"xor")
12759 RightSideValue = -RightSideValue;
12760 RHSStr =
"-" + RHSStr;
12761 }
else if (ExplicitPlus) {
12762 RHSStr =
"+" + RHSStr;
12765 StringRef LHSStrRef = LHSStr;
12766 StringRef RHSStrRef = RHSStr;
12769 if (LHSStrRef.starts_with(
"0b") || LHSStrRef.starts_with(
"0B") ||
12770 RHSStrRef.starts_with(
"0b") || RHSStrRef.starts_with(
"0B") ||
12771 LHSStrRef.starts_with(
"0x") || LHSStrRef.starts_with(
"0X") ||
12772 RHSStrRef.starts_with(
"0x") || RHSStrRef.starts_with(
"0X") ||
12773 (LHSStrRef.size() > 1 && LHSStrRef.starts_with(
"0")) ||
12774 (RHSStrRef.size() > 1 && RHSStrRef.starts_with(
"0")) ||
12775 LHSStrRef.contains(
'\'') || RHSStrRef.contains(
'\''))
12780 const llvm::APInt XorValue = LeftSideValue ^ RightSideValue;
12781 int64_t RightSideIntValue = RightSideValue.getSExtValue();
12782 if (LeftSideValue == 2 && RightSideIntValue >= 0) {
12783 std::string SuggestedExpr =
"1 << " + RHSStr;
12784 bool Overflow =
false;
12785 llvm::APInt One = (LeftSideValue - 1);
12786 llvm::APInt PowValue = One.sshl_ov(RightSideValue, Overflow);
12788 if (RightSideIntValue < 64)
12789 S.
Diag(
Loc, diag::warn_xor_used_as_pow_base)
12790 << ExprStr <<
toString(XorValue, 10,
true) << (
"1LL << " + RHSStr)
12792 else if (RightSideIntValue == 64)
12793 S.
Diag(
Loc, diag::warn_xor_used_as_pow)
12794 << ExprStr <<
toString(XorValue, 10,
true);
12798 S.
Diag(
Loc, diag::warn_xor_used_as_pow_base_extra)
12799 << ExprStr <<
toString(XorValue, 10,
true) << SuggestedExpr
12802 ExprRange, (RightSideIntValue == 0) ?
"1" : SuggestedExpr);
12805 S.
Diag(
Loc, diag::note_xor_used_as_pow_silence)
12806 << (
"0x2 ^ " + RHSStr) << SuggestXor;
12807 }
else if (LeftSideValue == 10) {
12808 std::string SuggestedValue =
"1e" + std::to_string(RightSideIntValue);
12809 S.
Diag(
Loc, diag::warn_xor_used_as_pow_base)
12810 << ExprStr <<
toString(XorValue, 10,
true) << SuggestedValue
12812 S.
Diag(
Loc, diag::note_xor_used_as_pow_silence)
12813 << (
"0xA ^ " + RHSStr) << SuggestXor;
12829 getLangOpts().getOpenCLCompatibleVersion() < 120 &&
12844 bool IsCompAssign) {
12845 if (!IsCompAssign) {
12861 assert((LHSMatType || RHSMatType) &&
"At least one operand must be a matrix");
12870 if (LHSMatType && !RHSMatType) {
12878 if (!LHSMatType && RHSMatType) {
12890 bool IsCompAssign) {
12891 if (!IsCompAssign) {
12902 assert((LHSMatType || RHSMatType) &&
"At least one operand must be a matrix");
12904 if (LHSMatType && RHSMatType) {
12905 if (LHSMatType->getNumColumns() != RHSMatType->
getNumRows())
12913 QualType LHSELTy = LHSMatType->getElementType(),
12944 bool IsCompAssign =
12945 Opc == BO_AndAssign || Opc == BO_OrAssign || Opc == BO_XorAssign;
12956 LegalBoolVecOperator,
12986 ExprResult LHSResult = LHS, RHSResult = RHS;
12989 if (LHSResult.
isInvalid() || RHSResult.isInvalid())
12991 LHS = LHSResult.
get();
12992 RHS = RHSResult.
get();
13011 bool EnumConstantInBoolContext =
false;
13013 if (
const auto *DREHS = dyn_cast<DeclRefExpr>(HS.get())) {
13014 const auto *ECDHS = dyn_cast<EnumConstantDecl>(DREHS->getDecl());
13015 if (ECDHS && ECDHS->getInitVal() != 0 && ECDHS->getInitVal() != 1)
13016 EnumConstantInBoolContext =
true;
13020 if (EnumConstantInBoolContext)
13021 Diag(
Loc, diag::warn_enum_constant_in_bool_context);
13026 const auto *LHSATy = dyn_cast<ArrayType>(LHSTy);
13027 const auto *RHSATy = dyn_cast<ArrayType>(RHSTy);
13028 if ((LHSATy && LHSATy->getElementType().isWebAssemblyReferenceType()) ||
13029 (RHSATy && RHSATy->getElementType().isWebAssemblyReferenceType())) {
13051 Diag(
Loc, diag::warn_logical_instead_of_bitwise)
13054 Diag(
Loc, diag::note_logical_instead_of_bitwise_change_operator)
13055 << (Opc == BO_LAnd ?
"&" :
"|")
13058 Opc == BO_LAnd ?
"&" :
"|");
13059 if (Opc == BO_LAnd)
13061 Diag(
Loc, diag::note_logical_instead_of_bitwise_remove_constant)
13118 if (!ME)
return false;
13122 if (!
Base)
return false;
13123 return Base->getMethodDecl() !=
nullptr;
13142 if (var->getType().isConstQualified())
return NCCK_None;
13143 assert(var->hasLocalStorage() &&
"capture added 'const' to non-local?");
13151 if (
auto *FD = dyn_cast<FunctionDecl>(DC))
13152 if (var->isInitCapture() &&
13153 FD->getTemplateInstantiationPattern() == var->getDeclContext())
13155 if (DC == var->getDeclContext())
13161 if (!var->isInitCapture())
13194 bool DiagnosticEmitted =
false;
13198 bool IsDereference =
false;
13199 bool NextIsDereference =
false;
13203 IsDereference = NextIsDereference;
13206 if (
const MemberExpr *ME = dyn_cast<MemberExpr>(
E)) {
13207 NextIsDereference = ME->isArrow();
13208 const ValueDecl *VD = ME->getMemberDecl();
13209 if (
const FieldDecl *Field = dyn_cast<FieldDecl>(VD)) {
13211 if (Field->isMutable()) {
13212 assert(DiagnosticEmitted &&
"Expected diagnostic not emitted.");
13217 if (!DiagnosticEmitted) {
13218 S.
Diag(
Loc, diag::err_typecheck_assign_const)
13220 << Field->getType();
13221 DiagnosticEmitted =
true;
13224 <<
ConstMember <<
false << Field << Field->getType()
13225 << Field->getSourceRange();
13229 }
else if (
const VarDecl *VDecl = dyn_cast<VarDecl>(VD)) {
13230 if (VDecl->getType().isConstQualified()) {
13231 if (!DiagnosticEmitted) {
13232 S.
Diag(
Loc, diag::err_typecheck_assign_const)
13234 << VDecl->getType();
13235 DiagnosticEmitted =
true;
13238 <<
ConstMember <<
true << VDecl << VDecl->getType()
13239 << VDecl->getSourceRange();
13246 dyn_cast<ArraySubscriptExpr>(
E)) {
13250 dyn_cast<ExtVectorElementExpr>(
E)) {
13257 if (
const CallExpr *CE = dyn_cast<CallExpr>(
E)) {
13261 if (!DiagnosticEmitted) {
13262 S.
Diag(
Loc, diag::err_typecheck_assign_const) << ExprRange
13264 DiagnosticEmitted =
true;
13267 diag::note_typecheck_assign_const)
13271 }
else if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(
E)) {
13273 if (
const ValueDecl *VD = DRE->getDecl()) {
13275 if (!DiagnosticEmitted) {
13276 S.
Diag(
Loc, diag::err_typecheck_assign_const)
13278 DiagnosticEmitted =
true;
13280 S.
Diag(VD->getLocation(), diag::note_typecheck_assign_const)
13281 <<
ConstVariable << VD << VD->getType() << VD->getSourceRange();
13284 }
else if (isa<CXXThisExpr>(
E)) {
13286 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(DC)) {
13287 if (MD->isConst()) {
13288 if (!DiagnosticEmitted) {
13289 S.
Diag(
Loc, diag::err_typecheck_assign_const) << ExprRange
13291 DiagnosticEmitted =
true;
13293 S.
Diag(MD->getLocation(), diag::note_typecheck_assign_const)
13300 if (DiagnosticEmitted)
13317 bool &DiagnosticEmitted) {
13318 std::vector<const RecordType *> RecordTypeList;
13319 RecordTypeList.push_back(Ty);
13320 unsigned NextToCheckIndex = 0;
13323 while (RecordTypeList.size() > NextToCheckIndex) {
13324 bool IsNested = NextToCheckIndex > 0;
13326 RecordTypeList[NextToCheckIndex]->getDecl()->fields()) {
13328 QualType FieldTy = Field->getType();
13330 if (!DiagnosticEmitted) {
13331 S.
Diag(
Loc, diag::err_typecheck_assign_const)
13333 << IsNested << Field;
13334 DiagnosticEmitted =
true;
13336 S.
Diag(Field->getLocation(), diag::note_typecheck_assign_const)
13338 << FieldTy << Field->getSourceRange();
13344 if (!llvm::is_contained(RecordTypeList, FieldRecTy))
13345 RecordTypeList.push_back(FieldRecTy);
13348 ++NextToCheckIndex;
13357 assert(Ty->
isRecordType() &&
"lvalue was not record?");
13360 bool DiagEmitted =
false;
13362 if (
const MemberExpr *ME = dyn_cast<MemberExpr>(
E))
13365 else if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(
E))
13390 unsigned DiagID = 0;
13391 bool NeedType =
false;
13398 DiagID = diag::err_block_decl_ref_not_modifiable_lvalue;
13400 DiagID = diag::err_lambda_decl_ref_not_modifiable_lvalue;
13408 if (declRef && isa<VarDecl>(declRef->
getDecl())) {
13413 if (var->isARCPseudoStrong() &&
13414 (!var->getTypeSourceInfo() ||
13415 !var->getTypeSourceInfo()->getType().isConstQualified())) {
13421 ? diag::err_typecheck_arc_assign_self_class_method
13422 : diag::err_typecheck_arc_assign_self;
13425 }
else if (var->hasAttr<ObjCExternallyRetainedAttr>() ||
13426 isa<ParmVarDecl>(var)) {
13427 DiagID = diag::err_typecheck_arc_assign_externally_retained;
13431 DiagID = diag::err_typecheck_arr_assign_enumeration;
13435 if (
Loc != OrigLoc)
13461 DiagID = diag::err_typecheck_array_not_modifiable_lvalue;
13465 DiagID = diag::err_typecheck_non_object_not_modifiable_lvalue;
13469 DiagID = diag::err_typecheck_lvalue_casts_not_supported;
13472 llvm_unreachable(
"did not take early return for MLV_Valid");
13476 DiagID = diag::err_typecheck_expression_not_modifiable_lvalue;
13481 diag::err_typecheck_incomplete_type_not_modifiable_lvalue,
E);
13483 DiagID = diag::err_typecheck_duplicate_vector_components_not_mlvalue;
13486 llvm_unreachable(
"readonly properties should be processed differently");
13488 DiagID = diag::err_readonly_message_assignment;
13491 DiagID = diag::err_no_subobject_property_setting;
13496 if (
Loc != OrigLoc)
13518 MemberExpr *ML = dyn_cast<MemberExpr>(LHSExpr);
13519 MemberExpr *MR = dyn_cast<MemberExpr>(RHSExpr);
13521 if (!(isa<CXXThisExpr>(ML->
getBase()) && isa<CXXThisExpr>(MR->
getBase())))
13527 if (LHSDecl != RHSDecl)
13532 if (RefTy->getPointeeType().isVolatileQualified())
13535 Sema.
Diag(
Loc, diag::warn_identity_field_assign) << 0;
13545 Sema.
Diag(
Loc, diag::warn_identity_field_assign) << 1;
13569 Diag(
Loc, diag::err_opencl_half_load_store) << 1
13576 Diag(
Loc, diag::err_wasm_table_art) << 0;
13581 if (CompoundType.
isNull()) {
13600 Diag(
Loc, diag::err_objc_object_assignment)
13607 RHSCheck = ICE->getSubExpr();
13608 if (
UnaryOperator *UO = dyn_cast<UnaryOperator>(RHSCheck)) {
13609 if ((UO->getOpcode() == UO_Plus || UO->getOpcode() == UO_Minus) &&
13610 Loc.
isFileID() && UO->getOperatorLoc().isFileID() &&
13616 UO->getSubExpr()->getBeginLoc().
isFileID()) {
13617 Diag(
Loc, diag::warn_not_compound_assign)
13618 << (UO->getOpcode() == UO_Plus ?
"+" :
"-")
13619 <<
SourceRange(UO->getOperatorLoc(), UO->getOperatorLoc());
13629 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(InnerLHS);
13668 if (CompoundType.
isNull()) {
13694 if (
const CastExpr *CE = dyn_cast<CastExpr>(
E)) {
13695 if (CE->getCastKind() == CK_ToVoid) {
13701 CE->getSubExpr()->getType()->isDependentType()) {
13706 if (
const auto *CE = dyn_cast<CallExpr>(
E))
13707 return CE->getCallReturnType(Context)->isVoidType();
13727 const unsigned ForIncrementFlags =
13733 if ((ScopeFlags & ForIncrementFlags) == ForIncrementFlags ||
13734 (ScopeFlags & ForInitFlags) == ForInitFlags)
13739 while (
const BinaryOperator *BO = dyn_cast<BinaryOperator>(LHS)) {
13740 if (BO->getOpcode() != BO_Comma)
13742 LHS = BO->getRHS();
13749 Diag(
Loc, diag::warn_comma_operator);
13753 LangOpts.CPlusPlus ?
"static_cast<void>("
13785 diag::err_incomplete_type);
13806 ResType = ResAtomicType->getValueType();
13808 assert(!ResType.
isNull() &&
"no type for increment/decrement expression");
13818 : diag::warn_increment_bool)
13822 S.
Diag(OpLoc, diag::err_increment_decrement_enum) << IsInc << ResType;
13838 S.
Diag(OpLoc, S.
getLangOpts().C2y ? diag::warn_c2y_compat_increment_complex
13839 : diag::ext_c2y_increment_complex)
13856 S.
Diag(OpLoc, diag::err_typecheck_illegal_increment_decrement)
13867 S.
Diag(OpLoc, diag::warn_deprecated_increment_decrement_volatile)
13868 << IsInc << ResType;
13900 case Stmt::DeclRefExprClass:
13901 return cast<DeclRefExpr>(
E)->getDecl();
13902 case Stmt::MemberExprClass:
13906 if (cast<MemberExpr>(
E)->isArrow())
13910 case Stmt::ArraySubscriptExprClass: {
13913 Expr*
Base = cast<ArraySubscriptExpr>(
E)->getBase();
13915 if (ICE->getSubExpr()->getType()->isArrayType())
13920 case Stmt::UnaryOperatorClass: {
13932 case Stmt::ParenExprClass:
13934 case Stmt::ImplicitCastExprClass:
13938 case Stmt::CXXUuidofExprClass:
13939 return cast<CXXUuidofExpr>(
E)->getGuidDecl();
13948 AO_Vector_Element = 1,
13949 AO_Property_Expansion = 2,
13950 AO_Register_Variable = 3,
13951 AO_Matrix_Element = 4,
13966 const auto *DRE = cast<DeclRefExpr>(Op->
IgnoreParens());
13969 return Diag(OpLoc, diag::err_parens_pointer_member_function)
13973 if (isa<CXXDestructorDecl>(MD))
13974 return Diag(OpLoc, diag::err_typecheck_addrof_dtor)
13975 << DRE->getSourceRange();
13977 if (DRE->getQualifier())
13981 return Diag(OpLoc, diag::err_unqualified_pointer_member_function)
13982 << DRE->getSourceRange();
13986 return Diag(OpLoc, diag::err_unqualified_pointer_member_function)
13987 << DRE->getSourceRange()
13993 if (PTy->getKind() == BuiltinType::Overload) {
13995 if (!isa<OverloadExpr>(
E)) {
13996 assert(cast<UnaryOperator>(
E)->getOpcode() == UO_AddrOf);
13997 Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof_addrof_function)
14003 if (isa<UnresolvedMemberExpr>(Ovl))
14005 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
14013 if (PTy->getKind() == BuiltinType::UnknownAny)
14016 if (PTy->getKind() == BuiltinType::BoundMember) {
14017 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
14040 auto* VarRef = dyn_cast<DeclRefExpr>(op);
14041 if (VarRef && VarRef->refersToEnclosingVariableOrCapture()) {
14042 Diag(op->
getExprLoc(), diag::err_opencl_taking_address_capture);
14050 if (uOp->getOpcode() == UO_Deref)
14053 return uOp->getSubExpr()->getType();
14060 if (
auto *FD = dyn_cast_or_null<FunctionDecl>(dcl))
14066 unsigned AddressOfError = AO_No_Error;
14071 : diag::ext_typecheck_addrof_temporary)
14078 }
else if (isa<ObjCSelectorExpr>(op)) {
14085 if (!isa<DeclRefExpr>(op)) {
14086 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
14105 auto ReturnOrParamTypeIsIncomplete = [&](
QualType T,
14110 diag::note_ptrauth_virtual_function_pointer_incomplete_arg_ret);
14111 Diag(RetArgTypeLoc,
14112 diag::note_ptrauth_virtual_function_incomplete_arg_ret_type)
14119 bool IsIncomplete =
14121 ReturnOrParamTypeIsIncomplete(
14124 IsIncomplete |= ReturnOrParamTypeIsIncomplete(PVD->getType(), OpLoc,
14125 PVD->getBeginLoc());
14139 if (isa<PseudoObjectExpr>(op)) {
14140 AddressOfError = AO_Property_Expansion;
14142 Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof)
14146 }
else if (
const auto *DRE = dyn_cast<DeclRefExpr>(op)) {
14147 if (
const auto *MD = dyn_cast_or_null<CXXMethodDecl>(DRE->getDecl()))
14153 AddressOfError = AO_Bit_Field;
14156 AddressOfError = AO_Vector_Element;
14159 AddressOfError = AO_Matrix_Element;
14163 if (
const VarDecl *vd = dyn_cast<VarDecl>(dcl)) {
14168 AddressOfError = AO_Register_Variable;
14170 }
else if (isa<MSPropertyDecl>(dcl)) {
14171 AddressOfError = AO_Property_Expansion;
14172 }
else if (isa<FunctionTemplateDecl>(dcl)) {
14174 }
else if (isa<FieldDecl>(dcl) || isa<IndirectFieldDecl>(dcl)) {
14184 if (isa<DeclRefExpr>(op) && cast<DeclRefExpr>(op)->getQualifier() &&
14185 !isa<ParenExpr>(OrigOp.
get())) {
14190 diag::err_cannot_form_pointer_to_member_of_reference_type)
14195 while (cast<RecordDecl>(Ctx)->isAnonymousStructOrUnion())
14209 llvm_unreachable(
"Unknown/unexpected decl type");
14212 if (AddressOfError != AO_No_Error) {
14232 Diag(OpLoc, diag::err_wasm_ca_reference)
14237 Diag(OpLoc, diag::err_wasm_table_pr)
14243 CheckAddressOfPackedMember(op);
14249 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Exp);
14259 if (!FD->hasAttr<NonNullAttr>() && !Param->
hasAttr<NonNullAttr>())
14262 FD->ModifiedNonNullParams.insert(Param);
14268 bool IsAfterAmp =
false) {
14272 Op = ConvResult.
get();
14276 if (isa<CXXReinterpretCastExpr>(Op)) {
14284 Result = PT->getPointeeType();
14288 Result = OPT->getPointeeType();
14292 if (PR.
get() != Op)
14297 S.
Diag(OpLoc, diag::err_typecheck_indirection_requires_pointer)
14302 if (
Result->isVoidType()) {
14308 S.
Diag(OpLoc, diag::err_typecheck_indirection_through_void_pointer_cpp)
14311 S.
Diag(OpLoc, diag::ext_typecheck_indirection_through_void_pointer)
14328 default: llvm_unreachable(
"Unknown binop!");
14329 case tok::periodstar: Opc = BO_PtrMemD;
break;
14330 case tok::arrowstar: Opc = BO_PtrMemI;
break;
14331 case tok::star: Opc = BO_Mul;
break;
14332 case tok::slash: Opc = BO_Div;
break;
14333 case tok::percent: Opc = BO_Rem;
break;
14334 case tok::plus: Opc = BO_Add;
break;
14335 case tok::minus: Opc = BO_Sub;
break;
14336 case tok::lessless: Opc = BO_Shl;
break;
14337 case tok::greatergreater: Opc = BO_Shr;
break;
14338 case tok::lessequal: Opc = BO_LE;
break;
14339 case tok::less: Opc = BO_LT;
break;
14340 case tok::greaterequal: Opc = BO_GE;
break;
14341 case tok::greater: Opc = BO_GT;
break;
14342 case tok::exclaimequal: Opc = BO_NE;
break;
14343 case tok::equalequal: Opc = BO_EQ;
break;
14344 case tok::spaceship: Opc = BO_Cmp;
break;
14345 case tok::amp: Opc = BO_And;
break;
14346 case tok::caret: Opc = BO_Xor;
break;
14347 case tok::pipe: Opc = BO_Or;
break;
14348 case tok::ampamp: Opc = BO_LAnd;
break;
14349 case tok::pipepipe: Opc = BO_LOr;
break;
14350 case tok::equal: Opc = BO_Assign;
break;
14351 case tok::starequal: Opc = BO_MulAssign;
break;
14352 case tok::slashequal: Opc = BO_DivAssign;
break;
14353 case tok::percentequal: Opc = BO_RemAssign;
break;
14354 case tok::plusequal: Opc = BO_AddAssign;
break;
14355 case tok::minusequal: Opc = BO_SubAssign;
break;
14356 case tok::lesslessequal: Opc = BO_ShlAssign;
break;
14357 case tok::greatergreaterequal: Opc = BO_ShrAssign;
break;
14358 case tok::ampequal: Opc = BO_AndAssign;
break;
14359 case tok::caretequal: Opc = BO_XorAssign;
break;
14360 case tok::pipeequal: Opc = BO_OrAssign;
break;
14361 case tok::comma: Opc = BO_Comma;
break;
14370 default: llvm_unreachable(
"Unknown unary op!");
14371 case tok::plusplus: Opc = UO_PreInc;
break;
14372 case tok::minusminus: Opc = UO_PreDec;
break;
14373 case tok::amp: Opc = UO_AddrOf;
break;
14374 case tok::star: Opc = UO_Deref;
break;
14375 case tok::plus: Opc = UO_Plus;
break;
14376 case tok::minus: Opc = UO_Minus;
break;
14377 case tok::tilde: Opc = UO_Not;
break;
14378 case tok::exclaim: Opc = UO_LNot;
break;
14379 case tok::kw___real: Opc = UO_Real;
break;
14380 case tok::kw___imag: Opc = UO_Imag;
break;
14381 case tok::kw___extension__: Opc = UO_Extension;
break;
14397 if (!isa<ParmVarDecl>(SelfAssigned))
14399 const auto *Method =
14413 llvm::find_if(
Parent->fields(),
14415 return F->getDeclName() == Name;
14417 return (Field !=
Parent->field_end()) ? *Field :
nullptr;
14432 const DeclRefExpr *LHSDeclRef = dyn_cast<DeclRefExpr>(LHSExpr);
14433 const DeclRefExpr *RHSDeclRef = dyn_cast<DeclRefExpr>(RHSExpr);
14434 if (!LHSDeclRef || !RHSDeclRef ||
14442 if (LHSDecl != RHSDecl)
14447 if (RefTy->getPointeeType().isVolatileQualified())
14450 auto Diag = S.
Diag(OpLoc, IsBuiltin ? diag::warn_self_assignment_builtin
14451 : diag::warn_self_assignment_overloaded)
14456 Diag << 1 << SelfAssignField
14469 const Expr *ObjCPointerExpr =
nullptr, *OtherExpr =
nullptr;
14474 ObjCPointerExpr = LHS;
14478 ObjCPointerExpr = RHS;
14486 if (ObjCPointerExpr && isa<IntegerLiteral>(OtherExpr->IgnoreParenCasts())) {
14487 unsigned Diag = diag::warn_objc_pointer_masking;
14495 StringRef SelArg0 = S.getNameForSlot(0);
14496 if (SelArg0.starts_with(
"performSelector"))
14497 Diag = diag::warn_objc_pointer_masking_performSelector;
14508 if (
auto *DRE = dyn_cast<DeclRefExpr>(
E))
14509 return DRE->getDecl();
14510 if (
auto *ME = dyn_cast<MemberExpr>(
E))
14511 return ME->getMemberDecl();
14512 if (
auto *IRE = dyn_cast<ObjCIvarRefExpr>(
E))
14513 return IRE->getDecl();
14528 "Result must be a vector of half or short");
14531 "both operands expected to be a half vector");
14543 ResultTy, VK, OK, OpLoc, FPFeatures,
14544 BinOpResTy, BinOpResTy);
14548 BinOpResTy, VK, OK, OpLoc, FPFeatures);
14552static std::pair<ExprResult, ExprResult>
14562 RHS,
nullptr,
false,
14563 [Opc, LHS](
Expr *
E) {
14564 if (Opc != BO_Assign)
14571 return std::make_pair(LHS, RHS);
14578 if (!OpRequiresConversion || Ctx.
getLangOpts().NativeHalfType ||
14582 auto HasVectorOfHalfType = [&Ctx](
Expr *
E) {
14592 return VT->getElementType().getCanonicalType() == Ctx.
HalfTy;
14597 return HasVectorOfHalfType(E0) && (!E1 || HasVectorOfHalfType(E1));
14616 if (
Init.isInvalid())
14618 RHSExpr =
Init.get();
14628 bool ConvertHalfVec =
false;
14631 if (!LHS.
isUsable() || !RHS.isUsable())
14641 if (BO_Assign == Opc)
14642 Diag(OpLoc, diag::err_opencl_atomic_init) << 0 << SR;
14670 if (!ResultTy.
isNull()) {
14687 if (
auto *BE = dyn_cast<BlockExpr>(RHS.get()->IgnoreParens()))
14689 if (
auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
14690 if (VD->hasLocalStorage() &&
getCurScope()->isDeclScope(VD))
14691 BE->getBlockDecl()->setCanAvoidCopyToHeap();
14702 Opc == BO_PtrMemI);
14706 ConvertHalfVec =
true;
14714 ConvertHalfVec =
true;
14718 ConvertHalfVec =
true;
14729 ConvertHalfVec =
true;
14732 if (
const auto *BI = dyn_cast<BinaryOperator>(LHSExpr);
14733 BI && BI->isComparisonOp())
14734 Diag(OpLoc, diag::warn_consecutive_comparison);
14739 ConvertHalfVec =
true;
14743 ConvertHalfVec =
true;
14756 ConvertHalfVec =
true;
14761 ConvertHalfVec =
true;
14763 Opc == BO_DivAssign);
14764 CompLHSTy = CompResultTy;
14771 CompLHSTy = CompResultTy;
14777 ConvertHalfVec =
true;
14784 ConvertHalfVec =
true;
14793 CompLHSTy = CompResultTy;
14804 CompLHSTy = CompResultTy;
14812 VK = RHS.get()->getValueKind();
14813 OK = RHS.get()->getObjectKind();
14827 "both sides are half vectors or neither sides are");
14832 CheckArrayAccess(LHS.
get());
14833 CheckArrayAccess(RHS.get());
14839 if (ObjectSetClass && isa<ObjCIsaExpr>(LHS.
get())) {
14843 "object_setClass(")
14856 if (CompResultTy.
isNull()) {
14857 if (ConvertHalfVec)
14877 if (ConvertHalfVec)
14882 Context, LHS.
get(), RHS.get(), Opc, ResultTy, VK, OK, OpLoc,
14899 if (isLeftComp == isRightComp)
14904 bool isLeftBitwise = LHSBO && LHSBO->
isBitwiseOp();
14905 bool isRightBitwise = RHSBO && RHSBO->
isBitwiseOp();
14906 if (isLeftBitwise || isRightBitwise)
14918 Self.Diag(OpLoc, diag::warn_precedence_bitwise_rel)
14921 Self.PDiag(diag::note_precedence_silence) << OpStr,
14922 (isLeftComp ? LHSExpr : RHSExpr)->getSourceRange());
14924 Self.PDiag(diag::note_precedence_bitwise_first)
14939 Self.PDiag(diag::note_precedence_silence)
14948 if (Bop->getOpcode() == BO_LAnd) {
14951 if (!isa<StringLiteral>(Bop->getLHS()->IgnoreParenImpCasts()))
14953 }
else if (Bop->getOpcode() == BO_LOr) {
14954 if (
BinaryOperator *RBop = dyn_cast<BinaryOperator>(Bop->getRHS())) {
14957 if (RBop->getOpcode() == BO_LAnd &&
14958 isa<StringLiteral>(RBop->getRHS()->IgnoreParenImpCasts()))
14969 if (Bop->getOpcode() == BO_LAnd) {
14972 if (!isa<StringLiteral>(Bop->getRHS()->IgnoreParenImpCasts()))
14984 if (Bop->isBitwiseOp() && Bop->getOpcode() < Opc) {
14985 S.
Diag(Bop->getOperatorLoc(), diag::warn_bitwise_op_in_bitwise_op)
14987 << Bop->getSourceRange() << OpLoc;
14989 S.
PDiag(diag::note_precedence_silence)
14990 << Bop->getOpcodeStr(),
14991 Bop->getSourceRange());
14997 Expr *SubExpr, StringRef Shift) {
14999 if (Bop->getOpcode() == BO_Add || Bop->getOpcode() == BO_Sub) {
15000 StringRef Op = Bop->getOpcodeStr();
15001 S.
Diag(Bop->getOperatorLoc(), diag::warn_addition_in_bitshift)
15002 << Bop->getSourceRange() << OpLoc << Shift << Op;
15004 S.
PDiag(diag::note_precedence_silence) << Op,
15005 Bop->getSourceRange());
15021 if (Kind != OO_LessLess && Kind != OO_GreaterGreater)
15024 S.
Diag(OpLoc, diag::warn_overloaded_shift_in_comparison)
15026 << (Kind == OO_LessLess);
15028 S.
PDiag(diag::note_precedence_silence)
15029 << (Kind == OO_LessLess ?
"<<" :
">>"),
15032 S, OpLoc, S.
PDiag(diag::note_evaluate_comparison_first),
15046 if ((Opc == BO_Or || Opc == BO_Xor) &&
15054 if (Opc == BO_LOr && !OpLoc.
isMacroID()) {
15060 || Opc == BO_Shr) {
15076 assert(LHSExpr &&
"ActOnBinOp(): missing left expression");
15077 assert(RHSExpr &&
"ActOnBinOp(): missing right expression");
15082 return BuildBinOp(S, TokLoc, Opc, LHSExpr, RHSExpr);
15088 if (OverOp !=
OO_None && OverOp != OO_Equal)
15142 LHSExpr = LHS.
get();
15143 RHSExpr = RHS.
get();
15154 if (pty->getKind() == BuiltinType::PseudoObject &&
15167 RHSExpr = resolvedRHS.
get();
15181 (pty->getKind() == BuiltinType::BoundMember ||
15182 pty->getKind() == BuiltinType::Overload)) {
15183 auto *OE = dyn_cast<OverloadExpr>(LHSExpr);
15184 if (OE && !OE->hasTemplateKeyword() && !OE->hasExplicitTemplateArgs() &&
15185 llvm::any_of(OE->decls(), [](
NamedDecl *ND) {
15186 return isa<FunctionTemplateDecl>(ND);
15188 Diag(OE->getQualifier() ? OE->getQualifierLoc().getBeginLoc()
15189 : OE->getNameLoc(),
15190 diag::err_template_kw_missing)
15191 << OE->getName().getAsString() <<
"";
15198 LHSExpr = LHS.
get();
15205 if (Opc == BO_Assign && pty->getKind() == BuiltinType::Overload) {
15221 RHSExpr = resolvedRHS.
get();
15237 "Should only occur in error-recovery path.");
15243 Context, LHSExpr, RHSExpr, Opc,
15263 ResultType = RHSExpr->
getType();
15295 bool CanOverflow =
false;
15297 bool ConvertHalfVec =
false;
15306 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15313 if (Opc == UO_AddrOf)
15314 return ExprError(
Diag(OpLoc, diag::err_hlsl_operator_unsupported) << 0);
15315 if (Opc == UO_Deref)
15316 return ExprError(
Diag(OpLoc, diag::err_hlsl_operator_unsupported) << 1);
15330 Opc == UO_PreInc || Opc == UO_PostInc,
15331 Opc == UO_PreInc || Opc == UO_PreDec);
15336 CheckAddressOfNoDeref(InputExpr);
15349 CanOverflow = Opc == UO_Minus &&
15361 if (ConvertHalfVec)
15378 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15389 Diag(OpLoc, diag::ext_integer_complement_complex)
15398 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15401 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15423 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15439 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15449 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15459 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15466 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15500 "the co_await expression must be non-dependant before "
15501 "building operator co_await");
15512 if (Opc != UO_AddrOf && Opc != UO_Deref)
15513 CheckArrayAccess(Input.
get());
15519 if (Opc == UO_Deref && UO->getType()->hasAttr(attr::NoDeref) &&
15520 !isa<ArrayType>(UO->getType().getDesugaredType(
Context)) &&
15525 if (ConvertHalfVec)
15532 if (!DRE->getQualifier())
15539 if (isa<FieldDecl>(VD) || isa<IndirectFieldDecl>(VD))
15542 return Method->isImplicitObjectMemberFunction();
15548 if (!ULE->getQualifier())
15553 if (Method->isImplicitObjectMemberFunction())
15574 if (pty->getKind() == BuiltinType::PseudoObject &&
15579 if (Opc == UO_Extension)
15584 if (Opc == UO_AddrOf &&
15585 (pty->getKind() == BuiltinType::Overload ||
15586 pty->getKind() == BuiltinType::UnknownAny ||
15587 pty->getKind() == BuiltinType::BoundMember))
15612 Expr *Input,
bool IsAfterAmp) {
15651 assert(SubStmt && isa<CompoundStmt>(SubStmt) &&
"Invalid action invocation!");
15657 "cleanups within StmtExpr not correctly bound!");
15667 bool StmtExprMayBindToTemp =
false;
15670 if (
const auto *LastStmt =
15672 if (
const Expr *
Value = LastStmt->getExprStmt()) {
15673 StmtExprMayBindToTemp =
true;
15681 Expr *ResStmtExpr =
15683 if (StmtExprMayBindToTemp)
15685 return ResStmtExpr;
15708 auto *Cast = dyn_cast<ImplicitCastExpr>(
E);
15709 if (Cast && Cast->getCastKind() == CK_ARCConsumeObject)
15710 return Cast->getSubExpr();
15731 return ExprError(
Diag(BuiltinLoc, diag::err_offsetof_record_type)
15732 << ArgTy << TypeRange);
15738 diag::err_offsetof_incomplete_type, TypeRange))
15741 bool DidWarnAboutNonPOD =
false;
15746 if (OC.isBrackets) {
15751 return ExprError(
Diag(OC.LocEnd, diag::err_offsetof_array_type)
15771 Comps.push_back(
OffsetOfNode(OC.LocStart, Exprs.size(), OC.LocEnd));
15772 Exprs.push_back(Idx);
15780 Comps.push_back(
OffsetOfNode(OC.LocStart, OC.U.IdentInfo, OC.LocEnd));
15787 diag::err_offsetof_incomplete_type))
15793 return ExprError(
Diag(OC.LocEnd, diag::err_offsetof_record_type)
15805 bool IsSafe =
LangOpts.CPlusPlus11? CRD->isStandardLayout() : CRD->isPOD();
15807 LangOpts.CPlusPlus11? diag::ext_offsetof_non_standardlayout_type
15808 : diag::ext_offsetof_non_pod_type;
15811 Diag(BuiltinLoc, DiagID)
15812 <<
SourceRange(Components[0].LocStart, OC.LocEnd) << CurrentType;
15813 DidWarnAboutNonPOD =
true;
15824 MemberDecl = IndirectMemberDecl->getAnonField();
15832 Diag(BuiltinLoc, diag::err_no_member)
15833 << OC.U.IdentInfo << RD <<
SourceRange(OC.LocStart, OC.LocEnd);
15842 Diag(OC.LocEnd, diag::err_offsetof_bitfield)
15850 if (IndirectMemberDecl)
15851 Parent = cast<RecordDecl>(IndirectMemberDecl->getDeclContext());
15858 if (Paths.getDetectedVirtual()) {
15859 Diag(OC.LocEnd, diag::err_offsetof_field_of_virtual_base)
15870 if (IndirectMemberDecl) {
15871 for (
auto *FI : IndirectMemberDecl->chain()) {
15872 assert(isa<FieldDecl>(FI));
15874 cast<FieldDecl>(FI), OC.LocEnd));
15877 Comps.push_back(
OffsetOfNode(OC.LocStart, MemberDecl, OC.LocEnd));
15883 Comps, Exprs, RParenLoc);
15909 assert((CondExpr && LHSExpr && RHSExpr) &&
"Missing type argument(s)");
15914 bool CondIsTrue =
false;
15919 llvm::APSInt condEval(32);
15921 CondExpr, &condEval, diag::err_typecheck_choose_expr_requires_constant);
15924 CondExpr = CondICE.
get();
15925 CondIsTrue = condEval.getZExtValue();
15928 Expr *ActiveExpr = CondIsTrue ? LHSExpr : RHSExpr;
15930 resType = ActiveExpr->
getType();
15936 resType, VK, OK, RPLoc, CondIsTrue);
15948 Decl *ManglingContextDecl;
15949 std::tie(MCtx, ManglingContextDecl) =
15953 Block->setBlockMangling(ManglingNumber, ManglingContextDecl);
15975 "block-id should have no identifier!");
15997 "GetTypeForDeclarator made a non-function block signature");
16013 unsigned Size =
Result.getFullDataSize();
16025 QualType RetTy = Fn->getReturnType();
16027 (isa<FunctionProtoType>(Fn) && cast<FunctionProtoType>(Fn)->isVariadic());
16043 if (ExplicitSignature) {
16044 for (
unsigned I = 0,
E = ExplicitSignature.
getNumParams(); I !=
E; ++I) {
16052 Params.push_back(Param);
16058 for (
const auto &I : Fn->param_types()) {
16061 Params.push_back(Param);
16066 if (!Params.empty()) {
16077 AI->setOwningFunction(CurBlock->
TheDecl);
16080 if (AI->getIdentifier()) {
16086 if (AI->isInvalidDecl())
16105 Diag(CaretLoc, diag::err_blocks_disable) <<
LangOpts.OpenCL;
16111 "cleanups within block not correctly bound!");
16124 bool NoReturn = BD->
hasAttr<NoReturnAttr>();
16132 if (NoReturn && !Ext.getNoReturn()) Ext = Ext.
withNoReturn(
true);
16135 if (isa<FunctionNoProtoType>(FTy)) {
16170 BD->
setBody(cast<CompoundStmt>(Body));
16172 if (Body &&
getCurFunction()->HasPotentialAvailabilityViolations)
16197 Expr *CopyExpr =
nullptr;
16206 if (isa<ParmVarDecl>(Var))
16225 if (!
Result.isInvalid() &&
16226 !
Result.get()->getType().isConstQualified()) {
16228 Result.get()->getType().withConst(),
16232 if (!
Result.isInvalid()) {
16242 if (!
Result.isInvalid() &&
16243 !cast<CXXConstructExpr>(
Result.get())->getConstructor()
16246 CopyExpr =
Result.get();
16253 Captures.push_back(NewCap);
16265 if (
Result->getBlockDecl()->hasCaptures()) {
16272 for (
const auto &CI :
Result->getBlockDecl()->captures()) {
16273 const VarDecl *var = CI.getVariable();
16286 {Result},
Result->getType());
16300 Expr *OrigExpr =
E;
16350 if (
Init.isInvalid())
16366 diag::err_first_argument_to_va_arg_not_of_type_va_list)
16371 diag::err_second_parameter_to_va_arg_incomplete,
16377 diag::err_second_parameter_to_va_arg_abstract,
16384 ? diag::warn_second_parameter_to_va_arg_ownership_qualified
16385 : diag::warn_second_parameter_to_va_arg_not_pod)
16418 UnderlyingType = ET->getDecl()->getIntegerType();
16441 if (!PromoteType.
isNull())
16443 PDiag(diag::warn_second_parameter_to_va_arg_never_compatible)
16465 llvm_unreachable(
"I don't know size of pointer!");
16482 if ((SLDecl->isCompleteDefinition() || SLDecl->isBeingDefined()) &&
16491 S.
Diag(
Loc, diag::err_std_source_location_impl_not_found);
16499 S.
Diag(
Loc, diag::err_std_source_location_impl_malformed);
16503 unsigned Count = 0;
16505 StringRef Name = F->getName();
16507 if (Name ==
"_M_file_name") {
16508 if (F->getType() !=
16512 }
else if (Name ==
"_M_function_name") {
16513 if (F->getType() !=
16517 }
else if (Name ==
"_M_line") {
16518 if (!F->getType()->isIntegerType())
16521 }
else if (Name ==
"_M_column") {
16522 if (!F->getType()->isIntegerType())
16531 S.
Diag(
Loc, diag::err_std_source_location_impl_malformed);
16582 Data->BinaryData = BinaryData;
16585 Data->getDataElementCount());
16589 const Expr *SrcExpr) {
16598 auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl());
16611 bool *Complained) {
16613 *Complained =
false;
16616 bool CheckInferredResultType =
false;
16618 unsigned DiagKind = 0;
16620 bool MayHaveConvFixit =
false;
16621 bool MayHaveFunctionDiff =
false;
16632 DiagKind = diag::err_typecheck_convert_pointer_int;
16635 DiagKind = diag::ext_typecheck_convert_pointer_int;
16638 MayHaveConvFixit =
true;
16642 DiagKind = diag::err_typecheck_convert_int_pointer;
16645 DiagKind = diag::ext_typecheck_convert_int_pointer;
16648 MayHaveConvFixit =
true;
16652 diag::warn_typecheck_convert_incompatible_function_pointer_strict;
16654 MayHaveConvFixit =
true;
16658 DiagKind = diag::err_typecheck_convert_incompatible_function_pointer;
16661 DiagKind = diag::ext_typecheck_convert_incompatible_function_pointer;
16664 MayHaveConvFixit =
true;
16668 DiagKind = diag::err_arc_typecheck_convert_incompatible_pointer;
16670 DiagKind = diag::err_typecheck_convert_incompatible_pointer;
16673 DiagKind = diag::ext_typecheck_convert_incompatible_pointer;
16677 if (CheckInferredResultType) {
16683 MayHaveConvFixit =
true;
16687 DiagKind = diag::err_typecheck_convert_incompatible_pointer_sign;
16690 DiagKind = diag::ext_typecheck_convert_incompatible_pointer_sign;
16695 DiagKind = diag::err_typecheck_convert_pointer_void_func;
16698 DiagKind = diag::ext_typecheck_convert_pointer_void_func;
16710 DiagKind = diag::err_typecheck_incompatible_address_space;
16713 DiagKind = diag::err_typecheck_incompatible_ownership;
16717 llvm_unreachable(
"unknown error case for discarding qualifiers!");
16734 DiagKind = diag::err_typecheck_convert_discards_qualifiers;
16737 DiagKind = diag::ext_typecheck_convert_discards_qualifiers;
16744 DiagKind = diag::err_nested_pointer_qualifier_mismatch;
16746 DiagKind = diag::ext_nested_pointer_qualifier_mismatch;
16750 DiagKind = diag::err_typecheck_incompatible_nested_address_space;
16754 DiagKind = diag::err_int_to_block_pointer;
16758 DiagKind = diag::err_typecheck_convert_incompatible_block_pointer;
16765 for (
auto *srcProto : srcOPT->
quals()) {
16771 IFace = IFaceT->getDecl();
16776 for (
auto *dstProto : dstOPT->
quals()) {
16782 IFace = IFaceT->getDecl();
16785 DiagKind = diag::err_incompatible_qualified_id;
16788 DiagKind = diag::warn_incompatible_qualified_id;
16794 DiagKind = diag::err_incompatible_vectors;
16797 DiagKind = diag::warn_incompatible_vectors;
16801 DiagKind = diag::err_arc_weak_unavailable_assign;
16807 *Complained =
true;
16811 DiagKind = diag::err_typecheck_convert_incompatible;
16813 MayHaveConvFixit =
true;
16815 MayHaveFunctionDiff =
true;
16824 FirstType = DstType;
16825 SecondType = SrcType;
16835 FirstType = SrcType;
16836 SecondType = DstType;
16845 FDiag << FirstType << SecondType << ActionForDiag
16848 if (DiagKind == diag::ext_typecheck_convert_incompatible_pointer_sign ||
16849 DiagKind == diag::err_typecheck_convert_incompatible_pointer_sign) {
16859 if (!ConvHints.
isNull()) {
16864 if (MayHaveConvFixit) { FDiag << (
unsigned) (ConvHints.
Kind); }
16866 if (MayHaveFunctionDiff)
16870 if ((DiagKind == diag::warn_incompatible_qualified_id ||
16871 DiagKind == diag::err_incompatible_qualified_id) &&
16873 Diag(IFace->
getLocation(), diag::note_incomplete_class_and_qualified_id)
16880 if (CheckInferredResultType)
16887 *Complained =
true;
16898 return S.
Diag(
Loc, diag::err_ice_not_integral)
16917 IDDiagnoser(
unsigned DiagID)
16923 } Diagnoser(DiagID);
16958 BaseDiagnoser(BaseDiagnoser) {}
16967 return S.
Diag(
Loc, diag::err_ice_incomplete_type) <<
T;
16972 return S.
Diag(
Loc, diag::err_ice_explicit_conversion) <<
T << ConvTy;
16983 return S.
Diag(
Loc, diag::err_ice_ambiguous_conversion) <<
T;
16994 llvm_unreachable(
"conversion functions are permitted");
16996 } ConvertDiagnoser(Diagnoser);
17002 E = Converted.
get();
17007 if (isa<RecoveryExpr>(
E))
17023 E = RValueExpr.
get();
17031 if (!isa<ConstantExpr>(
E))
17041 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
17042 diag::note_invalid_subexpr_in_const_expr) {
17043 DiagLoc = Notes[0].first;
17065 EvalResult.
Diag = &Notes;
17074 if (!isa<ConstantExpr>(
E))
17080 if (Folded &&
getLangOpts().CPlusPlus11 && Notes.empty()) {
17089 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
17090 diag::note_invalid_subexpr_in_const_expr) {
17091 DiagLoc = Notes[0].first;
17095 if (!Folded || !CanFold) {
17117 class TransformToPE :
public TreeTransform<TransformToPE> {
17121 TransformToPE(
Sema &SemaRef) : BaseTransform(SemaRef) { }
17124 bool AlwaysRebuild() {
return true; }
17125 bool ReplacingOriginal() {
return true; }
17135 if (isa<FieldDecl>(
E->getDecl()) &&
17136 !SemaRef.isUnevaluatedContext())
17137 return SemaRef.Diag(
E->getLocation(),
17138 diag::err_invalid_non_static_member_use)
17141 return BaseTransform::TransformDeclRefExpr(
E);
17149 return BaseTransform::TransformUnaryOperator(
E);
17157 return SkipLambdaBody(
E, Body);
17164 "Should only transform unevaluated expressions");
17169 return TransformToPE(*this).TransformExpr(
E);
17174 "Should only transform unevaluated expressions");
17178 return TransformToPE(*this).TransformType(TInfo);
17186 LambdaContextDecl, ExprContext);
17200 Prev.isImmediateFunctionContext() || Prev.isConstantEvaluated();
17203 Prev.InImmediateEscalatingFunctionContext;
17222 if (
const auto *
E = dyn_cast<UnaryOperator>(PossibleDeref)) {
17223 if (
E->getOpcode() == UO_Deref)
17224 return CheckPossibleDeref(S,
E->getSubExpr());
17225 }
else if (
const auto *
E = dyn_cast<ArraySubscriptExpr>(PossibleDeref)) {
17226 return CheckPossibleDeref(S,
E->getBase());
17227 }
else if (
const auto *
E = dyn_cast<MemberExpr>(PossibleDeref)) {
17228 return CheckPossibleDeref(S,
E->getBase());
17229 }
else if (
const auto E = dyn_cast<DeclRefExpr>(PossibleDeref)) {
17233 Inner = Ptr->getPointeeType();
17235 Inner = Arr->getElementType();
17239 if (Inner->hasAttr(attr::NoDeref))
17249 const DeclRefExpr *DeclRef = CheckPossibleDeref(*
this,
E);
17256 Diag(
E->
getExprLoc(), diag::warn_dereference_of_noderef_type_no_decl)
17271 if (BO->getOpcode() == BO_Assign) {
17273 llvm::erase(LHSs, BO->getLHS());
17281 "Cannot mark an immediate escalating expression outside of an "
17282 "immediate escalating context");
17285 if (
auto *DeclRef =
17286 dyn_cast<DeclRefExpr>(
Call->getCallee()->IgnoreImplicit()))
17287 DeclRef->setIsImmediateEscalating(
true);
17288 }
else if (
auto *Ctr = dyn_cast<CXXConstructExpr>(
E->
IgnoreImplicit())) {
17289 Ctr->setIsImmediateEscalating(
true);
17290 }
else if (
auto *DeclRef = dyn_cast<DeclRefExpr>(
E->
IgnoreImplicit())) {
17291 DeclRef->setIsImmediateEscalating(
true);
17293 assert(
false &&
"expected an immediately escalating expression");
17296 FI->FoundImmediateEscalatingExpression =
true;
17311 if (
auto *DeclRef =
17312 dyn_cast<DeclRefExpr>(
Call->getCallee()->IgnoreImplicit()))
17321 auto CheckConstantExpressionAndKeepResult = [&]() {
17324 Eval.
Diag = &Notes;
17326 Eval,
getASTContext(), ConstantExprKind::ImmediateInvocation);
17327 if (Res && Notes.empty()) {
17328 Cached = std::move(Eval.
Val);
17336 !CheckConstantExpressionAndKeepResult()) {
17371 ExprEvalContexts.back().ImmediateInvocationCandidates.emplace_back(Res, 0);
17379 Eval.
Diag = &Notes;
17383 if (!
Result || !Notes.empty()) {
17386 if (
auto *
FunctionalCast = dyn_cast<CXXFunctionalCastExpr>(InnerExpr))
17389 if (
auto *
Call = dyn_cast<CallExpr>(InnerExpr))
17390 FD = cast<FunctionDecl>(
Call->getCalleeDecl());
17391 else if (
auto *
Call = dyn_cast<CXXConstructExpr>(InnerExpr))
17392 FD =
Call->getConstructor();
17393 else if (
auto *Cast = dyn_cast<CastExpr>(InnerExpr))
17394 FD = dyn_cast_or_null<FunctionDecl>(Cast->getConversionFunction());
17397 "could not find an immediate function in this expression");
17410 for (
auto &
Note : Notes)
17422 llvm::SmallPtrSetImpl<DeclRefExpr *> &DRSet;
17426 ComplexRemove(
Sema &SemaRef, llvm::SmallPtrSetImpl<DeclRefExpr *> &DR,
17429 4>::reverse_iterator Current)
17430 :
Base(SemaRef), DRSet(DR), IISet(II), CurrentII(Current) {}
17432 auto It = std::find_if(CurrentII, IISet.rend(),
17434 return Elem.getPointer() == E;
17440 if (It == IISet.rend()) {
17442 CurrentII->setInt(1);
17448 if (!
E->isImmediateInvocation())
17449 return Base::TransformConstantExpr(
E);
17450 RemoveImmediateInvocation(
E);
17451 return Base::TransformExpr(
E->getSubExpr());
17457 return Base::TransformCXXOperatorCallExpr(
E);
17469 if (
auto *CE = dyn_cast<ConstantExpr>(
Init))
17470 if (CE->isImmediateInvocation())
17471 RemoveImmediateInvocation(CE);
17472 return Base::TransformInitializer(
Init, NotCopyInit);
17483 bool AlwaysRebuild() {
return false; }
17484 bool ReplacingOriginal() {
return true; }
17485 bool AllowSkippingCXXConstructExpr() {
17486 bool Res = AllowSkippingFirstCXXConstructExpr;
17487 AllowSkippingFirstCXXConstructExpr =
true;
17490 bool AllowSkippingFirstCXXConstructExpr =
true;
17500 if (isa<CXXConstructExpr>(It->getPointer()->IgnoreImplicit()))
17501 Transformer.AllowSkippingFirstCXXConstructExpr =
false;
17503 ExprResult Res = Transformer.TransformExpr(It->getPointer()->getSubExpr());
17509 It->getPointer()->setSubExpr(Res.
get());
17544 llvm::SmallPtrSetImpl<DeclRefExpr *> &DRSet;
17545 SimpleRemove(llvm::SmallPtrSetImpl<DeclRefExpr *> &S) : DRSet(S) {}
17548 return DRSet.size();
17551 Visitor.TraverseStmt(
17561 if (DR->isImmediateEscalating())
17563 auto *FD = cast<FunctionDecl>(DR->getDecl());
17565 if (
const auto *MD = dyn_cast<CXXMethodDecl>(ND);
17567 ND = MD->getParent();
17574 bool ImmediateEscalating =
false;
17575 bool IsPotentiallyEvaluated =
17585 SemaRef.
Diag(DR->getBeginLoc(), diag::err_invalid_consteval_take_address)
17586 << ND << isa<CXXRecordDecl>(ND) << FD->isConsteval();
17594 if (FD->isImmediateEscalating() && !FD->isConsteval())
17610 (Rec.
ExprContext == ExpressionKind::EK_TemplateArgument ||
17618 D = diag::err_lambda_unevaluated_operand;
17624 D = diag::err_lambda_in_constant_expression;
17625 }
else if (Rec.
ExprContext == ExpressionKind::EK_TemplateArgument) {
17628 D = diag::err_lambda_in_invalid_context;
17630 llvm_unreachable(
"Couldn't infer lambda error message.");
17632 for (
const auto *L : Rec.
Lambdas)
17633 Diag(L->getBeginLoc(),
D);
17641 PrevRecord.InLifetimeExtendingContext &&
17643 PrevRecord.ForRangeLifetimeExtendTemps.append(
17654 Diag(BO->getBeginLoc(), diag::warn_deprecated_simple_assign_volatile)
17727 llvm_unreachable(
"Invalid context");
17736 if (!TT.isOSWindows() || !TT.isX86())
17774 : FD(FD), Param(Param) {}
17781 CCName =
"stdcall";
17784 CCName =
"fastcall";
17787 CCName =
"vectorcall";
17790 llvm_unreachable(
"CC does not need mangling");
17793 S.
Diag(
Loc, diag::err_cconv_incomplete_param_type)
17799 ParamIncompleteTypeDiagnoser Diagnoser(FD, Param);
17805enum class OdrUseContext {
17827 return OdrUseContext::None;
17832 Result = OdrUseContext::Used;
17836 Result = OdrUseContext::FormallyOdrUsed;
17842 Result = OdrUseContext::FormallyOdrUsed;
17847 return OdrUseContext::Dependent;
17853 if (!
Func->isConstexpr())
17856 if (
Func->isImplicitlyInstantiable() || !
Func->isUserProvided())
17858 auto *CCD = dyn_cast<CXXConstructorDecl>(
Func);
17859 return CCD && CCD->getInheritedConstructor();
17863 bool MightBeOdrUse) {
17864 assert(
Func &&
"No function?");
17866 Func->setReferenced();
17879 OdrUseContext OdrUse =
17881 if (IsRecursiveCall && OdrUse == OdrUseContext::Used)
17882 OdrUse = OdrUseContext::FormallyOdrUsed;
17886 if (
Func->isTrivial() && !
Func->hasAttr<DLLExportAttr>() &&
17887 OdrUse == OdrUseContext::Used) {
17888 if (
auto *Constructor = dyn_cast<CXXConstructorDecl>(
Func))
17889 if (Constructor->isDefaultConstructor())
17890 OdrUse = OdrUseContext::FormallyOdrUsed;
17891 if (isa<CXXDestructorDecl>(
Func))
17892 OdrUse = OdrUseContext::FormallyOdrUsed;
17899 bool NeededForConstantEvaluation =
17924 bool NeedDefinition =
17925 !IsRecursiveCall &&
17926 (OdrUse == OdrUseContext::Used ||
17927 (NeededForConstantEvaluation && !
Func->isPureVirtual()));
17934 if (NeedDefinition &&
17936 Func->getMemberSpecializationInfo()))
17943 if (NeedDefinition && !
Func->getBody()) {
17946 dyn_cast<CXXConstructorDecl>(
Func)) {
17947 Constructor = cast<CXXConstructorDecl>(Constructor->getFirstDecl());
17948 if (Constructor->isDefaulted() && !Constructor->isDeleted()) {
17949 if (Constructor->isDefaultConstructor()) {
17950 if (Constructor->isTrivial() &&
17951 !Constructor->hasAttr<DLLExportAttr>())
17954 }
else if (Constructor->isCopyConstructor()) {
17956 }
else if (Constructor->isMoveConstructor()) {
17959 }
else if (Constructor->getInheritedConstructor()) {
17963 dyn_cast<CXXDestructorDecl>(
Func)) {
17973 if (MethodDecl->isOverloadedOperator() &&
17974 MethodDecl->getOverloadedOperator() == OO_Equal) {
17975 MethodDecl = cast<CXXMethodDecl>(MethodDecl->getFirstDecl());
17976 if (MethodDecl->isDefaulted() && !MethodDecl->isDeleted()) {
17977 if (MethodDecl->isCopyAssignmentOperator())
17979 else if (MethodDecl->isMoveAssignmentOperator())
17982 }
else if (isa<CXXConversionDecl>(MethodDecl) &&
17983 MethodDecl->getParent()->isLambda()) {
17985 cast<CXXConversionDecl>(MethodDecl->getFirstDecl());
17990 }
else if (MethodDecl->isVirtual() &&
getLangOpts().AppleKext)
17994 if (
Func->isDefaulted() && !
Func->isDeleted()) {
18002 if (
Func->isImplicitlyInstantiable()) {
18004 Func->getTemplateSpecializationKindForInstantiation();
18006 bool FirstInstantiation = PointOfInstantiation.
isInvalid();
18007 if (FirstInstantiation) {
18008 PointOfInstantiation =
Loc;
18009 if (
auto *MSI =
Func->getMemberSpecializationInfo())
18010 MSI->setPointOfInstantiation(
Loc);
18013 Func->setTemplateSpecializationKind(TSK, PointOfInstantiation);
18018 PointOfInstantiation =
Loc;
18022 Func->isConstexpr()) {
18023 if (isa<CXXRecordDecl>(
Func->getDeclContext()) &&
18024 cast<CXXRecordDecl>(
Func->getDeclContext())->isLocalClass() &&
18027 std::make_pair(
Func, PointOfInstantiation));
18028 else if (
Func->isConstexpr())
18034 Func->setInstantiationIsPending(
true);
18036 std::make_pair(
Func, PointOfInstantiation));
18043 for (
auto *i :
Func->redecls()) {
18044 if (!i->isUsed(
false) && i->isImplicitlyInstantiable())
18057 Constructor->isImmediateFunction()
18062 if (
Init->isInClassMemberInitializer())
18064 MarkDeclarationsReferencedInExpr(Init->getInit());
18085 if (
LangOpts.OffloadImplicitHostDeviceTemplates &&
LangOpts.CUDAIsDevice &&
18090 if (OdrUse == OdrUseContext::Used && !
Func->isUsed(
false)) {
18092 if (!
Func->isDefined()) {
18093 if (mightHaveNonExternalLinkage(
Func))
18095 else if (
Func->getMostRecentDecl()->isInlined() &&
18097 !
Func->getMostRecentDecl()->hasAttr<GNUInlineAttr>())
18116 if (
auto *Dtor = dyn_cast<CXXDestructorDecl>(
Func)) {
18118 if (
Parent->getNumVBases() > 0 && !Dtor->getBody())
18136 const unsigned *
const FunctionScopeIndexToStopAt =
nullptr) {
18139 VarDecl *Var =
V->getPotentiallyDecomposedVarDecl();
18140 assert(Var &&
"expected a capturable variable");
18150 QualType CaptureType, DeclRefType;
18156 DeclRefType, FunctionScopeIndexToStopAt);
18172 << llvm::to_underlying(UserTarget);
18175 ? diag::note_cuda_const_var_unpromoted
18176 : diag::note_cuda_host_var);
18179 !Var->
hasAttr<CUDASharedAttr>() &&
18195 (!FD || (!FD->getDescribedFunctionTemplate() &&
18207 unsigned CapturingScopeIndex) {
18218 if (isa<ParmVarDecl>(var) &&
18219 isa<TranslationUnitDecl>(VarDC))
18232 unsigned ValueKind = isa<BindingDecl>(var) ? 1 : 0;
18233 unsigned ContextKind = 3;
18234 if (isa<CXXMethodDecl>(VarDC) &&
18235 cast<CXXRecordDecl>(VarDC->
getParent())->isLambda()) {
18237 }
else if (isa<FunctionDecl>(VarDC)) {
18239 }
else if (isa<BlockDecl>(VarDC)) {
18243 S.
Diag(loc, diag::err_reference_to_local_in_enclosing_context)
18244 << var << ValueKind << ContextKind << VarDC;
18245 S.
Diag(var->getLocation(), diag::note_entity_declared_at)
18254 bool &SubCapturesAreNested,
18260 SubCapturesAreNested =
true;
18273 !(isa<LambdaScopeInfo>(CSI) &&
18274 !cast<LambdaScopeInfo>(CSI)->lambdaCaptureShouldBeConst()) &&
18275 !(isa<CapturedRegionScopeInfo>(CSI) &&
18276 cast<CapturedRegionScopeInfo>(CSI)->CapRegionKind ==
CR_OpenMP))
18308 assert((isa<VarDecl, BindingDecl>(Var)) &&
18309 "Only variables and structured bindings can be captured");
18311 bool IsBlock = isa<BlockScopeInfo>(CSI);
18312 bool IsLambda = isa<LambdaScopeInfo>(CSI);
18320 S.
Diag(
Loc, diag::err_lambda_capture_anonymous_var);
18329 S.
Diag(
Loc, diag::err_ref_vm_type);
18337 if (VTTy->getDecl()->hasFlexibleArrayMember()) {
18340 S.
Diag(
Loc, diag::err_ref_flexarray_type);
18342 S.
Diag(
Loc, diag::err_lambda_capture_flexarray_type) << Var;
18348 const bool HasBlocksAttr = Var->
hasAttr<BlocksAttr>();
18351 if (HasBlocksAttr && (IsLambda || isa<CapturedRegionScopeInfo>(CSI))) {
18353 S.
Diag(
Loc, diag::err_capture_block_variable) << Var << !IsLambda;
18362 S.
Diag(
Loc, diag::err_opencl_block_ref_block);
18366 if (isa<BindingDecl>(Var)) {
18373 ? diag::warn_cxx17_compat_capture_binding
18374 : diag::ext_capture_binding)
18388 bool ByRef =
false;
18394 if (BuildAndDiagnose) {
18395 S.
Diag(
Loc, diag::err_ref_array_type);
18406 if (BuildAndDiagnose) {
18407 S.
Diag(
Loc, diag::err_arc_autoreleasing_capture)
18423 if (BuildAndDiagnose) {
18425 S.
Diag(
Loc, diag::warn_block_capture_autoreleasing);
18426 S.
Diag(VarLoc, diag::note_declare_parameter_strong);
18431 const bool HasBlocksAttr = Var->
hasAttr<BlocksAttr>();
18440 DeclRefType = CaptureType;
18444 if (BuildAndDiagnose)
18454 const bool BuildAndDiagnose,
QualType &CaptureType,
QualType &DeclRefType,
18481 CaptureType = DeclRefType;
18484 if (BuildAndDiagnose)
18485 RSI->
addCapture(Var,
false, ByRef, RefersToCapturedVariable,
18495 const bool RefersToCapturedVariable,
18500 bool ByRef =
false;
18504 ByRef = (LSI->
ImpCaptureStyle == LambdaScopeInfo::ImpCap_LambdaByref);
18509 S.
Diag(
Loc, diag::err_wasm_ca_reference) << 0;
18540 if (!RefType->getPointeeType()->isFunctionType())
18547 if (BuildAndDiagnose) {
18548 S.
Diag(
Loc, diag::err_arc_autoreleasing_capture) << 1;
18558 if (!
Invalid && BuildAndDiagnose) {
18562 diag::err_capture_of_incomplete_or_sizeless_type,
18566 diag::err_capture_of_abstract_type))
18587 if (BuildAndDiagnose)
18588 LSI->
addCapture(Var,
false, ByRef, RefersToCapturedVariable,
18600 if (
T.isTriviallyCopyableType(
Context))
18604 if (!(RD = RD->getDefinition()))
18606 if (RD->hasSimpleCopyConstructor())
18608 if (RD->hasUserDeclaredCopyConstructor())
18610 if (Ctor->isCopyConstructor())
18611 return !Ctor->isDeleted();
18631 if (ShouldOfferCopyFix) {
18635 FixBuffer.assign({Separator, Var->
getName()});
18636 Sema.
Diag(VarInsertLoc, diag::note_lambda_variable_capture_fixit)
18641 FixBuffer.assign({Separator,
"&", Var->
getName()});
18642 Sema.
Diag(VarInsertLoc, diag::note_lambda_variable_capture_fixit)
18654 return !C.isThisCapture() && !C.isInitCapture();
18663 if (ShouldOfferCopyFix) {
18664 bool CanDefaultCopyCapture =
true;
18673 if (CanDefaultCopyCapture && llvm::none_of(LSI->
Captures, [](
Capture &
C) {
18674 return !C.isThisCapture() && !C.isInitCapture() && C.isCopyCapture();
18676 FixBuffer.assign({
"=", Separator});
18677 Sema.
Diag(DefaultInsertLoc, diag::note_lambda_default_capture_fixit)
18686 return !C.isInitCapture() && C.isReferenceCapture() &&
18687 !C.isThisCapture();
18689 FixBuffer.assign({
"&", Separator});
18690 Sema.
Diag(DefaultInsertLoc, diag::note_lambda_default_capture_fixit)
18699 QualType &DeclRefType,
const unsigned *
const FunctionScopeIndexToStopAt) {
18722 const auto *VD = dyn_cast<VarDecl>(Var);
18724 if (VD->isInitCapture())
18729 assert(VD &&
"Cannot capture a null variable");
18731 const unsigned MaxFunctionScopesIndex = FunctionScopeIndexToStopAt
18735 if (FunctionScopeIndexToStopAt) {
18737 while (FSIndex != MaxFunctionScopesIndex) {
18745 bool IsGlobal = !VD->hasLocalStorage();
18746 if (IsGlobal && !(
LangOpts.OpenMP &&
18747 OpenMP().isOpenMPCapturedDecl(Var,
true,
18748 MaxFunctionScopesIndex)))
18751 if (isa<VarDecl>(Var))
18762 CaptureType = Var->
getType();
18764 bool Nested =
false;
18766 unsigned FunctionScopesIndex = MaxFunctionScopesIndex;
18771 LSI = dyn_cast_or_null<LambdaScopeInfo>(
18774 bool IsInScopeDeclarationContext =
18785 if (IsInScopeDeclarationContext &&
18786 FunctionScopesIndex == MaxFunctionScopesIndex && VarDC == DC)
18792 !IsInScopeDeclarationContext
18795 BuildAndDiagnose, *
this);
18801 FunctionScopesIndex = MaxFunctionScopesIndex - 1;
18820 if (
const auto *Parm = dyn_cast<ParmVarDecl>(Var);
18821 Parm && Parm->getDeclContext() == DC)
18829 if (BuildAndDiagnose) {
18832 Diag(ExprLoc, diag::err_lambda_impcap) << Var;
18847 if (
ParmVarDecl *PVD = dyn_cast_or_null<ParmVarDecl>(Var))
18848 QTy = PVD->getOriginalType();
18853 if (
auto *RSI = dyn_cast<CapturedRegionScopeInfo>(CSI)) {
18859 if (isa<BindingDecl>(Var)) {
18860 if (BuildAndDiagnose) {
18861 Diag(ExprLoc, diag::err_capture_binding_openmp) << Var;
18867 Var, RSI->OpenMPLevel, RSI->OpenMPCaptureLevel);
18872 if (IsOpenMPPrivateDecl != OMPC_unknown &&
18875 if (
ParmVarDecl *PVD = dyn_cast_or_null<ParmVarDecl>(Var))
18876 QTy = PVD->getOriginalType();
18878 E =
OpenMP().getNumberOfConstructScopes(RSI->OpenMPLevel);
18880 auto *OuterRSI = cast<CapturedRegionScopeInfo>(
18882 assert(RSI->OpenMPLevel == OuterRSI->OpenMPLevel &&
18883 "Wrong number of captured regions associated with the "
18884 "OpenMP construct.");
18889 IsOpenMPPrivateDecl != OMPC_private &&
18891 RSI->OpenMPCaptureLevel);
18895 Var, RSI->OpenMPLevel, RSI->OpenMPCaptureLevel);
18901 OpenMP().adjustOpenMPTargetScopeIndex(FunctionScopesIndex,
18904 if (IsTargetCap || IsOpenMPPrivateDecl == OMPC_private ||
18905 (IsGlobal && !IsGlobalCap)) {
18906 Nested = !IsTargetCap;
18921 if (BuildAndDiagnose) {
18922 Diag(ExprLoc, diag::err_lambda_impcap) << Var;
18924 auto *LSI = cast<LambdaScopeInfo>(CSI);
18944 FunctionScopesIndex--;
18945 if (IsInScopeDeclarationContext)
18947 }
while (!VarDC->
Equals(DC));
18955 for (
unsigned I = ++FunctionScopesIndex, N = MaxFunctionScopesIndex + 1; I != N;
18968 if (
Invalid && !BuildAndDiagnose)
18973 DeclRefType, Nested, *
this,
Invalid);
18977 RSI, Var, ExprLoc, BuildAndDiagnose, CaptureType, DeclRefType, Nested,
18978 Kind, I == N - 1, *
this,
Invalid);
18984 DeclRefType, Nested, Kind, EllipsisLoc,
18989 if (
Invalid && !BuildAndDiagnose)
19001 DeclRefType,
nullptr);
19008 false, CaptureType,
19009 DeclRefType,
nullptr);
19018 false, CaptureType,
19019 DeclRefType,
nullptr))
19022 return DeclRefType;
19030class CopiedTemplateArgs {
19034 template<
typename RefExpr>
19035 CopiedTemplateArgs(RefExpr *
E) : HasArgs(
E->hasExplicitTemplateArgs()) {
19037 E->copyTemplateArgumentsInto(TemplateArgStorage);
19040#ifdef __has_cpp_attribute
19041#
if __has_cpp_attribute(clang::lifetimebound)
19042 [[clang::lifetimebound]]
19046 return HasArgs ? &TemplateArgStorage :
nullptr;
19072 auto Rebuild = [&](
Expr *Sub) {
19077 auto IsPotentialResultOdrUsed = [&](
NamedDecl *
D) {
19080 auto *VD = dyn_cast<VarDecl>(
D);
19103 llvm_unreachable(
"unexpected non-odr-use-reason");
19107 if (VD->getType()->isReferenceType())
19109 if (
auto *RD = VD->getType()->getAsCXXRecordDecl())
19110 if (RD->hasMutableFields())
19112 if (!VD->isUsableInConstantExpressions(S.
Context))
19117 if (VD->getType()->isReferenceType())
19125 auto MarkNotOdrUsed = [&] {
19128 LSI->markVariableExprAsNonODRUsed(
E);
19135 case Expr::DeclRefExprClass: {
19136 auto *DRE = cast<DeclRefExpr>(
E);
19137 if (DRE->isNonOdrUse() || IsPotentialResultOdrUsed(DRE->getDecl()))
19143 S.
Context, DRE->getQualifierLoc(), DRE->getTemplateKeywordLoc(),
19144 DRE->getDecl(), DRE->refersToEnclosingVariableOrCapture(),
19145 DRE->getNameInfo(), DRE->getType(), DRE->getValueKind(),
19146 DRE->getFoundDecl(), CopiedTemplateArgs(DRE), NOUR);
19149 case Expr::FunctionParmPackExprClass: {
19150 auto *FPPE = cast<FunctionParmPackExpr>(
E);
19154 if (IsPotentialResultOdrUsed(
D))
19165 case Expr::ArraySubscriptExprClass: {
19166 auto *ASE = cast<ArraySubscriptExpr>(
E);
19171 if (!
Base.isUsable())
19173 Expr *LHS = ASE->getBase() == ASE->getLHS() ?
Base.get() : ASE->getLHS();
19174 Expr *RHS = ASE->getBase() == ASE->getRHS() ?
Base.get() : ASE->getRHS();
19177 ASE->getRBracketLoc());
19180 case Expr::MemberExprClass: {
19181 auto *ME = cast<MemberExpr>(
E);
19184 if (isa<FieldDecl>(ME->getMemberDecl())) {
19186 if (!
Base.isUsable())
19189 S.
Context,
Base.get(), ME->isArrow(), ME->getOperatorLoc(),
19190 ME->getQualifierLoc(), ME->getTemplateKeywordLoc(),
19191 ME->getMemberDecl(), ME->getFoundDecl(), ME->getMemberNameInfo(),
19192 CopiedTemplateArgs(ME), ME->getType(), ME->getValueKind(),
19193 ME->getObjectKind(), ME->isNonOdrUse());
19196 if (ME->getMemberDecl()->isCXXInstanceMember())
19201 if (ME->isNonOdrUse() || IsPotentialResultOdrUsed(ME->getMemberDecl()))
19207 S.
Context, ME->getBase(), ME->isArrow(), ME->getOperatorLoc(),
19208 ME->getQualifierLoc(), ME->getTemplateKeywordLoc(), ME->getMemberDecl(),
19209 ME->getFoundDecl(), ME->getMemberNameInfo(), CopiedTemplateArgs(ME),
19210 ME->getType(), ME->getValueKind(), ME->getObjectKind(), NOUR);
19213 case Expr::BinaryOperatorClass: {
19214 auto *BO = cast<BinaryOperator>(
E);
19215 Expr *LHS = BO->getLHS();
19216 Expr *RHS = BO->getRHS();
19218 if (BO->getOpcode() == BO_PtrMemD) {
19220 if (!Sub.isUsable())
19222 BO->setLHS(Sub.get());
19224 }
else if (BO->getOpcode() == BO_Comma) {
19226 if (!Sub.isUsable())
19228 BO->setRHS(Sub.get());
19236 case Expr::ParenExprClass: {
19237 auto *PE = cast<ParenExpr>(
E);
19239 if (!Sub.isUsable())
19241 return S.
ActOnParenExpr(PE->getLParen(), PE->getRParen(), Sub.get());
19246 case Expr::ConditionalOperatorClass: {
19247 auto *CO = cast<ConditionalOperator>(
E);
19257 LHS = CO->getLHS();
19259 RHS = CO->getRHS();
19261 CO->getCond(), LHS.
get(), RHS.
get());
19266 case Expr::UnaryOperatorClass: {
19267 auto *UO = cast<UnaryOperator>(
E);
19268 if (UO->getOpcode() != UO_Extension)
19271 if (!Sub.isUsable())
19273 return S.
BuildUnaryOp(
nullptr, UO->getOperatorLoc(), UO_Extension,
19280 case Expr::GenericSelectionExprClass: {
19281 auto *GSE = cast<GenericSelectionExpr>(
E);
19284 bool AnyChanged =
false;
19285 for (
Expr *OrigAssocExpr : GSE->getAssocExprs()) {
19286 ExprResult AssocExpr = Rebuild(OrigAssocExpr);
19290 AssocExprs.push_back(AssocExpr.
get());
19293 AssocExprs.push_back(OrigAssocExpr);
19297 void *ExOrTy =
nullptr;
19298 bool IsExpr = GSE->isExprPredicate();
19300 ExOrTy = GSE->getControllingExpr();
19302 ExOrTy = GSE->getControllingType();
19304 GSE->getGenericLoc(), GSE->getDefaultLoc(),
19305 GSE->getRParenLoc(), IsExpr, ExOrTy,
19306 GSE->getAssocTypeSourceInfos(), AssocExprs)
19314 case Expr::ChooseExprClass: {
19315 auto *CE = cast<ChooseExpr>(
E);
19325 if (!LHS.
get() && !RHS.
get())
19328 LHS = CE->getLHS();
19330 RHS = CE->getRHS();
19333 RHS.
get(), CE->getRParenLoc());
19337 case Expr::ConstantExprClass: {
19338 auto *CE = cast<ConstantExpr>(
E);
19340 if (!Sub.isUsable())
19347 case Expr::ImplicitCastExprClass: {
19348 auto *ICE = cast<ImplicitCastExpr>(
E);
19352 switch (ICE->getCastKind()) {
19354 case CK_DerivedToBase:
19355 case CK_UncheckedDerivedToBase: {
19356 ExprResult Sub = Rebuild(ICE->getSubExpr());
19357 if (!Sub.isUsable())
19361 ICE->getValueKind(), &
Path);
19420 for (
Expr *
E : LocalMaybeODRUseExprs) {
19421 if (
auto *DRE = dyn_cast<DeclRefExpr>(
E)) {
19423 DRE->getLocation(), *
this);
19424 }
else if (
auto *ME = dyn_cast<MemberExpr>(
E)) {
19427 }
else if (
auto *FP = dyn_cast<FunctionParmPackExpr>(
E)) {
19431 llvm_unreachable(
"Unexpected expression");
19436 "MarkVarDeclODRUsed failed to cleanup MaybeODRUseExprs?");
19445 const bool RefersToEnclosingScope =
19448 if (RefersToEnclosingScope) {
19463 assert(
E &&
"Capture variable should be used in an expression.");
19474 assert((!
E || isa<DeclRefExpr>(
E) || isa<MemberExpr>(
E) ||
19475 isa<FunctionParmPackExpr>(
E)) &&
19476 "Invalid Expr argument to DoMarkVarDeclReferenced");
19487 bool UsableInConstantExpr =
19499 bool NeededForConstantEvaluation =
19502 bool NeedDefinition =
19503 OdrUse == OdrUseContext::Used || NeededForConstantEvaluation;
19505 assert(!isa<VarTemplatePartialSpecializationDecl>(Var) &&
19506 "Can't instantiate a partial template specialization.");
19512 !isa<VarTemplateSpecializationDecl>(Var))
19523 bool TryInstantiating =
19527 if (TryInstantiating) {
19530 bool FirstInstantiation = PointOfInstantiation.
isInvalid();
19531 if (FirstInstantiation) {
19532 PointOfInstantiation =
Loc;
19534 MSI->setPointOfInstantiation(PointOfInstantiation);
19540 if (UsableInConstantExpr) {
19549 if (
auto *DRE = dyn_cast_or_null<DeclRefExpr>(
E))
19550 DRE->setDecl(DRE->getDecl());
19551 else if (
auto *ME = dyn_cast_or_null<MemberExpr>(
E))
19552 ME->setMemberDecl(ME->getMemberDecl());
19553 }
else if (FirstInstantiation) {
19555 .push_back(std::make_pair(Var, PointOfInstantiation));
19557 bool Inserted =
false;
19559 auto Iter = llvm::find_if(
19561 return P.first == Var;
19563 if (
Iter != I.end()) {
19576 if (isa<VarTemplateSpecializationDecl>(Var) && !Inserted)
19578 .push_back(std::make_pair(Var, PointOfInstantiation));
19602 if (
DeclRefExpr *DRE = dyn_cast_or_null<DeclRefExpr>(
E))
19603 if (DRE->isNonOdrUse())
19605 if (
MemberExpr *ME = dyn_cast_or_null<MemberExpr>(
E))
19606 if (ME->isNonOdrUse())
19610 case OdrUseContext::None:
19613 assert((!
E || isa<FunctionParmPackExpr>(
E) ||
19615 "missing non-odr-use marking for unevaluated decl ref");
19618 case OdrUseContext::FormallyOdrUsed:
19623 case OdrUseContext::Used:
19632 case OdrUseContext::Dependent:
19650 if (OdrUse == OdrUseContext::Used) {
19651 QualType CaptureType, DeclRefType;
19657 }
else if (OdrUse == OdrUseContext::Dependent) {
19673 auto *ID = dyn_cast<DeclRefExpr>(
E);
19674 if (!ID || ID->isTypeDependent() || !ID->refersToEnclosingVariableOrCapture())
19681 auto IsDependent = [&]() {
19683 auto *LSI = dyn_cast<sema::LambdaScopeInfo>(
Scope);
19688 LSI->AfterParameterList)
19691 const auto *MD = LSI->CallOperator;
19692 if (MD->getType().isNull())
19696 if (!Ty || !MD->isExplicitObjectMemberFunction() ||
19700 if (
auto *
C = LSI->CaptureMap.count(
D) ? &LSI->getCapture(
D) :
nullptr) {
19701 if (
C->isCopyCapture())
19706 if (LSI->ImpCaptureStyle == LambdaScopeInfo::ImpCap_LambdaByval)
19712 ID->setCapturedByCopyInLambdaWithExplicitObjectParameter(
19718 bool MightBeOdrUse,
19723 if (
VarDecl *Var = dyn_cast<VarDecl>(
D)) {
19749 bool IsVirtualCall = MD->
isVirtual() &&
19751 if (!IsVirtualCall)
19766 bool OdrUse =
true;
19767 if (
const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(
E->getDecl()))
19768 if (Method->isVirtual() &&
19772 if (
auto *FD = dyn_cast<FunctionDecl>(
E->getDecl())) {
19777 !FD->isDependentContext())
19791 bool MightBeOdrUse =
true;
19793 if (
CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(
E->getMemberDecl()))
19794 if (Method->isPureVirtual())
19795 MightBeOdrUse =
false;
19798 E->getMemberLoc().isValid() ?
E->getMemberLoc() :
E->
getBeginLoc();
19814 bool MightBeOdrUse) {
19815 if (MightBeOdrUse) {
19816 if (
auto *VD = dyn_cast<VarDecl>(
D)) {
19821 if (
auto *FD = dyn_cast<FunctionDecl>(
D)) {
19849bool MarkReferencedDecls::TraverseTemplateArgument(
19863 return Inherited::TraverseTemplateArgument(Arg);
19867 MarkReferencedDecls Marker(*
this,
Loc);
19868 Marker.TraverseType(
T);
19874class EvaluatedExprMarker :
public UsedDeclVisitor<EvaluatedExprMarker> {
19877 bool SkipLocalVariables;
19880 EvaluatedExprMarker(
Sema &S,
bool SkipLocalVariables,
19882 : Inherited(S), SkipLocalVariables(SkipLocalVariables), StopAt(StopAt) {}
19888 void Visit(
Expr *
E) {
19889 if (llvm::is_contained(StopAt,
E))
19891 Inherited::Visit(
E);
19901 if (SkipLocalVariables) {
19902 if (
VarDecl *VD = dyn_cast<VarDecl>(
E->getDecl()))
19903 if (VD->hasLocalStorage())
19915 Visit(
E->getBase());
19921 bool SkipLocalVariables,
19923 EvaluatedExprMarker(*
this, SkipLocalVariables, StopAt).Visit(
E);
19945 if (
auto *VD = dyn_cast_or_null<VarDecl>(
19947 if (VD->isConstexpr() ||
19948 (VD->isStaticDataMember() && VD->isFirstDecl() && !VD->isInline()))
20020 class CallReturnIncompleteDiagnoser :
public TypeDiagnoser {
20026 : FD(FD), CE(CE) { }
20030 S.
Diag(
Loc, diag::err_call_incomplete_return)
20035 S.
Diag(
Loc, diag::err_call_function_incomplete_return)
20040 } Diagnoser(FD, CE);
20053 unsigned diagnostic = diag::warn_condition_is_assignment;
20054 bool IsOrAssign =
false;
20057 if (Op->getOpcode() != BO_Assign && Op->getOpcode() != BO_OrAssign)
20060 IsOrAssign = Op->getOpcode() == BO_OrAssign;
20068 if (
ObjC().isSelfExpr(Op->getLHS()) && ME->getMethodFamily() ==
OMF_init)
20069 diagnostic = diag::warn_condition_is_idiomatic_assignment;
20073 diagnostic = diag::warn_condition_is_idiomatic_assignment;
20076 Loc = Op->getOperatorLoc();
20078 if (Op->getOperator() != OO_Equal && Op->getOperator() != OO_PipeEqual)
20081 IsOrAssign = Op->getOperator() == OO_PipeEqual;
20082 Loc = Op->getOperatorLoc();
20094 Diag(
Loc, diag::note_condition_assign_silence)
20099 Diag(
Loc, diag::note_condition_or_assign_to_comparison)
20102 Diag(
Loc, diag::note_condition_assign_to_comparison)
20118 if (opE->getOpcode() == BO_EQ &&
20119 opE->getLHS()->IgnoreParenImpCasts()->isModifiableLvalue(
Context)
20125 Diag(
Loc, diag::note_equality_comparison_silence)
20128 Diag(
Loc, diag::note_equality_comparison_to_assign)
20134 bool IsConstexpr) {
20136 if (
ParenExpr *parenE = dyn_cast<ParenExpr>(
E))
20154 Diag(
Loc, diag::err_typecheck_statement_requires_scalar)
20158 CheckBoolLikeConversion(
E,
Loc);
20204 struct RebuildUnknownAnyFunction
20205 :
StmtVisitor<RebuildUnknownAnyFunction, ExprResult> {
20209 RebuildUnknownAnyFunction(
Sema &S) : S(S) {}
20212 llvm_unreachable(
"unexpected statement!");
20223 template <
class T>
ExprResult rebuildSugarExpr(
T *
E) {
20227 Expr *SubExpr = SubResult.
get();
20228 E->setSubExpr(SubExpr);
20236 return rebuildSugarExpr(
E);
20240 return rebuildSugarExpr(
E);
20247 Expr *SubExpr = SubResult.
get();
20248 E->setSubExpr(SubExpr);
20256 if (!isa<FunctionDecl>(VD))
return VisitExpr(
E);
20262 !(isa<CXXMethodDecl>(VD) &&
20263 cast<CXXMethodDecl>(VD)->isInstance()))
20270 return resolveDecl(
E,
E->getMemberDecl());
20274 return resolveDecl(
E,
E->getDecl());
20292 struct RebuildUnknownAnyExpr
20293 :
StmtVisitor<RebuildUnknownAnyExpr, ExprResult> {
20304 llvm_unreachable(
"unexpected statement!");
20318 template <
class T>
ExprResult rebuildSugarExpr(
T *
E) {
20321 Expr *SubExpr = SubResult.
get();
20322 E->setSubExpr(SubExpr);
20330 return rebuildSugarExpr(
E);
20334 return rebuildSugarExpr(
E);
20340 S.
Diag(
E->getOperatorLoc(), diag::err_unknown_any_addrof)
20345 if (isa<CallExpr>(
E->getSubExpr())) {
20346 S.
Diag(
E->getOperatorLoc(), diag::err_unknown_any_addrof_call)
20359 E->setSubExpr(SubResult.
get());
20368 return resolveDecl(
E,
E->getMemberDecl());
20372 return resolveDecl(
E,
E->getDecl());
20379 Expr *CalleeExpr =
E->getCallee();
20383 FK_FunctionPointer,
20390 assert(isa<CXXMemberCallExpr>(
E) || isa<CXXOperatorCallExpr>(
E));
20391 Kind = FK_MemberFunction;
20395 Kind = FK_FunctionPointer;
20398 Kind = FK_BlockPointer;
20404 unsigned diagID = diag::err_func_returning_array_function;
20405 if (Kind == FK_BlockPointer)
20406 diagID = diag::err_block_returning_array_function;
20442 if (ParamTypes.empty() && Proto->
isVariadic()) {
20443 ArgTypes.reserve(
E->getNumArgs());
20444 for (
unsigned i = 0, e =
E->getNumArgs(); i != e; ++i) {
20447 ParamTypes = ArgTypes;
20458 case FK_MemberFunction:
20462 case FK_FunctionPointer:
20466 case FK_BlockPointer:
20472 ExprResult CalleeResult = Visit(CalleeExpr);
20474 E->setCallee(CalleeResult.
get());
20491 Method->setReturnType(DestType);
20503 if (
E->getCastKind() == CK_FunctionToPointerDecay) {
20517 }
else if (
E->getCastKind() == CK_LValueToRValue) {
20521 assert(isa<BlockPointerType>(
E->
getType()));
20534 llvm_unreachable(
"Unhandled cast type!");
20567 if (DRE && Proto && Proto->getParamTypes().empty() && Proto->isVariadic()) {
20571 FD->getNameInfo().getName(), DestType, FD->getTypeSourceInfo(),
20573 false , FD->hasPrototype(),
20576 if (FD->getQualifier())
20580 for (
const auto &AI : FT->param_types()) {
20584 Params.push_back(Param);
20586 NewFD->setParams(Params);
20593 if (MD->isInstance()) {
20603 }
else if (isa<VarDecl>(VD)) {
20633 diag::err_typecheck_cast_to_incomplete))
20648 return RebuildUnknownAnyExpr(*
this, ToType).Visit(
E);
20655 ExplicitCastExpr *castArg = dyn_cast<ExplicitCastExpr>(arg->IgnoreParens());
20664 assert(!arg->hasPlaceholderType());
20676 unsigned diagID = diag::err_uncasted_use_of_unknown_any;
20679 if (
CallExpr *call = dyn_cast<CallExpr>(
E)) {
20680 E = call->getCallee();
20681 diagID = diag::err_uncasted_call_of_unknown_any;
20690 loc = ref->getLocation();
20691 d = ref->getDecl();
20692 }
else if (
MemberExpr *mem = dyn_cast<MemberExpr>(
E)) {
20693 loc = mem->getMemberLoc();
20694 d = mem->getMemberDecl();
20696 diagID = diag::err_uncasted_call_of_unknown_any;
20697 loc = msg->getSelectorStartLoc();
20698 d = msg->getMethodDecl();
20700 S.
Diag(loc, diag::err_uncasted_send_to_unknown_any_method)
20701 <<
static_cast<unsigned>(msg->isClassMessage()) << msg->getSelector()
20728 if (!placeholderType)
return E;
20730 switch (placeholderType->
getKind()) {
20731 case BuiltinType::UnresolvedTemplate: {
20732 auto *ULE = cast<UnresolvedLookupExpr>(
E);
20737 const bool IsTypeAliasTemplateDecl = isa<TypeAliasTemplateDecl>(Temp);
20740 Diag(NameInfo.
getLoc(), diag::err_template_kw_refers_to_type_template)
20742 <<
Loc.getSourceRange() << IsTypeAliasTemplateDecl;
20744 Diag(NameInfo.
getLoc(), diag::err_template_kw_refers_to_type_template)
20746 << IsTypeAliasTemplateDecl;
20748 << IsTypeAliasTemplateDecl;
20754 case BuiltinType::Overload: {
20774 case BuiltinType::BoundMember: {
20779 if (isa<CXXPseudoDestructorExpr>(BME)) {
20780 PD =
PDiag(diag::err_dtor_expr_without_call) << 1;
20781 }
else if (
const auto *ME = dyn_cast<MemberExpr>(BME)) {
20782 if (ME->getMemberNameInfo().getName().getNameKind() ==
20784 PD =
PDiag(diag::err_dtor_expr_without_call) << 0;
20792 case BuiltinType::ARCUnbridgedCast: {
20799 case BuiltinType::UnknownAny:
20803 case BuiltinType::PseudoObject:
20806 case BuiltinType::BuiltinFn: {
20810 auto *FD = cast<FunctionDecl>(DRE->
getDecl());
20811 unsigned BuiltinID = FD->getBuiltinID();
20812 if (BuiltinID == Builtin::BI__noop) {
20814 CK_BuiltinFnToFnPtr)
20827 ? diag::err_use_of_unaddressable_function
20828 : diag::warn_cxx20_compat_use_of_unaddressable_function);
20829 if (FD->isImplicitlyInstantiable()) {
20856 case BuiltinType::IncompleteMatrixIdx:
20860 diag::err_matrix_incomplete_index);
20864 case BuiltinType::ArraySection:
20866 << cast<ArraySectionExpr>(
E)->isOMPArraySection();
20870 case BuiltinType::OMPArrayShaping:
20873 case BuiltinType::OMPIterator:
20877#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
20878 case BuiltinType::Id:
20879#include "clang/Basic/OpenCLImageTypes.def"
20880#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
20881 case BuiltinType::Id:
20882#include "clang/Basic/OpenCLExtensionTypes.def"
20883#define SVE_TYPE(Name, Id, SingletonId) \
20884 case BuiltinType::Id:
20885#include "clang/Basic/AArch64SVEACLETypes.def"
20886#define PPC_VECTOR_TYPE(Name, Id, Size) \
20887 case BuiltinType::Id:
20888#include "clang/Basic/PPCTypes.def"
20889#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
20890#include "clang/Basic/RISCVVTypes.def"
20891#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
20892#include "clang/Basic/WebAssemblyReferenceTypes.def"
20893#define AMDGPU_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
20894#include "clang/Basic/AMDGPUTypes.def"
20895#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
20896#include "clang/Basic/HLSLIntangibleTypes.def"
20897#define BUILTIN_TYPE(Id, SingletonId) case BuiltinType::Id:
20898#define PLACEHOLDER_TYPE(Id, SingletonId)
20899#include "clang/AST/BuiltinTypes.def"
20903 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.