52#include "llvm/ADT/ArrayRef.h"
53#include "llvm/ADT/STLExtras.h"
54#include "llvm/ADT/StringExtras.h"
55#include "llvm/Support/ConvertUTF.h"
56#include "llvm/Support/SaveAndRestore.h"
73class CheckDefaultArgumentVisitor
76 const Expr *DefaultArg;
79 CheckDefaultArgumentVisitor(Sema &S,
const Expr *DefaultArg)
80 : S(S), DefaultArg(DefaultArg) {}
82 bool VisitExpr(
const Expr *Node);
83 bool VisitDeclRefExpr(
const DeclRefExpr *DRE);
84 bool VisitCXXThisExpr(
const CXXThisExpr *ThisE);
85 bool VisitLambdaExpr(
const LambdaExpr *Lambda);
86 bool VisitPseudoObjectExpr(
const PseudoObjectExpr *POE);
87 bool VisitCoawaitExpr(
const CoawaitExpr *E);
88 bool VisitCoyieldExpr(
const CoyieldExpr *E);
92bool CheckDefaultArgumentVisitor::VisitExpr(
const Expr *Node) {
93 bool IsInvalid =
false;
94 for (
const Stmt *SubStmt : Node->
children())
96 IsInvalid |= Visit(SubStmt);
103bool CheckDefaultArgumentVisitor::VisitDeclRefExpr(
const DeclRefExpr *DRE) {
109 if (
const auto *Param = dyn_cast<ParmVarDecl>(Decl)) {
120 diag::err_param_default_argument_references_param)
122 }
else if (
auto *VD =
Decl->getPotentiallyDecomposedVarDecl()) {
137 diag::err_param_default_argument_references_local)
144bool CheckDefaultArgumentVisitor::VisitCXXThisExpr(
const CXXThisExpr *ThisE) {
149 diag::err_param_default_argument_references_this)
153bool CheckDefaultArgumentVisitor::VisitPseudoObjectExpr(
154 const PseudoObjectExpr *POE) {
158 if (
const auto *OVE = dyn_cast<OpaqueValueExpr>(E)) {
159 E = OVE->getSourceExpr();
160 assert(E &&
"pseudo-object binding without source expression?");
168bool CheckDefaultArgumentVisitor::VisitLambdaExpr(
const LambdaExpr *Lambda) {
175 for (
const LambdaCapture &LC : Lambda->
captures()) {
177 return S.
Diag(LC.getLocation(), diag::err_lambda_capture_default_arg);
180 Invalid |= Visit(D->getInit());
185bool CheckDefaultArgumentVisitor::VisitCoawaitExpr(
const CoawaitExpr *E) {
195bool CheckDefaultArgumentVisitor::VisitCoyieldExpr(
const CoyieldExpr *E) {
212 Proto = Self->ResolveExceptionSpec(CallLoc, Proto);
229 llvm_unreachable(
"should not see unresolved exception specs here");
258 "should not generate implicit declarations for dependent cases");
262 assert(EST ==
EST_Dynamic &&
"EST case not considered earlier.");
264 "Shouldn't collect exceptions when throw-all is guaranteed.");
268 if (ExceptionsSeen.insert(Self->Context.getCanonicalType(E)).second)
269 Exceptions.push_back(E);
297 if (Self->canThrow(S))
304 diag::err_typecheck_decl_incomplete_type))
323 CheckCompletedExpr(Arg, EqualLoc);
332 Param->setDefaultArg(Arg);
336 UnparsedDefaultArgInstantiationsMap::iterator InstPos
339 for (
auto &Instantiation : InstPos->second)
340 Instantiation->setUninstantiatedDefaultArg(Arg);
350 if (!param || !DefaultArg)
358 Diag(EqualLoc, diag::err_param_default_argument)
372 if (Param->isParameterPack()) {
373 Diag(EqualLoc, diag::err_param_default_argument_on_parameter_pack)
376 Param->setDefaultArg(
nullptr);
391 CheckDefaultArgumentVisitor DefaultArgChecker(*
this, DefaultArg);
392 if (DefaultArgChecker.Visit(DefaultArg))
405 Param->setUnparsedDefaultArg();
415 Param->setInvalidDecl();
420 Param->getType().getNonReferenceType());
423 Param->getType().getNonReferenceType());
425 Param->setDefaultArg(RE.
get());
440 if (MightBeFunction) {
444 MightBeFunction =
false;
447 for (
unsigned argIdx = 0, e = chunk.
Fun.
NumParams; argIdx != e;
450 if (Param->hasUnparsedDefaultArg()) {
451 std::unique_ptr<CachedTokens> Toks =
454 if (Toks->size() > 1)
456 Toks->back().getLocation());
459 Diag(Param->getLocation(), diag::err_param_default_argument_nonfunc)
461 }
else if (Param->getDefaultArg()) {
462 Diag(Param->getLocation(), diag::err_param_default_argument_nonfunc)
463 << Param->getDefaultArg()->getSourceRange();
464 Param->setDefaultArg(
nullptr);
468 MightBeFunction =
false;
475 return P->hasDefaultArg() && !P->hasInheritedDefaultArg();
487 ?
New->getLexicalDeclContext()
488 :
New->getDeclContext();
492 for (; PrevForDefaultArgs;
495 PrevForDefaultArgs =
New->isLocalExternDecl()
503 !
New->isCXXClassMember()) {
548 for (
unsigned p = 0, NumParams = PrevForDefaultArgs
551 p < NumParams; ++p) {
555 bool OldParamHasDfl = OldParam ? OldParam->
hasDefaultArg() :
false;
558 if (OldParamHasDfl && NewParamHasDfl) {
559 unsigned DiagDefaultParamID =
560 diag::err_param_default_argument_redefinition;
575 DiagDefaultParamID = diag::ext_param_default_argument_redefinition;
593 for (
auto Older = PrevForDefaultArgs;
595 Older = Older->getPreviousDecl();
596 OldParam = Older->getParamDecl(p);
601 }
else if (OldParamHasDfl) {
607 !
New->getLexicalDeclContext()->isDependentContext()) {
619 }
else if (NewParamHasDfl) {
620 if (
New->getDescribedFunctionTemplate()) {
623 diag::err_param_default_argument_template_redecl)
626 diag::note_template_prev_declaration)
628 }
else if (
New->getTemplateSpecializationKind()
642 <<
New->getDeclName()
644 }
else if (
New->getDeclContext()
645 ->getEnclosingNonExpansionStatementContext()
646 ->isDependentContext()) {
658 = dyn_cast<CXXRecordDecl>(
New->getDeclContext())) {
659 if (
Record->getDescribedClassTemplate())
668 diag::err_param_default_argument_member_template_redecl)
684 if (NewSM != OldSM) {
685 auto It = llvm::find_if(
New->parameters(), [](
const ParmVarDecl *P) {
686 return P->hasDefaultArg();
688 assert(It !=
New->param_end());
690 Diag(NewParam->
getLocation(), diag::err_default_arg_makes_ctor_special)
701 Diag(
New->getLocation(), diag::err_constexpr_redecl_mismatch)
711 (
New->isInlineSpecified() ||
716 Diag(
New->getLocation(), diag::err_inline_decl_follows_def) <<
New;
726 !
New->isFunctionTemplateSpecialization() &&
isVisible(Old)) {
727 Diag(
New->getLocation(), diag::err_deduction_guide_redeclared);
737 Diag(
New->getLocation(), diag::err_friend_decl_with_def_arg_redeclared);
749 if (
New->isThisDeclarationInstantiatedFromAFriendDefinition() &&
757 DiagCompat(Loc, diag_compat::placeholder_var_definition);
775 if (!TemplateParamLists.empty()) {
781 Diag(TemplateParamLists.front()->getTemplateLoc(),
782 diag::err_decomp_decl_template);
788 DiagID = diag::compat_pre_cxx17_decomp_decl;
791 ? diag::compat_cxx26_decomp_decl_cond
792 : diag::compat_pre_cxx26_decomp_decl_cond;
794 DiagID = diag::compat_cxx17_decomp_decl;
815 Diag(Loc, diag::err_decomp_decl_spec) << Name;
818 auto DiagCpp20Specifier = [&](StringRef Name,
SourceLocation Loc) {
819 DiagCompat(Loc, diag_compat::decomp_decl_spec) << Name;
822 if (
auto SCS = DS.getStorageClassSpec()) {
825 DS.getStorageClassSpecLoc());
828 DS.getStorageClassSpecLoc());
830 if (
auto TSCS = DS.getThreadStorageClassSpec())
832 DS.getThreadStorageClassSpecLoc());
834 if (DS.isInlineSpecified())
835 DiagBadSpecifier(
"inline", DS.getInlineSpecLoc());
842 DS.getConstexprSpecLoc());
853 Diag(DS.getVolatileSpecLoc(),
854 diag::warn_deprecated_volatile_structured_binding);
874 ? diag::err_decomp_decl_parens
875 : diag::err_decomp_decl_type)
881 if (R->isFunctionType())
897 if (DS.isConstrainedAuto()) {
900 "No other template kind should be possible for a constrained auto");
918 assert(VarName &&
"Cannot have an unnamed binding declaration");
927 Previous.getFoundDecl()->isTemplateParameter()) {
933 if (B.EllipsisLoc.isValid()) {
935 Diag(B.EllipsisLoc, diag::err_pack_outside_template);
936 QT =
Context.getPackExpansionType(
Context.DependentTy, std::nullopt,
942 if (BD->isParameterPack()) {
944 CSI->LocalPacks.push_back(BD);
973 auto *Old =
Previous.getRepresentativeDecl();
974 Diag(B.NameLoc, diag::err_redefinition) << B.Name;
975 Diag(Old->getLocation(), diag::note_previous_definition);
993 bool AddToScope =
true;
1002 if (
OpenMP().isInOpenMPDeclareTargetContext())
1003 OpenMP().checkDeclIsAllowedInOpenMPTarget(
nullptr,
New);
1013 unsigned MemberCount) {
1014 auto BindingWithPackItr = llvm::find_if(
1016 bool HasPack = BindingWithPackItr !=
Bindings.end();
1019 IsValid =
Bindings.size() == MemberCount;
1022 IsValid = MemberCount >=
Bindings.size() - 1;
1025 if (IsValid && HasPack) {
1027 unsigned PackSize = MemberCount -
Bindings.size() + 1;
1033 for (
unsigned I = 0; I < PackSize; ++I) {
1038 NestedBDs[I] = NestedBD;
1051 S.
Diag(DD->
getLocation(), diag::err_decomp_decl_wrong_number_bindings)
1053 << (MemberCount <
Bindings.size());
1068 for (
auto *B : DD->flat_bindings()) {
1073 E = GetInit(Loc, E.
get(), I++);
1076 B->setBinding(ElemType, E.
get());
1085 const llvm::APSInt &NumElems,
1088 S,
Bindings, Src, DecompType, NumElems, ElemType,
1119 S,
Bindings, Src, DecompType, llvm::APSInt::get(2),
1123 return S.CreateBuiltinUnaryOp(Loc, I ? UO_Imag : UO_Real, Base);
1131 llvm::raw_svector_ostream OS(SS);
1143 return std::string(OS.str());
1148 auto DiagnoseMissing = [&] {
1158 return DiagnoseMissing();
1168 return DiagnoseMissing();
1169 if (
Result.isAmbiguous())
1174 Result.suppressDiagnostics();
1176 S.
Diag(Loc, diag::err_std_type_trait_not_class_template) << Trait;
1177 S.
Diag(
Found->getLocation(), diag::note_declared_at);
1191 Loc, TraitTy, DiagID,
1201 assert(RD &&
"specialization of class template is not a class?");
1206static TemplateArgumentLoc
1213static TemplateArgumentLoc
1218namespace {
enum class IsTupleLike { TupleLike, NotTupleLike, Error }; }
1221 unsigned &OutSize) {
1231 return IsTupleLike::NotTupleLike;
1239 return IsTupleLike::NotTupleLike;
1248 : R(R), Args(Args) {}
1251 return S.
Diag(Loc, diag::err_decomp_decl_std_tuple_size_not_constant)
1255 } Diagnoser(R, Args);
1260 return IsTupleLike::Error;
1265 return IsTupleLike::Error;
1269 if (Size < 0 || Size >=
UINT_MAX) {
1272 S.
Diag(Loc, diag::err_decomp_decl_std_tuple_size_invalid)
1275 << StringRef(Str.data(), Str.size());
1276 return IsTupleLike::Error;
1279 OutSize = Size.getExtValue();
1280 return IsTupleLike::TupleLike;
1294 diag::err_decomp_decl_std_tuple_element_not_specialized);
1303 auto *TD = R.getAsSingle<
TypeDecl>();
1305 R.suppressDiagnostics();
1306 S.
Diag(Loc, diag::err_decomp_decl_std_tuple_element_not_specialized)
1310 S.
Diag(R.getRepresentativeDecl()->getLocation(), diag::note_declared_at);
1319struct InitializingBinding {
1321 InitializingBinding(Sema &S, BindingDecl *BD) : S(S) {
1322 Sema::CodeSynthesisContext Ctx;
1328 ~InitializingBinding() {
1337 unsigned NumElems) {
1351 bool UseMemberGet =
false;
1361 dyn_cast<FunctionTemplateDecl>(D->getUnderlyingDecl())) {
1363 if (TPL->
size() != 0 &&
1366 UseMemberGet =
true;
1374 for (
auto *B : DD->flat_bindings()) {
1375 InitializingBinding InitContext(S, B);
1398 MemberGet, &Args,
nullptr);
1440 B->getDeclName().getAsIdentifierInfo(),
U,
1445 if (
const auto *CIAttr = Src->
getAttr<ConstInitAttr>())
1446 BindingVD->addAttr(CIAttr->clone(S.
Context));
1447 BindingVD->setImplicit();
1449 BindingVD->setInlineSpecified();
1450 BindingVD->getLexicalDeclContext()->addHiddenDecl(BindingVD);
1455 E =
Seq.Perform(S, Entity, Kind,
Init);
1461 BindingVD->setInit(E.
get());
1469 B->setBinding(
T, E.
get());
1484 return Specifier->getType()->getAsCXXRecordDecl()->hasDirectFields();
1493 ClassWithFields = RD;
1505 for (
auto &P : Paths) {
1509 BestPath->back().Base->getType())) {
1511 S.
Diag(Loc, diag::err_decomp_decl_multiple_bases_with_members)
1512 <<
false << RD << BestPath->back().Base->getType()
1513 << P.back().Base->getType();
1515 }
else if (P.Access < BestPath->
Access) {
1521 QualType BaseType = BestPath->back().Base->getType();
1523 S.
Diag(Loc, diag::err_decomp_decl_ambiguous_base)
1530 *BestPath, diag::err_decomp_decl_inaccessible_base);
1533 ClassWithFields = BaseType->getAsCXXRecordDecl();
1541 S.
Diag(Loc, diag::err_decomp_decl_multiple_bases_with_members)
1542 << (ClassWithFields == RD) << RD << ClassWithFields
1543 << Paths.
front().back().Base->getType();
1554 const auto *RD = cast_or_null<CXXRecordDecl>(BasePair.
getDecl());
1558 for (
auto *FD : RD->fields()) {
1559 if (FD->isUnnamedBitField())
1564 if (!FD->getDeclName()) {
1565 if (RD->isLambda()) {
1566 S.
Diag(Loc, diag::err_decomp_decl_lambda);
1567 S.
Diag(RD->getLocation(), diag::note_lambda_decl);
1571 if (FD->isAnonymousStructOrUnion()) {
1572 S.
Diag(Loc, diag::err_decomp_decl_anon_union_member)
1574 S.
Diag(FD->getLocation(), diag::note_declared_at);
1587 BasePair.
getAccess(), FD->getAccess())));
1596 diag::err_incomplete_type))
1602 const auto *RD = cast_or_null<CXXRecordDecl>(BasePair.
getDecl());
1609 unsigned NumFields = llvm::count_if(
1610 RD->fields(), [](
FieldDecl *FD) { return !FD->isUnnamedBitField(); });
1617 auto FlatBindings = DD->flat_bindings();
1618 assert(llvm::range_size(FlatBindings) == NumFields);
1619 auto FlatBindingsItr = FlatBindings.begin();
1625 for (
auto *FD : RD->fields()) {
1630 assert(FlatBindingsItr != FlatBindings.end());
1672 if (B->getType().isNull())
1673 B->setType(
Context.DependentTy);
1685 if (
auto *CAT =
Context.getAsConstantArrayType(DecompType)) {
1706 case IsTupleLike::Error:
1710 case IsTupleLike::TupleLike:
1715 case IsTupleLike::NotTupleLike:
1724 << DD << !RD << DecompType;
1739 assert(!
T->isDependentType());
1744 T =
Context.getQualifiedType(Unqual, Quals);
1747 return static_cast<unsigned>(CAT->getSize().getZExtValue());
1749 return VT->getNumElements();
1755 case IsTupleLike::Error:
1756 return std::nullopt;
1757 case IsTupleLike::TupleLike:
1759 case IsTupleLike::NotTupleLike:
1764 if (!OrigRD || OrigRD->
isUnion())
1765 return std::nullopt;
1768 return std::nullopt;
1773 const auto *RD = cast_or_null<CXXRecordDecl>(BasePair.
getDecl());
1775 return std::nullopt;
1777 unsigned NumFields = llvm::count_if(
1778 RD->fields(), [](
FieldDecl *FD) { return !FD->isUnnamedBitField(); });
1781 return std::nullopt;
1792 "Should only be called if types are otherwise the same.");
1800 NewType = R->getPointeeType();
1819 New->setInvalidDecl();
1833 if (FTD->isMemberSpecialization())
1842 if (Param->hasDefaultArg())
1853 if (Param->hasDefaultArg() || Param->isParameterPack() ||
1857 if (Param->isInvalidDecl())
1859 else if (Param->getIdentifier())
1860 Diag(Param->getLocation(), diag::err_param_default_argument_missing_name)
1861 << Param->getIdentifier();
1863 Diag(Param->getLocation(), diag::err_param_default_argument_missing);
1870template <
typename... Ts>
1874 if (
T->isDependentType())
1880 std::forward<Ts>(DiagArgs)...);
1883 return !
T->isLiteralType(SemaRef.
Context);
1886 llvm_unreachable(
"unknown CheckConstexprKind");
1894 "this check is obsolete for C++23");
1897 T->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
1905 SemaRef.
Diag(Loc, diag::note_constexpr_dtor_subobject)
1913 if (!Check(B.getBaseTypeLoc(), B.getType(),
nullptr))
1916 if (!Check(FD->getLocation(), FD->getType(), FD))
1927 "this check is obsolete for C++23");
1928 unsigned ArgIndex = 0;
1931 e = FT->param_type_end();
1932 i != e; ++i, ++ArgIndex) {
1934 assert(PD &&
"null in a parameter list");
1937 diag::err_constexpr_non_literal_param, ArgIndex + 1,
1950 "this check is obsolete for C++23");
1952 diag::err_constexpr_non_literal_return,
1971 default: llvm_unreachable(
"Invalid tag kind for record diagnostic!");
1999 for (
const auto &I : RD->
vbases())
2000 Diag(I.getBeginLoc(), diag::note_constexpr_virtual_base_here)
2001 << I.getSourceRange();
2015 Diag(
Method->getLocation(), diag::warn_cxx17_compat_constexpr_virtual);
2021 Diag(
Method->getLocation(), diag::err_constexpr_virtual);
2028 if (WrittenVirtual !=
Method)
2030 diag::note_overridden_virtual_function);
2041 if (
auto *Dtor = dyn_cast<CXXDestructorDecl>(NewFD)) {
2046 !Dtor->getParent()->defaultedDestructorIsConstexpr()) {
2061 "CheckConstexprFunctionDefinition called on function with no body");
2076 for (
const auto *DclIt : DS->
decls()) {
2077 switch (DclIt->getKind()) {
2078 case Decl::StaticAssert:
2080 case Decl::UsingShadow:
2081 case Decl::UsingDirective:
2082 case Decl::UnresolvedUsingTypename:
2083 case Decl::UnresolvedUsingValue:
2084 case Decl::UsingEnum:
2092 case Decl::TypeAlias: {
2096 if (TN->getUnderlyingType()->isVariablyModifiedType()) {
2099 TypeLoc TL = TN->getTypeSourceInfo()->getTypeLoc();
2110 case Decl::CXXRecord:
2115 diag_compat::constexpr_type_definition)
2123 case Decl::EnumConstant:
2124 case Decl::IndirectField:
2131 case Decl::Decomposition: {
2137 if (VD->isThisDeclarationADefinition()) {
2138 if (VD->isStaticLocal()) {
2141 diag_compat::constexpr_static_var)
2148 if (SemaRef.
LangOpts.CPlusPlus23) {
2150 diag::warn_cxx20_compat_constexpr_var,
2153 SemaRef, Kind, VD->getLocation(), VD->getType(),
2154 diag::err_constexpr_local_var_non_literal_type,
2158 if (!VD->getType()->isDependentType() &&
2159 !VD->hasInit() && !VD->isCXXForRangeDecl()) {
2162 diag_compat::constexpr_local_var_no_init)
2171 SemaRef.
DiagCompat(VD->getLocation(), diag_compat::constexpr_local_var)
2179 case Decl::NamespaceAlias:
2180 case Decl::Function:
2189 SemaRef.
Diag(DS->
getBeginLoc(), diag::err_constexpr_body_invalid_stmt)
2223 if (Field->isInvalidDecl())
2226 if (Field->isUnnamedBitField())
2232 if (Field->isAnonymousStructOrUnion() &&
2233 (Field->getType()->isUnionType()
2234 ? !Field->getType()->getAsCXXRecordDecl()->hasVariantMembers()
2235 : Field->getType()->getAsCXXRecordDecl()->isEmpty()))
2238 if (!
Inits.count(Field)) {
2242 diag_compat::constexpr_ctor_missing_init);
2245 SemaRef.
Diag(Field->getLocation(),
2246 diag::note_constexpr_ctor_missing_init);
2250 }
else if (Field->isAnonymousStructOrUnion()) {
2251 const auto *RD = Field->getType()->castAsRecordDecl();
2252 for (
auto *I : RD->fields())
2255 if (!RD->isUnion() ||
Inits.count(I))
2271 auto CheckChildren = [&] {
2275 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2283 case Stmt::NullStmtClass:
2287 case Stmt::DeclStmtClass: {
2292 if (DS->isSingleDecl()) {
2293 if (
auto *ESD = dyn_cast<CXXExpansionStmtDecl>(DS->getSingleDecl())) {
2295 if (!ESD->getInstantiations())
2297 for (
auto *BodyIt : ESD->getInstantiations()->getInstantiations()) {
2299 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2314 case Stmt::ReturnStmtClass:
2326 case Stmt::AttributedStmtClass:
2331 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind);
2333 case Stmt::CompoundStmtClass:
2337 return CheckChildren();
2339 case Stmt::IfStmtClass: {
2346 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2348 if (
If->getElse() &&
2350 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2355 case Stmt::WhileStmtClass:
2356 case Stmt::DoStmtClass:
2357 case Stmt::ForStmtClass:
2358 case Stmt::CXXForRangeStmtClass:
2359 case Stmt::ContinueStmtClass:
2366 case Stmt::SwitchStmtClass:
2367 case Stmt::CaseStmtClass:
2368 case Stmt::DefaultStmtClass:
2369 case Stmt::BreakStmtClass:
2374 return CheckChildren();
2376 case Stmt::LabelStmtClass:
2377 case Stmt::GotoStmtClass:
2378 case Stmt::IndirectGotoStmtClass:
2381 return CheckChildren();
2383 case Stmt::GCCAsmStmtClass:
2384 case Stmt::MSAsmStmtClass:
2386 case Stmt::CXXTryStmtClass:
2389 return CheckChildren();
2391 case Stmt::CXXCatchStmtClass:
2396 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind);
2446 diag_compat::constexpr_function_try_block)
2461 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2472 }
else if (Cxx2bLoc.
isValid()) {
2473 SemaRef.
DiagCompat(Cxx2bLoc, diag_compat::cxx23_constexpr_body_invalid_stmt)
2475 }
else if (Cxx2aLoc.
isValid()) {
2476 SemaRef.
DiagCompat(Cxx2aLoc, diag_compat::cxx20_constexpr_body_invalid_stmt)
2478 }
else if (Cxx1yLoc.
isValid()) {
2479 SemaRef.
DiagCompat(Cxx1yLoc, diag_compat::cxx14_constexpr_body_invalid_stmt)
2484 = dyn_cast<CXXConstructorDecl>(Dcl)) {
2497 diag_compat::constexpr_union_ctor_no_init);
2506 bool AnyAnonStructUnionMembers =
false;
2507 unsigned Fields = 0;
2509 E = RD->
field_end(); I != E; ++I, ++Fields) {
2510 if (I->isAnonymousStructOrUnion()) {
2511 AnyAnonStructUnionMembers =
true;
2519 if (AnyAnonStructUnionMembers ||
2529 Inits.insert(ID->chain_begin(), ID->chain_end());
2532 bool Diagnosed =
false;
2533 for (
auto *I : RD->
fields())
2540 if (ReturnStmts.empty()) {
2555 }
else if (ReturnStmts.size() > 1) {
2559 diag_compat::constexpr_body_multiple_return);
2560 for (
unsigned I = 0; I < ReturnStmts.size() - 1; ++I)
2561 SemaRef.
Diag(ReturnStmts[I],
2562 diag::note_constexpr_body_previous_return);
2590 !SemaRef.
getLangOpts().CheckConstexprFunctionBodies ||
2593 diag::ext_constexpr_function_never_constant_expr, Dcl->
getLocation());
2598 diag::ext_constexpr_function_never_constant_expr)
2601 for (
const auto &
Diag : Diags)
2617 if (SemaRef.
getLangOpts().CPlusPlus23 && !IsVoidOrDependentType)
2624 bool OK = SemaRef.
getLangOpts().CPlusPlus14 && IsVoidOrDependentType;
2626 OK ? diag::warn_cxx11_compat_constexpr_body_no_return
2627 : diag::err_constexpr_body_no_return)
2641 Diag(it->second, diag::err_immediate_function_used_before_definition)
2654 "expected an immediate function");
2655 assert(FD->
hasBody() &&
"expected the function to have a body");
2660 bool ImmediateFnIsConstructor;
2667 ShouldVisitImplicitCode =
true;
2668 ShouldVisitLambdaBody =
false;
2674 if (CurrentConstructor && CurrentInit) {
2682 SemaRef.Diag(Loc, diag::note_immediate_function_reason)
2683 << ImmediateFn << Fn << Fn->isConsteval() << IsCall
2685 << (InitializedField !=
nullptr)
2686 << (CurrentInit && !CurrentInit->
isWritten())
2687 << InitializedField << Range;
2689 bool TraverseCallExpr(
CallExpr *E)
override {
2690 if (
const auto *DR =
2692 DR && DR->isImmediateEscalating()) {
2698 if (!TraverseStmt(A))
2705 if (
const auto *ReferencedFn = dyn_cast<FunctionDecl>(E->
getDecl());
2707 Diag(E, ReferencedFn,
false);
2730 return DynamicRecursiveASTVisitor::TraverseCXXConstructorDecl(Ctr);
2733 bool TraverseType(
QualType T,
bool TraverseQualifier)
override {
2736 bool VisitBlockExpr(
BlockExpr *
T)
override {
return true; }
2738 } Visitor(*
this, FD);
2739 Visitor.TraverseDecl(FD);
2750 return dyn_cast_or_null<CXXRecordDecl>(DC);
2753 return dyn_cast_or_null<CXXRecordDecl>(
CurContext);
2771 CurDecl = dyn_cast_or_null<CXXRecordDecl>(DC);
2773 CurDecl = dyn_cast_or_null<CXXRecordDecl>(
CurContext);
2792 if (BaseType->containsErrors()) {
2797 if (EllipsisLoc.
isValid() && !BaseType->containsUnexpandedParameterPack()) {
2798 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
2812 if (BaseDecl->isUnion()) {
2813 Diag(BaseLoc, diag::err_union_as_base_class) << SpecifierRange;
2817 if (BaseType.hasQualifiers()) {
2819 BaseType.getQualifiers().getAsString(
Context.getPrintingPolicy());
2820 Diag(BaseLoc, diag::warn_qual_base_type)
2821 << Quals << llvm::count(Quals,
' ') + 1 << BaseType;
2822 Diag(BaseLoc, diag::note_base_class_specified_here) << BaseType;
2826 if (
Context.getTargetInfo().getCXXABI().isMicrosoft() ||
2827 Context.getTargetInfo().getTriple().isPS()) {
2829 if (
auto *BaseSpec =
2830 dyn_cast<ClassTemplateSpecializationDecl>(BaseDecl)) {
2839 Class->setInvalidDecl();
2843 BaseDecl = BaseDecl->getDefinition();
2844 assert(BaseDecl &&
"Base type is not incomplete, but has no definition");
2849 const auto *BaseCSA = BaseDecl->getAttr<CodeSegAttr>();
2850 const auto *DerivedCSA =
Class->getAttr<CodeSegAttr>();
2851 if ((DerivedCSA || BaseCSA) &&
2852 (!BaseCSA || !DerivedCSA ||
2853 BaseCSA->getName() != DerivedCSA->getName())) {
2854 Diag(
Class->getLocation(), diag::err_mismatched_code_seg_base);
2855 Diag(BaseDecl->getLocation(), diag::note_base_class_specified_here)
2866 if (BaseDecl->hasFlexibleArrayMember()) {
2867 Diag(BaseLoc, diag::err_base_class_has_flexible_array_member)
2868 << BaseDecl->getDeclName();
2875 if (FinalAttr *FA = BaseDecl->getAttr<FinalAttr>()) {
2876 Diag(BaseLoc, diag::err_class_marked_final_used_as_base)
2877 << BaseDecl->getDeclName() << FA->isSpelledAsSealed();
2878 Diag(BaseDecl->getLocation(), diag::note_entity_declared_at)
2879 << BaseDecl->getDeclName() << FA->getRange();
2884 if (BaseDecl->isInvalidDecl())
2885 Class->setInvalidDecl();
2886 }
else if (BaseType->isDependentType()) {
2893 if (!
Class->isDependentContext())
2894 Class->setInvalidDecl();
2897 Diag(BaseLoc, diag::err_base_must_be_class) << SpecifierRange;
2909 Access, TInfo, EllipsisLoc);
2926 Class->setIsParsingBaseSpecifiers();
2936 Diag(AL.getLoc(), diag::err_base_specifier_attribute)
2937 << AL << AL.isRegularKeywordAttribute() << AL.getRange();
2950 if (
Class->isUnion()) {
2951 Diag(
Class->getLocation(), diag::err_base_clause_on_union)
2961 Class->setInvalidDecl();
2978 for (
const auto &BaseSpec :
Decl->bases()) {
2979 QualType Base = Context.getCanonicalType(BaseSpec.getType())
2980 .getUnqualifiedType();
2997 std::map<QualType, CXXBaseSpecifier*, QualTypeOrdering> KnownBaseTypes;
3004 unsigned NumGoodBases = 0;
3006 for (
unsigned idx = 0; idx < Bases.size(); ++idx) {
3016 Diag(Bases[idx]->getBeginLoc(), diag::err_duplicate_base_class)
3017 << KnownBase->
getType() << Bases[idx]->getSourceRange();
3021 Context.Deallocate(Bases[idx]);
3026 KnownBase = Bases[idx];
3027 Bases[NumGoodBases++] = Bases[idx];
3032 if (Bases.size() > 1)
3036 if (
Class->isInterface() &&
3037 (!RD->isInterfaceLike() ||
3043 << RD->getSourceRange();
3046 if (RD->hasAttr<WeakAttr>())
3053 Class->setBases(Bases.data(), NumGoodBases);
3056 for (
unsigned idx = 0; idx < NumGoodBases; ++idx) {
3058 QualType BaseType = Bases[idx]->getType();
3062 if (BaseType->isDependentType())
3066 .getUnqualifiedType();
3068 if (IndirectBaseTypes.count(CanonicalBase)) {
3072 =
Class->isDerivedFrom(CanonicalBase->getAsCXXRecordDecl(), Paths);
3077 Diag(Bases[idx]->getBeginLoc(), diag::warn_inaccessible_base_class)
3079 << Bases[idx]->getSourceRange();
3081 assert(Bases[idx]->isVirtual());
3086 Context.Deallocate(Bases[idx]);
3094 if (!ClassDecl || Bases.empty())
3106 if (!
Base || !Derived)
3134 Base->getAsCXXRecordDecl(), Paths);
3140 Base->getAsCXXRecordDecl(), Paths);
3149 for (
unsigned I = Path.size(); I != 0; --I) {
3150 if (Path[I - 1].
Base->isVirtual()) {
3157 for (
unsigned I = Start, E = Path.size(); I != E; ++I)
3164 assert(BasePathArray.empty() &&
"Base path array must be empty!");
3166 return ::BuildBasePathArray(Paths.
front(), BasePathArray);
3171 unsigned InaccessibleBaseID,
3172 unsigned AmbiguousBaseConvID,
3176 bool IgnoreAccess) {
3184 if (!DerivationOkay)
3189 Path = &Paths.
front();
3196 if (PossiblePath.size() == 1) {
3197 Path = &PossiblePath;
3198 if (AmbiguousBaseConvID)
3199 Diag(Loc, diag::ext_ms_ambiguous_direct_base)
3200 <<
Base << Derived << Range;
3207 if (!IgnoreAccess) {
3226 if (AmbiguousBaseConvID) {
3236 assert(StillOkay &&
"Can only be used with a derived-to-base conversion");
3245 Diag(Loc, AmbiguousBaseConvID)
3246 << Derived <<
Base << PathDisplayStr << Range << Name;
3255 bool IgnoreAccess) {
3257 Derived,
Base, diag::err_upcast_to_inaccessible_base,
3258 diag::err_ambiguous_derived_to_base_conv, Loc, Range,
DeclarationName(),
3259 BasePath, IgnoreAccess);
3263 std::string PathDisplayStr;
3264 std::set<unsigned> DisplayedPaths;
3266 if (DisplayedPaths.insert(Path.back().SubobjectNumber).second) {
3269 PathDisplayStr +=
"\n ";
3273 PathDisplayStr +=
" -> " + Element.Base->getType().getAsString();
3277 return PathDisplayStr;
3287 assert(Access !=
AS_none &&
"Invalid kind for syntactic access specifier!");
3316 if (!OverloadedMethods.empty()) {
3317 if (OverrideAttr *OA = D->
getAttr<OverrideAttr>()) {
3318 Diag(OA->getLocation(),
3319 diag::override_keyword_hides_virtual_member_function)
3320 <<
"override" << (OverloadedMethods.size() > 1);
3321 }
else if (FinalAttr *FA = D->
getAttr<FinalAttr>()) {
3322 Diag(FA->getLocation(),
3323 diag::override_keyword_hides_virtual_member_function)
3324 << (FA->isSpelledAsSealed() ?
"sealed" :
"final")
3325 << (OverloadedMethods.size() > 1);
3336 if (OverrideAttr *OA = D->
getAttr<OverrideAttr>()) {
3337 Diag(OA->getLocation(),
3338 diag::override_keyword_only_allowed_on_virtual_member_functions)
3342 if (FinalAttr *FA = D->
getAttr<FinalAttr>()) {
3343 Diag(FA->getLocation(),
3344 diag::override_keyword_only_allowed_on_virtual_member_functions)
3345 << (FA->isSpelledAsSealed() ?
"sealed" :
"final")
3357 if (MD->
hasAttr<OverrideAttr>() && !HasOverriddenMethods)
3358 Diag(MD->
getLocation(), diag::err_function_marked_override_not_overriding)
3372 SpellingLoc =
getSourceManager().getImmediateExpansionRange(Loc).getBegin();
3378 auto EmitDiag = [&](
unsigned DiagInconsistent,
unsigned DiagSuggest) {
3389 diag::warn_inconsistent_destructor_marked_not_override_overriding,
3390 diag::warn_suggest_destructor_marked_not_override_overriding);
3392 EmitDiag(diag::warn_inconsistent_function_marked_not_override_overriding,
3393 diag::warn_suggest_function_marked_not_override_overriding);
3399 FinalAttr *FA = Old->
getAttr<FinalAttr>();
3403 Diag(
New->getLocation(), diag::err_final_function_overridden)
3404 <<
New->getDeclName()
3405 << FA->isSpelledAsSealed();
3414 return !RD->isCompleteDefinition() ||
3415 !RD->hasTrivialDefaultConstructor() ||
3416 !RD->hasTrivialDestructor();
3420void Sema::CheckShadowInheritedFields(
const SourceLocation &Loc,
3421 DeclarationName FieldName,
3422 const CXXRecordDecl *RD,
3424 if (Diags.isIgnored(diag::warn_shadow_field, Loc))
3428 std::map<CXXRecordDecl*, NamedDecl*> Bases;
3429 auto FieldShadowed = [&](
const CXXBaseSpecifier *
Specifier,
3430 CXXBasePath &Path) {
3431 const auto Base =
Specifier->getType()->getAsCXXRecordDecl();
3433 if (Bases.find(Base) != Bases.end())
3435 for (
const auto Field :
Base->lookup(FieldName)) {
3439 assert(Bases.find(Base) == Bases.end());
3447 CXXBasePaths Paths(
true,
true,
3452 for (
const auto &P : Paths) {
3453 auto Base = P.back().Base->getType()->getAsCXXRecordDecl();
3454 auto It = Bases.find(Base);
3456 if (It == Bases.end())
3458 auto BaseField = It->second;
3459 assert(BaseField->getAccess() !=
AS_private);
3462 Diag(Loc, diag::warn_shadow_field)
3463 << FieldName << RD <<
Base << DeclIsField;
3464 Diag(BaseField->getLocation(), diag::note_shadow_field);
3470template <
typename AttrType>
3472 if (
const TagDecl *TD =
T->getAsTagDecl())
3473 return TD->hasAttr<AttrType>();
3475 return TDT->getDecl()->hasAttr<AttrType>();
3518 unsigned InvalidDecl;
3519 bool ShowDeclName =
true;
3532 ShowDeclName =
false;
3537 ShowDeclName =
false;
3552 Diag(Loc, diag::err_invalid_member_in_interface)
3553 << (InvalidDecl-1) << Name;
3555 Diag(Loc, diag::err_invalid_member_in_interface)
3556 << (InvalidDecl-1) <<
"";
3566 Diag(Loc, diag::err_hlsl_cstor_dstor);
3594 diag::err_storageclass_invalid_for_member);
3601 !isFunc && TemplateParameterLists.empty();
3614 const char *PrevSpec;
3619 assert(!Failed &&
"Making a constexpr member const shouldn't fail");
3623 const char *PrevSpec;
3627 Context.getPrintingPolicy())) {
3629 "This is the only DeclSpec that should fail to be applied");
3633 isInstField =
false;
3644 Diag(Loc, diag::err_bad_variable_name)
3681 if (MSPropertyAttr) {
3683 BitWidth, InitStyle, AS, *MSPropertyAttr);
3686 isInstField =
false;
3689 BitWidth, InitStyle, AS);
3702 if (
Member->isInvalidDecl()) {
3707 Diag(Loc, diag::err_static_not_bitfield)
3711 Diag(Loc, diag::err_typedef_not_bitfield)
3716 Diag(Loc, diag::err_not_integral_type_bitfield)
3717 << Name << cast<ValueDecl>(
Member)->getType()
3722 Member->setInvalidDecl();
3727 NonTemplateMember = FunTmpl->getTemplatedDecl();
3729 NonTemplateMember = VarTmpl->getTemplatedDecl();
3735 if (NonTemplateMember !=
Member)
3741 if (
auto *DG = dyn_cast<CXXDeductionGuideDecl>(NonTemplateMember)) {
3742 auto *TD = DG->getDeducedTemplate();
3745 if (AS != TD->getAccess() &&
3746 TD->getDeclContext()->getRedeclContext()->Equals(
3747 DG->getDeclContext()->getRedeclContext())) {
3748 Diag(DG->getBeginLoc(), diag::err_deduction_guide_wrong_access);
3749 Diag(TD->getBeginLoc(), diag::note_deduction_guide_template_access)
3753 if (
const auto *AccessSpec = dyn_cast<AccessSpecDecl>(D))
3754 LastAccessSpec = AccessSpec;
3756 assert(LastAccessSpec &&
"differing access with no access specifier");
3757 Diag(LastAccessSpec->
getBeginLoc(), diag::note_deduction_guide_access)
3768 ? FinalAttr::Keyword_sealed
3769 : FinalAttr::Keyword_final));
3779 assert((Name || isInstField) &&
"No identifier for non-field ?");
3785 if (!
Diags.isIgnored(diag::warn_unused_private_field, FD->
getLocation()) &&
3797 class UninitializedFieldVisitor
3802 llvm::SmallPtrSetImpl<ValueDecl*> &Decls;
3805 llvm::SmallPtrSetImpl<QualType> &BaseClasses;
3820 UninitializedFieldVisitor(
Sema &S,
3821 llvm::SmallPtrSetImpl<ValueDecl*> &Decls,
3822 llvm::SmallPtrSetImpl<QualType> &BaseClasses)
3823 : Inherited(S.Context), S(S), Decls(Decls), BaseClasses(BaseClasses),
3827 bool IsInitListMemberExprInitialized(
MemberExpr *ME,
3828 bool CheckReferenceOnly) {
3830 bool ReferenceField =
false;
3835 Fields.push_back(FD);
3837 ReferenceField =
true;
3843 if (CheckReferenceOnly && !ReferenceField)
3848 auto UsedFields = llvm::drop_begin(llvm::reverse(Fields));
3849 auto UsedIter = UsedFields.begin();
3850 const auto UsedEnd = UsedFields.end();
3852 for (
const unsigned Orig : InitFieldIndex) {
3853 if (UsedIter == UsedEnd)
3855 const unsigned UsedIndex = (*UsedIter)->getFieldIndex();
3856 if (UsedIndex < Orig)
3858 if (UsedIndex > Orig)
3866 void HandleMemberExpr(MemberExpr *ME,
bool CheckReferenceOnly,
3873 MemberExpr *FieldME = ME;
3878 while (MemberExpr *SubME =
3879 dyn_cast<MemberExpr>(
Base->IgnoreParenImpCasts())) {
3884 if (FieldDecl *FD = dyn_cast<FieldDecl>(SubME->getMemberDecl()))
3889 AllPODFields =
false;
3891 Base = SubME->getBase();
3899 if (AddressOf && AllPODFields)
3904 if (ImplicitCastExpr *BaseCast = dyn_cast<ImplicitCastExpr>(Base)) {
3909 if (BaseCast->getCastKind() == CK_UncheckedDerivedToBase) {
3910 QualType
T = BaseCast->getType();
3919 if (!Decls.count(FoundVD))
3924 if (InitList && !AddressOf && FoundVD == InitListFieldDecl) {
3926 if (IsInitListMemberExprInitialized(ME, CheckReferenceOnly)) {
3931 if (CheckReferenceOnly && !IsReference)
3935 unsigned diag = IsReference
3936 ? diag::warn_reference_field_is_uninit
3937 : diag::warn_field_is_uninit;
3941 diag::note_uninit_in_this_constructor)
3946 void HandleValue(Expr *E,
bool AddressOf) {
3949 if (MemberExpr *ME = dyn_cast<MemberExpr>(E)) {
3950 HandleMemberExpr(ME,
false ,
3955 if (ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E)) {
3956 Visit(CO->getCond());
3957 HandleValue(CO->getTrueExpr(), AddressOf);
3958 HandleValue(CO->getFalseExpr(), AddressOf);
3962 if (BinaryConditionalOperator *BCO =
3963 dyn_cast<BinaryConditionalOperator>(E)) {
3964 Visit(BCO->getCond());
3965 HandleValue(BCO->getFalseExpr(), AddressOf);
3969 if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E)) {
3970 HandleValue(OVE->getSourceExpr(), AddressOf);
3974 if (BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
3975 switch (BO->getOpcode()) {
3980 HandleValue(BO->getLHS(), AddressOf);
3981 Visit(BO->getRHS());
3984 Visit(BO->getLHS());
3985 HandleValue(BO->getRHS(), AddressOf);
3993 void CheckInitListExpr(InitListExpr *ILE) {
3994 InitFieldIndex.push_back(0);
3995 for (
auto *Child : ILE->
children()) {
3996 if (InitListExpr *SubList = dyn_cast<InitListExpr>(Child)) {
3997 CheckInitListExpr(SubList);
4001 ++InitFieldIndex.back();
4003 InitFieldIndex.pop_back();
4006 void CheckInitializer(Expr *E,
const CXXConstructorDecl *FieldConstructor,
4007 FieldDecl *Field,
const Type *BaseClass) {
4010 for (ValueDecl* VD : DeclsToRemove)
4012 DeclsToRemove.clear();
4015 InitListExpr *ILE = dyn_cast<InitListExpr>(E);
4019 InitListFieldDecl =
Field;
4020 InitFieldIndex.clear();
4021 CheckInitListExpr(ILE);
4033 void VisitMemberExpr(MemberExpr *ME) {
4035 HandleMemberExpr(ME,
true ,
false );
4038 void VisitImplicitCastExpr(ImplicitCastExpr *E) {
4044 Inherited::VisitImplicitCastExpr(E);
4047 void VisitCXXConstructExpr(CXXConstructExpr *E) {
4049 Expr *ArgExpr = E->
getArg(0);
4050 if (InitListExpr *ILE = dyn_cast<InitListExpr>(ArgExpr))
4053 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(ArgExpr))
4054 if (ICE->getCastKind() == CK_NoOp)
4055 ArgExpr = ICE->getSubExpr();
4056 HandleValue(ArgExpr,
false );
4059 Inherited::VisitCXXConstructExpr(E);
4062 void VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
4065 HandleValue(Callee,
false );
4071 Inherited::VisitCXXMemberCallExpr(E);
4074 void VisitCallExpr(CallExpr *E) {
4077 HandleValue(E->
getArg(0),
false);
4081 Inherited::VisitCallExpr(E);
4084 void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
4088 return Inherited::VisitCXXOperatorCallExpr(E);
4092 HandleValue(Arg->IgnoreParenImpCasts(),
false );
4095 void VisitBinaryOperator(BinaryOperator *E) {
4099 if (MemberExpr *ME = dyn_cast<MemberExpr>(E->
getLHS()))
4100 if (FieldDecl *FD = dyn_cast<FieldDecl>(ME->
getMemberDecl()))
4102 DeclsToRemove.push_back(FD);
4105 HandleValue(E->
getLHS(),
false );
4110 Inherited::VisitBinaryOperator(E);
4113 void VisitUnaryOperator(UnaryOperator *E) {
4119 if (MemberExpr *ME = dyn_cast<MemberExpr>(E->
getSubExpr())) {
4120 HandleValue(ME->
getBase(),
true );
4125 Inherited::VisitUnaryOperator(E);
4135 static void DiagnoseUninitializedFields(
4136 Sema &SemaRef,
const CXXConstructorDecl *
Constructor) {
4152 llvm::SmallPtrSet<ValueDecl*, 4> UninitializedFields;
4155 for (
auto *I : RD->
decls()) {
4156 if (
auto *FD = dyn_cast<FieldDecl>(I)) {
4157 UninitializedFields.insert(FD);
4158 }
else if (
auto *IFD = dyn_cast<IndirectFieldDecl>(I)) {
4159 UninitializedFields.insert(IFD->getAnonField());
4163 llvm::SmallPtrSet<QualType, 4> UninitializedBaseClasses;
4164 for (
const auto &I : RD->
bases()) {
4169 UninitializedBaseClasses.insert(I.getType().getCanonicalType());
4172 if (UninitializedFields.empty() && UninitializedBaseClasses.empty())
4175 UninitializedFieldVisitor UninitializedChecker(SemaRef,
4176 UninitializedFields,
4177 UninitializedBaseClasses);
4179 for (
const auto *FieldInit :
Constructor->inits()) {
4180 if (UninitializedFields.empty() && UninitializedBaseClasses.empty())
4183 Expr *InitExpr = FieldInit->getInit();
4187 if (CXXDefaultInitExpr *
Default =
4188 dyn_cast<CXXDefaultInitExpr>(InitExpr)) {
4189 InitExpr =
Default->getExpr();
4193 UninitializedChecker.CheckInitializer(InitExpr,
Constructor,
4194 FieldInit->getAnyMember(),
4195 FieldInit->getBaseClass());
4197 UninitializedChecker.CheckInitializer(InitExpr,
nullptr,
4198 FieldInit->getAnyMember(),
4199 FieldInit->getBaseClass());
4220 if (ParamDecl->getDeclName())
4237 return ConstraintExpr;
4258 return Seq.Perform(*
this, Entity, Kind, InitExpr);
4276 "must set init style when field is created");
4313 DirectBaseSpec =
nullptr;
4314 for (
const auto &
Base : ClassDecl->
bases()) {
4318 DirectBaseSpec = &
Base;
4326 VirtualBaseSpec =
nullptr;
4327 if (!DirectBaseSpec || !DirectBaseSpec->
isVirtual()) {
4336 if (Path.back().Base->isVirtual()) {
4337 VirtualBaseSpec = Path.back().Base;
4344 return DirectBaseSpec || VirtualBaseSpec;
4358 DS, IdLoc, InitList,
4376 DS, IdLoc, List, EllipsisLoc);
4385 explicit MemInitializerValidatorCCC(
CXXRecordDecl *ClassDecl)
4386 : ClassDecl(ClassDecl) {}
4388 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
4391 return Member->getDeclContext()->getRedeclContext()->Equals(ClassDecl);
4397 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
4398 return std::make_unique<MemInitializerValidatorCCC>(*
this);
4402 CXXRecordDecl *ClassDecl;
4419 Diag(Loc, diag::err_using_placeholder_variable) << Name;
4435 for (
auto *D : ClassDecl->
lookup(MemberOrBase)) {
4437 bool IsPlaceholder = D->isPlaceholderVar(
getLangOpts());
4439 if (IsPlaceholder && D->getDeclContext() == ND->
getDeclContext())
4470 if (!ConstructorD || !
Init)
4476 = dyn_cast<CXXConstructorDecl>(ConstructorD);
4500 ClassDecl, SS, TemplateTypeTy, MemberOrBase)) {
4502 Diag(EllipsisLoc, diag::err_pack_expansion_member_init)
4512 if (TemplateTypeTy) {
4514 if (BaseType.isNull())
4523 if (BaseType.isNull())
4531 if (R.isAmbiguous())
return true;
4534 R.suppressDiagnostics();
4537 bool NotUnknownSpecialization =
false;
4540 NotUnknownSpecialization = !
Record->hasAnyDependentBases();
4542 if (!NotUnknownSpecialization) {
4548 if (BaseType.isNull())
4551 TInfo =
Context.CreateTypeSourceInfo(BaseType);
4561 R.setLookupName(MemberOrBase);
4568 UnqualifiedBase->getCanonicalInjectedSpecializationType(
Context));
4570 for (
auto const &
Base : ClassDecl->
bases()) {
4572 Base.getType()->getAs<TemplateSpecializationType>();
4574 Context.hasSameTemplateName(BaseTemplate->getTemplateName(), TN,
4576 Diag(IdLoc, diag::ext_unqualified_base_class)
4578 BaseType =
Base.getType();
4587 MemInitializerValidatorCCC CCC(ClassDecl);
4588 if (R.empty() && BaseType.isNull() &&
4590 CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), S, &SS,
4597 PDiag(diag::err_mem_init_not_member_or_class_suggest)
4598 << MemberOrBase <<
true);
4605 DirectBaseSpec, VirtualBaseSpec)) {
4610 PDiag(diag::err_mem_init_not_member_or_class_suggest)
4611 << MemberOrBase <<
false,
4624 if (!TyD && BaseType.isNull()) {
4625 Diag(IdLoc, diag::err_mem_init_not_member_or_class)
4626 << MemberOrBase <<
SourceRange(IdLoc,
Init->getSourceRange().getEnd());
4631 if (BaseType.isNull()) {
4636 if (
const auto *TD = dyn_cast<TagDecl>(TyD)) {
4642 TL.setNameLoc(IdLoc);
4643 }
else if (
auto *TN = dyn_cast<TypedefNameDecl>(TyD)) {
4649 }
else if (
auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(TyD)) {
4658 BaseType =
Context.getTypeDeclType(TyD);
4666 TInfo =
Context.getTrivialTypeSourceInfo(BaseType, IdLoc);
4676 assert((DirectMember || IndirectMember) &&
4677 "Member must be a FieldDecl or IndirectFieldDecl");
4682 if (
Member->isInvalidDecl())
4687 Args =
MultiExprArg(ParenList->getExprs(), ParenList->getNumExprs());
4689 Args =
MultiExprArg(InitList->getInits(), InitList->getNumInits());
4690 }
else if (
auto *ParenListInit = dyn_cast<CXXParenListInitExpr>(
Init)) {
4693 Args = ParenListInit->getUserSpecifiedInitExprs();
4701 if (
Member->getType()->isDependentType() ||
Init->isTypeDependent()) {
4706 bool InitList =
false;
4719 IdLoc,
Init->getBeginLoc(),
Init->getEndLoc())
4763 return Diag(NameLoc, diag::err_delegating_ctor)
4765 Diag(NameLoc, diag::warn_cxx98_compat_delegating_ctor);
4767 bool InitList =
true;
4771 Args =
MultiExprArg(ParenList->getExprs(), ParenList->getNumExprs());
4782 NameLoc,
Init->getBeginLoc(),
Init->getEndLoc())
4791 "Delegating constructor with no target?");
4797 DelegationInit.
get(), InitRange.
getBegin(),
false);
4802 InitRange.
getEnd(), Args, ClassType);
4814 DelegationInit =
Init;
4828 if (!BaseType->isDependentType() && !BaseType->isRecordType())
4829 return Diag(BaseLoc, diag::err_base_init_does_not_name_class)
4843 (BaseType->isDependentType() ||
Init->isTypeDependent());
4848 if (!BaseType->containsUnexpandedParameterPack()) {
4849 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
4877 if (!DirectBaseSpec && !VirtualBaseSpec) {
4886 return Diag(BaseLoc, diag::err_not_direct_base_or_virtual)
4887 << BaseType <<
Context.getCanonicalTagType(ClassDecl)
4898 InitRange.
getEnd(), EllipsisLoc);
4905 if (DirectBaseSpec && VirtualBaseSpec)
4906 return Diag(BaseLoc, diag::err_base_init_direct_and_virtual)
4911 BaseSpec = VirtualBaseSpec;
4914 bool InitList =
true;
4918 Args =
MultiExprArg(ParenList->getExprs(), ParenList->getNumExprs());
4958 InitRange.
getEnd(), EllipsisLoc);
4968 TargetType, ExprLoc);
4988 bool IsInheritedVirtualBase,
4992 IsInheritedVirtualBase);
4996 switch (ImplicitInitKind) {
5002 BaseInit = InitSeq.Perform(SemaRef, InitEntity, InitKind, {});
5008 bool Moving = ImplicitInitKind ==
IIK_Move;
5010 QualType ParamType = Param->getType().getNonReferenceType();
5030 BasePath.push_back(BaseSpec);
5032 CK_UncheckedDerivedToBase,
5040 BaseInit = InitSeq.
Perform(SemaRef, InitEntity, InitKind, CopyCtorArg);
5072 if (Field->isInvalidDecl())
5078 bool Moving = ImplicitInitKind ==
IIK_Move;
5080 QualType ParamType = Param->getType().getNonReferenceType();
5083 if (Field->isZeroLengthBitField())
5086 Expr *MemberExprBase =
5099 LookupResult MemberLookup(SemaRef, Field->getDeclName(), Loc,
5135 InitSeq.Perform(SemaRef, Entity, InitKind,
MultiExprArg(&CtorArgE, 1));
5150 "Unhandled implicit init kind!");
5163 ExprResult MemberInit = InitSeq.Perform(SemaRef, InitEntity, InitKind, {});
5166 if (MemberInit.isInvalid())
5183 if (!Field->getParent()->isUnion()) {
5186 diag::err_uninitialized_member_in_ctor)
5189 << Field->getDeclName();
5190 SemaRef.
Diag(Field->getLocation(), diag::note_declared_at);
5196 diag::err_uninitialized_member_in_ctor)
5199 << Field->getDeclName();
5200 SemaRef.
Diag(Field->getLocation(), diag::note_declared_at);
5217 CXXMemberInit =
nullptr;
5222struct BaseAndFieldInfo {
5224 CXXConstructorDecl *Ctor;
5225 bool AnyErrorsInInits;
5227 llvm::DenseMap<const void *, CXXCtorInitializer*> AllBaseFields;
5228 SmallVector<CXXCtorInitializer*, 8> AllToInit;
5229 llvm::DenseMap<TagDecl*, FieldDecl*> ActiveUnionMember;
5231 BaseAndFieldInfo(Sema &S, CXXConstructorDecl *Ctor,
bool ErrorsInInits)
5232 : S(S), Ctor(Ctor), AnyErrorsInInits(ErrorsInInits) {
5244 bool isImplicitCopyOrMove()
const {
5255 llvm_unreachable(
"Invalid ImplicitInitializerKind!");
5258 bool addFieldInitializer(CXXCtorInitializer *
Init) {
5259 AllToInit.push_back(
Init);
5268 bool isInactiveUnionMember(FieldDecl *Field) {
5273 if (FieldDecl *Active =
5274 ActiveUnionMember.lookup(
Record->getCanonicalDecl()))
5275 return Active !=
Field->getCanonicalDecl();
5278 if (isImplicitCopyOrMove())
5283 if (
Field->hasInClassInitializer())
5287 if (!
Field->isAnonymousStructOrUnion())
5289 CXXRecordDecl *FieldRD =
Field->getType()->getAsCXXRecordDecl();
5296 bool isWithinInactiveUnionMember(FieldDecl *Field,
5297 IndirectFieldDecl *Indirect) {
5299 return isInactiveUnionMember(Field);
5301 for (
auto *
C : Indirect->
chain()) {
5302 FieldDecl *
Field = dyn_cast<FieldDecl>(
C);
5303 if (Field && isInactiveUnionMember(Field))
5314 if (
T->isIncompleteArrayType())
5318 if (ArrayT->isZeroSize())
5321 T = ArrayT->getElementType();
5330 if (Field->isInvalidDecl())
5335 Info.AllBaseFields.lookup(Field->getCanonicalDecl()))
5336 return Info.addFieldInitializer(
Init);
5350 if (Info.isWithinInactiveUnionMember(Field, Indirect))
5353 if (Field->hasInClassInitializer() && !Info.isImplicitCopyOrMove()) {
5371 return Info.addFieldInitializer(
Init);
5381 if (Info.AnyErrorsInInits)
5392 return Info.addFieldInitializer(
Init);
5419 if (Class->isInvalidDecl())
5421 if (Class->hasIrrelevantDestructor())
5430 if (Field->isInvalidDecl())
5440 if (!FieldClassDecl)
5444 if (FieldClassDecl->isUnion() && FieldClassDecl->isAnonymousStructOrUnion())
5452 S.
PDiag(diag::err_access_dtor_field)
5453 << Field->getDeclName() << FieldType);
5466 bool VisitVirtualBases = !ClassDecl->
isAbstract();
5473 if (Dtor && Dtor->isUsed())
5474 VisitVirtualBases =
false;
5480 for (
const auto &
Base : ClassDecl->
bases()) {
5481 auto *BaseClassDecl =
Base.getType()->getAsCXXRecordDecl();
5486 if (
Base.isVirtual()) {
5487 if (!VisitVirtualBases)
5489 DirectVirtualBases.insert(BaseClassDecl);
5498 S.
PDiag(diag::err_access_dtor_base)
5499 <<
Base.getType() <<
Base.getSourceRange(),
5506 if (VisitVirtualBases)
5508 &DirectVirtualBases);
5516 if (!Initializers.empty()) {
5517 Constructor->setNumCtorInitializers(Initializers.size());
5520 memcpy(baseOrMemberInitializers, Initializers.data(),
5522 Constructor->setCtorInitializers(baseOrMemberInitializers);
5532 BaseAndFieldInfo Info(*
this,
Constructor, AnyErrors);
5540 bool HadError =
false;
5543 if (
Member->isBaseInitializer())
5544 Info.AllBaseFields[
Member->getBaseClass()->getAsCanonical<RecordType>()] =
5547 Info.AllBaseFields[
Member->getAnyMember()->getCanonicalDecl()] =
Member;
5550 for (
auto *
C : F->chain()) {
5553 Info.ActiveUnionMember.insert(std::make_pair(
5558 Info.ActiveUnionMember.insert(std::make_pair(
5566 for (
auto &I : ClassDecl->
bases()) {
5568 DirectVBases.insert(&I);
5572 for (
auto &VBase : ClassDecl->
vbases()) {
5574 VBase.getType()->getAsCanonical<RecordType>())) {
5582 Diag(
Value->getSourceLocation(), diag::warn_abstract_vbase_init_ignored)
5583 << VBase.getType() << ClassDecl;
5587 Info.AllToInit.push_back(
Value);
5588 }
else if (!AnyErrors && !ClassDecl->
isAbstract()) {
5593 bool IsInheritedVirtualBase = !DirectVBases.count(&VBase);
5596 &VBase, IsInheritedVirtualBase,
5602 Info.AllToInit.push_back(CXXBaseInit);
5609 if (
Base.isVirtual())
5613 Base.getType()->getAsCanonical<RecordType>())) {
5614 Info.AllToInit.push_back(
Value);
5615 }
else if (!AnyErrors) {
5624 Info.AllToInit.push_back(CXXBaseInit);
5629 for (
auto *Mem : ClassDecl->
decls()) {
5630 if (
auto *F = dyn_cast<FieldDecl>(Mem)) {
5635 if (F->isUnnamedBitField())
5641 if (F->isAnonymousStructOrUnion() && !Info.isImplicitCopyOrMove())
5650 if (Info.isImplicitCopyOrMove())
5653 if (
auto *F = dyn_cast<IndirectFieldDecl>(Mem)) {
5654 if (F->getType()->isIncompleteArrayType()) {
5656 "Incomplete array type is not valid");
5668 unsigned NumInitializers = Info.AllToInit.size();
5669 if (NumInitializers > 0) {
5670 Constructor->setNumCtorInitializers(NumInitializers);
5673 memcpy(baseOrMemberInitializers, Info.AllToInit.data(),
5675 Constructor->setCtorInitializers(baseOrMemberInitializers);
5701 if (
const RecordType *RT = Field->getType()->getAsCanonical<RecordType>()) {
5709 IdealInits.push_back(Field->getCanonicalDecl());
5713 return Context.getCanonicalType(BaseType).getTypePtr();
5718 if (!
Member->isAnyMemberInitializer())
5721 return Member->getAnyMember()->getCanonicalDecl();
5727 if (
Previous->isAnyMemberInitializer())
5741 if (
Constructor->getDeclContext()->isDependentContext())
5746 bool ShouldCheckOrder =
false;
5748 if (!SemaRef.
Diags.
isIgnored(diag::warn_initializer_out_of_order,
5749 Init->getSourceLocation())) {
5750 ShouldCheckOrder =
true;
5754 if (!ShouldCheckOrder)
5765 for (
const auto &VBase : ClassDecl->
vbases())
5769 for (
const auto &
Base : ClassDecl->
bases()) {
5770 if (
Base.isVirtual())
5776 for (
auto *Field : ClassDecl->
fields()) {
5777 if (Field->isUnnamedBitField())
5783 unsigned NumIdealInits = IdealInitKeys.size();
5784 unsigned IdealIndex = 0;
5793 for (
unsigned InitIndex = 0; InitIndex !=
Inits.size(); ++InitIndex) {
5798 for (; IdealIndex != NumIdealInits; ++IdealIndex)
5799 if (InitKey == IdealInitKeys[IdealIndex])
5805 if (IdealIndex == NumIdealInits && InitIndex) {
5806 WarnIndexes.push_back(InitIndex);
5809 for (IdealIndex = 0; IdealIndex != NumIdealInits; ++IdealIndex)
5810 if (InitKey == IdealInitKeys[IdealIndex])
5813 assert(IdealIndex < NumIdealInits &&
5814 "initializer not found in initializer list");
5816 CorrelatedInitOrder.emplace_back(IdealIndex, InitIndex);
5819 if (WarnIndexes.empty())
5823 llvm::sort(CorrelatedInitOrder, llvm::less_first());
5829 Inits[WarnIndexes.front() - 1]->getSourceLocation(),
5830 WarnIndexes.size() == 1 ? diag::warn_initializer_out_of_order
5831 : diag::warn_some_initializers_out_of_order);
5833 for (
unsigned I = 0; I < CorrelatedInitOrder.size(); ++I) {
5834 if (CorrelatedInitOrder[I].second == I)
5840 Inits[I]->getSourceRange(),
5843 Inits[CorrelatedInitOrder[I].second]->getSourceRange()),
5849 if (WarnIndexes.size() == 1) {
5851 Inits[WarnIndexes.front()]);
5857 for (
unsigned WarnIndex : WarnIndexes) {
5860 diag::note_initializer_out_of_order);
5867bool CheckRedundantInit(Sema &S,
5868 CXXCtorInitializer *
Init,
5869 CXXCtorInitializer *&PrevInit) {
5875 if (FieldDecl *Field =
Init->getAnyMember())
5877 diag::err_multiple_mem_initialization)
5878 <<
Field->getDeclName()
5879 <<
Init->getSourceRange();
5881 const Type *BaseClass =
Init->getBaseClass();
5882 assert(BaseClass &&
"neither field nor base");
5884 diag::err_multiple_base_initialization)
5885 << QualType(BaseClass, 0)
5886 <<
Init->getSourceRange();
5894typedef std::pair<NamedDecl *, CXXCtorInitializer *> UnionEntry;
5895typedef llvm::DenseMap<RecordDecl*, UnionEntry> RedundantUnionMap;
5897bool CheckRedundantUnionInit(Sema &S,
5898 CXXCtorInitializer *
Init,
5899 RedundantUnionMap &Unions) {
5900 FieldDecl *
Field =
Init->getAnyMember();
5901 RecordDecl *Parent =
Field->getParent();
5902 NamedDecl *Child =
Field;
5906 UnionEntry &En = Unions[Parent];
5907 if (En.first && En.first != Child) {
5909 diag::err_multiple_mem_union_initialization)
5910 <<
Field->getDeclName()
5911 <<
Init->getSourceRange();
5912 S.
Diag(En.second->getSourceLocation(), diag::note_previous_initializer)
5913 << 0 << En.second->getSourceRange();
5936 if (!ConstructorDecl)
5942 = dyn_cast<CXXConstructorDecl>(ConstructorDecl);
5945 Diag(ColonLoc, diag::err_only_constructors_take_base_inits);
5952 llvm::DenseMap<const void *, CXXCtorInitializer *> Members;
5955 RedundantUnionMap MemberUnions;
5957 bool HadError =
false;
5958 for (
unsigned i = 0; i < MemInits.size(); i++) {
5962 Init->setSourceOrder(i);
5964 if (
Init->isAnyMemberInitializer()) {
5966 if (CheckRedundantInit(*
this,
Init, Members[Key]) ||
5967 CheckRedundantUnionInit(*
this,
Init, MemberUnions))
5969 }
else if (
Init->isBaseInitializer()) {
5971 if (CheckRedundantInit(*
this,
Init, Members[Key]))
5974 assert(
Init->isDelegatingInitializer());
5976 if (MemInits.size() != 1) {
5978 diag::err_delegating_initializer_alone)
5979 <<
Init->getSourceRange() << MemInits[i ? 0 : 1]->getSourceRange();
6011 for (
auto *Field : ClassDecl->
fields()) {
6020 llvm::SmallPtrSetImpl<const CXXRecordDecl *> *DirectVirtualBases) {
6022 for (
const auto &VBase : ClassDecl->
vbases()) {
6023 auto *BaseClassDecl = VBase.getType()->getAsCXXRecordDecl();
6028 if (DirectVirtualBases && DirectVirtualBases->count(BaseClassDecl))
6037 PDiag(diag::err_access_dtor_vbase)
6038 << CT << VBase.getType(),
6041 CT, VBase.getType(), diag::err_access_dtor_vbase, 0,
6055 = dyn_cast<CXXConstructorDecl>(CDtorDecl)) {
6057 !ClassDecl || ClassDecl->isInvalidDecl()) {
6069 const auto *RD =
Context.getBaseElementType(
T)->getAsCXXRecordDecl();
6106 if (
Diags.isLastDiagnosticIgnored())
6116 for (
const auto &M : FinalOverriders) {
6117 for (
const auto &SO : M.second) {
6123 if (SO.second.size() != 1)
6127 if (!
Method->isPureVirtual())
6130 if (!SeenPureMethods.insert(
Method).second)
6133 Diag(
Method->getLocation(), diag::note_pure_virtual_function)
6144struct AbstractUsageInfo {
6154 void DiagnoseAbstractType() {
6163struct CheckAbstractUsage {
6164 AbstractUsageInfo &Info;
6165 const NamedDecl *Ctx;
6167 CheckAbstractUsage(AbstractUsageInfo &Info,
const NamedDecl *Ctx)
6168 : Info(Info), Ctx(Ctx) {}
6172#define ABSTRACT_TYPELOC(CLASS, PARENT)
6173#define TYPELOC(CLASS, PARENT) \
6174 case TypeLoc::CLASS: Check(TL.castAs<CLASS##TypeLoc>(), Sel); break;
6175#include "clang/AST/TypeLocNodes.def"
6181 for (
unsigned I = 0, E = TL.
getNumParams(); I != E; ++I) {
6196 for (
unsigned I = 0, E = TL.
getNumArgs(); I != E; ++I) {
6197 TemplateArgumentLoc TAL = TL.
getArgLoc(I);
6206#define CheckPolymorphic(Type) \
6207 void Check(Type TL, Sema::AbstractDiagSelID Sel) { \
6208 Visit(TL.getNextTypeLoc(), Sema::AbstractNone); \
6223 return Visit(
Next, Sel);
6231 if (
T->isArrayType()) {
6236 if (CT != Info.AbstractType)
return;
6247 Info.DiagnoseAbstractType();
6251void AbstractUsageInfo::CheckType(
const NamedDecl *D, TypeLoc TL,
6253 CheckAbstractUsage(*
this, D).Visit(TL, Sel);
6288 for (
auto *D : RD->
decls()) {
6289 if (D->isImplicit())
continue;
6292 if (
auto *FD = dyn_cast<FriendDecl>(D)) {
6293 D = FD->getFriendDecl();
6298 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
6300 }
else if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(D)) {
6304 }
else if (
auto *FD = dyn_cast<FieldDecl>(D)) {
6307 }
else if (
auto *VD = dyn_cast<VarDecl>(D)) {
6309 }
else if (
auto *VTD = dyn_cast<VarTemplateDecl>(D)) {
6313 }
else if (
auto *RD = dyn_cast<CXXRecordDecl>(D)) {
6315 }
else if (
auto *CTD = dyn_cast<ClassTemplateDecl>(D)) {
6326 assert(ClassAttr->
getKind() == attr::DLLExport);
6336 struct MarkingClassDllexported {
6347 ~MarkingClassDllexported() {
6350 } MarkingDllexportedContext(S, Class, ClassAttr->
getLocation());
6357 if (!
Member->hasAttr<DLLExportAttr>())
6362 auto *VD = dyn_cast<VarDecl>(
Member);
6363 if (VD && VD->getStorageClass() ==
SC_Static &&
6367 auto *MD = dyn_cast<CXXMethodDecl>(
Member);
6371 if (MD->isUserProvided()) {
6381 auto *CD = dyn_cast<CXXConstructorDecl>(MD);
6384 CD->getAttr<DLLExportAttr>()->getLocation(), CD);
6392 }
else if (MD->isExplicitlyDefaulted()) {
6401 }
else if (!MD->isTrivial() ||
6402 MD->isCopyAssignmentOperator() ||
6403 MD->isMoveAssignmentOperator()) {
6424 if (Class->isInvalidDecl())
6431 if (
auto *NestedClass = dyn_cast<CXXRecordDecl>(
Member)) {
6432 if (NestedClass->isThisDeclarationADefinition())
6438 auto *CD = dyn_cast<CXXConstructorDecl>(
Member);
6439 if (!CD || !CD->isDefaultConstructor())
6441 auto *
Attr = CD->getAttr<DLLExportAttr>();
6447 if (!Class->isDependentContext()) {
6452 if (LastExportedDefaultCtor) {
6454 diag::err_attribute_dll_ambiguous_default_ctor)
6456 S.
Diag(CD->getLocation(), diag::note_entity_declared_at)
6457 << CD->getDeclName();
6460 LastExportedDefaultCtor = CD;
6466 bool ErrorReported =
false;
6467 auto reportIllegalClassTemplate = [&ErrorReported](
Sema &S,
6471 S.
Diag(TD->getLocation(),
6472 diag::err_cuda_device_builtin_surftex_cls_template)
6474 ErrorReported =
true;
6479 auto *SD = dyn_cast<ClassTemplateSpecializationDecl>(Class);
6481 S.
Diag(Class->getLocation(),
6482 diag::err_cuda_device_builtin_surftex_ref_decl)
6484 S.
Diag(Class->getLocation(),
6485 diag::note_cuda_device_builtin_surftex_should_be_template_class)
6489 TD = SD->getSpecializedTemplate();
6493 unsigned N = Params->
size();
6496 reportIllegalClassTemplate(S, TD);
6498 diag::note_cuda_device_builtin_surftex_cls_should_have_n_args)
6502 reportIllegalClassTemplate(S, TD);
6504 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6508 auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Params->
getParam(1));
6509 if (!NTTP || !NTTP->getType()->isIntegralOrEnumerationType()) {
6510 reportIllegalClassTemplate(S, TD);
6512 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6520 bool ErrorReported =
false;
6521 auto reportIllegalClassTemplate = [&ErrorReported](
Sema &S,
6525 S.
Diag(TD->getLocation(),
6526 diag::err_cuda_device_builtin_surftex_cls_template)
6528 ErrorReported =
true;
6533 auto *SD = dyn_cast<ClassTemplateSpecializationDecl>(Class);
6535 S.
Diag(Class->getLocation(),
6536 diag::err_cuda_device_builtin_surftex_ref_decl)
6538 S.
Diag(Class->getLocation(),
6539 diag::note_cuda_device_builtin_surftex_should_be_template_class)
6543 TD = SD->getSpecializedTemplate();
6547 unsigned N = Params->
size();
6550 reportIllegalClassTemplate(S, TD);
6552 diag::note_cuda_device_builtin_surftex_cls_should_have_n_args)
6556 reportIllegalClassTemplate(S, TD);
6558 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6562 auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Params->
getParam(1));
6563 if (!NTTP || !NTTP->getType()->isIntegralOrEnumerationType()) {
6564 reportIllegalClassTemplate(S, TD);
6566 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6571 auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Params->
getParam(2));
6572 if (!NTTP || !NTTP->getType()->isIntegralOrEnumerationType()) {
6573 reportIllegalClassTemplate(S, TD);
6575 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6584 if (
Method->isUserProvided())
6595 if (
Context.getTargetInfo().shouldDLLImportComdatSymbols() && !ClassAttr) {
6596 if (
auto *Spec = dyn_cast<ClassTemplatePartialSpecializationDecl>(
Class)) {
6597 if (
Attr *TemplateAttr =
6598 getDLLAttr(Spec->getSpecializedTemplate()->getTemplatedDecl())) {
6600 A->setInherited(
true);
6613 if ((
Context.getTargetInfo().getCXXABI().isMicrosoft() ||
6614 Context.getTargetInfo().getTriple().isPS()) &&
6615 (!
Class->isExternallyVisible() &&
Class->hasExternalFormalLinkage())) {
6616 Class->dropAttrs<DLLExportAttr, DLLImportAttr>();
6620 if (!
Class->isExternallyVisible()) {
6621 Diag(
Class->getLocation(), diag::err_attribute_dll_not_extern)
6622 <<
Class << ClassAttr;
6626 if (
Context.getTargetInfo().shouldDLLImportComdatSymbols() &&
6637 diag::err_attribute_dll_member_of_dll_class)
6638 << MemberAttr << ClassAttr;
6639 Diag(ClassAttr->getLocation(), diag::note_previous_attribute);
6640 Member->setInvalidDecl();
6644 if (
Class->getDescribedClassTemplate())
6649 const bool ClassExported = ClassAttr->
getKind() == attr::DLLExport;
6654 const bool PropagatedImport =
6664 !
Context.getTargetInfo().getTriple().isOSCygMing()) {
6665 if (
auto *DEA =
Class->getAttr<DLLExportAttr>()) {
6666 Class->addAttr(DLLExportOnDeclAttr::Create(
Context, DEA->getLoc()));
6667 Class->dropAttr<DLLExportAttr>();
6677 if (ClassExported &&
getLangOpts().DllExportInlines) {
6680 if (
auto *S = dyn_cast<ConstructorUsingShadowDecl>(D))
6681 Shadows.push_back(S);
6703 if (
Member->hasAttr<ExcludeFromExplicitInstantiationAttr>())
6718 if (ClassExported &&
getLangOpts().DllExportInlines) {
6735 diag::warn_dllexport_inherited_ctor_unsupported)
6741 .areArgsDestroyedLeftToRightInCallee()) {
6742 bool HasCalleeCleanupParam =
false;
6744 if (P->needsDestruction(
Context)) {
6745 HasCalleeCleanupParam =
true;
6748 if (HasCalleeCleanupParam) {
6750 diag::warn_dllexport_inherited_ctor_unsupported)
6772 if (!
Context.getTargetInfo().shouldDLLImportComdatSymbols() &&
6775 if (
auto *CD = dyn_cast<CXXConstructorDecl>(MD);
6776 !CD || !CD->getInheritedConstructor())
6783 auto *Ctor = dyn_cast<CXXConstructorDecl>(MD);
6800 if (VD && PropagatedImport)
6814 if (ClassExported) {
6826 Member->addAttr(NewAttr);
6836 "friend re-decl should not already have a DLLAttr");
6866 NewAttr->setInherited(
true);
6867 BaseTemplateSpec->
addAttr(NewAttr);
6871 if (
auto *ImportAttr = dyn_cast<DLLImportAttr>(NewAttr))
6872 ImportAttr->setPropagatedToBaseTemplate();
6893 Diag(BaseLoc, diag::warn_attribute_dll_instantiated_base_class)
6898 diag::note_template_class_explicit_specialization_was_here)
6899 << BaseTemplateSpec;
6902 diag::note_template_class_instantiation_was_here)
6903 << BaseTemplateSpec;
6912struct DefaultedFunctionFPFeaturesRAII {
6915 : SavedFPFeatures(S) {
6922 ~DefaultedFunctionFPFeaturesRAII() =
default;
6953 llvm_unreachable(
"Invalid special member.");
6971 bool CopyCtorIsTrivial =
false, CopyCtorIsTrivialForCall =
false;
6972 bool DtorIsTrivialForCall =
false;
6983 CopyCtorIsTrivial =
true;
6985 CopyCtorIsTrivialForCall =
true;
6989 if (CD->isCopyConstructor() && !CD->isDeleted() &&
6990 !CD->isIneligibleOrNotSelected()) {
6991 if (CD->isTrivial())
6992 CopyCtorIsTrivial =
true;
6993 if (CD->isTrivialForCall())
6994 CopyCtorIsTrivialForCall =
true;
7002 DtorIsTrivialForCall =
true;
7004 if (!DD->isDeleted() && DD->isTrivialForCall())
7005 DtorIsTrivialForCall =
true;
7009 if (CopyCtorIsTrivialForCall && DtorIsTrivialForCall)
7023 uint64_t TypeSize = isAArch64 ? 128 : 64;
7035 bool HasNonDeletedCopyOrMove =
false;
7041 HasNonDeletedCopyOrMove =
true;
7048 HasNonDeletedCopyOrMove =
true;
7056 if (MD->isDeleted() || MD->isIneligibleOrNotSelected())
7059 auto *CD = dyn_cast<CXXConstructorDecl>(MD);
7060 if (CD && CD->isCopyOrMoveConstructor())
7061 HasNonDeletedCopyOrMove =
true;
7065 if (!MD->isTrivialForCall())
7069 return HasNonDeletedCopyOrMove;
7080 bool IssuedDiagnostic =
false;
7083 if (!IssuedDiagnostic) {
7085 IssuedDiagnostic =
true;
7087 S.
Diag(O->getLocation(), diag::note_overridden_virtual_function);
7090 return IssuedDiagnostic;
7097 if (
Record->isAbstract() && !
Record->isInvalidDecl()) {
7098 AbstractUsageInfo Info(*
this,
Record);
7105 if (!
Record->isInvalidDecl() && !
Record->isDependentType() &&
7106 !
Record->isAggregate() && !
Record->hasUserDeclaredConstructor() &&
7108 bool Complained =
false;
7109 for (
const auto *F :
Record->fields()) {
7110 if (F->hasInClassInitializer() || F->isUnnamedBitField())
7113 if (F->getType()->isReferenceType() ||
7114 (F->getType().isConstQualified() && F->getType()->isScalarType())) {
7116 Diag(
Record->getLocation(), diag::warn_no_constructor_for_refconst)
7121 Diag(F->getLocation(), diag::note_refconst_member_not_initialized)
7122 << F->getType()->isReferenceType()
7123 << F->getDeclName();
7128 if (
Record->getIdentifier()) {
7143 Record->hasUserDeclaredConstructor()) ||
7145 Diag(Element->getLocation(), diag::err_member_name_of_class)
7153 if (
Record->isPolymorphic() && !
Record->isDependentType()) {
7156 !
Record->hasAttr<FinalAttr>())
7158 diag::warn_non_virtual_dtor)
7162 if (
Record->isAbstract()) {
7163 if (FinalAttr *FA =
Record->getAttr<FinalAttr>()) {
7164 Diag(
Record->getLocation(), diag::warn_abstract_final_class)
7165 << FA->isSpelledAsSealed();
7171 if (!
Record->hasAttr<FinalAttr>()) {
7173 if (
const FinalAttr *FA = dtor->getAttr<FinalAttr>()) {
7174 Diag(FA->getLocation(), diag::warn_final_dtor_non_final_class)
7175 << FA->isSpelledAsSealed()
7178 (FA->isSpelledAsSealed() ?
" sealed" :
" final"));
7180 diag::note_final_dtor_non_final_class_silence)
7181 <<
Context.getCanonicalTagType(
Record) << FA->isSpelledAsSealed();
7187 if (
Record->hasAttr<TrivialABIAttr>())
7192 bool HasTrivialABI =
Record->hasAttr<TrivialABIAttr>();
7195 Record->setHasTrivialSpecialMemberForCall();
7205 auto CheckCompletedMemberFunction = [&](
CXXMethodDecl *MD) {
7216 MD->
isDeleted() ? diag::err_deleted_override
7217 : diag::err_non_deleted_override,
7219 return MD->isDeleted() != V->isDeleted();
7231 : diag::err_non_consteval_override,
7233 return MD->isConsteval() != V->isConsteval();
7242 auto CheckForDefaultedFunction = [&](
FunctionDecl *FD) ->
bool {
7249 DefaultedSecondaryComparisons.push_back(FD);
7257 if (!
Record->isInvalidDecl() &&
7258 Record->hasAttr<VTablePointerAuthenticationAttr>())
7263 bool Incomplete = CheckForDefaultedFunction(M);
7266 if (
Record->isDependentType())
7272 if (!M->isImplicit() && !M->isUserProvided()) {
7276 Record->finishedDefaultedOrDeletedMember(M);
7277 M->setTrivialForCall(
7281 Record->setTrivialForCallFlags(M);
7290 M->isUserProvided()) {
7291 M->setTrivialForCall(HasTrivialABI);
7292 Record->setTrivialForCallFlags(M);
7295 if (!M->isInvalidDecl() && M->isExplicitlyDefaulted() &&
7296 M->hasAttr<DLLExportAttr>()) {
7302 M->dropAttr<DLLExportAttr>();
7304 if (M->hasAttr<DLLExportAttr>()) {
7310 bool EffectivelyConstexprDestructor =
true;
7315 llvm::SmallDenseSet<QualType> Visited;
7316 auto Check = [&Visited](
QualType T,
auto &&Check) ->
bool {
7317 if (!Visited.insert(
T->getCanonicalTypeUnqualified()).second)
7320 T->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
7328 if (!Check(B.getType(), Check))
7331 if (!Check(FD->
getType(), Check))
7335 EffectivelyConstexprDestructor =
7343 M->isDefaulted() && M->isConstexpr() && M->size_overridden_methods() &&
7344 EffectivelyConstexprDestructor)
7348 CheckCompletedMemberFunction(M);
7357 CompleteMemberFunction(Dtor);
7359 bool HasMethodWithOverrideControl =
false,
7360 HasOverridingMethodWithoutOverrideControl =
false;
7361 for (
auto *D :
Record->decls()) {
7362 if (
auto *M = dyn_cast<CXXMethodDecl>(D)) {
7365 if (!
Record->isDependentType()) {
7371 if (M->hasAttr<OverrideAttr>()) {
7372 HasMethodWithOverrideControl =
true;
7373 }
else if (M->size_overridden_methods() > 0) {
7374 HasOverridingMethodWithoutOverrideControl =
true;
7377 if (M->isVirtualAsWritten() &&
Record->isEffectivelyFinal()) {
7378 Diag(M->getLocation(), diag::warn_unnecessary_virtual_specifier)
7385 CompleteMemberFunction(M);
7386 }
else if (
auto *F = dyn_cast<FriendDecl>(D)) {
7387 CheckForDefaultedFunction(
7388 dyn_cast_or_null<FunctionDecl>(F->getFriendDecl()));
7392 if (HasOverridingMethodWithoutOverrideControl) {
7393 bool HasInconsistentOverrideControl = HasMethodWithOverrideControl;
7394 for (
auto *M :
Record->methods())
7399 for (
FunctionDecl *FD : DefaultedSecondaryComparisons) {
7403 if (
auto *MD = dyn_cast<CXXMethodDecl>(FD))
7404 CheckCompletedMemberFunction(MD);
7425 if (
Context.getLangOpts().getLayoutCompatibility() ==
7429 Diag(
Record->getLocation(), diag::warn_cxx_ms_struct);
7435 bool ClangABICompat4 =
7436 Context.getLangOpts().isCompatibleWith(LangOptions::ClangABI::Ver4);
7438 Context.getTargetInfo().getCallingConvKind(ClangABICompat4);
7443 if (
Record->getArgPassingRestrictions() !=
7445 Record->setArgPassingRestrictions(
7453 if (
Context.getTargetInfo().getCXXABI().areArgsDestroyedLeftToRightInCallee())
7454 Record->setParamDestroyedInCallee(
true);
7455 else if (
Record->hasNonTrivialDestructor())
7456 Record->setParamDestroyedInCallee(CanPass);
7465 if (
Record->hasAttr<CUDADeviceBuiltinSurfaceTypeAttr>())
7467 else if (
Record->hasAttr<CUDADeviceBuiltinTextureTypeAttr>())
7473 TypeAwareDecls{{OO_New, {}},
7476 {OO_Array_New, {}}};
7477 for (
auto *D :
Record->decls()) {
7484 auto CheckMismatchedTypeAwareAllocators =
7487 auto &NewDecls = TypeAwareDecls[NewKind];
7488 auto &DeleteDecls = TypeAwareDecls[DeleteKind];
7489 if (NewDecls.empty() == DeleteDecls.empty())
7492 Context.DeclarationNames.getCXXOperatorName(
7493 NewDecls.empty() ? DeleteKind : NewKind);
7495 Context.DeclarationNames.getCXXOperatorName(
7496 NewDecls.empty() ? NewKind : DeleteKind);
7498 diag::err_type_aware_allocator_missing_matching_operator)
7501 for (
auto MD : NewDecls)
7503 diag::note_unmatched_type_aware_allocator_declared)
7505 for (
auto MD : DeleteDecls)
7507 diag::note_unmatched_type_aware_allocator_declared)
7510 CheckMismatchedTypeAwareAllocators(OO_New, OO_Delete);
7511 CheckMismatchedTypeAwareAllocators(OO_Array_New, OO_Array_Delete);
7527 unsigned LHSQuals = 0;
7530 LHSQuals = FieldQuals;
7532 unsigned RHSQuals = FieldQuals;
7554 llvm::DenseMap<CXXRecordDecl *, ConstructorUsingShadowDecl *>
7560 : S(S), UseLoc(UseLoc) {
7561 bool DiagnosedMultipleConstructedBases =
false;
7567 for (
auto *D : Shadow->
redecls()) {
7568 auto *DShadow = cast<ConstructorUsingShadowDecl>(D);
7569 auto *DNominatedBase = DShadow->getNominatedBaseClass();
7570 auto *DConstructedBase = DShadow->getConstructedBaseClass();
7572 InheritedFromBases.insert(
7573 std::make_pair(DNominatedBase->getCanonicalDecl(),
7574 DShadow->getNominatedBaseClassShadowDecl()));
7575 if (DShadow->constructsVirtualBase())
7576 InheritedFromBases.insert(
7577 std::make_pair(DConstructedBase->getCanonicalDecl(),
7578 DShadow->getConstructedBaseClassShadowDecl()));
7580 assert(DNominatedBase == DConstructedBase);
7585 if (!ConstructedBase) {
7586 ConstructedBase = DConstructedBase;
7587 ConstructedBaseIntroducer = D->getIntroducer();
7588 }
else if (ConstructedBase != DConstructedBase &&
7590 if (!DiagnosedMultipleConstructedBases) {
7591 S.Diag(UseLoc, diag::err_ambiguous_inherited_constructor)
7592 << Shadow->getTargetDecl();
7593 S.Diag(ConstructedBaseIntroducer->getLocation(),
7594 diag::note_ambiguous_inherited_constructor_using)
7596 DiagnosedMultipleConstructedBases = true;
7598 S.Diag(D->getIntroducer()->getLocation(),
7599 diag::note_ambiguous_inherited_constructor_using)
7600 << DConstructedBase;
7604 if (DiagnosedMultipleConstructedBases)
7605 Shadow->setInvalidDecl();
7611 std::pair<CXXConstructorDecl *, bool>
7613 auto It = InheritedFromBases.find(
Base->getCanonicalDecl());
7614 if (It == InheritedFromBases.end())
7615 return std::make_pair(
nullptr,
false);
7619 return std::make_pair(
7620 S.findInheritingConstructor(UseLoc, Ctor, It->second),
7621 It->second->constructsVirtualBase());
7624 return std::make_pair(Ctor,
false);
7641 if (InheritedCtor) {
7644 Inherited->findConstructorForBase(ClassDecl, InheritedCtor).first;
7646 return BaseCtor->isConstexpr();
7714 if (Ctor && ClassDecl->
isUnion())
7734 for (
const auto &B : ClassDecl->
bases()) {
7735 auto *BaseClassDecl = B.getType()->getAsCXXRecordDecl();
7739 InheritedCtor, Inherited))
7752 for (
const auto *F : ClassDecl->
fields()) {
7753 if (F->isInvalidDecl())
7756 F->hasInClassInitializer())
7759 if (
const RecordType *RecordTy = BaseType->getAsCanonical<RecordType>()) {
7760 auto *FieldRecDecl =
7763 BaseType.getCVRQualifiers(),
7764 ConstArg && !F->isMutable()))
7779struct ComputingExceptionSpec {
7782 ComputingExceptionSpec(Sema &S, FunctionDecl *FD, SourceLocation Loc)
7784 Sema::CodeSynthesisContext Ctx;
7790 ~ComputingExceptionSpec() {
7796static Sema::ImplicitExceptionSpecification
7800 Sema::InheritedConstructorInfo *ICI);
7802static Sema::ImplicitExceptionSpecification
7807static Sema::ImplicitExceptionSpecification
7810 if (DFK.isSpecialMember())
7813 if (DFK.isComparison())
7815 DFK.asComparison());
7818 assert(CD->getInheritedConstructor() &&
7819 "only defaulted functions and inherited constructors have implicit "
7822 S, Loc, CD->getInheritedConstructor().getShadowDecl());
7849 auto ESI = IES.getExceptionSpec();
7867 PT.getNonReferenceType()->getAsCXXRecordDecl()) {
7888 "not an explicitly-defaulted special member");
7898 bool HadError =
false;
7911 bool ShouldDeleteForTypeMismatch =
false;
7912 unsigned ExpectedParams = 1;
7924 if (DeleteOnTypeMismatch)
7925 ShouldDeleteForTypeMismatch =
true;
7935 bool CanHaveConstParam =
false;
7945 ReturnType =
Type->getReturnType();
7950 std::nullopt, RD,
false);
7951 DeclType =
Context.getAddrSpaceQualType(
7953 QualType ExpectedReturnType =
Context.getLValueReferenceType(DeclType);
7955 if (!
Context.hasSameType(ReturnType, ExpectedReturnType)) {
7956 Diag(MD->
getLocation(), diag::err_defaulted_special_member_return_type)
7958 << ExpectedReturnType;
7964 if (DeleteOnTypeMismatch)
7965 ShouldDeleteForTypeMismatch =
true;
7982 if (!ExplicitObjectParameter.
isNull() &&
7985 Context.getCanonicalTagType(RD)))) {
7986 if (DeleteOnTypeMismatch)
7987 ShouldDeleteForTypeMismatch =
true;
7990 diag::err_defaulted_special_member_explicit_object_mismatch)
8003 bool HasConstParam =
false;
8004 if (ExpectedParams &&
ArgType->isReferenceType()) {
8010 if (DeleteOnTypeMismatch)
8011 ShouldDeleteForTypeMismatch =
true;
8014 diag::err_defaulted_special_member_volatile_param)
8020 if (HasConstParam && !CanHaveConstParam) {
8021 if (DeleteOnTypeMismatch)
8022 ShouldDeleteForTypeMismatch =
true;
8026 diag::err_defaulted_special_member_copy_const_param)
8032 diag::err_defaulted_special_member_move_const_param)
8037 }
else if (ExpectedParams) {
8041 "unexpected non-ref argument");
8075 diag::err_incorrect_defaulted_constexpr_with_vb)
8077 for (
const auto &I : RD->
vbases())
8078 Diag(I.getBeginLoc(), diag::note_constexpr_virtual_base_here);
8096 if (!
Type->hasExceptionSpec()) {
8105 Context.getFunctionType(ReturnType,
Type->getParamTypes(), EPI));
8114 if (ShouldDeleteForTypeMismatch) {
8119 Diag(DefaultLoc, diag::note_replace_equals_default_to_delete)
8123 if (ShouldDeleteForTypeMismatch && !HadError) {
8125 diag::warn_cxx17_compat_defaulted_method_type_mismatch)
8132 Diag(MD->
getLocation(), diag::err_out_of_line_default_deletes) << CSM;
8133 assert(!ShouldDeleteForTypeMismatch &&
"deleted non-first decl");
8155template<
typename Derived,
typename ResultList,
typename Result,
8157class DefaultedComparisonVisitor {
8161 : S(S), RD(RD), FD(FD), DCK(DCK) {
8165 Fns.assign(Info->getUnqualifiedLookups().begin(),
8166 Info->getUnqualifiedLookups().end());
8170 ResultList visit() {
8179 llvm_unreachable(
"not a defaulted comparison");
8183 getDerived().visitSubobjects(Results, RD, ParamLvalType.
getQualifiers());
8188 Results.add(getDerived().visitExpandedSubobject(
8189 ParamLvalType, getDerived().getCompleteObject()));
8192 llvm_unreachable(
"");
8196 Derived &getDerived() {
return static_cast<Derived&
>(*this); }
8202 bool visitSubobjects(ResultList &Results, CXXRecordDecl *
Record,
8206 for (CXXBaseSpecifier &Base :
Record->bases())
8207 if (Results.add(getDerived().visitSubobject(
8209 getDerived().getBase(&Base))))
8213 for (FieldDecl *Field :
Record->fields()) {
8216 if (
Field->isUnnamedBitField())
8218 if (
Field->isInvalidDecl())
8221 if (
Field->isAnonymousStructOrUnion()) {
8222 if (visitSubobjects(Results,
Field->getType()->getAsCXXRecordDecl(),
8229 Qualifiers FieldQuals = Quals;
8230 if (
Field->isMutable())
8232 QualType FieldType =
8235 if (Results.add(getDerived().visitSubobject(
8236 FieldType, getDerived().getField(Field))))
8244 Result visitSubobject(QualType
Type, Subobject Subobj) {
8247 if (
auto *CAT = dyn_cast_or_null<ConstantArrayType>(AT))
8248 return getDerived().visitSubobjectArray(CAT->getElementType(),
8249 CAT->getSize(), Subobj);
8250 return getDerived().visitExpandedSubobject(
Type, Subobj);
8253 Result visitSubobjectArray(QualType
Type,
const llvm::APInt &Size,
8255 return getDerived().visitSubobject(
Type, Subobj);
8263 UnresolvedSet<16> Fns;
8268struct DefaultedComparisonInfo {
8273 static DefaultedComparisonInfo deleted() {
8274 DefaultedComparisonInfo
Deleted;
8279 bool add(
const DefaultedComparisonInfo &R) {
8289struct DefaultedComparisonSubobject {
8297class DefaultedComparisonAnalyzer
8298 :
public DefaultedComparisonVisitor<DefaultedComparisonAnalyzer,
8299 DefaultedComparisonInfo,
8300 DefaultedComparisonInfo,
8301 DefaultedComparisonSubobject> {
8303 enum DiagnosticKind { NoDiagnostics, ExplainDeleted, ExplainConstexpr };
8306 DiagnosticKind Diagnose;
8309 using Base = DefaultedComparisonVisitor;
8310 using Result = DefaultedComparisonInfo;
8311 using Subobject = DefaultedComparisonSubobject;
8315 DefaultedComparisonAnalyzer(Sema &S, CXXRecordDecl *RD, FunctionDecl *FD,
8317 DiagnosticKind Diagnose = NoDiagnostics)
8318 :
Base(S, RD, FD, DCK), Diagnose(Diagnose) {}
8321 if ((DCK == DefaultedComparisonKind::Equal ||
8322 DCK == DefaultedComparisonKind::ThreeWay) &&
8327 if (Diagnose == ExplainDeleted) {
8331 return Result::deleted();
8334 return Base::visit();
8338 Subobject getCompleteObject() {
8339 return Subobject{Subobject::CompleteObject, RD, FD->
getLocation()};
8342 Subobject getBase(CXXBaseSpecifier *Base) {
8343 return Subobject{Subobject::Base,
Base->getType()->getAsCXXRecordDecl(),
8344 Base->getBaseTypeLoc()};
8347 Subobject getField(FieldDecl *Field) {
8348 return Subobject{Subobject::Member,
Field,
Field->getLocation()};
8351 Result visitExpandedSubobject(QualType
Type, Subobject Subobj) {
8355 if (
Type->isReferenceType()) {
8356 if (Diagnose == ExplainDeleted) {
8357 S.
Diag(Subobj.Loc, diag::note_defaulted_comparison_reference_member)
8360 return Result::deleted();
8365 Expr *Args[] = {&Xi, &Xi};
8369 assert(OO !=
OO_None &&
"not an overloaded operator!");
8370 return visitBinaryOperator(OO, Args, Subobj);
8376 OverloadCandidateSet *SpaceshipCandidates =
nullptr) {
8380 OverloadCandidateSet CandidateSet(
8382 OverloadCandidateSet::OperatorRewriteInfo(
8384 !SpaceshipCandidates));
8389 CandidateSet.exclude(FD);
8391 if (Args[0]->
getType()->isOverloadableType())
8402 switch (CandidateSet.BestViableFunction(S, FD->
getLocation(), Best)) {
8408 if ((DCK == DefaultedComparisonKind::NotEqual ||
8409 DCK == DefaultedComparisonKind::Relational) &&
8410 !Best->RewriteKind) {
8411 if (Diagnose == ExplainDeleted) {
8412 if (Best->Function) {
8413 S.
Diag(Best->Function->getLocation(),
8414 diag::note_defaulted_comparison_not_rewritten_callee)
8417 assert(Best->Conversions.size() == 2 &&
8418 Best->Conversions[0].isUserDefined() &&
8419 "non-user-defined conversion from class to built-in "
8421 S.
Diag(Best->Conversions[0]
8422 .UserDefined.FoundConversionFunction.getDecl()
8424 diag::note_defaulted_comparison_not_rewritten_conversion)
8428 return Result::deleted();
8438 CXXRecordDecl *ArgClass = Args[0]->getType()->getAsCXXRecordDecl();
8439 if (ArgClass && Best->FoundDecl.getDecl() &&
8440 Best->FoundDecl.getDecl()->isCXXClassMember()) {
8441 QualType ObjectType = Subobj.Kind == Subobject::Member
8442 ? Args[0]->getType()
8445 ArgClass, Best->FoundDecl, ObjectType, Subobj.Loc,
8446 Diagnose == ExplainDeleted
8447 ? S.
PDiag(diag::note_defaulted_comparison_inaccessible)
8448 << FD << Subobj.Kind << Subobj.Decl
8450 return Result::deleted();
8453 bool NeedsDeducing =
8456 if (FunctionDecl *BestFD = Best->Function) {
8461 assert(!BestFD->isDeleted() &&
"wrong overload resolution result");
8463 if (Diagnose == ExplainConstexpr && !BestFD->isConstexpr()) {
8464 if (Subobj.Kind != Subobject::CompleteObject)
8465 S.
Diag(Subobj.Loc, diag::note_defaulted_comparison_not_constexpr)
8466 << Subobj.
Kind << Subobj.Decl;
8467 S.
Diag(BestFD->getLocation(),
8468 diag::note_defaulted_comparison_not_constexpr_here);
8470 return Result::deleted();
8472 R.Constexpr &= BestFD->isConstexpr();
8474 if (NeedsDeducing) {
8479 if (BestFD->getReturnType()->isUndeducedType() &&
8485 if (Diagnose == NoDiagnostics) {
8488 diag::err_defaulted_comparison_cannot_deduce_undeduced_auto)
8489 << Subobj.
Kind << Subobj.Decl;
8492 diag::note_defaulted_comparison_cannot_deduce_undeduced_auto)
8493 << Subobj.
Kind << Subobj.Decl;
8494 S.
Diag(BestFD->getLocation(),
8495 diag::note_defaulted_comparison_cannot_deduce_callee)
8496 << Subobj.
Kind << Subobj.Decl;
8498 return Result::deleted();
8501 BestFD->getCallResultType());
8503 if (Diagnose == ExplainDeleted) {
8504 S.
Diag(Subobj.Loc, diag::note_defaulted_comparison_cannot_deduce)
8505 << Subobj.
Kind << Subobj.Decl
8506 << BestFD->getCallResultType().withoutLocalFastQualifiers();
8507 S.
Diag(BestFD->getLocation(),
8508 diag::note_defaulted_comparison_cannot_deduce_callee)
8509 << Subobj.
Kind << Subobj.Decl;
8511 return Result::deleted();
8513 R.Category = Info->Kind;
8516 QualType
T = Best->BuiltinParamTypes[0];
8517 assert(
T == Best->BuiltinParamTypes[1] &&
8518 "builtin comparison for different types?");
8519 assert(Best->BuiltinParamTypes[2].isNull() &&
8520 "invalid builtin comparison");
8525 if (Diagnose == ExplainDeleted) {
8527 diag::note_defaulted_comparison_vector_types)
8529 S.
Diag(Subobj.Decl->getLocation(), diag::note_declared_at);
8531 return Result::deleted();
8534 if (NeedsDeducing) {
8535 std::optional<ComparisonCategoryType> Cat =
8537 assert(Cat &&
"no category for builtin comparison?");
8548 if (Diagnose == ExplainDeleted) {
8551 Kind = OO == OO_EqualEqual ? 1 : 2;
8552 CandidateSet.NoteCandidates(
8554 Subobj.Loc, S.
PDiag(diag::note_defaulted_comparison_ambiguous)
8555 << FD << Kind << Subobj.Kind << Subobj.Decl),
8558 R = Result::deleted();
8562 if (Diagnose == ExplainDeleted) {
8563 if ((DCK == DefaultedComparisonKind::NotEqual ||
8564 DCK == DefaultedComparisonKind::Relational) &&
8565 !Best->RewriteKind) {
8566 S.
Diag(Best->Function->getLocation(),
8567 diag::note_defaulted_comparison_not_rewritten_callee)
8571 diag::note_defaulted_comparison_calls_deleted)
8572 << FD << Subobj.
Kind << Subobj.Decl;
8576 R = Result::deleted();
8582 if (OO == OO_Spaceship &&
8586 if (!
R.add(visitBinaryOperator(OO_EqualEqual, Args, Subobj,
8588 R.add(visitBinaryOperator(OO_Less, Args, Subobj, &CandidateSet));
8592 if (Diagnose == ExplainDeleted) {
8593 S.
Diag(Subobj.Loc, diag::note_defaulted_comparison_no_viable_function)
8594 << FD << (OO == OO_EqualEqual || OO == OO_ExclaimEqual)
8595 << Subobj.
Kind << Subobj.Decl;
8599 if (SpaceshipCandidates) {
8600 SpaceshipCandidates->NoteCandidates(
8605 diag::note_defaulted_comparison_no_viable_function_synthesized)
8606 << (OO == OO_EqualEqual ? 0 : 1);
8609 CandidateSet.NoteCandidates(
8614 R = Result::deleted();
8623struct StmtListResult {
8624 bool IsInvalid =
false;
8625 llvm::SmallVector<Stmt*, 16> Stmts;
8628 IsInvalid |= S.isInvalid();
8631 Stmts.push_back(S.get());
8638class DefaultedComparisonSynthesizer
8639 :
public DefaultedComparisonVisitor<DefaultedComparisonSynthesizer,
8640 StmtListResult, StmtResult,
8641 std::pair<ExprResult, ExprResult>> {
8643 unsigned ArrayDepth = 0;
8646 using Base = DefaultedComparisonVisitor;
8647 using ExprPair = std::pair<ExprResult, ExprResult>;
8651 DefaultedComparisonSynthesizer(Sema &S, CXXRecordDecl *RD, FunctionDecl *FD,
8653 SourceLocation BodyLoc)
8654 :
Base(S, RD, FD, DCK), Loc(BodyLoc) {}
8658 Sema::CompoundScopeRAII CompoundScope(S);
8660 StmtListResult Stmts = visit();
8661 if (Stmts.IsInvalid)
8666 case DefaultedComparisonKind::None:
8667 llvm_unreachable(
"not a defaulted comparison");
8669 case DefaultedComparisonKind::Equal: {
8678 auto OldStmts = std::move(Stmts.Stmts);
8679 Stmts.Stmts.clear();
8682 auto FinishCmp = [&] {
8683 if (Expr *Prior = CmpSoFar.
get()) {
8685 if (RetVal.
isUnset() && Stmts.Stmts.empty())
8688 else if (Stmts.add(buildIfNotCondReturnFalse(Prior)))
8694 for (Stmt *EAsStmt : llvm::reverse(OldStmts)) {
8695 Expr *E = dyn_cast<Expr>(EAsStmt);
8698 if (FinishCmp() || Stmts.add(EAsStmt))
8707 CmpSoFar = S.CreateBuiltinBinOp(Loc, BO_LAnd, E, CmpSoFar.
get());
8713 std::reverse(Stmts.Stmts.begin(), Stmts.Stmts.end());
8716 RetVal = S.ActOnCXXBoolLiteral(Loc, tok::kw_true);
8720 case DefaultedComparisonKind::ThreeWay: {
8724 ComparisonCategoryType::StrongOrdering, Loc,
8725 Sema::ComparisonCategoryUsage::DefaultedOperator);
8728 VarDecl *EqualVD = S.Context.CompCategories.getInfoForType(
StrongOrdering)
8729 .getValueInfo(ComparisonCategoryResult::Equal)
8731 RetVal = getDecl(EqualVD);
8734 RetVal = buildStaticCastToR(RetVal.
get());
8738 case DefaultedComparisonKind::NotEqual:
8739 case DefaultedComparisonKind::Relational:
8740 RetVal =
cast<Expr>(Stmts.Stmts.pop_back_val());
8747 StmtResult ReturnStmt = S.BuildReturnStmt(Loc, RetVal.
get());
8748 if (ReturnStmt.isInvalid())
8750 Stmts.Stmts.push_back(ReturnStmt.get());
8752 return S.ActOnCompoundStmt(Loc, Loc, Stmts.Stmts,
false);
8757 return S.BuildDeclarationNameExpr(
8758 CXXScopeSpec(), DeclarationNameInfo(VD->
getDeclName(), Loc), VD);
8766 ExprPair getCompleteObject() {
8769 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD);
8770 MD && MD->isImplicitObjectMemberFunction()) {
8772 LHS = S.ActOnCXXThis(Loc);
8774 LHS = S.CreateBuiltinUnaryOp(Loc, UO_Deref, LHS.
get());
8776 LHS = getParam(Param++);
8783 ExprPair getBase(CXXBaseSpecifier *Base) {
8784 ExprPair Obj = getCompleteObject();
8785 if (Obj.first.isInvalid() || Obj.second.isInvalid())
8788 const auto CastToBase = [&](Expr *E) {
8789 QualType ToType = S.Context.getQualifiedType(
8791 return S.ImpCastExprToType(E, ToType, CK_DerivedToBase,
VK_LValue, &Path);
8793 return {CastToBase(Obj.first.get()), CastToBase(Obj.second.get())};
8796 ExprPair getField(FieldDecl *Field) {
8797 ExprPair Obj = getCompleteObject();
8798 if (Obj.first.isInvalid() || Obj.second.isInvalid())
8802 DeclarationNameInfo NameInfo(
Field->getDeclName(), Loc);
8803 return {S.BuildFieldReferenceExpr(Obj.first.get(),
false, Loc,
8804 CXXScopeSpec(), Field,
Found, NameInfo),
8805 S.BuildFieldReferenceExpr(Obj.second.get(),
false, Loc,
8806 CXXScopeSpec(), Field,
Found, NameInfo)};
8816 ExprResult NotCond = S.CreateBuiltinUnaryOp(Loc, UO_LNot, Cond.
get());
8821 assert(!
False.isInvalid() &&
"should never fail");
8823 if (ReturnFalse.isInvalid())
8826 return S.ActOnIfStmt(Loc, IfStatementKind::Ordinary, Loc,
nullptr,
8827 S.ActOnCondition(
nullptr, Loc, NotCond.
get(),
8828 Sema::ConditionKind::Boolean),
8829 Loc, ReturnFalse.get(), SourceLocation(),
nullptr);
8834 QualType SizeType = S.Context.getSizeType();
8835 Size =
Size.zextOrTrunc(S.Context.getTypeSize(SizeType));
8838 IdentifierInfo *IterationVarName =
nullptr;
8841 llvm::raw_svector_ostream
OS(Str);
8842 OS <<
"i" << ArrayDepth;
8843 IterationVarName = &S.Context.Idents.get(
OS.str());
8846 S.Context, S.CurContext, Loc, Loc, IterationVarName, SizeType,
8847 S.Context.getTrivialTypeSourceInfo(SizeType, Loc),
SC_None);
8848 llvm::APInt
Zero(S.Context.getTypeSize(SizeType), 0);
8851 Stmt *
Init =
new (S.Context) DeclStmt(DeclGroupRef(IterationVar), Loc, Loc);
8853 auto IterRef = [&] {
8855 CXXScopeSpec(), DeclarationNameInfo(IterationVarName, Loc),
8857 assert(!Ref.
isInvalid() &&
"can't reference our own variable?");
8863 Loc, BO_NE, IterRef(),
8865 assert(!Cond.
isInvalid() &&
"should never fail");
8868 ExprResult Inc = S.CreateBuiltinUnaryOp(Loc, UO_PreInc, IterRef());
8869 assert(!
Inc.isInvalid() &&
"should never fail");
8875 return S.CreateBuiltinArraySubscriptExpr(E.get(), Loc, IterRef(), Loc);
8877 Subobj.first = Index(Subobj.first);
8878 Subobj.second = Index(Subobj.second);
8885 if (Substmt.isInvalid())
8891 if (Expr *ElemCmp = dyn_cast<Expr>(Substmt.get())) {
8892 assert(DCK == DefaultedComparisonKind::Equal &&
8893 "should have non-expression statement");
8894 Substmt = buildIfNotCondReturnFalse(ElemCmp);
8895 if (Substmt.isInvalid())
8900 return S.ActOnForStmt(Loc, Loc,
Init,
8901 S.ActOnCondition(
nullptr, Loc, Cond.
get(),
8902 Sema::ConditionKind::Boolean),
8903 S.MakeFullDiscardedValueExpr(
Inc.get()), Loc,
8908 if (Obj.first.isInvalid() || Obj.second.isInvalid())
8914 if (
Type->isOverloadableType())
8915 Op = S.CreateOverloadedBinOp(Loc, Opc, Fns, Obj.first.get(),
8916 Obj.second.get(),
true,
8919 Op = S.CreateBuiltinBinOp(Loc, Opc, Obj.first.get(), Obj.second.get());
8924 case DefaultedComparisonKind::None:
8925 llvm_unreachable(
"not a defaulted comparison");
8927 case DefaultedComparisonKind::Equal:
8930 Op = S.PerformContextuallyConvertToBool(Op.
get());
8935 case DefaultedComparisonKind::ThreeWay: {
8940 Op = buildStaticCastToR(Op.
get());
8945 IdentifierInfo *Name = &S.Context.Idents.get(
"cmp");
8948 S.Context.getTrivialTypeSourceInfo(R, Loc),
SC_None);
8949 S.AddInitializerToDecl(VD, Op.
get(),
false);
8950 Stmt *InitStmt =
new (S.Context) DeclStmt(DeclGroupRef(VD), Loc, Loc);
8956 llvm::APInt ZeroVal(S.Context.getIntWidth(S.Context.IntTy), 0);
8961 Comp = S.CreateOverloadedBinOp(Loc, BO_NE, Fns, VDRef.
get(),
Zero,
true,
8964 Comp = S.CreateBuiltinBinOp(Loc, BO_NE, VDRef.
get(),
Zero);
8965 if (
Comp.isInvalid())
8967 Sema::ConditionResult Cond = S.ActOnCondition(
8968 nullptr, Loc,
Comp.get(), Sema::ConditionKind::Boolean);
8973 VDRef = getDecl(VD);
8976 StmtResult ReturnStmt = S.BuildReturnStmt(Loc, VDRef.
get());
8977 if (ReturnStmt.isInvalid())
8981 return S.ActOnIfStmt(Loc, IfStatementKind::Ordinary, Loc, InitStmt, Cond,
8982 Loc, ReturnStmt.get(),
8983 SourceLocation(),
nullptr);
8986 case DefaultedComparisonKind::NotEqual:
8987 case DefaultedComparisonKind::Relational:
8992 llvm_unreachable(
"");
8998 assert(!
R->isUndeducedType() &&
"type should have been deduced already");
9003 return S.BuildCXXNamedCast(Loc, tok::kw_static_cast,
9004 S.Context.getTrivialTypeSourceInfo(R, Loc), E,
9005 SourceRange(Loc, Loc), SourceRange(Loc, Loc));
9016 Self.LookupOverloadedOperatorName(OO, S, Operators);
9029 if (Op == OO_Spaceship) {
9030 Lookup(OO_ExclaimEqual);
9032 Lookup(OO_EqualEqual);
9063 assert(!MD->isStatic() &&
"comparison function cannot be a static member");
9065 if (MD->getRefQualifier() ==
RQ_RValue) {
9066 Diag(MD->getLocation(), diag::err_ref_qualifier_comparison_operator);
9072 MD->setType(
Context.getFunctionType(FPT->getReturnType(),
9073 FPT->getParamTypes(), EPI));
9079 QualType T = MD->getFunctionObjectParameterReferenceType();
9080 if (!
T.getNonReferenceType().isConstQualified() &&
9081 (MD->isImplicitObjectMemberFunction() ||
T->isLValueReferenceType())) {
9083 if (MD->isExplicitObjectMemberFunction()) {
9084 Loc = MD->getParamDecl(0)->getBeginLoc();
9086 MD->getParamDecl(0)->getExplicitObjectParamThisLoc());
9088 Loc = MD->getLocation();
9094 if (!MD->isImplicit()) {
9095 Diag(Loc, diag::err_defaulted_comparison_non_const)
9100 if (MD->isExplicitObjectMemberFunction()) {
9101 assert(
T->isLValueReferenceType());
9102 MD->getParamDecl(0)->setType(
Context.getLValueReferenceType(
9103 T.getNonReferenceType().withConst()));
9108 MD->setType(
Context.getFunctionType(FPT->getReturnType(),
9109 FPT->getParamTypes(), EPI));
9113 if (MD->isVolatile()) {
9114 Diag(MD->getLocation(), diag::err_volatile_comparison_operator);
9120 MD->setType(
Context.getFunctionType(FPT->getReturnType(),
9121 FPT->getParamTypes(), EPI));
9127 (IsMethod ? 1 : 2)) {
9131 <<
int(IsMethod) <<
int(DCK);
9137 QualType ParmTy = Param->getType();
9144 ExpectedTy =
Context.getCanonicalTagType(RD);
9146 CTy = Ref->getPointeeType();
9156 RD = CTy->getAsCXXRecordDecl();
9157 Ok &= RD !=
nullptr;
9171 <<
int(DCK) << ParmTy << RefTy <<
int(!IsMethod) << PlainTy
9172 << Param->getSourceRange();
9174 assert(!IsMethod &&
"should know expected type for method");
9176 diag::err_defaulted_comparison_param_unknown)
9177 <<
int(DCK) << ParmTy << Param->getSourceRange();
9183 Diag(FD->
getLocation(), diag::err_defaulted_comparison_param_mismatch)
9185 << ParmTy << Param->getSourceRange();
9190 assert(RD &&
"must have determined class");
9199 diag::err_defaulted_comparison_not_friend,
int(DCK),
9204 return declaresSameEntity(F->getFriendDecl(), FD);
9207 <<
int(DCK) <<
int(0) << RD;
9219 Diag(FD->
getLocation(), diag::err_defaulted_comparison_return_type_not_bool)
9229 RT->getContainedDeducedType() &&
9231 RT->getContainedAutoType()->isConstrained())) {
9233 diag::err_defaulted_comparison_deduced_return_type_not_auto)
9245 DefaultedComparisonInfo Info =
9246 DefaultedComparisonAnalyzer(*
this, RD, FD, DCK).visit();
9260 DefaultedComparisonAnalyzer(*
this, RD, FD, DCK,
9261 DefaultedComparisonAnalyzer::ExplainDeleted)
9272 diag::note_previous_declaration);
9284 DefaultedComparisonAnalyzer(*
this, RD, FD, DCK,
9285 DefaultedComparisonAnalyzer::ExplainDeleted)
9307 Context.adjustDeducedFunctionResultType(
9335 Diag(FD->
getBeginLoc(), diag::err_defaulted_comparison_constexpr_mismatch)
9337 DefaultedComparisonAnalyzer(*
this, RD, FD, DCK,
9338 DefaultedComparisonAnalyzer::ExplainConstexpr)
9359 EPI.ExceptionSpec.SourceDecl = FD;
9361 FPT->getParamTypes(), EPI));
9376 EqualEqual->setImplicit();
9391 Scope.addContextNote(UseLoc);
9393 DefaultedFunctionFPFeaturesRAII RestoreFP(*
this, FD);
9400 CXXRecordDecl *RD = PT.getNonReferenceType()->getAsCXXRecordDecl();
9404 DefaultedComparisonSynthesizer(*
this, RD, FD, DCK, BodyLoc).build();
9418 L->CompletedImplicitDefinition(FD);
9425 ComputingExceptionSpec CES(S, FD, Loc);
9455 DefaultedComparisonSynthesizer(S, RD, FD, DCK, BodyLoc).build();
9456 if (!Body.isInvalid())
9477 for (
auto &Check : Overriding)
9489template<
typename Derived>
9490struct SpecialMemberVisitor {
9497 bool IsConstructor =
false, IsAssignment =
false, ConstArg =
false;
9501 : S(S), MD(MD), CSM(CSM), ICI(ICI) {
9506 IsConstructor =
true;
9510 IsAssignment =
true;
9515 llvm_unreachable(
"invalid special member kind");
9519 if (const ReferenceType *RT =
9520 MD->getNonObjectParameter(0)->getType()->getAs<ReferenceType>())
9521 ConstArg = RT->getPointeeType().isConstQualified();
9525 Derived &getDerived() {
return static_cast<Derived&
>(*this); }
9528 bool isMove()
const {
9529 return CSM == CXXSpecialMemberKind::MoveConstructor ||
9530 CSM == CXXSpecialMemberKind::MoveAssignment;
9534 Sema::SpecialMemberOverloadResult lookupIn(CXXRecordDecl *
Class,
9535 unsigned Quals,
bool IsMutable) {
9537 ConstArg && !IsMutable);
9542 Sema::SpecialMemberOverloadResult lookupInheritedCtor(CXXRecordDecl *
Class) {
9545 assert(CSM == CXXSpecialMemberKind::DefaultConstructor);
9554 typedef llvm::PointerUnion<CXXBaseSpecifier*, FieldDecl*> Subobject;
9557 static SourceLocation getSubobjectLoc(Subobject Subobj) {
9560 if (
auto *B = dyn_cast<CXXBaseSpecifier *>(Subobj))
9561 return B->getBaseTypeLoc();
9568 VisitNonVirtualBases,
9573 VisitPotentiallyConstructedBases,
9579 bool visit(BasesToVisit Bases) {
9582 if (Bases == VisitPotentiallyConstructedBases)
9583 Bases = RD->
isAbstract() ? VisitNonVirtualBases : VisitAllBases;
9585 for (
auto &B : RD->
bases())
9586 if ((Bases == VisitDirectBases || !B.isVirtual()) &&
9587 getDerived().visitBase(&B))
9590 if (Bases == VisitAllBases)
9591 for (
auto &B : RD->
vbases())
9592 if (getDerived().visitBase(&B))
9595 for (
auto *F : RD->
fields())
9596 if (!F->isInvalidDecl() && !F->isUnnamedBitField() &&
9597 getDerived().visitField(F))
9606struct SpecialMemberDeletionInfo
9607 : SpecialMemberVisitor<SpecialMemberDeletionInfo> {
9612 bool AllFieldsAreConst;
9614 SpecialMemberDeletionInfo(Sema &S, CXXMethodDecl *MD,
9616 Sema::InheritedConstructorInfo *ICI,
bool Diagnose)
9617 : SpecialMemberVisitor(S, MD, CSM, ICI), Diagnose(Diagnose),
9618 Loc(MD->getLocation()), AllFieldsAreConst(
true) {}
9623 return ICI ? CXXSpecialMemberKind::Invalid : CSM;
9626 bool shouldDeleteForVariantObjCPtrMember(FieldDecl *FD, QualType FieldType);
9628 bool shouldDeleteForVariantPtrAuthMember(
const FieldDecl *FD);
9630 bool visitBase(CXXBaseSpecifier *Base) {
return shouldDeleteForBase(Base); }
9631 bool visitField(FieldDecl *Field) {
return shouldDeleteForField(Field); }
9633 bool shouldDeleteForBase(CXXBaseSpecifier *Base);
9634 bool shouldDeleteForField(FieldDecl *FD);
9635 bool shouldDeleteForAllConstMembers();
9637 bool shouldDeleteForClassSubobject(CXXRecordDecl *
Class, Subobject Subobj,
9639 bool shouldDeleteForSubobjectCall(Subobject Subobj,
9640 Sema::SpecialMemberOverloadResult SMOR,
9641 bool IsDtorCallInCtor);
9643 bool isAccessible(Subobject Subobj, CXXMethodDecl *D);
9649bool SpecialMemberDeletionInfo::isAccessible(Subobject Subobj,
9650 CXXMethodDecl *target) {
9655 if (CXXBaseSpecifier *base = dyn_cast<CXXBaseSpecifier *>(Subobj)) {
9670bool SpecialMemberDeletionInfo::shouldDeleteForSubobjectCall(
9671 Subobject Subobj, Sema::SpecialMemberOverloadResult SMOR,
9672 bool IsDtorCallInCtor) {
9674 FieldDecl *
Field = dyn_cast<FieldDecl *>(Subobj);
9683 } DiagKind = NotSet;
9686 if (CSM == CXXSpecialMemberKind::DefaultConstructor && Field &&
9687 Field->getParent()->isUnion()) {
9697 DiagKind = !
Decl ? NoDecl : DeletedDecl;
9699 DiagKind = MultipleDecl;
9700 else if (!isAccessible(Subobj, Decl))
9701 DiagKind = InaccessibleDecl;
9702 else if (!IsDtorCallInCtor && Field &&
Field->getParent()->isUnion() &&
9703 !
Decl->isTrivial()) {
9709 if (CSM == CXXSpecialMemberKind::DefaultConstructor) {
9717 DiagKind = NonTrivialDecl;
9719 DiagKind = NonTrivialDecl;
9723 if (DiagKind == NotSet)
9729 diag::note_deleted_special_member_class_subobject)
9731 << DiagKind << IsDtorCallInCtor <<
false;
9735 diag::note_deleted_special_member_class_subobject)
9736 << getEffectiveCSM() << MD->
getParent() <<
false
9737 <<
Base->getType() << DiagKind << IsDtorCallInCtor
9741 if (DiagKind == DeletedDecl)
9751bool SpecialMemberDeletionInfo::shouldDeleteForClassSubobject(
9752 CXXRecordDecl *
Class, Subobject Subobj,
unsigned Quals) {
9753 FieldDecl *
Field = dyn_cast<FieldDecl *>(Subobj);
9754 bool IsMutable =
Field &&
Field->isMutable();
9770 if (!(CSM == CXXSpecialMemberKind::DefaultConstructor && Field &&
9771 Field->hasInClassInitializer()) &&
9772 shouldDeleteForSubobjectCall(Subobj, lookupIn(
Class, Quals, IsMutable),
9779 if (IsConstructor) {
9780 Sema::SpecialMemberOverloadResult SMOR =
9782 false,
false,
false,
false);
9783 if (shouldDeleteForSubobjectCall(Subobj, SMOR,
true))
9790bool SpecialMemberDeletionInfo::shouldDeleteForVariantObjCPtrMember(
9791 FieldDecl *FD, QualType FieldType) {
9800 if (CSM == CXXSpecialMemberKind::DefaultConstructor &&
9806 S.
Diag(FD->
getLocation(), diag::note_deleted_special_member_class_subobject)
9807 << getEffectiveCSM() << ParentClass <<
true << FD << 4
9814bool SpecialMemberDeletionInfo::shouldDeleteForVariantPtrAuthMember(
9815 const FieldDecl *FD) {
9824 if (CSM == CXXSpecialMemberKind::DefaultConstructor ||
9825 CSM == CXXSpecialMemberKind::Destructor)
9830 S.
Diag(FD->
getLocation(), diag::note_deleted_special_member_class_subobject)
9831 << getEffectiveCSM() << ParentClass <<
true << FD << 4
9840bool SpecialMemberDeletionInfo::shouldDeleteForBase(CXXBaseSpecifier *Base) {
9841 CXXRecordDecl *BaseClass =
Base->getType()->getAsCXXRecordDecl();
9848 Sema::SpecialMemberOverloadResult SMOR = lookupInheritedCtor(BaseClass);
9849 if (
auto *BaseCtor = SMOR.
getMethod()) {
9854 if (BaseCtor->isDeleted() && Diagnose) {
9856 diag::note_deleted_special_member_class_subobject)
9857 << getEffectiveCSM() << MD->
getParent() <<
false
9858 <<
Base->getType() << 1 <<
false
9862 return BaseCtor->isDeleted();
9864 return shouldDeleteForClassSubobject(BaseClass, Base, 0);
9869bool SpecialMemberDeletionInfo::shouldDeleteForField(FieldDecl *FD) {
9873 if (inUnion() && shouldDeleteForVariantObjCPtrMember(FD, FieldType))
9876 if (inUnion() && shouldDeleteForVariantPtrAuthMember(FD))
9879 if (CSM == CXXSpecialMemberKind::DefaultConstructor) {
9884 S.
Diag(FD->
getLocation(), diag::note_deleted_default_ctor_uninit_field)
9885 << !!ICI << MD->
getParent() << FD << FieldType << 0;
9895 S.
Diag(FD->
getLocation(), diag::note_deleted_default_ctor_uninit_field)
9901 AllFieldsAreConst =
false;
9902 }
else if (CSM == CXXSpecialMemberKind::CopyConstructor) {
9907 S.
Diag(FD->
getLocation(), diag::note_deleted_copy_ctor_rvalue_reference)
9911 }
else if (IsAssignment) {
9916 << isMove() << MD->
getParent() << FD << FieldType << 0;
9931 if (!inUnion() && FieldRecord->
isUnion() &&
9933 bool AllVariantFieldsAreConst =
true;
9936 for (
auto *UI : FieldRecord->
fields()) {
9939 if (shouldDeleteForVariantObjCPtrMember(&*UI, UnionFieldType))
9942 if (shouldDeleteForVariantPtrAuthMember(&*UI))
9946 AllVariantFieldsAreConst =
false;
9949 if (UnionFieldRecord &&
9950 shouldDeleteForClassSubobject(UnionFieldRecord, UI,
9956 if (CSM == CXXSpecialMemberKind::DefaultConstructor &&
9957 AllVariantFieldsAreConst && !FieldRecord->
field_empty()) {
9960 diag::note_deleted_default_ctor_all_const)
9971 if (shouldDeleteForClassSubobject(FieldRecord, FD,
9982bool SpecialMemberDeletionInfo::shouldDeleteForAllConstMembers() {
9985 if (CSM == CXXSpecialMemberKind::DefaultConstructor && inUnion() &&
9986 AllFieldsAreConst) {
9987 bool AnyFields =
false;
9989 if ((AnyFields = !F->isUnnamedBitField()))
9995 diag::note_deleted_default_ctor_all_const)
10041 bool DeletesOnlyMatchingCopy =
10046 (!DeletesOnlyMatchingCopy ||
10051 for (
auto *I : RD->
ctors()) {
10052 if (I->isMoveConstructor()) {
10053 UserDeclaredMove = I;
10057 assert(UserDeclaredMove);
10059 (!DeletesOnlyMatchingCopy ||
10064 for (
auto *I : RD->
methods()) {
10065 if (I->isMoveAssignmentOperator()) {
10066 UserDeclaredMove = I;
10070 assert(UserDeclaredMove);
10073 if (UserDeclaredMove) {
10075 diag::note_deleted_copy_user_declared_move)
10092 Context.DeclarationNames.getCXXOperatorName(OO_Delete);
10097 OperatorDelete, IDP,
10105 SpecialMemberDeletionInfo SMI(*
this, MD, CSM, ICI,
Diagnose);
10113 if (SMI.visit(SMI.IsAssignment ? SMI.VisitDirectBases
10114 : SMI.VisitPotentiallyConstructedBases))
10117 if (SMI.shouldDeleteForAllConstMembers())
10128 auto RealCSM = CSM;
10132 return CUDA().inferTargetForImplicitSpecialMember(RD, RealCSM, MD,
10141 assert(DFK &&
"not a defaultable function");
10148 DefaultedComparisonAnalyzer(
10150 DFK.
asComparison(), DefaultedComparisonAnalyzer::ExplainDeleted)
10171 *Selected =
nullptr;
10175 llvm_unreachable(
"not a special member");
10193 for (
auto *CI : RD->
ctors()) {
10194 if (!CI->isDefaultConstructor())
10201 *Selected = DefCtor;
10234 }
else if (!Selected) {
10242 goto NeedOverloadResolution;
10252 }
else if (!Selected) {
10257 goto NeedOverloadResolution;
10261 NeedOverloadResolution:
10290 llvm_unreachable(
"unknown special method kind");
10294 for (
auto *CI : RD->
ctors())
10295 if (!CI->isImplicit())
10302 dyn_cast<CXXConstructorDecl>(TI->getTemplatedDecl()))
10332 ConstRHS, TAH, Diagnose ? &Selected :
nullptr))
10340 S.
Diag(SubobjLoc, diag::note_nontrivial_no_def_ctor)
10343 S.
Diag(CD->getLocation(), diag::note_user_declared_ctor);
10344 }
else if (!Selected)
10345 S.
Diag(SubobjLoc, diag::note_nontrivial_no_copy)
10350 << Kind << SubType.getUnqualifiedType() << CSM;
10352 S.
Diag(SubobjLoc, diag::note_nontrivial_user_provided)
10353 << Kind << SubType.getUnqualifiedType() << CSM;
10358 S.
Diag(SubobjLoc, diag::note_nontrivial_subobject)
10359 << Kind << SubType.getUnqualifiedType() << CSM;
10375 for (
const auto *FI : RD->
fields()) {
10376 if (FI->isInvalidDecl() || FI->isUnnamedBitField())
10382 if (FI->isAnonymousStructOrUnion()) {
10384 CSM, ConstArg, TAH, Diagnose))
10394 FI->hasInClassInitializer()) {
10396 S.
Diag(FI->getLocation(), diag::note_nontrivial_default_member_init)
10407 S.
Diag(FI->getLocation(), diag::note_nontrivial_objc_ownership)
10412 bool ConstRHS = ConstArg && !FI->isMutable();
10436 "not special enough");
10440 bool ConstArg =
false;
10464 const bool ClangABICompat14 =
10465 Context.getLangOpts().isCompatibleWith(LangOptions::ClangABI::Ver14);
10468 ClangABICompat14)) {
10472 <<
Context.getLValueReferenceType(
10473 Context.getCanonicalTagType(RD).withConst());
10491 <<
Context.getRValueReferenceType(
Context.getCanonicalTagType(RD));
10498 llvm_unreachable(
"not a special member");
10504 diag::note_nontrivial_default_arg)
10523 for (
const auto &BI : RD->
bases())
10565 Diag(BS.
getBeginLoc(), diag::note_nontrivial_has_virtual) << RD << 1;
10570 for (
const auto *MI : RD->
methods()) {
10571 if (MI->isVirtual()) {
10573 Diag(MLoc, diag::note_nontrivial_has_virtual) << RD << 0;
10578 llvm_unreachable(
"dynamic class with no vbases and no virtual functions");
10586struct FindHiddenVirtualMethod {
10594 static bool CheckMostOverridenMethods(
10596 const llvm::SmallPtrSetImpl<const CXXMethodDecl *> &Methods) {
10600 if (CheckMostOverridenMethods(O, Methods))
10610 auto *BaseRecord = Specifier->getType()->castAsRecordDecl();
10614 bool foundSameNameMethod =
false;
10616 for (Path.
Decls = BaseRecord->lookup(Name).begin();
10621 foundSameNameMethod =
true;
10638 if (!CheckMostOverridenMethods(MD, OverridenAndUsingBaseMethods))
10639 overloadedMethods.push_back(MD);
10643 if (foundSameNameMethod)
10644 OverloadedMethods.append(overloadedMethods.begin(),
10645 overloadedMethods.end());
10646 return foundSameNameMethod;
10653 llvm::SmallPtrSetImpl<const CXXMethodDecl *>& Methods) {
10669 FindHiddenVirtualMethod FHVM;
10678 ND = shad->getTargetDecl();
10684 OverloadedMethods = FHVM.OverloadedMethods;
10689 for (
const CXXMethodDecl *overloadedMD : OverloadedMethods) {
10691 diag::note_hidden_overloaded_virtual_declared_here) << overloadedMD;
10693 Diag(overloadedMD->getLocation(), PD);
10706 if (!OverloadedMethods.empty()) {
10708 << MD << (OverloadedMethods.size() > 1);
10715 auto PrintDiagAndRemoveAttr = [&](
unsigned N) {
10718 Diag(RD.
getAttr<TrivialABIAttr>()->getLocation(),
10719 diag::ext_cannot_use_trivial_abi) << &RD;
10720 Diag(RD.
getAttr<TrivialABIAttr>()->getLocation(),
10721 diag::note_cannot_use_trivial_abi_reason) << &RD << N;
10728 PrintDiagAndRemoveAttr(1);
10732 for (
const auto &B : RD.
bases()) {
10735 if (!B.getType()->isDependentType() &&
10736 !B.getType()->getAsCXXRecordDecl()->canPassInRegisters()) {
10737 PrintDiagAndRemoveAttr(2);
10741 if (B.isVirtual()) {
10742 PrintDiagAndRemoveAttr(3);
10747 for (
const auto *FD : RD.
fields()) {
10752 PrintDiagAndRemoveAttr(4);
10758 PrintDiagAndRemoveAttr(6);
10762 if (
const auto *RT =
10764 if (!RT->isDependentType() &&
10766 ->canPassInRegisters()) {
10767 PrintDiagAndRemoveAttr(5);
10776 auto HasNonDeletedCopyOrMoveConstructor = [&]() {
10788 if (CD->isCopyOrMoveConstructor() && !CD->isDeleted())
10793 if (!HasNonDeletedCopyOrMoveConstructor()) {
10794 PrintDiagAndRemoveAttr(0);
10802 diag::err_incomplete_type_vtable_pointer_auth))
10810 assert(PrimaryBase);
10813 if (!BasePtr.getType()->getAsCXXRecordDecl()->isDynamicClass())
10815 Base = BasePtr.getType()->getAsCXXRecordDecl();
10818 if (!
Base ||
Base == PrimaryBase || !
Base->isPolymorphic())
10820 Diag(RD.
getAttr<VTablePointerAuthenticationAttr>()->getLocation(),
10821 diag::err_non_top_level_vtable_pointer_auth)
10823 PrimaryBase =
Base;
10827 Diag(RD.
getAttr<VTablePointerAuthenticationAttr>()->getLocation(),
10828 diag::err_non_polymorphic_vtable_pointer_auth)
10841 if (AL.getKind() != ParsedAttr::AT_Visibility)
10844 Diag(AL.getLoc(), diag::warn_attribute_after_definition_ignored) << AL;
10852 LBrac, RBrac, AttrList);
10874 Spaceships.clear();
10880 Spaceships.push_back(FD);
10889 if (
auto *FD = dyn_cast<FunctionDecl>(ND))
10890 if (FD->isExplicitlyDefaulted())
10891 Spaceships.push_back(FD);
10921 else if (
Context.getTargetInfo().getCXXABI().isMicrosoft() &&
10986 DefaultedSpaceships);
10987 for (
auto *FD : DefaultedSpaceships)
10994 llvm::function_ref<
Scope *()> EnterScope) {
11002 DeclContext *LookupDC = dyn_cast<DeclContext>(D);
11006 ParameterLists.push_back(TPL);
11010 ParameterLists.push_back(FTD->getTemplateParameters());
11011 }
else if (
VarDecl *VD = dyn_cast<VarDecl>(D)) {
11015 ParameterLists.push_back(VTD->getTemplateParameters());
11016 else if (
auto *PSD = dyn_cast<VarTemplatePartialSpecializationDecl>(D))
11017 ParameterLists.push_back(PSD->getTemplateParameters());
11019 }
else if (
TagDecl *TD = dyn_cast<TagDecl>(D)) {
11021 ParameterLists.push_back(TPL);
11025 ParameterLists.push_back(CTD->getTemplateParameters());
11026 else if (
auto *PSD = dyn_cast<ClassTemplatePartialSpecializationDecl>(D))
11027 ParameterLists.push_back(PSD->getTemplateParameters());
11032 unsigned Count = 0;
11033 Scope *InnermostTemplateScope =
nullptr;
11037 if (Params->size() == 0)
11040 InnermostTemplateScope = EnterScope();
11042 if (Param->getDeclName()) {
11043 InnermostTemplateScope->
AddDecl(Param);
11051 if (InnermostTemplateScope) {
11052 assert(LookupDC &&
"no enclosing DeclContext for template lookup");
11060 if (!RecordD)
return;
11067 if (!RecordD)
return;
11076 if (Param->getDeclName())
11095 if (Param->getDeclName())
11115 if (!
Method->isInvalidDecl())
11124 bool DiagOccurred =
false;
11126 [DiagID, &S, &DiagOccurred](
DeclSpec::TQ, StringRef QualName,
11133 DiagOccurred =
true;
11151 S.
Diag(PointerLoc, diag::err_invalid_ctor_dtor_decl)
11219 = dyn_cast<CXXRecordDecl>(
Constructor->getDeclContext());
11230 !
Constructor->isFunctionTemplateSpecialization()) {
11232 Constructor->getParamDecl(0)->getType()->getCanonicalTypeUnqualified();
11234 if (ParamType == ClassTy) {
11236 const char *ConstRef
11237 =
Constructor->getParamDecl(0)->getIdentifier() ?
"const &"
11239 Diag(ParamLoc, diag::err_constructor_byvalue_arg)
11261 Context.DeclarationNames.getCXXOperatorName(OO_Delete);
11264 Loc, RD,
true,
false, Name)) {
11265 Expr *ThisArg =
nullptr;
11270 if (OperatorDelete->isDestroyingOperatorDelete()) {
11271 unsigned AddressParamIndex = 0;
11272 if (OperatorDelete->isTypeAwareOperatorNewOrDelete())
11273 ++AddressParamIndex;
11275 OperatorDelete->getParamDecl(AddressParamIndex)->getType();
11282 OperatorDelete->getParamDecl(AddressParamIndex)->getLocation());
11283 assert(!
This.isInvalid() &&
"couldn't form 'this' expr in dtor?");
11286 if (
This.isInvalid()) {
11289 Diag(Loc, diag::note_implicit_delete_this_in_destructor_here);
11292 ThisArg =
This.get();
11298 Destructor->setOperatorDelete(OperatorDelete, ThisArg);
11301 Context.getTargetInfo().callGlobalDeleteInDeletingDtor(
11313 if (GlobalOperatorDelete) {
11315 Destructor->setOperatorGlobalDelete(GlobalOperatorDelete);
11319 if (
Context.getTargetInfo().emitVectorDeletingDtors(
11321 bool DestructorIsExported =
Destructor->hasAttr<DLLExportAttr>();
11324 Context.DeclarationNames.getCXXOperatorName(OO_Array_Delete);
11327 false, VDeleteName);
11333 Destructor->setGlobalOperatorArrayDelete(GlobalArrOperatorDelete);
11334 if (GlobalArrOperatorDelete &&
11335 (
Context.classMaybeNeedsVectorDeletingDestructor(RD) ||
11336 DestructorIsExported))
11338 }
else if (!ArrOperatorDelete) {
11341 true, VDeleteName);
11343 Destructor->setOperatorArrayDelete(ArrOperatorDelete);
11344 if (ArrOperatorDelete &&
11345 (
Context.classMaybeNeedsVectorDeletingDestructor(RD) ||
11346 DestructorIsExported))
11365 << DeclaratorType << isa<TypeAliasDecl>(TT->getDecl());
11366 else if (
const TemplateSpecializationType *TST =
11367 DeclaratorType->
getAs<TemplateSpecializationType>())
11368 if (TST->isTypeAlias())
11370 << DeclaratorType << 1;
11460 if (R.getEnd().isInvalid())
11461 R.setEnd(Before.
getEnd());
11465 if (After.isInvalid())
11467 if (R.getBegin().isInvalid())
11468 R.setBegin(After.getBegin());
11469 R.setEnd(After.getEnd());
11518 unsigned NumParam = Proto->getNumParams();
11522 if (NumParam == 1) {
11524 if (
const auto *
First =
11525 dyn_cast_if_present<ParmVarDecl>(FTI.
Params[0].
Param);
11526 First &&
First->isExplicitObjectParameter())
11530 if (NumParam != 0) {
11535 }
else if (Proto->isVariadic()) {
11542 if (Proto->getReturnType() != ConvType) {
11543 bool NeedsTypedef =
false;
11547 bool PastFunctionChunk =
false;
11549 switch (Chunk.Kind) {
11551 if (!PastFunctionChunk) {
11552 if (Chunk.Fun.HasTrailingReturnType) {
11557 PastFunctionChunk =
true;
11562 NeedsTypedef =
true;
11582 After.isValid() ? After.getBegin() :
11584 auto &&DB =
Diag(Loc, diag::err_conv_function_with_complex_decl);
11585 DB << Before << After;
11587 if (!NeedsTypedef) {
11591 if (After.isInvalid() && ConvTSI) {
11599 }
else if (!Proto->getReturnType()->isDependentType()) {
11600 DB << 1 << Proto->getReturnType();
11602 DB << 2 << Proto->getReturnType();
11613 ConvType = Proto->getReturnType();
11621 ConvType =
Context.getPointerType(ConvType);
11625 ConvType =
Context.getPointerType(ConvType);
11633 R =
Context.getFunctionType(ConvType, {}, Proto->getExtProtoInfo());
11638 diag_compat::explicit_conversion_functions)
11643 assert(Conversion &&
"Expected to receive a conversion function declaration");
11664 ConvType =
Context.getCanonicalType(ConvType).getUnqualifiedType();
11665 if (ConvType == ClassType)
11670 << ClassType << ConvType;
11673 << ClassType << ConvType;
11684 << ConvType->
castAs<AutoType>()->getKeyword()
11688 return ConversionTemplate;
11713 for (
unsigned Idx = 0; Idx < FTI.
NumParams; Idx++) {
11714 const auto &ParamInfo = FTI.
Params[Idx];
11715 if (!ParamInfo.Param)
11718 if (!Param->isExplicitObjectParameter())
11721 ExplicitObjectParam = Param;
11724 Diag(Param->getLocation(),
11725 diag::err_explicit_object_parameter_must_be_first)
11726 << IsLambda << Param->getSourceRange();
11729 if (!ExplicitObjectParam)
11734 diag::err_explicit_object_default_arg)
11743 diag::err_explicit_object_parameter_nonmember)
11750 diag::err_explicit_object_parameter_nonmember)
11775 !isa_and_present<CXXRecordDecl>(
11778 diag::err_explicit_object_parameter_nonmember)
11785 diag::err_explicit_object_parameter_mutable)
11793 assert(D.
isInvalidType() &&
"Explicit object parameter in non-member "
11794 "should have been diagnosed already");
11802 diag::err_explicit_object_parameter_constructor)
11812struct BadSpecifierDiagnoser {
11815 ~BadSpecifierDiagnoser() {
11819 template<
typename T>
void check(SourceLocation SpecLoc,
T Spec) {
11823 return check(SpecLoc,
11826 void check(SourceLocation SpecLoc,
const char *Spec) {
11828 Diagnostic << SourceRange(SpecLoc, SpecLoc);
11829 if (!Specifiers.empty()) Specifiers +=
" ";
11830 Specifiers += Spec;
11834 Sema::SemaDiagnosticBuilder Diagnostic;
11835 std::string Specifiers;
11843 assert(GuidedTemplateDecl &&
"missing template decl for deduction guide");
11848 if (!
CurContext->getRedeclContext()->Equals(
11851 << GuidedTemplateDecl;
11857 if (DS.hasTypeSpecifier() || DS.getTypeQualifiers() ||
11858 DS.getStorageClassSpecLoc().isValid() || DS.isInlineSpecified() ||
11859 DS.isNoreturnSpecified() || DS.hasConstexprSpecifier()) {
11860 BadSpecifierDiagnoser Diagnoser(
11862 diag::err_deduction_guide_invalid_specifier);
11864 Diagnoser.check(DS.getStorageClassSpecLoc(), DS.getStorageClassSpec());
11865 DS.ClearStorageClassSpecs();
11869 Diagnoser.check(DS.getInlineSpecLoc(),
"inline");
11870 Diagnoser.check(DS.getNoreturnSpecLoc(),
"_Noreturn");
11871 Diagnoser.check(DS.getConstexprSpecLoc(),
"constexpr");
11872 DS.ClearConstexprSpec();
11874 Diagnoser.check(DS.getConstSpecLoc(),
"const");
11875 Diagnoser.check(DS.getRestrictSpecLoc(),
"__restrict");
11876 Diagnoser.check(DS.getVolatileSpecLoc(),
"volatile");
11877 Diagnoser.check(DS.getAtomicSpecLoc(),
"_Atomic");
11878 Diagnoser.check(DS.getUnalignedSpecLoc(),
"__unaligned");
11879 DS.ClearTypeQualifiers();
11881 Diagnoser.check(DS.getTypeSpecComplexLoc(), DS.getTypeSpecComplex());
11882 Diagnoser.check(DS.getTypeSpecSignLoc(), DS.getTypeSpecSign());
11883 Diagnoser.check(DS.getTypeSpecWidthLoc(), DS.getTypeSpecWidth());
11884 Diagnoser.check(DS.getTypeSpecTypeLoc(), DS.getTypeSpecType());
11885 DS.ClearTypeSpecType();
11892 bool FoundFunction =
false;
11898 diag::err_deduction_guide_with_complex_decl)
11902 if (!Chunk.Fun.hasTrailingReturnType())
11904 diag::err_deduction_guide_no_trailing_return_type);
11909 ParsedType TrailingReturnType = Chunk.Fun.getTrailingReturnType();
11912 assert(TSI &&
"deduction guide has valid type but invalid return type?");
11913 bool AcceptableReturnType =
false;
11914 bool MightInstantiateToSpecialization =
false;
11917 TemplateName SpecifiedName = RetTST.getTypePtr()->getTemplateName();
11918 bool TemplateMatches =
Context.hasSameTemplateName(
11919 SpecifiedName, GuidedTemplate,
true);
11927 if (SimplyWritten && TemplateMatches)
11928 AcceptableReturnType =
true;
11933 MightInstantiateToSpecialization =
11937 MightInstantiateToSpecialization =
true;
11940 if (!AcceptableReturnType)
11942 diag::err_deduction_guide_bad_trailing_return_type)
11943 << GuidedTemplate << TSI->
getType()
11944 << MightInstantiateToSpecialization
11949 FoundFunction =
true;
11968 assert(*IsInline != PrevNS->
isInline());
11978 S.
Diag(Loc, diag::warn_inline_namespace_reopened_noninline)
11981 S.
Diag(Loc, diag::err_inline_namespace_mismatch);
11999 bool IsInline = InlineLoc.
isValid();
12000 bool IsInvalid =
false;
12001 bool IsStd =
false;
12002 bool AddToKnown =
false;
12013 auto DiagnoseInlineStdNS = [&]() {
12014 assert(IsInline && II->
isStr(
"std") &&
12015 CurContext->getRedeclContext()->isTranslationUnit() &&
12016 "Precondition of DiagnoseInlineStdNS not met");
12017 Diag(InlineLoc, diag::err_inline_namespace_std)
12036 R.isSingleResult() ? R.getRepresentativeDecl() :
nullptr;
12037 PrevNS = dyn_cast_or_null<NamespaceDecl>(PrevDecl);
12041 if (IsInline && II->
isStr(
"std") &&
12042 CurContext->getRedeclContext()->isTranslationUnit())
12043 DiagnoseInlineStdNS();
12044 else if (IsInline != PrevNS->
isInline())
12046 &IsInline, PrevNS);
12047 }
else if (PrevDecl) {
12049 Diag(Loc, diag::err_redefinition_different_kind)
12054 }
else if (II->
isStr(
"std") &&
12055 CurContext->getRedeclContext()->isTranslationUnit()) {
12057 DiagnoseInlineStdNS();
12062 AddToKnown = !IsInline;
12065 AddToKnown = !IsInline;
12079 if (PrevNS && IsInline != PrevNS->
isInline())
12081 &IsInline, PrevNS);
12088 if (PrevNS && !
CurContext->getRedeclContext()->Equals(
12092 Context, SemanticContext, IsInline, StartLoc, Loc, II, PrevNS, IsNested);
12102 if (
const VisibilityAttr *
Attr = Namespc->
getAttr<VisibilityAttr>())
12108 KnownNamespaces[Namespc] =
false;
12116 TU->setAnonymousNamespace(Namespc);
12168 return dyn_cast_or_null<NamespaceDecl>(D);
12172 NamespaceDecl *Namespc = dyn_cast_or_null<NamespaceDecl>(Dcl);
12173 assert(Namespc &&
"Invalid parameter, expected NamespaceDecl");
12176 if (Namespc->
hasAttr<VisibilityAttr>())
12179 if (DeferredExportedNamespaces.erase(Namespc))
12184 return cast_or_null<CXXRecordDecl>(
12193 return cast_or_null<NamespaceDecl>(
12199enum UnsupportedSTLSelect {
12206struct InvalidSTLDiagnoser {
12211 QualType operator()(UnsupportedSTLSelect Sel = USS_Other, StringRef Name =
"",
12212 const VarDecl *VD =
nullptr) {
12214 auto D = S.
Diag(Loc, diag::err_std_compare_type_not_supported)
12215 << TyForDiags << ((
int)Sel);
12216 if (Sel == USS_InvalidMember || Sel == USS_MissingMember) {
12217 assert(!Name.empty());
12221 if (Sel == USS_InvalidMember) {
12234 "Looking for comparison category type outside of C++.");
12249 if (Info && FullyCheckedComparisonCategories[
static_cast<unsigned>(Kind)]) {
12260 std::string NameForDiags =
"std::";
12262 Diag(Loc, diag::err_implied_comparison_category_type_not_found)
12263 << NameForDiags << (int)Usage;
12267 assert(Info->
Kind == Kind);
12278 InvalidSTLDiagnoser UnsupportedSTLError{*
this, Loc, TyForDiags(Info)};
12281 return UnsupportedSTLError(USS_NonTrivial);
12286 if (
Base->isEmpty())
12289 return UnsupportedSTLError();
12297 if (std::distance(FIt, FEnd) != 1 ||
12298 !FIt->getType()->isIntegralOrEnumerationType()) {
12299 return UnsupportedSTLError();
12309 return UnsupportedSTLError(USS_MissingMember, MemName);
12312 assert(VD &&
"should not be null!");
12319 return UnsupportedSTLError(USS_InvalidMember, MemName, VD);
12325 return UnsupportedSTLError();
12332 FullyCheckedComparisonCategories[
static_cast<unsigned>(Kind)] =
true;
12342 &
PP.getIdentifierTable().get(
"std"),
12355 const char *ClassName,
12357 const Decl **MalformedDecl) {
12365 auto ReportMatchingNameAsMalformed = [&](
NamedDecl *D) {
12366 if (!MalformedDecl)
12374 *MalformedDecl = D;
12379 if (
const TemplateSpecializationType *TST =
12381 Template = dyn_cast_or_null<ClassTemplateDecl>(
12382 TST->getTemplateName().getAsTemplateDecl());
12383 Arguments = TST->template_arguments();
12384 }
else if (
const auto *TT = SugaredType->
getAs<TagType>()) {
12386 Arguments = TT->getTemplateArgs(S.
Context);
12390 ReportMatchingNameAsMalformed(SugaredType->
getAsTagDecl());
12394 if (!*CachedDecl) {
12413 *MalformedDecl = TemplateClass;
12421 if (
Template->getCanonicalDecl() != (*CachedDecl)->getCanonicalDecl())
12426 QualType ArgType = Arguments[0].getAsType();
12432 if (S.
getLangOpts().ObjCAutoRefCount && ArgType->isObjCLifetimeType() &&
12433 !ArgType.getObjCLifetime()) {
12438 *TypeArg = ArgType;
12446 "Looking for std::initializer_list outside of C++.");
12456 const Decl **MalformedDecl) {
12458 "Looking for std::type_identity outside of C++.");
12468 const char *ClassName,
12469 bool *WasMalformed) {
12480 Result.suppressDiagnostics();
12483 S.
Diag(
Found->getLocation(), diag::err_malformed_std_class_template)
12486 *WasMalformed =
true;
12495 S.
Diag(
Template->getLocation(), diag::err_malformed_std_class_template)
12498 *WasMalformed =
true;
12513 Loc, Args,
nullptr,
12519 bool WasMalformed =
false;
12524 Diag(Loc, diag::err_implied_std_initializer_list_not_found);
12552 ArgType = RT->getPointeeType().getUnqualifiedType();
12561 case Decl::TranslationUnit:
12563 case Decl::LinkageSpec:
12573class NamespaceValidatorCCC final :
public CorrectionCandidateCallback {
12575 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
12581 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
12582 return std::make_unique<NamespaceValidatorCCC>(*
this);
12591 Module *M = ND->getOwningModule();
12592 assert(M &&
"hidden namespace definition not in a module?");
12596 diag::err_module_unimported_use_header)
12601 diag::err_module_unimported_use)
12611 NamespaceValidatorCCC CCC{};
12613 S.
CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), Sc, &SS, CCC,
12621 if (isa_and_nonnull<NamespaceDecl>(Corrected.getFoundDecl()) &&
12622 Corrected.requiresImport()) {
12625 std::string CorrectedStr(Corrected.getAsString(S.
getLangOpts()));
12626 bool DroppedSpecifier =
12627 Corrected.WillReplaceSpecifier() && Ident->
getName() == CorrectedStr;
12629 S.
PDiag(diag::err_using_directive_member_suggest)
12630 << Ident << DC << DroppedSpecifier << SS.
getRange(),
12631 S.
PDiag(diag::note_namespace_defined_here));
12634 S.
PDiag(diag::err_using_directive_suggest) << Ident,
12635 S.
PDiag(diag::note_namespace_defined_here));
12637 R.addDecl(Corrected.getFoundDecl());
12648 assert(!SS.
isInvalid() &&
"Invalid CXXScopeSpec.");
12649 assert(NamespcName &&
"Invalid NamespcName.");
12650 assert(IdentLoc.
isValid() &&
"Invalid NamespceName location.");
12661 if (R.isAmbiguous())
12670 NamespcName->
isStr(
"std")) {
12671 Diag(IdentLoc, diag::ext_using_undefined_std);
12681 NamedDecl *Named = R.getRepresentativeDecl();
12683 assert(
NS &&
"expected namespace decl");
12702 CommonAncestor = CommonAncestor->
getParent();
12706 IdentLoc, Named, CommonAncestor);
12710 Diag(IdentLoc, diag::warn_using_directive_in_header);
12715 Diag(IdentLoc, diag::err_expected_namespace_name) << SS.
getRange();
12765 ? diag::warn_cxx98_compat_using_decl_constructor
12766 : diag::err_using_decl_constructor)
12783 llvm_unreachable(
"cannot parse qualified deduction guide name");
12794 ? diag::err_access_decl
12795 : diag::warn_access_decl_deprecated)
12806 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
12814 SS, TargetNameInfo, EllipsisLoc, AttrList,
12833 ? diag::err_using_enum_is_dependent
12834 : diag::err_unknown_typename)
12842 Diag(IdentLoc, diag::err_using_enum_is_dependent);
12848 Diag(IdentLoc, diag::err_using_enum_not_enum) << EnumTy;
12852 if (TSI ==
nullptr)
12853 TSI =
Context.getTrivialTypeSourceInfo(EnumTy, IdentLoc);
12874 return Context.hasSameType(TD1->getUnderlyingType(),
12875 TD2->getUnderlyingType());
12909 if (
auto *Using = dyn_cast<UsingDecl>(BUD)) {
12921 Diag(Using->getLocation(),
12922 diag::err_using_decl_nested_name_specifier_is_current_class)
12923 << Using->getQualifierLoc().getSourceRange();
12925 Using->setInvalidDecl();
12929 Diag(Using->getQualifierLoc().getBeginLoc(),
12930 diag::err_using_decl_nested_name_specifier_is_not_base_class)
12932 << Using->getQualifierLoc().getSourceRange();
12934 Using->setInvalidDecl();
12939 if (
Previous.empty())
return false;
12950 NamedDecl *NonTag =
nullptr, *Tag =
nullptr;
12951 bool FoundEquivalentDecl =
false;
12953 NamedDecl *D = Element->getUnderlyingDecl();
12960 if (
auto *RD = dyn_cast<CXXRecordDecl>(D)) {
12975 PrevShadow = Shadow;
12976 FoundEquivalentDecl =
true;
12980 FoundEquivalentDecl =
true;
12987 if (FoundEquivalentDecl)
12993 (isa_and_nonnull<UnresolvedUsingIfExistsDecl>(NonTag))) {
12994 if (!NonTag && !Tag)
12997 Diag(
Target->getLocation(), diag::note_using_decl_target);
12998 Diag((NonTag ? NonTag : Tag)->getLocation(),
12999 diag::note_using_decl_conflict);
13028 Diag(
Target->getLocation(), diag::note_using_decl_target);
13038 if (!Tag)
return false;
13041 Diag(
Target->getLocation(), diag::note_using_decl_target);
13042 Diag(Tag->getLocation(), diag::note_using_decl_conflict);
13048 if (!NonTag)
return false;
13051 Diag(
Target->getLocation(), diag::note_using_decl_target);
13061 for (
auto &B : Derived->
bases())
13062 if (B.getType()->getAsCXXRecordDecl() ==
Base)
13063 return B.isVirtual();
13064 llvm_unreachable(
"not a direct base class");
13078 if (
auto *TargetTD = dyn_cast<TemplateDecl>(
Target))
13079 NonTemplateTarget = TargetTD->getTemplatedDecl();
13084 bool IsVirtualBase =
13086 Using->getQualifier().getAsRecordDecl());
13134 bool &AnyDependentBases) {
13138 CanQualType BaseType =
Base.getType()->getCanonicalTypeUnqualified();
13139 if (CanonicalDesiredBase == BaseType)
13141 if (BaseType->isDependentType())
13142 AnyDependentBases =
true;
13148class UsingValidatorCCC final :
public CorrectionCandidateCallback {
13150 UsingValidatorCCC(
bool HasTypenameKeyword,
bool IsInstantiation,
13151 NestedNameSpecifier NNS, CXXRecordDecl *RequireMemberOf)
13152 : HasTypenameKeyword(HasTypenameKeyword),
13153 IsInstantiation(IsInstantiation), OldNNS(NNS),
13154 RequireMemberOf(RequireMemberOf) {}
13156 bool ValidateCandidate(
const TypoCorrection &Candidate)
override {
13170 if (RequireMemberOf) {
13171 auto *FoundRecord = dyn_cast<CXXRecordDecl>(ND);
13172 if (FoundRecord && FoundRecord->isInjectedClassName()) {
13186 if (
Specifier.getKind() != NestedNameSpecifier::Kind::Type ||
13192 bool AnyDependentBases =
false;
13195 AnyDependentBases) &&
13196 !AnyDependentBases)
13206 auto *FoundRecord = dyn_cast<CXXRecordDecl>(ND);
13207 if (FoundRecord && FoundRecord->isInjectedClassName())
13212 return HasTypenameKeyword || !IsInstantiation;
13214 return !HasTypenameKeyword;
13217 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
13218 return std::make_unique<UsingValidatorCCC>(*
this);
13222 bool HasTypenameKeyword;
13223 bool IsInstantiation;
13224 NestedNameSpecifier OldNNS;
13225 CXXRecordDecl *RequireMemberOf;
13252 bool IsUsingIfExists) {
13253 assert(!SS.
isInvalid() &&
"Invalid CXXScopeSpec.");
13255 assert(IdentLoc.
isValid() &&
"Invalid TargetName location.");
13264 if (
auto *RD = dyn_cast<CXXRecordDecl>(
CurContext))
13265 UsingName.
setName(
Context.DeclarationNames.getCXXConstructorName(
13266 Context.getCanonicalTagType(RD)));
13277 assert(IsInstantiation &&
"no scope in non-instantiation");
13305 Diag(UsingLoc, diag::err_using_if_exists_on_ctor);
13311 if (!LookupContext || EllipsisLoc.
isValid()) {
13315 SS, NameInfo, IdentLoc))
13319 Previous.getFoundDecl()->isTemplateParameter())
13322 if (HasTypenameKeyword) {
13325 UsingLoc, TypenameLoc,
13327 IdentLoc, NameInfo.
getName(),
13331 QualifierLoc, NameInfo, EllipsisLoc);
13339 auto Build = [&](
bool Invalid) {
13342 UsingName, HasTypenameKeyword);
13349 auto BuildInvalid = [&]{
return Build(
true); };
13350 auto BuildValid = [&]{
return Build(
false); };
13353 return BuildInvalid();
13362 if (!IsInstantiation)
13363 R.setHideTags(
false);
13368 R.setBaseObjectType(
13379 if (R.empty() && IsUsingIfExists)
13397 PP.NeedsStdLibCxxWorkaroundBefore(2016'12'21) &&
13400 UsingValidatorCCC CCC(HasTypenameKeyword, IsInstantiation, SS.
getScopeRep(),
13403 CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), S, &SS, CCC,
13408 << NameInfo.
getName() << LookupContext << 0
13413 NamedDecl *ND = Corrected.getCorrectionDecl();
13415 return BuildInvalid();
13418 auto *RD = dyn_cast<CXXRecordDecl>(ND);
13424 if (Corrected.WillReplaceSpecifier()) {
13428 QualifierLoc = Builder.getWithLocInContext(
Context);
13434 UsingName.
setName(
Context.DeclarationNames.getCXXConstructorName(
13435 Context.getCanonicalTagType(CurClass)));
13447 Diag(IdentLoc, diag::err_no_member)
13449 return BuildInvalid();
13453 if (R.isAmbiguous())
13454 return BuildInvalid();
13456 if (HasTypenameKeyword) {
13460 Diag(IdentLoc, diag::err_using_typename_non_type);
13463 diag::note_using_decl_target);
13464 return BuildInvalid();
13470 if (IsInstantiation && R.getAsSingle<
TypeDecl>()) {
13471 Diag(IdentLoc, diag::err_using_dependent_value_is_type);
13472 Diag(R.getFoundDecl()->getLocation(), diag::note_using_decl_target);
13473 return BuildInvalid();
13480 Diag(IdentLoc, diag::err_using_decl_can_not_refer_to_namespace)
13485 return BuildInvalid();
13495 R.suppressDiagnostics();
13517 if (
CurContext->getRedeclContext()->isRecord()) {
13527 if (UED->getEnumDecl() == ED) {
13528 Diag(UsingLoc, diag::err_using_enum_decl_redeclaration)
13540 EnumLoc, NameLoc, EnumType);
13573 UPD->setAccess(InstantiatedFrom->
getAccess());
13579 assert(!UD->
hasTypename() &&
"expecting a constructor name");
13585 bool AnyDependentBases =
false;
13588 if (!
Base && !AnyDependentBases) {
13589 Diag(UD->
getUsingLoc(), diag::err_using_decl_constructor_not_in_direct_base)
13596 Base->setInheritConstructors();
13602 bool HasTypenameKeyword,
13615 if (!
CurContext->getRedeclContext()->isRecord()) {
13622 for (
auto *D : Prev) {
13624 bool OldCouldBeEnumerator =
13627 OldCouldBeEnumerator ? diag::err_redefinition
13628 : diag::err_redefinition_different_kind)
13629 << Prev.getLookupName();
13642 if (
const auto *UD = dyn_cast<UsingDecl>(D)) {
13643 DTypename = UD->hasTypename();
13644 DQual = UD->getQualifier();
13645 }
else if (
const auto *UD = dyn_cast<UnresolvedUsingValueDecl>(D)) {
13647 DQual = UD->getQualifier();
13648 }
else if (
const auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(D)) {
13650 DQual = UD->getQualifier();
13656 if (HasTypenameKeyword != DTypename)
continue;
13664 Diag(NameLoc, diag::err_using_decl_redeclaration) << SS.
getRange();
13678 assert(
bool(NamedContext) == (R || UD) && !(R && UD) &&
13679 "resolvable context must have exactly one set of decls");
13683 bool Cxx20Enumerator =
false;
13684 if (NamedContext) {
13693 if (
auto *ED = dyn_cast<EnumDecl>(NamedContext)) {
13697 if (EC && R && ED->isScoped())
13702 NamedContext = ED->getDeclContext();
13722 ? diag::warn_cxx17_compat_using_decl_class_member_enumerator
13723 : diag::err_using_decl_can_not_refer_to_class_member)
13726 if (Cxx20Enumerator)
13729 auto *RD = NamedContext
13738 }
else if (R->getAsSingle<
TypeDecl>()) {
13741 Diag(SS.
getBeginLoc(), diag::note_using_decl_class_member_workaround)
13742 << diag::MemClassWorkaround::AliasDecl
13749 Diag(InsertLoc, diag::note_using_decl_class_member_workaround)
13750 << diag::MemClassWorkaround::TypedefDecl
13755 }
else if (R->getAsSingle<
VarDecl>()) {
13765 Diag(UsingLoc, diag::note_using_decl_class_member_workaround)
13766 << diag::MemClassWorkaround::ReferenceDecl << FixIt;
13779 Diag(UsingLoc, diag::note_using_decl_class_member_workaround)
13781 ? diag::MemClassWorkaround::ConstexprVar
13782 : diag::MemClassWorkaround::ConstVar)
13791 if (!NamedContext) {
13807 ? diag::warn_cxx17_compat_using_decl_non_member_enumerator
13808 : diag::err_using_decl_nested_name_specifier_is_not_class)
13811 if (Cxx20Enumerator)
13832 if (Cxx20Enumerator) {
13833 Diag(NameLoc, diag::warn_cxx17_compat_using_decl_non_member_enumerator)
13840 diag::err_using_decl_nested_name_specifier_is_current_class)
13847 diag::err_using_decl_nested_name_specifier_is_not_base_class)
13863 if (
Type.isInvalid())
13882 TemplateParamLists.size()
13889 Previous.getFoundDecl()->isTemplateParameter()) {
13895 "name in alias declaration must be an identifier");
13918 if (TemplateParamLists.size()) {
13923 if (TemplateParamLists.size() != 1) {
13924 Diag(UsingLoc, diag::err_alias_template_extra_headers)
13925 <<
SourceRange(TemplateParamLists[1]->getTemplateLoc(),
13926 TemplateParamLists[TemplateParamLists.size()-1]->getRAngleLoc());
13930 auto It = llvm::find_if(
13931 llvm::reverse(TemplateParamLists),
13933 assert(It != TemplateParamLists.rend() &&
13934 "if all template parameter lists were empty, this should have "
13935 "been rejected as an explicit specialization");
13936 TemplateParams = *It;
13951 Diag(UsingLoc, diag::err_redefinition_different_kind)
13966 OldTemplateParams =
14002 else if (OldDecl) {
14009 if (
auto *TD = dyn_cast_or_null<TagDecl>(DeclFromDeclSpec)) {
14032 if (R.isAmbiguous())
14037 Diag(IdentLoc, diag::err_expected_namespace_name) << SS.
getRange();
14041 assert(!R.isAmbiguous() && !R.empty());
14069 Diag(AliasLoc, diag::err_redefinition_different_namespace_alias)
14071 Diag(AD->getLocation(), diag::note_previous_namespace_alias)
14072 << AD->getNamespace();
14077 ? diag::err_redefinition
14078 : diag::err_redefinition_different_kind;
14079 Diag(AliasLoc, DiagID) << Alias;
14100struct SpecialMemberExceptionSpecInfo
14101 : SpecialMemberVisitor<SpecialMemberExceptionSpecInfo> {
14109 : SpecialMemberVisitor(S, MD, CSM, ICI), Loc(Loc), ExceptSpec(S) {}
14114 void visitClassSubobject(
CXXRecordDecl *Class, Subobject Subobj,
14117 void visitSubobjectCall(Subobject Subobj,
14122bool SpecialMemberExceptionSpecInfo::visitBase(CXXBaseSpecifier *Base) {
14123 auto *BaseClass =
Base->getType()->getAsCXXRecordDecl();
14127 Sema::SpecialMemberOverloadResult SMOR = lookupInheritedCtor(BaseClass);
14128 if (
auto *BaseCtor = SMOR.
getMethod()) {
14129 visitSubobjectCall(Base, BaseCtor);
14133 visitClassSubobject(BaseClass, Base, 0);
14137bool SpecialMemberExceptionSpecInfo::visitField(FieldDecl *FD) {
14138 if (CSM == CXXSpecialMemberKind::DefaultConstructor &&
14157void SpecialMemberExceptionSpecInfo::visitClassSubobject(CXXRecordDecl *
Class,
14160 FieldDecl *
Field = dyn_cast<FieldDecl *>(Subobj);
14161 bool IsMutable =
Field &&
Field->isMutable();
14162 visitSubobjectCall(Subobj, lookupIn(
Class, Quals, IsMutable));
14165void SpecialMemberExceptionSpecInfo::visitSubobjectCall(
14166 Subobject Subobj, Sema::SpecialMemberOverloadResult SMOR) {
14169 if (CXXMethodDecl *MD = SMOR.
getMethod())
14170 ExceptSpec.
CalledDecl(getSubobjectLoc(Subobj), MD);
14199 ComputingExceptionSpec CES(S, MD, Loc);
14206 SpecialMemberExceptionSpecInfo Info(S, MD, CSM, ICI, MD->
getLocation());
14208 return Info.ExceptSpec;
14215 diag::err_exception_spec_incomplete_type))
14216 return Info.ExceptSpec;
14233 Info.visit(Info.IsConstructor ? Info.VisitPotentiallyConstructedBases
14234 : Info.VisitAllBases);
14236 return Info.ExceptSpec;
14241struct DeclaringSpecialMember {
14244 Sema::ContextRAII SavedContext;
14245 bool WasAlreadyBeingDeclared;
14248 : S(S), D(RD, CSM), SavedContext(S, RD) {
14250 if (WasAlreadyBeingDeclared)
14257 Sema::CodeSynthesisContext Ctx;
14258 Ctx.Kind = Sema::CodeSynthesisContext::DeclaringSpecialMember;
14265 Ctx.PointOfInstantiation = RD->getLocation();
14267 Ctx.SpecialMember = CSM;
14268 S.pushCodeSynthesisContext(Ctx);
14271 ~DeclaringSpecialMember() {
14272 if (!WasAlreadyBeingDeclared) {
14279 bool isAlreadyBeingDeclared()
const {
14280 return WasAlreadyBeingDeclared;
14292 if (
auto *Acceptable = R.getAcceptableDecl(D))
14293 R.addDecl(Acceptable);
14295 R.suppressDiagnostics();
14301void Sema::setupImplicitSpecialMemberType(
CXXMethodDecl *SpecialMem,
14307 LangAS AS = getDefaultCXXMethodAddrSpace();
14312 auto QT = Context.getFunctionType(ResultTy, Args, EPI);
14320 Context.getTrivialTypeSourceInfo(SpecialMem->
getType());
14334 "Should not build implicit default constructor!");
14336 DeclaringSpecialMember DSM(*
this, ClassDecl,
14338 if (DSM.isAlreadyBeingDeclared())
14348 =
Context.DeclarationNames.getCXXConstructorName(ClassType);
14360 setupImplicitSpecialMemberType(DefaultCon,
Context.VoidTy, {});
14363 CUDA().inferTargetForImplicitSpecialMember(
14384 ClassDecl->
addDecl(DefaultCon);
14391 DefaultedFunctionFPFeaturesRAII RestoreFP(*
this,
Constructor);
14395 "DefineImplicitDefaultConstructor - call it for implicit default ctor");
14400 assert(ClassDecl &&
"DefineImplicitDefaultConstructor - invalid constructor");
14414 Scope.addContextNote(CurrentLocation);
14461 ->getInheritedConstructor()
14468 Context.getTrivialTypeSourceInfo(BaseCtor->
getType(), UsingLoc);
14479 false, BaseCtor, &ICI);
14496 EPI.ExceptionSpec.SourceDecl = DerivedCtor;
14502 for (
unsigned I = 0, N = FPT->
getNumParams(); I != N; ++I) {
14506 Context, DerivedCtor, UsingLoc, UsingLoc,
nullptr,
14513 ParamDecls.push_back(PD);
14518 assert(!BaseCtor->
isDeleted() &&
"should not use deleted constructor");
14521 Derived->
addDecl(DerivedCtor);
14527 return DerivedCtor;
14558 Scope.addContextNote(CurrentLocation);
14561 Constructor->getInheritedConstructor().getShadowDecl();
14563 Constructor->getInheritedConstructor().getConstructor();
14577 for (
bool VBase : {
false,
true}) {
14579 if (B.isVirtual() != VBase)
14582 auto *BaseRD = B.getType()->getAsCXXRecordDecl();
14587 if (!BaseCtor.first)
14592 InitLoc, B.getType(), BaseCtor.first, VBase, BaseCtor.second);
14594 auto *TInfo =
Context.getTrivialTypeSourceInfo(B.getType(), InitLoc);
14596 Context, TInfo, VBase, InitLoc,
Init.get(), InitLoc,
14630 DeclaringSpecialMember DSM(*
this, ClassDecl,
14632 if (DSM.isAlreadyBeingDeclared())
14642 =
Context.DeclarationNames.getCXXDestructorName(ClassType);
14657 CUDA().inferTargetForImplicitSpecialMember(
14691 DefaultedFunctionFPFeaturesRAII RestoreFP(*
this,
Destructor);
14693 !
Destructor->doesThisDeclarationHaveABody() &&
14695 "DefineImplicitDestructor - call it for implicit default dtor");
14700 assert(ClassDecl &&
"DefineImplicitDestructor - invalid destructor");
14711 Scope.addContextNote(CurrentLocation);
14738 assert(
Context.getTargetInfo().getCXXABI().isMicrosoft() &&
14739 "implicit complete dtors unneeded outside MS ABI");
14741 "complete dtor only exists for classes with vbases");
14746 Scope.addContextNote(CurrentLocation);
14754 if (
Record->isInvalidDecl()) {
14775 if (M->getParent()->getTemplateSpecializationKind() !=
14795 "adjusting dtor exception specs was introduced in c++11");
14805 if (DtorType->hasExceptionSpec())
14828 ExprBuilder(
const ExprBuilder&) =
delete;
14829 ExprBuilder &operator=(
const ExprBuilder&) =
delete;
14832 static Expr *assertNotNull(
Expr *E) {
14833 assert(E &&
"Expression construction must not fail.");
14839 virtual ~ExprBuilder() {}
14841 virtual Expr *build(Sema &S, SourceLocation Loc)
const = 0;
14844class RefBuilder:
public ExprBuilder {
14849 Expr *build(Sema &S, SourceLocation Loc)
const override {
14853 RefBuilder(VarDecl *Var, QualType VarType)
14854 : Var(Var), VarType(VarType) {}
14857class ThisBuilder:
public ExprBuilder {
14859 Expr *build(Sema &S, SourceLocation Loc)
const override {
14864class CastBuilder:
public ExprBuilder {
14865 const ExprBuilder &Builder;
14871 Expr *build(Sema &S, SourceLocation Loc)
const override {
14873 CK_UncheckedDerivedToBase, Kind,
14882class DerefBuilder:
public ExprBuilder {
14883 const ExprBuilder &Builder;
14886 Expr *build(Sema &S, SourceLocation Loc)
const override {
14887 return assertNotNull(
14891 DerefBuilder(
const ExprBuilder &Builder) : Builder(Builder) {}
14894class MemberBuilder:
public ExprBuilder {
14895 const ExprBuilder &Builder;
14899 LookupResult &MemberLookup;
14902 Expr *build(Sema &S, SourceLocation Loc)
const override {
14904 Builder.build(S, Loc),
Type, Loc, IsArrow, SS, SourceLocation(),
14905 nullptr, MemberLookup,
nullptr,
nullptr).get());
14908 MemberBuilder(
const ExprBuilder &Builder, QualType
Type,
bool IsArrow,
14909 LookupResult &MemberLookup)
14910 : Builder(Builder),
Type(
Type), IsArrow(IsArrow),
14911 MemberLookup(MemberLookup) {}
14914class MoveCastBuilder:
public ExprBuilder {
14915 const ExprBuilder &Builder;
14918 Expr *build(Sema &S, SourceLocation Loc)
const override {
14919 return assertNotNull(
CastForMoving(S, Builder.build(S, Loc)));
14922 MoveCastBuilder(
const ExprBuilder &Builder) : Builder(Builder) {}
14925class LvalueConvBuilder:
public ExprBuilder {
14926 const ExprBuilder &Builder;
14929 Expr *build(Sema &S, SourceLocation Loc)
const override {
14930 return assertNotNull(
14934 LvalueConvBuilder(
const ExprBuilder &Builder) : Builder(Builder) {}
14937class SubscriptBuilder:
public ExprBuilder {
14938 const ExprBuilder &
Base;
14939 const ExprBuilder &Index;
14942 Expr *build(Sema &S, SourceLocation Loc)
const override {
14944 Base.build(S, Loc), Loc, Index.build(S, Loc), Loc).
get());
14947 SubscriptBuilder(
const ExprBuilder &Base,
const ExprBuilder &Index)
14959 const ExprBuilder &ToB,
const ExprBuilder &FromB) {
14968 Expr *From = FromB.build(S, Loc);
14972 Expr *To = ToB.build(S, Loc);
14977 bool NeedsCollectableMemCpy =
false;
14978 if (
auto *RD =
T->getBaseElementTypeUnsafe()->getAsRecordDecl())
14982 StringRef MemCpyName = NeedsCollectableMemCpy ?
14983 "__builtin_objc_memmove_collectable" :
14984 "__builtin_memcpy";
14997 assert(MemCpyRef.
isUsable() &&
"Builtin reference cannot fail");
14999 Expr *CallArgs[] = {
15003 Loc, CallArgs, Loc);
15005 assert(!
Call.isInvalid() &&
"Call to __builtin_memcpy cannot fail!");
15038 const ExprBuilder &To,
const ExprBuilder &From,
15039 bool CopyingBaseSubobject,
bool Copying,
15040 unsigned Depth = 0) {
15055 if (
auto *ClassDecl =
T->getAsCXXRecordDecl()) {
15069 if (Method->isCopyAssignmentOperator() ||
15070 (!Copying && Method->isMoveAssignmentOperator()))
15089 if (CopyingBaseSubobject) {
15118 Expr *FromInst = From.build(S, Loc);
15121 Loc, FromInst, Loc);
15122 if (
Call.isInvalid())
15141 Loc, BO_Assign, To.build(S, Loc), From.build(S, Loc));
15161 llvm::raw_svector_ostream OS(Str);
15162 OS <<
"__i" << Depth;
15166 IterationVarName, SizeType,
15175 RefBuilder IterationVarRef(IterationVar, SizeType);
15176 LvalueConvBuilder IterationVarRefRVal(IterationVarRef);
15182 SubscriptBuilder FromIndexCopy(From, IterationVarRefRVal);
15183 MoveCastBuilder FromIndexMove(FromIndexCopy);
15184 const ExprBuilder *FromIndex;
15186 FromIndex = &FromIndexCopy;
15188 FromIndex = &FromIndexMove;
15190 SubscriptBuilder ToIndex(To, IterationVarRefRVal);
15195 ToIndex, *FromIndex, CopyingBaseSubobject,
15196 Copying, Depth + 1);
15198 if (
Copy.isInvalid() || !
Copy.get())
15205 S.
Context, IterationVarRefRVal.build(S, Loc),
15219 Loc, Loc, InitStmt,
15226 const ExprBuilder &To,
const ExprBuilder &From,
15227 bool CopyingBaseSubobject,
bool Copying) {
15229 if (
T->isArrayType() && !
T.hasQualifiers() &&
15230 T.isTriviallyCopyableType(S.
Context))
15234 CopyingBaseSubobject,
15252 DeclaringSpecialMember DSM(*
this, ClassDecl,
15254 if (DSM.isAlreadyBeingDeclared())
15258 std::nullopt, ClassDecl,
15292 CUDA().inferTargetForImplicitSpecialMember(
15299 ClassLoc, ClassLoc,
15312 ++
getASTContext().NumImplicitCopyAssignmentOperatorsDeclared;
15344 for (
auto *I : RD->
ctors()) {
15345 if (I->isCopyConstructor()) {
15346 UserDeclaredOperation = I;
15350 assert(UserDeclaredOperation);
15354 for (
auto *I : RD->
methods()) {
15355 if (I->isCopyAssignmentOperator()) {
15356 UserDeclaredOperation = I;
15360 assert(UserDeclaredOperation);
15363 if (UserDeclaredOperation) {
15364 bool UDOIsUserProvided = UserDeclaredOperation->
isUserProvided();
15368 (UDOIsUserProvided && UDOIsDestructor)
15369 ? diag::warn_deprecated_copy_with_user_provided_dtor
15370 : (UDOIsUserProvided && !UDOIsDestructor)
15371 ? diag::warn_deprecated_copy_with_user_provided_copy
15372 : (!UDOIsUserProvided && UDOIsDestructor)
15373 ? diag::warn_deprecated_copy_with_dtor
15374 : diag::warn_deprecated_copy;
15376 << RD << IsCopyAssignment;
15382 DefaultedFunctionFPFeaturesRAII RestoreFP(*
this, CopyAssignOperator);
15388 "DefineImplicitCopyAssignment called for wrong function");
15406 Scope.addContextNote(CurrentLocation);
15441 RefBuilder OtherRef(
Other, OtherRefType);
15444 std::optional<ThisBuilder>
This;
15445 std::optional<DerefBuilder> DerefThis;
15446 std::optional<RefBuilder> ExplicitObject;
15447 bool IsArrow =
false;
15453 ExplicitObject.emplace(CopyAssignOperator->
getParamDecl(0), ObjectType);
15457 DerefThis.emplace(*
This);
15460 ExprBuilder &ObjectParameter =
15461 ExplicitObject ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15462 :
static_cast<ExprBuilder &
>(*This);
15466 for (
auto &
Base : ClassDecl->
bases()) {
15469 QualType BaseType =
Base.getType().getUnqualifiedType();
15470 if (!BaseType->isRecordType()) {
15476 BasePath.push_back(&
Base);
15480 CastBuilder From(OtherRef,
Context.getQualifiedType(BaseType, OtherQuals),
15485 ExplicitObject ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15486 :
static_cast<ExprBuilder &
>(*DerefThis),
15495 if (
Copy.isInvalid()) {
15501 Statements.push_back(
Copy.getAs<
Expr>());
15508 ExprBuilder &To = ExplicitObject
15509 ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15510 :
static_cast<ExprBuilder &
>(*DerefThis);
15517 *
this, Loc,
Context.getCanonicalTagType(ClassDecl), To, OtherRef);
15518 if (
Copy.isInvalid()) {
15522 Statements.push_back(
Copy.getAs<
Stmt>());
15526 for (
auto *Field : ClassDecl->
fields()) {
15528 if (Field->isUnnamedBitField() || Field->getParent()->isUnion())
15531 if (Field->isInvalidDecl()) {
15537 if (Field->getType()->isReferenceType()) {
15538 Diag(ClassDecl->
getLocation(), diag::err_uninitialized_member_for_assign)
15539 <<
Context.getCanonicalTagType(ClassDecl) << 0
15540 << Field->getDeclName();
15541 Diag(Field->getLocation(), diag::note_declared_at);
15548 if (!BaseType->isRecordType() && BaseType.isConstQualified()) {
15549 Diag(ClassDecl->
getLocation(), diag::err_uninitialized_member_for_assign)
15550 <<
Context.getCanonicalTagType(ClassDecl) << 1
15551 << Field->getDeclName();
15552 Diag(Field->getLocation(), diag::note_declared_at);
15558 if (Field->isZeroLengthBitField())
15561 QualType FieldType = Field->getType().getNonReferenceType();
15564 "Incomplete array type is not valid");
15569 LookupResult MemberLookup(*
this, Field->getDeclName(), Loc,
15574 MemberBuilder From(OtherRef, OtherRefType,
false, MemberLookup);
15575 MemberBuilder To(ObjectParameter, ObjectType, IsArrow, MemberLookup);
15581 if (
Copy.isInvalid()) {
15587 Statements.push_back(
Copy.getAs<
Stmt>());
15593 (ExplicitObject ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15594 :
LangOpts.HLSL ?
static_cast<ExprBuilder &
>(*This)
15595 :
static_cast<ExprBuilder &
>(*DerefThis))
15596 .build(*
this, Loc);
15601 Statements.push_back(Return.
getAs<
Stmt>());
15614 assert(!Body.
isInvalid() &&
"Compound statement creation cannot fail");
15620 L->CompletedImplicitDefinition(CopyAssignOperator);
15627 DeclaringSpecialMember DSM(*
this, ClassDecl,
15629 if (DSM.isAlreadyBeingDeclared())
15636 std::nullopt, ClassDecl,
15666 CUDA().inferTargetForImplicitSpecialMember(
15673 ClassLoc, ClassLoc,
15686 ++
getASTContext().NumImplicitMoveAssignmentOperatorsDeclared;
15709 assert(!Class->isDependentContext() &&
"should not define dependent move");
15715 if (Class->getNumVBases() == 0 || Class->hasTrivialMoveAssignment() ||
15716 Class->getNumBases() < 2)
15720 typedef llvm::DenseMap<CXXRecordDecl*, CXXBaseSpecifier*> VBaseMap;
15723 for (
auto &BI : Class->bases()) {
15724 Worklist.push_back(&BI);
15725 while (!Worklist.empty()) {
15731 if (!
Base->hasNonTrivialMoveAssignment())
15756 VBases.insert(std::make_pair(
Base->getCanonicalDecl(), &BI))
15758 if (Existing && Existing != &BI) {
15759 S.
Diag(CurrentLocation, diag::warn_vbase_moved_multiple_times)
15762 << (
Base->getCanonicalDecl() ==
15765 S.
Diag(BI.getBeginLoc(), diag::note_vbase_moved_here)
15766 << (
Base->getCanonicalDecl() ==
15767 BI.getType()->getAsCXXRecordDecl()->getCanonicalDecl())
15771 Existing =
nullptr;
15781 llvm::append_range(Worklist, llvm::make_pointer_range(
Base->bases()));
15789 DefaultedFunctionFPFeaturesRAII RestoreFP(*
this, MoveAssignOperator);
15795 "DefineImplicitMoveAssignment called for wrong function");
15825 Scope.addContextNote(CurrentLocation);
15841 RefBuilder OtherRef(
Other, OtherRefType);
15843 MoveCastBuilder MoveOther(OtherRef);
15846 std::optional<ThisBuilder>
This;
15847 std::optional<DerefBuilder> DerefThis;
15848 std::optional<RefBuilder> ExplicitObject;
15850 bool IsArrow =
false;
15855 ExplicitObject.emplace(MoveAssignOperator->
getParamDecl(0), ObjectType);
15859 DerefThis.emplace(*
This);
15862 ExprBuilder &ObjectParameter =
15863 ExplicitObject ? *ExplicitObject :
static_cast<ExprBuilder &
>(*This);
15867 for (
auto &
Base : ClassDecl->
bases()) {
15878 QualType BaseType =
Base.getType().getUnqualifiedType();
15879 if (!BaseType->isRecordType()) {
15885 BasePath.push_back(&
Base);
15889 CastBuilder From(OtherRef, BaseType,
VK_XValue, BasePath);
15894 ExplicitObject ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15895 :
static_cast<ExprBuilder &
>(*DerefThis),
15904 if (Move.isInvalid()) {
15910 Statements.push_back(Move.getAs<
Expr>());
15917 ExprBuilder &To = ExplicitObject
15918 ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15919 :
static_cast<ExprBuilder &
>(*DerefThis);
15926 *
this, Loc,
Context.getCanonicalTagType(ClassDecl), To, OtherRef);
15927 if (
Copy.isInvalid()) {
15931 Statements.push_back(
Copy.getAs<
Stmt>());
15935 for (
auto *Field : ClassDecl->
fields()) {
15937 if (Field->isUnnamedBitField() || Field->getParent()->isUnion())
15940 if (Field->isInvalidDecl()) {
15946 if (Field->getType()->isReferenceType()) {
15947 Diag(ClassDecl->
getLocation(), diag::err_uninitialized_member_for_assign)
15948 <<
Context.getCanonicalTagType(ClassDecl) << 0
15949 << Field->getDeclName();
15950 Diag(Field->getLocation(), diag::note_declared_at);
15957 if (!BaseType->isRecordType() && BaseType.isConstQualified()) {
15958 Diag(ClassDecl->
getLocation(), diag::err_uninitialized_member_for_assign)
15959 <<
Context.getCanonicalTagType(ClassDecl) << 1
15960 << Field->getDeclName();
15961 Diag(Field->getLocation(), diag::note_declared_at);
15967 if (Field->isZeroLengthBitField())
15970 QualType FieldType = Field->getType().getNonReferenceType();
15973 "Incomplete array type is not valid");
15978 LookupResult MemberLookup(*
this, Field->getDeclName(), Loc,
15982 MemberBuilder From(MoveOther, OtherRefType,
15983 false, MemberLookup);
15984 MemberBuilder To(ObjectParameter, ObjectType, IsArrow, MemberLookup);
15986 assert(!From.build(*
this, Loc)->isLValue() &&
15987 "Member reference with rvalue base must be rvalue except for reference "
15988 "members, which aren't allowed for move assignment.");
15995 if (Move.isInvalid()) {
16001 Statements.push_back(Move.getAs<
Stmt>());
16007 (ExplicitObject ?
static_cast<ExprBuilder &
>(*ExplicitObject)
16008 :
LangOpts.HLSL ?
static_cast<ExprBuilder &
>(*This)
16009 :
static_cast<ExprBuilder &
>(*DerefThis))
16010 .build(*
this, Loc);
16016 Statements.push_back(Return.
getAs<
Stmt>());
16029 assert(!Body.
isInvalid() &&
"Compound statement creation cannot fail");
16035 L->CompletedImplicitDefinition(MoveAssignOperator);
16046 DeclaringSpecialMember DSM(*
this, ClassDecl,
16048 if (DSM.isAlreadyBeingDeclared())
16052 std::nullopt, ClassDecl,
16069 =
Context.DeclarationNames.getCXXConstructorName(
16070 Context.getCanonicalType(ClassType));
16089 CUDA().inferTargetForImplicitSpecialMember(
16115 ClassDecl->
hasAttr<TrivialABIAttr>() ||
16148 "DefineImplicitCopyConstructor - call it for implicit copy ctor");
16153 assert(ClassDecl &&
"DefineImplicitCopyConstructor - invalid constructor");
16164 Scope.addContextNote(CurrentLocation);
16194 DeclaringSpecialMember DSM(*
this, ClassDecl,
16196 if (DSM.isAlreadyBeingDeclared())
16200 std::nullopt, ClassDecl,
16213 =
Context.DeclarationNames.getCXXConstructorName(
16214 Context.getCanonicalType(ClassType));
16234 CUDA().inferTargetForImplicitSpecialMember(
16241 ClassLoc, ClassLoc,
16254 ClassDecl->
hasAttr<TrivialABIAttr>() ||
16287 "DefineImplicitMoveConstructor - call it for implicit move ctor");
16292 assert(ClassDecl &&
"DefineImplicitMoveConstructor - invalid constructor");
16303 Scope.addContextNote(CurrentLocation);
16349 if (CallOp != Invoker) {
16368 if (Invoker != CallOp) {
16381 assert(FunctionRef &&
"Can't refer to __invoke function?");
16389 L->CompletedImplicitDefinition(Conv);
16390 if (Invoker != CallOp)
16391 L->CompletedImplicitDefinition(Invoker);
16419 Diag(CurrentLocation, diag::note_lambda_to_block_conv);
16428 Diag(CurrentLocation, diag::note_lambda_to_block_conv);
16434 Stmt *ReturnS = Return.
get();
16441 L->CompletedImplicitDefinition(Conv);
16448 switch (Args.size()) {
16453 if (!Args[1]->isDefaultArgument())
16458 return !Args[0]->isDefaultArgument();
16467 bool HadMultipleCandidates,
bool IsListInitialization,
16468 bool IsStdInitListInitialization,
bool RequiresZeroInit,
16470 bool Elidable =
false;
16489 Expr *SubExpr = ExprArgs[0];
16500 Elidable, ExprArgs, HadMultipleCandidates,
16501 IsListInitialization,
16502 IsStdInitListInitialization, RequiresZeroInit,
16503 ConstructKind, ParenRange);
16509 bool HadMultipleCandidates,
bool IsListInitialization,
16510 bool IsStdInitListInitialization,
bool RequiresZeroInit,
16512 if (
auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl)) {
16522 ConstructLoc, DeclInitType,
Constructor, Elidable, ExprArgs,
16523 HadMultipleCandidates, IsListInitialization, IsStdInitListInitialization,
16524 RequiresZeroInit, ConstructKind, ParenRange);
16532 bool HadMultipleCandidates,
bool IsListInitialization,
16533 bool IsStdInitListInitialization,
bool RequiresZeroInit,
16538 "given constructor for wrong type");
16546 HadMultipleCandidates, IsListInitialization,
16547 IsStdInitListInitialization, RequiresZeroInit,
16579 PDiag(diag::err_access_dtor_var)
16589 bool HasConstantInit =
false;
16597 diag::err_constexpr_var_requires_const_destruction) << VD;
16608 if (!VD->
hasAttr<AlwaysDestroyAttr>())
16620 bool AllowExplicit,
16621 bool IsListInitialization) {
16623 unsigned NumArgs = ArgsPtr.size();
16624 Expr **Args = ArgsPtr.data();
16630 if (NumArgs < NumParams)
16631 ConvertedArgs.reserve(NumParams);
16633 ConvertedArgs.reserve(NumArgs);
16641 CallType, AllowExplicit, IsListInitialization);
16642 ConvertedArgs.append(AllArgs.begin(), AllArgs.end());
16653 bool SeenTypedOperators =
Context.hasSeenTypeAwareOperatorNewOrDelete();
16660 if (DeallocType.
isNull())
16671 constexpr unsigned RequiredParameterCount =
16674 if (NumParams != RequiredParameterCount)
16679 if (llvm::any_of(FnDecl->
parameters().drop_front(),
16681 return ParamDecl->getType()->isDependentType();
16686 if (SpecializedTypeIdentity.
isNull())
16690 ArgTypes.reserve(NumParams);
16696 ArgTypes.push_back(SpecializedTypeIdentity);
16717 diag::err_operator_new_delete_declared_in_namespace)
16724 diag::err_operator_new_delete_declared_static)
16734 Qualifiers PtrQuals = PtrTy->getPointeeType().getQualifiers();
16737 PtrTy->getPointeeType().getUnqualifiedType(), PtrQuals)));
16744 bool *WasMalformed) {
16745 const Decl *MalformedDecl =
nullptr;
16748 nullptr, &MalformedDecl))
16751 if (!MalformedDecl)
16755 *WasMalformed =
true;
16773 SemaRef, FD,
nullptr);
16774 unsigned DestroyingDeleteIdx = IsPotentiallyTypeAware + 1;
16783 unsigned DependentParamTypeDiag,
unsigned InvalidParamTypeDiag) {
16784 auto NormalizeType = [&SemaRef](
QualType T) {
16788 if (
const auto PtrTy =
T->template getAs<PointerType>())
16795 unsigned FirstNonTypeParam = 0;
16796 bool MalformedTypeIdentity =
false;
16798 SemaRef, FnDecl, &MalformedTypeIdentity);
16799 unsigned MinimumMandatoryArgumentCount = 1;
16800 unsigned SizeParameterIndex = 0;
16801 if (IsPotentiallyTypeAware) {
16805 SemaRef.
Diag(FnDecl->
getLocation(), diag::warn_ext_type_aware_allocators);
16808 SizeParameterIndex = 1;
16809 MinimumMandatoryArgumentCount =
16812 SizeParameterIndex = 2;
16813 MinimumMandatoryArgumentCount =
16816 FirstNonTypeParam = 1;
16819 bool IsPotentiallyDestroyingDelete =
16822 if (IsPotentiallyDestroyingDelete) {
16823 ++MinimumMandatoryArgumentCount;
16824 ++SizeParameterIndex;
16827 if (NumParams < MinimumMandatoryArgumentCount)
16829 diag::err_operator_new_delete_too_few_parameters)
16830 << IsPotentiallyTypeAware << IsPotentiallyDestroyingDelete
16831 << FnDecl->
getDeclName() << MinimumMandatoryArgumentCount;
16833 for (
unsigned Idx = 0; Idx < MinimumMandatoryArgumentCount; ++Idx) {
16837 diag::err_operator_new_default_arg)
16842 QualType CanResultType = NormalizeType(FnType->getReturnType());
16843 QualType CanExpectedResultType = NormalizeType(ExpectedResultType);
16844 QualType CanExpectedSizeOrAddressParamType =
16845 NormalizeType(ExpectedSizeOrAddressParamType);
16848 if (CanResultType != CanExpectedResultType) {
16851 return SemaRef.
Diag(
16853 CanResultType->isDependentType()
16854 ? diag::err_operator_new_delete_dependent_result_type
16855 : diag::err_operator_new_delete_invalid_result_type)
16862 diag::err_operator_new_delete_template_too_few_parameters)
16866 auto FallbackType) ->
bool {
16870 << IsPotentiallyTypeAware << IsPotentiallyDestroyingDelete
16876 auto ActualParamType =
16878 if (ActualParamType == CanExpectedTy)
16880 unsigned Diagnostic = ActualParamType->isDependentType()
16881 ? DependentParamTypeDiag
16882 : InvalidParamTypeDiag;
16884 << IsPotentiallyTypeAware << IsPotentiallyDestroyingDelete
16890 if (CheckType(FirstNonTypeParam, CanExpectedSizeOrAddressParamType,
"size_t"))
16897 if (!IsPotentiallyTypeAware)
16906 if (CheckType(SizeParameterIndex + 1, StdAlignValT,
"std::align_val_t"))
16910 return MalformedTypeIdentity;
16929 SizeTy, diag::err_operator_new_dependent_param_type,
16930 diag::err_operator_new_param_type);
16942 auto *MD = dyn_cast<CXXMethodDecl>(FnDecl);
16943 auto ConstructDestroyingDeleteAddressType = [&]() {
16956 SemaRef, MD,
nullptr)) {
16960 AddressParamType == ConstructDestroyingDeleteAddressType()) {
16971 diag::err_type_aware_destroying_operator_delete)
16972 << Param->getSourceRange();
16994 diag::err_operator_delete_dependent_param_type,
16995 diag::err_operator_delete_param_type))
17004 diag::err_destroying_operator_delete_not_usual);
17014 "Expected an overloaded operator declaration");
17024 if (Op == OO_Delete || Op == OO_Array_Delete)
17027 if (Op == OO_New || Op == OO_Array_New)
17037 if (
CXXMethodDecl *MethodDecl = dyn_cast<CXXMethodDecl>(FnDecl)) {
17038 if (MethodDecl->isStatic()) {
17039 if (Op == OO_Call || Op == OO_Subscript)
17043 return Diag(FnDecl->
getLocation(), diag::err_operator_overload_static)
17047 bool ClassOrEnumParam =
false;
17049 QualType ParamType = Param->getType().getNonReferenceType();
17052 ClassOrEnumParam =
true;
17057 if (!ClassOrEnumParam)
17059 diag::err_operator_overload_needs_class_or_enum)
17069 if (Op != OO_Call) {
17072 if (Param->hasDefaultArg()) {
17073 FirstDefaultedParam = Param;
17077 if (FirstDefaultedParam) {
17078 if (Op == OO_Subscript) {
17080 ? diag::ext_subscript_overload
17081 : diag::error_subscript_overload)
17086 diag::err_operator_overload_default_arg)
17094 {
false,
false,
false }
17095#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
17096 , { Unary, Binary, MemberOnly }
17097#include "clang/Basic/OperatorKinds.def"
17100 bool CanBeUnaryOperator = OperatorUses[Op][0];
17101 bool CanBeBinaryOperator = OperatorUses[Op][1];
17102 bool MustBeMemberOperator = OperatorUses[Op][2];
17113 if (Op != OO_Call && Op != OO_Subscript &&
17114 ((NumParams == 1 && !CanBeUnaryOperator) ||
17115 (NumParams == 2 && !CanBeBinaryOperator) || (NumParams < 1) ||
17116 (NumParams > 2))) {
17118 unsigned ErrorKind;
17119 if (CanBeUnaryOperator && CanBeBinaryOperator) {
17121 }
else if (CanBeUnaryOperator) {
17124 assert(CanBeBinaryOperator &&
17125 "All non-call overloaded operators are unary or binary!");
17128 return Diag(FnDecl->
getLocation(), diag::err_operator_overload_must_be)
17129 << FnDecl->
getDeclName() << NumParams << ErrorKind;
17132 if (Op == OO_Subscript && NumParams != 2) {
17134 ? diag::ext_subscript_overload
17135 : diag::error_subscript_overload)
17136 << FnDecl->
getDeclName() << (NumParams == 1 ? 0 : 2);
17141 if (Op != OO_Call &&
17143 return Diag(FnDecl->
getLocation(), diag::err_operator_overload_variadic)
17150 diag::err_operator_overload_must_be_member)
17164 if ((Op == OO_PlusPlus || Op == OO_MinusMinus) && NumParams == 2) {
17171 diag::err_operator_overload_post_incdec_must_be_int)
17172 << LastParam->
getType() << (Op == OO_MinusMinus);
17184 if (TemplateParams->
size() == 1) {
17186 dyn_cast<NonTypeTemplateParmDecl>(TemplateParams->
getParam(0));
17200 if (SemaRef.
getLangOpts().CPlusPlus20 && PmDecl &&
17203 PmDecl->
getType()->
getAs<DeducedTemplateSpecializationType>()))
17205 }
else if (TemplateParams->
size() == 2) {
17207 dyn_cast<TemplateTypeParmDecl>(TemplateParams->
getParam(0));
17209 dyn_cast<NonTypeTemplateParmDecl>(TemplateParams->
getParam(1));
17215 if (
const auto *TArgs =
17217 TArgs && TArgs->getDepth() == PmType->
getDepth() &&
17218 TArgs->getIndex() == PmType->
getIndex()) {
17221 diag::ext_string_literal_operator_template);
17228 diag::err_literal_operator_template)
17235 Diag(FnDecl->
getLocation(), diag::err_literal_operator_outside_namespace)
17244 Diag(LSD->getExternLoc(), diag::note_extern_c_begins_here);
17263 diag::err_literal_operator_template_with_params);
17273 QualType ParamType = Param->getType().getUnqualifiedType();
17285 QualType InnerType = Ptr->getPointeeType();
17291 Diag(Param->getSourceRange().getBegin(),
17292 diag::err_literal_operator_param)
17293 << ParamType <<
"'const char *'" << Param->getSourceRange();
17298 Diag(Param->getSourceRange().getBegin(), diag::err_literal_operator_param)
17299 << ParamType <<
Context.LongDoubleTy << Param->getSourceRange();
17303 Diag(Param->getSourceRange().getBegin(), diag::err_literal_operator_param)
17304 << ParamType <<
Context.UnsignedLongLongTy << Param->getSourceRange();
17308 Diag(Param->getSourceRange().getBegin(),
17309 diag::err_literal_operator_invalid_param)
17310 << ParamType << Param->getSourceRange();
17319 QualType FirstParamType = (*Param)->getType().getUnqualifiedType();
17326 Diag((*Param)->getSourceRange().getBegin(),
17327 diag::err_literal_operator_param)
17328 << FirstParamType <<
"'const char *'" << (*Param)->getSourceRange();
17335 Diag((*Param)->getSourceRange().getBegin(),
17336 diag::err_literal_operator_param)
17337 << FirstParamType <<
"'const char *'" << (*Param)->getSourceRange();
17350 Diag((*Param)->getSourceRange().getBegin(),
17351 diag::err_literal_operator_param)
17352 << FirstParamType <<
"'const char *'" << (*Param)->getSourceRange();
17360 QualType SecondParamType = (*Param)->getType().getUnqualifiedType();
17361 if (!
Context.hasSameType(SecondParamType,
Context.getSizeType())) {
17362 Diag((*Param)->getSourceRange().getBegin(),
17363 diag::err_literal_operator_param)
17364 << SecondParamType <<
Context.getSizeType()
17365 << (*Param)->getSourceRange();
17369 Diag(FnDecl->
getLocation(), diag::err_literal_operator_bad_param_count);
17378 if (Param->hasDefaultArg()) {
17379 Diag(Param->getDefaultArgRange().getBegin(),
17380 diag::err_literal_operator_default_argument)
17381 << Param->getDefaultArgRange();
17396 <<
static_cast<int>(Status)
17407 assert(Lit->
isUnevaluated() &&
"Unexpected string literal kind");
17413 else if (Lang ==
"C++")
17416 Diag(LangStr->
getExprLoc(), diag::err_language_linkage_spec_unknown)
17436 if (
getLangOpts().CPlusPlusModules && isCurrentModulePurview()) {
17437 Module *GlobalModule = PushImplicitGlobalModuleFragment(ExternLoc);
17460 PopImplicitGlobalModuleFragment();
17463 return LinkageSpec;
17487 ExDeclType =
Context.getArrayDecayedType(ExDeclType);
17489 ExDeclType =
Context.getPointerType(ExDeclType);
17496 Diag(Loc, diag::err_catch_rvalue_ref);
17501 Diag(Loc, diag::err_catch_variably_modified) << ExDeclType;
17507 unsigned DK = diag::err_catch_incomplete;
17509 BaseType = Ptr->getPointeeType();
17511 DK = diag::err_catch_incomplete_ptr;
17514 BaseType = Ref->getPointeeType();
17516 DK = diag::err_catch_incomplete_ref;
17518 if (!
Invalid && (Mode == 0 || !BaseType->isVoidType()) &&
17522 if (!
Invalid && BaseType.isWebAssemblyReferenceType()) {
17523 Diag(Loc, diag::err_wasm_reftype_tc) << 1;
17533 Diag(Loc, diag::err_throw_or_catch_address_space_qualified_ptr)
17534 << 1 << 0 << ExDeclType;
17537 }
else if (Mode == 2) {
17541 Diag(Loc, diag::err_throw_or_catch_address_space_qualified_ptr)
17542 << 1 << 0 << ExDeclType;
17545 Diag(Loc, diag::err_throw_or_catch_address_space_qualified_ptr)
17546 << 1 << 1 << ExDeclType;
17551 if (!
Invalid && Mode != 1 && BaseType->isSizelessType()) {
17552 Diag(Loc, diag::err_catch_sizeless) << (Mode == 2 ? 1 : 0) << BaseType;
17558 diag::err_abstract_type_in_decl,
17567 T = RT->getPointeeType();
17569 if (
T->isObjCObjectType()) {
17570 Diag(Loc, diag::err_objc_object_catch);
17572 }
else if (
T->isObjCObjectPointerType()) {
17575 Diag(Loc, diag::warn_objc_pointer_cxx_catch_fragile);
17584 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(ExDecl))
17609 Expr *opaqueValue =
17659 Diag(PrevDecl->getLocation(), diag::note_previous_definition);
17661 }
else if (PrevDecl->isTemplateParameter())
17689 Expr *AssertMessageExpr,
17695 AssertMessageExpr, RParenLoc,
false);
17700 case BuiltinType::Char_S:
17701 case BuiltinType::Char_U:
17703 case BuiltinType::Char8:
17706 case BuiltinType::Char16:
17709 case BuiltinType::Char32:
17712 case BuiltinType::WChar_S:
17713 case BuiltinType::WChar_U:
17717 llvm_unreachable(
"Non-character type");
17727 char Arr[UNI_MAX_UTF8_BYTES_PER_CODE_POINT];
17730 llvm::raw_svector_ostream OS(Str);
17734 if (K == BuiltinType::Char_S || K == BuiltinType::Char_U ||
17735 K == BuiltinType::Char8 ||
Value <= 0x7F) {
17737 if (!Escaped.empty())
17740 OS << static_cast<char>(
Value);
17745 case BuiltinType::Char16:
17746 case BuiltinType::Char32:
17747 case BuiltinType::WChar_S:
17748 case BuiltinType::WChar_U: {
17749 if (llvm::ConvertCodePointToUTF8(
Value, Ptr))
17753 << llvm::format_hex_no_prefix(
Value, TyWidth / 4,
true);
17757 llvm_unreachable(
"Non-character type is passed");
17769 switch (
V.getKind()) {
17771 if (
T->isBooleanType()) {
17775 int64_t BoolValue =
V.getInt().getExtValue();
17776 assert((BoolValue == 0 || BoolValue == 1) &&
17777 "Bool type, but value is not 0 or 1");
17778 llvm::raw_svector_ostream OS(Str);
17779 OS << (BoolValue ?
"true" :
"false");
17781 llvm::raw_svector_ostream OS(Str);
17786 switch (BTy->getKind()) {
17787 case BuiltinType::Char_S:
17788 case BuiltinType::Char_U:
17789 case BuiltinType::Char8:
17790 case BuiltinType::Char16:
17791 case BuiltinType::Char32:
17792 case BuiltinType::WChar_S:
17793 case BuiltinType::WChar_U: {
17794 unsigned TyWidth = Context.getIntWidth(
T);
17795 assert(8 <= TyWidth && TyWidth <= 32 &&
"Unexpected integer width");
17801 << llvm::format_hex_no_prefix(CodeUnit, 2,
17803 <<
", " <<
V.getInt() <<
')';
17810 V.getInt().toString(Str);
17816 V.getFloat().toString(Str);
17820 if (
V.isNullPointer()) {
17821 llvm::raw_svector_ostream OS(Str);
17828 llvm::raw_svector_ostream OS(Str);
17830 V.getComplexFloatReal().toString(Str);
17832 V.getComplexFloatImag().toString(Str);
17837 llvm::raw_svector_ostream OS(Str);
17839 V.getComplexIntReal().toString(Str);
17841 V.getComplexIntImag().toString(Str);
17868 if (
const auto *UnaryOp = dyn_cast<UnaryOperator>(E))
17872 if (
const auto *BO = dyn_cast<BinaryOperator>(E))
17873 return (BO->isShiftOp() || BO->isAdditiveOp() || BO->isMultiplicativeOp() ||
17874 BO->isBitwiseOp());
17882 if (
const auto *Op = dyn_cast<BinaryOperator>(E);
17883 Op && Op->getOpcode() != BO_LOr) {
17884 const Expr *LHS = Op->getLHS()->IgnoreParenImpCasts();
17885 const Expr *RHS = Op->getRHS()->IgnoreParenImpCasts();
17903 for (
auto &DiagSide : DiagSides) {
17904 const Expr *Side = DiagSide.Cond;
17909 DiagSide.Result.Val, Side->
getType(), DiagSide.ValueString,
Context);
17911 if (DiagSides[0].Print && DiagSides[1].Print) {
17912 Diag(Op->getExprLoc(), diag::note_expr_evaluates_to)
17913 << DiagSides[0].ValueString << Op->getOpcodeStr()
17914 << DiagSides[1].ValueString << Op->getSourceRange();
17916 }
else if (
const auto *RE = dyn_cast<RequiresExpr>(E)) {
17923template <
typename ResultType>
17927 bool ErrorOnInvalidMessage) {
17930 assert(!Message->isTypeDependent() && !Message->isValueDependent() &&
17931 "can't evaluate a dependant static assert message");
17933 if (
const auto *SL = dyn_cast<StringLiteral>(Message)) {
17934 assert(SL->isUnevaluated() &&
"expected an unevaluated string");
17935 if constexpr (std::is_same_v<APValue, ResultType>) {
17940 assert(CAT &&
"string literal isn't an array");
17944 for (
unsigned I = 0; I < SL->getLength(); I++) {
17945 Value = SL->getCodeUnit(I);
17949 Result.assign(SL->getString().begin(), SL->getString().end());
17955 QualType T = Message->getType().getNonReferenceType();
17956 auto *RD =
T->getAsCXXRecordDecl();
17958 SemaRef.
Diag(Loc, diag::err_user_defined_msg_invalid) << EvalContext;
17962 auto FindMember = [&](StringRef
Member) -> std::optional<LookupResult> {
17966 if (MemberLookup.
empty())
17967 return std::nullopt;
17968 return std::move(MemberLookup);
17971 std::optional<LookupResult> SizeMember = FindMember(
"size");
17972 std::optional<LookupResult> DataMember = FindMember(
"data");
17973 if (!SizeMember || !DataMember) {
17974 SemaRef.
Diag(Loc, diag::err_user_defined_msg_missing_member_function)
17976 << ((!SizeMember && !DataMember) ? 2
17984 Message, Message->getType(), Message->getBeginLoc(),
false,
18010 SemaRef.
Diag(Loc, diag::err_user_defined_msg_invalid_mem_fn_ret_ty)
18011 << EvalContext << 0;
18021 SemaRef.
Diag(Loc, diag::err_user_defined_msg_invalid_mem_fn_ret_ty)
18022 << EvalContext << 1;
18026 if (!ErrorOnInvalidMessage &&
18027 SemaRef.
Diags.
isIgnored(diag::warn_user_defined_msg_constexpr, Loc))
18032 Status.Diag = &Notes;
18034 if (!Message->EvaluateCharRangeAsString(
Result, EvaluatedSize.
get(),
18035 EvaluatedData.
get(), Ctx, SProxy,
18038 SemaRef.
Diag(Message->getBeginLoc(),
18039 ErrorOnInvalidMessage ? diag::err_user_defined_msg_constexpr
18040 : diag::warn_user_defined_msg_constexpr)
18042 for (
const auto &
Note : Notes)
18044 return !ErrorOnInvalidMessage;
18051 bool ErrorOnInvalidMessage) {
18053 ErrorOnInvalidMessage);
18058 bool ErrorOnInvalidMessage) {
18060 ErrorOnInvalidMessage);
18064 Expr *AssertExpr,
Expr *AssertMessage,
18067 assert(AssertExpr !=
nullptr &&
"Expected non-null condition");
18085 AssertExpr = FullAssertExpr.
get();
18088 Expr *BaseExpr = AssertExpr;
18100 diag::err_static_assert_expression_is_not_constant,
18106 if (!Failed && AssertMessage && Cond.getBoolValue()) {
18116 bool InTemplateDefinition =
18119 if (!Failed && !Cond && !InTemplateDefinition) {
18121 llvm::raw_svector_ostream Msg(MsgBuffer);
18122 bool HasMessage = AssertMessage;
18123 if (AssertMessage) {
18131 Expr *InnerCond =
nullptr;
18132 std::string InnerCondDescription;
18133 std::tie(InnerCond, InnerCondDescription) =
18135 if (
const auto *ConceptIDExpr =
18136 dyn_cast_or_null<ConceptSpecializationExpr>(InnerCond)) {
18138 ConceptIDExpr->getSatisfaction();
18149 diag::err_static_assert_requirement_failed)
18150 << InnerCondDescription << !HasMessage << Msg.str()
18167 AssertExpr = FullAssertExpr.
get();
18171 AssertExpr, AssertMessage, RParenLoc,
18179 if (
const auto *PIT = dyn_cast<PackIndexingType>(
T))
18180 return PIT->getPattern();
18184static const TemplateSpecializationType *
18187 if (
const auto *ICNT = dyn_cast<InjectedClassNameType>(
T))
18188 T = ICNT->getDecl()->getCanonicalTemplateSpecializationType(Context);
18190 const auto *TST = dyn_cast<TemplateSpecializationType>(
T);
18194 TemplateDecl *TD = TST->getTemplateName().getAsTemplateDecl();
18216 if (
const auto *TST =
18218 if (isa_and_nonnull<TypeAliasTemplateDecl>(
18219 TST->getTemplateName().getAsTemplateDecl())) {
18220 S.
Diag(Loc, diag::err_dependent_friend_not_member_of_template_spec)
18227 S.
Diag(Loc, diag::err_dependent_friend_not_member_of_template_spec) << NNS;
18229 S.
Diag(Loc, diag::err_dependent_friend_not_member);
18236 bool IsInstantiation) {
18242 "nested-name-specifier of dependent friend must be a type");
18248 const TemplateSpecializationType *TST =
18260 llvm::SmallBitVector UsedParameters(Params->size());
18262 true, Params->getDepth(),
18265 for (
unsigned I = 0, N = UsedParameters.size(); I != N; ++I)
18266 if (!UsedParameters[I])
18267 UndeducedParameters.push_back(Params->getParam(I));
18270 if (UndeducedParameters.empty())
18273 Diag(Loc, diag::err_dependent_friend_undeduced_params)
18274 << (UndeducedParameters.size() > 1) <<
QualType(TST, 0);
18276 for (
NamedDecl *Param : UndeducedParameters) {
18277 if (Param->getDeclName())
18278 Diag(Param->getLocation(), diag::note_non_deducible_parameter)
18279 << Param->getDeclName();
18281 Diag(Param->getLocation(), diag::note_non_deducible_parameter)
18295 bool IsMemberSpecialization =
false;
18300 TempParamLists,
true,
18301 IsMemberSpecialization,
Invalid);
18306 if (TemplateParams) {
18307 Diag(NameLoc, diag::err_not_class_template_specialization) << 0;
18312 if (TemplateParams) {
18313 if (TemplateParams->
size() > 0) {
18321 FriendLoc, TempParamLists.size() - 1, TempParamLists.data(),
18322 IsMemberSpecialization);
18335 bool IsAllExplicitSpecializations =
18337 return List->
size() == 0;
18346 if (!TemplateId && IsAllExplicitSpecializations) {
18348 bool Owned =
false;
18349 bool IsDependent =
false;
18366 NameLoc, &TSI,
true);
18371 FriendLoc, EllipsisLoc);
18377 assert(SS.
isNotEmpty() &&
"valid templated tag with no SS and no direct?");
18380 if (TemplateParams)
18381 TPLs = TPLs.drop_back();
18401 TSI =
Context.CreateTypeSourceInfo(
T);
18414 }
else if (Unexpanded.empty()) {
18415 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
18421 if (!TempParamLists.empty()) {
18422 unsigned FriendDeclDepth = TempParamLists.front()->getDepth();
18424 if (std::optional<std::pair<unsigned, unsigned>> DI =
18426 DI && DI->first >= FriendDeclDepth) {
18427 auto *ND = dyn_cast<NamedDecl *>(
U.first);
18430 Diag(
U.second, diag::friend_template_decl_malformed_pack_expansion)
18440 if (TempParamLists.empty())
18448 if (TemplateParams)
18481 Diag(FriendLoc, diag::err_friend_not_first_in_declaration);
18513 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
18518 if (!
T->isElaboratedTypeSpecifier()) {
18519 if (TempParams.size()) {
18531 }
else if (
const RecordDecl *RD =
T->getAsRecordDecl()) {
18536 ? diag::warn_cxx98_compat_unelaborated_friend_type
18537 : diag::ext_unelaborated_friend_type)
18542 DiagCompat(FriendLoc, diag_compat::nonclass_type_friend)
18559 if (!TempParams.empty()) {
18565 TempParams, EllipsisLoc);
18568 TSI, FriendLoc, EllipsisLoc);
18603 Diag(Loc, diag::err_unexpected_friend);
18645 if (IsNamespaceOrGlobal) {
18655 Scope *DCScope = S;
18665 (FunctionContainingLocalClass =
18688 DC =
Previous.getRepresentativeDecl()->getDeclContext();
18692 DC = FunctionContainingLocalClass;
18729 if (isTemplateId) {
18744 if (!DC)
return nullptr;
18755 diag::warn_cxx98_compat_friend_is_member :
18756 diag::err_friend_is_member);
18789 if (DiagArg >= 0) {
18790 Diag(Loc, diag::err_introducing_special_friend) << DiagArg;
18806 DCScope = &FakeDCScope;
18809 bool AddToScope =
true;
18811 TemplateParams, AddToScope);
18812 if (!ND)
return nullptr;
18839 Friend->setInvalidDecl();
18845 assert(FD &&
"Expected a function declaration!");
18852 if (!TPLs.empty() && SS.
isValid())
18866 if (!TemplateParams.empty() && SS.
isValid() &&
18885 }
else if (FunctionContainingLocalClass) {
18894 }
else if (isTemplateId) {
18908 Diag(FD->
getLocation(), diag::err_friend_decl_with_def_arg_redeclared);
18910 diag::note_previous_declaration);
18912 Diag(FD->
getLocation(), diag::err_friend_decl_with_def_arg_must_be_def);
18922 FunctionDecl *Fn = dyn_cast_or_null<FunctionDecl>(Dcl);
18924 Diag(DelLoc, diag::err_deleted_non_function);
18929 Fn->setWillHaveBody(
false);
18931 if (
const FunctionDecl *Prev = Fn->getPreviousDecl()) {
18935 Prev->getPreviousDecl()) &&
18936 !Prev->isDefined()) {
18937 Diag(DelLoc, diag::err_deleted_decl_not_first);
18938 Diag(Prev->getLocation().isInvalid() ? DelLoc : Prev->getLocation(),
18939 Prev->isImplicit() ? diag::note_previous_implicit_declaration
18940 : diag::note_previous_declaration);
18943 Fn->setInvalidDecl();
18951 Fn = Fn->getCanonicalDecl();
18956 Diag(Fn->getLocation(), diag::err_attribute_dll_deleted) << DLLAttr;
18957 Fn->setInvalidDecl();
18963 Diag(DelLoc, diag::err_deleted_main);
18967 Fn->setImplicitlyInline();
18968 Fn->setDeletedAsWritten(
true, Message);
18975 auto *FD = dyn_cast<FunctionDecl>(Dcl);
18977 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(Dcl)) {
18978 if (FTD->getTemplatedDecl()->getDefaultedFunctionKind().isComparison()) {
18979 Diag(DefaultLoc, diag::err_defaulted_comparison_template);
18984 Diag(DefaultLoc, diag::err_default_special_members)
18995 (!FD->isDependentContext() ||
18998 Diag(DefaultLoc, diag::err_default_special_members)
19007 DiagCompat(DefaultLoc, diag_compat::defaulted_comparison);
19010 FD->setDefaulted();
19011 FD->setExplicitlyDefaulted();
19012 FD->setDefaultLoc(DefaultLoc);
19015 if (FD->isDependentContext())
19021 FD->setWillHaveBody(
false);
19036 if (
const FunctionDecl *Pattern = FD->getTemplateInstantiationPattern())
19047 if (!FD->getDefaultedOrDeletedInfo() &&
19049 FD->setDefaultedOrDeletedInfo(
19075 Self.Diag(SubStmt->getBeginLoc(),
19076 diag::err_return_in_constructor_handler);
19083 for (
unsigned I = 0, E = TryBlock->
getNumHandlers(); I != E; ++I) {
19091 switch (BodyKind) {
19100 "Parsed function body should be '= delete;' or '= default;'");
19110 for (
unsigned I = 0, E = OldFT->
getNumParams(); I != E; ++I)
19114 !NewFT->getExtParameterInfo(I).isNoEscape()) {
19115 Diag(
New->getParamDecl(I)->getLocation(),
19116 diag::warn_overriding_method_missing_noescape);
19118 diag::note_overridden_marked_noescape);
19124 Diag(
New->getLocation(), diag::err_conflicting_overriding_attributes)
19131 const auto *OldCSA = Old->
getAttr<CodeSegAttr>();
19132 const auto *NewCSA =
New->getAttr<CodeSegAttr>();
19133 if ((NewCSA || OldCSA) &&
19134 (!OldCSA || !NewCSA || NewCSA->getName() != OldCSA->getName())) {
19135 Diag(
New->getLocation(), diag::err_mismatched_code_seg_override);
19141 if (
Context.hasAnyFunctionEffects()) {
19143 const auto NewFXOrig =
New->getFunctionEffects();
19145 if (OldFX != NewFXOrig) {
19149 for (
const auto &Diff : Diffs) {
19150 switch (Diff.shouldDiagnoseMethodOverride(*Old, OldFX, *
New, NewFX)) {
19154 Diag(
New->getLocation(), diag::warn_conflicting_func_effect_override)
19155 << Diff.effectName();
19160 NewFX.
insert(Diff.Old.value(), Errs);
19165 NewFT->getParamTypes(), EPI);
19166 New->setType(ModQT);
19167 if (Errs.empty()) {
19170 Diag(
New->getLocation(), diag::warn_mismatched_func_effect_override)
19171 << Diff.effectName();
19188 if (NewCC == OldCC)
19199 diag::err_conflicting_overriding_cc_attributes)
19209 if (!
New->isExplicitObjectMemberFunction())
19211 Diag(
New->getParamDecl(0)->getBeginLoc(),
19212 diag::err_explicit_object_parameter_nonmember)
19213 <<
New->getSourceRange() << 1 <<
false;
19215 New->setInvalidDecl();
19224 if (
Context.hasSameType(NewTy, OldTy) ||
19239 if (NewRT->getTypeClass() == OldRT->getTypeClass()) {
19249 diag::err_different_return_type_for_overriding_virtual_function)
19250 <<
New->getDeclName() << NewTy << OldTy
19251 <<
New->getReturnTypeSourceRange();
19258 if (!
Context.hasSameUnqualifiedType(NewClassTy, OldClassTy)) {
19267 diag::err_covariant_return_incomplete,
19268 New->getDeclName()))
19274 Diag(
New->getLocation(), diag::err_covariant_return_not_derived)
19275 <<
New->getDeclName() << NewTy << OldTy
19276 <<
New->getReturnTypeSourceRange();
19284 NewClassTy, OldClassTy,
19285 diag::err_covariant_return_inaccessible_base,
19286 diag::err_covariant_return_ambiguous_derived_to_base_conv,
19287 New->getLocation(),
New->getReturnTypeSourceRange(),
19288 New->getDeclName(),
nullptr)) {
19302 diag::err_covariant_return_type_different_qualifications)
19303 <<
New->getDeclName() << NewTy << OldTy
19304 <<
New->getReturnTypeSourceRange();
19314 diag::err_covariant_return_type_class_type_not_same_or_less_qualified)
19315 <<
New->getDeclName() << NewTy << OldTy
19316 <<
New->getReturnTypeSourceRange();
19328 Method->setRangeEnd(EndLoc);
19330 if (
Method->isVirtual() ||
Method->getParent()->isDependentContext()) {
19331 Method->setIsPureVirtual();
19335 if (!
Method->isInvalidDecl())
19336 Diag(
Method->getLocation(), diag::err_non_virtual_pure)
19337 <<
Method->getDeclName() << InitRange;
19344 else if (
auto *M = dyn_cast<CXXMethodDecl>(D))
19387 "Parser allowed 'typedef' as storage class of condition decl.");
19399 if (
auto *VD = dyn_cast<VarDecl>(Dcl))
19413 llvm::DenseMap<CXXRecordDecl *, bool>::iterator Pos =
19417 if (!Pos->second && VTable.DefinitionRequired)
19418 Pos->second =
true;
19422 VTablesUsed[VTable.Record] = VTable.DefinitionRequired;
19423 NewUses.push_back(
VTableUse(VTable.Record, VTable.Location));
19430 bool DefinitionRequired) {
19433 if (!
Class->isDynamicClass() ||
Class->isDependentContext() ||
19439 !
OpenMP().isInOpenMPDeclareTargetContext() &&
19440 !
OpenMP().isInOpenMPTargetExecutionDirective()) {
19441 if (!DefinitionRequired)
19449 std::pair<llvm::DenseMap<CXXRecordDecl *, bool>::iterator,
bool>
19455 if (DefinitionRequired && !Pos.first->second) {
19456 Pos.first->second =
true;
19466 if (
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
19487 if (
Class->isLocalClass())
19502 bool DefinedAnything =
false;
19503 for (
unsigned I = 0; I !=
VTableUses.size(); ++I) {
19508 Class->getTemplateSpecializationKind();
19512 bool DefineVTable =
true;
19517 if (
Class->isInCurrentModuleUnit()) {
19518 DefineVTable =
true;
19519 }
else if (KeyFunction && !KeyFunction->
hasBody()) {
19524 DefineVTable =
false;
19529 "Instantiations don't have key functions");
19531 }
else if (!KeyFunction) {
19536 bool IsExplicitInstantiationDeclaration =
19538 for (
auto *R :
Class->redecls()) {
19542 IsExplicitInstantiationDeclaration =
true;
19544 IsExplicitInstantiationDeclaration =
false;
19549 if (IsExplicitInstantiationDeclaration) {
19550 const bool HasExcludeFromExplicitInstantiation =
19558 return method->hasAttr<ExcludeFromExplicitInstantiationAttr>();
19560 if (!HasExcludeFromExplicitInstantiation)
19561 DefineVTable =
false;
19568 if (!DefineVTable) {
19576 DefinedAnything =
true;
19584 !(
Class->isInNamedModule() &&
Class->shouldEmitInExternalSource()))
19590 if (
Context.getTargetInfo().getCXXABI().hasKeyFunctions() &&
19591 Class->isExternallyVisible() &&
19592 !(
Class->getOwningModule() &&
19593 Class->getOwningModule()->isInterfaceOrPartition()) &&
19598 if (!KeyFunction || (KeyFunction->
hasBody(KeyFunctionDef) &&
19605 return DefinedAnything;
19610 for (
const auto *I : RD->
methods())
19611 if (I->isVirtual() && !I->isPureVirtual())
19617 bool ConstexprOnly) {
19621 for (
const auto &FinalOverrider : FinalOverriders) {
19622 for (
const auto &OverridingMethod : FinalOverrider.second) {
19623 assert(OverridingMethod.second.size() > 0 &&
"no final overrider");
19624 CXXMethodDecl *Overrider = OverridingMethod.second.front().Method;
19638 for (
const auto &I : RD->
bases()) {
19639 const auto *
Base = I.getType()->castAsCXXRecordDecl();
19640 if (
Base->getNumVBases() == 0)
19661 (void)
Target->hasBody(FNTarget);
19663 cast_or_null<CXXConstructorDecl>(FNTarget));
19668 *TCanonical =
Target?
Target->getCanonicalDecl() :
nullptr;
19670 if (!Current.insert(Canonical).second)
19675 Target->isInvalidDecl() ||
Valid.count(TCanonical)) {
19676 Valid.insert_range(Current);
19679 }
else if (TCanonical == Canonical ||
Invalid.count(TCanonical) ||
19680 Current.count(TCanonical)) {
19682 if (!
Invalid.count(TCanonical)) {
19684 diag::warn_delegating_ctor_cycle)
19688 if (TCanonical != Canonical)
19689 S.
Diag(
Target->getLocation(), diag::note_it_delegates_to);
19692 while (
C->getCanonicalDecl() != Canonical) {
19694 (void)
C->getTargetConstructor()->hasBody(FNTarget);
19695 assert(FNTarget &&
"Ctor cycle through bodiless function");
19699 S.
Diag(
C->getLocation(), diag::note_which_delegates_to);
19703 Invalid.insert_range(Current);
19714 for (DelegatingCtorDeclsType::iterator
19721 CI->setInvalidDecl();
19730 explicit FindCXXThisExpr(
Sema &S) : S(S) {}
19758 FindCXXThisExpr Finder(*
this);
19771 if (!Finder.TraverseStmt(
const_cast<Expr *
>(TRC.ConstraintExpr)))
19788 FindCXXThisExpr Finder(*
this);
19810 if (!Finder.TraverseType(E))
19820 FindCXXThisExpr Finder(*
this);
19823 for (
const auto *A :
Method->attrs()) {
19825 Expr *Arg =
nullptr;
19827 if (
const auto *G = dyn_cast<GuardedByAttr>(A))
19829 else if (
const auto *G = dyn_cast<PtGuardedByAttr>(A))
19831 else if (
const auto *AA = dyn_cast<AcquiredAfterAttr>(A))
19833 else if (
const auto *AB = dyn_cast<AcquiredBeforeAttr>(A))
19835 else if (
const auto *LR = dyn_cast<LockReturnedAttr>(A))
19836 Arg = LR->getArg();
19837 else if (
const auto *LE = dyn_cast<LocksExcludedAttr>(A))
19839 else if (
const auto *RC = dyn_cast<RequiresCapabilityAttr>(A))
19841 else if (
const auto *AC = dyn_cast<AcquireCapabilityAttr>(A))
19843 else if (
const auto *AC = dyn_cast<TryAcquireCapabilityAttr>(A)) {
19844 Arg = AC->getSuccessValue();
19846 }
else if (
const auto *RC = dyn_cast<ReleaseCapabilityAttr>(A))
19849 if (Arg && !Finder.TraverseStmt(Arg))
19852 for (
Expr *A : Args) {
19853 if (!Finder.TraverseStmt(A))
19867 Exceptions.clear();
19870 Exceptions.reserve(DynamicExceptions.size());
19871 for (
unsigned ei = 0, ee = DynamicExceptions.size(); ei != ee; ++ei) {
19878 if (!Unexpanded.empty()) {
19889 Exceptions.push_back(ET);
19899 "Parser should have made sure that the expression is boolean");
19919 D = FTD->getTemplatedDecl();
19929 DynamicExceptionRanges, NoexceptExpr, Exceptions,
19933 Context.adjustExceptionSpec(FD, ESI,
true);
19957 Diag(DeclStart, diag::err_anonymous_property);
19971 TInfo =
Context.getTrivialTypeSourceInfo(
T, Loc);
19982 diag::err_invalid_thread)
19990 switch (
Previous.getResultKind()) {
19997 PrevDecl =
Previous.getRepresentativeDecl();
20010 PrevDecl =
nullptr;
20014 PrevDecl =
nullptr;
20025 Record->setInvalidDecl();
20047 if (!ExplicitLists.empty()) {
20048 bool IsMemberSpecialization, IsInvalid;
20052 ExplicitLists,
false, IsMemberSpecialization, IsInvalid,
20064 if (ExplicitParams && !ExplicitParams->
empty()) {
20065 Info.AutoTemplateParameterDepth = ExplicitParams->
getDepth();
20066 llvm::append_range(Info.TemplateParams, *ExplicitParams);
20067 Info.NumExplicitTemplateParams = ExplicitParams->
size();
20069 Info.AutoTemplateParameterDepth = TemplateParameterDepth;
20070 Info.NumExplicitTemplateParams = 0;
20076 if (FSI.TemplateParams.size() > FSI.NumExplicitTemplateParams) {
20077 if (FSI.NumExplicitTemplateParams != 0) {
20098 assert(
Context.getTargetInfo().getCXXABI().isMicrosoft());
20108 if (NumParams == 0)
20117 for (
unsigned I = IsCopy ? 1 : 0; I != NumParams; ++I) {
Defines the clang::ASTContext interface.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines the classes used to store parsed information about declaration-specifiers and decla...
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
static bool CheckLiteralType(EvalInfo &Info, const Expr *E, const LValue *This=nullptr)
Check that this core constant expression is of literal type, and if not, produce an appropriate diagn...
Result
Implement __builtin_bit_cast and related operations.
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.
@ ForExternalRedeclaration
The lookup results will be used for redeclaration of a name with external linkage; non-visible lookup...
@ ForVisibleRedeclaration
The lookup results will be used for redeclaration of a name, if an entity by that name already exists...
llvm::SmallVector< std::pair< const MemRegion *, SVal >, 4 > Bindings
static void ProcessAPINotes(Sema &S, Decl *D, const api_notes::CommonEntityInfo &Info, VersionedInfoMetadata Metadata)
static AccessResult DeduceTemplateArguments(Sema &S, FriendTemplateDecl *FTD, DeclContext *DC, const TemplateSpecializationType *TST, ArrayRef< TemplateParameterList * > TPLs, TemplateSpecCandidateSet *FailedTSC, MultiLevelTemplateArgumentList &DeducedArgs)
This file declares semantic analysis for CUDA constructs.
static void DiagnoseUnsatisfiedConstraint(Sema &S, ArrayRef< UnsatisfiedConstraintRecord > Records, SourceLocation Loc, bool First=true, concepts::NestedRequirement *Req=nullptr)
static LookupResult lookupMember(Sema &S, const char *Name, CXXRecordDecl *RD, SourceLocation Loc, bool &Res)
static bool findTrivialSpecialMember(Sema &S, CXXRecordDecl *RD, CXXSpecialMemberKind CSM, unsigned Quals, bool ConstRHS, TrivialABIHandling TAH, CXXMethodDecl **Selected)
Perform lookup for a special member of the specified kind, and determine whether it is trivial.
static void checkMoveAssignmentForRepeatedMove(Sema &S, CXXRecordDecl *Class, SourceLocation CurrentLocation)
Check if we're implicitly defining a move assignment operator for a class with virtual bases.
static void checkMethodTypeQualifiers(Sema &S, Declarator &D, unsigned DiagID)
static void DelegatingCycleHelper(CXXConstructorDecl *Ctor, llvm::SmallPtrSet< CXXConstructorDecl *, 4 > &Valid, llvm::SmallPtrSet< CXXConstructorDecl *, 4 > &Invalid, llvm::SmallPtrSet< CXXConstructorDecl *, 4 > &Current, Sema &S)
static bool CheckConstexprFunctionBody(Sema &SemaRef, const FunctionDecl *Dcl, Stmt *Body, Sema::CheckConstexprKind Kind)
Check the body for the given constexpr function declaration only contains the permitted types of stat...
llvm::SmallPtrSet< QualType, 4 > IndirectBaseSet
Use small set to collect indirect bases.
static void checkCUDADeviceBuiltinSurfaceClassTemplate(Sema &S, CXXRecordDecl *Class)
static bool checkVectorDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const VectorType *VT)
static void SearchForReturnInStmt(Sema &Self, Stmt *S)
static bool checkSimpleDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const llvm::APSInt &NumElemsAPS, QualType ElemType, llvm::function_ref< ExprResult(SourceLocation, Expr *, unsigned)> GetInit)
static CXXDestructorDecl * LookupDestructorIfRelevant(Sema &S, CXXRecordDecl *Class)
static Sema::ImplicitExceptionSpecification ComputeDefaultedComparisonExceptionSpec(Sema &S, SourceLocation Loc, FunctionDecl *FD, DefaultedComparisonKind DCK)
static void extendRight(SourceRange &R, SourceRange After)
static void DiagnoseNamespaceInlineMismatch(Sema &S, SourceLocation KeywordLoc, SourceLocation Loc, IdentifierInfo *II, bool *IsInline, NamespaceDecl *PrevNS)
Diagnose a mismatch in 'inline' qualifiers when a namespace is reopened.
static bool IsPotentiallyTypeAwareOperatorNewOrDelete(Sema &SemaRef, const FunctionDecl *FD, bool *WasMalformed)
static bool RefersToRValueRef(Expr *MemRef)
static bool CheckConstexprCtorInitializer(Sema &SemaRef, const FunctionDecl *Dcl, FieldDecl *Field, llvm::SmallPtrSet< Decl *, 16 > &Inits, bool &Diagnosed, Sema::CheckConstexprKind Kind)
Check that the given field is initialized within a constexpr constructor.
static CanQualType RemoveAddressSpaceFromPtr(Sema &SemaRef, const PointerType *PtrTy)
static bool isVirtualDirectBase(CXXRecordDecl *Derived, CXXRecordDecl *Base)
Determine whether a direct base class is a virtual base class.
#define CheckPolymorphic(Type)
static void BuildBasePathArray(const CXXBasePath &Path, CXXCastPath &BasePathArray)
static void WriteCharValueForDiagnostic(uint32_t Value, const BuiltinType *BTy, unsigned TyWidth, SmallVectorImpl< char > &Str)
Convert character's value, interpreted as a code unit, to a string.
static void CheckAbstractClassUsage(AbstractUsageInfo &Info, FunctionDecl *FD)
Check for invalid uses of an abstract type in a function declaration.
static unsigned getRecordDiagFromTagKind(TagTypeKind Tag)
Get diagnostic select index for tag kind for record diagnostic message.
static IsTupleLike isTupleLike(Sema &S, SourceLocation Loc, QualType T, unsigned &OutSize)
static Expr * CastForMoving(Sema &SemaRef, Expr *E)
static bool IsPotentiallyDestroyingOperatorDelete(Sema &SemaRef, const FunctionDecl *FD)
static void extendLeft(SourceRange &R, SourceRange Before)
static bool specialMemberIsConstexpr(Sema &S, CXXRecordDecl *ClassDecl, CXXSpecialMemberKind CSM, unsigned Quals, bool ConstRHS, CXXConstructorDecl *InheritedCtor=nullptr, Sema::InheritedConstructorInfo *Inherited=nullptr)
Is the special member function which would be selected to perform the specified operation on the spec...
static void diagnoseInvalidDeclaratorChunks(Sema &S, Declarator &D, unsigned Kind)
static bool canPassInRegisters(Sema &S, CXXRecordDecl *D, TargetInfo::CallingConvKind CCK)
Determine whether a type is permitted to be passed or returned in registers, per C++ [class....
static void lookupOperatorsForDefaultedComparison(Sema &Self, Scope *S, UnresolvedSetImpl &Operators, OverloadedOperatorKind Op)
Perform the unqualified lookups that might be needed to form a defaulted comparison function for the ...
static void WriteCharTypePrefix(BuiltinType::Kind BTK, llvm::raw_ostream &OS)
static bool EvaluateAsStringImpl(Sema &SemaRef, Expr *Message, ResultType &Result, ASTContext &Ctx, Sema::StringEvaluationContext EvalContext, bool ErrorOnInvalidMessage)
static void diagnoseDeprecatedCopyOperation(Sema &S, CXXMethodDecl *CopyOp)
Diagnose an implicit copy operation for a class which is odr-used, but which is deprecated because th...
static void AddMostOverridenMethods(const CXXMethodDecl *MD, llvm::SmallPtrSetImpl< const CXXMethodDecl * > &Methods)
Add the most overridden methods from MD to Methods.
static DeclAccessPair findDecomposableBaseClass(Sema &S, SourceLocation Loc, const CXXRecordDecl *RD, CXXCastPath &BasePath)
Find the base class to decompose in a built-in decomposition of a class type.
static const void * GetKeyForBase(ASTContext &Context, QualType BaseType)
static QualType BuildStdClassTemplate(Sema &S, ClassTemplateDecl *CTD, QualType TypeParam, SourceLocation Loc)
static NamespaceDecl * getNamespaceDecl(NamespaceBaseDecl *D)
getNamespaceDecl - Returns the namespace a decl represents.
static bool isDestroyingDeleteT(QualType Type)
static StmtResult buildSingleCopyAssignRecursively(Sema &S, SourceLocation Loc, QualType T, const ExprBuilder &To, const ExprBuilder &From, bool CopyingBaseSubobject, bool Copying, unsigned Depth=0)
Builds a statement that copies/moves the given entity from From to To.
static void checkCUDADeviceBuiltinTextureClassTemplate(Sema &S, CXXRecordDecl *Class)
static void AddInitializerToDiag(const Sema::SemaDiagnosticBuilder &Diag, const CXXCtorInitializer *Previous, const CXXCtorInitializer *Current)
static bool BuildImplicitBaseInitializer(Sema &SemaRef, CXXConstructorDecl *Constructor, ImplicitInitializerKind ImplicitInitKind, CXXBaseSpecifier *BaseSpec, bool IsInheritedVirtualBase, CXXCtorInitializer *&CXXBaseInit)
static bool IsUnusedPrivateField(const FieldDecl *FD)
static void NoteIndirectBases(ASTContext &Context, IndirectBaseSet &Set, const QualType &Type)
Recursively add the bases of Type. Don't add Type itself.
static bool CheckConstexprMissingReturn(Sema &SemaRef, const FunctionDecl *Dcl)
static bool CheckConstexprFunctionStmt(Sema &SemaRef, const FunctionDecl *Dcl, Stmt *S, SmallVectorImpl< SourceLocation > &ReturnStmts, SourceLocation &Cxx1yLoc, SourceLocation &Cxx2aLoc, SourceLocation &Cxx2bLoc, Sema::CheckConstexprKind Kind)
Check the provided statement is allowed in a constexpr function definition.
static bool functionDeclHasDefaultArgument(const FunctionDecl *FD)
static bool CheckConstexprParameterTypes(Sema &SemaRef, const FunctionDecl *FD, Sema::CheckConstexprKind Kind)
Check whether a function's parameter types are all literal types.
static bool IsUsingDirectiveInToplevelContext(DeclContext *CurContext)
Determine whether a using statement is in a context where it will be apply in all contexts.
static const TemplateSpecializationType * GetClassTemplateSpecializationType(ASTContext &Context, QualType T)
static bool checkTupleLikeDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, VarDecl *Src, QualType DecompType, unsigned NumElems)
static CXXConstructorDecl * findUserDeclaredCtor(CXXRecordDecl *RD)
static bool checkMemberDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const CXXRecordDecl *OrigRD)
static bool HasAttribute(const QualType &T)
static bool CheckOperatorNewDeclaration(Sema &SemaRef, FunctionDecl *FnDecl)
static void checkForMultipleExportedDefaultConstructors(Sema &S, CXXRecordDecl *Class)
static bool CheckOperatorNewDeleteTypes(Sema &SemaRef, FunctionDecl *FnDecl, AllocationOperatorKind OperatorKind, CanQualType ExpectedResultType, CanQualType ExpectedSizeOrAddressParamType, unsigned DependentParamTypeDiag, unsigned InvalidParamTypeDiag)
static bool checkTrivialClassMembers(Sema &S, CXXRecordDecl *RD, CXXSpecialMemberKind CSM, bool ConstArg, TrivialABIHandling TAH, bool Diagnose)
Check whether the members of a class type allow a special member to be trivial.
static TemplateArgumentLoc getTrivialTypeTemplateArgument(Sema &S, SourceLocation Loc, QualType T)
static void findImplicitlyDeclaredEqualityComparisons(ASTContext &Ctx, CXXRecordDecl *RD, llvm::SmallVectorImpl< FunctionDecl * > &Spaceships)
Find the equality comparison functions that should be implicitly declared in a given class definition...
static void PopulateKeysForFields(FieldDecl *Field, SmallVectorImpl< const void * > &IdealInits)
ImplicitInitializerKind
ImplicitInitializerKind - How an implicit base or member initializer should initialize its base or me...
static bool ConvertAPValueToString(const APValue &V, QualType T, SmallVectorImpl< char > &Str, ASTContext &Context)
Convert \V to a string we can present to the user in a diagnostic \T is the type of the expression th...
static bool checkArrayDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const ConstantArrayType *CAT)
static ClassTemplateDecl * LookupStdClassTemplate(Sema &S, SourceLocation Loc, const char *ClassName, bool *WasMalformed)
static void ReferenceDllExportedMembers(Sema &S, CXXRecordDecl *Class)
static bool UsefulToPrintExpr(const Expr *E)
Some Expression types are not useful to print notes about, e.g.
static bool FindBaseInitializer(Sema &SemaRef, CXXRecordDecl *ClassDecl, QualType BaseType, const CXXBaseSpecifier *&DirectBaseSpec, const CXXBaseSpecifier *&VirtualBaseSpec)
Find the direct and/or virtual base specifiers that correspond to the given base type,...
static bool checkLiteralOperatorTemplateParameterList(Sema &SemaRef, FunctionTemplateDecl *TpDecl)
static bool ReportOverrides(Sema &S, unsigned DiagID, const CXXMethodDecl *MD, llvm::function_ref< bool(const CXXMethodDecl *)> Report)
Report an error regarding overriding, along with any relevant overridden methods.
static bool CheckBindingsCount(Sema &S, DecompositionDecl *DD, QualType DecompType, ArrayRef< BindingDecl * > Bindings, unsigned MemberCount)
static bool CheckOperatorDeleteDeclaration(Sema &SemaRef, FunctionDecl *FnDecl)
static const void * GetKeyForMember(ASTContext &Context, CXXCtorInitializer *Member)
static std::string printTemplateArgs(const PrintingPolicy &PrintingPolicy, TemplateArgumentListInfo &Args, const TemplateParameterList *Params)
static bool CheckConstexprReturnType(Sema &SemaRef, const FunctionDecl *FD, Sema::CheckConstexprKind Kind)
Check whether a function's return type is a literal type.
static void DiagnoseBaseOrMemInitializerOrder(Sema &SemaRef, const CXXConstructorDecl *Constructor, ArrayRef< CXXCtorInitializer * > Inits)
static Sema::ImplicitExceptionSpecification computeImplicitExceptionSpec(Sema &S, SourceLocation Loc, FunctionDecl *FD)
static bool isIncompleteOrZeroLengthArrayType(ASTContext &Context, QualType T)
Determine whether the given type is an incomplete or zero-lenfgth array type.
static void MarkFieldDestructorReferenced(Sema &S, SourceLocation Location, FieldDecl *Field)
TrivialSubobjectKind
The kind of subobject we are checking for triviality.
@ TSK_CompleteObject
The object is actually the complete object.
@ TSK_Field
The subobject is a non-static data member.
@ TSK_BaseClass
The subobject is a base class.
static bool hasOneRealArgument(MultiExprArg Args)
Determine whether the given list arguments contains exactly one "real" (non-default) argument.
static StmtResult buildMemcpyForAssignmentOp(Sema &S, SourceLocation Loc, QualType T, const ExprBuilder &ToB, const ExprBuilder &FromB)
When generating a defaulted copy or move assignment operator, if a field should be copied with __buil...
static QualType IgnorePackIndexing(QualType T)
static bool isStdClassTemplate(Sema &S, QualType SugaredType, QualType *TypeArg, const char *ClassName, ClassTemplateDecl **CachedDecl, const Decl **MalformedDecl)
static void DefineDefaultedFunction(Sema &S, FunctionDecl *FD, SourceLocation DefaultLoc)
static bool BuildImplicitMemberInitializer(Sema &SemaRef, CXXConstructorDecl *Constructor, ImplicitInitializerKind ImplicitInitKind, FieldDecl *Field, IndirectFieldDecl *Indirect, CXXCtorInitializer *&CXXMemberInit)
static void MarkBaseDestructorsReferenced(Sema &S, SourceLocation Location, CXXRecordDecl *ClassDecl)
static bool CheckMemberDecompositionFields(Sema &S, SourceLocation Loc, const CXXRecordDecl *OrigRD, QualType DecompType, DeclAccessPair BasePair)
static bool CollectFieldInitializer(Sema &SemaRef, BaseAndFieldInfo &Info, FieldDecl *Field, IndirectFieldDecl *Indirect=nullptr)
static CXXBaseSpecifier * findDirectBaseWithType(CXXRecordDecl *Derived, QualType DesiredBase, bool &AnyDependentBases)
Find the base specifier for a base class with the given type.
static Sema::SpecialMemberOverloadResult lookupCallFromSpecialMember(Sema &S, CXXRecordDecl *Class, CXXSpecialMemberKind CSM, unsigned FieldQuals, bool ConstRHS)
Look up the special member function that would be called by a special member function for a subobject...
static bool defaultedSpecialMemberIsConstexpr(Sema &S, CXXRecordDecl *ClassDecl, CXXSpecialMemberKind CSM, bool ConstArg, CXXConstructorDecl *InheritedCtor=nullptr, Sema::InheritedConstructorInfo *Inherited=nullptr)
Determine whether the specified special member function would be constexpr if it were implicitly defi...
static bool checkTrivialSubobjectCall(Sema &S, SourceLocation SubobjLoc, QualType SubType, bool ConstRHS, CXXSpecialMemberKind CSM, TrivialSubobjectKind Kind, TrivialABIHandling TAH, bool Diagnose)
Check whether the special member selected for a given type would be trivial.
static void DiagnoseInvisibleNamespace(const TypoCorrection &Corrected, Sema &S)
static StmtResult buildSingleCopyAssign(Sema &S, SourceLocation Loc, QualType T, const ExprBuilder &To, const ExprBuilder &From, bool CopyingBaseSubobject, bool Copying)
static FunctionProtoType::ExtProtoInfo getImplicitMethodEPI(Sema &S, CXXMethodDecl *MD)
static QualType getTupleLikeElementType(Sema &S, SourceLocation Loc, unsigned I, QualType T)
static Sema::ImplicitExceptionSpecification ComputeDefaultedSpecialMemberExceptionSpec(Sema &S, SourceLocation Loc, CXXMethodDecl *MD, CXXSpecialMemberKind CSM, Sema::InheritedConstructorInfo *ICI)
static QualType getStdTrait(Sema &S, SourceLocation Loc, StringRef Trait, TemplateArgumentListInfo &Args, unsigned DiagID)
static bool checkComplexDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const ComplexType *CT)
static bool TryNamespaceTypoCorrection(Sema &S, LookupResult &R, Scope *Sc, CXXScopeSpec &SS, SourceLocation IdentLoc, IdentifierInfo *Ident)
static bool InitializationHasSideEffects(const FieldDecl &FD)
static bool CheckOperatorNewDeleteDeclarationScope(Sema &SemaRef, const FunctionDecl *FnDecl)
static bool checkArrayLikeDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const llvm::APSInt &NumElems, QualType ElemType)
static bool CheckConstexprDeclStmt(Sema &SemaRef, const FunctionDecl *Dcl, DeclStmt *DS, SourceLocation &Cxx1yLoc, Sema::CheckConstexprKind Kind)
Check the given declaration statement is legal within a constexpr function body.
static bool IsEquivalentForUsingDecl(ASTContext &Context, NamedDecl *D1, NamedDecl *D2)
Determine whether a using declaration considers the given declarations as "equivalent",...
static TemplateArgumentLoc getTrivialIntegralTemplateArgument(Sema &S, SourceLocation Loc, QualType T, uint64_t I)
static void DiagnoseDependentFriendNotMember(Sema &S, SourceLocation Loc, NestedNameSpecifier NNS)
static bool CheckConstexprDestructorSubobjects(Sema &SemaRef, const CXXDestructorDecl *DD, Sema::CheckConstexprKind Kind)
Determine whether a destructor cannot be constexpr due to.
static bool isProvablyNotDerivedFrom(Sema &SemaRef, CXXRecordDecl *Record, const BaseSet &Bases)
Determines if the given class is provably not derived from all of the prospective base classes.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis for OpenMP constructs and clauses.
static ExprResult CheckConvertedConstantExpression(Sema &S, Expr *From, QualType T, APValue &Value, CCEKind CCE, bool RequireInt, NamedDecl *Dest)
CheckConvertedConstantExpression - Check that the expression From is a converted constant expression ...
static void MarkUsedTemplateParameters(ASTContext &Ctx, const TemplateArgument &TemplateArg, bool OnlyDeduced, unsigned Depth, llvm::SmallBitVector &Used)
Mark the template parameters that are used by this template argument.
static void collectUnexpandedParameterPacks(Sema &S, TemplateParameterList *Params, SmallVectorImpl< UnexpandedParameterPack > &Unexpanded)
static bool DiagnoseUnexpandedParameterPacks(Sema &S, TemplateTemplateParmDecl *TTP)
Check for unexpanded parameter packs within the template parameters of a template template parameter,...
static bool isInvalid(LocType Loc, bool *Invalid)
Defines various enumerations that describe declaration and type specifiers.
static QualType getPointeeType(const MemRegion *R)
Defines the clang::TypeLoc interface and its subclasses.
Allows QualTypes to be sorted and hence used in maps and sets.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
std::pair< CXXConstructorDecl *, bool > findConstructorForBase(CXXRecordDecl *Base, CXXConstructorDecl *Ctor) const
Find the constructor to use for inherited construction of a base class, and whether that base class c...
InheritedConstructorInfo(Sema &S, SourceLocation UseLoc, ConstructorUsingShadowDecl *Shadow)
a trap message and trap category.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
bool containsErrors() const
unsigned record_size() const
virtual bool HandleTopLevelDecl(DeclGroupRef D)
HandleTopLevelDecl - Handle the specified top-level declaration.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
const ConstantArrayType * getAsConstantArrayType(QualType T) const
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
DeclarationNameTable DeclarationNames
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
const LangOptions & getLangOpts() const
QualType getConstType(QualType T) const
Return the uniqued reference to the type for a const qualified type.
CallingConv getDefaultCallingConvention(bool IsVariadic, bool IsCXXMethod) const
Retrieves the default calling convention for the current context.
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
ComparisonCategories CompCategories
Types and expressions required to build C++2a three-way comparisons using operator<=>,...
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
const clang::PrintingPolicy & getPrintingPolicy() const
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
QualType getTypeDeclType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TypeDecl *Decl) const
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.
QualType getPackExpansionType(QualType Pattern, UnsignedOrNone NumExpansions, bool ExpectPackInType=true) const
Form a pack expansion type with the given pattern.
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
llvm::APSInt MakeIntValue(uint64_t Value, QualType Type) const
Make an APSInt of the appropriate width and signedness for the given Value and integer Type.
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
const TargetInfo & getTargetInfo() const
CanQualType getCanonicalTagType(const TagDecl *TD) const
static bool hasSameUnqualifiedType(QualType T1, QualType T2)
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
Represents an access specifier followed by colon ':'.
static AccessSpecDecl * Create(ASTContext &C, AccessSpecifier AS, DeclContext *DC, SourceLocation ASLoc, SourceLocation ColonLoc)
TypeLoc getElementLoc() const
QualType getElementType() const
Attr - This represents one attribute.
attr::Kind getKind() const
Attr * clone(ASTContext &C) const
SourceLocation getLocation() const
Represents a C++ declaration that introduces decls from somewhere else.
unsigned shadow_size() const
Return the number of shadowed declarations associated with this using declaration.
void addShadowDecl(UsingShadowDecl *S)
shadow_iterator shadow_begin() const
void removeShadowDecl(UsingShadowDecl *S)
static BinaryOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)
static bool isCompoundAssignmentOp(Opcode Opc)
static Opcode getOverloadedOpcode(OverloadedOperatorKind OO)
Retrieve the binary opcode that corresponds to the given overloaded operator.
A binding in a decomposition declaration.
void setDecomposedDecl(DecompositionDecl *Decomposed)
Set the decomposed variable for this BindingDecl.
static BindingDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdLoc, IdentifierInfo *Id, QualType T)
void setBinding(QualType DeclaredType, Expr *Binding)
Set the binding for this BindingDecl, along with its declared type (which should be a possibly-cv-qua...
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
Wrapper for source info for block pointers.
This class is used for builtin types like 'int'.
Represents a path from a specific derived class (which is not represented as part of the path) to a p...
DeclContext::lookup_iterator Decls
The declarations found inside this base class subobject.
AccessSpecifier Access
The access along this inheritance path.
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
const CXXRecordDecl * getOrigin() const
Retrieve the type from which this base-paths search began.
bool isRecordingPaths() const
Whether we are recording paths.
void setRecordingPaths(bool RP)
Specify whether we should be recording paths or not.
void setOrigin(const CXXRecordDecl *Rec)
void clear()
Clear the base-paths results.
bool isAmbiguous(CanQualType BaseType) const
Determine whether the path from the most-derived type to the given base type is ambiguous (i....
Represents a base class of a C++ class.
SourceLocation getBeginLoc() const LLVM_READONLY
bool isVirtual() const
Determines whether the base class is a virtual base class (or not).
QualType getType() const
Retrieves the type of the base class.
SourceRange getSourceRange() const LLVM_READONLY
Retrieves the source range that contains the entire base specifier.
AccessSpecifier getAccessSpecifier() const
Returns the access specifier for this base specifier.
A boolean literal, per ([C++ lex.bool] Boolean literals).
CXXCatchStmt - This represents a C++ catch block.
Represents a call to a C++ constructor.
static CXXConstructExpr * Create(const ASTContext &Ctx, QualType Ty, SourceLocation Loc, CXXConstructorDecl *Ctor, bool Elidable, ArrayRef< Expr * > Args, bool HadMultipleCandidates, bool ListInitialization, bool StdInitListInitialization, bool ZeroInitialization, CXXConstructionKind ConstructKind, SourceRange ParenOrBraceRange)
Create a C++ construction expression.
Expr * getArg(unsigned Arg)
Return the specified argument.
bool isImmediateEscalating() const
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
Represents a C++ constructor within a class.
CXXConstructorDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool isMoveConstructor(unsigned &TypeQuals) const
Determine whether this constructor is a move constructor (C++11 [class.copy]p3), which can be used to...
init_iterator init_begin()
Retrieve an iterator to the first initializer.
CXXConstructorDecl * getTargetConstructor() const
When this constructor delegates to another, retrieve the target.
bool isCopyConstructor(unsigned &TypeQuals) const
Whether this constructor is a copy constructor (C++ [class.copy]p2, which can be used to copy the cla...
void setCtorClosureDefaultArgs(ArrayRef< CXXDefaultArgExpr * > Args)
InheritedConstructor getInheritedConstructor() const
Get the constructor that this inheriting constructor is based on.
static CXXConstructorDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, ExplicitSpecifier ES, bool UsesFPIntrin, bool isInline, bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind, InheritedConstructor Inherited=InheritedConstructor(), const AssociatedConstraint &TrailingRequiresClause={})
ArrayRef< CXXDefaultArgExpr * > getCtorClosureDefaultArgs() const
ExplicitSpecifier getExplicitSpecifier() const
Represents a C++ conversion function within a class.
QualType getConversionType() const
Returns the type that this conversion function is converting to.
Represents a C++ base or member initializer.
bool isWritten() const
Determine whether this initializer is explicitly written in the source code.
SourceRange getSourceRange() const LLVM_READONLY
Determine the source range covering the entire initializer.
SourceLocation getSourceLocation() const
Determine the source location of the initializer.
bool isAnyMemberInitializer() const
TypeSourceInfo * getTypeSourceInfo() const
Returns the declarator information for a base class or delegating initializer.
FieldDecl * getAnyMember() const
A default argument (C++ [dcl.fct.default]).
Represents a C++ destructor within a class.
static CXXDestructorDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, bool UsesFPIntrin, bool isInline, bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind, const AssociatedConstraint &TrailingRequiresClause={})
const FunctionDecl * getOperatorDelete() const
A mapping from each virtual member function to its set of final overriders.
Represents a call to an inherited base class constructor from an inheriting constructor.
Represents a call to a member function that may be written either with member call syntax (e....
CXXMethodDecl * getMethodDecl() const
Retrieve the declaration of the called method.
Represents a static or instance method of a struct/union/class.
bool isExplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An explicit object member function is a non-static member function with an explic...
CXXSpecialMemberKind getSpecialMemberKind() const
static CXXMethodDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin, bool isInline, ConstexprSpecKind ConstexprKind, SourceLocation EndLocation, const AssociatedConstraint &TrailingRequiresClause={})
unsigned getNumExplicitParams() const
CXXMethodDecl * getMostRecentDecl()
overridden_method_range overridden_methods() const
unsigned size_overridden_methods() const
method_iterator begin_overridden_methods() const
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
bool isMoveAssignmentOperator() const
Determine whether this is a move assignment operator.
QualType getFunctionObjectParameterType() const
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
The null pointer literal (C++11 [lex.nullptr])
Represents a C++ struct/union/class.
bool hasConstexprDefaultConstructor() const
Determine whether this class has a constexpr default constructor.
friend_range friends() const
bool hasTrivialMoveAssignment() const
Determine whether this class has a trivial move assignment operator (C++11 [class....
bool isTriviallyCopyable() const
Determine whether this class is considered trivially copyable per (C++11 [class]p6).
bool hasTrivialDefaultConstructor() const
Determine whether this class has a trivial default constructor (C++11 [class.ctor]p5).
bool isGenericLambda() const
Determine whether this class describes a generic lambda function object (i.e.
bool hasTrivialDestructor() const
Determine whether this class has a trivial destructor (C++ [class.dtor]p3)
bool hasUserDeclaredDestructor() const
Determine whether this class has a user-declared destructor.
bool implicitCopyConstructorHasConstParam() const
Determine whether an implicit copy constructor for this type would have a parameter with a const-qual...
bool defaultedDestructorIsDeleted() const
true if a defaulted destructor for this class would be deleted.
bool hasInheritedAssignment() const
Determine whether this class has a using-declaration that names a base class assignment operator.
bool allowConstDefaultInit() const
Determine whether declaring a const variable with this type is ok per core issue 253.
bool hasTrivialDestructorForCall() const
bool defaultedMoveConstructorIsDeleted() const
true if a defaulted move constructor for this class would be deleted.
bool isLiteral() const
Determine whether this class is a literal type.
bool hasUserDeclaredMoveAssignment() const
Determine whether this class has had a move assignment declared by the user.
bool defaultedDestructorIsConstexpr() const
Determine whether a defaulted default constructor for this class would be constexpr.
bool hasAnyDependentBases() const
Determine whether this class has any dependent base classes which are not the current instantiation.
bool isLambda() const
Determine whether this class describes a lambda function object.
bool hasTrivialMoveConstructor() const
Determine whether this class has a trivial move constructor (C++11 [class.copy]p12)
bool needsImplicitDefaultConstructor() const
Determine if we need to declare a default constructor for this class.
bool needsImplicitMoveConstructor() const
Determine whether this class should get an implicit move constructor or if any existing special membe...
bool hasUserDeclaredCopyAssignment() const
Determine whether this class has a user-declared copy assignment operator.
bool isProvablyNotDerivedFrom(const CXXRecordDecl *Base) const
Determine whether this class is provably not derived from the type Base.
method_range methods() const
CXXRecordDecl * getDefinition() const
bool needsOverloadResolutionForCopyAssignment() const
Determine whether we need to eagerly declare a defaulted copy assignment operator for this class.
static AccessSpecifier MergeAccess(AccessSpecifier PathAccess, AccessSpecifier DeclAccess)
Calculates the access of a decl that is reached along a path.
bool defaultedDefaultConstructorIsConstexpr() const
Determine whether a defaulted default constructor for this class would be constexpr.
bool hasTrivialCopyConstructor() const
Determine whether this class has a trivial copy constructor (C++ [class.copy]p6, C++11 [class....
void setImplicitMoveAssignmentIsDeleted()
Set that we attempted to declare an implicit move assignment operator, but overload resolution failed...
bool hasConstexprDestructor() const
Determine whether this class has a constexpr destructor.
bool isPolymorphic() const
Whether this class is polymorphic (C++ [class.virtual]), which means that the class contains or inher...
unsigned getNumBases() const
Retrieves the number of base classes of this class.
bool defaultedCopyConstructorIsDeleted() const
true if a defaulted copy constructor for this class would be deleted.
bool hasTrivialCopyConstructorForCall() const
bool lookupInBases(BaseMatchesCallback BaseMatches, CXXBasePaths &Paths, bool LookupInDependent=false) const
Look for entities within the base classes of this C++ class, transitively searching all base class su...
bool lambdaIsDefaultConstructibleAndAssignable() const
Determine whether this lambda should have an implicit default constructor and copy and move assignmen...
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine whether this particular class is a specialization or instantiation of a class template or m...
bool hasTrivialCopyAssignment() const
Determine whether this class has a trivial copy assignment operator (C++ [class.copy]p11,...
base_class_range vbases()
base_class_iterator vbases_begin()
void setImplicitMoveConstructorIsDeleted()
Set that we attempted to declare an implicit move constructor, but overload resolution failed so we d...
bool isAbstract() const
Determine whether this class has a pure virtual function.
bool hasVariantMembers() const
Determine whether this class has any variant members.
void setImplicitCopyConstructorIsDeleted()
Set that we attempted to declare an implicit copy constructor, but overload resolution failed so we d...
bool isDynamicClass() const
bool hasInClassInitializer() const
Whether this class has any in-class initializers for non-static data members (including those in anon...
bool needsImplicitCopyConstructor() const
Determine whether this class needs an implicit copy constructor to be lazily declared.
bool hasIrrelevantDestructor() const
Determine whether this class has a destructor which has no semantic effect.
bool hasNonTrivialCopyConstructorForCall() const
bool hasDirectFields() const
Determine whether this class has direct non-static data members.
bool hasUserDeclaredCopyConstructor() const
Determine whether this class has a user-declared copy constructor.
bool hasDefinition() const
void setImplicitCopyAssignmentIsDeleted()
Set that we attempted to declare an implicit copy assignment operator, but overload resolution failed...
bool needsImplicitDestructor() const
Determine whether this class needs an implicit destructor to be lazily declared.
ClassTemplateDecl * getDescribedClassTemplate() const
Retrieves the class template that is described by this class declaration.
void getFinalOverriders(CXXFinalOverriderMap &FinaOverriders) const
Retrieve the final overriders for each virtual member function in the class hierarchy where this clas...
bool needsOverloadResolutionForMoveConstructor() const
Determine whether we need to eagerly declare a defaulted move constructor for this class.
bool isInjectedClassName() const
Determines whether this declaration represents the injected class name.
bool needsOverloadResolutionForMoveAssignment() const
Determine whether we need to eagerly declare a move assignment operator for this class.
CXXDestructorDecl * getDestructor() const
Returns the destructor decl for this class.
bool hasNonTrivialDestructorForCall() const
bool needsOverloadResolutionForDestructor() const
Determine whether we need to eagerly declare a destructor for this class.
bool hasInheritedConstructor() const
Determine whether this class has a using-declaration that names a user-declared base class constructo...
CXXMethodDecl * getLambdaStaticInvoker() const
Retrieve the lambda static invoker, the address of which is returned by the conversion operator,...
bool needsOverloadResolutionForCopyConstructor() const
Determine whether we need to eagerly declare a defaulted copy constructor for this class.
CXXRecordDecl * getDefinitionOrSelf() const
bool hasUserDeclaredMoveConstructor() const
Determine whether this class has had a move constructor declared by the user.
bool needsImplicitMoveAssignment() const
Determine whether this class should get an implicit move assignment operator or if any existing speci...
bool needsImplicitCopyAssignment() const
Determine whether this class needs an implicit copy assignment operator to be lazily declared.
bool hasTrivialMoveConstructorForCall() const
CXXMethodDecl * getLambdaCallOperator() const
Retrieve the lambda call operator of the closure type if this is a closure type.
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
unsigned getNumVBases() const
Retrieves the number of virtual base classes of this class.
bool isDerivedFrom(const CXXRecordDecl *Base) const
Determine whether this class is derived from the class Base.
bool implicitCopyAssignmentHasConstParam() const
Determine whether an implicit copy assignment operator for this type would have a parameter with a co...
Represents a C++ nested-name-specifier or a global scope specifier.
bool isNotEmpty() const
A scope specifier is present, but may be valid or invalid.
bool isValid() const
A scope specifier is present, and it refers to a real scope.
void MakeTrivial(ASTContext &Context, NestedNameSpecifier Qualifier, SourceRange R)
Make a new nested-name-specifier from incomplete source-location information.
SourceRange getRange() const
SourceLocation getBeginLoc() const
bool isSet() const
Deprecated.
NestedNameSpecifier getScopeRep() const
Retrieve the representation of the nested-name-specifier.
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
bool isInvalid() const
An error occurred during parsing of the scope specifier.
bool isEmpty() const
No scope specifier.
Represents the this expression in C++.
SourceLocation getBeginLoc() const
SourceLocation getLocation() const
CXXTryStmt - A C++ try block, including all handlers.
CXXCatchStmt * getHandler(unsigned i)
unsigned getNumHandlers() const
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
bool isCallToStdMove() const
QualType withConst() const
Retrieves a version of this type with const applied.
CastKind getCastKind() const
static CharSourceRange getTokenRange(SourceRange R)
QuantityType getQuantity() const
Get the raw integer representation of this quantity.
Declaration of a class template.
CXXRecordDecl * getTemplatedDecl() const
Get the underlying class declarations of the template.
Represents a class template specialization, which refers to a class template with a given set of temp...
TemplateSpecializationKind getSpecializationKind() const
Determine the kind of specialization that this declaration represents.
ClassTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
SourceLocation getPointOfInstantiation() const
Get the point of instantiation (if any), or null if none.
bool isExplicitSpecialization() const
const ComparisonCategoryInfo * lookupInfoForType(QualType Ty) const
static StringRef getCategoryString(ComparisonCategoryType Kind)
static StringRef getResultString(ComparisonCategoryResult Kind)
static std::vector< ComparisonCategoryResult > getPossibleResultsForType(ComparisonCategoryType Type)
Return the list of results which are valid for the specified comparison category type.
const CXXRecordDecl * Record
The declaration for the comparison category type from the standard library.
ComparisonCategoryType Kind
The Kind of the comparison category type.
Complex values, per C99 6.2.5p11.
QualType getElementType() const
static CompoundStmt * Create(const ASTContext &C, ArrayRef< Stmt * > Stmts, FPOptionsOverride FPFeatures, SourceLocation LB, SourceLocation RB)
ConstStmtVisitor - This class implements a simple visitor for Stmt subclasses.
Represents the canonical version of C arrays with a specified constant size.
llvm::APInt getSize() const
Return the constant array size as an APInt.
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
const CXXRecordDecl * getParent() const
Returns the parent of this using shadow declaration, which is the class in which this is declared.
static ConstructorUsingShadowDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation Loc, UsingDecl *Using, NamedDecl *Target, bool IsVirtual)
SourceLocation getBeginLoc() const LLVM_READONLY
Base class for callback objects used by Sema::CorrectTypo to check the validity of a potential typo c...
A POD class for pairing a NamedDecl* with an access specifier.
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
NamedDecl * getDecl() const
AccessSpecifier getAccess() const
The results of name lookup within a DeclContext.
DeclListNode::iterator iterator
specific_decl_iterator - Iterates over a subrange of declarations stored in 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.
lookup_result::iterator lookup_iterator
bool isFileContext() const
void makeDeclVisibleInContext(NamedDecl *D)
Makes a declaration visible within this context.
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
bool InEnclosingNamespaceSetOf(const DeclContext *NS) const
Test if this context is part of the enclosing namespace set of the context NS, as defined in C++0x [n...
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
bool isTranslationUnit() const
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void removeDecl(Decl *D)
Removes a declaration from this context.
void addDecl(Decl *D)
Add the declaration D into this context.
decl_iterator decls_end() const
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
bool isFunctionOrMethod() const
Returns true if this DeclContext is a function, Objective-C method, or block, or a DeclContext that c...
const LinkageSpecDecl * getExternCContext() const
Retrieve the nearest enclosing C linkage specification context.
bool Encloses(const DeclContext *DC) const
Determine whether this declaration context semantically encloses the declaration context DC.
Decl::Kind getDeclKind() const
DeclContext * getNonTransparentContext()
decl_iterator decls_begin() const
A reference to a declared variable, function, enum, etc.
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)
NonOdrUseReason isNonOdrUse() const
Is this expression a non-odr-use reference, and if so, why?
SourceLocation getBeginLoc() const
bool isImmediateEscalating() const
Captures information about "declaration specifiers".
bool isVirtualSpecified() const
bool isModulePrivateSpecified() const
bool hasTypeSpecifier() const
Return true if any type-specifier has been found.
bool SetStorageClassSpec(Sema &S, SCS SC, SourceLocation Loc, const char *&PrevSpec, unsigned &DiagID, const PrintingPolicy &Policy)
These methods set the specified attribute of the DeclSpec and return false if there was no error.
ThreadStorageClassSpecifier TSCS
void ClearStorageClassSpecs()
TST getTypeSpecType() const
SourceLocation getStorageClassSpecLoc() const
SCS getStorageClassSpec() const
SourceLocation getBeginLoc() const LLVM_READONLY
SourceRange getSourceRange() const LLVM_READONLY
unsigned getTypeQualifiers() const
getTypeQualifiers - Return a set of TQs.
SourceLocation getExplicitSpecLoc() const
SourceLocation getFriendSpecLoc() const
ParsedType getRepAsType() const
TSCS getThreadStorageClassSpec() const
bool isFriendSpecifiedFirst() const
ParsedAttributes & getAttributes()
SourceLocation getConstSpecLoc() const
SourceRange getExplicitSpecRange() const
Expr * getRepAsExpr() const
bool isInlineSpecified() const
SourceLocation getRestrictSpecLoc() const
bool SetTypeQual(TQ T, SourceLocation Loc)
void ClearConstexprSpec()
static const char * getSpecifierName(DeclSpec::TST T, const PrintingPolicy &Policy)
Turn a type-specifier-type into a string like "_Bool" or "union".
SourceLocation getThreadStorageClassSpecLoc() const
SourceLocation getAtomicSpecLoc() const
SourceLocation getVirtualSpecLoc() const
SourceLocation getConstexprSpecLoc() const
SourceLocation getTypeSpecTypeLoc() const
void forEachQualifier(llvm::function_ref< void(TQ, StringRef, SourceLocation)> Handle)
This method calls the passed in handler on each qual being set.
SourceLocation getInlineSpecLoc() const
SourceLocation getUnalignedSpecLoc() const
SourceLocation getVolatileSpecLoc() const
FriendSpecified isFriendSpecified() const
bool hasExplicitSpecifier() const
bool hasConstexprSpecifier() const
static const TST TST_auto
DeclStmt - Adaptor class for mixing declarations with statements and expressions.
SourceLocation getBeginLoc() const LLVM_READONLY
Decl - This represents one declaration (or definition), e.g.
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
bool isInStdNamespace() const
SourceLocation getEndLoc() const LLVM_READONLY
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
virtual bool isOutOfLine() const
Determine whether this declaration is declared out of line (outside its semantic context).
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
Kind
Lists the kind of concrete classes of Decl.
void markUsed(ASTContext &C)
Mark the declaration used, in the sense of odr-use.
@ FOK_Undeclared
A friend of a previously-undeclared entity.
@ FOK_None
Not a friend object.
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
bool isTemplateParameter() const
isTemplateParameter - Determines whether this declaration is a template parameter.
DeclContext * getNonTransparentDeclContext()
Return the non transparent context.
bool isInvalidDecl() const
unsigned getIdentifierNamespace() const
bool isLocalExternDecl() const
Determine whether this is a block-scope declaration with linkage.
void setAccess(AccessSpecifier AS)
SourceLocation getLocation() const
@ IDNS_Ordinary
Ordinary names.
bool isTemplateParameterPack() const
isTemplateParameter - Determines whether this declaration is a template parameter pack.
void setLocalOwningModule(Module *M)
void setImplicit(bool I=true)
void setReferenced(bool R=true)
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
SourceLocation getBeginLoc() const LLVM_READONLY
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
void setLexicalDeclContext(DeclContext *DC)
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
@ VisibleWhenImported
This declaration has an owning module, and is visible when that module is imported.
void setModuleOwnershipKind(ModuleOwnershipKind MOK)
Set whether this declaration is hidden from name lookup.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
bool isAnyOperatorNewOrDelete() const
std::string getAsString() const
Retrieve the human-readable string for this name.
const IdentifierInfo * getCXXLiteralIdentifier() const
If this name is the name of a literal operator, retrieve the identifier associated with it.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
@ CXXConversionFunctionName
NameKind getNameKind() const
Determine what kind of name this is.
bool isIdentifier() const
Predicate functions for querying what type of name this is.
Represents a ValueDecl that came out of a declarator.
SourceLocation getTypeSpecStartLoc() const
SourceLocation getBeginLoc() const LLVM_READONLY
const AssociatedConstraint & getTrailingRequiresClause() const
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
void setTypeSourceInfo(TypeSourceInfo *TI)
ArrayRef< TemplateParameterList * > getTemplateParameterLists() const
TypeSourceInfo * getTypeSourceInfo() const
Information about one declarator, including the parsed type information and the identifier.
bool isFunctionDeclarator(unsigned &idx) const
isFunctionDeclarator - This method returns true if the declarator is a function declarator (looking t...
bool isDeclarationOfFunction() const
Determine whether the declaration that will be produced from this declaration will be a function.
const DeclaratorChunk & getTypeObject(unsigned i) const
Return the specified TypeInfo from this declarator.
const DeclSpec & getDeclSpec() const
getDeclSpec - Return the declaration-specifier that this declarator was declared with.
bool isFunctionDeclarationContext() const
Return true if this declaration appears in a context where a function declarator would be a function ...
SourceLocation getIdentifierLoc() const
void SetIdentifier(const IdentifierInfo *Id, SourceLocation IdLoc)
Set the name of this declarator to be the given identifier.
SourceLocation getEndLoc() const LLVM_READONLY
type_object_range type_objects() const
Returns the range of type objects, from the identifier outwards.
bool hasGroupingParens() const
void setInvalidType(bool Val=true)
void DropFirstTypeObject()
unsigned getNumTypeObjects() const
Return the number of types applied to this declarator.
bool isRedeclaration() const
DeclaratorContext getContext() const
const DecompositionDeclarator & getDecompositionDeclarator() const
SourceLocation getBeginLoc() const LLVM_READONLY
bool isFunctionDefinition() const
UnqualifiedId & getName()
Retrieve the name specified by this declarator.
const CXXScopeSpec & getCXXScopeSpec() const
getCXXScopeSpec - Return the C++ scope specifier (global scope or nested-name-specifier) that is part...
ArrayRef< TemplateParameterList * > getTemplateParameterLists() const
The template parameter lists that preceded the declarator.
void setInventedTemplateParameterList(TemplateParameterList *Invented)
Sets the template parameter list generated from the explicit template parameters along with any inven...
bool mayHaveDecompositionDeclarator() const
Return true if the context permits a C++17 decomposition declarator.
bool isInvalidType() const
SourceRange getSourceRange() const LLVM_READONLY
Get the source range that spans this declarator.
bool isDecompositionDeclarator() const
Return whether this declarator is a decomposition declarator.
bool isStaticMember()
Returns true if this declares a static member.
DeclSpec & getMutableDeclSpec()
getMutableDeclSpec - Return a non-const version of the DeclSpec.
DeclaratorChunk::FunctionTypeInfo & getFunctionTypeInfo()
getFunctionTypeInfo - Retrieves the function type info object (looking through parentheses).
const IdentifierInfo * getIdentifier() const
A decomposition declaration.
ArrayRef< BindingDecl * > bindings() const
A parsed C++17 decomposition declarator of the form '[' identifier-list ']'.
ArrayRef< Binding > bindings() const
SourceRange getSourceRange() const
SourceLocation getLSquareLoc() const
void setNameLoc(SourceLocation Loc)
void setElaboratedKeywordLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
A little helper class (which is basically a smart pointer that forwards info from DiagnosticsEngine a...
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
virtual bool TraverseConstructorInitializer(MaybeConst< CXXCtorInitializer > *Init)
static EmptyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L)
RAII object that enters a new expression evaluation context.
An instance of this object exists for each enum constant that is defined.
enumerator_range enumerators() const
EvaluatedExprVisitor - This class visits 'Expr *'s.
Store information needed for an explicit specifier.
const Expr * getExpr() const
void setKind(ExplicitSpecKind Kind)
This represents one expression.
static bool isPotentialConstantExpr(const FunctionDecl *FD, SmallVectorImpl< PartialDiagnosticAt > &Diags)
isPotentialConstantExpr - Return true if this function's definition might be usable in a constant exp...
bool isValueDependent() const
Determines whether the value of this expression depends on.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
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.
bool containsErrors() const
Whether this expression contains subexpressions which had errors.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
bool isLValue() const
isLValue - True if this expression is an "l-value" according to the rules of the current language.
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 isTemporaryObject(ASTContext &Ctx, const CXXRecordDecl *TempTy) const
Determine whether the result of this expression is a temporary object of the given class type.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Represents difference between two FPOptions values.
FPOptions applyOverrides(FPOptions Base)
Represents a member of a struct/union/class.
bool isMutable() const
Determines whether this field is mutable (C++ only).
Expr * getInClassInitializer() const
Get the C++11 default member initializer for this member, or null if one has not been set.
bool hasInClassInitializer() const
Determine whether this member has a C++11 default member initializer.
bool isAnonymousStructOrUnion() const
Determines whether this field is a representative for an anonymous struct or union.
InClassInitStyle getInClassInitStyle() const
Get the kind of (C++11) default member initializer that this field has.
void setInClassInitializer(Expr *NewInit)
Set the C++11 in-class initializer for this member.
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
FieldDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this field.
bool isUnnamedBitField() const
Determines whether this is an unnamed bitfield.
Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...
static FixItHint CreateInsertionFromRange(SourceLocation InsertionLoc, CharSourceRange FromRange, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code from FromRange at a specific location.
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.
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
static FriendDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, FriendUnion Friend, SourceLocation FriendL, SourceLocation EllipsisLoc={})
static FriendTemplateDecl * Create(ASTContext &Context, DeclContext *DC, SourceLocation Loc, FriendUnion Friend, SourceLocation FriendLoc, ArrayRef< TemplateParameterList * > FriendTPLists, SourceLocation EllipsisLoc={}, TemplateName Template={})
For a defaulted function, the kind of defaulted function that it is.
CXXSpecialMemberKind asSpecialMember() const
bool isComparison() const
bool isSpecialMember() const
DefaultedComparisonKind asComparison() const
static DefaultedOrDeletedFunctionInfo * Create(ASTContext &Context, ArrayRef< DeclAccessPair > Lookups, FPOptionsOverride FPFeatures, StringLiteral *DeletedMessage=nullptr)
Represents a function declaration or definition.
static constexpr unsigned RequiredTypeAwareDeleteParameterCount
Count of mandatory parameters for type aware operator delete.
const ParmVarDecl * getParamDecl(unsigned i) const
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
ExceptionSpecificationType getExceptionSpecType() const
Gets the ExceptionSpecificationType as declared.
bool isTrivialForCall() const
ConstexprSpecKind getConstexprKind() const
DefaultedOrDeletedFunctionInfo * getDefaultedOrDeletedInfo() const
unsigned getMinRequiredArguments() const
Returns the minimum number of arguments needed to call this function.
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
bool isThisDeclarationADefinition() const
Returns whether this specific declaration of the function is also a definition that does not contain ...
bool isImmediateFunction() const
void setDefaultedOrDeletedInfo(DefaultedOrDeletedFunctionInfo *Info)
SourceRange getReturnTypeSourceRange() const
Attempt to compute an informative source range covering the function return type.
bool isDestroyingOperatorDelete() const
Determine whether this is a destroying operator delete.
bool hasCXXExplicitFunctionObjectParameter() const
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
SourceLocation getDefaultLoc() const
QualType getReturnType() const
ArrayRef< ParmVarDecl * > parameters() const
bool isExplicitlyDefaulted() const
Whether this function is explicitly defaulted.
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
MutableArrayRef< ParmVarDecl * >::iterator param_iterator
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
param_iterator param_begin()
const ParmVarDecl * getNonObjectParameter(unsigned I) const
bool isVariadic() const
Whether this function is variadic.
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
bool isDeleted() const
Whether this function has been deleted.
void setBodyContainsImmediateEscalatingExpressions(bool Set)
const TemplateArgumentList * getTemplateSpecializationArgs() const
Retrieve the template arguments used to produce this function template specialization from the primar...
FunctionEffectsRef getFunctionEffects() const
bool isTemplateInstantiation() const
Determines if the given function was instantiated from a function template.
StorageClass getStorageClass() const
Returns the storage class as written in the source.
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
static constexpr unsigned RequiredTypeAwareNewParameterCount
Count of mandatory parameters for type aware operator new.
bool isPureVirtual() const
Whether this virtual function is pure, i.e.
bool isExternC() const
Determines whether this function is a function with external, C linkage.
FunctionDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
bool isImmediateEscalating() const
void setIsDestroyingOperatorDelete(bool IsDestroyingDelete)
bool isTypeAwareOperatorNewOrDelete() const
Determine whether this is a type aware operator new or delete.
void setIsTypeAwareOperatorNewOrDelete(bool IsTypeAwareOperator=true)
bool isDefaulted() const
Whether this function is defaulted.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
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.
void setConstexprKind(ConstexprSpecKind CSK)
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
void setDefaulted(bool D=true)
bool isUserProvided() const
True if this method is user-declared and was not deleted or defaulted on its first declaration.
DefaultedFunctionKind getDefaultedFunctionKind() const
Determine the kind of defaulting that would be done for a given function.
QualType getDeclaredReturnType() const
Get the declared return type, which may differ from the actual return type if the return type is dedu...
bool isVirtualAsWritten() const
Whether this function is marked as virtual explicitly.
bool hasOneParamOrDefaultArgs() const
Determine whether this function has a single parameter, or multiple parameters where all but the firs...
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
size_t param_size() const
DeclarationNameInfo getNameInfo() const
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
bool isDefined(const FunctionDecl *&Definition, bool CheckForPendingFriendDefinition=false) const
Returns true if the function has a definition that does not need to be instantiated.
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
void setParams(ArrayRef< ParmVarDecl * > NewParamInfo)
bool willHaveBody() const
True if this function will eventually have a body, once it's fully parsed.
A mutable set of FunctionEffects and possibly conditions attached to them.
bool insert(const FunctionEffectWithCondition &NewEC, Conflicts &Errs)
SmallVector< Conflict > Conflicts
An immutable set of FunctionEffects and possibly conditions attached to them.
static FunctionParmPackExpr * Create(const ASTContext &Context, QualType T, ValueDecl *ParamPack, SourceLocation NameLoc, ArrayRef< ValueDecl * > Params)
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.
unsigned getNumParams() const
bool hasTrailingReturn() const
Whether this function prototype has a trailing return type.
const QualType * param_type_iterator
QualType getParamType(unsigned i) const
bool isVariadic() const
Whether this function prototype is variadic.
ExtProtoInfo getExtProtoInfo() const
Expr * getNoexceptExpr() const
Return the expression inside noexcept(expression), or a null pointer if there is none (because the ex...
ArrayRef< QualType > getParamTypes() const
ArrayRef< QualType > exceptions() const
bool hasExtParameterInfos() const
Is there any interesting extra information for any of the parameters of this function type?
Declaration of a template function.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
Wrapper for source info for functions.
unsigned getNumParams() const
ParmVarDecl * getParam(unsigned i) const
void setParam(unsigned i, ParmVarDecl *VD)
TypeLoc getReturnLoc() const
ExtInfo withCallingConv(CallingConv cc) const
FunctionType - C99 6.7.5.3 - Function Declarators.
CallingConv getCallConv() const
QualType getReturnType() const
One of these records is kept for each identifier that is lexed.
unsigned getLength() const
Efficiently return the length of this identifier info.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
ReservedLiteralSuffixIdStatus isReservedLiteralSuffixId() const
Determine whether this is a name reserved for future standardization or the implementation (C++ [usrl...
bool isPlaceholder() const
StringRef getName() const
Return the actual identifier string.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
IfStmt - This represents an if/then/else.
RAII class that temporarily sets the "ignore all warnings" state on a DiagnosticsEngine and restores ...
ImaginaryLiteral - We support imaginary integer and floating point literals, like "1....
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
Represents an implicitly-generated value initialization of an object of a given type.
Represents a field injected from an anonymous union/struct into the parent scope.
ArrayRef< NamedDecl * > chain() const
void setInherited(bool I)
Description of a constructor that was inherited from a base class.
ConstructorUsingShadowDecl * getShadowDecl() const
const TypeClass * getTypePtr() const
Describes an C or C++ initializer list.
unsigned getNumInits() const
const Expr * getInit(unsigned Init) const
Describes the kind of initialization being performed, along with location information for tokens rela...
static InitializationKind CreateDefault(SourceLocation InitLoc)
Create a default initialization.
static InitializationKind CreateDirect(SourceLocation InitLoc, SourceLocation LParenLoc, SourceLocation RParenLoc)
Create a direct initialization.
static InitializationKind CreateCopy(SourceLocation InitLoc, SourceLocation EqualLoc, bool AllowExplicitConvs=false)
Create a copy initialization.
static InitializationKind CreateDirectList(SourceLocation InitLoc)
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.
static InitializedEntity InitializeBase(ASTContext &Context, const CXXBaseSpecifier *Base, bool IsInheritedVirtualBase, const InitializedEntity *Parent=nullptr)
Create the initialization entity for a base class subobject.
static InitializedEntity InitializeMember(FieldDecl *Member, const InitializedEntity *Parent=nullptr)
Create the initialization entity for a member subobject.
static InitializedEntity InitializeBinding(VarDecl *Binding)
Create the initialization entity for a structured binding.
static InitializedEntity InitializeMemberFromDefaultMemberInitializer(FieldDecl *Member)
Create the initialization entity for a default member initializer.
static InitializedEntity InitializeVariable(VarDecl *Var)
Create the initialization entity for a variable.
static InitializedEntity InitializeParameter(ASTContext &Context, ParmVarDecl *Parm)
Create the initialization entity for a parameter.
static InitializedEntity InitializeMemberImplicit(FieldDecl *Member)
Create the initialization entity for a member subobject with implicit field initializer.
static InitializedEntity InitializeDelegation(QualType Type)
Create the initialization entity for a delegated constructor.
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'.
An lvalue reference type, per C++11 [dcl.ref].
bool isInitCapture(const LambdaCapture *Capture) const
Determine whether one of this lambda's captures is an init-capture.
capture_range captures() const
Retrieve this lambda's captures.
@ Default
Use default layout rules of the target.
static StringRef getSourceText(CharSourceRange Range, const SourceManager &SM, const LangOptions &LangOpts, bool *Invalid=nullptr)
Returns a string for the source that the range encompasses.
Represents a linkage specification.
static LinkageSpecDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation ExternLoc, SourceLocation LangLoc, LinkageSpecLanguageIDs Lang, bool HasBraces)
void setRBraceLoc(SourceLocation L)
A class for iterating through a result set and possibly filtering out results.
void erase()
Erase the last element returned from this iterator.
Represents the results of name lookup.
LLVM_ATTRIBUTE_REINITIALIZES void clear()
Clears out any current state.
void addDecl(NamedDecl *D)
Add a declaration to these results with its natural access.
bool empty() const
Return true if no decls were found.
void resolveKind()
Resolves the result kind of the lookup, possibly hiding decls.
Filter makeFilter()
Create a filter for this result set.
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.
UnresolvedSetImpl::iterator iterator
NamedDecl * getRepresentativeDecl() const
Fetches a representative decl. Useful for lazy diagnostics.
static bool isVisible(Sema &SemaRef, NamedDecl *D)
Determine whether the given declaration is visible to the program.
An instance of this class represents the declaration of a property member.
static MSPropertyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName N, QualType T, TypeSourceInfo *TInfo, SourceLocation StartL, IdentifierInfo *Getter, IdentifierInfo *Setter)
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
SourceLocation getExprLoc() const LLVM_READONLY
Wrapper for source info for member pointers.
A pointer to member type per C++ 8.3.3 - Pointers to members.
Describes a module or submodule.
StringRef getTopLevelModuleName() const
Retrieve the name of the top-level module.
bool isExplicitGlobalModule() const
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.
bool isPlaceholderVar(const LangOptions &LangOpts) const
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
void setModulePrivate()
Specify that this declaration was marked as being private to the module in which it was defined.
Represents a C++ namespace alias.
static NamespaceAliasDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation NamespaceLoc, SourceLocation AliasLoc, IdentifierInfo *Alias, NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc, NamespaceBaseDecl *Namespace)
Represents C++ namespaces and their aliases.
NamespaceDecl * getNamespace()
Represent a C++ namespace.
bool isInline() const
Returns true if this is an inline namespace declaration.
static NamespaceDecl * Create(ASTContext &C, DeclContext *DC, bool Inline, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, NamespaceDecl *PrevDecl, bool Nested)
NamespaceDecl * getAnonymousNamespace() const
Retrieve the anonymous namespace that inhabits this namespace, if any.
void setRBraceLoc(SourceLocation L)
Class that aids in the construction of nested-name-specifiers along with source-location information ...
void MakeTrivial(ASTContext &Context, NestedNameSpecifier Qualifier, SourceRange R)
Make a new nested-name-specifier from incomplete source-location information.
A C++ nested-name-specifier augmented with source location information.
NestedNameSpecifier getNestedNameSpecifier() const
Retrieve the nested-name-specifier to which this instance refers.
SourceRange getSourceRange() const LLVM_READONLY
Retrieve the source range covering the entirety of this nested-name-specifier.
TypeLoc getAsTypeLoc() const
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
NestedNameSpecifier getCanonical() const
Retrieves the "canonical" nested name specifier for a given nested name specifier.
bool containsUnexpandedParameterPack() const
Whether this nested-name-specifier contains an unexpanded parameter pack (for C++11 variadic template...
CXXRecordDecl * getAsRecordDecl() const
Retrieve the record declaration stored in this nested name specifier, or null.
bool isDependent() const
Whether this nested name specifier refers to a dependent type or not.
const Type * getAsType() const
@ Global
The global specifier '::'. There is no stored value.
@ Type
A type, stored as a Type*.
@ Namespace
A namespace-like entity, stored as a NamespaceBaseDecl*.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
The basic abstraction for the target Objective-C runtime.
bool isFragile() const
The inverse of isNonFragile(): does this runtime follow the set of implied behaviors for a "fragile" ...
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
@ CSK_Operator
C++ [over.match.oper]: Lookup of operator function candidates in a call using operator syntax.
SmallVectorImpl< OverloadCandidate >::iterator iterator
A single parameter index whose accessors require each use to make explicit the parameter index encodi...
static ParenListExpr * Create(const ASTContext &Ctx, SourceLocation LParenLoc, ArrayRef< Expr * > Exprs, SourceLocation RParenLoc)
Create a paren list.
Represents a parameter to a function.
void setDefaultArg(Expr *defarg)
void setUnparsedDefaultArg()
Specify that this parameter has an unparsed default argument.
bool hasUnparsedDefaultArg() const
Determines whether this parameter has a default argument that has not yet been parsed.
SourceRange getDefaultArgRange() const
Retrieve the source range that covers the entire default argument.
void setUninstantiatedDefaultArg(Expr *arg)
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
bool hasUninstantiatedDefaultArg() const
bool hasInheritedDefaultArg() const
static ParmVarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S, Expr *DefArg)
Expr * getUninstantiatedDefaultArg()
bool hasDefaultArg() const
Determines whether this parameter has a default argument, either parsed or not.
void setHasInheritedDefaultArg(bool I=true)
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
ParsedAttr - Represents a syntactic attribute.
IdentifierInfo * getPropertyDataSetter() const
IdentifierInfo * getPropertyDataGetter() const
static const ParsedAttributesView & none()
const ParsedAttr * getMSPropertyAttr() const
bool hasAttribute(ParsedAttr::Kind K) const
bool isAddressDiscriminated() const
Wrapper for source info for pointers.
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
IdentifierInfo * getIdentifierInfo(StringRef Name) const
Return information about the specified preprocessor identifier token.
IdentifierTable & getIdentifierTable()
ArrayRef< Expr * > semantics()
A (possibly-)qualified type.
bool hasAddressDiscriminatedPointerAuth() const
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool hasQualifiers() const
Determine whether this type has any qualifiers.
PointerAuthQualifier getPointerAuth() const
QualType getLocalUnqualifiedType() const
Return this type with all of the instance-specific qualifiers removed, but without removing any quali...
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.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
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 getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
unsigned getLocalCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers local to this particular QualType instan...
bool isConstQualified() const
Determine whether this type is const-qualified.
unsigned getCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers applied to this type.
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
bool hasNonTrivialObjCLifetime() const
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...
Represents a template name as written in source code.
The collection of all-type qualifiers we support.
void removeCVRQualifiers(unsigned mask)
void addAddressSpace(LangAS space)
@ 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.
void removeAddressSpace()
LangAS getAddressSpace() const
void setObjCLifetime(ObjCLifetime type)
An rvalue reference type, per C++11 [dcl.ref].
Represents a struct/union/class.
bool hasFlexibleArrayMember() const
bool hasObjectMember() const
field_iterator field_end() const
field_range fields() const
specific_decl_iterator< FieldDecl > field_iterator
RecordDecl * getDefinitionOrSelf() const
bool isAnonymousStructOrUnion() const
Whether this is an anonymous struct or union.
field_iterator field_begin() const
RedeclarableTemplateDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
void setPreviousDecl(decl_type *PrevDecl)
Set the previous declaration.
Base for LValueReferenceType and RValueReferenceType.
QualType getPointeeType() const
Scope - A scope is a transient data structure that is used while parsing the program.
void setEntity(DeclContext *E)
const Scope * getFnParent() const
getFnParent - Return the closest scope that is a function body.
unsigned getFlags() const
getFlags - Return the flags for this scope.
bool isDeclScope(const Decl *D) const
isDeclScope - Return true if this is the scope that the specified decl is declared in.
DeclContext * getEntity() const
Get the entity corresponding to this scope.
const Scope * getParent() const
getParent - Return the scope that this is nested in.
@ DeclScope
This is a scope that can contain a declaration.
void PushUsingDirective(UsingDirectiveDecl *UDir)
A generic diagnostic builder for errors which may or may not be deferred.
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
SemaDiagnosticBuilder DiagCompat(SourceLocation Loc, unsigned CompatDiagId)
Emit a compatibility diagnostic.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
A RAII object to enter scope of a compound statement.
Records and restores the CurFPFeatures state on entry/exit of compound statements.
Helper class that collects exception specifications for implicitly-declared special member functions.
void CalledStmt(Stmt *S)
Integrate an invoked statement into the collected data.
void CalledExpr(Expr *E)
Integrate an invoked expression into the collected data.
void CalledDecl(SourceLocation CallLoc, const CXXMethodDecl *Method)
Integrate another called method into the collected data.
SpecialMemberOverloadResult - The overloading result for a special member function.
CXXMethodDecl * getMethod() const
RAII object to handle the state changes required to synthesize a function body.
Abstract base class used for diagnosing integer constant expression violations.
Sema - This implements semantic analysis and AST building for C.
void DefineImplicitLambdaToFunctionPointerConversion(SourceLocation CurrentLoc, CXXConversionDecl *Conv)
Define the "body" of the conversion from a lambda object to a function pointer.
QualType SubstAutoType(QualType TypeWithAuto, QualType Replacement)
Substitute Replacement for auto in TypeWithAuto.
CXXConstructorDecl * DeclareImplicitDefaultConstructor(CXXRecordDecl *ClassDecl)
Declare the implicit default constructor for the given class.
bool MergeCXXFunctionDecl(FunctionDecl *New, FunctionDecl *Old, Scope *S)
MergeCXXFunctionDecl - Merge two declarations of the same C++ function, once we already know that the...
Attr * getImplicitCodeSegOrSectionAttrForFunction(const FunctionDecl *FD, bool IsDefinition)
Returns an implicit CodeSegAttr if a __declspec(code_seg) is found on a containing class.
MemInitResult BuildDelegatingInitializer(TypeSourceInfo *TInfo, Expr *Init, CXXRecordDecl *ClassDecl)
void CheckTypedefForVariablyModifiedType(Scope *S, TypedefNameDecl *D)
QualType getCurrentThisType()
Try to retrieve the type of the 'this' pointer.
bool CheckSpecifiedExceptionType(QualType &T, SourceRange Range)
CheckSpecifiedExceptionType - Check if the given type is valid in an exception specification.
ExprResult BuildBlockForLambdaConversion(SourceLocation CurrentLocation, SourceLocation ConvLocation, CXXConversionDecl *Conv, Expr *Src)
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
sema::CapturingScopeInfo * getEnclosingLambdaOrBlock() const
Get the innermost lambda or block enclosing the current location, if any.
Decl * ActOnAliasDeclaration(Scope *CurScope, AccessSpecifier AS, MultiTemplateParamsArg TemplateParams, SourceLocation UsingLoc, UnqualifiedId &Name, const ParsedAttributesView &AttrList, TypeResult Type, Decl *DeclFromDeclSpec)
NamedDecl * ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope)
void DiagnoseAbstractType(const CXXRecordDecl *RD)
void HideUsingShadowDecl(Scope *S, UsingShadowDecl *Shadow)
Hides a using shadow declaration.
bool CheckUsingDeclQualifier(SourceLocation UsingLoc, bool HasTypename, const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, SourceLocation NameLoc, const LookupResult *R=nullptr, const UsingDecl *UD=nullptr)
Checks that the given nested-name qualifier used in a using decl in the current context is appropriat...
bool CheckExplicitObjectOverride(CXXMethodDecl *New, const CXXMethodDecl *Old)
llvm::SmallPtrSet< SpecialMemberDecl, 4 > SpecialMembersBeingDeclared
The C++ special members which we are currently in the process of declaring.
void ActOnParamUnparsedDefaultArgument(Decl *param, SourceLocation EqualLoc, SourceLocation ArgLoc)
ActOnParamUnparsedDefaultArgument - We've seen a default argument for a function parameter,...
ExprResult BuildMemberReferenceExpr(Expr *Base, QualType BaseType, SourceLocation OpLoc, bool IsArrow, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs, const Scope *S, ActOnMemberAccessExtraArgs *ExtraArgs=nullptr)
bool isDeclInScope(NamedDecl *D, DeclContext *Ctx, Scope *S=nullptr, bool AllowInlineNamespace=false) const
isDeclInScope - If 'Ctx' is a function/method, isDeclInScope returns true if 'D' is in Scope 'S',...
bool IsOverload(FunctionDecl *New, FunctionDecl *Old, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp=false)
void BuildBasePathArray(const CXXBasePaths &Paths, CXXCastPath &BasePath)
void MergeVarDeclExceptionSpecs(VarDecl *New, VarDecl *Old)
Merge the exception specifications of two variable declarations.
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupUsingDeclName
Look up all declarations in a scope with the given name, including resolved using declarations.
@ LookupLocalFriendName
Look up a friend of a local class.
@ LookupNamespaceName
Look up a namespace name within a C++ using directive or namespace alias definition,...
@ 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...
void DiagnoseFunctionSpecifiers(const DeclSpec &DS)
Diagnose function specifiers on a declaration of an identifier that does not identify a function.
Decl * BuildStaticAssertDeclaration(SourceLocation StaticAssertLoc, Expr *AssertExpr, Expr *AssertMessageExpr, SourceLocation RParenLoc, bool Failed)
void EvaluateImplicitExceptionSpec(SourceLocation Loc, FunctionDecl *FD)
Evaluate the implicit exception specification for a defaulted special member function.
void PrintContextStack(InstantiationContextDiagFuncRef DiagFunc)
ExplicitSpecifier ActOnExplicitBoolSpecifier(Expr *E)
ActOnExplicitBoolSpecifier - Build an ExplicitSpecifier from an expression found in an explicit(bool)...
bool DiagRedefinedPlaceholderFieldDecl(SourceLocation Loc, RecordDecl *ClassDecl, const IdentifierInfo *Name)
void ActOnFinishCXXNonNestedClass()
MemInitResult BuildBaseInitializer(QualType BaseType, TypeSourceInfo *BaseTInfo, Expr *Init, CXXRecordDecl *ClassDecl, SourceLocation EllipsisLoc)
bool FindDeallocationFunction(SourceLocation StartLoc, CXXRecordDecl *RD, DeclarationName Name, FunctionDecl *&Operator, ImplicitDeallocationParameters, bool Diagnose=true)
void ForceDeclarationOfImplicitMembers(CXXRecordDecl *Class)
Force the declaration of any implicitly-declared members of this class.
void ActOnParamDefaultArgumentError(Decl *param, SourceLocation EqualLoc, Expr *DefaultArg)
ActOnParamDefaultArgumentError - Parsing or semantic analysis of the default argument for the paramet...
bool diagnoseQualifiedDeclaration(CXXScopeSpec &SS, DeclContext *DC, DeclarationName Name, SourceLocation Loc, TemplateIdAnnotation *TemplateId, bool IsMemberSpecialization)
Diagnose a declaration whose declarator-id has the given nested-name-specifier.
void DiagnoseStaticAssertDetails(const Expr *E)
Try to print more useful information about a failed static_assert with expression \E.
void DefineImplicitMoveAssignment(SourceLocation CurrentLocation, CXXMethodDecl *MethodDecl)
Defines an implicitly-declared move assignment operator.
void ActOnFinishDelayedMemberInitializers(Decl *Record)
ExprResult CreateBuiltinBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr, bool ForFoldExpression=false)
CreateBuiltinBinOp - Creates a new built-in binary operation with operator Opc at location TokLoc.
NamedDecl * ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope, ArrayRef< BindingDecl * > Bindings={})
void CheckDelegatingCtorCycles()
SmallVector< CXXMethodDecl *, 4 > DelayedDllExportMemberFunctions
void CheckExplicitObjectMemberFunction(Declarator &D, DeclarationName Name, QualType R, bool IsLambda, DeclContext *DC=nullptr)
bool DiagnoseClassNameShadow(DeclContext *DC, DeclarationNameInfo Info)
DiagnoseClassNameShadow - Implement C++ [class.mem]p13: If T is the name of a class,...
AccessResult CheckFriendAccess(NamedDecl *D)
Checks access to the target of a friend declaration.
void MarkBaseAndMemberDestructorsReferenced(SourceLocation Loc, CXXRecordDecl *Record)
MarkBaseAndMemberDestructorsReferenced - Given a record decl, mark all the non-trivial destructors of...
const TranslationUnitKind TUKind
The kind of translation unit we are processing.
QualType tryBuildStdTypeIdentity(QualType Type, SourceLocation Loc)
Looks for the std::type_identity template and instantiates it with Type, or returns a null type if ty...
DeclResult ActOnCXXConditionDeclaration(Scope *S, Declarator &D)
ActOnCXXConditionDeclarationExpr - Parsed a condition declaration of a C++ if/switch/while/for statem...
void LookupOverloadedBinOp(OverloadCandidateSet &CandidateSet, OverloadedOperatorKind Op, const UnresolvedSetImpl &Fns, ArrayRef< Expr * > Args, bool RequiresADL=true)
Perform lookup for an overloaded binary operator.
DelegatingCtorDeclsType DelegatingCtorDecls
All the delegating constructors seen so far in the file, used for cycle detection at the end of the T...
bool ActOnAccessSpecifier(AccessSpecifier Access, SourceLocation ASLoc, SourceLocation ColonLoc, const ParsedAttributesView &Attrs)
ActOnAccessSpecifier - Parsed an access specifier followed by a colon.
std::unique_ptr< CXXFieldCollector > FieldCollector
FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
void AddPragmaAttributes(Scope *S, Decl *D)
Adds the attributes that have been specified using the '#pragma clang attribute push' directives to t...
TemplateDecl * AdjustDeclIfTemplate(Decl *&Decl)
AdjustDeclIfTemplate - If the given decl happens to be a template, reset the parameter D to reference...
bool isImplicitlyDeleted(FunctionDecl *FD)
Determine whether the given function is an implicitly-deleted special member function.
void CheckImplicitSpecialMemberDeclaration(Scope *S, FunctionDecl *FD)
Check a completed declaration of an implicit special member.
void PushExpressionEvaluationContext(ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl=nullptr, ExpressionEvaluationContextRecord::ExpressionKind Type=ExpressionEvaluationContextRecord::EK_Other)
bool CompleteConstructorCall(CXXConstructorDecl *Constructor, QualType DeclInitType, MultiExprArg ArgsPtr, SourceLocation Loc, SmallVectorImpl< Expr * > &ConvertedArgs, bool AllowExplicit=false, bool IsListInitialization=false)
Given a constructor and the set of arguments provided for the constructor, convert the arguments and ...
@ Boolean
A boolean condition, from 'if', 'while', 'for', or 'do'.
bool RequireCompleteDeclContext(CXXScopeSpec &SS, DeclContext *DC)
Require that the context specified by SS be complete.
bool TemplateParameterListsAreEqual(const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New, const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain, TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc=SourceLocation())
Determine whether the given template parameter lists are equivalent.
Decl * ActOnNamespaceAliasDef(Scope *CurScope, SourceLocation NamespaceLoc, SourceLocation AliasLoc, IdentifierInfo *Alias, CXXScopeSpec &SS, SourceLocation IdentLoc, IdentifierInfo *Ident)
void CheckOverrideControl(NamedDecl *D)
CheckOverrideControl - Check C++11 override control semantics.
bool GatherArgumentsForCall(SourceLocation CallLoc, FunctionDecl *FDecl, const FunctionProtoType *Proto, unsigned FirstParam, ArrayRef< Expr * > Args, SmallVectorImpl< Expr * > &AllArgs, VariadicCallType CallType=VariadicCallType::DoesNotApply, bool AllowExplicit=false, bool IsListInitialization=false)
GatherArgumentsForCall - Collector argument expressions for various form of call prototypes.
bool ShouldDeleteSpecialMember(CXXMethodDecl *MD, CXXSpecialMemberKind CSM, InheritedConstructorInfo *ICI=nullptr, bool Diagnose=false)
Determine if a special member function should have a deleted definition when it is defaulted.
Scope * getScopeForContext(DeclContext *Ctx)
Determines the active Scope associated with the given declaration context.
CXXConstructorDecl * DeclareImplicitMoveConstructor(CXXRecordDecl *ClassDecl)
Declare the implicit move constructor for the given class.
bool ProcessAccessDeclAttributeList(AccessSpecDecl *ASDecl, const ParsedAttributesView &AttrList)
Annotation attributes are the only attributes allowed after an access specifier.
PragmaStack< FPOptionsOverride > FpPragmaStack
FunctionDecl * InstantiateFunctionDeclaration(FunctionTemplateDecl *FTD, const TemplateArgumentList *Args, SourceLocation Loc, CodeSynthesisContext::SynthesisKind CSC=CodeSynthesisContext::ExplicitTemplateArgumentSubstitution)
Instantiate (or find existing instantiation of) a function template with a given set of template argu...
void SetFunctionBodyKind(Decl *D, SourceLocation Loc, FnBodyKind BodyKind, StringLiteral *DeletedMessage=nullptr)
void referenceDLLExportedClassMethods()
void CheckCompleteDestructorVariant(SourceLocation CurrentLocation, CXXDestructorDecl *Dtor)
Do semantic checks to allow the complete destructor variant to be emitted when the destructor is defi...
NamedDecl * ActOnCXXMemberDeclarator(Scope *S, AccessSpecifier AS, Declarator &D, MultiTemplateParamsArg TemplateParameterLists, Expr *BitfieldWidth, const VirtSpecifiers &VS, InClassInitStyle InitStyle)
ActOnCXXMemberDeclarator - This is invoked when a C++ class member declarator is parsed.
bool CheckIfOverriddenFunctionIsMarkedFinal(const CXXMethodDecl *New, const CXXMethodDecl *Old)
CheckIfOverriddenFunctionIsMarkedFinal - Checks whether a virtual member function overrides a virtual...
NamedDecl * HandleDeclarator(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParameterLists)
bool CheckOverridingFunctionAttributes(CXXMethodDecl *New, const CXXMethodDecl *Old)
TemplateParameterList * MatchTemplateParametersToScopeSpecifier(SourceLocation DeclStartLoc, SourceLocation DeclLoc, const CXXScopeSpec &SS, TemplateIdAnnotation *TemplateId, ArrayRef< TemplateParameterList * > ParamLists, bool IsFriend, bool &IsMemberSpecialization, bool &Invalid, bool SuppressDiagnostic=false)
Match the given template parameter lists to the given scope specifier, returning the template paramet...
void handleTagNumbering(const TagDecl *Tag, Scope *TagScope)
void AddImplicitlyDeclaredMembersToClass(CXXRecordDecl *ClassDecl)
AddImplicitlyDeclaredMembersToClass - Adds any implicitly-declared special functions,...
bool tryResolveExplicitSpecifier(ExplicitSpecifier &ExplicitSpec)
tryResolveExplicitSpecifier - Attempt to resolve the explict specifier.
Decl * ActOnConversionDeclarator(CXXConversionDecl *Conversion)
ActOnConversionDeclarator - Called by ActOnDeclarator to complete the declaration of the given C++ co...
bool IsCXXTriviallyRelocatableType(QualType T)
Determines if a type is trivially relocatable according to the C++26 rules.
@ Other
C++26 [dcl.fct.def.general]p1 function-body: ctor-initializer[opt] compound-statement function-try-bl...
@ Delete
deleted-function-body
QualType BuildStdInitializerList(QualType Element, SourceLocation Loc)
Looks for the std::initializer_list template and instantiates it with Element, or emits an error if i...
MemInitResult BuildMemberInitializer(ValueDecl *Member, Expr *Init, SourceLocation IdLoc)
StmtResult ActOnExprStmt(ExprResult Arg, bool DiscardedValue=true)
FieldDecl * HandleField(Scope *S, RecordDecl *TagD, SourceLocation DeclStart, Declarator &D, Expr *BitfieldWidth, InClassInitStyle InitStyle, AccessSpecifier AS)
HandleField - Analyze a field of a C struct or a C++ data member.
FPOptionsOverride CurFPFeatureOverrides()
void DiagnoseHiddenVirtualMethods(CXXMethodDecl *MD)
Diagnose methods which overload virtual methods in a base class without overriding any.
UsingShadowDecl * BuildUsingShadowDecl(Scope *S, BaseUsingDecl *BUD, NamedDecl *Target, UsingShadowDecl *PrevDecl)
Builds a shadow declaration corresponding to a 'using' declaration.
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.
FunctionDecl * FindDeallocationFunctionForDestructor(SourceLocation StartLoc, CXXRecordDecl *RD, bool Diagnose, bool LookForGlobal, DeclarationName Name)
NamedDecl * LookupSingleName(Scope *S, DeclarationName Name, SourceLocation Loc, LookupNameKind NameKind, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)
Look up a name, looking for a single declaration.
bool isMemberAccessibleForDeletion(CXXRecordDecl *NamingClass, DeclAccessPair Found, QualType ObjectType, SourceLocation Loc, const PartialDiagnostic &Diag)
Is the given member accessible for the purposes of deciding whether to define a special member functi...
BaseResult ActOnBaseSpecifier(Decl *classdecl, SourceRange SpecifierRange, const ParsedAttributesView &Attrs, bool Virtual, AccessSpecifier Access, ParsedType basetype, SourceLocation BaseLoc, SourceLocation EllipsisLoc)
ActOnBaseSpecifier - Parsed a base specifier.
void ActOnFinishFunctionDeclarationDeclarator(Declarator &D)
Called after parsing a function declarator belonging to a function declaration.
void ActOnParamDefaultArgument(Decl *param, SourceLocation EqualLoc, Expr *defarg)
ActOnParamDefaultArgument - Check whether the default argument provided for a function parameter is w...
void CheckConversionDeclarator(Declarator &D, QualType &R, StorageClass &SC)
CheckConversionDeclarator - Called by ActOnDeclarator to check the well-formednes of the conversion f...
bool DeduceReturnType(FunctionDecl *FD, SourceLocation Loc, bool Diagnose=true)
void ActOnFinishDelayedCXXMethodDeclaration(Scope *S, Decl *Method)
ActOnFinishDelayedCXXMethodDeclaration - We have finished processing the delayed method declaration f...
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReceiver=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
DeclarationNameInfo GetNameForDeclarator(Declarator &D)
GetNameForDeclarator - Determine the full declaration name for the given Declarator.
DiagnosticsEngine & getDiagnostics() const
void DiagnoseTypeTraitDetails(const Expr *E)
If E represents a built-in type trait, or a known standard type trait, try to print more information ...
AccessResult CheckDestructorAccess(SourceLocation Loc, CXXDestructorDecl *Dtor, const PartialDiagnostic &PDiag, QualType objectType=QualType())
bool isStdTypeIdentity(QualType Ty, QualType *TypeArgument, const Decl **MalformedDecl=nullptr)
Tests whether Ty is an instance of std::type_identity and, if it is and TypeArgument is not NULL,...
void propagateDLLAttrToBaseClassTemplate(CXXRecordDecl *Class, Attr *ClassAttr, ClassTemplateSpecializationDecl *BaseTemplateSpec, SourceLocation BaseLoc)
Perform propagation of DLL attributes from a derived class to a templated base class for MS compatibi...
bool SpecialMemberIsTrivial(CXXMethodDecl *MD, CXXSpecialMemberKind CSM, TrivialABIHandling TAH=TrivialABIHandling::IgnoreTrivialABI, bool Diagnose=false)
Determine whether a defaulted or deleted special member function is trivial, as specified in C++11 [c...
NamedDecl * ActOnFriendFunctionDecl(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParams)
void setTagNameForLinkagePurposes(TagDecl *TagFromDeclSpec, TypedefNameDecl *NewTD)
void CheckDelayedMemberExceptionSpecs()
void ActOnReenterCXXMethodParameter(Scope *S, ParmVarDecl *Param)
This is used to implement the constant expression evaluation part of the attribute enable_if extensio...
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
void CleanupVarDeclMarking()
ASTContext & getASTContext() const
ClassTemplateDecl * StdInitializerList
The C++ "std::initializer_list" template, which is defined in <initializer_list>.
CXXDestructorDecl * LookupDestructor(CXXRecordDecl *Class)
Look for the destructor of the given class.
void CheckExplicitlyDefaultedFunction(Scope *S, FunctionDecl *MD)
bool isCurrentClassName(const IdentifierInfo &II, Scope *S, const CXXScopeSpec *SS=nullptr)
isCurrentClassName - Determine whether the identifier II is the name of the class type currently bein...
void MarkVariableReferenced(SourceLocation Loc, VarDecl *Var)
Mark a variable referenced, and check whether it is odr-used (C++ [basic.def.odr]p2,...
void checkExceptionSpecification(bool IsTopLevel, ExceptionSpecificationType EST, ArrayRef< ParsedType > DynamicExceptions, ArrayRef< SourceRange > DynamicExceptionRanges, Expr *NoexceptExpr, SmallVectorImpl< QualType > &Exceptions, FunctionProtoType::ExceptionSpecInfo &ESI)
Check the given exception-specification and update the exception specification information with the r...
SmallVector< std::pair< FunctionDecl *, FunctionDecl * >, 2 > DelayedEquivalentExceptionSpecChecks
All the function redeclarations seen during a class definition that had their exception spec checks d...
bool checkThisInStaticMemberFunctionType(CXXMethodDecl *Method)
Check whether 'this' shows up in the type of a static member function after the (naturally empty) cv-...
void PopExpressionEvaluationContext()
NamespaceDecl * getOrCreateStdNamespace()
Retrieve the special "std" namespace, which may require us to implicitly define the namespace.
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.
bool isInitListConstructor(const FunctionDecl *Ctor)
Determine whether Ctor is an initializer-list constructor, as defined in [dcl.init....
void ActOnStartFunctionDeclarationDeclarator(Declarator &D, unsigned TemplateParameterDepth)
Called before parsing a function declarator belonging to a function declaration.
std::string getAmbiguousPathsDisplayString(CXXBasePaths &Paths)
Builds a string representing ambiguous paths from a specific derived class to different subobjects of...
OverloadKind CheckOverload(Scope *S, FunctionDecl *New, const LookupResult &OldDecls, NamedDecl *&OldDecl, bool UseMemberUsingDeclRules)
Determine whether the given New declaration is an overload of the declarations in Old.
bool RequireLiteralType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
Ensure that the type T is a literal type.
llvm::PointerIntPair< CXXRecordDecl *, 3, CXXSpecialMemberKind > SpecialMemberDecl
void ActOnStartCXXInClassMemberInitializer()
Enter a new C++ default initializer scope.
ValueDecl * tryLookupCtorInitMemberDecl(CXXRecordDecl *ClassDecl, CXXScopeSpec &SS, ParsedType TemplateTypeTy, IdentifierInfo *MemberOrBase)
NamedDecl * BuildUsingDeclaration(Scope *S, AccessSpecifier AS, SourceLocation UsingLoc, bool HasTypenameKeyword, SourceLocation TypenameLoc, CXXScopeSpec &SS, DeclarationNameInfo NameInfo, SourceLocation EllipsisLoc, const ParsedAttributesView &AttrList, bool IsInstantiation, bool IsUsingIfExists)
Builds a using declaration.
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
bool pushCodeSynthesisContext(CodeSynthesisContext Ctx)
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...
@ TPL_TemplateMatch
We are matching the template parameter lists of two templates that might be redeclarations.
EnumDecl * getStdAlignValT() const
void ActOnFinishDelayedMemberDeclarations(Scope *S, Decl *Record)
LangAS getDefaultCXXMethodAddrSpace() const
Returns default addr space for method qualifiers.
LazyDeclPtr StdBadAlloc
The C++ "std::bad_alloc" class, which is defined by the C++ standard library.
QualType BuildQualifiedType(QualType T, SourceLocation Loc, Qualifiers Qs, const DeclSpec *DS=nullptr)
void PushFunctionScope()
Enter a new function scope.
void SetDeclDefaulted(Decl *dcl, SourceLocation DefaultLoc)
void DefineImplicitCopyConstructor(SourceLocation CurrentLocation, CXXConstructorDecl *Constructor)
DefineImplicitCopyConstructor - Checks for feasibility of defining this constructor as the copy const...
FPOptions & getCurFPFeatures()
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
ConditionResult ActOnCondition(Scope *S, SourceLocation Loc, Expr *SubExpr, ConditionKind CK, bool MissingOK=false)
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
void DiagnoseUnsatisfiedRequiresExpr(const RequiresExpr *RequiresExpr, bool First=true)
@ UPPC_UsingDeclaration
A using declaration.
@ UPPC_ExceptionType
The type of an exception.
@ UPPC_Initializer
An initializer.
@ UPPC_BaseType
The base type of a class type.
@ UPPC_FriendDeclaration
A friend declaration.
@ UPPC_DefaultArgument
A default argument.
@ UPPC_DeclarationType
The type of an arbitrary declaration.
@ UPPC_DataMemberType
The type of a data member.
@ UPPC_StaticAssertExpression
The expression in a static assertion.
Decl * ActOnStartNamespaceDef(Scope *S, SourceLocation InlineLoc, SourceLocation NamespaceLoc, SourceLocation IdentLoc, IdentifierInfo *Ident, SourceLocation LBrace, const ParsedAttributesView &AttrList, UsingDirectiveDecl *&UsingDecl, bool IsNested)
ActOnStartNamespaceDef - This is called at the start of a namespace definition.
const LangOptions & getLangOpts() const
void DiagnoseTemplateParameterShadow(SourceLocation Loc, Decl *PrevDecl, bool SupportedForCompatibility=false)
DiagnoseTemplateParameterShadow - Produce a diagnostic complaining that the template parameter 'PrevD...
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 DiagnoseAbsenceOfOverrideControl(NamedDecl *D, bool Inconsistent)
DiagnoseAbsenceOfOverrideControl - Diagnose if 'override' keyword was not used in the declaration of ...
SmallVector< VTableUse, 16 > VTableUses
The list of vtables that are required but have not yet been materialized.
PoppedFunctionScopePtr PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, Decl *D=nullptr, QualType BlockType=QualType())
Pop a function (or block or lambda or captured region) scope from the stack.
AccessResult CheckStructuredBindingMemberAccess(SourceLocation UseLoc, CXXRecordDecl *DecomposedClass, DeclAccessPair Field)
Checks implicit access to a member in a structured binding.
void EnterTemplatedContext(Scope *S, DeclContext *DC)
Enter a template parameter scope, after it's been associated with a particular DeclContext.
void ActOnBaseSpecifiers(Decl *ClassDecl, MutableArrayRef< CXXBaseSpecifier * > Bases)
ActOnBaseSpecifiers - Attach the given base specifiers to the class, after checking whether there are...
const FunctionProtoType * ResolveExceptionSpec(SourceLocation Loc, const FunctionProtoType *FPT)
void NoteTemplateLocation(const NamedDecl &Decl, std::optional< SourceRange > ParamRange={})
void DefineDefaultedComparison(SourceLocation Loc, FunctionDecl *FD, DefaultedComparisonKind DCK)
bool isEquivalentInternalLinkageDeclaration(const NamedDecl *A, const NamedDecl *B)
Determine if A and B are equivalent internal linkage declarations from different modules,...
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...
bool CheckConstexprFunctionDefinition(const FunctionDecl *FD, CheckConstexprKind Kind)
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.
AccessResult CheckBaseClassAccess(SourceLocation AccessLoc, QualType Base, QualType Derived, const CXXBasePath &Path, unsigned DiagID, bool ForceCheck=false, bool ForceUnprivileged=false)
Checks access for a hierarchy conversion.
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)
bool BuildCtorClosureDefaultArgs(SourceLocation Loc, CXXConstructorDecl *Ctor, bool IsCopy=false)
NamedDecl * getShadowedDeclaration(const TypedefNameDecl *D, const LookupResult &R)
Return the declaration shadowed by the given typedef D, or null if it doesn't shadow any declaration ...
void AddBuiltinOperatorCandidates(OverloadedOperatorKind Op, SourceLocation OpLoc, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
AddBuiltinOperatorCandidates - Add the appropriate built-in operator overloads to the candidate set (...
void CheckExtraCXXDefaultArguments(Declarator &D)
CheckExtraCXXDefaultArguments - Check for any extra default arguments in the declarator,...
void CheckCompleteDecompositionDeclaration(DecompositionDecl *DD)
void checkClassLevelDLLAttribute(CXXRecordDecl *Class)
Check class-level dllimport/dllexport attribute.
const LangOptions & LangOpts
std::pair< Expr *, std::string > findFailedBooleanCondition(Expr *Cond)
Find the failed Boolean condition within a given Boolean constant expression, and describe it with a ...
void DiagnoseReturnInConstructorExceptionHandler(CXXTryStmt *TryBlock)
void MarkVirtualMembersReferenced(SourceLocation Loc, const CXXRecordDecl *RD, bool ConstexprOnly=false)
MarkVirtualMembersReferenced - Will mark all members of the given CXXRecordDecl referenced.
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.
bool CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD, LookupResult &Previous, bool IsMemberSpecialization, bool DeclIsDefn)
Perform semantic checking of a new function declaration.
CXXRecordDecl * getStdBadAlloc() const
QualType CheckDestructorDeclarator(Declarator &D, QualType R, StorageClass &SC)
CheckDestructorDeclarator - Called by ActOnDeclarator to check the well-formednes of the destructor d...
bool CheckPureMethod(CXXMethodDecl *Method, SourceRange InitRange)
Mark the given method pure.
void SetParamDefaultArgument(ParmVarDecl *Param, Expr *DefaultArg, SourceLocation EqualLoc)
void NoteHiddenVirtualMethods(CXXMethodDecl *MD, SmallVectorImpl< CXXMethodDecl * > &OverloadedMethods)
CXXMethodDecl * DeclareImplicitMoveAssignment(CXXRecordDecl *ClassDecl)
Declare the implicit move assignment operator for the given class.
QualType CheckTypenameType(ElaboratedTypeKeyword Keyword, SourceLocation KeywordLoc, NestedNameSpecifierLoc QualifierLoc, const IdentifierInfo &II, SourceLocation IILoc, TypeSourceInfo **TSI, bool DeducedTSTContext)
llvm::DenseMap< CXXRecordDecl *, bool > VTablesUsed
The set of classes whose vtables have been used within this translation unit, and a bit that will be ...
void CheckCXXDefaultArguments(FunctionDecl *FD)
Helpers for dealing with blocks and functions.
@ DefaultedOperator
A defaulted 'operator<=>' needed the comparison category.
SmallVector< InventedTemplateParameterInfo, 4 > InventedParameterInfos
Stack containing information needed when in C++2a an 'auto' is encountered in a function declaration ...
void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse)
Perform marking for a reference to an arbitrary declaration.
void ProcessDeclAttributeList(Scope *S, Decl *D, const ParsedAttributesView &AttrList, const ProcessDeclAttributeOptions &Options=ProcessDeclAttributeOptions())
ProcessDeclAttributeList - Apply all the decl attributes in the specified attribute list to the speci...
void MarkVTableUsed(SourceLocation Loc, CXXRecordDecl *Class, bool DefinitionRequired=false)
Note that the vtable for the given class was used at the given location.
NamedDecl * BuildUsingEnumDeclaration(Scope *S, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation EnumLoc, SourceLocation NameLoc, TypeSourceInfo *EnumType, EnumDecl *ED)
TypeLoc getReturnTypeLoc(FunctionDecl *FD) const
SmallVector< std::pair< const CXXMethodDecl *, const CXXMethodDecl * >, 2 > DelayedOverridingExceptionSpecChecks
All the overriding functions seen during a class definition that had their exception spec checks dela...
llvm::DenseMap< ParmVarDecl *, SourceLocation > UnparsedDefaultArgLocs
void MarkVirtualMemberExceptionSpecsNeeded(SourceLocation Loc, const CXXRecordDecl *RD)
Mark the exception specifications of all virtual member functions in the given class as needed.
ExprResult BuildConvertedConstantExpression(Expr *From, QualType T, CCEKind CCE, NamedDecl *Dest=nullptr)
bool RequireCompleteEnumDecl(EnumDecl *D, SourceLocation L, CXXScopeSpec *SS=nullptr)
Require that the EnumDecl is completed with its enumerators defined or instantiated.
bool CheckOverloadedOperatorDeclaration(FunctionDecl *FnDecl)
CheckOverloadedOperatorDeclaration - Check whether the declaration of this overloaded operator is wel...
void MarkVirtualBaseDestructorsReferenced(SourceLocation Location, CXXRecordDecl *ClassDecl, llvm::SmallPtrSetImpl< const CXXRecordDecl * > *DirectVirtualBases=nullptr)
Mark destructors of virtual bases of this class referenced.
void ExitDeclaratorContext(Scope *S)
void PushUsingDirective(Scope *S, UsingDirectiveDecl *UDir)
void CheckConstructor(CXXConstructorDecl *Constructor)
CheckConstructor - Checks a fully-formed constructor for well-formedness, issuing any diagnostics req...
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...
void DiagnoseNontrivial(const CXXRecordDecl *Record, CXXSpecialMemberKind CSM)
Diagnose why the specified class does not have a trivial special member of the given kind.
Decl * ActOnUsingEnumDeclaration(Scope *CurScope, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation EnumLoc, SourceRange TyLoc, const IdentifierInfo &II, ParsedType Ty, const CXXScopeSpec &SS)
void popCodeSynthesisContext()
CXXRecordDecl * getCurrentClass(Scope *S, const CXXScopeSpec *SS)
Get the class that is directly named by the current context.
bool EvaluateAsString(Expr *Message, APValue &Result, ASTContext &Ctx, StringEvaluationContext EvalContext, bool ErrorOnInvalidMessage)
QualType BuildReferenceType(QualType T, bool LValueRef, SourceLocation Loc, DeclarationName Entity)
Build a reference type.
TemplateArgumentLoc getTrivialTemplateArgumentLoc(const TemplateArgument &Arg, QualType NTTPType, SourceLocation Loc)
Allocate a TemplateArgumentLoc where all locations have been initialized to the given location.
bool DiagnosePackIndexingInFriendNNS(SourceLocation Loc, NestedNameSpecifierLoc NNSLoc)
ExprResult ActOnFinishTrailingRequiresClause(ExprResult ConstraintExpr)
bool checkThisInStaticMemberFunctionAttributes(CXXMethodDecl *Method)
Check whether 'this' shows up in the attributes of the given static member function.
CXXBaseSpecifier * CheckBaseSpecifier(CXXRecordDecl *Class, SourceRange SpecifierRange, bool Virtual, AccessSpecifier Access, TypeSourceInfo *TInfo, SourceLocation EllipsisLoc)
Check the validity of a C++ base class specifier.
UnparsedDefaultArgInstantiationsMap UnparsedDefaultArgInstantiations
A mapping from parameters with unparsed default arguments to the set of instantiations of each parame...
void DefineImplicitDefaultConstructor(SourceLocation CurrentLocation, CXXConstructorDecl *Constructor)
DefineImplicitDefaultConstructor - Checks for feasibility of defining this constructor as the default...
std::pair< CXXRecordDecl *, SourceLocation > VTableUse
The list of classes whose vtables have been used within this translation unit, and the source locatio...
ExprResult DefaultLvalueConversion(Expr *E)
bool CheckUsingShadowDecl(BaseUsingDecl *BUD, NamedDecl *Target, const LookupResult &PreviousDecls, UsingShadowDecl *&PrevShadow)
Determines whether to create a using shadow decl for a particular decl, given the set of decls existi...
ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R, bool NeedsADL, bool AcceptInvalidDecl=false)
bool isVisible(const NamedDecl *D)
Determine whether a declaration is visible to name lookup.
bool CheckDerivedToBaseConversion(QualType Derived, QualType Base, SourceLocation Loc, SourceRange Range, CXXCastPath *BasePath=nullptr, bool IgnoreAccess=false)
Module * getCurrentModule() const
Get the module unit whose scope we are currently within.
bool CheckDeductionGuideDeclarator(Declarator &D, QualType &R, StorageClass &SC)
Check the validity of a declarator that we parsed for a deduction-guide.
void DiagPlaceholderVariableDefinition(SourceLocation Loc)
void CheckForFunctionRedefinition(FunctionDecl *FD, const FunctionDecl *EffectiveDefinition=nullptr, SkipBodyInfo *SkipBody=nullptr)
bool DiagnoseUseOfOverloadedDecl(NamedDecl *D, SourceLocation Loc)
std::unique_ptr< RecordDeclSetTy > PureVirtualClassDiagSet
PureVirtualClassDiagSet - a set of class declarations which we have emitted a list of pure virtual fu...
void ActOnFinishInlineFunctionDef(FunctionDecl *D)
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
VarDecl * BuildExceptionDeclaration(Scope *S, TypeSourceInfo *TInfo, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id)
Perform semantic analysis for the variable declaration that occurs within a C++ catch clause,...
void ActOnDocumentableDecl(Decl *D)
Should be called on all declarations that might have attached documentation comments.
ClassTemplateDecl * StdTypeIdentity
The C++ "std::type_identity" template, which is defined in <type_traits>.
DeclarationNameInfo GetNameFromUnqualifiedId(const UnqualifiedId &Name)
Retrieves the declaration name from a parsed unqualified-id.
Decl * ActOnFriendTypeDecl(Scope *S, const DeclSpec &DS, MultiTemplateParamsArg TemplateParams, SourceLocation EllipsisLoc)
Handle a friend type declaration.
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 CheckFunctionConstraints(const FunctionDecl *FD, ConstraintSatisfaction &Satisfaction, SourceLocation UsageLoc=SourceLocation(), bool ForOverloadResolution=false)
Check whether the given function decl's trailing requires clause is satisfied, if any.
bool SetDelegatingInitializer(CXXConstructorDecl *Constructor, CXXCtorInitializer *Initializer)
bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived, CXXRecordDecl *Base, CXXBasePaths &Paths)
Determine whether the type Derived is a C++ class that is derived from the type Base.
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
bool CheckLiteralOperatorDeclaration(FunctionDecl *FnDecl)
CheckLiteralOperatorDeclaration - Check whether the declaration of this literal operator function is ...
bool DefineUsedVTables()
Define all of the vtables that have been used in this translation unit and reference any virtual memb...
CXXMethodDecl * DeclareImplicitCopyAssignment(CXXRecordDecl *ClassDecl)
Declare the implicit copy assignment operator for the given class.
void checkIllFormedTrivialABIStruct(CXXRecordDecl &RD)
Check that the C++ class annoated with "trivial_abi" satisfies all the conditions that are needed for...
void MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base=nullptr)
Perform reference-marking and odr-use handling for a DeclRefExpr.
StmtResult ActOnForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, Stmt *First, ConditionResult Second, FullExprArg Third, SourceLocation RParenLoc, Stmt *Body)
unsigned ActOnReenterTemplateScope(Decl *Template, llvm::function_ref< Scope *()> EnterScope)
ExprResult BuildCXXConstructExpr(SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl, CXXConstructorDecl *Constructor, MultiExprArg Exprs, bool HadMultipleCandidates, bool IsListInitialization, bool IsStdInitListInitialization, bool RequiresZeroInit, CXXConstructionKind ConstructKind, SourceRange ParenRange)
BuildCXXConstructExpr - Creates a complete call to a constructor, including handling of its default a...
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
SourceManager & getSourceManager() const
FunctionDecl * SubstSpaceshipAsEqualEqual(CXXRecordDecl *RD, FunctionDecl *Spaceship)
Substitute the name and return type of a defaulted 'operator<=>' to form an implicit 'operator=='.
NamedDecl * ActOnDecompositionDeclarator(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParamLists)
ExprResult BuildFieldReferenceExpr(Expr *BaseExpr, bool IsArrow, SourceLocation OpLoc, const CXXScopeSpec &SS, FieldDecl *Field, DeclAccessPair FoundDecl, const DeclarationNameInfo &MemberNameInfo)
void diagnoseFunctionEffectMergeConflicts(const FunctionEffectSet::Conflicts &Errs, SourceLocation NewLoc, SourceLocation OldLoc)
void EnterDeclaratorContext(Scope *S, DeclContext *DC)
EnterDeclaratorContext - Used when we must lookup names in the context of a declarator's nested name ...
bool CheckExplicitlyDefaultedComparison(Scope *S, FunctionDecl *MD, DefaultedComparisonKind DCK)
bool checkThisInStaticMemberFunctionExceptionSpec(CXXMethodDecl *Method)
Whether this' shows up in the exception specification of a static member function.
void ActOnFinishCXXInClassMemberInitializer(Decl *VarDecl, SourceLocation EqualLoc, ExprResult Init)
This is invoked after parsing an in-class initializer for a non-static C++ class member,...
Decl * ActOnStartLinkageSpecification(Scope *S, SourceLocation ExternLoc, Expr *LangStr, SourceLocation LBraceLoc)
ActOnStartLinkageSpecification - Parsed the beginning of a C++ linkage specification,...
void FilterUsingLookup(Scope *S, LookupResult &lookup)
Remove decls we can't actually see from a lookup being used to declare shadow using decls.
Decl * ActOnExceptionDeclarator(Scope *S, Declarator &D)
ActOnExceptionDeclarator - Parsed the exception-declarator in a C++ catch handler.
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
ExprResult BuildCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *Init=nullptr)
BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating the default expr if needed.
void PushNamespaceVisibilityAttr(const VisibilityAttr *Attr, SourceLocation Loc)
PushNamespaceVisibilityAttr - Note that we've entered a namespace with a visibility attribute.
void ActOnDefaultCtorInitializers(Decl *CDtorDecl)
void ActOnMemInitializers(Decl *ConstructorDecl, SourceLocation ColonLoc, ArrayRef< CXXCtorInitializer * > MemInits, bool AnyErrors)
ActOnMemInitializers - Handle the member initializers for a constructor.
bool CheckTemplateDeclScope(Scope *S, TemplateParameterList *TemplateParams)
Check whether a template can be declared within this scope.
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 ...
void ActOnCXXEnterDeclInitializer(Scope *S, Decl *Dcl)
ActOnCXXEnterDeclInitializer - Invoked when we are about to parse an initializer for the declaration ...
FunctionDecl * BuildTypeAwareUsualDelete(FunctionTemplateDecl *FnDecl, QualType AllocType, SourceLocation)
void ActOnFinishCXXMemberSpecification(Scope *S, SourceLocation RLoc, Decl *TagDecl, SourceLocation LBrac, SourceLocation RBrac, const ParsedAttributesView &AttrList)
void CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl, const LookupResult &R)
Diagnose variable or built-in function shadowing.
void AdjustDestructorExceptionSpec(CXXDestructorDecl *Destructor)
Build an exception spec for destructors that don't have one.
Decl * ActOnStaticAssertDeclaration(SourceLocation StaticAssertLoc, Expr *AssertExpr, Expr *AssertMessageExpr, SourceLocation RParenLoc)
void DiagnoseUnknownAttribute(const ParsedAttr &AL)
StmtResult BuildReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp, bool AllowRecovery=false)
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
bool CheckImmediateEscalatingFunctionDefinition(FunctionDecl *FD, const sema::FunctionScopeInfo *FSI)
void CheckCompleteVariableDeclaration(VarDecl *VD)
ExprResult ActOnRequiresClause(ExprResult ConstraintExpr)
QualType CheckTemplateIdType(ElaboratedTypeKeyword Keyword, TemplateName Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs, Scope *Scope, bool ForNestedNameSpecifier)
void checkClassLevelCodeSegAttribute(CXXRecordDecl *Class)
bool isStdInitializerList(QualType Ty, QualType *Element)
Tests whether Ty is an instance of std::initializer_list and, if it is and Element is not NULL,...
RedeclarationKind forRedeclarationInCurContext() const
LazyDeclPtr StdNamespace
The C++ "std" namespace, where the standard library resides.
bool CheckUsingDeclRedeclaration(SourceLocation UsingLoc, bool HasTypenameKeyword, const CXXScopeSpec &SS, SourceLocation NameLoc, const LookupResult &Previous)
Checks that the given using declaration is not an invalid redeclaration.
void FinalizeVarWithDestructor(VarDecl *VD, CXXRecordDecl *DeclInit)
FinalizeVarWithDestructor - Prepare for calling destructor on the constructed variable.
ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, VerifyICEDiagnoser &Diagnoser, AllowFoldKind CanFold=AllowFoldKind::No)
VerifyIntegerConstantExpression - Verifies that an expression is an ICE, and reports the appropriate ...
IntrusiveRefCntPtr< ExternalSemaSource > ExternalSource
Source of additional semantic information.
void ActOnFinishCXXMemberDecls()
Perform any semantic analysis which needs to be delayed until all pending class member declarations h...
llvm::SmallPtrSet< const Decl *, 4 > ParsingInitForAutoVars
ParsingInitForAutoVars - a set of declarations with auto types for which we are currently parsing the...
void NoteDeletedFunction(FunctionDecl *FD)
Emit a note explaining that this function is deleted.
sema::AnalysisBasedWarnings AnalysisWarnings
Worker object for performing CFG-based warnings.
ExprResult CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc, Expr *Idx, SourceLocation RLoc)
Decl * ActOnFinishLinkageSpecification(Scope *S, Decl *LinkageSpec, SourceLocation RBraceLoc)
ActOnFinishLinkageSpecification - Complete the definition of the C++ linkage specification LinkageSpe...
bool CheckInheritingConstructorUsingDecl(UsingDecl *UD)
Additional checks for a using declaration referring to a constructor name.
@ ConstantEvaluated
The current context is "potentially evaluated" in C++11 terms, but the expression is evaluated at com...
@ 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),...
QualType BuildDecltypeType(Expr *E, bool AsUnevaluated=true)
If AsUnevaluated is false, E is treated as though it were an evaluated context, such as when building...
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)
DeclResult ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, const ParsedAttributesView &Attr, AccessSpecifier AS, SourceLocation ModulePrivateLoc, MultiTemplateParamsArg TemplateParameterLists, bool &OwnedDecl, bool &IsDependent, SourceLocation ScopedEnumKWLoc, bool ScopedEnumUsesClassTag, TypeResult UnderlyingType, bool IsTypeSpecifier, bool IsTemplateParamOrArg, OffsetOfKind OOK, SkipBodyInfo *SkipBody=nullptr)
This is invoked when we see 'struct foo' or 'struct {'.
void ActOnFinishNamespaceDef(Decl *Dcl, SourceLocation RBrace)
ActOnFinishNamespaceDef - This callback is called after a namespace is exited.
MemInitResult BuildMemInitializer(Decl *ConstructorD, Scope *S, CXXScopeSpec &SS, IdentifierInfo *MemberOrBase, ParsedType TemplateTypeTy, const DeclSpec &DS, SourceLocation IdLoc, Expr *Init, SourceLocation EllipsisLoc)
Handle a C++ member initializer.
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
void actOnDelayedExceptionSpecification(Decl *D, ExceptionSpecificationType EST, SourceRange SpecificationRange, ArrayRef< ParsedType > DynamicExceptions, ArrayRef< SourceRange > DynamicExceptionRanges, Expr *NoexceptExpr)
Add an exception-specification to the given member or friend function (or function template).
Scope * TUScope
Translation Unit Scope - useful to Objective-C actions that need to lookup file scope declarations in...
bool CheckDependentFriend(SourceLocation Loc, NestedNameSpecifierLoc NNSLoc, ArrayRef< TemplateParameterList * > TPLs, bool IsInstantiation)
void ActOnFields(Scope *S, SourceLocation RecLoc, Decl *TagDecl, ArrayRef< Decl * > Fields, SourceLocation LBrac, SourceLocation RBrac, const ParsedAttributesView &AttrList)
void CheckExplicitObjectLambda(Declarator &D)
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
void NoteDeletedInheritingConstructor(CXXConstructorDecl *CD)
void PopPragmaVisibility(bool IsNamespaceEnd, SourceLocation EndLoc)
PopPragmaVisibility - Pop the top element of the visibility stack; used for '#pragma GCC visibility' ...
Expr * MaybeCreateExprWithCleanups(Expr *SubExpr)
MaybeCreateExprWithCleanups - If the current full-expression requires any cleanups,...
void checkInitializerLifetime(const InitializedEntity &Entity, Expr *Init)
Check that the lifetime of the initializer (and its subobjects) is sufficient for initializing the en...
void CheckCompletedCXXClass(Scope *S, CXXRecordDecl *Record)
Perform semantic checks on a class definition that has been completing, introducing implicitly-declar...
void DiscardCleanupsInEvaluationContext()
void PushDeclContext(Scope *S, DeclContext *DC)
Set the current declaration context until it gets popped.
bool CheckEquivalentExceptionSpec(FunctionDecl *Old, FunctionDecl *New)
void mergeDeclAttributes(NamedDecl *New, Decl *Old, AvailabilityMergeKind AMK=AvailabilityMergeKind::Redeclaration)
mergeDeclAttributes - Copy attributes from the Old decl to the New one.
bool isDependentScopeSpecifier(const CXXScopeSpec &SS)
SourceManager & SourceMgr
bool CheckDestructor(CXXDestructorDecl *Destructor)
CheckDestructor - Checks a fully-formed destructor definition for well-formedness,...
NamedDecl * BuildUsingPackDecl(NamedDecl *InstantiatedFrom, ArrayRef< NamedDecl * > Expansions)
MemInitResult ActOnMemInitializer(Decl *ConstructorD, Scope *S, CXXScopeSpec &SS, IdentifierInfo *MemberOrBase, ParsedType TemplateTypeTy, const DeclSpec &DS, SourceLocation IdLoc, SourceLocation LParenLoc, ArrayRef< Expr * > Args, SourceLocation RParenLoc, SourceLocation EllipsisLoc)
Handle a C++ member initializer using parentheses syntax.
void SetDeclDeleted(Decl *dcl, SourceLocation DelLoc, StringLiteral *Message=nullptr)
ExprResult BuildCXXCtorDefaultInitExpr(SourceLocation Loc, FieldDecl *Field)
void ActOnStartDelayedCXXMethodDeclaration(Scope *S, Decl *Method)
ActOnStartDelayedCXXMethodDeclaration - We have completed parsing a top-level (non-nested) C++ class,...
DiagnosticsEngine & Diags
FullExprArg MakeFullDiscardedValueExpr(Expr *Arg)
TypeAwareAllocationMode ShouldUseTypeAwareOperatorNewOrDelete() const
CXXConstructorDecl * DeclareImplicitCopyConstructor(CXXRecordDecl *ClassDecl)
Declare the implicit copy constructor for the given class.
NamespaceDecl * getStdNamespace() const
llvm::SmallPtrSet< const CXXRecordDecl *, 8 > RecordDeclSetTy
void DeclareImplicitEqualityComparison(CXXRecordDecl *RD, FunctionDecl *Spaceship)
bool AttachBaseSpecifiers(CXXRecordDecl *Class, MutableArrayRef< CXXBaseSpecifier * > Bases)
Performs the actual work of attaching the given base class specifiers to a C++ class.
void ActOnCXXExitDeclInitializer(Scope *S, Decl *Dcl)
ActOnCXXExitDeclInitializer - Invoked after we are finished parsing an initializer for the declaratio...
static bool adjustContextForLocalExternDecl(DeclContext *&DC)
Adjust the DeclContext for a function or variable that might be a function-local external declaration...
SpecialMemberOverloadResult LookupSpecialMember(CXXRecordDecl *D, CXXSpecialMemberKind SM, bool ConstArg, bool VolatileArg, bool RValueThis, bool ConstThis, bool VolatileThis)
NamedDecl * ActOnTypedefNameDecl(Scope *S, DeclContext *DC, TypedefNameDecl *D, LookupResult &Previous, bool &Redeclaration)
ActOnTypedefNameDecl - Perform semantic checking for a declaration which declares a typedef-name,...
ExprResult ActOnIntegerConstant(SourceLocation Loc, int64_t Val)
Decl * ActOnEmptyDeclaration(Scope *S, const ParsedAttributesView &AttrList, SourceLocation SemiLoc)
Handle a C++11 empty-declaration and attribute-declaration.
friend class InitializationSequence
void diagnoseIgnoredQualifiers(unsigned DiagID, unsigned Quals, SourceLocation FallbackLoc, SourceLocation ConstQualLoc=SourceLocation(), SourceLocation VolatileQualLoc=SourceLocation(), SourceLocation RestrictQualLoc=SourceLocation(), SourceLocation AtomicQualLoc=SourceLocation(), SourceLocation UnalignedQualLoc=SourceLocation())
llvm::MapVector< NamedDecl *, SourceLocation > UndefinedButUsed
UndefinedInternals - all the used, undefined objects which require a definition in this translation u...
QualType CheckConstructorDeclarator(Declarator &D, QualType R, StorageClass &SC)
CheckConstructorDeclarator - Called by ActOnDeclarator to check the well-formedness of the constructo...
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 FilterLookupForScope(LookupResult &R, DeclContext *Ctx, Scope *S, bool ConsiderLinkage, bool AllowInlineNamespace)
Filters out lookup results that don't fall within the given scope as determined by isDeclInScope.
ExprResult ConvertMemberDefaultInitExpression(FieldDecl *FD, Expr *InitExpr, SourceLocation InitLoc)
bool IsInvalidSMECallConversion(QualType FromType, QualType ToType)
void checkIncorrectVTablePointerAuthenticationAttribute(CXXRecordDecl &RD)
Check that VTable Pointer authentication is only being set on the first first instantiation of the vt...
static Scope * getScopeForDeclContext(Scope *S, DeclContext *DC)
Finds the scope corresponding to the given decl context, if it happens to be an enclosing scope.
bool isUsualDeallocationFunction(const CXXMethodDecl *FD)
void DiagnoseDeletedDefaultedFunction(FunctionDecl *FD)
Produce notes explaining why a defaulted function was defined as deleted.
ExprResult BuildCXXNamedCast(SourceLocation OpLoc, tok::TokenKind Kind, TypeSourceInfo *Ty, Expr *E, SourceRange AngleBrackets, SourceRange Parens)
bool CheckOverridingFunctionExceptionSpec(const CXXMethodDecl *New, const CXXMethodDecl *Old)
CheckOverridingFunctionExceptionSpec - Checks whether the exception spec is a subset of base spec.
SmallVector< CXXRecordDecl *, 4 > DelayedDllExportClasses
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,...
bool CheckTemplateParameterList(TemplateParameterList *NewParams, TemplateParameterList *OldParams, TemplateParamListContext TPC, SkipBodyInfo *SkipBody=nullptr)
Checks the validity of a template parameter list, possibly considering the template parameter list fr...
bool CheckOverridingFunctionReturnType(const CXXMethodDecl *New, const CXXMethodDecl *Old)
CheckOverridingFunctionReturnType - Checks whether the return types are covariant,...
ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())
Attempts to produce a RecoveryExpr after some AST node cannot be created.
UnsignedOrNone GetDecompositionElementCount(QualType DecompType, SourceLocation Loc)
DeclResult CheckClassTemplate(Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, const ParsedAttributesView &Attr, TemplateParameterList *TemplateParams, AccessSpecifier AS, SourceLocation ModulePrivateLoc, SourceLocation FriendLoc, unsigned NumOuterTemplateParamLists, TemplateParameterList **OuterTemplateParamLists, bool IsMemberSpecialization, SkipBodyInfo *SkipBody=nullptr)
Decl * ActOnDeclarator(Scope *S, Declarator &D)
MSPropertyDecl * HandleMSProperty(Scope *S, RecordDecl *TagD, SourceLocation DeclStart, Declarator &D, Expr *BitfieldWidth, InClassInitStyle InitStyle, AccessSpecifier AS, const ParsedAttr &MSPropertyAttr)
HandleMSProperty - Analyze a __delcspec(property) field of a C++ class.
void UpdateExceptionSpec(FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI)
bool CheckRedeclarationInModule(NamedDecl *New, NamedDecl *Old)
A wrapper function for checking the semantic restrictions of a redeclaration within a module.
LazyDeclPtr StdAlignValT
The C++ "std::align_val_t" enum class, which is defined by the C++ standard library.
llvm::DenseMap< SpecialMemberCacheKey, SpecialMemberOverloadResult > SpecialMemberCache
A cache of special member function overload resolution results for C++ records.
DeclResult ActOnTemplatedFriendTag(Scope *S, SourceLocation FriendLoc, unsigned TagSpec, SourceLocation TagLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, SourceLocation EllipsisLoc, const ParsedAttributesView &Attr, MultiTemplateParamsArg TempParamLists, TemplateIdAnnotation *TemplateId)
Handle a friend tag declaration where the scope specifier was templated.
void ActOnPureSpecifier(Decl *D, SourceLocation PureSpecLoc)
@ CheckValid
Identify whether this function satisfies the formal rules for constexpr functions in the current lanu...
@ Diagnose
Diagnose issues that are non-constant or that are extensions.
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
void LoadExternalVTableUses()
Load any externally-stored vtable uses.
static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo=nullptr)
Decl * ActOnUsingDirective(Scope *CurScope, SourceLocation UsingLoc, SourceLocation NamespcLoc, CXXScopeSpec &SS, SourceLocation IdentLoc, IdentifierInfo *NamespcName, const ParsedAttributesView &AttrList)
StmtResult ActOnCompoundStmt(SourceLocation L, SourceLocation R, ArrayRef< Stmt * > Elts, bool isStmtExpr)
void HandleFunctionTypeMismatch(PartialDiagnostic &PDiag, QualType FromType, QualType ToType)
HandleFunctionTypeMismatch - Gives diagnostic information for differeing function types.
void ActOnStartTrailingRequiresClause(Scope *S, Declarator &D)
void FindHiddenVirtualMethods(CXXMethodDecl *MD, SmallVectorImpl< CXXMethodDecl * > &OverloadedMethods)
Check if a method overloads virtual methods in a base class without overriding any.
IdentifierResolver IdResolver
DeclContextLookupResult LookupConstructors(CXXRecordDecl *Class)
Look up the constructors for the given class.
void ActOnStartDelayedMemberDeclarations(Scope *S, Decl *Record)
TypeResult ActOnTagTemplateIdType(TagUseKind TUK, TypeSpecifierType TagSpec, SourceLocation TagLoc, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, TemplateTy TemplateD, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgsIn, SourceLocation RAngleLoc)
Parsed an elaborated-type-specifier that refers to a template-id, such as class T::template apply.
ExprResult ActOnCXXThis(SourceLocation Loc)
CXXConstructorDecl * findInheritingConstructor(SourceLocation Loc, CXXConstructorDecl *BaseCtor, ConstructorUsingShadowDecl *DerivedShadow)
Given a derived-class using shadow declaration for a constructor and the correspnding base class cons...
void warnOnReservedIdentifier(const NamedDecl *D)
bool CheckExplicitlyDefaultedSpecialMember(CXXMethodDecl *MD, CXXSpecialMemberKind CSM, SourceLocation DefaultLoc)
bool isCurrentClassNameTypo(IdentifierInfo *&II, const CXXScopeSpec *SS)
Determine whether the identifier II is a typo for the name of the class type currently being defined.
Decl * ActOnUsingDeclaration(Scope *CurScope, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation TypenameLoc, CXXScopeSpec &SS, UnqualifiedId &Name, SourceLocation EllipsisLoc, const ParsedAttributesView &AttrList)
void ActOnDelayedCXXMethodParameter(Scope *S, Decl *Param)
ActOnDelayedCXXMethodParameter - We've already started a delayed C++ method declaration.
bool isAbstractType(SourceLocation Loc, QualType T)
ValueDecl * tryLookupUnambiguousFieldDecl(RecordDecl *ClassDecl, const IdentifierInfo *MemberOrBase)
ASTMutationListener * getASTMutationListener() const
bool SetCtorInitializers(CXXConstructorDecl *Constructor, bool AnyErrors, ArrayRef< CXXCtorInitializer * > Initializers={})
void DiagnoseImmediateEscalatingReason(FunctionDecl *FD)
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
CXXDestructorDecl * DeclareImplicitDestructor(CXXRecordDecl *ClassDecl)
Declare the implicit destructor for the given class.
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 isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
static StaticAssertDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StaticAssertLoc, Expr *AssertExpr, Expr *Message, SourceLocation RParenLoc, bool Failed)
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
static bool isValidUDSuffix(const LangOptions &LangOpts, StringRef Suffix)
Determine whether a suffix is a valid ud-suffix.
StringLiteral - This represents a string literal expression, e.g.
bool isUnevaluated() const
StringRef getString() const
Represents the declaration of a struct/union/class/enum.
bool isBeingDefined() const
Return true if this decl is currently being defined.
StringRef getKindName() const
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
TagDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
TagKind getTagKind() const
bool isDependentType() const
Whether this declaration declares a type that is dependent, i.e., a type that somehow depends on temp...
void setElaboratedKeywordLoc(SourceLocation Loc)
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
A convenient class for passing around template argument information.
void addArgument(const TemplateArgumentLoc &Loc)
ArrayRef< TemplateArgumentLoc > arguments() const
Location wrapper for a TemplateArgument.
const TemplateArgument & getArgument() const
TypeSourceInfo * getTypeSourceInfo() const
Represents a template argument.
@ Type
The template argument is a type.
ArgKind getKind() const
Return the kind of stored template argument.
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
QualifiedTemplateName * getAsQualifiedTemplateName() const
Retrieve the underlying qualified template name structure, if any.
Stores a list of template parameters for a TemplateDecl and its derived classes.
NamedDecl * getParam(unsigned Idx)
SourceRange getSourceRange() const LLVM_READONLY
unsigned getDepth() const
Get the depth of this template parameter list in the set of template parameter lists.
unsigned getMinRequiredArguments() const
Returns the minimum number of arguments needed to form a template specialization.
static TemplateParameterList * Create(const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)
Expr * getRequiresClause()
The constraint-expression of the associated requires-clause.
SourceLocation getRAngleLoc() const
SourceLocation getLAngleLoc() const
static bool shouldIncludeTypeForArgument(const PrintingPolicy &Policy, const TemplateParameterList *TPL, unsigned Idx)
SourceLocation getTemplateLoc() const
unsigned getNumArgs() const
TemplateArgumentLoc getArgLoc(unsigned i) const
Declaration of a template type parameter.
unsigned getIndex() const
Retrieve the index of the template parameter.
unsigned getDepth() const
Retrieve the depth of the template parameter.
The top declaration context.
Represents the declaration of a typedef-name via a C++11 alias-declaration.
static TypeAliasDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)
void setDescribedAliasTemplate(TypeAliasTemplateDecl *TAT)
Declaration of an alias template.
static TypeAliasTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
Create a function template node.
TypeAliasDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
Represents a declaration of a type.
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.
QualType getType() const
Get the type for which this source info wrapper provides information.
TypeLoc getNextTypeLoc() const
Get the next TypeLoc pointed by this TypeLoc, e.g for "int*" the TypeLoc is a PointerLoc and next Typ...
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
NestedNameSpecifierLoc getPrefix() const
If this type represents a qualified-id, this returns it's nested name specifier.
TypeLoc IgnoreParens() const
T castAs() const
Convert to the specified TypeLoc type, asserting that this TypeLoc is of the desired type.
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
SourceRange getLocalSourceRange() const
Get the local source range.
TypeLocClass getTypeLocClass() const
SourceLocation getEndLoc() const
Get the end source location.
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 isBooleanType() const
const TemplateSpecializationType * getAsNonAliasTemplateSpecializationType() const
Look through sugar for an instance of TemplateSpecializationType which is not a type alias,...
bool isIncompleteArrayType() const
bool isUndeducedAutoType() const
bool isRValueReferenceType() const
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isPointerType() const
CanQualType getCanonicalTypeUnqualified() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isEnumeralType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
TagDecl * getAsTagDecl() const
Retrieves the TagDecl that this type refers to, either because the type is a TagType or because it is...
bool isLValueReferenceType() const
bool isSpecificBuiltinType(unsigned K) const
Test for a particular builtin type.
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
QualType getCanonicalTypeInternal() const
const Type * getBaseElementTypeUnsafe() const
Get the base element type of this type, potentially discarding type qualifiers.
bool isFunctionProtoType() const
bool isOverloadableType() const
Determines whether this is a type for which one can define an overloaded operator.
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
EnumDecl * getAsEnumDecl() const
Retrieves the EnumDecl this type refers to.
bool isFunctionType() const
bool isStructureOrClassType() const
bool isRealFloatingType() const
Floating point categories.
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
bool isUnsignedIntegerType() const
Return true if this is an integer type that is unsigned, according to C99 6.2.5p6 [which returns true...
const T * getAs() const
Member-template getAs<specific type>'.
bool isRecordType() const
Base class for declarations which introduce a typedef-name.
QualType getUnderlyingType() const
Wrapper for source info for typedefs.
Simple class containing the result of Sema::CorrectTypo.
NamedDecl * getCorrectionDecl() const
Gets the pointer to the declaration of the typo correction.
SourceRange getCorrectionRange() const
void WillReplaceSpecifier(bool ForceReplacement)
DeclClass * getCorrectionDeclAs() const
NestedNameSpecifier getCorrectionSpecifier() const
Gets the NestedNameSpecifier needed to use the typo correction.
NamedDecl * getFoundDecl() const
Get the correction declaration found by name lookup (before we looked through using shadow declaratio...
Expr * getSubExpr() const
static bool isIncrementDecrementOp(Opcode Op)
static UnaryOperator * Create(const ASTContext &C, Expr *input, Opcode opc, QualType type, ExprValueKind VK, ExprObjectKind OK, SourceLocation l, bool CanOverflow, FPOptionsOverride FPFeatures)
TypeLocClass getTypeLocClass() const
Represents a C++ unqualified-id that has been parsed.
UnionParsedType ConversionFunctionId
When Kind == IK_ConversionFunctionId, the type that the conversion function names.
SourceLocation getBeginLoc() const LLVM_READONLY
SourceRange getSourceRange() const LLVM_READONLY
Return the source range that covers this unqualified-id.
UnionParsedType DestructorName
When Kind == IK_DestructorName, the type referred to by the class-name.
SourceLocation StartLocation
The location of the first token that describes this unqualified-id, which will be the location of the...
UnionParsedTemplateTy TemplateName
When Kind == IK_DeductionGuideName, the parsed template-name.
const IdentifierInfo * Identifier
When Kind == IK_Identifier, the parsed identifier, or when Kind == IK_UserLiteralId,...
UnqualifiedIdKind getKind() const
Determine what kind of name we have.
TemplateIdAnnotation * TemplateId
When Kind == IK_TemplateId or IK_ConstructorTemplateId, the template-id annotation that contains the ...
static UnresolvedLookupExpr * Create(const ASTContext &Context, CXXRecordDecl *NamingClass, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool RequiresADL, UnresolvedSetIterator Begin, UnresolvedSetIterator End, bool KnownDependent, bool KnownInstantiationDependent)
A set of unresolved declarations.
ArrayRef< DeclAccessPair > pairs() const
The iterator over UnresolvedSets.
A set of unresolved declarations.
This node is generated when a using-declaration that was annotated with attribute((using_if_exists)) ...
static UnresolvedUsingIfExistsDecl * Create(ASTContext &Ctx, DeclContext *DC, SourceLocation Loc, DeclarationName Name)
Wrapper for source info for unresolved typename using decls.
static UnresolvedUsingTypenameDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, SourceLocation TypenameLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TargetNameLoc, DeclarationName TargetName, SourceLocation EllipsisLoc)
static UnresolvedUsingValueDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, SourceLocation EllipsisLoc)
Represents a C++ using-declaration.
bool hasTypename() const
Return true if the using declaration has 'typename'.
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name.
DeclarationNameInfo getNameInfo() const
static UsingDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingL, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool HasTypenameKeyword)
SourceLocation getUsingLoc() const
Return the source location of the 'using' keyword.
Represents C++ using-directive.
static UsingDirectiveDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, SourceLocation NamespaceLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc, NamedDecl *Nominated, DeclContext *CommonAncestor)
Represents a C++ using-enum-declaration.
static UsingEnumDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingL, SourceLocation EnumL, SourceLocation NameL, TypeSourceInfo *EnumType)
static UsingPackDecl * Create(ASTContext &C, DeclContext *DC, NamedDecl *InstantiatedFrom, ArrayRef< NamedDecl * > UsingDecls)
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
static UsingShadowDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation Loc, DeclarationName Name, BaseUsingDecl *Introducer, NamedDecl *Target)
NamedDecl * getTargetDecl() const
Gets the underlying declaration which has been brought into the local scope.
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
BaseUsingDecl * getIntroducer() const
Gets the (written or instantiated) using declaration that introduced this declaration.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
void setType(QualType newType)
bool isParameterPack() const
Determine whether this value is actually a function parameter pack, init-capture pack,...
Represents a variable declaration or definition.
VarTemplateDecl * getDescribedVarTemplate() const
Retrieves the variable template that is described by this variable declaration.
static VarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S)
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
DefinitionKind isThisDeclarationADefinition(ASTContext &) const
Check whether this declaration is a definition.
bool evaluateConstantDestruction(SmallVectorImpl< PartialDiagnosticAt > &Notes, SemaProxy &SProxy) const
Evaluate the destruction of a variable that is required by the language to have constant destruction.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool isNoDestroy(const ASTContext &) const
Is destruction of this variable entirely suppressed?
bool isInlineSpecified() const
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 isStaticLocal() const
Returns true if a variable with function scope is a static local variable.
QualType::DestructionKind needsDestruction(const ASTContext &Ctx) const
Would the destruction of this variable have any effect, and if so, what kind?
ThreadStorageClassSpecifier getTSCSpec() const
const Expr * getInit() const
const APValue * evaluateValue() const
Attempt to evaluate the value of the initializer attached to this declaration, and produce notes expl...
@ TLS_Dynamic
TLS with a dynamic initializer.
StorageClass getStorageClass() const
Returns the storage class as written in the source.
bool isUsableInConstantExpressions(const ASTContext &C) const
Determine whether this variable's value can be used in a constant expression, according to the releva...
void setExceptionVariable(bool EV)
Declaration of a variable template.
Represents a GCC generic vector type.
unsigned getNumElements() const
QualType getElementType() const
Represents a C++11 virt-specifier-seq.
SourceLocation getOverrideLoc() const
SourceLocation getLastLocation() const
bool isOverrideSpecified() const
SourceLocation getFinalLoc() const
bool isFinalSpecified() const
bool isFinalSpelledSealed() const
Retains information about a function, method, or block that is currently being parsed.
bool FoundImmediateEscalatingExpression
Whether we found an immediate-escalating expression.
Provides information about an attempted template argument deduction, whose success or failure was des...
Defines the clang::TargetInfo interface.
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
bool Comp(InterpState &S)
1) Pops the value from the stack.
bool Inc(InterpState &S, CodePtr OpPC, bool CanOverflow)
1) Pops a pointer from the stack 2) Load the value from the pointer 3) Writes the value increased by ...
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
Top level wrappers for InstallAPI frontend operations.
bool FTIHasNonVoidParameters(const DeclaratorChunk::FunctionTypeInfo &FTI)
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
TypeSpecifierType
Specifies the kind of type.
@ TST_typename_pack_indexing
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ OO_None
Not an overloaded operator.
@ NUM_OVERLOADED_OPERATORS
@ NonFunction
This is not an overload because the lookup results contain a non-function.
@ Match
This is not an overload because the signature exactly matches an existing declaration.
@ Overload
This is a legitimate overload: the existing declarations are functions or function templates with dif...
bool isa(CodeGen::Address addr)
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
MutableArrayRef< TemplateParameterList * > MultiTemplateParamsArg
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
@ OR_Deleted
Succeeded, but refers to a deleted function.
@ OR_Success
Overload resolution succeeded.
@ OR_Ambiguous
Ambiguous candidates found.
@ OR_No_Viable_Function
No viable function found.
ConstexprSpecKind
Define the kind of constexpr specifier.
LinkageSpecLanguageIDs
Represents the language in a linkage specification.
@ Ambiguous
Name lookup results in an ambiguity; use getAmbiguityKind to figure out what kind of ambiguity we hav...
@ NotFound
No entity found met the criteria.
@ FoundOverloaded
Name lookup found a set of overloaded functions that met the criteria.
@ Found
Name lookup found a single declaration that met the criteria.
@ FoundUnresolvedValue
Name lookup found an unresolvable value declaration and cannot yet complete.
@ NotFoundInCurrentInstantiation
No entity found met the criteria within the current instantiation,, but there were dependent base cla...
LLVM_READONLY auto escapeCStyle(CharT Ch) -> StringRef
Return C-style escaped string for special characters, or an empty string if there is no such mapping.
@ Comparison
A comparison.
InClassInitStyle
In-class initialization styles for non-static data members.
@ ICIS_ListInit
Direct list-initialization.
@ ICIS_NoInit
No in-class initializer.
@ RQ_None
No ref-qualifier was provided.
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
@ OCD_AmbiguousCandidates
Requests that only tied-for-best candidates be shown.
@ OCD_AllCandidates
Requests that all candidates be shown.
@ OK_Ordinary
An ordinary object is located at an address in memory.
@ Redeclaration
Merge availability attributes for a redeclaration, which requires an exact match.
std::pair< llvm::PointerUnion< const TemplateTypeParmType *, NamedDecl *, const TemplateSpecializationType *, const SubstBuiltinTemplatePackType * >, SourceLocation > UnexpandedParameterPack
@ If
'if' clause, allowed on all the Compute Constructs, Data Constructs, Executable Constructs,...
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
@ Delete
'delete' clause, allowed on the 'exit data' construct.
@ IK_DeductionGuideName
A deduction-guide name (a template-name)
@ IK_ImplicitSelfParam
An implicit 'self' parameter.
@ IK_TemplateId
A template-id, e.g., f<int>.
@ IK_ConstructorTemplateId
A constructor named via a template-id.
@ IK_ConstructorName
A constructor name.
@ IK_LiteralOperatorId
A user-defined literal name, e.g., operator "" _i.
@ IK_Identifier
An identifier.
@ IK_DestructorName
A destructor name.
@ IK_OperatorFunctionId
An overloaded operator name, e.g., operator+.
@ IK_ConversionFunctionId
A conversion function name, e.g., operator int.
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
std::optional< ComparisonCategoryType > getComparisonCategoryForBuiltinCmp(QualType T)
Get the comparison category that should be used when comparing values of type T.
ActionResult< Decl * > DeclResult
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
StorageClass
Storage classes.
ComparisonCategoryType commonComparisonType(ComparisonCategoryType A, ComparisonCategoryType B)
Determine the common comparison type, as defined in C++2a [class.spaceship]p4.
@ Dependent
Parse the block as a dependent block, which may be used in some template instantiations but not other...
ComparisonCategoryResult
An enumeration representing the possible results of a three-way comparison.
MutableArrayRef< Expr * > MultiExprArg
Language
The language for the input, used to select and validate the language standard and possible actions.
@ Default
Set to the current date and time.
@ Result
The result type of a method or function.
ActionResult< ParsedType > TypeResult
std::pair< unsigned, unsigned > getDepthAndIndex(const NamedDecl *ND)
Retrieve the depth and index of a template parameter.
InheritableAttr * getDLLAttr(Decl *D)
Return a DLL attribute from the declaration.
ActionResult< CXXCtorInitializer * > MemInitResult
OptionalUnsigned< unsigned > UnsignedOrNone
const FunctionProtoType * T
llvm::Expected< QualType > ExpectedType
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
@ Template
We are parsing a template declaration.
ActionResult< CXXBaseSpecifier * > BaseResult
void EscapeStringForDiagnostic(StringRef Str, SmallVectorImpl< char > &OutStr)
EscapeStringForDiagnostic - Append Str to the diagnostic buffer, escaping non-printable characters an...
ReservedLiteralSuffixIdStatus
TagTypeKind
The kind of a tag type.
@ Interface
The "__interface" keyword.
@ Struct
The "struct" keyword.
@ Class
The "class" keyword.
@ Keyword
The name has been typo-corrected to a keyword.
DefaultedComparisonKind
Kinds of defaulted comparison operator functions.
@ Relational
This is an <, <=, >, or >= that should be implemented as a rewrite in terms of a <=> comparison.
@ NotEqual
This is an operator!= that should be implemented as a rewrite in terms of a == comparison.
@ ThreeWay
This is an operator<=> that should be implemented as a series of subobject comparisons.
@ None
This is not a defaultable comparison operator.
@ Equal
This is an operator== that should be implemented as a series of subobject comparisons.
LangAS
Defines the address space values used by the address space qualifier of QualType.
@ CanPassInRegs
The argument of this type can be passed directly in registers.
@ CanNeverPassInRegs
The argument of this type cannot be passed directly in registers.
@ CannotPassInRegs
The argument of this type cannot be passed directly in registers.
@ TU_Prefix
The translation unit is a prefix to a translation unit, and is not complete.
ComparisonCategoryType
An enumeration representing the different comparison categories types.
MutableArrayRef< ParsedTemplateArgument > ASTTemplateArgsPtr
CXXSpecialMemberKind
Kinds of C++ special members.
OverloadedOperatorKind getRewrittenOverloadedOperator(OverloadedOperatorKind Kind)
Get the other overloaded operator that the given operator can be rewritten into, if any such operator...
@ TNK_Concept_template
The name refers to a concept.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
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.
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
DynamicRecursiveASTVisitorBase< false > DynamicRecursiveASTVisitor
@ ConsiderTrivialABI
The triviality of a method affected by "trivial_abi".
@ IgnoreTrivialABI
The triviality of a method unaffected by "trivial_abi".
@ Incomplete
Template argument deduction did not deduce a value for every template parameter.
@ Success
Template argument deduction was successful.
@ Inconsistent
Template argument deduction produced inconsistent deduced values for the given template parameter.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ 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.
TypeAwareAllocationMode typeAwareAllocationModeFromBool(bool IsTypeAwareAllocation)
U cast(CodeGen::Address addr)
@ StaticAssertMessageData
Call to data() in a static assert message.
@ StaticAssertMessageSize
Call to size() in a static assert message.
@ ExplicitBool
Condition in an explicit(bool) specifier.
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
@ None
No keyword precedes the qualified type name.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
bool isLambdaMethod(const DeclContext *DC)
bool isExternallyVisible(Linkage L)
ActionResult< Expr * > ExprResult
ExceptionSpecificationType
The various types of exception specifications that exist in C++11.
@ EST_DependentNoexcept
noexcept(expression), value-dependent
@ EST_Uninstantiated
not instantiated yet
@ EST_Unparsed
not parsed yet
@ EST_NoThrow
Microsoft __declspec(nothrow) extension.
@ EST_None
no exception specification
@ EST_MSAny
Microsoft throw(...) extension.
@ EST_BasicNoexcept
noexcept
@ EST_NoexceptFalse
noexcept(expression), evals to 'false'
@ EST_Unevaluated
not evaluated yet, for special member function
@ EST_NoexceptTrue
noexcept(expression), evals to 'true'
@ EST_Dynamic
throw(T1, T2)
ActionResult< Stmt * > StmtResult
@ NOUR_Unevaluated
This name appears in an unevaluated operand.
__builtin_bitreverse32 uint32_t __builtin_riscv_aaddu_u32 __builtin_riscv_asubu_u32 __builtin_elementwise_add_sat __builtin_elementwise_sub_sat int32_t uint32_t uint32_t __builtin_riscv_mhacc_i32 __builtin_riscv_mhaccu_u32 __builtin_riscv_mhaccsu_i32 __builtin_riscv_mulq_i32 int64_t
Represents an element in a path from a derived class to a base class.
bool hasValidIntValue() const
True iff we've successfully evaluated the variable as a constant expression and extracted its integer...
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 setNamedTypeInfo(TypeSourceInfo *TInfo)
setNamedTypeInfo - Sets the source type info associated to the name.
void setName(DeclarationName N)
setName - Sets the embedded declaration name.
SourceLocation getBeginLoc() const
getBeginLoc - Retrieve the location of the first token.
SourceRange getSourceRange() const LLVM_READONLY
getSourceRange - The range of the declaration name.
SourceLocation getEndLoc() const LLVM_READONLY
bool containsUnexpandedParameterPack() const
Determine whether this name contains an unexpanded parameter pack.
unsigned isVariadic
isVariadic - If this function has a prototype, and if that proto ends with ',...)',...
ParamInfo * Params
Params - This is a pointer to a new[]'d array of ParamInfo objects that describe the parameters speci...
unsigned RefQualifierIsLValueRef
Whether the ref-qualifier (if any) is an lvalue reference.
DeclSpec * MethodQualifiers
DeclSpec for the function with the qualifier related info.
SourceLocation getRefQualifierLoc() const
Retrieve the location of the ref-qualifier, if any.
unsigned NumParams
NumParams - This is the number of formal parameters specified by the declarator.
bool hasMutableQualifier() const
Determine whether this lambda-declarator contains a 'mutable' qualifier.
bool hasMethodTypeQualifiers() const
Determine whether this method has qualifiers.
void freeParams()
Reset the parameter list to having zero parameters.
bool hasRefQualifier() const
Determine whether this function declaration contains a ref-qualifier.
std::unique_ptr< CachedTokens > DefaultArgTokens
DefaultArgTokens - When the parameter's default argument cannot be parsed immediately (because it occ...
unsigned TypeQuals
The type qualifiers: const/volatile/restrict/unaligned/atomic.
One instance of this struct is used for each type in a declarator that is parsed.
SourceRange getSourceRange() const
enum clang::DeclaratorChunk::@340323374315200305336204205154073066142310370142 Kind
EvalResult is a struct with detailed info about an evaluated expression.
A simple structure that captures a vtable use for the purposes of the ExternalSemaSource.
Holds information about the various types of exception specification.
FunctionDecl * SourceDecl
The function whose exception specification this is, for EST_Unevaluated and EST_Uninstantiated.
ExceptionSpecificationType Type
The kind of exception specification this is.
ArrayRef< QualType > Exceptions
Explicitly-specified list of exception types.
Expr * NoexceptExpr
Noexcept expression, if this is a computed noexcept specification.
Extra information about a function prototype.
ExceptionSpecInfo ExceptionSpec
FunctionEffectsRef FunctionEffects
RefQualifierKind RefQualifier
FunctionType::ExtInfo ExtInfo
static StringRef getTagTypeKindName(TagTypeKind Kind)
static ElaboratedTypeKeyword getKeywordForTagTypeKind(TagTypeKind Tag)
Converts a TagTypeKind into an elaborated type keyword.
static TagTypeKind getTagTypeKindForTypeSpec(unsigned TypeSpec)
Converts a type specifier (DeclSpec::TST) into a tag type kind.
Describes how types, statements, expressions, and declarations should be printed.
A context in which code is being synthesized (where a source location alone is not sufficient to iden...
enum clang::Sema::CodeSynthesisContext::SynthesisKind Kind
SourceLocation PointOfInstantiation
The point of instantiation or synthesis within the source code.
@ MarkingClassDllexported
We are marking a class as __dllexport.
@ InitializingStructuredBinding
We are initializing a structured binding.
@ ExceptionSpecEvaluation
We are computing the exception specification for a defaulted special member function.
@ DeclaringImplicitEqualityComparison
We are declaring an implicit 'operator==' for a defaulted 'operator<=>'.
Decl * Entity
The entity that is being synthesized.
Abstract class used to diagnose incomplete types.
virtual void diagnose(Sema &S, SourceLocation Loc, QualType T)=0
Information about a template-id annotation token.
TemplateNameKind Kind
The kind of template that Template refers to.
unsigned NumArgs
NumArgs - The number of template arguments.
SourceLocation TemplateNameLoc
TemplateNameLoc - The location of the template name within the source.
ParsedTemplateArgument * getTemplateArgs()
Retrieves a pointer to the template arguments.
SourceLocation RAngleLoc
The location of the '>' after the template argument list.
SourceLocation LAngleLoc
The location of the '<' before the template argument list.
SourceLocation TemplateKWLoc
TemplateKWLoc - The location of the template keyword.
ParsedTemplateTy Template
The declaration of the template corresponding to the template-name.
OpaquePtr< T > get() const