51#include "llvm/ADT/ArrayRef.h"
52#include "llvm/ADT/STLExtras.h"
53#include "llvm/ADT/StringExtras.h"
54#include "llvm/Support/ConvertUTF.h"
55#include "llvm/Support/SaveAndRestore.h"
72class CheckDefaultArgumentVisitor
75 const Expr *DefaultArg;
78 CheckDefaultArgumentVisitor(Sema &S,
const Expr *DefaultArg)
79 : S(S), DefaultArg(DefaultArg) {}
81 bool VisitExpr(
const Expr *Node);
82 bool VisitDeclRefExpr(
const DeclRefExpr *DRE);
83 bool VisitCXXThisExpr(
const CXXThisExpr *ThisE);
84 bool VisitLambdaExpr(
const LambdaExpr *Lambda);
85 bool VisitPseudoObjectExpr(
const PseudoObjectExpr *POE);
86 bool VisitCoawaitExpr(
const CoawaitExpr *E);
87 bool VisitCoyieldExpr(
const CoyieldExpr *E);
91bool CheckDefaultArgumentVisitor::VisitExpr(
const Expr *Node) {
92 bool IsInvalid =
false;
93 for (
const Stmt *SubStmt : Node->
children())
95 IsInvalid |= Visit(SubStmt);
102bool CheckDefaultArgumentVisitor::VisitDeclRefExpr(
const DeclRefExpr *DRE) {
108 if (
const auto *Param = dyn_cast<ParmVarDecl>(Decl)) {
119 diag::err_param_default_argument_references_param)
121 }
else if (
auto *VD =
Decl->getPotentiallyDecomposedVarDecl()) {
136 diag::err_param_default_argument_references_local)
143bool CheckDefaultArgumentVisitor::VisitCXXThisExpr(
const CXXThisExpr *ThisE) {
148 diag::err_param_default_argument_references_this)
152bool CheckDefaultArgumentVisitor::VisitPseudoObjectExpr(
153 const PseudoObjectExpr *POE) {
157 if (
const auto *OVE = dyn_cast<OpaqueValueExpr>(E)) {
158 E = OVE->getSourceExpr();
159 assert(E &&
"pseudo-object binding without source expression?");
167bool CheckDefaultArgumentVisitor::VisitLambdaExpr(
const LambdaExpr *Lambda) {
174 for (
const LambdaCapture &LC : Lambda->
captures()) {
176 return S.
Diag(LC.getLocation(), diag::err_lambda_capture_default_arg);
179 Invalid |= Visit(D->getInit());
184bool CheckDefaultArgumentVisitor::VisitCoawaitExpr(
const CoawaitExpr *E) {
194bool CheckDefaultArgumentVisitor::VisitCoyieldExpr(
const CoyieldExpr *E) {
211 Proto = Self->ResolveExceptionSpec(CallLoc, Proto);
228 llvm_unreachable(
"should not see unresolved exception specs here");
257 "should not generate implicit declarations for dependent cases");
261 assert(EST ==
EST_Dynamic &&
"EST case not considered earlier.");
263 "Shouldn't collect exceptions when throw-all is guaranteed.");
267 if (ExceptionsSeen.insert(Self->Context.getCanonicalType(E)).second)
268 Exceptions.push_back(E);
296 if (Self->canThrow(S))
303 diag::err_typecheck_decl_incomplete_type))
322 CheckCompletedExpr(Arg, EqualLoc);
331 Param->setDefaultArg(Arg);
335 UnparsedDefaultArgInstantiationsMap::iterator InstPos
338 for (
auto &Instantiation : InstPos->second)
339 Instantiation->setUninstantiatedDefaultArg(Arg);
349 if (!param || !DefaultArg)
357 Diag(EqualLoc, diag::err_param_default_argument)
371 if (Param->isParameterPack()) {
372 Diag(EqualLoc, diag::err_param_default_argument_on_parameter_pack)
375 Param->setDefaultArg(
nullptr);
390 CheckDefaultArgumentVisitor DefaultArgChecker(*
this, DefaultArg);
391 if (DefaultArgChecker.Visit(DefaultArg))
404 Param->setUnparsedDefaultArg();
414 Param->setInvalidDecl();
419 Param->getType().getNonReferenceType());
422 Param->getType().getNonReferenceType());
424 Param->setDefaultArg(RE.
get());
439 if (MightBeFunction) {
443 MightBeFunction =
false;
446 for (
unsigned argIdx = 0, e = chunk.
Fun.
NumParams; argIdx != e;
449 if (Param->hasUnparsedDefaultArg()) {
450 std::unique_ptr<CachedTokens> Toks =
453 if (Toks->size() > 1)
455 Toks->back().getLocation());
458 Diag(Param->getLocation(), diag::err_param_default_argument_nonfunc)
460 }
else if (Param->getDefaultArg()) {
461 Diag(Param->getLocation(), diag::err_param_default_argument_nonfunc)
462 << Param->getDefaultArg()->getSourceRange();
463 Param->setDefaultArg(
nullptr);
467 MightBeFunction =
false;
474 return P->hasDefaultArg() && !P->hasInheritedDefaultArg();
486 ?
New->getLexicalDeclContext()
487 :
New->getDeclContext();
491 for (; PrevForDefaultArgs;
494 PrevForDefaultArgs =
New->isLocalExternDecl()
502 !
New->isCXXClassMember()) {
547 for (
unsigned p = 0, NumParams = PrevForDefaultArgs
550 p < NumParams; ++p) {
554 bool OldParamHasDfl = OldParam ? OldParam->
hasDefaultArg() :
false;
557 if (OldParamHasDfl && NewParamHasDfl) {
558 unsigned DiagDefaultParamID =
559 diag::err_param_default_argument_redefinition;
574 DiagDefaultParamID = diag::ext_param_default_argument_redefinition;
592 for (
auto Older = PrevForDefaultArgs;
594 Older = Older->getPreviousDecl();
595 OldParam = Older->getParamDecl(p);
600 }
else if (OldParamHasDfl) {
606 !
New->getLexicalDeclContext()->isDependentContext()) {
618 }
else if (NewParamHasDfl) {
619 if (
New->getDescribedFunctionTemplate()) {
622 diag::err_param_default_argument_template_redecl)
625 diag::note_template_prev_declaration)
627 }
else if (
New->getTemplateSpecializationKind()
641 <<
New->getDeclName()
643 }
else if (
New->getDeclContext()
644 ->getEnclosingNonExpansionStatementContext()
645 ->isDependentContext()) {
657 = dyn_cast<CXXRecordDecl>(
New->getDeclContext())) {
658 if (
Record->getDescribedClassTemplate())
667 diag::err_param_default_argument_member_template_redecl)
683 if (NewSM != OldSM) {
684 auto It = llvm::find_if(
New->parameters(), [](
const ParmVarDecl *P) {
685 return P->hasDefaultArg();
687 assert(It !=
New->param_end());
689 Diag(NewParam->
getLocation(), diag::err_default_arg_makes_ctor_special)
700 Diag(
New->getLocation(), diag::err_constexpr_redecl_mismatch)
710 (
New->isInlineSpecified() ||
715 Diag(
New->getLocation(), diag::err_inline_decl_follows_def) <<
New;
725 !
New->isFunctionTemplateSpecialization() &&
isVisible(Old)) {
726 Diag(
New->getLocation(), diag::err_deduction_guide_redeclared);
736 Diag(
New->getLocation(), diag::err_friend_decl_with_def_arg_redeclared);
748 if (
New->isThisDeclarationInstantiatedFromAFriendDefinition() &&
756 DiagCompat(Loc, diag_compat::placeholder_var_definition);
774 if (!TemplateParamLists.empty()) {
780 Diag(TemplateParamLists.front()->getTemplateLoc(),
781 diag::err_decomp_decl_template);
787 DiagID = diag::compat_pre_cxx17_decomp_decl;
790 ? diag::compat_cxx26_decomp_decl_cond
791 : diag::compat_pre_cxx26_decomp_decl_cond;
793 DiagID = diag::compat_cxx17_decomp_decl;
814 Diag(Loc, diag::err_decomp_decl_spec) << Name;
817 auto DiagCpp20Specifier = [&](StringRef Name,
SourceLocation Loc) {
818 DiagCompat(Loc, diag_compat::decomp_decl_spec) << Name;
821 if (
auto SCS = DS.getStorageClassSpec()) {
824 DS.getStorageClassSpecLoc());
827 DS.getStorageClassSpecLoc());
829 if (
auto TSCS = DS.getThreadStorageClassSpec())
831 DS.getThreadStorageClassSpecLoc());
833 if (DS.isInlineSpecified())
834 DiagBadSpecifier(
"inline", DS.getInlineSpecLoc());
841 DS.getConstexprSpecLoc());
852 Diag(DS.getVolatileSpecLoc(),
853 diag::warn_deprecated_volatile_structured_binding);
873 ? diag::err_decomp_decl_parens
874 : diag::err_decomp_decl_type)
880 if (R->isFunctionType())
885 if (DS.isConstrainedAuto()) {
888 "No other template kind should be possible for a constrained auto");
906 assert(VarName &&
"Cannot have an unnamed binding declaration");
915 Previous.getFoundDecl()->isTemplateParameter()) {
921 if (B.EllipsisLoc.isValid()) {
923 Diag(B.EllipsisLoc, diag::err_pack_outside_template);
924 QT =
Context.getPackExpansionType(
Context.DependentTy, std::nullopt,
930 if (BD->isParameterPack()) {
932 CSI->LocalPacks.push_back(BD);
961 auto *Old =
Previous.getRepresentativeDecl();
962 Diag(B.NameLoc, diag::err_redefinition) << B.Name;
963 Diag(Old->getLocation(), diag::note_previous_definition);
981 bool AddToScope =
true;
990 if (
OpenMP().isInOpenMPDeclareTargetContext())
991 OpenMP().checkDeclIsAllowedInOpenMPTarget(
nullptr,
New);
1001 unsigned MemberCount) {
1002 auto BindingWithPackItr = llvm::find_if(
1004 bool HasPack = BindingWithPackItr !=
Bindings.end();
1007 IsValid =
Bindings.size() == MemberCount;
1010 IsValid = MemberCount >=
Bindings.size() - 1;
1013 if (IsValid && HasPack) {
1015 unsigned PackSize = MemberCount -
Bindings.size() + 1;
1021 for (
unsigned I = 0; I < PackSize; ++I) {
1026 NestedBDs[I] = NestedBD;
1039 S.
Diag(DD->
getLocation(), diag::err_decomp_decl_wrong_number_bindings)
1041 << (MemberCount <
Bindings.size());
1056 for (
auto *B : DD->flat_bindings()) {
1061 E = GetInit(Loc, E.
get(), I++);
1064 B->setBinding(ElemType, E.
get());
1073 const llvm::APSInt &NumElems,
1076 S,
Bindings, Src, DecompType, NumElems, ElemType,
1107 S,
Bindings, Src, DecompType, llvm::APSInt::get(2),
1111 return S.CreateBuiltinUnaryOp(Loc, I ? UO_Imag : UO_Real, Base);
1119 llvm::raw_svector_ostream OS(SS);
1131 return std::string(OS.str());
1136 auto DiagnoseMissing = [&] {
1146 return DiagnoseMissing();
1156 return DiagnoseMissing();
1157 if (
Result.isAmbiguous())
1162 Result.suppressDiagnostics();
1164 S.
Diag(Loc, diag::err_std_type_trait_not_class_template) << Trait;
1165 S.
Diag(
Found->getLocation(), diag::note_declared_at);
1179 Loc, TraitTy, DiagID,
1189 assert(RD &&
"specialization of class template is not a class?");
1194static TemplateArgumentLoc
1201static TemplateArgumentLoc
1206namespace {
enum class IsTupleLike { TupleLike, NotTupleLike, Error }; }
1209 unsigned &OutSize) {
1219 return IsTupleLike::NotTupleLike;
1227 return IsTupleLike::NotTupleLike;
1236 : R(R), Args(Args) {}
1239 return S.
Diag(Loc, diag::err_decomp_decl_std_tuple_size_not_constant)
1243 } Diagnoser(R, Args);
1248 return IsTupleLike::Error;
1253 return IsTupleLike::Error;
1257 if (Size < 0 || Size >=
UINT_MAX) {
1260 S.
Diag(Loc, diag::err_decomp_decl_std_tuple_size_invalid)
1263 << StringRef(Str.data(), Str.size());
1264 return IsTupleLike::Error;
1267 OutSize = Size.getExtValue();
1268 return IsTupleLike::TupleLike;
1282 diag::err_decomp_decl_std_tuple_element_not_specialized);
1291 auto *TD = R.getAsSingle<
TypeDecl>();
1293 R.suppressDiagnostics();
1294 S.
Diag(Loc, diag::err_decomp_decl_std_tuple_element_not_specialized)
1298 S.
Diag(R.getRepresentativeDecl()->getLocation(), diag::note_declared_at);
1307struct InitializingBinding {
1309 InitializingBinding(Sema &S, BindingDecl *BD) : S(S) {
1310 Sema::CodeSynthesisContext Ctx;
1316 ~InitializingBinding() {
1325 unsigned NumElems) {
1339 bool UseMemberGet =
false;
1349 dyn_cast<FunctionTemplateDecl>(D->getUnderlyingDecl())) {
1351 if (TPL->
size() != 0 &&
1354 UseMemberGet =
true;
1362 for (
auto *B : DD->flat_bindings()) {
1363 InitializingBinding InitContext(S, B);
1386 MemberGet, &Args,
nullptr);
1428 B->getDeclName().getAsIdentifierInfo(),
U,
1433 if (
const auto *CIAttr = Src->
getAttr<ConstInitAttr>())
1434 BindingVD->addAttr(CIAttr->clone(S.
Context));
1435 BindingVD->setImplicit();
1437 BindingVD->setInlineSpecified();
1438 BindingVD->getLexicalDeclContext()->addHiddenDecl(BindingVD);
1443 E =
Seq.Perform(S, Entity, Kind,
Init);
1449 BindingVD->setInit(E.
get());
1457 B->setBinding(
T, E.
get());
1472 return Specifier->getType()->getAsCXXRecordDecl()->hasDirectFields();
1481 ClassWithFields = RD;
1493 for (
auto &P : Paths) {
1497 BestPath->back().Base->getType())) {
1499 S.
Diag(Loc, diag::err_decomp_decl_multiple_bases_with_members)
1500 <<
false << RD << BestPath->back().Base->getType()
1501 << P.back().Base->getType();
1503 }
else if (P.Access < BestPath->
Access) {
1509 QualType BaseType = BestPath->back().Base->getType();
1511 S.
Diag(Loc, diag::err_decomp_decl_ambiguous_base)
1518 *BestPath, diag::err_decomp_decl_inaccessible_base);
1521 ClassWithFields = BaseType->getAsCXXRecordDecl();
1529 S.
Diag(Loc, diag::err_decomp_decl_multiple_bases_with_members)
1530 << (ClassWithFields == RD) << RD << ClassWithFields
1531 << Paths.
front().back().Base->getType();
1542 const auto *RD = cast_or_null<CXXRecordDecl>(BasePair.
getDecl());
1546 for (
auto *FD : RD->fields()) {
1547 if (FD->isUnnamedBitField())
1552 if (!FD->getDeclName()) {
1553 if (RD->isLambda()) {
1554 S.
Diag(Loc, diag::err_decomp_decl_lambda);
1555 S.
Diag(RD->getLocation(), diag::note_lambda_decl);
1559 if (FD->isAnonymousStructOrUnion()) {
1560 S.
Diag(Loc, diag::err_decomp_decl_anon_union_member)
1562 S.
Diag(FD->getLocation(), diag::note_declared_at);
1575 BasePair.
getAccess(), FD->getAccess())));
1584 diag::err_incomplete_type))
1590 const auto *RD = cast_or_null<CXXRecordDecl>(BasePair.
getDecl());
1597 unsigned NumFields = llvm::count_if(
1598 RD->fields(), [](
FieldDecl *FD) { return !FD->isUnnamedBitField(); });
1605 auto FlatBindings = DD->flat_bindings();
1606 assert(llvm::range_size(FlatBindings) == NumFields);
1607 auto FlatBindingsItr = FlatBindings.begin();
1613 for (
auto *FD : RD->fields()) {
1618 assert(FlatBindingsItr != FlatBindings.end());
1660 if (B->getType().isNull())
1661 B->setType(
Context.DependentTy);
1673 if (
auto *CAT =
Context.getAsConstantArrayType(DecompType)) {
1694 case IsTupleLike::Error:
1698 case IsTupleLike::TupleLike:
1703 case IsTupleLike::NotTupleLike:
1712 << DD << !RD << DecompType;
1727 assert(!
T->isDependentType());
1732 T =
Context.getQualifiedType(Unqual, Quals);
1735 return static_cast<unsigned>(CAT->getSize().getZExtValue());
1737 return VT->getNumElements();
1743 case IsTupleLike::Error:
1744 return std::nullopt;
1745 case IsTupleLike::TupleLike:
1747 case IsTupleLike::NotTupleLike:
1752 if (!OrigRD || OrigRD->
isUnion())
1753 return std::nullopt;
1756 return std::nullopt;
1761 const auto *RD = cast_or_null<CXXRecordDecl>(BasePair.
getDecl());
1763 return std::nullopt;
1765 unsigned NumFields = llvm::count_if(
1766 RD->fields(), [](
FieldDecl *FD) { return !FD->isUnnamedBitField(); });
1769 return std::nullopt;
1780 "Should only be called if types are otherwise the same.");
1788 NewType = R->getPointeeType();
1807 New->setInvalidDecl();
1821 if (FTD->isMemberSpecialization())
1830 if (Param->hasDefaultArg())
1841 if (Param->hasDefaultArg() || Param->isParameterPack() ||
1845 if (Param->isInvalidDecl())
1847 else if (Param->getIdentifier())
1848 Diag(Param->getLocation(), diag::err_param_default_argument_missing_name)
1849 << Param->getIdentifier();
1851 Diag(Param->getLocation(), diag::err_param_default_argument_missing);
1858template <
typename... Ts>
1862 if (
T->isDependentType())
1868 std::forward<Ts>(DiagArgs)...);
1871 return !
T->isLiteralType(SemaRef.
Context);
1874 llvm_unreachable(
"unknown CheckConstexprKind");
1882 "this check is obsolete for C++23");
1885 T->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
1893 SemaRef.
Diag(Loc, diag::note_constexpr_dtor_subobject)
1901 if (!Check(B.getBaseTypeLoc(), B.getType(),
nullptr))
1904 if (!Check(FD->getLocation(), FD->getType(), FD))
1915 "this check is obsolete for C++23");
1916 unsigned ArgIndex = 0;
1919 e = FT->param_type_end();
1920 i != e; ++i, ++ArgIndex) {
1922 assert(PD &&
"null in a parameter list");
1925 diag::err_constexpr_non_literal_param, ArgIndex + 1,
1938 "this check is obsolete for C++23");
1940 diag::err_constexpr_non_literal_return,
1959 default: llvm_unreachable(
"Invalid tag kind for record diagnostic!");
1987 for (
const auto &I : RD->
vbases())
1988 Diag(I.getBeginLoc(), diag::note_constexpr_virtual_base_here)
1989 << I.getSourceRange();
2003 Diag(
Method->getLocation(), diag::warn_cxx17_compat_constexpr_virtual);
2009 Diag(
Method->getLocation(), diag::err_constexpr_virtual);
2016 if (WrittenVirtual !=
Method)
2018 diag::note_overridden_virtual_function);
2029 if (
auto *Dtor = dyn_cast<CXXDestructorDecl>(NewFD)) {
2034 !Dtor->getParent()->defaultedDestructorIsConstexpr()) {
2049 "CheckConstexprFunctionDefinition called on function with no body");
2064 for (
const auto *DclIt : DS->
decls()) {
2065 switch (DclIt->getKind()) {
2066 case Decl::StaticAssert:
2068 case Decl::UsingShadow:
2069 case Decl::UsingDirective:
2070 case Decl::UnresolvedUsingTypename:
2071 case Decl::UnresolvedUsingValue:
2072 case Decl::UsingEnum:
2080 case Decl::TypeAlias: {
2084 if (TN->getUnderlyingType()->isVariablyModifiedType()) {
2087 TypeLoc TL = TN->getTypeSourceInfo()->getTypeLoc();
2098 case Decl::CXXRecord:
2103 diag_compat::constexpr_type_definition)
2111 case Decl::EnumConstant:
2112 case Decl::IndirectField:
2119 case Decl::Decomposition: {
2125 if (VD->isThisDeclarationADefinition()) {
2126 if (VD->isStaticLocal()) {
2129 diag_compat::constexpr_static_var)
2136 if (SemaRef.
LangOpts.CPlusPlus23) {
2138 diag::warn_cxx20_compat_constexpr_var,
2141 SemaRef, Kind, VD->getLocation(), VD->getType(),
2142 diag::err_constexpr_local_var_non_literal_type,
2146 if (!VD->getType()->isDependentType() &&
2147 !VD->hasInit() && !VD->isCXXForRangeDecl()) {
2150 diag_compat::constexpr_local_var_no_init)
2159 SemaRef.
DiagCompat(VD->getLocation(), diag_compat::constexpr_local_var)
2167 case Decl::NamespaceAlias:
2168 case Decl::Function:
2177 SemaRef.
Diag(DS->
getBeginLoc(), diag::err_constexpr_body_invalid_stmt)
2211 if (Field->isInvalidDecl())
2214 if (Field->isUnnamedBitField())
2220 if (Field->isAnonymousStructOrUnion() &&
2221 (Field->getType()->isUnionType()
2222 ? !Field->getType()->getAsCXXRecordDecl()->hasVariantMembers()
2223 : Field->getType()->getAsCXXRecordDecl()->isEmpty()))
2226 if (!
Inits.count(Field)) {
2230 diag_compat::constexpr_ctor_missing_init);
2233 SemaRef.
Diag(Field->getLocation(),
2234 diag::note_constexpr_ctor_missing_init);
2238 }
else if (Field->isAnonymousStructOrUnion()) {
2239 const auto *RD = Field->getType()->castAsRecordDecl();
2240 for (
auto *I : RD->fields())
2243 if (!RD->isUnion() ||
Inits.count(I))
2261 case Stmt::NullStmtClass:
2265 case Stmt::DeclStmtClass: {
2270 if (DS->isSingleDecl()) {
2271 if (
auto *ESD = dyn_cast<CXXExpansionStmtDecl>(DS->getSingleDecl())) {
2273 if (!ESD->getInstantiations())
2275 for (
auto *BodyIt : ESD->getInstantiations()->getInstantiations()) {
2277 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2294 case Stmt::ReturnStmtClass:
2306 case Stmt::AttributedStmtClass:
2311 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind);
2313 case Stmt::CompoundStmtClass: {
2319 for (
auto *BodyIt : CompStmt->
body()) {
2321 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2327 case Stmt::IfStmtClass: {
2334 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2336 if (
If->getElse() &&
2338 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2343 case Stmt::WhileStmtClass:
2344 case Stmt::DoStmtClass:
2345 case Stmt::ForStmtClass:
2346 case Stmt::CXXForRangeStmtClass:
2347 case Stmt::ContinueStmtClass:
2357 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2362 case Stmt::SwitchStmtClass:
2363 case Stmt::CaseStmtClass:
2364 case Stmt::DefaultStmtClass:
2365 case Stmt::BreakStmtClass:
2373 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2378 case Stmt::LabelStmtClass:
2379 case Stmt::GotoStmtClass:
2380 case Stmt::IndirectGotoStmtClass:
2386 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2391 case Stmt::GCCAsmStmtClass:
2392 case Stmt::MSAsmStmtClass:
2394 case Stmt::CXXTryStmtClass:
2400 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2405 case Stmt::CXXCatchStmtClass:
2410 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2462 diag_compat::constexpr_function_try_block)
2477 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2488 }
else if (Cxx2bLoc.
isValid()) {
2489 SemaRef.
DiagCompat(Cxx2bLoc, diag_compat::cxx23_constexpr_body_invalid_stmt)
2491 }
else if (Cxx2aLoc.
isValid()) {
2492 SemaRef.
DiagCompat(Cxx2aLoc, diag_compat::cxx20_constexpr_body_invalid_stmt)
2494 }
else if (Cxx1yLoc.
isValid()) {
2495 SemaRef.
DiagCompat(Cxx1yLoc, diag_compat::cxx14_constexpr_body_invalid_stmt)
2500 = dyn_cast<CXXConstructorDecl>(Dcl)) {
2513 diag_compat::constexpr_union_ctor_no_init);
2522 bool AnyAnonStructUnionMembers =
false;
2523 unsigned Fields = 0;
2525 E = RD->
field_end(); I != E; ++I, ++Fields) {
2526 if (I->isAnonymousStructOrUnion()) {
2527 AnyAnonStructUnionMembers =
true;
2535 if (AnyAnonStructUnionMembers ||
2545 Inits.insert(ID->chain_begin(), ID->chain_end());
2548 bool Diagnosed =
false;
2549 for (
auto *I : RD->
fields())
2556 if (ReturnStmts.empty()) {
2571 }
else if (ReturnStmts.size() > 1) {
2575 diag_compat::constexpr_body_multiple_return);
2576 for (
unsigned I = 0; I < ReturnStmts.size() - 1; ++I)
2577 SemaRef.
Diag(ReturnStmts[I],
2578 diag::note_constexpr_body_previous_return);
2606 !SemaRef.
getLangOpts().CheckConstexprFunctionBodies ||
2609 diag::ext_constexpr_function_never_constant_expr, Dcl->
getLocation());
2614 diag::ext_constexpr_function_never_constant_expr)
2617 for (
const auto &
Diag : Diags)
2633 if (SemaRef.
getLangOpts().CPlusPlus23 && !IsVoidOrDependentType)
2640 bool OK = SemaRef.
getLangOpts().CPlusPlus14 && IsVoidOrDependentType;
2642 OK ? diag::warn_cxx11_compat_constexpr_body_no_return
2643 : diag::err_constexpr_body_no_return)
2657 Diag(it->second, diag::err_immediate_function_used_before_definition)
2670 "expected an immediate function");
2671 assert(FD->
hasBody() &&
"expected the function to have a body");
2676 bool ImmediateFnIsConstructor;
2683 ShouldVisitImplicitCode =
true;
2684 ShouldVisitLambdaBody =
false;
2690 if (CurrentConstructor && CurrentInit) {
2698 SemaRef.Diag(Loc, diag::note_immediate_function_reason)
2699 << ImmediateFn << Fn << Fn->isConsteval() << IsCall
2701 << (InitializedField !=
nullptr)
2702 << (CurrentInit && !CurrentInit->
isWritten())
2703 << InitializedField << Range;
2705 bool TraverseCallExpr(
CallExpr *E)
override {
2706 if (
const auto *DR =
2708 DR && DR->isImmediateEscalating()) {
2714 if (!TraverseStmt(A))
2721 if (
const auto *ReferencedFn = dyn_cast<FunctionDecl>(E->
getDecl());
2723 Diag(E, ReferencedFn,
false);
2746 return DynamicRecursiveASTVisitor::TraverseCXXConstructorDecl(Ctr);
2749 bool TraverseType(
QualType T,
bool TraverseQualifier)
override {
2752 bool VisitBlockExpr(
BlockExpr *
T)
override {
return true; }
2754 } Visitor(*
this, FD);
2755 Visitor.TraverseDecl(FD);
2766 return dyn_cast_or_null<CXXRecordDecl>(DC);
2769 return dyn_cast_or_null<CXXRecordDecl>(
CurContext);
2787 CurDecl = dyn_cast_or_null<CXXRecordDecl>(DC);
2789 CurDecl = dyn_cast_or_null<CXXRecordDecl>(
CurContext);
2808 if (BaseType->containsErrors()) {
2813 if (EllipsisLoc.
isValid() && !BaseType->containsUnexpandedParameterPack()) {
2814 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
2828 if (BaseDecl->isUnion()) {
2829 Diag(BaseLoc, diag::err_union_as_base_class) << SpecifierRange;
2833 if (BaseType.hasQualifiers()) {
2835 BaseType.getQualifiers().getAsString(
Context.getPrintingPolicy());
2836 Diag(BaseLoc, diag::warn_qual_base_type)
2837 << Quals << llvm::count(Quals,
' ') + 1 << BaseType;
2838 Diag(BaseLoc, diag::note_base_class_specified_here) << BaseType;
2842 if (
Context.getTargetInfo().getCXXABI().isMicrosoft() ||
2843 Context.getTargetInfo().getTriple().isPS()) {
2845 if (
auto *BaseSpec =
2846 dyn_cast<ClassTemplateSpecializationDecl>(BaseDecl)) {
2855 Class->setInvalidDecl();
2859 BaseDecl = BaseDecl->getDefinition();
2860 assert(BaseDecl &&
"Base type is not incomplete, but has no definition");
2865 const auto *BaseCSA = BaseDecl->getAttr<CodeSegAttr>();
2866 const auto *DerivedCSA =
Class->getAttr<CodeSegAttr>();
2867 if ((DerivedCSA || BaseCSA) &&
2868 (!BaseCSA || !DerivedCSA ||
2869 BaseCSA->getName() != DerivedCSA->getName())) {
2870 Diag(
Class->getLocation(), diag::err_mismatched_code_seg_base);
2871 Diag(BaseDecl->getLocation(), diag::note_base_class_specified_here)
2882 if (BaseDecl->hasFlexibleArrayMember()) {
2883 Diag(BaseLoc, diag::err_base_class_has_flexible_array_member)
2884 << BaseDecl->getDeclName();
2891 if (FinalAttr *FA = BaseDecl->getAttr<FinalAttr>()) {
2892 Diag(BaseLoc, diag::err_class_marked_final_used_as_base)
2893 << BaseDecl->getDeclName() << FA->isSpelledAsSealed();
2894 Diag(BaseDecl->getLocation(), diag::note_entity_declared_at)
2895 << BaseDecl->getDeclName() << FA->getRange();
2900 if (BaseDecl->isInvalidDecl())
2901 Class->setInvalidDecl();
2902 }
else if (BaseType->isDependentType()) {
2909 if (!
Class->isDependentContext())
2910 Class->setInvalidDecl();
2913 Diag(BaseLoc, diag::err_base_must_be_class) << SpecifierRange;
2925 Access, TInfo, EllipsisLoc);
2942 Class->setIsParsingBaseSpecifiers();
2952 Diag(AL.getLoc(), diag::err_base_specifier_attribute)
2953 << AL << AL.isRegularKeywordAttribute() << AL.getRange();
2966 if (
Class->isUnion()) {
2967 Diag(
Class->getLocation(), diag::err_base_clause_on_union)
2977 Class->setInvalidDecl();
2994 for (
const auto &BaseSpec :
Decl->bases()) {
2995 QualType Base = Context.getCanonicalType(BaseSpec.getType())
2996 .getUnqualifiedType();
3013 std::map<QualType, CXXBaseSpecifier*, QualTypeOrdering> KnownBaseTypes;
3020 unsigned NumGoodBases = 0;
3022 for (
unsigned idx = 0; idx < Bases.size(); ++idx) {
3032 Diag(Bases[idx]->getBeginLoc(), diag::err_duplicate_base_class)
3033 << KnownBase->
getType() << Bases[idx]->getSourceRange();
3037 Context.Deallocate(Bases[idx]);
3042 KnownBase = Bases[idx];
3043 Bases[NumGoodBases++] = Bases[idx];
3048 if (Bases.size() > 1)
3052 if (
Class->isInterface() &&
3053 (!RD->isInterfaceLike() ||
3059 << RD->getSourceRange();
3062 if (RD->hasAttr<WeakAttr>())
3069 Class->setBases(Bases.data(), NumGoodBases);
3072 for (
unsigned idx = 0; idx < NumGoodBases; ++idx) {
3074 QualType BaseType = Bases[idx]->getType();
3078 if (BaseType->isDependentType())
3082 .getUnqualifiedType();
3084 if (IndirectBaseTypes.count(CanonicalBase)) {
3088 =
Class->isDerivedFrom(CanonicalBase->getAsCXXRecordDecl(), Paths);
3093 Diag(Bases[idx]->getBeginLoc(), diag::warn_inaccessible_base_class)
3095 << Bases[idx]->getSourceRange();
3097 assert(Bases[idx]->isVirtual());
3102 Context.Deallocate(Bases[idx]);
3110 if (!ClassDecl || Bases.empty())
3122 if (!
Base || !Derived)
3150 Base->getAsCXXRecordDecl(), Paths);
3156 Base->getAsCXXRecordDecl(), Paths);
3165 for (
unsigned I = Path.size(); I != 0; --I) {
3166 if (Path[I - 1].
Base->isVirtual()) {
3173 for (
unsigned I = Start, E = Path.size(); I != E; ++I)
3180 assert(BasePathArray.empty() &&
"Base path array must be empty!");
3182 return ::BuildBasePathArray(Paths.
front(), BasePathArray);
3187 unsigned InaccessibleBaseID,
3188 unsigned AmbiguousBaseConvID,
3192 bool IgnoreAccess) {
3200 if (!DerivationOkay)
3205 Path = &Paths.
front();
3212 if (PossiblePath.size() == 1) {
3213 Path = &PossiblePath;
3214 if (AmbiguousBaseConvID)
3215 Diag(Loc, diag::ext_ms_ambiguous_direct_base)
3216 <<
Base << Derived << Range;
3223 if (!IgnoreAccess) {
3242 if (AmbiguousBaseConvID) {
3252 assert(StillOkay &&
"Can only be used with a derived-to-base conversion");
3261 Diag(Loc, AmbiguousBaseConvID)
3262 << Derived <<
Base << PathDisplayStr << Range << Name;
3271 bool IgnoreAccess) {
3273 Derived,
Base, diag::err_upcast_to_inaccessible_base,
3274 diag::err_ambiguous_derived_to_base_conv, Loc, Range,
DeclarationName(),
3275 BasePath, IgnoreAccess);
3279 std::string PathDisplayStr;
3280 std::set<unsigned> DisplayedPaths;
3282 if (DisplayedPaths.insert(Path.back().SubobjectNumber).second) {
3285 PathDisplayStr +=
"\n ";
3289 PathDisplayStr +=
" -> " + Element.Base->getType().getAsString();
3293 return PathDisplayStr;
3303 assert(Access !=
AS_none &&
"Invalid kind for syntactic access specifier!");
3332 if (!OverloadedMethods.empty()) {
3333 if (OverrideAttr *OA = D->
getAttr<OverrideAttr>()) {
3334 Diag(OA->getLocation(),
3335 diag::override_keyword_hides_virtual_member_function)
3336 <<
"override" << (OverloadedMethods.size() > 1);
3337 }
else if (FinalAttr *FA = D->
getAttr<FinalAttr>()) {
3338 Diag(FA->getLocation(),
3339 diag::override_keyword_hides_virtual_member_function)
3340 << (FA->isSpelledAsSealed() ?
"sealed" :
"final")
3341 << (OverloadedMethods.size() > 1);
3352 if (OverrideAttr *OA = D->
getAttr<OverrideAttr>()) {
3353 Diag(OA->getLocation(),
3354 diag::override_keyword_only_allowed_on_virtual_member_functions)
3358 if (FinalAttr *FA = D->
getAttr<FinalAttr>()) {
3359 Diag(FA->getLocation(),
3360 diag::override_keyword_only_allowed_on_virtual_member_functions)
3361 << (FA->isSpelledAsSealed() ?
"sealed" :
"final")
3373 if (MD->
hasAttr<OverrideAttr>() && !HasOverriddenMethods)
3374 Diag(MD->
getLocation(), diag::err_function_marked_override_not_overriding)
3388 SpellingLoc =
getSourceManager().getImmediateExpansionRange(Loc).getBegin();
3394 auto EmitDiag = [&](
unsigned DiagInconsistent,
unsigned DiagSuggest) {
3405 diag::warn_inconsistent_destructor_marked_not_override_overriding,
3406 diag::warn_suggest_destructor_marked_not_override_overriding);
3408 EmitDiag(diag::warn_inconsistent_function_marked_not_override_overriding,
3409 diag::warn_suggest_function_marked_not_override_overriding);
3415 FinalAttr *FA = Old->
getAttr<FinalAttr>();
3419 Diag(
New->getLocation(), diag::err_final_function_overridden)
3420 <<
New->getDeclName()
3421 << FA->isSpelledAsSealed();
3430 return !RD->isCompleteDefinition() ||
3431 !RD->hasTrivialDefaultConstructor() ||
3432 !RD->hasTrivialDestructor();
3436void Sema::CheckShadowInheritedFields(
const SourceLocation &Loc,
3437 DeclarationName FieldName,
3438 const CXXRecordDecl *RD,
3440 if (Diags.isIgnored(diag::warn_shadow_field, Loc))
3444 std::map<CXXRecordDecl*, NamedDecl*> Bases;
3445 auto FieldShadowed = [&](
const CXXBaseSpecifier *
Specifier,
3446 CXXBasePath &Path) {
3447 const auto Base =
Specifier->getType()->getAsCXXRecordDecl();
3449 if (Bases.find(Base) != Bases.end())
3451 for (
const auto Field :
Base->lookup(FieldName)) {
3455 assert(Bases.find(Base) == Bases.end());
3463 CXXBasePaths Paths(
true,
true,
3468 for (
const auto &P : Paths) {
3469 auto Base = P.back().Base->getType()->getAsCXXRecordDecl();
3470 auto It = Bases.find(Base);
3472 if (It == Bases.end())
3474 auto BaseField = It->second;
3475 assert(BaseField->getAccess() !=
AS_private);
3478 Diag(Loc, diag::warn_shadow_field)
3479 << FieldName << RD <<
Base << DeclIsField;
3480 Diag(BaseField->getLocation(), diag::note_shadow_field);
3486template <
typename AttrType>
3488 if (
const TagDecl *TD =
T->getAsTagDecl())
3489 return TD->hasAttr<AttrType>();
3491 return TDT->getDecl()->hasAttr<AttrType>();
3534 unsigned InvalidDecl;
3535 bool ShowDeclName =
true;
3548 ShowDeclName =
false;
3553 ShowDeclName =
false;
3568 Diag(Loc, diag::err_invalid_member_in_interface)
3569 << (InvalidDecl-1) << Name;
3571 Diag(Loc, diag::err_invalid_member_in_interface)
3572 << (InvalidDecl-1) <<
"";
3582 Diag(Loc, diag::err_hlsl_cstor_dstor);
3610 diag::err_storageclass_invalid_for_member);
3617 !isFunc && TemplateParameterLists.empty();
3630 const char *PrevSpec;
3635 assert(!Failed &&
"Making a constexpr member const shouldn't fail");
3639 const char *PrevSpec;
3643 Context.getPrintingPolicy())) {
3645 "This is the only DeclSpec that should fail to be applied");
3649 isInstField =
false;
3660 Diag(Loc, diag::err_bad_variable_name)
3697 if (MSPropertyAttr) {
3699 BitWidth, InitStyle, AS, *MSPropertyAttr);
3702 isInstField =
false;
3705 BitWidth, InitStyle, AS);
3718 if (
Member->isInvalidDecl()) {
3723 Diag(Loc, diag::err_static_not_bitfield)
3727 Diag(Loc, diag::err_typedef_not_bitfield)
3732 Diag(Loc, diag::err_not_integral_type_bitfield)
3733 << Name << cast<ValueDecl>(
Member)->getType()
3738 Member->setInvalidDecl();
3743 NonTemplateMember = FunTmpl->getTemplatedDecl();
3745 NonTemplateMember = VarTmpl->getTemplatedDecl();
3751 if (NonTemplateMember !=
Member)
3757 if (
auto *DG = dyn_cast<CXXDeductionGuideDecl>(NonTemplateMember)) {
3758 auto *TD = DG->getDeducedTemplate();
3761 if (AS != TD->getAccess() &&
3762 TD->getDeclContext()->getRedeclContext()->Equals(
3763 DG->getDeclContext()->getRedeclContext())) {
3764 Diag(DG->getBeginLoc(), diag::err_deduction_guide_wrong_access);
3765 Diag(TD->getBeginLoc(), diag::note_deduction_guide_template_access)
3769 if (
const auto *AccessSpec = dyn_cast<AccessSpecDecl>(D))
3770 LastAccessSpec = AccessSpec;
3772 assert(LastAccessSpec &&
"differing access with no access specifier");
3773 Diag(LastAccessSpec->
getBeginLoc(), diag::note_deduction_guide_access)
3784 ? FinalAttr::Keyword_sealed
3785 : FinalAttr::Keyword_final));
3795 assert((Name || isInstField) &&
"No identifier for non-field ?");
3801 if (!
Diags.isIgnored(diag::warn_unused_private_field, FD->
getLocation()) &&
3813 class UninitializedFieldVisitor
3818 llvm::SmallPtrSetImpl<ValueDecl*> &Decls;
3821 llvm::SmallPtrSetImpl<QualType> &BaseClasses;
3836 UninitializedFieldVisitor(
Sema &S,
3837 llvm::SmallPtrSetImpl<ValueDecl*> &Decls,
3838 llvm::SmallPtrSetImpl<QualType> &BaseClasses)
3839 : Inherited(S.Context), S(S), Decls(Decls), BaseClasses(BaseClasses),
3843 bool IsInitListMemberExprInitialized(
MemberExpr *ME,
3844 bool CheckReferenceOnly) {
3846 bool ReferenceField =
false;
3851 Fields.push_back(FD);
3853 ReferenceField =
true;
3859 if (CheckReferenceOnly && !ReferenceField)
3864 auto UsedFields = llvm::drop_begin(llvm::reverse(Fields));
3865 auto UsedIter = UsedFields.begin();
3866 const auto UsedEnd = UsedFields.end();
3868 for (
const unsigned Orig : InitFieldIndex) {
3869 if (UsedIter == UsedEnd)
3871 const unsigned UsedIndex = (*UsedIter)->getFieldIndex();
3872 if (UsedIndex < Orig)
3874 if (UsedIndex > Orig)
3882 void HandleMemberExpr(MemberExpr *ME,
bool CheckReferenceOnly,
3889 MemberExpr *FieldME = ME;
3894 while (MemberExpr *SubME =
3895 dyn_cast<MemberExpr>(
Base->IgnoreParenImpCasts())) {
3900 if (FieldDecl *FD = dyn_cast<FieldDecl>(SubME->getMemberDecl()))
3905 AllPODFields =
false;
3907 Base = SubME->getBase();
3915 if (AddressOf && AllPODFields)
3920 if (ImplicitCastExpr *BaseCast = dyn_cast<ImplicitCastExpr>(Base)) {
3925 if (BaseCast->getCastKind() == CK_UncheckedDerivedToBase) {
3926 QualType
T = BaseCast->getType();
3935 if (!Decls.count(FoundVD))
3940 if (InitList && !AddressOf && FoundVD == InitListFieldDecl) {
3942 if (IsInitListMemberExprInitialized(ME, CheckReferenceOnly)) {
3947 if (CheckReferenceOnly && !IsReference)
3951 unsigned diag = IsReference
3952 ? diag::warn_reference_field_is_uninit
3953 : diag::warn_field_is_uninit;
3957 diag::note_uninit_in_this_constructor)
3962 void HandleValue(Expr *E,
bool AddressOf) {
3965 if (MemberExpr *ME = dyn_cast<MemberExpr>(E)) {
3966 HandleMemberExpr(ME,
false ,
3971 if (ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E)) {
3972 Visit(CO->getCond());
3973 HandleValue(CO->getTrueExpr(), AddressOf);
3974 HandleValue(CO->getFalseExpr(), AddressOf);
3978 if (BinaryConditionalOperator *BCO =
3979 dyn_cast<BinaryConditionalOperator>(E)) {
3980 Visit(BCO->getCond());
3981 HandleValue(BCO->getFalseExpr(), AddressOf);
3985 if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E)) {
3986 HandleValue(OVE->getSourceExpr(), AddressOf);
3990 if (BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
3991 switch (BO->getOpcode()) {
3996 HandleValue(BO->getLHS(), AddressOf);
3997 Visit(BO->getRHS());
4000 Visit(BO->getLHS());
4001 HandleValue(BO->getRHS(), AddressOf);
4009 void CheckInitListExpr(InitListExpr *ILE) {
4010 InitFieldIndex.push_back(0);
4011 for (
auto *Child : ILE->
children()) {
4012 if (InitListExpr *SubList = dyn_cast<InitListExpr>(Child)) {
4013 CheckInitListExpr(SubList);
4017 ++InitFieldIndex.back();
4019 InitFieldIndex.pop_back();
4022 void CheckInitializer(Expr *E,
const CXXConstructorDecl *FieldConstructor,
4023 FieldDecl *Field,
const Type *BaseClass) {
4026 for (ValueDecl* VD : DeclsToRemove)
4028 DeclsToRemove.clear();
4031 InitListExpr *ILE = dyn_cast<InitListExpr>(E);
4035 InitListFieldDecl =
Field;
4036 InitFieldIndex.clear();
4037 CheckInitListExpr(ILE);
4049 void VisitMemberExpr(MemberExpr *ME) {
4051 HandleMemberExpr(ME,
true ,
false );
4054 void VisitImplicitCastExpr(ImplicitCastExpr *E) {
4060 Inherited::VisitImplicitCastExpr(E);
4063 void VisitCXXConstructExpr(CXXConstructExpr *E) {
4065 Expr *ArgExpr = E->
getArg(0);
4066 if (InitListExpr *ILE = dyn_cast<InitListExpr>(ArgExpr))
4069 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(ArgExpr))
4070 if (ICE->getCastKind() == CK_NoOp)
4071 ArgExpr = ICE->getSubExpr();
4072 HandleValue(ArgExpr,
false );
4075 Inherited::VisitCXXConstructExpr(E);
4078 void VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
4081 HandleValue(Callee,
false );
4087 Inherited::VisitCXXMemberCallExpr(E);
4090 void VisitCallExpr(CallExpr *E) {
4093 HandleValue(E->
getArg(0),
false);
4097 Inherited::VisitCallExpr(E);
4100 void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
4104 return Inherited::VisitCXXOperatorCallExpr(E);
4108 HandleValue(Arg->IgnoreParenImpCasts(),
false );
4111 void VisitBinaryOperator(BinaryOperator *E) {
4115 if (MemberExpr *ME = dyn_cast<MemberExpr>(E->
getLHS()))
4116 if (FieldDecl *FD = dyn_cast<FieldDecl>(ME->
getMemberDecl()))
4118 DeclsToRemove.push_back(FD);
4121 HandleValue(E->
getLHS(),
false );
4126 Inherited::VisitBinaryOperator(E);
4129 void VisitUnaryOperator(UnaryOperator *E) {
4135 if (MemberExpr *ME = dyn_cast<MemberExpr>(E->
getSubExpr())) {
4136 HandleValue(ME->
getBase(),
true );
4141 Inherited::VisitUnaryOperator(E);
4151 static void DiagnoseUninitializedFields(
4152 Sema &SemaRef,
const CXXConstructorDecl *
Constructor) {
4168 llvm::SmallPtrSet<ValueDecl*, 4> UninitializedFields;
4171 for (
auto *I : RD->
decls()) {
4172 if (
auto *FD = dyn_cast<FieldDecl>(I)) {
4173 UninitializedFields.insert(FD);
4174 }
else if (
auto *IFD = dyn_cast<IndirectFieldDecl>(I)) {
4175 UninitializedFields.insert(IFD->getAnonField());
4179 llvm::SmallPtrSet<QualType, 4> UninitializedBaseClasses;
4180 for (
const auto &I : RD->
bases()) {
4185 UninitializedBaseClasses.insert(I.getType().getCanonicalType());
4188 if (UninitializedFields.empty() && UninitializedBaseClasses.empty())
4191 UninitializedFieldVisitor UninitializedChecker(SemaRef,
4192 UninitializedFields,
4193 UninitializedBaseClasses);
4195 for (
const auto *FieldInit :
Constructor->inits()) {
4196 if (UninitializedFields.empty() && UninitializedBaseClasses.empty())
4199 Expr *InitExpr = FieldInit->getInit();
4203 if (CXXDefaultInitExpr *
Default =
4204 dyn_cast<CXXDefaultInitExpr>(InitExpr)) {
4205 InitExpr =
Default->getExpr();
4209 UninitializedChecker.CheckInitializer(InitExpr,
Constructor,
4210 FieldInit->getAnyMember(),
4211 FieldInit->getBaseClass());
4213 UninitializedChecker.CheckInitializer(InitExpr,
nullptr,
4214 FieldInit->getAnyMember(),
4215 FieldInit->getBaseClass());
4236 if (ParamDecl->getDeclName())
4253 return ConstraintExpr;
4274 return Seq.Perform(*
this, Entity, Kind, InitExpr);
4292 "must set init style when field is created");
4329 DirectBaseSpec =
nullptr;
4330 for (
const auto &
Base : ClassDecl->
bases()) {
4334 DirectBaseSpec = &
Base;
4342 VirtualBaseSpec =
nullptr;
4343 if (!DirectBaseSpec || !DirectBaseSpec->
isVirtual()) {
4352 if (Path.back().Base->isVirtual()) {
4353 VirtualBaseSpec = Path.back().Base;
4360 return DirectBaseSpec || VirtualBaseSpec;
4374 DS, IdLoc, InitList,
4392 DS, IdLoc, List, EllipsisLoc);
4401 explicit MemInitializerValidatorCCC(
CXXRecordDecl *ClassDecl)
4402 : ClassDecl(ClassDecl) {}
4404 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
4407 return Member->getDeclContext()->getRedeclContext()->Equals(ClassDecl);
4413 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
4414 return std::make_unique<MemInitializerValidatorCCC>(*
this);
4418 CXXRecordDecl *ClassDecl;
4435 Diag(Loc, diag::err_using_placeholder_variable) << Name;
4451 for (
auto *D : ClassDecl->
lookup(MemberOrBase)) {
4453 bool IsPlaceholder = D->isPlaceholderVar(
getLangOpts());
4455 if (IsPlaceholder && D->getDeclContext() == ND->
getDeclContext())
4486 if (!ConstructorD || !
Init)
4492 = dyn_cast<CXXConstructorDecl>(ConstructorD);
4516 ClassDecl, SS, TemplateTypeTy, MemberOrBase)) {
4518 Diag(EllipsisLoc, diag::err_pack_expansion_member_init)
4528 if (TemplateTypeTy) {
4530 if (BaseType.isNull())
4547 if (R.isAmbiguous())
return true;
4550 R.suppressDiagnostics();
4553 bool NotUnknownSpecialization =
false;
4556 NotUnknownSpecialization = !
Record->hasAnyDependentBases();
4558 if (!NotUnknownSpecialization) {
4564 if (BaseType.isNull())
4567 TInfo =
Context.CreateTypeSourceInfo(BaseType);
4577 R.setLookupName(MemberOrBase);
4584 UnqualifiedBase->getCanonicalInjectedSpecializationType(
Context));
4586 for (
auto const &
Base : ClassDecl->
bases()) {
4588 Base.getType()->getAs<TemplateSpecializationType>();
4590 Context.hasSameTemplateName(BaseTemplate->getTemplateName(), TN,
4592 Diag(IdLoc, diag::ext_unqualified_base_class)
4594 BaseType =
Base.getType();
4603 MemInitializerValidatorCCC CCC(ClassDecl);
4604 if (R.empty() && BaseType.isNull() &&
4606 CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), S, &SS,
4613 PDiag(diag::err_mem_init_not_member_or_class_suggest)
4614 << MemberOrBase <<
true);
4621 DirectBaseSpec, VirtualBaseSpec)) {
4626 PDiag(diag::err_mem_init_not_member_or_class_suggest)
4627 << MemberOrBase <<
false,
4640 if (!TyD && BaseType.isNull()) {
4641 Diag(IdLoc, diag::err_mem_init_not_member_or_class)
4642 << MemberOrBase <<
SourceRange(IdLoc,
Init->getSourceRange().getEnd());
4647 if (BaseType.isNull()) {
4652 if (
const auto *TD = dyn_cast<TagDecl>(TyD)) {
4658 TL.setNameLoc(IdLoc);
4659 }
else if (
auto *TN = dyn_cast<TypedefNameDecl>(TyD)) {
4665 }
else if (
auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(TyD)) {
4674 BaseType =
Context.getTypeDeclType(TyD);
4682 TInfo =
Context.getTrivialTypeSourceInfo(BaseType, IdLoc);
4692 assert((DirectMember || IndirectMember) &&
4693 "Member must be a FieldDecl or IndirectFieldDecl");
4698 if (
Member->isInvalidDecl())
4703 Args =
MultiExprArg(ParenList->getExprs(), ParenList->getNumExprs());
4705 Args =
MultiExprArg(InitList->getInits(), InitList->getNumInits());
4706 }
else if (
auto *ParenListInit = dyn_cast<CXXParenListInitExpr>(
Init)) {
4709 Args = ParenListInit->getUserSpecifiedInitExprs();
4717 if (
Member->getType()->isDependentType() ||
Init->isTypeDependent()) {
4722 bool InitList =
false;
4735 IdLoc,
Init->getBeginLoc(),
Init->getEndLoc())
4779 return Diag(NameLoc, diag::err_delegating_ctor)
4781 Diag(NameLoc, diag::warn_cxx98_compat_delegating_ctor);
4783 bool InitList =
true;
4787 Args =
MultiExprArg(ParenList->getExprs(), ParenList->getNumExprs());
4798 NameLoc,
Init->getBeginLoc(),
Init->getEndLoc())
4807 "Delegating constructor with no target?");
4813 DelegationInit.
get(), InitRange.
getBegin(),
false);
4818 InitRange.
getEnd(), Args, ClassType);
4830 DelegationInit =
Init;
4844 if (!BaseType->isDependentType() && !BaseType->isRecordType())
4845 return Diag(BaseLoc, diag::err_base_init_does_not_name_class)
4859 (BaseType->isDependentType() ||
Init->isTypeDependent());
4864 if (!BaseType->containsUnexpandedParameterPack()) {
4865 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
4893 if (!DirectBaseSpec && !VirtualBaseSpec) {
4902 return Diag(BaseLoc, diag::err_not_direct_base_or_virtual)
4903 << BaseType <<
Context.getCanonicalTagType(ClassDecl)
4914 InitRange.
getEnd(), EllipsisLoc);
4921 if (DirectBaseSpec && VirtualBaseSpec)
4922 return Diag(BaseLoc, diag::err_base_init_direct_and_virtual)
4927 BaseSpec = VirtualBaseSpec;
4930 bool InitList =
true;
4934 Args =
MultiExprArg(ParenList->getExprs(), ParenList->getNumExprs());
4974 InitRange.
getEnd(), EllipsisLoc);
4984 TargetType, ExprLoc);
5004 bool IsInheritedVirtualBase,
5008 IsInheritedVirtualBase);
5012 switch (ImplicitInitKind) {
5018 BaseInit = InitSeq.Perform(SemaRef, InitEntity, InitKind, {});
5024 bool Moving = ImplicitInitKind ==
IIK_Move;
5026 QualType ParamType = Param->getType().getNonReferenceType();
5046 BasePath.push_back(BaseSpec);
5048 CK_UncheckedDerivedToBase,
5056 BaseInit = InitSeq.
Perform(SemaRef, InitEntity, InitKind, CopyCtorArg);
5088 if (Field->isInvalidDecl())
5094 bool Moving = ImplicitInitKind ==
IIK_Move;
5096 QualType ParamType = Param->getType().getNonReferenceType();
5099 if (Field->isZeroLengthBitField())
5102 Expr *MemberExprBase =
5115 LookupResult MemberLookup(SemaRef, Field->getDeclName(), Loc,
5151 InitSeq.Perform(SemaRef, Entity, InitKind,
MultiExprArg(&CtorArgE, 1));
5166 "Unhandled implicit init kind!");
5179 ExprResult MemberInit = InitSeq.Perform(SemaRef, InitEntity, InitKind, {});
5182 if (MemberInit.isInvalid())
5199 if (!Field->getParent()->isUnion()) {
5202 diag::err_uninitialized_member_in_ctor)
5205 << Field->getDeclName();
5206 SemaRef.
Diag(Field->getLocation(), diag::note_declared_at);
5212 diag::err_uninitialized_member_in_ctor)
5215 << Field->getDeclName();
5216 SemaRef.
Diag(Field->getLocation(), diag::note_declared_at);
5233 CXXMemberInit =
nullptr;
5238struct BaseAndFieldInfo {
5240 CXXConstructorDecl *Ctor;
5241 bool AnyErrorsInInits;
5243 llvm::DenseMap<const void *, CXXCtorInitializer*> AllBaseFields;
5244 SmallVector<CXXCtorInitializer*, 8> AllToInit;
5245 llvm::DenseMap<TagDecl*, FieldDecl*> ActiveUnionMember;
5247 BaseAndFieldInfo(Sema &S, CXXConstructorDecl *Ctor,
bool ErrorsInInits)
5248 : S(S), Ctor(Ctor), AnyErrorsInInits(ErrorsInInits) {
5260 bool isImplicitCopyOrMove()
const {
5271 llvm_unreachable(
"Invalid ImplicitInitializerKind!");
5274 bool addFieldInitializer(CXXCtorInitializer *
Init) {
5275 AllToInit.push_back(
Init);
5284 bool isInactiveUnionMember(FieldDecl *Field) {
5289 if (FieldDecl *Active =
5290 ActiveUnionMember.lookup(
Record->getCanonicalDecl()))
5291 return Active !=
Field->getCanonicalDecl();
5294 if (isImplicitCopyOrMove())
5299 if (
Field->hasInClassInitializer())
5303 if (!
Field->isAnonymousStructOrUnion())
5305 CXXRecordDecl *FieldRD =
Field->getType()->getAsCXXRecordDecl();
5312 bool isWithinInactiveUnionMember(FieldDecl *Field,
5313 IndirectFieldDecl *Indirect) {
5315 return isInactiveUnionMember(Field);
5317 for (
auto *
C : Indirect->
chain()) {
5318 FieldDecl *
Field = dyn_cast<FieldDecl>(
C);
5319 if (Field && isInactiveUnionMember(Field))
5330 if (
T->isIncompleteArrayType())
5334 if (ArrayT->isZeroSize())
5337 T = ArrayT->getElementType();
5346 if (Field->isInvalidDecl())
5351 Info.AllBaseFields.lookup(Field->getCanonicalDecl()))
5352 return Info.addFieldInitializer(
Init);
5366 if (Info.isWithinInactiveUnionMember(Field, Indirect))
5369 if (Field->hasInClassInitializer() && !Info.isImplicitCopyOrMove()) {
5387 return Info.addFieldInitializer(
Init);
5397 if (Info.AnyErrorsInInits)
5408 return Info.addFieldInitializer(
Init);
5435 if (Class->isInvalidDecl())
5437 if (Class->hasIrrelevantDestructor())
5446 if (Field->isInvalidDecl())
5456 if (!FieldClassDecl)
5460 if (FieldClassDecl->isUnion() && FieldClassDecl->isAnonymousStructOrUnion())
5468 S.
PDiag(diag::err_access_dtor_field)
5469 << Field->getDeclName() << FieldType);
5482 bool VisitVirtualBases = !ClassDecl->
isAbstract();
5489 if (Dtor && Dtor->isUsed())
5490 VisitVirtualBases =
false;
5496 for (
const auto &
Base : ClassDecl->
bases()) {
5497 auto *BaseClassDecl =
Base.getType()->getAsCXXRecordDecl();
5502 if (
Base.isVirtual()) {
5503 if (!VisitVirtualBases)
5505 DirectVirtualBases.insert(BaseClassDecl);
5514 S.
PDiag(diag::err_access_dtor_base)
5515 <<
Base.getType() <<
Base.getSourceRange(),
5522 if (VisitVirtualBases)
5524 &DirectVirtualBases);
5532 if (!Initializers.empty()) {
5533 Constructor->setNumCtorInitializers(Initializers.size());
5536 memcpy(baseOrMemberInitializers, Initializers.data(),
5538 Constructor->setCtorInitializers(baseOrMemberInitializers);
5548 BaseAndFieldInfo Info(*
this,
Constructor, AnyErrors);
5556 bool HadError =
false;
5559 if (
Member->isBaseInitializer())
5560 Info.AllBaseFields[
Member->getBaseClass()->getAsCanonical<RecordType>()] =
5563 Info.AllBaseFields[
Member->getAnyMember()->getCanonicalDecl()] =
Member;
5566 for (
auto *
C : F->chain()) {
5569 Info.ActiveUnionMember.insert(std::make_pair(
5574 Info.ActiveUnionMember.insert(std::make_pair(
5582 for (
auto &I : ClassDecl->
bases()) {
5584 DirectVBases.insert(&I);
5588 for (
auto &VBase : ClassDecl->
vbases()) {
5590 VBase.getType()->getAsCanonical<RecordType>())) {
5598 Diag(
Value->getSourceLocation(), diag::warn_abstract_vbase_init_ignored)
5599 << VBase.getType() << ClassDecl;
5603 Info.AllToInit.push_back(
Value);
5604 }
else if (!AnyErrors && !ClassDecl->
isAbstract()) {
5609 bool IsInheritedVirtualBase = !DirectVBases.count(&VBase);
5612 &VBase, IsInheritedVirtualBase,
5618 Info.AllToInit.push_back(CXXBaseInit);
5625 if (
Base.isVirtual())
5629 Base.getType()->getAsCanonical<RecordType>())) {
5630 Info.AllToInit.push_back(
Value);
5631 }
else if (!AnyErrors) {
5640 Info.AllToInit.push_back(CXXBaseInit);
5645 for (
auto *Mem : ClassDecl->
decls()) {
5646 if (
auto *F = dyn_cast<FieldDecl>(Mem)) {
5651 if (F->isUnnamedBitField())
5657 if (F->isAnonymousStructOrUnion() && !Info.isImplicitCopyOrMove())
5666 if (Info.isImplicitCopyOrMove())
5669 if (
auto *F = dyn_cast<IndirectFieldDecl>(Mem)) {
5670 if (F->getType()->isIncompleteArrayType()) {
5672 "Incomplete array type is not valid");
5684 unsigned NumInitializers = Info.AllToInit.size();
5685 if (NumInitializers > 0) {
5686 Constructor->setNumCtorInitializers(NumInitializers);
5689 memcpy(baseOrMemberInitializers, Info.AllToInit.data(),
5691 Constructor->setCtorInitializers(baseOrMemberInitializers);
5717 if (
const RecordType *RT = Field->getType()->getAsCanonical<RecordType>()) {
5725 IdealInits.push_back(Field->getCanonicalDecl());
5729 return Context.getCanonicalType(BaseType).getTypePtr();
5734 if (!
Member->isAnyMemberInitializer())
5737 return Member->getAnyMember()->getCanonicalDecl();
5743 if (
Previous->isAnyMemberInitializer())
5757 if (
Constructor->getDeclContext()->isDependentContext())
5762 bool ShouldCheckOrder =
false;
5764 if (!SemaRef.
Diags.
isIgnored(diag::warn_initializer_out_of_order,
5765 Init->getSourceLocation())) {
5766 ShouldCheckOrder =
true;
5770 if (!ShouldCheckOrder)
5781 for (
const auto &VBase : ClassDecl->
vbases())
5785 for (
const auto &
Base : ClassDecl->
bases()) {
5786 if (
Base.isVirtual())
5792 for (
auto *Field : ClassDecl->
fields()) {
5793 if (Field->isUnnamedBitField())
5799 unsigned NumIdealInits = IdealInitKeys.size();
5800 unsigned IdealIndex = 0;
5809 for (
unsigned InitIndex = 0; InitIndex !=
Inits.size(); ++InitIndex) {
5814 for (; IdealIndex != NumIdealInits; ++IdealIndex)
5815 if (InitKey == IdealInitKeys[IdealIndex])
5821 if (IdealIndex == NumIdealInits && InitIndex) {
5822 WarnIndexes.push_back(InitIndex);
5825 for (IdealIndex = 0; IdealIndex != NumIdealInits; ++IdealIndex)
5826 if (InitKey == IdealInitKeys[IdealIndex])
5829 assert(IdealIndex < NumIdealInits &&
5830 "initializer not found in initializer list");
5832 CorrelatedInitOrder.emplace_back(IdealIndex, InitIndex);
5835 if (WarnIndexes.empty())
5839 llvm::sort(CorrelatedInitOrder, llvm::less_first());
5845 Inits[WarnIndexes.front() - 1]->getSourceLocation(),
5846 WarnIndexes.size() == 1 ? diag::warn_initializer_out_of_order
5847 : diag::warn_some_initializers_out_of_order);
5849 for (
unsigned I = 0; I < CorrelatedInitOrder.size(); ++I) {
5850 if (CorrelatedInitOrder[I].second == I)
5856 Inits[I]->getSourceRange(),
5859 Inits[CorrelatedInitOrder[I].second]->getSourceRange()),
5865 if (WarnIndexes.size() == 1) {
5867 Inits[WarnIndexes.front()]);
5873 for (
unsigned WarnIndex : WarnIndexes) {
5876 diag::note_initializer_out_of_order);
5883bool CheckRedundantInit(Sema &S,
5884 CXXCtorInitializer *
Init,
5885 CXXCtorInitializer *&PrevInit) {
5891 if (FieldDecl *Field =
Init->getAnyMember())
5893 diag::err_multiple_mem_initialization)
5894 <<
Field->getDeclName()
5895 <<
Init->getSourceRange();
5897 const Type *BaseClass =
Init->getBaseClass();
5898 assert(BaseClass &&
"neither field nor base");
5900 diag::err_multiple_base_initialization)
5901 << QualType(BaseClass, 0)
5902 <<
Init->getSourceRange();
5910typedef std::pair<NamedDecl *, CXXCtorInitializer *> UnionEntry;
5911typedef llvm::DenseMap<RecordDecl*, UnionEntry> RedundantUnionMap;
5913bool CheckRedundantUnionInit(Sema &S,
5914 CXXCtorInitializer *
Init,
5915 RedundantUnionMap &Unions) {
5916 FieldDecl *
Field =
Init->getAnyMember();
5917 RecordDecl *Parent =
Field->getParent();
5918 NamedDecl *Child =
Field;
5922 UnionEntry &En = Unions[Parent];
5923 if (En.first && En.first != Child) {
5925 diag::err_multiple_mem_union_initialization)
5926 <<
Field->getDeclName()
5927 <<
Init->getSourceRange();
5928 S.
Diag(En.second->getSourceLocation(), diag::note_previous_initializer)
5929 << 0 << En.second->getSourceRange();
5952 if (!ConstructorDecl)
5958 = dyn_cast<CXXConstructorDecl>(ConstructorDecl);
5961 Diag(ColonLoc, diag::err_only_constructors_take_base_inits);
5968 llvm::DenseMap<const void *, CXXCtorInitializer *> Members;
5971 RedundantUnionMap MemberUnions;
5973 bool HadError =
false;
5974 for (
unsigned i = 0; i < MemInits.size(); i++) {
5978 Init->setSourceOrder(i);
5980 if (
Init->isAnyMemberInitializer()) {
5982 if (CheckRedundantInit(*
this,
Init, Members[Key]) ||
5983 CheckRedundantUnionInit(*
this,
Init, MemberUnions))
5985 }
else if (
Init->isBaseInitializer()) {
5987 if (CheckRedundantInit(*
this,
Init, Members[Key]))
5990 assert(
Init->isDelegatingInitializer());
5992 if (MemInits.size() != 1) {
5994 diag::err_delegating_initializer_alone)
5995 <<
Init->getSourceRange() << MemInits[i ? 0 : 1]->getSourceRange();
6027 for (
auto *Field : ClassDecl->
fields()) {
6036 llvm::SmallPtrSetImpl<const CXXRecordDecl *> *DirectVirtualBases) {
6038 for (
const auto &VBase : ClassDecl->
vbases()) {
6039 auto *BaseClassDecl = VBase.getType()->getAsCXXRecordDecl();
6044 if (DirectVirtualBases && DirectVirtualBases->count(BaseClassDecl))
6053 PDiag(diag::err_access_dtor_vbase)
6054 << CT << VBase.getType(),
6057 CT, VBase.getType(), diag::err_access_dtor_vbase, 0,
6071 = dyn_cast<CXXConstructorDecl>(CDtorDecl)) {
6073 !ClassDecl || ClassDecl->isInvalidDecl()) {
6085 const auto *RD =
Context.getBaseElementType(
T)->getAsCXXRecordDecl();
6122 if (
Diags.isLastDiagnosticIgnored())
6132 for (
const auto &M : FinalOverriders) {
6133 for (
const auto &SO : M.second) {
6139 if (SO.second.size() != 1)
6143 if (!
Method->isPureVirtual())
6146 if (!SeenPureMethods.insert(
Method).second)
6149 Diag(
Method->getLocation(), diag::note_pure_virtual_function)
6160struct AbstractUsageInfo {
6170 void DiagnoseAbstractType() {
6179struct CheckAbstractUsage {
6180 AbstractUsageInfo &Info;
6181 const NamedDecl *Ctx;
6183 CheckAbstractUsage(AbstractUsageInfo &Info,
const NamedDecl *Ctx)
6184 : Info(Info), Ctx(Ctx) {}
6188#define ABSTRACT_TYPELOC(CLASS, PARENT)
6189#define TYPELOC(CLASS, PARENT) \
6190 case TypeLoc::CLASS: Check(TL.castAs<CLASS##TypeLoc>(), Sel); break;
6191#include "clang/AST/TypeLocNodes.def"
6197 for (
unsigned I = 0, E = TL.
getNumParams(); I != E; ++I) {
6212 for (
unsigned I = 0, E = TL.
getNumArgs(); I != E; ++I) {
6213 TemplateArgumentLoc TAL = TL.
getArgLoc(I);
6222#define CheckPolymorphic(Type) \
6223 void Check(Type TL, Sema::AbstractDiagSelID Sel) { \
6224 Visit(TL.getNextTypeLoc(), Sema::AbstractNone); \
6239 return Visit(
Next, Sel);
6247 if (
T->isArrayType()) {
6252 if (CT != Info.AbstractType)
return;
6263 Info.DiagnoseAbstractType();
6267void AbstractUsageInfo::CheckType(
const NamedDecl *D, TypeLoc TL,
6269 CheckAbstractUsage(*
this, D).Visit(TL, Sel);
6304 for (
auto *D : RD->
decls()) {
6305 if (D->isImplicit())
continue;
6308 if (
auto *FD = dyn_cast<FriendDecl>(D)) {
6309 D = FD->getFriendDecl();
6314 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
6316 }
else if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(D)) {
6320 }
else if (
auto *FD = dyn_cast<FieldDecl>(D)) {
6323 }
else if (
auto *VD = dyn_cast<VarDecl>(D)) {
6325 }
else if (
auto *VTD = dyn_cast<VarTemplateDecl>(D)) {
6329 }
else if (
auto *RD = dyn_cast<CXXRecordDecl>(D)) {
6331 }
else if (
auto *CTD = dyn_cast<ClassTemplateDecl>(D)) {
6342 assert(ClassAttr->
getKind() == attr::DLLExport);
6352 struct MarkingClassDllexported {
6363 ~MarkingClassDllexported() {
6366 } MarkingDllexportedContext(S, Class, ClassAttr->
getLocation());
6373 if (!
Member->hasAttr<DLLExportAttr>())
6378 auto *VD = dyn_cast<VarDecl>(
Member);
6379 if (VD && VD->getStorageClass() ==
SC_Static &&
6383 auto *MD = dyn_cast<CXXMethodDecl>(
Member);
6387 if (MD->isUserProvided()) {
6397 auto *CD = dyn_cast<CXXConstructorDecl>(MD);
6400 CD->getAttr<DLLExportAttr>()->getLocation(), CD);
6408 }
else if (MD->isExplicitlyDefaulted()) {
6417 }
else if (!MD->isTrivial() ||
6418 MD->isCopyAssignmentOperator() ||
6419 MD->isMoveAssignmentOperator()) {
6440 if (Class->isInvalidDecl())
6447 if (
auto *NestedClass = dyn_cast<CXXRecordDecl>(
Member)) {
6448 if (NestedClass->isThisDeclarationADefinition())
6454 auto *CD = dyn_cast<CXXConstructorDecl>(
Member);
6455 if (!CD || !CD->isDefaultConstructor())
6457 auto *
Attr = CD->getAttr<DLLExportAttr>();
6463 if (!Class->isDependentContext()) {
6468 if (LastExportedDefaultCtor) {
6470 diag::err_attribute_dll_ambiguous_default_ctor)
6472 S.
Diag(CD->getLocation(), diag::note_entity_declared_at)
6473 << CD->getDeclName();
6476 LastExportedDefaultCtor = CD;
6482 bool ErrorReported =
false;
6483 auto reportIllegalClassTemplate = [&ErrorReported](
Sema &S,
6487 S.
Diag(TD->getLocation(),
6488 diag::err_cuda_device_builtin_surftex_cls_template)
6490 ErrorReported =
true;
6495 auto *SD = dyn_cast<ClassTemplateSpecializationDecl>(Class);
6497 S.
Diag(Class->getLocation(),
6498 diag::err_cuda_device_builtin_surftex_ref_decl)
6500 S.
Diag(Class->getLocation(),
6501 diag::note_cuda_device_builtin_surftex_should_be_template_class)
6505 TD = SD->getSpecializedTemplate();
6509 unsigned N = Params->
size();
6512 reportIllegalClassTemplate(S, TD);
6514 diag::note_cuda_device_builtin_surftex_cls_should_have_n_args)
6518 reportIllegalClassTemplate(S, TD);
6520 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6524 auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Params->
getParam(1));
6525 if (!NTTP || !NTTP->getType()->isIntegralOrEnumerationType()) {
6526 reportIllegalClassTemplate(S, TD);
6528 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6536 bool ErrorReported =
false;
6537 auto reportIllegalClassTemplate = [&ErrorReported](
Sema &S,
6541 S.
Diag(TD->getLocation(),
6542 diag::err_cuda_device_builtin_surftex_cls_template)
6544 ErrorReported =
true;
6549 auto *SD = dyn_cast<ClassTemplateSpecializationDecl>(Class);
6551 S.
Diag(Class->getLocation(),
6552 diag::err_cuda_device_builtin_surftex_ref_decl)
6554 S.
Diag(Class->getLocation(),
6555 diag::note_cuda_device_builtin_surftex_should_be_template_class)
6559 TD = SD->getSpecializedTemplate();
6563 unsigned N = Params->
size();
6566 reportIllegalClassTemplate(S, TD);
6568 diag::note_cuda_device_builtin_surftex_cls_should_have_n_args)
6572 reportIllegalClassTemplate(S, TD);
6574 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6578 auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Params->
getParam(1));
6579 if (!NTTP || !NTTP->getType()->isIntegralOrEnumerationType()) {
6580 reportIllegalClassTemplate(S, TD);
6582 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6587 auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Params->
getParam(2));
6588 if (!NTTP || !NTTP->getType()->isIntegralOrEnumerationType()) {
6589 reportIllegalClassTemplate(S, TD);
6591 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6600 if (
Method->isUserProvided())
6611 if (
Context.getTargetInfo().shouldDLLImportComdatSymbols() && !ClassAttr) {
6612 if (
auto *Spec = dyn_cast<ClassTemplatePartialSpecializationDecl>(
Class)) {
6613 if (
Attr *TemplateAttr =
6614 getDLLAttr(Spec->getSpecializedTemplate()->getTemplatedDecl())) {
6616 A->setInherited(
true);
6629 if ((
Context.getTargetInfo().getCXXABI().isMicrosoft() ||
6630 Context.getTargetInfo().getTriple().isPS()) &&
6631 (!
Class->isExternallyVisible() &&
Class->hasExternalFormalLinkage())) {
6632 Class->dropAttrs<DLLExportAttr, DLLImportAttr>();
6636 if (!
Class->isExternallyVisible()) {
6637 Diag(
Class->getLocation(), diag::err_attribute_dll_not_extern)
6638 <<
Class << ClassAttr;
6642 if (
Context.getTargetInfo().shouldDLLImportComdatSymbols() &&
6653 diag::err_attribute_dll_member_of_dll_class)
6654 << MemberAttr << ClassAttr;
6655 Diag(ClassAttr->getLocation(), diag::note_previous_attribute);
6656 Member->setInvalidDecl();
6660 if (
Class->getDescribedClassTemplate())
6665 const bool ClassExported = ClassAttr->
getKind() == attr::DLLExport;
6670 const bool PropagatedImport =
6680 !
Context.getTargetInfo().getTriple().isOSCygMing()) {
6681 if (
auto *DEA =
Class->getAttr<DLLExportAttr>()) {
6682 Class->addAttr(DLLExportOnDeclAttr::Create(
Context, DEA->getLoc()));
6683 Class->dropAttr<DLLExportAttr>();
6693 if (ClassExported &&
getLangOpts().DllExportInlines) {
6696 if (
auto *S = dyn_cast<ConstructorUsingShadowDecl>(D))
6697 Shadows.push_back(S);
6719 if (
Member->hasAttr<ExcludeFromExplicitInstantiationAttr>())
6734 if (ClassExported &&
getLangOpts().DllExportInlines) {
6751 diag::warn_dllexport_inherited_ctor_unsupported)
6757 .areArgsDestroyedLeftToRightInCallee()) {
6758 bool HasCalleeCleanupParam =
false;
6760 if (P->needsDestruction(
Context)) {
6761 HasCalleeCleanupParam =
true;
6764 if (HasCalleeCleanupParam) {
6766 diag::warn_dllexport_inherited_ctor_unsupported)
6788 if (!
Context.getTargetInfo().shouldDLLImportComdatSymbols() &&
6791 if (
auto *CD = dyn_cast<CXXConstructorDecl>(MD);
6792 !CD || !CD->getInheritedConstructor())
6799 auto *Ctor = dyn_cast<CXXConstructorDecl>(MD);
6816 if (VD && PropagatedImport)
6830 if (ClassExported) {
6842 Member->addAttr(NewAttr);
6852 "friend re-decl should not already have a DLLAttr");
6882 NewAttr->setInherited(
true);
6883 BaseTemplateSpec->
addAttr(NewAttr);
6887 if (
auto *ImportAttr = dyn_cast<DLLImportAttr>(NewAttr))
6888 ImportAttr->setPropagatedToBaseTemplate();
6909 Diag(BaseLoc, diag::warn_attribute_dll_instantiated_base_class)
6914 diag::note_template_class_explicit_specialization_was_here)
6915 << BaseTemplateSpec;
6918 diag::note_template_class_instantiation_was_here)
6919 << BaseTemplateSpec;
6928struct DefaultedFunctionFPFeaturesRAII {
6931 : SavedFPFeatures(S) {
6938 ~DefaultedFunctionFPFeaturesRAII() =
default;
6969 llvm_unreachable(
"Invalid special member.");
6987 bool CopyCtorIsTrivial =
false, CopyCtorIsTrivialForCall =
false;
6988 bool DtorIsTrivialForCall =
false;
6999 CopyCtorIsTrivial =
true;
7001 CopyCtorIsTrivialForCall =
true;
7005 if (CD->isCopyConstructor() && !CD->isDeleted() &&
7006 !CD->isIneligibleOrNotSelected()) {
7007 if (CD->isTrivial())
7008 CopyCtorIsTrivial =
true;
7009 if (CD->isTrivialForCall())
7010 CopyCtorIsTrivialForCall =
true;
7018 DtorIsTrivialForCall =
true;
7020 if (!DD->isDeleted() && DD->isTrivialForCall())
7021 DtorIsTrivialForCall =
true;
7025 if (CopyCtorIsTrivialForCall && DtorIsTrivialForCall)
7039 uint64_t TypeSize = isAArch64 ? 128 : 64;
7051 bool HasNonDeletedCopyOrMove =
false;
7057 HasNonDeletedCopyOrMove =
true;
7064 HasNonDeletedCopyOrMove =
true;
7072 if (MD->isDeleted() || MD->isIneligibleOrNotSelected())
7075 auto *CD = dyn_cast<CXXConstructorDecl>(MD);
7076 if (CD && CD->isCopyOrMoveConstructor())
7077 HasNonDeletedCopyOrMove =
true;
7081 if (!MD->isTrivialForCall())
7085 return HasNonDeletedCopyOrMove;
7096 bool IssuedDiagnostic =
false;
7099 if (!IssuedDiagnostic) {
7101 IssuedDiagnostic =
true;
7103 S.
Diag(O->getLocation(), diag::note_overridden_virtual_function);
7106 return IssuedDiagnostic;
7113 if (
Record->isAbstract() && !
Record->isInvalidDecl()) {
7114 AbstractUsageInfo Info(*
this,
Record);
7121 if (!
Record->isInvalidDecl() && !
Record->isDependentType() &&
7122 !
Record->isAggregate() && !
Record->hasUserDeclaredConstructor() &&
7124 bool Complained =
false;
7125 for (
const auto *F :
Record->fields()) {
7126 if (F->hasInClassInitializer() || F->isUnnamedBitField())
7129 if (F->getType()->isReferenceType() ||
7130 (F->getType().isConstQualified() && F->getType()->isScalarType())) {
7132 Diag(
Record->getLocation(), diag::warn_no_constructor_for_refconst)
7137 Diag(F->getLocation(), diag::note_refconst_member_not_initialized)
7138 << F->getType()->isReferenceType()
7139 << F->getDeclName();
7144 if (
Record->getIdentifier()) {
7159 Record->hasUserDeclaredConstructor()) ||
7161 Diag(Element->getLocation(), diag::err_member_name_of_class)
7169 if (
Record->isPolymorphic() && !
Record->isDependentType()) {
7172 !
Record->hasAttr<FinalAttr>())
7174 diag::warn_non_virtual_dtor)
7178 if (
Record->isAbstract()) {
7179 if (FinalAttr *FA =
Record->getAttr<FinalAttr>()) {
7180 Diag(
Record->getLocation(), diag::warn_abstract_final_class)
7181 << FA->isSpelledAsSealed();
7187 if (!
Record->hasAttr<FinalAttr>()) {
7189 if (
const FinalAttr *FA = dtor->getAttr<FinalAttr>()) {
7190 Diag(FA->getLocation(), diag::warn_final_dtor_non_final_class)
7191 << FA->isSpelledAsSealed()
7194 (FA->isSpelledAsSealed() ?
" sealed" :
" final"));
7196 diag::note_final_dtor_non_final_class_silence)
7197 <<
Context.getCanonicalTagType(
Record) << FA->isSpelledAsSealed();
7203 if (
Record->hasAttr<TrivialABIAttr>())
7208 bool HasTrivialABI =
Record->hasAttr<TrivialABIAttr>();
7211 Record->setHasTrivialSpecialMemberForCall();
7221 auto CheckCompletedMemberFunction = [&](
CXXMethodDecl *MD) {
7232 MD->
isDeleted() ? diag::err_deleted_override
7233 : diag::err_non_deleted_override,
7235 return MD->isDeleted() != V->isDeleted();
7247 : diag::err_non_consteval_override,
7249 return MD->isConsteval() != V->isConsteval();
7258 auto CheckForDefaultedFunction = [&](
FunctionDecl *FD) ->
bool {
7265 DefaultedSecondaryComparisons.push_back(FD);
7273 if (!
Record->isInvalidDecl() &&
7274 Record->hasAttr<VTablePointerAuthenticationAttr>())
7279 bool Incomplete = CheckForDefaultedFunction(M);
7282 if (
Record->isDependentType())
7288 if (!M->isImplicit() && !M->isUserProvided()) {
7292 Record->finishedDefaultedOrDeletedMember(M);
7293 M->setTrivialForCall(
7297 Record->setTrivialForCallFlags(M);
7306 M->isUserProvided()) {
7307 M->setTrivialForCall(HasTrivialABI);
7308 Record->setTrivialForCallFlags(M);
7311 if (!M->isInvalidDecl() && M->isExplicitlyDefaulted() &&
7312 M->hasAttr<DLLExportAttr>()) {
7318 M->dropAttr<DLLExportAttr>();
7320 if (M->hasAttr<DLLExportAttr>()) {
7326 bool EffectivelyConstexprDestructor =
true;
7331 llvm::SmallDenseSet<QualType> Visited;
7332 auto Check = [&Visited](
QualType T,
auto &&Check) ->
bool {
7333 if (!Visited.insert(
T->getCanonicalTypeUnqualified()).second)
7336 T->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
7344 if (!Check(B.getType(), Check))
7347 if (!Check(FD->
getType(), Check))
7351 EffectivelyConstexprDestructor =
7359 M->isDefaulted() && M->isConstexpr() && M->size_overridden_methods() &&
7360 EffectivelyConstexprDestructor)
7364 CheckCompletedMemberFunction(M);
7373 CompleteMemberFunction(Dtor);
7375 bool HasMethodWithOverrideControl =
false,
7376 HasOverridingMethodWithoutOverrideControl =
false;
7377 for (
auto *D :
Record->decls()) {
7378 if (
auto *M = dyn_cast<CXXMethodDecl>(D)) {
7381 if (!
Record->isDependentType()) {
7387 if (M->hasAttr<OverrideAttr>()) {
7388 HasMethodWithOverrideControl =
true;
7389 }
else if (M->size_overridden_methods() > 0) {
7390 HasOverridingMethodWithoutOverrideControl =
true;
7393 if (M->isVirtualAsWritten() &&
Record->isEffectivelyFinal()) {
7394 Diag(M->getLocation(), diag::warn_unnecessary_virtual_specifier)
7401 CompleteMemberFunction(M);
7402 }
else if (
auto *F = dyn_cast<FriendDecl>(D)) {
7403 CheckForDefaultedFunction(
7404 dyn_cast_or_null<FunctionDecl>(F->getFriendDecl()));
7408 if (HasOverridingMethodWithoutOverrideControl) {
7409 bool HasInconsistentOverrideControl = HasMethodWithOverrideControl;
7410 for (
auto *M :
Record->methods())
7415 for (
FunctionDecl *FD : DefaultedSecondaryComparisons) {
7419 if (
auto *MD = dyn_cast<CXXMethodDecl>(FD))
7420 CheckCompletedMemberFunction(MD);
7441 if (
Context.getLangOpts().getLayoutCompatibility() ==
7445 Diag(
Record->getLocation(), diag::warn_cxx_ms_struct);
7451 bool ClangABICompat4 =
7452 Context.getLangOpts().isCompatibleWith(LangOptions::ClangABI::Ver4);
7454 Context.getTargetInfo().getCallingConvKind(ClangABICompat4);
7459 if (
Record->getArgPassingRestrictions() !=
7461 Record->setArgPassingRestrictions(
7469 if (
Context.getTargetInfo().getCXXABI().areArgsDestroyedLeftToRightInCallee())
7470 Record->setParamDestroyedInCallee(
true);
7471 else if (
Record->hasNonTrivialDestructor())
7472 Record->setParamDestroyedInCallee(CanPass);
7481 if (
Record->hasAttr<CUDADeviceBuiltinSurfaceTypeAttr>())
7483 else if (
Record->hasAttr<CUDADeviceBuiltinTextureTypeAttr>())
7489 TypeAwareDecls{{OO_New, {}},
7492 {OO_Array_New, {}}};
7493 for (
auto *D :
Record->decls()) {
7500 auto CheckMismatchedTypeAwareAllocators =
7503 auto &NewDecls = TypeAwareDecls[NewKind];
7504 auto &DeleteDecls = TypeAwareDecls[DeleteKind];
7505 if (NewDecls.empty() == DeleteDecls.empty())
7508 Context.DeclarationNames.getCXXOperatorName(
7509 NewDecls.empty() ? DeleteKind : NewKind);
7511 Context.DeclarationNames.getCXXOperatorName(
7512 NewDecls.empty() ? NewKind : DeleteKind);
7514 diag::err_type_aware_allocator_missing_matching_operator)
7517 for (
auto MD : NewDecls)
7519 diag::note_unmatched_type_aware_allocator_declared)
7521 for (
auto MD : DeleteDecls)
7523 diag::note_unmatched_type_aware_allocator_declared)
7526 CheckMismatchedTypeAwareAllocators(OO_New, OO_Delete);
7527 CheckMismatchedTypeAwareAllocators(OO_Array_New, OO_Array_Delete);
7543 unsigned LHSQuals = 0;
7546 LHSQuals = FieldQuals;
7548 unsigned RHSQuals = FieldQuals;
7570 llvm::DenseMap<CXXRecordDecl *, ConstructorUsingShadowDecl *>
7576 : S(S), UseLoc(UseLoc) {
7577 bool DiagnosedMultipleConstructedBases =
false;
7583 for (
auto *D : Shadow->
redecls()) {
7584 auto *DShadow = cast<ConstructorUsingShadowDecl>(D);
7585 auto *DNominatedBase = DShadow->getNominatedBaseClass();
7586 auto *DConstructedBase = DShadow->getConstructedBaseClass();
7588 InheritedFromBases.insert(
7589 std::make_pair(DNominatedBase->getCanonicalDecl(),
7590 DShadow->getNominatedBaseClassShadowDecl()));
7591 if (DShadow->constructsVirtualBase())
7592 InheritedFromBases.insert(
7593 std::make_pair(DConstructedBase->getCanonicalDecl(),
7594 DShadow->getConstructedBaseClassShadowDecl()));
7596 assert(DNominatedBase == DConstructedBase);
7601 if (!ConstructedBase) {
7602 ConstructedBase = DConstructedBase;
7603 ConstructedBaseIntroducer = D->getIntroducer();
7604 }
else if (ConstructedBase != DConstructedBase &&
7606 if (!DiagnosedMultipleConstructedBases) {
7607 S.Diag(UseLoc, diag::err_ambiguous_inherited_constructor)
7608 << Shadow->getTargetDecl();
7609 S.Diag(ConstructedBaseIntroducer->getLocation(),
7610 diag::note_ambiguous_inherited_constructor_using)
7612 DiagnosedMultipleConstructedBases = true;
7614 S.Diag(D->getIntroducer()->getLocation(),
7615 diag::note_ambiguous_inherited_constructor_using)
7616 << DConstructedBase;
7620 if (DiagnosedMultipleConstructedBases)
7621 Shadow->setInvalidDecl();
7627 std::pair<CXXConstructorDecl *, bool>
7629 auto It = InheritedFromBases.find(
Base->getCanonicalDecl());
7630 if (It == InheritedFromBases.end())
7631 return std::make_pair(
nullptr,
false);
7635 return std::make_pair(
7636 S.findInheritingConstructor(UseLoc, Ctor, It->second),
7637 It->second->constructsVirtualBase());
7640 return std::make_pair(Ctor,
false);
7657 if (InheritedCtor) {
7660 Inherited->findConstructorForBase(ClassDecl, InheritedCtor).first;
7662 return BaseCtor->isConstexpr();
7730 if (Ctor && ClassDecl->
isUnion())
7750 for (
const auto &B : ClassDecl->
bases()) {
7751 auto *BaseClassDecl = B.getType()->getAsCXXRecordDecl();
7755 InheritedCtor, Inherited))
7768 for (
const auto *F : ClassDecl->
fields()) {
7769 if (F->isInvalidDecl())
7772 F->hasInClassInitializer())
7775 if (
const RecordType *RecordTy = BaseType->getAsCanonical<RecordType>()) {
7776 auto *FieldRecDecl =
7779 BaseType.getCVRQualifiers(),
7780 ConstArg && !F->isMutable()))
7795struct ComputingExceptionSpec {
7798 ComputingExceptionSpec(Sema &S, FunctionDecl *FD, SourceLocation Loc)
7800 Sema::CodeSynthesisContext Ctx;
7806 ~ComputingExceptionSpec() {
7812static Sema::ImplicitExceptionSpecification
7816 Sema::InheritedConstructorInfo *ICI);
7818static Sema::ImplicitExceptionSpecification
7823static Sema::ImplicitExceptionSpecification
7826 if (DFK.isSpecialMember())
7829 if (DFK.isComparison())
7831 DFK.asComparison());
7834 assert(CD->getInheritedConstructor() &&
7835 "only defaulted functions and inherited constructors have implicit "
7838 S, Loc, CD->getInheritedConstructor().getShadowDecl());
7865 auto ESI = IES.getExceptionSpec();
7883 PT.getNonReferenceType()->getAsCXXRecordDecl()) {
7904 "not an explicitly-defaulted special member");
7914 bool HadError =
false;
7927 bool ShouldDeleteForTypeMismatch =
false;
7928 unsigned ExpectedParams = 1;
7940 if (DeleteOnTypeMismatch)
7941 ShouldDeleteForTypeMismatch =
true;
7951 bool CanHaveConstParam =
false;
7961 ReturnType =
Type->getReturnType();
7966 std::nullopt, RD,
false);
7967 DeclType =
Context.getAddrSpaceQualType(
7969 QualType ExpectedReturnType =
Context.getLValueReferenceType(DeclType);
7971 if (!
Context.hasSameType(ReturnType, ExpectedReturnType)) {
7972 Diag(MD->
getLocation(), diag::err_defaulted_special_member_return_type)
7974 << ExpectedReturnType;
7980 if (DeleteOnTypeMismatch)
7981 ShouldDeleteForTypeMismatch =
true;
7998 if (!ExplicitObjectParameter.
isNull() &&
8001 Context.getCanonicalTagType(RD)))) {
8002 if (DeleteOnTypeMismatch)
8003 ShouldDeleteForTypeMismatch =
true;
8006 diag::err_defaulted_special_member_explicit_object_mismatch)
8019 bool HasConstParam =
false;
8020 if (ExpectedParams &&
ArgType->isReferenceType()) {
8026 if (DeleteOnTypeMismatch)
8027 ShouldDeleteForTypeMismatch =
true;
8030 diag::err_defaulted_special_member_volatile_param)
8036 if (HasConstParam && !CanHaveConstParam) {
8037 if (DeleteOnTypeMismatch)
8038 ShouldDeleteForTypeMismatch =
true;
8042 diag::err_defaulted_special_member_copy_const_param)
8048 diag::err_defaulted_special_member_move_const_param)
8053 }
else if (ExpectedParams) {
8057 "unexpected non-ref argument");
8091 diag::err_incorrect_defaulted_constexpr_with_vb)
8093 for (
const auto &I : RD->
vbases())
8094 Diag(I.getBeginLoc(), diag::note_constexpr_virtual_base_here);
8112 if (!
Type->hasExceptionSpec()) {
8121 Context.getFunctionType(ReturnType,
Type->getParamTypes(), EPI));
8130 if (ShouldDeleteForTypeMismatch) {
8135 Diag(DefaultLoc, diag::note_replace_equals_default_to_delete)
8139 if (ShouldDeleteForTypeMismatch && !HadError) {
8141 diag::warn_cxx17_compat_defaulted_method_type_mismatch)
8148 Diag(MD->
getLocation(), diag::err_out_of_line_default_deletes) << CSM;
8149 assert(!ShouldDeleteForTypeMismatch &&
"deleted non-first decl");
8171template<
typename Derived,
typename ResultList,
typename Result,
8173class DefaultedComparisonVisitor {
8177 : S(S), RD(RD), FD(FD), DCK(DCK) {
8181 Fns.assign(Info->getUnqualifiedLookups().begin(),
8182 Info->getUnqualifiedLookups().end());
8186 ResultList visit() {
8195 llvm_unreachable(
"not a defaulted comparison");
8199 getDerived().visitSubobjects(Results, RD, ParamLvalType.
getQualifiers());
8204 Results.add(getDerived().visitExpandedSubobject(
8205 ParamLvalType, getDerived().getCompleteObject()));
8208 llvm_unreachable(
"");
8212 Derived &getDerived() {
return static_cast<Derived&
>(*this); }
8218 bool visitSubobjects(ResultList &Results, CXXRecordDecl *
Record,
8222 for (CXXBaseSpecifier &Base :
Record->bases())
8223 if (Results.add(getDerived().visitSubobject(
8225 getDerived().getBase(&Base))))
8229 for (FieldDecl *Field :
Record->fields()) {
8232 if (
Field->isUnnamedBitField())
8234 if (
Field->isInvalidDecl())
8237 if (
Field->isAnonymousStructOrUnion()) {
8238 if (visitSubobjects(Results,
Field->getType()->getAsCXXRecordDecl(),
8245 Qualifiers FieldQuals = Quals;
8246 if (
Field->isMutable())
8248 QualType FieldType =
8251 if (Results.add(getDerived().visitSubobject(
8252 FieldType, getDerived().getField(Field))))
8260 Result visitSubobject(QualType
Type, Subobject Subobj) {
8263 if (
auto *CAT = dyn_cast_or_null<ConstantArrayType>(AT))
8264 return getDerived().visitSubobjectArray(CAT->getElementType(),
8265 CAT->getSize(), Subobj);
8266 return getDerived().visitExpandedSubobject(
Type, Subobj);
8269 Result visitSubobjectArray(QualType
Type,
const llvm::APInt &Size,
8271 return getDerived().visitSubobject(
Type, Subobj);
8279 UnresolvedSet<16> Fns;
8284struct DefaultedComparisonInfo {
8289 static DefaultedComparisonInfo deleted() {
8290 DefaultedComparisonInfo
Deleted;
8295 bool add(
const DefaultedComparisonInfo &R) {
8305struct DefaultedComparisonSubobject {
8313class DefaultedComparisonAnalyzer
8314 :
public DefaultedComparisonVisitor<DefaultedComparisonAnalyzer,
8315 DefaultedComparisonInfo,
8316 DefaultedComparisonInfo,
8317 DefaultedComparisonSubobject> {
8319 enum DiagnosticKind { NoDiagnostics, ExplainDeleted, ExplainConstexpr };
8322 DiagnosticKind Diagnose;
8325 using Base = DefaultedComparisonVisitor;
8326 using Result = DefaultedComparisonInfo;
8327 using Subobject = DefaultedComparisonSubobject;
8331 DefaultedComparisonAnalyzer(Sema &S, CXXRecordDecl *RD, FunctionDecl *FD,
8333 DiagnosticKind Diagnose = NoDiagnostics)
8334 :
Base(S, RD, FD, DCK), Diagnose(Diagnose) {}
8337 if ((DCK == DefaultedComparisonKind::Equal ||
8338 DCK == DefaultedComparisonKind::ThreeWay) &&
8343 if (Diagnose == ExplainDeleted) {
8347 return Result::deleted();
8350 return Base::visit();
8354 Subobject getCompleteObject() {
8355 return Subobject{Subobject::CompleteObject, RD, FD->
getLocation()};
8358 Subobject getBase(CXXBaseSpecifier *Base) {
8359 return Subobject{Subobject::Base,
Base->getType()->getAsCXXRecordDecl(),
8360 Base->getBaseTypeLoc()};
8363 Subobject getField(FieldDecl *Field) {
8364 return Subobject{Subobject::Member,
Field,
Field->getLocation()};
8367 Result visitExpandedSubobject(QualType
Type, Subobject Subobj) {
8371 if (
Type->isReferenceType()) {
8372 if (Diagnose == ExplainDeleted) {
8373 S.
Diag(Subobj.Loc, diag::note_defaulted_comparison_reference_member)
8376 return Result::deleted();
8381 Expr *Args[] = {&Xi, &Xi};
8385 assert(OO !=
OO_None &&
"not an overloaded operator!");
8386 return visitBinaryOperator(OO, Args, Subobj);
8392 OverloadCandidateSet *SpaceshipCandidates =
nullptr) {
8396 OverloadCandidateSet CandidateSet(
8398 OverloadCandidateSet::OperatorRewriteInfo(
8400 !SpaceshipCandidates));
8405 CandidateSet.exclude(FD);
8407 if (Args[0]->
getType()->isOverloadableType())
8418 switch (CandidateSet.BestViableFunction(S, FD->
getLocation(), Best)) {
8424 if ((DCK == DefaultedComparisonKind::NotEqual ||
8425 DCK == DefaultedComparisonKind::Relational) &&
8426 !Best->RewriteKind) {
8427 if (Diagnose == ExplainDeleted) {
8428 if (Best->Function) {
8429 S.
Diag(Best->Function->getLocation(),
8430 diag::note_defaulted_comparison_not_rewritten_callee)
8433 assert(Best->Conversions.size() == 2 &&
8434 Best->Conversions[0].isUserDefined() &&
8435 "non-user-defined conversion from class to built-in "
8437 S.
Diag(Best->Conversions[0]
8438 .UserDefined.FoundConversionFunction.getDecl()
8440 diag::note_defaulted_comparison_not_rewritten_conversion)
8444 return Result::deleted();
8454 CXXRecordDecl *ArgClass = Args[0]->getType()->getAsCXXRecordDecl();
8455 if (ArgClass && Best->FoundDecl.getDecl() &&
8456 Best->FoundDecl.getDecl()->isCXXClassMember()) {
8457 QualType ObjectType = Subobj.Kind == Subobject::Member
8458 ? Args[0]->getType()
8461 ArgClass, Best->FoundDecl, ObjectType, Subobj.Loc,
8462 Diagnose == ExplainDeleted
8463 ? S.
PDiag(diag::note_defaulted_comparison_inaccessible)
8464 << FD << Subobj.Kind << Subobj.Decl
8466 return Result::deleted();
8469 bool NeedsDeducing =
8472 if (FunctionDecl *BestFD = Best->Function) {
8477 assert(!BestFD->isDeleted() &&
"wrong overload resolution result");
8479 if (Diagnose == ExplainConstexpr && !BestFD->isConstexpr()) {
8480 if (Subobj.Kind != Subobject::CompleteObject)
8481 S.
Diag(Subobj.Loc, diag::note_defaulted_comparison_not_constexpr)
8482 << Subobj.
Kind << Subobj.Decl;
8483 S.
Diag(BestFD->getLocation(),
8484 diag::note_defaulted_comparison_not_constexpr_here);
8486 return Result::deleted();
8488 R.Constexpr &= BestFD->isConstexpr();
8490 if (NeedsDeducing) {
8495 if (BestFD->getReturnType()->isUndeducedType() &&
8501 if (Diagnose == NoDiagnostics) {
8504 diag::err_defaulted_comparison_cannot_deduce_undeduced_auto)
8505 << Subobj.
Kind << Subobj.Decl;
8508 diag::note_defaulted_comparison_cannot_deduce_undeduced_auto)
8509 << Subobj.
Kind << Subobj.Decl;
8510 S.
Diag(BestFD->getLocation(),
8511 diag::note_defaulted_comparison_cannot_deduce_callee)
8512 << Subobj.
Kind << Subobj.Decl;
8514 return Result::deleted();
8517 BestFD->getCallResultType());
8519 if (Diagnose == ExplainDeleted) {
8520 S.
Diag(Subobj.Loc, diag::note_defaulted_comparison_cannot_deduce)
8521 << Subobj.
Kind << Subobj.Decl
8522 << BestFD->getCallResultType().withoutLocalFastQualifiers();
8523 S.
Diag(BestFD->getLocation(),
8524 diag::note_defaulted_comparison_cannot_deduce_callee)
8525 << Subobj.
Kind << Subobj.Decl;
8527 return Result::deleted();
8529 R.Category = Info->Kind;
8532 QualType
T = Best->BuiltinParamTypes[0];
8533 assert(
T == Best->BuiltinParamTypes[1] &&
8534 "builtin comparison for different types?");
8535 assert(Best->BuiltinParamTypes[2].isNull() &&
8536 "invalid builtin comparison");
8541 if (Diagnose == ExplainDeleted) {
8543 diag::note_defaulted_comparison_vector_types)
8545 S.
Diag(Subobj.Decl->getLocation(), diag::note_declared_at);
8547 return Result::deleted();
8550 if (NeedsDeducing) {
8551 std::optional<ComparisonCategoryType> Cat =
8553 assert(Cat &&
"no category for builtin comparison?");
8564 if (Diagnose == ExplainDeleted) {
8567 Kind = OO == OO_EqualEqual ? 1 : 2;
8568 CandidateSet.NoteCandidates(
8570 Subobj.Loc, S.
PDiag(diag::note_defaulted_comparison_ambiguous)
8571 << FD << Kind << Subobj.Kind << Subobj.Decl),
8574 R = Result::deleted();
8578 if (Diagnose == ExplainDeleted) {
8579 if ((DCK == DefaultedComparisonKind::NotEqual ||
8580 DCK == DefaultedComparisonKind::Relational) &&
8581 !Best->RewriteKind) {
8582 S.
Diag(Best->Function->getLocation(),
8583 diag::note_defaulted_comparison_not_rewritten_callee)
8587 diag::note_defaulted_comparison_calls_deleted)
8588 << FD << Subobj.
Kind << Subobj.Decl;
8592 R = Result::deleted();
8598 if (OO == OO_Spaceship &&
8602 if (!
R.add(visitBinaryOperator(OO_EqualEqual, Args, Subobj,
8604 R.add(visitBinaryOperator(OO_Less, Args, Subobj, &CandidateSet));
8608 if (Diagnose == ExplainDeleted) {
8609 S.
Diag(Subobj.Loc, diag::note_defaulted_comparison_no_viable_function)
8610 << FD << (OO == OO_EqualEqual || OO == OO_ExclaimEqual)
8611 << Subobj.
Kind << Subobj.Decl;
8615 if (SpaceshipCandidates) {
8616 SpaceshipCandidates->NoteCandidates(
8621 diag::note_defaulted_comparison_no_viable_function_synthesized)
8622 << (OO == OO_EqualEqual ? 0 : 1);
8625 CandidateSet.NoteCandidates(
8630 R = Result::deleted();
8639struct StmtListResult {
8640 bool IsInvalid =
false;
8641 llvm::SmallVector<Stmt*, 16> Stmts;
8644 IsInvalid |= S.isInvalid();
8647 Stmts.push_back(S.get());
8654class DefaultedComparisonSynthesizer
8655 :
public DefaultedComparisonVisitor<DefaultedComparisonSynthesizer,
8656 StmtListResult, StmtResult,
8657 std::pair<ExprResult, ExprResult>> {
8659 unsigned ArrayDepth = 0;
8662 using Base = DefaultedComparisonVisitor;
8663 using ExprPair = std::pair<ExprResult, ExprResult>;
8667 DefaultedComparisonSynthesizer(Sema &S, CXXRecordDecl *RD, FunctionDecl *FD,
8669 SourceLocation BodyLoc)
8670 :
Base(S, RD, FD, DCK), Loc(BodyLoc) {}
8674 Sema::CompoundScopeRAII CompoundScope(S);
8676 StmtListResult Stmts = visit();
8677 if (Stmts.IsInvalid)
8682 case DefaultedComparisonKind::None:
8683 llvm_unreachable(
"not a defaulted comparison");
8685 case DefaultedComparisonKind::Equal: {
8694 auto OldStmts = std::move(Stmts.Stmts);
8695 Stmts.Stmts.clear();
8698 auto FinishCmp = [&] {
8699 if (Expr *Prior = CmpSoFar.
get()) {
8701 if (RetVal.
isUnset() && Stmts.Stmts.empty())
8704 else if (Stmts.add(buildIfNotCondReturnFalse(Prior)))
8710 for (Stmt *EAsStmt : llvm::reverse(OldStmts)) {
8711 Expr *E = dyn_cast<Expr>(EAsStmt);
8714 if (FinishCmp() || Stmts.add(EAsStmt))
8723 CmpSoFar = S.CreateBuiltinBinOp(Loc, BO_LAnd, E, CmpSoFar.
get());
8729 std::reverse(Stmts.Stmts.begin(), Stmts.Stmts.end());
8732 RetVal = S.ActOnCXXBoolLiteral(Loc, tok::kw_true);
8736 case DefaultedComparisonKind::ThreeWay: {
8740 ComparisonCategoryType::StrongOrdering, Loc,
8741 Sema::ComparisonCategoryUsage::DefaultedOperator);
8744 VarDecl *EqualVD = S.Context.CompCategories.getInfoForType(
StrongOrdering)
8745 .getValueInfo(ComparisonCategoryResult::Equal)
8747 RetVal = getDecl(EqualVD);
8750 RetVal = buildStaticCastToR(RetVal.
get());
8754 case DefaultedComparisonKind::NotEqual:
8755 case DefaultedComparisonKind::Relational:
8756 RetVal =
cast<Expr>(Stmts.Stmts.pop_back_val());
8763 StmtResult ReturnStmt = S.BuildReturnStmt(Loc, RetVal.
get());
8764 if (ReturnStmt.isInvalid())
8766 Stmts.Stmts.push_back(ReturnStmt.get());
8768 return S.ActOnCompoundStmt(Loc, Loc, Stmts.Stmts,
false);
8773 return S.BuildDeclarationNameExpr(
8774 CXXScopeSpec(), DeclarationNameInfo(VD->
getDeclName(), Loc), VD);
8782 ExprPair getCompleteObject() {
8785 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD);
8786 MD && MD->isImplicitObjectMemberFunction()) {
8788 LHS = S.ActOnCXXThis(Loc);
8790 LHS = S.CreateBuiltinUnaryOp(Loc, UO_Deref, LHS.
get());
8792 LHS = getParam(Param++);
8799 ExprPair getBase(CXXBaseSpecifier *Base) {
8800 ExprPair Obj = getCompleteObject();
8801 if (Obj.first.isInvalid() || Obj.second.isInvalid())
8804 const auto CastToBase = [&](Expr *E) {
8805 QualType ToType = S.Context.getQualifiedType(
8807 return S.ImpCastExprToType(E, ToType, CK_DerivedToBase,
VK_LValue, &Path);
8809 return {CastToBase(Obj.first.get()), CastToBase(Obj.second.get())};
8812 ExprPair getField(FieldDecl *Field) {
8813 ExprPair Obj = getCompleteObject();
8814 if (Obj.first.isInvalid() || Obj.second.isInvalid())
8818 DeclarationNameInfo NameInfo(
Field->getDeclName(), Loc);
8819 return {S.BuildFieldReferenceExpr(Obj.first.get(),
false, Loc,
8820 CXXScopeSpec(), Field,
Found, NameInfo),
8821 S.BuildFieldReferenceExpr(Obj.second.get(),
false, Loc,
8822 CXXScopeSpec(), Field,
Found, NameInfo)};
8832 ExprResult NotCond = S.CreateBuiltinUnaryOp(Loc, UO_LNot, Cond.
get());
8837 assert(!
False.isInvalid() &&
"should never fail");
8839 if (ReturnFalse.isInvalid())
8842 return S.ActOnIfStmt(Loc, IfStatementKind::Ordinary, Loc,
nullptr,
8843 S.ActOnCondition(
nullptr, Loc, NotCond.
get(),
8844 Sema::ConditionKind::Boolean),
8845 Loc, ReturnFalse.get(), SourceLocation(),
nullptr);
8850 QualType SizeType = S.Context.getSizeType();
8851 Size =
Size.zextOrTrunc(S.Context.getTypeSize(SizeType));
8854 IdentifierInfo *IterationVarName =
nullptr;
8857 llvm::raw_svector_ostream
OS(Str);
8858 OS <<
"i" << ArrayDepth;
8859 IterationVarName = &S.Context.Idents.get(
OS.str());
8862 S.Context, S.CurContext, Loc, Loc, IterationVarName, SizeType,
8863 S.Context.getTrivialTypeSourceInfo(SizeType, Loc),
SC_None);
8864 llvm::APInt
Zero(S.Context.getTypeSize(SizeType), 0);
8867 Stmt *
Init =
new (S.Context) DeclStmt(DeclGroupRef(IterationVar), Loc, Loc);
8869 auto IterRef = [&] {
8871 CXXScopeSpec(), DeclarationNameInfo(IterationVarName, Loc),
8873 assert(!Ref.
isInvalid() &&
"can't reference our own variable?");
8879 Loc, BO_NE, IterRef(),
8881 assert(!Cond.
isInvalid() &&
"should never fail");
8884 ExprResult Inc = S.CreateBuiltinUnaryOp(Loc, UO_PreInc, IterRef());
8885 assert(!
Inc.isInvalid() &&
"should never fail");
8891 return S.CreateBuiltinArraySubscriptExpr(E.get(), Loc, IterRef(), Loc);
8893 Subobj.first = Index(Subobj.first);
8894 Subobj.second = Index(Subobj.second);
8901 if (Substmt.isInvalid())
8907 if (Expr *ElemCmp = dyn_cast<Expr>(Substmt.get())) {
8908 assert(DCK == DefaultedComparisonKind::Equal &&
8909 "should have non-expression statement");
8910 Substmt = buildIfNotCondReturnFalse(ElemCmp);
8911 if (Substmt.isInvalid())
8916 return S.ActOnForStmt(Loc, Loc,
Init,
8917 S.ActOnCondition(
nullptr, Loc, Cond.
get(),
8918 Sema::ConditionKind::Boolean),
8919 S.MakeFullDiscardedValueExpr(
Inc.get()), Loc,
8924 if (Obj.first.isInvalid() || Obj.second.isInvalid())
8930 if (
Type->isOverloadableType())
8931 Op = S.CreateOverloadedBinOp(Loc, Opc, Fns, Obj.first.get(),
8932 Obj.second.get(),
true,
8935 Op = S.CreateBuiltinBinOp(Loc, Opc, Obj.first.get(), Obj.second.get());
8940 case DefaultedComparisonKind::None:
8941 llvm_unreachable(
"not a defaulted comparison");
8943 case DefaultedComparisonKind::Equal:
8946 Op = S.PerformContextuallyConvertToBool(Op.
get());
8951 case DefaultedComparisonKind::ThreeWay: {
8956 Op = buildStaticCastToR(Op.
get());
8961 IdentifierInfo *Name = &S.Context.Idents.get(
"cmp");
8964 S.Context.getTrivialTypeSourceInfo(R, Loc),
SC_None);
8965 S.AddInitializerToDecl(VD, Op.
get(),
false);
8966 Stmt *InitStmt =
new (S.Context) DeclStmt(DeclGroupRef(VD), Loc, Loc);
8972 llvm::APInt ZeroVal(S.Context.getIntWidth(S.Context.IntTy), 0);
8977 Comp = S.CreateOverloadedBinOp(Loc, BO_NE, Fns, VDRef.
get(),
Zero,
true,
8980 Comp = S.CreateBuiltinBinOp(Loc, BO_NE, VDRef.
get(),
Zero);
8981 if (
Comp.isInvalid())
8983 Sema::ConditionResult Cond = S.ActOnCondition(
8984 nullptr, Loc,
Comp.get(), Sema::ConditionKind::Boolean);
8989 VDRef = getDecl(VD);
8992 StmtResult ReturnStmt = S.BuildReturnStmt(Loc, VDRef.
get());
8993 if (ReturnStmt.isInvalid())
8997 return S.ActOnIfStmt(Loc, IfStatementKind::Ordinary, Loc, InitStmt, Cond,
8998 Loc, ReturnStmt.get(),
8999 SourceLocation(),
nullptr);
9002 case DefaultedComparisonKind::NotEqual:
9003 case DefaultedComparisonKind::Relational:
9008 llvm_unreachable(
"");
9014 assert(!
R->isUndeducedType() &&
"type should have been deduced already");
9019 return S.BuildCXXNamedCast(Loc, tok::kw_static_cast,
9020 S.Context.getTrivialTypeSourceInfo(R, Loc), E,
9021 SourceRange(Loc, Loc), SourceRange(Loc, Loc));
9032 Self.LookupOverloadedOperatorName(OO, S, Operators);
9045 if (Op == OO_Spaceship) {
9046 Lookup(OO_ExclaimEqual);
9048 Lookup(OO_EqualEqual);
9079 assert(!MD->isStatic() &&
"comparison function cannot be a static member");
9081 if (MD->getRefQualifier() ==
RQ_RValue) {
9082 Diag(MD->getLocation(), diag::err_ref_qualifier_comparison_operator);
9088 MD->setType(
Context.getFunctionType(FPT->getReturnType(),
9089 FPT->getParamTypes(), EPI));
9095 QualType T = MD->getFunctionObjectParameterReferenceType();
9096 if (!
T.getNonReferenceType().isConstQualified() &&
9097 (MD->isImplicitObjectMemberFunction() ||
T->isLValueReferenceType())) {
9099 if (MD->isExplicitObjectMemberFunction()) {
9100 Loc = MD->getParamDecl(0)->getBeginLoc();
9102 MD->getParamDecl(0)->getExplicitObjectParamThisLoc());
9104 Loc = MD->getLocation();
9110 if (!MD->isImplicit()) {
9111 Diag(Loc, diag::err_defaulted_comparison_non_const)
9116 if (MD->isExplicitObjectMemberFunction()) {
9117 assert(
T->isLValueReferenceType());
9118 MD->getParamDecl(0)->setType(
Context.getLValueReferenceType(
9119 T.getNonReferenceType().withConst()));
9124 MD->setType(
Context.getFunctionType(FPT->getReturnType(),
9125 FPT->getParamTypes(), EPI));
9129 if (MD->isVolatile()) {
9130 Diag(MD->getLocation(), diag::err_volatile_comparison_operator);
9136 MD->setType(
Context.getFunctionType(FPT->getReturnType(),
9137 FPT->getParamTypes(), EPI));
9143 (IsMethod ? 1 : 2)) {
9147 <<
int(IsMethod) <<
int(DCK);
9153 QualType ParmTy = Param->getType();
9160 ExpectedTy =
Context.getCanonicalTagType(RD);
9162 CTy = Ref->getPointeeType();
9172 RD = CTy->getAsCXXRecordDecl();
9173 Ok &= RD !=
nullptr;
9187 <<
int(DCK) << ParmTy << RefTy <<
int(!IsMethod) << PlainTy
9188 << Param->getSourceRange();
9190 assert(!IsMethod &&
"should know expected type for method");
9192 diag::err_defaulted_comparison_param_unknown)
9193 <<
int(DCK) << ParmTy << Param->getSourceRange();
9199 Diag(FD->
getLocation(), diag::err_defaulted_comparison_param_mismatch)
9201 << ParmTy << Param->getSourceRange();
9206 assert(RD &&
"must have determined class");
9215 diag::err_defaulted_comparison_not_friend,
int(DCK),
9220 return declaresSameEntity(F->getFriendDecl(), FD);
9223 <<
int(DCK) <<
int(0) << RD;
9235 Diag(FD->
getLocation(), diag::err_defaulted_comparison_return_type_not_bool)
9245 RT->getContainedDeducedType() &&
9247 RT->getContainedAutoType()->isConstrained())) {
9249 diag::err_defaulted_comparison_deduced_return_type_not_auto)
9261 DefaultedComparisonInfo Info =
9262 DefaultedComparisonAnalyzer(*
this, RD, FD, DCK).visit();
9276 DefaultedComparisonAnalyzer(*
this, RD, FD, DCK,
9277 DefaultedComparisonAnalyzer::ExplainDeleted)
9288 diag::note_previous_declaration);
9300 DefaultedComparisonAnalyzer(*
this, RD, FD, DCK,
9301 DefaultedComparisonAnalyzer::ExplainDeleted)
9323 Context.adjustDeducedFunctionResultType(
9351 Diag(FD->
getBeginLoc(), diag::err_defaulted_comparison_constexpr_mismatch)
9353 DefaultedComparisonAnalyzer(*
this, RD, FD, DCK,
9354 DefaultedComparisonAnalyzer::ExplainConstexpr)
9375 EPI.ExceptionSpec.SourceDecl = FD;
9377 FPT->getParamTypes(), EPI));
9392 EqualEqual->setImplicit();
9407 Scope.addContextNote(UseLoc);
9409 DefaultedFunctionFPFeaturesRAII RestoreFP(*
this, FD);
9416 CXXRecordDecl *RD = PT.getNonReferenceType()->getAsCXXRecordDecl();
9420 DefaultedComparisonSynthesizer(*
this, RD, FD, DCK, BodyLoc).build();
9434 L->CompletedImplicitDefinition(FD);
9441 ComputingExceptionSpec CES(S, FD, Loc);
9471 DefaultedComparisonSynthesizer(S, RD, FD, DCK, BodyLoc).build();
9472 if (!Body.isInvalid())
9493 for (
auto &Check : Overriding)
9505template<
typename Derived>
9506struct SpecialMemberVisitor {
9513 bool IsConstructor =
false, IsAssignment =
false, ConstArg =
false;
9517 : S(S), MD(MD), CSM(CSM), ICI(ICI) {
9522 IsConstructor =
true;
9526 IsAssignment =
true;
9531 llvm_unreachable(
"invalid special member kind");
9535 if (const ReferenceType *RT =
9536 MD->getNonObjectParameter(0)->getType()->getAs<ReferenceType>())
9537 ConstArg = RT->getPointeeType().isConstQualified();
9541 Derived &getDerived() {
return static_cast<Derived&
>(*this); }
9544 bool isMove()
const {
9545 return CSM == CXXSpecialMemberKind::MoveConstructor ||
9546 CSM == CXXSpecialMemberKind::MoveAssignment;
9550 Sema::SpecialMemberOverloadResult lookupIn(CXXRecordDecl *
Class,
9551 unsigned Quals,
bool IsMutable) {
9553 ConstArg && !IsMutable);
9558 Sema::SpecialMemberOverloadResult lookupInheritedCtor(CXXRecordDecl *
Class) {
9561 assert(CSM == CXXSpecialMemberKind::DefaultConstructor);
9570 typedef llvm::PointerUnion<CXXBaseSpecifier*, FieldDecl*> Subobject;
9573 static SourceLocation getSubobjectLoc(Subobject Subobj) {
9576 if (
auto *B = dyn_cast<CXXBaseSpecifier *>(Subobj))
9577 return B->getBaseTypeLoc();
9584 VisitNonVirtualBases,
9589 VisitPotentiallyConstructedBases,
9595 bool visit(BasesToVisit Bases) {
9598 if (Bases == VisitPotentiallyConstructedBases)
9599 Bases = RD->
isAbstract() ? VisitNonVirtualBases : VisitAllBases;
9601 for (
auto &B : RD->
bases())
9602 if ((Bases == VisitDirectBases || !B.isVirtual()) &&
9603 getDerived().visitBase(&B))
9606 if (Bases == VisitAllBases)
9607 for (
auto &B : RD->
vbases())
9608 if (getDerived().visitBase(&B))
9611 for (
auto *F : RD->
fields())
9612 if (!F->isInvalidDecl() && !F->isUnnamedBitField() &&
9613 getDerived().visitField(F))
9622struct SpecialMemberDeletionInfo
9623 : SpecialMemberVisitor<SpecialMemberDeletionInfo> {
9628 bool AllFieldsAreConst;
9630 SpecialMemberDeletionInfo(Sema &S, CXXMethodDecl *MD,
9632 Sema::InheritedConstructorInfo *ICI,
bool Diagnose)
9633 : SpecialMemberVisitor(S, MD, CSM, ICI), Diagnose(Diagnose),
9634 Loc(MD->getLocation()), AllFieldsAreConst(
true) {}
9639 return ICI ? CXXSpecialMemberKind::Invalid : CSM;
9642 bool shouldDeleteForVariantObjCPtrMember(FieldDecl *FD, QualType FieldType);
9644 bool shouldDeleteForVariantPtrAuthMember(
const FieldDecl *FD);
9646 bool visitBase(CXXBaseSpecifier *Base) {
return shouldDeleteForBase(Base); }
9647 bool visitField(FieldDecl *Field) {
return shouldDeleteForField(Field); }
9649 bool shouldDeleteForBase(CXXBaseSpecifier *Base);
9650 bool shouldDeleteForField(FieldDecl *FD);
9651 bool shouldDeleteForAllConstMembers();
9653 bool shouldDeleteForClassSubobject(CXXRecordDecl *
Class, Subobject Subobj,
9655 bool shouldDeleteForSubobjectCall(Subobject Subobj,
9656 Sema::SpecialMemberOverloadResult SMOR,
9657 bool IsDtorCallInCtor);
9659 bool isAccessible(Subobject Subobj, CXXMethodDecl *D);
9665bool SpecialMemberDeletionInfo::isAccessible(Subobject Subobj,
9666 CXXMethodDecl *target) {
9671 if (CXXBaseSpecifier *base = Subobj.dyn_cast<CXXBaseSpecifier*>()) {
9686bool SpecialMemberDeletionInfo::shouldDeleteForSubobjectCall(
9687 Subobject Subobj, Sema::SpecialMemberOverloadResult SMOR,
9688 bool IsDtorCallInCtor) {
9690 FieldDecl *
Field = Subobj.dyn_cast<FieldDecl*>();
9699 } DiagKind = NotSet;
9702 if (CSM == CXXSpecialMemberKind::DefaultConstructor && Field &&
9703 Field->getParent()->isUnion()) {
9713 DiagKind = !
Decl ? NoDecl : DeletedDecl;
9715 DiagKind = MultipleDecl;
9716 else if (!isAccessible(Subobj, Decl))
9717 DiagKind = InaccessibleDecl;
9718 else if (!IsDtorCallInCtor && Field &&
Field->getParent()->isUnion() &&
9719 !
Decl->isTrivial()) {
9725 if (CSM == CXXSpecialMemberKind::DefaultConstructor) {
9733 DiagKind = NonTrivialDecl;
9735 DiagKind = NonTrivialDecl;
9739 if (DiagKind == NotSet)
9745 diag::note_deleted_special_member_class_subobject)
9747 << DiagKind << IsDtorCallInCtor <<
false;
9751 diag::note_deleted_special_member_class_subobject)
9752 << getEffectiveCSM() << MD->
getParent() <<
false
9753 <<
Base->getType() << DiagKind << IsDtorCallInCtor
9757 if (DiagKind == DeletedDecl)
9767bool SpecialMemberDeletionInfo::shouldDeleteForClassSubobject(
9768 CXXRecordDecl *
Class, Subobject Subobj,
unsigned Quals) {
9769 FieldDecl *
Field = Subobj.dyn_cast<FieldDecl*>();
9770 bool IsMutable =
Field &&
Field->isMutable();
9786 if (!(CSM == CXXSpecialMemberKind::DefaultConstructor && Field &&
9787 Field->hasInClassInitializer()) &&
9788 shouldDeleteForSubobjectCall(Subobj, lookupIn(
Class, Quals, IsMutable),
9795 if (IsConstructor) {
9796 Sema::SpecialMemberOverloadResult SMOR =
9798 false,
false,
false,
false);
9799 if (shouldDeleteForSubobjectCall(Subobj, SMOR,
true))
9806bool SpecialMemberDeletionInfo::shouldDeleteForVariantObjCPtrMember(
9807 FieldDecl *FD, QualType FieldType) {
9816 if (CSM == CXXSpecialMemberKind::DefaultConstructor &&
9822 S.
Diag(FD->
getLocation(), diag::note_deleted_special_member_class_subobject)
9823 << getEffectiveCSM() << ParentClass <<
true << FD << 4
9830bool SpecialMemberDeletionInfo::shouldDeleteForVariantPtrAuthMember(
9831 const FieldDecl *FD) {
9840 if (CSM == CXXSpecialMemberKind::DefaultConstructor ||
9841 CSM == CXXSpecialMemberKind::Destructor)
9846 S.
Diag(FD->
getLocation(), diag::note_deleted_special_member_class_subobject)
9847 << getEffectiveCSM() << ParentClass <<
true << FD << 4
9856bool SpecialMemberDeletionInfo::shouldDeleteForBase(CXXBaseSpecifier *Base) {
9857 CXXRecordDecl *BaseClass =
Base->getType()->getAsCXXRecordDecl();
9864 Sema::SpecialMemberOverloadResult SMOR = lookupInheritedCtor(BaseClass);
9865 if (
auto *BaseCtor = SMOR.
getMethod()) {
9870 if (BaseCtor->isDeleted() && Diagnose) {
9872 diag::note_deleted_special_member_class_subobject)
9873 << getEffectiveCSM() << MD->
getParent() <<
false
9874 <<
Base->getType() << 1 <<
false
9878 return BaseCtor->isDeleted();
9880 return shouldDeleteForClassSubobject(BaseClass, Base, 0);
9885bool SpecialMemberDeletionInfo::shouldDeleteForField(FieldDecl *FD) {
9889 if (inUnion() && shouldDeleteForVariantObjCPtrMember(FD, FieldType))
9892 if (inUnion() && shouldDeleteForVariantPtrAuthMember(FD))
9895 if (CSM == CXXSpecialMemberKind::DefaultConstructor) {
9900 S.
Diag(FD->
getLocation(), diag::note_deleted_default_ctor_uninit_field)
9901 << !!ICI << MD->
getParent() << FD << FieldType << 0;
9911 S.
Diag(FD->
getLocation(), diag::note_deleted_default_ctor_uninit_field)
9917 AllFieldsAreConst =
false;
9918 }
else if (CSM == CXXSpecialMemberKind::CopyConstructor) {
9923 S.
Diag(FD->
getLocation(), diag::note_deleted_copy_ctor_rvalue_reference)
9927 }
else if (IsAssignment) {
9932 << isMove() << MD->
getParent() << FD << FieldType << 0;
9947 if (!inUnion() && FieldRecord->
isUnion() &&
9949 bool AllVariantFieldsAreConst =
true;
9952 for (
auto *UI : FieldRecord->
fields()) {
9955 if (shouldDeleteForVariantObjCPtrMember(&*UI, UnionFieldType))
9958 if (shouldDeleteForVariantPtrAuthMember(&*UI))
9962 AllVariantFieldsAreConst =
false;
9965 if (UnionFieldRecord &&
9966 shouldDeleteForClassSubobject(UnionFieldRecord, UI,
9972 if (CSM == CXXSpecialMemberKind::DefaultConstructor &&
9973 AllVariantFieldsAreConst && !FieldRecord->
field_empty()) {
9976 diag::note_deleted_default_ctor_all_const)
9987 if (shouldDeleteForClassSubobject(FieldRecord, FD,
9998bool SpecialMemberDeletionInfo::shouldDeleteForAllConstMembers() {
10001 if (CSM == CXXSpecialMemberKind::DefaultConstructor && inUnion() &&
10002 AllFieldsAreConst) {
10003 bool AnyFields =
false;
10005 if ((AnyFields = !F->isUnnamedBitField()))
10011 diag::note_deleted_default_ctor_all_const)
10057 bool DeletesOnlyMatchingCopy =
10062 (!DeletesOnlyMatchingCopy ||
10067 for (
auto *I : RD->
ctors()) {
10068 if (I->isMoveConstructor()) {
10069 UserDeclaredMove = I;
10073 assert(UserDeclaredMove);
10075 (!DeletesOnlyMatchingCopy ||
10080 for (
auto *I : RD->
methods()) {
10081 if (I->isMoveAssignmentOperator()) {
10082 UserDeclaredMove = I;
10086 assert(UserDeclaredMove);
10089 if (UserDeclaredMove) {
10091 diag::note_deleted_copy_user_declared_move)
10108 Context.DeclarationNames.getCXXOperatorName(OO_Delete);
10113 OperatorDelete, IDP,
10121 SpecialMemberDeletionInfo SMI(*
this, MD, CSM, ICI,
Diagnose);
10129 if (SMI.visit(SMI.IsAssignment ? SMI.VisitDirectBases
10130 : SMI.VisitPotentiallyConstructedBases))
10133 if (SMI.shouldDeleteForAllConstMembers())
10144 auto RealCSM = CSM;
10148 return CUDA().inferTargetForImplicitSpecialMember(RD, RealCSM, MD,
10157 assert(DFK &&
"not a defaultable function");
10164 DefaultedComparisonAnalyzer(
10166 DFK.
asComparison(), DefaultedComparisonAnalyzer::ExplainDeleted)
10187 *Selected =
nullptr;
10191 llvm_unreachable(
"not a special member");
10209 for (
auto *CI : RD->
ctors()) {
10210 if (!CI->isDefaultConstructor())
10217 *Selected = DefCtor;
10250 }
else if (!Selected) {
10258 goto NeedOverloadResolution;
10268 }
else if (!Selected) {
10273 goto NeedOverloadResolution;
10277 NeedOverloadResolution:
10306 llvm_unreachable(
"unknown special method kind");
10310 for (
auto *CI : RD->
ctors())
10311 if (!CI->isImplicit())
10318 dyn_cast<CXXConstructorDecl>(TI->getTemplatedDecl()))
10348 ConstRHS, TAH, Diagnose ? &Selected :
nullptr))
10356 S.
Diag(SubobjLoc, diag::note_nontrivial_no_def_ctor)
10359 S.
Diag(CD->getLocation(), diag::note_user_declared_ctor);
10360 }
else if (!Selected)
10361 S.
Diag(SubobjLoc, diag::note_nontrivial_no_copy)
10366 << Kind << SubType.getUnqualifiedType() << CSM;
10368 S.
Diag(SubobjLoc, diag::note_nontrivial_user_provided)
10369 << Kind << SubType.getUnqualifiedType() << CSM;
10374 S.
Diag(SubobjLoc, diag::note_nontrivial_subobject)
10375 << Kind << SubType.getUnqualifiedType() << CSM;
10391 for (
const auto *FI : RD->
fields()) {
10392 if (FI->isInvalidDecl() || FI->isUnnamedBitField())
10398 if (FI->isAnonymousStructOrUnion()) {
10400 CSM, ConstArg, TAH, Diagnose))
10410 FI->hasInClassInitializer()) {
10412 S.
Diag(FI->getLocation(), diag::note_nontrivial_default_member_init)
10423 S.
Diag(FI->getLocation(), diag::note_nontrivial_objc_ownership)
10428 bool ConstRHS = ConstArg && !FI->isMutable();
10452 "not special enough");
10456 bool ConstArg =
false;
10480 const bool ClangABICompat14 =
10481 Context.getLangOpts().isCompatibleWith(LangOptions::ClangABI::Ver14);
10484 ClangABICompat14)) {
10488 <<
Context.getLValueReferenceType(
10489 Context.getCanonicalTagType(RD).withConst());
10507 <<
Context.getRValueReferenceType(
Context.getCanonicalTagType(RD));
10514 llvm_unreachable(
"not a special member");
10520 diag::note_nontrivial_default_arg)
10539 for (
const auto &BI : RD->
bases())
10581 Diag(BS.
getBeginLoc(), diag::note_nontrivial_has_virtual) << RD << 1;
10586 for (
const auto *MI : RD->
methods()) {
10587 if (MI->isVirtual()) {
10589 Diag(MLoc, diag::note_nontrivial_has_virtual) << RD << 0;
10594 llvm_unreachable(
"dynamic class with no vbases and no virtual functions");
10602struct FindHiddenVirtualMethod {
10610 static bool CheckMostOverridenMethods(
10612 const llvm::SmallPtrSetImpl<const CXXMethodDecl *> &Methods) {
10616 if (CheckMostOverridenMethods(O, Methods))
10626 auto *BaseRecord = Specifier->getType()->castAsRecordDecl();
10630 bool foundSameNameMethod =
false;
10632 for (Path.
Decls = BaseRecord->lookup(Name).begin();
10637 foundSameNameMethod =
true;
10654 if (!CheckMostOverridenMethods(MD, OverridenAndUsingBaseMethods))
10655 overloadedMethods.push_back(MD);
10659 if (foundSameNameMethod)
10660 OverloadedMethods.append(overloadedMethods.begin(),
10661 overloadedMethods.end());
10662 return foundSameNameMethod;
10669 llvm::SmallPtrSetImpl<const CXXMethodDecl *>& Methods) {
10685 FindHiddenVirtualMethod FHVM;
10694 ND = shad->getTargetDecl();
10700 OverloadedMethods = FHVM.OverloadedMethods;
10705 for (
const CXXMethodDecl *overloadedMD : OverloadedMethods) {
10707 diag::note_hidden_overloaded_virtual_declared_here) << overloadedMD;
10709 Diag(overloadedMD->getLocation(), PD);
10722 if (!OverloadedMethods.empty()) {
10724 << MD << (OverloadedMethods.size() > 1);
10731 auto PrintDiagAndRemoveAttr = [&](
unsigned N) {
10734 Diag(RD.
getAttr<TrivialABIAttr>()->getLocation(),
10735 diag::ext_cannot_use_trivial_abi) << &RD;
10736 Diag(RD.
getAttr<TrivialABIAttr>()->getLocation(),
10737 diag::note_cannot_use_trivial_abi_reason) << &RD << N;
10744 PrintDiagAndRemoveAttr(1);
10748 for (
const auto &B : RD.
bases()) {
10751 if (!B.getType()->isDependentType() &&
10752 !B.getType()->getAsCXXRecordDecl()->canPassInRegisters()) {
10753 PrintDiagAndRemoveAttr(2);
10757 if (B.isVirtual()) {
10758 PrintDiagAndRemoveAttr(3);
10763 for (
const auto *FD : RD.
fields()) {
10768 PrintDiagAndRemoveAttr(4);
10774 PrintDiagAndRemoveAttr(6);
10778 if (
const auto *RT =
10780 if (!RT->isDependentType() &&
10782 ->canPassInRegisters()) {
10783 PrintDiagAndRemoveAttr(5);
10792 auto HasNonDeletedCopyOrMoveConstructor = [&]() {
10804 if (CD->isCopyOrMoveConstructor() && !CD->isDeleted())
10809 if (!HasNonDeletedCopyOrMoveConstructor()) {
10810 PrintDiagAndRemoveAttr(0);
10818 diag::err_incomplete_type_vtable_pointer_auth))
10826 assert(PrimaryBase);
10829 if (!BasePtr.getType()->getAsCXXRecordDecl()->isDynamicClass())
10831 Base = BasePtr.getType()->getAsCXXRecordDecl();
10834 if (!
Base ||
Base == PrimaryBase || !
Base->isPolymorphic())
10836 Diag(RD.
getAttr<VTablePointerAuthenticationAttr>()->getLocation(),
10837 diag::err_non_top_level_vtable_pointer_auth)
10839 PrimaryBase =
Base;
10843 Diag(RD.
getAttr<VTablePointerAuthenticationAttr>()->getLocation(),
10844 diag::err_non_polymorphic_vtable_pointer_auth)
10857 if (AL.getKind() != ParsedAttr::AT_Visibility)
10860 Diag(AL.getLoc(), diag::warn_attribute_after_definition_ignored) << AL;
10868 LBrac, RBrac, AttrList);
10890 Spaceships.clear();
10896 Spaceships.push_back(FD);
10905 if (
auto *FD = dyn_cast<FunctionDecl>(ND))
10906 if (FD->isExplicitlyDefaulted())
10907 Spaceships.push_back(FD);
10937 else if (
Context.getTargetInfo().getCXXABI().isMicrosoft() &&
11002 DefaultedSpaceships);
11003 for (
auto *FD : DefaultedSpaceships)
11010 llvm::function_ref<
Scope *()> EnterScope) {
11018 DeclContext *LookupDC = dyn_cast<DeclContext>(D);
11022 ParameterLists.push_back(TPL);
11026 ParameterLists.push_back(FTD->getTemplateParameters());
11027 }
else if (
VarDecl *VD = dyn_cast<VarDecl>(D)) {
11031 ParameterLists.push_back(VTD->getTemplateParameters());
11032 else if (
auto *PSD = dyn_cast<VarTemplatePartialSpecializationDecl>(D))
11033 ParameterLists.push_back(PSD->getTemplateParameters());
11035 }
else if (
TagDecl *TD = dyn_cast<TagDecl>(D)) {
11037 ParameterLists.push_back(TPL);
11041 ParameterLists.push_back(CTD->getTemplateParameters());
11042 else if (
auto *PSD = dyn_cast<ClassTemplatePartialSpecializationDecl>(D))
11043 ParameterLists.push_back(PSD->getTemplateParameters());
11048 unsigned Count = 0;
11049 Scope *InnermostTemplateScope =
nullptr;
11053 if (Params->size() == 0)
11056 InnermostTemplateScope = EnterScope();
11058 if (Param->getDeclName()) {
11059 InnermostTemplateScope->
AddDecl(Param);
11067 if (InnermostTemplateScope) {
11068 assert(LookupDC &&
"no enclosing DeclContext for template lookup");
11076 if (!RecordD)
return;
11083 if (!RecordD)
return;
11092 if (Param->getDeclName())
11111 if (Param->getDeclName())
11131 if (!
Method->isInvalidDecl())
11140 bool DiagOccurred =
false;
11142 [DiagID, &S, &DiagOccurred](
DeclSpec::TQ, StringRef QualName,
11149 DiagOccurred =
true;
11167 S.
Diag(PointerLoc, diag::err_invalid_ctor_dtor_decl)
11235 = dyn_cast<CXXRecordDecl>(
Constructor->getDeclContext());
11246 !
Constructor->isFunctionTemplateSpecialization()) {
11248 Constructor->getParamDecl(0)->getType()->getCanonicalTypeUnqualified();
11250 if (ParamType == ClassTy) {
11252 const char *ConstRef
11253 =
Constructor->getParamDecl(0)->getIdentifier() ?
"const &"
11255 Diag(ParamLoc, diag::err_constructor_byvalue_arg)
11277 Context.DeclarationNames.getCXXOperatorName(OO_Delete);
11280 Loc, RD,
true,
false, Name)) {
11281 Expr *ThisArg =
nullptr;
11286 if (OperatorDelete->isDestroyingOperatorDelete()) {
11287 unsigned AddressParamIndex = 0;
11288 if (OperatorDelete->isTypeAwareOperatorNewOrDelete())
11289 ++AddressParamIndex;
11291 OperatorDelete->getParamDecl(AddressParamIndex)->getType();
11298 OperatorDelete->getParamDecl(AddressParamIndex)->getLocation());
11299 assert(!
This.isInvalid() &&
"couldn't form 'this' expr in dtor?");
11302 if (
This.isInvalid()) {
11305 Diag(Loc, diag::note_implicit_delete_this_in_destructor_here);
11308 ThisArg =
This.get();
11314 Destructor->setOperatorDelete(OperatorDelete, ThisArg);
11317 Context.getTargetInfo().callGlobalDeleteInDeletingDtor(
11329 if (GlobalOperatorDelete) {
11331 Destructor->setOperatorGlobalDelete(GlobalOperatorDelete);
11335 if (
Context.getTargetInfo().emitVectorDeletingDtors(
11337 bool DestructorIsExported =
Destructor->hasAttr<DLLExportAttr>();
11340 Context.DeclarationNames.getCXXOperatorName(OO_Array_Delete);
11343 false, VDeleteName);
11349 Destructor->setGlobalOperatorArrayDelete(GlobalArrOperatorDelete);
11350 if (GlobalArrOperatorDelete &&
11351 (
Context.classMaybeNeedsVectorDeletingDestructor(RD) ||
11352 DestructorIsExported))
11354 }
else if (!ArrOperatorDelete) {
11357 true, VDeleteName);
11359 Destructor->setOperatorArrayDelete(ArrOperatorDelete);
11360 if (ArrOperatorDelete &&
11361 (
Context.classMaybeNeedsVectorDeletingDestructor(RD) ||
11362 DestructorIsExported))
11381 << DeclaratorType << isa<TypeAliasDecl>(TT->getDecl());
11382 else if (
const TemplateSpecializationType *TST =
11383 DeclaratorType->
getAs<TemplateSpecializationType>())
11384 if (TST->isTypeAlias())
11386 << DeclaratorType << 1;
11476 if (R.getEnd().isInvalid())
11477 R.setEnd(Before.
getEnd());
11481 if (After.isInvalid())
11483 if (R.getBegin().isInvalid())
11484 R.setBegin(After.getBegin());
11485 R.setEnd(After.getEnd());
11534 unsigned NumParam = Proto->getNumParams();
11538 if (NumParam == 1) {
11540 if (
const auto *
First =
11541 dyn_cast_if_present<ParmVarDecl>(FTI.
Params[0].
Param);
11542 First &&
First->isExplicitObjectParameter())
11546 if (NumParam != 0) {
11551 }
else if (Proto->isVariadic()) {
11558 if (Proto->getReturnType() != ConvType) {
11559 bool NeedsTypedef =
false;
11563 bool PastFunctionChunk =
false;
11565 switch (Chunk.Kind) {
11567 if (!PastFunctionChunk) {
11568 if (Chunk.Fun.HasTrailingReturnType) {
11573 PastFunctionChunk =
true;
11578 NeedsTypedef =
true;
11598 After.isValid() ? After.getBegin() :
11600 auto &&DB =
Diag(Loc, diag::err_conv_function_with_complex_decl);
11601 DB << Before << After;
11603 if (!NeedsTypedef) {
11607 if (After.isInvalid() && ConvTSI) {
11615 }
else if (!Proto->getReturnType()->isDependentType()) {
11616 DB << 1 << Proto->getReturnType();
11618 DB << 2 << Proto->getReturnType();
11629 ConvType = Proto->getReturnType();
11637 ConvType =
Context.getPointerType(ConvType);
11641 ConvType =
Context.getPointerType(ConvType);
11649 R =
Context.getFunctionType(ConvType, {}, Proto->getExtProtoInfo());
11654 diag_compat::explicit_conversion_functions)
11659 assert(Conversion &&
"Expected to receive a conversion function declaration");
11680 ConvType =
Context.getCanonicalType(ConvType).getUnqualifiedType();
11681 if (ConvType == ClassType)
11686 << ClassType << ConvType;
11689 << ClassType << ConvType;
11700 << ConvType->
castAs<AutoType>()->getKeyword()
11704 return ConversionTemplate;
11729 for (
unsigned Idx = 0; Idx < FTI.
NumParams; Idx++) {
11730 const auto &ParamInfo = FTI.
Params[Idx];
11731 if (!ParamInfo.Param)
11734 if (!Param->isExplicitObjectParameter())
11737 ExplicitObjectParam = Param;
11740 Diag(Param->getLocation(),
11741 diag::err_explicit_object_parameter_must_be_first)
11742 << IsLambda << Param->getSourceRange();
11745 if (!ExplicitObjectParam)
11750 diag::err_explicit_object_default_arg)
11759 diag::err_explicit_object_parameter_nonmember)
11766 diag::err_explicit_object_parameter_nonmember)
11791 !isa_and_present<CXXRecordDecl>(
11794 diag::err_explicit_object_parameter_nonmember)
11801 diag::err_explicit_object_parameter_mutable)
11809 assert(D.
isInvalidType() &&
"Explicit object parameter in non-member "
11810 "should have been diagnosed already");
11818 diag::err_explicit_object_parameter_constructor)
11828struct BadSpecifierDiagnoser {
11831 ~BadSpecifierDiagnoser() {
11835 template<
typename T>
void check(SourceLocation SpecLoc,
T Spec) {
11839 return check(SpecLoc,
11842 void check(SourceLocation SpecLoc,
const char *Spec) {
11844 Diagnostic << SourceRange(SpecLoc, SpecLoc);
11845 if (!Specifiers.empty()) Specifiers +=
" ";
11846 Specifiers += Spec;
11850 Sema::SemaDiagnosticBuilder Diagnostic;
11851 std::string Specifiers;
11859 assert(GuidedTemplateDecl &&
"missing template decl for deduction guide");
11864 if (!
CurContext->getRedeclContext()->Equals(
11867 << GuidedTemplateDecl;
11873 if (DS.hasTypeSpecifier() || DS.getTypeQualifiers() ||
11874 DS.getStorageClassSpecLoc().isValid() || DS.isInlineSpecified() ||
11875 DS.isNoreturnSpecified() || DS.hasConstexprSpecifier()) {
11876 BadSpecifierDiagnoser Diagnoser(
11878 diag::err_deduction_guide_invalid_specifier);
11880 Diagnoser.check(DS.getStorageClassSpecLoc(), DS.getStorageClassSpec());
11881 DS.ClearStorageClassSpecs();
11885 Diagnoser.check(DS.getInlineSpecLoc(),
"inline");
11886 Diagnoser.check(DS.getNoreturnSpecLoc(),
"_Noreturn");
11887 Diagnoser.check(DS.getConstexprSpecLoc(),
"constexpr");
11888 DS.ClearConstexprSpec();
11890 Diagnoser.check(DS.getConstSpecLoc(),
"const");
11891 Diagnoser.check(DS.getRestrictSpecLoc(),
"__restrict");
11892 Diagnoser.check(DS.getVolatileSpecLoc(),
"volatile");
11893 Diagnoser.check(DS.getAtomicSpecLoc(),
"_Atomic");
11894 Diagnoser.check(DS.getUnalignedSpecLoc(),
"__unaligned");
11895 DS.ClearTypeQualifiers();
11897 Diagnoser.check(DS.getTypeSpecComplexLoc(), DS.getTypeSpecComplex());
11898 Diagnoser.check(DS.getTypeSpecSignLoc(), DS.getTypeSpecSign());
11899 Diagnoser.check(DS.getTypeSpecWidthLoc(), DS.getTypeSpecWidth());
11900 Diagnoser.check(DS.getTypeSpecTypeLoc(), DS.getTypeSpecType());
11901 DS.ClearTypeSpecType();
11908 bool FoundFunction =
false;
11914 diag::err_deduction_guide_with_complex_decl)
11918 if (!Chunk.Fun.hasTrailingReturnType())
11920 diag::err_deduction_guide_no_trailing_return_type);
11925 ParsedType TrailingReturnType = Chunk.Fun.getTrailingReturnType();
11928 assert(TSI &&
"deduction guide has valid type but invalid return type?");
11929 bool AcceptableReturnType =
false;
11930 bool MightInstantiateToSpecialization =
false;
11933 TemplateName SpecifiedName = RetTST.getTypePtr()->getTemplateName();
11934 bool TemplateMatches =
Context.hasSameTemplateName(
11935 SpecifiedName, GuidedTemplate,
true);
11943 if (SimplyWritten && TemplateMatches)
11944 AcceptableReturnType =
true;
11949 MightInstantiateToSpecialization =
11953 MightInstantiateToSpecialization =
true;
11956 if (!AcceptableReturnType)
11958 diag::err_deduction_guide_bad_trailing_return_type)
11959 << GuidedTemplate << TSI->
getType()
11960 << MightInstantiateToSpecialization
11965 FoundFunction =
true;
11984 assert(*IsInline != PrevNS->
isInline());
11994 S.
Diag(Loc, diag::warn_inline_namespace_reopened_noninline)
11997 S.
Diag(Loc, diag::err_inline_namespace_mismatch);
12015 bool IsInline = InlineLoc.
isValid();
12016 bool IsInvalid =
false;
12017 bool IsStd =
false;
12018 bool AddToKnown =
false;
12029 auto DiagnoseInlineStdNS = [&]() {
12030 assert(IsInline && II->
isStr(
"std") &&
12031 CurContext->getRedeclContext()->isTranslationUnit() &&
12032 "Precondition of DiagnoseInlineStdNS not met");
12033 Diag(InlineLoc, diag::err_inline_namespace_std)
12052 R.isSingleResult() ? R.getRepresentativeDecl() :
nullptr;
12053 PrevNS = dyn_cast_or_null<NamespaceDecl>(PrevDecl);
12057 if (IsInline && II->
isStr(
"std") &&
12058 CurContext->getRedeclContext()->isTranslationUnit())
12059 DiagnoseInlineStdNS();
12060 else if (IsInline != PrevNS->
isInline())
12062 &IsInline, PrevNS);
12063 }
else if (PrevDecl) {
12065 Diag(Loc, diag::err_redefinition_different_kind)
12070 }
else if (II->
isStr(
"std") &&
12071 CurContext->getRedeclContext()->isTranslationUnit()) {
12073 DiagnoseInlineStdNS();
12078 AddToKnown = !IsInline;
12081 AddToKnown = !IsInline;
12095 if (PrevNS && IsInline != PrevNS->
isInline())
12097 &IsInline, PrevNS);
12110 if (
const VisibilityAttr *
Attr = Namespc->
getAttr<VisibilityAttr>())
12116 KnownNamespaces[Namespc] =
false;
12124 TU->setAnonymousNamespace(Namespc);
12176 return dyn_cast_or_null<NamespaceDecl>(D);
12180 NamespaceDecl *Namespc = dyn_cast_or_null<NamespaceDecl>(Dcl);
12181 assert(Namespc &&
"Invalid parameter, expected NamespaceDecl");
12184 if (Namespc->
hasAttr<VisibilityAttr>())
12187 if (DeferredExportedNamespaces.erase(Namespc))
12192 return cast_or_null<CXXRecordDecl>(
12201 return cast_or_null<NamespaceDecl>(
12207enum UnsupportedSTLSelect {
12214struct InvalidSTLDiagnoser {
12219 QualType operator()(UnsupportedSTLSelect Sel = USS_Other, StringRef Name =
"",
12220 const VarDecl *VD =
nullptr) {
12222 auto D = S.
Diag(Loc, diag::err_std_compare_type_not_supported)
12223 << TyForDiags << ((
int)Sel);
12224 if (Sel == USS_InvalidMember || Sel == USS_MissingMember) {
12225 assert(!Name.empty());
12229 if (Sel == USS_InvalidMember) {
12242 "Looking for comparison category type outside of C++.");
12257 if (Info && FullyCheckedComparisonCategories[
static_cast<unsigned>(Kind)]) {
12268 std::string NameForDiags =
"std::";
12270 Diag(Loc, diag::err_implied_comparison_category_type_not_found)
12271 << NameForDiags << (int)Usage;
12275 assert(Info->
Kind == Kind);
12286 InvalidSTLDiagnoser UnsupportedSTLError{*
this, Loc, TyForDiags(Info)};
12289 return UnsupportedSTLError(USS_NonTrivial);
12294 if (
Base->isEmpty())
12297 return UnsupportedSTLError();
12305 if (std::distance(FIt, FEnd) != 1 ||
12306 !FIt->getType()->isIntegralOrEnumerationType()) {
12307 return UnsupportedSTLError();
12317 return UnsupportedSTLError(USS_MissingMember, MemName);
12320 assert(VD &&
"should not be null!");
12327 return UnsupportedSTLError(USS_InvalidMember, MemName, VD);
12333 return UnsupportedSTLError();
12340 FullyCheckedComparisonCategories[
static_cast<unsigned>(Kind)] =
true;
12350 &
PP.getIdentifierTable().get(
"std"),
12363 const char *ClassName,
12365 const Decl **MalformedDecl) {
12373 auto ReportMatchingNameAsMalformed = [&](
NamedDecl *D) {
12374 if (!MalformedDecl)
12382 *MalformedDecl = D;
12387 if (
const TemplateSpecializationType *TST =
12389 Template = dyn_cast_or_null<ClassTemplateDecl>(
12390 TST->getTemplateName().getAsTemplateDecl());
12391 Arguments = TST->template_arguments();
12392 }
else if (
const auto *TT = SugaredType->
getAs<TagType>()) {
12394 Arguments = TT->getTemplateArgs(S.
Context);
12398 ReportMatchingNameAsMalformed(SugaredType->
getAsTagDecl());
12402 if (!*CachedDecl) {
12421 *MalformedDecl = TemplateClass;
12429 if (
Template->getCanonicalDecl() != (*CachedDecl)->getCanonicalDecl())
12434 QualType ArgType = Arguments[0].getAsType();
12440 if (S.
getLangOpts().ObjCAutoRefCount && ArgType->isObjCLifetimeType() &&
12441 !ArgType.getObjCLifetime()) {
12446 *TypeArg = ArgType;
12454 "Looking for std::initializer_list outside of C++.");
12464 const Decl **MalformedDecl) {
12466 "Looking for std::type_identity outside of C++.");
12476 const char *ClassName,
12477 bool *WasMalformed) {
12488 Result.suppressDiagnostics();
12491 S.
Diag(
Found->getLocation(), diag::err_malformed_std_class_template)
12494 *WasMalformed =
true;
12503 S.
Diag(
Template->getLocation(), diag::err_malformed_std_class_template)
12506 *WasMalformed =
true;
12521 Loc, Args,
nullptr,
12527 bool WasMalformed =
false;
12532 Diag(Loc, diag::err_implied_std_initializer_list_not_found);
12560 ArgType = RT->getPointeeType().getUnqualifiedType();
12569 case Decl::TranslationUnit:
12571 case Decl::LinkageSpec:
12581class NamespaceValidatorCCC final :
public CorrectionCandidateCallback {
12583 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
12589 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
12590 return std::make_unique<NamespaceValidatorCCC>(*
this);
12599 Module *M = ND->getOwningModule();
12600 assert(M &&
"hidden namespace definition not in a module?");
12604 diag::err_module_unimported_use_header)
12609 diag::err_module_unimported_use)
12619 NamespaceValidatorCCC CCC{};
12621 S.
CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), Sc, &SS, CCC,
12629 if (isa_and_nonnull<NamespaceDecl>(Corrected.getFoundDecl()) &&
12630 Corrected.requiresImport()) {
12633 std::string CorrectedStr(Corrected.getAsString(S.
getLangOpts()));
12634 bool DroppedSpecifier =
12635 Corrected.WillReplaceSpecifier() && Ident->
getName() == CorrectedStr;
12637 S.
PDiag(diag::err_using_directive_member_suggest)
12638 << Ident << DC << DroppedSpecifier << SS.
getRange(),
12639 S.
PDiag(diag::note_namespace_defined_here));
12642 S.
PDiag(diag::err_using_directive_suggest) << Ident,
12643 S.
PDiag(diag::note_namespace_defined_here));
12645 R.addDecl(Corrected.getFoundDecl());
12656 assert(!SS.
isInvalid() &&
"Invalid CXXScopeSpec.");
12657 assert(NamespcName &&
"Invalid NamespcName.");
12658 assert(IdentLoc.
isValid() &&
"Invalid NamespceName location.");
12669 if (R.isAmbiguous())
12678 NamespcName->
isStr(
"std")) {
12679 Diag(IdentLoc, diag::ext_using_undefined_std);
12689 NamedDecl *Named = R.getRepresentativeDecl();
12691 assert(
NS &&
"expected namespace decl");
12710 CommonAncestor = CommonAncestor->
getParent();
12714 IdentLoc, Named, CommonAncestor);
12718 Diag(IdentLoc, diag::warn_using_directive_in_header);
12723 Diag(IdentLoc, diag::err_expected_namespace_name) << SS.
getRange();
12773 ? diag::warn_cxx98_compat_using_decl_constructor
12774 : diag::err_using_decl_constructor)
12791 llvm_unreachable(
"cannot parse qualified deduction guide name");
12802 ? diag::err_access_decl
12803 : diag::warn_access_decl_deprecated)
12814 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
12822 SS, TargetNameInfo, EllipsisLoc, AttrList,
12841 ? diag::err_using_enum_is_dependent
12842 : diag::err_unknown_typename)
12850 Diag(IdentLoc, diag::err_using_enum_is_dependent);
12856 Diag(IdentLoc, diag::err_using_enum_not_enum) << EnumTy;
12860 if (TSI ==
nullptr)
12861 TSI =
Context.getTrivialTypeSourceInfo(EnumTy, IdentLoc);
12882 return Context.hasSameType(TD1->getUnderlyingType(),
12883 TD2->getUnderlyingType());
12917 if (
auto *Using = dyn_cast<UsingDecl>(BUD)) {
12929 Diag(Using->getLocation(),
12930 diag::err_using_decl_nested_name_specifier_is_current_class)
12931 << Using->getQualifierLoc().getSourceRange();
12933 Using->setInvalidDecl();
12937 Diag(Using->getQualifierLoc().getBeginLoc(),
12938 diag::err_using_decl_nested_name_specifier_is_not_base_class)
12940 << Using->getQualifierLoc().getSourceRange();
12942 Using->setInvalidDecl();
12947 if (
Previous.empty())
return false;
12958 NamedDecl *NonTag =
nullptr, *Tag =
nullptr;
12959 bool FoundEquivalentDecl =
false;
12961 NamedDecl *D = Element->getUnderlyingDecl();
12968 if (
auto *RD = dyn_cast<CXXRecordDecl>(D)) {
12983 PrevShadow = Shadow;
12984 FoundEquivalentDecl =
true;
12988 FoundEquivalentDecl =
true;
12995 if (FoundEquivalentDecl)
13001 (isa_and_nonnull<UnresolvedUsingIfExistsDecl>(NonTag))) {
13002 if (!NonTag && !Tag)
13005 Diag(
Target->getLocation(), diag::note_using_decl_target);
13006 Diag((NonTag ? NonTag : Tag)->getLocation(),
13007 diag::note_using_decl_conflict);
13036 Diag(
Target->getLocation(), diag::note_using_decl_target);
13046 if (!Tag)
return false;
13049 Diag(
Target->getLocation(), diag::note_using_decl_target);
13050 Diag(Tag->getLocation(), diag::note_using_decl_conflict);
13056 if (!NonTag)
return false;
13059 Diag(
Target->getLocation(), diag::note_using_decl_target);
13069 for (
auto &B : Derived->
bases())
13070 if (B.getType()->getAsCXXRecordDecl() ==
Base)
13071 return B.isVirtual();
13072 llvm_unreachable(
"not a direct base class");
13086 if (
auto *TargetTD = dyn_cast<TemplateDecl>(
Target))
13087 NonTemplateTarget = TargetTD->getTemplatedDecl();
13092 bool IsVirtualBase =
13094 Using->getQualifier().getAsRecordDecl());
13142 bool &AnyDependentBases) {
13146 CanQualType BaseType =
Base.getType()->getCanonicalTypeUnqualified();
13147 if (CanonicalDesiredBase == BaseType)
13149 if (BaseType->isDependentType())
13150 AnyDependentBases =
true;
13156class UsingValidatorCCC final :
public CorrectionCandidateCallback {
13158 UsingValidatorCCC(
bool HasTypenameKeyword,
bool IsInstantiation,
13159 NestedNameSpecifier NNS, CXXRecordDecl *RequireMemberOf)
13160 : HasTypenameKeyword(HasTypenameKeyword),
13161 IsInstantiation(IsInstantiation), OldNNS(NNS),
13162 RequireMemberOf(RequireMemberOf) {}
13164 bool ValidateCandidate(
const TypoCorrection &Candidate)
override {
13178 if (RequireMemberOf) {
13179 auto *FoundRecord = dyn_cast<CXXRecordDecl>(ND);
13180 if (FoundRecord && FoundRecord->isInjectedClassName()) {
13194 if (
Specifier.getKind() != NestedNameSpecifier::Kind::Type ||
13200 bool AnyDependentBases =
false;
13203 AnyDependentBases) &&
13204 !AnyDependentBases)
13214 auto *FoundRecord = dyn_cast<CXXRecordDecl>(ND);
13215 if (FoundRecord && FoundRecord->isInjectedClassName())
13220 return HasTypenameKeyword || !IsInstantiation;
13222 return !HasTypenameKeyword;
13225 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
13226 return std::make_unique<UsingValidatorCCC>(*
this);
13230 bool HasTypenameKeyword;
13231 bool IsInstantiation;
13232 NestedNameSpecifier OldNNS;
13233 CXXRecordDecl *RequireMemberOf;
13260 bool IsUsingIfExists) {
13261 assert(!SS.
isInvalid() &&
"Invalid CXXScopeSpec.");
13263 assert(IdentLoc.
isValid() &&
"Invalid TargetName location.");
13272 if (
auto *RD = dyn_cast<CXXRecordDecl>(
CurContext))
13273 UsingName.
setName(
Context.DeclarationNames.getCXXConstructorName(
13274 Context.getCanonicalTagType(RD)));
13285 assert(IsInstantiation &&
"no scope in non-instantiation");
13313 Diag(UsingLoc, diag::err_using_if_exists_on_ctor);
13319 if (!LookupContext || EllipsisLoc.
isValid()) {
13323 SS, NameInfo, IdentLoc))
13327 Previous.getFoundDecl()->isTemplateParameter())
13330 if (HasTypenameKeyword) {
13333 UsingLoc, TypenameLoc,
13335 IdentLoc, NameInfo.
getName(),
13339 QualifierLoc, NameInfo, EllipsisLoc);
13347 auto Build = [&](
bool Invalid) {
13350 UsingName, HasTypenameKeyword);
13357 auto BuildInvalid = [&]{
return Build(
true); };
13358 auto BuildValid = [&]{
return Build(
false); };
13361 return BuildInvalid();
13370 if (!IsInstantiation)
13371 R.setHideTags(
false);
13376 R.setBaseObjectType(
13387 if (R.empty() && IsUsingIfExists)
13405 PP.NeedsStdLibCxxWorkaroundBefore(2016'12'21) &&
13408 UsingValidatorCCC CCC(HasTypenameKeyword, IsInstantiation, SS.
getScopeRep(),
13411 CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), S, &SS, CCC,
13416 << NameInfo.
getName() << LookupContext << 0
13421 NamedDecl *ND = Corrected.getCorrectionDecl();
13423 return BuildInvalid();
13426 auto *RD = dyn_cast<CXXRecordDecl>(ND);
13432 if (Corrected.WillReplaceSpecifier()) {
13436 QualifierLoc = Builder.getWithLocInContext(
Context);
13442 UsingName.
setName(
Context.DeclarationNames.getCXXConstructorName(
13443 Context.getCanonicalTagType(CurClass)));
13455 Diag(IdentLoc, diag::err_no_member)
13457 return BuildInvalid();
13461 if (R.isAmbiguous())
13462 return BuildInvalid();
13464 if (HasTypenameKeyword) {
13468 Diag(IdentLoc, diag::err_using_typename_non_type);
13471 diag::note_using_decl_target);
13472 return BuildInvalid();
13478 if (IsInstantiation && R.getAsSingle<
TypeDecl>()) {
13479 Diag(IdentLoc, diag::err_using_dependent_value_is_type);
13480 Diag(R.getFoundDecl()->getLocation(), diag::note_using_decl_target);
13481 return BuildInvalid();
13488 Diag(IdentLoc, diag::err_using_decl_can_not_refer_to_namespace)
13493 return BuildInvalid();
13503 R.suppressDiagnostics();
13525 if (
CurContext->getRedeclContext()->isRecord()) {
13535 if (UED->getEnumDecl() == ED) {
13536 Diag(UsingLoc, diag::err_using_enum_decl_redeclaration)
13548 EnumLoc, NameLoc, EnumType);
13581 UPD->setAccess(InstantiatedFrom->
getAccess());
13587 assert(!UD->
hasTypename() &&
"expecting a constructor name");
13593 bool AnyDependentBases =
false;
13596 if (!
Base && !AnyDependentBases) {
13597 Diag(UD->
getUsingLoc(), diag::err_using_decl_constructor_not_in_direct_base)
13604 Base->setInheritConstructors();
13610 bool HasTypenameKeyword,
13623 if (!
CurContext->getRedeclContext()->isRecord()) {
13630 for (
auto *D : Prev) {
13632 bool OldCouldBeEnumerator =
13635 OldCouldBeEnumerator ? diag::err_redefinition
13636 : diag::err_redefinition_different_kind)
13637 << Prev.getLookupName();
13650 if (
const auto *UD = dyn_cast<UsingDecl>(D)) {
13651 DTypename = UD->hasTypename();
13652 DQual = UD->getQualifier();
13653 }
else if (
const auto *UD = dyn_cast<UnresolvedUsingValueDecl>(D)) {
13655 DQual = UD->getQualifier();
13656 }
else if (
const auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(D)) {
13658 DQual = UD->getQualifier();
13664 if (HasTypenameKeyword != DTypename)
continue;
13672 Diag(NameLoc, diag::err_using_decl_redeclaration) << SS.
getRange();
13686 assert(
bool(NamedContext) == (R || UD) && !(R && UD) &&
13687 "resolvable context must have exactly one set of decls");
13691 bool Cxx20Enumerator =
false;
13692 if (NamedContext) {
13701 if (
auto *ED = dyn_cast<EnumDecl>(NamedContext)) {
13705 if (EC && R && ED->isScoped())
13710 NamedContext = ED->getDeclContext();
13730 ? diag::warn_cxx17_compat_using_decl_class_member_enumerator
13731 : diag::err_using_decl_can_not_refer_to_class_member)
13734 if (Cxx20Enumerator)
13737 auto *RD = NamedContext
13746 }
else if (R->getAsSingle<
TypeDecl>()) {
13749 Diag(SS.
getBeginLoc(), diag::note_using_decl_class_member_workaround)
13750 << diag::MemClassWorkaround::AliasDecl
13757 Diag(InsertLoc, diag::note_using_decl_class_member_workaround)
13758 << diag::MemClassWorkaround::TypedefDecl
13763 }
else if (R->getAsSingle<
VarDecl>()) {
13773 Diag(UsingLoc, diag::note_using_decl_class_member_workaround)
13774 << diag::MemClassWorkaround::ReferenceDecl << FixIt;
13787 Diag(UsingLoc, diag::note_using_decl_class_member_workaround)
13789 ? diag::MemClassWorkaround::ConstexprVar
13790 : diag::MemClassWorkaround::ConstVar)
13799 if (!NamedContext) {
13815 ? diag::warn_cxx17_compat_using_decl_non_member_enumerator
13816 : diag::err_using_decl_nested_name_specifier_is_not_class)
13819 if (Cxx20Enumerator)
13840 if (Cxx20Enumerator) {
13841 Diag(NameLoc, diag::warn_cxx17_compat_using_decl_non_member_enumerator)
13848 diag::err_using_decl_nested_name_specifier_is_current_class)
13855 diag::err_using_decl_nested_name_specifier_is_not_base_class)
13871 if (
Type.isInvalid())
13890 TemplateParamLists.size()
13897 Previous.getFoundDecl()->isTemplateParameter()) {
13903 "name in alias declaration must be an identifier");
13926 if (TemplateParamLists.size()) {
13931 if (TemplateParamLists.size() != 1) {
13932 Diag(UsingLoc, diag::err_alias_template_extra_headers)
13933 <<
SourceRange(TemplateParamLists[1]->getTemplateLoc(),
13934 TemplateParamLists[TemplateParamLists.size()-1]->getRAngleLoc());
13938 auto It = llvm::find_if(
13939 llvm::reverse(TemplateParamLists),
13941 assert(It != TemplateParamLists.rend() &&
13942 "if all template parameter lists were empty, this should have "
13943 "been rejected as an explicit specialization");
13944 TemplateParams = *It;
13959 Diag(UsingLoc, diag::err_redefinition_different_kind)
13974 OldTemplateParams =
14010 else if (OldDecl) {
14017 if (
auto *TD = dyn_cast_or_null<TagDecl>(DeclFromDeclSpec)) {
14040 if (R.isAmbiguous())
14045 Diag(IdentLoc, diag::err_expected_namespace_name) << SS.
getRange();
14049 assert(!R.isAmbiguous() && !R.empty());
14077 Diag(AliasLoc, diag::err_redefinition_different_namespace_alias)
14079 Diag(AD->getLocation(), diag::note_previous_namespace_alias)
14080 << AD->getNamespace();
14085 ? diag::err_redefinition
14086 : diag::err_redefinition_different_kind;
14087 Diag(AliasLoc, DiagID) << Alias;
14108struct SpecialMemberExceptionSpecInfo
14109 : SpecialMemberVisitor<SpecialMemberExceptionSpecInfo> {
14117 : SpecialMemberVisitor(S, MD, CSM, ICI), Loc(Loc), ExceptSpec(S) {}
14122 void visitClassSubobject(
CXXRecordDecl *Class, Subobject Subobj,
14125 void visitSubobjectCall(Subobject Subobj,
14130bool SpecialMemberExceptionSpecInfo::visitBase(CXXBaseSpecifier *Base) {
14131 auto *BaseClass =
Base->getType()->getAsCXXRecordDecl();
14135 Sema::SpecialMemberOverloadResult SMOR = lookupInheritedCtor(BaseClass);
14136 if (
auto *BaseCtor = SMOR.
getMethod()) {
14137 visitSubobjectCall(Base, BaseCtor);
14141 visitClassSubobject(BaseClass, Base, 0);
14145bool SpecialMemberExceptionSpecInfo::visitField(FieldDecl *FD) {
14146 if (CSM == CXXSpecialMemberKind::DefaultConstructor &&
14165void SpecialMemberExceptionSpecInfo::visitClassSubobject(CXXRecordDecl *
Class,
14168 FieldDecl *
Field = Subobj.dyn_cast<FieldDecl*>();
14169 bool IsMutable =
Field &&
Field->isMutable();
14170 visitSubobjectCall(Subobj, lookupIn(
Class, Quals, IsMutable));
14173void SpecialMemberExceptionSpecInfo::visitSubobjectCall(
14174 Subobject Subobj, Sema::SpecialMemberOverloadResult SMOR) {
14177 if (CXXMethodDecl *MD = SMOR.
getMethod())
14178 ExceptSpec.
CalledDecl(getSubobjectLoc(Subobj), MD);
14207 ComputingExceptionSpec CES(S, MD, Loc);
14214 SpecialMemberExceptionSpecInfo Info(S, MD, CSM, ICI, MD->
getLocation());
14216 return Info.ExceptSpec;
14223 diag::err_exception_spec_incomplete_type))
14224 return Info.ExceptSpec;
14241 Info.visit(Info.IsConstructor ? Info.VisitPotentiallyConstructedBases
14242 : Info.VisitAllBases);
14244 return Info.ExceptSpec;
14249struct DeclaringSpecialMember {
14252 Sema::ContextRAII SavedContext;
14253 bool WasAlreadyBeingDeclared;
14256 : S(S), D(RD, CSM), SavedContext(S, RD) {
14258 if (WasAlreadyBeingDeclared)
14265 Sema::CodeSynthesisContext Ctx;
14266 Ctx.Kind = Sema::CodeSynthesisContext::DeclaringSpecialMember;
14273 Ctx.PointOfInstantiation = RD->getLocation();
14275 Ctx.SpecialMember = CSM;
14276 S.pushCodeSynthesisContext(Ctx);
14279 ~DeclaringSpecialMember() {
14280 if (!WasAlreadyBeingDeclared) {
14287 bool isAlreadyBeingDeclared()
const {
14288 return WasAlreadyBeingDeclared;
14300 if (
auto *Acceptable = R.getAcceptableDecl(D))
14301 R.addDecl(Acceptable);
14303 R.suppressDiagnostics();
14309void Sema::setupImplicitSpecialMemberType(
CXXMethodDecl *SpecialMem,
14315 LangAS AS = getDefaultCXXMethodAddrSpace();
14320 auto QT = Context.getFunctionType(ResultTy, Args, EPI);
14328 Context.getTrivialTypeSourceInfo(SpecialMem->
getType());
14342 "Should not build implicit default constructor!");
14344 DeclaringSpecialMember DSM(*
this, ClassDecl,
14346 if (DSM.isAlreadyBeingDeclared())
14356 =
Context.DeclarationNames.getCXXConstructorName(ClassType);
14368 setupImplicitSpecialMemberType(DefaultCon,
Context.VoidTy, {});
14371 CUDA().inferTargetForImplicitSpecialMember(
14392 ClassDecl->
addDecl(DefaultCon);
14399 DefaultedFunctionFPFeaturesRAII RestoreFP(*
this,
Constructor);
14403 "DefineImplicitDefaultConstructor - call it for implicit default ctor");
14408 assert(ClassDecl &&
"DefineImplicitDefaultConstructor - invalid constructor");
14422 Scope.addContextNote(CurrentLocation);
14469 ->getInheritedConstructor()
14476 Context.getTrivialTypeSourceInfo(BaseCtor->
getType(), UsingLoc);
14487 false, BaseCtor, &ICI);
14504 EPI.ExceptionSpec.SourceDecl = DerivedCtor;
14510 for (
unsigned I = 0, N = FPT->
getNumParams(); I != N; ++I) {
14514 Context, DerivedCtor, UsingLoc, UsingLoc,
nullptr,
14521 ParamDecls.push_back(PD);
14526 assert(!BaseCtor->
isDeleted() &&
"should not use deleted constructor");
14529 Derived->
addDecl(DerivedCtor);
14535 return DerivedCtor;
14566 Scope.addContextNote(CurrentLocation);
14569 Constructor->getInheritedConstructor().getShadowDecl();
14571 Constructor->getInheritedConstructor().getConstructor();
14585 for (
bool VBase : {
false,
true}) {
14587 if (B.isVirtual() != VBase)
14590 auto *BaseRD = B.getType()->getAsCXXRecordDecl();
14595 if (!BaseCtor.first)
14600 InitLoc, B.getType(), BaseCtor.first, VBase, BaseCtor.second);
14602 auto *TInfo =
Context.getTrivialTypeSourceInfo(B.getType(), InitLoc);
14604 Context, TInfo, VBase, InitLoc,
Init.get(), InitLoc,
14638 DeclaringSpecialMember DSM(*
this, ClassDecl,
14640 if (DSM.isAlreadyBeingDeclared())
14650 =
Context.DeclarationNames.getCXXDestructorName(ClassType);
14665 CUDA().inferTargetForImplicitSpecialMember(
14699 DefaultedFunctionFPFeaturesRAII RestoreFP(*
this,
Destructor);
14701 !
Destructor->doesThisDeclarationHaveABody() &&
14703 "DefineImplicitDestructor - call it for implicit default dtor");
14708 assert(ClassDecl &&
"DefineImplicitDestructor - invalid destructor");
14719 Scope.addContextNote(CurrentLocation);
14746 assert(
Context.getTargetInfo().getCXXABI().isMicrosoft() &&
14747 "implicit complete dtors unneeded outside MS ABI");
14749 "complete dtor only exists for classes with vbases");
14754 Scope.addContextNote(CurrentLocation);
14762 if (
Record->isInvalidDecl()) {
14783 if (M->getParent()->getTemplateSpecializationKind() !=
14803 "adjusting dtor exception specs was introduced in c++11");
14813 if (DtorType->hasExceptionSpec())
14836 ExprBuilder(
const ExprBuilder&) =
delete;
14837 ExprBuilder &operator=(
const ExprBuilder&) =
delete;
14840 static Expr *assertNotNull(
Expr *E) {
14841 assert(E &&
"Expression construction must not fail.");
14847 virtual ~ExprBuilder() {}
14849 virtual Expr *build(Sema &S, SourceLocation Loc)
const = 0;
14852class RefBuilder:
public ExprBuilder {
14857 Expr *build(Sema &S, SourceLocation Loc)
const override {
14861 RefBuilder(VarDecl *Var, QualType VarType)
14862 : Var(Var), VarType(VarType) {}
14865class ThisBuilder:
public ExprBuilder {
14867 Expr *build(Sema &S, SourceLocation Loc)
const override {
14872class CastBuilder:
public ExprBuilder {
14873 const ExprBuilder &Builder;
14879 Expr *build(Sema &S, SourceLocation Loc)
const override {
14881 CK_UncheckedDerivedToBase, Kind,
14890class DerefBuilder:
public ExprBuilder {
14891 const ExprBuilder &Builder;
14894 Expr *build(Sema &S, SourceLocation Loc)
const override {
14895 return assertNotNull(
14899 DerefBuilder(
const ExprBuilder &Builder) : Builder(Builder) {}
14902class MemberBuilder:
public ExprBuilder {
14903 const ExprBuilder &Builder;
14907 LookupResult &MemberLookup;
14910 Expr *build(Sema &S, SourceLocation Loc)
const override {
14912 Builder.build(S, Loc),
Type, Loc, IsArrow, SS, SourceLocation(),
14913 nullptr, MemberLookup,
nullptr,
nullptr).get());
14916 MemberBuilder(
const ExprBuilder &Builder, QualType
Type,
bool IsArrow,
14917 LookupResult &MemberLookup)
14918 : Builder(Builder),
Type(
Type), IsArrow(IsArrow),
14919 MemberLookup(MemberLookup) {}
14922class MoveCastBuilder:
public ExprBuilder {
14923 const ExprBuilder &Builder;
14926 Expr *build(Sema &S, SourceLocation Loc)
const override {
14927 return assertNotNull(
CastForMoving(S, Builder.build(S, Loc)));
14930 MoveCastBuilder(
const ExprBuilder &Builder) : Builder(Builder) {}
14933class LvalueConvBuilder:
public ExprBuilder {
14934 const ExprBuilder &Builder;
14937 Expr *build(Sema &S, SourceLocation Loc)
const override {
14938 return assertNotNull(
14942 LvalueConvBuilder(
const ExprBuilder &Builder) : Builder(Builder) {}
14945class SubscriptBuilder:
public ExprBuilder {
14946 const ExprBuilder &
Base;
14947 const ExprBuilder &Index;
14950 Expr *build(Sema &S, SourceLocation Loc)
const override {
14952 Base.build(S, Loc), Loc, Index.build(S, Loc), Loc).
get());
14955 SubscriptBuilder(
const ExprBuilder &Base,
const ExprBuilder &Index)
14967 const ExprBuilder &ToB,
const ExprBuilder &FromB) {
14976 Expr *From = FromB.build(S, Loc);
14980 Expr *To = ToB.build(S, Loc);
14985 bool NeedsCollectableMemCpy =
false;
14986 if (
auto *RD =
T->getBaseElementTypeUnsafe()->getAsRecordDecl())
14990 StringRef MemCpyName = NeedsCollectableMemCpy ?
14991 "__builtin_objc_memmove_collectable" :
14992 "__builtin_memcpy";
15005 assert(MemCpyRef.
isUsable() &&
"Builtin reference cannot fail");
15007 Expr *CallArgs[] = {
15011 Loc, CallArgs, Loc);
15013 assert(!
Call.isInvalid() &&
"Call to __builtin_memcpy cannot fail!");
15046 const ExprBuilder &To,
const ExprBuilder &From,
15047 bool CopyingBaseSubobject,
bool Copying,
15048 unsigned Depth = 0) {
15063 if (
auto *ClassDecl =
T->getAsCXXRecordDecl()) {
15077 if (Method->isCopyAssignmentOperator() ||
15078 (!Copying && Method->isMoveAssignmentOperator()))
15097 if (CopyingBaseSubobject) {
15126 Expr *FromInst = From.build(S, Loc);
15129 Loc, FromInst, Loc);
15130 if (
Call.isInvalid())
15149 Loc, BO_Assign, To.build(S, Loc), From.build(S, Loc));
15169 llvm::raw_svector_ostream OS(Str);
15170 OS <<
"__i" << Depth;
15174 IterationVarName, SizeType,
15183 RefBuilder IterationVarRef(IterationVar, SizeType);
15184 LvalueConvBuilder IterationVarRefRVal(IterationVarRef);
15190 SubscriptBuilder FromIndexCopy(From, IterationVarRefRVal);
15191 MoveCastBuilder FromIndexMove(FromIndexCopy);
15192 const ExprBuilder *FromIndex;
15194 FromIndex = &FromIndexCopy;
15196 FromIndex = &FromIndexMove;
15198 SubscriptBuilder ToIndex(To, IterationVarRefRVal);
15203 ToIndex, *FromIndex, CopyingBaseSubobject,
15204 Copying, Depth + 1);
15206 if (
Copy.isInvalid() || !
Copy.get())
15213 S.
Context, IterationVarRefRVal.build(S, Loc),
15227 Loc, Loc, InitStmt,
15234 const ExprBuilder &To,
const ExprBuilder &From,
15235 bool CopyingBaseSubobject,
bool Copying) {
15237 if (
T->isArrayType() && !
T.hasQualifiers() &&
15238 T.isTriviallyCopyableType(S.
Context))
15242 CopyingBaseSubobject,
15260 DeclaringSpecialMember DSM(*
this, ClassDecl,
15262 if (DSM.isAlreadyBeingDeclared())
15266 std::nullopt, ClassDecl,
15300 CUDA().inferTargetForImplicitSpecialMember(
15307 ClassLoc, ClassLoc,
15320 ++
getASTContext().NumImplicitCopyAssignmentOperatorsDeclared;
15352 for (
auto *I : RD->
ctors()) {
15353 if (I->isCopyConstructor()) {
15354 UserDeclaredOperation = I;
15358 assert(UserDeclaredOperation);
15362 for (
auto *I : RD->
methods()) {
15363 if (I->isCopyAssignmentOperator()) {
15364 UserDeclaredOperation = I;
15368 assert(UserDeclaredOperation);
15371 if (UserDeclaredOperation) {
15372 bool UDOIsUserProvided = UserDeclaredOperation->
isUserProvided();
15376 (UDOIsUserProvided && UDOIsDestructor)
15377 ? diag::warn_deprecated_copy_with_user_provided_dtor
15378 : (UDOIsUserProvided && !UDOIsDestructor)
15379 ? diag::warn_deprecated_copy_with_user_provided_copy
15380 : (!UDOIsUserProvided && UDOIsDestructor)
15381 ? diag::warn_deprecated_copy_with_dtor
15382 : diag::warn_deprecated_copy;
15384 << RD << IsCopyAssignment;
15390 DefaultedFunctionFPFeaturesRAII RestoreFP(*
this, CopyAssignOperator);
15396 "DefineImplicitCopyAssignment called for wrong function");
15414 Scope.addContextNote(CurrentLocation);
15449 RefBuilder OtherRef(
Other, OtherRefType);
15452 std::optional<ThisBuilder>
This;
15453 std::optional<DerefBuilder> DerefThis;
15454 std::optional<RefBuilder> ExplicitObject;
15455 bool IsArrow =
false;
15461 ExplicitObject.emplace(CopyAssignOperator->
getParamDecl(0), ObjectType);
15465 DerefThis.emplace(*
This);
15468 ExprBuilder &ObjectParameter =
15469 ExplicitObject ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15470 :
static_cast<ExprBuilder &
>(*This);
15474 for (
auto &
Base : ClassDecl->
bases()) {
15477 QualType BaseType =
Base.getType().getUnqualifiedType();
15478 if (!BaseType->isRecordType()) {
15484 BasePath.push_back(&
Base);
15488 CastBuilder From(OtherRef,
Context.getQualifiedType(BaseType, OtherQuals),
15493 ExplicitObject ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15494 :
static_cast<ExprBuilder &
>(*DerefThis),
15503 if (
Copy.isInvalid()) {
15509 Statements.push_back(
Copy.getAs<
Expr>());
15516 ExprBuilder &To = ExplicitObject
15517 ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15518 :
static_cast<ExprBuilder &
>(*DerefThis);
15525 *
this, Loc,
Context.getCanonicalTagType(ClassDecl), To, OtherRef);
15526 if (
Copy.isInvalid()) {
15530 Statements.push_back(
Copy.getAs<
Stmt>());
15534 for (
auto *Field : ClassDecl->
fields()) {
15536 if (Field->isUnnamedBitField() || Field->getParent()->isUnion())
15539 if (Field->isInvalidDecl()) {
15545 if (Field->getType()->isReferenceType()) {
15546 Diag(ClassDecl->
getLocation(), diag::err_uninitialized_member_for_assign)
15547 <<
Context.getCanonicalTagType(ClassDecl) << 0
15548 << Field->getDeclName();
15549 Diag(Field->getLocation(), diag::note_declared_at);
15556 if (!BaseType->isRecordType() && BaseType.isConstQualified()) {
15557 Diag(ClassDecl->
getLocation(), diag::err_uninitialized_member_for_assign)
15558 <<
Context.getCanonicalTagType(ClassDecl) << 1
15559 << Field->getDeclName();
15560 Diag(Field->getLocation(), diag::note_declared_at);
15566 if (Field->isZeroLengthBitField())
15569 QualType FieldType = Field->getType().getNonReferenceType();
15572 "Incomplete array type is not valid");
15578 LookupResult MemberLookup(*
this, Field->getDeclName(), Loc,
15583 MemberBuilder From(OtherRef, OtherRefType,
false, MemberLookup);
15584 MemberBuilder To(ObjectParameter, ObjectType, IsArrow, MemberLookup);
15590 if (
Copy.isInvalid()) {
15596 Statements.push_back(
Copy.getAs<
Stmt>());
15602 (ExplicitObject ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15603 :
LangOpts.HLSL ?
static_cast<ExprBuilder &
>(*This)
15604 :
static_cast<ExprBuilder &
>(*DerefThis))
15605 .build(*
this, Loc);
15610 Statements.push_back(Return.
getAs<
Stmt>());
15623 assert(!Body.
isInvalid() &&
"Compound statement creation cannot fail");
15629 L->CompletedImplicitDefinition(CopyAssignOperator);
15636 DeclaringSpecialMember DSM(*
this, ClassDecl,
15638 if (DSM.isAlreadyBeingDeclared())
15645 std::nullopt, ClassDecl,
15675 CUDA().inferTargetForImplicitSpecialMember(
15682 ClassLoc, ClassLoc,
15695 ++
getASTContext().NumImplicitMoveAssignmentOperatorsDeclared;
15718 assert(!Class->isDependentContext() &&
"should not define dependent move");
15724 if (Class->getNumVBases() == 0 || Class->hasTrivialMoveAssignment() ||
15725 Class->getNumBases() < 2)
15729 typedef llvm::DenseMap<CXXRecordDecl*, CXXBaseSpecifier*> VBaseMap;
15732 for (
auto &BI : Class->bases()) {
15733 Worklist.push_back(&BI);
15734 while (!Worklist.empty()) {
15740 if (!
Base->hasNonTrivialMoveAssignment())
15765 VBases.insert(std::make_pair(
Base->getCanonicalDecl(), &BI))
15767 if (Existing && Existing != &BI) {
15768 S.
Diag(CurrentLocation, diag::warn_vbase_moved_multiple_times)
15771 << (
Base->getCanonicalDecl() ==
15774 S.
Diag(BI.getBeginLoc(), diag::note_vbase_moved_here)
15775 << (
Base->getCanonicalDecl() ==
15776 BI.getType()->getAsCXXRecordDecl()->getCanonicalDecl())
15780 Existing =
nullptr;
15790 llvm::append_range(Worklist, llvm::make_pointer_range(
Base->bases()));
15798 DefaultedFunctionFPFeaturesRAII RestoreFP(*
this, MoveAssignOperator);
15804 "DefineImplicitMoveAssignment called for wrong function");
15834 Scope.addContextNote(CurrentLocation);
15850 RefBuilder OtherRef(
Other, OtherRefType);
15852 MoveCastBuilder MoveOther(OtherRef);
15855 std::optional<ThisBuilder>
This;
15856 std::optional<DerefBuilder> DerefThis;
15857 std::optional<RefBuilder> ExplicitObject;
15859 bool IsArrow =
false;
15864 ExplicitObject.emplace(MoveAssignOperator->
getParamDecl(0), ObjectType);
15868 DerefThis.emplace(*
This);
15871 ExprBuilder &ObjectParameter =
15872 ExplicitObject ? *ExplicitObject :
static_cast<ExprBuilder &
>(*This);
15876 for (
auto &
Base : ClassDecl->
bases()) {
15887 QualType BaseType =
Base.getType().getUnqualifiedType();
15888 if (!BaseType->isRecordType()) {
15894 BasePath.push_back(&
Base);
15898 CastBuilder From(OtherRef, BaseType,
VK_XValue, BasePath);
15903 ExplicitObject ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15904 :
static_cast<ExprBuilder &
>(*DerefThis),
15913 if (Move.isInvalid()) {
15919 Statements.push_back(Move.getAs<
Expr>());
15926 ExprBuilder &To = ExplicitObject
15927 ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15928 :
static_cast<ExprBuilder &
>(*DerefThis);
15935 *
this, Loc,
Context.getCanonicalTagType(ClassDecl), To, OtherRef);
15936 if (
Copy.isInvalid()) {
15940 Statements.push_back(
Copy.getAs<
Stmt>());
15944 for (
auto *Field : ClassDecl->
fields()) {
15946 if (Field->isUnnamedBitField() || Field->getParent()->isUnion())
15949 if (Field->isInvalidDecl()) {
15955 if (Field->getType()->isReferenceType()) {
15956 Diag(ClassDecl->
getLocation(), diag::err_uninitialized_member_for_assign)
15957 <<
Context.getCanonicalTagType(ClassDecl) << 0
15958 << Field->getDeclName();
15959 Diag(Field->getLocation(), diag::note_declared_at);
15966 if (!BaseType->isRecordType() && BaseType.isConstQualified()) {
15967 Diag(ClassDecl->
getLocation(), diag::err_uninitialized_member_for_assign)
15968 <<
Context.getCanonicalTagType(ClassDecl) << 1
15969 << Field->getDeclName();
15970 Diag(Field->getLocation(), diag::note_declared_at);
15976 if (Field->isZeroLengthBitField())
15979 QualType FieldType = Field->getType().getNonReferenceType();
15982 "Incomplete array type is not valid");
15987 LookupResult MemberLookup(*
this, Field->getDeclName(), Loc,
15991 MemberBuilder From(MoveOther, OtherRefType,
15992 false, MemberLookup);
15993 MemberBuilder To(ObjectParameter, ObjectType, IsArrow, MemberLookup);
15995 assert(!From.build(*
this, Loc)->isLValue() &&
15996 "Member reference with rvalue base must be rvalue except for reference "
15997 "members, which aren't allowed for move assignment.");
16004 if (Move.isInvalid()) {
16010 Statements.push_back(Move.getAs<
Stmt>());
16016 (ExplicitObject ?
static_cast<ExprBuilder &
>(*ExplicitObject)
16017 :
LangOpts.HLSL ?
static_cast<ExprBuilder &
>(*This)
16018 :
static_cast<ExprBuilder &
>(*DerefThis))
16019 .build(*
this, Loc);
16025 Statements.push_back(Return.
getAs<
Stmt>());
16038 assert(!Body.
isInvalid() &&
"Compound statement creation cannot fail");
16044 L->CompletedImplicitDefinition(MoveAssignOperator);
16055 DeclaringSpecialMember DSM(*
this, ClassDecl,
16057 if (DSM.isAlreadyBeingDeclared())
16061 std::nullopt, ClassDecl,
16078 =
Context.DeclarationNames.getCXXConstructorName(
16079 Context.getCanonicalType(ClassType));
16098 CUDA().inferTargetForImplicitSpecialMember(
16124 ClassDecl->
hasAttr<TrivialABIAttr>() ||
16157 "DefineImplicitCopyConstructor - call it for implicit copy ctor");
16162 assert(ClassDecl &&
"DefineImplicitCopyConstructor - invalid constructor");
16173 Scope.addContextNote(CurrentLocation);
16203 DeclaringSpecialMember DSM(*
this, ClassDecl,
16205 if (DSM.isAlreadyBeingDeclared())
16209 std::nullopt, ClassDecl,
16222 =
Context.DeclarationNames.getCXXConstructorName(
16223 Context.getCanonicalType(ClassType));
16243 CUDA().inferTargetForImplicitSpecialMember(
16250 ClassLoc, ClassLoc,
16263 ClassDecl->
hasAttr<TrivialABIAttr>() ||
16296 "DefineImplicitMoveConstructor - call it for implicit move ctor");
16301 assert(ClassDecl &&
"DefineImplicitMoveConstructor - invalid constructor");
16312 Scope.addContextNote(CurrentLocation);
16358 if (CallOp != Invoker) {
16377 if (Invoker != CallOp) {
16390 assert(FunctionRef &&
"Can't refer to __invoke function?");
16398 L->CompletedImplicitDefinition(Conv);
16399 if (Invoker != CallOp)
16400 L->CompletedImplicitDefinition(Invoker);
16428 Diag(CurrentLocation, diag::note_lambda_to_block_conv);
16437 Diag(CurrentLocation, diag::note_lambda_to_block_conv);
16443 Stmt *ReturnS = Return.
get();
16450 L->CompletedImplicitDefinition(Conv);
16457 switch (Args.size()) {
16462 if (!Args[1]->isDefaultArgument())
16467 return !Args[0]->isDefaultArgument();
16476 bool HadMultipleCandidates,
bool IsListInitialization,
16477 bool IsStdInitListInitialization,
bool RequiresZeroInit,
16479 bool Elidable =
false;
16498 Expr *SubExpr = ExprArgs[0];
16509 Elidable, ExprArgs, HadMultipleCandidates,
16510 IsListInitialization,
16511 IsStdInitListInitialization, RequiresZeroInit,
16512 ConstructKind, ParenRange);
16518 bool HadMultipleCandidates,
bool IsListInitialization,
16519 bool IsStdInitListInitialization,
bool RequiresZeroInit,
16521 if (
auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl)) {
16531 ConstructLoc, DeclInitType,
Constructor, Elidable, ExprArgs,
16532 HadMultipleCandidates, IsListInitialization, IsStdInitListInitialization,
16533 RequiresZeroInit, ConstructKind, ParenRange);
16541 bool HadMultipleCandidates,
bool IsListInitialization,
16542 bool IsStdInitListInitialization,
bool RequiresZeroInit,
16547 "given constructor for wrong type");
16555 HadMultipleCandidates, IsListInitialization,
16556 IsStdInitListInitialization, RequiresZeroInit,
16588 PDiag(diag::err_access_dtor_var)
16598 bool HasConstantInit =
false;
16605 diag::err_constexpr_var_requires_const_destruction) << VD;
16616 if (!VD->
hasAttr<AlwaysDestroyAttr>())
16628 bool AllowExplicit,
16629 bool IsListInitialization) {
16631 unsigned NumArgs = ArgsPtr.size();
16632 Expr **Args = ArgsPtr.data();
16638 if (NumArgs < NumParams)
16639 ConvertedArgs.reserve(NumParams);
16641 ConvertedArgs.reserve(NumArgs);
16649 CallType, AllowExplicit, IsListInitialization);
16650 ConvertedArgs.append(AllArgs.begin(), AllArgs.end());
16661 bool SeenTypedOperators =
Context.hasSeenTypeAwareOperatorNewOrDelete();
16668 if (DeallocType.
isNull())
16679 constexpr unsigned RequiredParameterCount =
16682 if (NumParams != RequiredParameterCount)
16687 if (llvm::any_of(FnDecl->
parameters().drop_front(),
16689 return ParamDecl->getType()->isDependentType();
16694 if (SpecializedTypeIdentity.
isNull())
16698 ArgTypes.reserve(NumParams);
16704 ArgTypes.push_back(SpecializedTypeIdentity);
16725 diag::err_operator_new_delete_declared_in_namespace)
16732 diag::err_operator_new_delete_declared_static)
16742 Qualifiers PtrQuals = PtrTy->getPointeeType().getQualifiers();
16745 PtrTy->getPointeeType().getUnqualifiedType(), PtrQuals)));
16752 bool *WasMalformed) {
16753 const Decl *MalformedDecl =
nullptr;
16756 nullptr, &MalformedDecl))
16759 if (!MalformedDecl)
16763 *WasMalformed =
true;
16781 SemaRef, FD,
nullptr);
16782 unsigned DestroyingDeleteIdx = IsPotentiallyTypeAware + 1;
16791 unsigned DependentParamTypeDiag,
unsigned InvalidParamTypeDiag) {
16792 auto NormalizeType = [&SemaRef](
QualType T) {
16796 if (
const auto PtrTy =
T->template getAs<PointerType>())
16803 unsigned FirstNonTypeParam = 0;
16804 bool MalformedTypeIdentity =
false;
16806 SemaRef, FnDecl, &MalformedTypeIdentity);
16807 unsigned MinimumMandatoryArgumentCount = 1;
16808 unsigned SizeParameterIndex = 0;
16809 if (IsPotentiallyTypeAware) {
16813 SemaRef.
Diag(FnDecl->
getLocation(), diag::warn_ext_type_aware_allocators);
16816 SizeParameterIndex = 1;
16817 MinimumMandatoryArgumentCount =
16820 SizeParameterIndex = 2;
16821 MinimumMandatoryArgumentCount =
16824 FirstNonTypeParam = 1;
16827 bool IsPotentiallyDestroyingDelete =
16830 if (IsPotentiallyDestroyingDelete) {
16831 ++MinimumMandatoryArgumentCount;
16832 ++SizeParameterIndex;
16835 if (NumParams < MinimumMandatoryArgumentCount)
16837 diag::err_operator_new_delete_too_few_parameters)
16838 << IsPotentiallyTypeAware << IsPotentiallyDestroyingDelete
16839 << FnDecl->
getDeclName() << MinimumMandatoryArgumentCount;
16841 for (
unsigned Idx = 0; Idx < MinimumMandatoryArgumentCount; ++Idx) {
16845 diag::err_operator_new_default_arg)
16850 QualType CanResultType = NormalizeType(FnType->getReturnType());
16851 QualType CanExpectedResultType = NormalizeType(ExpectedResultType);
16852 QualType CanExpectedSizeOrAddressParamType =
16853 NormalizeType(ExpectedSizeOrAddressParamType);
16856 if (CanResultType != CanExpectedResultType) {
16859 return SemaRef.
Diag(
16861 CanResultType->isDependentType()
16862 ? diag::err_operator_new_delete_dependent_result_type
16863 : diag::err_operator_new_delete_invalid_result_type)
16870 diag::err_operator_new_delete_template_too_few_parameters)
16874 auto FallbackType) ->
bool {
16878 << IsPotentiallyTypeAware << IsPotentiallyDestroyingDelete
16884 auto ActualParamType =
16886 if (ActualParamType == CanExpectedTy)
16888 unsigned Diagnostic = ActualParamType->isDependentType()
16889 ? DependentParamTypeDiag
16890 : InvalidParamTypeDiag;
16892 << IsPotentiallyTypeAware << IsPotentiallyDestroyingDelete
16898 if (CheckType(FirstNonTypeParam, CanExpectedSizeOrAddressParamType,
"size_t"))
16905 if (!IsPotentiallyTypeAware)
16914 if (CheckType(SizeParameterIndex + 1, StdAlignValT,
"std::align_val_t"))
16918 return MalformedTypeIdentity;
16937 SizeTy, diag::err_operator_new_dependent_param_type,
16938 diag::err_operator_new_param_type);
16950 auto *MD = dyn_cast<CXXMethodDecl>(FnDecl);
16951 auto ConstructDestroyingDeleteAddressType = [&]() {
16964 SemaRef, MD,
nullptr)) {
16968 AddressParamType == ConstructDestroyingDeleteAddressType()) {
16979 diag::err_type_aware_destroying_operator_delete)
16980 << Param->getSourceRange();
17002 diag::err_operator_delete_dependent_param_type,
17003 diag::err_operator_delete_param_type))
17012 diag::err_destroying_operator_delete_not_usual);
17022 "Expected an overloaded operator declaration");
17032 if (Op == OO_Delete || Op == OO_Array_Delete)
17035 if (Op == OO_New || Op == OO_Array_New)
17045 if (
CXXMethodDecl *MethodDecl = dyn_cast<CXXMethodDecl>(FnDecl)) {
17046 if (MethodDecl->isStatic()) {
17047 if (Op == OO_Call || Op == OO_Subscript)
17051 return Diag(FnDecl->
getLocation(), diag::err_operator_overload_static)
17055 bool ClassOrEnumParam =
false;
17057 QualType ParamType = Param->getType().getNonReferenceType();
17060 ClassOrEnumParam =
true;
17065 if (!ClassOrEnumParam)
17067 diag::err_operator_overload_needs_class_or_enum)
17077 if (Op != OO_Call) {
17080 if (Param->hasDefaultArg()) {
17081 FirstDefaultedParam = Param;
17085 if (FirstDefaultedParam) {
17086 if (Op == OO_Subscript) {
17088 ? diag::ext_subscript_overload
17089 : diag::error_subscript_overload)
17094 diag::err_operator_overload_default_arg)
17102 {
false,
false,
false }
17103#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
17104 , { Unary, Binary, MemberOnly }
17105#include "clang/Basic/OperatorKinds.def"
17108 bool CanBeUnaryOperator = OperatorUses[Op][0];
17109 bool CanBeBinaryOperator = OperatorUses[Op][1];
17110 bool MustBeMemberOperator = OperatorUses[Op][2];
17121 if (Op != OO_Call && Op != OO_Subscript &&
17122 ((NumParams == 1 && !CanBeUnaryOperator) ||
17123 (NumParams == 2 && !CanBeBinaryOperator) || (NumParams < 1) ||
17124 (NumParams > 2))) {
17126 unsigned ErrorKind;
17127 if (CanBeUnaryOperator && CanBeBinaryOperator) {
17129 }
else if (CanBeUnaryOperator) {
17132 assert(CanBeBinaryOperator &&
17133 "All non-call overloaded operators are unary or binary!");
17136 return Diag(FnDecl->
getLocation(), diag::err_operator_overload_must_be)
17137 << FnDecl->
getDeclName() << NumParams << ErrorKind;
17140 if (Op == OO_Subscript && NumParams != 2) {
17142 ? diag::ext_subscript_overload
17143 : diag::error_subscript_overload)
17144 << FnDecl->
getDeclName() << (NumParams == 1 ? 0 : 2);
17149 if (Op != OO_Call &&
17151 return Diag(FnDecl->
getLocation(), diag::err_operator_overload_variadic)
17158 diag::err_operator_overload_must_be_member)
17172 if ((Op == OO_PlusPlus || Op == OO_MinusMinus) && NumParams == 2) {
17179 diag::err_operator_overload_post_incdec_must_be_int)
17180 << LastParam->
getType() << (Op == OO_MinusMinus);
17192 if (TemplateParams->
size() == 1) {
17194 dyn_cast<NonTypeTemplateParmDecl>(TemplateParams->
getParam(0));
17208 if (SemaRef.
getLangOpts().CPlusPlus20 && PmDecl &&
17211 PmDecl->
getType()->
getAs<DeducedTemplateSpecializationType>()))
17213 }
else if (TemplateParams->
size() == 2) {
17215 dyn_cast<TemplateTypeParmDecl>(TemplateParams->
getParam(0));
17217 dyn_cast<NonTypeTemplateParmDecl>(TemplateParams->
getParam(1));
17223 if (
const auto *TArgs =
17225 TArgs && TArgs->getDepth() == PmType->
getDepth() &&
17226 TArgs->getIndex() == PmType->
getIndex()) {
17229 diag::ext_string_literal_operator_template);
17236 diag::err_literal_operator_template)
17243 Diag(FnDecl->
getLocation(), diag::err_literal_operator_outside_namespace)
17252 Diag(LSD->getExternLoc(), diag::note_extern_c_begins_here);
17271 diag::err_literal_operator_template_with_params);
17281 QualType ParamType = Param->getType().getUnqualifiedType();
17293 QualType InnerType = Ptr->getPointeeType();
17299 Diag(Param->getSourceRange().getBegin(),
17300 diag::err_literal_operator_param)
17301 << ParamType <<
"'const char *'" << Param->getSourceRange();
17306 Diag(Param->getSourceRange().getBegin(), diag::err_literal_operator_param)
17307 << ParamType <<
Context.LongDoubleTy << Param->getSourceRange();
17311 Diag(Param->getSourceRange().getBegin(), diag::err_literal_operator_param)
17312 << ParamType <<
Context.UnsignedLongLongTy << Param->getSourceRange();
17316 Diag(Param->getSourceRange().getBegin(),
17317 diag::err_literal_operator_invalid_param)
17318 << ParamType << Param->getSourceRange();
17327 QualType FirstParamType = (*Param)->getType().getUnqualifiedType();
17334 Diag((*Param)->getSourceRange().getBegin(),
17335 diag::err_literal_operator_param)
17336 << FirstParamType <<
"'const char *'" << (*Param)->getSourceRange();
17343 Diag((*Param)->getSourceRange().getBegin(),
17344 diag::err_literal_operator_param)
17345 << FirstParamType <<
"'const char *'" << (*Param)->getSourceRange();
17358 Diag((*Param)->getSourceRange().getBegin(),
17359 diag::err_literal_operator_param)
17360 << FirstParamType <<
"'const char *'" << (*Param)->getSourceRange();
17368 QualType SecondParamType = (*Param)->getType().getUnqualifiedType();
17369 if (!
Context.hasSameType(SecondParamType,
Context.getSizeType())) {
17370 Diag((*Param)->getSourceRange().getBegin(),
17371 diag::err_literal_operator_param)
17372 << SecondParamType <<
Context.getSizeType()
17373 << (*Param)->getSourceRange();
17377 Diag(FnDecl->
getLocation(), diag::err_literal_operator_bad_param_count);
17386 if (Param->hasDefaultArg()) {
17387 Diag(Param->getDefaultArgRange().getBegin(),
17388 diag::err_literal_operator_default_argument)
17389 << Param->getDefaultArgRange();
17404 <<
static_cast<int>(Status)
17415 assert(Lit->
isUnevaluated() &&
"Unexpected string literal kind");
17421 else if (Lang ==
"C++")
17424 Diag(LangStr->
getExprLoc(), diag::err_language_linkage_spec_unknown)
17444 if (
getLangOpts().CPlusPlusModules && isCurrentModulePurview()) {
17445 Module *GlobalModule = PushImplicitGlobalModuleFragment(ExternLoc);
17468 PopImplicitGlobalModuleFragment();
17471 return LinkageSpec;
17495 ExDeclType =
Context.getArrayDecayedType(ExDeclType);
17497 ExDeclType =
Context.getPointerType(ExDeclType);
17504 Diag(Loc, diag::err_catch_rvalue_ref);
17509 Diag(Loc, diag::err_catch_variably_modified) << ExDeclType;
17515 unsigned DK = diag::err_catch_incomplete;
17517 BaseType = Ptr->getPointeeType();
17519 DK = diag::err_catch_incomplete_ptr;
17522 BaseType = Ref->getPointeeType();
17524 DK = diag::err_catch_incomplete_ref;
17526 if (!
Invalid && (Mode == 0 || !BaseType->isVoidType()) &&
17530 if (!
Invalid && BaseType.isWebAssemblyReferenceType()) {
17531 Diag(Loc, diag::err_wasm_reftype_tc) << 1;
17535 if (!
Invalid && Mode != 1 && BaseType->isSizelessType()) {
17536 Diag(Loc, diag::err_catch_sizeless) << (Mode == 2 ? 1 : 0) << BaseType;
17542 diag::err_abstract_type_in_decl,
17551 T = RT->getPointeeType();
17553 if (
T->isObjCObjectType()) {
17554 Diag(Loc, diag::err_objc_object_catch);
17556 }
else if (
T->isObjCObjectPointerType()) {
17559 Diag(Loc, diag::warn_objc_pointer_cxx_catch_fragile);
17568 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(ExDecl))
17593 Expr *opaqueValue =
17643 Diag(PrevDecl->getLocation(), diag::note_previous_definition);
17645 }
else if (PrevDecl->isTemplateParameter())
17673 Expr *AssertMessageExpr,
17679 AssertMessageExpr, RParenLoc,
false);
17684 case BuiltinType::Char_S:
17685 case BuiltinType::Char_U:
17687 case BuiltinType::Char8:
17690 case BuiltinType::Char16:
17693 case BuiltinType::Char32:
17696 case BuiltinType::WChar_S:
17697 case BuiltinType::WChar_U:
17701 llvm_unreachable(
"Non-character type");
17711 char Arr[UNI_MAX_UTF8_BYTES_PER_CODE_POINT];
17714 llvm::raw_svector_ostream OS(Str);
17718 if (K == BuiltinType::Char_S || K == BuiltinType::Char_U ||
17719 K == BuiltinType::Char8 ||
Value <= 0x7F) {
17721 if (!Escaped.empty())
17724 OS << static_cast<char>(
Value);
17729 case BuiltinType::Char16:
17730 case BuiltinType::Char32:
17731 case BuiltinType::WChar_S:
17732 case BuiltinType::WChar_U: {
17733 if (llvm::ConvertCodePointToUTF8(
Value, Ptr))
17737 << llvm::format_hex_no_prefix(
Value, TyWidth / 4,
true);
17741 llvm_unreachable(
"Non-character type is passed");
17753 switch (
V.getKind()) {
17755 if (
T->isBooleanType()) {
17759 int64_t BoolValue =
V.getInt().getExtValue();
17760 assert((BoolValue == 0 || BoolValue == 1) &&
17761 "Bool type, but value is not 0 or 1");
17762 llvm::raw_svector_ostream OS(Str);
17763 OS << (BoolValue ?
"true" :
"false");
17765 llvm::raw_svector_ostream OS(Str);
17770 switch (BTy->getKind()) {
17771 case BuiltinType::Char_S:
17772 case BuiltinType::Char_U:
17773 case BuiltinType::Char8:
17774 case BuiltinType::Char16:
17775 case BuiltinType::Char32:
17776 case BuiltinType::WChar_S:
17777 case BuiltinType::WChar_U: {
17778 unsigned TyWidth = Context.getIntWidth(
T);
17779 assert(8 <= TyWidth && TyWidth <= 32 &&
"Unexpected integer width");
17785 << llvm::format_hex_no_prefix(CodeUnit, 2,
17787 <<
", " <<
V.getInt() <<
')';
17794 V.getInt().toString(Str);
17800 V.getFloat().toString(Str);
17804 if (
V.isNullPointer()) {
17805 llvm::raw_svector_ostream OS(Str);
17812 llvm::raw_svector_ostream OS(Str);
17814 V.getComplexFloatReal().toString(Str);
17816 V.getComplexFloatImag().toString(Str);
17821 llvm::raw_svector_ostream OS(Str);
17823 V.getComplexIntReal().toString(Str);
17825 V.getComplexIntImag().toString(Str);
17852 if (
const auto *UnaryOp = dyn_cast<UnaryOperator>(E))
17856 if (
const auto *BO = dyn_cast<BinaryOperator>(E))
17857 return (BO->isShiftOp() || BO->isAdditiveOp() || BO->isMultiplicativeOp() ||
17858 BO->isBitwiseOp());
17866 if (
const auto *Op = dyn_cast<BinaryOperator>(E);
17867 Op && Op->getOpcode() != BO_LOr) {
17868 const Expr *LHS = Op->getLHS()->IgnoreParenImpCasts();
17869 const Expr *RHS = Op->getRHS()->IgnoreParenImpCasts();
17887 for (
auto &DiagSide : DiagSides) {
17888 const Expr *Side = DiagSide.Cond;
17893 DiagSide.Result.Val, Side->
getType(), DiagSide.ValueString,
Context);
17895 if (DiagSides[0].Print && DiagSides[1].Print) {
17896 Diag(Op->getExprLoc(), diag::note_expr_evaluates_to)
17897 << DiagSides[0].ValueString << Op->getOpcodeStr()
17898 << DiagSides[1].ValueString << Op->getSourceRange();
17900 }
else if (
const auto *RE = dyn_cast<RequiresExpr>(E)) {
17907template <
typename ResultType>
17911 bool ErrorOnInvalidMessage) {
17914 assert(!Message->isTypeDependent() && !Message->isValueDependent() &&
17915 "can't evaluate a dependant static assert message");
17917 if (
const auto *SL = dyn_cast<StringLiteral>(Message)) {
17918 assert(SL->isUnevaluated() &&
"expected an unevaluated string");
17919 if constexpr (std::is_same_v<APValue, ResultType>) {
17924 assert(CAT &&
"string literal isn't an array");
17928 for (
unsigned I = 0; I < SL->getLength(); I++) {
17929 Value = SL->getCodeUnit(I);
17933 Result.assign(SL->getString().begin(), SL->getString().end());
17939 QualType T = Message->getType().getNonReferenceType();
17940 auto *RD =
T->getAsCXXRecordDecl();
17942 SemaRef.
Diag(Loc, diag::err_user_defined_msg_invalid) << EvalContext;
17946 auto FindMember = [&](StringRef
Member) -> std::optional<LookupResult> {
17952 if (MemberLookup.
empty())
17953 return std::nullopt;
17954 return std::move(MemberLookup);
17957 std::optional<LookupResult> SizeMember = FindMember(
"size");
17958 std::optional<LookupResult> DataMember = FindMember(
"data");
17959 if (!SizeMember || !DataMember) {
17960 SemaRef.
Diag(Loc, diag::err_user_defined_msg_missing_member_function)
17962 << ((!SizeMember && !DataMember) ? 2
17970 Message, Message->getType(), Message->getBeginLoc(),
false,
17996 SemaRef.
Diag(Loc, diag::err_user_defined_msg_invalid_mem_fn_ret_ty)
17997 << EvalContext << 0;
18007 SemaRef.
Diag(Loc, diag::err_user_defined_msg_invalid_mem_fn_ret_ty)
18008 << EvalContext << 1;
18012 if (!ErrorOnInvalidMessage &&
18013 SemaRef.
Diags.
isIgnored(diag::warn_user_defined_msg_constexpr, Loc))
18018 Status.Diag = &Notes;
18019 if (!Message->EvaluateCharRangeAsString(
Result, EvaluatedSize.
get(),
18020 EvaluatedData.
get(), Ctx, Status) ||
18022 SemaRef.
Diag(Message->getBeginLoc(),
18023 ErrorOnInvalidMessage ? diag::err_user_defined_msg_constexpr
18024 : diag::warn_user_defined_msg_constexpr)
18026 for (
const auto &
Note : Notes)
18028 return !ErrorOnInvalidMessage;
18035 bool ErrorOnInvalidMessage) {
18037 ErrorOnInvalidMessage);
18042 bool ErrorOnInvalidMessage) {
18044 ErrorOnInvalidMessage);
18048 Expr *AssertExpr,
Expr *AssertMessage,
18051 assert(AssertExpr !=
nullptr &&
"Expected non-null condition");
18069 AssertExpr = FullAssertExpr.
get();
18072 Expr *BaseExpr = AssertExpr;
18084 diag::err_static_assert_expression_is_not_constant,
18090 if (!Failed && AssertMessage && Cond.getBoolValue()) {
18100 bool InTemplateDefinition =
18103 if (!Failed && !Cond && !InTemplateDefinition) {
18105 llvm::raw_svector_ostream Msg(MsgBuffer);
18106 bool HasMessage = AssertMessage;
18107 if (AssertMessage) {
18115 Expr *InnerCond =
nullptr;
18116 std::string InnerCondDescription;
18117 std::tie(InnerCond, InnerCondDescription) =
18119 if (
const auto *ConceptIDExpr =
18120 dyn_cast_or_null<ConceptSpecializationExpr>(InnerCond)) {
18122 ConceptIDExpr->getSatisfaction();
18133 diag::err_static_assert_requirement_failed)
18134 << InnerCondDescription << !HasMessage << Msg.str()
18151 AssertExpr = FullAssertExpr.
get();
18155 AssertExpr, AssertMessage, RParenLoc,
18163 if (
const auto *PIT = dyn_cast<PackIndexingType>(
T))
18164 return PIT->getPattern();
18168static const TemplateSpecializationType *
18171 if (
const auto *ICNT = dyn_cast<InjectedClassNameType>(
T))
18172 T = ICNT->getDecl()->getCanonicalTemplateSpecializationType(Context);
18174 const auto *TST = dyn_cast<TemplateSpecializationType>(
T);
18178 TemplateDecl *TD = TST->getTemplateName().getAsTemplateDecl();
18200 if (
const auto *TST =
18202 if (isa_and_nonnull<TypeAliasTemplateDecl>(
18203 TST->getTemplateName().getAsTemplateDecl())) {
18204 S.
Diag(Loc, diag::err_dependent_friend_not_member_of_template_spec)
18211 S.
Diag(Loc, diag::err_dependent_friend_not_member_of_template_spec) << NNS;
18213 S.
Diag(Loc, diag::err_dependent_friend_not_member);
18220 bool IsInstantiation) {
18226 "nested-name-specifier of dependent friend must be a type");
18232 const TemplateSpecializationType *TST =
18244 llvm::SmallBitVector UsedParameters(Params->size());
18246 true, Params->getDepth(),
18249 for (
unsigned I = 0, N = UsedParameters.size(); I != N; ++I)
18250 if (!UsedParameters[I])
18251 UndeducedParameters.push_back(Params->getParam(I));
18254 if (UndeducedParameters.empty())
18257 Diag(Loc, diag::err_dependent_friend_undeduced_params)
18258 << (UndeducedParameters.size() > 1) <<
QualType(TST, 0);
18260 for (
NamedDecl *Param : UndeducedParameters) {
18261 if (Param->getDeclName())
18262 Diag(Param->getLocation(), diag::note_non_deducible_parameter)
18263 << Param->getDeclName();
18265 Diag(Param->getLocation(), diag::note_non_deducible_parameter)
18279 bool IsMemberSpecialization =
false;
18284 TempParamLists,
true,
18285 IsMemberSpecialization,
Invalid);
18290 if (TemplateParams) {
18291 Diag(NameLoc, diag::err_not_class_template_specialization) << 0;
18296 if (TemplateParams) {
18297 if (TemplateParams->
size() > 0) {
18305 FriendLoc, TempParamLists.size() - 1, TempParamLists.data(),
18306 IsMemberSpecialization);
18319 bool IsAllExplicitSpecializations =
18321 return List->
size() == 0;
18330 if (!TemplateId && IsAllExplicitSpecializations) {
18332 bool Owned =
false;
18333 bool IsDependent =
false;
18350 NameLoc, &TSI,
true);
18355 FriendLoc, EllipsisLoc);
18361 assert(SS.
isNotEmpty() &&
"valid templated tag with no SS and no direct?");
18364 if (TemplateParams)
18365 TPLs = TPLs.drop_back();
18385 TSI =
Context.CreateTypeSourceInfo(
T);
18398 }
else if (Unexpanded.empty()) {
18399 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
18405 if (!TempParamLists.empty()) {
18406 unsigned FriendDeclDepth = TempParamLists.front()->getDepth();
18408 if (std::optional<std::pair<unsigned, unsigned>> DI =
18410 DI && DI->first >= FriendDeclDepth) {
18411 auto *ND = dyn_cast<NamedDecl *>(
U.first);
18414 Diag(
U.second, diag::friend_template_decl_malformed_pack_expansion)
18424 if (TempParamLists.empty())
18432 if (TemplateParams)
18465 Diag(FriendLoc, diag::err_friend_not_first_in_declaration);
18497 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
18502 if (!
T->isElaboratedTypeSpecifier()) {
18503 if (TempParams.size()) {
18515 }
else if (
const RecordDecl *RD =
T->getAsRecordDecl()) {
18520 ? diag::warn_cxx98_compat_unelaborated_friend_type
18521 : diag::ext_unelaborated_friend_type)
18526 DiagCompat(FriendLoc, diag_compat::nonclass_type_friend)
18543 if (!TempParams.empty()) {
18549 TempParams, EllipsisLoc);
18552 TSI, FriendLoc, EllipsisLoc);
18587 Diag(Loc, diag::err_unexpected_friend);
18629 if (IsNamespaceOrGlobal) {
18639 Scope *DCScope = S;
18649 (FunctionContainingLocalClass =
18672 DC =
Previous.getRepresentativeDecl()->getDeclContext();
18676 DC = FunctionContainingLocalClass;
18713 if (isTemplateId) {
18728 if (!DC)
return nullptr;
18739 diag::warn_cxx98_compat_friend_is_member :
18740 diag::err_friend_is_member);
18773 if (DiagArg >= 0) {
18774 Diag(Loc, diag::err_introducing_special_friend) << DiagArg;
18790 DCScope = &FakeDCScope;
18793 bool AddToScope =
true;
18795 TemplateParams, AddToScope);
18796 if (!ND)
return nullptr;
18824 Friend->setInvalidDecl();
18830 assert(FD &&
"Expected a function declaration!");
18837 if (!TPLs.empty() && SS.
isValid())
18851 if (!TemplateParams.empty() && SS.
isValid() &&
18870 }
else if (FunctionContainingLocalClass) {
18879 }
else if (isTemplateId) {
18893 Diag(FD->
getLocation(), diag::err_friend_decl_with_def_arg_redeclared);
18895 diag::note_previous_declaration);
18897 Diag(FD->
getLocation(), diag::err_friend_decl_with_def_arg_must_be_def);
18907 FunctionDecl *Fn = dyn_cast_or_null<FunctionDecl>(Dcl);
18909 Diag(DelLoc, diag::err_deleted_non_function);
18914 Fn->setWillHaveBody(
false);
18916 if (
const FunctionDecl *Prev = Fn->getPreviousDecl()) {
18920 Prev->getPreviousDecl()) &&
18921 !Prev->isDefined()) {
18922 Diag(DelLoc, diag::err_deleted_decl_not_first);
18923 Diag(Prev->getLocation().isInvalid() ? DelLoc : Prev->getLocation(),
18924 Prev->isImplicit() ? diag::note_previous_implicit_declaration
18925 : diag::note_previous_declaration);
18928 Fn->setInvalidDecl();
18936 Fn = Fn->getCanonicalDecl();
18941 Diag(Fn->getLocation(), diag::err_attribute_dll_deleted) << DLLAttr;
18942 Fn->setInvalidDecl();
18948 Diag(DelLoc, diag::err_deleted_main);
18952 Fn->setImplicitlyInline();
18953 Fn->setDeletedAsWritten(
true, Message);
18960 auto *FD = dyn_cast<FunctionDecl>(Dcl);
18962 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(Dcl)) {
18963 if (FTD->getTemplatedDecl()->getDefaultedFunctionKind().isComparison()) {
18964 Diag(DefaultLoc, diag::err_defaulted_comparison_template);
18969 Diag(DefaultLoc, diag::err_default_special_members)
18980 (!FD->isDependentContext() ||
18983 Diag(DefaultLoc, diag::err_default_special_members)
18992 DiagCompat(DefaultLoc, diag_compat::defaulted_comparison);
18995 FD->setDefaulted();
18996 FD->setExplicitlyDefaulted();
18997 FD->setDefaultLoc(DefaultLoc);
19000 if (FD->isDependentContext())
19006 FD->setWillHaveBody(
false);
19021 if (
const FunctionDecl *Pattern = FD->getTemplateInstantiationPattern())
19032 if (!FD->getDefaultedOrDeletedInfo() &&
19034 FD->setDefaultedOrDeletedInfo(
19060 Self.Diag(SubStmt->getBeginLoc(),
19061 diag::err_return_in_constructor_handler);
19068 for (
unsigned I = 0, E = TryBlock->
getNumHandlers(); I != E; ++I) {
19076 switch (BodyKind) {
19085 "Parsed function body should be '= delete;' or '= default;'");
19095 for (
unsigned I = 0, E = OldFT->
getNumParams(); I != E; ++I)
19099 !NewFT->getExtParameterInfo(I).isNoEscape()) {
19100 Diag(
New->getParamDecl(I)->getLocation(),
19101 diag::warn_overriding_method_missing_noescape);
19103 diag::note_overridden_marked_noescape);
19109 Diag(
New->getLocation(), diag::err_conflicting_overriding_attributes)
19116 const auto *OldCSA = Old->
getAttr<CodeSegAttr>();
19117 const auto *NewCSA =
New->getAttr<CodeSegAttr>();
19118 if ((NewCSA || OldCSA) &&
19119 (!OldCSA || !NewCSA || NewCSA->getName() != OldCSA->getName())) {
19120 Diag(
New->getLocation(), diag::err_mismatched_code_seg_override);
19126 if (
Context.hasAnyFunctionEffects()) {
19128 const auto NewFXOrig =
New->getFunctionEffects();
19130 if (OldFX != NewFXOrig) {
19134 for (
const auto &Diff : Diffs) {
19135 switch (Diff.shouldDiagnoseMethodOverride(*Old, OldFX, *
New, NewFX)) {
19139 Diag(
New->getLocation(), diag::warn_conflicting_func_effect_override)
19140 << Diff.effectName();
19145 NewFX.
insert(Diff.Old.value(), Errs);
19150 NewFT->getParamTypes(), EPI);
19151 New->setType(ModQT);
19152 if (Errs.empty()) {
19155 Diag(
New->getLocation(), diag::warn_mismatched_func_effect_override)
19156 << Diff.effectName();
19173 if (NewCC == OldCC)
19184 diag::err_conflicting_overriding_cc_attributes)
19194 if (!
New->isExplicitObjectMemberFunction())
19196 Diag(
New->getParamDecl(0)->getBeginLoc(),
19197 diag::err_explicit_object_parameter_nonmember)
19198 <<
New->getSourceRange() << 1 <<
false;
19200 New->setInvalidDecl();
19209 if (
Context.hasSameType(NewTy, OldTy) ||
19224 if (NewRT->getTypeClass() == OldRT->getTypeClass()) {
19234 diag::err_different_return_type_for_overriding_virtual_function)
19235 <<
New->getDeclName() << NewTy << OldTy
19236 <<
New->getReturnTypeSourceRange();
19243 if (!
Context.hasSameUnqualifiedType(NewClassTy, OldClassTy)) {
19252 diag::err_covariant_return_incomplete,
19253 New->getDeclName()))
19259 Diag(
New->getLocation(), diag::err_covariant_return_not_derived)
19260 <<
New->getDeclName() << NewTy << OldTy
19261 <<
New->getReturnTypeSourceRange();
19269 NewClassTy, OldClassTy,
19270 diag::err_covariant_return_inaccessible_base,
19271 diag::err_covariant_return_ambiguous_derived_to_base_conv,
19272 New->getLocation(),
New->getReturnTypeSourceRange(),
19273 New->getDeclName(),
nullptr)) {
19287 diag::err_covariant_return_type_different_qualifications)
19288 <<
New->getDeclName() << NewTy << OldTy
19289 <<
New->getReturnTypeSourceRange();
19299 diag::err_covariant_return_type_class_type_not_same_or_less_qualified)
19300 <<
New->getDeclName() << NewTy << OldTy
19301 <<
New->getReturnTypeSourceRange();
19313 Method->setRangeEnd(EndLoc);
19315 if (
Method->isVirtual() ||
Method->getParent()->isDependentContext()) {
19316 Method->setIsPureVirtual();
19320 if (!
Method->isInvalidDecl())
19321 Diag(
Method->getLocation(), diag::err_non_virtual_pure)
19322 <<
Method->getDeclName() << InitRange;
19329 else if (
auto *M = dyn_cast<CXXMethodDecl>(D))
19372 "Parser allowed 'typedef' as storage class of condition decl.");
19384 if (
auto *VD = dyn_cast<VarDecl>(Dcl))
19398 llvm::DenseMap<CXXRecordDecl *, bool>::iterator Pos =
19402 if (!Pos->second && VTable.DefinitionRequired)
19403 Pos->second =
true;
19407 VTablesUsed[VTable.Record] = VTable.DefinitionRequired;
19408 NewUses.push_back(
VTableUse(VTable.Record, VTable.Location));
19415 bool DefinitionRequired) {
19418 if (!
Class->isDynamicClass() ||
Class->isDependentContext() ||
19424 !
OpenMP().isInOpenMPDeclareTargetContext() &&
19425 !
OpenMP().isInOpenMPTargetExecutionDirective()) {
19426 if (!DefinitionRequired)
19434 std::pair<llvm::DenseMap<CXXRecordDecl *, bool>::iterator,
bool>
19440 if (DefinitionRequired && !Pos.first->second) {
19441 Pos.first->second =
true;
19451 if (
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
19472 if (
Class->isLocalClass())
19487 bool DefinedAnything =
false;
19488 for (
unsigned I = 0; I !=
VTableUses.size(); ++I) {
19493 Class->getTemplateSpecializationKind();
19497 bool DefineVTable =
true;
19502 if (
Class->isInCurrentModuleUnit()) {
19503 DefineVTable =
true;
19504 }
else if (KeyFunction && !KeyFunction->
hasBody()) {
19509 DefineVTable =
false;
19514 "Instantiations don't have key functions");
19516 }
else if (!KeyFunction) {
19521 bool IsExplicitInstantiationDeclaration =
19523 for (
auto *R :
Class->redecls()) {
19527 IsExplicitInstantiationDeclaration =
true;
19529 IsExplicitInstantiationDeclaration =
false;
19534 if (IsExplicitInstantiationDeclaration) {
19535 const bool HasExcludeFromExplicitInstantiation =
19543 return method->hasAttr<ExcludeFromExplicitInstantiationAttr>();
19545 if (!HasExcludeFromExplicitInstantiation)
19546 DefineVTable =
false;
19553 if (!DefineVTable) {
19561 DefinedAnything =
true;
19569 !(
Class->isInNamedModule() &&
Class->shouldEmitInExternalSource()))
19575 if (
Context.getTargetInfo().getCXXABI().hasKeyFunctions() &&
19576 Class->isExternallyVisible() &&
19577 !(
Class->getOwningModule() &&
19578 Class->getOwningModule()->isInterfaceOrPartition()) &&
19583 if (!KeyFunction || (KeyFunction->
hasBody(KeyFunctionDef) &&
19590 return DefinedAnything;
19595 for (
const auto *I : RD->
methods())
19596 if (I->isVirtual() && !I->isPureVirtual())
19602 bool ConstexprOnly) {
19606 for (
const auto &FinalOverrider : FinalOverriders) {
19607 for (
const auto &OverridingMethod : FinalOverrider.second) {
19608 assert(OverridingMethod.second.size() > 0 &&
"no final overrider");
19609 CXXMethodDecl *Overrider = OverridingMethod.second.front().Method;
19623 for (
const auto &I : RD->
bases()) {
19624 const auto *
Base = I.getType()->castAsCXXRecordDecl();
19625 if (
Base->getNumVBases() == 0)
19646 (void)
Target->hasBody(FNTarget);
19648 cast_or_null<CXXConstructorDecl>(FNTarget));
19653 *TCanonical =
Target?
Target->getCanonicalDecl() :
nullptr;
19655 if (!Current.insert(Canonical).second)
19660 Target->isInvalidDecl() ||
Valid.count(TCanonical)) {
19661 Valid.insert_range(Current);
19664 }
else if (TCanonical == Canonical ||
Invalid.count(TCanonical) ||
19665 Current.count(TCanonical)) {
19667 if (!
Invalid.count(TCanonical)) {
19669 diag::warn_delegating_ctor_cycle)
19673 if (TCanonical != Canonical)
19674 S.
Diag(
Target->getLocation(), diag::note_it_delegates_to);
19677 while (
C->getCanonicalDecl() != Canonical) {
19679 (void)
C->getTargetConstructor()->hasBody(FNTarget);
19680 assert(FNTarget &&
"Ctor cycle through bodiless function");
19684 S.
Diag(
C->getLocation(), diag::note_which_delegates_to);
19688 Invalid.insert_range(Current);
19699 for (DelegatingCtorDeclsType::iterator
19706 CI->setInvalidDecl();
19715 explicit FindCXXThisExpr(
Sema &S) : S(S) {}
19743 FindCXXThisExpr Finder(*
this);
19756 if (!Finder.TraverseStmt(
const_cast<Expr *
>(TRC.ConstraintExpr)))
19773 FindCXXThisExpr Finder(*
this);
19795 if (!Finder.TraverseType(E))
19805 FindCXXThisExpr Finder(*
this);
19808 for (
const auto *A :
Method->attrs()) {
19810 Expr *Arg =
nullptr;
19812 if (
const auto *G = dyn_cast<GuardedByAttr>(A))
19814 else if (
const auto *G = dyn_cast<PtGuardedByAttr>(A))
19816 else if (
const auto *AA = dyn_cast<AcquiredAfterAttr>(A))
19818 else if (
const auto *AB = dyn_cast<AcquiredBeforeAttr>(A))
19820 else if (
const auto *LR = dyn_cast<LockReturnedAttr>(A))
19821 Arg = LR->getArg();
19822 else if (
const auto *LE = dyn_cast<LocksExcludedAttr>(A))
19824 else if (
const auto *RC = dyn_cast<RequiresCapabilityAttr>(A))
19826 else if (
const auto *AC = dyn_cast<AcquireCapabilityAttr>(A))
19828 else if (
const auto *AC = dyn_cast<TryAcquireCapabilityAttr>(A)) {
19829 Arg = AC->getSuccessValue();
19831 }
else if (
const auto *RC = dyn_cast<ReleaseCapabilityAttr>(A))
19834 if (Arg && !Finder.TraverseStmt(Arg))
19837 for (
Expr *A : Args) {
19838 if (!Finder.TraverseStmt(A))
19852 Exceptions.clear();
19855 Exceptions.reserve(DynamicExceptions.size());
19856 for (
unsigned ei = 0, ee = DynamicExceptions.size(); ei != ee; ++ei) {
19863 if (!Unexpanded.empty()) {
19874 Exceptions.push_back(ET);
19884 "Parser should have made sure that the expression is boolean");
19904 D = FTD->getTemplatedDecl();
19914 DynamicExceptionRanges, NoexceptExpr, Exceptions,
19918 Context.adjustExceptionSpec(FD, ESI,
true);
19942 Diag(DeclStart, diag::err_anonymous_property);
19956 TInfo =
Context.getTrivialTypeSourceInfo(
T, Loc);
19967 diag::err_invalid_thread)
19975 switch (
Previous.getResultKind()) {
19982 PrevDecl =
Previous.getRepresentativeDecl();
19995 PrevDecl =
nullptr;
19999 PrevDecl =
nullptr;
20010 Record->setInvalidDecl();
20032 if (!ExplicitLists.empty()) {
20033 bool IsMemberSpecialization, IsInvalid;
20037 ExplicitLists,
false, IsMemberSpecialization, IsInvalid,
20049 if (ExplicitParams && !ExplicitParams->
empty()) {
20050 Info.AutoTemplateParameterDepth = ExplicitParams->
getDepth();
20051 llvm::append_range(Info.TemplateParams, *ExplicitParams);
20052 Info.NumExplicitTemplateParams = ExplicitParams->
size();
20054 Info.AutoTemplateParameterDepth = TemplateParameterDepth;
20055 Info.NumExplicitTemplateParams = 0;
20061 if (FSI.TemplateParams.size() > FSI.NumExplicitTemplateParams) {
20062 if (FSI.NumExplicitTemplateParams != 0) {
20083 assert(
Context.getTargetInfo().getCXXABI().isMicrosoft());
20093 if (NumParams == 0)
20102 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],...
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
getQuantity - 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
CompoundStmt - This represents a group of statements like { stmt stmt }.
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
Expr * getPackIndexingExpr() const
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 getEllipsisLoc() const
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).
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)
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.
SourceLocation getNameLoc() const
Gets the location of the identifier.
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.
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
@ CSK_Normal
Normal lookup.
@ 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.
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,...
QualType BuildPackIndexingType(QualType Pattern, Expr *IndexExpr, SourceLocation Loc, SourceLocation EllipsisLoc, bool FullySubstituted=false, ArrayRef< QualType > Expansions={})
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.
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 evaluateDestruction(SmallVectorImpl< PartialDiagnosticAt > &Notes) const
Evaluate the destruction of this variable to determine if it constitutes constant destruction.
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.
@ Type
The name was classified as a type.
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_elementwise_add_sat __builtin_elementwise_sub_sat uint32_t __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
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...
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