61#include "llvm/ADT/STLExtras.h"
62#include "llvm/ADT/STLForwardCompat.h"
63#include "llvm/ADT/StringExtras.h"
64#include "llvm/Support/ConvertUTF.h"
65#include "llvm/Support/SaveAndRestore.h"
66#include "llvm/Support/TimeProfiler.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);
783 assert(!Ty.
isNull() &&
"UsualUnaryFPConversions - missing type");
790 switch (EvalMethod) {
792 llvm_unreachable(
"Unrecognized float evaluation method");
795 llvm_unreachable(
"Float evaluation method should be set by now");
803 CK_FloatingComplexCast)
812 CK_FloatingComplexCast)
844 assert(!Ty.
isNull() &&
"UsualUnaryConversions - missing type");
883 assert(!Ty.
isNull() &&
"DefaultArgumentPromotion - missing type");
895 if (BTy && (BTy->
getKind() == BuiltinType::Half ||
896 BTy->
getKind() == BuiltinType::Float)) {
899 if (BTy->
getKind() == BuiltinType::Half) {
917 "Unexpected typesize for LongLongTy");
986 if (!
Record->hasNonTrivialCopyConstructor() &&
987 !
Record->hasNonTrivialMoveConstructor() &&
988 !
Record->hasNonTrivialDestructor())
1021 PDiag(diag::warn_cxx98_compat_pass_non_pod_arg_to_vararg) << Ty << CT);
1028 PDiag(diag::warn_pass_class_arg_to_vararg)
1036 PDiag(diag::warn_cannot_pass_non_pod_arg_to_vararg)
1043 diag::err_cannot_pass_non_trivial_c_struct_to_vararg)
1047 PDiag(diag::err_cannot_pass_objc_interface_to_vararg)
1051 << isa<InitListExpr>(
E) << Ty << CT;
1060 if (PlaceholderTy->getKind() == BuiltinType::ARCUnbridgedCast &&
1062 (FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>()))) {
1101 if (
Call.isInvalid())
1106 if (Comma.isInvalid())
1113 diag::err_call_incomplete_argument))
1131 if (SkipCast)
return false;
1138 CK_IntegralComplexToFloatingComplex);
1156 bool PromotePrecision) {
1161 if (PromotePrecision) {
1166 if (LongerIsComplex)
1178 QualType RHSType,
bool IsCompAssign) {
1203 bool ConvertFloat,
bool ConvertInt) {
1208 CK_IntegralToFloating);
1219 CK_IntegralComplexToFloatingComplex);
1224 CK_FloatingRealToComplex);
1233 QualType RHSType,
bool IsCompAssign) {
1243 else if (!IsCompAssign)
1245 return LHSFloat ? LHSType : RHSType;
1250 if (LHSFloat && RHSFloat) {
1257 assert(order < 0 &&
"illegal float comparison");
1291 QualType LHSElem = LHSComplex ? LHSComplex->getElementType() : LHSType;
1297 if ((&LHSSem != &llvm::APFloat::PPCDoubleDouble() ||
1298 &RHSSem != &llvm::APFloat::IEEEquad()) &&
1299 (&LHSSem != &llvm::APFloat::IEEEquad() ||
1300 &RHSSem != &llvm::APFloat::PPCDoubleDouble()))
1317 CK_IntegralComplexCast);
1323template <PerformCastFn doLHSCast, PerformCastFn doRHSCast>
1326 QualType RHSType,
bool IsCompAssign) {
1331 if (LHSSigned == RHSSigned) {
1334 RHS = (*doRHSCast)(S, RHS.
get(), LHSType);
1336 }
else if (!IsCompAssign)
1337 LHS = (*doLHSCast)(S, LHS.
get(), RHSType);
1339 }
else if (order != (LHSSigned ? 1 : -1)) {
1343 RHS = (*doRHSCast)(S, RHS.
get(), LHSType);
1345 }
else if (!IsCompAssign)
1346 LHS = (*doLHSCast)(S, LHS.
get(), RHSType);
1353 RHS = (*doRHSCast)(S, RHS.
get(), LHSType);
1355 }
else if (!IsCompAssign)
1356 LHS = (*doLHSCast)(S, LHS.
get(), RHSType);
1365 RHS = (*doRHSCast)(S, RHS.
get(), result);
1367 LHS = (*doLHSCast)(S, LHS.
get(), result);
1377 bool IsCompAssign) {
1381 if (LHSComplexInt && RHSComplexInt) {
1385 handleIntegerConversion<doComplexIntegralCast, doComplexIntegralCast>
1386 (S, LHS, RHS, LHSEltType, RHSEltType, IsCompAssign);
1391 if (LHSComplexInt) {
1394 handleIntegerConversion<doComplexIntegralCast, doIntegralCast>
1395 (S, LHS, RHS, LHSEltType, RHSType, IsCompAssign);
1398 CK_IntegralRealToComplex);
1403 assert(RHSComplexInt);
1407 handleIntegerConversion<doIntegralCast, doComplexIntegralCast>
1408 (S, LHS, RHS, LHSType, RHSEltType, IsCompAssign);
1413 CK_IntegralRealToComplex);
1422 assert(BTy &&
"Expected a builtin type.");
1424 switch (BTy->getKind()) {
1425 case BuiltinType::ShortFract:
1426 case BuiltinType::UShortFract:
1427 case BuiltinType::SatShortFract:
1428 case BuiltinType::SatUShortFract:
1430 case BuiltinType::Fract:
1431 case BuiltinType::UFract:
1432 case BuiltinType::SatFract:
1433 case BuiltinType::SatUFract:
1435 case BuiltinType::LongFract:
1436 case BuiltinType::ULongFract:
1437 case BuiltinType::SatLongFract:
1438 case BuiltinType::SatULongFract:
1440 case BuiltinType::ShortAccum:
1441 case BuiltinType::UShortAccum:
1442 case BuiltinType::SatShortAccum:
1443 case BuiltinType::SatUShortAccum:
1445 case BuiltinType::Accum:
1446 case BuiltinType::UAccum:
1447 case BuiltinType::SatAccum:
1448 case BuiltinType::SatUAccum:
1450 case BuiltinType::LongAccum:
1451 case BuiltinType::ULongAccum:
1452 case BuiltinType::SatLongAccum:
1453 case BuiltinType::SatULongAccum:
1456 if (BTy->isInteger())
1458 llvm_unreachable(
"Unexpected fixed point or integer type");
1470 "Expected at least one of the operands to be a fixed point type");
1473 "Special fixed point arithmetic operation conversions are only "
1474 "applied to ints or other fixed point types");
1496 QualType ResultTy = LHSTyRank > RHSTyRank ? LHSTy : RHSTy;
1519 REnum = R->isUnscopedEnumerationType();
1521 if ((!IsCompAssign && LEnum && R->isFloatingType()) ||
1525 ? diag::warn_arith_conv_enum_float_cxx20
1526 : diag::warn_arith_conv_enum_float)
1529 }
else if (!IsCompAssign && LEnum && REnum &&
1535 DiagID = diag::err_conv_mixed_enum_types_cxx26;
1537 !R->castAs<
EnumType>()->getDecl()->hasNameForLinkage()) {
1542 ? diag::warn_arith_conv_mixed_anon_enum_types_cxx20
1543 : diag::warn_arith_conv_mixed_anon_enum_types;
1548 ? diag::warn_conditional_mixed_enum_types_cxx20
1549 : diag::warn_conditional_mixed_enum_types;
1554 ? diag::warn_comparison_mixed_enum_types_cxx20
1555 : diag::warn_comparison_mixed_enum_types;
1558 ? diag::warn_arith_conv_mixed_enum_types_cxx20
1559 : diag::warn_arith_conv_mixed_enum_types;
1562 << (
int)ACK << L << R;
1592 LHSType = AtomicLHS->getValueType();
1604 QualType LHSUnpromotedType = LHSType;
1608 if (!LHSBitfieldPromoteTy.
isNull())
1609 LHSType = LHSBitfieldPromoteTy;
1643 return handleIntegerConversion<doIntegralCast, doIntegralCast>
1654 bool PredicateIsExpr,
void *ControllingExprOrType,
1656 unsigned NumAssocs = ArgTypes.size();
1657 assert(NumAssocs == ArgExprs.size());
1660 for (
unsigned i = 0; i < NumAssocs; ++i) {
1669 if (!PredicateIsExpr) {
1673 assert(ControllingType &&
"couldn't get the type out of the parser");
1674 ControllingExprOrType = ControllingType;
1678 KeyLoc, DefaultLoc, RParenLoc, PredicateIsExpr, ControllingExprOrType,
1686 bool PredicateIsExpr,
void *ControllingExprOrType,
1688 unsigned NumAssocs = Types.size();
1689 assert(NumAssocs == Exprs.size());
1690 assert(ControllingExprOrType &&
1691 "Must have either a controlling expression or a controlling type");
1693 Expr *ControllingExpr =
nullptr;
1695 if (PredicateIsExpr) {
1702 reinterpret_cast<Expr *
>(ControllingExprOrType));
1705 ControllingExpr = R.
get();
1708 ControllingType =
reinterpret_cast<TypeSourceInfo *
>(ControllingExprOrType);
1709 if (!ControllingType)
1713 bool TypeErrorFound =
false,
1714 IsResultDependent = ControllingExpr
1717 ContainsUnexpandedParameterPack =
1727 diag::warn_side_effects_unevaluated_context);
1729 for (
unsigned i = 0; i < NumAssocs; ++i) {
1730 if (Exprs[i]->containsUnexpandedParameterPack())
1731 ContainsUnexpandedParameterPack =
true;
1734 if (Types[i]->getType()->containsUnexpandedParameterPack())
1735 ContainsUnexpandedParameterPack =
true;
1737 if (Types[i]->getType()->isDependentType()) {
1738 IsResultDependent =
true;
1751 if (ControllingExpr && Types[i]->getType()->isIncompleteType())
1752 D = diag::err_assoc_type_incomplete;
1753 else if (ControllingExpr && !Types[i]->getType()->isObjectType())
1754 D = diag::err_assoc_type_nonobject;
1755 else if (Types[i]->getType()->isVariablyModifiedType())
1756 D = diag::err_assoc_type_variably_modified;
1757 else if (ControllingExpr) {
1776 unsigned Reason = 0;
1785 Diag(Types[i]->getTypeLoc().getBeginLoc(),
1786 diag::warn_unreachable_association)
1787 << QT << (Reason - 1);
1791 Diag(Types[i]->getTypeLoc().getBeginLoc(),
D)
1792 << Types[i]->getTypeLoc().getSourceRange()
1793 << Types[i]->getType();
1794 TypeErrorFound =
true;
1799 for (
unsigned j = i+1; j < NumAssocs; ++j)
1800 if (Types[j] && !Types[j]->getType()->isDependentType() &&
1802 Types[j]->getType())) {
1803 Diag(Types[j]->getTypeLoc().getBeginLoc(),
1804 diag::err_assoc_compatible_types)
1805 << Types[j]->getTypeLoc().getSourceRange()
1806 << Types[j]->getType()
1807 << Types[i]->getType();
1808 Diag(Types[i]->getTypeLoc().getBeginLoc(),
1809 diag::note_compat_assoc)
1810 << Types[i]->getTypeLoc().getSourceRange()
1811 << Types[i]->getType();
1812 TypeErrorFound =
true;
1822 if (IsResultDependent) {
1823 if (ControllingExpr)
1825 Types, Exprs, DefaultLoc, RParenLoc,
1826 ContainsUnexpandedParameterPack);
1828 Exprs, DefaultLoc, RParenLoc,
1829 ContainsUnexpandedParameterPack);
1833 unsigned DefaultIndex = -1U;
1837 for (
unsigned i = 0; i < NumAssocs; ++i) {
1840 else if (ControllingExpr &&
1843 Types[i]->getType()))
1844 CompatIndices.push_back(i);
1845 else if (ControllingType &&
1848 Types[i]->getType()))
1849 CompatIndices.push_back(i);
1852 auto GetControllingRangeAndType = [](
Expr *ControllingExpr,
1856 if (ControllingExpr)
1865 return std::make_pair(SR, QT);
1871 if (CompatIndices.size() > 1) {
1872 auto P = GetControllingRangeAndType(ControllingExpr, ControllingType);
1875 << SR <<
P.second << (
unsigned)CompatIndices.size();
1876 for (
unsigned I : CompatIndices) {
1877 Diag(Types[I]->getTypeLoc().getBeginLoc(),
1878 diag::note_compat_assoc)
1879 << Types[I]->getTypeLoc().getSourceRange()
1880 << Types[I]->getType();
1888 if (DefaultIndex == -1U && CompatIndices.size() == 0) {
1889 auto P = GetControllingRangeAndType(ControllingExpr, ControllingType);
1891 Diag(SR.
getBegin(), diag::err_generic_sel_no_match) << SR <<
P.second;
1900 unsigned ResultIndex =
1901 CompatIndices.size() ? CompatIndices[0] : DefaultIndex;
1903 if (ControllingExpr) {
1905 Context, KeyLoc, ControllingExpr, Types, Exprs, DefaultLoc, RParenLoc,
1906 ContainsUnexpandedParameterPack, ResultIndex);
1909 Context, KeyLoc, ControllingType, Types, Exprs, DefaultLoc, RParenLoc,
1910 ContainsUnexpandedParameterPack, ResultIndex);
1916 llvm_unreachable(
"unexpected TokenKind");
1917 case tok::kw___func__:
1919 case tok::kw___FUNCTION__:
1921 case tok::kw___FUNCDNAME__:
1923 case tok::kw___FUNCSIG__:
1925 case tok::kw_L__FUNCTION__:
1927 case tok::kw_L__FUNCSIG__:
1929 case tok::kw___PRETTY_FUNCTION__:
1938 while (DC && !isa<BlockDecl, CapturedDecl, FunctionDecl, ObjCMethodDecl>(DC))
1940 return cast_or_null<Decl>(DC);
1958 assert(Args.size() <= 2 &&
"too many arguments for literal operator");
1961 for (
unsigned ArgIdx = 0; ArgIdx != Args.size(); ++ArgIdx) {
1962 ArgTy[ArgIdx] = Args[ArgIdx]->getType();
1963 if (ArgTy[ArgIdx]->isArrayType())
1984 std::vector<Token> ExpandedToks;
1990 if (Literal.hadError)
1994 for (
const Token &Tok : StringToks)
1995 StringTokLocs.push_back(Tok.getLocation());
1999 &StringTokLocs[0], StringTokLocs.size());
2001 if (!Literal.getUDSuffix().empty()) {
2004 Literal.getUDSuffixOffset());
2005 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_string_udl));
2027 std::vector<Token> ExpandedToks;
2028 ExpandedToks.reserve(Toks.size());
2029 for (
const Token &Tok : Toks) {
2032 ExpandedToks.emplace_back(Tok);
2035 if (isa<TranslationUnitDecl>(CurrentDecl))
2036 Diag(Tok.getLocation(), diag::ext_predef_outside_function);
2038 Diag(Tok.getLocation(), diag::ext_string_literal_from_predefined)
2041 llvm::raw_svector_ostream
OS(Str);
2042 Token &Exp = ExpandedToks.emplace_back();
2044 if (Tok.getKind() == tok::kw_L__FUNCTION__ ||
2045 Tok.getKind() == tok::kw_L__FUNCSIG__) {
2047 Exp.
setKind(tok::wide_string_literal);
2049 Exp.
setKind(tok::string_literal);
2057 return ExpandedToks;
2062 assert(!StringToks.empty() &&
"Must have at least one string!");
2065 std::vector<Token> ExpandedToks;
2070 if (Literal.hadError)
2074 for (
const Token &Tok : StringToks)
2075 StringTokLocs.push_back(Tok.getLocation());
2079 if (Literal.isWide()) {
2082 }
else if (Literal.isUTF8()) {
2088 }
else if (Literal.isUTF16()) {
2091 }
else if (Literal.isUTF32()) {
2094 }
else if (Literal.isPascal()) {
2107 ? diag::warn_cxx20_compat_utf8_string
2108 : diag::warn_c23_compat_utf8_string);
2114 auto RemovalDiag =
PDiag(diag::note_cxx20_c23_compat_utf8_string_remove_u8);
2116 for (
const Token &Tok : StringToks) {
2117 if (Tok.getKind() == tok::utf8_string_literal) {
2119 RemovalDiagLoc = Tok.getLocation();
2126 Diag(RemovalDiagLoc, RemovalDiag);
2134 Kind, Literal.Pascal, StrTy,
2136 StringTokLocs.size());
2137 if (Literal.getUDSuffix().empty())
2144 Literal.getUDSuffixOffset());
2148 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_string_udl));
2173 Expr *Args[] = { Lit, LenArg };
2192 llvm::APSInt
Value(CharBits, CharIsUnsigned);
2198 for (
unsigned I = 0, N = Lit->
getLength(); I != N; ++I) {
2209 llvm_unreachable(
"unexpected literal operator lookup result");
2213 llvm_unreachable(
"unexpected literal operator lookup result");
2245 auto *DRE = dyn_cast<DeclRefExpr>(VD->
getInit());
2248 auto *Referee = dyn_cast<VarDecl>(DRE->getDecl());
2249 if (!Referee || !Referee->hasGlobalStorage() ||
2250 Referee->hasAttr<CUDADeviceAttr>())
2256 auto *MD = dyn_cast_or_null<CXXMethodDecl>(S.
CurContext);
2257 if (MD && MD->getParent()->isLambda() &&
2258 MD->getOverloadedOperator() == OO_Call && MD->hasAttr<CUDADeviceAttr>() &&
2280 if (
VarDecl *VD = dyn_cast<VarDecl>(
D)) {
2281 if (VD->getType()->isReferenceType() &&
2284 VD->isUsableInConstantExpressions(
Context))
2299 bool RefersToCapturedVariable = isa<VarDecl, BindingDecl>(
D) &&
2303 Context, NNS, TemplateKWLoc,
D, RefersToCapturedVariable, NameInfo, Ty,
2331 const auto *FD = dyn_cast<FieldDecl>(
D);
2332 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(
D))
2333 FD = IFD->getAnonField();
2337 if (FD->isBitField())
2343 if (
const auto *BD = dyn_cast<BindingDecl>(
D))
2344 if (
const auto *BE = BD->getBinding())
2360 Id.TemplateId->NumArgs);
2366 TemplateArgs = &Buffer;
2369 TemplateArgs =
nullptr;
2376 unsigned DiagnosticID,
unsigned DiagnosticSuggestID) {
2383 SemaRef.
Diag(TypoLoc, diag::err_no_member) << Typo << Ctx
2386 SemaRef.
Diag(TypoLoc, DiagnosticID) << Typo;
2391 bool DroppedSpecifier =
2394 ? diag::note_implicit_param_decl
2395 : diag::note_previous_decl;
2398 SemaRef.
PDiag(NoteID));
2401 << Typo << Ctx << DroppedSpecifier
2403 SemaRef.
PDiag(NoteID));
2410 bool isDefaultArgument =
2414 const auto *CurMethod = dyn_cast<CXXMethodDecl>(
CurContext);
2415 bool isInstance = CurMethod && CurMethod->isInstance() &&
2424 unsigned DiagID = diag::err_found_in_dependent_base;
2425 unsigned NoteID = diag::note_member_declared_at;
2427 DiagID =
getLangOpts().MSVCCompat ? diag::ext_found_later_in_class
2428 : diag::err_found_later_in_class;
2430 DiagID = diag::ext_found_in_dependent_base;
2431 NoteID = diag::note_dependent_member_use;
2456 if (isDefaultArgument && ((*R.
begin())->isCXXInstanceMember())) {
2472 unsigned diagnostic = diag::err_undeclared_var_use;
2473 unsigned diagnostic_suggest = diag::err_undeclared_var_use_suggest;
2477 diagnostic = diag::err_undeclared_use;
2478 diagnostic_suggest = diag::err_undeclared_use_suggest;
2488 if (isa<CXXRecordDecl>(DC)) {
2489 if (ExplicitTemplateArgs) {
2512 R.
addDecl(Best->FoundDecl.getDecl(), Best->FoundDecl.getAccess());
2529 assert(!ExplicitTemplateArgs &&
2530 "Diagnosing an empty lookup with explicit template args!");
2534 emitEmptyLookupTypoDiagnostic(TC, *this, SS, Name, TypoLoc, Args,
2535 diagnostic, diagnostic_suggest);
2540 }
else if (S && (Corrected =
2544 bool DroppedSpecifier =
2548 bool AcceptableWithRecovery =
false;
2549 bool AcceptableWithoutRecovery =
false;
2558 dyn_cast<FunctionTemplateDecl>(CD))
2562 else if (
FunctionDecl *FD = dyn_cast<FunctionDecl>(CD))
2563 if (!ExplicitTemplateArgs || ExplicitTemplateArgs->
size() == 0)
2569 ND = Best->FoundDecl;
2570 Corrected.setCorrectionDecl(ND);
2574 Corrected.setCorrectionDecl(ND);
2586 Record = cast<CXXRecordDecl>(
2592 AcceptableWithRecovery = isa<ValueDecl>(UnderlyingND) ||
2593 isa<FunctionTemplateDecl>(UnderlyingND);
2599 AcceptableWithoutRecovery = isa<TypeDecl>(UnderlyingND) ||
2601 isa<ObjCInterfaceDecl>(UnderlyingND);
2605 AcceptableWithoutRecovery =
true;
2608 if (AcceptableWithRecovery || AcceptableWithoutRecovery) {
2610 ? diag::note_implicit_param_decl
2611 : diag::note_previous_decl;
2614 PDiag(NoteID), AcceptableWithRecovery);
2618 << DroppedSpecifier << SS.
getRange(),
2619 PDiag(NoteID), AcceptableWithRecovery);
2622 return !AcceptableWithRecovery;
2658 else if (
auto *MD = dyn_cast<CXXMethodDecl>(S.
CurContext))
2666 auto DB = S.
Diag(
Loc, diag::ext_undeclared_unqual_id_with_dependent_base);
2667 DB << NameInfo.
getName() << RD;
2669 if (!ThisType.
isNull()) {
2672 Context,
nullptr, ThisType,
true,
2674 nullptr, NameInfo, TemplateArgs);
2691 bool HasTrailingLParen,
bool IsAddressOfOperand,
2693 bool IsInlineAsmIdentifier,
Token *KeywordReplacement) {
2694 assert(!(IsAddressOfOperand && HasTrailingLParen) &&
2695 "cannot be direct & operand and have a trailing lparen");
2724 if (
auto *VD = dyn_cast<ValueDecl>(R.
getFoundDecl())) {
2738 if (TemplateKWLoc.
isValid() || TemplateArgs) {
2746 false, TemplateKWLoc,
2752 IsAddressOfOperand, TemplateArgs);
2756 !IvarLookupFollowUp);
2762 IsAddressOfOperand, TemplateArgs);
2766 if (IvarLookupFollowUp) {
2781 if (R.
empty() && HasTrailingLParen && II &&
2791 if (R.
empty() && !ADL) {
2794 TemplateKWLoc, TemplateArgs))
2799 if (IsInlineAsmIdentifier)
2809 "Typo correction callback misconfigured");
2820 {},
nullptr, &TE)) {
2821 if (TE && KeywordReplacement) {
2823 auto BestTC = State.Consumer->getNextCorrection();
2824 if (BestTC.isKeyword()) {
2825 auto *II = BestTC.getCorrectionAsIdentifierInfo();
2826 if (State.DiagHandler)
2827 State.DiagHandler(BestTC);
2831 KeywordReplacement->
setLocation(BestTC.getCorrectionRange().getBegin());
2837 return (
Expr*)
nullptr;
2839 State.Consumer->resetCorrectionStream();
2844 assert(!R.
empty() &&
2845 "DiagnoseEmptyLookup returned false but added no results");
2855 if (!
E.isInvalid() && !
E.get())
2862 assert(!R.
empty() || ADL);
2892 if (TemplateArgs || TemplateKWLoc.
isValid()) {
2900 "There should only be one declaration found.");
2928 if (
const auto *CD = dyn_cast<CXXRecordDecl>(DC))
2929 if (CD->isInvalidDecl())
2940 unsigned DiagID = diag::err_typename_missing;
2942 DiagID = diag::ext_typename_missing;
2986 const auto *RD = dyn_cast<CXXRecordDecl>(
Member->getDeclContext());
2994 bool PointerConversions =
false;
2995 if (isa<FieldDecl>(
Member)) {
2999 DestRecordType, FromPtrType
3006 PointerConversions =
true;
3008 DestType = DestRecordType;
3009 FromRecordType = FromType;
3011 }
else if (
const auto *Method = dyn_cast<CXXMethodDecl>(
Member)) {
3012 if (!Method->isImplicitObjectMemberFunction())
3015 DestType = Method->getThisType().getNonReferenceType();
3016 DestRecordType = Method->getFunctionObjectParameterType();
3020 PointerConversions =
true;
3022 FromRecordType = FromType;
3023 DestType = DestRecordType;
3028 if (FromAS != DestAS) {
3033 if (PointerConversions)
3074 if (Qualifier && Qualifier->getAsType()) {
3076 assert(QType->
isRecordType() &&
"lookup done with non-record type");
3086 FromLoc, FromRange, &BasePath))
3089 if (PointerConversions)
3092 VK, &BasePath).
get();
3095 FromRecordType = QRecordType;
3106 FromLoc, FromRange, &BasePath,
3116 bool HasTrailingLParen) {
3118 if (!HasTrailingLParen)
3136 if (
D->isCXXClassMember())
3145 if (isa<UsingShadowDecl>(
D))
3146 D = cast<UsingShadowDecl>(
D)->getTargetDecl();
3154 if (
const auto *FDecl = dyn_cast<FunctionDecl>(
D)) {
3156 if (FDecl->getBuiltinID() && FDecl->isImplicit())
3158 }
else if (!isa<FunctionTemplateDecl>(
D))
3171 bool AcceptInvalid) {
3175 if (isa<TypedefNameDecl>(
D)) {
3176 S.
Diag(
Loc, diag::err_unexpected_typedef) <<
D->getDeclName();
3180 if (isa<ObjCInterfaceDecl>(
D)) {
3181 S.
Diag(
Loc, diag::err_unexpected_interface) <<
D->getDeclName();
3185 if (isa<NamespaceDecl>(
D)) {
3186 S.
Diag(
Loc, diag::err_unexpected_namespace) <<
D->getDeclName();
3197 const auto *FD = dyn_cast<FunctionDecl>(R.
getFoundDecl());
3199 (FD->isCPUDispatchMultiVersion() || FD->isCPUSpecificMultiVersion());
3204 bool AcceptInvalidDecl) {
3242 bool AcceptInvalidDecl) {
3243 assert(
D &&
"Cannot refer to a NULL declaration");
3244 assert(!isa<FunctionTemplateDecl>(
D) &&
3245 "Cannot refer unambiguously to a function template");
3263 if (!isa<ValueDecl, UnresolvedUsingIfExistsDecl>(
D)) {
3276 auto *VD = cast<ValueDecl>(
D);
3279 if (VD->isInvalidDecl() && !AcceptInvalidDecl)
3285 if (
auto *IndirectField = dyn_cast<IndirectFieldDecl>(VD);
3286 IndirectField && !IndirectField->isCXXClassMember())
3298 type =
type.getNonPackExpansionType();
3302#define ABSTRACT_DECL(kind)
3303#define VALUE(type, base)
3304#define DECL(type, base) case Decl::type:
3305#include "clang/AST/DeclNodes.inc"
3306 llvm_unreachable(
"invalid value decl kind");
3309 case Decl::ObjCAtDefsField:
3310 llvm_unreachable(
"forming non-member reference to ivar?");
3314 case Decl::EnumConstant:
3315 case Decl::UnresolvedUsingValue:
3316 case Decl::OMPDeclareReduction:
3317 case Decl::OMPDeclareMapper:
3326 case Decl::IndirectField:
3327 case Decl::ObjCIvar:
3329 "building reference to field in C?");
3339 case Decl::NonTypeTemplateParm: {
3341 type = reftype->getPointeeType();
3351 if (
type->isRecordType()) {
3352 type =
type.getUnqualifiedType().withConst();
3365 case Decl::VarTemplateSpecialization:
3366 case Decl::VarTemplatePartialSpecialization:
3367 case Decl::Decomposition:
3369 case Decl::OMPCapturedExpr:
3372 type->isVoidType()) {
3378 case Decl::ImplicitParam:
3379 case Decl::ParmVar: {
3389 if (!CapturedType.
isNull())
3390 type = CapturedType;
3395 case Decl::Function: {
3396 if (
unsigned BID = cast<FunctionDecl>(VD)->getBuiltinID()) {
3425 if (!cast<FunctionDecl>(VD)->hasPrototype() && isa<FunctionProtoType>(fty))
3434 case Decl::CXXDeductionGuide:
3435 llvm_unreachable(
"building reference to deduction guide");
3437 case Decl::MSProperty:
3439 case Decl::TemplateParamObject:
3445 case Decl::UnnamedGlobalConstant:
3449 case Decl::CXXMethod:
3454 dyn_cast<FunctionProtoType>(VD->getType()))
3462 if (cast<CXXMethodDecl>(VD)->isStatic()) {
3468 case Decl::CXXConversion:
3469 case Decl::CXXDestructor:
3470 case Decl::CXXConstructor:
3482 if (VD->isInvalidDecl() &&
E)
3489 Target.resize(CharByteWidth * (Source.size() + 1));
3490 char *ResultPtr = &
Target[0];
3491 const llvm::UTF8 *ErrorPtr;
3493 llvm::ConvertUTF8toWide(CharByteWidth, Source, ResultPtr, ErrorPtr);
3503 Diag(
Loc, diag::ext_predef_outside_function);
3509 if (cast<DeclContext>(currentDecl)->isDependentContext())
3514 bool ForceElaboratedPrinting =
3518 unsigned Length = Str.length();
3520 llvm::APInt LengthI(32, Length + 1);
3560 if (Literal.hadError())
3564 if (Literal.isWide())
3570 else if (Literal.isUTF16())
3572 else if (Literal.isUTF32())
3581 if (Literal.isWide())
3583 else if (Literal.isUTF16())
3585 else if (Literal.isUTF32())
3587 else if (Literal.isUTF8())
3593 if (Literal.getUDSuffix().empty())
3603 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_character_udl));
3614 llvm::APInt(IntSize, Val,
true),
3622 using llvm::APFloat;
3623 APFloat Val(Format);
3626 if (RM == llvm::RoundingMode::Dynamic)
3627 RM = llvm::RoundingMode::NearestTiesToEven;
3628 APFloat::opStatus result = Literal.GetFloatValue(Val, RM);
3632 if ((result & APFloat::opOverflow) ||
3633 ((result & APFloat::opUnderflow) && Val.isZero())) {
3634 unsigned diagnostic;
3636 if (result & APFloat::opOverflow) {
3637 diagnostic = diag::warn_float_overflow;
3638 APFloat::getLargest(Format).toString(buffer);
3640 diagnostic = diag::warn_float_underflow;
3641 APFloat::getSmallest(Format).toString(buffer);
3644 S.
Diag(
Loc, diagnostic) << Ty << buffer.str();
3647 bool isExact = (result == APFloat::opOK);
3652 assert(
E &&
"Invalid expression");
3659 Diag(
E->
getExprLoc(), diag::err_pragma_loop_invalid_argument_type) << QT;
3663 llvm::APSInt ValueAPS;
3674 bool ValueIsPositive =
3675 AllowZero ? ValueAPS.isNonNegative() : ValueAPS.isStrictlyPositive();
3676 if (!ValueIsPositive || ValueAPS.getActiveBits() > 31) {
3678 <<
toString(ValueAPS, 10) << ValueIsPositive;
3698 SpellingBuffer.resize(Tok.
getLength() + 1);
3709 if (Literal.hadError)
3712 if (Literal.hasUDSuffix()) {
3720 return ExprError(
Diag(UDSuffixLoc, diag::err_invalid_numeric_udl));
3723 if (Literal.isFloatingLiteral()) {
3748 !Literal.isImaginary)) {
3757 if (Literal.isFloatingLiteral()) {
3761 if (Literal.GetIntegerValue(ResultVal))
3774 unsigned Length = Literal.getUDSuffixOffset();
3781 false, StrTy, &TokLoc, 1);
3792 bool CharIsUnsigned =
Context.
CharTy->isUnsignedIntegerType();
3793 llvm::APSInt
Value(CharBits, CharIsUnsigned);
3794 for (
unsigned I = 0, N = Literal.getUDSuffixOffset(); I != N; ++I) {
3795 Value = TokSpelling[I];
3803 llvm_unreachable(
"unexpected literal operator lookup result");
3809 if (Literal.isFixedPointLiteral()) {
3812 if (Literal.isAccum) {
3813 if (Literal.isHalf) {
3815 }
else if (Literal.isLong) {
3820 }
else if (Literal.isFract) {
3821 if (Literal.isHalf) {
3823 }
else if (Literal.isLong) {
3832 bool isSigned = !Literal.isUnsigned;
3836 llvm::APInt Val(bit_width, 0, isSigned);
3837 bool Overflowed = Literal.GetFixedPointValue(Val, scale);
3838 bool ValIsZero = Val.isZero() && !Overflowed;
3841 if (Literal.isFract && Val == MaxVal + 1 && !ValIsZero)
3847 else if (Val.ugt(MaxVal) || Overflowed)
3852 }
else if (Literal.isFloatingLiteral()) {
3854 if (Literal.isHalf){
3862 }
else if (Literal.isFloat)
3864 else if (Literal.isLong)
3866 else if (Literal.isFloat16)
3868 else if (Literal.isFloat128)
3890 }
else if (!Literal.isIntegerLiteral()) {
3896 if (Literal.isSizeT)
3899 ? diag::warn_cxx20_compat_size_t_suffix
3900 : diag::ext_cxx23_size_t_suffix
3901 : diag::err_cxx23_size_t_suffix);
3908 if (Literal.isBitInt)
3912 : diag::ext_c23_bitint_suffix);
3921 unsigned BitsNeeded =
3922 Literal.isBitInt ? llvm::APInt::getSufficientBitsNeeded(
3923 Literal.getLiteralDigits(), Literal.getRadix())
3925 llvm::APInt ResultVal(BitsNeeded, 0);
3927 if (Literal.GetIntegerValue(ResultVal)) {
3933 "long long is not intmax_t?");
3940 bool AllowUnsigned = Literal.isUnsigned || Literal.getRadix() != 10;
3947 Literal.isLong =
true;
3948 Literal.isLongLong =
false;
3955 if (Literal.MicrosoftInteger) {
3956 if (Literal.MicrosoftInteger == 8 && !Literal.isUnsigned) {
3960 Width = Literal.MicrosoftInteger;
3962 !Literal.isUnsigned);
3968 if (Literal.isBitInt) {
3971 Width = std::max(ResultVal.getActiveBits(), 1u) +
3972 (Literal.isUnsigned ? 0u : 1u);
3976 unsigned int MaxBitIntWidth =
3978 if (Width > MaxBitIntWidth) {
3980 << Literal.isUnsigned;
3981 Width = MaxBitIntWidth;
3988 ResultVal = ResultVal.zextOrTrunc(Width);
3993 if (Literal.isSizeT) {
3994 assert(!Literal.MicrosoftInteger &&
3995 "size_t literals can't be Microsoft literals");
4000 if (ResultVal.isIntN(SizeTSize)) {
4002 if (!Literal.isUnsigned && ResultVal[SizeTSize - 1] == 0)
4004 else if (AllowUnsigned)
4010 if (Ty.
isNull() && !Literal.isLong && !Literal.isLongLong &&
4016 if (ResultVal.isIntN(IntSize)) {
4018 if (!Literal.isUnsigned && ResultVal[IntSize-1] == 0)
4020 else if (AllowUnsigned)
4027 if (Ty.
isNull() && !Literal.isLongLong && !Literal.isSizeT) {
4031 if (ResultVal.isIntN(LongSize)) {
4033 if (!Literal.isUnsigned && ResultVal[LongSize-1] == 0)
4035 else if (AllowUnsigned)
4040 const unsigned LongLongSize =
4045 ? diag::warn_old_implicitly_unsigned_long_cxx
4047 ext_old_implicitly_unsigned_long_cxx
4048 : diag::warn_old_implicitly_unsigned_long)
4049 << (LongLongSize > LongSize ? 0
4058 if (Ty.
isNull() && !Literal.isSizeT) {
4062 if (ResultVal.isIntN(LongLongSize)) {
4066 if (!Literal.isUnsigned && (ResultVal[LongLongSize-1] == 0 ||
4067 (
getLangOpts().MSVCCompat && Literal.isLongLong)))
4069 else if (AllowUnsigned)
4071 Width = LongLongSize;
4077 ? diag::warn_cxx98_compat_longlong
4078 : diag::ext_cxx11_longlong);
4088 if (Literal.isSizeT)
4090 << Literal.isUnsigned;
4093 diag::ext_integer_literal_too_large_for_signed);
4098 if (ResultVal.getBitWidth() != Width)
4099 ResultVal = ResultVal.trunc(Width);
4105 if (Literal.isImaginary) {
4112 DiagId = diag::ext_gnu_imaginary_constant;
4114 DiagId = diag::warn_c23_compat_imaginary_constant;
4116 DiagId = diag::ext_c2y_imaginary_constant;
4123 assert(
E &&
"ActOnParenExpr() missing expr");
4139 S.
Diag(
Loc, diag::err_vecstep_non_scalar_vector_type)
4145 "Scalar types should always be complete");
4154 return S.
Diag(
Loc, diag::err_builtin_non_vector_type)
4156 <<
"__builtin_vectorelements" <<
T << ArgRange;
4169 S.
Diag(
Loc, diag::err_ptrauth_type_disc_undiscriminated) <<
T << ArgRange;
4186 (TraitKind == UETT_SizeOf || TraitKind == UETT_AlignOf ||
4187 TraitKind == UETT_PreferredAlignOf)) {
4189 S.
Diag(
Loc, diag::ext_sizeof_alignof_function_type)
4197 unsigned DiagID = S.
LangOpts.OpenCL ? diag::err_opencl_sizeof_alignof_type
4198 : diag::ext_sizeof_alignof_void_type;
4213 S.
Diag(
Loc, diag::err_sizeof_nonfragile_interface)
4214 <<
T << (TraitKind == UETT_SizeOf)
4231 const auto *ICE = dyn_cast<ImplicitCastExpr>(
E);
4232 if (!ICE || ICE->getCastKind() != CK_ArrayToPointerDecay)
4235 S.
Diag(
Loc, diag::warn_sizeof_array_decay) << ICE->getSourceRange()
4237 << ICE->getSubExpr()->getType();
4245 bool IsUnevaluatedOperand =
4246 (ExprKind == UETT_SizeOf || ExprKind == UETT_DataSizeOf ||
4247 ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf ||
4248 ExprKind == UETT_VecStep);
4249 if (IsUnevaluatedOperand) {
4267 if (ExprKind == UETT_VecStep)
4271 if (ExprKind == UETT_VectorElements)
4293 if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf) {
4296 diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4301 E, diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4320 if (ExprKind == UETT_SizeOf) {
4321 if (
const auto *DeclRef = dyn_cast<DeclRefExpr>(
E->
IgnoreParens())) {
4322 if (
const auto *PVD = dyn_cast<ParmVarDecl>(DeclRef->getFoundDecl())) {
4323 QualType OType = PVD->getOriginalType();
4328 Diag(PVD->getLocation(), diag::note_declared_at);
4336 if (
const auto *BO = dyn_cast<BinaryOperator>(
E->
IgnoreParens())) {
4360 if (
DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Inner)) {
4362 }
else if (
MemberExpr *ME = dyn_cast<MemberExpr>(Inner)) {
4363 D = ME->getMemberDecl();
4383 if (
FieldDecl *FD = dyn_cast_or_null<FieldDecl>(
D)) {
4386 if (!FD->getParent()->isCompleteDefinition()) {
4396 if (!FD->getType()->isReferenceType())
4416 assert(CSI !=
nullptr);
4420 const Type *Ty =
T.getTypePtr();
4422#define TYPE(Class, Base)
4423#define ABSTRACT_TYPE(Class, Base)
4424#define NON_CANONICAL_TYPE(Class, Base)
4425#define DEPENDENT_TYPE(Class, Base) case Type::Class:
4426#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)
4427#include "clang/AST/TypeNodes.inc"
4434 case Type::ExtVector:
4435 case Type::ConstantMatrix:
4438 case Type::TemplateSpecialization:
4439 case Type::ObjCObject:
4440 case Type::ObjCInterface:
4441 case Type::ObjCObjectPointer:
4442 case Type::ObjCTypeParam:
4445 llvm_unreachable(
"type class is never variably-modified!");
4446 case Type::Elaborated:
4447 T = cast<ElaboratedType>(Ty)->getNamedType();
4449 case Type::Adjusted:
4450 T = cast<AdjustedType>(Ty)->getOriginalType();
4455 case Type::ArrayParameter:
4456 T = cast<ArrayParameterType>(Ty)->getElementType();
4461 case Type::BlockPointer:
4464 case Type::LValueReference:
4465 case Type::RValueReference:
4468 case Type::MemberPointer:
4471 case Type::ConstantArray:
4472 case Type::IncompleteArray:
4474 T = cast<ArrayType>(Ty)->getElementType();
4476 case Type::VariableArray: {
4484 (isa<CapturedRegionScopeInfo>(CSI) || isa<LambdaScopeInfo>(CSI)))
4490 case Type::FunctionProto:
4491 case Type::FunctionNoProto:
4496 case Type::UnaryTransform:
4497 case Type::Attributed:
4498 case Type::BTFTagAttributed:
4499 case Type::HLSLAttributedResource:
4500 case Type::SubstTemplateTypeParm:
4501 case Type::MacroQualified:
4502 case Type::CountAttributed:
4504 T =
T.getSingleStepDesugaredType(Context);
4507 T = cast<TypedefType>(Ty)->
desugar();
4509 case Type::Decltype:
4510 T = cast<DecltypeType>(Ty)->
desugar();
4512 case Type::PackIndexing:
4513 T = cast<PackIndexingType>(Ty)->
desugar();
4516 T = cast<UsingType>(Ty)->
desugar();
4519 case Type::DeducedTemplateSpecialization:
4520 T = cast<DeducedType>(Ty)->getDeducedType();
4522 case Type::TypeOfExpr:
4523 T = cast<TypeOfExprType>(Ty)->getUnderlyingExpr()->getType();
4526 T = cast<AtomicType>(Ty)->getValueType();
4552 if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf ||
4553 ExprKind == UETT_OpenMPRequiredSimdAlign) {
4559 ? diag::warn_c2y_compat_alignof_incomplete_array
4560 : diag::ext_c2y_alignof_incomplete_array);
4564 if (ExprKind == UETT_VecStep)
4567 if (ExprKind == UETT_VectorElements)
4571 if (ExprKind == UETT_PtrAuthTypeDiscriminator)
4581 OpLoc, ExprType, diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4586 Diag(OpLoc, diag::err_sizeof_alignof_function_type) << KWName << ExprRange;
4594 Diag(OpLoc, diag::err_wasm_table_invalid_uett_operand)
4608 auto *CSI = dyn_cast<CapturingScopeInfo>(*I);
4612 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(CSI))
4613 DC = LSI->CallOperator;
4614 else if (
auto *CRSI = dyn_cast<CapturedRegionScopeInfo>(CSI))
4615 DC = CRSI->TheCapturedDecl;
4616 else if (
auto *BSI = dyn_cast<BlockScopeInfo>(CSI))
4669 }
else if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf) {
4671 }
else if (ExprKind == UETT_VecStep) {
4673 }
else if (ExprKind == UETT_OpenMPRequiredSimdAlign) {
4679 }
else if (ExprKind == UETT_VectorElements) {
4722 UETT_AlignOf, KWName);
4735 if (
V.get()->isTypeDependent())
4747 return CT->getElementType();
4750 if (
V.get()->getType()->isArithmeticType())
4751 return V.get()->getType();
4756 if (PR.
get() !=
V.get()) {
4762 S.
Diag(
Loc, diag::err_realimag_invalid_type) <<
V.get()->getType()
4763 << (IsReal ?
"__real" :
"__imag");
4774 default: llvm_unreachable(
"Unknown unary op!");
4775 case tok::plusplus: Opc = UO_PostInc;
break;
4776 case tok::minusminus: Opc = UO_PostDec;
break;
4795 !S.
LangOpts.ObjCSubscriptingLegacyRuntime)
4798 S.
Diag(opLoc, diag::err_arithmetic_nonfragile_interface)
4805 auto *BaseNoParens =
Base->IgnoreParens();
4806 if (
auto *MSProp = dyn_cast<MSPropertyRefExpr>(BaseNoParens))
4807 return MSProp->getPropertyDecl()->getType()->isArrayType();
4808 return isa<MSPropertySubscriptExpr>(BaseNoParens);
4828 if (RTy->isIntegralOrUnscopedEnumerationType()) {
4830 Result = PT->getPointeeType();
4832 Result = AT->getElementType();
4835 Result = PT->getPointeeType();
4837 Result = AT->getElementType();
4850 auto *AS = cast<ArraySectionExpr>(base);
4851 if (AS->isOMPArraySection())
4863 if (isa<ParenListExpr>(base)) {
4867 base = result.
get();
4874 auto CheckAndReportCommaError = [
this, base, rbLoc](
Expr *
E) {
4875 if (isa<BinaryOperator>(
E) && cast<BinaryOperator>(
E)->isCommaOp()) {
4886 !isa<MatrixSubscriptExpr>(base)) {
4887 Diag(base->
getExprLoc(), diag::err_matrix_separate_incomplete_index)
4893 auto *matSubscriptE = dyn_cast<MatrixSubscriptExpr>(base);
4894 if (matSubscriptE) {
4895 assert(ArgExprs.size() == 1);
4896 if (CheckAndReportCommaError(ArgExprs.front()))
4899 assert(matSubscriptE->isIncomplete() &&
4900 "base has to be an incomplete matrix subscript");
4902 matSubscriptE->getRowIdx(),
4903 ArgExprs.front(), rbLoc);
4911 CheckInvalidBuiltinCountedByRef(base, ArraySubscriptKind);
4918 bool IsMSPropertySubscript =
false;
4921 if (!IsMSPropertySubscript) {
4925 base = result.
get();
4931 assert(ArgExprs.size() == 1);
4932 if (CheckAndReportCommaError(ArgExprs.front()))
4940 Expr *idx = ArgExprs[0];
4941 if ((isa<BinaryOperator>(idx) && cast<BinaryOperator>(idx)->isCommaOp()) ||
4942 (isa<CXXOperatorCallExpr>(idx) &&
4943 cast<CXXOperatorCallExpr>(idx)->getOperator() == OO_Comma)) {
4949 if (ArgExprs.size() == 1 &&
4950 ArgExprs[0]->getType()->isNonOverloadPlaceholderType()) {
4954 ArgExprs[0] = result.
get();
4964 !isa<PackExpansionExpr>(ArgExprs[0])) {
4966 base, ArgExprs.front(),
4979 if (IsMSPropertySubscript) {
4980 assert(ArgExprs.size() == 1);
4998 (ArgExprs.size() != 1 || isa<PackExpansionExpr>(ArgExprs[0]) ||
4999 ArgExprs[0]->getType()->isRecordType())))) {
5006 if (!Res.
isInvalid() && isa<ArraySubscriptExpr>(Res.
get()))
5007 CheckSubscriptAccessOfNoDeref(cast<ArraySubscriptExpr>(Res.
get()));
5017 return InitSeq.
Perform(*
this, Entity, Kind,
E);
5031 RowIdx = RowR.
get();
5046 ColumnIdx = ColumnR.
get();
5051 auto IsIndexValid = [&](
Expr *IndexExpr,
unsigned Dim,
5052 bool IsColumnIdx) ->
Expr * {
5060 if (std::optional<llvm::APSInt> Idx =
5062 if ((*Idx < 0 || *Idx >=
Dim)) {
5064 << IsColumnIdx <<
Dim;
5071 "should be able to convert any integer type to size type");
5072 return ConvExpr.
get();
5076 RowIdx = IsIndexValid(RowIdx, MTy->getNumRows(),
false);
5077 ColumnIdx = IsIndexValid(ColumnIdx, MTy->getNumColumns(),
true);
5078 if (!RowIdx || !ColumnIdx)
5082 MTy->getElementType(), RBLoc);
5085void Sema::CheckAddressOfNoDeref(
const Expr *
E) {
5092 while ((
Member = dyn_cast<MemberExpr>(StrippedExpr)) && !
Member->isArrow())
5093 StrippedExpr =
Member->getBase()->IgnoreParenImpCasts();
5095 LastRecord.PossibleDerefs.erase(StrippedExpr);
5106 if (isa<ArrayType>(ResultTy))
5109 if (ResultTy->
hasAttr(attr::NoDeref)) {
5110 LastRecord.PossibleDerefs.insert(
E);
5118 if (!(isa<ArrayType>(BaseTy) || isa<PointerType>(BaseTy)))
5123 while ((
Member = dyn_cast<MemberExpr>(
Base->IgnoreParenCasts())) &&
5127 if (
const auto *Ptr = dyn_cast<PointerType>(
Base->getType())) {
5128 if (Ptr->getPointeeType()->hasAttr(attr::NoDeref))
5129 LastRecord.PossibleDerefs.insert(
E);
5145 for (
auto *Op : {LHSExp, RHSExp}) {
5146 Op = Op->IgnoreImplicit();
5147 if (Op->getType()->isArrayType() && !Op->isLValue())
5170 Expr *BaseExpr, *IndexExpr;
5205 Diag(LLoc, diag::err_subscript_nonfragile_interface)
5229 LHSExp = Materialized.
get();
5238 Qualifiers Combined = BaseQuals + MemberQuals;
5239 if (Combined != MemberQuals)
5250 CK_ArrayToPointerDecay).
get();
5256 }
else if (RHSTy->isArrayType()) {
5261 CK_ArrayToPointerDecay).
get();
5268 return ExprError(
Diag(LLoc, diag::err_typecheck_subscript_value)
5273 return ExprError(
Diag(LLoc, diag::err_typecheck_subscript_not_integer)
5279 std::optional<llvm::APSInt> IntegerContantExpr =
5281 if (!IntegerContantExpr.has_value() ||
5282 IntegerContantExpr.value().isNegative())
5298 Diag(LLoc, diag::ext_gnu_subscript_void_type)
5309 diag::err_subscript_incomplete_or_sizeless_type, BaseExpr))
5322 auto *CSI = dyn_cast<CapturingScopeInfo>(*I);
5326 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(CSI))
5327 DC = LSI->CallOperator;
5328 else if (
auto *CRSI = dyn_cast<CapturedRegionScopeInfo>(CSI))
5329 DC = CRSI->TheCapturedDecl;
5330 else if (
auto *BSI = dyn_cast<BlockScopeInfo>(CSI))
5348 bool SkipImmediateInvocations) {
5350 assert(!RewrittenInit &&
"Should not have a rewritten init expression yet");
5354 Diag(Param->
getBeginLoc(), diag::err_recursive_default_argument) << FD;
5355 Diag(CallLoc, diag::note_recursive_default_argument_used_here);
5360 Diag(CallLoc, diag::err_use_of_default_argument_to_function_declared_later)
5363 diag::note_default_argument_declared_here);
5368 assert(!RewrittenInit &&
"Should not have a rewitten init expression yet");
5374 assert(
Init &&
"default argument but no initializer?");
5383 if (
auto *InitWithCleanup = dyn_cast<ExprWithCleanups>(
Init)) {
5390 assert(!InitWithCleanup->getNumObjects() &&
5391 "default argument expression has capturing blocks?");
5404 SkipImmediateInvocations;
5414 ShouldVisitImplicitCode =
true;
5417 bool HasImmediateCalls =
false;
5421 HasImmediateCalls |= FD->isImmediateFunction();
5427 HasImmediateCalls |= FD->isImmediateFunction();
5436 HasImmediateCalls =
true;
5447 return VisitCXXMethodDecl(
E->getCallOperator());
5451 return TraverseStmt(
E->getExpr());
5455 return TraverseStmt(
E->getExpr());
5481 if (DC == SemaRef.CurContext)
5492 if (!SemaRef.CurrentInstantiationScope ||
5494 DC = SemaRef.CurContext;
5496 return getDerived().RebuildSourceLocExpr(
5504 assert(Param->
hasDefaultArg() &&
"can't build nonexistent default arg");
5508 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
5509 InitializationContext =
5511 if (!InitializationContext.has_value())
5512 InitializationContext.emplace(CallLoc, Param,
CurContext);
5538 if (!NestedDefaultChecking)
5539 V.TraverseDecl(Param);
5543 if (
V.HasImmediateCalls ||
5544 (NeedRebuild && isa_and_present<ExprWithCleanups>(Param->
getInit()))) {
5545 if (
V.HasImmediateCalls)
5555 Res = Immediate.TransformInitializer(Param->
getInit(),
5569 CallLoc, FD, Param,
Init,
5570 NestedDefaultChecking))
5574 Init, InitializationContext->Context);
5581 auto *ParentRD = cast<CXXRecordDecl>(Field->getParent());
5584 ClassPattern->
lookup(Field->getDeclName());
5585 auto Rng = llvm::make_filter_range(
5586 Lookup, [](
auto &&L) {
return isa<FieldDecl>(*L); });
5592 return cast<FieldDecl>(*Rng.begin());
5596 assert(Field->hasInClassInitializer());
5600 auto *ParentRD = cast<CXXRecordDecl>(Field->getParent());
5602 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
5603 InitializationContext =
5605 if (!InitializationContext.has_value())
5615 if (!Field->getInClassInitializer()) {
5621 assert(Pattern &&
"We must have set the Pattern!");
5625 Field->setInvalidDecl();
5637 if (!NestedDefaultChecking)
5638 V.TraverseDecl(Field);
5647 bool ContainsAnyTemporaries =
5648 isa_and_present<ExprWithCleanups>(Field->getInClassInitializer());
5649 if (Field->getInClassInitializer() &&
5650 !Field->getInClassInitializer()->containsErrors() &&
5651 (
V.HasImmediateCalls || (NeedRebuild && ContainsAnyTemporaries))) {
5655 NestedDefaultChecking;
5663 Res = Immediate.TransformInitializer(Field->getInClassInitializer(),
5669 Field->setInvalidDecl();
5675 if (Field->getInClassInitializer()) {
5677 if (!NestedDefaultChecking)
5688 Field->setInvalidDecl();
5694 Field, InitializationContext->Context,
5713 Diag(
Loc, diag::err_default_member_initializer_not_yet_parsed)
5714 << OutermostClass << Field;
5715 Diag(Field->getEndLoc(),
5716 diag::note_default_member_initializer_not_yet_parsed);
5719 Field->setInvalidDecl();
5727 if (isa_and_nonnull<CXXConstructorDecl>(FDecl))
5729 else if (Fn && Fn->getType()->isBlockPointerType())
5732 if (
CXXMethodDecl *Method = dyn_cast_or_null<CXXMethodDecl>(FDecl))
5733 if (Method->isInstance())
5748 FunctionName(FuncName) {}
5750 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
5759 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
5760 return std::make_unique<FunctionCallCCC>(*
this);
5780 if (
NamedDecl *ND = Corrected.getFoundDecl()) {
5781 if (Corrected.isOverloaded()) {
5791 ND = Best->FoundDecl;
5792 Corrected.setCorrectionDecl(ND);
5798 ND = ND->getUnderlyingDecl();
5799 if (isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND))
5810 if (!isa<ParenExpr>(Fn))
5813 Fn = Fn->IgnoreParens();
5815 auto *UO = dyn_cast<UnaryOperator>(Fn);
5816 if (!UO || UO->getOpcode() != clang::UO_AddrOf)
5818 if (
auto *DRE = dyn_cast<DeclRefExpr>(UO->getSubExpr()->IgnoreParens())) {
5819 return DRE->hasQualifier();
5821 if (
auto *OVL = dyn_cast<OverloadExpr>(UO->getSubExpr()->IgnoreParens()))
5822 return OVL->getQualifier();
5832 bool IsExecConfig) {
5843 bool HasExplicitObjectParameter =
5845 unsigned ExplicitObjectParameterOffset = HasExplicitObjectParameter ? 1 : 0;
5849 unsigned FnKind = Fn->getType()->isBlockPointerType()
5856 if (Args.size() < NumParams) {
5857 if (Args.size() < MinArgs) {
5862 ? diag::err_typecheck_call_too_few_args_suggest
5863 : diag::err_typecheck_call_too_few_args_at_least_suggest;
5866 << FnKind << MinArgs - ExplicitObjectParameterOffset
5867 <<
static_cast<unsigned>(Args.size()) -
5868 ExplicitObjectParameterOffset
5870 }
else if (MinArgs - ExplicitObjectParameterOffset == 1 && FDecl &&
5875 ? diag::err_typecheck_call_too_few_args_one
5876 : diag::err_typecheck_call_too_few_args_at_least_one)
5877 << FnKind << FDecl->
getParamDecl(ExplicitObjectParameterOffset)
5878 << HasExplicitObjectParameter << Fn->getSourceRange();
5881 ? diag::err_typecheck_call_too_few_args
5882 : diag::err_typecheck_call_too_few_args_at_least)
5883 << FnKind << MinArgs - ExplicitObjectParameterOffset
5884 <<
static_cast<unsigned>(Args.size()) -
5885 ExplicitObjectParameterOffset
5886 << HasExplicitObjectParameter << Fn->getSourceRange();
5889 if (!TC && FDecl && !FDecl->
getBuiltinID() && !IsExecConfig)
5897 assert((
Call->getNumArgs() == NumParams) &&
5898 "We should have reserved space for the default arguments before!");
5903 if (Args.size() > NumParams) {
5909 ? diag::err_typecheck_call_too_many_args_suggest
5910 : diag::err_typecheck_call_too_many_args_at_most_suggest;
5913 << FnKind << NumParams - ExplicitObjectParameterOffset
5914 <<
static_cast<unsigned>(Args.size()) -
5915 ExplicitObjectParameterOffset
5917 }
else if (NumParams - ExplicitObjectParameterOffset == 1 && FDecl &&
5920 Diag(Args[NumParams]->getBeginLoc(),
5921 MinArgs == NumParams
5922 ? diag::err_typecheck_call_too_many_args_one
5923 : diag::err_typecheck_call_too_many_args_at_most_one)
5924 << FnKind << FDecl->
getParamDecl(ExplicitObjectParameterOffset)
5925 <<
static_cast<unsigned>(Args.size()) -
5926 ExplicitObjectParameterOffset
5927 << HasExplicitObjectParameter << Fn->getSourceRange()
5929 Args.back()->getEndLoc());
5931 Diag(Args[NumParams]->getBeginLoc(),
5932 MinArgs == NumParams
5933 ? diag::err_typecheck_call_too_many_args
5934 : diag::err_typecheck_call_too_many_args_at_most)
5935 << FnKind << NumParams - ExplicitObjectParameterOffset
5936 <<
static_cast<unsigned>(Args.size()) -
5937 ExplicitObjectParameterOffset
5938 << HasExplicitObjectParameter << Fn->getSourceRange()
5940 Args.back()->getEndLoc());
5943 if (!TC && FDecl && !FDecl->
getBuiltinID() && !IsExecConfig)
5948 Call->shrinkNumArgs(NumParams);
5959 unsigned TotalNumArgs = AllArgs.size();
5960 for (
unsigned i = 0; i < TotalNumArgs; ++i)
5961 Call->setArg(i, AllArgs[i]);
5963 Call->computeDependence();
5972 bool IsListInitialization) {
5977 for (
unsigned i = FirstParam; i < NumParams; i++) {
5982 if (ArgIx < Args.size()) {
5983 Arg = Args[ArgIx++];
5986 diag::err_call_incomplete_argument, Arg))
5990 bool CFAudited =
false;
5992 FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>() &&
5993 (!Param || !Param->
hasAttr<CFConsumedAttr>()))
5996 FDecl && FDecl->
hasAttr<CFAuditedTransferAttr>() &&
5997 (!Param || !Param->
hasAttr<CFConsumedAttr>()))
6003 BE->getBlockDecl()->setDoesNotEscape();
6023 Entity,
SourceLocation(), Arg, IsListInitialization, AllowExplicit);
6029 assert(Param &&
"can't use default arguments without a known callee");
6041 CheckArrayAccess(Arg);
6046 AllArgs.push_back(Arg);
6055 for (
Expr *A : Args.slice(ArgIx)) {
6059 AllArgs.push_back(arg.get());
6064 for (
Expr *A : Args.slice(ArgIx)) {
6067 AllArgs.push_back(Arg.
get());
6072 for (
Expr *A : Args.slice(ArgIx))
6073 CheckArrayAccess(A);
6081 TL = DTL.getOriginalLoc();
6084 << ATL.getLocalSourceRange();
6090 const Expr *ArgExpr) {
6120 Diag(CallLoc, diag::warn_static_array_too_small)
6128 std::optional<CharUnits> ArgSize =
6130 std::optional<CharUnits> ParmSize =
6132 if (ArgSize && ParmSize && *ArgSize < *ParmSize) {
6133 Diag(CallLoc, diag::warn_static_array_too_small)
6135 << (
unsigned)ParmSize->getQuantity() << 1;
6149 if (!placeholder)
return false;
6151 switch (placeholder->
getKind()) {
6153#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
6154 case BuiltinType::Id:
6155#include "clang/Basic/OpenCLImageTypes.def"
6156#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
6157 case BuiltinType::Id:
6158#include "clang/Basic/OpenCLExtensionTypes.def"
6161#define SVE_TYPE(Name, Id, SingletonId) \
6162 case BuiltinType::Id:
6163#include "clang/Basic/AArch64SVEACLETypes.def"
6164#define PPC_VECTOR_TYPE(Name, Id, Size) \
6165 case BuiltinType::Id:
6166#include "clang/Basic/PPCTypes.def"
6167#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6168#include "clang/Basic/RISCVVTypes.def"
6169#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6170#include "clang/Basic/WebAssemblyReferenceTypes.def"
6171#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
6172#include "clang/Basic/AMDGPUTypes.def"
6173#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6174#include "clang/Basic/HLSLIntangibleTypes.def"
6175#define PLACEHOLDER_TYPE(ID, SINGLETON_ID)
6176#define BUILTIN_TYPE(ID, SINGLETON_ID) case BuiltinType::ID:
6177#include "clang/AST/BuiltinTypes.def"
6180 case BuiltinType::UnresolvedTemplate:
6183 case BuiltinType::Overload:
6188 case BuiltinType::ARCUnbridgedCast:
6192 case BuiltinType::PseudoObject:
6197 case BuiltinType::UnknownAny:
6201 case BuiltinType::BoundMember:
6202 case BuiltinType::BuiltinFn:
6203 case BuiltinType::IncompleteMatrixIdx:
6204 case BuiltinType::ArraySection:
6205 case BuiltinType::OMPArrayShaping:
6206 case BuiltinType::OMPIterator:
6210 llvm_unreachable(
"bad builtin type kind");
6216 bool hasInvalid =
false;
6217 for (
size_t i = 0, e = args.size(); i != e; i++) {
6220 if (result.
isInvalid()) hasInvalid =
true;
6221 else args[i] = result.
get();
6249 bool NeedsNewDecl =
false;
6262 if (!ParamType->isPointerType() || ParamType.hasAddressSpace() ||
6266 OverloadParams.push_back(ParamType);
6274 NeedsNewDecl =
true;
6287 OverloadParams, EPI);
6296 FT = cast<FunctionProtoType>(OverloadTy);
6297 for (
unsigned i = 0, e = FT->
getNumParams(); i != e; ++i) {
6304 Params.push_back(Parm);
6306 OverloadDecl->setParams(Params);
6308 return OverloadDecl;
6319 !Callee->isVariadic())
6321 if (Callee->getMinRequiredArguments() > ArgExprs.size())
6324 if (
const EnableIfAttr *
Attr =
6325 S.
CheckEnableIf(Callee, Fn->getBeginLoc(), ArgExprs,
true)) {
6326 S.
Diag(Fn->getBeginLoc(),
6327 isa<CXXMethodDecl>(Callee)
6328 ? diag::err_ovl_no_viable_member_function_in_call
6329 : diag::err_ovl_no_viable_function_in_call)
6330 << Callee << Callee->getSourceRange();
6331 S.
Diag(Callee->getLocation(),
6332 diag::note_ovl_candidate_disabled_by_function_cond_attr)
6333 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
6341 const auto GetFunctionLevelDCIfCXXClass =
6349 if (
const auto *MD = dyn_cast<CXXMethodDecl>(DC))
6350 return MD->
getParent()->getCanonicalDecl();
6353 if (
const auto *RD = dyn_cast<CXXRecordDecl>(DC))
6354 return RD->getCanonicalDecl();
6361 const CXXRecordDecl *
const CurParentClass = GetFunctionLevelDCIfCXXClass(S);
6362 if (!CurParentClass)
6369 assert(NamingClass &&
"Must have naming class even for implicit access");
6375 return CurParentClass == NamingClass ||
6424 if (
Call->getNumArgs() != 1)
6427 const Expr *
E =
Call->getCallee()->IgnoreParenImpCasts();
6428 if (!
E || isa<UnresolvedLookupExpr>(
E))
6430 const DeclRefExpr *DRE = dyn_cast_if_present<DeclRefExpr>(
E);
6443 if (BuiltinID != Builtin::BImove && BuiltinID != Builtin::BIforward)
6446 S.
Diag(DRE->
getLocation(), diag::warn_unqualified_call_to_std_cast_function)
6457 if (
Call.isInvalid())
6462 if (
const auto *ULE = dyn_cast<UnresolvedLookupExpr>(Fn);
6463 ULE && ULE->hasExplicitTemplateArgs() &&
6464 ULE->decls_begin() == ULE->decls_end()) {
6466 ? diag::warn_cxx17_compat_adl_only_template_id
6467 : diag::ext_adl_only_template_id)
6475 if (
const auto *CE = dyn_cast<CallExpr>(
Call.get()))
6481 if (
auto *DRE = dyn_cast<DeclRefExpr>(Fn->IgnoreParens());
6482 DRE &&
Call.get()->isValueDependent()) {
6491 Expr *ExecConfig,
bool IsExecConfig,
6492 bool AllowRecovery) {
6503 for (
const Expr *Arg : ArgExprs)
6504 if (CheckInvalidBuiltinCountedByRef(Arg, FunctionArgKind))
6509 if (isa<CXXPseudoDestructorExpr>(Fn)) {
6510 if (!ArgExprs.empty()) {
6512 Diag(Fn->getBeginLoc(), diag::err_pseudo_dtor_call_with_args)
6515 ArgExprs.back()->getEndLoc()));
6532 cast<CallExpr>(ExecConfig), ArgExprs,
6538 *
this, dyn_cast<UnresolvedMemberExpr>(Fn->IgnoreParens()),
6547 if (Fn->getType()->isRecordType())
6559 RParenLoc, ExecConfig, IsExecConfig,
6576 Scope, Fn, ULE, LParenLoc, ArgExprs, RParenLoc, ExecConfig,
6579 RParenLoc, ExecConfig, IsExecConfig,
6591 Expr *NakedFn = Fn->IgnoreParens();
6593 bool CallingNDeclIndirectly =
false;
6595 if (
UnaryOperator *UnOp = dyn_cast<UnaryOperator>(NakedFn)) {
6596 if (UnOp->getOpcode() == UO_AddrOf) {
6597 CallingNDeclIndirectly =
true;
6602 if (
auto *DRE = dyn_cast<DeclRefExpr>(NakedFn)) {
6603 NDecl = DRE->getDecl();
6616 nullptr, DRE->isNonOdrUse());
6619 }
else if (
auto *ME = dyn_cast<MemberExpr>(NakedFn))
6620 NDecl = ME->getMemberDecl();
6622 if (
FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(NDecl)) {
6624 FD,
true, Fn->getBeginLoc()))
6636 FD->getBuiltinID()) {
6637 for (
unsigned Idx = 0; Idx < ArgExprs.size() && Idx < FD->param_size();
6641 !ArgExprs[Idx]->getType()->isPointerType())
6645 auto ArgTy = ArgExprs[Idx]->getType();
6646 auto ArgPtTy = ArgTy->getPointeeType();
6647 auto ArgAS = ArgPtTy.getAddressSpace();
6650 bool NeedImplicitASC =
6655 if (!NeedImplicitASC)
6659 if (ArgExprs[Idx]->isGLValue()) {
6661 Context, ArgExprs[Idx]->getType(), CK_NoOp, ArgExprs[Idx],
6666 Qualifiers ArgPtQuals = ArgPtTy.getQualifiers();
6676 CK_AddressSpaceConversion)
6685 assert((Fn->containsErrors() ||
6686 llvm::any_of(ArgExprs,
6687 [](
clang::Expr *
E) { return E->containsErrors(); })) &&
6688 "should only occur in error-recovery path.");
6693 ExecConfig, IsExecConfig);
6704 assert(BuiltInDecl &&
"failed to find builtin declaration");
6708 assert(DeclRef.
isUsable() &&
"Builtin reference cannot fail");
6713 assert(!
Call.isInvalid() &&
"Call to builtin cannot fail!");
6733 Diag(BuiltinLoc, diag::err_invalid_astype_of_different_size)
6751 FunctionDecl *FDecl = dyn_cast_or_null<FunctionDecl>(NDecl);
6752 unsigned BuiltinID = (FDecl ? FDecl->
getBuiltinID() : 0);
6756 if (FDecl->
hasAttr<AnyX86InterruptAttr>()) {
6757 Diag(Fn->getExprLoc(), diag::err_anyx86_interrupt_called);
6760 if (FDecl->
hasAttr<ARMInterruptAttr>()) {
6761 Diag(Fn->getExprLoc(), diag::err_arm_interrupt_called);
6770 if (Caller->hasAttr<AnyX86InterruptAttr>() ||
6771 Caller->hasAttr<AnyX86NoCallerSavedRegistersAttr>()) {
6773 bool HasNonGPRRegisters =
6775 if (HasNonGPRRegisters &&
6776 (!FDecl || !FDecl->
hasAttr<AnyX86NoCallerSavedRegistersAttr>())) {
6777 Diag(Fn->getExprLoc(), diag::warn_anyx86_excessive_regsave)
6778 << (Caller->hasAttr<AnyX86InterruptAttr>() ? 0 : 1);
6791 Fn->getType()->isSpecificBuiltinType(BuiltinType::BuiltinFn)) {
6818 return ExprError(
Diag(LParenLoc, diag::err_typecheck_call_not_function)
6819 << Fn->getType() << Fn->getSourceRange());
6833 return ExprError(
Diag(LParenLoc, diag::err_typecheck_call_not_function)
6834 << Fn->getType() << Fn->getSourceRange());
6841 const auto *Proto = dyn_cast_or_null<FunctionProtoType>(FuncT);
6842 unsigned NumParams = Proto ? Proto->getNumParams() : 0;
6846 assert(UsesADL == ADLCallKind::NotADL &&
6847 "CUDAKernelCallExpr should not use ADL");
6868 TheCall = dyn_cast<CallExpr>(
Result.get());
6869 bool CorrectedTypos = TheCall != TheOldCall;
6870 if (!TheCall)
return Result;
6877 if (CorrectedTypos && Args.size() < NumParams) {
6893 ExprResult E = CheckBuiltinFunctionCall(FDecl, BuiltinID, TheCall);
6902 if (FDecl && !FDecl->
hasAttr<CUDAGlobalAttr>())
6903 return ExprError(
Diag(LParenLoc,diag::err_kern_call_not_global_function)
6904 << FDecl << Fn->getSourceRange());
6910 return ExprError(
Diag(LParenLoc, diag::err_kern_type_not_void_return)
6911 << Fn->getType() << Fn->getSourceRange());
6914 if (FDecl && FDecl->
hasAttr<CUDAGlobalAttr>())
6915 return ExprError(
Diag(LParenLoc, diag::err_global_call_not_config)
6916 << FDecl << Fn->getSourceRange());
6931 for (
const Expr *Arg : Args) {
6932 if (Arg && Arg->getType()->isWebAssemblyTableType()) {
6934 diag::err_wasm_table_as_function_parameter));
6944 assert(isa<FunctionNoProtoType>(FuncT) &&
"Unknown FunctionType!");
6952 if (!Proto || !(Proto->isVariadic() && Args.size() >= Def->
param_size()))
6953 Diag(RParenLoc, diag::warn_call_wrong_number_of_arguments)
6954 << (Args.size() > Def->
param_size()) << FDecl << Fn->getSourceRange();
6973 if (!Proto && !Args.empty() &&
6977 Diag(LParenLoc, diag::warn_strict_uses_without_prototype)
6978 << (FDecl !=
nullptr) << FDecl;
6981 for (
unsigned i = 0, e = Args.size(); i != e; i++) {
6982 Expr *Arg = Args[i];
6984 if (Proto && i < Proto->getNumParams()) {
6986 Context, Proto->getParamType(i), Proto->isParamConsumed(i));
7004 diag::err_call_incomplete_argument, Arg))
7012 if (
CXXMethodDecl *Method = dyn_cast_or_null<CXXMethodDecl>(FDecl))
7013 if (Method->isImplicitObjectMemberFunction())
7014 return ExprError(
Diag(LParenLoc, diag::err_member_call_without_object)
7015 << Fn->getSourceRange() << 0);
7023 for (
unsigned i = 0, e = Args.size(); i != e; i++) {
7024 if (
const auto *RT =
7025 dyn_cast<RecordType>(Args[i]->getType().getCanonicalType())) {
7026 if (RT->getDecl()->isOrContainsUnion())
7027 Diag(Args[i]->getBeginLoc(), diag::warn_cmse_nonsecure_union)
7038 checkFortifiedBuiltinMemoryFunction(FDecl, TheCall);
7041 return CheckBuiltinFunctionCall(FDecl, BuiltinID, TheCall);
7043 if (CheckPointerCall(NDecl, TheCall, Proto))
7046 if (CheckOtherCall(TheCall, Proto))
7056 assert(Ty &&
"ActOnCompoundLiteral(): missing type");
7057 assert(InitExpr &&
"ActOnCompoundLiteral(): missing expression");
7075 diag::err_array_incomplete_or_sizeless_type,
7098 ? diag::err_variable_object_no_init
7099 : diag::err_compound_literal_with_vla_type;
7106 diag::err_typecheck_decl_incomplete_type,
7121 LiteralExpr =
Result.get();
7149 if (
auto ILE = dyn_cast<InitListExpr>(LiteralExpr))
7150 for (
unsigned i = 0, j = ILE->getNumInits(); i != j; i++) {
7156 VK, LiteralExpr, isFileScope);
7168 Diag(LParenLoc, diag::err_compound_literal_with_address_space)
7204 bool DiagnosedArrayDesignator =
false;
7205 bool DiagnosedNestedDesignator =
false;
7206 bool DiagnosedMixedDesignator =
false;
7210 for (
unsigned I = 0,
E = InitArgList.size(); I !=
E; ++I) {
7211 if (
auto *DIE = dyn_cast<DesignatedInitExpr>(InitArgList[I])) {
7213 FirstDesignator = DIE->getBeginLoc();
7218 if (!DiagnosedNestedDesignator && DIE->size() > 1) {
7219 DiagnosedNestedDesignator =
true;
7220 Diag(DIE->getBeginLoc(), diag::ext_designated_init_nested)
7221 << DIE->getDesignatorsSourceRange();
7224 for (
auto &Desig : DIE->designators()) {
7225 if (!Desig.isFieldDesignator() && !DiagnosedArrayDesignator) {
7226 DiagnosedArrayDesignator =
true;
7227 Diag(Desig.getBeginLoc(), diag::ext_designated_init_array)
7228 << Desig.getSourceRange();
7232 if (!DiagnosedMixedDesignator &&
7233 !isa<DesignatedInitExpr>(InitArgList[0])) {
7234 DiagnosedMixedDesignator =
true;
7235 Diag(DIE->getBeginLoc(), diag::ext_designated_init_mixed)
7236 << DIE->getSourceRange();
7237 Diag(InitArgList[0]->getBeginLoc(), diag::note_designated_init_mixed)
7238 << InitArgList[0]->getSourceRange();
7241 isa<DesignatedInitExpr>(InitArgList[0])) {
7242 DiagnosedMixedDesignator =
true;
7243 auto *DIE = cast<DesignatedInitExpr>(InitArgList[0]);
7244 Diag(DIE->getBeginLoc(), diag::ext_designated_init_mixed)
7245 << DIE->getSourceRange();
7246 Diag(InitArgList[I]->getBeginLoc(), diag::note_designated_init_mixed)
7247 << InitArgList[I]->getSourceRange();
7251 if (FirstDesignator.
isValid()) {
7255 !DiagnosedNestedDesignator && !DiagnosedMixedDesignator) {
7257 ? diag::warn_cxx17_compat_designated_init
7258 : diag::ext_cxx_designated_init);
7260 Diag(FirstDesignator, diag::ext_designated_init);
7275 for (
unsigned I = 0,
E = InitArgList.size(); I !=
E; ++I) {
7276 if (InitArgList[I]->getType()->isNonOverloadPlaceholderType()) {
7283 InitArgList[I] = result.
get();
7317 llvm_unreachable(
"member pointer type in C");
7326 if (SrcAS != DestAS)
7327 return CK_AddressSpaceConversion;
7334 ? CK_BitCast : CK_AnyPointerToBlockPointerCast);
7339 return CK_CPointerToObjCPointerCast;
7341 return CK_BlockPointerToObjCPointerCast;
7343 return CK_PointerToBoolean;
7345 return CK_PointerToIntegral;
7351 llvm_unreachable(
"illegal cast from pointer");
7353 llvm_unreachable(
"Should have returned before this");
7358 return CK_FixedPointCast;
7360 return CK_FixedPointToBoolean;
7362 return CK_FixedPointToIntegral;
7364 return CK_FixedPointToFloating;
7368 diag::err_unimplemented_conversion_with_fixed_point_type)
7370 return CK_IntegralCast;
7375 llvm_unreachable(
"illegal cast to pointer type");
7377 llvm_unreachable(
"Should have returned before this");
7387 return CK_NullToPointer;
7388 return CK_IntegralToPointer;
7390 return CK_IntegralToBoolean;
7392 return CK_IntegralCast;
7394 return CK_IntegralToFloating;
7399 return CK_IntegralRealToComplex;
7403 CK_IntegralToFloating);
7404 return CK_FloatingRealToComplex;
7406 llvm_unreachable(
"member pointer type in C");
7408 return CK_IntegralToFixedPoint;
7410 llvm_unreachable(
"Should have returned before this");
7415 return CK_FloatingCast;
7417 return CK_FloatingToBoolean;
7419 return CK_FloatingToIntegral;
7424 return CK_FloatingRealToComplex;
7428 CK_FloatingToIntegral);
7429 return CK_IntegralRealToComplex;
7433 llvm_unreachable(
"valid float->pointer cast?");
7435 llvm_unreachable(
"member pointer type in C");
7437 return CK_FloatingToFixedPoint;
7439 llvm_unreachable(
"Should have returned before this");
7444 return CK_FloatingComplexCast;
7446 return CK_FloatingComplexToIntegralComplex;
7450 return CK_FloatingComplexToReal;
7452 return CK_FloatingCast;
7455 return CK_FloatingComplexToBoolean;
7459 CK_FloatingComplexToReal);
7460 return CK_FloatingToIntegral;
7464 llvm_unreachable(
"valid complex float->pointer cast?");
7466 llvm_unreachable(
"member pointer type in C");
7469 diag::err_unimplemented_conversion_with_fixed_point_type)
7471 return CK_IntegralCast;
7473 llvm_unreachable(
"Should have returned before this");
7478 return CK_IntegralComplexToFloatingComplex;
7480 return CK_IntegralComplexCast;
7484 return CK_IntegralComplexToReal;
7486 return CK_IntegralCast;
7489 return CK_IntegralComplexToBoolean;
7493 CK_IntegralComplexToReal);
7494 return CK_IntegralToFloating;
7498 llvm_unreachable(
"valid complex int->pointer cast?");
7500 llvm_unreachable(
"member pointer type in C");
7503 diag::err_unimplemented_conversion_with_fixed_point_type)
7505 return CK_IntegralCast;
7507 llvm_unreachable(
"Should have returned before this");
7510 llvm_unreachable(
"Unhandled scalar cast");
7517 len = vecType->getNumElements();
7518 eltType = vecType->getElementType();
7525 if (!
type->isRealType())
return false;
7535 auto ValidScalableConversion = [](
QualType FirstType,
QualType SecondType) {
7539 const auto *VecTy = SecondType->getAs<
VectorType>();
7543 return ValidScalableConversion(srcTy, destTy) ||
7544 ValidScalableConversion(destTy, srcTy);
7554 return matSrcType->
getNumRows() == matDestType->getNumRows() &&
7555 matSrcType->
getNumColumns() == matDestType->getNumColumns();
7561 uint64_t SrcLen, DestLen;
7574 return (SrcLen * SrcEltSize == DestLen * DestEltSize);
7579 "expected at least one type to be a vector here");
7581 bool IsSrcTyAltivec =
7597 return (IsSrcTyAltivec || IsDestTyAltivec);
7624 if (!Vec || !Vec->getElementType()->isIntegralOrEnumerationType())
7629 if (!Vec || !Vec->getElementType()->isIntegralOrEnumerationType())
7646 return Diag(R.
getBegin(), diag::err_invalid_conversion_between_matrixes)
7647 << DestTy << SrcTy << R;
7651 diag::err_invalid_conversion_between_matrix_and_type)
7652 << SrcTy << DestTy << R;
7655 diag::err_invalid_conversion_between_matrix_and_type)
7656 << DestTy << SrcTy << R;
7659 Kind = CK_MatrixCast;
7665 assert(VectorTy->
isVectorType() &&
"Not a vector type!");
7671 diag::err_invalid_conversion_between_vectors :
7672 diag::err_invalid_conversion_between_vector_and_integer)
7673 << VectorTy << Ty << R;
7676 diag::err_invalid_conversion_between_vector_and_scalar)
7677 << VectorTy << Ty << R;
7686 if (DestElemTy == SplattedExpr->
getType())
7687 return SplattedExpr;
7700 CK_BooleanToSignedIntegral);
7701 SplattedExpr = CastExprRes.
get();
7702 CK = CK_IntegralToFloating;
7704 CK = CK_BooleanToSignedIntegral;
7711 SplattedExpr = CastExprRes.
get();
7730 Diag(R.
getBegin(),diag::err_invalid_conversion_between_ext_vectors)
7731 << DestTy << SrcTy << R;
7743 diag::err_invalid_conversion_between_vector_and_scalar)
7744 << DestTy << SrcTy << R;
7746 Kind = CK_VectorSplat;
7754 assert(!
D.isInvalidType() && (
CastExpr !=
nullptr) &&
7755 "ActOnCastExpr(): missing type or expr");
7758 if (
D.isInvalidType())
7777 bool isVectorLiteral =
false;
7792 isVectorLiteral =
true;
7795 isVectorLiteral =
true;
7800 if (isVectorLiteral)
7806 if (isa<ParenListExpr>(
CastExpr)) {
7827 assert((isa<ParenListExpr>(
E) || isa<ParenExpr>(
E)) &&
7828 "Expected paren or paren list expression");
7835 LiteralLParenLoc = PE->getLParenLoc();
7836 LiteralRParenLoc = PE->getRParenLoc();
7837 exprs = PE->getExprs();
7838 numExprs = PE->getNumExprs();
7840 LiteralLParenLoc = cast<ParenExpr>(
E)->getLParen();
7841 LiteralRParenLoc = cast<ParenExpr>(
E)->getRParen();
7842 subExpr = cast<ParenExpr>(
E)->getSubExpr();
7865 if (numExprs == 1) {
7868 if (Literal.isInvalid())
7874 else if (numExprs < numElems) {
7876 diag::err_incorrect_number_of_vector_initializers);
7880 initExprs.append(exprs, exprs + numExprs);
7889 if (Literal.isInvalid())
7896 initExprs.append(exprs, exprs + numExprs);
7901 initExprs, LiteralRParenLoc);
7914 for (
unsigned i = 1, e =
E->getNumExprs(); i != e && !
Result.isInvalid(); ++i)
7931 const Expr *NullExpr = LHSExpr;
7932 const Expr *NonPointerExpr = RHSExpr;
7939 NonPointerExpr = LHSExpr;
7961 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands_null)
7962 << NonPointerExpr->
getType() << DiagType
7974 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_nonfloat)
7982 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_scalar)
8016 bool IsBlockPointer =
false;
8020 IsBlockPointer =
true;
8045 ResultAddrSpace = LAddrSpace;
8047 ResultAddrSpace = RAddrSpace;
8049 S.
Diag(
Loc, diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
8056 auto LHSCastKind = CK_BitCast, RHSCastKind = CK_BitCast;
8071 LAddrSpace == ResultAddrSpace ? CK_BitCast : CK_AddressSpaceConversion;
8073 RAddrSpace == ResultAddrSpace ? CK_BitCast : CK_AddressSpaceConversion;
8081 lhptee, rhptee,
false,
false,
8084 if (CompositeTy.
isNull()) {
8101 S.
Diag(
Loc, diag::ext_typecheck_cond_incompatible_pointers)
8112 QualType ResultTy = [&, ResultAddrSpace]() {
8118 .withCVRQualifiers(MergedCVRQual);
8147 S.
Diag(
Loc, diag::err_typecheck_cond_incompatible_operands)
8200 bool IsIntFirstExpr) {
8202 !Int.get()->getType()->isIntegerType())
8205 Expr *Expr1 = IsIntFirstExpr ? Int.get() : PointerExpr;
8206 Expr *Expr2 = IsIntFirstExpr ? PointerExpr : Int.get();
8208 S.
Diag(
Loc, diag::ext_typecheck_cond_pointer_integer_mismatch)
8212 CK_IntegralToPointer);
8246 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_int_float)
8252 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_int_float)
8258 if (LHSType == RHSType)
8267 return handleIntegerConversion<doIntegralCast, doIntegralCast>
8268 (S, LHS, RHS, LHSType, RHSType,
false);
8302 llvm::raw_svector_ostream OS(Str);
8303 OS <<
"(vector of " << NumElements <<
" '" << EleTyName <<
"' values)";
8304 S.
Diag(QuestionLoc, diag::err_conditional_vector_element_size)
8305 << CondTy << OS.str();
8326 S.
Diag(QuestionLoc, diag::err_typecheck_cond_expect_nonfloat)
8344 S.
Diag(QuestionLoc, diag::err_conditional_vector_size)
8345 << CondTy << VecResTy;
8350 QualType RVE = RV->getElementType();
8353 S.
Diag(QuestionLoc, diag::err_conditional_vector_element_size)
8354 << CondTy << VecResTy;
8380 bool IsBoolVecLang =
8409 if (
const CallExpr *CE = dyn_cast<CallExpr>(
E)) {
8410 QualType Ty = CE->getCallee()->getType();
8448 "should only occur in error-recovery path.");
8483 Diag(QuestionLoc, diag::err_wasm_table_conditional_expression)
8492 diag::err_typecheck_cond_incompatible_operands) << LHSTy << RHSTy
8511 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands)
8527 if (LHSRT->getDecl() == RHSRT->getDecl())
8571 if (!compositeType.
isNull())
8572 return compositeType;
8606 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands)
8645 const Expr **RHSExprs) {
8650 if (
const auto *MTE = dyn_cast<MaterializeTemporaryExpr>(
E)) {
8651 E = MTE->getSubExpr();
8656 if (
const auto *OP = dyn_cast<BinaryOperator>(
E);
8658 *Opcode = OP->getOpcode();
8659 *RHSExprs = OP->getRHS();
8664 if (
const auto *
Call = dyn_cast<CXXOperatorCallExpr>(
E)) {
8665 if (
Call->getNumArgs() != 2)
8671 if (OO < OO_Plus || OO > OO_Arrow ||
8672 OO == OO_PlusPlus || OO == OO_MinusMinus)
8678 *RHSExprs =
Call->getArg(1);
8694 if (
const auto *OP = dyn_cast<BinaryOperator>(
E))
8695 return OP->isComparisonOp() || OP->isLogicalOp();
8696 if (
const auto *OP = dyn_cast<UnaryOperator>(
E))
8697 return OP->getOpcode() == UO_LNot;
8712 const Expr *RHSExpr) {
8714 const Expr *CondRHS;
8725 ? diag::warn_precedence_bitwise_conditional
8726 : diag::warn_precedence_conditional;
8728 Self.Diag(OpLoc, DiagID)
8734 Self.PDiag(diag::note_precedence_silence)
8739 Self.PDiag(diag::note_precedence_conditional_first),
8750 auto GetNullability = [](
QualType Ty) {
8751 std::optional<NullabilityKind> Kind = Ty->getNullability();
8761 auto LHSKind = GetNullability(LHSTy), RHSKind = GetNullability(RHSTy);
8769 MergedKind = RHSKind;
8776 MergedKind = RHSKind;
8778 MergedKind = LHSKind;
8784 if (GetNullability(ResTy) == MergedKind)
8818 CondExpr = CondResult.
get();
8819 LHSExpr = LHSResult.
get();
8820 RHSExpr = RHSResult.
get();
8826 Expr *commonExpr =
nullptr;
8828 commonExpr = CondExpr;
8835 commonExpr = result.
get();
8849 commonExpr = commonRes.
get();
8859 commonExpr = MatExpr.
get();
8867 LHSExpr = CondExpr = opaqueValue;
8873 ExprResult Cond = CondExpr, LHS = LHSExpr, RHS = RHSExpr;
8875 VK, OK, QuestionLoc);
8883 CheckBoolLikeConversion(Cond.
get(), QuestionLoc);
8891 RHS.get(), result, VK, OK);
8894 commonExpr, opaqueValue, Cond.
get(), LHS.get(), RHS.get(), QuestionLoc,
8895 ColonLoc, result, VK, OK);
8899 unsigned FromAttributes = 0, ToAttributes = 0;
8900 if (
const auto *FromFn =
8904 if (
const auto *ToFn =
8909 return FromAttributes != ToAttributes;
8917 if (
const auto *ToFn =
8919 if (
const auto *FromFn =
8938 assert(LHSType.
isCanonical() &&
"LHS not canonicalized!");
8939 assert(RHSType.
isCanonical() &&
"RHS not canonicalized!");
8942 const Type *lhptee, *rhptee;
8944 std::tie(lhptee, lhq) =
8945 cast<PointerType>(LHSType)->getPointeeType().split().asPair();
8946 std::tie(rhptee, rhq) =
8947 cast<PointerType>(RHSType)->getPointeeType().split().asPair();
9007 diag::warn_typecheck_convert_incompatible_function_pointer_strict,
9030 if (ltrans == rtrans) {
9044 if (isa<PointerType>(lhptee) && isa<PointerType>(rhptee)) {
9046 std::tie(lhptee, lhq) =
9047 cast<PointerType>(lhptee)->getPointeeType().split().asPair();
9048 std::tie(rhptee, rhq) =
9049 cast<PointerType>(rhptee)->getPointeeType().split().asPair();
9062 }
while (isa<PointerType>(lhptee) && isa<PointerType>(rhptee));
9064 if (lhptee == rhptee)
9090 assert(LHSType.
isCanonical() &&
"LHS not canonicalized!");
9091 assert(RHSType.
isCanonical() &&
"RHS not canonicalized!");
9112 if (LQuals != RQuals)
9141 assert(LHSType.
isCanonical() &&
"LHS was not canonicalized!");
9142 assert(RHSType.
isCanonical() &&
"RHS was not canonicalized!");
9190 return VT->getElementType().getCanonicalType() == ElementType;
9223 if (LHSType == RHSType) {
9230 if (
const auto *AT = dyn_cast<AutoType>(LHSType)) {
9231 if (AT->isGNUAutoType()) {
9239 if (
const AtomicType *AtomicTy = dyn_cast<AtomicType>(LHSType)) {
9244 if (Kind != CK_NoOp && ConvertRHS)
9246 Kind = CK_NonAtomicToAtomic;
9259 Kind = CK_LValueBitCast;
9274 Kind = CK_VectorSplat;
9300 << RHSType << LHSType;
9319 << RHSType << LHSType;
9369 if (
const PointerType *LHSPointer = dyn_cast<PointerType>(LHSType)) {
9371 if (isa<PointerType>(RHSType)) {
9372 LangAS AddrSpaceL = LHSPointer->getPointeeType().getAddressSpace();
9374 if (AddrSpaceL != AddrSpaceR)
9375 Kind = CK_AddressSpaceConversion;
9386 Kind = CK_IntegralToPointer;
9392 if (isa<ObjCObjectPointerType>(RHSType)) {
9394 if (LHSPointer->getPointeeType()->isVoidType()) {
9413 if (LHSPointer->getPointeeType()->isVoidType()) {
9414 LangAS AddrSpaceL = LHSPointer->getPointeeType().getAddressSpace();
9419 AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion : CK_BitCast;
9428 if (isa<BlockPointerType>(LHSType)) {
9437 Kind = AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion : CK_BitCast;
9443 Kind = CK_IntegralToPointer;
9449 Kind = CK_AnyPointerToBlockPointerCast;
9455 if (RHSPT->getPointeeType()->isVoidType()) {
9456 Kind = CK_AnyPointerToBlockPointerCast;
9464 if (isa<ObjCObjectPointerType>(LHSType)) {
9470 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
9472 !
ObjC().CheckObjCARCUnavailableWeakConversion(OrigLHSType, RHSType))
9479 Kind = CK_IntegralToPointer;
9485 if (isa<PointerType>(RHSType)) {
9486 Kind = CK_CPointerToObjCPointerCast;
9508 Kind = CK_BlockPointerToObjCPointerCast;
9520 Kind = CK_NullToPointer;
9525 if (isa<PointerType>(RHSType)) {
9528 Kind = CK_PointerToBoolean;
9534 Kind = CK_PointerToIntegral;
9542 if (isa<ObjCObjectPointerType>(RHSType)) {
9545 Kind = CK_PointerToBoolean;
9551 Kind = CK_PointerToIntegral;
9559 if (isa<TagType>(LHSType) && isa<TagType>(RHSType)) {
9567 Kind = CK_IntToOCLSampler;
9609 for (
auto *it : UD->
fields()) {
9610 if (it->getType()->isPointerType()) {
9649 bool DiagnoseCFAudited,
9653 assert((ConvertRHS || !
Diagnose) &&
"can't indicate whether we diagnosed");
9659 ExprResult &RHS = ConvertRHS ? CallerRHS : LocalRHS;
9663 if (RHSPtrType->getPointeeType()->hasAttr(attr::NoDeref) &&
9664 !LHSPtrType->getPointeeType()->hasAttr(attr::NoDeref)) {
9666 diag::warn_noderef_to_dereferenceable_pointer)
9685 AllowedExplicit::None,
9697 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
9698 !
ObjC().CheckObjCARCUnavailableWeakConversion(LHSType, RHSType))
9712 RHS.
get(), LHSType,
false, DAP))
9803 if (
getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
9813 ObjC().CheckConversionToObjCLiteral(LHSType,
E,
Diagnose))) {
9833struct OriginalOperand {
9834 explicit OriginalOperand(
Expr *Op) : Orig(Op), Conversion(nullptr) {
9835 if (
auto *MTE = dyn_cast<MaterializeTemporaryExpr>(Op))
9836 Op = MTE->getSubExpr();
9837 if (
auto *BTE = dyn_cast<CXXBindTemporaryExpr>(Op))
9838 Op = BTE->getSubExpr();
9839 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(Op)) {
9840 Orig = ICE->getSubExprAsWritten();
9841 Conversion = ICE->getConversionFunction();
9845 QualType getType()
const {
return Orig->getType(); }
9854 OriginalOperand OrigLHS(LHS.
get()), OrigRHS(RHS.
get());
9856 Diag(
Loc, diag::err_typecheck_invalid_operands)
9857 << OrigLHS.getType() << OrigRHS.getType()
9862 if (OrigLHS.Conversion) {
9863 Diag(OrigLHS.Conversion->getLocation(),
9864 diag::note_typecheck_invalid_operands_converted)
9867 if (OrigRHS.Conversion) {
9868 Diag(OrigRHS.Conversion->getLocation(),
9869 diag::note_typecheck_invalid_operands_converted)
9884 if (!(LHSNatVec && RHSNatVec)) {
9886 Expr *NonVector = !LHSNatVec ? LHS.
get() : RHS.
get();
9887 Diag(
Loc, diag::err_typecheck_logical_vector_expr_gnu_cpp_restrict)
9889 <<
Vector->getSourceRange();
9893 Diag(
Loc, diag::err_typecheck_logical_vector_expr_gnu_cpp_restrict)
9922 scalarCast = CK_IntegralToBoolean;
9927 DiagID = diag::err_opencl_scalar_type_rank_greater_than_vector_type;
9932 scalarCast = CK_IntegralCast;
9937 DiagID = diag::err_opencl_scalar_type_rank_greater_than_vector_type;
9940 scalarCast = CK_FloatingCast;
9943 scalarCast = CK_IntegralToFloating;
9952 if (scalarCast != CK_NoOp)
9963 assert(VecTy &&
"Expression E must be a vector");
9968 VecTy->getVectorKind());
9972 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(
E))
9973 if (ICE->getSubExpr()->getType() == NewVecTy)
9974 return ICE->getSubExpr();
9976 auto Cast = ElementType->
isIntegerType() ? CK_IntegralCast : CK_FloatingCast;
9984 if (Int->get()->containsErrors())
9987 QualType IntTy = Int->get()->getType().getUnqualifiedType();
9993 bool CstInt = Int->get()->EvaluateAsInt(EVResult, S.
Context);
10002 unsigned NumBits = IntSigned
10004 :
Result.getActiveBits())
10005 :
Result.getActiveBits();
10012 return (IntSigned != OtherIntSigned &&
10018 return (Order < 0);
10025 if (Int->get()->containsErrors())
10028 QualType IntTy = Int->get()->getType().getUnqualifiedType();
10033 bool CstInt = Int->get()->EvaluateAsInt(EVResult, S.
Context);
10045 llvm::APFloat::rmTowardZero);
10048 bool Ignored =
false;
10049 Float.convertToInteger(ConvertBack, llvm::APFloat::rmNearestTiesToEven,
10051 if (
Result != ConvertBack)
10057 unsigned FloatPrec = llvm::APFloat::semanticsPrecision(
10059 if (Bits > FloatPrec)
10072 QualType ScalarTy = Scalar->get()->getType().getUnqualifiedType();
10073 QualType VectorTy =
Vector->get()->getType().getUnqualifiedType();
10077 assert(!isa<ExtVectorType>(VT) &&
10078 "ExtVectorTypes should not be handled here!");
10079 VectorEltTy = VT->getElementType();
10084 llvm_unreachable(
"Only Fixed-Length and SVE Vector types are handled here");
10110 ScalarCast = CK_IntegralCast;
10114 ScalarCast = CK_FloatingToIntegral;
10122 llvm::APFloat
Result(0.0);
10128 bool CstScalar = Scalar->get()->isValueDependent() ||
10131 if (!CstScalar && Order < 0)
10137 bool Truncated =
false;
10139 llvm::APFloat::rmNearestTiesToEven, &Truncated);
10144 ScalarCast = CK_FloatingCast;
10149 ScalarCast = CK_IntegralToFloating;
10156 if (ScalarCast != CK_NoOp)
10164 bool AllowBothBool,
10165 bool AllowBoolConversions,
10166 bool AllowBoolOperation,
10167 bool ReportInvalid) {
10168 if (!IsCompAssign) {
10184 assert(LHSVecType || RHSVecType);
10192 (RHSVecType && RHSVecType->getElementType()->isMFloat8Type()))
10197 if (!AllowBothBool && LHSVecType &&
10203 if (!AllowBoolOperation &&
10212 if (LHSVecType && RHSVecType &&
10214 if (isa<ExtVectorType>(LHSVecType)) {
10227 if (AllowBoolConversions && LHSVecType && RHSVecType &&
10237 if (!IsCompAssign &&
10240 RHSVecType->getElementType()->isIntegerType()) {
10249 unsigned &SVEorRVV) {
10270 if (IsSveRVVConversion(LHSType, RHSType, SVEorRVV) ||
10271 IsSveRVVConversion(RHSType, LHSType, SVEorRVV)) {
10272 Diag(
Loc, diag::err_typecheck_sve_rvv_ambiguous)
10273 << SVEorRVV << LHSType << RHSType;
10280 unsigned &SVEorRVV) {
10285 if (FirstVecType && SecondVecType) {
10288 SecondVecType->getVectorKind() ==
10293 SecondVecType->getVectorKind() ==
10295 SecondVecType->getVectorKind() ==
10297 SecondVecType->getVectorKind() ==
10306 if (SecondVecType &&
10319 if (IsSveRVVGnuConversion(LHSType, RHSType, SVEorRVV) ||
10320 IsSveRVVGnuConversion(RHSType, LHSType, SVEorRVV)) {
10321 Diag(
Loc, diag::err_typecheck_sve_rvv_gnu_ambiguous)
10322 << SVEorRVV << LHSType << RHSType;
10328 unsigned DiagID = diag::err_typecheck_vector_not_convertable;
10330 if (isa<ExtVectorType>(LHSVecType)) {
10341 if (isa<ExtVectorType>(RHSVecType)) {
10343 LHSType, RHSVecType->getElementType(),
10356 QualType VecType = LHSVecType ? LHSType : RHSType;
10357 const VectorType *VT = LHSVecType ? LHSVecType : RHSVecType;
10358 QualType OtherType = LHSVecType ? RHSType : LHSType;
10359 ExprResult *OtherExpr = LHSVecType ? &RHS : &LHS;
10364 Diag(
Loc, diag::warn_deprecated_lax_vec_conv_all) << RHSType << LHSType;
10368 if (!IsCompAssign) {
10387 if ((!RHSVecType && !RHSType->
isRealType()) ||
10389 Diag(
Loc, diag::err_typecheck_vector_not_convertable_non_scalar)
10390 << LHSType << RHSType
10400 RHSVecType && isa<ExtVectorType>(RHSVecType) &&
10401 LHSVecType && isa<ExtVectorType>(LHSVecType)) {
10402 Diag(
Loc, diag::err_opencl_implicit_vector_conversion) << LHSType
10411 if ((RHSVecType && !isa<ExtVectorType>(RHSVecType)) ||
10412 (LHSVecType && !isa<ExtVectorType>(LHSVecType))) {
10413 QualType Scalar = LHSVecType ? RHSType : LHSType;
10415 unsigned ScalarOrVector = LHSVecType && RHSVecType ? 1 : 0;
10417 diag::err_typecheck_vector_not_convertable_implict_truncation)
10418 << ScalarOrVector << Scalar <<
Vector;
10425 << LHSType << RHSType
10434 if (!IsCompAssign) {
10449 unsigned DiagID = diag::err_typecheck_invalid_operands;
10451 ((LHSBuiltinTy && LHSBuiltinTy->
isSVEBool()) ||
10452 (RHSBuiltinTy && RHSBuiltinTy->isSVEBool()))) {
10473 Diag(
Loc, diag::err_typecheck_vector_not_convertable_non_scalar)
10482 Diag(
Loc, diag::err_typecheck_vector_lengths_not_equal)
10491 bool ScalarOrVector =
10494 Diag(
Loc, diag::err_typecheck_vector_not_convertable_implict_truncation)
10495 << ScalarOrVector << Scalar <<
Vector;
10527 S.
Diag(
Loc, diag::warn_null_in_arithmetic_operation)
10539 S.
Diag(
Loc, diag::warn_null_in_comparison_operation)
10540 << LHSNull << NonNullType
10546 const auto *LUE = dyn_cast<UnaryExprOrTypeTraitExpr>(LHS);
10547 const auto *RUE = dyn_cast<UnaryExprOrTypeTraitExpr>(RHS);
10550 if (LUE->getKind() != UETT_SizeOf || LUE->isArgumentType() ||
10551 RUE->getKind() != UETT_SizeOf)
10558 if (RUE->isArgumentType())
10559 RHSTy = RUE->getArgumentType().getNonReferenceType();
10561 RHSTy = RUE->getArgumentExpr()->IgnoreParens()->getType();
10568 if (
const auto *DRE = dyn_cast<DeclRefExpr>(LHSArg)) {
10569 if (
const ValueDecl *LHSArgDecl = DRE->getDecl())
10570 S.
Diag(LHSArgDecl->getLocation(), diag::note_pointer_declared_here)
10574 QualType ArrayElemTy = ArrayTy->getElementType();
10580 S.
Diag(
Loc, diag::warn_division_sizeof_array)
10582 if (
const auto *DRE = dyn_cast<DeclRefExpr>(LHSArg)) {
10583 if (
const ValueDecl *LHSArgDecl = DRE->getDecl())
10584 S.
Diag(LHSArgDecl->getLocation(), diag::note_array_declared_here)
10588 S.
Diag(
Loc, diag::note_precedence_silence) << RHS;
10601 S.
PDiag(diag::warn_remainder_division_by_zero)
10607 bool IsCompAssign,
bool IsDiv) {
10685 ? diag::err_typecheck_pointer_arith_void_type
10686 : diag::ext_gnu_void_ptr)
10695 ? diag::err_typecheck_pointer_arith_void_type
10696 : diag::ext_gnu_void_ptr)
10697 << 0 <<
Pointer->getSourceRange();
10708 S.
Diag(
Loc, diag::warn_gnu_null_ptr_arith)
10709 <<
Pointer->getSourceRange();
10711 S.
Diag(
Loc, diag::warn_pointer_arith_null_ptr)
10728 S.
PDiag(diag::warn_pointer_sub_null_ptr)
10730 <<
Pointer->getSourceRange());
10739 ? diag::err_typecheck_pointer_arith_function_type
10740 : diag::ext_gnu_ptr_func_arith)
10752 assert(
Pointer->getType()->isAnyPointerType());
10754 ? diag::err_typecheck_pointer_arith_function_type
10755 : diag::ext_gnu_ptr_func_arith)
10756 << 0 <<
Pointer->getType()->getPointeeType()
10758 <<
Pointer->getSourceRange();
10766 QualType ResType = Operand->getType();
10768 ResType = ResAtomicType->getValueType();
10774 diag::err_typecheck_arithmetic_incomplete_or_sizeless_type,
10775 Operand->getSourceRange());
10788 QualType ResType = Operand->getType();
10790 ResType = ResAtomicType->getValueType();
10822 if (!isLHSPointer && !isRHSPointer)
return true;
10824 QualType LHSPointeeTy, RHSPointeeTy;
10829 if (isLHSPointer && isRHSPointer) {
10833 diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
10841 bool isLHSVoidPtr = isLHSPointer && LHSPointeeTy->
isVoidType();
10842 bool isRHSVoidPtr = isRHSPointer && RHSPointeeTy->
isVoidType();
10843 if (isLHSVoidPtr || isRHSVoidPtr) {
10851 bool isLHSFuncPtr = isLHSPointer && LHSPointeeTy->
isFunctionType();
10852 bool isRHSFuncPtr = isRHSPointer && RHSPointeeTy->
isFunctionType();
10853 if (isLHSFuncPtr || isRHSFuncPtr) {
10875 Expr* IndexExpr = RHSExpr;
10878 IndexExpr = LHSExpr;
10881 bool IsStringPlusInt = StrExpr &&
10887 Self.Diag(OpLoc, diag::warn_string_plus_int)
10891 if (IndexExpr == RHSExpr) {
10893 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence)
10898 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence);
10904 const Expr *StringRefExpr = LHSExpr;
10909 CharExpr = dyn_cast<CharacterLiteral>(LHSExpr->
IgnoreImpCasts());
10910 StringRefExpr = RHSExpr;
10913 if (!CharExpr || !StringRefExpr)
10933 Self.Diag(OpLoc, diag::warn_string_plus_char)
10934 << DiagRange << Ctx.
CharTy;
10936 Self.Diag(OpLoc, diag::warn_string_plus_char)
10937 << DiagRange << CharExpr->
getType();
10943 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence)
10948 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence);
10957 S.
Diag(
Loc, diag::err_typecheck_sub_ptr_compatible)
10976 if (CompLHSTy) *CompLHSTy = compType;
10985 *CompLHSTy = compType;
10994 *CompLHSTy = compType;
11004 if (Opc == BO_Add) {
11011 if (CompLHSTy) *CompLHSTy = compType;
11025 std::swap(PExp, IExp);
11036 if (!IExp->getType()->isIntegerType())
11045 (!IExp->isValueDependent() &&
11046 (!IExp->EvaluateAsInt(KnownVal,
Context) ||
11050 Context, BO_Add, PExp, IExp);
11063 if (isa<AddrLabelExpr>(PExp) &&
getLangOpts().PointerAuthIndirectGotos) {
11064 Diag(
Loc, diag::err_ptrauth_indirect_goto_addrlabel_arithmetic)
11070 CheckArrayAccess(PExp, IExp);
11079 *CompLHSTy = LHSTy;
11099 if (CompLHSTy) *CompLHSTy = compType;
11108 *CompLHSTy = compType;
11117 *CompLHSTy = compType;
11130 if (CompLHSTy) *CompLHSTy = compType;
11145 if (isa<AddrLabelExpr>(LHS.
get()) &&
11147 Diag(
Loc, diag::err_ptrauth_indirect_goto_addrlabel_arithmetic)
11173 CheckArrayAccess(LHS.
get(), RHS.
get(),
nullptr,
11176 if (CompLHSTy) *CompLHSTy = LHS.
get()->
getType();
11220 if (ElementSize.
isZero()) {
11221 Diag(
Loc,diag::warn_sub_ptr_zero_size_types)
11227 if (CompLHSTy) *CompLHSTy = LHS.
get()->
getType();
11237 return ET->getDecl()->isScoped();
11254 llvm::APSInt Right = RHSResult.
Val.
getInt();
11256 if (Right.isNegative()) {
11258 S.
PDiag(diag::warn_shift_negative)
11269 LeftSize = FXSema.getWidth() - (
unsigned)FXSema.hasUnsignedPadding();
11271 if (Right.uge(LeftSize)) {
11273 S.
PDiag(diag::warn_shift_gt_typewidth)
11293 llvm::APSInt Left = LHSResult.
Val.
getInt();
11304 if (Left.isNegative()) {
11306 S.
PDiag(diag::warn_shift_lhs_negative)
11311 llvm::APInt ResultBits =
11312 static_cast<llvm::APInt &
>(Right) + Left.getSignificantBits();
11313 if (ResultBits.ule(LeftSize))
11315 llvm::APSInt
Result = Left.extend(ResultBits.getLimitedValue());
11321 Result.toString(HexResult, 16,
false,
true);
11327 if (ResultBits - 1 == LeftSize) {
11328 S.
Diag(
Loc, diag::warn_shift_result_sets_sign_bit)
11329 << HexResult << LHSType
11334 S.
Diag(
Loc, diag::warn_shift_result_gt_typewidth)
11335 << HexResult.str() <<
Result.getSignificantBits() << LHSType
11347 S.
Diag(
Loc, diag::err_shift_rhs_only_vector)
11353 if (!IsCompAssign) {
11375 S.
Diag(
Loc, diag::err_typecheck_invalid_operands)
11382 if (!LHSEleType->isIntegerType()) {
11383 S.
Diag(
Loc, diag::err_typecheck_expect_int)
11388 if (!RHSEleType->isIntegerType()) {
11389 S.
Diag(
Loc, diag::err_typecheck_expect_int)
11398 if (LHSEleType != RHSEleType) {
11400 LHSEleType = RHSEleType;
11406 }
else if (RHSVecTy) {
11411 S.
Diag(
Loc, diag::err_typecheck_vector_lengths_not_equal)
11419 if (LHSBT != RHSBT &&
11421 S.
Diag(
Loc, diag::warn_typecheck_vector_element_sizes_not_equal)
11438 bool IsCompAssign) {
11439 if (!IsCompAssign) {
11462 if ((LHSBuiltinTy && LHSBuiltinTy->
isSVEBool()) ||
11463 (RHSBuiltinTy && RHSBuiltinTy->
isSVEBool())) {
11464 S.
Diag(
Loc, diag::err_typecheck_invalid_operands)
11469 if (!LHSEleType->isIntegerType()) {
11470 S.
Diag(
Loc, diag::err_typecheck_expect_int)
11475 if (!RHSEleType->isIntegerType()) {
11476 S.
Diag(
Loc, diag::err_typecheck_expect_int)
11484 S.
Diag(
Loc, diag::err_typecheck_invalid_operands)
11494 if (LHSEleType != RHSEleType) {
11496 LHSEleType = RHSEleType;
11498 const llvm::ElementCount VecSize =
11507 S.
Diag(
Loc, diag::err_typecheck_vector_lengths_not_equal)
11513 const llvm::ElementCount VecSize =
11515 if (LHSEleType != RHSEleType) {
11517 RHSEleType = LHSEleType;
11530 bool IsCompAssign) {
11564 if (IsCompAssign) LHS = OldLHS;
11595 S.
Diag(
Loc, IsError ? diag::err_typecheck_comparison_of_distinct_pointers
11596 : diag::ext_typecheck_comparison_of_distinct_pointers)
11636 S.
Diag(
Loc, IsError ? diag::err_typecheck_comparison_of_fptr_to_void
11637 : diag::ext_typecheck_comparison_of_fptr_to_void)
11644 case Stmt::ObjCArrayLiteralClass:
11645 case Stmt::ObjCDictionaryLiteralClass:
11646 case Stmt::ObjCStringLiteralClass:
11647 case Stmt::ObjCBoxedExprClass:
11708 Literal = LHS.
get();
11711 Literal = RHS.
get();
11727 llvm_unreachable(
"Unknown Objective-C object literal kind");
11731 S.
Diag(
Loc, diag::warn_objc_string_literal_comparison)
11732 << Literal->getSourceRange();
11734 S.
Diag(
Loc, diag::warn_objc_literal_comparison)
11735 << LiteralKind << Literal->getSourceRange();
11744 S.
Diag(
Loc, diag::note_objc_literal_comparison_isequal)
11757 if (!UO || UO->
getOpcode() != UO_LNot)
return;
11767 bool IsBitwiseOp = Opc == BO_And || Opc == BO_Or || Opc == BO_Xor;
11769 <<
Loc << IsBitwiseOp;
11796 if (
const DeclRefExpr *DR = dyn_cast<DeclRefExpr>(
E)) {
11798 }
else if (
const MemberExpr *Mem = dyn_cast<MemberExpr>(
E)) {
11799 if (Mem->isImplicitAccess())
11800 D = Mem->getMemberDecl();
11804 return D->getType()->isArrayType() && !
D->isWeak();
11815 return std::nullopt;
11823 std::swap(LHS, RHS);
11827 std::swap(LHS, RHS);
11831 return std::nullopt;
11834 auto *BO = dyn_cast<BinaryOperator>(LHS);
11835 if (!BO || BO->getOpcode() != BO_Add)
11836 return std::nullopt;
11840 Other = BO->getRHS();
11842 Other = BO->getLHS();
11844 return std::nullopt;
11846 if (!
Other->getType()->isUnsignedIntegerType())
11847 return std::nullopt;
11849 return Opc == BO_GE;
11903 auto IsDeprArrayComparionIgnored =
11906 ? diag::warn_array_comparison_cxx26
11907 : !S.
getLangOpts().CPlusPlus20 || IsDeprArrayComparionIgnored
11908 ? diag::warn_array_comparison
11909 : diag::warn_depr_array_comparison;
11935 Result = AlwaysConstant;
11939 S.
PDiag(diag::warn_comparison_always)
11954 Result = AlwaysConstant;
11958 S.
PDiag(diag::warn_comparison_always)
11961 }
else if (std::optional<bool> Res =
11964 S.
PDiag(diag::warn_comparison_always)
11966 << (*Res ? AlwaysTrue : AlwaysFalse));
11970 if (isa<CastExpr>(LHSStripped))
11972 if (isa<CastExpr>(RHSStripped))
11977 Expr *LiteralString =
nullptr;
11978 Expr *LiteralStringStripped =
nullptr;
11979 if ((isa<StringLiteral>(LHSStripped) || isa<ObjCEncodeExpr>(LHSStripped)) &&
11982 LiteralString = LHS;
11983 LiteralStringStripped = LHSStripped;
11984 }
else if ((isa<StringLiteral>(RHSStripped) ||
11985 isa<ObjCEncodeExpr>(RHSStripped)) &&
11988 LiteralString = RHS;
11989 LiteralStringStripped = RHSStripped;
11992 if (LiteralString) {
11994 S.
PDiag(diag::warn_stringcompare)
11995 << isa<ObjCEncodeExpr>(LiteralStringStripped)
12007 llvm_unreachable(
"unhandled cast kind");
12009 case CK_UserDefinedConversion:
12011 case CK_LValueToRValue:
12013 case CK_ArrayToPointerDecay:
12015 case CK_FunctionToPointerDecay:
12017 case CK_IntegralCast:
12019 case CK_FloatingCast:
12021 case CK_IntegralToFloating:
12022 case CK_FloatingToIntegral:
12024 case CK_IntegralComplexCast:
12025 case CK_FloatingComplexCast:
12026 case CK_FloatingComplexToIntegralComplex:
12027 case CK_IntegralComplexToFloatingComplex:
12029 case CK_FloatingComplexToReal:
12030 case CK_FloatingRealToComplex:
12031 case CK_IntegralComplexToReal:
12032 case CK_IntegralRealToComplex:
12034 case CK_HLSLArrayRValue:
12047 if (
const auto *ICE = dyn_cast<ImplicitCastExpr>(
E))
12074 << 0 << FromType << ToType;
12079 llvm_unreachable(
"unhandled case in switch");
12106 if (NumEnumArgs == 1) {
12108 QualType OtherTy = LHSIsEnum ? RHSStrippedType : LHSStrippedType;
12114 if (NumEnumArgs == 2) {
12123 LHSStrippedType->
castAs<
EnumType>()->getDecl()->getIntegerType();
12134 LHSType = RHSType = IntType;
12146 std::optional<ComparisonCategoryType> CCT =
12158 assert(!
Type.isNull() &&
"composite type for <=> has not been set");
12199 if (
const auto *CL = dyn_cast<CharacterLiteral>(
E.get())) {
12200 if (CL->getValue() == 0)
12204 NullValue ?
"NULL" :
"(void *)0");
12205 }
else if (
const auto *CE = dyn_cast<CStyleCastExpr>(
E.get())) {
12212 NullValue ?
"NULL" :
"(void *)0");
12222 bool IsThreeWay = Opc == BO_Cmp;
12223 bool IsOrdered = IsRelational || IsThreeWay;
12234 if (!IsThreeWay || IsAnyPointerType(LHS) || IsAnyPointerType(RHS)) {
12287 auto computeResultTy = [&]() {
12296 std::optional<ComparisonCategoryType> CCT =
12301 if (CompositeTy->
isPointerType() && LHSIsNull != RHSIsNull) {
12305 Diag(
Loc, diag::err_typecheck_three_way_comparison_of_pointer_and_zero)
12315 if (!IsOrdered && LHSIsNull != RHSIsNull) {
12316 bool IsEquality = Opc == BO_EQ;
12328 bool IsError = Opc == BO_Cmp;
12330 IsError ? diag::err_typecheck_ordered_comparison_of_function_pointers
12332 ? diag::warn_typecheck_ordered_comparison_of_function_pointers
12333 : diag::ext_typecheck_ordered_comparison_of_function_pointers;
12362 return computeResultTy();
12378 (IsOrdered ? 2 : 1) &&
12383 return computeResultTy();
12397 if (IsRelational) {
12402 Diag(
Loc, diag::ext_typecheck_compare_complete_incomplete_pointers)
12408 }
else if (!IsRelational &&
12412 && !LHSIsNull && !RHSIsNull)
12419 if (LCanPointeeTy != RCanPointeeTy) {
12425 diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
12426 << LHSType << RHSType << 0
12432 CastKind Kind = AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion
12434 if (LHSIsNull && !RHSIsNull)
12439 return computeResultTy();
12451 if (!IsOrdered && LHSIsNull && RHSIsNull) {
12454 return computeResultTy();
12458 return computeResultTy();
12469 return computeResultTy();
12473 return computeResultTy();
12482 return computeResultTy();
12487 return computeResultTy();
12491 if (IsRelational &&
12500 if (isa<FunctionDecl>(DC))
12502 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
12503 if (CTSD->isInStdNamespace() &&
12504 llvm::StringSwitch<bool>(CTSD->getName())
12505 .Cases(
"less",
"less_equal",
"greater",
"greater_equal",
true)
12511 return computeResultTy();
12524 return computeResultTy();
12534 if (!LHSIsNull && !RHSIsNull &&
12536 Diag(
Loc, diag::err_typecheck_comparison_of_distinct_blocks)
12541 return computeResultTy();
12548 if (!LHSIsNull && !RHSIsNull) {
12553 Diag(
Loc, diag::err_typecheck_comparison_of_distinct_blocks)
12557 if (LHSIsNull && !RHSIsNull)
12560 : CK_AnyPointerToBlockPointerCast);
12564 : CK_AnyPointerToBlockPointerCast);
12565 return computeResultTy();
12574 bool RPtrToVoid = RPT ? RPT->getPointeeType()->isVoidType() :
false;
12576 if (!LPtrToVoid && !RPtrToVoid &&
12584 if (LHSIsNull && !RHSIsNull) {
12590 RPT ? CK_BitCast :CK_CPointerToObjCPointerCast);
12600 LPT ? CK_BitCast :CK_CPointerToObjCPointerCast);
12602 return computeResultTy();
12612 if (LHSIsNull && !RHSIsNull)
12616 return computeResultTy();
12622 CK_BlockPointerToObjCPointerCast);
12623 return computeResultTy();
12624 }
else if (!IsOrdered &&
12628 CK_BlockPointerToObjCPointerCast);
12629 return computeResultTy();
12634 unsigned DiagID = 0;
12635 bool isError =
false;
12644 isError ? diag::err_typecheck_ordered_comparison_of_pointer_and_zero
12645 : diag::ext_typecheck_ordered_comparison_of_pointer_and_zero;
12648 DiagID = diag::err_typecheck_comparison_of_pointer_integer;
12650 }
else if (IsOrdered)
12651 DiagID = diag::ext_typecheck_ordered_comparison_of_pointer_integer;
12653 DiagID = diag::ext_typecheck_comparison_of_pointer_integer;
12665 LHSIsNull ? CK_NullToPointer : CK_IntegralToPointer);
12668 RHSIsNull ? CK_NullToPointer : CK_IntegralToPointer);
12669 return computeResultTy();
12673 if (!IsOrdered && RHSIsNull
12676 return computeResultTy();
12678 if (!IsOrdered && LHSIsNull
12681 return computeResultTy();
12684 if (
getLangOpts().getOpenCLCompatibleVersion() >= 200) {
12686 return computeResultTy();
12690 return computeResultTy();
12693 if (LHSIsNull && RHSType->
isQueueT()) {
12695 return computeResultTy();
12698 if (LHSType->
isQueueT() && RHSIsNull) {
12700 return computeResultTy();
12711 if (isa<ExtVectorType>(VTy)) {
12725 "Unhandled vector element size in vector compare");
12745 "Unhandled vector element size in vector compare");
12765 if (Opc == BO_Cmp) {
12766 Diag(
Loc, diag::err_three_way_vector_comparison);
12797 Diag(
Loc, diag::warn_deprecated_altivec_src_compat);
12827 if (Opc == BO_Cmp) {
12828 Diag(
Loc, diag::err_three_way_vector_comparison);
12856 if (LHSBuiltinTy && RHSBuiltinTy && LHSBuiltinTy->
isSVEBool() &&
12857 RHSBuiltinTy->isSVEBool())
12876 bool Negative =
false;
12877 bool ExplicitPlus =
false;
12878 const auto *LHSInt = dyn_cast<IntegerLiteral>(XorLHS.
get());
12879 const auto *RHSInt = dyn_cast<IntegerLiteral>(XorRHS.
get());
12885 if (
const auto *UO = dyn_cast<UnaryOperator>(XorRHS.
get())) {
12887 if (Opc != UO_Minus && Opc != UO_Plus)
12889 RHSInt = dyn_cast<IntegerLiteral>(UO->getSubExpr());
12892 Negative = (Opc == UO_Minus);
12893 ExplicitPlus = !Negative;
12899 const llvm::APInt &LeftSideValue = LHSInt->getValue();
12900 llvm::APInt RightSideValue = RHSInt->getValue();
12901 if (LeftSideValue != 2 && LeftSideValue != 10)
12904 if (LeftSideValue.getBitWidth() != RightSideValue.getBitWidth())
12909 llvm::StringRef ExprStr =
12914 llvm::StringRef XorStr =
12917 if (XorStr ==
"xor")
12928 RightSideValue = -RightSideValue;
12929 RHSStr =
"-" + RHSStr;
12930 }
else if (ExplicitPlus) {
12931 RHSStr =
"+" + RHSStr;
12934 StringRef LHSStrRef = LHSStr;
12935 StringRef RHSStrRef = RHSStr;
12938 if (LHSStrRef.starts_with(
"0b") || LHSStrRef.starts_with(
"0B") ||
12939 RHSStrRef.starts_with(
"0b") || RHSStrRef.starts_with(
"0B") ||
12940 LHSStrRef.starts_with(
"0x") || LHSStrRef.starts_with(
"0X") ||
12941 RHSStrRef.starts_with(
"0x") || RHSStrRef.starts_with(
"0X") ||
12942 (LHSStrRef.size() > 1 && LHSStrRef.starts_with(
"0")) ||
12943 (RHSStrRef.size() > 1 && RHSStrRef.starts_with(
"0")) ||
12944 LHSStrRef.contains(
'\'') || RHSStrRef.contains(
'\''))
12949 const llvm::APInt XorValue = LeftSideValue ^ RightSideValue;
12950 int64_t RightSideIntValue = RightSideValue.getSExtValue();
12951 if (LeftSideValue == 2 && RightSideIntValue >= 0) {
12952 std::string SuggestedExpr =
"1 << " + RHSStr;
12953 bool Overflow =
false;
12954 llvm::APInt One = (LeftSideValue - 1);
12955 llvm::APInt PowValue = One.sshl_ov(RightSideValue, Overflow);
12957 if (RightSideIntValue < 64)
12958 S.
Diag(
Loc, diag::warn_xor_used_as_pow_base)
12959 << ExprStr <<
toString(XorValue, 10,
true) << (
"1LL << " + RHSStr)
12961 else if (RightSideIntValue == 64)
12962 S.
Diag(
Loc, diag::warn_xor_used_as_pow)
12963 << ExprStr <<
toString(XorValue, 10,
true);
12967 S.
Diag(
Loc, diag::warn_xor_used_as_pow_base_extra)
12968 << ExprStr <<
toString(XorValue, 10,
true) << SuggestedExpr
12971 ExprRange, (RightSideIntValue == 0) ?
"1" : SuggestedExpr);
12974 S.
Diag(
Loc, diag::note_xor_used_as_pow_silence)
12975 << (
"0x2 ^ " + RHSStr) << SuggestXor;
12976 }
else if (LeftSideValue == 10) {
12977 std::string SuggestedValue =
"1e" + std::to_string(RightSideIntValue);
12978 S.
Diag(
Loc, diag::warn_xor_used_as_pow_base)
12979 << ExprStr <<
toString(XorValue, 10,
true) << SuggestedValue
12981 S.
Diag(
Loc, diag::note_xor_used_as_pow_silence)
12982 << (
"0xA ^ " + RHSStr) << SuggestXor;
12999 getLangOpts().getOpenCLCompatibleVersion() < 120 &&
13023 bool IsCompAssign) {
13024 if (!IsCompAssign) {
13040 assert((LHSMatType || RHSMatType) &&
"At least one operand must be a matrix");
13049 if (LHSMatType && !RHSMatType) {
13057 if (!LHSMatType && RHSMatType) {
13069 bool IsCompAssign) {
13070 if (!IsCompAssign) {
13081 assert((LHSMatType || RHSMatType) &&
"At least one operand must be a matrix");
13083 if (LHSMatType && RHSMatType) {
13084 if (LHSMatType->getNumColumns() != RHSMatType->
getNumRows())
13092 QualType LHSELTy = LHSMatType->getElementType(),
13123 bool IsCompAssign =
13124 Opc == BO_AndAssign || Opc == BO_OrAssign || Opc == BO_XorAssign;
13135 LegalBoolVecOperator,
13165 ExprResult LHSResult = LHS, RHSResult = RHS;
13168 if (LHSResult.
isInvalid() || RHSResult.isInvalid())
13170 LHS = LHSResult.
get();
13171 RHS = RHSResult.
get();
13190 bool EnumConstantInBoolContext =
false;
13192 if (
const auto *DREHS = dyn_cast<DeclRefExpr>(HS.get())) {
13193 const auto *ECDHS = dyn_cast<EnumConstantDecl>(DREHS->getDecl());
13194 if (ECDHS && ECDHS->getInitVal() != 0 && ECDHS->getInitVal() != 1)
13195 EnumConstantInBoolContext =
true;
13199 if (EnumConstantInBoolContext)
13200 Diag(
Loc, diag::warn_enum_constant_in_bool_context);
13205 const auto *LHSATy = dyn_cast<ArrayType>(LHSTy);
13206 const auto *RHSATy = dyn_cast<ArrayType>(RHSTy);
13207 if ((LHSATy && LHSATy->getElementType().isWebAssemblyReferenceType()) ||
13208 (RHSATy && RHSATy->getElementType().isWebAssemblyReferenceType())) {
13230 Diag(
Loc, diag::warn_logical_instead_of_bitwise)
13233 Diag(
Loc, diag::note_logical_instead_of_bitwise_change_operator)
13234 << (Opc == BO_LAnd ?
"&" :
"|")
13237 Opc == BO_LAnd ?
"&" :
"|");
13238 if (Opc == BO_LAnd)
13240 Diag(
Loc, diag::note_logical_instead_of_bitwise_remove_constant)
13297 if (!ME)
return false;
13301 if (!
Base)
return false;
13302 return Base->getMethodDecl() !=
nullptr;
13326 assert(S.
getLangOpts().CPlusPlus &&
"BindingDecl outside of C++?");
13335 assert(Var->
hasLocalStorage() &&
"capture added 'const' to non-local?");
13343 if (
auto *FD = dyn_cast<FunctionDecl>(DC))
13386 bool DiagnosticEmitted =
false;
13390 bool IsDereference =
false;
13391 bool NextIsDereference =
false;
13395 IsDereference = NextIsDereference;
13398 if (
const MemberExpr *ME = dyn_cast<MemberExpr>(
E)) {
13399 NextIsDereference = ME->isArrow();
13400 const ValueDecl *VD = ME->getMemberDecl();
13401 if (
const FieldDecl *Field = dyn_cast<FieldDecl>(VD)) {
13403 if (Field->isMutable()) {
13404 assert(DiagnosticEmitted &&
"Expected diagnostic not emitted.");
13409 if (!DiagnosticEmitted) {
13410 S.
Diag(
Loc, diag::err_typecheck_assign_const)
13412 << Field->getType();
13413 DiagnosticEmitted =
true;
13416 <<
ConstMember <<
false << Field << Field->getType()
13417 << Field->getSourceRange();
13421 }
else if (
const VarDecl *VDecl = dyn_cast<VarDecl>(VD)) {
13422 if (VDecl->getType().isConstQualified()) {
13423 if (!DiagnosticEmitted) {
13424 S.
Diag(
Loc, diag::err_typecheck_assign_const)
13426 << VDecl->getType();
13427 DiagnosticEmitted =
true;
13430 <<
ConstMember <<
true << VDecl << VDecl->getType()
13431 << VDecl->getSourceRange();
13438 dyn_cast<ArraySubscriptExpr>(
E)) {
13442 dyn_cast<ExtVectorElementExpr>(
E)) {
13449 if (
const CallExpr *CE = dyn_cast<CallExpr>(
E)) {
13453 if (!DiagnosticEmitted) {
13454 S.
Diag(
Loc, diag::err_typecheck_assign_const) << ExprRange
13456 DiagnosticEmitted =
true;
13459 diag::note_typecheck_assign_const)
13463 }
else if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(
E)) {
13465 if (
const ValueDecl *VD = DRE->getDecl()) {
13467 if (!DiagnosticEmitted) {
13468 S.
Diag(
Loc, diag::err_typecheck_assign_const)
13470 DiagnosticEmitted =
true;
13472 S.
Diag(VD->getLocation(), diag::note_typecheck_assign_const)
13473 <<
ConstVariable << VD << VD->getType() << VD->getSourceRange();
13476 }
else if (isa<CXXThisExpr>(
E)) {
13478 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(DC)) {
13479 if (MD->isConst()) {
13480 if (!DiagnosticEmitted) {
13481 S.
Diag(
Loc, diag::err_typecheck_assign_const) << ExprRange
13483 DiagnosticEmitted =
true;
13485 S.
Diag(MD->getLocation(), diag::note_typecheck_assign_const)
13492 if (DiagnosticEmitted)
13509 bool &DiagnosticEmitted) {
13510 std::vector<const RecordType *> RecordTypeList;
13511 RecordTypeList.push_back(Ty);
13512 unsigned NextToCheckIndex = 0;
13515 while (RecordTypeList.size() > NextToCheckIndex) {
13516 bool IsNested = NextToCheckIndex > 0;
13518 RecordTypeList[NextToCheckIndex]->getDecl()->fields()) {
13520 QualType FieldTy = Field->getType();
13522 if (!DiagnosticEmitted) {
13523 S.
Diag(
Loc, diag::err_typecheck_assign_const)
13525 << IsNested << Field;
13526 DiagnosticEmitted =
true;
13528 S.
Diag(Field->getLocation(), diag::note_typecheck_assign_const)
13530 << FieldTy << Field->getSourceRange();
13536 if (!llvm::is_contained(RecordTypeList, FieldRecTy))
13537 RecordTypeList.push_back(FieldRecTy);
13540 ++NextToCheckIndex;
13549 assert(Ty->
isRecordType() &&
"lvalue was not record?");
13552 bool DiagEmitted =
false;
13554 if (
const MemberExpr *ME = dyn_cast<MemberExpr>(
E))
13557 else if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(
E))
13582 unsigned DiagID = 0;
13583 bool NeedType =
false;
13590 DiagID = diag::err_block_decl_ref_not_modifiable_lvalue;
13592 DiagID = diag::err_lambda_decl_ref_not_modifiable_lvalue;
13600 if (declRef && isa<VarDecl>(declRef->
getDecl())) {
13605 if (var->isARCPseudoStrong() &&
13606 (!var->getTypeSourceInfo() ||
13607 !var->getTypeSourceInfo()->getType().isConstQualified())) {
13613 ? diag::err_typecheck_arc_assign_self_class_method
13614 : diag::err_typecheck_arc_assign_self;
13617 }
else if (var->hasAttr<ObjCExternallyRetainedAttr>() ||
13618 isa<ParmVarDecl>(var)) {
13619 DiagID = diag::err_typecheck_arc_assign_externally_retained;
13623 DiagID = diag::err_typecheck_arr_assign_enumeration;
13627 if (
Loc != OrigLoc)
13653 DiagID = diag::err_typecheck_array_not_modifiable_lvalue;
13657 DiagID = diag::err_typecheck_non_object_not_modifiable_lvalue;
13661 DiagID = diag::err_typecheck_lvalue_casts_not_supported;
13664 llvm_unreachable(
"did not take early return for MLV_Valid");
13668 DiagID = diag::err_typecheck_expression_not_modifiable_lvalue;
13673 diag::err_typecheck_incomplete_type_not_modifiable_lvalue,
E);
13675 DiagID = diag::err_typecheck_duplicate_vector_components_not_mlvalue;
13678 llvm_unreachable(
"readonly properties should be processed differently");
13680 DiagID = diag::err_readonly_message_assignment;
13683 DiagID = diag::err_no_subobject_property_setting;
13688 if (
Loc != OrigLoc)
13710 MemberExpr *ML = dyn_cast<MemberExpr>(LHSExpr);
13711 MemberExpr *MR = dyn_cast<MemberExpr>(RHSExpr);
13713 if (!(isa<CXXThisExpr>(ML->
getBase()) && isa<CXXThisExpr>(MR->
getBase())))
13719 if (LHSDecl != RHSDecl)
13724 if (RefTy->getPointeeType().isVolatileQualified())
13727 Sema.
Diag(
Loc, diag::warn_identity_field_assign) << 0;
13737 Sema.
Diag(
Loc, diag::warn_identity_field_assign) << 1;
13761 Diag(
Loc, diag::err_opencl_half_load_store) << 1
13768 Diag(
Loc, diag::err_wasm_table_art) << 0;
13773 if (CompoundType.
isNull()) {
13792 Diag(
Loc, diag::err_objc_object_assignment)
13799 RHSCheck = ICE->getSubExpr();
13800 if (
UnaryOperator *UO = dyn_cast<UnaryOperator>(RHSCheck)) {
13801 if ((UO->getOpcode() == UO_Plus || UO->getOpcode() == UO_Minus) &&
13802 Loc.
isFileID() && UO->getOperatorLoc().isFileID() &&
13808 UO->getSubExpr()->getBeginLoc().
isFileID()) {
13809 Diag(
Loc, diag::warn_not_compound_assign)
13810 << (UO->getOpcode() == UO_Plus ?
"+" :
"-")
13811 <<
SourceRange(UO->getOperatorLoc(), UO->getOperatorLoc());
13821 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(InnerLHS);
13860 if (CompoundType.
isNull()) {
13886 if (
const CastExpr *CE = dyn_cast<CastExpr>(
E)) {
13887 if (CE->getCastKind() == CK_ToVoid) {
13893 CE->getSubExpr()->getType()->isDependentType()) {
13898 if (
const auto *CE = dyn_cast<CallExpr>(
E))
13899 return CE->getCallReturnType(Context)->isVoidType();
13919 const unsigned ForIncrementFlags =
13925 if ((ScopeFlags & ForIncrementFlags) == ForIncrementFlags ||
13926 (ScopeFlags & ForInitFlags) == ForInitFlags)
13931 while (
const BinaryOperator *BO = dyn_cast<BinaryOperator>(LHS)) {
13932 if (BO->getOpcode() != BO_Comma)
13934 LHS = BO->getRHS();
13941 Diag(
Loc, diag::warn_comma_operator);
13945 LangOpts.CPlusPlus ?
"static_cast<void>("
13977 diag::err_incomplete_type);
13998 ResType = ResAtomicType->getValueType();
14000 assert(!ResType.
isNull() &&
"no type for increment/decrement expression");
14010 : diag::warn_increment_bool)
14014 S.
Diag(OpLoc, diag::err_increment_decrement_enum) << IsInc << ResType;
14030 S.
Diag(OpLoc, S.
getLangOpts().C2y ? diag::warn_c2y_compat_increment_complex
14031 : diag::ext_c2y_increment_complex)
14048 S.
Diag(OpLoc, diag::err_typecheck_illegal_increment_decrement)
14059 S.
Diag(OpLoc, diag::warn_deprecated_increment_decrement_volatile)
14060 << IsInc << ResType;
14092 case Stmt::DeclRefExprClass:
14093 return cast<DeclRefExpr>(
E)->getDecl();
14094 case Stmt::MemberExprClass:
14098 if (cast<MemberExpr>(
E)->isArrow())
14102 case Stmt::ArraySubscriptExprClass: {
14105 Expr*
Base = cast<ArraySubscriptExpr>(
E)->getBase();
14107 if (ICE->getSubExpr()->getType()->isArrayType())
14112 case Stmt::UnaryOperatorClass: {
14124 case Stmt::ParenExprClass:
14126 case Stmt::ImplicitCastExprClass:
14130 case Stmt::CXXUuidofExprClass:
14131 return cast<CXXUuidofExpr>(
E)->getGuidDecl();
14140 AO_Vector_Element = 1,
14141 AO_Property_Expansion = 2,
14142 AO_Register_Variable = 3,
14143 AO_Matrix_Element = 4,
14158 const auto *DRE = cast<DeclRefExpr>(Op->
IgnoreParens());
14161 return Diag(OpLoc, diag::err_parens_pointer_member_function)
14165 if (isa<CXXDestructorDecl>(MD))
14166 return Diag(OpLoc, diag::err_typecheck_addrof_dtor)
14167 << DRE->getSourceRange();
14169 if (DRE->getQualifier())
14173 return Diag(OpLoc, diag::err_unqualified_pointer_member_function)
14174 << DRE->getSourceRange();
14178 return Diag(OpLoc, diag::err_unqualified_pointer_member_function)
14179 << DRE->getSourceRange()
14185 if (PTy->getKind() == BuiltinType::Overload) {
14187 if (!isa<OverloadExpr>(
E)) {
14188 assert(cast<UnaryOperator>(
E)->getOpcode() == UO_AddrOf);
14189 Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof_addrof_function)
14195 if (isa<UnresolvedMemberExpr>(Ovl))
14197 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
14205 if (PTy->getKind() == BuiltinType::UnknownAny)
14208 if (PTy->getKind() == BuiltinType::BoundMember) {
14209 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
14232 auto* VarRef = dyn_cast<DeclRefExpr>(op);
14233 if (VarRef && VarRef->refersToEnclosingVariableOrCapture()) {
14234 Diag(op->
getExprLoc(), diag::err_opencl_taking_address_capture);
14242 if (uOp->getOpcode() == UO_Deref)
14245 return uOp->getSubExpr()->getType();
14252 if (
auto *FD = dyn_cast_or_null<FunctionDecl>(dcl))
14258 unsigned AddressOfError = AO_No_Error;
14263 : diag::ext_typecheck_addrof_temporary)
14270 }
else if (isa<ObjCSelectorExpr>(op)) {
14277 if (!isa<DeclRefExpr>(op)) {
14278 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
14297 auto ReturnOrParamTypeIsIncomplete = [&](
QualType T,
14302 diag::note_ptrauth_virtual_function_pointer_incomplete_arg_ret);
14303 Diag(RetArgTypeLoc,
14304 diag::note_ptrauth_virtual_function_incomplete_arg_ret_type)
14311 bool IsIncomplete =
14313 ReturnOrParamTypeIsIncomplete(
14316 IsIncomplete |= ReturnOrParamTypeIsIncomplete(PVD->getType(), OpLoc,
14317 PVD->getBeginLoc());
14331 if (isa<PseudoObjectExpr>(op)) {
14332 AddressOfError = AO_Property_Expansion;
14334 Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof)
14338 }
else if (
const auto *DRE = dyn_cast<DeclRefExpr>(op)) {
14339 if (
const auto *MD = dyn_cast_or_null<CXXMethodDecl>(DRE->getDecl()))
14345 AddressOfError = AO_Bit_Field;
14348 AddressOfError = AO_Vector_Element;
14351 AddressOfError = AO_Matrix_Element;
14355 if (
const VarDecl *vd = dyn_cast<VarDecl>(dcl)) {
14360 AddressOfError = AO_Register_Variable;
14362 }
else if (isa<MSPropertyDecl>(dcl)) {
14363 AddressOfError = AO_Property_Expansion;
14364 }
else if (isa<FunctionTemplateDecl>(dcl)) {
14366 }
else if (isa<FieldDecl>(dcl) || isa<IndirectFieldDecl>(dcl)) {
14376 if (isa<DeclRefExpr>(op) && cast<DeclRefExpr>(op)->getQualifier() &&
14377 !isa<ParenExpr>(OrigOp.
get())) {
14379 if (Ctx && Ctx->isRecord()) {
14382 diag::err_cannot_form_pointer_to_member_of_reference_type)
14387 while (cast<RecordDecl>(Ctx)->isAnonymousStructOrUnion())
14388 Ctx = Ctx->getParent();
14401 llvm_unreachable(
"Unknown/unexpected decl type");
14404 if (AddressOfError != AO_No_Error) {
14424 Diag(OpLoc, diag::err_wasm_ca_reference)
14429 Diag(OpLoc, diag::err_wasm_table_pr)
14435 CheckAddressOfPackedMember(op);
14441 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Exp);
14451 if (!FD->hasAttr<NonNullAttr>() && !Param->
hasAttr<NonNullAttr>())
14454 FD->ModifiedNonNullParams.insert(Param);
14460 bool IsAfterAmp =
false) {
14464 Op = ConvResult.
get();
14468 if (isa<CXXReinterpretCastExpr>(Op)) {
14476 Result = PT->getPointeeType();
14480 Result = OPT->getPointeeType();
14484 if (PR.
get() != Op)
14489 S.
Diag(OpLoc, diag::err_typecheck_indirection_requires_pointer)
14494 if (
Result->isVoidType()) {
14500 S.
Diag(OpLoc, diag::err_typecheck_indirection_through_void_pointer_cpp)
14503 S.
Diag(OpLoc, diag::ext_typecheck_indirection_through_void_pointer)
14520 default: llvm_unreachable(
"Unknown binop!");
14521 case tok::periodstar: Opc = BO_PtrMemD;
break;
14522 case tok::arrowstar: Opc = BO_PtrMemI;
break;
14523 case tok::star: Opc = BO_Mul;
break;
14524 case tok::slash: Opc = BO_Div;
break;
14525 case tok::percent: Opc = BO_Rem;
break;
14526 case tok::plus: Opc = BO_Add;
break;
14527 case tok::minus: Opc = BO_Sub;
break;
14528 case tok::lessless: Opc = BO_Shl;
break;
14529 case tok::greatergreater: Opc = BO_Shr;
break;
14530 case tok::lessequal: Opc = BO_LE;
break;
14531 case tok::less: Opc = BO_LT;
break;
14532 case tok::greaterequal: Opc = BO_GE;
break;
14533 case tok::greater: Opc = BO_GT;
break;
14534 case tok::exclaimequal: Opc = BO_NE;
break;
14535 case tok::equalequal: Opc = BO_EQ;
break;
14536 case tok::spaceship: Opc = BO_Cmp;
break;
14537 case tok::amp: Opc = BO_And;
break;
14538 case tok::caret: Opc = BO_Xor;
break;
14539 case tok::pipe: Opc = BO_Or;
break;
14540 case tok::ampamp: Opc = BO_LAnd;
break;
14541 case tok::pipepipe: Opc = BO_LOr;
break;
14542 case tok::equal: Opc = BO_Assign;
break;
14543 case tok::starequal: Opc = BO_MulAssign;
break;
14544 case tok::slashequal: Opc = BO_DivAssign;
break;
14545 case tok::percentequal: Opc = BO_RemAssign;
break;
14546 case tok::plusequal: Opc = BO_AddAssign;
break;
14547 case tok::minusequal: Opc = BO_SubAssign;
break;
14548 case tok::lesslessequal: Opc = BO_ShlAssign;
break;
14549 case tok::greatergreaterequal: Opc = BO_ShrAssign;
break;
14550 case tok::ampequal: Opc = BO_AndAssign;
break;
14551 case tok::caretequal: Opc = BO_XorAssign;
break;
14552 case tok::pipeequal: Opc = BO_OrAssign;
break;
14553 case tok::comma: Opc = BO_Comma;
break;
14562 default: llvm_unreachable(
"Unknown unary op!");
14563 case tok::plusplus: Opc = UO_PreInc;
break;
14564 case tok::minusminus: Opc = UO_PreDec;
break;
14565 case tok::amp: Opc = UO_AddrOf;
break;
14566 case tok::star: Opc = UO_Deref;
break;
14567 case tok::plus: Opc = UO_Plus;
break;
14568 case tok::minus: Opc = UO_Minus;
break;
14569 case tok::tilde: Opc = UO_Not;
break;
14570 case tok::exclaim: Opc = UO_LNot;
break;
14571 case tok::kw___real: Opc = UO_Real;
break;
14572 case tok::kw___imag: Opc = UO_Imag;
break;
14573 case tok::kw___extension__: Opc = UO_Extension;
break;
14589 if (!isa<ParmVarDecl>(SelfAssigned))
14591 const auto *Method =
14605 llvm::find_if(
Parent->fields(),
14607 return F->getDeclName() == Name;
14609 return (Field !=
Parent->field_end()) ? *Field :
nullptr;
14624 const DeclRefExpr *LHSDeclRef = dyn_cast<DeclRefExpr>(LHSExpr);
14625 const DeclRefExpr *RHSDeclRef = dyn_cast<DeclRefExpr>(RHSExpr);
14626 if (!LHSDeclRef || !RHSDeclRef ||
14634 if (LHSDecl != RHSDecl)
14639 if (RefTy->getPointeeType().isVolatileQualified())
14642 auto Diag = S.
Diag(OpLoc, IsBuiltin ? diag::warn_self_assignment_builtin
14643 : diag::warn_self_assignment_overloaded)
14648 Diag << 1 << SelfAssignField
14661 const Expr *ObjCPointerExpr =
nullptr, *OtherExpr =
nullptr;
14666 ObjCPointerExpr = LHS;
14670 ObjCPointerExpr = RHS;
14678 if (ObjCPointerExpr && isa<IntegerLiteral>(OtherExpr->IgnoreParenCasts())) {
14679 unsigned Diag = diag::warn_objc_pointer_masking;
14687 StringRef SelArg0 = S.getNameForSlot(0);
14688 if (SelArg0.starts_with(
"performSelector"))
14689 Diag = diag::warn_objc_pointer_masking_performSelector;
14700 if (
auto *DRE = dyn_cast<DeclRefExpr>(
E))
14701 return DRE->getDecl();
14702 if (
auto *ME = dyn_cast<MemberExpr>(
E))
14703 return ME->getMemberDecl();
14704 if (
auto *IRE = dyn_cast<ObjCIvarRefExpr>(
E))
14705 return IRE->getDecl();
14720 "Result must be a vector of half or short");
14723 "both operands expected to be a half vector");
14735 ResultTy, VK, OK, OpLoc, FPFeatures,
14736 BinOpResTy, BinOpResTy);
14740 BinOpResTy, VK, OK, OpLoc, FPFeatures);
14744static std::pair<ExprResult, ExprResult>
14754 RHS,
nullptr,
false,
14755 [Opc, LHS](
Expr *
E) {
14756 if (Opc != BO_Assign)
14763 return std::make_pair(LHS, RHS);
14770 if (!OpRequiresConversion || Ctx.
getLangOpts().NativeHalfType ||
14774 auto HasVectorOfHalfType = [&Ctx](
Expr *
E) {
14784 return VT->getElementType().getCanonicalType() == Ctx.
HalfTy;
14789 return HasVectorOfHalfType(E0) && (!E1 || HasVectorOfHalfType(E1));
14808 if (
Init.isInvalid())
14810 RHSExpr =
Init.get();
14820 bool ConvertHalfVec =
false;
14823 if (!LHS.
isUsable() || !RHS.isUsable())
14833 if (BO_Assign == Opc)
14834 Diag(OpLoc, diag::err_opencl_atomic_init) << 0 << SR;
14862 if (!ResultTy.
isNull()) {
14879 if (
auto *BE = dyn_cast<BlockExpr>(RHS.get()->IgnoreParens()))
14881 if (
auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
14882 if (VD->hasLocalStorage() &&
getCurScope()->isDeclScope(VD))
14883 BE->getBlockDecl()->setCanAvoidCopyToHeap();
14894 Opc == BO_PtrMemI);
14898 ConvertHalfVec =
true;
14906 ConvertHalfVec =
true;
14910 ConvertHalfVec =
true;
14921 ConvertHalfVec =
true;
14924 if (
const auto *BI = dyn_cast<BinaryOperator>(LHSExpr);
14925 BI && BI->isComparisonOp())
14926 Diag(OpLoc, diag::warn_consecutive_comparison);
14931 ConvertHalfVec =
true;
14935 ConvertHalfVec =
true;
14948 ConvertHalfVec =
true;
14953 ConvertHalfVec =
true;
14955 Opc == BO_DivAssign);
14956 CompLHSTy = CompResultTy;
14963 CompLHSTy = CompResultTy;
14969 ConvertHalfVec =
true;
14976 ConvertHalfVec =
true;
14985 CompLHSTy = CompResultTy;
14996 CompLHSTy = CompResultTy;
15004 VK = RHS.get()->getValueKind();
15005 OK = RHS.get()->getObjectKind();
15019 "both sides are half vectors or neither sides are");
15024 CheckArrayAccess(LHS.
get());
15025 CheckArrayAccess(RHS.get());
15031 if (ObjectSetClass && isa<ObjCIsaExpr>(LHS.
get())) {
15035 "object_setClass(")
15048 if (CompResultTy.
isNull()) {
15049 if (ConvertHalfVec)
15069 if (ConvertHalfVec)
15074 Context, LHS.
get(), RHS.get(), Opc, ResultTy, VK, OK, OpLoc,
15091 if (isLeftComp == isRightComp)
15096 bool isLeftBitwise = LHSBO && LHSBO->
isBitwiseOp();
15097 bool isRightBitwise = RHSBO && RHSBO->
isBitwiseOp();
15098 if (isLeftBitwise || isRightBitwise)
15110 Self.Diag(OpLoc, diag::warn_precedence_bitwise_rel)
15113 Self.PDiag(diag::note_precedence_silence) << OpStr,
15114 (isLeftComp ? LHSExpr : RHSExpr)->getSourceRange());
15116 Self.PDiag(diag::note_precedence_bitwise_first)
15131 Self.PDiag(diag::note_precedence_silence)
15140 if (Bop->getOpcode() == BO_LAnd) {
15143 if (!isa<StringLiteral>(Bop->getLHS()->IgnoreParenImpCasts()))
15145 }
else if (Bop->getOpcode() == BO_LOr) {
15146 if (
BinaryOperator *RBop = dyn_cast<BinaryOperator>(Bop->getRHS())) {
15149 if (RBop->getOpcode() == BO_LAnd &&
15150 isa<StringLiteral>(RBop->getRHS()->IgnoreParenImpCasts()))
15161 if (Bop->getOpcode() == BO_LAnd) {
15164 if (!isa<StringLiteral>(Bop->getRHS()->IgnoreParenImpCasts()))
15176 if (Bop->isBitwiseOp() && Bop->getOpcode() < Opc) {
15177 S.
Diag(Bop->getOperatorLoc(), diag::warn_bitwise_op_in_bitwise_op)
15179 << Bop->getSourceRange() << OpLoc;
15181 S.
PDiag(diag::note_precedence_silence)
15182 << Bop->getOpcodeStr(),
15183 Bop->getSourceRange());
15189 Expr *SubExpr, StringRef Shift) {
15191 if (Bop->getOpcode() == BO_Add || Bop->getOpcode() == BO_Sub) {
15192 StringRef Op = Bop->getOpcodeStr();
15193 S.
Diag(Bop->getOperatorLoc(), diag::warn_addition_in_bitshift)
15194 << Bop->getSourceRange() << OpLoc << Shift << Op;
15196 S.
PDiag(diag::note_precedence_silence) << Op,
15197 Bop->getSourceRange());
15213 if (Kind != OO_LessLess && Kind != OO_GreaterGreater)
15216 S.
Diag(OpLoc, diag::warn_overloaded_shift_in_comparison)
15218 << (Kind == OO_LessLess);
15220 S.
PDiag(diag::note_precedence_silence)
15221 << (Kind == OO_LessLess ?
"<<" :
">>"),
15224 S, OpLoc, S.
PDiag(diag::note_evaluate_comparison_first),
15238 if ((Opc == BO_Or || Opc == BO_Xor) &&
15246 if (Opc == BO_LOr && !OpLoc.
isMacroID()) {
15252 || Opc == BO_Shr) {
15266 if (
auto *CT = Operand->getType()->getAs<
ComplexType>()) {
15267 QualType ElementType = CT->getElementType();
15268 bool IsComplexRangePromoted = S.
getLangOpts().getComplexRange() ==
15273 const llvm::fltSemantics &ElementTypeSemantics =
15275 const llvm::fltSemantics &HigherElementTypeSemantics =
15277 if (llvm::APFloat::semanticsMaxExponent(ElementTypeSemantics) * 2 + 1 >
15278 llvm::APFloat::semanticsMaxExponent(HigherElementTypeSemantics)) {
15283 if (
Type == HigherElementType) {
15299 assert(LHSExpr &&
"ActOnBinOp(): missing left expression");
15300 assert(RHSExpr &&
"ActOnBinOp(): missing right expression");
15307 if (Kind == tok::TokenKind::slash)
15310 BuiltinCountedByRefKind K =
15313 CheckInvalidBuiltinCountedByRef(LHSExpr, K);
15314 CheckInvalidBuiltinCountedByRef(RHSExpr, K);
15316 return BuildBinOp(S, TokLoc, Opc, LHSExpr, RHSExpr);
15322 if (OverOp !=
OO_None && OverOp != OO_Equal)
15376 LHSExpr = LHS.
get();
15377 RHSExpr = RHS.
get();
15388 if (pty->getKind() == BuiltinType::PseudoObject &&
15401 RHSExpr = resolvedRHS.
get();
15415 (pty->getKind() == BuiltinType::BoundMember ||
15416 pty->getKind() == BuiltinType::Overload)) {
15417 auto *OE = dyn_cast<OverloadExpr>(LHSExpr);
15418 if (OE && !OE->hasTemplateKeyword() && !OE->hasExplicitTemplateArgs() &&
15419 llvm::any_of(OE->decls(), [](
NamedDecl *ND) {
15420 return isa<FunctionTemplateDecl>(ND);
15422 Diag(OE->getQualifier() ? OE->getQualifierLoc().getBeginLoc()
15423 : OE->getNameLoc(),
15424 diag::err_template_kw_missing)
15425 << OE->getName().getAsString() <<
"";
15432 LHSExpr = LHS.
get();
15439 if (Opc == BO_Assign && pty->getKind() == BuiltinType::Overload) {
15455 RHSExpr = resolvedRHS.
get();
15471 "Should only occur in error-recovery path.");
15477 Context, LHSExpr, RHSExpr, Opc,
15497 ResultType = RHSExpr->
getType();
15529 bool CanOverflow =
false;
15531 bool ConvertHalfVec =
false;
15540 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15547 if (Opc == UO_AddrOf)
15548 return ExprError(
Diag(OpLoc, diag::err_hlsl_operator_unsupported) << 0);
15549 if (Opc == UO_Deref)
15550 return ExprError(
Diag(OpLoc, diag::err_hlsl_operator_unsupported) << 1);
15564 Opc == UO_PreInc || Opc == UO_PostInc,
15565 Opc == UO_PreInc || Opc == UO_PreDec);
15570 CheckAddressOfNoDeref(InputExpr);
15583 CanOverflow = Opc == UO_Minus &&
15595 if (ConvertHalfVec)
15612 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15623 Diag(OpLoc, diag::ext_integer_complement_complex)
15632 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15635 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15657 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15673 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15683 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15693 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15700 return ExprError(
Diag(OpLoc, diag::err_typecheck_unary_expr)
15734 "the co_await expression must be non-dependant before "
15735 "building operator co_await");
15746 if (Opc != UO_AddrOf && Opc != UO_Deref)
15747 CheckArrayAccess(Input.
get());
15753 if (Opc == UO_Deref && UO->getType()->hasAttr(attr::NoDeref) &&
15754 !isa<ArrayType>(UO->getType().getDesugaredType(
Context)) &&
15759 if (ConvertHalfVec)
15766 if (!DRE->getQualifier())
15773 if (isa<FieldDecl>(VD) || isa<IndirectFieldDecl>(VD))
15776 return Method->isImplicitObjectMemberFunction();
15782 if (!ULE->getQualifier())
15787 if (Method->isImplicitObjectMemberFunction())
15808 if (pty->getKind() == BuiltinType::PseudoObject &&
15813 if (Opc == UO_Extension)
15818 if (Opc == UO_AddrOf &&
15819 (pty->getKind() == BuiltinType::Overload ||
15820 pty->getKind() == BuiltinType::UnknownAny ||
15821 pty->getKind() == BuiltinType::BoundMember))
15846 Expr *Input,
bool IsAfterAmp) {
15885 assert(SubStmt && isa<CompoundStmt>(SubStmt) &&
"Invalid action invocation!");
15891 "cleanups within StmtExpr not correctly bound!");
15901 bool StmtExprMayBindToTemp =
false;
15904 if (
const auto *LastStmt =
15906 if (
const Expr *
Value = LastStmt->getExprStmt()) {
15907 StmtExprMayBindToTemp =
true;
15915 Expr *ResStmtExpr =
15917 if (StmtExprMayBindToTemp)
15919 return ResStmtExpr;
15942 auto *Cast = dyn_cast<ImplicitCastExpr>(
E);
15943 if (Cast && Cast->getCastKind() == CK_ARCConsumeObject)
15944 return Cast->getSubExpr();
15965 return ExprError(
Diag(BuiltinLoc, diag::err_offsetof_record_type)
15966 << ArgTy << TypeRange);
15972 diag::err_offsetof_incomplete_type, TypeRange))
15975 bool DidWarnAboutNonPOD =
false;
15980 if (OC.isBrackets) {
15985 return ExprError(
Diag(OC.LocEnd, diag::err_offsetof_array_type)
16005 Comps.push_back(
OffsetOfNode(OC.LocStart, Exprs.size(), OC.LocEnd));
16006 Exprs.push_back(Idx);
16014 Comps.push_back(
OffsetOfNode(OC.LocStart, OC.U.IdentInfo, OC.LocEnd));
16021 diag::err_offsetof_incomplete_type))
16027 return ExprError(
Diag(OC.LocEnd, diag::err_offsetof_record_type)
16039 bool IsSafe =
LangOpts.CPlusPlus11? CRD->isStandardLayout() : CRD->isPOD();
16041 LangOpts.CPlusPlus11? diag::ext_offsetof_non_standardlayout_type
16042 : diag::ext_offsetof_non_pod_type;
16045 Diag(BuiltinLoc, DiagID)
16046 <<
SourceRange(Components[0].LocStart, OC.LocEnd) << CurrentType;
16047 DidWarnAboutNonPOD =
true;
16058 MemberDecl = IndirectMemberDecl->getAnonField();
16066 Diag(BuiltinLoc, diag::err_no_member)
16067 << OC.U.IdentInfo << RD <<
SourceRange(OC.LocStart, OC.LocEnd);
16076 Diag(OC.LocEnd, diag::err_offsetof_bitfield)
16084 if (IndirectMemberDecl)
16085 Parent = cast<RecordDecl>(IndirectMemberDecl->getDeclContext());
16092 if (Paths.getDetectedVirtual()) {
16093 Diag(OC.LocEnd, diag::err_offsetof_field_of_virtual_base)
16104 if (IndirectMemberDecl) {
16105 for (
auto *FI : IndirectMemberDecl->chain()) {
16106 assert(isa<FieldDecl>(FI));
16108 cast<FieldDecl>(FI), OC.LocEnd));
16111 Comps.push_back(
OffsetOfNode(OC.LocStart, MemberDecl, OC.LocEnd));
16117 Comps, Exprs, RParenLoc);
16143 assert((CondExpr && LHSExpr && RHSExpr) &&
"Missing type argument(s)");
16148 bool CondIsTrue =
false;
16153 llvm::APSInt condEval(32);
16155 CondExpr, &condEval, diag::err_typecheck_choose_expr_requires_constant);
16158 CondExpr = CondICE.
get();
16159 CondIsTrue = condEval.getZExtValue();
16162 Expr *ActiveExpr = CondIsTrue ? LHSExpr : RHSExpr;
16164 resType = ActiveExpr->
getType();
16170 resType, VK, OK, RPLoc, CondIsTrue);
16182 Decl *ManglingContextDecl;
16183 std::tie(MCtx, ManglingContextDecl) =
16187 Block->setBlockMangling(ManglingNumber, ManglingContextDecl);
16209 "block-id should have no identifier!");
16221 "GetTypeForDeclarator made a non-function block signature");
16237 unsigned Size =
Result.getFullDataSize();
16249 QualType RetTy = Fn->getReturnType();
16251 (isa<FunctionProtoType>(Fn) && cast<FunctionProtoType>(Fn)->isVariadic());
16267 if (ExplicitSignature) {
16268 for (
unsigned I = 0,
E = ExplicitSignature.
getNumParams(); I !=
E; ++I) {
16276 Params.push_back(Param);
16282 for (
const auto &I : Fn->param_types()) {
16285 Params.push_back(Param);
16290 if (!Params.empty()) {
16301 AI->setOwningFunction(CurBlock->
TheDecl);
16304 if (AI->getIdentifier()) {
16310 if (AI->isInvalidDecl())
16329 Diag(CaretLoc, diag::err_blocks_disable) <<
LangOpts.OpenCL;
16335 "cleanups within block not correctly bound!");
16350 bool NoReturn = BD->
hasAttr<NoReturnAttr>();
16358 if (NoReturn && !Ext.getNoReturn()) Ext = Ext.
withNoReturn(
true);
16361 if (isa<FunctionNoProtoType>(FTy)) {
16396 BD->
setBody(cast<CompoundStmt>(Body));
16398 if (Body &&
getCurFunction()->HasPotentialAvailabilityViolations)
16423 Expr *CopyExpr =
nullptr;
16432 if (isa<ParmVarDecl>(Var))
16451 if (!
Result.isInvalid() &&
16452 !
Result.get()->getType().isConstQualified()) {
16454 Result.get()->getType().withConst(),
16458 if (!
Result.isInvalid()) {
16468 if (!
Result.isInvalid() &&
16469 !cast<CXXConstructExpr>(
Result.get())->getConstructor()
16472 CopyExpr =
Result.get();
16479 Captures.push_back(NewCap);
16492 if (
Result->getBlockDecl()->hasCaptures()) {
16499 for (
const auto &CI :
Result->getBlockDecl()->captures()) {
16500 const VarDecl *var = CI.getVariable();
16515 {Result},
Result->getType());
16529 Expr *OrigExpr =
E;
16579 if (
Init.isInvalid())
16595 diag::err_first_argument_to_va_arg_not_of_type_va_list)
16600 diag::err_second_parameter_to_va_arg_incomplete,
16606 diag::err_second_parameter_to_va_arg_abstract,
16613 ? diag::warn_second_parameter_to_va_arg_ownership_qualified
16614 : diag::warn_second_parameter_to_va_arg_not_pod)
16621 PDiag(diag::warn_second_parameter_to_va_arg_array)
16654 UnderlyingType = ET->getDecl()->getIntegerType();
16677 if (!PromoteType.
isNull())
16679 PDiag(diag::warn_second_parameter_to_va_arg_never_compatible)
16701 llvm_unreachable(
"I don't know size of pointer!");
16718 if ((SLDecl->isCompleteDefinition() || SLDecl->isBeingDefined()) &&
16727 S.
Diag(
Loc, diag::err_std_source_location_impl_not_found);
16735 S.
Diag(
Loc, diag::err_std_source_location_impl_malformed);
16739 unsigned Count = 0;
16741 StringRef Name = F->getName();
16743 if (Name ==
"_M_file_name") {
16744 if (F->getType() !=
16748 }
else if (Name ==
"_M_function_name") {
16749 if (F->getType() !=
16753 }
else if (Name ==
"_M_line") {
16754 if (!F->getType()->isIntegerType())
16757 }
else if (Name ==
"_M_column") {
16758 if (!F->getType()->isIntegerType())
16767 S.
Diag(
Loc, diag::err_std_source_location_impl_malformed);
16818 Data->BinaryData = BinaryData;
16821 Data->getDataElementCount());
16825 const Expr *SrcExpr) {
16834 auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl());
16847 bool *Complained) {
16849 *Complained =
false;
16852 bool CheckInferredResultType =
false;
16854 unsigned DiagKind = 0;
16856 bool MayHaveConvFixit =
false;
16857 bool MayHaveFunctionDiff =
false;
16868 DiagKind = diag::err_typecheck_convert_pointer_int;
16871 DiagKind = diag::ext_typecheck_convert_pointer_int;
16874 MayHaveConvFixit =
true;
16878 DiagKind = diag::err_typecheck_convert_int_pointer;
16881 DiagKind = diag::ext_typecheck_convert_int_pointer;
16884 MayHaveConvFixit =
true;
16888 diag::warn_typecheck_convert_incompatible_function_pointer_strict;
16890 MayHaveConvFixit =
true;
16894 DiagKind = diag::err_typecheck_convert_incompatible_function_pointer;
16897 DiagKind = diag::ext_typecheck_convert_incompatible_function_pointer;
16900 MayHaveConvFixit =
true;
16904 DiagKind = diag::err_arc_typecheck_convert_incompatible_pointer;
16906 DiagKind = diag::err_typecheck_convert_incompatible_pointer;
16909 DiagKind = diag::ext_typecheck_convert_incompatible_pointer;
16913 if (CheckInferredResultType) {
16919 MayHaveConvFixit =
true;
16923 DiagKind = diag::err_typecheck_convert_incompatible_pointer_sign;
16926 DiagKind = diag::ext_typecheck_convert_incompatible_pointer_sign;
16931 DiagKind = diag::err_typecheck_convert_pointer_void_func;
16934 DiagKind = diag::ext_typecheck_convert_pointer_void_func;
16946 DiagKind = diag::err_typecheck_incompatible_address_space;
16949 DiagKind = diag::err_typecheck_incompatible_ownership;
16953 llvm_unreachable(
"unknown error case for discarding qualifiers!");
16970 DiagKind = diag::err_typecheck_convert_discards_qualifiers;
16973 DiagKind = diag::ext_typecheck_convert_discards_qualifiers;
16980 DiagKind = diag::err_nested_pointer_qualifier_mismatch;
16982 DiagKind = diag::ext_nested_pointer_qualifier_mismatch;
16986 DiagKind = diag::err_typecheck_incompatible_nested_address_space;
16990 DiagKind = diag::err_int_to_block_pointer;
16994 DiagKind = diag::err_typecheck_convert_incompatible_block_pointer;
17001 for (
auto *srcProto : srcOPT->
quals()) {
17007 IFace = IFaceT->getDecl();
17012 for (
auto *dstProto : dstOPT->
quals()) {
17018 IFace = IFaceT->getDecl();
17021 DiagKind = diag::err_incompatible_qualified_id;
17024 DiagKind = diag::warn_incompatible_qualified_id;
17030 DiagKind = diag::err_incompatible_vectors;
17033 DiagKind = diag::warn_incompatible_vectors;
17037 DiagKind = diag::err_arc_weak_unavailable_assign;
17043 *Complained =
true;
17047 DiagKind = diag::err_typecheck_convert_incompatible;
17049 MayHaveConvFixit =
true;
17051 MayHaveFunctionDiff =
true;
17060 FirstType = DstType;
17061 SecondType = SrcType;
17071 FirstType = SrcType;
17072 SecondType = DstType;
17081 FDiag << FirstType << SecondType << ActionForDiag
17084 if (DiagKind == diag::ext_typecheck_convert_incompatible_pointer_sign ||
17085 DiagKind == diag::err_typecheck_convert_incompatible_pointer_sign) {
17095 if (!ConvHints.
isNull()) {
17100 if (MayHaveConvFixit) { FDiag << (
unsigned) (ConvHints.
Kind); }
17102 if (MayHaveFunctionDiff)
17106 if ((DiagKind == diag::warn_incompatible_qualified_id ||
17107 DiagKind == diag::err_incompatible_qualified_id) &&
17109 Diag(IFace->
getLocation(), diag::note_incomplete_class_and_qualified_id)
17116 if (CheckInferredResultType)
17123 *Complained =
true;
17134 return S.
Diag(
Loc, diag::err_ice_not_integral)
17153 IDDiagnoser(
unsigned DiagID)
17159 } Diagnoser(DiagID);
17194 BaseDiagnoser(BaseDiagnoser) {}
17203 return S.
Diag(
Loc, diag::err_ice_incomplete_type) <<
T;
17208 return S.
Diag(
Loc, diag::err_ice_explicit_conversion) <<
T << ConvTy;
17219 return S.
Diag(
Loc, diag::err_ice_ambiguous_conversion) <<
T;
17230 llvm_unreachable(
"conversion functions are permitted");
17232 } ConvertDiagnoser(Diagnoser);
17238 E = Converted.
get();
17243 if (isa<RecoveryExpr>(
E))
17259 E = RValueExpr.
get();
17267 if (!isa<ConstantExpr>(
E))
17277 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
17278 diag::note_invalid_subexpr_in_const_expr) {
17279 DiagLoc = Notes[0].first;
17301 EvalResult.
Diag = &Notes;
17310 if (!isa<ConstantExpr>(
E))
17316 if (Folded &&
getLangOpts().CPlusPlus11 && Notes.empty()) {
17325 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
17326 diag::note_invalid_subexpr_in_const_expr) {
17327 DiagLoc = Notes[0].first;
17331 if (!Folded || !CanFold) {
17353 class TransformToPE :
public TreeTransform<TransformToPE> {
17357 TransformToPE(
Sema &SemaRef) : BaseTransform(SemaRef) { }
17360 bool AlwaysRebuild() {
return true; }
17361 bool ReplacingOriginal() {
return true; }
17371 if (isa<FieldDecl>(
E->getDecl()) &&
17372 !SemaRef.isUnevaluatedContext())
17373 return SemaRef.Diag(
E->getLocation(),
17374 diag::err_invalid_non_static_member_use)
17377 return BaseTransform::TransformDeclRefExpr(
E);
17385 return BaseTransform::TransformUnaryOperator(
E);
17393 return SkipLambdaBody(
E, Body);
17400 "Should only transform unevaluated expressions");
17405 return TransformToPE(*this).TransformExpr(
E);
17410 "Should only transform unevaluated expressions");
17414 return TransformToPE(*this).TransformType(TInfo);
17422 LambdaContextDecl, ExprContext);
17436 Prev.isImmediateFunctionContext() || Prev.isConstantEvaluated();
17439 Prev.InImmediateEscalatingFunctionContext;
17458 if (
const auto *
E = dyn_cast<UnaryOperator>(PossibleDeref)) {
17459 if (
E->getOpcode() == UO_Deref)
17460 return CheckPossibleDeref(S,
E->getSubExpr());
17461 }
else if (
const auto *
E = dyn_cast<ArraySubscriptExpr>(PossibleDeref)) {
17462 return CheckPossibleDeref(S,
E->getBase());
17463 }
else if (
const auto *
E = dyn_cast<MemberExpr>(PossibleDeref)) {
17464 return CheckPossibleDeref(S,
E->getBase());
17465 }
else if (
const auto E = dyn_cast<DeclRefExpr>(PossibleDeref)) {
17469 Inner = Ptr->getPointeeType();
17471 Inner = Arr->getElementType();
17475 if (Inner->hasAttr(attr::NoDeref))
17485 const DeclRefExpr *DeclRef = CheckPossibleDeref(*
this,
E);
17492 Diag(
E->
getExprLoc(), diag::warn_dereference_of_noderef_type_no_decl)
17507 if (BO->getOpcode() == BO_Assign) {
17509 llvm::erase(LHSs, BO->getLHS());
17517 "Cannot mark an immediate escalating expression outside of an "
17518 "immediate escalating context");
17521 if (
auto *DeclRef =
17522 dyn_cast<DeclRefExpr>(
Call->getCallee()->IgnoreImplicit()))
17523 DeclRef->setIsImmediateEscalating(
true);
17524 }
else if (
auto *Ctr = dyn_cast<CXXConstructExpr>(
E->
IgnoreImplicit())) {
17525 Ctr->setIsImmediateEscalating(
true);
17526 }
else if (
auto *DeclRef = dyn_cast<DeclRefExpr>(
E->
IgnoreImplicit())) {
17527 DeclRef->setIsImmediateEscalating(
true);
17529 assert(
false &&
"expected an immediately escalating expression");
17532 FI->FoundImmediateEscalatingExpression =
true;
17547 if (
auto *DeclRef =
17548 dyn_cast<DeclRefExpr>(
Call->getCallee()->IgnoreImplicit()))
17557 auto CheckConstantExpressionAndKeepResult = [&]() {
17560 Eval.
Diag = &Notes;
17562 Eval,
getASTContext(), ConstantExprKind::ImmediateInvocation);
17563 if (Res && Notes.empty()) {
17564 Cached = std::move(Eval.
Val);
17572 !CheckConstantExpressionAndKeepResult()) {
17607 ExprEvalContexts.back().ImmediateInvocationCandidates.emplace_back(Res, 0);
17615 Eval.
Diag = &Notes;
17619 if (!
Result || !Notes.empty()) {
17622 if (
auto *
FunctionalCast = dyn_cast<CXXFunctionalCastExpr>(InnerExpr))
17625 if (
auto *
Call = dyn_cast<CallExpr>(InnerExpr))
17626 FD = cast<FunctionDecl>(
Call->getCalleeDecl());
17627 else if (
auto *
Call = dyn_cast<CXXConstructExpr>(InnerExpr))
17628 FD =
Call->getConstructor();
17629 else if (
auto *Cast = dyn_cast<CastExpr>(InnerExpr))
17630 FD = dyn_cast_or_null<FunctionDecl>(Cast->getConversionFunction());
17633 "could not find an immediate function in this expression");
17646 for (
auto &
Note : Notes)
17658 llvm::SmallPtrSetImpl<DeclRefExpr *> &DRSet;
17662 ComplexRemove(
Sema &SemaRef, llvm::SmallPtrSetImpl<DeclRefExpr *> &DR,
17665 4>::reverse_iterator Current)
17666 :
Base(SemaRef), DRSet(DR), IISet(II), CurrentII(Current) {}
17668 auto It = std::find_if(CurrentII, IISet.rend(),
17670 return Elem.getPointer() == E;
17676 if (It == IISet.rend()) {
17678 CurrentII->setInt(1);
17684 if (!
E->isImmediateInvocation())
17685 return Base::TransformConstantExpr(
E);
17686 RemoveImmediateInvocation(
E);
17687 return Base::TransformExpr(
E->getSubExpr());
17693 return Base::TransformCXXOperatorCallExpr(
E);
17707 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(
Init))
17708 Init = ICE->getSubExpr();
17709 else if (
auto *ICE = dyn_cast<MaterializeTemporaryExpr>(
Init))
17710 Init = ICE->getSubExpr();
17716 if (
auto *CE = dyn_cast<ConstantExpr>(
Init);
17717 CE && CE->isImmediateInvocation())
17718 RemoveImmediateInvocation(CE);
17719 return Base::TransformInitializer(
Init, NotCopyInit);
17730 bool AlwaysRebuild() {
return false; }
17731 bool ReplacingOriginal() {
return true; }
17732 bool AllowSkippingCXXConstructExpr() {
17733 bool Res = AllowSkippingFirstCXXConstructExpr;
17734 AllowSkippingFirstCXXConstructExpr =
true;
17737 bool AllowSkippingFirstCXXConstructExpr =
true;
17747 if (isa<CXXConstructExpr>(It->getPointer()->IgnoreImplicit()))
17748 Transformer.AllowSkippingFirstCXXConstructExpr =
false;
17750 ExprResult Res = Transformer.TransformExpr(It->getPointer()->getSubExpr());
17756 It->getPointer()->setSubExpr(Res.
get());
17791 llvm::SmallPtrSetImpl<DeclRefExpr *> &DRSet;
17792 SimpleRemove(llvm::SmallPtrSetImpl<DeclRefExpr *> &S) : DRSet(S) {}
17795 return DRSet.size();
17798 Visitor.TraverseStmt(
17808 if (DR->isImmediateEscalating())
17810 auto *FD = cast<FunctionDecl>(DR->getDecl());
17812 if (
const auto *MD = dyn_cast<CXXMethodDecl>(ND);
17814 ND = MD->getParent();
17821 bool ImmediateEscalating =
false;
17822 bool IsPotentiallyEvaluated =
17832 SemaRef.
Diag(DR->getBeginLoc(), diag::err_invalid_consteval_take_address)
17833 << ND << isa<CXXRecordDecl>(ND) << FD->isConsteval();
17834 if (!FD->getBuiltinID())
17842 if (FD->isImmediateEscalating() && !FD->isConsteval())
17858 (Rec.
ExprContext == ExpressionKind::EK_TemplateArgument ||
17866 D = diag::err_lambda_unevaluated_operand;
17872 D = diag::err_lambda_in_constant_expression;
17873 }
else if (Rec.
ExprContext == ExpressionKind::EK_TemplateArgument) {
17876 D = diag::err_lambda_in_invalid_context;
17878 llvm_unreachable(
"Couldn't infer lambda error message.");
17880 for (
const auto *L : Rec.
Lambdas)
17881 Diag(L->getBeginLoc(),
D);
17901 Diag(BO->getBeginLoc(), diag::warn_deprecated_simple_assign_volatile)
17974 llvm_unreachable(
"Invalid context");
17983 if (!TT.isOSWindows() || !TT.isX86())
18021 : FD(FD), Param(Param) {}
18028 CCName =
"stdcall";
18031 CCName =
"fastcall";
18034 CCName =
"vectorcall";
18037 llvm_unreachable(
"CC does not need mangling");
18040 S.
Diag(
Loc, diag::err_cconv_incomplete_param_type)
18046 ParamIncompleteTypeDiagnoser Diagnoser(FD, Param);
18052enum class OdrUseContext {
18074 return OdrUseContext::None;
18079 Result = OdrUseContext::Used;
18083 Result = OdrUseContext::FormallyOdrUsed;
18089 Result = OdrUseContext::FormallyOdrUsed;
18094 return OdrUseContext::Dependent;
18100 if (!
Func->isConstexpr())
18103 if (
Func->isImplicitlyInstantiable() || !
Func->isUserProvided())
18105 auto *CCD = dyn_cast<CXXConstructorDecl>(
Func);
18106 return CCD && CCD->getInheritedConstructor();
18110 bool MightBeOdrUse) {
18111 assert(
Func &&
"No function?");
18113 Func->setReferenced();
18126 OdrUseContext OdrUse =
18128 if (IsRecursiveCall && OdrUse == OdrUseContext::Used)
18129 OdrUse = OdrUseContext::FormallyOdrUsed;
18133 if (
Func->isTrivial() && !
Func->hasAttr<DLLExportAttr>() &&
18134 OdrUse == OdrUseContext::Used) {
18135 if (
auto *Constructor = dyn_cast<CXXConstructorDecl>(
Func))
18136 if (Constructor->isDefaultConstructor())
18137 OdrUse = OdrUseContext::FormallyOdrUsed;
18138 if (isa<CXXDestructorDecl>(
Func))
18139 OdrUse = OdrUseContext::FormallyOdrUsed;
18146 bool NeededForConstantEvaluation =
18171 bool NeedDefinition =
18172 !IsRecursiveCall &&
18173 (OdrUse == OdrUseContext::Used ||
18174 (NeededForConstantEvaluation && !
Func->isPureVirtual()));
18181 if (NeedDefinition &&
18183 Func->getMemberSpecializationInfo()))
18190 if (NeedDefinition && !
Func->getBody()) {
18193 dyn_cast<CXXConstructorDecl>(
Func)) {
18194 Constructor = cast<CXXConstructorDecl>(Constructor->getFirstDecl());
18195 if (Constructor->isDefaulted() && !Constructor->isDeleted()) {
18196 if (Constructor->isDefaultConstructor()) {
18197 if (Constructor->isTrivial() &&
18198 !Constructor->hasAttr<DLLExportAttr>())
18201 }
else if (Constructor->isCopyConstructor()) {
18203 }
else if (Constructor->isMoveConstructor()) {
18206 }
else if (Constructor->getInheritedConstructor()) {
18210 dyn_cast<CXXDestructorDecl>(
Func)) {
18220 if (MethodDecl->isOverloadedOperator() &&
18221 MethodDecl->getOverloadedOperator() == OO_Equal) {
18222 MethodDecl = cast<CXXMethodDecl>(MethodDecl->getFirstDecl());
18223 if (MethodDecl->isDefaulted() && !MethodDecl->isDeleted()) {
18224 if (MethodDecl->isCopyAssignmentOperator())
18226 else if (MethodDecl->isMoveAssignmentOperator())
18229 }
else if (isa<CXXConversionDecl>(MethodDecl) &&
18230 MethodDecl->getParent()->isLambda()) {
18232 cast<CXXConversionDecl>(MethodDecl->getFirstDecl());
18237 }
else if (MethodDecl->isVirtual() &&
getLangOpts().AppleKext)
18241 if (
Func->isDefaulted() && !
Func->isDeleted()) {
18249 if (
Func->isImplicitlyInstantiable()) {
18251 Func->getTemplateSpecializationKindForInstantiation();
18253 bool FirstInstantiation = PointOfInstantiation.
isInvalid();
18254 if (FirstInstantiation) {
18255 PointOfInstantiation =
Loc;
18256 if (
auto *MSI =
Func->getMemberSpecializationInfo())
18257 MSI->setPointOfInstantiation(
Loc);
18260 Func->setTemplateSpecializationKind(TSK, PointOfInstantiation);
18265 PointOfInstantiation =
Loc;
18269 Func->isConstexpr()) {
18270 if (isa<CXXRecordDecl>(
Func->getDeclContext()) &&
18271 cast<CXXRecordDecl>(
Func->getDeclContext())->isLocalClass() &&
18274 std::make_pair(
Func, PointOfInstantiation));
18275 else if (
Func->isConstexpr())
18281 Func->setInstantiationIsPending(
true);
18283 std::make_pair(
Func, PointOfInstantiation));
18284 if (llvm::isTimeTraceVerbose()) {
18285 llvm::timeTraceAddInstantEvent(
"DeferInstantiation", [&] {
18287 llvm::raw_string_ostream
OS(Name);
18299 for (
auto *i :
Func->redecls()) {
18300 if (!i->isUsed(
false) && i->isImplicitlyInstantiable())
18313 Constructor->isImmediateFunction()
18318 if (
Init->isInClassMemberInitializer())
18320 MarkDeclarationsReferencedInExpr(Init->getInit());
18341 if (
LangOpts.OffloadImplicitHostDeviceTemplates &&
LangOpts.CUDAIsDevice &&
18346 if (OdrUse == OdrUseContext::Used && !
Func->isUsed(
false)) {
18348 if (!
Func->isDefined()) {
18349 if (mightHaveNonExternalLinkage(
Func))
18351 else if (
Func->getMostRecentDecl()->isInlined() &&
18353 !
Func->getMostRecentDecl()->hasAttr<GNUInlineAttr>())
18372 if (
auto *Dtor = dyn_cast<CXXDestructorDecl>(
Func)) {
18374 if (
Parent->getNumVBases() > 0 && !Dtor->getBody())
18392 const unsigned *
const FunctionScopeIndexToStopAt =
nullptr) {
18395 VarDecl *Var =
V->getPotentiallyDecomposedVarDecl();
18396 assert(Var &&
"expected a capturable variable");
18406 QualType CaptureType, DeclRefType;
18412 DeclRefType, FunctionScopeIndexToStopAt);
18428 << llvm::to_underlying(UserTarget);
18431 ? diag::note_cuda_const_var_unpromoted
18432 : diag::note_cuda_host_var);
18435 !Var->
hasAttr<CUDASharedAttr>() &&
18451 (!FD || (!FD->getDescribedFunctionTemplate() &&
18463 unsigned CapturingScopeIndex) {
18474 if (isa<ParmVarDecl>(var) &&
18475 isa<TranslationUnitDecl>(VarDC))
18488 unsigned ValueKind = isa<BindingDecl>(var) ? 1 : 0;
18489 unsigned ContextKind = 3;
18490 if (isa<CXXMethodDecl>(VarDC) &&
18491 cast<CXXRecordDecl>(VarDC->
getParent())->isLambda()) {
18493 }
else if (isa<FunctionDecl>(VarDC)) {
18495 }
else if (isa<BlockDecl>(VarDC)) {
18499 S.
Diag(loc, diag::err_reference_to_local_in_enclosing_context)
18500 << var << ValueKind << ContextKind << VarDC;
18501 S.
Diag(var->getLocation(), diag::note_entity_declared_at)
18510 bool &SubCapturesAreNested,
18516 SubCapturesAreNested =
true;
18533 !(isa<LambdaScopeInfo>(CSI) &&
18534 !cast<LambdaScopeInfo>(CSI)->lambdaCaptureShouldBeConst()) &&
18535 !(isa<CapturedRegionScopeInfo>(CSI) &&
18536 cast<CapturedRegionScopeInfo>(CSI)->CapRegionKind ==
CR_OpenMP))
18568 assert((isa<VarDecl, BindingDecl>(Var)) &&
18569 "Only variables and structured bindings can be captured");
18571 bool IsBlock = isa<BlockScopeInfo>(CSI);
18572 bool IsLambda = isa<LambdaScopeInfo>(CSI);
18580 S.
Diag(
Loc, diag::err_lambda_capture_anonymous_var);
18589 S.
Diag(
Loc, diag::err_ref_vm_type);
18597 if (VTTy->getDecl()->hasFlexibleArrayMember()) {
18600 S.
Diag(
Loc, diag::err_ref_flexarray_type);
18602 S.
Diag(
Loc, diag::err_lambda_capture_flexarray_type) << Var;
18608 const bool HasBlocksAttr = Var->
hasAttr<BlocksAttr>();
18611 if (HasBlocksAttr && (IsLambda || isa<CapturedRegionScopeInfo>(CSI))) {
18613 S.
Diag(
Loc, diag::err_capture_block_variable) << Var << !IsLambda;
18622 S.
Diag(
Loc, diag::err_opencl_block_ref_block);
18626 if (isa<BindingDecl>(Var)) {
18633 ? diag::warn_cxx17_compat_capture_binding
18634 : diag::ext_capture_binding)
18648 bool ByRef =
false;
18654 if (BuildAndDiagnose) {
18655 S.
Diag(
Loc, diag::err_ref_array_type);
18666 if (BuildAndDiagnose) {
18667 S.
Diag(
Loc, diag::err_arc_autoreleasing_capture)
18683 if (BuildAndDiagnose) {
18685 S.
Diag(
Loc, diag::warn_block_capture_autoreleasing);
18686 S.
Diag(VarLoc, diag::note_declare_parameter_strong);
18691 const bool HasBlocksAttr = Var->
hasAttr<BlocksAttr>();
18700 DeclRefType = CaptureType;
18704 if (BuildAndDiagnose)
18714 const bool BuildAndDiagnose,
QualType &CaptureType,
QualType &DeclRefType,
18741 CaptureType = DeclRefType;
18744 if (BuildAndDiagnose)
18745 RSI->
addCapture(Var,
false, ByRef, RefersToCapturedVariable,
18755 const bool RefersToCapturedVariable,
18760 bool ByRef =
false;
18764 ByRef = (LSI->
ImpCaptureStyle == LambdaScopeInfo::ImpCap_LambdaByref);
18769 S.
Diag(
Loc, diag::err_wasm_ca_reference) << 0;
18800 if (!RefType->getPointeeType()->isFunctionType())
18807 if (BuildAndDiagnose) {
18808 S.
Diag(
Loc, diag::err_arc_autoreleasing_capture) << 1;
18818 if (!
Invalid && BuildAndDiagnose) {
18822 diag::err_capture_of_incomplete_or_sizeless_type,
18826 diag::err_capture_of_abstract_type))
18852 if (BuildAndDiagnose)
18853 LSI->
addCapture(Var,
false, ByRef, RefersToCapturedVariable,
18865 if (
T.isTriviallyCopyableType(
Context))
18869 if (!(RD = RD->getDefinition()))
18871 if (RD->hasSimpleCopyConstructor())
18873 if (RD->hasUserDeclaredCopyConstructor())
18875 if (Ctor->isCopyConstructor())
18876 return !Ctor->isDeleted();
18896 if (ShouldOfferCopyFix) {
18900 FixBuffer.assign({Separator, Var->
getName()});
18901 Sema.
Diag(VarInsertLoc, diag::note_lambda_variable_capture_fixit)
18906 FixBuffer.assign({Separator,
"&", Var->
getName()});
18907 Sema.
Diag(VarInsertLoc, diag::note_lambda_variable_capture_fixit)
18919 return !C.isThisCapture() && !C.isInitCapture();
18928 if (ShouldOfferCopyFix) {
18929 bool CanDefaultCopyCapture =
true;
18938 if (CanDefaultCopyCapture && llvm::none_of(LSI->
Captures, [](
Capture &
C) {
18939 return !C.isThisCapture() && !C.isInitCapture() && C.isCopyCapture();
18941 FixBuffer.assign({
"=", Separator});
18942 Sema.
Diag(DefaultInsertLoc, diag::note_lambda_default_capture_fixit)
18951 return !C.isInitCapture() && C.isReferenceCapture() &&
18952 !C.isThisCapture();
18954 FixBuffer.assign({
"&", Separator});
18955 Sema.
Diag(DefaultInsertLoc, diag::note_lambda_default_capture_fixit)
18964 QualType &DeclRefType,
const unsigned *
const FunctionScopeIndexToStopAt) {
18987 const auto *VD = dyn_cast<VarDecl>(Var);
18989 if (VD->isInitCapture())
18994 assert(VD &&
"Cannot capture a null variable");
18996 const unsigned MaxFunctionScopesIndex = FunctionScopeIndexToStopAt
19000 if (FunctionScopeIndexToStopAt) {
19001 assert(!
FunctionScopes.empty() &&
"No function scopes to stop at?");
19006 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(
FunctionScopes[FSIndex]);
19007 FSIndex && LSI && !LSI->AfterParameterList)
19009 assert(MaxFunctionScopesIndex <= FSIndex &&
19010 "FunctionScopeIndexToStopAt should be no greater than FSIndex into "
19011 "FunctionScopes.");
19012 while (FSIndex != MaxFunctionScopesIndex) {
19020 bool IsGlobal = !VD->hasLocalStorage();
19021 if (IsGlobal && !(
LangOpts.OpenMP &&
19022 OpenMP().isOpenMPCapturedDecl(Var,
true,
19023 MaxFunctionScopesIndex)))
19026 if (isa<VarDecl>(Var))
19037 CaptureType = Var->
getType();
19039 bool Nested =
false;
19041 unsigned FunctionScopesIndex = MaxFunctionScopesIndex;
19046 LSI = dyn_cast_or_null<LambdaScopeInfo>(
19049 bool IsInScopeDeclarationContext =
19060 if (IsInScopeDeclarationContext &&
19061 FunctionScopesIndex == MaxFunctionScopesIndex && VarDC == DC)
19067 !IsInScopeDeclarationContext
19070 BuildAndDiagnose, *
this);
19076 FunctionScopesIndex = MaxFunctionScopesIndex - 1;
19095 if (
const auto *Parm = dyn_cast<ParmVarDecl>(Var);
19096 Parm && Parm->getDeclContext() == DC)
19104 if (BuildAndDiagnose) {
19107 Diag(ExprLoc, diag::err_lambda_impcap) << Var;
19122 if (
ParmVarDecl *PVD = dyn_cast_or_null<ParmVarDecl>(Var))
19123 QTy = PVD->getOriginalType();
19128 if (
auto *RSI = dyn_cast<CapturedRegionScopeInfo>(CSI)) {
19134 if (isa<BindingDecl>(Var)) {
19135 if (BuildAndDiagnose) {
19136 Diag(ExprLoc, diag::err_capture_binding_openmp) << Var;
19142 Var, RSI->OpenMPLevel, RSI->OpenMPCaptureLevel);
19147 if (IsOpenMPPrivateDecl != OMPC_unknown &&
19150 if (
ParmVarDecl *PVD = dyn_cast_or_null<ParmVarDecl>(Var))
19151 QTy = PVD->getOriginalType();
19153 E =
OpenMP().getNumberOfConstructScopes(RSI->OpenMPLevel);
19155 auto *OuterRSI = cast<CapturedRegionScopeInfo>(
19157 assert(RSI->OpenMPLevel == OuterRSI->OpenMPLevel &&
19158 "Wrong number of captured regions associated with the "
19159 "OpenMP construct.");
19164 IsOpenMPPrivateDecl != OMPC_private &&
19166 RSI->OpenMPCaptureLevel);
19170 Var, RSI->OpenMPLevel, RSI->OpenMPCaptureLevel);
19176 OpenMP().adjustOpenMPTargetScopeIndex(FunctionScopesIndex,
19179 if (IsTargetCap || IsOpenMPPrivateDecl == OMPC_private ||
19180 (IsGlobal && !IsGlobalCap)) {
19181 Nested = !IsTargetCap;
19196 if (BuildAndDiagnose) {
19197 Diag(ExprLoc, diag::err_lambda_impcap) << Var;
19199 auto *LSI = cast<LambdaScopeInfo>(CSI);
19219 FunctionScopesIndex--;
19220 if (IsInScopeDeclarationContext)
19222 }
while (!VarDC->
Equals(DC));
19230 for (
unsigned I = ++FunctionScopesIndex, N = MaxFunctionScopesIndex + 1; I != N;
19243 if (
Invalid && !BuildAndDiagnose)
19248 DeclRefType, Nested, *
this,
Invalid);
19252 RSI, Var, ExprLoc, BuildAndDiagnose, CaptureType, DeclRefType, Nested,
19253 Kind, I == N - 1, *
this,
Invalid);
19259 DeclRefType, Nested, Kind, EllipsisLoc,
19264 if (
Invalid && !BuildAndDiagnose)
19276 DeclRefType,
nullptr);
19283 false, CaptureType,
19284 DeclRefType,
nullptr);
19288 assert(Var &&
"Null value cannot be captured");
19295 false, CaptureType,
19296 DeclRefType,
nullptr))
19299 return DeclRefType;
19307class CopiedTemplateArgs {
19311 template<
typename RefExpr>
19312 CopiedTemplateArgs(RefExpr *
E) : HasArgs(
E->hasExplicitTemplateArgs()) {
19314 E->copyTemplateArgumentsInto(TemplateArgStorage);
19317#ifdef __has_cpp_attribute
19318#
if __has_cpp_attribute(clang::lifetimebound)
19319 [[clang::lifetimebound]]
19323 return HasArgs ? &TemplateArgStorage :
nullptr;
19349 auto Rebuild = [&](
Expr *Sub) {
19354 auto IsPotentialResultOdrUsed = [&](
NamedDecl *
D) {
19357 auto *VD = dyn_cast<VarDecl>(
D);
19380 llvm_unreachable(
"unexpected non-odr-use-reason");
19384 if (VD->getType()->isReferenceType())
19386 if (
auto *RD = VD->getType()->getAsCXXRecordDecl())
19387 if (RD->hasDefinition() && RD->hasMutableFields())
19389 if (!VD->isUsableInConstantExpressions(S.
Context))
19394 if (VD->getType()->isReferenceType())
19402 auto MarkNotOdrUsed = [&] {
19405 LSI->markVariableExprAsNonODRUsed(
E);
19412 case Expr::DeclRefExprClass: {
19413 auto *DRE = cast<DeclRefExpr>(
E);
19414 if (DRE->isNonOdrUse() || IsPotentialResultOdrUsed(DRE->getDecl()))
19420 S.
Context, DRE->getQualifierLoc(), DRE->getTemplateKeywordLoc(),
19421 DRE->getDecl(), DRE->refersToEnclosingVariableOrCapture(),
19422 DRE->getNameInfo(), DRE->getType(), DRE->getValueKind(),
19423 DRE->getFoundDecl(), CopiedTemplateArgs(DRE), NOUR);
19426 case Expr::FunctionParmPackExprClass: {
19427 auto *FPPE = cast<FunctionParmPackExpr>(
E);
19431 if (IsPotentialResultOdrUsed(
D))
19442 case Expr::ArraySubscriptExprClass: {
19443 auto *ASE = cast<ArraySubscriptExpr>(
E);
19448 if (!
Base.isUsable())
19450 Expr *LHS = ASE->getBase() == ASE->getLHS() ?
Base.get() : ASE->getLHS();
19451 Expr *RHS = ASE->getBase() == ASE->getRHS() ?
Base.get() : ASE->getRHS();
19454 ASE->getRBracketLoc());
19457 case Expr::MemberExprClass: {
19458 auto *ME = cast<MemberExpr>(
E);
19461 if (isa<FieldDecl>(ME->getMemberDecl())) {
19463 if (!
Base.isUsable())
19466 S.
Context,
Base.get(), ME->isArrow(), ME->getOperatorLoc(),
19467 ME->getQualifierLoc(), ME->getTemplateKeywordLoc(),
19468 ME->getMemberDecl(), ME->getFoundDecl(), ME->getMemberNameInfo(),
19469 CopiedTemplateArgs(ME), ME->getType(), ME->getValueKind(),
19470 ME->getObjectKind(), ME->isNonOdrUse());
19473 if (ME->getMemberDecl()->isCXXInstanceMember())
19478 if (ME->isNonOdrUse() || IsPotentialResultOdrUsed(ME->getMemberDecl()))
19484 S.
Context, ME->getBase(), ME->isArrow(), ME->getOperatorLoc(),
19485 ME->getQualifierLoc(), ME->getTemplateKeywordLoc(), ME->getMemberDecl(),
19486 ME->getFoundDecl(), ME->getMemberNameInfo(), CopiedTemplateArgs(ME),
19487 ME->getType(), ME->getValueKind(), ME->getObjectKind(), NOUR);
19490 case Expr::BinaryOperatorClass: {
19491 auto *BO = cast<BinaryOperator>(
E);
19492 Expr *LHS = BO->getLHS();
19493 Expr *RHS = BO->getRHS();
19495 if (BO->getOpcode() == BO_PtrMemD) {
19497 if (!Sub.isUsable())
19499 BO->setLHS(Sub.get());
19501 }
else if (BO->getOpcode() == BO_Comma) {
19503 if (!Sub.isUsable())
19505 BO->setRHS(Sub.get());
19513 case Expr::ParenExprClass: {
19514 auto *PE = cast<ParenExpr>(
E);
19516 if (!Sub.isUsable())
19518 return S.
ActOnParenExpr(PE->getLParen(), PE->getRParen(), Sub.get());
19523 case Expr::ConditionalOperatorClass: {
19524 auto *CO = cast<ConditionalOperator>(
E);
19534 LHS = CO->getLHS();
19536 RHS = CO->getRHS();
19538 CO->getCond(), LHS.
get(), RHS.
get());
19543 case Expr::UnaryOperatorClass: {
19544 auto *UO = cast<UnaryOperator>(
E);
19545 if (UO->getOpcode() != UO_Extension)
19548 if (!Sub.isUsable())
19550 return S.
BuildUnaryOp(
nullptr, UO->getOperatorLoc(), UO_Extension,
19557 case Expr::GenericSelectionExprClass: {
19558 auto *GSE = cast<GenericSelectionExpr>(
E);
19561 bool AnyChanged =
false;
19562 for (
Expr *OrigAssocExpr : GSE->getAssocExprs()) {
19563 ExprResult AssocExpr = Rebuild(OrigAssocExpr);
19567 AssocExprs.push_back(AssocExpr.
get());
19570 AssocExprs.push_back(OrigAssocExpr);
19574 void *ExOrTy =
nullptr;
19575 bool IsExpr = GSE->isExprPredicate();
19577 ExOrTy = GSE->getControllingExpr();
19579 ExOrTy = GSE->getControllingType();
19581 GSE->getGenericLoc(), GSE->getDefaultLoc(),
19582 GSE->getRParenLoc(), IsExpr, ExOrTy,
19583 GSE->getAssocTypeSourceInfos(), AssocExprs)
19591 case Expr::ChooseExprClass: {
19592 auto *CE = cast<ChooseExpr>(
E);
19602 if (!LHS.
get() && !RHS.
get())
19605 LHS = CE->getLHS();
19607 RHS = CE->getRHS();
19610 RHS.
get(), CE->getRParenLoc());
19614 case Expr::ConstantExprClass: {
19615 auto *CE = cast<ConstantExpr>(
E);
19617 if (!Sub.isUsable())
19624 case Expr::ImplicitCastExprClass: {
19625 auto *ICE = cast<ImplicitCastExpr>(
E);
19629 switch (ICE->getCastKind()) {
19631 case CK_DerivedToBase:
19632 case CK_UncheckedDerivedToBase: {
19633 ExprResult Sub = Rebuild(ICE->getSubExpr());
19634 if (!Sub.isUsable())
19638 ICE->getValueKind(), &
Path);
19697 for (
Expr *
E : LocalMaybeODRUseExprs) {
19698 if (
auto *DRE = dyn_cast<DeclRefExpr>(
E)) {
19700 DRE->getLocation(), *
this);
19701 }
else if (
auto *ME = dyn_cast<MemberExpr>(
E)) {
19704 }
else if (
auto *FP = dyn_cast<FunctionParmPackExpr>(
E)) {
19708 llvm_unreachable(
"Unexpected expression");
19713 "MarkVarDeclODRUsed failed to cleanup MaybeODRUseExprs?");
19722 const bool RefersToEnclosingScope =
19725 if (RefersToEnclosingScope) {
19740 assert(
E &&
"Capture variable should be used in an expression.");
19751 assert((!
E || isa<DeclRefExpr>(
E) || isa<MemberExpr>(
E) ||
19752 isa<FunctionParmPackExpr>(
E)) &&
19753 "Invalid Expr argument to DoMarkVarDeclReferenced");
19764 bool UsableInConstantExpr =
19776 bool NeededForConstantEvaluation =
19779 bool NeedDefinition =
19780 OdrUse == OdrUseContext::Used || NeededForConstantEvaluation;
19782 assert(!isa<VarTemplatePartialSpecializationDecl>(Var) &&
19783 "Can't instantiate a partial template specialization.");
19789 !isa<VarTemplateSpecializationDecl>(Var))
19800 bool TryInstantiating =
19804 if (TryInstantiating) {
19807 bool FirstInstantiation = PointOfInstantiation.
isInvalid();
19808 if (FirstInstantiation) {
19809 PointOfInstantiation =
Loc;
19811 MSI->setPointOfInstantiation(PointOfInstantiation);
19817 if (UsableInConstantExpr) {
19826 if (
auto *DRE = dyn_cast_or_null<DeclRefExpr>(
E))
19827 DRE->setDecl(DRE->getDecl());
19828 else if (
auto *ME = dyn_cast_or_null<MemberExpr>(
E))
19829 ME->setMemberDecl(ME->getMemberDecl());
19830 }
else if (FirstInstantiation) {
19832 .push_back(std::make_pair(Var, PointOfInstantiation));
19834 bool Inserted =
false;
19836 auto Iter = llvm::find_if(
19838 return P.first == Var;
19840 if (
Iter != I.end()) {
19853 if (isa<VarTemplateSpecializationDecl>(Var) && !Inserted)
19855 .push_back(std::make_pair(Var, PointOfInstantiation));
19879 if (
DeclRefExpr *DRE = dyn_cast_or_null<DeclRefExpr>(
E))
19880 if (DRE->isNonOdrUse())
19882 if (
MemberExpr *ME = dyn_cast_or_null<MemberExpr>(
E))
19883 if (ME->isNonOdrUse())
19887 case OdrUseContext::None:
19890 assert((!
E || isa<FunctionParmPackExpr>(
E) ||
19892 "missing non-odr-use marking for unevaluated decl ref");
19895 case OdrUseContext::FormallyOdrUsed:
19900 case OdrUseContext::Used:
19909 case OdrUseContext::Dependent:
19927 if (OdrUse == OdrUseContext::Used) {
19928 QualType CaptureType, DeclRefType;
19934 }
else if (OdrUse == OdrUseContext::Dependent) {
19950 auto *ID = dyn_cast<DeclRefExpr>(
E);
19951 if (!ID || ID->isTypeDependent() || !ID->refersToEnclosingVariableOrCapture())
19958 auto IsDependent = [&]() {
19960 auto *LSI = dyn_cast<sema::LambdaScopeInfo>(
Scope);
19965 LSI->AfterParameterList)
19968 const auto *MD = LSI->CallOperator;
19969 if (MD->getType().isNull())
19973 if (!Ty || !MD->isExplicitObjectMemberFunction() ||
19977 if (
auto *
C = LSI->CaptureMap.count(
D) ? &LSI->getCapture(
D) :
nullptr) {
19978 if (
C->isCopyCapture())
19983 if (LSI->ImpCaptureStyle == LambdaScopeInfo::ImpCap_LambdaByval)
19989 ID->setCapturedByCopyInLambdaWithExplicitObjectParameter(
19995 bool MightBeOdrUse,
20000 if (
VarDecl *Var = dyn_cast<VarDecl>(
D)) {
20026 bool IsVirtualCall = MD->
isVirtual() &&
20028 if (!IsVirtualCall)
20043 bool OdrUse =
true;
20044 if (
const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(
E->getDecl()))
20045 if (Method->isVirtual() &&
20049 if (
auto *FD = dyn_cast<FunctionDecl>(
E->getDecl())) {
20054 !FD->isDependentContext())
20068 bool MightBeOdrUse =
true;
20070 if (
CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(
E->getMemberDecl()))
20071 if (Method->isPureVirtual())
20072 MightBeOdrUse =
false;
20075 E->getMemberLoc().isValid() ?
E->getMemberLoc() :
E->
getBeginLoc();
20091 bool MightBeOdrUse) {
20092 if (MightBeOdrUse) {
20093 if (
auto *VD = dyn_cast<VarDecl>(
D)) {
20098 if (
auto *FD = dyn_cast<FunctionDecl>(
D)) {
20124bool MarkReferencedDecls::TraverseTemplateArgument(
20142 MarkReferencedDecls Marker(*
this,
Loc);
20143 Marker.TraverseType(
T);
20149class EvaluatedExprMarker :
public UsedDeclVisitor<EvaluatedExprMarker> {
20152 bool SkipLocalVariables;
20155 EvaluatedExprMarker(
Sema &S,
bool SkipLocalVariables,
20157 : Inherited(S), SkipLocalVariables(SkipLocalVariables), StopAt(StopAt) {}
20163 void Visit(
Expr *
E) {
20164 if (llvm::is_contained(StopAt,
E))
20166 Inherited::Visit(
E);
20176 if (SkipLocalVariables) {
20177 if (
VarDecl *VD = dyn_cast<VarDecl>(
E->getDecl()))
20178 if (VD->hasLocalStorage())
20190 Visit(
E->getBase());
20196 bool SkipLocalVariables,
20198 EvaluatedExprMarker(*
this, SkipLocalVariables, StopAt).Visit(
E);
20220 if (
auto *VD = dyn_cast_or_null<VarDecl>(
20222 if (VD->isConstexpr() ||
20223 (VD->isStaticDataMember() && VD->isFirstDecl() && !VD->isInline()))
20296 class CallReturnIncompleteDiagnoser :
public TypeDiagnoser {
20302 : FD(FD), CE(CE) { }
20306 S.
Diag(
Loc, diag::err_call_incomplete_return)
20311 S.
Diag(
Loc, diag::err_call_function_incomplete_return)
20316 } Diagnoser(FD, CE);
20329 unsigned diagnostic = diag::warn_condition_is_assignment;
20330 bool IsOrAssign =
false;
20333 if (Op->getOpcode() != BO_Assign && Op->getOpcode() != BO_OrAssign)
20336 IsOrAssign = Op->getOpcode() == BO_OrAssign;
20344 if (
ObjC().isSelfExpr(Op->getLHS()) && ME->getMethodFamily() ==
OMF_init)
20345 diagnostic = diag::warn_condition_is_idiomatic_assignment;
20349 diagnostic = diag::warn_condition_is_idiomatic_assignment;
20352 Loc = Op->getOperatorLoc();
20354 if (Op->getOperator() != OO_Equal && Op->getOperator() != OO_PipeEqual)
20357 IsOrAssign = Op->getOperator() == OO_PipeEqual;
20358 Loc = Op->getOperatorLoc();
20370 Diag(
Loc, diag::note_condition_assign_silence)
20375 Diag(
Loc, diag::note_condition_or_assign_to_comparison)
20378 Diag(
Loc, diag::note_condition_assign_to_comparison)
20396 if (opE->getOpcode() == BO_EQ &&
20397 opE->getLHS()->IgnoreParenImpCasts()->isModifiableLvalue(
Context)
20403 Diag(
Loc, diag::note_equality_comparison_silence)
20406 Diag(
Loc, diag::note_equality_comparison_to_assign)
20412 bool IsConstexpr) {
20414 if (
ParenExpr *parenE = dyn_cast<ParenExpr>(
E))
20432 Diag(
Loc, diag::err_typecheck_statement_requires_scalar)
20436 CheckBoolLikeConversion(
E,
Loc);
20482 struct RebuildUnknownAnyFunction
20483 :
StmtVisitor<RebuildUnknownAnyFunction, ExprResult> {
20487 RebuildUnknownAnyFunction(
Sema &S) : S(S) {}
20490 llvm_unreachable(
"unexpected statement!");
20501 template <
class T>
ExprResult rebuildSugarExpr(
T *
E) {
20505 Expr *SubExpr = SubResult.
get();
20506 E->setSubExpr(SubExpr);
20514 return rebuildSugarExpr(
E);
20518 return rebuildSugarExpr(
E);
20525 Expr *SubExpr = SubResult.
get();
20526 E->setSubExpr(SubExpr);
20534 if (!isa<FunctionDecl>(VD))
return VisitExpr(
E);
20540 !(isa<CXXMethodDecl>(VD) &&
20541 cast<CXXMethodDecl>(VD)->isInstance()))
20548 return resolveDecl(
E,
E->getMemberDecl());
20552 return resolveDecl(
E,
E->getDecl());
20570 struct RebuildUnknownAnyExpr
20571 :
StmtVisitor<RebuildUnknownAnyExpr, ExprResult> {
20582 llvm_unreachable(
"unexpected statement!");
20596 template <
class T>
ExprResult rebuildSugarExpr(
T *
E) {
20599 Expr *SubExpr = SubResult.
get();
20600 E->setSubExpr(SubExpr);
20608 return rebuildSugarExpr(
E);
20612 return rebuildSugarExpr(
E);
20618 S.
Diag(
E->getOperatorLoc(), diag::err_unknown_any_addrof)
20623 if (isa<CallExpr>(
E->getSubExpr())) {
20624 S.
Diag(
E->getOperatorLoc(), diag::err_unknown_any_addrof_call)
20637 E->setSubExpr(SubResult.
get());
20646 return resolveDecl(
E,
E->getMemberDecl());
20650 return resolveDecl(
E,
E->getDecl());
20657 Expr *CalleeExpr =
E->getCallee();
20661 FK_FunctionPointer,
20668 assert(isa<CXXMemberCallExpr>(
E) || isa<CXXOperatorCallExpr>(
E));
20669 Kind = FK_MemberFunction;
20673 Kind = FK_FunctionPointer;
20676 Kind = FK_BlockPointer;
20682 unsigned diagID = diag::err_func_returning_array_function;
20683 if (Kind == FK_BlockPointer)
20684 diagID = diag::err_block_returning_array_function;
20720 if (ParamTypes.empty() && Proto->
isVariadic()) {
20721 ArgTypes.reserve(
E->getNumArgs());
20722 for (
unsigned i = 0, e =
E->getNumArgs(); i != e; ++i) {
20725 ParamTypes = ArgTypes;
20736 case FK_MemberFunction:
20740 case FK_FunctionPointer:
20744 case FK_BlockPointer:
20750 ExprResult CalleeResult = Visit(CalleeExpr);
20752 E->setCallee(CalleeResult.
get());
20769 Method->setReturnType(DestType);
20781 if (
E->getCastKind() == CK_FunctionToPointerDecay) {
20795 }
else if (
E->getCastKind() == CK_LValueToRValue) {
20799 assert(isa<BlockPointerType>(
E->
getType()));
20812 llvm_unreachable(
"Unhandled cast type!");
20845 if (DRE && Proto && Proto->getParamTypes().empty() && Proto->isVariadic()) {
20849 FD->getNameInfo().getName(), DestType, FD->getTypeSourceInfo(),
20851 false , FD->hasPrototype(),
20854 if (FD->getQualifier())
20858 for (
const auto &AI : FT->param_types()) {
20862 Params.push_back(Param);
20864 NewFD->setParams(Params);
20871 if (MD->isInstance()) {
20881 }
else if (isa<VarDecl>(VD)) {
20911 diag::err_typecheck_cast_to_incomplete))
20926 return RebuildUnknownAnyExpr(*
this, ToType).Visit(
E);
20933 ExplicitCastExpr *castArg = dyn_cast<ExplicitCastExpr>(arg->IgnoreParens());
20942 assert(!arg->hasPlaceholderType());
20954 unsigned diagID = diag::err_uncasted_use_of_unknown_any;
20957 if (
CallExpr *call = dyn_cast<CallExpr>(
E)) {
20958 E = call->getCallee();
20959 diagID = diag::err_uncasted_call_of_unknown_any;
20968 loc = ref->getLocation();
20969 d = ref->getDecl();
20970 }
else if (
MemberExpr *mem = dyn_cast<MemberExpr>(
E)) {
20971 loc = mem->getMemberLoc();
20972 d = mem->getMemberDecl();
20974 diagID = diag::err_uncasted_call_of_unknown_any;
20975 loc = msg->getSelectorStartLoc();
20976 d = msg->getMethodDecl();
20978 S.
Diag(loc, diag::err_uncasted_send_to_unknown_any_method)
20979 <<
static_cast<unsigned>(msg->isClassMessage()) << msg->getSelector()
21006 if (!placeholderType)
return E;
21008 switch (placeholderType->
getKind()) {
21009 case BuiltinType::UnresolvedTemplate: {
21010 auto *ULE = cast<UnresolvedLookupExpr>(
E);
21015 const bool IsTypeAliasTemplateDecl = isa<TypeAliasTemplateDecl>(Temp);
21018 Diag(NameInfo.
getLoc(), diag::err_template_kw_refers_to_type_template)
21020 <<
Loc.getSourceRange() << IsTypeAliasTemplateDecl;
21022 Diag(NameInfo.
getLoc(), diag::err_template_kw_refers_to_type_template)
21024 << IsTypeAliasTemplateDecl;
21026 << IsTypeAliasTemplateDecl;
21032 case BuiltinType::Overload: {
21052 case BuiltinType::BoundMember: {
21057 if (isa<CXXPseudoDestructorExpr>(BME)) {
21058 PD =
PDiag(diag::err_dtor_expr_without_call) << 1;
21059 }
else if (
const auto *ME = dyn_cast<MemberExpr>(BME)) {
21060 if (ME->getMemberNameInfo().getName().getNameKind() ==
21062 PD =
PDiag(diag::err_dtor_expr_without_call) << 0;
21070 case BuiltinType::ARCUnbridgedCast: {
21077 case BuiltinType::UnknownAny:
21081 case BuiltinType::PseudoObject:
21084 case BuiltinType::BuiltinFn: {
21088 auto *FD = cast<FunctionDecl>(DRE->
getDecl());
21089 unsigned BuiltinID = FD->getBuiltinID();
21090 if (BuiltinID == Builtin::BI__noop) {
21092 CK_BuiltinFnToFnPtr)
21105 ? diag::err_use_of_unaddressable_function
21106 : diag::warn_cxx20_compat_use_of_unaddressable_function);
21107 if (FD->isImplicitlyInstantiable()) {
21134 case BuiltinType::IncompleteMatrixIdx:
21138 diag::err_matrix_incomplete_index);
21142 case BuiltinType::ArraySection:
21144 << cast<ArraySectionExpr>(
E)->isOMPArraySection();
21148 case BuiltinType::OMPArrayShaping:
21151 case BuiltinType::OMPIterator:
21155#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
21156 case BuiltinType::Id:
21157#include "clang/Basic/OpenCLImageTypes.def"
21158#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
21159 case BuiltinType::Id:
21160#include "clang/Basic/OpenCLExtensionTypes.def"
21161#define SVE_TYPE(Name, Id, SingletonId) \
21162 case BuiltinType::Id:
21163#include "clang/Basic/AArch64SVEACLETypes.def"
21164#define PPC_VECTOR_TYPE(Name, Id, Size) \
21165 case BuiltinType::Id:
21166#include "clang/Basic/PPCTypes.def"
21167#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
21168#include "clang/Basic/RISCVVTypes.def"
21169#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
21170#include "clang/Basic/WebAssemblyReferenceTypes.def"
21171#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
21172#include "clang/Basic/AMDGPUTypes.def"
21173#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
21174#include "clang/Basic/HLSLIntangibleTypes.def"
21175#define BUILTIN_TYPE(Id, SingletonId) case BuiltinType::Id:
21176#define PLACEHOLDER_TYPE(Id, SingletonId)
21177#include "clang/AST/BuiltinTypes.def"
21181 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 void DetectPrecisionLossInComplexDivision(Sema &S, SourceLocation OpLoc, Expr *Operand)
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)
static FieldDecl * FindFieldDeclInstantiationPattern(const ASTContext &Ctx, FieldDecl *Field)
ExprResult PerformCastFn(Sema &S, Expr *operand, QualType toType)
static void checkArithmeticNull(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompare)
static bool IsReadonlyMessage(Expr *E, Sema &S)
static std::optional< bool > isTautologicalBoundsCheck(Sema &S, const Expr *LHS, const Expr *RHS, BinaryOperatorKind Opc)
Detect patterns ptr + size >= ptr and ptr + size < ptr, where ptr is a pointer and size is an unsigne...
static void buildLambdaCaptureFixit(Sema &Sema, LambdaScopeInfo *LSI, ValueDecl *Var)
Create up to 4 fix-its for explicit reference and value capture of Var or default capture.
static void tryImplicitlyCaptureThisIfImplicitMemberFunctionAccessWithDependentArgs(Sema &S, const UnresolvedMemberExpr *const UME, SourceLocation CallLoc)
static bool checkPtrAuthTypeDiscriminatorOperandType(Sema &S, QualType T, SourceLocation Loc, SourceRange ArgRange)
static 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 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 HLSL constructs.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis for OpenMP constructs and clauses.
This file declares semantic analysis for expressions involving.
static bool isInvalid(LocType Loc, bool *Invalid)
Defines the SourceManager interface.
Defines various enumerations that describe declaration and type specifiers.
static QualType getPointeeType(const MemRegion *R)
Defines the clang::TypeLoc interface and its subclasses.
Defines enumerations for the type traits support.
C Language Family Type Representation.
@ Open
The standard open() call: int open(const char *path, int oflag, ...);.
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
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 getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType, const Attr *attr=nullptr) const
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...
const QualType GetHigherPrecisionFPType(QualType ElementType) const
bool typesAreBlockPointerCompatible(QualType, QualType)
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
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...
FieldDecl * getInstantiatedFromUnnamedFieldDecl(FieldDecl *Field) const
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
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
Recursive AST visitor that supports extension via dynamic dispatch.
virtual bool VisitStmt(MaybeConst< Stmt > *S)
virtual bool TraverseTemplateArgument(const TemplateArgument &Arg)
Recursively visit a template argument and dispatch to the appropriate method for the argument type.
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
ParameterABI getABI() const
Return the ABI treatment of this parameter.
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
bool getNoReturnAttr() const
Determine whether this function type includes the GNU noreturn attribute.
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...
@ CX_Promoted
Implementation of complex division using algebraic formulas at higher precision.
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
bool isProducedByFoldExpansion() const
Expr * getExpr(unsigned Init)
static ParenListExpr * Create(const ASTContext &Ctx, SourceLocation LParenLoc, ArrayRef< Expr * > Exprs, SourceLocation RParenLoc)
Create a paren list.
unsigned getNumExprs() const
Return the number of expressions in this paren list.
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
bool isAddressSpaceOverlapping(QualType T, const ASTContext &Ctx) const
Returns true if address space qualifiers overlap with T address space qualifiers.
QualType withConst() const
void addConst()
Add the const type qualifier to this QualType.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
LangAS getAddressSpace() const
Return the address space of this type.
bool hasNonTrivialToPrimitiveDestructCUnion() const
Check if this is or contains a C union that is non-trivial to destruct, which is a union that has a m...
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
bool isCXX98PODType(const ASTContext &Context) const
Return true if this is a POD type according to the rules of the C++98 standard, regardless of the cur...
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
bool isWebAssemblyReferenceType() const
Returns true if it is a WebAssembly Reference Type.
QualType withCVRQualifiers(unsigned CVR) const
bool isCForbiddenLValueType() const
Determine whether expressions of the given type are forbidden from being lvalues in C.
bool isConstQualified() const
Determine whether this type is const-qualified.
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).
bool isAtLeastAsQualifiedAs(QualType Other, const ASTContext &Ctx) const
Determine whether this type is at least as qualified as the other given type, requiring exact equalit...
Qualifiers getLocalQualifiers() const
Retrieve the set of qualifiers local to this particular QualType instance, not including any qualifie...
bool hasNonTrivialToPrimitiveDefaultInitializeCUnion() const
Check if this is or contains a C union that is non-trivial to default-initialize, which is a union th...
The collection of all-type qualifiers we support.
unsigned getCVRQualifiers() const
void removeCVRQualifiers(unsigned mask)
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
@ OCL_Weak
Reading or writing from this object requires a barrier call.
@ OCL_Autoreleasing
Assigning into this object requires a lifetime extension.
void removeObjCLifetime()
bool compatiblyIncludes(Qualifiers other, const ASTContext &Ctx) const
Determines if these qualifiers compatibly include another set.
static bool isAddressSpaceSupersetOf(LangAS A, LangAS B, const ASTContext &Ctx)
Returns true if address space A is equal to or a superset of B.
void removeAddressSpace()
void setAddressSpace(LangAS space)
ObjCLifetime getObjCLifetime() const
Qualifiers withoutObjCLifetime() const
Qualifiers withoutObjCGCAttr() const
LangAS getAddressSpace() const
bool compatiblyIncludesObjCLifetime(Qualifiers other) const
Determines if these qualifiers compatibly include another set of qualifiers from the narrow perspecti...
Represents a struct/union/class.
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)
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.
ExprResult ActOnOutParamExpr(ParmVarDecl *Param, Expr *Arg)
void emitLogicalOperatorFixIt(Expr *LHS, Expr *RHS, BinaryOperatorKind Opc)
QualType handleVectorBinOpConversion(ExprResult &LHS, ExprResult &RHS, QualType LHSType, QualType RHSType, bool IsCompAssign)
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.
ExprResult ActOnUnaryOp(Scope *S, SourceLocation OpLoc, tok::TokenKind Op, Expr *Input, bool IsAfterAmp=false)
Unary Operators. 'Tok' is the token for the operator.
bool RequireCompleteSizedExprType(Expr *E, unsigned DiagID, const Ts &...Args)
ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp=false)
bool isAlwaysConstantEvaluatedContext() const
bool isExternalWithNoLinkageType(const ValueDecl *VD) const
Determine if VD, which must be a variable or function, is an external symbol that nonetheless can't b...
bool isAttrContext() const
void DiagnoseUnusedParameters(ArrayRef< ParmVarDecl * > Parameters)
Diagnose any unused parameters in the given sequence of ParmVarDecl pointers.
ExprResult IgnoredValueConversions(Expr *E)
IgnoredValueConversions - Given that an expression's result is syntactically ignored,...
bool RequireCompleteSizedType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupObjCImplicitSelfParam
Look up implicit 'self' parameter of an objective-c method.
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
void DiagnoseSentinelCalls(const NamedDecl *D, SourceLocation Loc, ArrayRef< Expr * > Args)
DiagnoseSentinelCalls - This routine checks whether a call or message-send is to a declaration with t...
ExprResult ActOnConstantExpression(ExprResult Res)
QualType CheckLogicalOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
bool DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, CorrectionCandidateCallback &CCC, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr, ArrayRef< Expr * > Args={}, DeclContext *LookupCtx=nullptr, TypoExpr **Out=nullptr)
Diagnose an empty lookup.
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()
void MarkDeclarationsReferencedInExpr(Expr *E, bool SkipLocalVariables=false, ArrayRef< const Expr * > StopAt={})
Mark any declarations that appear within this expression or any potentially-evaluated subexpressions ...
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)
bool needsRebuildOfDefaultArgOrInit() const
SourceLocation LocationOfExcessPrecisionNotSatisfied
SmallVector< sema::FunctionScopeInfo *, 4 > FunctionScopes
Stack containing information about each of the nested function, block, and method scopes that are cur...
PoppedFunctionScopePtr PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, const Decl *D=nullptr, QualType BlockType=QualType())
Pop a function (or block or lambda or captured region) scope from the stack.
Preprocessor & getPreprocessor() const
const ExpressionEvaluationContextRecord & currentEvaluationContext() const
Scope * getScopeForContext(DeclContext *Ctx)
Determines the active Scope associated with the given declaration context.
QualType GetSignedSizelessVectorType(QualType V)
bool CheckCXXThisCapture(SourceLocation Loc, bool Explicit=false, bool BuildAndDiagnose=true, const unsigned *const FunctionScopeIndexToStopAt=nullptr, bool ByCopy=false)
Make sure the value of 'this' is actually available in the current context, if it is a potentially ev...
llvm::SmallPtrSet< ConstantExpr *, 4 > FailedImmediateInvocations
ExprResult ActOnCharacterConstant(const Token &Tok, Scope *UDLScope=nullptr)
DefaultedComparisonKind getDefaultedComparisonKind(const FunctionDecl *FD)
ExprResult MaybeBindToTemporary(Expr *E)
MaybeBindToTemporary - If the passed in expression has a record type with a non-trivial destructor,...
void CheckCompleteDestructorVariant(SourceLocation CurrentLocation, CXXDestructorDecl *Dtor)
Do semantic checks to allow the complete destructor variant to be emitted when the destructor is defi...
void MarkCaptureUsedInEnclosingContext(ValueDecl *Capture, SourceLocation Loc, unsigned CapturingScopeIndex)
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.
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 CheckVectorLogicalOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
QualType InvalidOperands(SourceLocation Loc, ExprResult &LHS, ExprResult &RHS)
the following "Check" methods will return a valid/converted QualType or a null QualType (indicating a...
bool DiagIfReachable(SourceLocation Loc, ArrayRef< const Stmt * > Stmts, const PartialDiagnostic &PD)
Conditionally issue a diagnostic based on the statements's reachability analysis.
QualType CheckShiftOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc, bool IsCompAssign=false)
void AddOverloadCandidate(FunctionDecl *Function, DeclAccessPair FoundDecl, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, bool AllowExplicitConversion=false, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, ConversionSequenceList EarlyConversions={}, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false, bool HasMatchedPackOnParmToNonPackOnArg=false)
AddOverloadCandidate - Adds the given function to the set of candidate functions, using the given fun...
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)
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
ObjCMethodDecl * getCurMethodDecl()
getCurMethodDecl - If inside of a method body, this returns a pointer to the method decl for the meth...
DeclRefExpr * BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK, SourceLocation Loc, const CXXScopeSpec *SS=nullptr)
void DefineImplicitMoveConstructor(SourceLocation CurrentLocation, CXXConstructorDecl *Constructor)
DefineImplicitMoveConstructor - Checks for feasibility of defining this constructor as the move const...
ExprResult ActOnChooseExpr(SourceLocation BuiltinLoc, Expr *CondExpr, Expr *LHSExpr, Expr *RHSExpr, SourceLocation RPLoc)
ExprResult CreateGenericSelectionExpr(SourceLocation KeyLoc, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool PredicateIsExpr, void *ControllingExprOrType, ArrayRef< TypeSourceInfo * > Types, ArrayRef< Expr * > Exprs)
ControllingExprOrType is either a TypeSourceInfo * or an Expr *.
ExprResult ActOnUnevaluatedStringLiteral(ArrayRef< Token > StringToks)
void DiagnoseSelfMove(const Expr *LHSExpr, const Expr *RHSExpr, SourceLocation OpLoc)
DiagnoseSelfMove - Emits a warning if a value is moved to itself.
SourceRange getExprRange(Expr *E) const
void AddTemplateOverloadCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false)
Add a C++ function template specialization as a candidate in the candidate set, using template argume...
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...
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 maybeAddDeclWithEffects(FuncOrBlockDecl *D)
Inline checks from the start of maybeAddDeclWithEffects, to minimize performance impact on code not u...
void MaybeSuggestAddingStaticToDecl(const FunctionDecl *D)
@ OperatorInExpression
The '<=>' operator was used in an expression and a builtin operator was selected.
bool CanUseDecl(NamedDecl *D, bool TreatUnavailableAsInvalid)
Determine whether the use of this declaration is valid, without emitting diagnostics.
void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse)
Perform marking for a reference to an arbitrary declaration.
void MarkVTableUsed(SourceLocation Loc, CXXRecordDecl *Class, bool DefinitionRequired=false)
Note that the vtable for the given class was used at the given location.
QualType InvalidLogicalVectorOperands(SourceLocation Loc, ExprResult &LHS, ExprResult &RHS)
Diagnose cases where a scalar was implicitly converted to a vector and diagnose the underlying types.
bool diagnoseArgIndependentDiagnoseIfAttrs(const NamedDecl *ND, SourceLocation Loc)
Emit diagnostics for the diagnose_if attributes on Function, ignoring any ArgDependent DiagnoseIfAttr...
CleanupInfo Cleanup
Used to control the generation of ExprWithCleanups.
llvm::DenseMap< ParmVarDecl *, SourceLocation > UnparsedDefaultArgLocs
NamedDecl * getCurFunctionOrMethodDecl() const
getCurFunctionOrMethodDecl - Return the Decl for the current ObjC method or C function we're in,...
QualType 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...
void checkEnumArithmeticConversions(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...
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)
std::vector< std::pair< QualType, unsigned > > ExcessPrecisionNotSatisfied
bool DiagRuntimeBehavior(SourceLocation Loc, const Stmt *Statement, const PartialDiagnostic &PD)
Conditionally issue a diagnostic based on the current evaluation context.
ExprResult BuildCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *Init=nullptr)
BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating the default expr if needed.
bool anyAltivecTypes(QualType srcType, QualType destType)
bool isLaxVectorConversion(QualType srcType, QualType destType)
Is this a legal conversion between two types, one of which is known to be a vector type?
void PushBlockScope(Scope *BlockScope, BlockDecl *Block)
ExprResult BuildOverloadedCallExpr(Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig, bool AllowTypoCorrection=true, bool CalleesAddressIsTaken=false)
BuildOverloadedCallExpr - Given the call expression that calls Fn (which eventually refers to the dec...
QualType CXXCheckConditionalOperands(ExprResult &cond, ExprResult &lhs, ExprResult &rhs, ExprValueKind &VK, ExprObjectKind &OK, SourceLocation questionLoc)
Check the operands of ?: 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.
ExprResult UsualUnaryFPConversions(Expr *E)
UsualUnaryFPConversions - Promotes floating-point types according to the current language semantics.
bool isUnavailableAlignedAllocationFunction(const FunctionDecl &FD) const
Determine whether FD is an aligned allocation or deallocation function that is unavailable.
bool DiagnoseDependentMemberLookup(const LookupResult &R)
Diagnose a lookup that found results in an enclosing class during error recovery.
DiagnosticsEngine & Diags
OpenCLOptions & getOpenCLOptions()
NamespaceDecl * getStdNamespace() const
ExprResult DefaultFunctionArrayConversion(Expr *E, bool Diagnose=true)
DefaultFunctionArrayConversion (C99 6.3.2.1p3, C99 6.3.2.1p4).
void deduceClosureReturnType(sema::CapturingScopeInfo &CSI)
Deduce a block or lambda's return type based on the return statements present in the body.
bool areLaxCompatibleVectorTypes(QualType srcType, QualType destType)
Are the two types lax-compatible vector types? 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 ActOnIntegerConstant(SourceLocation Loc, int64_t Val)
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 isMFloat8Type() const
bool hasAttr(attr::Kind AK) const
Determine whether this type had the specified attribute applied to it (looking through top-level type...
const Type * getPointeeOrArrayElementType() const
If this is a pointer type, return the pointee type.
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 isInitCapture() const
Whether this variable is the implicit variable for a lambda init-capture.
bool isStaticDataMember() const
Determines whether this is a static data member.
bool hasGlobalStorage() const
Returns true for all variables that do not have local storage.
bool mightBeUsableInConstantExpressions(const ASTContext &C) const
Determine whether this variable's value might be usable in a constant expression, according to the re...
void setTemplateSpecializationKind(TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())
For a static data member that was instantiated from a static data member of a class template,...
bool isInline() const
Whether this variable is (C++1z) inline.
const Expr * getInit() const
bool hasExternalStorage() const
Returns true if a variable has extern or private_extern storage.
bool hasLocalStorage() const
Returns true if a variable with function scope is a non-static local variable.
@ TLS_None
Not a TLS variable.
@ DeclarationOnly
This declaration is only a declaration.
DefinitionKind hasDefinition(ASTContext &) const
Check whether this variable is defined in this translation unit.
bool isUsableInConstantExpressions(const ASTContext &C) const
Determine whether this variable's value can be used in a constant expression, according to the releva...
SourceLocation getPointOfInstantiation() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
bool isLocalVarDeclOrParm() const
Similar to isLocalVarDecl but also includes parameters.
TemplateSpecializationKind getTemplateSpecializationKind() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this variable is an instantiation of a static data member of a class template specialization,...
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.
bool ContainsUnexpandedParameterPack
Whether this contains an unexpanded parameter pack.
SmallVector< Capture, 4 > Captures
Captures - The captures.
ImplicitCaptureStyle ImpCaptureStyle
unsigned CXXThisCaptureIndex
CXXThisCaptureIndex - The (index+1) of the capture of 'this'; zero if 'this' is not captured.
bool HasImplicitReturnType
Capture & getCXXThisCapture()
Retrieve the capture of C++ 'this', if it has been captured.
llvm::DenseMap< ValueDecl *, unsigned > CaptureMap
CaptureMap - A map of captured variables to (index+1) into Captures.
bool isCXXThisCaptured() const
Determine whether the C++ 'this' is captured.
bool isVLATypeCaptured(const VariableArrayType *VAT) const
Determine whether the given variable-array type has been captured.
void addCapture(ValueDecl *Var, bool isBlock, bool isByref, bool isNested, SourceLocation Loc, SourceLocation EllipsisLoc, QualType CaptureType, bool Invalid)
Capture & getCapture(ValueDecl *Var)
Retrieve the capture of the given variable, if it has been captured already.
Retains information about a function, method, or block that is currently being parsed.
void recordUseOfWeak(const ExprT *E, bool IsRead=true)
Record that a weak object was accessed.
void markSafeWeakUse(const Expr *E)
Record that a given expression is a "safe" access of a weak object (e.g.
void addBlock(const BlockDecl *BD)
void setHasBranchProtectedScope()
llvm::SmallVector< AddrLabelExpr *, 4 > AddrLabels
The set of GNU address of label extension "&&label".
bool HasOMPDeclareReductionCombiner
True if current scope is for OpenMP declare reduction combiner.
SourceRange IntroducerRange
Source range covering the lambda introducer [...].
bool lambdaCaptureShouldBeConst() const
void addPotentialCapture(Expr *VarExpr)
Add a variable that might potentially be captured by the lambda and therefore the enclosing lambdas.
void addPotentialThisCapture(SourceLocation Loc)
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 checkAssignmentLifetime(Sema &SemaRef, const AssignedEntity &Entity, Expr *Init)
Check that the lifetime of the given expr (and its subobjects) is sufficient for assigning to the ent...
bool isStringLiteral(TokenKind K)
Return true if this is a C or C++ string-literal (or C++11 user-defined-string-literal) token.
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ OO_None
Not an overloaded operator.
bool isa(CodeGen::Address addr)
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
@ OR_Success
Overload resolution succeeded.
bool isTargetAddressSpace(LangAS AS)
DeclContext * getLambdaAwareParentOfDeclContext(DeclContext *DC)
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
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.
@ Vector
'vector' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ IK_ImplicitSelfParam
An implicit 'self' parameter.
@ IK_TemplateId
A template-id, e.g., f<int>.
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.
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.