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()) {
539 for (
unsigned p = 0, NumParams = PrevForDefaultArgs
542 p < NumParams; ++p) {
546 bool OldParamHasDfl = OldParam ? OldParam->
hasDefaultArg() :
false;
549 if (OldParamHasDfl && NewParamHasDfl) {
550 unsigned DiagDefaultParamID =
551 diag::err_param_default_argument_redefinition;
566 DiagDefaultParamID = diag::ext_param_default_argument_redefinition;
584 for (
auto Older = PrevForDefaultArgs;
586 Older = Older->getPreviousDecl();
587 OldParam = Older->getParamDecl(p);
592 }
else if (OldParamHasDfl) {
598 !
New->getLexicalDeclContext()->isDependentContext()) {
610 }
else if (NewParamHasDfl) {
611 if (
New->getDescribedFunctionTemplate()) {
614 diag::err_param_default_argument_template_redecl)
617 diag::note_template_prev_declaration)
619 }
else if (
New->getTemplateSpecializationKind()
633 <<
New->getDeclName()
635 }
else if (
New->getDeclContext()->isDependentContext()) {
647 = dyn_cast<CXXRecordDecl>(
New->getDeclContext())) {
648 if (
Record->getDescribedClassTemplate())
657 diag::err_param_default_argument_member_template_redecl)
671 if (NewSM != OldSM) {
674 Diag(NewParam->
getLocation(), diag::err_default_arg_makes_ctor_special)
685 Diag(
New->getLocation(), diag::err_constexpr_redecl_mismatch)
695 (
New->isInlineSpecified() ||
700 Diag(
New->getLocation(), diag::err_inline_decl_follows_def) <<
New;
710 !
New->isFunctionTemplateSpecialization() &&
isVisible(Old)) {
711 Diag(
New->getLocation(), diag::err_deduction_guide_redeclared);
721 Diag(
New->getLocation(), diag::err_friend_decl_with_def_arg_redeclared);
733 if (
New->isThisDeclarationInstantiatedFromAFriendDefinition() &&
742 ? diag::warn_cxx23_placeholder_var_definition
743 : diag::ext_placeholder_var_definition);
761 if (!TemplateParamLists.empty()) {
767 Diag(TemplateParamLists.front()->getTemplateLoc(),
768 diag::err_decomp_decl_template);
774 DiagID = diag::compat_pre_cxx17_decomp_decl;
777 ? diag::compat_cxx26_decomp_decl_cond
778 : diag::compat_pre_cxx26_decomp_decl_cond;
780 DiagID = diag::compat_cxx17_decomp_decl;
801 Diag(Loc, diag::err_decomp_decl_spec) << Name;
804 auto DiagCpp20Specifier = [&](StringRef Name,
SourceLocation Loc) {
805 DiagCompat(Loc, diag_compat::decomp_decl_spec) << Name;
808 if (
auto SCS = DS.getStorageClassSpec()) {
811 DS.getStorageClassSpecLoc());
814 DS.getStorageClassSpecLoc());
816 if (
auto TSCS = DS.getThreadStorageClassSpec())
818 DS.getThreadStorageClassSpecLoc());
820 if (DS.isInlineSpecified())
821 DiagBadSpecifier(
"inline", DS.getInlineSpecLoc());
828 DS.getConstexprSpecLoc());
839 Diag(DS.getVolatileSpecLoc(),
840 diag::warn_deprecated_volatile_structured_binding);
860 ? diag::err_decomp_decl_parens
861 : diag::err_decomp_decl_type)
867 if (R->isFunctionType())
872 if (DS.isConstrainedAuto()) {
875 "No other template kind should be possible for a constrained auto");
893 assert(VarName &&
"Cannot have an unnamed binding declaration");
902 Previous.getFoundDecl()->isTemplateParameter()) {
908 if (B.EllipsisLoc.isValid()) {
910 Diag(B.EllipsisLoc, diag::err_pack_outside_template);
911 QT =
Context.getPackExpansionType(
Context.DependentTy, std::nullopt,
943 auto *Old =
Previous.getRepresentativeDecl();
944 Diag(B.NameLoc, diag::err_redefinition) << B.Name;
945 Diag(Old->getLocation(), diag::note_previous_definition);
963 bool AddToScope =
true;
972 if (
OpenMP().isInOpenMPDeclareTargetContext())
973 OpenMP().checkDeclIsAllowedInOpenMPTarget(
nullptr,
New);
983 unsigned MemberCount) {
984 auto BindingWithPackItr = llvm::find_if(
986 bool HasPack = BindingWithPackItr !=
Bindings.end();
989 IsValid =
Bindings.size() == MemberCount;
992 IsValid = MemberCount >=
Bindings.size() - 1;
995 if (IsValid && HasPack) {
997 unsigned PackSize = MemberCount -
Bindings.size() + 1;
1003 for (
unsigned I = 0; I < PackSize; ++I) {
1008 NestedBDs[I] = NestedBD;
1021 S.
Diag(DD->
getLocation(), diag::err_decomp_decl_wrong_number_bindings)
1023 << (MemberCount <
Bindings.size());
1038 for (
auto *B : DD->flat_bindings()) {
1043 E = GetInit(Loc, E.
get(), I++);
1046 B->setBinding(ElemType, E.
get());
1055 const llvm::APSInt &NumElems,
1058 S,
Bindings, Src, DecompType, NumElems, ElemType,
1089 S,
Bindings, Src, DecompType, llvm::APSInt::get(2),
1093 return S.CreateBuiltinUnaryOp(Loc, I ? UO_Imag : UO_Real, Base);
1101 llvm::raw_svector_ostream OS(SS);
1113 return std::string(OS.str());
1118 auto DiagnoseMissing = [&] {
1128 return DiagnoseMissing();
1138 return DiagnoseMissing();
1139 if (
Result.isAmbiguous())
1144 Result.suppressDiagnostics();
1146 S.
Diag(Loc, diag::err_std_type_trait_not_class_template) << Trait;
1147 S.
Diag(
Found->getLocation(), diag::note_declared_at);
1161 Loc, TraitTy, DiagID,
1171 assert(RD &&
"specialization of class template is not a class?");
1176static TemplateArgumentLoc
1183static TemplateArgumentLoc
1188namespace {
enum class IsTupleLike { TupleLike, NotTupleLike, Error }; }
1191 unsigned &OutSize) {
1201 return IsTupleLike::NotTupleLike;
1209 return IsTupleLike::NotTupleLike;
1218 : R(R), Args(Args) {}
1221 return S.
Diag(Loc, diag::err_decomp_decl_std_tuple_size_not_constant)
1225 } Diagnoser(R, Args);
1230 return IsTupleLike::Error;
1235 return IsTupleLike::Error;
1239 if (Size < 0 || Size >=
UINT_MAX) {
1242 S.
Diag(Loc, diag::err_decomp_decl_std_tuple_size_invalid)
1245 << StringRef(Str.data(), Str.size());
1246 return IsTupleLike::Error;
1249 OutSize = Size.getExtValue();
1250 return IsTupleLike::TupleLike;
1264 diag::err_decomp_decl_std_tuple_element_not_specialized);
1273 auto *TD = R.getAsSingle<
TypeDecl>();
1275 R.suppressDiagnostics();
1276 S.
Diag(Loc, diag::err_decomp_decl_std_tuple_element_not_specialized)
1280 S.
Diag(R.getRepresentativeDecl()->getLocation(), diag::note_declared_at);
1289struct InitializingBinding {
1291 InitializingBinding(Sema &S, BindingDecl *BD) : S(S) {
1292 Sema::CodeSynthesisContext Ctx;
1298 ~InitializingBinding() {
1307 unsigned NumElems) {
1321 bool UseMemberGet =
false;
1331 dyn_cast<FunctionTemplateDecl>(D->getUnderlyingDecl())) {
1333 if (TPL->
size() != 0 &&
1336 UseMemberGet =
true;
1344 for (
auto *B : DD->flat_bindings()) {
1345 InitializingBinding InitContext(S, B);
1368 MemberGet, &Args,
nullptr);
1410 B->getDeclName().getAsIdentifierInfo(),
U,
1415 if (
const auto *CIAttr = Src->
getAttr<ConstInitAttr>())
1416 BindingVD->addAttr(CIAttr->clone(S.
Context));
1417 BindingVD->setImplicit();
1419 BindingVD->setInlineSpecified();
1420 BindingVD->getLexicalDeclContext()->addHiddenDecl(BindingVD);
1425 E =
Seq.Perform(S, Entity, Kind,
Init);
1431 BindingVD->setInit(E.
get());
1439 B->setBinding(
T, E.
get());
1454 return Specifier->getType()->getAsCXXRecordDecl()->hasDirectFields();
1463 ClassWithFields = RD;
1475 for (
auto &P : Paths) {
1479 BestPath->back().Base->getType())) {
1481 S.
Diag(Loc, diag::err_decomp_decl_multiple_bases_with_members)
1482 <<
false << RD << BestPath->back().Base->getType()
1483 << P.back().Base->getType();
1485 }
else if (P.Access < BestPath->
Access) {
1491 QualType BaseType = BestPath->back().Base->getType();
1493 S.
Diag(Loc, diag::err_decomp_decl_ambiguous_base)
1500 *BestPath, diag::err_decomp_decl_inaccessible_base);
1503 ClassWithFields = BaseType->getAsCXXRecordDecl();
1511 S.
Diag(Loc, diag::err_decomp_decl_multiple_bases_with_members)
1512 << (ClassWithFields == RD) << RD << ClassWithFields
1513 << Paths.
front().back().Base->getType();
1524 const auto *RD = cast_or_null<CXXRecordDecl>(BasePair.
getDecl());
1528 for (
auto *FD : RD->fields()) {
1529 if (FD->isUnnamedBitField())
1534 if (!FD->getDeclName()) {
1535 if (RD->isLambda()) {
1536 S.
Diag(Loc, diag::err_decomp_decl_lambda);
1537 S.
Diag(RD->getLocation(), diag::note_lambda_decl);
1541 if (FD->isAnonymousStructOrUnion()) {
1542 S.
Diag(Loc, diag::err_decomp_decl_anon_union_member)
1544 S.
Diag(FD->getLocation(), diag::note_declared_at);
1557 BasePair.
getAccess(), FD->getAccess())));
1566 diag::err_incomplete_type))
1572 const auto *RD = cast_or_null<CXXRecordDecl>(BasePair.
getDecl());
1579 unsigned NumFields = llvm::count_if(
1580 RD->fields(), [](
FieldDecl *FD) { return !FD->isUnnamedBitField(); });
1587 auto FlatBindings = DD->flat_bindings();
1588 assert(llvm::range_size(FlatBindings) == NumFields);
1589 auto FlatBindingsItr = FlatBindings.begin();
1595 for (
auto *FD : RD->fields()) {
1600 assert(FlatBindingsItr != FlatBindings.end());
1642 if (B->getType().isNull())
1643 B->setType(
Context.DependentTy);
1655 if (
auto *CAT =
Context.getAsConstantArrayType(DecompType)) {
1676 case IsTupleLike::Error:
1680 case IsTupleLike::TupleLike:
1685 case IsTupleLike::NotTupleLike:
1694 << DD << !RD << DecompType;
1709 assert(!
T->isDependentType());
1714 T =
Context.getQualifiedType(Unqual, Quals);
1717 return static_cast<unsigned>(CAT->getSize().getZExtValue());
1719 return VT->getNumElements();
1725 case IsTupleLike::Error:
1726 return std::nullopt;
1727 case IsTupleLike::TupleLike:
1729 case IsTupleLike::NotTupleLike:
1734 if (!OrigRD || OrigRD->
isUnion())
1735 return std::nullopt;
1738 return std::nullopt;
1743 const auto *RD = cast_or_null<CXXRecordDecl>(BasePair.
getDecl());
1745 return std::nullopt;
1747 unsigned NumFields = llvm::count_if(
1748 RD->fields(), [](
FieldDecl *FD) { return !FD->isUnnamedBitField(); });
1751 return std::nullopt;
1762 "Should only be called if types are otherwise the same.");
1770 NewType = R->getPointeeType();
1789 New->setInvalidDecl();
1803 if (FTD->isMemberSpecialization())
1812 if (Param->hasDefaultArg())
1823 if (Param->hasDefaultArg() || Param->isParameterPack() ||
1827 if (Param->isInvalidDecl())
1829 else if (Param->getIdentifier())
1830 Diag(Param->getLocation(), diag::err_param_default_argument_missing_name)
1831 << Param->getIdentifier();
1833 Diag(Param->getLocation(), diag::err_param_default_argument_missing);
1840template <
typename... Ts>
1844 if (
T->isDependentType())
1850 std::forward<Ts>(DiagArgs)...);
1853 return !
T->isLiteralType(SemaRef.
Context);
1856 llvm_unreachable(
"unknown CheckConstexprKind");
1864 "this check is obsolete for C++23");
1867 T->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
1875 SemaRef.
Diag(Loc, diag::note_constexpr_dtor_subobject)
1883 if (!Check(B.getBaseTypeLoc(), B.getType(),
nullptr))
1886 if (!Check(FD->getLocation(), FD->getType(), FD))
1897 "this check is obsolete for C++23");
1898 unsigned ArgIndex = 0;
1901 e = FT->param_type_end();
1902 i != e; ++i, ++ArgIndex) {
1904 assert(PD &&
"null in a parameter list");
1907 diag::err_constexpr_non_literal_param, ArgIndex + 1,
1920 "this check is obsolete for C++23");
1922 diag::err_constexpr_non_literal_return,
1941 default: llvm_unreachable(
"Invalid tag kind for record diagnostic!");
1969 for (
const auto &I : RD->
vbases())
1970 Diag(I.getBeginLoc(), diag::note_constexpr_virtual_base_here)
1971 << I.getSourceRange();
1985 Diag(
Method->getLocation(), diag::warn_cxx17_compat_constexpr_virtual);
1991 Diag(
Method->getLocation(), diag::err_constexpr_virtual);
1998 if (WrittenVirtual !=
Method)
2000 diag::note_overridden_virtual_function);
2011 if (
auto *Dtor = dyn_cast<CXXDestructorDecl>(NewFD)) {
2016 !Dtor->getParent()->defaultedDestructorIsConstexpr()) {
2031 "CheckConstexprFunctionDefinition called on function with no body");
2046 for (
const auto *DclIt : DS->
decls()) {
2047 switch (DclIt->getKind()) {
2048 case Decl::StaticAssert:
2050 case Decl::UsingShadow:
2051 case Decl::UsingDirective:
2052 case Decl::UnresolvedUsingTypename:
2053 case Decl::UnresolvedUsingValue:
2054 case Decl::UsingEnum:
2061 case Decl::CXXExpansionStmt:
2065 case Decl::TypeAlias: {
2069 if (TN->getUnderlyingType()->isVariablyModifiedType()) {
2072 TypeLoc TL = TN->getTypeSourceInfo()->getTypeLoc();
2083 case Decl::CXXRecord:
2088 diag_compat::constexpr_type_definition)
2096 case Decl::EnumConstant:
2097 case Decl::IndirectField:
2104 case Decl::Decomposition: {
2110 if (VD->isThisDeclarationADefinition()) {
2111 if (VD->isStaticLocal()) {
2114 diag_compat::constexpr_static_var)
2121 if (SemaRef.
LangOpts.CPlusPlus23) {
2123 diag::warn_cxx20_compat_constexpr_var,
2126 SemaRef, Kind, VD->getLocation(), VD->getType(),
2127 diag::err_constexpr_local_var_non_literal_type,
2131 if (!VD->getType()->isDependentType() &&
2132 !VD->hasInit() && !VD->isCXXForRangeDecl()) {
2135 diag_compat::constexpr_local_var_no_init)
2144 SemaRef.
DiagCompat(VD->getLocation(), diag_compat::constexpr_local_var)
2152 case Decl::NamespaceAlias:
2153 case Decl::Function:
2162 SemaRef.
Diag(DS->
getBeginLoc(), diag::err_constexpr_body_invalid_stmt)
2196 if (Field->isInvalidDecl())
2199 if (Field->isUnnamedBitField())
2205 if (Field->isAnonymousStructOrUnion() &&
2206 (Field->getType()->isUnionType()
2207 ? !Field->getType()->getAsCXXRecordDecl()->hasVariantMembers()
2208 : Field->getType()->getAsCXXRecordDecl()->isEmpty()))
2211 if (!
Inits.count(Field)) {
2215 diag_compat::constexpr_ctor_missing_init);
2218 SemaRef.
Diag(Field->getLocation(),
2219 diag::note_constexpr_ctor_missing_init);
2223 }
else if (Field->isAnonymousStructOrUnion()) {
2224 const auto *RD = Field->getType()->castAsRecordDecl();
2225 for (
auto *I : RD->fields())
2228 if (!RD->isUnion() ||
Inits.count(I))
2246 case Stmt::NullStmtClass:
2250 case Stmt::DeclStmtClass:
2260 case Stmt::ReturnStmtClass:
2272 case Stmt::AttributedStmtClass:
2277 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind);
2279 case Stmt::CompoundStmtClass: {
2285 for (
auto *BodyIt : CompStmt->
body()) {
2287 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2293 case Stmt::IfStmtClass: {
2300 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2302 if (
If->getElse() &&
2304 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2309 case Stmt::WhileStmtClass:
2310 case Stmt::DoStmtClass:
2311 case Stmt::ForStmtClass:
2312 case Stmt::CXXForRangeStmtClass:
2313 case Stmt::ContinueStmtClass:
2323 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2328 case Stmt::SwitchStmtClass:
2329 case Stmt::CaseStmtClass:
2330 case Stmt::DefaultStmtClass:
2331 case Stmt::BreakStmtClass:
2339 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2344 case Stmt::LabelStmtClass:
2345 case Stmt::GotoStmtClass:
2351 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2356 case Stmt::GCCAsmStmtClass:
2357 case Stmt::MSAsmStmtClass:
2359 case Stmt::CXXTryStmtClass:
2365 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2370 case Stmt::CXXCatchStmtClass:
2375 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2427 diag_compat::constexpr_function_try_block)
2442 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2453 }
else if (Cxx2bLoc.
isValid()) {
2454 SemaRef.
DiagCompat(Cxx2bLoc, diag_compat::cxx23_constexpr_body_invalid_stmt)
2456 }
else if (Cxx2aLoc.
isValid()) {
2457 SemaRef.
DiagCompat(Cxx2aLoc, diag_compat::cxx20_constexpr_body_invalid_stmt)
2459 }
else if (Cxx1yLoc.
isValid()) {
2460 SemaRef.
DiagCompat(Cxx1yLoc, diag_compat::cxx14_constexpr_body_invalid_stmt)
2465 = dyn_cast<CXXConstructorDecl>(Dcl)) {
2478 diag_compat::constexpr_union_ctor_no_init);
2487 bool AnyAnonStructUnionMembers =
false;
2488 unsigned Fields = 0;
2490 E = RD->
field_end(); I != E; ++I, ++Fields) {
2491 if (I->isAnonymousStructOrUnion()) {
2492 AnyAnonStructUnionMembers =
true;
2500 if (AnyAnonStructUnionMembers ||
2510 Inits.insert(ID->chain_begin(), ID->chain_end());
2513 bool Diagnosed =
false;
2514 for (
auto *I : RD->
fields())
2521 if (ReturnStmts.empty()) {
2536 }
else if (ReturnStmts.size() > 1) {
2540 diag_compat::constexpr_body_multiple_return);
2541 for (
unsigned I = 0; I < ReturnStmts.size() - 1; ++I)
2542 SemaRef.
Diag(ReturnStmts[I],
2543 diag::note_constexpr_body_previous_return);
2571 !SemaRef.
getLangOpts().CheckConstexprFunctionBodies ||
2574 diag::ext_constexpr_function_never_constant_expr, Dcl->
getLocation());
2579 diag::ext_constexpr_function_never_constant_expr)
2582 for (
const auto &
Diag : Diags)
2598 if (SemaRef.
getLangOpts().CPlusPlus23 && !IsVoidOrDependentType)
2605 bool OK = SemaRef.
getLangOpts().CPlusPlus14 && IsVoidOrDependentType;
2607 OK ? diag::warn_cxx11_compat_constexpr_body_no_return
2608 : diag::err_constexpr_body_no_return)
2622 Diag(it->second, diag::err_immediate_function_used_before_definition)
2635 "expected an immediate function");
2636 assert(FD->
hasBody() &&
"expected the function to have a body");
2641 bool ImmediateFnIsConstructor;
2648 ShouldVisitImplicitCode =
true;
2649 ShouldVisitLambdaBody =
false;
2655 if (CurrentConstructor && CurrentInit) {
2663 SemaRef.Diag(Loc, diag::note_immediate_function_reason)
2664 << ImmediateFn << Fn << Fn->isConsteval() << IsCall
2666 << (InitializedField !=
nullptr)
2667 << (CurrentInit && !CurrentInit->
isWritten())
2668 << InitializedField << Range;
2670 bool TraverseCallExpr(
CallExpr *E)
override {
2671 if (
const auto *DR =
2673 DR && DR->isImmediateEscalating()) {
2679 if (!TraverseStmt(A))
2686 if (
const auto *ReferencedFn = dyn_cast<FunctionDecl>(E->
getDecl());
2688 Diag(E, ReferencedFn,
false);
2711 return DynamicRecursiveASTVisitor::TraverseCXXConstructorDecl(Ctr);
2714 bool TraverseType(
QualType T,
bool TraverseQualifier)
override {
2717 bool VisitBlockExpr(
BlockExpr *
T)
override {
return true; }
2719 } Visitor(*
this, FD);
2720 Visitor.TraverseDecl(FD);
2731 return dyn_cast_or_null<CXXRecordDecl>(DC);
2734 return dyn_cast_or_null<CXXRecordDecl>(
CurContext);
2752 CurDecl = dyn_cast_or_null<CXXRecordDecl>(DC);
2754 CurDecl = dyn_cast_or_null<CXXRecordDecl>(
CurContext);
2773 if (BaseType->containsErrors()) {
2778 if (EllipsisLoc.
isValid() && !BaseType->containsUnexpandedParameterPack()) {
2779 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
2793 if (BaseDecl->isUnion()) {
2794 Diag(BaseLoc, diag::err_union_as_base_class) << SpecifierRange;
2798 if (BaseType.hasQualifiers()) {
2800 BaseType.getQualifiers().getAsString(
Context.getPrintingPolicy());
2801 Diag(BaseLoc, diag::warn_qual_base_type)
2802 << Quals << llvm::count(Quals,
' ') + 1 << BaseType;
2803 Diag(BaseLoc, diag::note_base_class_specified_here) << BaseType;
2807 if (
Context.getTargetInfo().getCXXABI().isMicrosoft() ||
2808 Context.getTargetInfo().getTriple().isPS()) {
2810 if (
auto *BaseSpec =
2811 dyn_cast<ClassTemplateSpecializationDecl>(BaseDecl)) {
2820 Class->setInvalidDecl();
2824 BaseDecl = BaseDecl->getDefinition();
2825 assert(BaseDecl &&
"Base type is not incomplete, but has no definition");
2830 const auto *BaseCSA = BaseDecl->getAttr<CodeSegAttr>();
2831 const auto *DerivedCSA =
Class->getAttr<CodeSegAttr>();
2832 if ((DerivedCSA || BaseCSA) &&
2833 (!BaseCSA || !DerivedCSA ||
2834 BaseCSA->getName() != DerivedCSA->getName())) {
2835 Diag(
Class->getLocation(), diag::err_mismatched_code_seg_base);
2836 Diag(BaseDecl->getLocation(), diag::note_base_class_specified_here)
2847 if (BaseDecl->hasFlexibleArrayMember()) {
2848 Diag(BaseLoc, diag::err_base_class_has_flexible_array_member)
2849 << BaseDecl->getDeclName();
2856 if (FinalAttr *FA = BaseDecl->getAttr<FinalAttr>()) {
2857 Diag(BaseLoc, diag::err_class_marked_final_used_as_base)
2858 << BaseDecl->getDeclName() << FA->isSpelledAsSealed();
2859 Diag(BaseDecl->getLocation(), diag::note_entity_declared_at)
2860 << BaseDecl->getDeclName() << FA->getRange();
2865 if (BaseDecl->isInvalidDecl())
2866 Class->setInvalidDecl();
2867 }
else if (BaseType->isDependentType()) {
2874 if (!
Class->isDependentContext())
2875 Class->setInvalidDecl();
2878 Diag(BaseLoc, diag::err_base_must_be_class) << SpecifierRange;
2890 Access, TInfo, EllipsisLoc);
2907 Class->setIsParsingBaseSpecifiers();
2917 Diag(AL.getLoc(), diag::err_base_specifier_attribute)
2918 << AL << AL.isRegularKeywordAttribute() << AL.getRange();
2931 if (
Class->isUnion()) {
2932 Diag(
Class->getLocation(), diag::err_base_clause_on_union)
2942 Class->setInvalidDecl();
2959 for (
const auto &BaseSpec :
Decl->bases()) {
2960 QualType Base = Context.getCanonicalType(BaseSpec.getType())
2961 .getUnqualifiedType();
2978 std::map<QualType, CXXBaseSpecifier*, QualTypeOrdering> KnownBaseTypes;
2985 unsigned NumGoodBases = 0;
2987 for (
unsigned idx = 0; idx < Bases.size(); ++idx) {
2997 Diag(Bases[idx]->getBeginLoc(), diag::err_duplicate_base_class)
2998 << KnownBase->
getType() << Bases[idx]->getSourceRange();
3002 Context.Deallocate(Bases[idx]);
3007 KnownBase = Bases[idx];
3008 Bases[NumGoodBases++] = Bases[idx];
3013 if (Bases.size() > 1)
3017 if (
Class->isInterface() &&
3018 (!RD->isInterfaceLike() ||
3024 << RD->getSourceRange();
3027 if (RD->hasAttr<WeakAttr>())
3034 Class->setBases(Bases.data(), NumGoodBases);
3037 for (
unsigned idx = 0; idx < NumGoodBases; ++idx) {
3039 QualType BaseType = Bases[idx]->getType();
3043 if (BaseType->isDependentType())
3047 .getUnqualifiedType();
3049 if (IndirectBaseTypes.count(CanonicalBase)) {
3053 =
Class->isDerivedFrom(CanonicalBase->getAsCXXRecordDecl(), Paths);
3058 Diag(Bases[idx]->getBeginLoc(), diag::warn_inaccessible_base_class)
3060 << Bases[idx]->getSourceRange();
3062 assert(Bases[idx]->isVirtual());
3067 Context.Deallocate(Bases[idx]);
3075 if (!ClassDecl || Bases.empty())
3087 if (!
Base || !Derived)
3115 Base->getAsCXXRecordDecl(), Paths);
3121 Base->getAsCXXRecordDecl(), Paths);
3130 for (
unsigned I = Path.size(); I != 0; --I) {
3131 if (Path[I - 1].
Base->isVirtual()) {
3138 for (
unsigned I = Start, E = Path.size(); I != E; ++I)
3145 assert(BasePathArray.empty() &&
"Base path array must be empty!");
3147 return ::BuildBasePathArray(Paths.
front(), BasePathArray);
3152 unsigned InaccessibleBaseID,
3153 unsigned AmbiguousBaseConvID,
3157 bool IgnoreAccess) {
3165 if (!DerivationOkay)
3170 Path = &Paths.
front();
3177 if (PossiblePath.size() == 1) {
3178 Path = &PossiblePath;
3179 if (AmbiguousBaseConvID)
3180 Diag(Loc, diag::ext_ms_ambiguous_direct_base)
3181 <<
Base << Derived << Range;
3188 if (!IgnoreAccess) {
3207 if (AmbiguousBaseConvID) {
3217 assert(StillOkay &&
"Can only be used with a derived-to-base conversion");
3226 Diag(Loc, AmbiguousBaseConvID)
3227 << Derived <<
Base << PathDisplayStr << Range << Name;
3236 bool IgnoreAccess) {
3238 Derived,
Base, diag::err_upcast_to_inaccessible_base,
3239 diag::err_ambiguous_derived_to_base_conv, Loc, Range,
DeclarationName(),
3240 BasePath, IgnoreAccess);
3244 std::string PathDisplayStr;
3245 std::set<unsigned> DisplayedPaths;
3247 if (DisplayedPaths.insert(Path.back().SubobjectNumber).second) {
3250 PathDisplayStr +=
"\n ";
3254 PathDisplayStr +=
" -> " + Element.Base->getType().getAsString();
3258 return PathDisplayStr;
3268 assert(Access !=
AS_none &&
"Invalid kind for syntactic access specifier!");
3297 if (!OverloadedMethods.empty()) {
3298 if (OverrideAttr *OA = D->
getAttr<OverrideAttr>()) {
3299 Diag(OA->getLocation(),
3300 diag::override_keyword_hides_virtual_member_function)
3301 <<
"override" << (OverloadedMethods.size() > 1);
3302 }
else if (FinalAttr *FA = D->
getAttr<FinalAttr>()) {
3303 Diag(FA->getLocation(),
3304 diag::override_keyword_hides_virtual_member_function)
3305 << (FA->isSpelledAsSealed() ?
"sealed" :
"final")
3306 << (OverloadedMethods.size() > 1);
3317 if (OverrideAttr *OA = D->
getAttr<OverrideAttr>()) {
3318 Diag(OA->getLocation(),
3319 diag::override_keyword_only_allowed_on_virtual_member_functions)
3323 if (FinalAttr *FA = D->
getAttr<FinalAttr>()) {
3324 Diag(FA->getLocation(),
3325 diag::override_keyword_only_allowed_on_virtual_member_functions)
3326 << (FA->isSpelledAsSealed() ?
"sealed" :
"final")
3338 if (MD->
hasAttr<OverrideAttr>() && !HasOverriddenMethods)
3339 Diag(MD->
getLocation(), diag::err_function_marked_override_not_overriding)
3353 SpellingLoc =
getSourceManager().getImmediateExpansionRange(Loc).getBegin();
3359 auto EmitDiag = [&](
unsigned DiagInconsistent,
unsigned DiagSuggest) {
3370 diag::warn_inconsistent_destructor_marked_not_override_overriding,
3371 diag::warn_suggest_destructor_marked_not_override_overriding);
3373 EmitDiag(diag::warn_inconsistent_function_marked_not_override_overriding,
3374 diag::warn_suggest_function_marked_not_override_overriding);
3380 FinalAttr *FA = Old->
getAttr<FinalAttr>();
3384 Diag(
New->getLocation(), diag::err_final_function_overridden)
3385 <<
New->getDeclName()
3386 << FA->isSpelledAsSealed();
3395 return !RD->isCompleteDefinition() ||
3396 !RD->hasTrivialDefaultConstructor() ||
3397 !RD->hasTrivialDestructor();
3401void Sema::CheckShadowInheritedFields(
const SourceLocation &Loc,
3402 DeclarationName FieldName,
3403 const CXXRecordDecl *RD,
3405 if (Diags.isIgnored(diag::warn_shadow_field, Loc))
3409 std::map<CXXRecordDecl*, NamedDecl*> Bases;
3410 auto FieldShadowed = [&](
const CXXBaseSpecifier *
Specifier,
3411 CXXBasePath &Path) {
3412 const auto Base =
Specifier->getType()->getAsCXXRecordDecl();
3414 if (Bases.find(Base) != Bases.end())
3416 for (
const auto Field :
Base->lookup(FieldName)) {
3420 assert(Bases.find(Base) == Bases.end());
3428 CXXBasePaths Paths(
true,
true,
3433 for (
const auto &P : Paths) {
3434 auto Base = P.back().Base->getType()->getAsCXXRecordDecl();
3435 auto It = Bases.find(Base);
3437 if (It == Bases.end())
3439 auto BaseField = It->second;
3440 assert(BaseField->getAccess() !=
AS_private);
3443 Diag(Loc, diag::warn_shadow_field)
3444 << FieldName << RD <<
Base << DeclIsField;
3445 Diag(BaseField->getLocation(), diag::note_shadow_field);
3451template <
typename AttrType>
3453 if (
const TagDecl *TD =
T->getAsTagDecl())
3454 return TD->hasAttr<AttrType>();
3456 return TDT->getDecl()->hasAttr<AttrType>();
3499 unsigned InvalidDecl;
3500 bool ShowDeclName =
true;
3513 ShowDeclName =
false;
3518 ShowDeclName =
false;
3533 Diag(Loc, diag::err_invalid_member_in_interface)
3534 << (InvalidDecl-1) << Name;
3536 Diag(Loc, diag::err_invalid_member_in_interface)
3537 << (InvalidDecl-1) <<
"";
3547 Diag(Loc, diag::err_hlsl_cstor_dstor);
3575 diag::err_storageclass_invalid_for_member);
3582 !isFunc && TemplateParameterLists.empty();
3595 const char *PrevSpec;
3600 assert(!Failed &&
"Making a constexpr member const shouldn't fail");
3604 const char *PrevSpec;
3608 Context.getPrintingPolicy())) {
3610 "This is the only DeclSpec that should fail to be applied");
3614 isInstField =
false;
3625 Diag(Loc, diag::err_bad_variable_name)
3662 if (MSPropertyAttr) {
3664 BitWidth, InitStyle, AS, *MSPropertyAttr);
3667 isInstField =
false;
3670 BitWidth, InitStyle, AS);
3683 if (
Member->isInvalidDecl()) {
3688 Diag(Loc, diag::err_static_not_bitfield)
3692 Diag(Loc, diag::err_typedef_not_bitfield)
3697 Diag(Loc, diag::err_not_integral_type_bitfield)
3698 << Name << cast<ValueDecl>(
Member)->getType()
3703 Member->setInvalidDecl();
3708 NonTemplateMember = FunTmpl->getTemplatedDecl();
3710 NonTemplateMember = VarTmpl->getTemplatedDecl();
3716 if (NonTemplateMember !=
Member)
3722 if (
auto *DG = dyn_cast<CXXDeductionGuideDecl>(NonTemplateMember)) {
3723 auto *TD = DG->getDeducedTemplate();
3726 if (AS != TD->getAccess() &&
3727 TD->getDeclContext()->getRedeclContext()->Equals(
3728 DG->getDeclContext()->getRedeclContext())) {
3729 Diag(DG->getBeginLoc(), diag::err_deduction_guide_wrong_access);
3730 Diag(TD->getBeginLoc(), diag::note_deduction_guide_template_access)
3734 if (
const auto *AccessSpec = dyn_cast<AccessSpecDecl>(D))
3735 LastAccessSpec = AccessSpec;
3737 assert(LastAccessSpec &&
"differing access with no access specifier");
3738 Diag(LastAccessSpec->
getBeginLoc(), diag::note_deduction_guide_access)
3749 ? FinalAttr::Keyword_sealed
3750 : FinalAttr::Keyword_final));
3760 assert((Name || isInstField) &&
"No identifier for non-field ?");
3766 if (!
Diags.isIgnored(diag::warn_unused_private_field, FD->
getLocation()) &&
3778 class UninitializedFieldVisitor
3783 llvm::SmallPtrSetImpl<ValueDecl*> &Decls;
3786 llvm::SmallPtrSetImpl<QualType> &BaseClasses;
3801 UninitializedFieldVisitor(
Sema &S,
3802 llvm::SmallPtrSetImpl<ValueDecl*> &Decls,
3803 llvm::SmallPtrSetImpl<QualType> &BaseClasses)
3804 : Inherited(S.Context), S(S), Decls(Decls), BaseClasses(BaseClasses),
3808 bool IsInitListMemberExprInitialized(
MemberExpr *ME,
3809 bool CheckReferenceOnly) {
3811 bool ReferenceField =
false;
3816 Fields.push_back(FD);
3818 ReferenceField =
true;
3824 if (CheckReferenceOnly && !ReferenceField)
3829 auto UsedFields = llvm::drop_begin(llvm::reverse(Fields));
3830 auto UsedIter = UsedFields.begin();
3831 const auto UsedEnd = UsedFields.end();
3833 for (
const unsigned Orig : InitFieldIndex) {
3834 if (UsedIter == UsedEnd)
3836 const unsigned UsedIndex = (*UsedIter)->getFieldIndex();
3837 if (UsedIndex < Orig)
3839 if (UsedIndex > Orig)
3847 void HandleMemberExpr(MemberExpr *ME,
bool CheckReferenceOnly,
3854 MemberExpr *FieldME = ME;
3859 while (MemberExpr *SubME =
3860 dyn_cast<MemberExpr>(
Base->IgnoreParenImpCasts())) {
3865 if (FieldDecl *FD = dyn_cast<FieldDecl>(SubME->getMemberDecl()))
3870 AllPODFields =
false;
3872 Base = SubME->getBase();
3880 if (AddressOf && AllPODFields)
3885 if (ImplicitCastExpr *BaseCast = dyn_cast<ImplicitCastExpr>(Base)) {
3890 if (BaseCast->getCastKind() == CK_UncheckedDerivedToBase) {
3891 QualType
T = BaseCast->getType();
3900 if (!Decls.count(FoundVD))
3905 if (InitList && !AddressOf && FoundVD == InitListFieldDecl) {
3907 if (IsInitListMemberExprInitialized(ME, CheckReferenceOnly)) {
3912 if (CheckReferenceOnly && !IsReference)
3916 unsigned diag = IsReference
3917 ? diag::warn_reference_field_is_uninit
3918 : diag::warn_field_is_uninit;
3922 diag::note_uninit_in_this_constructor)
3927 void HandleValue(Expr *E,
bool AddressOf) {
3930 if (MemberExpr *ME = dyn_cast<MemberExpr>(E)) {
3931 HandleMemberExpr(ME,
false ,
3936 if (ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E)) {
3937 Visit(CO->getCond());
3938 HandleValue(CO->getTrueExpr(), AddressOf);
3939 HandleValue(CO->getFalseExpr(), AddressOf);
3943 if (BinaryConditionalOperator *BCO =
3944 dyn_cast<BinaryConditionalOperator>(E)) {
3945 Visit(BCO->getCond());
3946 HandleValue(BCO->getFalseExpr(), AddressOf);
3950 if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E)) {
3951 HandleValue(OVE->getSourceExpr(), AddressOf);
3955 if (BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
3956 switch (BO->getOpcode()) {
3961 HandleValue(BO->getLHS(), AddressOf);
3962 Visit(BO->getRHS());
3965 Visit(BO->getLHS());
3966 HandleValue(BO->getRHS(), AddressOf);
3974 void CheckInitListExpr(InitListExpr *ILE) {
3975 InitFieldIndex.push_back(0);
3976 for (
auto *Child : ILE->
children()) {
3977 if (InitListExpr *SubList = dyn_cast<InitListExpr>(Child)) {
3978 CheckInitListExpr(SubList);
3982 ++InitFieldIndex.back();
3984 InitFieldIndex.pop_back();
3987 void CheckInitializer(Expr *E,
const CXXConstructorDecl *FieldConstructor,
3988 FieldDecl *Field,
const Type *BaseClass) {
3991 for (ValueDecl* VD : DeclsToRemove)
3993 DeclsToRemove.clear();
3996 InitListExpr *ILE = dyn_cast<InitListExpr>(E);
4000 InitListFieldDecl =
Field;
4001 InitFieldIndex.clear();
4002 CheckInitListExpr(ILE);
4014 void VisitMemberExpr(MemberExpr *ME) {
4016 HandleMemberExpr(ME,
true ,
false );
4019 void VisitImplicitCastExpr(ImplicitCastExpr *E) {
4025 Inherited::VisitImplicitCastExpr(E);
4028 void VisitCXXConstructExpr(CXXConstructExpr *E) {
4030 Expr *ArgExpr = E->
getArg(0);
4031 if (InitListExpr *ILE = dyn_cast<InitListExpr>(ArgExpr))
4034 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(ArgExpr))
4035 if (ICE->getCastKind() == CK_NoOp)
4036 ArgExpr = ICE->getSubExpr();
4037 HandleValue(ArgExpr,
false );
4040 Inherited::VisitCXXConstructExpr(E);
4043 void VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
4046 HandleValue(Callee,
false );
4052 Inherited::VisitCXXMemberCallExpr(E);
4055 void VisitCallExpr(CallExpr *E) {
4058 HandleValue(E->
getArg(0),
false);
4062 Inherited::VisitCallExpr(E);
4065 void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
4069 return Inherited::VisitCXXOperatorCallExpr(E);
4073 HandleValue(Arg->IgnoreParenImpCasts(),
false );
4076 void VisitBinaryOperator(BinaryOperator *E) {
4080 if (MemberExpr *ME = dyn_cast<MemberExpr>(E->
getLHS()))
4081 if (FieldDecl *FD = dyn_cast<FieldDecl>(ME->
getMemberDecl()))
4083 DeclsToRemove.push_back(FD);
4086 HandleValue(E->
getLHS(),
false );
4091 Inherited::VisitBinaryOperator(E);
4094 void VisitUnaryOperator(UnaryOperator *E) {
4100 if (MemberExpr *ME = dyn_cast<MemberExpr>(E->
getSubExpr())) {
4101 HandleValue(ME->
getBase(),
true );
4106 Inherited::VisitUnaryOperator(E);
4116 static void DiagnoseUninitializedFields(
4117 Sema &SemaRef,
const CXXConstructorDecl *
Constructor) {
4133 llvm::SmallPtrSet<ValueDecl*, 4> UninitializedFields;
4136 for (
auto *I : RD->
decls()) {
4137 if (
auto *FD = dyn_cast<FieldDecl>(I)) {
4138 UninitializedFields.insert(FD);
4139 }
else if (
auto *IFD = dyn_cast<IndirectFieldDecl>(I)) {
4140 UninitializedFields.insert(IFD->getAnonField());
4144 llvm::SmallPtrSet<QualType, 4> UninitializedBaseClasses;
4145 for (
const auto &I : RD->
bases())
4146 UninitializedBaseClasses.insert(I.getType().getCanonicalType());
4148 if (UninitializedFields.empty() && UninitializedBaseClasses.empty())
4151 UninitializedFieldVisitor UninitializedChecker(SemaRef,
4152 UninitializedFields,
4153 UninitializedBaseClasses);
4155 for (
const auto *FieldInit :
Constructor->inits()) {
4156 if (UninitializedFields.empty() && UninitializedBaseClasses.empty())
4159 Expr *InitExpr = FieldInit->getInit();
4163 if (CXXDefaultInitExpr *
Default =
4164 dyn_cast<CXXDefaultInitExpr>(InitExpr)) {
4165 InitExpr =
Default->getExpr();
4169 UninitializedChecker.CheckInitializer(InitExpr,
Constructor,
4170 FieldInit->getAnyMember(),
4171 FieldInit->getBaseClass());
4173 UninitializedChecker.CheckInitializer(InitExpr,
nullptr,
4174 FieldInit->getAnyMember(),
4175 FieldInit->getBaseClass());
4196 if (ParamDecl->getDeclName())
4213 return ConstraintExpr;
4228 return Seq.Perform(*
this, Entity, Kind, InitExpr);
4246 "must set init style when field is created");
4283 DirectBaseSpec =
nullptr;
4284 for (
const auto &
Base : ClassDecl->
bases()) {
4288 DirectBaseSpec = &
Base;
4296 VirtualBaseSpec =
nullptr;
4297 if (!DirectBaseSpec || !DirectBaseSpec->
isVirtual()) {
4306 if (Path.back().Base->isVirtual()) {
4307 VirtualBaseSpec = Path.back().Base;
4314 return DirectBaseSpec || VirtualBaseSpec;
4328 DS, IdLoc, InitList,
4346 DS, IdLoc, List, EllipsisLoc);
4355 explicit MemInitializerValidatorCCC(
CXXRecordDecl *ClassDecl)
4356 : ClassDecl(ClassDecl) {}
4358 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
4361 return Member->getDeclContext()->getRedeclContext()->Equals(ClassDecl);
4367 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
4368 return std::make_unique<MemInitializerValidatorCCC>(*
this);
4372 CXXRecordDecl *ClassDecl;
4389 Diag(Loc, diag::err_using_placeholder_variable) << Name;
4405 for (
auto *D : ClassDecl->
lookup(MemberOrBase)) {
4407 bool IsPlaceholder = D->isPlaceholderVar(
getLangOpts());
4409 if (IsPlaceholder && D->getDeclContext() == ND->
getDeclContext())
4440 if (!ConstructorD || !
Init)
4446 = dyn_cast<CXXConstructorDecl>(ConstructorD);
4470 ClassDecl, SS, TemplateTypeTy, MemberOrBase)) {
4472 Diag(EllipsisLoc, diag::err_pack_expansion_member_init)
4482 if (TemplateTypeTy) {
4484 if (BaseType.isNull())
4501 if (R.isAmbiguous())
return true;
4504 R.suppressDiagnostics();
4507 bool NotUnknownSpecialization =
false;
4510 NotUnknownSpecialization = !
Record->hasAnyDependentBases();
4512 if (!NotUnknownSpecialization) {
4518 if (BaseType.isNull())
4521 TInfo =
Context.CreateTypeSourceInfo(BaseType);
4531 R.setLookupName(MemberOrBase);
4538 UnqualifiedBase->getCanonicalInjectedSpecializationType(
Context));
4540 for (
auto const &
Base : ClassDecl->
bases()) {
4542 Base.getType()->getAs<TemplateSpecializationType>();
4544 Context.hasSameTemplateName(BaseTemplate->getTemplateName(), TN,
4546 Diag(IdLoc, diag::ext_unqualified_base_class)
4548 BaseType =
Base.getType();
4557 MemInitializerValidatorCCC CCC(ClassDecl);
4558 if (R.empty() && BaseType.isNull() &&
4560 CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), S, &SS,
4567 PDiag(diag::err_mem_init_not_member_or_class_suggest)
4568 << MemberOrBase <<
true);
4575 DirectBaseSpec, VirtualBaseSpec)) {
4580 PDiag(diag::err_mem_init_not_member_or_class_suggest)
4581 << MemberOrBase <<
false,
4594 if (!TyD && BaseType.isNull()) {
4595 Diag(IdLoc, diag::err_mem_init_not_member_or_class)
4596 << MemberOrBase <<
SourceRange(IdLoc,
Init->getSourceRange().getEnd());
4601 if (BaseType.isNull()) {
4606 if (
const auto *TD = dyn_cast<TagDecl>(TyD)) {
4612 TL.setNameLoc(IdLoc);
4613 }
else if (
auto *TN = dyn_cast<TypedefNameDecl>(TyD)) {
4619 }
else if (
auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(TyD)) {
4628 BaseType =
Context.getTypeDeclType(TyD);
4636 TInfo =
Context.getTrivialTypeSourceInfo(BaseType, IdLoc);
4646 assert((DirectMember || IndirectMember) &&
4647 "Member must be a FieldDecl or IndirectFieldDecl");
4652 if (
Member->isInvalidDecl())
4657 Args =
MultiExprArg(ParenList->getExprs(), ParenList->getNumExprs());
4659 Args =
MultiExprArg(InitList->getInits(), InitList->getNumInits());
4667 if (
Member->getType()->isDependentType() ||
Init->isTypeDependent()) {
4672 bool InitList =
false;
4685 IdLoc,
Init->getBeginLoc(),
Init->getEndLoc())
4729 return Diag(NameLoc, diag::err_delegating_ctor)
4731 Diag(NameLoc, diag::warn_cxx98_compat_delegating_ctor);
4733 bool InitList =
true;
4737 Args =
MultiExprArg(ParenList->getExprs(), ParenList->getNumExprs());
4748 NameLoc,
Init->getBeginLoc(),
Init->getEndLoc())
4757 "Delegating constructor with no target?");
4763 DelegationInit.
get(), InitRange.
getBegin(),
false);
4768 InitRange.
getEnd(), Args, ClassType);
4780 DelegationInit =
Init;
4794 if (!BaseType->isDependentType() && !BaseType->isRecordType())
4795 return Diag(BaseLoc, diag::err_base_init_does_not_name_class)
4809 (BaseType->isDependentType() ||
Init->isTypeDependent());
4814 if (!BaseType->containsUnexpandedParameterPack()) {
4815 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
4843 if (!DirectBaseSpec && !VirtualBaseSpec) {
4852 return Diag(BaseLoc, diag::err_not_direct_base_or_virtual)
4853 << BaseType <<
Context.getCanonicalTagType(ClassDecl)
4864 InitRange.
getEnd(), EllipsisLoc);
4871 if (DirectBaseSpec && VirtualBaseSpec)
4872 return Diag(BaseLoc, diag::err_base_init_direct_and_virtual)
4877 BaseSpec = VirtualBaseSpec;
4880 bool InitList =
true;
4884 Args =
MultiExprArg(ParenList->getExprs(), ParenList->getNumExprs());
4924 InitRange.
getEnd(), EllipsisLoc);
4934 TargetType, ExprLoc);
4954 bool IsInheritedVirtualBase,
4958 IsInheritedVirtualBase);
4962 switch (ImplicitInitKind) {
4968 BaseInit = InitSeq.Perform(SemaRef, InitEntity, InitKind, {});
4974 bool Moving = ImplicitInitKind ==
IIK_Move;
4976 QualType ParamType = Param->getType().getNonReferenceType();
4996 BasePath.push_back(BaseSpec);
4998 CK_UncheckedDerivedToBase,
5006 BaseInit = InitSeq.
Perform(SemaRef, InitEntity, InitKind, CopyCtorArg);
5038 if (Field->isInvalidDecl())
5044 bool Moving = ImplicitInitKind ==
IIK_Move;
5046 QualType ParamType = Param->getType().getNonReferenceType();
5049 if (Field->isZeroLengthBitField())
5052 Expr *MemberExprBase =
5065 LookupResult MemberLookup(SemaRef, Field->getDeclName(), Loc,
5101 InitSeq.Perform(SemaRef, Entity, InitKind,
MultiExprArg(&CtorArgE, 1));
5116 "Unhandled implicit init kind!");
5129 ExprResult MemberInit = InitSeq.Perform(SemaRef, InitEntity, InitKind, {});
5132 if (MemberInit.isInvalid())
5149 if (!Field->getParent()->isUnion()) {
5152 diag::err_uninitialized_member_in_ctor)
5155 << Field->getDeclName();
5156 SemaRef.
Diag(Field->getLocation(), diag::note_declared_at);
5162 diag::err_uninitialized_member_in_ctor)
5165 << Field->getDeclName();
5166 SemaRef.
Diag(Field->getLocation(), diag::note_declared_at);
5183 CXXMemberInit =
nullptr;
5188struct BaseAndFieldInfo {
5190 CXXConstructorDecl *Ctor;
5191 bool AnyErrorsInInits;
5193 llvm::DenseMap<const void *, CXXCtorInitializer*> AllBaseFields;
5194 SmallVector<CXXCtorInitializer*, 8> AllToInit;
5195 llvm::DenseMap<TagDecl*, FieldDecl*> ActiveUnionMember;
5197 BaseAndFieldInfo(Sema &S, CXXConstructorDecl *Ctor,
bool ErrorsInInits)
5198 : S(S), Ctor(Ctor), AnyErrorsInInits(ErrorsInInits) {
5210 bool isImplicitCopyOrMove()
const {
5221 llvm_unreachable(
"Invalid ImplicitInitializerKind!");
5224 bool addFieldInitializer(CXXCtorInitializer *
Init) {
5225 AllToInit.push_back(
Init);
5234 bool isInactiveUnionMember(FieldDecl *Field) {
5239 if (FieldDecl *Active =
5240 ActiveUnionMember.lookup(
Record->getCanonicalDecl()))
5241 return Active !=
Field->getCanonicalDecl();
5244 if (isImplicitCopyOrMove())
5249 if (
Field->hasInClassInitializer())
5253 if (!
Field->isAnonymousStructOrUnion())
5255 CXXRecordDecl *FieldRD =
Field->getType()->getAsCXXRecordDecl();
5262 bool isWithinInactiveUnionMember(FieldDecl *Field,
5263 IndirectFieldDecl *Indirect) {
5265 return isInactiveUnionMember(Field);
5267 for (
auto *
C : Indirect->
chain()) {
5268 FieldDecl *
Field = dyn_cast<FieldDecl>(
C);
5269 if (Field && isInactiveUnionMember(Field))
5280 if (
T->isIncompleteArrayType())
5284 if (ArrayT->isZeroSize())
5287 T = ArrayT->getElementType();
5296 if (Field->isInvalidDecl())
5301 Info.AllBaseFields.lookup(Field->getCanonicalDecl()))
5302 return Info.addFieldInitializer(
Init);
5316 if (Info.isWithinInactiveUnionMember(Field, Indirect))
5319 if (Field->hasInClassInitializer() && !Info.isImplicitCopyOrMove()) {
5337 return Info.addFieldInitializer(
Init);
5347 if (Info.AnyErrorsInInits)
5358 return Info.addFieldInitializer(
Init);
5385 if (Class->isInvalidDecl())
5387 if (Class->hasIrrelevantDestructor())
5396 if (Field->isInvalidDecl())
5406 if (!FieldClassDecl)
5410 if (FieldClassDecl->isUnion() && FieldClassDecl->isAnonymousStructOrUnion())
5418 S.
PDiag(diag::err_access_dtor_field)
5419 << Field->getDeclName() << FieldType);
5432 bool VisitVirtualBases = !ClassDecl->
isAbstract();
5439 if (Dtor && Dtor->isUsed())
5440 VisitVirtualBases =
false;
5446 for (
const auto &
Base : ClassDecl->
bases()) {
5447 auto *BaseClassDecl =
Base.getType()->getAsCXXRecordDecl();
5452 if (
Base.isVirtual()) {
5453 if (!VisitVirtualBases)
5455 DirectVirtualBases.insert(BaseClassDecl);
5464 S.
PDiag(diag::err_access_dtor_base)
5465 <<
Base.getType() <<
Base.getSourceRange(),
5472 if (VisitVirtualBases)
5474 &DirectVirtualBases);
5482 if (!Initializers.empty()) {
5483 Constructor->setNumCtorInitializers(Initializers.size());
5486 memcpy(baseOrMemberInitializers, Initializers.data(),
5488 Constructor->setCtorInitializers(baseOrMemberInitializers);
5498 BaseAndFieldInfo Info(*
this,
Constructor, AnyErrors);
5506 bool HadError =
false;
5509 if (
Member->isBaseInitializer())
5510 Info.AllBaseFields[
Member->getBaseClass()->getAsCanonical<RecordType>()] =
5513 Info.AllBaseFields[
Member->getAnyMember()->getCanonicalDecl()] =
Member;
5516 for (
auto *
C : F->chain()) {
5519 Info.ActiveUnionMember.insert(std::make_pair(
5524 Info.ActiveUnionMember.insert(std::make_pair(
5532 for (
auto &I : ClassDecl->
bases()) {
5534 DirectVBases.insert(&I);
5538 for (
auto &VBase : ClassDecl->
vbases()) {
5540 VBase.getType()->getAsCanonical<RecordType>())) {
5548 Diag(
Value->getSourceLocation(), diag::warn_abstract_vbase_init_ignored)
5549 << VBase.getType() << ClassDecl;
5553 Info.AllToInit.push_back(
Value);
5554 }
else if (!AnyErrors && !ClassDecl->
isAbstract()) {
5559 bool IsInheritedVirtualBase = !DirectVBases.count(&VBase);
5562 &VBase, IsInheritedVirtualBase,
5568 Info.AllToInit.push_back(CXXBaseInit);
5575 if (
Base.isVirtual())
5579 Base.getType()->getAsCanonical<RecordType>())) {
5580 Info.AllToInit.push_back(
Value);
5581 }
else if (!AnyErrors) {
5590 Info.AllToInit.push_back(CXXBaseInit);
5595 for (
auto *Mem : ClassDecl->
decls()) {
5596 if (
auto *F = dyn_cast<FieldDecl>(Mem)) {
5601 if (F->isUnnamedBitField())
5607 if (F->isAnonymousStructOrUnion() && !Info.isImplicitCopyOrMove())
5616 if (Info.isImplicitCopyOrMove())
5619 if (
auto *F = dyn_cast<IndirectFieldDecl>(Mem)) {
5620 if (F->getType()->isIncompleteArrayType()) {
5622 "Incomplete array type is not valid");
5634 unsigned NumInitializers = Info.AllToInit.size();
5635 if (NumInitializers > 0) {
5636 Constructor->setNumCtorInitializers(NumInitializers);
5639 memcpy(baseOrMemberInitializers, Info.AllToInit.data(),
5641 Constructor->setCtorInitializers(baseOrMemberInitializers);
5667 if (
const RecordType *RT = Field->getType()->getAsCanonical<RecordType>()) {
5675 IdealInits.push_back(Field->getCanonicalDecl());
5679 return Context.getCanonicalType(BaseType).getTypePtr();
5684 if (!
Member->isAnyMemberInitializer())
5687 return Member->getAnyMember()->getCanonicalDecl();
5693 if (
Previous->isAnyMemberInitializer())
5707 if (
Constructor->getDeclContext()->isDependentContext())
5712 bool ShouldCheckOrder =
false;
5714 if (!SemaRef.
Diags.
isIgnored(diag::warn_initializer_out_of_order,
5715 Init->getSourceLocation())) {
5716 ShouldCheckOrder =
true;
5720 if (!ShouldCheckOrder)
5731 for (
const auto &VBase : ClassDecl->
vbases())
5735 for (
const auto &
Base : ClassDecl->
bases()) {
5736 if (
Base.isVirtual())
5742 for (
auto *Field : ClassDecl->
fields()) {
5743 if (Field->isUnnamedBitField())
5749 unsigned NumIdealInits = IdealInitKeys.size();
5750 unsigned IdealIndex = 0;
5759 for (
unsigned InitIndex = 0; InitIndex !=
Inits.size(); ++InitIndex) {
5764 for (; IdealIndex != NumIdealInits; ++IdealIndex)
5765 if (InitKey == IdealInitKeys[IdealIndex])
5771 if (IdealIndex == NumIdealInits && InitIndex) {
5772 WarnIndexes.push_back(InitIndex);
5775 for (IdealIndex = 0; IdealIndex != NumIdealInits; ++IdealIndex)
5776 if (InitKey == IdealInitKeys[IdealIndex])
5779 assert(IdealIndex < NumIdealInits &&
5780 "initializer not found in initializer list");
5782 CorrelatedInitOrder.emplace_back(IdealIndex, InitIndex);
5785 if (WarnIndexes.empty())
5789 llvm::sort(CorrelatedInitOrder, llvm::less_first());
5795 Inits[WarnIndexes.front() - 1]->getSourceLocation(),
5796 WarnIndexes.size() == 1 ? diag::warn_initializer_out_of_order
5797 : diag::warn_some_initializers_out_of_order);
5799 for (
unsigned I = 0; I < CorrelatedInitOrder.size(); ++I) {
5800 if (CorrelatedInitOrder[I].second == I)
5806 Inits[I]->getSourceRange(),
5809 Inits[CorrelatedInitOrder[I].second]->getSourceRange()),
5815 if (WarnIndexes.size() == 1) {
5817 Inits[WarnIndexes.front()]);
5823 for (
unsigned WarnIndex : WarnIndexes) {
5826 diag::note_initializer_out_of_order);
5833bool CheckRedundantInit(Sema &S,
5834 CXXCtorInitializer *
Init,
5835 CXXCtorInitializer *&PrevInit) {
5841 if (FieldDecl *Field =
Init->getAnyMember())
5843 diag::err_multiple_mem_initialization)
5844 <<
Field->getDeclName()
5845 <<
Init->getSourceRange();
5847 const Type *BaseClass =
Init->getBaseClass();
5848 assert(BaseClass &&
"neither field nor base");
5850 diag::err_multiple_base_initialization)
5851 << QualType(BaseClass, 0)
5852 <<
Init->getSourceRange();
5860typedef std::pair<NamedDecl *, CXXCtorInitializer *> UnionEntry;
5861typedef llvm::DenseMap<RecordDecl*, UnionEntry> RedundantUnionMap;
5863bool CheckRedundantUnionInit(Sema &S,
5864 CXXCtorInitializer *
Init,
5865 RedundantUnionMap &Unions) {
5866 FieldDecl *
Field =
Init->getAnyMember();
5867 RecordDecl *Parent =
Field->getParent();
5868 NamedDecl *Child =
Field;
5872 UnionEntry &En = Unions[Parent];
5873 if (En.first && En.first != Child) {
5875 diag::err_multiple_mem_union_initialization)
5876 <<
Field->getDeclName()
5877 <<
Init->getSourceRange();
5878 S.
Diag(En.second->getSourceLocation(), diag::note_previous_initializer)
5879 << 0 << En.second->getSourceRange();
5902 if (!ConstructorDecl)
5908 = dyn_cast<CXXConstructorDecl>(ConstructorDecl);
5911 Diag(ColonLoc, diag::err_only_constructors_take_base_inits);
5918 llvm::DenseMap<const void *, CXXCtorInitializer *> Members;
5921 RedundantUnionMap MemberUnions;
5923 bool HadError =
false;
5924 for (
unsigned i = 0; i < MemInits.size(); i++) {
5928 Init->setSourceOrder(i);
5930 if (
Init->isAnyMemberInitializer()) {
5932 if (CheckRedundantInit(*
this,
Init, Members[Key]) ||
5933 CheckRedundantUnionInit(*
this,
Init, MemberUnions))
5935 }
else if (
Init->isBaseInitializer()) {
5937 if (CheckRedundantInit(*
this,
Init, Members[Key]))
5940 assert(
Init->isDelegatingInitializer());
5942 if (MemInits.size() != 1) {
5944 diag::err_delegating_initializer_alone)
5945 <<
Init->getSourceRange() << MemInits[i ? 0 : 1]->getSourceRange();
5977 for (
auto *Field : ClassDecl->
fields()) {
5986 llvm::SmallPtrSetImpl<const CXXRecordDecl *> *DirectVirtualBases) {
5988 for (
const auto &VBase : ClassDecl->
vbases()) {
5989 auto *BaseClassDecl = VBase.getType()->getAsCXXRecordDecl();
5994 if (DirectVirtualBases && DirectVirtualBases->count(BaseClassDecl))
6003 PDiag(diag::err_access_dtor_vbase)
6004 << CT << VBase.getType(),
6007 CT, VBase.getType(), diag::err_access_dtor_vbase, 0,
6021 = dyn_cast<CXXConstructorDecl>(CDtorDecl)) {
6023 !ClassDecl || ClassDecl->isInvalidDecl()) {
6035 const auto *RD =
Context.getBaseElementType(
T)->getAsCXXRecordDecl();
6072 if (
Diags.isLastDiagnosticIgnored())
6082 for (
const auto &M : FinalOverriders) {
6083 for (
const auto &SO : M.second) {
6089 if (SO.second.size() != 1)
6093 if (!
Method->isPureVirtual())
6096 if (!SeenPureMethods.insert(
Method).second)
6099 Diag(
Method->getLocation(), diag::note_pure_virtual_function)
6110struct AbstractUsageInfo {
6120 void DiagnoseAbstractType() {
6129struct CheckAbstractUsage {
6130 AbstractUsageInfo &Info;
6131 const NamedDecl *Ctx;
6133 CheckAbstractUsage(AbstractUsageInfo &Info,
const NamedDecl *Ctx)
6134 : Info(Info), Ctx(Ctx) {}
6138#define ABSTRACT_TYPELOC(CLASS, PARENT)
6139#define TYPELOC(CLASS, PARENT) \
6140 case TypeLoc::CLASS: Check(TL.castAs<CLASS##TypeLoc>(), Sel); break;
6141#include "clang/AST/TypeLocNodes.def"
6147 for (
unsigned I = 0, E = TL.
getNumParams(); I != E; ++I) {
6162 for (
unsigned I = 0, E = TL.
getNumArgs(); I != E; ++I) {
6163 TemplateArgumentLoc TAL = TL.
getArgLoc(I);
6172#define CheckPolymorphic(Type) \
6173 void Check(Type TL, Sema::AbstractDiagSelID Sel) { \
6174 Visit(TL.getNextTypeLoc(), Sema::AbstractNone); \
6189 return Visit(
Next, Sel);
6197 if (
T->isArrayType()) {
6202 if (CT != Info.AbstractType)
return;
6213 Info.DiagnoseAbstractType();
6217void AbstractUsageInfo::CheckType(
const NamedDecl *D, TypeLoc TL,
6219 CheckAbstractUsage(*
this, D).Visit(TL, Sel);
6254 for (
auto *D : RD->
decls()) {
6255 if (D->isImplicit())
continue;
6258 if (
auto *FD = dyn_cast<FriendDecl>(D)) {
6259 D = FD->getFriendDecl();
6264 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
6266 }
else if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(D)) {
6270 }
else if (
auto *FD = dyn_cast<FieldDecl>(D)) {
6273 }
else if (
auto *VD = dyn_cast<VarDecl>(D)) {
6275 }
else if (
auto *VTD = dyn_cast<VarTemplateDecl>(D)) {
6279 }
else if (
auto *RD = dyn_cast<CXXRecordDecl>(D)) {
6281 }
else if (
auto *CTD = dyn_cast<ClassTemplateDecl>(D)) {
6292 assert(ClassAttr->
getKind() == attr::DLLExport);
6302 struct MarkingClassDllexported {
6313 ~MarkingClassDllexported() {
6316 } MarkingDllexportedContext(S, Class, ClassAttr->
getLocation());
6323 if (!
Member->hasAttr<DLLExportAttr>())
6328 auto *VD = dyn_cast<VarDecl>(
Member);
6329 if (VD && VD->getStorageClass() ==
SC_Static &&
6333 auto *MD = dyn_cast<CXXMethodDecl>(
Member);
6337 if (MD->isUserProvided()) {
6347 auto *CD = dyn_cast<CXXConstructorDecl>(MD);
6350 CD->getAttr<DLLExportAttr>()->getLocation(), CD);
6358 }
else if (MD->isExplicitlyDefaulted()) {
6367 }
else if (!MD->isTrivial() ||
6368 MD->isCopyAssignmentOperator() ||
6369 MD->isMoveAssignmentOperator()) {
6393 auto *CD = dyn_cast<CXXConstructorDecl>(
Member);
6394 if (!CD || !CD->isDefaultConstructor())
6396 auto *
Attr = CD->getAttr<DLLExportAttr>();
6402 if (!Class->isDependentContext()) {
6407 if (LastExportedDefaultCtor) {
6409 diag::err_attribute_dll_ambiguous_default_ctor)
6411 S.
Diag(CD->getLocation(), diag::note_entity_declared_at)
6412 << CD->getDeclName();
6415 LastExportedDefaultCtor = CD;
6421 bool ErrorReported =
false;
6422 auto reportIllegalClassTemplate = [&ErrorReported](
Sema &S,
6426 S.
Diag(TD->getLocation(),
6427 diag::err_cuda_device_builtin_surftex_cls_template)
6429 ErrorReported =
true;
6434 auto *SD = dyn_cast<ClassTemplateSpecializationDecl>(Class);
6436 S.
Diag(Class->getLocation(),
6437 diag::err_cuda_device_builtin_surftex_ref_decl)
6439 S.
Diag(Class->getLocation(),
6440 diag::note_cuda_device_builtin_surftex_should_be_template_class)
6444 TD = SD->getSpecializedTemplate();
6448 unsigned N = Params->
size();
6451 reportIllegalClassTemplate(S, TD);
6453 diag::note_cuda_device_builtin_surftex_cls_should_have_n_args)
6457 reportIllegalClassTemplate(S, TD);
6459 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6463 auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Params->
getParam(1));
6464 if (!NTTP || !NTTP->getType()->isIntegralOrEnumerationType()) {
6465 reportIllegalClassTemplate(S, TD);
6467 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6475 bool ErrorReported =
false;
6476 auto reportIllegalClassTemplate = [&ErrorReported](
Sema &S,
6480 S.
Diag(TD->getLocation(),
6481 diag::err_cuda_device_builtin_surftex_cls_template)
6483 ErrorReported =
true;
6488 auto *SD = dyn_cast<ClassTemplateSpecializationDecl>(Class);
6490 S.
Diag(Class->getLocation(),
6491 diag::err_cuda_device_builtin_surftex_ref_decl)
6493 S.
Diag(Class->getLocation(),
6494 diag::note_cuda_device_builtin_surftex_should_be_template_class)
6498 TD = SD->getSpecializedTemplate();
6502 unsigned N = Params->
size();
6505 reportIllegalClassTemplate(S, TD);
6507 diag::note_cuda_device_builtin_surftex_cls_should_have_n_args)
6511 reportIllegalClassTemplate(S, TD);
6513 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6517 auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Params->
getParam(1));
6518 if (!NTTP || !NTTP->getType()->isIntegralOrEnumerationType()) {
6519 reportIllegalClassTemplate(S, TD);
6521 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6526 auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Params->
getParam(2));
6527 if (!NTTP || !NTTP->getType()->isIntegralOrEnumerationType()) {
6528 reportIllegalClassTemplate(S, TD);
6530 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6539 if (
Method->isUserProvided())
6550 if (
Context.getTargetInfo().shouldDLLImportComdatSymbols() && !ClassAttr) {
6551 if (
auto *Spec = dyn_cast<ClassTemplatePartialSpecializationDecl>(
Class)) {
6552 if (
Attr *TemplateAttr =
6553 getDLLAttr(Spec->getSpecializedTemplate()->getTemplatedDecl())) {
6555 A->setInherited(
true);
6568 if ((
Context.getTargetInfo().getCXXABI().isMicrosoft() ||
6569 Context.getTargetInfo().getTriple().isPS()) &&
6570 (!
Class->isExternallyVisible() &&
Class->hasExternalFormalLinkage())) {
6571 Class->dropAttrs<DLLExportAttr, DLLImportAttr>();
6575 if (!
Class->isExternallyVisible()) {
6576 Diag(
Class->getLocation(), diag::err_attribute_dll_not_extern)
6577 <<
Class << ClassAttr;
6581 if (
Context.getTargetInfo().shouldDLLImportComdatSymbols() &&
6592 diag::err_attribute_dll_member_of_dll_class)
6593 << MemberAttr << ClassAttr;
6594 Diag(ClassAttr->getLocation(), diag::note_previous_attribute);
6595 Member->setInvalidDecl();
6599 if (
Class->getDescribedClassTemplate())
6604 const bool ClassExported = ClassAttr->
getKind() == attr::DLLExport;
6609 const bool PropagatedImport =
6619 !
Context.getTargetInfo().getTriple().isOSCygMing()) {
6620 if (
auto *DEA =
Class->getAttr<DLLExportAttr>()) {
6621 Class->addAttr(DLLExportOnDeclAttr::Create(
Context, DEA->getLoc()));
6622 Class->dropAttr<DLLExportAttr>();
6632 if (ClassExported &&
getLangOpts().DllExportInlines) {
6635 if (
auto *S = dyn_cast<ConstructorUsingShadowDecl>(D))
6636 Shadows.push_back(S);
6658 if (
Member->hasAttr<ExcludeFromExplicitInstantiationAttr>())
6673 if (ClassExported &&
getLangOpts().DllExportInlines) {
6690 diag::warn_dllexport_inherited_ctor_unsupported)
6696 .areArgsDestroyedLeftToRightInCallee()) {
6697 bool HasCalleeCleanupParam =
false;
6699 if (P->needsDestruction(
Context)) {
6700 HasCalleeCleanupParam =
true;
6703 if (HasCalleeCleanupParam) {
6705 diag::warn_dllexport_inherited_ctor_unsupported)
6727 if (!
Context.getTargetInfo().shouldDLLImportComdatSymbols() &&
6730 if (
auto *CD = dyn_cast<CXXConstructorDecl>(MD);
6731 !CD || !CD->getInheritedConstructor())
6738 auto *Ctor = dyn_cast<CXXConstructorDecl>(MD);
6755 if (VD && PropagatedImport)
6769 if (ClassExported) {
6781 Member->addAttr(NewAttr);
6791 "friend re-decl should not already have a DLLAttr");
6821 NewAttr->setInherited(
true);
6822 BaseTemplateSpec->
addAttr(NewAttr);
6826 if (
auto *ImportAttr = dyn_cast<DLLImportAttr>(NewAttr))
6827 ImportAttr->setPropagatedToBaseTemplate();
6848 Diag(BaseLoc, diag::warn_attribute_dll_instantiated_base_class)
6853 diag::note_template_class_explicit_specialization_was_here)
6854 << BaseTemplateSpec;
6857 diag::note_template_class_instantiation_was_here)
6858 << BaseTemplateSpec;
6864 if (
auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
6876 if (MD->isCopyAssignmentOperator())
6879 if (MD->isMoveAssignmentOperator())
6890 case OO_ExclaimEqual:
6902 case OO_GreaterEqual:
6921struct DefaultedFunctionFPFeaturesRAII {
6924 : SavedFPFeatures(S) {
6931 ~DefaultedFunctionFPFeaturesRAII() =
default;
6962 llvm_unreachable(
"Invalid special member.");
6980 bool CopyCtorIsTrivial =
false, CopyCtorIsTrivialForCall =
false;
6981 bool DtorIsTrivialForCall =
false;
6992 CopyCtorIsTrivial =
true;
6994 CopyCtorIsTrivialForCall =
true;
6998 if (CD->isCopyConstructor() && !CD->isDeleted() &&
6999 !CD->isIneligibleOrNotSelected()) {
7000 if (CD->isTrivial())
7001 CopyCtorIsTrivial =
true;
7002 if (CD->isTrivialForCall())
7003 CopyCtorIsTrivialForCall =
true;
7011 DtorIsTrivialForCall =
true;
7013 if (!DD->isDeleted() && DD->isTrivialForCall())
7014 DtorIsTrivialForCall =
true;
7018 if (CopyCtorIsTrivialForCall && DtorIsTrivialForCall)
7032 uint64_t TypeSize = isAArch64 ? 128 : 64;
7044 bool HasNonDeletedCopyOrMove =
false;
7050 HasNonDeletedCopyOrMove =
true;
7057 HasNonDeletedCopyOrMove =
true;
7065 if (MD->isDeleted() || MD->isIneligibleOrNotSelected())
7068 auto *CD = dyn_cast<CXXConstructorDecl>(MD);
7069 if (CD && CD->isCopyOrMoveConstructor())
7070 HasNonDeletedCopyOrMove =
true;
7074 if (!MD->isTrivialForCall())
7078 return HasNonDeletedCopyOrMove;
7089 bool IssuedDiagnostic =
false;
7092 if (!IssuedDiagnostic) {
7094 IssuedDiagnostic =
true;
7096 S.
Diag(O->getLocation(), diag::note_overridden_virtual_function);
7099 return IssuedDiagnostic;
7106 if (
Record->isAbstract() && !
Record->isInvalidDecl()) {
7107 AbstractUsageInfo Info(*
this,
Record);
7114 if (!
Record->isInvalidDecl() && !
Record->isDependentType() &&
7115 !
Record->isAggregate() && !
Record->hasUserDeclaredConstructor() &&
7117 bool Complained =
false;
7118 for (
const auto *F :
Record->fields()) {
7119 if (F->hasInClassInitializer() || F->isUnnamedBitField())
7122 if (F->getType()->isReferenceType() ||
7123 (F->getType().isConstQualified() && F->getType()->isScalarType())) {
7125 Diag(
Record->getLocation(), diag::warn_no_constructor_for_refconst)
7130 Diag(F->getLocation(), diag::note_refconst_member_not_initialized)
7131 << F->getType()->isReferenceType()
7132 << F->getDeclName();
7137 if (
Record->getIdentifier()) {
7152 Record->hasUserDeclaredConstructor()) ||
7154 Diag(Element->getLocation(), diag::err_member_name_of_class)
7162 if (
Record->isPolymorphic() && !
Record->isDependentType()) {
7165 !
Record->hasAttr<FinalAttr>())
7167 diag::warn_non_virtual_dtor)
7171 if (
Record->isAbstract()) {
7172 if (FinalAttr *FA =
Record->getAttr<FinalAttr>()) {
7173 Diag(
Record->getLocation(), diag::warn_abstract_final_class)
7174 << FA->isSpelledAsSealed();
7180 if (!
Record->hasAttr<FinalAttr>()) {
7182 if (
const FinalAttr *FA = dtor->getAttr<FinalAttr>()) {
7183 Diag(FA->getLocation(), diag::warn_final_dtor_non_final_class)
7184 << FA->isSpelledAsSealed()
7187 (FA->isSpelledAsSealed() ?
" sealed" :
" final"));
7189 diag::note_final_dtor_non_final_class_silence)
7190 <<
Context.getCanonicalTagType(
Record) << FA->isSpelledAsSealed();
7196 if (
Record->hasAttr<TrivialABIAttr>())
7201 bool HasTrivialABI =
Record->hasAttr<TrivialABIAttr>();
7204 Record->setHasTrivialSpecialMemberForCall();
7214 auto CheckCompletedMemberFunction = [&](
CXXMethodDecl *MD) {
7225 MD->
isDeleted() ? diag::err_deleted_override
7226 : diag::err_non_deleted_override,
7228 return MD->isDeleted() != V->isDeleted();
7240 : diag::err_non_consteval_override,
7242 return MD->isConsteval() != V->isConsteval();
7251 auto CheckForDefaultedFunction = [&](
FunctionDecl *FD) ->
bool {
7258 DefaultedSecondaryComparisons.push_back(FD);
7266 if (!
Record->isInvalidDecl() &&
7267 Record->hasAttr<VTablePointerAuthenticationAttr>())
7272 bool Incomplete = CheckForDefaultedFunction(M);
7275 if (
Record->isDependentType())
7281 if (!M->isImplicit() && !M->isUserProvided()) {
7285 Record->finishedDefaultedOrDeletedMember(M);
7286 M->setTrivialForCall(
7290 Record->setTrivialForCallFlags(M);
7299 M->isUserProvided()) {
7300 M->setTrivialForCall(HasTrivialABI);
7301 Record->setTrivialForCallFlags(M);
7304 if (!M->isInvalidDecl() && M->isExplicitlyDefaulted() &&
7305 M->hasAttr<DLLExportAttr>()) {
7311 M->dropAttr<DLLExportAttr>();
7313 if (M->hasAttr<DLLExportAttr>()) {
7319 bool EffectivelyConstexprDestructor =
true;
7324 llvm::SmallDenseSet<QualType> Visited;
7325 auto Check = [&Visited](
QualType T,
auto &&Check) ->
bool {
7326 if (!Visited.insert(
T->getCanonicalTypeUnqualified()).second)
7329 T->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
7337 if (!Check(B.getType(), Check))
7340 if (!Check(FD->
getType(), Check))
7344 EffectivelyConstexprDestructor =
7352 M->isDefaulted() && M->isConstexpr() && M->size_overridden_methods() &&
7353 EffectivelyConstexprDestructor)
7357 CheckCompletedMemberFunction(M);
7366 CompleteMemberFunction(Dtor);
7368 bool HasMethodWithOverrideControl =
false,
7369 HasOverridingMethodWithoutOverrideControl =
false;
7370 for (
auto *D :
Record->decls()) {
7371 if (
auto *M = dyn_cast<CXXMethodDecl>(D)) {
7374 if (!
Record->isDependentType()) {
7380 if (M->hasAttr<OverrideAttr>()) {
7381 HasMethodWithOverrideControl =
true;
7382 }
else if (M->size_overridden_methods() > 0) {
7383 HasOverridingMethodWithoutOverrideControl =
true;
7386 if (M->isVirtualAsWritten() &&
Record->isEffectivelyFinal()) {
7387 Diag(M->getLocation(), diag::warn_unnecessary_virtual_specifier)
7394 CompleteMemberFunction(M);
7395 }
else if (
auto *F = dyn_cast<FriendDecl>(D)) {
7396 CheckForDefaultedFunction(
7397 dyn_cast_or_null<FunctionDecl>(F->getFriendDecl()));
7401 if (HasOverridingMethodWithoutOverrideControl) {
7402 bool HasInconsistentOverrideControl = HasMethodWithOverrideControl;
7403 for (
auto *M :
Record->methods())
7408 for (
FunctionDecl *FD : DefaultedSecondaryComparisons) {
7412 if (
auto *MD = dyn_cast<CXXMethodDecl>(FD))
7413 CheckCompletedMemberFunction(MD);
7434 if (
Context.getLangOpts().getLayoutCompatibility() ==
7438 Diag(
Record->getLocation(), diag::warn_cxx_ms_struct);
7444 bool ClangABICompat4 =
7445 Context.getLangOpts().isCompatibleWith(LangOptions::ClangABI::Ver4);
7447 Context.getTargetInfo().getCallingConvKind(ClangABICompat4);
7452 if (
Record->getArgPassingRestrictions() !=
7454 Record->setArgPassingRestrictions(
7462 if (
Context.getTargetInfo().getCXXABI().areArgsDestroyedLeftToRightInCallee())
7463 Record->setParamDestroyedInCallee(
true);
7464 else if (
Record->hasNonTrivialDestructor())
7465 Record->setParamDestroyedInCallee(CanPass);
7474 if (
Record->hasAttr<CUDADeviceBuiltinSurfaceTypeAttr>())
7476 else if (
Record->hasAttr<CUDADeviceBuiltinTextureTypeAttr>())
7482 TypeAwareDecls{{OO_New, {}},
7485 {OO_Array_New, {}}};
7486 for (
auto *D :
Record->decls()) {
7493 auto CheckMismatchedTypeAwareAllocators =
7496 auto &NewDecls = TypeAwareDecls[NewKind];
7497 auto &DeleteDecls = TypeAwareDecls[DeleteKind];
7498 if (NewDecls.empty() == DeleteDecls.empty())
7501 Context.DeclarationNames.getCXXOperatorName(
7502 NewDecls.empty() ? DeleteKind : NewKind);
7504 Context.DeclarationNames.getCXXOperatorName(
7505 NewDecls.empty() ? NewKind : DeleteKind);
7507 diag::err_type_aware_allocator_missing_matching_operator)
7510 for (
auto MD : NewDecls)
7512 diag::note_unmatched_type_aware_allocator_declared)
7514 for (
auto MD : DeleteDecls)
7516 diag::note_unmatched_type_aware_allocator_declared)
7519 CheckMismatchedTypeAwareAllocators(OO_New, OO_Delete);
7520 CheckMismatchedTypeAwareAllocators(OO_Array_New, OO_Array_Delete);
7536 unsigned LHSQuals = 0;
7539 LHSQuals = FieldQuals;
7541 unsigned RHSQuals = FieldQuals;
7563 llvm::DenseMap<CXXRecordDecl *, ConstructorUsingShadowDecl *>
7569 : S(S), UseLoc(UseLoc) {
7570 bool DiagnosedMultipleConstructedBases =
false;
7576 for (
auto *D : Shadow->
redecls()) {
7577 auto *DShadow = cast<ConstructorUsingShadowDecl>(D);
7578 auto *DNominatedBase = DShadow->getNominatedBaseClass();
7579 auto *DConstructedBase = DShadow->getConstructedBaseClass();
7581 InheritedFromBases.insert(
7582 std::make_pair(DNominatedBase->getCanonicalDecl(),
7583 DShadow->getNominatedBaseClassShadowDecl()));
7584 if (DShadow->constructsVirtualBase())
7585 InheritedFromBases.insert(
7586 std::make_pair(DConstructedBase->getCanonicalDecl(),
7587 DShadow->getConstructedBaseClassShadowDecl()));
7589 assert(DNominatedBase == DConstructedBase);
7594 if (!ConstructedBase) {
7595 ConstructedBase = DConstructedBase;
7596 ConstructedBaseIntroducer = D->getIntroducer();
7597 }
else if (ConstructedBase != DConstructedBase &&
7599 if (!DiagnosedMultipleConstructedBases) {
7600 S.Diag(UseLoc, diag::err_ambiguous_inherited_constructor)
7601 << Shadow->getTargetDecl();
7602 S.Diag(ConstructedBaseIntroducer->getLocation(),
7603 diag::note_ambiguous_inherited_constructor_using)
7605 DiagnosedMultipleConstructedBases = true;
7607 S.Diag(D->getIntroducer()->getLocation(),
7608 diag::note_ambiguous_inherited_constructor_using)
7609 << DConstructedBase;
7613 if (DiagnosedMultipleConstructedBases)
7614 Shadow->setInvalidDecl();
7620 std::pair<CXXConstructorDecl *, bool>
7622 auto It = InheritedFromBases.find(
Base->getCanonicalDecl());
7623 if (It == InheritedFromBases.end())
7624 return std::make_pair(
nullptr,
false);
7628 return std::make_pair(
7629 S.findInheritingConstructor(UseLoc, Ctor, It->second),
7630 It->second->constructsVirtualBase());
7633 return std::make_pair(Ctor,
false);
7650 if (InheritedCtor) {
7653 Inherited->findConstructorForBase(ClassDecl, InheritedCtor).first;
7655 return BaseCtor->isConstexpr();
7723 if (Ctor && ClassDecl->
isUnion())
7743 for (
const auto &B : ClassDecl->
bases()) {
7744 auto *BaseClassDecl = B.getType()->getAsCXXRecordDecl();
7748 InheritedCtor, Inherited))
7761 for (
const auto *F : ClassDecl->
fields()) {
7762 if (F->isInvalidDecl())
7765 F->hasInClassInitializer())
7768 if (
const RecordType *RecordTy = BaseType->getAsCanonical<RecordType>()) {
7769 auto *FieldRecDecl =
7772 BaseType.getCVRQualifiers(),
7773 ConstArg && !F->isMutable()))
7788struct ComputingExceptionSpec {
7791 ComputingExceptionSpec(Sema &S, FunctionDecl *FD, SourceLocation Loc)
7793 Sema::CodeSynthesisContext Ctx;
7799 ~ComputingExceptionSpec() {
7805static Sema::ImplicitExceptionSpecification
7809 Sema::InheritedConstructorInfo *ICI);
7811static Sema::ImplicitExceptionSpecification
7816static Sema::ImplicitExceptionSpecification
7819 if (DFK.isSpecialMember())
7822 if (DFK.isComparison())
7824 DFK.asComparison());
7827 assert(CD->getInheritedConstructor() &&
7828 "only defaulted functions and inherited constructors have implicit "
7831 S, Loc, CD->getInheritedConstructor().getShadowDecl());
7858 auto ESI = IES.getExceptionSpec();
7876 PT.getNonReferenceType()->getAsCXXRecordDecl()) {
7897 "not an explicitly-defaulted special member");
7907 bool HadError =
false;
7920 bool ShouldDeleteForTypeMismatch =
false;
7921 unsigned ExpectedParams = 1;
7933 if (DeleteOnTypeMismatch)
7934 ShouldDeleteForTypeMismatch =
true;
7944 bool CanHaveConstParam =
false;
7954 ReturnType =
Type->getReturnType();
7959 std::nullopt, RD,
false);
7960 DeclType =
Context.getAddrSpaceQualType(
7962 QualType ExpectedReturnType =
Context.getLValueReferenceType(DeclType);
7964 if (!
Context.hasSameType(ReturnType, ExpectedReturnType)) {
7965 Diag(MD->
getLocation(), diag::err_defaulted_special_member_return_type)
7967 << ExpectedReturnType;
7973 if (DeleteOnTypeMismatch)
7974 ShouldDeleteForTypeMismatch =
true;
7991 if (!ExplicitObjectParameter.
isNull() &&
7994 Context.getCanonicalTagType(RD)))) {
7995 if (DeleteOnTypeMismatch)
7996 ShouldDeleteForTypeMismatch =
true;
7999 diag::err_defaulted_special_member_explicit_object_mismatch)
8012 bool HasConstParam =
false;
8013 if (ExpectedParams &&
ArgType->isReferenceType()) {
8019 if (DeleteOnTypeMismatch)
8020 ShouldDeleteForTypeMismatch =
true;
8023 diag::err_defaulted_special_member_volatile_param)
8029 if (HasConstParam && !CanHaveConstParam) {
8030 if (DeleteOnTypeMismatch)
8031 ShouldDeleteForTypeMismatch =
true;
8035 diag::err_defaulted_special_member_copy_const_param)
8041 diag::err_defaulted_special_member_move_const_param)
8046 }
else if (ExpectedParams) {
8050 "unexpected non-ref argument");
8084 diag::err_incorrect_defaulted_constexpr_with_vb)
8086 for (
const auto &I : RD->
vbases())
8087 Diag(I.getBeginLoc(), diag::note_constexpr_virtual_base_here);
8105 if (!
Type->hasExceptionSpec()) {
8114 Context.getFunctionType(ReturnType,
Type->getParamTypes(), EPI));
8123 if (ShouldDeleteForTypeMismatch) {
8128 Diag(DefaultLoc, diag::note_replace_equals_default_to_delete)
8132 if (ShouldDeleteForTypeMismatch && !HadError) {
8134 diag::warn_cxx17_compat_defaulted_method_type_mismatch)
8141 Diag(MD->
getLocation(), diag::err_out_of_line_default_deletes) << CSM;
8142 assert(!ShouldDeleteForTypeMismatch &&
"deleted non-first decl");
8164template<
typename Derived,
typename ResultList,
typename Result,
8166class DefaultedComparisonVisitor {
8171 DefaultedComparisonKind DCK)
8172 : S(S), RD(RD), FD(FD), DCK(DCK) {
8176 Fns.assign(Info->getUnqualifiedLookups().begin(),
8177 Info->getUnqualifiedLookups().end());
8181 ResultList visit() {
8189 case DefaultedComparisonKind::None:
8190 llvm_unreachable(
"not a defaulted comparison");
8192 case DefaultedComparisonKind::Equal:
8193 case DefaultedComparisonKind::ThreeWay:
8194 getDerived().visitSubobjects(Results, RD, ParamLvalType.
getQualifiers());
8197 case DefaultedComparisonKind::NotEqual:
8198 case DefaultedComparisonKind::Relational:
8199 Results.add(getDerived().visitExpandedSubobject(
8200 ParamLvalType, getDerived().getCompleteObject()));
8203 llvm_unreachable(
"");
8207 Derived &getDerived() {
return static_cast<Derived&
>(*this); }
8213 bool visitSubobjects(ResultList &Results, CXXRecordDecl *
Record,
8217 for (CXXBaseSpecifier &Base :
Record->bases())
8218 if (Results.add(getDerived().visitSubobject(
8220 getDerived().getBase(&Base))))
8224 for (FieldDecl *Field :
Record->fields()) {
8227 if (
Field->isUnnamedBitField())
8230 if (
Field->isAnonymousStructOrUnion()) {
8231 if (visitSubobjects(Results,
Field->getType()->getAsCXXRecordDecl(),
8238 Qualifiers FieldQuals = Quals;
8239 if (
Field->isMutable())
8241 QualType FieldType =
8244 if (Results.add(getDerived().visitSubobject(
8245 FieldType, getDerived().getField(Field))))
8253 Result visitSubobject(QualType
Type, Subobject Subobj) {
8256 if (
auto *CAT = dyn_cast_or_null<ConstantArrayType>(AT))
8257 return getDerived().visitSubobjectArray(CAT->getElementType(),
8258 CAT->getSize(), Subobj);
8259 return getDerived().visitExpandedSubobject(
Type, Subobj);
8262 Result visitSubobjectArray(QualType
Type,
const llvm::APInt &Size,
8264 return getDerived().visitSubobject(
Type, Subobj);
8271 DefaultedComparisonKind DCK;
8272 UnresolvedSet<16> Fns;
8277struct DefaultedComparisonInfo {
8282 static DefaultedComparisonInfo deleted() {
8283 DefaultedComparisonInfo
Deleted;
8288 bool add(
const DefaultedComparisonInfo &R) {
8298struct DefaultedComparisonSubobject {
8306class DefaultedComparisonAnalyzer
8307 :
public DefaultedComparisonVisitor<DefaultedComparisonAnalyzer,
8308 DefaultedComparisonInfo,
8309 DefaultedComparisonInfo,
8310 DefaultedComparisonSubobject> {
8312 enum DiagnosticKind { NoDiagnostics, ExplainDeleted, ExplainConstexpr };
8315 DiagnosticKind Diagnose;
8318 using Base = DefaultedComparisonVisitor;
8319 using Result = DefaultedComparisonInfo;
8320 using Subobject = DefaultedComparisonSubobject;
8324 DefaultedComparisonAnalyzer(Sema &S, CXXRecordDecl *RD, FunctionDecl *FD,
8325 DefaultedComparisonKind DCK,
8326 DiagnosticKind Diagnose = NoDiagnostics)
8327 :
Base(S, RD, FD, DCK), Diagnose(Diagnose) {}
8330 if ((DCK == DefaultedComparisonKind::Equal ||
8331 DCK == DefaultedComparisonKind::ThreeWay) &&
8336 if (Diagnose == ExplainDeleted) {
8340 return Result::deleted();
8343 return Base::visit();
8347 Subobject getCompleteObject() {
8348 return Subobject{Subobject::CompleteObject, RD, FD->
getLocation()};
8351 Subobject getBase(CXXBaseSpecifier *Base) {
8352 return Subobject{Subobject::Base,
Base->getType()->getAsCXXRecordDecl(),
8353 Base->getBaseTypeLoc()};
8356 Subobject getField(FieldDecl *Field) {
8357 return Subobject{Subobject::Member,
Field,
Field->getLocation()};
8360 Result visitExpandedSubobject(QualType
Type, Subobject Subobj) {
8364 if (
Type->isReferenceType()) {
8365 if (Diagnose == ExplainDeleted) {
8366 S.
Diag(Subobj.Loc, diag::note_defaulted_comparison_reference_member)
8369 return Result::deleted();
8374 Expr *Args[] = {&Xi, &Xi};
8378 assert(OO !=
OO_None &&
"not an overloaded operator!");
8379 return visitBinaryOperator(OO, Args, Subobj);
8385 OverloadCandidateSet *SpaceshipCandidates =
nullptr) {
8389 OverloadCandidateSet CandidateSet(
8391 OverloadCandidateSet::OperatorRewriteInfo(
8393 !SpaceshipCandidates));
8398 CandidateSet.exclude(FD);
8400 if (Args[0]->
getType()->isOverloadableType())
8411 switch (CandidateSet.BestViableFunction(S, FD->
getLocation(), Best)) {
8417 if ((DCK == DefaultedComparisonKind::NotEqual ||
8418 DCK == DefaultedComparisonKind::Relational) &&
8419 !Best->RewriteKind) {
8420 if (Diagnose == ExplainDeleted) {
8421 if (Best->Function) {
8422 S.
Diag(Best->Function->getLocation(),
8423 diag::note_defaulted_comparison_not_rewritten_callee)
8426 assert(Best->Conversions.size() == 2 &&
8427 Best->Conversions[0].isUserDefined() &&
8428 "non-user-defined conversion from class to built-in "
8430 S.
Diag(Best->Conversions[0]
8431 .UserDefined.FoundConversionFunction.getDecl()
8433 diag::note_defaulted_comparison_not_rewritten_conversion)
8437 return Result::deleted();
8447 CXXRecordDecl *ArgClass = Args[0]->getType()->getAsCXXRecordDecl();
8448 if (ArgClass && Best->FoundDecl.getDecl() &&
8449 Best->FoundDecl.getDecl()->isCXXClassMember()) {
8450 QualType ObjectType = Subobj.Kind == Subobject::Member
8451 ? Args[0]->getType()
8454 ArgClass, Best->FoundDecl, ObjectType, Subobj.Loc,
8455 Diagnose == ExplainDeleted
8456 ? S.
PDiag(diag::note_defaulted_comparison_inaccessible)
8457 << FD << Subobj.Kind << Subobj.Decl
8459 return Result::deleted();
8462 bool NeedsDeducing =
8465 if (FunctionDecl *BestFD = Best->Function) {
8470 assert(!BestFD->isDeleted() &&
"wrong overload resolution result");
8472 if (Diagnose == ExplainConstexpr && !BestFD->isConstexpr()) {
8473 if (Subobj.Kind != Subobject::CompleteObject)
8474 S.
Diag(Subobj.Loc, diag::note_defaulted_comparison_not_constexpr)
8475 << Subobj.
Kind << Subobj.Decl;
8476 S.
Diag(BestFD->getLocation(),
8477 diag::note_defaulted_comparison_not_constexpr_here);
8479 return Result::deleted();
8481 R.Constexpr &= BestFD->isConstexpr();
8483 if (NeedsDeducing) {
8488 if (BestFD->getReturnType()->isUndeducedType() &&
8494 if (Diagnose == NoDiagnostics) {
8497 diag::err_defaulted_comparison_cannot_deduce_undeduced_auto)
8498 << Subobj.
Kind << Subobj.Decl;
8501 diag::note_defaulted_comparison_cannot_deduce_undeduced_auto)
8502 << Subobj.
Kind << Subobj.Decl;
8503 S.
Diag(BestFD->getLocation(),
8504 diag::note_defaulted_comparison_cannot_deduce_callee)
8505 << Subobj.
Kind << Subobj.Decl;
8507 return Result::deleted();
8510 BestFD->getCallResultType());
8512 if (Diagnose == ExplainDeleted) {
8513 S.
Diag(Subobj.Loc, diag::note_defaulted_comparison_cannot_deduce)
8514 << Subobj.
Kind << Subobj.Decl
8515 << BestFD->getCallResultType().withoutLocalFastQualifiers();
8516 S.
Diag(BestFD->getLocation(),
8517 diag::note_defaulted_comparison_cannot_deduce_callee)
8518 << Subobj.
Kind << Subobj.Decl;
8520 return Result::deleted();
8522 R.Category = Info->Kind;
8525 QualType
T = Best->BuiltinParamTypes[0];
8526 assert(
T == Best->BuiltinParamTypes[1] &&
8527 "builtin comparison for different types?");
8528 assert(Best->BuiltinParamTypes[2].isNull() &&
8529 "invalid builtin comparison");
8534 if (Diagnose == ExplainDeleted) {
8536 diag::note_defaulted_comparison_vector_types)
8538 S.
Diag(Subobj.Decl->getLocation(), diag::note_declared_at);
8540 return Result::deleted();
8543 if (NeedsDeducing) {
8544 std::optional<ComparisonCategoryType> Cat =
8546 assert(Cat &&
"no category for builtin comparison?");
8557 if (Diagnose == ExplainDeleted) {
8560 Kind = OO == OO_EqualEqual ? 1 : 2;
8561 CandidateSet.NoteCandidates(
8563 Subobj.Loc, S.
PDiag(diag::note_defaulted_comparison_ambiguous)
8564 << FD << Kind << Subobj.Kind << Subobj.Decl),
8567 R = Result::deleted();
8571 if (Diagnose == ExplainDeleted) {
8572 if ((DCK == DefaultedComparisonKind::NotEqual ||
8573 DCK == DefaultedComparisonKind::Relational) &&
8574 !Best->RewriteKind) {
8575 S.
Diag(Best->Function->getLocation(),
8576 diag::note_defaulted_comparison_not_rewritten_callee)
8580 diag::note_defaulted_comparison_calls_deleted)
8581 << FD << Subobj.
Kind << Subobj.Decl;
8585 R = Result::deleted();
8591 if (OO == OO_Spaceship &&
8595 if (!
R.add(visitBinaryOperator(OO_EqualEqual, Args, Subobj,
8597 R.add(visitBinaryOperator(OO_Less, Args, Subobj, &CandidateSet));
8601 if (Diagnose == ExplainDeleted) {
8602 S.
Diag(Subobj.Loc, diag::note_defaulted_comparison_no_viable_function)
8603 << FD << (OO == OO_EqualEqual || OO == OO_ExclaimEqual)
8604 << Subobj.
Kind << Subobj.Decl;
8608 if (SpaceshipCandidates) {
8609 SpaceshipCandidates->NoteCandidates(
8614 diag::note_defaulted_comparison_no_viable_function_synthesized)
8615 << (OO == OO_EqualEqual ? 0 : 1);
8618 CandidateSet.NoteCandidates(
8623 R = Result::deleted();
8632struct StmtListResult {
8633 bool IsInvalid =
false;
8634 llvm::SmallVector<Stmt*, 16> Stmts;
8637 IsInvalid |= S.isInvalid();
8640 Stmts.push_back(S.get());
8647class DefaultedComparisonSynthesizer
8648 :
public DefaultedComparisonVisitor<DefaultedComparisonSynthesizer,
8649 StmtListResult, StmtResult,
8650 std::pair<ExprResult, ExprResult>> {
8652 unsigned ArrayDepth = 0;
8655 using Base = DefaultedComparisonVisitor;
8656 using ExprPair = std::pair<ExprResult, ExprResult>;
8660 DefaultedComparisonSynthesizer(Sema &S, CXXRecordDecl *RD, FunctionDecl *FD,
8661 DefaultedComparisonKind DCK,
8662 SourceLocation BodyLoc)
8663 :
Base(S, RD, FD, DCK), Loc(BodyLoc) {}
8667 Sema::CompoundScopeRAII CompoundScope(S);
8669 StmtListResult Stmts = visit();
8670 if (Stmts.IsInvalid)
8675 case DefaultedComparisonKind::None:
8676 llvm_unreachable(
"not a defaulted comparison");
8678 case DefaultedComparisonKind::Equal: {
8687 auto OldStmts = std::move(Stmts.Stmts);
8688 Stmts.Stmts.clear();
8691 auto FinishCmp = [&] {
8692 if (Expr *Prior = CmpSoFar.
get()) {
8694 if (RetVal.
isUnset() && Stmts.Stmts.empty())
8697 else if (Stmts.add(buildIfNotCondReturnFalse(Prior)))
8703 for (Stmt *EAsStmt : llvm::reverse(OldStmts)) {
8704 Expr *E = dyn_cast<Expr>(EAsStmt);
8707 if (FinishCmp() || Stmts.add(EAsStmt))
8716 CmpSoFar = S.CreateBuiltinBinOp(Loc, BO_LAnd, E, CmpSoFar.
get());
8722 std::reverse(Stmts.Stmts.begin(), Stmts.Stmts.end());
8725 RetVal = S.ActOnCXXBoolLiteral(Loc, tok::kw_true);
8729 case DefaultedComparisonKind::ThreeWay: {
8733 ComparisonCategoryType::StrongOrdering, Loc,
8734 Sema::ComparisonCategoryUsage::DefaultedOperator);
8737 VarDecl *EqualVD = S.Context.CompCategories.getInfoForType(
StrongOrdering)
8738 .getValueInfo(ComparisonCategoryResult::Equal)
8740 RetVal = getDecl(EqualVD);
8743 RetVal = buildStaticCastToR(RetVal.
get());
8747 case DefaultedComparisonKind::NotEqual:
8748 case DefaultedComparisonKind::Relational:
8749 RetVal =
cast<Expr>(Stmts.Stmts.pop_back_val());
8756 StmtResult ReturnStmt = S.BuildReturnStmt(Loc, RetVal.
get());
8757 if (ReturnStmt.isInvalid())
8759 Stmts.Stmts.push_back(ReturnStmt.get());
8761 return S.ActOnCompoundStmt(Loc, Loc, Stmts.Stmts,
false);
8766 return S.BuildDeclarationNameExpr(
8767 CXXScopeSpec(), DeclarationNameInfo(VD->
getDeclName(), Loc), VD);
8775 ExprPair getCompleteObject() {
8778 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD);
8779 MD && MD->isImplicitObjectMemberFunction()) {
8781 LHS = S.ActOnCXXThis(Loc);
8783 LHS = S.CreateBuiltinUnaryOp(Loc, UO_Deref, LHS.
get());
8785 LHS = getParam(Param++);
8792 ExprPair getBase(CXXBaseSpecifier *Base) {
8793 ExprPair Obj = getCompleteObject();
8794 if (Obj.first.isInvalid() || Obj.second.isInvalid())
8797 const auto CastToBase = [&](Expr *E) {
8798 QualType ToType = S.Context.getQualifiedType(
8800 return S.ImpCastExprToType(E, ToType, CK_DerivedToBase,
VK_LValue, &Path);
8802 return {CastToBase(Obj.first.get()), CastToBase(Obj.second.get())};
8805 ExprPair getField(FieldDecl *Field) {
8806 ExprPair Obj = getCompleteObject();
8807 if (Obj.first.isInvalid() || Obj.second.isInvalid())
8811 DeclarationNameInfo NameInfo(
Field->getDeclName(), Loc);
8812 return {S.BuildFieldReferenceExpr(Obj.first.get(),
false, Loc,
8813 CXXScopeSpec(), Field,
Found, NameInfo),
8814 S.BuildFieldReferenceExpr(Obj.second.get(),
false, Loc,
8815 CXXScopeSpec(), Field,
Found, NameInfo)};
8822 if (
Cond.isInvalid())
8825 ExprResult NotCond = S.CreateBuiltinUnaryOp(Loc, UO_LNot,
Cond.get());
8830 assert(!
False.isInvalid() &&
"should never fail");
8832 if (ReturnFalse.isInvalid())
8835 return S.ActOnIfStmt(Loc, IfStatementKind::Ordinary, Loc,
nullptr,
8836 S.ActOnCondition(
nullptr, Loc, NotCond.
get(),
8837 Sema::ConditionKind::Boolean),
8838 Loc, ReturnFalse.get(), SourceLocation(),
nullptr);
8843 QualType SizeType = S.Context.getSizeType();
8844 Size =
Size.zextOrTrunc(S.Context.getTypeSize(SizeType));
8847 IdentifierInfo *IterationVarName =
nullptr;
8850 llvm::raw_svector_ostream
OS(Str);
8851 OS <<
"i" << ArrayDepth;
8852 IterationVarName = &S.Context.Idents.get(
OS.str());
8855 S.Context, S.CurContext, Loc, Loc, IterationVarName, SizeType,
8856 S.Context.getTrivialTypeSourceInfo(SizeType, Loc),
SC_None);
8857 llvm::APInt
Zero(S.Context.getTypeSize(SizeType), 0);
8860 Stmt *
Init =
new (S.Context) DeclStmt(DeclGroupRef(IterationVar), Loc, Loc);
8862 auto IterRef = [&] {
8864 CXXScopeSpec(), DeclarationNameInfo(IterationVarName, Loc),
8866 assert(!Ref.
isInvalid() &&
"can't reference our own variable?");
8872 Loc, BO_NE, IterRef(),
8874 assert(!
Cond.isInvalid() &&
"should never fail");
8877 ExprResult Inc = S.CreateBuiltinUnaryOp(Loc, UO_PreInc, IterRef());
8878 assert(!
Inc.isInvalid() &&
"should never fail");
8884 return S.CreateBuiltinArraySubscriptExpr(E.get(), Loc, IterRef(), Loc);
8886 Subobj.first = Index(Subobj.first);
8887 Subobj.second = Index(Subobj.second);
8894 if (Substmt.isInvalid())
8900 if (Expr *ElemCmp = dyn_cast<Expr>(Substmt.get())) {
8901 assert(DCK == DefaultedComparisonKind::Equal &&
8902 "should have non-expression statement");
8903 Substmt = buildIfNotCondReturnFalse(ElemCmp);
8904 if (Substmt.isInvalid())
8909 return S.ActOnForStmt(Loc, Loc,
Init,
8910 S.ActOnCondition(
nullptr, Loc,
Cond.get(),
8911 Sema::ConditionKind::Boolean),
8912 S.MakeFullDiscardedValueExpr(
Inc.get()), Loc,
8917 if (Obj.first.isInvalid() || Obj.second.isInvalid())
8923 if (
Type->isOverloadableType())
8924 Op = S.CreateOverloadedBinOp(Loc, Opc, Fns, Obj.first.get(),
8925 Obj.second.get(),
true,
8928 Op = S.CreateBuiltinBinOp(Loc, Opc, Obj.first.get(), Obj.second.get());
8933 case DefaultedComparisonKind::None:
8934 llvm_unreachable(
"not a defaulted comparison");
8936 case DefaultedComparisonKind::Equal:
8939 Op = S.PerformContextuallyConvertToBool(Op.
get());
8944 case DefaultedComparisonKind::ThreeWay: {
8949 Op = buildStaticCastToR(Op.
get());
8954 IdentifierInfo *Name = &S.Context.Idents.get(
"cmp");
8957 S.Context.getTrivialTypeSourceInfo(R, Loc),
SC_None);
8958 S.AddInitializerToDecl(VD, Op.
get(),
false);
8959 Stmt *InitStmt =
new (S.Context) DeclStmt(DeclGroupRef(VD), Loc, Loc);
8965 llvm::APInt ZeroVal(S.Context.getIntWidth(S.Context.IntTy), 0);
8970 Comp = S.CreateOverloadedBinOp(Loc, BO_NE, Fns, VDRef.
get(),
Zero,
true,
8973 Comp = S.CreateBuiltinBinOp(Loc, BO_NE, VDRef.
get(),
Zero);
8974 if (
Comp.isInvalid())
8976 Sema::ConditionResult
Cond = S.ActOnCondition(
8977 nullptr, Loc,
Comp.get(), Sema::ConditionKind::Boolean);
8978 if (
Cond.isInvalid())
8982 VDRef = getDecl(VD);
8985 StmtResult ReturnStmt = S.BuildReturnStmt(Loc, VDRef.
get());
8986 if (ReturnStmt.isInvalid())
8990 return S.ActOnIfStmt(Loc, IfStatementKind::Ordinary, Loc, InitStmt,
Cond,
8991 Loc, ReturnStmt.get(),
8992 SourceLocation(),
nullptr);
8995 case DefaultedComparisonKind::NotEqual:
8996 case DefaultedComparisonKind::Relational:
9001 llvm_unreachable(
"");
9007 assert(!
R->isUndeducedType() &&
"type should have been deduced already");
9012 return S.BuildCXXNamedCast(Loc, tok::kw_static_cast,
9013 S.Context.getTrivialTypeSourceInfo(R, Loc), E,
9014 SourceRange(Loc, Loc), SourceRange(Loc, Loc));
9025 Self.LookupOverloadedOperatorName(OO, S, Operators);
9038 if (Op == OO_Spaceship) {
9039 Lookup(OO_ExclaimEqual);
9041 Lookup(OO_EqualEqual);
9072 assert(!MD->isStatic() &&
"comparison function cannot be a static member");
9074 if (MD->getRefQualifier() ==
RQ_RValue) {
9075 Diag(MD->getLocation(), diag::err_ref_qualifier_comparison_operator);
9081 MD->setType(
Context.getFunctionType(FPT->getReturnType(),
9082 FPT->getParamTypes(), EPI));
9088 QualType T = MD->getFunctionObjectParameterReferenceType();
9089 if (!
T.getNonReferenceType().isConstQualified() &&
9090 (MD->isImplicitObjectMemberFunction() ||
T->isLValueReferenceType())) {
9092 if (MD->isExplicitObjectMemberFunction()) {
9093 Loc = MD->getParamDecl(0)->getBeginLoc();
9095 MD->getParamDecl(0)->getExplicitObjectParamThisLoc());
9097 Loc = MD->getLocation();
9103 if (!MD->isImplicit()) {
9104 Diag(Loc, diag::err_defaulted_comparison_non_const)
9109 if (MD->isExplicitObjectMemberFunction()) {
9110 assert(
T->isLValueReferenceType());
9111 MD->getParamDecl(0)->setType(
Context.getLValueReferenceType(
9112 T.getNonReferenceType().withConst()));
9117 MD->setType(
Context.getFunctionType(FPT->getReturnType(),
9118 FPT->getParamTypes(), EPI));
9122 if (MD->isVolatile()) {
9123 Diag(MD->getLocation(), diag::err_volatile_comparison_operator);
9129 MD->setType(
Context.getFunctionType(FPT->getReturnType(),
9130 FPT->getParamTypes(), EPI));
9136 (IsMethod ? 1 : 2)) {
9140 <<
int(IsMethod) <<
int(DCK);
9146 QualType ParmTy = Param->getType();
9153 ExpectedTy =
Context.getCanonicalTagType(RD);
9155 CTy = Ref->getPointeeType();
9165 RD = CTy->getAsCXXRecordDecl();
9166 Ok &= RD !=
nullptr;
9180 <<
int(DCK) << ParmTy << RefTy <<
int(!IsMethod) << PlainTy
9181 << Param->getSourceRange();
9183 assert(!IsMethod &&
"should know expected type for method");
9185 diag::err_defaulted_comparison_param_unknown)
9186 <<
int(DCK) << ParmTy << Param->getSourceRange();
9192 Diag(FD->
getLocation(), diag::err_defaulted_comparison_param_mismatch)
9194 << ParmTy << Param->getSourceRange();
9199 assert(RD &&
"must have determined class");
9208 diag::err_defaulted_comparison_not_friend,
int(DCK),
9213 return declaresSameEntity(F->getFriendDecl(), FD);
9216 <<
int(DCK) <<
int(0) << RD;
9228 Diag(FD->
getLocation(), diag::err_defaulted_comparison_return_type_not_bool)
9238 RT->getContainedDeducedType() &&
9240 RT->getContainedAutoType()->isConstrained())) {
9242 diag::err_defaulted_comparison_deduced_return_type_not_auto)
9254 DefaultedComparisonInfo Info =
9255 DefaultedComparisonAnalyzer(*
this, RD, FD, DCK).visit();
9269 DefaultedComparisonAnalyzer(*
this, RD, FD, DCK,
9270 DefaultedComparisonAnalyzer::ExplainDeleted)
9281 diag::note_previous_declaration);
9293 DefaultedComparisonAnalyzer(*
this, RD, FD, DCK,
9294 DefaultedComparisonAnalyzer::ExplainDeleted)
9316 Context.adjustDeducedFunctionResultType(
9344 Diag(FD->
getBeginLoc(), diag::err_defaulted_comparison_constexpr_mismatch)
9346 DefaultedComparisonAnalyzer(*
this, RD, FD, DCK,
9347 DefaultedComparisonAnalyzer::ExplainConstexpr)
9368 EPI.ExceptionSpec.SourceDecl = FD;
9370 FPT->getParamTypes(), EPI));
9385 EqualEqual->setImplicit();
9400 Scope.addContextNote(UseLoc);
9402 DefaultedFunctionFPFeaturesRAII RestoreFP(*
this, FD);
9409 CXXRecordDecl *RD = PT.getNonReferenceType()->getAsCXXRecordDecl();
9413 DefaultedComparisonSynthesizer(*
this, RD, FD, DCK, BodyLoc).build();
9427 L->CompletedImplicitDefinition(FD);
9434 ComputingExceptionSpec CES(S, FD, Loc);
9464 DefaultedComparisonSynthesizer(S, RD, FD, DCK, BodyLoc).build();
9465 if (!Body.isInvalid())
9486 for (
auto &Check : Overriding)
9498template<
typename Derived>
9499struct SpecialMemberVisitor {
9506 bool IsConstructor =
false, IsAssignment =
false, ConstArg =
false;
9510 : S(S), MD(MD), CSM(CSM), ICI(ICI) {
9515 IsConstructor =
true;
9519 IsAssignment =
true;
9524 llvm_unreachable(
"invalid special member kind");
9528 if (const ReferenceType *RT =
9529 MD->getNonObjectParameter(0)->getType()->getAs<ReferenceType>())
9530 ConstArg = RT->getPointeeType().isConstQualified();
9534 Derived &getDerived() {
return static_cast<Derived&
>(*this); }
9537 bool isMove()
const {
9538 return CSM == CXXSpecialMemberKind::MoveConstructor ||
9539 CSM == CXXSpecialMemberKind::MoveAssignment;
9543 Sema::SpecialMemberOverloadResult lookupIn(CXXRecordDecl *
Class,
9544 unsigned Quals,
bool IsMutable) {
9546 ConstArg && !IsMutable);
9551 Sema::SpecialMemberOverloadResult lookupInheritedCtor(CXXRecordDecl *
Class) {
9554 assert(CSM == CXXSpecialMemberKind::DefaultConstructor);
9563 typedef llvm::PointerUnion<CXXBaseSpecifier*, FieldDecl*> Subobject;
9566 static SourceLocation getSubobjectLoc(Subobject Subobj) {
9569 if (
auto *B = dyn_cast<CXXBaseSpecifier *>(Subobj))
9570 return B->getBaseTypeLoc();
9577 VisitNonVirtualBases,
9582 VisitPotentiallyConstructedBases,
9588 bool visit(BasesToVisit Bases) {
9591 if (Bases == VisitPotentiallyConstructedBases)
9592 Bases = RD->
isAbstract() ? VisitNonVirtualBases : VisitAllBases;
9594 for (
auto &B : RD->
bases())
9595 if ((Bases == VisitDirectBases || !B.isVirtual()) &&
9596 getDerived().visitBase(&B))
9599 if (Bases == VisitAllBases)
9600 for (
auto &B : RD->
vbases())
9601 if (getDerived().visitBase(&B))
9604 for (
auto *F : RD->
fields())
9605 if (!F->isInvalidDecl() && !F->isUnnamedBitField() &&
9606 getDerived().visitField(F))
9615struct SpecialMemberDeletionInfo
9616 : SpecialMemberVisitor<SpecialMemberDeletionInfo> {
9621 bool AllFieldsAreConst;
9623 SpecialMemberDeletionInfo(Sema &S, CXXMethodDecl *MD,
9625 Sema::InheritedConstructorInfo *ICI,
bool Diagnose)
9626 : SpecialMemberVisitor(S, MD, CSM, ICI), Diagnose(Diagnose),
9627 Loc(MD->getLocation()), AllFieldsAreConst(
true) {}
9632 return ICI ? CXXSpecialMemberKind::Invalid : CSM;
9635 bool shouldDeleteForVariantObjCPtrMember(FieldDecl *FD, QualType FieldType);
9637 bool shouldDeleteForVariantPtrAuthMember(
const FieldDecl *FD);
9639 bool visitBase(CXXBaseSpecifier *Base) {
return shouldDeleteForBase(Base); }
9640 bool visitField(FieldDecl *Field) {
return shouldDeleteForField(Field); }
9642 bool shouldDeleteForBase(CXXBaseSpecifier *Base);
9643 bool shouldDeleteForField(FieldDecl *FD);
9644 bool shouldDeleteForAllConstMembers();
9646 bool shouldDeleteForClassSubobject(CXXRecordDecl *
Class, Subobject Subobj,
9648 bool shouldDeleteForSubobjectCall(Subobject Subobj,
9649 Sema::SpecialMemberOverloadResult SMOR,
9650 bool IsDtorCallInCtor);
9652 bool isAccessible(Subobject Subobj, CXXMethodDecl *D);
9658bool SpecialMemberDeletionInfo::isAccessible(Subobject Subobj,
9659 CXXMethodDecl *target) {
9664 if (CXXBaseSpecifier *base = Subobj.dyn_cast<CXXBaseSpecifier*>()) {
9679bool SpecialMemberDeletionInfo::shouldDeleteForSubobjectCall(
9680 Subobject Subobj, Sema::SpecialMemberOverloadResult SMOR,
9681 bool IsDtorCallInCtor) {
9683 FieldDecl *
Field = Subobj.dyn_cast<FieldDecl*>();
9692 } DiagKind = NotSet;
9695 if (CSM == CXXSpecialMemberKind::DefaultConstructor && Field &&
9696 Field->getParent()->isUnion()) {
9706 DiagKind = !
Decl ? NoDecl : DeletedDecl;
9708 DiagKind = MultipleDecl;
9709 else if (!isAccessible(Subobj, Decl))
9710 DiagKind = InaccessibleDecl;
9711 else if (!IsDtorCallInCtor && Field &&
Field->getParent()->isUnion() &&
9712 !
Decl->isTrivial()) {
9718 if (CSM == CXXSpecialMemberKind::DefaultConstructor) {
9726 DiagKind = NonTrivialDecl;
9728 DiagKind = NonTrivialDecl;
9732 if (DiagKind == NotSet)
9738 diag::note_deleted_special_member_class_subobject)
9740 << DiagKind << IsDtorCallInCtor <<
false;
9744 diag::note_deleted_special_member_class_subobject)
9745 << getEffectiveCSM() << MD->
getParent() <<
false
9746 <<
Base->getType() << DiagKind << IsDtorCallInCtor
9750 if (DiagKind == DeletedDecl)
9760bool SpecialMemberDeletionInfo::shouldDeleteForClassSubobject(
9761 CXXRecordDecl *
Class, Subobject Subobj,
unsigned Quals) {
9762 FieldDecl *
Field = Subobj.dyn_cast<FieldDecl*>();
9763 bool IsMutable =
Field &&
Field->isMutable();
9779 if (!(CSM == CXXSpecialMemberKind::DefaultConstructor && Field &&
9780 Field->hasInClassInitializer()) &&
9781 shouldDeleteForSubobjectCall(Subobj, lookupIn(
Class, Quals, IsMutable),
9788 if (IsConstructor) {
9789 Sema::SpecialMemberOverloadResult SMOR =
9791 false,
false,
false,
false);
9792 if (shouldDeleteForSubobjectCall(Subobj, SMOR,
true))
9799bool SpecialMemberDeletionInfo::shouldDeleteForVariantObjCPtrMember(
9800 FieldDecl *FD, QualType FieldType) {
9809 if (CSM == CXXSpecialMemberKind::DefaultConstructor &&
9815 S.
Diag(FD->
getLocation(), diag::note_deleted_special_member_class_subobject)
9816 << getEffectiveCSM() << ParentClass <<
true << FD << 4
9823bool SpecialMemberDeletionInfo::shouldDeleteForVariantPtrAuthMember(
9824 const FieldDecl *FD) {
9833 if (CSM == CXXSpecialMemberKind::DefaultConstructor ||
9834 CSM == CXXSpecialMemberKind::Destructor)
9839 S.
Diag(FD->
getLocation(), diag::note_deleted_special_member_class_subobject)
9840 << getEffectiveCSM() << ParentClass <<
true << FD << 4
9849bool SpecialMemberDeletionInfo::shouldDeleteForBase(CXXBaseSpecifier *Base) {
9850 CXXRecordDecl *BaseClass =
Base->getType()->getAsCXXRecordDecl();
9857 Sema::SpecialMemberOverloadResult SMOR = lookupInheritedCtor(BaseClass);
9858 if (
auto *BaseCtor = SMOR.
getMethod()) {
9863 if (BaseCtor->isDeleted() && Diagnose) {
9865 diag::note_deleted_special_member_class_subobject)
9866 << getEffectiveCSM() << MD->
getParent() <<
false
9867 <<
Base->getType() << 1 <<
false
9871 return BaseCtor->isDeleted();
9873 return shouldDeleteForClassSubobject(BaseClass, Base, 0);
9878bool SpecialMemberDeletionInfo::shouldDeleteForField(FieldDecl *FD) {
9882 if (inUnion() && shouldDeleteForVariantObjCPtrMember(FD, FieldType))
9885 if (inUnion() && shouldDeleteForVariantPtrAuthMember(FD))
9888 if (CSM == CXXSpecialMemberKind::DefaultConstructor) {
9893 S.
Diag(FD->
getLocation(), diag::note_deleted_default_ctor_uninit_field)
9894 << !!ICI << MD->
getParent() << FD << FieldType << 0;
9904 S.
Diag(FD->
getLocation(), diag::note_deleted_default_ctor_uninit_field)
9910 AllFieldsAreConst =
false;
9911 }
else if (CSM == CXXSpecialMemberKind::CopyConstructor) {
9916 S.
Diag(FD->
getLocation(), diag::note_deleted_copy_ctor_rvalue_reference)
9920 }
else if (IsAssignment) {
9925 << isMove() << MD->
getParent() << FD << FieldType << 0;
9940 if (!inUnion() && FieldRecord->
isUnion() &&
9942 bool AllVariantFieldsAreConst =
true;
9945 for (
auto *UI : FieldRecord->
fields()) {
9948 if (shouldDeleteForVariantObjCPtrMember(&*UI, UnionFieldType))
9951 if (shouldDeleteForVariantPtrAuthMember(&*UI))
9955 AllVariantFieldsAreConst =
false;
9958 if (UnionFieldRecord &&
9959 shouldDeleteForClassSubobject(UnionFieldRecord, UI,
9965 if (CSM == CXXSpecialMemberKind::DefaultConstructor &&
9966 AllVariantFieldsAreConst && !FieldRecord->
field_empty()) {
9969 diag::note_deleted_default_ctor_all_const)
9980 if (shouldDeleteForClassSubobject(FieldRecord, FD,
9991bool SpecialMemberDeletionInfo::shouldDeleteForAllConstMembers() {
9994 if (CSM == CXXSpecialMemberKind::DefaultConstructor && inUnion() &&
9995 AllFieldsAreConst) {
9996 bool AnyFields =
false;
9998 if ((AnyFields = !F->isUnnamedBitField()))
10004 diag::note_deleted_default_ctor_all_const)
10050 bool DeletesOnlyMatchingCopy =
10055 (!DeletesOnlyMatchingCopy ||
10060 for (
auto *I : RD->
ctors()) {
10061 if (I->isMoveConstructor()) {
10062 UserDeclaredMove = I;
10066 assert(UserDeclaredMove);
10068 (!DeletesOnlyMatchingCopy ||
10073 for (
auto *I : RD->
methods()) {
10074 if (I->isMoveAssignmentOperator()) {
10075 UserDeclaredMove = I;
10079 assert(UserDeclaredMove);
10082 if (UserDeclaredMove) {
10084 diag::note_deleted_copy_user_declared_move)
10101 Context.DeclarationNames.getCXXOperatorName(OO_Delete);
10106 OperatorDelete, IDP,
10114 SpecialMemberDeletionInfo SMI(*
this, MD, CSM, ICI,
Diagnose);
10122 if (SMI.visit(SMI.IsAssignment ? SMI.VisitDirectBases
10123 : SMI.VisitPotentiallyConstructedBases))
10126 if (SMI.shouldDeleteForAllConstMembers())
10137 auto RealCSM = CSM;
10141 return CUDA().inferTargetForImplicitSpecialMember(RD, RealCSM, MD,
10150 assert(DFK &&
"not a defaultable function");
10157 DefaultedComparisonAnalyzer(
10159 DFK.
asComparison(), DefaultedComparisonAnalyzer::ExplainDeleted)
10180 *Selected =
nullptr;
10184 llvm_unreachable(
"not a special member");
10202 for (
auto *CI : RD->
ctors()) {
10203 if (!CI->isDefaultConstructor())
10210 *Selected = DefCtor;
10243 }
else if (!Selected) {
10251 goto NeedOverloadResolution;
10261 }
else if (!Selected) {
10266 goto NeedOverloadResolution;
10270 NeedOverloadResolution:
10299 llvm_unreachable(
"unknown special method kind");
10303 for (
auto *CI : RD->
ctors())
10304 if (!CI->isImplicit())
10311 dyn_cast<CXXConstructorDecl>(TI->getTemplatedDecl()))
10341 ConstRHS, TAH, Diagnose ? &Selected :
nullptr))
10349 S.
Diag(SubobjLoc, diag::note_nontrivial_no_def_ctor)
10352 S.
Diag(CD->getLocation(), diag::note_user_declared_ctor);
10353 }
else if (!Selected)
10354 S.
Diag(SubobjLoc, diag::note_nontrivial_no_copy)
10359 << Kind << SubType.getUnqualifiedType() << CSM;
10361 S.
Diag(SubobjLoc, diag::note_nontrivial_user_provided)
10362 << Kind << SubType.getUnqualifiedType() << CSM;
10367 S.
Diag(SubobjLoc, diag::note_nontrivial_subobject)
10368 << Kind << SubType.getUnqualifiedType() << CSM;
10384 for (
const auto *FI : RD->
fields()) {
10385 if (FI->isInvalidDecl() || FI->isUnnamedBitField())
10391 if (FI->isAnonymousStructOrUnion()) {
10393 CSM, ConstArg, TAH, Diagnose))
10403 FI->hasInClassInitializer()) {
10405 S.
Diag(FI->getLocation(), diag::note_nontrivial_default_member_init)
10416 S.
Diag(FI->getLocation(), diag::note_nontrivial_objc_ownership)
10421 bool ConstRHS = ConstArg && !FI->isMutable();
10445 "not special enough");
10449 bool ConstArg =
false;
10473 const bool ClangABICompat14 =
10474 Context.getLangOpts().isCompatibleWith(LangOptions::ClangABI::Ver14);
10477 ClangABICompat14)) {
10481 <<
Context.getLValueReferenceType(
10482 Context.getCanonicalTagType(RD).withConst());
10500 <<
Context.getRValueReferenceType(
Context.getCanonicalTagType(RD));
10507 llvm_unreachable(
"not a special member");
10513 diag::note_nontrivial_default_arg)
10532 for (
const auto &BI : RD->
bases())
10574 Diag(BS.
getBeginLoc(), diag::note_nontrivial_has_virtual) << RD << 1;
10579 for (
const auto *MI : RD->
methods()) {
10580 if (MI->isVirtual()) {
10582 Diag(MLoc, diag::note_nontrivial_has_virtual) << RD << 0;
10587 llvm_unreachable(
"dynamic class with no vbases and no virtual functions");
10595struct FindHiddenVirtualMethod {
10603 static bool CheckMostOverridenMethods(
10605 const llvm::SmallPtrSetImpl<const CXXMethodDecl *> &Methods) {
10609 if (CheckMostOverridenMethods(O, Methods))
10619 auto *BaseRecord = Specifier->getType()->castAsRecordDecl();
10623 bool foundSameNameMethod =
false;
10625 for (Path.
Decls = BaseRecord->lookup(Name).begin();
10630 foundSameNameMethod =
true;
10647 if (!CheckMostOverridenMethods(MD, OverridenAndUsingBaseMethods))
10648 overloadedMethods.push_back(MD);
10652 if (foundSameNameMethod)
10653 OverloadedMethods.append(overloadedMethods.begin(),
10654 overloadedMethods.end());
10655 return foundSameNameMethod;
10662 llvm::SmallPtrSetImpl<const CXXMethodDecl *>& Methods) {
10678 FindHiddenVirtualMethod FHVM;
10687 ND = shad->getTargetDecl();
10693 OverloadedMethods = FHVM.OverloadedMethods;
10698 for (
const CXXMethodDecl *overloadedMD : OverloadedMethods) {
10700 diag::note_hidden_overloaded_virtual_declared_here) << overloadedMD;
10702 Diag(overloadedMD->getLocation(), PD);
10715 if (!OverloadedMethods.empty()) {
10717 << MD << (OverloadedMethods.size() > 1);
10724 auto PrintDiagAndRemoveAttr = [&](
unsigned N) {
10727 Diag(RD.
getAttr<TrivialABIAttr>()->getLocation(),
10728 diag::ext_cannot_use_trivial_abi) << &RD;
10729 Diag(RD.
getAttr<TrivialABIAttr>()->getLocation(),
10730 diag::note_cannot_use_trivial_abi_reason) << &RD << N;
10737 PrintDiagAndRemoveAttr(1);
10741 for (
const auto &B : RD.
bases()) {
10744 if (!B.getType()->isDependentType() &&
10745 !B.getType()->getAsCXXRecordDecl()->canPassInRegisters()) {
10746 PrintDiagAndRemoveAttr(2);
10750 if (B.isVirtual()) {
10751 PrintDiagAndRemoveAttr(3);
10756 for (
const auto *FD : RD.
fields()) {
10761 PrintDiagAndRemoveAttr(4);
10767 PrintDiagAndRemoveAttr(6);
10771 if (
const auto *RT =
10773 if (!RT->isDependentType() &&
10775 ->canPassInRegisters()) {
10776 PrintDiagAndRemoveAttr(5);
10785 auto HasNonDeletedCopyOrMoveConstructor = [&]() {
10797 if (CD->isCopyOrMoveConstructor() && !CD->isDeleted())
10802 if (!HasNonDeletedCopyOrMoveConstructor()) {
10803 PrintDiagAndRemoveAttr(0);
10811 diag::err_incomplete_type_vtable_pointer_auth))
10819 assert(PrimaryBase);
10822 if (!BasePtr.getType()->getAsCXXRecordDecl()->isDynamicClass())
10824 Base = BasePtr.getType()->getAsCXXRecordDecl();
10827 if (!
Base ||
Base == PrimaryBase || !
Base->isPolymorphic())
10829 Diag(RD.
getAttr<VTablePointerAuthenticationAttr>()->getLocation(),
10830 diag::err_non_top_level_vtable_pointer_auth)
10832 PrimaryBase =
Base;
10836 Diag(RD.
getAttr<VTablePointerAuthenticationAttr>()->getLocation(),
10837 diag::err_non_polymorphic_vtable_pointer_auth)
10850 if (AL.getKind() != ParsedAttr::AT_Visibility)
10853 Diag(AL.getLoc(), diag::warn_attribute_after_definition_ignored) << AL;
10861 LBrac, RBrac, AttrList);
10883 Spaceships.clear();
10889 Spaceships.push_back(FD);
10898 if (
auto *FD = dyn_cast<FunctionDecl>(ND))
10899 if (FD->isExplicitlyDefaulted())
10900 Spaceships.push_back(FD);
10930 else if (
Context.getTargetInfo().getCXXABI().isMicrosoft() &&
10995 DefaultedSpaceships);
10996 for (
auto *FD : DefaultedSpaceships)
11003 llvm::function_ref<
Scope *()> EnterScope) {
11011 DeclContext *LookupDC = dyn_cast<DeclContext>(D);
11015 ParameterLists.push_back(TPL);
11019 ParameterLists.push_back(FTD->getTemplateParameters());
11020 }
else if (
VarDecl *VD = dyn_cast<VarDecl>(D)) {
11024 ParameterLists.push_back(VTD->getTemplateParameters());
11025 else if (
auto *PSD = dyn_cast<VarTemplatePartialSpecializationDecl>(D))
11026 ParameterLists.push_back(PSD->getTemplateParameters());
11028 }
else if (
TagDecl *TD = dyn_cast<TagDecl>(D)) {
11030 ParameterLists.push_back(TPL);
11034 ParameterLists.push_back(CTD->getTemplateParameters());
11035 else if (
auto *PSD = dyn_cast<ClassTemplatePartialSpecializationDecl>(D))
11036 ParameterLists.push_back(PSD->getTemplateParameters());
11041 unsigned Count = 0;
11042 Scope *InnermostTemplateScope =
nullptr;
11046 if (Params->size() == 0)
11049 InnermostTemplateScope = EnterScope();
11051 if (Param->getDeclName()) {
11052 InnermostTemplateScope->
AddDecl(Param);
11060 if (InnermostTemplateScope) {
11061 assert(LookupDC &&
"no enclosing DeclContext for template lookup");
11069 if (!RecordD)
return;
11076 if (!RecordD)
return;
11085 if (Param->getDeclName())
11104 if (Param->getDeclName())
11124 if (!
Method->isInvalidDecl())
11133 bool DiagOccurred =
false;
11135 [DiagID, &S, &DiagOccurred](
DeclSpec::TQ, StringRef QualName,
11142 DiagOccurred =
true;
11160 S.
Diag(PointerLoc, diag::err_invalid_ctor_dtor_decl)
11228 = dyn_cast<CXXRecordDecl>(
Constructor->getDeclContext());
11239 !
Constructor->isFunctionTemplateSpecialization()) {
11241 Constructor->getParamDecl(0)->getType()->getCanonicalTypeUnqualified();
11243 if (ParamType == ClassTy) {
11245 const char *ConstRef
11246 =
Constructor->getParamDecl(0)->getIdentifier() ?
"const &"
11248 Diag(ParamLoc, diag::err_constructor_byvalue_arg)
11270 Context.DeclarationNames.getCXXOperatorName(OO_Delete);
11273 Loc, RD,
true,
false, Name)) {
11274 Expr *ThisArg =
nullptr;
11279 if (OperatorDelete->isDestroyingOperatorDelete()) {
11280 unsigned AddressParamIndex = 0;
11281 if (OperatorDelete->isTypeAwareOperatorNewOrDelete())
11282 ++AddressParamIndex;
11284 OperatorDelete->getParamDecl(AddressParamIndex)->getType();
11291 OperatorDelete->getParamDecl(AddressParamIndex)->getLocation());
11292 assert(!
This.isInvalid() &&
"couldn't form 'this' expr in dtor?");
11295 if (
This.isInvalid()) {
11298 Diag(Loc, diag::note_implicit_delete_this_in_destructor_here);
11301 ThisArg =
This.get();
11307 Destructor->setOperatorDelete(OperatorDelete, ThisArg);
11310 Context.getTargetInfo().callGlobalDeleteInDeletingDtor(
11322 if (GlobalOperatorDelete) {
11324 Destructor->setOperatorGlobalDelete(GlobalOperatorDelete);
11328 if (
Context.getTargetInfo().emitVectorDeletingDtors(
11330 bool DestructorIsExported =
Destructor->hasAttr<DLLExportAttr>();
11333 Context.DeclarationNames.getCXXOperatorName(OO_Array_Delete);
11336 false, VDeleteName);
11342 Destructor->setGlobalOperatorArrayDelete(GlobalArrOperatorDelete);
11343 if (GlobalArrOperatorDelete &&
11344 (
Context.classMaybeNeedsVectorDeletingDestructor(RD) ||
11345 DestructorIsExported))
11347 }
else if (!ArrOperatorDelete) {
11350 true, VDeleteName);
11352 Destructor->setOperatorArrayDelete(ArrOperatorDelete);
11353 if (ArrOperatorDelete &&
11354 (
Context.classMaybeNeedsVectorDeletingDestructor(RD) ||
11355 DestructorIsExported))
11374 << DeclaratorType << isa<TypeAliasDecl>(TT->getDecl());
11375 else if (
const TemplateSpecializationType *TST =
11376 DeclaratorType->
getAs<TemplateSpecializationType>())
11377 if (TST->isTypeAlias())
11379 << DeclaratorType << 1;
11469 if (R.getEnd().isInvalid())
11470 R.setEnd(Before.
getEnd());
11474 if (After.isInvalid())
11476 if (R.getBegin().isInvalid())
11477 R.setBegin(After.getBegin());
11478 R.setEnd(After.getEnd());
11527 unsigned NumParam = Proto->getNumParams();
11531 if (NumParam == 1) {
11533 if (
const auto *
First =
11534 dyn_cast_if_present<ParmVarDecl>(FTI.
Params[0].
Param);
11535 First &&
First->isExplicitObjectParameter())
11539 if (NumParam != 0) {
11544 }
else if (Proto->isVariadic()) {
11551 if (Proto->getReturnType() != ConvType) {
11552 bool NeedsTypedef =
false;
11556 bool PastFunctionChunk =
false;
11558 switch (Chunk.Kind) {
11560 if (!PastFunctionChunk) {
11561 if (Chunk.Fun.HasTrailingReturnType) {
11566 PastFunctionChunk =
true;
11571 NeedsTypedef =
true;
11591 After.isValid() ? After.getBegin() :
11593 auto &&DB =
Diag(Loc, diag::err_conv_function_with_complex_decl);
11594 DB << Before << After;
11596 if (!NeedsTypedef) {
11600 if (After.isInvalid() && ConvTSI) {
11608 }
else if (!Proto->getReturnType()->isDependentType()) {
11609 DB << 1 << Proto->getReturnType();
11611 DB << 2 << Proto->getReturnType();
11622 ConvType = Proto->getReturnType();
11630 ConvType =
Context.getPointerType(ConvType);
11634 ConvType =
Context.getPointerType(ConvType);
11642 R =
Context.getFunctionType(ConvType, {}, Proto->getExtProtoInfo());
11648 ? diag::warn_cxx98_compat_explicit_conversion_functions
11649 : diag::ext_explicit_conversion_functions)
11654 assert(Conversion &&
"Expected to receive a conversion function declaration");
11675 ConvType =
Context.getCanonicalType(ConvType).getUnqualifiedType();
11676 if (ConvType == ClassType)
11681 << ClassType << ConvType;
11684 << ClassType << ConvType;
11695 << ConvType->
castAs<AutoType>()->getKeyword()
11699 return ConversionTemplate;
11724 for (
unsigned Idx = 0; Idx < FTI.
NumParams; Idx++) {
11725 const auto &ParamInfo = FTI.
Params[Idx];
11726 if (!ParamInfo.Param)
11729 if (!Param->isExplicitObjectParameter())
11732 ExplicitObjectParam = Param;
11735 Diag(Param->getLocation(),
11736 diag::err_explicit_object_parameter_must_be_first)
11737 << IsLambda << Param->getSourceRange();
11740 if (!ExplicitObjectParam)
11745 diag::err_explicit_object_default_arg)
11754 diag::err_explicit_object_parameter_nonmember)
11761 diag::err_explicit_object_parameter_nonmember)
11786 !isa_and_present<CXXRecordDecl>(
11789 diag::err_explicit_object_parameter_nonmember)
11796 diag::err_explicit_object_parameter_mutable)
11804 assert(D.
isInvalidType() &&
"Explicit object parameter in non-member "
11805 "should have been diagnosed already");
11813 diag::err_explicit_object_parameter_constructor)
11823struct BadSpecifierDiagnoser {
11826 ~BadSpecifierDiagnoser() {
11830 template<
typename T>
void check(SourceLocation SpecLoc,
T Spec) {
11834 return check(SpecLoc,
11837 void check(SourceLocation SpecLoc,
const char *Spec) {
11839 Diagnostic << SourceRange(SpecLoc, SpecLoc);
11840 if (!Specifiers.empty()) Specifiers +=
" ";
11841 Specifiers += Spec;
11845 Sema::SemaDiagnosticBuilder Diagnostic;
11846 std::string Specifiers;
11854 assert(GuidedTemplateDecl &&
"missing template decl for deduction guide");
11859 if (!
CurContext->getRedeclContext()->Equals(
11862 << GuidedTemplateDecl;
11868 if (DS.hasTypeSpecifier() || DS.getTypeQualifiers() ||
11869 DS.getStorageClassSpecLoc().isValid() || DS.isInlineSpecified() ||
11870 DS.isNoreturnSpecified() || DS.hasConstexprSpecifier()) {
11871 BadSpecifierDiagnoser Diagnoser(
11873 diag::err_deduction_guide_invalid_specifier);
11875 Diagnoser.check(DS.getStorageClassSpecLoc(), DS.getStorageClassSpec());
11876 DS.ClearStorageClassSpecs();
11880 Diagnoser.check(DS.getInlineSpecLoc(),
"inline");
11881 Diagnoser.check(DS.getNoreturnSpecLoc(),
"_Noreturn");
11882 Diagnoser.check(DS.getConstexprSpecLoc(),
"constexpr");
11883 DS.ClearConstexprSpec();
11885 Diagnoser.check(DS.getConstSpecLoc(),
"const");
11886 Diagnoser.check(DS.getRestrictSpecLoc(),
"__restrict");
11887 Diagnoser.check(DS.getVolatileSpecLoc(),
"volatile");
11888 Diagnoser.check(DS.getAtomicSpecLoc(),
"_Atomic");
11889 Diagnoser.check(DS.getUnalignedSpecLoc(),
"__unaligned");
11890 DS.ClearTypeQualifiers();
11892 Diagnoser.check(DS.getTypeSpecComplexLoc(), DS.getTypeSpecComplex());
11893 Diagnoser.check(DS.getTypeSpecSignLoc(), DS.getTypeSpecSign());
11894 Diagnoser.check(DS.getTypeSpecWidthLoc(), DS.getTypeSpecWidth());
11895 Diagnoser.check(DS.getTypeSpecTypeLoc(), DS.getTypeSpecType());
11896 DS.ClearTypeSpecType();
11903 bool FoundFunction =
false;
11909 diag::err_deduction_guide_with_complex_decl)
11913 if (!Chunk.Fun.hasTrailingReturnType())
11915 diag::err_deduction_guide_no_trailing_return_type);
11920 ParsedType TrailingReturnType = Chunk.Fun.getTrailingReturnType();
11923 assert(TSI &&
"deduction guide has valid type but invalid return type?");
11924 bool AcceptableReturnType =
false;
11925 bool MightInstantiateToSpecialization =
false;
11928 TemplateName SpecifiedName = RetTST.getTypePtr()->getTemplateName();
11929 bool TemplateMatches =
Context.hasSameTemplateName(
11930 SpecifiedName, GuidedTemplate,
true);
11938 if (SimplyWritten && TemplateMatches)
11939 AcceptableReturnType =
true;
11944 MightInstantiateToSpecialization =
11948 MightInstantiateToSpecialization =
true;
11951 if (!AcceptableReturnType)
11953 diag::err_deduction_guide_bad_trailing_return_type)
11954 << GuidedTemplate << TSI->
getType()
11955 << MightInstantiateToSpecialization
11960 FoundFunction =
true;
11979 assert(*IsInline != PrevNS->
isInline());
11989 S.
Diag(Loc, diag::warn_inline_namespace_reopened_noninline)
11992 S.
Diag(Loc, diag::err_inline_namespace_mismatch);
12010 bool IsInline = InlineLoc.
isValid();
12011 bool IsInvalid =
false;
12012 bool IsStd =
false;
12013 bool AddToKnown =
false;
12024 auto DiagnoseInlineStdNS = [&]() {
12025 assert(IsInline && II->
isStr(
"std") &&
12026 CurContext->getRedeclContext()->isTranslationUnit() &&
12027 "Precondition of DiagnoseInlineStdNS not met");
12028 Diag(InlineLoc, diag::err_inline_namespace_std)
12047 R.isSingleResult() ? R.getRepresentativeDecl() :
nullptr;
12048 PrevNS = dyn_cast_or_null<NamespaceDecl>(PrevDecl);
12052 if (IsInline && II->
isStr(
"std") &&
12053 CurContext->getRedeclContext()->isTranslationUnit())
12054 DiagnoseInlineStdNS();
12055 else if (IsInline != PrevNS->
isInline())
12057 &IsInline, PrevNS);
12058 }
else if (PrevDecl) {
12060 Diag(Loc, diag::err_redefinition_different_kind)
12065 }
else if (II->
isStr(
"std") &&
12066 CurContext->getRedeclContext()->isTranslationUnit()) {
12068 DiagnoseInlineStdNS();
12073 AddToKnown = !IsInline;
12076 AddToKnown = !IsInline;
12090 if (PrevNS && IsInline != PrevNS->
isInline())
12092 &IsInline, PrevNS);
12105 if (
const VisibilityAttr *
Attr = Namespc->
getAttr<VisibilityAttr>())
12111 KnownNamespaces[Namespc] =
false;
12119 TU->setAnonymousNamespace(Namespc);
12171 return dyn_cast_or_null<NamespaceDecl>(D);
12175 NamespaceDecl *Namespc = dyn_cast_or_null<NamespaceDecl>(Dcl);
12176 assert(Namespc &&
"Invalid parameter, expected NamespaceDecl");
12179 if (Namespc->
hasAttr<VisibilityAttr>())
12182 if (DeferredExportedNamespaces.erase(Namespc))
12187 return cast_or_null<CXXRecordDecl>(
12196 return cast_or_null<NamespaceDecl>(
12202enum UnsupportedSTLSelect {
12209struct InvalidSTLDiagnoser {
12214 QualType operator()(UnsupportedSTLSelect Sel = USS_Other, StringRef Name =
"",
12215 const VarDecl *VD =
nullptr) {
12217 auto D = S.
Diag(Loc, diag::err_std_compare_type_not_supported)
12218 << TyForDiags << ((
int)Sel);
12219 if (Sel == USS_InvalidMember || Sel == USS_MissingMember) {
12220 assert(!Name.empty());
12224 if (Sel == USS_InvalidMember) {
12237 "Looking for comparison category type outside of C++.");
12252 if (Info && FullyCheckedComparisonCategories[
static_cast<unsigned>(Kind)]) {
12263 std::string NameForDiags =
"std::";
12265 Diag(Loc, diag::err_implied_comparison_category_type_not_found)
12266 << NameForDiags << (int)Usage;
12270 assert(Info->
Kind == Kind);
12281 InvalidSTLDiagnoser UnsupportedSTLError{*
this, Loc, TyForDiags(Info)};
12284 return UnsupportedSTLError(USS_NonTrivial);
12289 if (
Base->isEmpty())
12292 return UnsupportedSTLError();
12300 if (std::distance(FIt, FEnd) != 1 ||
12301 !FIt->getType()->isIntegralOrEnumerationType()) {
12302 return UnsupportedSTLError();
12312 return UnsupportedSTLError(USS_MissingMember, MemName);
12315 assert(VD &&
"should not be null!");
12322 return UnsupportedSTLError(USS_InvalidMember, MemName, VD);
12328 return UnsupportedSTLError();
12335 FullyCheckedComparisonCategories[
static_cast<unsigned>(Kind)] =
true;
12345 &
PP.getIdentifierTable().get(
"std"),
12358 const char *ClassName,
12360 const Decl **MalformedDecl) {
12368 auto ReportMatchingNameAsMalformed = [&](
NamedDecl *D) {
12369 if (!MalformedDecl)
12377 *MalformedDecl = D;
12382 if (
const TemplateSpecializationType *TST =
12384 Template = dyn_cast_or_null<ClassTemplateDecl>(
12385 TST->getTemplateName().getAsTemplateDecl());
12386 Arguments = TST->template_arguments();
12387 }
else if (
const auto *TT = SugaredType->
getAs<TagType>()) {
12389 Arguments = TT->getTemplateArgs(S.
Context);
12393 ReportMatchingNameAsMalformed(SugaredType->
getAsTagDecl());
12397 if (!*CachedDecl) {
12416 *MalformedDecl = TemplateClass;
12424 if (
Template->getCanonicalDecl() != (*CachedDecl)->getCanonicalDecl())
12429 QualType ArgType = Arguments[0].getAsType();
12435 if (S.
getLangOpts().ObjCAutoRefCount && ArgType->isObjCLifetimeType() &&
12436 !ArgType.getObjCLifetime()) {
12441 *TypeArg = ArgType;
12449 "Looking for std::initializer_list outside of C++.");
12459 const Decl **MalformedDecl) {
12461 "Looking for std::type_identity outside of C++.");
12471 const char *ClassName,
12472 bool *WasMalformed) {
12483 Result.suppressDiagnostics();
12486 S.
Diag(
Found->getLocation(), diag::err_malformed_std_class_template)
12489 *WasMalformed =
true;
12498 S.
Diag(
Template->getLocation(), diag::err_malformed_std_class_template)
12501 *WasMalformed =
true;
12516 Loc, Args,
nullptr,
12522 bool WasMalformed =
false;
12527 Diag(Loc, diag::err_implied_std_initializer_list_not_found);
12555 ArgType = RT->getPointeeType().getUnqualifiedType();
12564 case Decl::TranslationUnit:
12566 case Decl::LinkageSpec:
12576class NamespaceValidatorCCC final :
public CorrectionCandidateCallback {
12578 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
12584 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
12585 return std::make_unique<NamespaceValidatorCCC>(*
this);
12594 Module *M = ND->getOwningModule();
12595 assert(M &&
"hidden namespace definition not in a module?");
12599 diag::err_module_unimported_use_header)
12604 diag::err_module_unimported_use)
12614 NamespaceValidatorCCC CCC{};
12616 S.
CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), Sc, &SS, CCC,
12624 if (isa_and_nonnull<NamespaceDecl>(Corrected.getFoundDecl()) &&
12625 Corrected.requiresImport()) {
12628 std::string CorrectedStr(Corrected.getAsString(S.
getLangOpts()));
12629 bool DroppedSpecifier =
12630 Corrected.WillReplaceSpecifier() && Ident->
getName() == CorrectedStr;
12632 S.
PDiag(diag::err_using_directive_member_suggest)
12633 << Ident << DC << DroppedSpecifier << SS.
getRange(),
12634 S.
PDiag(diag::note_namespace_defined_here));
12637 S.
PDiag(diag::err_using_directive_suggest) << Ident,
12638 S.
PDiag(diag::note_namespace_defined_here));
12640 R.addDecl(Corrected.getFoundDecl());
12651 assert(!SS.
isInvalid() &&
"Invalid CXXScopeSpec.");
12652 assert(NamespcName &&
"Invalid NamespcName.");
12653 assert(IdentLoc.
isValid() &&
"Invalid NamespceName location.");
12664 if (R.isAmbiguous())
12673 NamespcName->
isStr(
"std")) {
12674 Diag(IdentLoc, diag::ext_using_undefined_std);
12684 NamedDecl *Named = R.getRepresentativeDecl();
12686 assert(
NS &&
"expected namespace decl");
12705 CommonAncestor = CommonAncestor->
getParent();
12709 IdentLoc, Named, CommonAncestor);
12713 Diag(IdentLoc, diag::warn_using_directive_in_header);
12718 Diag(IdentLoc, diag::err_expected_namespace_name) << SS.
getRange();
12768 ? diag::warn_cxx98_compat_using_decl_constructor
12769 : diag::err_using_decl_constructor)
12786 llvm_unreachable(
"cannot parse qualified deduction guide name");
12797 ? diag::err_access_decl
12798 : diag::warn_access_decl_deprecated)
12809 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
12817 SS, TargetNameInfo, EllipsisLoc, AttrList,
12836 ? diag::err_using_enum_is_dependent
12837 : diag::err_unknown_typename)
12845 Diag(IdentLoc, diag::err_using_enum_is_dependent);
12851 Diag(IdentLoc, diag::err_using_enum_not_enum) << EnumTy;
12855 if (TSI ==
nullptr)
12856 TSI =
Context.getTrivialTypeSourceInfo(EnumTy, IdentLoc);
12877 return Context.hasSameType(TD1->getUnderlyingType(),
12878 TD2->getUnderlyingType());
12912 if (
auto *Using = dyn_cast<UsingDecl>(BUD)) {
12924 Diag(Using->getLocation(),
12925 diag::err_using_decl_nested_name_specifier_is_current_class)
12926 << Using->getQualifierLoc().getSourceRange();
12928 Using->setInvalidDecl();
12932 Diag(Using->getQualifierLoc().getBeginLoc(),
12933 diag::err_using_decl_nested_name_specifier_is_not_base_class)
12935 << Using->getQualifierLoc().getSourceRange();
12937 Using->setInvalidDecl();
12942 if (
Previous.empty())
return false;
12953 NamedDecl *NonTag =
nullptr, *Tag =
nullptr;
12954 bool FoundEquivalentDecl =
false;
12956 NamedDecl *D = Element->getUnderlyingDecl();
12963 if (
auto *RD = dyn_cast<CXXRecordDecl>(D)) {
12978 PrevShadow = Shadow;
12979 FoundEquivalentDecl =
true;
12983 FoundEquivalentDecl =
true;
12990 if (FoundEquivalentDecl)
12996 (isa_and_nonnull<UnresolvedUsingIfExistsDecl>(NonTag))) {
12997 if (!NonTag && !Tag)
13000 Diag(
Target->getLocation(), diag::note_using_decl_target);
13001 Diag((NonTag ? NonTag : Tag)->getLocation(),
13002 diag::note_using_decl_conflict);
13031 Diag(
Target->getLocation(), diag::note_using_decl_target);
13041 if (!Tag)
return false;
13044 Diag(
Target->getLocation(), diag::note_using_decl_target);
13045 Diag(Tag->getLocation(), diag::note_using_decl_conflict);
13051 if (!NonTag)
return false;
13054 Diag(
Target->getLocation(), diag::note_using_decl_target);
13064 for (
auto &B : Derived->
bases())
13065 if (B.getType()->getAsCXXRecordDecl() ==
Base)
13066 return B.isVirtual();
13067 llvm_unreachable(
"not a direct base class");
13081 if (
auto *TargetTD = dyn_cast<TemplateDecl>(
Target))
13082 NonTemplateTarget = TargetTD->getTemplatedDecl();
13087 bool IsVirtualBase =
13089 Using->getQualifier().getAsRecordDecl());
13137 bool &AnyDependentBases) {
13141 CanQualType BaseType =
Base.getType()->getCanonicalTypeUnqualified();
13142 if (CanonicalDesiredBase == BaseType)
13144 if (BaseType->isDependentType())
13145 AnyDependentBases =
true;
13151class UsingValidatorCCC final :
public CorrectionCandidateCallback {
13153 UsingValidatorCCC(
bool HasTypenameKeyword,
bool IsInstantiation,
13154 NestedNameSpecifier NNS, CXXRecordDecl *RequireMemberOf)
13155 : HasTypenameKeyword(HasTypenameKeyword),
13156 IsInstantiation(IsInstantiation), OldNNS(NNS),
13157 RequireMemberOf(RequireMemberOf) {}
13159 bool ValidateCandidate(
const TypoCorrection &Candidate)
override {
13173 if (RequireMemberOf) {
13174 auto *FoundRecord = dyn_cast<CXXRecordDecl>(ND);
13175 if (FoundRecord && FoundRecord->isInjectedClassName()) {
13189 if (
Specifier.getKind() != NestedNameSpecifier::Kind::Type ||
13195 bool AnyDependentBases =
false;
13198 AnyDependentBases) &&
13199 !AnyDependentBases)
13209 auto *FoundRecord = dyn_cast<CXXRecordDecl>(ND);
13210 if (FoundRecord && FoundRecord->isInjectedClassName())
13215 return HasTypenameKeyword || !IsInstantiation;
13217 return !HasTypenameKeyword;
13220 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
13221 return std::make_unique<UsingValidatorCCC>(*
this);
13225 bool HasTypenameKeyword;
13226 bool IsInstantiation;
13227 NestedNameSpecifier OldNNS;
13228 CXXRecordDecl *RequireMemberOf;
13255 bool IsUsingIfExists) {
13256 assert(!SS.
isInvalid() &&
"Invalid CXXScopeSpec.");
13258 assert(IdentLoc.
isValid() &&
"Invalid TargetName location.");
13267 if (
auto *RD = dyn_cast<CXXRecordDecl>(
CurContext))
13268 UsingName.
setName(
Context.DeclarationNames.getCXXConstructorName(
13269 Context.getCanonicalTagType(RD)));
13280 assert(IsInstantiation &&
"no scope in non-instantiation");
13308 Diag(UsingLoc, diag::err_using_if_exists_on_ctor);
13314 if (!LookupContext || EllipsisLoc.
isValid()) {
13318 SS, NameInfo, IdentLoc))
13322 Previous.getFoundDecl()->isTemplateParameter())
13325 if (HasTypenameKeyword) {
13328 UsingLoc, TypenameLoc,
13330 IdentLoc, NameInfo.
getName(),
13334 QualifierLoc, NameInfo, EllipsisLoc);
13342 auto Build = [&](
bool Invalid) {
13345 UsingName, HasTypenameKeyword);
13352 auto BuildInvalid = [&]{
return Build(
true); };
13353 auto BuildValid = [&]{
return Build(
false); };
13356 return BuildInvalid();
13365 if (!IsInstantiation)
13366 R.setHideTags(
false);
13371 R.setBaseObjectType(
13382 if (R.empty() && IsUsingIfExists)
13400 PP.NeedsStdLibCxxWorkaroundBefore(2016'12'21) &&
13403 UsingValidatorCCC CCC(HasTypenameKeyword, IsInstantiation, SS.
getScopeRep(),
13406 CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), S, &SS, CCC,
13411 << NameInfo.
getName() << LookupContext << 0
13416 NamedDecl *ND = Corrected.getCorrectionDecl();
13418 return BuildInvalid();
13421 auto *RD = dyn_cast<CXXRecordDecl>(ND);
13427 if (Corrected.WillReplaceSpecifier()) {
13431 QualifierLoc = Builder.getWithLocInContext(
Context);
13437 UsingName.
setName(
Context.DeclarationNames.getCXXConstructorName(
13438 Context.getCanonicalTagType(CurClass)));
13450 Diag(IdentLoc, diag::err_no_member)
13452 return BuildInvalid();
13456 if (R.isAmbiguous())
13457 return BuildInvalid();
13459 if (HasTypenameKeyword) {
13463 Diag(IdentLoc, diag::err_using_typename_non_type);
13466 diag::note_using_decl_target);
13467 return BuildInvalid();
13473 if (IsInstantiation && R.getAsSingle<
TypeDecl>()) {
13474 Diag(IdentLoc, diag::err_using_dependent_value_is_type);
13475 Diag(R.getFoundDecl()->getLocation(), diag::note_using_decl_target);
13476 return BuildInvalid();
13483 Diag(IdentLoc, diag::err_using_decl_can_not_refer_to_namespace)
13488 return BuildInvalid();
13498 R.suppressDiagnostics();
13520 if (
CurContext->getRedeclContext()->isRecord()) {
13530 if (UED->getEnumDecl() == ED) {
13531 Diag(UsingLoc, diag::err_using_enum_decl_redeclaration)
13543 EnumLoc, NameLoc, EnumType);
13576 UPD->setAccess(InstantiatedFrom->
getAccess());
13582 assert(!UD->
hasTypename() &&
"expecting a constructor name");
13588 bool AnyDependentBases =
false;
13591 if (!
Base && !AnyDependentBases) {
13592 Diag(UD->
getUsingLoc(), diag::err_using_decl_constructor_not_in_direct_base)
13599 Base->setInheritConstructors();
13605 bool HasTypenameKeyword,
13618 if (!
CurContext->getRedeclContext()->isRecord()) {
13625 for (
auto *D : Prev) {
13627 bool OldCouldBeEnumerator =
13630 OldCouldBeEnumerator ? diag::err_redefinition
13631 : diag::err_redefinition_different_kind)
13632 << Prev.getLookupName();
13645 if (
const auto *UD = dyn_cast<UsingDecl>(D)) {
13646 DTypename = UD->hasTypename();
13647 DQual = UD->getQualifier();
13648 }
else if (
const auto *UD = dyn_cast<UnresolvedUsingValueDecl>(D)) {
13650 DQual = UD->getQualifier();
13651 }
else if (
const auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(D)) {
13653 DQual = UD->getQualifier();
13659 if (HasTypenameKeyword != DTypename)
continue;
13667 Diag(NameLoc, diag::err_using_decl_redeclaration) << SS.
getRange();
13681 assert(
bool(NamedContext) == (R || UD) && !(R && UD) &&
13682 "resolvable context must have exactly one set of decls");
13686 bool Cxx20Enumerator =
false;
13687 if (NamedContext) {
13696 if (
auto *ED = dyn_cast<EnumDecl>(NamedContext)) {
13700 if (EC && R && ED->isScoped())
13703 ? diag::warn_cxx17_compat_using_decl_scoped_enumerator
13704 : diag::ext_using_decl_scoped_enumerator)
13708 NamedContext = ED->getDeclContext();
13728 ? diag::warn_cxx17_compat_using_decl_class_member_enumerator
13729 : diag::err_using_decl_can_not_refer_to_class_member)
13732 if (Cxx20Enumerator)
13735 auto *RD = NamedContext
13744 }
else if (R->getAsSingle<
TypeDecl>()) {
13747 Diag(SS.
getBeginLoc(), diag::note_using_decl_class_member_workaround)
13748 << diag::MemClassWorkaround::AliasDecl
13755 Diag(InsertLoc, diag::note_using_decl_class_member_workaround)
13756 << diag::MemClassWorkaround::TypedefDecl
13761 }
else if (R->getAsSingle<
VarDecl>()) {
13771 Diag(UsingLoc, diag::note_using_decl_class_member_workaround)
13772 << diag::MemClassWorkaround::ReferenceDecl << FixIt;
13785 Diag(UsingLoc, diag::note_using_decl_class_member_workaround)
13787 ? diag::MemClassWorkaround::ConstexprVar
13788 : diag::MemClassWorkaround::ConstVar)
13797 if (!NamedContext) {
13813 ? diag::warn_cxx17_compat_using_decl_non_member_enumerator
13814 : diag::err_using_decl_nested_name_specifier_is_not_class)
13817 if (Cxx20Enumerator)
13838 if (Cxx20Enumerator) {
13839 Diag(NameLoc, diag::warn_cxx17_compat_using_decl_non_member_enumerator)
13846 diag::err_using_decl_nested_name_specifier_is_current_class)
13853 diag::err_using_decl_nested_name_specifier_is_not_base_class)
13869 if (
Type.isInvalid())
13888 TemplateParamLists.size()
13895 Previous.getFoundDecl()->isTemplateParameter()) {
13901 "name in alias declaration must be an identifier");
13924 if (TemplateParamLists.size()) {
13929 if (TemplateParamLists.size() != 1) {
13930 Diag(UsingLoc, diag::err_alias_template_extra_headers)
13931 <<
SourceRange(TemplateParamLists[1]->getTemplateLoc(),
13932 TemplateParamLists[TemplateParamLists.size()-1]->getRAngleLoc());
13936 auto It = llvm::find_if(
13937 llvm::reverse(TemplateParamLists),
13939 assert(It != TemplateParamLists.rend() &&
13940 "if all template parameter lists were empty, this should have "
13941 "been rejected as an explicit specialization");
13942 TemplateParams = *It;
13957 Diag(UsingLoc, diag::err_redefinition_different_kind)
13972 OldTemplateParams =
14008 else if (OldDecl) {
14015 if (
auto *TD = dyn_cast_or_null<TagDecl>(DeclFromDeclSpec)) {
14038 if (R.isAmbiguous())
14043 Diag(IdentLoc, diag::err_expected_namespace_name) << SS.
getRange();
14047 assert(!R.isAmbiguous() && !R.empty());
14075 Diag(AliasLoc, diag::err_redefinition_different_namespace_alias)
14077 Diag(AD->getLocation(), diag::note_previous_namespace_alias)
14078 << AD->getNamespace();
14083 ? diag::err_redefinition
14084 : diag::err_redefinition_different_kind;
14085 Diag(AliasLoc, DiagID) << Alias;
14106struct SpecialMemberExceptionSpecInfo
14107 : SpecialMemberVisitor<SpecialMemberExceptionSpecInfo> {
14115 : SpecialMemberVisitor(S, MD, CSM, ICI), Loc(Loc), ExceptSpec(S) {}
14120 void visitClassSubobject(
CXXRecordDecl *Class, Subobject Subobj,
14123 void visitSubobjectCall(Subobject Subobj,
14128bool SpecialMemberExceptionSpecInfo::visitBase(CXXBaseSpecifier *Base) {
14129 auto *BaseClass =
Base->getType()->getAsCXXRecordDecl();
14133 Sema::SpecialMemberOverloadResult SMOR = lookupInheritedCtor(BaseClass);
14134 if (
auto *BaseCtor = SMOR.
getMethod()) {
14135 visitSubobjectCall(Base, BaseCtor);
14139 visitClassSubobject(BaseClass, Base, 0);
14143bool SpecialMemberExceptionSpecInfo::visitField(FieldDecl *FD) {
14144 if (CSM == CXXSpecialMemberKind::DefaultConstructor &&
14163void SpecialMemberExceptionSpecInfo::visitClassSubobject(CXXRecordDecl *
Class,
14166 FieldDecl *
Field = Subobj.dyn_cast<FieldDecl*>();
14167 bool IsMutable =
Field &&
Field->isMutable();
14168 visitSubobjectCall(Subobj, lookupIn(
Class, Quals, IsMutable));
14171void SpecialMemberExceptionSpecInfo::visitSubobjectCall(
14172 Subobject Subobj, Sema::SpecialMemberOverloadResult SMOR) {
14175 if (CXXMethodDecl *MD = SMOR.
getMethod())
14176 ExceptSpec.
CalledDecl(getSubobjectLoc(Subobj), MD);
14205 ComputingExceptionSpec CES(S, MD, Loc);
14212 SpecialMemberExceptionSpecInfo Info(S, MD, CSM, ICI, MD->
getLocation());
14214 return Info.ExceptSpec;
14221 diag::err_exception_spec_incomplete_type))
14222 return Info.ExceptSpec;
14239 Info.visit(Info.IsConstructor ? Info.VisitPotentiallyConstructedBases
14240 : Info.VisitAllBases);
14242 return Info.ExceptSpec;
14247struct DeclaringSpecialMember {
14250 Sema::ContextRAII SavedContext;
14251 bool WasAlreadyBeingDeclared;
14254 : S(S), D(RD, CSM), SavedContext(S, RD) {
14256 if (WasAlreadyBeingDeclared)
14263 Sema::CodeSynthesisContext Ctx;
14264 Ctx.Kind = Sema::CodeSynthesisContext::DeclaringSpecialMember;
14271 Ctx.PointOfInstantiation = RD->getLocation();
14273 Ctx.SpecialMember = CSM;
14274 S.pushCodeSynthesisContext(Ctx);
14277 ~DeclaringSpecialMember() {
14278 if (!WasAlreadyBeingDeclared) {
14285 bool isAlreadyBeingDeclared()
const {
14286 return WasAlreadyBeingDeclared;
14298 if (
auto *Acceptable = R.getAcceptableDecl(D))
14299 R.addDecl(Acceptable);
14301 R.suppressDiagnostics();
14307void Sema::setupImplicitSpecialMemberType(
CXXMethodDecl *SpecialMem,
14313 LangAS AS = getDefaultCXXMethodAddrSpace();
14318 auto QT = Context.getFunctionType(ResultTy, Args, EPI);
14326 Context.getTrivialTypeSourceInfo(SpecialMem->
getType());
14340 "Should not build implicit default constructor!");
14342 DeclaringSpecialMember DSM(*
this, ClassDecl,
14344 if (DSM.isAlreadyBeingDeclared())
14354 =
Context.DeclarationNames.getCXXConstructorName(ClassType);
14366 setupImplicitSpecialMemberType(DefaultCon,
Context.VoidTy, {});
14369 CUDA().inferTargetForImplicitSpecialMember(
14390 ClassDecl->
addDecl(DefaultCon);
14397 DefaultedFunctionFPFeaturesRAII RestoreFP(*
this,
Constructor);
14401 "DefineImplicitDefaultConstructor - call it for implicit default ctor");
14406 assert(ClassDecl &&
"DefineImplicitDefaultConstructor - invalid constructor");
14420 Scope.addContextNote(CurrentLocation);
14467 ->getInheritedConstructor()
14474 Context.getTrivialTypeSourceInfo(BaseCtor->
getType(), UsingLoc);
14485 false, BaseCtor, &ICI);
14502 EPI.ExceptionSpec.SourceDecl = DerivedCtor;
14508 for (
unsigned I = 0, N = FPT->
getNumParams(); I != N; ++I) {
14512 Context, DerivedCtor, UsingLoc, UsingLoc,
nullptr,
14519 ParamDecls.push_back(PD);
14524 assert(!BaseCtor->
isDeleted() &&
"should not use deleted constructor");
14527 Derived->
addDecl(DerivedCtor);
14533 return DerivedCtor;
14564 Scope.addContextNote(CurrentLocation);
14567 Constructor->getInheritedConstructor().getShadowDecl();
14569 Constructor->getInheritedConstructor().getConstructor();
14583 for (
bool VBase : {
false,
true}) {
14585 if (B.isVirtual() != VBase)
14588 auto *BaseRD = B.getType()->getAsCXXRecordDecl();
14593 if (!BaseCtor.first)
14598 InitLoc, B.getType(), BaseCtor.first, VBase, BaseCtor.second);
14600 auto *TInfo =
Context.getTrivialTypeSourceInfo(B.getType(), InitLoc);
14602 Context, TInfo, VBase, InitLoc,
Init.get(), InitLoc,
14636 DeclaringSpecialMember DSM(*
this, ClassDecl,
14638 if (DSM.isAlreadyBeingDeclared())
14648 =
Context.DeclarationNames.getCXXDestructorName(ClassType);
14663 CUDA().inferTargetForImplicitSpecialMember(
14697 DefaultedFunctionFPFeaturesRAII RestoreFP(*
this,
Destructor);
14699 !
Destructor->doesThisDeclarationHaveABody() &&
14701 "DefineImplicitDestructor - call it for implicit default dtor");
14706 assert(ClassDecl &&
"DefineImplicitDestructor - invalid destructor");
14717 Scope.addContextNote(CurrentLocation);
14744 assert(
Context.getTargetInfo().getCXXABI().isMicrosoft() &&
14745 "implicit complete dtors unneeded outside MS ABI");
14747 "complete dtor only exists for classes with vbases");
14752 Scope.addContextNote(CurrentLocation);
14760 if (
Record->isInvalidDecl()) {
14781 if (M->getParent()->getTemplateSpecializationKind() !=
14801 "adjusting dtor exception specs was introduced in c++11");
14811 if (DtorType->hasExceptionSpec())
14834 ExprBuilder(
const ExprBuilder&) =
delete;
14835 ExprBuilder &operator=(
const ExprBuilder&) =
delete;
14838 static Expr *assertNotNull(
Expr *E) {
14839 assert(E &&
"Expression construction must not fail.");
14845 virtual ~ExprBuilder() {}
14847 virtual Expr *build(Sema &S, SourceLocation Loc)
const = 0;
14850class RefBuilder:
public ExprBuilder {
14855 Expr *build(Sema &S, SourceLocation Loc)
const override {
14859 RefBuilder(VarDecl *Var, QualType VarType)
14860 : Var(Var), VarType(VarType) {}
14863class ThisBuilder:
public ExprBuilder {
14865 Expr *build(Sema &S, SourceLocation Loc)
const override {
14870class CastBuilder:
public ExprBuilder {
14871 const ExprBuilder &Builder;
14877 Expr *build(Sema &S, SourceLocation Loc)
const override {
14879 CK_UncheckedDerivedToBase, Kind,
14888class DerefBuilder:
public ExprBuilder {
14889 const ExprBuilder &Builder;
14892 Expr *build(Sema &S, SourceLocation Loc)
const override {
14893 return assertNotNull(
14897 DerefBuilder(
const ExprBuilder &Builder) : Builder(Builder) {}
14900class MemberBuilder:
public ExprBuilder {
14901 const ExprBuilder &Builder;
14905 LookupResult &MemberLookup;
14908 Expr *build(Sema &S, SourceLocation Loc)
const override {
14910 Builder.build(S, Loc),
Type, Loc, IsArrow, SS, SourceLocation(),
14911 nullptr, MemberLookup,
nullptr,
nullptr).get());
14914 MemberBuilder(
const ExprBuilder &Builder, QualType
Type,
bool IsArrow,
14915 LookupResult &MemberLookup)
14916 : Builder(Builder),
Type(
Type), IsArrow(IsArrow),
14917 MemberLookup(MemberLookup) {}
14920class MoveCastBuilder:
public ExprBuilder {
14921 const ExprBuilder &Builder;
14924 Expr *build(Sema &S, SourceLocation Loc)
const override {
14925 return assertNotNull(
CastForMoving(S, Builder.build(S, Loc)));
14928 MoveCastBuilder(
const ExprBuilder &Builder) : Builder(Builder) {}
14931class LvalueConvBuilder:
public ExprBuilder {
14932 const ExprBuilder &Builder;
14935 Expr *build(Sema &S, SourceLocation Loc)
const override {
14936 return assertNotNull(
14940 LvalueConvBuilder(
const ExprBuilder &Builder) : Builder(Builder) {}
14943class SubscriptBuilder:
public ExprBuilder {
14944 const ExprBuilder &
Base;
14945 const ExprBuilder &Index;
14948 Expr *build(Sema &S, SourceLocation Loc)
const override {
14950 Base.build(S, Loc), Loc, Index.build(S, Loc), Loc).
get());
14953 SubscriptBuilder(
const ExprBuilder &Base,
const ExprBuilder &Index)
14965 const ExprBuilder &ToB,
const ExprBuilder &FromB) {
14974 Expr *From = FromB.build(S, Loc);
14978 Expr *To = ToB.build(S, Loc);
14983 bool NeedsCollectableMemCpy =
false;
14984 if (
auto *RD =
T->getBaseElementTypeUnsafe()->getAsRecordDecl())
14988 StringRef MemCpyName = NeedsCollectableMemCpy ?
14989 "__builtin_objc_memmove_collectable" :
14990 "__builtin_memcpy";
15003 assert(MemCpyRef.
isUsable() &&
"Builtin reference cannot fail");
15005 Expr *CallArgs[] = {
15009 Loc, CallArgs, Loc);
15011 assert(!
Call.isInvalid() &&
"Call to __builtin_memcpy cannot fail!");
15044 const ExprBuilder &To,
const ExprBuilder &From,
15045 bool CopyingBaseSubobject,
bool Copying,
15046 unsigned Depth = 0) {
15061 if (
auto *ClassDecl =
T->getAsCXXRecordDecl()) {
15075 if (Method->isCopyAssignmentOperator() ||
15076 (!Copying && Method->isMoveAssignmentOperator()))
15095 if (CopyingBaseSubobject) {
15124 Expr *FromInst = From.build(S, Loc);
15127 Loc, FromInst, Loc);
15128 if (
Call.isInvalid())
15147 Loc, BO_Assign, To.build(S, Loc), From.build(S, Loc));
15167 llvm::raw_svector_ostream OS(Str);
15168 OS <<
"__i" << Depth;
15172 IterationVarName, SizeType,
15181 RefBuilder IterationVarRef(IterationVar, SizeType);
15182 LvalueConvBuilder IterationVarRefRVal(IterationVarRef);
15188 SubscriptBuilder FromIndexCopy(From, IterationVarRefRVal);
15189 MoveCastBuilder FromIndexMove(FromIndexCopy);
15190 const ExprBuilder *FromIndex;
15192 FromIndex = &FromIndexCopy;
15194 FromIndex = &FromIndexMove;
15196 SubscriptBuilder ToIndex(To, IterationVarRefRVal);
15201 ToIndex, *FromIndex, CopyingBaseSubobject,
15202 Copying, Depth + 1);
15204 if (
Copy.isInvalid() || !
Copy.get())
15211 S.
Context, IterationVarRefRVal.build(S, Loc),
15225 Loc, Loc, InitStmt,
15232 const ExprBuilder &To,
const ExprBuilder &From,
15233 bool CopyingBaseSubobject,
bool Copying) {
15235 if (
T->isArrayType() && !
T.hasQualifiers() &&
15236 T.isTriviallyCopyableType(S.
Context))
15240 CopyingBaseSubobject,
15258 DeclaringSpecialMember DSM(*
this, ClassDecl,
15260 if (DSM.isAlreadyBeingDeclared())
15264 std::nullopt, ClassDecl,
15298 CUDA().inferTargetForImplicitSpecialMember(
15305 ClassLoc, ClassLoc,
15318 ++
getASTContext().NumImplicitCopyAssignmentOperatorsDeclared;
15350 for (
auto *I : RD->
ctors()) {
15351 if (I->isCopyConstructor()) {
15352 UserDeclaredOperation = I;
15356 assert(UserDeclaredOperation);
15360 for (
auto *I : RD->
methods()) {
15361 if (I->isCopyAssignmentOperator()) {
15362 UserDeclaredOperation = I;
15366 assert(UserDeclaredOperation);
15369 if (UserDeclaredOperation) {
15370 bool UDOIsUserProvided = UserDeclaredOperation->
isUserProvided();
15374 (UDOIsUserProvided && UDOIsDestructor)
15375 ? diag::warn_deprecated_copy_with_user_provided_dtor
15376 : (UDOIsUserProvided && !UDOIsDestructor)
15377 ? diag::warn_deprecated_copy_with_user_provided_copy
15378 : (!UDOIsUserProvided && UDOIsDestructor)
15379 ? diag::warn_deprecated_copy_with_dtor
15380 : diag::warn_deprecated_copy;
15382 << RD << IsCopyAssignment;
15388 DefaultedFunctionFPFeaturesRAII RestoreFP(*
this, CopyAssignOperator);
15394 "DefineImplicitCopyAssignment called for wrong function");
15412 Scope.addContextNote(CurrentLocation);
15447 RefBuilder OtherRef(
Other, OtherRefType);
15450 std::optional<ThisBuilder>
This;
15451 std::optional<DerefBuilder> DerefThis;
15452 std::optional<RefBuilder> ExplicitObject;
15453 bool IsArrow =
false;
15459 ExplicitObject.emplace(CopyAssignOperator->
getParamDecl(0), ObjectType);
15463 DerefThis.emplace(*
This);
15466 ExprBuilder &ObjectParameter =
15467 ExplicitObject ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15468 :
static_cast<ExprBuilder &
>(*This);
15472 for (
auto &
Base : ClassDecl->
bases()) {
15475 QualType BaseType =
Base.getType().getUnqualifiedType();
15476 if (!BaseType->isRecordType()) {
15482 BasePath.push_back(&
Base);
15486 CastBuilder From(OtherRef,
Context.getQualifiedType(BaseType, OtherQuals),
15491 ExplicitObject ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15492 :
static_cast<ExprBuilder &
>(*DerefThis),
15501 if (
Copy.isInvalid()) {
15507 Statements.push_back(
Copy.getAs<
Expr>());
15511 for (
auto *Field : ClassDecl->
fields()) {
15514 if (Field->isUnnamedBitField() || Field->getParent()->isUnion())
15517 if (Field->isInvalidDecl()) {
15523 if (Field->getType()->isReferenceType()) {
15524 Diag(ClassDecl->
getLocation(), diag::err_uninitialized_member_for_assign)
15525 <<
Context.getCanonicalTagType(ClassDecl) << 0
15526 << Field->getDeclName();
15527 Diag(Field->getLocation(), diag::note_declared_at);
15534 if (!BaseType->isRecordType() && BaseType.isConstQualified()) {
15535 Diag(ClassDecl->
getLocation(), diag::err_uninitialized_member_for_assign)
15536 <<
Context.getCanonicalTagType(ClassDecl) << 1
15537 << Field->getDeclName();
15538 Diag(Field->getLocation(), diag::note_declared_at);
15544 if (Field->isZeroLengthBitField())
15547 QualType FieldType = Field->getType().getNonReferenceType();
15550 "Incomplete array type is not valid");
15556 LookupResult MemberLookup(*
this, Field->getDeclName(), Loc,
15561 MemberBuilder From(OtherRef, OtherRefType,
false, MemberLookup);
15562 MemberBuilder To(ObjectParameter, ObjectType, IsArrow, MemberLookup);
15568 if (
Copy.isInvalid()) {
15574 Statements.push_back(
Copy.getAs<
Stmt>());
15580 (ExplicitObject ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15581 :
LangOpts.HLSL ?
static_cast<ExprBuilder &
>(*This)
15582 :
static_cast<ExprBuilder &
>(*DerefThis))
15583 .build(*
this, Loc);
15588 Statements.push_back(Return.
getAs<
Stmt>());
15601 assert(!Body.
isInvalid() &&
"Compound statement creation cannot fail");
15607 L->CompletedImplicitDefinition(CopyAssignOperator);
15614 DeclaringSpecialMember DSM(*
this, ClassDecl,
15616 if (DSM.isAlreadyBeingDeclared())
15623 std::nullopt, ClassDecl,
15653 CUDA().inferTargetForImplicitSpecialMember(
15660 ClassLoc, ClassLoc,
15673 ++
getASTContext().NumImplicitMoveAssignmentOperatorsDeclared;
15696 assert(!Class->isDependentContext() &&
"should not define dependent move");
15702 if (Class->getNumVBases() == 0 || Class->hasTrivialMoveAssignment() ||
15703 Class->getNumBases() < 2)
15707 typedef llvm::DenseMap<CXXRecordDecl*, CXXBaseSpecifier*> VBaseMap;
15710 for (
auto &BI : Class->bases()) {
15711 Worklist.push_back(&BI);
15712 while (!Worklist.empty()) {
15718 if (!
Base->hasNonTrivialMoveAssignment())
15743 VBases.insert(std::make_pair(
Base->getCanonicalDecl(), &BI))
15745 if (Existing && Existing != &BI) {
15746 S.
Diag(CurrentLocation, diag::warn_vbase_moved_multiple_times)
15749 << (
Base->getCanonicalDecl() ==
15752 S.
Diag(BI.getBeginLoc(), diag::note_vbase_moved_here)
15753 << (
Base->getCanonicalDecl() ==
15754 BI.getType()->getAsCXXRecordDecl()->getCanonicalDecl())
15758 Existing =
nullptr;
15768 llvm::append_range(Worklist, llvm::make_pointer_range(
Base->bases()));
15776 DefaultedFunctionFPFeaturesRAII RestoreFP(*
this, MoveAssignOperator);
15782 "DefineImplicitMoveAssignment called for wrong function");
15812 Scope.addContextNote(CurrentLocation);
15828 RefBuilder OtherRef(
Other, OtherRefType);
15830 MoveCastBuilder MoveOther(OtherRef);
15833 std::optional<ThisBuilder>
This;
15834 std::optional<DerefBuilder> DerefThis;
15835 std::optional<RefBuilder> ExplicitObject;
15837 bool IsArrow =
false;
15842 ExplicitObject.emplace(MoveAssignOperator->
getParamDecl(0), ObjectType);
15846 DerefThis.emplace(*
This);
15849 ExprBuilder &ObjectParameter =
15850 ExplicitObject ? *ExplicitObject :
static_cast<ExprBuilder &
>(*This);
15854 for (
auto &
Base : ClassDecl->
bases()) {
15865 QualType BaseType =
Base.getType().getUnqualifiedType();
15866 if (!BaseType->isRecordType()) {
15872 BasePath.push_back(&
Base);
15876 CastBuilder From(OtherRef, BaseType,
VK_XValue, BasePath);
15881 ExplicitObject ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15882 :
static_cast<ExprBuilder &
>(*DerefThis),
15891 if (Move.isInvalid()) {
15897 Statements.push_back(Move.getAs<
Expr>());
15901 for (
auto *Field : ClassDecl->
fields()) {
15904 if (Field->isUnnamedBitField() || Field->getParent()->isUnion())
15907 if (Field->isInvalidDecl()) {
15913 if (Field->getType()->isReferenceType()) {
15914 Diag(ClassDecl->
getLocation(), diag::err_uninitialized_member_for_assign)
15915 <<
Context.getCanonicalTagType(ClassDecl) << 0
15916 << Field->getDeclName();
15917 Diag(Field->getLocation(), diag::note_declared_at);
15924 if (!BaseType->isRecordType() && BaseType.isConstQualified()) {
15925 Diag(ClassDecl->
getLocation(), diag::err_uninitialized_member_for_assign)
15926 <<
Context.getCanonicalTagType(ClassDecl) << 1
15927 << Field->getDeclName();
15928 Diag(Field->getLocation(), diag::note_declared_at);
15934 if (Field->isZeroLengthBitField())
15937 QualType FieldType = Field->getType().getNonReferenceType();
15940 "Incomplete array type is not valid");
15945 LookupResult MemberLookup(*
this, Field->getDeclName(), Loc,
15949 MemberBuilder From(MoveOther, OtherRefType,
15950 false, MemberLookup);
15951 MemberBuilder To(ObjectParameter, ObjectType, IsArrow, MemberLookup);
15953 assert(!From.build(*
this, Loc)->isLValue() &&
15954 "Member reference with rvalue base must be rvalue except for reference "
15955 "members, which aren't allowed for move assignment.");
15962 if (Move.isInvalid()) {
15968 Statements.push_back(Move.getAs<
Stmt>());
15974 (ExplicitObject ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15975 :
LangOpts.HLSL ?
static_cast<ExprBuilder &
>(*This)
15976 :
static_cast<ExprBuilder &
>(*DerefThis))
15977 .build(*
this, Loc);
15983 Statements.push_back(Return.
getAs<
Stmt>());
15996 assert(!Body.
isInvalid() &&
"Compound statement creation cannot fail");
16002 L->CompletedImplicitDefinition(MoveAssignOperator);
16013 DeclaringSpecialMember DSM(*
this, ClassDecl,
16015 if (DSM.isAlreadyBeingDeclared())
16019 std::nullopt, ClassDecl,
16036 =
Context.DeclarationNames.getCXXConstructorName(
16037 Context.getCanonicalType(ClassType));
16056 CUDA().inferTargetForImplicitSpecialMember(
16082 ClassDecl->
hasAttr<TrivialABIAttr>() ||
16115 "DefineImplicitCopyConstructor - call it for implicit copy ctor");
16120 assert(ClassDecl &&
"DefineImplicitCopyConstructor - invalid constructor");
16131 Scope.addContextNote(CurrentLocation);
16161 DeclaringSpecialMember DSM(*
this, ClassDecl,
16163 if (DSM.isAlreadyBeingDeclared())
16167 std::nullopt, ClassDecl,
16180 =
Context.DeclarationNames.getCXXConstructorName(
16181 Context.getCanonicalType(ClassType));
16201 CUDA().inferTargetForImplicitSpecialMember(
16208 ClassLoc, ClassLoc,
16221 ClassDecl->
hasAttr<TrivialABIAttr>() ||
16254 "DefineImplicitMoveConstructor - call it for implicit move ctor");
16259 assert(ClassDecl &&
"DefineImplicitMoveConstructor - invalid constructor");
16270 Scope.addContextNote(CurrentLocation);
16312 CallOp->getDescribedFunctionTemplate(), TemplateArgs, CurrentLocation);
16316 if (CallOp != Invoker) {
16325 if (CallOp->isInvalidDecl())
16335 if (Invoker != CallOp) {
16348 assert(FunctionRef &&
"Can't refer to __invoke function?");
16356 L->CompletedImplicitDefinition(Conv);
16357 if (Invoker != CallOp)
16358 L->CompletedImplicitDefinition(Invoker);
16386 Diag(CurrentLocation, diag::note_lambda_to_block_conv);
16395 Diag(CurrentLocation, diag::note_lambda_to_block_conv);
16401 Stmt *ReturnS = Return.
get();
16408 L->CompletedImplicitDefinition(Conv);
16415 switch (Args.size()) {
16420 if (!Args[1]->isDefaultArgument())
16425 return !Args[0]->isDefaultArgument();
16434 bool HadMultipleCandidates,
bool IsListInitialization,
16435 bool IsStdInitListInitialization,
bool RequiresZeroInit,
16437 bool Elidable =
false;
16456 Expr *SubExpr = ExprArgs[0];
16467 Elidable, ExprArgs, HadMultipleCandidates,
16468 IsListInitialization,
16469 IsStdInitListInitialization, RequiresZeroInit,
16470 ConstructKind, ParenRange);
16476 bool HadMultipleCandidates,
bool IsListInitialization,
16477 bool IsStdInitListInitialization,
bool RequiresZeroInit,
16479 if (
auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl)) {
16489 ConstructLoc, DeclInitType,
Constructor, Elidable, ExprArgs,
16490 HadMultipleCandidates, IsListInitialization, IsStdInitListInitialization,
16491 RequiresZeroInit, ConstructKind, ParenRange);
16499 bool HadMultipleCandidates,
bool IsListInitialization,
16500 bool IsStdInitListInitialization,
bool RequiresZeroInit,
16505 "given constructor for wrong type");
16513 HadMultipleCandidates, IsListInitialization,
16514 IsStdInitListInitialization, RequiresZeroInit,
16546 PDiag(diag::err_access_dtor_var)
16556 bool HasConstantInit =
false;
16563 diag::err_constexpr_var_requires_const_destruction) << VD;
16574 if (!VD->
hasAttr<AlwaysDestroyAttr>())
16586 bool AllowExplicit,
16587 bool IsListInitialization) {
16589 unsigned NumArgs = ArgsPtr.size();
16590 Expr **Args = ArgsPtr.data();
16596 if (NumArgs < NumParams)
16597 ConvertedArgs.reserve(NumParams);
16599 ConvertedArgs.reserve(NumArgs);
16607 CallType, AllowExplicit, IsListInitialization);
16608 ConvertedArgs.append(AllArgs.begin(), AllArgs.end());
16619 bool SeenTypedOperators =
Context.hasSeenTypeAwareOperatorNewOrDelete();
16626 if (DeallocType.
isNull())
16637 constexpr unsigned RequiredParameterCount =
16640 if (NumParams != RequiredParameterCount)
16645 if (llvm::any_of(FnDecl->
parameters().drop_front(),
16647 return ParamDecl->getType()->isDependentType();
16652 if (SpecializedTypeIdentity.
isNull())
16656 ArgTypes.reserve(NumParams);
16662 ArgTypes.push_back(SpecializedTypeIdentity);
16683 diag::err_operator_new_delete_declared_in_namespace)
16690 diag::err_operator_new_delete_declared_static)
16700 Qualifiers PtrQuals = PtrTy->getPointeeType().getQualifiers();
16703 PtrTy->getPointeeType().getUnqualifiedType(), PtrQuals)));
16710 bool *WasMalformed) {
16711 const Decl *MalformedDecl =
nullptr;
16714 nullptr, &MalformedDecl))
16717 if (!MalformedDecl)
16721 *WasMalformed =
true;
16739 SemaRef, FD,
nullptr);
16740 unsigned DestroyingDeleteIdx = IsPotentiallyTypeAware + 1;
16749 unsigned DependentParamTypeDiag,
unsigned InvalidParamTypeDiag) {
16750 auto NormalizeType = [&SemaRef](
QualType T) {
16754 if (
const auto PtrTy =
T->template getAs<PointerType>())
16761 unsigned FirstNonTypeParam = 0;
16762 bool MalformedTypeIdentity =
false;
16764 SemaRef, FnDecl, &MalformedTypeIdentity);
16765 unsigned MinimumMandatoryArgumentCount = 1;
16766 unsigned SizeParameterIndex = 0;
16767 if (IsPotentiallyTypeAware) {
16771 SemaRef.
Diag(FnDecl->
getLocation(), diag::warn_ext_type_aware_allocators);
16774 SizeParameterIndex = 1;
16775 MinimumMandatoryArgumentCount =
16778 SizeParameterIndex = 2;
16779 MinimumMandatoryArgumentCount =
16782 FirstNonTypeParam = 1;
16785 bool IsPotentiallyDestroyingDelete =
16788 if (IsPotentiallyDestroyingDelete) {
16789 ++MinimumMandatoryArgumentCount;
16790 ++SizeParameterIndex;
16793 if (NumParams < MinimumMandatoryArgumentCount)
16795 diag::err_operator_new_delete_too_few_parameters)
16796 << IsPotentiallyTypeAware << IsPotentiallyDestroyingDelete
16797 << FnDecl->
getDeclName() << MinimumMandatoryArgumentCount;
16799 for (
unsigned Idx = 0; Idx < MinimumMandatoryArgumentCount; ++Idx) {
16803 diag::err_operator_new_default_arg)
16808 QualType CanResultType = NormalizeType(FnType->getReturnType());
16809 QualType CanExpectedResultType = NormalizeType(ExpectedResultType);
16810 QualType CanExpectedSizeOrAddressParamType =
16811 NormalizeType(ExpectedSizeOrAddressParamType);
16814 if (CanResultType != CanExpectedResultType) {
16817 return SemaRef.
Diag(
16819 CanResultType->isDependentType()
16820 ? diag::err_operator_new_delete_dependent_result_type
16821 : diag::err_operator_new_delete_invalid_result_type)
16828 diag::err_operator_new_delete_template_too_few_parameters)
16832 auto FallbackType) ->
bool {
16836 << IsPotentiallyTypeAware << IsPotentiallyDestroyingDelete
16842 auto ActualParamType =
16844 if (ActualParamType == CanExpectedTy)
16846 unsigned Diagnostic = ActualParamType->isDependentType()
16847 ? DependentParamTypeDiag
16848 : InvalidParamTypeDiag;
16850 << IsPotentiallyTypeAware << IsPotentiallyDestroyingDelete
16856 if (CheckType(FirstNonTypeParam, CanExpectedSizeOrAddressParamType,
"size_t"))
16863 if (!IsPotentiallyTypeAware)
16872 if (CheckType(SizeParameterIndex + 1, StdAlignValT,
"std::align_val_t"))
16876 return MalformedTypeIdentity;
16895 SizeTy, diag::err_operator_new_dependent_param_type,
16896 diag::err_operator_new_param_type);
16908 auto *MD = dyn_cast<CXXMethodDecl>(FnDecl);
16909 auto ConstructDestroyingDeleteAddressType = [&]() {
16922 SemaRef, MD,
nullptr)) {
16926 AddressParamType == ConstructDestroyingDeleteAddressType()) {
16937 diag::err_type_aware_destroying_operator_delete)
16938 << Param->getSourceRange();
16960 diag::err_operator_delete_dependent_param_type,
16961 diag::err_operator_delete_param_type))
16970 diag::err_destroying_operator_delete_not_usual);
16980 "Expected an overloaded operator declaration");
16990 if (Op == OO_Delete || Op == OO_Array_Delete)
16993 if (Op == OO_New || Op == OO_Array_New)
17003 if (
CXXMethodDecl *MethodDecl = dyn_cast<CXXMethodDecl>(FnDecl)) {
17004 if (MethodDecl->isStatic()) {
17005 if (Op == OO_Call || Op == OO_Subscript)
17008 ? diag::warn_cxx20_compat_operator_overload_static
17009 : diag::ext_operator_overload_static))
17012 return Diag(FnDecl->
getLocation(), diag::err_operator_overload_static)
17016 bool ClassOrEnumParam =
false;
17018 QualType ParamType = Param->getType().getNonReferenceType();
17021 ClassOrEnumParam =
true;
17026 if (!ClassOrEnumParam)
17028 diag::err_operator_overload_needs_class_or_enum)
17038 if (Op != OO_Call) {
17041 if (Param->hasDefaultArg()) {
17042 FirstDefaultedParam = Param;
17046 if (FirstDefaultedParam) {
17047 if (Op == OO_Subscript) {
17049 ? diag::ext_subscript_overload
17050 : diag::error_subscript_overload)
17055 diag::err_operator_overload_default_arg)
17063 {
false,
false,
false }
17064#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
17065 , { Unary, Binary, MemberOnly }
17066#include "clang/Basic/OperatorKinds.def"
17069 bool CanBeUnaryOperator = OperatorUses[Op][0];
17070 bool CanBeBinaryOperator = OperatorUses[Op][1];
17071 bool MustBeMemberOperator = OperatorUses[Op][2];
17082 if (Op != OO_Call && Op != OO_Subscript &&
17083 ((NumParams == 1 && !CanBeUnaryOperator) ||
17084 (NumParams == 2 && !CanBeBinaryOperator) || (NumParams < 1) ||
17085 (NumParams > 2))) {
17087 unsigned ErrorKind;
17088 if (CanBeUnaryOperator && CanBeBinaryOperator) {
17090 }
else if (CanBeUnaryOperator) {
17093 assert(CanBeBinaryOperator &&
17094 "All non-call overloaded operators are unary or binary!");
17097 return Diag(FnDecl->
getLocation(), diag::err_operator_overload_must_be)
17098 << FnDecl->
getDeclName() << NumParams << ErrorKind;
17101 if (Op == OO_Subscript && NumParams != 2) {
17103 ? diag::ext_subscript_overload
17104 : diag::error_subscript_overload)
17105 << FnDecl->
getDeclName() << (NumParams == 1 ? 0 : 2);
17110 if (Op != OO_Call &&
17112 return Diag(FnDecl->
getLocation(), diag::err_operator_overload_variadic)
17119 diag::err_operator_overload_must_be_member)
17133 if ((Op == OO_PlusPlus || Op == OO_MinusMinus) && NumParams == 2) {
17140 diag::err_operator_overload_post_incdec_must_be_int)
17141 << LastParam->
getType() << (Op == OO_MinusMinus);
17153 if (TemplateParams->
size() == 1) {
17155 dyn_cast<NonTypeTemplateParmDecl>(TemplateParams->
getParam(0));
17169 if (SemaRef.
getLangOpts().CPlusPlus20 && PmDecl &&
17172 PmDecl->
getType()->
getAs<DeducedTemplateSpecializationType>()))
17174 }
else if (TemplateParams->
size() == 2) {
17176 dyn_cast<TemplateTypeParmDecl>(TemplateParams->
getParam(0));
17178 dyn_cast<NonTypeTemplateParmDecl>(TemplateParams->
getParam(1));
17184 if (
const auto *TArgs =
17186 TArgs && TArgs->getDepth() == PmType->
getDepth() &&
17187 TArgs->getIndex() == PmType->
getIndex()) {
17190 diag::ext_string_literal_operator_template);
17197 diag::err_literal_operator_template)
17204 Diag(FnDecl->
getLocation(), diag::err_literal_operator_outside_namespace)
17213 Diag(LSD->getExternLoc(), diag::note_extern_c_begins_here);
17232 diag::err_literal_operator_template_with_params);
17242 QualType ParamType = Param->getType().getUnqualifiedType();
17260 Diag(Param->getSourceRange().getBegin(),
17261 diag::err_literal_operator_param)
17262 << ParamType <<
"'const char *'" << Param->getSourceRange();
17267 Diag(Param->getSourceRange().getBegin(), diag::err_literal_operator_param)
17268 << ParamType <<
Context.LongDoubleTy << Param->getSourceRange();
17272 Diag(Param->getSourceRange().getBegin(), diag::err_literal_operator_param)
17273 << ParamType <<
Context.UnsignedLongLongTy << Param->getSourceRange();
17277 Diag(Param->getSourceRange().getBegin(),
17278 diag::err_literal_operator_invalid_param)
17279 << ParamType << Param->getSourceRange();
17288 QualType FirstParamType = (*Param)->getType().getUnqualifiedType();
17295 Diag((*Param)->getSourceRange().getBegin(),
17296 diag::err_literal_operator_param)
17297 << FirstParamType <<
"'const char *'" << (*Param)->getSourceRange();
17304 Diag((*Param)->getSourceRange().getBegin(),
17305 diag::err_literal_operator_param)
17306 << FirstParamType <<
"'const char *'" << (*Param)->getSourceRange();
17319 Diag((*Param)->getSourceRange().getBegin(),
17320 diag::err_literal_operator_param)
17321 << FirstParamType <<
"'const char *'" << (*Param)->getSourceRange();
17329 QualType SecondParamType = (*Param)->getType().getUnqualifiedType();
17330 if (!
Context.hasSameType(SecondParamType,
Context.getSizeType())) {
17331 Diag((*Param)->getSourceRange().getBegin(),
17332 diag::err_literal_operator_param)
17333 << SecondParamType <<
Context.getSizeType()
17334 << (*Param)->getSourceRange();
17338 Diag(FnDecl->
getLocation(), diag::err_literal_operator_bad_param_count);
17347 if (Param->hasDefaultArg()) {
17348 Diag(Param->getDefaultArgRange().getBegin(),
17349 diag::err_literal_operator_default_argument)
17350 << Param->getDefaultArgRange();
17365 <<
static_cast<int>(Status)
17376 assert(Lit->
isUnevaluated() &&
"Unexpected string literal kind");
17382 else if (Lang ==
"C++")
17385 Diag(LangStr->
getExprLoc(), diag::err_language_linkage_spec_unknown)
17405 if (
getLangOpts().CPlusPlusModules && isCurrentModulePurview()) {
17406 Module *GlobalModule = PushImplicitGlobalModuleFragment(ExternLoc);
17429 PopImplicitGlobalModuleFragment();
17432 return LinkageSpec;
17456 ExDeclType =
Context.getArrayDecayedType(ExDeclType);
17458 ExDeclType =
Context.getPointerType(ExDeclType);
17465 Diag(Loc, diag::err_catch_rvalue_ref);
17470 Diag(Loc, diag::err_catch_variably_modified) << ExDeclType;
17476 unsigned DK = diag::err_catch_incomplete;
17478 BaseType = Ptr->getPointeeType();
17480 DK = diag::err_catch_incomplete_ptr;
17483 BaseType = Ref->getPointeeType();
17485 DK = diag::err_catch_incomplete_ref;
17487 if (!
Invalid && (Mode == 0 || !BaseType->isVoidType()) &&
17491 if (!
Invalid && BaseType.isWebAssemblyReferenceType()) {
17492 Diag(Loc, diag::err_wasm_reftype_tc) << 1;
17496 if (!
Invalid && Mode != 1 && BaseType->isSizelessType()) {
17497 Diag(Loc, diag::err_catch_sizeless) << (Mode == 2 ? 1 : 0) << BaseType;
17503 diag::err_abstract_type_in_decl,
17512 T = RT->getPointeeType();
17514 if (
T->isObjCObjectType()) {
17515 Diag(Loc, diag::err_objc_object_catch);
17517 }
else if (
T->isObjCObjectPointerType()) {
17520 Diag(Loc, diag::warn_objc_pointer_cxx_catch_fragile);
17529 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(ExDecl))
17554 Expr *opaqueValue =
17604 Diag(PrevDecl->getLocation(), diag::note_previous_definition);
17606 }
else if (PrevDecl->isTemplateParameter())
17634 Expr *AssertMessageExpr,
17640 AssertMessageExpr, RParenLoc,
false);
17645 case BuiltinType::Char_S:
17646 case BuiltinType::Char_U:
17648 case BuiltinType::Char8:
17651 case BuiltinType::Char16:
17654 case BuiltinType::Char32:
17657 case BuiltinType::WChar_S:
17658 case BuiltinType::WChar_U:
17662 llvm_unreachable(
"Non-character type");
17672 char Arr[UNI_MAX_UTF8_BYTES_PER_CODE_POINT];
17675 llvm::raw_svector_ostream OS(Str);
17679 if (K == BuiltinType::Char_S || K == BuiltinType::Char_U ||
17680 K == BuiltinType::Char8 ||
Value <= 0x7F) {
17682 if (!Escaped.empty())
17685 OS << static_cast<char>(
Value);
17690 case BuiltinType::Char16:
17691 case BuiltinType::Char32:
17692 case BuiltinType::WChar_S:
17693 case BuiltinType::WChar_U: {
17694 if (llvm::ConvertCodePointToUTF8(
Value, Ptr))
17698 << llvm::format_hex_no_prefix(
Value, TyWidth / 4,
true);
17702 llvm_unreachable(
"Non-character type is passed");
17714 switch (
V.getKind()) {
17716 if (
T->isBooleanType()) {
17720 int64_t BoolValue =
V.getInt().getExtValue();
17721 assert((BoolValue == 0 || BoolValue == 1) &&
17722 "Bool type, but value is not 0 or 1");
17723 llvm::raw_svector_ostream OS(Str);
17724 OS << (BoolValue ?
"true" :
"false");
17726 llvm::raw_svector_ostream OS(Str);
17731 switch (BTy->getKind()) {
17732 case BuiltinType::Char_S:
17733 case BuiltinType::Char_U:
17734 case BuiltinType::Char8:
17735 case BuiltinType::Char16:
17736 case BuiltinType::Char32:
17737 case BuiltinType::WChar_S:
17738 case BuiltinType::WChar_U: {
17739 unsigned TyWidth = Context.getIntWidth(
T);
17740 assert(8 <= TyWidth && TyWidth <= 32 &&
"Unexpected integer width");
17746 << llvm::format_hex_no_prefix(CodeUnit, 2,
17748 <<
", " <<
V.getInt() <<
')';
17755 V.getInt().toString(Str);
17761 V.getFloat().toString(Str);
17765 if (
V.isNullPointer()) {
17766 llvm::raw_svector_ostream OS(Str);
17773 llvm::raw_svector_ostream OS(Str);
17775 V.getComplexFloatReal().toString(Str);
17777 V.getComplexFloatImag().toString(Str);
17782 llvm::raw_svector_ostream OS(Str);
17784 V.getComplexIntReal().toString(Str);
17786 V.getComplexIntImag().toString(Str);
17813 if (
const auto *UnaryOp = dyn_cast<UnaryOperator>(E))
17817 if (
const auto *BO = dyn_cast<BinaryOperator>(E))
17818 return (BO->isShiftOp() || BO->isAdditiveOp() || BO->isMultiplicativeOp() ||
17819 BO->isBitwiseOp());
17825 if (
const auto *Op = dyn_cast<BinaryOperator>(E);
17826 Op && Op->getOpcode() != BO_LOr) {
17827 const Expr *LHS = Op->getLHS()->IgnoreParenImpCasts();
17828 const Expr *RHS = Op->getRHS()->IgnoreParenImpCasts();
17846 for (
auto &DiagSide : DiagSides) {
17847 const Expr *Side = DiagSide.Cond;
17852 DiagSide.Result.Val, Side->
getType(), DiagSide.ValueString,
Context);
17854 if (DiagSides[0].Print && DiagSides[1].Print) {
17855 Diag(Op->getExprLoc(), diag::note_expr_evaluates_to)
17856 << DiagSides[0].ValueString << Op->getOpcodeStr()
17857 << DiagSides[1].ValueString << Op->getSourceRange();
17864template <
typename ResultType>
17868 bool ErrorOnInvalidMessage) {
17871 assert(!Message->isTypeDependent() && !Message->isValueDependent() &&
17872 "can't evaluate a dependant static assert message");
17874 if (
const auto *SL = dyn_cast<StringLiteral>(Message)) {
17875 assert(SL->isUnevaluated() &&
"expected an unevaluated string");
17876 if constexpr (std::is_same_v<APValue, ResultType>) {
17881 assert(CAT &&
"string literal isn't an array");
17885 for (
unsigned I = 0; I < SL->getLength(); I++) {
17886 Value = SL->getCodeUnit(I);
17890 Result.assign(SL->getString().begin(), SL->getString().end());
17896 QualType T = Message->getType().getNonReferenceType();
17897 auto *RD =
T->getAsCXXRecordDecl();
17899 SemaRef.
Diag(Loc, diag::err_user_defined_msg_invalid) << EvalContext;
17903 auto FindMember = [&](StringRef
Member) -> std::optional<LookupResult> {
17909 if (MemberLookup.
empty())
17910 return std::nullopt;
17911 return std::move(MemberLookup);
17914 std::optional<LookupResult> SizeMember = FindMember(
"size");
17915 std::optional<LookupResult> DataMember = FindMember(
"data");
17916 if (!SizeMember || !DataMember) {
17917 SemaRef.
Diag(Loc, diag::err_user_defined_msg_missing_member_function)
17919 << ((!SizeMember && !DataMember) ? 2
17927 Message, Message->getType(), Message->getBeginLoc(),
false,
17953 SemaRef.
Diag(Loc, diag::err_user_defined_msg_invalid_mem_fn_ret_ty)
17954 << EvalContext << 0;
17964 SemaRef.
Diag(Loc, diag::err_user_defined_msg_invalid_mem_fn_ret_ty)
17965 << EvalContext << 1;
17969 if (!ErrorOnInvalidMessage &&
17970 SemaRef.
Diags.
isIgnored(diag::warn_user_defined_msg_constexpr, Loc))
17975 Status.Diag = &Notes;
17976 if (!Message->EvaluateCharRangeAsString(
Result, EvaluatedSize.
get(),
17977 EvaluatedData.
get(), Ctx, Status) ||
17979 SemaRef.
Diag(Message->getBeginLoc(),
17980 ErrorOnInvalidMessage ? diag::err_user_defined_msg_constexpr
17981 : diag::warn_user_defined_msg_constexpr)
17983 for (
const auto &
Note : Notes)
17985 return !ErrorOnInvalidMessage;
17992 bool ErrorOnInvalidMessage) {
17994 ErrorOnInvalidMessage);
17999 bool ErrorOnInvalidMessage) {
18001 ErrorOnInvalidMessage);
18005 Expr *AssertExpr,
Expr *AssertMessage,
18008 assert(AssertExpr !=
nullptr &&
"Expected non-null condition");
18026 AssertExpr = FullAssertExpr.
get();
18029 Expr *BaseExpr = AssertExpr;
18041 diag::err_static_assert_expression_is_not_constant,
18047 if (!Failed && AssertMessage &&
Cond.getBoolValue()) {
18057 bool InTemplateDefinition =
18060 if (!Failed && !
Cond && !InTemplateDefinition) {
18062 llvm::raw_svector_ostream Msg(MsgBuffer);
18063 bool HasMessage = AssertMessage;
18064 if (AssertMessage) {
18072 Expr *InnerCond =
nullptr;
18073 std::string InnerCondDescription;
18074 std::tie(InnerCond, InnerCondDescription) =
18076 if (
const auto *ConceptIDExpr =
18077 dyn_cast_or_null<ConceptSpecializationExpr>(InnerCond)) {
18079 ConceptIDExpr->getSatisfaction();
18090 diag::err_static_assert_requirement_failed)
18091 << InnerCondDescription << !HasMessage << Msg.str()
18108 AssertExpr = FullAssertExpr.
get();
18112 AssertExpr, AssertMessage, RParenLoc,
18126 bool IsMemberSpecialization =
false;
18131 TagLoc, NameLoc, SS,
nullptr, TempParamLists,
true,
18132 IsMemberSpecialization,
Invalid)) {
18133 if (TemplateParams->size() > 0) {
18141 FriendLoc, TempParamLists.size() - 1,
18142 TempParamLists.data(), IsMemberSpecialization)
18146 Diag(TemplateParams->getTemplateLoc(), diag::err_template_tag_noparams)
18153 bool isAllExplicitSpecializations =
18155 return List->
size() == 0;
18164 if (isAllExplicitSpecializations) {
18166 bool Owned =
false;
18167 bool IsDependent =
false;
18184 NameLoc, &TSI,
true);
18190 EllipsisLoc, TempParamLists);
18196 assert(SS.
isNotEmpty() &&
"valid templated tag with no SS and no direct?");
18203 unsigned FriendDeclDepth = TempParamLists.front()->getDepth();
18206 DI && DI->first >= FriendDeclDepth) {
18207 auto *ND = dyn_cast<NamedDecl *>(
U.first);
18210 Diag(
U.second, diag::friend_template_decl_malformed_pack_expansion)
18219 Diag(NameLoc, diag::warn_template_qualified_friend_unsupported)
18231 EllipsisLoc, TempParamLists);
18233 Friend->setUnsupportedFriend(
true);
18257 Diag(FriendLoc, diag::err_friend_not_first_in_declaration);
18289 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
18294 if (!
T->isElaboratedTypeSpecifier()) {
18295 if (TempParams.size()) {
18307 }
else if (
const RecordDecl *RD =
T->getAsRecordDecl()) {
18312 ? diag::warn_cxx98_compat_unelaborated_friend_type
18313 : diag::ext_unelaborated_friend_type)
18318 DiagCompat(FriendLoc, diag_compat::nonclass_type_friend)
18335 if (!TempParams.empty())
18341 TSI, FriendLoc, EllipsisLoc);
18376 Diag(Loc, diag::err_unexpected_friend);
18414 if (IsNamespaceOrGlobal) {
18424 Scope *DCScope = S;
18434 (FunctionContainingLocalClass =
18457 DC =
Previous.getRepresentativeDecl()->getDeclContext();
18461 DC = FunctionContainingLocalClass;
18498 if (isTemplateId) {
18513 if (!DC)
return nullptr;
18524 diag::warn_cxx98_compat_friend_is_member :
18525 diag::err_friend_is_member);
18561 if (DiagArg >= 0) {
18562 Diag(Loc, diag::err_introducing_special_friend) << DiagArg;
18578 DCScope = &FakeDCScope;
18581 bool AddToScope =
true;
18583 TemplateParams, AddToScope);
18584 if (!ND)
return nullptr;
18618 FD = FTD->getTemplatedDecl();
18640 }
else if (FunctionContainingLocalClass) {
18649 }
else if (isTemplateId) {
18663 Diag(FD->
getLocation(), diag::err_friend_decl_with_def_arg_redeclared);
18665 diag::note_previous_declaration);
18667 Diag(FD->
getLocation(), diag::err_friend_decl_with_def_arg_must_be_def);
18672 Diag(FD->
getLocation(), diag::warn_template_qualified_friend_unsupported)
18688 FunctionDecl *Fn = dyn_cast_or_null<FunctionDecl>(Dcl);
18690 Diag(DelLoc, diag::err_deleted_non_function);
18695 Fn->setWillHaveBody(
false);
18697 if (
const FunctionDecl *Prev = Fn->getPreviousDecl()) {
18701 Prev->getPreviousDecl()) &&
18702 !Prev->isDefined()) {
18703 Diag(DelLoc, diag::err_deleted_decl_not_first);
18704 Diag(Prev->getLocation().isInvalid() ? DelLoc : Prev->getLocation(),
18705 Prev->isImplicit() ? diag::note_previous_implicit_declaration
18706 : diag::note_previous_declaration);
18709 Fn->setInvalidDecl();
18717 Fn = Fn->getCanonicalDecl();
18722 Diag(Fn->getLocation(), diag::err_attribute_dll_deleted) << DLLAttr;
18723 Fn->setInvalidDecl();
18729 Diag(DelLoc, diag::err_deleted_main);
18733 Fn->setImplicitlyInline();
18734 Fn->setDeletedAsWritten(
true, Message);
18741 auto *FD = dyn_cast<FunctionDecl>(Dcl);
18743 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(Dcl)) {
18745 Diag(DefaultLoc, diag::err_defaulted_comparison_template);
18750 Diag(DefaultLoc, diag::err_default_special_members)
18761 (!FD->isDependentContext() ||
18764 Diag(DefaultLoc, diag::err_default_special_members)
18774 ? diag::warn_cxx17_compat_defaulted_comparison
18775 : diag::ext_defaulted_comparison);
18778 FD->setDefaulted();
18779 FD->setExplicitlyDefaulted();
18780 FD->setDefaultLoc(DefaultLoc);
18783 if (FD->isDependentContext())
18789 FD->setWillHaveBody(
false);
18804 if (
const FunctionDecl *Pattern = FD->getTemplateInstantiationPattern())
18815 if (!FD->getDefaultedOrDeletedInfo() &&
18817 FD->setDefaultedOrDeletedInfo(
18843 Self.Diag(SubStmt->getBeginLoc(),
18844 diag::err_return_in_constructor_handler);
18851 for (
unsigned I = 0, E = TryBlock->
getNumHandlers(); I != E; ++I) {
18859 switch (BodyKind) {
18868 "Parsed function body should be '= delete;' or '= default;'");
18878 for (
unsigned I = 0, E = OldFT->
getNumParams(); I != E; ++I)
18882 !NewFT->getExtParameterInfo(I).isNoEscape()) {
18883 Diag(
New->getParamDecl(I)->getLocation(),
18884 diag::warn_overriding_method_missing_noescape);
18886 diag::note_overridden_marked_noescape);
18892 Diag(
New->getLocation(), diag::err_conflicting_overriding_attributes)
18899 const auto *OldCSA = Old->
getAttr<CodeSegAttr>();
18900 const auto *NewCSA =
New->getAttr<CodeSegAttr>();
18901 if ((NewCSA || OldCSA) &&
18902 (!OldCSA || !NewCSA || NewCSA->getName() != OldCSA->getName())) {
18903 Diag(
New->getLocation(), diag::err_mismatched_code_seg_override);
18909 if (
Context.hasAnyFunctionEffects()) {
18911 const auto NewFXOrig =
New->getFunctionEffects();
18913 if (OldFX != NewFXOrig) {
18917 for (
const auto &Diff : Diffs) {
18918 switch (Diff.shouldDiagnoseMethodOverride(*Old, OldFX, *
New, NewFX)) {
18922 Diag(
New->getLocation(), diag::warn_conflicting_func_effect_override)
18923 << Diff.effectName();
18928 NewFX.
insert(Diff.Old.value(), Errs);
18933 NewFT->getParamTypes(), EPI);
18934 New->setType(ModQT);
18935 if (Errs.empty()) {
18938 Diag(
New->getLocation(), diag::warn_mismatched_func_effect_override)
18939 << Diff.effectName();
18956 if (NewCC == OldCC)
18967 diag::err_conflicting_overriding_cc_attributes)
18977 if (!
New->isExplicitObjectMemberFunction())
18979 Diag(
New->getParamDecl(0)->getBeginLoc(),
18980 diag::err_explicit_object_parameter_nonmember)
18981 <<
New->getSourceRange() << 1 <<
false;
18983 New->setInvalidDecl();
18992 if (
Context.hasSameType(NewTy, OldTy) ||
19007 if (NewRT->getTypeClass() == OldRT->getTypeClass()) {
19017 diag::err_different_return_type_for_overriding_virtual_function)
19018 <<
New->getDeclName() << NewTy << OldTy
19019 <<
New->getReturnTypeSourceRange();
19026 if (!
Context.hasSameUnqualifiedType(NewClassTy, OldClassTy)) {
19035 diag::err_covariant_return_incomplete,
19036 New->getDeclName()))
19042 Diag(
New->getLocation(), diag::err_covariant_return_not_derived)
19043 <<
New->getDeclName() << NewTy << OldTy
19044 <<
New->getReturnTypeSourceRange();
19052 NewClassTy, OldClassTy,
19053 diag::err_covariant_return_inaccessible_base,
19054 diag::err_covariant_return_ambiguous_derived_to_base_conv,
19055 New->getLocation(),
New->getReturnTypeSourceRange(),
19056 New->getDeclName(),
nullptr)) {
19070 diag::err_covariant_return_type_different_qualifications)
19071 <<
New->getDeclName() << NewTy << OldTy
19072 <<
New->getReturnTypeSourceRange();
19082 diag::err_covariant_return_type_class_type_not_same_or_less_qualified)
19083 <<
New->getDeclName() << NewTy << OldTy
19084 <<
New->getReturnTypeSourceRange();
19096 Method->setRangeEnd(EndLoc);
19098 if (
Method->isVirtual() ||
Method->getParent()->isDependentContext()) {
19099 Method->setIsPureVirtual();
19103 if (!
Method->isInvalidDecl())
19104 Diag(
Method->getLocation(), diag::err_non_virtual_pure)
19105 <<
Method->getDeclName() << InitRange;
19112 else if (
auto *M = dyn_cast<CXXMethodDecl>(D))
19155 "Parser allowed 'typedef' as storage class of condition decl.");
19167 if (
auto *VD = dyn_cast<VarDecl>(Dcl))
19181 llvm::DenseMap<CXXRecordDecl *, bool>::iterator Pos =
19185 if (!Pos->second && VTable.DefinitionRequired)
19186 Pos->second =
true;
19190 VTablesUsed[VTable.Record] = VTable.DefinitionRequired;
19191 NewUses.push_back(
VTableUse(VTable.Record, VTable.Location));
19198 bool DefinitionRequired) {
19201 if (!
Class->isDynamicClass() ||
Class->isDependentContext() ||
19207 !
OpenMP().isInOpenMPDeclareTargetContext() &&
19208 !
OpenMP().isInOpenMPTargetExecutionDirective()) {
19209 if (!DefinitionRequired)
19217 std::pair<llvm::DenseMap<CXXRecordDecl *, bool>::iterator,
bool>
19223 if (DefinitionRequired && !Pos.first->second) {
19224 Pos.first->second =
true;
19234 if (
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
19255 if (
Class->isLocalClass())
19270 bool DefinedAnything =
false;
19271 for (
unsigned I = 0; I !=
VTableUses.size(); ++I) {
19276 Class->getTemplateSpecializationKind();
19280 bool DefineVTable =
true;
19285 if (
Class->isInCurrentModuleUnit()) {
19286 DefineVTable =
true;
19287 }
else if (KeyFunction && !KeyFunction->
hasBody()) {
19292 DefineVTable =
false;
19297 "Instantiations don't have key functions");
19299 }
else if (!KeyFunction) {
19304 bool IsExplicitInstantiationDeclaration =
19306 for (
auto *R :
Class->redecls()) {
19310 IsExplicitInstantiationDeclaration =
true;
19312 IsExplicitInstantiationDeclaration =
false;
19317 if (IsExplicitInstantiationDeclaration) {
19318 const bool HasExcludeFromExplicitInstantiation =
19326 return method->hasAttr<ExcludeFromExplicitInstantiationAttr>();
19328 if (!HasExcludeFromExplicitInstantiation)
19329 DefineVTable =
false;
19336 if (!DefineVTable) {
19344 DefinedAnything =
true;
19352 !(
Class->isInNamedModule() &&
Class->shouldEmitInExternalSource()))
19358 if (
Context.getTargetInfo().getCXXABI().hasKeyFunctions() &&
19359 Class->isExternallyVisible() &&
19360 !(
Class->getOwningModule() &&
19361 Class->getOwningModule()->isInterfaceOrPartition()) &&
19366 if (!KeyFunction || (KeyFunction->
hasBody(KeyFunctionDef) &&
19373 return DefinedAnything;
19378 for (
const auto *I : RD->
methods())
19379 if (I->isVirtual() && !I->isPureVirtual())
19385 bool ConstexprOnly) {
19389 for (
const auto &FinalOverrider : FinalOverriders) {
19390 for (
const auto &OverridingMethod : FinalOverrider.second) {
19391 assert(OverridingMethod.second.size() > 0 &&
"no final overrider");
19392 CXXMethodDecl *Overrider = OverridingMethod.second.front().Method;
19406 for (
const auto &I : RD->
bases()) {
19407 const auto *
Base = I.getType()->castAsCXXRecordDecl();
19408 if (
Base->getNumVBases() == 0)
19429 (void)
Target->hasBody(FNTarget);
19431 cast_or_null<CXXConstructorDecl>(FNTarget));
19436 *TCanonical =
Target?
Target->getCanonicalDecl() :
nullptr;
19438 if (!Current.insert(Canonical).second)
19443 Target->isInvalidDecl() ||
Valid.count(TCanonical)) {
19444 Valid.insert_range(Current);
19447 }
else if (TCanonical == Canonical ||
Invalid.count(TCanonical) ||
19448 Current.count(TCanonical)) {
19450 if (!
Invalid.count(TCanonical)) {
19452 diag::warn_delegating_ctor_cycle)
19456 if (TCanonical != Canonical)
19457 S.
Diag(
Target->getLocation(), diag::note_it_delegates_to);
19460 while (
C->getCanonicalDecl() != Canonical) {
19462 (void)
C->getTargetConstructor()->hasBody(FNTarget);
19463 assert(FNTarget &&
"Ctor cycle through bodiless function");
19467 S.
Diag(
C->getLocation(), diag::note_which_delegates_to);
19471 Invalid.insert_range(Current);
19482 for (DelegatingCtorDeclsType::iterator
19489 CI->setInvalidDecl();
19498 explicit FindCXXThisExpr(
Sema &S) : S(S) {}
19526 FindCXXThisExpr Finder(*
this);
19539 if (!Finder.TraverseStmt(
const_cast<Expr *
>(TRC.ConstraintExpr)))
19556 FindCXXThisExpr Finder(*
this);
19578 if (!Finder.TraverseType(E))
19588 FindCXXThisExpr Finder(*
this);
19591 for (
const auto *A :
Method->attrs()) {
19593 Expr *Arg =
nullptr;
19595 if (
const auto *G = dyn_cast<GuardedByAttr>(A))
19597 else if (
const auto *G = dyn_cast<PtGuardedByAttr>(A))
19599 else if (
const auto *AA = dyn_cast<AcquiredAfterAttr>(A))
19601 else if (
const auto *AB = dyn_cast<AcquiredBeforeAttr>(A))
19603 else if (
const auto *LR = dyn_cast<LockReturnedAttr>(A))
19604 Arg = LR->getArg();
19605 else if (
const auto *LE = dyn_cast<LocksExcludedAttr>(A))
19607 else if (
const auto *RC = dyn_cast<RequiresCapabilityAttr>(A))
19609 else if (
const auto *AC = dyn_cast<AcquireCapabilityAttr>(A))
19611 else if (
const auto *AC = dyn_cast<TryAcquireCapabilityAttr>(A)) {
19612 Arg = AC->getSuccessValue();
19614 }
else if (
const auto *RC = dyn_cast<ReleaseCapabilityAttr>(A))
19617 if (Arg && !Finder.TraverseStmt(Arg))
19620 for (
Expr *A : Args) {
19621 if (!Finder.TraverseStmt(A))
19635 Exceptions.clear();
19638 Exceptions.reserve(DynamicExceptions.size());
19639 for (
unsigned ei = 0, ee = DynamicExceptions.size(); ei != ee; ++ei) {
19646 if (!Unexpanded.empty()) {
19657 Exceptions.push_back(ET);
19667 "Parser should have made sure that the expression is boolean");
19687 D = FTD->getTemplatedDecl();
19697 DynamicExceptionRanges, NoexceptExpr, Exceptions,
19701 Context.adjustExceptionSpec(FD, ESI,
true);
19725 Diag(DeclStart, diag::err_anonymous_property);
19739 TInfo =
Context.getTrivialTypeSourceInfo(
T, Loc);
19750 diag::err_invalid_thread)
19758 switch (
Previous.getResultKind()) {
19765 PrevDecl =
Previous.getRepresentativeDecl();
19778 PrevDecl =
nullptr;
19782 PrevDecl =
nullptr;
19793 Record->setInvalidDecl();
19815 if (!ExplicitLists.empty()) {
19816 bool IsMemberSpecialization, IsInvalid;
19820 ExplicitLists,
false, IsMemberSpecialization, IsInvalid,
19832 if (ExplicitParams && !ExplicitParams->
empty()) {
19833 Info.AutoTemplateParameterDepth = ExplicitParams->
getDepth();
19834 llvm::append_range(Info.TemplateParams, *ExplicitParams);
19835 Info.NumExplicitTemplateParams = ExplicitParams->
size();
19837 Info.AutoTemplateParameterDepth = TemplateParameterDepth;
19838 Info.NumExplicitTemplateParams = 0;
19844 if (FSI.TemplateParams.size() > FSI.NumExplicitTemplateParams) {
19845 if (FSI.NumExplicitTemplateParams != 0) {
19866 assert(
Context.getTargetInfo().getCXXABI().isMicrosoft());
19876 if (NumParams == 0)
19885 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)
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 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 Sema::ImplicitExceptionSpecification ComputeDefaultedComparisonExceptionSpec(Sema &S, SourceLocation Loc, FunctionDecl *FD, Sema::DefaultedComparisonKind DCK)
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 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 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 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 TemplateDeductionResult DeduceTemplateArguments(Sema &S, TemplateParameterList *TemplateParams, ArrayRef< TemplateArgument > Ps, ArrayRef< TemplateArgument > As, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced, bool NumberOfArgumentsMustMatch, bool PartialOrdering, PackFold PackFold, bool *HasDeducedAnyParam)
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.
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...
void setDecomposedDecl(ValueDecl *Decomposed)
Set the decomposed variable for this BindingDecl.
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...
bool isDefaultConstructor() const
Whether this constructor is a default constructor (C++ [class.ctor]p5), which can be used to default-...
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...
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
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={}, ArrayRef< TemplateParameterList * > FriendTypeTPLists={})
void setUnsupportedFriend(bool Unsupported)
static FriendTemplateDecl * Create(ASTContext &Context, DeclContext *DC, SourceLocation Loc, MutableArrayRef< TemplateParameterList * > Params, FriendUnion Friend, SourceLocation FriendLoc)
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.
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.
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.
SourceRange getSourceRange() const LLVM_READONLY
Retrieve the source range covering the entirety of this nested-name-specifier.
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...
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.
@ 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.
For a defaulted function, the kind of defaulted function that it is.
DefaultedComparisonKind asComparison() const
bool isSpecialMember() const
bool isComparison() const
CXXSpecialMemberKind asSpecialMember() const
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.
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,...
DefaultedFunctionKind getDefaultedFunctionKind(const FunctionDecl *FD)
Determine the kind of defaulting that would be done for a given function.
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.
CXXSpecialMemberKind getSpecialMember(const CXXMethodDecl *MD)
@ 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.
DeclResult ActOnTemplatedFriendTag(Scope *S, SourceLocation FriendLoc, unsigned TagSpec, SourceLocation TagLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, SourceLocation EllipsisLoc, const ParsedAttributesView &Attr, MultiTemplateParamsArg TempParamLists)
Handle a friend tag declaration where the scope specifier was templated.
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...
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.
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()
@ 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.
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,...
llvm::FoldingSet< SpecialMemberOverloadResultEntry > SpecialMemberCache
A cache of special member function overload resolution results for C++ records.
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...
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)
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)
ExprResult BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field)
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.
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)
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...
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)
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.
The JSON file list parser is used to communicate input to InstallAPI.
bool FTIHasNonVoidParameters(const DeclaratorChunk::FunctionTypeInfo &FTI)
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified 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.
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.
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.
__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.
SourceLocation TemplateNameLoc
TemplateNameLoc - The location of the template name within the source.
SourceLocation RAngleLoc
The location of the '>' after the template argument list.
SourceLocation LAngleLoc
The location of the '<' before the template argument list.
OpaquePtr< T > get() const