51#include "llvm/ADT/ArrayRef.h"
52#include "llvm/ADT/STLExtras.h"
53#include "llvm/ADT/StringExtras.h"
54#include "llvm/Support/ConvertUTF.h"
55#include "llvm/Support/SaveAndRestore.h"
72class CheckDefaultArgumentVisitor
75 const Expr *DefaultArg;
78 CheckDefaultArgumentVisitor(Sema &S,
const Expr *DefaultArg)
79 : S(S), DefaultArg(DefaultArg) {}
81 bool VisitExpr(
const Expr *Node);
82 bool VisitDeclRefExpr(
const DeclRefExpr *DRE);
83 bool VisitCXXThisExpr(
const CXXThisExpr *ThisE);
84 bool VisitLambdaExpr(
const LambdaExpr *Lambda);
85 bool VisitPseudoObjectExpr(
const PseudoObjectExpr *POE);
86 bool VisitCoawaitExpr(
const CoawaitExpr *E);
87 bool VisitCoyieldExpr(
const CoyieldExpr *E);
91bool CheckDefaultArgumentVisitor::VisitExpr(
const Expr *Node) {
92 bool IsInvalid =
false;
93 for (
const Stmt *SubStmt : Node->
children())
95 IsInvalid |= Visit(SubStmt);
102bool CheckDefaultArgumentVisitor::VisitDeclRefExpr(
const DeclRefExpr *DRE) {
108 if (
const auto *Param = dyn_cast<ParmVarDecl>(Decl)) {
119 diag::err_param_default_argument_references_param)
121 }
else if (
auto *VD =
Decl->getPotentiallyDecomposedVarDecl()) {
136 diag::err_param_default_argument_references_local)
143bool CheckDefaultArgumentVisitor::VisitCXXThisExpr(
const CXXThisExpr *ThisE) {
148 diag::err_param_default_argument_references_this)
152bool CheckDefaultArgumentVisitor::VisitPseudoObjectExpr(
153 const PseudoObjectExpr *POE) {
157 if (
const auto *OVE = dyn_cast<OpaqueValueExpr>(E)) {
158 E = OVE->getSourceExpr();
159 assert(E &&
"pseudo-object binding without source expression?");
167bool CheckDefaultArgumentVisitor::VisitLambdaExpr(
const LambdaExpr *Lambda) {
174 for (
const LambdaCapture &LC : Lambda->
captures()) {
176 return S.
Diag(LC.getLocation(), diag::err_lambda_capture_default_arg);
179 Invalid |= Visit(D->getInit());
184bool CheckDefaultArgumentVisitor::VisitCoawaitExpr(
const CoawaitExpr *E) {
194bool CheckDefaultArgumentVisitor::VisitCoyieldExpr(
const CoyieldExpr *E) {
211 Proto = Self->ResolveExceptionSpec(CallLoc, Proto);
228 llvm_unreachable(
"should not see unresolved exception specs here");
257 "should not generate implicit declarations for dependent cases");
261 assert(EST ==
EST_Dynamic &&
"EST case not considered earlier.");
263 "Shouldn't collect exceptions when throw-all is guaranteed.");
267 if (ExceptionsSeen.insert(Self->Context.getCanonicalType(E)).second)
268 Exceptions.push_back(E);
296 if (Self->canThrow(S))
303 diag::err_typecheck_decl_incomplete_type))
322 CheckCompletedExpr(Arg, EqualLoc);
331 Param->setDefaultArg(Arg);
335 UnparsedDefaultArgInstantiationsMap::iterator InstPos
338 for (
auto &Instantiation : InstPos->second)
339 Instantiation->setUninstantiatedDefaultArg(Arg);
349 if (!param || !DefaultArg)
357 Diag(EqualLoc, diag::err_param_default_argument)
371 if (Param->isParameterPack()) {
372 Diag(EqualLoc, diag::err_param_default_argument_on_parameter_pack)
375 Param->setDefaultArg(
nullptr);
390 CheckDefaultArgumentVisitor DefaultArgChecker(*
this, DefaultArg);
391 if (DefaultArgChecker.Visit(DefaultArg))
404 Param->setUnparsedDefaultArg();
414 Param->setInvalidDecl();
419 Param->getType().getNonReferenceType());
422 Param->getType().getNonReferenceType());
424 Param->setDefaultArg(RE.
get());
439 if (MightBeFunction) {
443 MightBeFunction =
false;
446 for (
unsigned argIdx = 0, e = chunk.
Fun.
NumParams; argIdx != e;
449 if (Param->hasUnparsedDefaultArg()) {
450 std::unique_ptr<CachedTokens> Toks =
453 if (Toks->size() > 1)
455 Toks->back().getLocation());
458 Diag(Param->getLocation(), diag::err_param_default_argument_nonfunc)
460 }
else if (Param->getDefaultArg()) {
461 Diag(Param->getLocation(), diag::err_param_default_argument_nonfunc)
462 << Param->getDefaultArg()->getSourceRange();
463 Param->setDefaultArg(
nullptr);
467 MightBeFunction =
false;
474 return P->hasDefaultArg() && !P->hasInheritedDefaultArg();
486 ?
New->getLexicalDeclContext()
487 :
New->getDeclContext();
491 for (; PrevForDefaultArgs;
494 PrevForDefaultArgs =
New->isLocalExternDecl()
502 !
New->isCXXClassMember()) {
547 for (
unsigned p = 0, NumParams = PrevForDefaultArgs
550 p < NumParams; ++p) {
554 bool OldParamHasDfl = OldParam ? OldParam->
hasDefaultArg() :
false;
557 if (OldParamHasDfl && NewParamHasDfl) {
558 unsigned DiagDefaultParamID =
559 diag::err_param_default_argument_redefinition;
574 DiagDefaultParamID = diag::ext_param_default_argument_redefinition;
592 for (
auto Older = PrevForDefaultArgs;
594 Older = Older->getPreviousDecl();
595 OldParam = Older->getParamDecl(p);
600 }
else if (OldParamHasDfl) {
606 !
New->getLexicalDeclContext()->isDependentContext()) {
618 }
else if (NewParamHasDfl) {
619 if (
New->getDescribedFunctionTemplate()) {
622 diag::err_param_default_argument_template_redecl)
625 diag::note_template_prev_declaration)
627 }
else if (
New->getTemplateSpecializationKind()
641 <<
New->getDeclName()
643 }
else if (
New->getDeclContext()->isDependentContext()) {
655 = dyn_cast<CXXRecordDecl>(
New->getDeclContext())) {
656 if (
Record->getDescribedClassTemplate())
665 diag::err_param_default_argument_member_template_redecl)
681 if (NewSM != OldSM) {
684 Diag(NewParam->
getLocation(), diag::err_default_arg_makes_ctor_special)
695 Diag(
New->getLocation(), diag::err_constexpr_redecl_mismatch)
705 (
New->isInlineSpecified() ||
710 Diag(
New->getLocation(), diag::err_inline_decl_follows_def) <<
New;
720 !
New->isFunctionTemplateSpecialization() &&
isVisible(Old)) {
721 Diag(
New->getLocation(), diag::err_deduction_guide_redeclared);
731 Diag(
New->getLocation(), diag::err_friend_decl_with_def_arg_redeclared);
743 if (
New->isThisDeclarationInstantiatedFromAFriendDefinition() &&
752 ? diag::warn_cxx23_placeholder_var_definition
753 : diag::ext_placeholder_var_definition);
771 if (!TemplateParamLists.empty()) {
777 Diag(TemplateParamLists.front()->getTemplateLoc(),
778 diag::err_decomp_decl_template);
784 DiagID = diag::compat_pre_cxx17_decomp_decl;
787 ? diag::compat_cxx26_decomp_decl_cond
788 : diag::compat_pre_cxx26_decomp_decl_cond;
790 DiagID = diag::compat_cxx17_decomp_decl;
811 Diag(Loc, diag::err_decomp_decl_spec) << Name;
814 auto DiagCpp20Specifier = [&](StringRef Name,
SourceLocation Loc) {
815 DiagCompat(Loc, diag_compat::decomp_decl_spec) << Name;
818 if (
auto SCS = DS.getStorageClassSpec()) {
821 DS.getStorageClassSpecLoc());
824 DS.getStorageClassSpecLoc());
826 if (
auto TSCS = DS.getThreadStorageClassSpec())
828 DS.getThreadStorageClassSpecLoc());
830 if (DS.isInlineSpecified())
831 DiagBadSpecifier(
"inline", DS.getInlineSpecLoc());
838 DS.getConstexprSpecLoc());
849 Diag(DS.getVolatileSpecLoc(),
850 diag::warn_deprecated_volatile_structured_binding);
870 ? diag::err_decomp_decl_parens
871 : diag::err_decomp_decl_type)
877 if (R->isFunctionType())
882 if (DS.isConstrainedAuto()) {
885 "No other template kind should be possible for a constrained auto");
903 assert(VarName &&
"Cannot have an unnamed binding declaration");
912 Previous.getFoundDecl()->isTemplateParameter()) {
918 if (B.EllipsisLoc.isValid()) {
920 Diag(B.EllipsisLoc, diag::err_pack_outside_template);
921 QT =
Context.getPackExpansionType(
Context.DependentTy, std::nullopt,
927 if (BD->isParameterPack()) {
929 CSI->LocalPacks.push_back(BD);
958 auto *Old =
Previous.getRepresentativeDecl();
959 Diag(B.NameLoc, diag::err_redefinition) << B.Name;
960 Diag(Old->getLocation(), diag::note_previous_definition);
978 bool AddToScope =
true;
987 if (
OpenMP().isInOpenMPDeclareTargetContext())
988 OpenMP().checkDeclIsAllowedInOpenMPTarget(
nullptr,
New);
998 unsigned MemberCount) {
999 auto BindingWithPackItr = llvm::find_if(
1001 bool HasPack = BindingWithPackItr !=
Bindings.end();
1004 IsValid =
Bindings.size() == MemberCount;
1007 IsValid = MemberCount >=
Bindings.size() - 1;
1010 if (IsValid && HasPack) {
1012 unsigned PackSize = MemberCount -
Bindings.size() + 1;
1018 for (
unsigned I = 0; I < PackSize; ++I) {
1023 NestedBDs[I] = NestedBD;
1036 S.
Diag(DD->
getLocation(), diag::err_decomp_decl_wrong_number_bindings)
1038 << (MemberCount <
Bindings.size());
1053 for (
auto *B : DD->flat_bindings()) {
1058 E = GetInit(Loc, E.
get(), I++);
1061 B->setBinding(ElemType, E.
get());
1070 const llvm::APSInt &NumElems,
1073 S,
Bindings, Src, DecompType, NumElems, ElemType,
1104 S,
Bindings, Src, DecompType, llvm::APSInt::get(2),
1108 return S.CreateBuiltinUnaryOp(Loc, I ? UO_Imag : UO_Real, Base);
1116 llvm::raw_svector_ostream OS(SS);
1128 return std::string(OS.str());
1133 auto DiagnoseMissing = [&] {
1143 return DiagnoseMissing();
1153 return DiagnoseMissing();
1154 if (
Result.isAmbiguous())
1159 Result.suppressDiagnostics();
1161 S.
Diag(Loc, diag::err_std_type_trait_not_class_template) << Trait;
1162 S.
Diag(
Found->getLocation(), diag::note_declared_at);
1176 Loc, TraitTy, DiagID,
1186 assert(RD &&
"specialization of class template is not a class?");
1191static TemplateArgumentLoc
1198static TemplateArgumentLoc
1203namespace {
enum class IsTupleLike { TupleLike, NotTupleLike, Error }; }
1206 unsigned &OutSize) {
1216 return IsTupleLike::NotTupleLike;
1224 return IsTupleLike::NotTupleLike;
1233 : R(R), Args(Args) {}
1236 return S.
Diag(Loc, diag::err_decomp_decl_std_tuple_size_not_constant)
1240 } Diagnoser(R, Args);
1245 return IsTupleLike::Error;
1250 return IsTupleLike::Error;
1254 if (Size < 0 || Size >=
UINT_MAX) {
1257 S.
Diag(Loc, diag::err_decomp_decl_std_tuple_size_invalid)
1260 << StringRef(Str.data(), Str.size());
1261 return IsTupleLike::Error;
1264 OutSize = Size.getExtValue();
1265 return IsTupleLike::TupleLike;
1279 diag::err_decomp_decl_std_tuple_element_not_specialized);
1288 auto *TD = R.getAsSingle<
TypeDecl>();
1290 R.suppressDiagnostics();
1291 S.
Diag(Loc, diag::err_decomp_decl_std_tuple_element_not_specialized)
1295 S.
Diag(R.getRepresentativeDecl()->getLocation(), diag::note_declared_at);
1304struct InitializingBinding {
1306 InitializingBinding(Sema &S, BindingDecl *BD) : S(S) {
1307 Sema::CodeSynthesisContext Ctx;
1313 ~InitializingBinding() {
1322 unsigned NumElems) {
1336 bool UseMemberGet =
false;
1346 dyn_cast<FunctionTemplateDecl>(D->getUnderlyingDecl())) {
1348 if (TPL->
size() != 0 &&
1351 UseMemberGet =
true;
1359 for (
auto *B : DD->flat_bindings()) {
1360 InitializingBinding InitContext(S, B);
1383 MemberGet, &Args,
nullptr);
1425 B->getDeclName().getAsIdentifierInfo(),
U,
1430 if (
const auto *CIAttr = Src->
getAttr<ConstInitAttr>())
1431 BindingVD->addAttr(CIAttr->clone(S.
Context));
1432 BindingVD->setImplicit();
1434 BindingVD->setInlineSpecified();
1435 BindingVD->getLexicalDeclContext()->addHiddenDecl(BindingVD);
1440 E =
Seq.Perform(S, Entity, Kind,
Init);
1446 BindingVD->setInit(E.
get());
1454 B->setBinding(
T, E.
get());
1469 return Specifier->getType()->getAsCXXRecordDecl()->hasDirectFields();
1478 ClassWithFields = RD;
1490 for (
auto &P : Paths) {
1494 BestPath->back().Base->getType())) {
1496 S.
Diag(Loc, diag::err_decomp_decl_multiple_bases_with_members)
1497 <<
false << RD << BestPath->back().Base->getType()
1498 << P.back().Base->getType();
1500 }
else if (P.Access < BestPath->
Access) {
1506 QualType BaseType = BestPath->back().Base->getType();
1508 S.
Diag(Loc, diag::err_decomp_decl_ambiguous_base)
1515 *BestPath, diag::err_decomp_decl_inaccessible_base);
1518 ClassWithFields = BaseType->getAsCXXRecordDecl();
1526 S.
Diag(Loc, diag::err_decomp_decl_multiple_bases_with_members)
1527 << (ClassWithFields == RD) << RD << ClassWithFields
1528 << Paths.
front().back().Base->getType();
1539 const auto *RD = cast_or_null<CXXRecordDecl>(BasePair.
getDecl());
1543 for (
auto *FD : RD->fields()) {
1544 if (FD->isUnnamedBitField())
1549 if (!FD->getDeclName()) {
1550 if (RD->isLambda()) {
1551 S.
Diag(Loc, diag::err_decomp_decl_lambda);
1552 S.
Diag(RD->getLocation(), diag::note_lambda_decl);
1556 if (FD->isAnonymousStructOrUnion()) {
1557 S.
Diag(Loc, diag::err_decomp_decl_anon_union_member)
1559 S.
Diag(FD->getLocation(), diag::note_declared_at);
1572 BasePair.
getAccess(), FD->getAccess())));
1581 diag::err_incomplete_type))
1587 const auto *RD = cast_or_null<CXXRecordDecl>(BasePair.
getDecl());
1594 unsigned NumFields = llvm::count_if(
1595 RD->fields(), [](
FieldDecl *FD) { return !FD->isUnnamedBitField(); });
1602 auto FlatBindings = DD->flat_bindings();
1603 assert(llvm::range_size(FlatBindings) == NumFields);
1604 auto FlatBindingsItr = FlatBindings.begin();
1610 for (
auto *FD : RD->fields()) {
1615 assert(FlatBindingsItr != FlatBindings.end());
1657 if (B->getType().isNull())
1658 B->setType(
Context.DependentTy);
1670 if (
auto *CAT =
Context.getAsConstantArrayType(DecompType)) {
1691 case IsTupleLike::Error:
1695 case IsTupleLike::TupleLike:
1700 case IsTupleLike::NotTupleLike:
1709 << DD << !RD << DecompType;
1724 assert(!
T->isDependentType());
1729 T =
Context.getQualifiedType(Unqual, Quals);
1732 return static_cast<unsigned>(CAT->getSize().getZExtValue());
1734 return VT->getNumElements();
1740 case IsTupleLike::Error:
1741 return std::nullopt;
1742 case IsTupleLike::TupleLike:
1744 case IsTupleLike::NotTupleLike:
1749 if (!OrigRD || OrigRD->
isUnion())
1750 return std::nullopt;
1753 return std::nullopt;
1758 const auto *RD = cast_or_null<CXXRecordDecl>(BasePair.
getDecl());
1760 return std::nullopt;
1762 unsigned NumFields = llvm::count_if(
1763 RD->fields(), [](
FieldDecl *FD) { return !FD->isUnnamedBitField(); });
1766 return std::nullopt;
1777 "Should only be called if types are otherwise the same.");
1785 NewType = R->getPointeeType();
1804 New->setInvalidDecl();
1818 if (FTD->isMemberSpecialization())
1827 if (Param->hasDefaultArg())
1838 if (Param->hasDefaultArg() || Param->isParameterPack() ||
1842 if (Param->isInvalidDecl())
1844 else if (Param->getIdentifier())
1845 Diag(Param->getLocation(), diag::err_param_default_argument_missing_name)
1846 << Param->getIdentifier();
1848 Diag(Param->getLocation(), diag::err_param_default_argument_missing);
1855template <
typename... Ts>
1859 if (
T->isDependentType())
1865 std::forward<Ts>(DiagArgs)...);
1868 return !
T->isLiteralType(SemaRef.
Context);
1871 llvm_unreachable(
"unknown CheckConstexprKind");
1879 "this check is obsolete for C++23");
1882 T->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
1890 SemaRef.
Diag(Loc, diag::note_constexpr_dtor_subobject)
1898 if (!Check(B.getBaseTypeLoc(), B.getType(),
nullptr))
1901 if (!Check(FD->getLocation(), FD->getType(), FD))
1912 "this check is obsolete for C++23");
1913 unsigned ArgIndex = 0;
1916 e = FT->param_type_end();
1917 i != e; ++i, ++ArgIndex) {
1919 assert(PD &&
"null in a parameter list");
1922 diag::err_constexpr_non_literal_param, ArgIndex + 1,
1935 "this check is obsolete for C++23");
1937 diag::err_constexpr_non_literal_return,
1956 default: llvm_unreachable(
"Invalid tag kind for record diagnostic!");
1984 for (
const auto &I : RD->
vbases())
1985 Diag(I.getBeginLoc(), diag::note_constexpr_virtual_base_here)
1986 << I.getSourceRange();
2000 Diag(
Method->getLocation(), diag::warn_cxx17_compat_constexpr_virtual);
2006 Diag(
Method->getLocation(), diag::err_constexpr_virtual);
2013 if (WrittenVirtual !=
Method)
2015 diag::note_overridden_virtual_function);
2026 if (
auto *Dtor = dyn_cast<CXXDestructorDecl>(NewFD)) {
2031 !Dtor->getParent()->defaultedDestructorIsConstexpr()) {
2046 "CheckConstexprFunctionDefinition called on function with no body");
2061 for (
const auto *DclIt : DS->
decls()) {
2062 switch (DclIt->getKind()) {
2063 case Decl::StaticAssert:
2065 case Decl::UsingShadow:
2066 case Decl::UsingDirective:
2067 case Decl::UnresolvedUsingTypename:
2068 case Decl::UnresolvedUsingValue:
2069 case Decl::UsingEnum:
2076 case Decl::CXXExpansionStmt:
2080 case Decl::TypeAlias: {
2084 if (TN->getUnderlyingType()->isVariablyModifiedType()) {
2087 TypeLoc TL = TN->getTypeSourceInfo()->getTypeLoc();
2098 case Decl::CXXRecord:
2103 diag_compat::constexpr_type_definition)
2111 case Decl::EnumConstant:
2112 case Decl::IndirectField:
2119 case Decl::Decomposition: {
2125 if (VD->isThisDeclarationADefinition()) {
2126 if (VD->isStaticLocal()) {
2129 diag_compat::constexpr_static_var)
2136 if (SemaRef.
LangOpts.CPlusPlus23) {
2138 diag::warn_cxx20_compat_constexpr_var,
2141 SemaRef, Kind, VD->getLocation(), VD->getType(),
2142 diag::err_constexpr_local_var_non_literal_type,
2146 if (!VD->getType()->isDependentType() &&
2147 !VD->hasInit() && !VD->isCXXForRangeDecl()) {
2150 diag_compat::constexpr_local_var_no_init)
2159 SemaRef.
DiagCompat(VD->getLocation(), diag_compat::constexpr_local_var)
2167 case Decl::NamespaceAlias:
2168 case Decl::Function:
2177 SemaRef.
Diag(DS->
getBeginLoc(), diag::err_constexpr_body_invalid_stmt)
2211 if (Field->isInvalidDecl())
2214 if (Field->isUnnamedBitField())
2220 if (Field->isAnonymousStructOrUnion() &&
2221 (Field->getType()->isUnionType()
2222 ? !Field->getType()->getAsCXXRecordDecl()->hasVariantMembers()
2223 : Field->getType()->getAsCXXRecordDecl()->isEmpty()))
2226 if (!
Inits.count(Field)) {
2230 diag_compat::constexpr_ctor_missing_init);
2233 SemaRef.
Diag(Field->getLocation(),
2234 diag::note_constexpr_ctor_missing_init);
2238 }
else if (Field->isAnonymousStructOrUnion()) {
2239 const auto *RD = Field->getType()->castAsRecordDecl();
2240 for (
auto *I : RD->fields())
2243 if (!RD->isUnion() ||
Inits.count(I))
2261 case Stmt::NullStmtClass:
2265 case Stmt::DeclStmtClass:
2275 case Stmt::ReturnStmtClass:
2287 case Stmt::AttributedStmtClass:
2292 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind);
2294 case Stmt::CompoundStmtClass: {
2300 for (
auto *BodyIt : CompStmt->
body()) {
2302 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2308 case Stmt::IfStmtClass: {
2315 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2317 if (
If->getElse() &&
2319 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2324 case Stmt::WhileStmtClass:
2325 case Stmt::DoStmtClass:
2326 case Stmt::ForStmtClass:
2327 case Stmt::CXXForRangeStmtClass:
2328 case Stmt::ContinueStmtClass:
2338 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2343 case Stmt::SwitchStmtClass:
2344 case Stmt::CaseStmtClass:
2345 case Stmt::DefaultStmtClass:
2346 case Stmt::BreakStmtClass:
2354 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2359 case Stmt::LabelStmtClass:
2360 case Stmt::GotoStmtClass:
2361 case Stmt::IndirectGotoStmtClass:
2367 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2372 case Stmt::GCCAsmStmtClass:
2373 case Stmt::MSAsmStmtClass:
2375 case Stmt::CXXTryStmtClass:
2381 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2386 case Stmt::CXXCatchStmtClass:
2391 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2443 diag_compat::constexpr_function_try_block)
2458 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2469 }
else if (Cxx2bLoc.
isValid()) {
2470 SemaRef.
DiagCompat(Cxx2bLoc, diag_compat::cxx23_constexpr_body_invalid_stmt)
2472 }
else if (Cxx2aLoc.
isValid()) {
2473 SemaRef.
DiagCompat(Cxx2aLoc, diag_compat::cxx20_constexpr_body_invalid_stmt)
2475 }
else if (Cxx1yLoc.
isValid()) {
2476 SemaRef.
DiagCompat(Cxx1yLoc, diag_compat::cxx14_constexpr_body_invalid_stmt)
2481 = dyn_cast<CXXConstructorDecl>(Dcl)) {
2494 diag_compat::constexpr_union_ctor_no_init);
2503 bool AnyAnonStructUnionMembers =
false;
2504 unsigned Fields = 0;
2506 E = RD->
field_end(); I != E; ++I, ++Fields) {
2507 if (I->isAnonymousStructOrUnion()) {
2508 AnyAnonStructUnionMembers =
true;
2516 if (AnyAnonStructUnionMembers ||
2526 Inits.insert(ID->chain_begin(), ID->chain_end());
2529 bool Diagnosed =
false;
2530 for (
auto *I : RD->
fields())
2537 if (ReturnStmts.empty()) {
2552 }
else if (ReturnStmts.size() > 1) {
2556 diag_compat::constexpr_body_multiple_return);
2557 for (
unsigned I = 0; I < ReturnStmts.size() - 1; ++I)
2558 SemaRef.
Diag(ReturnStmts[I],
2559 diag::note_constexpr_body_previous_return);
2587 !SemaRef.
getLangOpts().CheckConstexprFunctionBodies ||
2590 diag::ext_constexpr_function_never_constant_expr, Dcl->
getLocation());
2595 diag::ext_constexpr_function_never_constant_expr)
2598 for (
const auto &
Diag : Diags)
2614 if (SemaRef.
getLangOpts().CPlusPlus23 && !IsVoidOrDependentType)
2621 bool OK = SemaRef.
getLangOpts().CPlusPlus14 && IsVoidOrDependentType;
2623 OK ? diag::warn_cxx11_compat_constexpr_body_no_return
2624 : diag::err_constexpr_body_no_return)
2638 Diag(it->second, diag::err_immediate_function_used_before_definition)
2651 "expected an immediate function");
2652 assert(FD->
hasBody() &&
"expected the function to have a body");
2657 bool ImmediateFnIsConstructor;
2664 ShouldVisitImplicitCode =
true;
2665 ShouldVisitLambdaBody =
false;
2671 if (CurrentConstructor && CurrentInit) {
2679 SemaRef.Diag(Loc, diag::note_immediate_function_reason)
2680 << ImmediateFn << Fn << Fn->isConsteval() << IsCall
2682 << (InitializedField !=
nullptr)
2683 << (CurrentInit && !CurrentInit->
isWritten())
2684 << InitializedField << Range;
2686 bool TraverseCallExpr(
CallExpr *E)
override {
2687 if (
const auto *DR =
2689 DR && DR->isImmediateEscalating()) {
2695 if (!TraverseStmt(A))
2702 if (
const auto *ReferencedFn = dyn_cast<FunctionDecl>(E->
getDecl());
2704 Diag(E, ReferencedFn,
false);
2727 return DynamicRecursiveASTVisitor::TraverseCXXConstructorDecl(Ctr);
2730 bool TraverseType(
QualType T,
bool TraverseQualifier)
override {
2733 bool VisitBlockExpr(
BlockExpr *
T)
override {
return true; }
2735 } Visitor(*
this, FD);
2736 Visitor.TraverseDecl(FD);
2747 return dyn_cast_or_null<CXXRecordDecl>(DC);
2750 return dyn_cast_or_null<CXXRecordDecl>(
CurContext);
2768 CurDecl = dyn_cast_or_null<CXXRecordDecl>(DC);
2770 CurDecl = dyn_cast_or_null<CXXRecordDecl>(
CurContext);
2789 if (BaseType->containsErrors()) {
2794 if (EllipsisLoc.
isValid() && !BaseType->containsUnexpandedParameterPack()) {
2795 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
2809 if (BaseDecl->isUnion()) {
2810 Diag(BaseLoc, diag::err_union_as_base_class) << SpecifierRange;
2814 if (BaseType.hasQualifiers()) {
2816 BaseType.getQualifiers().getAsString(
Context.getPrintingPolicy());
2817 Diag(BaseLoc, diag::warn_qual_base_type)
2818 << Quals << llvm::count(Quals,
' ') + 1 << BaseType;
2819 Diag(BaseLoc, diag::note_base_class_specified_here) << BaseType;
2823 if (
Context.getTargetInfo().getCXXABI().isMicrosoft() ||
2824 Context.getTargetInfo().getTriple().isPS()) {
2826 if (
auto *BaseSpec =
2827 dyn_cast<ClassTemplateSpecializationDecl>(BaseDecl)) {
2836 Class->setInvalidDecl();
2840 BaseDecl = BaseDecl->getDefinition();
2841 assert(BaseDecl &&
"Base type is not incomplete, but has no definition");
2846 const auto *BaseCSA = BaseDecl->getAttr<CodeSegAttr>();
2847 const auto *DerivedCSA =
Class->getAttr<CodeSegAttr>();
2848 if ((DerivedCSA || BaseCSA) &&
2849 (!BaseCSA || !DerivedCSA ||
2850 BaseCSA->getName() != DerivedCSA->getName())) {
2851 Diag(
Class->getLocation(), diag::err_mismatched_code_seg_base);
2852 Diag(BaseDecl->getLocation(), diag::note_base_class_specified_here)
2863 if (BaseDecl->hasFlexibleArrayMember()) {
2864 Diag(BaseLoc, diag::err_base_class_has_flexible_array_member)
2865 << BaseDecl->getDeclName();
2872 if (FinalAttr *FA = BaseDecl->getAttr<FinalAttr>()) {
2873 Diag(BaseLoc, diag::err_class_marked_final_used_as_base)
2874 << BaseDecl->getDeclName() << FA->isSpelledAsSealed();
2875 Diag(BaseDecl->getLocation(), diag::note_entity_declared_at)
2876 << BaseDecl->getDeclName() << FA->getRange();
2881 if (BaseDecl->isInvalidDecl())
2882 Class->setInvalidDecl();
2883 }
else if (BaseType->isDependentType()) {
2890 if (!
Class->isDependentContext())
2891 Class->setInvalidDecl();
2894 Diag(BaseLoc, diag::err_base_must_be_class) << SpecifierRange;
2906 Access, TInfo, EllipsisLoc);
2923 Class->setIsParsingBaseSpecifiers();
2933 Diag(AL.getLoc(), diag::err_base_specifier_attribute)
2934 << AL << AL.isRegularKeywordAttribute() << AL.getRange();
2947 if (
Class->isUnion()) {
2948 Diag(
Class->getLocation(), diag::err_base_clause_on_union)
2958 Class->setInvalidDecl();
2975 for (
const auto &BaseSpec :
Decl->bases()) {
2976 QualType Base = Context.getCanonicalType(BaseSpec.getType())
2977 .getUnqualifiedType();
2994 std::map<QualType, CXXBaseSpecifier*, QualTypeOrdering> KnownBaseTypes;
3001 unsigned NumGoodBases = 0;
3003 for (
unsigned idx = 0; idx < Bases.size(); ++idx) {
3013 Diag(Bases[idx]->getBeginLoc(), diag::err_duplicate_base_class)
3014 << KnownBase->
getType() << Bases[idx]->getSourceRange();
3018 Context.Deallocate(Bases[idx]);
3023 KnownBase = Bases[idx];
3024 Bases[NumGoodBases++] = Bases[idx];
3029 if (Bases.size() > 1)
3033 if (
Class->isInterface() &&
3034 (!RD->isInterfaceLike() ||
3040 << RD->getSourceRange();
3043 if (RD->hasAttr<WeakAttr>())
3050 Class->setBases(Bases.data(), NumGoodBases);
3053 for (
unsigned idx = 0; idx < NumGoodBases; ++idx) {
3055 QualType BaseType = Bases[idx]->getType();
3059 if (BaseType->isDependentType())
3063 .getUnqualifiedType();
3065 if (IndirectBaseTypes.count(CanonicalBase)) {
3069 =
Class->isDerivedFrom(CanonicalBase->getAsCXXRecordDecl(), Paths);
3074 Diag(Bases[idx]->getBeginLoc(), diag::warn_inaccessible_base_class)
3076 << Bases[idx]->getSourceRange();
3078 assert(Bases[idx]->isVirtual());
3083 Context.Deallocate(Bases[idx]);
3091 if (!ClassDecl || Bases.empty())
3103 if (!
Base || !Derived)
3131 Base->getAsCXXRecordDecl(), Paths);
3137 Base->getAsCXXRecordDecl(), Paths);
3146 for (
unsigned I = Path.size(); I != 0; --I) {
3147 if (Path[I - 1].
Base->isVirtual()) {
3154 for (
unsigned I = Start, E = Path.size(); I != E; ++I)
3161 assert(BasePathArray.empty() &&
"Base path array must be empty!");
3163 return ::BuildBasePathArray(Paths.
front(), BasePathArray);
3168 unsigned InaccessibleBaseID,
3169 unsigned AmbiguousBaseConvID,
3173 bool IgnoreAccess) {
3181 if (!DerivationOkay)
3186 Path = &Paths.
front();
3193 if (PossiblePath.size() == 1) {
3194 Path = &PossiblePath;
3195 if (AmbiguousBaseConvID)
3196 Diag(Loc, diag::ext_ms_ambiguous_direct_base)
3197 <<
Base << Derived << Range;
3204 if (!IgnoreAccess) {
3223 if (AmbiguousBaseConvID) {
3233 assert(StillOkay &&
"Can only be used with a derived-to-base conversion");
3242 Diag(Loc, AmbiguousBaseConvID)
3243 << Derived <<
Base << PathDisplayStr << Range << Name;
3252 bool IgnoreAccess) {
3254 Derived,
Base, diag::err_upcast_to_inaccessible_base,
3255 diag::err_ambiguous_derived_to_base_conv, Loc, Range,
DeclarationName(),
3256 BasePath, IgnoreAccess);
3260 std::string PathDisplayStr;
3261 std::set<unsigned> DisplayedPaths;
3263 if (DisplayedPaths.insert(Path.back().SubobjectNumber).second) {
3266 PathDisplayStr +=
"\n ";
3270 PathDisplayStr +=
" -> " + Element.Base->getType().getAsString();
3274 return PathDisplayStr;
3284 assert(Access !=
AS_none &&
"Invalid kind for syntactic access specifier!");
3313 if (!OverloadedMethods.empty()) {
3314 if (OverrideAttr *OA = D->
getAttr<OverrideAttr>()) {
3315 Diag(OA->getLocation(),
3316 diag::override_keyword_hides_virtual_member_function)
3317 <<
"override" << (OverloadedMethods.size() > 1);
3318 }
else if (FinalAttr *FA = D->
getAttr<FinalAttr>()) {
3319 Diag(FA->getLocation(),
3320 diag::override_keyword_hides_virtual_member_function)
3321 << (FA->isSpelledAsSealed() ?
"sealed" :
"final")
3322 << (OverloadedMethods.size() > 1);
3333 if (OverrideAttr *OA = D->
getAttr<OverrideAttr>()) {
3334 Diag(OA->getLocation(),
3335 diag::override_keyword_only_allowed_on_virtual_member_functions)
3339 if (FinalAttr *FA = D->
getAttr<FinalAttr>()) {
3340 Diag(FA->getLocation(),
3341 diag::override_keyword_only_allowed_on_virtual_member_functions)
3342 << (FA->isSpelledAsSealed() ?
"sealed" :
"final")
3354 if (MD->
hasAttr<OverrideAttr>() && !HasOverriddenMethods)
3355 Diag(MD->
getLocation(), diag::err_function_marked_override_not_overriding)
3369 SpellingLoc =
getSourceManager().getImmediateExpansionRange(Loc).getBegin();
3375 auto EmitDiag = [&](
unsigned DiagInconsistent,
unsigned DiagSuggest) {
3386 diag::warn_inconsistent_destructor_marked_not_override_overriding,
3387 diag::warn_suggest_destructor_marked_not_override_overriding);
3389 EmitDiag(diag::warn_inconsistent_function_marked_not_override_overriding,
3390 diag::warn_suggest_function_marked_not_override_overriding);
3396 FinalAttr *FA = Old->
getAttr<FinalAttr>();
3400 Diag(
New->getLocation(), diag::err_final_function_overridden)
3401 <<
New->getDeclName()
3402 << FA->isSpelledAsSealed();
3411 return !RD->isCompleteDefinition() ||
3412 !RD->hasTrivialDefaultConstructor() ||
3413 !RD->hasTrivialDestructor();
3417void Sema::CheckShadowInheritedFields(
const SourceLocation &Loc,
3418 DeclarationName FieldName,
3419 const CXXRecordDecl *RD,
3421 if (Diags.isIgnored(diag::warn_shadow_field, Loc))
3425 std::map<CXXRecordDecl*, NamedDecl*> Bases;
3426 auto FieldShadowed = [&](
const CXXBaseSpecifier *
Specifier,
3427 CXXBasePath &Path) {
3428 const auto Base =
Specifier->getType()->getAsCXXRecordDecl();
3430 if (Bases.find(Base) != Bases.end())
3432 for (
const auto Field :
Base->lookup(FieldName)) {
3436 assert(Bases.find(Base) == Bases.end());
3444 CXXBasePaths Paths(
true,
true,
3449 for (
const auto &P : Paths) {
3450 auto Base = P.back().Base->getType()->getAsCXXRecordDecl();
3451 auto It = Bases.find(Base);
3453 if (It == Bases.end())
3455 auto BaseField = It->second;
3456 assert(BaseField->getAccess() !=
AS_private);
3459 Diag(Loc, diag::warn_shadow_field)
3460 << FieldName << RD <<
Base << DeclIsField;
3461 Diag(BaseField->getLocation(), diag::note_shadow_field);
3467template <
typename AttrType>
3469 if (
const TagDecl *TD =
T->getAsTagDecl())
3470 return TD->hasAttr<AttrType>();
3472 return TDT->getDecl()->hasAttr<AttrType>();
3515 unsigned InvalidDecl;
3516 bool ShowDeclName =
true;
3529 ShowDeclName =
false;
3534 ShowDeclName =
false;
3549 Diag(Loc, diag::err_invalid_member_in_interface)
3550 << (InvalidDecl-1) << Name;
3552 Diag(Loc, diag::err_invalid_member_in_interface)
3553 << (InvalidDecl-1) <<
"";
3563 Diag(Loc, diag::err_hlsl_cstor_dstor);
3591 diag::err_storageclass_invalid_for_member);
3598 !isFunc && TemplateParameterLists.empty();
3611 const char *PrevSpec;
3616 assert(!Failed &&
"Making a constexpr member const shouldn't fail");
3620 const char *PrevSpec;
3624 Context.getPrintingPolicy())) {
3626 "This is the only DeclSpec that should fail to be applied");
3630 isInstField =
false;
3641 Diag(Loc, diag::err_bad_variable_name)
3678 if (MSPropertyAttr) {
3680 BitWidth, InitStyle, AS, *MSPropertyAttr);
3683 isInstField =
false;
3686 BitWidth, InitStyle, AS);
3699 if (
Member->isInvalidDecl()) {
3704 Diag(Loc, diag::err_static_not_bitfield)
3708 Diag(Loc, diag::err_typedef_not_bitfield)
3713 Diag(Loc, diag::err_not_integral_type_bitfield)
3714 << Name << cast<ValueDecl>(
Member)->getType()
3719 Member->setInvalidDecl();
3724 NonTemplateMember = FunTmpl->getTemplatedDecl();
3726 NonTemplateMember = VarTmpl->getTemplatedDecl();
3732 if (NonTemplateMember !=
Member)
3738 if (
auto *DG = dyn_cast<CXXDeductionGuideDecl>(NonTemplateMember)) {
3739 auto *TD = DG->getDeducedTemplate();
3742 if (AS != TD->getAccess() &&
3743 TD->getDeclContext()->getRedeclContext()->Equals(
3744 DG->getDeclContext()->getRedeclContext())) {
3745 Diag(DG->getBeginLoc(), diag::err_deduction_guide_wrong_access);
3746 Diag(TD->getBeginLoc(), diag::note_deduction_guide_template_access)
3750 if (
const auto *AccessSpec = dyn_cast<AccessSpecDecl>(D))
3751 LastAccessSpec = AccessSpec;
3753 assert(LastAccessSpec &&
"differing access with no access specifier");
3754 Diag(LastAccessSpec->
getBeginLoc(), diag::note_deduction_guide_access)
3765 ? FinalAttr::Keyword_sealed
3766 : FinalAttr::Keyword_final));
3776 assert((Name || isInstField) &&
"No identifier for non-field ?");
3782 if (!
Diags.isIgnored(diag::warn_unused_private_field, FD->
getLocation()) &&
3794 class UninitializedFieldVisitor
3799 llvm::SmallPtrSetImpl<ValueDecl*> &Decls;
3802 llvm::SmallPtrSetImpl<QualType> &BaseClasses;
3817 UninitializedFieldVisitor(
Sema &S,
3818 llvm::SmallPtrSetImpl<ValueDecl*> &Decls,
3819 llvm::SmallPtrSetImpl<QualType> &BaseClasses)
3820 : Inherited(S.Context), S(S), Decls(Decls), BaseClasses(BaseClasses),
3824 bool IsInitListMemberExprInitialized(
MemberExpr *ME,
3825 bool CheckReferenceOnly) {
3827 bool ReferenceField =
false;
3832 Fields.push_back(FD);
3834 ReferenceField =
true;
3840 if (CheckReferenceOnly && !ReferenceField)
3845 auto UsedFields = llvm::drop_begin(llvm::reverse(Fields));
3846 auto UsedIter = UsedFields.begin();
3847 const auto UsedEnd = UsedFields.end();
3849 for (
const unsigned Orig : InitFieldIndex) {
3850 if (UsedIter == UsedEnd)
3852 const unsigned UsedIndex = (*UsedIter)->getFieldIndex();
3853 if (UsedIndex < Orig)
3855 if (UsedIndex > Orig)
3863 void HandleMemberExpr(MemberExpr *ME,
bool CheckReferenceOnly,
3870 MemberExpr *FieldME = ME;
3875 while (MemberExpr *SubME =
3876 dyn_cast<MemberExpr>(
Base->IgnoreParenImpCasts())) {
3881 if (FieldDecl *FD = dyn_cast<FieldDecl>(SubME->getMemberDecl()))
3886 AllPODFields =
false;
3888 Base = SubME->getBase();
3896 if (AddressOf && AllPODFields)
3901 if (ImplicitCastExpr *BaseCast = dyn_cast<ImplicitCastExpr>(Base)) {
3906 if (BaseCast->getCastKind() == CK_UncheckedDerivedToBase) {
3907 QualType
T = BaseCast->getType();
3916 if (!Decls.count(FoundVD))
3921 if (InitList && !AddressOf && FoundVD == InitListFieldDecl) {
3923 if (IsInitListMemberExprInitialized(ME, CheckReferenceOnly)) {
3928 if (CheckReferenceOnly && !IsReference)
3932 unsigned diag = IsReference
3933 ? diag::warn_reference_field_is_uninit
3934 : diag::warn_field_is_uninit;
3938 diag::note_uninit_in_this_constructor)
3943 void HandleValue(Expr *E,
bool AddressOf) {
3946 if (MemberExpr *ME = dyn_cast<MemberExpr>(E)) {
3947 HandleMemberExpr(ME,
false ,
3952 if (ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E)) {
3953 Visit(CO->getCond());
3954 HandleValue(CO->getTrueExpr(), AddressOf);
3955 HandleValue(CO->getFalseExpr(), AddressOf);
3959 if (BinaryConditionalOperator *BCO =
3960 dyn_cast<BinaryConditionalOperator>(E)) {
3961 Visit(BCO->getCond());
3962 HandleValue(BCO->getFalseExpr(), AddressOf);
3966 if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E)) {
3967 HandleValue(OVE->getSourceExpr(), AddressOf);
3971 if (BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
3972 switch (BO->getOpcode()) {
3977 HandleValue(BO->getLHS(), AddressOf);
3978 Visit(BO->getRHS());
3981 Visit(BO->getLHS());
3982 HandleValue(BO->getRHS(), AddressOf);
3990 void CheckInitListExpr(InitListExpr *ILE) {
3991 InitFieldIndex.push_back(0);
3992 for (
auto *Child : ILE->
children()) {
3993 if (InitListExpr *SubList = dyn_cast<InitListExpr>(Child)) {
3994 CheckInitListExpr(SubList);
3998 ++InitFieldIndex.back();
4000 InitFieldIndex.pop_back();
4003 void CheckInitializer(Expr *E,
const CXXConstructorDecl *FieldConstructor,
4004 FieldDecl *Field,
const Type *BaseClass) {
4007 for (ValueDecl* VD : DeclsToRemove)
4009 DeclsToRemove.clear();
4012 InitListExpr *ILE = dyn_cast<InitListExpr>(E);
4016 InitListFieldDecl =
Field;
4017 InitFieldIndex.clear();
4018 CheckInitListExpr(ILE);
4030 void VisitMemberExpr(MemberExpr *ME) {
4032 HandleMemberExpr(ME,
true ,
false );
4035 void VisitImplicitCastExpr(ImplicitCastExpr *E) {
4041 Inherited::VisitImplicitCastExpr(E);
4044 void VisitCXXConstructExpr(CXXConstructExpr *E) {
4046 Expr *ArgExpr = E->
getArg(0);
4047 if (InitListExpr *ILE = dyn_cast<InitListExpr>(ArgExpr))
4050 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(ArgExpr))
4051 if (ICE->getCastKind() == CK_NoOp)
4052 ArgExpr = ICE->getSubExpr();
4053 HandleValue(ArgExpr,
false );
4056 Inherited::VisitCXXConstructExpr(E);
4059 void VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
4062 HandleValue(Callee,
false );
4068 Inherited::VisitCXXMemberCallExpr(E);
4071 void VisitCallExpr(CallExpr *E) {
4074 HandleValue(E->
getArg(0),
false);
4078 Inherited::VisitCallExpr(E);
4081 void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
4085 return Inherited::VisitCXXOperatorCallExpr(E);
4089 HandleValue(Arg->IgnoreParenImpCasts(),
false );
4092 void VisitBinaryOperator(BinaryOperator *E) {
4096 if (MemberExpr *ME = dyn_cast<MemberExpr>(E->
getLHS()))
4097 if (FieldDecl *FD = dyn_cast<FieldDecl>(ME->
getMemberDecl()))
4099 DeclsToRemove.push_back(FD);
4102 HandleValue(E->
getLHS(),
false );
4107 Inherited::VisitBinaryOperator(E);
4110 void VisitUnaryOperator(UnaryOperator *E) {
4116 if (MemberExpr *ME = dyn_cast<MemberExpr>(E->
getSubExpr())) {
4117 HandleValue(ME->
getBase(),
true );
4122 Inherited::VisitUnaryOperator(E);
4132 static void DiagnoseUninitializedFields(
4133 Sema &SemaRef,
const CXXConstructorDecl *
Constructor) {
4149 llvm::SmallPtrSet<ValueDecl*, 4> UninitializedFields;
4152 for (
auto *I : RD->
decls()) {
4153 if (
auto *FD = dyn_cast<FieldDecl>(I)) {
4154 UninitializedFields.insert(FD);
4155 }
else if (
auto *IFD = dyn_cast<IndirectFieldDecl>(I)) {
4156 UninitializedFields.insert(IFD->getAnonField());
4160 llvm::SmallPtrSet<QualType, 4> UninitializedBaseClasses;
4161 for (
const auto &I : RD->
bases())
4162 UninitializedBaseClasses.insert(I.getType().getCanonicalType());
4164 if (UninitializedFields.empty() && UninitializedBaseClasses.empty())
4167 UninitializedFieldVisitor UninitializedChecker(SemaRef,
4168 UninitializedFields,
4169 UninitializedBaseClasses);
4171 for (
const auto *FieldInit :
Constructor->inits()) {
4172 if (UninitializedFields.empty() && UninitializedBaseClasses.empty())
4175 Expr *InitExpr = FieldInit->getInit();
4179 if (CXXDefaultInitExpr *
Default =
4180 dyn_cast<CXXDefaultInitExpr>(InitExpr)) {
4181 InitExpr =
Default->getExpr();
4185 UninitializedChecker.CheckInitializer(InitExpr,
Constructor,
4186 FieldInit->getAnyMember(),
4187 FieldInit->getBaseClass());
4189 UninitializedChecker.CheckInitializer(InitExpr,
nullptr,
4190 FieldInit->getAnyMember(),
4191 FieldInit->getBaseClass());
4212 if (ParamDecl->getDeclName())
4229 return ConstraintExpr;
4244 return Seq.Perform(*
this, Entity, Kind, InitExpr);
4262 "must set init style when field is created");
4299 DirectBaseSpec =
nullptr;
4300 for (
const auto &
Base : ClassDecl->
bases()) {
4304 DirectBaseSpec = &
Base;
4312 VirtualBaseSpec =
nullptr;
4313 if (!DirectBaseSpec || !DirectBaseSpec->
isVirtual()) {
4322 if (Path.back().Base->isVirtual()) {
4323 VirtualBaseSpec = Path.back().Base;
4330 return DirectBaseSpec || VirtualBaseSpec;
4344 DS, IdLoc, InitList,
4362 DS, IdLoc, List, EllipsisLoc);
4371 explicit MemInitializerValidatorCCC(
CXXRecordDecl *ClassDecl)
4372 : ClassDecl(ClassDecl) {}
4374 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
4377 return Member->getDeclContext()->getRedeclContext()->Equals(ClassDecl);
4383 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
4384 return std::make_unique<MemInitializerValidatorCCC>(*
this);
4388 CXXRecordDecl *ClassDecl;
4405 Diag(Loc, diag::err_using_placeholder_variable) << Name;
4421 for (
auto *D : ClassDecl->
lookup(MemberOrBase)) {
4423 bool IsPlaceholder = D->isPlaceholderVar(
getLangOpts());
4425 if (IsPlaceholder && D->getDeclContext() == ND->
getDeclContext())
4456 if (!ConstructorD || !
Init)
4462 = dyn_cast<CXXConstructorDecl>(ConstructorD);
4486 ClassDecl, SS, TemplateTypeTy, MemberOrBase)) {
4488 Diag(EllipsisLoc, diag::err_pack_expansion_member_init)
4498 if (TemplateTypeTy) {
4500 if (BaseType.isNull())
4517 if (R.isAmbiguous())
return true;
4520 R.suppressDiagnostics();
4523 bool NotUnknownSpecialization =
false;
4526 NotUnknownSpecialization = !
Record->hasAnyDependentBases();
4528 if (!NotUnknownSpecialization) {
4534 if (BaseType.isNull())
4537 TInfo =
Context.CreateTypeSourceInfo(BaseType);
4547 R.setLookupName(MemberOrBase);
4554 UnqualifiedBase->getCanonicalInjectedSpecializationType(
Context));
4556 for (
auto const &
Base : ClassDecl->
bases()) {
4558 Base.getType()->getAs<TemplateSpecializationType>();
4560 Context.hasSameTemplateName(BaseTemplate->getTemplateName(), TN,
4562 Diag(IdLoc, diag::ext_unqualified_base_class)
4564 BaseType =
Base.getType();
4573 MemInitializerValidatorCCC CCC(ClassDecl);
4574 if (R.empty() && BaseType.isNull() &&
4576 CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), S, &SS,
4583 PDiag(diag::err_mem_init_not_member_or_class_suggest)
4584 << MemberOrBase <<
true);
4591 DirectBaseSpec, VirtualBaseSpec)) {
4596 PDiag(diag::err_mem_init_not_member_or_class_suggest)
4597 << MemberOrBase <<
false,
4610 if (!TyD && BaseType.isNull()) {
4611 Diag(IdLoc, diag::err_mem_init_not_member_or_class)
4612 << MemberOrBase <<
SourceRange(IdLoc,
Init->getSourceRange().getEnd());
4617 if (BaseType.isNull()) {
4622 if (
const auto *TD = dyn_cast<TagDecl>(TyD)) {
4628 TL.setNameLoc(IdLoc);
4629 }
else if (
auto *TN = dyn_cast<TypedefNameDecl>(TyD)) {
4635 }
else if (
auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(TyD)) {
4644 BaseType =
Context.getTypeDeclType(TyD);
4652 TInfo =
Context.getTrivialTypeSourceInfo(BaseType, IdLoc);
4662 assert((DirectMember || IndirectMember) &&
4663 "Member must be a FieldDecl or IndirectFieldDecl");
4668 if (
Member->isInvalidDecl())
4673 Args =
MultiExprArg(ParenList->getExprs(), ParenList->getNumExprs());
4675 Args =
MultiExprArg(InitList->getInits(), InitList->getNumInits());
4683 if (
Member->getType()->isDependentType() ||
Init->isTypeDependent()) {
4688 bool InitList =
false;
4701 IdLoc,
Init->getBeginLoc(),
Init->getEndLoc())
4745 return Diag(NameLoc, diag::err_delegating_ctor)
4747 Diag(NameLoc, diag::warn_cxx98_compat_delegating_ctor);
4749 bool InitList =
true;
4753 Args =
MultiExprArg(ParenList->getExprs(), ParenList->getNumExprs());
4764 NameLoc,
Init->getBeginLoc(),
Init->getEndLoc())
4773 "Delegating constructor with no target?");
4779 DelegationInit.
get(), InitRange.
getBegin(),
false);
4784 InitRange.
getEnd(), Args, ClassType);
4796 DelegationInit =
Init;
4810 if (!BaseType->isDependentType() && !BaseType->isRecordType())
4811 return Diag(BaseLoc, diag::err_base_init_does_not_name_class)
4825 (BaseType->isDependentType() ||
Init->isTypeDependent());
4830 if (!BaseType->containsUnexpandedParameterPack()) {
4831 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
4859 if (!DirectBaseSpec && !VirtualBaseSpec) {
4868 return Diag(BaseLoc, diag::err_not_direct_base_or_virtual)
4869 << BaseType <<
Context.getCanonicalTagType(ClassDecl)
4880 InitRange.
getEnd(), EllipsisLoc);
4887 if (DirectBaseSpec && VirtualBaseSpec)
4888 return Diag(BaseLoc, diag::err_base_init_direct_and_virtual)
4893 BaseSpec = VirtualBaseSpec;
4896 bool InitList =
true;
4900 Args =
MultiExprArg(ParenList->getExprs(), ParenList->getNumExprs());
4940 InitRange.
getEnd(), EllipsisLoc);
4950 TargetType, ExprLoc);
4970 bool IsInheritedVirtualBase,
4974 IsInheritedVirtualBase);
4978 switch (ImplicitInitKind) {
4984 BaseInit = InitSeq.Perform(SemaRef, InitEntity, InitKind, {});
4990 bool Moving = ImplicitInitKind ==
IIK_Move;
4992 QualType ParamType = Param->getType().getNonReferenceType();
5012 BasePath.push_back(BaseSpec);
5014 CK_UncheckedDerivedToBase,
5022 BaseInit = InitSeq.
Perform(SemaRef, InitEntity, InitKind, CopyCtorArg);
5054 if (Field->isInvalidDecl())
5060 bool Moving = ImplicitInitKind ==
IIK_Move;
5062 QualType ParamType = Param->getType().getNonReferenceType();
5065 if (Field->isZeroLengthBitField())
5068 Expr *MemberExprBase =
5081 LookupResult MemberLookup(SemaRef, Field->getDeclName(), Loc,
5117 InitSeq.Perform(SemaRef, Entity, InitKind,
MultiExprArg(&CtorArgE, 1));
5132 "Unhandled implicit init kind!");
5145 ExprResult MemberInit = InitSeq.Perform(SemaRef, InitEntity, InitKind, {});
5148 if (MemberInit.isInvalid())
5165 if (!Field->getParent()->isUnion()) {
5168 diag::err_uninitialized_member_in_ctor)
5171 << Field->getDeclName();
5172 SemaRef.
Diag(Field->getLocation(), diag::note_declared_at);
5178 diag::err_uninitialized_member_in_ctor)
5181 << Field->getDeclName();
5182 SemaRef.
Diag(Field->getLocation(), diag::note_declared_at);
5199 CXXMemberInit =
nullptr;
5204struct BaseAndFieldInfo {
5206 CXXConstructorDecl *Ctor;
5207 bool AnyErrorsInInits;
5209 llvm::DenseMap<const void *, CXXCtorInitializer*> AllBaseFields;
5210 SmallVector<CXXCtorInitializer*, 8> AllToInit;
5211 llvm::DenseMap<TagDecl*, FieldDecl*> ActiveUnionMember;
5213 BaseAndFieldInfo(Sema &S, CXXConstructorDecl *Ctor,
bool ErrorsInInits)
5214 : S(S), Ctor(Ctor), AnyErrorsInInits(ErrorsInInits) {
5226 bool isImplicitCopyOrMove()
const {
5237 llvm_unreachable(
"Invalid ImplicitInitializerKind!");
5240 bool addFieldInitializer(CXXCtorInitializer *
Init) {
5241 AllToInit.push_back(
Init);
5250 bool isInactiveUnionMember(FieldDecl *Field) {
5255 if (FieldDecl *Active =
5256 ActiveUnionMember.lookup(
Record->getCanonicalDecl()))
5257 return Active !=
Field->getCanonicalDecl();
5260 if (isImplicitCopyOrMove())
5265 if (
Field->hasInClassInitializer())
5269 if (!
Field->isAnonymousStructOrUnion())
5271 CXXRecordDecl *FieldRD =
Field->getType()->getAsCXXRecordDecl();
5278 bool isWithinInactiveUnionMember(FieldDecl *Field,
5279 IndirectFieldDecl *Indirect) {
5281 return isInactiveUnionMember(Field);
5283 for (
auto *
C : Indirect->
chain()) {
5284 FieldDecl *
Field = dyn_cast<FieldDecl>(
C);
5285 if (Field && isInactiveUnionMember(Field))
5296 if (
T->isIncompleteArrayType())
5300 if (ArrayT->isZeroSize())
5303 T = ArrayT->getElementType();
5312 if (Field->isInvalidDecl())
5317 Info.AllBaseFields.lookup(Field->getCanonicalDecl()))
5318 return Info.addFieldInitializer(
Init);
5332 if (Info.isWithinInactiveUnionMember(Field, Indirect))
5335 if (Field->hasInClassInitializer() && !Info.isImplicitCopyOrMove()) {
5353 return Info.addFieldInitializer(
Init);
5363 if (Info.AnyErrorsInInits)
5374 return Info.addFieldInitializer(
Init);
5401 if (Class->isInvalidDecl())
5403 if (Class->hasIrrelevantDestructor())
5412 if (Field->isInvalidDecl())
5422 if (!FieldClassDecl)
5426 if (FieldClassDecl->isUnion() && FieldClassDecl->isAnonymousStructOrUnion())
5434 S.
PDiag(diag::err_access_dtor_field)
5435 << Field->getDeclName() << FieldType);
5448 bool VisitVirtualBases = !ClassDecl->
isAbstract();
5455 if (Dtor && Dtor->isUsed())
5456 VisitVirtualBases =
false;
5462 for (
const auto &
Base : ClassDecl->
bases()) {
5463 auto *BaseClassDecl =
Base.getType()->getAsCXXRecordDecl();
5468 if (
Base.isVirtual()) {
5469 if (!VisitVirtualBases)
5471 DirectVirtualBases.insert(BaseClassDecl);
5480 S.
PDiag(diag::err_access_dtor_base)
5481 <<
Base.getType() <<
Base.getSourceRange(),
5488 if (VisitVirtualBases)
5490 &DirectVirtualBases);
5498 if (!Initializers.empty()) {
5499 Constructor->setNumCtorInitializers(Initializers.size());
5502 memcpy(baseOrMemberInitializers, Initializers.data(),
5504 Constructor->setCtorInitializers(baseOrMemberInitializers);
5514 BaseAndFieldInfo Info(*
this,
Constructor, AnyErrors);
5522 bool HadError =
false;
5525 if (
Member->isBaseInitializer())
5526 Info.AllBaseFields[
Member->getBaseClass()->getAsCanonical<RecordType>()] =
5529 Info.AllBaseFields[
Member->getAnyMember()->getCanonicalDecl()] =
Member;
5532 for (
auto *
C : F->chain()) {
5535 Info.ActiveUnionMember.insert(std::make_pair(
5540 Info.ActiveUnionMember.insert(std::make_pair(
5548 for (
auto &I : ClassDecl->
bases()) {
5550 DirectVBases.insert(&I);
5554 for (
auto &VBase : ClassDecl->
vbases()) {
5556 VBase.getType()->getAsCanonical<RecordType>())) {
5564 Diag(
Value->getSourceLocation(), diag::warn_abstract_vbase_init_ignored)
5565 << VBase.getType() << ClassDecl;
5569 Info.AllToInit.push_back(
Value);
5570 }
else if (!AnyErrors && !ClassDecl->
isAbstract()) {
5575 bool IsInheritedVirtualBase = !DirectVBases.count(&VBase);
5578 &VBase, IsInheritedVirtualBase,
5584 Info.AllToInit.push_back(CXXBaseInit);
5591 if (
Base.isVirtual())
5595 Base.getType()->getAsCanonical<RecordType>())) {
5596 Info.AllToInit.push_back(
Value);
5597 }
else if (!AnyErrors) {
5606 Info.AllToInit.push_back(CXXBaseInit);
5611 for (
auto *Mem : ClassDecl->
decls()) {
5612 if (
auto *F = dyn_cast<FieldDecl>(Mem)) {
5617 if (F->isUnnamedBitField())
5623 if (F->isAnonymousStructOrUnion() && !Info.isImplicitCopyOrMove())
5632 if (Info.isImplicitCopyOrMove())
5635 if (
auto *F = dyn_cast<IndirectFieldDecl>(Mem)) {
5636 if (F->getType()->isIncompleteArrayType()) {
5638 "Incomplete array type is not valid");
5650 unsigned NumInitializers = Info.AllToInit.size();
5651 if (NumInitializers > 0) {
5652 Constructor->setNumCtorInitializers(NumInitializers);
5655 memcpy(baseOrMemberInitializers, Info.AllToInit.data(),
5657 Constructor->setCtorInitializers(baseOrMemberInitializers);
5683 if (
const RecordType *RT = Field->getType()->getAsCanonical<RecordType>()) {
5691 IdealInits.push_back(Field->getCanonicalDecl());
5695 return Context.getCanonicalType(BaseType).getTypePtr();
5700 if (!
Member->isAnyMemberInitializer())
5703 return Member->getAnyMember()->getCanonicalDecl();
5709 if (
Previous->isAnyMemberInitializer())
5723 if (
Constructor->getDeclContext()->isDependentContext())
5728 bool ShouldCheckOrder =
false;
5730 if (!SemaRef.
Diags.
isIgnored(diag::warn_initializer_out_of_order,
5731 Init->getSourceLocation())) {
5732 ShouldCheckOrder =
true;
5736 if (!ShouldCheckOrder)
5747 for (
const auto &VBase : ClassDecl->
vbases())
5751 for (
const auto &
Base : ClassDecl->
bases()) {
5752 if (
Base.isVirtual())
5758 for (
auto *Field : ClassDecl->
fields()) {
5759 if (Field->isUnnamedBitField())
5765 unsigned NumIdealInits = IdealInitKeys.size();
5766 unsigned IdealIndex = 0;
5775 for (
unsigned InitIndex = 0; InitIndex !=
Inits.size(); ++InitIndex) {
5780 for (; IdealIndex != NumIdealInits; ++IdealIndex)
5781 if (InitKey == IdealInitKeys[IdealIndex])
5787 if (IdealIndex == NumIdealInits && InitIndex) {
5788 WarnIndexes.push_back(InitIndex);
5791 for (IdealIndex = 0; IdealIndex != NumIdealInits; ++IdealIndex)
5792 if (InitKey == IdealInitKeys[IdealIndex])
5795 assert(IdealIndex < NumIdealInits &&
5796 "initializer not found in initializer list");
5798 CorrelatedInitOrder.emplace_back(IdealIndex, InitIndex);
5801 if (WarnIndexes.empty())
5805 llvm::sort(CorrelatedInitOrder, llvm::less_first());
5811 Inits[WarnIndexes.front() - 1]->getSourceLocation(),
5812 WarnIndexes.size() == 1 ? diag::warn_initializer_out_of_order
5813 : diag::warn_some_initializers_out_of_order);
5815 for (
unsigned I = 0; I < CorrelatedInitOrder.size(); ++I) {
5816 if (CorrelatedInitOrder[I].second == I)
5822 Inits[I]->getSourceRange(),
5825 Inits[CorrelatedInitOrder[I].second]->getSourceRange()),
5831 if (WarnIndexes.size() == 1) {
5833 Inits[WarnIndexes.front()]);
5839 for (
unsigned WarnIndex : WarnIndexes) {
5842 diag::note_initializer_out_of_order);
5849bool CheckRedundantInit(Sema &S,
5850 CXXCtorInitializer *
Init,
5851 CXXCtorInitializer *&PrevInit) {
5857 if (FieldDecl *Field =
Init->getAnyMember())
5859 diag::err_multiple_mem_initialization)
5860 <<
Field->getDeclName()
5861 <<
Init->getSourceRange();
5863 const Type *BaseClass =
Init->getBaseClass();
5864 assert(BaseClass &&
"neither field nor base");
5866 diag::err_multiple_base_initialization)
5867 << QualType(BaseClass, 0)
5868 <<
Init->getSourceRange();
5876typedef std::pair<NamedDecl *, CXXCtorInitializer *> UnionEntry;
5877typedef llvm::DenseMap<RecordDecl*, UnionEntry> RedundantUnionMap;
5879bool CheckRedundantUnionInit(Sema &S,
5880 CXXCtorInitializer *
Init,
5881 RedundantUnionMap &Unions) {
5882 FieldDecl *
Field =
Init->getAnyMember();
5883 RecordDecl *Parent =
Field->getParent();
5884 NamedDecl *Child =
Field;
5888 UnionEntry &En = Unions[Parent];
5889 if (En.first && En.first != Child) {
5891 diag::err_multiple_mem_union_initialization)
5892 <<
Field->getDeclName()
5893 <<
Init->getSourceRange();
5894 S.
Diag(En.second->getSourceLocation(), diag::note_previous_initializer)
5895 << 0 << En.second->getSourceRange();
5918 if (!ConstructorDecl)
5924 = dyn_cast<CXXConstructorDecl>(ConstructorDecl);
5927 Diag(ColonLoc, diag::err_only_constructors_take_base_inits);
5934 llvm::DenseMap<const void *, CXXCtorInitializer *> Members;
5937 RedundantUnionMap MemberUnions;
5939 bool HadError =
false;
5940 for (
unsigned i = 0; i < MemInits.size(); i++) {
5944 Init->setSourceOrder(i);
5946 if (
Init->isAnyMemberInitializer()) {
5948 if (CheckRedundantInit(*
this,
Init, Members[Key]) ||
5949 CheckRedundantUnionInit(*
this,
Init, MemberUnions))
5951 }
else if (
Init->isBaseInitializer()) {
5953 if (CheckRedundantInit(*
this,
Init, Members[Key]))
5956 assert(
Init->isDelegatingInitializer());
5958 if (MemInits.size() != 1) {
5960 diag::err_delegating_initializer_alone)
5961 <<
Init->getSourceRange() << MemInits[i ? 0 : 1]->getSourceRange();
5993 for (
auto *Field : ClassDecl->
fields()) {
6002 llvm::SmallPtrSetImpl<const CXXRecordDecl *> *DirectVirtualBases) {
6004 for (
const auto &VBase : ClassDecl->
vbases()) {
6005 auto *BaseClassDecl = VBase.getType()->getAsCXXRecordDecl();
6010 if (DirectVirtualBases && DirectVirtualBases->count(BaseClassDecl))
6019 PDiag(diag::err_access_dtor_vbase)
6020 << CT << VBase.getType(),
6023 CT, VBase.getType(), diag::err_access_dtor_vbase, 0,
6037 = dyn_cast<CXXConstructorDecl>(CDtorDecl)) {
6039 !ClassDecl || ClassDecl->isInvalidDecl()) {
6051 const auto *RD =
Context.getBaseElementType(
T)->getAsCXXRecordDecl();
6088 if (
Diags.isLastDiagnosticIgnored())
6098 for (
const auto &M : FinalOverriders) {
6099 for (
const auto &SO : M.second) {
6105 if (SO.second.size() != 1)
6109 if (!
Method->isPureVirtual())
6112 if (!SeenPureMethods.insert(
Method).second)
6115 Diag(
Method->getLocation(), diag::note_pure_virtual_function)
6126struct AbstractUsageInfo {
6136 void DiagnoseAbstractType() {
6145struct CheckAbstractUsage {
6146 AbstractUsageInfo &Info;
6147 const NamedDecl *Ctx;
6149 CheckAbstractUsage(AbstractUsageInfo &Info,
const NamedDecl *Ctx)
6150 : Info(Info), Ctx(Ctx) {}
6154#define ABSTRACT_TYPELOC(CLASS, PARENT)
6155#define TYPELOC(CLASS, PARENT) \
6156 case TypeLoc::CLASS: Check(TL.castAs<CLASS##TypeLoc>(), Sel); break;
6157#include "clang/AST/TypeLocNodes.def"
6163 for (
unsigned I = 0, E = TL.
getNumParams(); I != E; ++I) {
6178 for (
unsigned I = 0, E = TL.
getNumArgs(); I != E; ++I) {
6179 TemplateArgumentLoc TAL = TL.
getArgLoc(I);
6188#define CheckPolymorphic(Type) \
6189 void Check(Type TL, Sema::AbstractDiagSelID Sel) { \
6190 Visit(TL.getNextTypeLoc(), Sema::AbstractNone); \
6205 return Visit(
Next, Sel);
6213 if (
T->isArrayType()) {
6218 if (CT != Info.AbstractType)
return;
6229 Info.DiagnoseAbstractType();
6233void AbstractUsageInfo::CheckType(
const NamedDecl *D, TypeLoc TL,
6235 CheckAbstractUsage(*
this, D).Visit(TL, Sel);
6270 for (
auto *D : RD->
decls()) {
6271 if (D->isImplicit())
continue;
6274 if (
auto *FD = dyn_cast<FriendDecl>(D)) {
6275 D = FD->getFriendDecl();
6280 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
6282 }
else if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(D)) {
6286 }
else if (
auto *FD = dyn_cast<FieldDecl>(D)) {
6289 }
else if (
auto *VD = dyn_cast<VarDecl>(D)) {
6291 }
else if (
auto *VTD = dyn_cast<VarTemplateDecl>(D)) {
6295 }
else if (
auto *RD = dyn_cast<CXXRecordDecl>(D)) {
6297 }
else if (
auto *CTD = dyn_cast<ClassTemplateDecl>(D)) {
6308 assert(ClassAttr->
getKind() == attr::DLLExport);
6318 struct MarkingClassDllexported {
6329 ~MarkingClassDllexported() {
6332 } MarkingDllexportedContext(S, Class, ClassAttr->
getLocation());
6339 if (!
Member->hasAttr<DLLExportAttr>())
6344 auto *VD = dyn_cast<VarDecl>(
Member);
6345 if (VD && VD->getStorageClass() ==
SC_Static &&
6349 auto *MD = dyn_cast<CXXMethodDecl>(
Member);
6353 if (MD->isUserProvided()) {
6363 auto *CD = dyn_cast<CXXConstructorDecl>(MD);
6366 CD->getAttr<DLLExportAttr>()->getLocation(), CD);
6374 }
else if (MD->isExplicitlyDefaulted()) {
6383 }
else if (!MD->isTrivial() ||
6384 MD->isCopyAssignmentOperator() ||
6385 MD->isMoveAssignmentOperator()) {
6406 if (Class->isInvalidDecl())
6413 if (
auto *NestedClass = dyn_cast<CXXRecordDecl>(
Member)) {
6414 if (NestedClass->isThisDeclarationADefinition())
6420 auto *CD = dyn_cast<CXXConstructorDecl>(
Member);
6421 if (!CD || !CD->isDefaultConstructor())
6423 auto *
Attr = CD->getAttr<DLLExportAttr>();
6429 if (!Class->isDependentContext()) {
6434 if (LastExportedDefaultCtor) {
6436 diag::err_attribute_dll_ambiguous_default_ctor)
6438 S.
Diag(CD->getLocation(), diag::note_entity_declared_at)
6439 << CD->getDeclName();
6442 LastExportedDefaultCtor = CD;
6448 bool ErrorReported =
false;
6449 auto reportIllegalClassTemplate = [&ErrorReported](
Sema &S,
6453 S.
Diag(TD->getLocation(),
6454 diag::err_cuda_device_builtin_surftex_cls_template)
6456 ErrorReported =
true;
6461 auto *SD = dyn_cast<ClassTemplateSpecializationDecl>(Class);
6463 S.
Diag(Class->getLocation(),
6464 diag::err_cuda_device_builtin_surftex_ref_decl)
6466 S.
Diag(Class->getLocation(),
6467 diag::note_cuda_device_builtin_surftex_should_be_template_class)
6471 TD = SD->getSpecializedTemplate();
6475 unsigned N = Params->
size();
6478 reportIllegalClassTemplate(S, TD);
6480 diag::note_cuda_device_builtin_surftex_cls_should_have_n_args)
6484 reportIllegalClassTemplate(S, TD);
6486 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6490 auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Params->
getParam(1));
6491 if (!NTTP || !NTTP->getType()->isIntegralOrEnumerationType()) {
6492 reportIllegalClassTemplate(S, TD);
6494 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6502 bool ErrorReported =
false;
6503 auto reportIllegalClassTemplate = [&ErrorReported](
Sema &S,
6507 S.
Diag(TD->getLocation(),
6508 diag::err_cuda_device_builtin_surftex_cls_template)
6510 ErrorReported =
true;
6515 auto *SD = dyn_cast<ClassTemplateSpecializationDecl>(Class);
6517 S.
Diag(Class->getLocation(),
6518 diag::err_cuda_device_builtin_surftex_ref_decl)
6520 S.
Diag(Class->getLocation(),
6521 diag::note_cuda_device_builtin_surftex_should_be_template_class)
6525 TD = SD->getSpecializedTemplate();
6529 unsigned N = Params->
size();
6532 reportIllegalClassTemplate(S, TD);
6534 diag::note_cuda_device_builtin_surftex_cls_should_have_n_args)
6538 reportIllegalClassTemplate(S, TD);
6540 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6544 auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Params->
getParam(1));
6545 if (!NTTP || !NTTP->getType()->isIntegralOrEnumerationType()) {
6546 reportIllegalClassTemplate(S, TD);
6548 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6553 auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Params->
getParam(2));
6554 if (!NTTP || !NTTP->getType()->isIntegralOrEnumerationType()) {
6555 reportIllegalClassTemplate(S, TD);
6557 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6566 if (
Method->isUserProvided())
6577 if (
Context.getTargetInfo().shouldDLLImportComdatSymbols() && !ClassAttr) {
6578 if (
auto *Spec = dyn_cast<ClassTemplatePartialSpecializationDecl>(
Class)) {
6579 if (
Attr *TemplateAttr =
6580 getDLLAttr(Spec->getSpecializedTemplate()->getTemplatedDecl())) {
6582 A->setInherited(
true);
6595 if ((
Context.getTargetInfo().getCXXABI().isMicrosoft() ||
6596 Context.getTargetInfo().getTriple().isPS()) &&
6597 (!
Class->isExternallyVisible() &&
Class->hasExternalFormalLinkage())) {
6598 Class->dropAttrs<DLLExportAttr, DLLImportAttr>();
6602 if (!
Class->isExternallyVisible()) {
6603 Diag(
Class->getLocation(), diag::err_attribute_dll_not_extern)
6604 <<
Class << ClassAttr;
6608 if (
Context.getTargetInfo().shouldDLLImportComdatSymbols() &&
6619 diag::err_attribute_dll_member_of_dll_class)
6620 << MemberAttr << ClassAttr;
6621 Diag(ClassAttr->getLocation(), diag::note_previous_attribute);
6622 Member->setInvalidDecl();
6626 if (
Class->getDescribedClassTemplate())
6631 const bool ClassExported = ClassAttr->
getKind() == attr::DLLExport;
6636 const bool PropagatedImport =
6646 !
Context.getTargetInfo().getTriple().isOSCygMing()) {
6647 if (
auto *DEA =
Class->getAttr<DLLExportAttr>()) {
6648 Class->addAttr(DLLExportOnDeclAttr::Create(
Context, DEA->getLoc()));
6649 Class->dropAttr<DLLExportAttr>();
6659 if (ClassExported &&
getLangOpts().DllExportInlines) {
6662 if (
auto *S = dyn_cast<ConstructorUsingShadowDecl>(D))
6663 Shadows.push_back(S);
6685 if (
Member->hasAttr<ExcludeFromExplicitInstantiationAttr>())
6700 if (ClassExported &&
getLangOpts().DllExportInlines) {
6717 diag::warn_dllexport_inherited_ctor_unsupported)
6723 .areArgsDestroyedLeftToRightInCallee()) {
6724 bool HasCalleeCleanupParam =
false;
6726 if (P->needsDestruction(
Context)) {
6727 HasCalleeCleanupParam =
true;
6730 if (HasCalleeCleanupParam) {
6732 diag::warn_dllexport_inherited_ctor_unsupported)
6754 if (!
Context.getTargetInfo().shouldDLLImportComdatSymbols() &&
6757 if (
auto *CD = dyn_cast<CXXConstructorDecl>(MD);
6758 !CD || !CD->getInheritedConstructor())
6765 auto *Ctor = dyn_cast<CXXConstructorDecl>(MD);
6782 if (VD && PropagatedImport)
6796 if (ClassExported) {
6808 Member->addAttr(NewAttr);
6818 "friend re-decl should not already have a DLLAttr");
6848 NewAttr->setInherited(
true);
6849 BaseTemplateSpec->
addAttr(NewAttr);
6853 if (
auto *ImportAttr = dyn_cast<DLLImportAttr>(NewAttr))
6854 ImportAttr->setPropagatedToBaseTemplate();
6875 Diag(BaseLoc, diag::warn_attribute_dll_instantiated_base_class)
6880 diag::note_template_class_explicit_specialization_was_here)
6881 << BaseTemplateSpec;
6884 diag::note_template_class_instantiation_was_here)
6885 << BaseTemplateSpec;
6894struct DefaultedFunctionFPFeaturesRAII {
6897 : SavedFPFeatures(S) {
6904 ~DefaultedFunctionFPFeaturesRAII() =
default;
6935 llvm_unreachable(
"Invalid special member.");
6953 bool CopyCtorIsTrivial =
false, CopyCtorIsTrivialForCall =
false;
6954 bool DtorIsTrivialForCall =
false;
6965 CopyCtorIsTrivial =
true;
6967 CopyCtorIsTrivialForCall =
true;
6971 if (CD->isCopyConstructor() && !CD->isDeleted() &&
6972 !CD->isIneligibleOrNotSelected()) {
6973 if (CD->isTrivial())
6974 CopyCtorIsTrivial =
true;
6975 if (CD->isTrivialForCall())
6976 CopyCtorIsTrivialForCall =
true;
6984 DtorIsTrivialForCall =
true;
6986 if (!DD->isDeleted() && DD->isTrivialForCall())
6987 DtorIsTrivialForCall =
true;
6991 if (CopyCtorIsTrivialForCall && DtorIsTrivialForCall)
7005 uint64_t TypeSize = isAArch64 ? 128 : 64;
7017 bool HasNonDeletedCopyOrMove =
false;
7023 HasNonDeletedCopyOrMove =
true;
7030 HasNonDeletedCopyOrMove =
true;
7038 if (MD->isDeleted() || MD->isIneligibleOrNotSelected())
7041 auto *CD = dyn_cast<CXXConstructorDecl>(MD);
7042 if (CD && CD->isCopyOrMoveConstructor())
7043 HasNonDeletedCopyOrMove =
true;
7047 if (!MD->isTrivialForCall())
7051 return HasNonDeletedCopyOrMove;
7062 bool IssuedDiagnostic =
false;
7065 if (!IssuedDiagnostic) {
7067 IssuedDiagnostic =
true;
7069 S.
Diag(O->getLocation(), diag::note_overridden_virtual_function);
7072 return IssuedDiagnostic;
7079 if (
Record->isAbstract() && !
Record->isInvalidDecl()) {
7080 AbstractUsageInfo Info(*
this,
Record);
7087 if (!
Record->isInvalidDecl() && !
Record->isDependentType() &&
7088 !
Record->isAggregate() && !
Record->hasUserDeclaredConstructor() &&
7090 bool Complained =
false;
7091 for (
const auto *F :
Record->fields()) {
7092 if (F->hasInClassInitializer() || F->isUnnamedBitField())
7095 if (F->getType()->isReferenceType() ||
7096 (F->getType().isConstQualified() && F->getType()->isScalarType())) {
7098 Diag(
Record->getLocation(), diag::warn_no_constructor_for_refconst)
7103 Diag(F->getLocation(), diag::note_refconst_member_not_initialized)
7104 << F->getType()->isReferenceType()
7105 << F->getDeclName();
7110 if (
Record->getIdentifier()) {
7125 Record->hasUserDeclaredConstructor()) ||
7127 Diag(Element->getLocation(), diag::err_member_name_of_class)
7135 if (
Record->isPolymorphic() && !
Record->isDependentType()) {
7138 !
Record->hasAttr<FinalAttr>())
7140 diag::warn_non_virtual_dtor)
7144 if (
Record->isAbstract()) {
7145 if (FinalAttr *FA =
Record->getAttr<FinalAttr>()) {
7146 Diag(
Record->getLocation(), diag::warn_abstract_final_class)
7147 << FA->isSpelledAsSealed();
7153 if (!
Record->hasAttr<FinalAttr>()) {
7155 if (
const FinalAttr *FA = dtor->getAttr<FinalAttr>()) {
7156 Diag(FA->getLocation(), diag::warn_final_dtor_non_final_class)
7157 << FA->isSpelledAsSealed()
7160 (FA->isSpelledAsSealed() ?
" sealed" :
" final"));
7162 diag::note_final_dtor_non_final_class_silence)
7163 <<
Context.getCanonicalTagType(
Record) << FA->isSpelledAsSealed();
7169 if (
Record->hasAttr<TrivialABIAttr>())
7174 bool HasTrivialABI =
Record->hasAttr<TrivialABIAttr>();
7177 Record->setHasTrivialSpecialMemberForCall();
7187 auto CheckCompletedMemberFunction = [&](
CXXMethodDecl *MD) {
7198 MD->
isDeleted() ? diag::err_deleted_override
7199 : diag::err_non_deleted_override,
7201 return MD->isDeleted() != V->isDeleted();
7213 : diag::err_non_consteval_override,
7215 return MD->isConsteval() != V->isConsteval();
7224 auto CheckForDefaultedFunction = [&](
FunctionDecl *FD) ->
bool {
7231 DefaultedSecondaryComparisons.push_back(FD);
7239 if (!
Record->isInvalidDecl() &&
7240 Record->hasAttr<VTablePointerAuthenticationAttr>())
7245 bool Incomplete = CheckForDefaultedFunction(M);
7248 if (
Record->isDependentType())
7254 if (!M->isImplicit() && !M->isUserProvided()) {
7258 Record->finishedDefaultedOrDeletedMember(M);
7259 M->setTrivialForCall(
7263 Record->setTrivialForCallFlags(M);
7272 M->isUserProvided()) {
7273 M->setTrivialForCall(HasTrivialABI);
7274 Record->setTrivialForCallFlags(M);
7277 if (!M->isInvalidDecl() && M->isExplicitlyDefaulted() &&
7278 M->hasAttr<DLLExportAttr>()) {
7284 M->dropAttr<DLLExportAttr>();
7286 if (M->hasAttr<DLLExportAttr>()) {
7292 bool EffectivelyConstexprDestructor =
true;
7297 llvm::SmallDenseSet<QualType> Visited;
7298 auto Check = [&Visited](
QualType T,
auto &&Check) ->
bool {
7299 if (!Visited.insert(
T->getCanonicalTypeUnqualified()).second)
7302 T->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
7310 if (!Check(B.getType(), Check))
7313 if (!Check(FD->
getType(), Check))
7317 EffectivelyConstexprDestructor =
7325 M->isDefaulted() && M->isConstexpr() && M->size_overridden_methods() &&
7326 EffectivelyConstexprDestructor)
7330 CheckCompletedMemberFunction(M);
7339 CompleteMemberFunction(Dtor);
7341 bool HasMethodWithOverrideControl =
false,
7342 HasOverridingMethodWithoutOverrideControl =
false;
7343 for (
auto *D :
Record->decls()) {
7344 if (
auto *M = dyn_cast<CXXMethodDecl>(D)) {
7347 if (!
Record->isDependentType()) {
7353 if (M->hasAttr<OverrideAttr>()) {
7354 HasMethodWithOverrideControl =
true;
7355 }
else if (M->size_overridden_methods() > 0) {
7356 HasOverridingMethodWithoutOverrideControl =
true;
7359 if (M->isVirtualAsWritten() &&
Record->isEffectivelyFinal()) {
7360 Diag(M->getLocation(), diag::warn_unnecessary_virtual_specifier)
7367 CompleteMemberFunction(M);
7368 }
else if (
auto *F = dyn_cast<FriendDecl>(D)) {
7369 CheckForDefaultedFunction(
7370 dyn_cast_or_null<FunctionDecl>(F->getFriendDecl()));
7374 if (HasOverridingMethodWithoutOverrideControl) {
7375 bool HasInconsistentOverrideControl = HasMethodWithOverrideControl;
7376 for (
auto *M :
Record->methods())
7381 for (
FunctionDecl *FD : DefaultedSecondaryComparisons) {
7385 if (
auto *MD = dyn_cast<CXXMethodDecl>(FD))
7386 CheckCompletedMemberFunction(MD);
7407 if (
Context.getLangOpts().getLayoutCompatibility() ==
7411 Diag(
Record->getLocation(), diag::warn_cxx_ms_struct);
7417 bool ClangABICompat4 =
7418 Context.getLangOpts().isCompatibleWith(LangOptions::ClangABI::Ver4);
7420 Context.getTargetInfo().getCallingConvKind(ClangABICompat4);
7425 if (
Record->getArgPassingRestrictions() !=
7427 Record->setArgPassingRestrictions(
7435 if (
Context.getTargetInfo().getCXXABI().areArgsDestroyedLeftToRightInCallee())
7436 Record->setParamDestroyedInCallee(
true);
7437 else if (
Record->hasNonTrivialDestructor())
7438 Record->setParamDestroyedInCallee(CanPass);
7447 if (
Record->hasAttr<CUDADeviceBuiltinSurfaceTypeAttr>())
7449 else if (
Record->hasAttr<CUDADeviceBuiltinTextureTypeAttr>())
7455 TypeAwareDecls{{OO_New, {}},
7458 {OO_Array_New, {}}};
7459 for (
auto *D :
Record->decls()) {
7466 auto CheckMismatchedTypeAwareAllocators =
7469 auto &NewDecls = TypeAwareDecls[NewKind];
7470 auto &DeleteDecls = TypeAwareDecls[DeleteKind];
7471 if (NewDecls.empty() == DeleteDecls.empty())
7474 Context.DeclarationNames.getCXXOperatorName(
7475 NewDecls.empty() ? DeleteKind : NewKind);
7477 Context.DeclarationNames.getCXXOperatorName(
7478 NewDecls.empty() ? NewKind : DeleteKind);
7480 diag::err_type_aware_allocator_missing_matching_operator)
7483 for (
auto MD : NewDecls)
7485 diag::note_unmatched_type_aware_allocator_declared)
7487 for (
auto MD : DeleteDecls)
7489 diag::note_unmatched_type_aware_allocator_declared)
7492 CheckMismatchedTypeAwareAllocators(OO_New, OO_Delete);
7493 CheckMismatchedTypeAwareAllocators(OO_Array_New, OO_Array_Delete);
7509 unsigned LHSQuals = 0;
7512 LHSQuals = FieldQuals;
7514 unsigned RHSQuals = FieldQuals;
7536 llvm::DenseMap<CXXRecordDecl *, ConstructorUsingShadowDecl *>
7542 : S(S), UseLoc(UseLoc) {
7543 bool DiagnosedMultipleConstructedBases =
false;
7549 for (
auto *D : Shadow->
redecls()) {
7550 auto *DShadow = cast<ConstructorUsingShadowDecl>(D);
7551 auto *DNominatedBase = DShadow->getNominatedBaseClass();
7552 auto *DConstructedBase = DShadow->getConstructedBaseClass();
7554 InheritedFromBases.insert(
7555 std::make_pair(DNominatedBase->getCanonicalDecl(),
7556 DShadow->getNominatedBaseClassShadowDecl()));
7557 if (DShadow->constructsVirtualBase())
7558 InheritedFromBases.insert(
7559 std::make_pair(DConstructedBase->getCanonicalDecl(),
7560 DShadow->getConstructedBaseClassShadowDecl()));
7562 assert(DNominatedBase == DConstructedBase);
7567 if (!ConstructedBase) {
7568 ConstructedBase = DConstructedBase;
7569 ConstructedBaseIntroducer = D->getIntroducer();
7570 }
else if (ConstructedBase != DConstructedBase &&
7572 if (!DiagnosedMultipleConstructedBases) {
7573 S.Diag(UseLoc, diag::err_ambiguous_inherited_constructor)
7574 << Shadow->getTargetDecl();
7575 S.Diag(ConstructedBaseIntroducer->getLocation(),
7576 diag::note_ambiguous_inherited_constructor_using)
7578 DiagnosedMultipleConstructedBases = true;
7580 S.Diag(D->getIntroducer()->getLocation(),
7581 diag::note_ambiguous_inherited_constructor_using)
7582 << DConstructedBase;
7586 if (DiagnosedMultipleConstructedBases)
7587 Shadow->setInvalidDecl();
7593 std::pair<CXXConstructorDecl *, bool>
7595 auto It = InheritedFromBases.find(
Base->getCanonicalDecl());
7596 if (It == InheritedFromBases.end())
7597 return std::make_pair(
nullptr,
false);
7601 return std::make_pair(
7602 S.findInheritingConstructor(UseLoc, Ctor, It->second),
7603 It->second->constructsVirtualBase());
7606 return std::make_pair(Ctor,
false);
7623 if (InheritedCtor) {
7626 Inherited->findConstructorForBase(ClassDecl, InheritedCtor).first;
7628 return BaseCtor->isConstexpr();
7696 if (Ctor && ClassDecl->
isUnion())
7716 for (
const auto &B : ClassDecl->
bases()) {
7717 auto *BaseClassDecl = B.getType()->getAsCXXRecordDecl();
7721 InheritedCtor, Inherited))
7734 for (
const auto *F : ClassDecl->
fields()) {
7735 if (F->isInvalidDecl())
7738 F->hasInClassInitializer())
7741 if (
const RecordType *RecordTy = BaseType->getAsCanonical<RecordType>()) {
7742 auto *FieldRecDecl =
7745 BaseType.getCVRQualifiers(),
7746 ConstArg && !F->isMutable()))
7761struct ComputingExceptionSpec {
7764 ComputingExceptionSpec(Sema &S, FunctionDecl *FD, SourceLocation Loc)
7766 Sema::CodeSynthesisContext Ctx;
7772 ~ComputingExceptionSpec() {
7778static Sema::ImplicitExceptionSpecification
7782 Sema::InheritedConstructorInfo *ICI);
7784static Sema::ImplicitExceptionSpecification
7789static Sema::ImplicitExceptionSpecification
7792 if (DFK.isSpecialMember())
7795 if (DFK.isComparison())
7797 DFK.asComparison());
7800 assert(CD->getInheritedConstructor() &&
7801 "only defaulted functions and inherited constructors have implicit "
7804 S, Loc, CD->getInheritedConstructor().getShadowDecl());
7831 auto ESI = IES.getExceptionSpec();
7849 PT.getNonReferenceType()->getAsCXXRecordDecl()) {
7870 "not an explicitly-defaulted special member");
7880 bool HadError =
false;
7893 bool ShouldDeleteForTypeMismatch =
false;
7894 unsigned ExpectedParams = 1;
7906 if (DeleteOnTypeMismatch)
7907 ShouldDeleteForTypeMismatch =
true;
7917 bool CanHaveConstParam =
false;
7927 ReturnType =
Type->getReturnType();
7932 std::nullopt, RD,
false);
7933 DeclType =
Context.getAddrSpaceQualType(
7935 QualType ExpectedReturnType =
Context.getLValueReferenceType(DeclType);
7937 if (!
Context.hasSameType(ReturnType, ExpectedReturnType)) {
7938 Diag(MD->
getLocation(), diag::err_defaulted_special_member_return_type)
7940 << ExpectedReturnType;
7946 if (DeleteOnTypeMismatch)
7947 ShouldDeleteForTypeMismatch =
true;
7964 if (!ExplicitObjectParameter.
isNull() &&
7967 Context.getCanonicalTagType(RD)))) {
7968 if (DeleteOnTypeMismatch)
7969 ShouldDeleteForTypeMismatch =
true;
7972 diag::err_defaulted_special_member_explicit_object_mismatch)
7985 bool HasConstParam =
false;
7986 if (ExpectedParams &&
ArgType->isReferenceType()) {
7992 if (DeleteOnTypeMismatch)
7993 ShouldDeleteForTypeMismatch =
true;
7996 diag::err_defaulted_special_member_volatile_param)
8002 if (HasConstParam && !CanHaveConstParam) {
8003 if (DeleteOnTypeMismatch)
8004 ShouldDeleteForTypeMismatch =
true;
8008 diag::err_defaulted_special_member_copy_const_param)
8014 diag::err_defaulted_special_member_move_const_param)
8019 }
else if (ExpectedParams) {
8023 "unexpected non-ref argument");
8057 diag::err_incorrect_defaulted_constexpr_with_vb)
8059 for (
const auto &I : RD->
vbases())
8060 Diag(I.getBeginLoc(), diag::note_constexpr_virtual_base_here);
8078 if (!
Type->hasExceptionSpec()) {
8087 Context.getFunctionType(ReturnType,
Type->getParamTypes(), EPI));
8096 if (ShouldDeleteForTypeMismatch) {
8101 Diag(DefaultLoc, diag::note_replace_equals_default_to_delete)
8105 if (ShouldDeleteForTypeMismatch && !HadError) {
8107 diag::warn_cxx17_compat_defaulted_method_type_mismatch)
8114 Diag(MD->
getLocation(), diag::err_out_of_line_default_deletes) << CSM;
8115 assert(!ShouldDeleteForTypeMismatch &&
"deleted non-first decl");
8137template<
typename Derived,
typename ResultList,
typename Result,
8139class DefaultedComparisonVisitor {
8143 : S(S), RD(RD), FD(FD), DCK(DCK) {
8147 Fns.assign(Info->getUnqualifiedLookups().begin(),
8148 Info->getUnqualifiedLookups().end());
8152 ResultList visit() {
8161 llvm_unreachable(
"not a defaulted comparison");
8165 getDerived().visitSubobjects(Results, RD, ParamLvalType.
getQualifiers());
8170 Results.add(getDerived().visitExpandedSubobject(
8171 ParamLvalType, getDerived().getCompleteObject()));
8174 llvm_unreachable(
"");
8178 Derived &getDerived() {
return static_cast<Derived&
>(*this); }
8184 bool visitSubobjects(ResultList &Results, CXXRecordDecl *
Record,
8188 for (CXXBaseSpecifier &Base :
Record->bases())
8189 if (Results.add(getDerived().visitSubobject(
8191 getDerived().getBase(&Base))))
8195 for (FieldDecl *Field :
Record->fields()) {
8198 if (
Field->isUnnamedBitField())
8201 if (
Field->isAnonymousStructOrUnion()) {
8202 if (visitSubobjects(Results,
Field->getType()->getAsCXXRecordDecl(),
8209 Qualifiers FieldQuals = Quals;
8210 if (
Field->isMutable())
8212 QualType FieldType =
8215 if (Results.add(getDerived().visitSubobject(
8216 FieldType, getDerived().getField(Field))))
8224 Result visitSubobject(QualType
Type, Subobject Subobj) {
8227 if (
auto *CAT = dyn_cast_or_null<ConstantArrayType>(AT))
8228 return getDerived().visitSubobjectArray(CAT->getElementType(),
8229 CAT->getSize(), Subobj);
8230 return getDerived().visitExpandedSubobject(
Type, Subobj);
8233 Result visitSubobjectArray(QualType
Type,
const llvm::APInt &Size,
8235 return getDerived().visitSubobject(
Type, Subobj);
8243 UnresolvedSet<16> Fns;
8248struct DefaultedComparisonInfo {
8253 static DefaultedComparisonInfo deleted() {
8254 DefaultedComparisonInfo
Deleted;
8259 bool add(
const DefaultedComparisonInfo &R) {
8269struct DefaultedComparisonSubobject {
8277class DefaultedComparisonAnalyzer
8278 :
public DefaultedComparisonVisitor<DefaultedComparisonAnalyzer,
8279 DefaultedComparisonInfo,
8280 DefaultedComparisonInfo,
8281 DefaultedComparisonSubobject> {
8283 enum DiagnosticKind { NoDiagnostics, ExplainDeleted, ExplainConstexpr };
8286 DiagnosticKind Diagnose;
8289 using Base = DefaultedComparisonVisitor;
8290 using Result = DefaultedComparisonInfo;
8291 using Subobject = DefaultedComparisonSubobject;
8295 DefaultedComparisonAnalyzer(Sema &S, CXXRecordDecl *RD, FunctionDecl *FD,
8297 DiagnosticKind Diagnose = NoDiagnostics)
8298 :
Base(S, RD, FD, DCK), Diagnose(Diagnose) {}
8301 if ((DCK == DefaultedComparisonKind::Equal ||
8302 DCK == DefaultedComparisonKind::ThreeWay) &&
8307 if (Diagnose == ExplainDeleted) {
8311 return Result::deleted();
8314 return Base::visit();
8318 Subobject getCompleteObject() {
8319 return Subobject{Subobject::CompleteObject, RD, FD->
getLocation()};
8322 Subobject getBase(CXXBaseSpecifier *Base) {
8323 return Subobject{Subobject::Base,
Base->getType()->getAsCXXRecordDecl(),
8324 Base->getBaseTypeLoc()};
8327 Subobject getField(FieldDecl *Field) {
8328 return Subobject{Subobject::Member,
Field,
Field->getLocation()};
8331 Result visitExpandedSubobject(QualType
Type, Subobject Subobj) {
8335 if (
Type->isReferenceType()) {
8336 if (Diagnose == ExplainDeleted) {
8337 S.
Diag(Subobj.Loc, diag::note_defaulted_comparison_reference_member)
8340 return Result::deleted();
8345 Expr *Args[] = {&Xi, &Xi};
8349 assert(OO !=
OO_None &&
"not an overloaded operator!");
8350 return visitBinaryOperator(OO, Args, Subobj);
8356 OverloadCandidateSet *SpaceshipCandidates =
nullptr) {
8360 OverloadCandidateSet CandidateSet(
8362 OverloadCandidateSet::OperatorRewriteInfo(
8364 !SpaceshipCandidates));
8369 CandidateSet.exclude(FD);
8371 if (Args[0]->
getType()->isOverloadableType())
8382 switch (CandidateSet.BestViableFunction(S, FD->
getLocation(), Best)) {
8388 if ((DCK == DefaultedComparisonKind::NotEqual ||
8389 DCK == DefaultedComparisonKind::Relational) &&
8390 !Best->RewriteKind) {
8391 if (Diagnose == ExplainDeleted) {
8392 if (Best->Function) {
8393 S.
Diag(Best->Function->getLocation(),
8394 diag::note_defaulted_comparison_not_rewritten_callee)
8397 assert(Best->Conversions.size() == 2 &&
8398 Best->Conversions[0].isUserDefined() &&
8399 "non-user-defined conversion from class to built-in "
8401 S.
Diag(Best->Conversions[0]
8402 .UserDefined.FoundConversionFunction.getDecl()
8404 diag::note_defaulted_comparison_not_rewritten_conversion)
8408 return Result::deleted();
8418 CXXRecordDecl *ArgClass = Args[0]->getType()->getAsCXXRecordDecl();
8419 if (ArgClass && Best->FoundDecl.getDecl() &&
8420 Best->FoundDecl.getDecl()->isCXXClassMember()) {
8421 QualType ObjectType = Subobj.Kind == Subobject::Member
8422 ? Args[0]->getType()
8425 ArgClass, Best->FoundDecl, ObjectType, Subobj.Loc,
8426 Diagnose == ExplainDeleted
8427 ? S.
PDiag(diag::note_defaulted_comparison_inaccessible)
8428 << FD << Subobj.Kind << Subobj.Decl
8430 return Result::deleted();
8433 bool NeedsDeducing =
8436 if (FunctionDecl *BestFD = Best->Function) {
8441 assert(!BestFD->isDeleted() &&
"wrong overload resolution result");
8443 if (Diagnose == ExplainConstexpr && !BestFD->isConstexpr()) {
8444 if (Subobj.Kind != Subobject::CompleteObject)
8445 S.
Diag(Subobj.Loc, diag::note_defaulted_comparison_not_constexpr)
8446 << Subobj.
Kind << Subobj.Decl;
8447 S.
Diag(BestFD->getLocation(),
8448 diag::note_defaulted_comparison_not_constexpr_here);
8450 return Result::deleted();
8452 R.Constexpr &= BestFD->isConstexpr();
8454 if (NeedsDeducing) {
8459 if (BestFD->getReturnType()->isUndeducedType() &&
8465 if (Diagnose == NoDiagnostics) {
8468 diag::err_defaulted_comparison_cannot_deduce_undeduced_auto)
8469 << Subobj.
Kind << Subobj.Decl;
8472 diag::note_defaulted_comparison_cannot_deduce_undeduced_auto)
8473 << Subobj.
Kind << Subobj.Decl;
8474 S.
Diag(BestFD->getLocation(),
8475 diag::note_defaulted_comparison_cannot_deduce_callee)
8476 << Subobj.
Kind << Subobj.Decl;
8478 return Result::deleted();
8481 BestFD->getCallResultType());
8483 if (Diagnose == ExplainDeleted) {
8484 S.
Diag(Subobj.Loc, diag::note_defaulted_comparison_cannot_deduce)
8485 << Subobj.
Kind << Subobj.Decl
8486 << BestFD->getCallResultType().withoutLocalFastQualifiers();
8487 S.
Diag(BestFD->getLocation(),
8488 diag::note_defaulted_comparison_cannot_deduce_callee)
8489 << Subobj.
Kind << Subobj.Decl;
8491 return Result::deleted();
8493 R.Category = Info->Kind;
8496 QualType
T = Best->BuiltinParamTypes[0];
8497 assert(
T == Best->BuiltinParamTypes[1] &&
8498 "builtin comparison for different types?");
8499 assert(Best->BuiltinParamTypes[2].isNull() &&
8500 "invalid builtin comparison");
8505 if (Diagnose == ExplainDeleted) {
8507 diag::note_defaulted_comparison_vector_types)
8509 S.
Diag(Subobj.Decl->getLocation(), diag::note_declared_at);
8511 return Result::deleted();
8514 if (NeedsDeducing) {
8515 std::optional<ComparisonCategoryType> Cat =
8517 assert(Cat &&
"no category for builtin comparison?");
8528 if (Diagnose == ExplainDeleted) {
8531 Kind = OO == OO_EqualEqual ? 1 : 2;
8532 CandidateSet.NoteCandidates(
8534 Subobj.Loc, S.
PDiag(diag::note_defaulted_comparison_ambiguous)
8535 << FD << Kind << Subobj.Kind << Subobj.Decl),
8538 R = Result::deleted();
8542 if (Diagnose == ExplainDeleted) {
8543 if ((DCK == DefaultedComparisonKind::NotEqual ||
8544 DCK == DefaultedComparisonKind::Relational) &&
8545 !Best->RewriteKind) {
8546 S.
Diag(Best->Function->getLocation(),
8547 diag::note_defaulted_comparison_not_rewritten_callee)
8551 diag::note_defaulted_comparison_calls_deleted)
8552 << FD << Subobj.
Kind << Subobj.Decl;
8556 R = Result::deleted();
8562 if (OO == OO_Spaceship &&
8566 if (!
R.add(visitBinaryOperator(OO_EqualEqual, Args, Subobj,
8568 R.add(visitBinaryOperator(OO_Less, Args, Subobj, &CandidateSet));
8572 if (Diagnose == ExplainDeleted) {
8573 S.
Diag(Subobj.Loc, diag::note_defaulted_comparison_no_viable_function)
8574 << FD << (OO == OO_EqualEqual || OO == OO_ExclaimEqual)
8575 << Subobj.
Kind << Subobj.Decl;
8579 if (SpaceshipCandidates) {
8580 SpaceshipCandidates->NoteCandidates(
8585 diag::note_defaulted_comparison_no_viable_function_synthesized)
8586 << (OO == OO_EqualEqual ? 0 : 1);
8589 CandidateSet.NoteCandidates(
8594 R = Result::deleted();
8603struct StmtListResult {
8604 bool IsInvalid =
false;
8605 llvm::SmallVector<Stmt*, 16> Stmts;
8608 IsInvalid |= S.isInvalid();
8611 Stmts.push_back(S.get());
8618class DefaultedComparisonSynthesizer
8619 :
public DefaultedComparisonVisitor<DefaultedComparisonSynthesizer,
8620 StmtListResult, StmtResult,
8621 std::pair<ExprResult, ExprResult>> {
8623 unsigned ArrayDepth = 0;
8626 using Base = DefaultedComparisonVisitor;
8627 using ExprPair = std::pair<ExprResult, ExprResult>;
8631 DefaultedComparisonSynthesizer(Sema &S, CXXRecordDecl *RD, FunctionDecl *FD,
8633 SourceLocation BodyLoc)
8634 :
Base(S, RD, FD, DCK), Loc(BodyLoc) {}
8638 Sema::CompoundScopeRAII CompoundScope(S);
8640 StmtListResult Stmts = visit();
8641 if (Stmts.IsInvalid)
8646 case DefaultedComparisonKind::None:
8647 llvm_unreachable(
"not a defaulted comparison");
8649 case DefaultedComparisonKind::Equal: {
8658 auto OldStmts = std::move(Stmts.Stmts);
8659 Stmts.Stmts.clear();
8662 auto FinishCmp = [&] {
8663 if (Expr *Prior = CmpSoFar.
get()) {
8665 if (RetVal.
isUnset() && Stmts.Stmts.empty())
8668 else if (Stmts.add(buildIfNotCondReturnFalse(Prior)))
8674 for (Stmt *EAsStmt : llvm::reverse(OldStmts)) {
8675 Expr *E = dyn_cast<Expr>(EAsStmt);
8678 if (FinishCmp() || Stmts.add(EAsStmt))
8687 CmpSoFar = S.CreateBuiltinBinOp(Loc, BO_LAnd, E, CmpSoFar.
get());
8693 std::reverse(Stmts.Stmts.begin(), Stmts.Stmts.end());
8696 RetVal = S.ActOnCXXBoolLiteral(Loc, tok::kw_true);
8700 case DefaultedComparisonKind::ThreeWay: {
8704 ComparisonCategoryType::StrongOrdering, Loc,
8705 Sema::ComparisonCategoryUsage::DefaultedOperator);
8708 VarDecl *EqualVD = S.Context.CompCategories.getInfoForType(
StrongOrdering)
8709 .getValueInfo(ComparisonCategoryResult::Equal)
8711 RetVal = getDecl(EqualVD);
8714 RetVal = buildStaticCastToR(RetVal.
get());
8718 case DefaultedComparisonKind::NotEqual:
8719 case DefaultedComparisonKind::Relational:
8720 RetVal =
cast<Expr>(Stmts.Stmts.pop_back_val());
8727 StmtResult ReturnStmt = S.BuildReturnStmt(Loc, RetVal.
get());
8728 if (ReturnStmt.isInvalid())
8730 Stmts.Stmts.push_back(ReturnStmt.get());
8732 return S.ActOnCompoundStmt(Loc, Loc, Stmts.Stmts,
false);
8737 return S.BuildDeclarationNameExpr(
8738 CXXScopeSpec(), DeclarationNameInfo(VD->
getDeclName(), Loc), VD);
8746 ExprPair getCompleteObject() {
8749 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD);
8750 MD && MD->isImplicitObjectMemberFunction()) {
8752 LHS = S.ActOnCXXThis(Loc);
8754 LHS = S.CreateBuiltinUnaryOp(Loc, UO_Deref, LHS.
get());
8756 LHS = getParam(Param++);
8763 ExprPair getBase(CXXBaseSpecifier *Base) {
8764 ExprPair Obj = getCompleteObject();
8765 if (Obj.first.isInvalid() || Obj.second.isInvalid())
8768 const auto CastToBase = [&](Expr *E) {
8769 QualType ToType = S.Context.getQualifiedType(
8771 return S.ImpCastExprToType(E, ToType, CK_DerivedToBase,
VK_LValue, &Path);
8773 return {CastToBase(Obj.first.get()), CastToBase(Obj.second.get())};
8776 ExprPair getField(FieldDecl *Field) {
8777 ExprPair Obj = getCompleteObject();
8778 if (Obj.first.isInvalid() || Obj.second.isInvalid())
8782 DeclarationNameInfo NameInfo(
Field->getDeclName(), Loc);
8783 return {S.BuildFieldReferenceExpr(Obj.first.get(),
false, Loc,
8784 CXXScopeSpec(), Field,
Found, NameInfo),
8785 S.BuildFieldReferenceExpr(Obj.second.get(),
false, Loc,
8786 CXXScopeSpec(), Field,
Found, NameInfo)};
8793 if (
Cond.isInvalid())
8796 ExprResult NotCond = S.CreateBuiltinUnaryOp(Loc, UO_LNot,
Cond.get());
8801 assert(!
False.isInvalid() &&
"should never fail");
8803 if (ReturnFalse.isInvalid())
8806 return S.ActOnIfStmt(Loc, IfStatementKind::Ordinary, Loc,
nullptr,
8807 S.ActOnCondition(
nullptr, Loc, NotCond.
get(),
8808 Sema::ConditionKind::Boolean),
8809 Loc, ReturnFalse.get(), SourceLocation(),
nullptr);
8814 QualType SizeType = S.Context.getSizeType();
8815 Size =
Size.zextOrTrunc(S.Context.getTypeSize(SizeType));
8818 IdentifierInfo *IterationVarName =
nullptr;
8821 llvm::raw_svector_ostream
OS(Str);
8822 OS <<
"i" << ArrayDepth;
8823 IterationVarName = &S.Context.Idents.get(
OS.str());
8826 S.Context, S.CurContext, Loc, Loc, IterationVarName, SizeType,
8827 S.Context.getTrivialTypeSourceInfo(SizeType, Loc),
SC_None);
8828 llvm::APInt
Zero(S.Context.getTypeSize(SizeType), 0);
8831 Stmt *
Init =
new (S.Context) DeclStmt(DeclGroupRef(IterationVar), Loc, Loc);
8833 auto IterRef = [&] {
8835 CXXScopeSpec(), DeclarationNameInfo(IterationVarName, Loc),
8837 assert(!Ref.
isInvalid() &&
"can't reference our own variable?");
8843 Loc, BO_NE, IterRef(),
8845 assert(!
Cond.isInvalid() &&
"should never fail");
8848 ExprResult Inc = S.CreateBuiltinUnaryOp(Loc, UO_PreInc, IterRef());
8849 assert(!
Inc.isInvalid() &&
"should never fail");
8855 return S.CreateBuiltinArraySubscriptExpr(E.get(), Loc, IterRef(), Loc);
8857 Subobj.first = Index(Subobj.first);
8858 Subobj.second = Index(Subobj.second);
8865 if (Substmt.isInvalid())
8871 if (Expr *ElemCmp = dyn_cast<Expr>(Substmt.get())) {
8872 assert(DCK == DefaultedComparisonKind::Equal &&
8873 "should have non-expression statement");
8874 Substmt = buildIfNotCondReturnFalse(ElemCmp);
8875 if (Substmt.isInvalid())
8880 return S.ActOnForStmt(Loc, Loc,
Init,
8881 S.ActOnCondition(
nullptr, Loc,
Cond.get(),
8882 Sema::ConditionKind::Boolean),
8883 S.MakeFullDiscardedValueExpr(
Inc.get()), Loc,
8888 if (Obj.first.isInvalid() || Obj.second.isInvalid())
8894 if (
Type->isOverloadableType())
8895 Op = S.CreateOverloadedBinOp(Loc, Opc, Fns, Obj.first.get(),
8896 Obj.second.get(),
true,
8899 Op = S.CreateBuiltinBinOp(Loc, Opc, Obj.first.get(), Obj.second.get());
8904 case DefaultedComparisonKind::None:
8905 llvm_unreachable(
"not a defaulted comparison");
8907 case DefaultedComparisonKind::Equal:
8910 Op = S.PerformContextuallyConvertToBool(Op.
get());
8915 case DefaultedComparisonKind::ThreeWay: {
8920 Op = buildStaticCastToR(Op.
get());
8925 IdentifierInfo *Name = &S.Context.Idents.get(
"cmp");
8928 S.Context.getTrivialTypeSourceInfo(R, Loc),
SC_None);
8929 S.AddInitializerToDecl(VD, Op.
get(),
false);
8930 Stmt *InitStmt =
new (S.Context) DeclStmt(DeclGroupRef(VD), Loc, Loc);
8936 llvm::APInt ZeroVal(S.Context.getIntWidth(S.Context.IntTy), 0);
8941 Comp = S.CreateOverloadedBinOp(Loc, BO_NE, Fns, VDRef.
get(),
Zero,
true,
8944 Comp = S.CreateBuiltinBinOp(Loc, BO_NE, VDRef.
get(),
Zero);
8945 if (
Comp.isInvalid())
8947 Sema::ConditionResult
Cond = S.ActOnCondition(
8948 nullptr, Loc,
Comp.get(), Sema::ConditionKind::Boolean);
8949 if (
Cond.isInvalid())
8953 VDRef = getDecl(VD);
8956 StmtResult ReturnStmt = S.BuildReturnStmt(Loc, VDRef.
get());
8957 if (ReturnStmt.isInvalid())
8961 return S.ActOnIfStmt(Loc, IfStatementKind::Ordinary, Loc, InitStmt,
Cond,
8962 Loc, ReturnStmt.get(),
8963 SourceLocation(),
nullptr);
8966 case DefaultedComparisonKind::NotEqual:
8967 case DefaultedComparisonKind::Relational:
8972 llvm_unreachable(
"");
8978 assert(!
R->isUndeducedType() &&
"type should have been deduced already");
8983 return S.BuildCXXNamedCast(Loc, tok::kw_static_cast,
8984 S.Context.getTrivialTypeSourceInfo(R, Loc), E,
8985 SourceRange(Loc, Loc), SourceRange(Loc, Loc));
8996 Self.LookupOverloadedOperatorName(OO, S, Operators);
9009 if (Op == OO_Spaceship) {
9010 Lookup(OO_ExclaimEqual);
9012 Lookup(OO_EqualEqual);
9043 assert(!MD->isStatic() &&
"comparison function cannot be a static member");
9045 if (MD->getRefQualifier() ==
RQ_RValue) {
9046 Diag(MD->getLocation(), diag::err_ref_qualifier_comparison_operator);
9052 MD->setType(
Context.getFunctionType(FPT->getReturnType(),
9053 FPT->getParamTypes(), EPI));
9059 QualType T = MD->getFunctionObjectParameterReferenceType();
9060 if (!
T.getNonReferenceType().isConstQualified() &&
9061 (MD->isImplicitObjectMemberFunction() ||
T->isLValueReferenceType())) {
9063 if (MD->isExplicitObjectMemberFunction()) {
9064 Loc = MD->getParamDecl(0)->getBeginLoc();
9066 MD->getParamDecl(0)->getExplicitObjectParamThisLoc());
9068 Loc = MD->getLocation();
9074 if (!MD->isImplicit()) {
9075 Diag(Loc, diag::err_defaulted_comparison_non_const)
9080 if (MD->isExplicitObjectMemberFunction()) {
9081 assert(
T->isLValueReferenceType());
9082 MD->getParamDecl(0)->setType(
Context.getLValueReferenceType(
9083 T.getNonReferenceType().withConst()));
9088 MD->setType(
Context.getFunctionType(FPT->getReturnType(),
9089 FPT->getParamTypes(), EPI));
9093 if (MD->isVolatile()) {
9094 Diag(MD->getLocation(), diag::err_volatile_comparison_operator);
9100 MD->setType(
Context.getFunctionType(FPT->getReturnType(),
9101 FPT->getParamTypes(), EPI));
9107 (IsMethod ? 1 : 2)) {
9111 <<
int(IsMethod) <<
int(DCK);
9117 QualType ParmTy = Param->getType();
9124 ExpectedTy =
Context.getCanonicalTagType(RD);
9126 CTy = Ref->getPointeeType();
9136 RD = CTy->getAsCXXRecordDecl();
9137 Ok &= RD !=
nullptr;
9151 <<
int(DCK) << ParmTy << RefTy <<
int(!IsMethod) << PlainTy
9152 << Param->getSourceRange();
9154 assert(!IsMethod &&
"should know expected type for method");
9156 diag::err_defaulted_comparison_param_unknown)
9157 <<
int(DCK) << ParmTy << Param->getSourceRange();
9163 Diag(FD->
getLocation(), diag::err_defaulted_comparison_param_mismatch)
9165 << ParmTy << Param->getSourceRange();
9170 assert(RD &&
"must have determined class");
9179 diag::err_defaulted_comparison_not_friend,
int(DCK),
9184 return declaresSameEntity(F->getFriendDecl(), FD);
9187 <<
int(DCK) <<
int(0) << RD;
9199 Diag(FD->
getLocation(), diag::err_defaulted_comparison_return_type_not_bool)
9209 RT->getContainedDeducedType() &&
9211 RT->getContainedAutoType()->isConstrained())) {
9213 diag::err_defaulted_comparison_deduced_return_type_not_auto)
9225 DefaultedComparisonInfo Info =
9226 DefaultedComparisonAnalyzer(*
this, RD, FD, DCK).visit();
9240 DefaultedComparisonAnalyzer(*
this, RD, FD, DCK,
9241 DefaultedComparisonAnalyzer::ExplainDeleted)
9252 diag::note_previous_declaration);
9264 DefaultedComparisonAnalyzer(*
this, RD, FD, DCK,
9265 DefaultedComparisonAnalyzer::ExplainDeleted)
9287 Context.adjustDeducedFunctionResultType(
9315 Diag(FD->
getBeginLoc(), diag::err_defaulted_comparison_constexpr_mismatch)
9317 DefaultedComparisonAnalyzer(*
this, RD, FD, DCK,
9318 DefaultedComparisonAnalyzer::ExplainConstexpr)
9339 EPI.ExceptionSpec.SourceDecl = FD;
9341 FPT->getParamTypes(), EPI));
9356 EqualEqual->setImplicit();
9371 Scope.addContextNote(UseLoc);
9373 DefaultedFunctionFPFeaturesRAII RestoreFP(*
this, FD);
9380 CXXRecordDecl *RD = PT.getNonReferenceType()->getAsCXXRecordDecl();
9384 DefaultedComparisonSynthesizer(*
this, RD, FD, DCK, BodyLoc).build();
9398 L->CompletedImplicitDefinition(FD);
9405 ComputingExceptionSpec CES(S, FD, Loc);
9435 DefaultedComparisonSynthesizer(S, RD, FD, DCK, BodyLoc).build();
9436 if (!Body.isInvalid())
9457 for (
auto &Check : Overriding)
9469template<
typename Derived>
9470struct SpecialMemberVisitor {
9477 bool IsConstructor =
false, IsAssignment =
false, ConstArg =
false;
9481 : S(S), MD(MD), CSM(CSM), ICI(ICI) {
9486 IsConstructor =
true;
9490 IsAssignment =
true;
9495 llvm_unreachable(
"invalid special member kind");
9499 if (const ReferenceType *RT =
9500 MD->getNonObjectParameter(0)->getType()->getAs<ReferenceType>())
9501 ConstArg = RT->getPointeeType().isConstQualified();
9505 Derived &getDerived() {
return static_cast<Derived&
>(*this); }
9508 bool isMove()
const {
9509 return CSM == CXXSpecialMemberKind::MoveConstructor ||
9510 CSM == CXXSpecialMemberKind::MoveAssignment;
9514 Sema::SpecialMemberOverloadResult lookupIn(CXXRecordDecl *
Class,
9515 unsigned Quals,
bool IsMutable) {
9517 ConstArg && !IsMutable);
9522 Sema::SpecialMemberOverloadResult lookupInheritedCtor(CXXRecordDecl *
Class) {
9525 assert(CSM == CXXSpecialMemberKind::DefaultConstructor);
9534 typedef llvm::PointerUnion<CXXBaseSpecifier*, FieldDecl*> Subobject;
9537 static SourceLocation getSubobjectLoc(Subobject Subobj) {
9540 if (
auto *B = dyn_cast<CXXBaseSpecifier *>(Subobj))
9541 return B->getBaseTypeLoc();
9548 VisitNonVirtualBases,
9553 VisitPotentiallyConstructedBases,
9559 bool visit(BasesToVisit Bases) {
9562 if (Bases == VisitPotentiallyConstructedBases)
9563 Bases = RD->
isAbstract() ? VisitNonVirtualBases : VisitAllBases;
9565 for (
auto &B : RD->
bases())
9566 if ((Bases == VisitDirectBases || !B.isVirtual()) &&
9567 getDerived().visitBase(&B))
9570 if (Bases == VisitAllBases)
9571 for (
auto &B : RD->
vbases())
9572 if (getDerived().visitBase(&B))
9575 for (
auto *F : RD->
fields())
9576 if (!F->isInvalidDecl() && !F->isUnnamedBitField() &&
9577 getDerived().visitField(F))
9586struct SpecialMemberDeletionInfo
9587 : SpecialMemberVisitor<SpecialMemberDeletionInfo> {
9592 bool AllFieldsAreConst;
9594 SpecialMemberDeletionInfo(Sema &S, CXXMethodDecl *MD,
9596 Sema::InheritedConstructorInfo *ICI,
bool Diagnose)
9597 : SpecialMemberVisitor(S, MD, CSM, ICI), Diagnose(Diagnose),
9598 Loc(MD->getLocation()), AllFieldsAreConst(
true) {}
9603 return ICI ? CXXSpecialMemberKind::Invalid : CSM;
9606 bool shouldDeleteForVariantObjCPtrMember(FieldDecl *FD, QualType FieldType);
9608 bool shouldDeleteForVariantPtrAuthMember(
const FieldDecl *FD);
9610 bool visitBase(CXXBaseSpecifier *Base) {
return shouldDeleteForBase(Base); }
9611 bool visitField(FieldDecl *Field) {
return shouldDeleteForField(Field); }
9613 bool shouldDeleteForBase(CXXBaseSpecifier *Base);
9614 bool shouldDeleteForField(FieldDecl *FD);
9615 bool shouldDeleteForAllConstMembers();
9617 bool shouldDeleteForClassSubobject(CXXRecordDecl *
Class, Subobject Subobj,
9619 bool shouldDeleteForSubobjectCall(Subobject Subobj,
9620 Sema::SpecialMemberOverloadResult SMOR,
9621 bool IsDtorCallInCtor);
9623 bool isAccessible(Subobject Subobj, CXXMethodDecl *D);
9629bool SpecialMemberDeletionInfo::isAccessible(Subobject Subobj,
9630 CXXMethodDecl *target) {
9635 if (CXXBaseSpecifier *base = Subobj.dyn_cast<CXXBaseSpecifier*>()) {
9650bool SpecialMemberDeletionInfo::shouldDeleteForSubobjectCall(
9651 Subobject Subobj, Sema::SpecialMemberOverloadResult SMOR,
9652 bool IsDtorCallInCtor) {
9654 FieldDecl *
Field = Subobj.dyn_cast<FieldDecl*>();
9663 } DiagKind = NotSet;
9666 if (CSM == CXXSpecialMemberKind::DefaultConstructor && Field &&
9667 Field->getParent()->isUnion()) {
9677 DiagKind = !
Decl ? NoDecl : DeletedDecl;
9679 DiagKind = MultipleDecl;
9680 else if (!isAccessible(Subobj, Decl))
9681 DiagKind = InaccessibleDecl;
9682 else if (!IsDtorCallInCtor && Field &&
Field->getParent()->isUnion() &&
9683 !
Decl->isTrivial()) {
9689 if (CSM == CXXSpecialMemberKind::DefaultConstructor) {
9697 DiagKind = NonTrivialDecl;
9699 DiagKind = NonTrivialDecl;
9703 if (DiagKind == NotSet)
9709 diag::note_deleted_special_member_class_subobject)
9711 << DiagKind << IsDtorCallInCtor <<
false;
9715 diag::note_deleted_special_member_class_subobject)
9716 << getEffectiveCSM() << MD->
getParent() <<
false
9717 <<
Base->getType() << DiagKind << IsDtorCallInCtor
9721 if (DiagKind == DeletedDecl)
9731bool SpecialMemberDeletionInfo::shouldDeleteForClassSubobject(
9732 CXXRecordDecl *
Class, Subobject Subobj,
unsigned Quals) {
9733 FieldDecl *
Field = Subobj.dyn_cast<FieldDecl*>();
9734 bool IsMutable =
Field &&
Field->isMutable();
9750 if (!(CSM == CXXSpecialMemberKind::DefaultConstructor && Field &&
9751 Field->hasInClassInitializer()) &&
9752 shouldDeleteForSubobjectCall(Subobj, lookupIn(
Class, Quals, IsMutable),
9759 if (IsConstructor) {
9760 Sema::SpecialMemberOverloadResult SMOR =
9762 false,
false,
false,
false);
9763 if (shouldDeleteForSubobjectCall(Subobj, SMOR,
true))
9770bool SpecialMemberDeletionInfo::shouldDeleteForVariantObjCPtrMember(
9771 FieldDecl *FD, QualType FieldType) {
9780 if (CSM == CXXSpecialMemberKind::DefaultConstructor &&
9786 S.
Diag(FD->
getLocation(), diag::note_deleted_special_member_class_subobject)
9787 << getEffectiveCSM() << ParentClass <<
true << FD << 4
9794bool SpecialMemberDeletionInfo::shouldDeleteForVariantPtrAuthMember(
9795 const FieldDecl *FD) {
9804 if (CSM == CXXSpecialMemberKind::DefaultConstructor ||
9805 CSM == CXXSpecialMemberKind::Destructor)
9810 S.
Diag(FD->
getLocation(), diag::note_deleted_special_member_class_subobject)
9811 << getEffectiveCSM() << ParentClass <<
true << FD << 4
9820bool SpecialMemberDeletionInfo::shouldDeleteForBase(CXXBaseSpecifier *Base) {
9821 CXXRecordDecl *BaseClass =
Base->getType()->getAsCXXRecordDecl();
9828 Sema::SpecialMemberOverloadResult SMOR = lookupInheritedCtor(BaseClass);
9829 if (
auto *BaseCtor = SMOR.
getMethod()) {
9834 if (BaseCtor->isDeleted() && Diagnose) {
9836 diag::note_deleted_special_member_class_subobject)
9837 << getEffectiveCSM() << MD->
getParent() <<
false
9838 <<
Base->getType() << 1 <<
false
9842 return BaseCtor->isDeleted();
9844 return shouldDeleteForClassSubobject(BaseClass, Base, 0);
9849bool SpecialMemberDeletionInfo::shouldDeleteForField(FieldDecl *FD) {
9853 if (inUnion() && shouldDeleteForVariantObjCPtrMember(FD, FieldType))
9856 if (inUnion() && shouldDeleteForVariantPtrAuthMember(FD))
9859 if (CSM == CXXSpecialMemberKind::DefaultConstructor) {
9864 S.
Diag(FD->
getLocation(), diag::note_deleted_default_ctor_uninit_field)
9865 << !!ICI << MD->
getParent() << FD << FieldType << 0;
9875 S.
Diag(FD->
getLocation(), diag::note_deleted_default_ctor_uninit_field)
9881 AllFieldsAreConst =
false;
9882 }
else if (CSM == CXXSpecialMemberKind::CopyConstructor) {
9887 S.
Diag(FD->
getLocation(), diag::note_deleted_copy_ctor_rvalue_reference)
9891 }
else if (IsAssignment) {
9896 << isMove() << MD->
getParent() << FD << FieldType << 0;
9911 if (!inUnion() && FieldRecord->
isUnion() &&
9913 bool AllVariantFieldsAreConst =
true;
9916 for (
auto *UI : FieldRecord->
fields()) {
9919 if (shouldDeleteForVariantObjCPtrMember(&*UI, UnionFieldType))
9922 if (shouldDeleteForVariantPtrAuthMember(&*UI))
9926 AllVariantFieldsAreConst =
false;
9929 if (UnionFieldRecord &&
9930 shouldDeleteForClassSubobject(UnionFieldRecord, UI,
9936 if (CSM == CXXSpecialMemberKind::DefaultConstructor &&
9937 AllVariantFieldsAreConst && !FieldRecord->
field_empty()) {
9940 diag::note_deleted_default_ctor_all_const)
9951 if (shouldDeleteForClassSubobject(FieldRecord, FD,
9962bool SpecialMemberDeletionInfo::shouldDeleteForAllConstMembers() {
9965 if (CSM == CXXSpecialMemberKind::DefaultConstructor && inUnion() &&
9966 AllFieldsAreConst) {
9967 bool AnyFields =
false;
9969 if ((AnyFields = !F->isUnnamedBitField()))
9975 diag::note_deleted_default_ctor_all_const)
10021 bool DeletesOnlyMatchingCopy =
10026 (!DeletesOnlyMatchingCopy ||
10031 for (
auto *I : RD->
ctors()) {
10032 if (I->isMoveConstructor()) {
10033 UserDeclaredMove = I;
10037 assert(UserDeclaredMove);
10039 (!DeletesOnlyMatchingCopy ||
10044 for (
auto *I : RD->
methods()) {
10045 if (I->isMoveAssignmentOperator()) {
10046 UserDeclaredMove = I;
10050 assert(UserDeclaredMove);
10053 if (UserDeclaredMove) {
10055 diag::note_deleted_copy_user_declared_move)
10072 Context.DeclarationNames.getCXXOperatorName(OO_Delete);
10077 OperatorDelete, IDP,
10085 SpecialMemberDeletionInfo SMI(*
this, MD, CSM, ICI,
Diagnose);
10093 if (SMI.visit(SMI.IsAssignment ? SMI.VisitDirectBases
10094 : SMI.VisitPotentiallyConstructedBases))
10097 if (SMI.shouldDeleteForAllConstMembers())
10108 auto RealCSM = CSM;
10112 return CUDA().inferTargetForImplicitSpecialMember(RD, RealCSM, MD,
10121 assert(DFK &&
"not a defaultable function");
10128 DefaultedComparisonAnalyzer(
10130 DFK.
asComparison(), DefaultedComparisonAnalyzer::ExplainDeleted)
10151 *Selected =
nullptr;
10155 llvm_unreachable(
"not a special member");
10173 for (
auto *CI : RD->
ctors()) {
10174 if (!CI->isDefaultConstructor())
10181 *Selected = DefCtor;
10214 }
else if (!Selected) {
10222 goto NeedOverloadResolution;
10232 }
else if (!Selected) {
10237 goto NeedOverloadResolution;
10241 NeedOverloadResolution:
10270 llvm_unreachable(
"unknown special method kind");
10274 for (
auto *CI : RD->
ctors())
10275 if (!CI->isImplicit())
10282 dyn_cast<CXXConstructorDecl>(TI->getTemplatedDecl()))
10312 ConstRHS, TAH, Diagnose ? &Selected :
nullptr))
10320 S.
Diag(SubobjLoc, diag::note_nontrivial_no_def_ctor)
10323 S.
Diag(CD->getLocation(), diag::note_user_declared_ctor);
10324 }
else if (!Selected)
10325 S.
Diag(SubobjLoc, diag::note_nontrivial_no_copy)
10330 << Kind << SubType.getUnqualifiedType() << CSM;
10332 S.
Diag(SubobjLoc, diag::note_nontrivial_user_provided)
10333 << Kind << SubType.getUnqualifiedType() << CSM;
10338 S.
Diag(SubobjLoc, diag::note_nontrivial_subobject)
10339 << Kind << SubType.getUnqualifiedType() << CSM;
10355 for (
const auto *FI : RD->
fields()) {
10356 if (FI->isInvalidDecl() || FI->isUnnamedBitField())
10362 if (FI->isAnonymousStructOrUnion()) {
10364 CSM, ConstArg, TAH, Diagnose))
10374 FI->hasInClassInitializer()) {
10376 S.
Diag(FI->getLocation(), diag::note_nontrivial_default_member_init)
10387 S.
Diag(FI->getLocation(), diag::note_nontrivial_objc_ownership)
10392 bool ConstRHS = ConstArg && !FI->isMutable();
10416 "not special enough");
10420 bool ConstArg =
false;
10444 const bool ClangABICompat14 =
10445 Context.getLangOpts().isCompatibleWith(LangOptions::ClangABI::Ver14);
10448 ClangABICompat14)) {
10452 <<
Context.getLValueReferenceType(
10453 Context.getCanonicalTagType(RD).withConst());
10471 <<
Context.getRValueReferenceType(
Context.getCanonicalTagType(RD));
10478 llvm_unreachable(
"not a special member");
10484 diag::note_nontrivial_default_arg)
10503 for (
const auto &BI : RD->
bases())
10545 Diag(BS.
getBeginLoc(), diag::note_nontrivial_has_virtual) << RD << 1;
10550 for (
const auto *MI : RD->
methods()) {
10551 if (MI->isVirtual()) {
10553 Diag(MLoc, diag::note_nontrivial_has_virtual) << RD << 0;
10558 llvm_unreachable(
"dynamic class with no vbases and no virtual functions");
10566struct FindHiddenVirtualMethod {
10574 static bool CheckMostOverridenMethods(
10576 const llvm::SmallPtrSetImpl<const CXXMethodDecl *> &Methods) {
10580 if (CheckMostOverridenMethods(O, Methods))
10590 auto *BaseRecord = Specifier->getType()->castAsRecordDecl();
10594 bool foundSameNameMethod =
false;
10596 for (Path.
Decls = BaseRecord->lookup(Name).begin();
10601 foundSameNameMethod =
true;
10618 if (!CheckMostOverridenMethods(MD, OverridenAndUsingBaseMethods))
10619 overloadedMethods.push_back(MD);
10623 if (foundSameNameMethod)
10624 OverloadedMethods.append(overloadedMethods.begin(),
10625 overloadedMethods.end());
10626 return foundSameNameMethod;
10633 llvm::SmallPtrSetImpl<const CXXMethodDecl *>& Methods) {
10649 FindHiddenVirtualMethod FHVM;
10658 ND = shad->getTargetDecl();
10664 OverloadedMethods = FHVM.OverloadedMethods;
10669 for (
const CXXMethodDecl *overloadedMD : OverloadedMethods) {
10671 diag::note_hidden_overloaded_virtual_declared_here) << overloadedMD;
10673 Diag(overloadedMD->getLocation(), PD);
10686 if (!OverloadedMethods.empty()) {
10688 << MD << (OverloadedMethods.size() > 1);
10695 auto PrintDiagAndRemoveAttr = [&](
unsigned N) {
10698 Diag(RD.
getAttr<TrivialABIAttr>()->getLocation(),
10699 diag::ext_cannot_use_trivial_abi) << &RD;
10700 Diag(RD.
getAttr<TrivialABIAttr>()->getLocation(),
10701 diag::note_cannot_use_trivial_abi_reason) << &RD << N;
10708 PrintDiagAndRemoveAttr(1);
10712 for (
const auto &B : RD.
bases()) {
10715 if (!B.getType()->isDependentType() &&
10716 !B.getType()->getAsCXXRecordDecl()->canPassInRegisters()) {
10717 PrintDiagAndRemoveAttr(2);
10721 if (B.isVirtual()) {
10722 PrintDiagAndRemoveAttr(3);
10727 for (
const auto *FD : RD.
fields()) {
10732 PrintDiagAndRemoveAttr(4);
10738 PrintDiagAndRemoveAttr(6);
10742 if (
const auto *RT =
10744 if (!RT->isDependentType() &&
10746 ->canPassInRegisters()) {
10747 PrintDiagAndRemoveAttr(5);
10756 auto HasNonDeletedCopyOrMoveConstructor = [&]() {
10768 if (CD->isCopyOrMoveConstructor() && !CD->isDeleted())
10773 if (!HasNonDeletedCopyOrMoveConstructor()) {
10774 PrintDiagAndRemoveAttr(0);
10782 diag::err_incomplete_type_vtable_pointer_auth))
10790 assert(PrimaryBase);
10793 if (!BasePtr.getType()->getAsCXXRecordDecl()->isDynamicClass())
10795 Base = BasePtr.getType()->getAsCXXRecordDecl();
10798 if (!
Base ||
Base == PrimaryBase || !
Base->isPolymorphic())
10800 Diag(RD.
getAttr<VTablePointerAuthenticationAttr>()->getLocation(),
10801 diag::err_non_top_level_vtable_pointer_auth)
10803 PrimaryBase =
Base;
10807 Diag(RD.
getAttr<VTablePointerAuthenticationAttr>()->getLocation(),
10808 diag::err_non_polymorphic_vtable_pointer_auth)
10821 if (AL.getKind() != ParsedAttr::AT_Visibility)
10824 Diag(AL.getLoc(), diag::warn_attribute_after_definition_ignored) << AL;
10832 LBrac, RBrac, AttrList);
10854 Spaceships.clear();
10860 Spaceships.push_back(FD);
10869 if (
auto *FD = dyn_cast<FunctionDecl>(ND))
10870 if (FD->isExplicitlyDefaulted())
10871 Spaceships.push_back(FD);
10901 else if (
Context.getTargetInfo().getCXXABI().isMicrosoft() &&
10966 DefaultedSpaceships);
10967 for (
auto *FD : DefaultedSpaceships)
10974 llvm::function_ref<
Scope *()> EnterScope) {
10982 DeclContext *LookupDC = dyn_cast<DeclContext>(D);
10986 ParameterLists.push_back(TPL);
10990 ParameterLists.push_back(FTD->getTemplateParameters());
10991 }
else if (
VarDecl *VD = dyn_cast<VarDecl>(D)) {
10995 ParameterLists.push_back(VTD->getTemplateParameters());
10996 else if (
auto *PSD = dyn_cast<VarTemplatePartialSpecializationDecl>(D))
10997 ParameterLists.push_back(PSD->getTemplateParameters());
10999 }
else if (
TagDecl *TD = dyn_cast<TagDecl>(D)) {
11001 ParameterLists.push_back(TPL);
11005 ParameterLists.push_back(CTD->getTemplateParameters());
11006 else if (
auto *PSD = dyn_cast<ClassTemplatePartialSpecializationDecl>(D))
11007 ParameterLists.push_back(PSD->getTemplateParameters());
11012 unsigned Count = 0;
11013 Scope *InnermostTemplateScope =
nullptr;
11017 if (Params->size() == 0)
11020 InnermostTemplateScope = EnterScope();
11022 if (Param->getDeclName()) {
11023 InnermostTemplateScope->
AddDecl(Param);
11031 if (InnermostTemplateScope) {
11032 assert(LookupDC &&
"no enclosing DeclContext for template lookup");
11040 if (!RecordD)
return;
11047 if (!RecordD)
return;
11056 if (Param->getDeclName())
11075 if (Param->getDeclName())
11095 if (!
Method->isInvalidDecl())
11104 bool DiagOccurred =
false;
11106 [DiagID, &S, &DiagOccurred](
DeclSpec::TQ, StringRef QualName,
11113 DiagOccurred =
true;
11131 S.
Diag(PointerLoc, diag::err_invalid_ctor_dtor_decl)
11199 = dyn_cast<CXXRecordDecl>(
Constructor->getDeclContext());
11210 !
Constructor->isFunctionTemplateSpecialization()) {
11212 Constructor->getParamDecl(0)->getType()->getCanonicalTypeUnqualified();
11214 if (ParamType == ClassTy) {
11216 const char *ConstRef
11217 =
Constructor->getParamDecl(0)->getIdentifier() ?
"const &"
11219 Diag(ParamLoc, diag::err_constructor_byvalue_arg)
11241 Context.DeclarationNames.getCXXOperatorName(OO_Delete);
11244 Loc, RD,
true,
false, Name)) {
11245 Expr *ThisArg =
nullptr;
11250 if (OperatorDelete->isDestroyingOperatorDelete()) {
11251 unsigned AddressParamIndex = 0;
11252 if (OperatorDelete->isTypeAwareOperatorNewOrDelete())
11253 ++AddressParamIndex;
11255 OperatorDelete->getParamDecl(AddressParamIndex)->getType();
11262 OperatorDelete->getParamDecl(AddressParamIndex)->getLocation());
11263 assert(!
This.isInvalid() &&
"couldn't form 'this' expr in dtor?");
11266 if (
This.isInvalid()) {
11269 Diag(Loc, diag::note_implicit_delete_this_in_destructor_here);
11272 ThisArg =
This.get();
11278 Destructor->setOperatorDelete(OperatorDelete, ThisArg);
11281 Context.getTargetInfo().callGlobalDeleteInDeletingDtor(
11293 if (GlobalOperatorDelete) {
11295 Destructor->setOperatorGlobalDelete(GlobalOperatorDelete);
11299 if (
Context.getTargetInfo().emitVectorDeletingDtors(
11301 bool DestructorIsExported =
Destructor->hasAttr<DLLExportAttr>();
11304 Context.DeclarationNames.getCXXOperatorName(OO_Array_Delete);
11307 false, VDeleteName);
11313 Destructor->setGlobalOperatorArrayDelete(GlobalArrOperatorDelete);
11314 if (GlobalArrOperatorDelete &&
11315 (
Context.classMaybeNeedsVectorDeletingDestructor(RD) ||
11316 DestructorIsExported))
11318 }
else if (!ArrOperatorDelete) {
11321 true, VDeleteName);
11323 Destructor->setOperatorArrayDelete(ArrOperatorDelete);
11324 if (ArrOperatorDelete &&
11325 (
Context.classMaybeNeedsVectorDeletingDestructor(RD) ||
11326 DestructorIsExported))
11345 << DeclaratorType << isa<TypeAliasDecl>(TT->getDecl());
11346 else if (
const TemplateSpecializationType *TST =
11347 DeclaratorType->
getAs<TemplateSpecializationType>())
11348 if (TST->isTypeAlias())
11350 << DeclaratorType << 1;
11440 if (R.getEnd().isInvalid())
11441 R.setEnd(Before.
getEnd());
11445 if (After.isInvalid())
11447 if (R.getBegin().isInvalid())
11448 R.setBegin(After.getBegin());
11449 R.setEnd(After.getEnd());
11498 unsigned NumParam = Proto->getNumParams();
11502 if (NumParam == 1) {
11504 if (
const auto *
First =
11505 dyn_cast_if_present<ParmVarDecl>(FTI.
Params[0].
Param);
11506 First &&
First->isExplicitObjectParameter())
11510 if (NumParam != 0) {
11515 }
else if (Proto->isVariadic()) {
11522 if (Proto->getReturnType() != ConvType) {
11523 bool NeedsTypedef =
false;
11527 bool PastFunctionChunk =
false;
11529 switch (Chunk.Kind) {
11531 if (!PastFunctionChunk) {
11532 if (Chunk.Fun.HasTrailingReturnType) {
11537 PastFunctionChunk =
true;
11542 NeedsTypedef =
true;
11562 After.isValid() ? After.getBegin() :
11564 auto &&DB =
Diag(Loc, diag::err_conv_function_with_complex_decl);
11565 DB << Before << After;
11567 if (!NeedsTypedef) {
11571 if (After.isInvalid() && ConvTSI) {
11579 }
else if (!Proto->getReturnType()->isDependentType()) {
11580 DB << 1 << Proto->getReturnType();
11582 DB << 2 << Proto->getReturnType();
11593 ConvType = Proto->getReturnType();
11601 ConvType =
Context.getPointerType(ConvType);
11605 ConvType =
Context.getPointerType(ConvType);
11613 R =
Context.getFunctionType(ConvType, {}, Proto->getExtProtoInfo());
11619 ? diag::warn_cxx98_compat_explicit_conversion_functions
11620 : diag::ext_explicit_conversion_functions)
11625 assert(Conversion &&
"Expected to receive a conversion function declaration");
11646 ConvType =
Context.getCanonicalType(ConvType).getUnqualifiedType();
11647 if (ConvType == ClassType)
11652 << ClassType << ConvType;
11655 << ClassType << ConvType;
11666 << ConvType->
castAs<AutoType>()->getKeyword()
11670 return ConversionTemplate;
11695 for (
unsigned Idx = 0; Idx < FTI.
NumParams; Idx++) {
11696 const auto &ParamInfo = FTI.
Params[Idx];
11697 if (!ParamInfo.Param)
11700 if (!Param->isExplicitObjectParameter())
11703 ExplicitObjectParam = Param;
11706 Diag(Param->getLocation(),
11707 diag::err_explicit_object_parameter_must_be_first)
11708 << IsLambda << Param->getSourceRange();
11711 if (!ExplicitObjectParam)
11716 diag::err_explicit_object_default_arg)
11725 diag::err_explicit_object_parameter_nonmember)
11732 diag::err_explicit_object_parameter_nonmember)
11757 !isa_and_present<CXXRecordDecl>(
11760 diag::err_explicit_object_parameter_nonmember)
11767 diag::err_explicit_object_parameter_mutable)
11775 assert(D.
isInvalidType() &&
"Explicit object parameter in non-member "
11776 "should have been diagnosed already");
11784 diag::err_explicit_object_parameter_constructor)
11794struct BadSpecifierDiagnoser {
11797 ~BadSpecifierDiagnoser() {
11801 template<
typename T>
void check(SourceLocation SpecLoc,
T Spec) {
11805 return check(SpecLoc,
11808 void check(SourceLocation SpecLoc,
const char *Spec) {
11810 Diagnostic << SourceRange(SpecLoc, SpecLoc);
11811 if (!Specifiers.empty()) Specifiers +=
" ";
11812 Specifiers += Spec;
11816 Sema::SemaDiagnosticBuilder Diagnostic;
11817 std::string Specifiers;
11825 assert(GuidedTemplateDecl &&
"missing template decl for deduction guide");
11830 if (!
CurContext->getRedeclContext()->Equals(
11833 << GuidedTemplateDecl;
11839 if (DS.hasTypeSpecifier() || DS.getTypeQualifiers() ||
11840 DS.getStorageClassSpecLoc().isValid() || DS.isInlineSpecified() ||
11841 DS.isNoreturnSpecified() || DS.hasConstexprSpecifier()) {
11842 BadSpecifierDiagnoser Diagnoser(
11844 diag::err_deduction_guide_invalid_specifier);
11846 Diagnoser.check(DS.getStorageClassSpecLoc(), DS.getStorageClassSpec());
11847 DS.ClearStorageClassSpecs();
11851 Diagnoser.check(DS.getInlineSpecLoc(),
"inline");
11852 Diagnoser.check(DS.getNoreturnSpecLoc(),
"_Noreturn");
11853 Diagnoser.check(DS.getConstexprSpecLoc(),
"constexpr");
11854 DS.ClearConstexprSpec();
11856 Diagnoser.check(DS.getConstSpecLoc(),
"const");
11857 Diagnoser.check(DS.getRestrictSpecLoc(),
"__restrict");
11858 Diagnoser.check(DS.getVolatileSpecLoc(),
"volatile");
11859 Diagnoser.check(DS.getAtomicSpecLoc(),
"_Atomic");
11860 Diagnoser.check(DS.getUnalignedSpecLoc(),
"__unaligned");
11861 DS.ClearTypeQualifiers();
11863 Diagnoser.check(DS.getTypeSpecComplexLoc(), DS.getTypeSpecComplex());
11864 Diagnoser.check(DS.getTypeSpecSignLoc(), DS.getTypeSpecSign());
11865 Diagnoser.check(DS.getTypeSpecWidthLoc(), DS.getTypeSpecWidth());
11866 Diagnoser.check(DS.getTypeSpecTypeLoc(), DS.getTypeSpecType());
11867 DS.ClearTypeSpecType();
11874 bool FoundFunction =
false;
11880 diag::err_deduction_guide_with_complex_decl)
11884 if (!Chunk.Fun.hasTrailingReturnType())
11886 diag::err_deduction_guide_no_trailing_return_type);
11891 ParsedType TrailingReturnType = Chunk.Fun.getTrailingReturnType();
11894 assert(TSI &&
"deduction guide has valid type but invalid return type?");
11895 bool AcceptableReturnType =
false;
11896 bool MightInstantiateToSpecialization =
false;
11899 TemplateName SpecifiedName = RetTST.getTypePtr()->getTemplateName();
11900 bool TemplateMatches =
Context.hasSameTemplateName(
11901 SpecifiedName, GuidedTemplate,
true);
11909 if (SimplyWritten && TemplateMatches)
11910 AcceptableReturnType =
true;
11915 MightInstantiateToSpecialization =
11919 MightInstantiateToSpecialization =
true;
11922 if (!AcceptableReturnType)
11924 diag::err_deduction_guide_bad_trailing_return_type)
11925 << GuidedTemplate << TSI->
getType()
11926 << MightInstantiateToSpecialization
11931 FoundFunction =
true;
11950 assert(*IsInline != PrevNS->
isInline());
11960 S.
Diag(Loc, diag::warn_inline_namespace_reopened_noninline)
11963 S.
Diag(Loc, diag::err_inline_namespace_mismatch);
11981 bool IsInline = InlineLoc.
isValid();
11982 bool IsInvalid =
false;
11983 bool IsStd =
false;
11984 bool AddToKnown =
false;
11995 auto DiagnoseInlineStdNS = [&]() {
11996 assert(IsInline && II->
isStr(
"std") &&
11997 CurContext->getRedeclContext()->isTranslationUnit() &&
11998 "Precondition of DiagnoseInlineStdNS not met");
11999 Diag(InlineLoc, diag::err_inline_namespace_std)
12018 R.isSingleResult() ? R.getRepresentativeDecl() :
nullptr;
12019 PrevNS = dyn_cast_or_null<NamespaceDecl>(PrevDecl);
12023 if (IsInline && II->
isStr(
"std") &&
12024 CurContext->getRedeclContext()->isTranslationUnit())
12025 DiagnoseInlineStdNS();
12026 else if (IsInline != PrevNS->
isInline())
12028 &IsInline, PrevNS);
12029 }
else if (PrevDecl) {
12031 Diag(Loc, diag::err_redefinition_different_kind)
12036 }
else if (II->
isStr(
"std") &&
12037 CurContext->getRedeclContext()->isTranslationUnit()) {
12039 DiagnoseInlineStdNS();
12044 AddToKnown = !IsInline;
12047 AddToKnown = !IsInline;
12061 if (PrevNS && IsInline != PrevNS->
isInline())
12063 &IsInline, PrevNS);
12076 if (
const VisibilityAttr *
Attr = Namespc->
getAttr<VisibilityAttr>())
12082 KnownNamespaces[Namespc] =
false;
12090 TU->setAnonymousNamespace(Namespc);
12142 return dyn_cast_or_null<NamespaceDecl>(D);
12146 NamespaceDecl *Namespc = dyn_cast_or_null<NamespaceDecl>(Dcl);
12147 assert(Namespc &&
"Invalid parameter, expected NamespaceDecl");
12150 if (Namespc->
hasAttr<VisibilityAttr>())
12153 if (DeferredExportedNamespaces.erase(Namespc))
12158 return cast_or_null<CXXRecordDecl>(
12167 return cast_or_null<NamespaceDecl>(
12173enum UnsupportedSTLSelect {
12180struct InvalidSTLDiagnoser {
12185 QualType operator()(UnsupportedSTLSelect Sel = USS_Other, StringRef Name =
"",
12186 const VarDecl *VD =
nullptr) {
12188 auto D = S.
Diag(Loc, diag::err_std_compare_type_not_supported)
12189 << TyForDiags << ((
int)Sel);
12190 if (Sel == USS_InvalidMember || Sel == USS_MissingMember) {
12191 assert(!Name.empty());
12195 if (Sel == USS_InvalidMember) {
12208 "Looking for comparison category type outside of C++.");
12223 if (Info && FullyCheckedComparisonCategories[
static_cast<unsigned>(Kind)]) {
12234 std::string NameForDiags =
"std::";
12236 Diag(Loc, diag::err_implied_comparison_category_type_not_found)
12237 << NameForDiags << (int)Usage;
12241 assert(Info->
Kind == Kind);
12252 InvalidSTLDiagnoser UnsupportedSTLError{*
this, Loc, TyForDiags(Info)};
12255 return UnsupportedSTLError(USS_NonTrivial);
12260 if (
Base->isEmpty())
12263 return UnsupportedSTLError();
12271 if (std::distance(FIt, FEnd) != 1 ||
12272 !FIt->getType()->isIntegralOrEnumerationType()) {
12273 return UnsupportedSTLError();
12283 return UnsupportedSTLError(USS_MissingMember, MemName);
12286 assert(VD &&
"should not be null!");
12293 return UnsupportedSTLError(USS_InvalidMember, MemName, VD);
12299 return UnsupportedSTLError();
12306 FullyCheckedComparisonCategories[
static_cast<unsigned>(Kind)] =
true;
12316 &
PP.getIdentifierTable().get(
"std"),
12329 const char *ClassName,
12331 const Decl **MalformedDecl) {
12339 auto ReportMatchingNameAsMalformed = [&](
NamedDecl *D) {
12340 if (!MalformedDecl)
12348 *MalformedDecl = D;
12353 if (
const TemplateSpecializationType *TST =
12355 Template = dyn_cast_or_null<ClassTemplateDecl>(
12356 TST->getTemplateName().getAsTemplateDecl());
12357 Arguments = TST->template_arguments();
12358 }
else if (
const auto *TT = SugaredType->
getAs<TagType>()) {
12360 Arguments = TT->getTemplateArgs(S.
Context);
12364 ReportMatchingNameAsMalformed(SugaredType->
getAsTagDecl());
12368 if (!*CachedDecl) {
12387 *MalformedDecl = TemplateClass;
12395 if (
Template->getCanonicalDecl() != (*CachedDecl)->getCanonicalDecl())
12400 QualType ArgType = Arguments[0].getAsType();
12406 if (S.
getLangOpts().ObjCAutoRefCount && ArgType->isObjCLifetimeType() &&
12407 !ArgType.getObjCLifetime()) {
12412 *TypeArg = ArgType;
12420 "Looking for std::initializer_list outside of C++.");
12430 const Decl **MalformedDecl) {
12432 "Looking for std::type_identity outside of C++.");
12442 const char *ClassName,
12443 bool *WasMalformed) {
12454 Result.suppressDiagnostics();
12457 S.
Diag(
Found->getLocation(), diag::err_malformed_std_class_template)
12460 *WasMalformed =
true;
12469 S.
Diag(
Template->getLocation(), diag::err_malformed_std_class_template)
12472 *WasMalformed =
true;
12487 Loc, Args,
nullptr,
12493 bool WasMalformed =
false;
12498 Diag(Loc, diag::err_implied_std_initializer_list_not_found);
12526 ArgType = RT->getPointeeType().getUnqualifiedType();
12535 case Decl::TranslationUnit:
12537 case Decl::LinkageSpec:
12547class NamespaceValidatorCCC final :
public CorrectionCandidateCallback {
12549 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
12555 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
12556 return std::make_unique<NamespaceValidatorCCC>(*
this);
12565 Module *M = ND->getOwningModule();
12566 assert(M &&
"hidden namespace definition not in a module?");
12570 diag::err_module_unimported_use_header)
12575 diag::err_module_unimported_use)
12585 NamespaceValidatorCCC CCC{};
12587 S.
CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), Sc, &SS, CCC,
12595 if (isa_and_nonnull<NamespaceDecl>(Corrected.getFoundDecl()) &&
12596 Corrected.requiresImport()) {
12599 std::string CorrectedStr(Corrected.getAsString(S.
getLangOpts()));
12600 bool DroppedSpecifier =
12601 Corrected.WillReplaceSpecifier() && Ident->
getName() == CorrectedStr;
12603 S.
PDiag(diag::err_using_directive_member_suggest)
12604 << Ident << DC << DroppedSpecifier << SS.
getRange(),
12605 S.
PDiag(diag::note_namespace_defined_here));
12608 S.
PDiag(diag::err_using_directive_suggest) << Ident,
12609 S.
PDiag(diag::note_namespace_defined_here));
12611 R.addDecl(Corrected.getFoundDecl());
12622 assert(!SS.
isInvalid() &&
"Invalid CXXScopeSpec.");
12623 assert(NamespcName &&
"Invalid NamespcName.");
12624 assert(IdentLoc.
isValid() &&
"Invalid NamespceName location.");
12635 if (R.isAmbiguous())
12644 NamespcName->
isStr(
"std")) {
12645 Diag(IdentLoc, diag::ext_using_undefined_std);
12655 NamedDecl *Named = R.getRepresentativeDecl();
12657 assert(
NS &&
"expected namespace decl");
12676 CommonAncestor = CommonAncestor->
getParent();
12680 IdentLoc, Named, CommonAncestor);
12684 Diag(IdentLoc, diag::warn_using_directive_in_header);
12689 Diag(IdentLoc, diag::err_expected_namespace_name) << SS.
getRange();
12739 ? diag::warn_cxx98_compat_using_decl_constructor
12740 : diag::err_using_decl_constructor)
12757 llvm_unreachable(
"cannot parse qualified deduction guide name");
12768 ? diag::err_access_decl
12769 : diag::warn_access_decl_deprecated)
12780 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
12788 SS, TargetNameInfo, EllipsisLoc, AttrList,
12807 ? diag::err_using_enum_is_dependent
12808 : diag::err_unknown_typename)
12816 Diag(IdentLoc, diag::err_using_enum_is_dependent);
12822 Diag(IdentLoc, diag::err_using_enum_not_enum) << EnumTy;
12826 if (TSI ==
nullptr)
12827 TSI =
Context.getTrivialTypeSourceInfo(EnumTy, IdentLoc);
12848 return Context.hasSameType(TD1->getUnderlyingType(),
12849 TD2->getUnderlyingType());
12883 if (
auto *Using = dyn_cast<UsingDecl>(BUD)) {
12895 Diag(Using->getLocation(),
12896 diag::err_using_decl_nested_name_specifier_is_current_class)
12897 << Using->getQualifierLoc().getSourceRange();
12899 Using->setInvalidDecl();
12903 Diag(Using->getQualifierLoc().getBeginLoc(),
12904 diag::err_using_decl_nested_name_specifier_is_not_base_class)
12906 << Using->getQualifierLoc().getSourceRange();
12908 Using->setInvalidDecl();
12913 if (
Previous.empty())
return false;
12924 NamedDecl *NonTag =
nullptr, *Tag =
nullptr;
12925 bool FoundEquivalentDecl =
false;
12927 NamedDecl *D = Element->getUnderlyingDecl();
12934 if (
auto *RD = dyn_cast<CXXRecordDecl>(D)) {
12949 PrevShadow = Shadow;
12950 FoundEquivalentDecl =
true;
12954 FoundEquivalentDecl =
true;
12961 if (FoundEquivalentDecl)
12967 (isa_and_nonnull<UnresolvedUsingIfExistsDecl>(NonTag))) {
12968 if (!NonTag && !Tag)
12971 Diag(
Target->getLocation(), diag::note_using_decl_target);
12972 Diag((NonTag ? NonTag : Tag)->getLocation(),
12973 diag::note_using_decl_conflict);
13002 Diag(
Target->getLocation(), diag::note_using_decl_target);
13012 if (!Tag)
return false;
13015 Diag(
Target->getLocation(), diag::note_using_decl_target);
13016 Diag(Tag->getLocation(), diag::note_using_decl_conflict);
13022 if (!NonTag)
return false;
13025 Diag(
Target->getLocation(), diag::note_using_decl_target);
13035 for (
auto &B : Derived->
bases())
13036 if (B.getType()->getAsCXXRecordDecl() ==
Base)
13037 return B.isVirtual();
13038 llvm_unreachable(
"not a direct base class");
13052 if (
auto *TargetTD = dyn_cast<TemplateDecl>(
Target))
13053 NonTemplateTarget = TargetTD->getTemplatedDecl();
13058 bool IsVirtualBase =
13060 Using->getQualifier().getAsRecordDecl());
13108 bool &AnyDependentBases) {
13112 CanQualType BaseType =
Base.getType()->getCanonicalTypeUnqualified();
13113 if (CanonicalDesiredBase == BaseType)
13115 if (BaseType->isDependentType())
13116 AnyDependentBases =
true;
13122class UsingValidatorCCC final :
public CorrectionCandidateCallback {
13124 UsingValidatorCCC(
bool HasTypenameKeyword,
bool IsInstantiation,
13125 NestedNameSpecifier NNS, CXXRecordDecl *RequireMemberOf)
13126 : HasTypenameKeyword(HasTypenameKeyword),
13127 IsInstantiation(IsInstantiation), OldNNS(NNS),
13128 RequireMemberOf(RequireMemberOf) {}
13130 bool ValidateCandidate(
const TypoCorrection &Candidate)
override {
13144 if (RequireMemberOf) {
13145 auto *FoundRecord = dyn_cast<CXXRecordDecl>(ND);
13146 if (FoundRecord && FoundRecord->isInjectedClassName()) {
13160 if (
Specifier.getKind() != NestedNameSpecifier::Kind::Type ||
13166 bool AnyDependentBases =
false;
13169 AnyDependentBases) &&
13170 !AnyDependentBases)
13180 auto *FoundRecord = dyn_cast<CXXRecordDecl>(ND);
13181 if (FoundRecord && FoundRecord->isInjectedClassName())
13186 return HasTypenameKeyword || !IsInstantiation;
13188 return !HasTypenameKeyword;
13191 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
13192 return std::make_unique<UsingValidatorCCC>(*
this);
13196 bool HasTypenameKeyword;
13197 bool IsInstantiation;
13198 NestedNameSpecifier OldNNS;
13199 CXXRecordDecl *RequireMemberOf;
13226 bool IsUsingIfExists) {
13227 assert(!SS.
isInvalid() &&
"Invalid CXXScopeSpec.");
13229 assert(IdentLoc.
isValid() &&
"Invalid TargetName location.");
13238 if (
auto *RD = dyn_cast<CXXRecordDecl>(
CurContext))
13239 UsingName.
setName(
Context.DeclarationNames.getCXXConstructorName(
13240 Context.getCanonicalTagType(RD)));
13251 assert(IsInstantiation &&
"no scope in non-instantiation");
13279 Diag(UsingLoc, diag::err_using_if_exists_on_ctor);
13285 if (!LookupContext || EllipsisLoc.
isValid()) {
13289 SS, NameInfo, IdentLoc))
13293 Previous.getFoundDecl()->isTemplateParameter())
13296 if (HasTypenameKeyword) {
13299 UsingLoc, TypenameLoc,
13301 IdentLoc, NameInfo.
getName(),
13305 QualifierLoc, NameInfo, EllipsisLoc);
13313 auto Build = [&](
bool Invalid) {
13316 UsingName, HasTypenameKeyword);
13323 auto BuildInvalid = [&]{
return Build(
true); };
13324 auto BuildValid = [&]{
return Build(
false); };
13327 return BuildInvalid();
13336 if (!IsInstantiation)
13337 R.setHideTags(
false);
13342 R.setBaseObjectType(
13353 if (R.empty() && IsUsingIfExists)
13371 PP.NeedsStdLibCxxWorkaroundBefore(2016'12'21) &&
13374 UsingValidatorCCC CCC(HasTypenameKeyword, IsInstantiation, SS.
getScopeRep(),
13377 CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), S, &SS, CCC,
13382 << NameInfo.
getName() << LookupContext << 0
13387 NamedDecl *ND = Corrected.getCorrectionDecl();
13389 return BuildInvalid();
13392 auto *RD = dyn_cast<CXXRecordDecl>(ND);
13398 if (Corrected.WillReplaceSpecifier()) {
13402 QualifierLoc = Builder.getWithLocInContext(
Context);
13408 UsingName.
setName(
Context.DeclarationNames.getCXXConstructorName(
13409 Context.getCanonicalTagType(CurClass)));
13421 Diag(IdentLoc, diag::err_no_member)
13423 return BuildInvalid();
13427 if (R.isAmbiguous())
13428 return BuildInvalid();
13430 if (HasTypenameKeyword) {
13434 Diag(IdentLoc, diag::err_using_typename_non_type);
13437 diag::note_using_decl_target);
13438 return BuildInvalid();
13444 if (IsInstantiation && R.getAsSingle<
TypeDecl>()) {
13445 Diag(IdentLoc, diag::err_using_dependent_value_is_type);
13446 Diag(R.getFoundDecl()->getLocation(), diag::note_using_decl_target);
13447 return BuildInvalid();
13454 Diag(IdentLoc, diag::err_using_decl_can_not_refer_to_namespace)
13459 return BuildInvalid();
13469 R.suppressDiagnostics();
13491 if (
CurContext->getRedeclContext()->isRecord()) {
13501 if (UED->getEnumDecl() == ED) {
13502 Diag(UsingLoc, diag::err_using_enum_decl_redeclaration)
13514 EnumLoc, NameLoc, EnumType);
13547 UPD->setAccess(InstantiatedFrom->
getAccess());
13553 assert(!UD->
hasTypename() &&
"expecting a constructor name");
13559 bool AnyDependentBases =
false;
13562 if (!
Base && !AnyDependentBases) {
13563 Diag(UD->
getUsingLoc(), diag::err_using_decl_constructor_not_in_direct_base)
13570 Base->setInheritConstructors();
13576 bool HasTypenameKeyword,
13589 if (!
CurContext->getRedeclContext()->isRecord()) {
13596 for (
auto *D : Prev) {
13598 bool OldCouldBeEnumerator =
13601 OldCouldBeEnumerator ? diag::err_redefinition
13602 : diag::err_redefinition_different_kind)
13603 << Prev.getLookupName();
13616 if (
const auto *UD = dyn_cast<UsingDecl>(D)) {
13617 DTypename = UD->hasTypename();
13618 DQual = UD->getQualifier();
13619 }
else if (
const auto *UD = dyn_cast<UnresolvedUsingValueDecl>(D)) {
13621 DQual = UD->getQualifier();
13622 }
else if (
const auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(D)) {
13624 DQual = UD->getQualifier();
13630 if (HasTypenameKeyword != DTypename)
continue;
13638 Diag(NameLoc, diag::err_using_decl_redeclaration) << SS.
getRange();
13652 assert(
bool(NamedContext) == (R || UD) && !(R && UD) &&
13653 "resolvable context must have exactly one set of decls");
13657 bool Cxx20Enumerator =
false;
13658 if (NamedContext) {
13667 if (
auto *ED = dyn_cast<EnumDecl>(NamedContext)) {
13671 if (EC && R && ED->isScoped())
13674 ? diag::warn_cxx17_compat_using_decl_scoped_enumerator
13675 : diag::ext_using_decl_scoped_enumerator)
13679 NamedContext = ED->getDeclContext();
13699 ? diag::warn_cxx17_compat_using_decl_class_member_enumerator
13700 : diag::err_using_decl_can_not_refer_to_class_member)
13703 if (Cxx20Enumerator)
13706 auto *RD = NamedContext
13715 }
else if (R->getAsSingle<
TypeDecl>()) {
13718 Diag(SS.
getBeginLoc(), diag::note_using_decl_class_member_workaround)
13719 << diag::MemClassWorkaround::AliasDecl
13726 Diag(InsertLoc, diag::note_using_decl_class_member_workaround)
13727 << diag::MemClassWorkaround::TypedefDecl
13732 }
else if (R->getAsSingle<
VarDecl>()) {
13742 Diag(UsingLoc, diag::note_using_decl_class_member_workaround)
13743 << diag::MemClassWorkaround::ReferenceDecl << FixIt;
13756 Diag(UsingLoc, diag::note_using_decl_class_member_workaround)
13758 ? diag::MemClassWorkaround::ConstexprVar
13759 : diag::MemClassWorkaround::ConstVar)
13768 if (!NamedContext) {
13784 ? diag::warn_cxx17_compat_using_decl_non_member_enumerator
13785 : diag::err_using_decl_nested_name_specifier_is_not_class)
13788 if (Cxx20Enumerator)
13809 if (Cxx20Enumerator) {
13810 Diag(NameLoc, diag::warn_cxx17_compat_using_decl_non_member_enumerator)
13817 diag::err_using_decl_nested_name_specifier_is_current_class)
13824 diag::err_using_decl_nested_name_specifier_is_not_base_class)
13840 if (
Type.isInvalid())
13859 TemplateParamLists.size()
13866 Previous.getFoundDecl()->isTemplateParameter()) {
13872 "name in alias declaration must be an identifier");
13895 if (TemplateParamLists.size()) {
13900 if (TemplateParamLists.size() != 1) {
13901 Diag(UsingLoc, diag::err_alias_template_extra_headers)
13902 <<
SourceRange(TemplateParamLists[1]->getTemplateLoc(),
13903 TemplateParamLists[TemplateParamLists.size()-1]->getRAngleLoc());
13907 auto It = llvm::find_if(
13908 llvm::reverse(TemplateParamLists),
13910 assert(It != TemplateParamLists.rend() &&
13911 "if all template parameter lists were empty, this should have "
13912 "been rejected as an explicit specialization");
13913 TemplateParams = *It;
13928 Diag(UsingLoc, diag::err_redefinition_different_kind)
13943 OldTemplateParams =
13979 else if (OldDecl) {
13986 if (
auto *TD = dyn_cast_or_null<TagDecl>(DeclFromDeclSpec)) {
14009 if (R.isAmbiguous())
14014 Diag(IdentLoc, diag::err_expected_namespace_name) << SS.
getRange();
14018 assert(!R.isAmbiguous() && !R.empty());
14046 Diag(AliasLoc, diag::err_redefinition_different_namespace_alias)
14048 Diag(AD->getLocation(), diag::note_previous_namespace_alias)
14049 << AD->getNamespace();
14054 ? diag::err_redefinition
14055 : diag::err_redefinition_different_kind;
14056 Diag(AliasLoc, DiagID) << Alias;
14077struct SpecialMemberExceptionSpecInfo
14078 : SpecialMemberVisitor<SpecialMemberExceptionSpecInfo> {
14086 : SpecialMemberVisitor(S, MD, CSM, ICI), Loc(Loc), ExceptSpec(S) {}
14091 void visitClassSubobject(
CXXRecordDecl *Class, Subobject Subobj,
14094 void visitSubobjectCall(Subobject Subobj,
14099bool SpecialMemberExceptionSpecInfo::visitBase(CXXBaseSpecifier *Base) {
14100 auto *BaseClass =
Base->getType()->getAsCXXRecordDecl();
14104 Sema::SpecialMemberOverloadResult SMOR = lookupInheritedCtor(BaseClass);
14105 if (
auto *BaseCtor = SMOR.
getMethod()) {
14106 visitSubobjectCall(Base, BaseCtor);
14110 visitClassSubobject(BaseClass, Base, 0);
14114bool SpecialMemberExceptionSpecInfo::visitField(FieldDecl *FD) {
14115 if (CSM == CXXSpecialMemberKind::DefaultConstructor &&
14134void SpecialMemberExceptionSpecInfo::visitClassSubobject(CXXRecordDecl *
Class,
14137 FieldDecl *
Field = Subobj.dyn_cast<FieldDecl*>();
14138 bool IsMutable =
Field &&
Field->isMutable();
14139 visitSubobjectCall(Subobj, lookupIn(
Class, Quals, IsMutable));
14142void SpecialMemberExceptionSpecInfo::visitSubobjectCall(
14143 Subobject Subobj, Sema::SpecialMemberOverloadResult SMOR) {
14146 if (CXXMethodDecl *MD = SMOR.
getMethod())
14147 ExceptSpec.
CalledDecl(getSubobjectLoc(Subobj), MD);
14176 ComputingExceptionSpec CES(S, MD, Loc);
14183 SpecialMemberExceptionSpecInfo Info(S, MD, CSM, ICI, MD->
getLocation());
14185 return Info.ExceptSpec;
14192 diag::err_exception_spec_incomplete_type))
14193 return Info.ExceptSpec;
14210 Info.visit(Info.IsConstructor ? Info.VisitPotentiallyConstructedBases
14211 : Info.VisitAllBases);
14213 return Info.ExceptSpec;
14218struct DeclaringSpecialMember {
14221 Sema::ContextRAII SavedContext;
14222 bool WasAlreadyBeingDeclared;
14225 : S(S), D(RD, CSM), SavedContext(S, RD) {
14227 if (WasAlreadyBeingDeclared)
14234 Sema::CodeSynthesisContext Ctx;
14235 Ctx.Kind = Sema::CodeSynthesisContext::DeclaringSpecialMember;
14242 Ctx.PointOfInstantiation = RD->getLocation();
14244 Ctx.SpecialMember = CSM;
14245 S.pushCodeSynthesisContext(Ctx);
14248 ~DeclaringSpecialMember() {
14249 if (!WasAlreadyBeingDeclared) {
14256 bool isAlreadyBeingDeclared()
const {
14257 return WasAlreadyBeingDeclared;
14269 if (
auto *Acceptable = R.getAcceptableDecl(D))
14270 R.addDecl(Acceptable);
14272 R.suppressDiagnostics();
14278void Sema::setupImplicitSpecialMemberType(
CXXMethodDecl *SpecialMem,
14284 LangAS AS = getDefaultCXXMethodAddrSpace();
14289 auto QT = Context.getFunctionType(ResultTy, Args, EPI);
14297 Context.getTrivialTypeSourceInfo(SpecialMem->
getType());
14311 "Should not build implicit default constructor!");
14313 DeclaringSpecialMember DSM(*
this, ClassDecl,
14315 if (DSM.isAlreadyBeingDeclared())
14325 =
Context.DeclarationNames.getCXXConstructorName(ClassType);
14337 setupImplicitSpecialMemberType(DefaultCon,
Context.VoidTy, {});
14340 CUDA().inferTargetForImplicitSpecialMember(
14361 ClassDecl->
addDecl(DefaultCon);
14368 DefaultedFunctionFPFeaturesRAII RestoreFP(*
this,
Constructor);
14372 "DefineImplicitDefaultConstructor - call it for implicit default ctor");
14377 assert(ClassDecl &&
"DefineImplicitDefaultConstructor - invalid constructor");
14391 Scope.addContextNote(CurrentLocation);
14438 ->getInheritedConstructor()
14445 Context.getTrivialTypeSourceInfo(BaseCtor->
getType(), UsingLoc);
14456 false, BaseCtor, &ICI);
14473 EPI.ExceptionSpec.SourceDecl = DerivedCtor;
14479 for (
unsigned I = 0, N = FPT->
getNumParams(); I != N; ++I) {
14483 Context, DerivedCtor, UsingLoc, UsingLoc,
nullptr,
14490 ParamDecls.push_back(PD);
14495 assert(!BaseCtor->
isDeleted() &&
"should not use deleted constructor");
14498 Derived->
addDecl(DerivedCtor);
14504 return DerivedCtor;
14535 Scope.addContextNote(CurrentLocation);
14538 Constructor->getInheritedConstructor().getShadowDecl();
14540 Constructor->getInheritedConstructor().getConstructor();
14554 for (
bool VBase : {
false,
true}) {
14556 if (B.isVirtual() != VBase)
14559 auto *BaseRD = B.getType()->getAsCXXRecordDecl();
14564 if (!BaseCtor.first)
14569 InitLoc, B.getType(), BaseCtor.first, VBase, BaseCtor.second);
14571 auto *TInfo =
Context.getTrivialTypeSourceInfo(B.getType(), InitLoc);
14573 Context, TInfo, VBase, InitLoc,
Init.get(), InitLoc,
14607 DeclaringSpecialMember DSM(*
this, ClassDecl,
14609 if (DSM.isAlreadyBeingDeclared())
14619 =
Context.DeclarationNames.getCXXDestructorName(ClassType);
14634 CUDA().inferTargetForImplicitSpecialMember(
14668 DefaultedFunctionFPFeaturesRAII RestoreFP(*
this,
Destructor);
14670 !
Destructor->doesThisDeclarationHaveABody() &&
14672 "DefineImplicitDestructor - call it for implicit default dtor");
14677 assert(ClassDecl &&
"DefineImplicitDestructor - invalid destructor");
14688 Scope.addContextNote(CurrentLocation);
14715 assert(
Context.getTargetInfo().getCXXABI().isMicrosoft() &&
14716 "implicit complete dtors unneeded outside MS ABI");
14718 "complete dtor only exists for classes with vbases");
14723 Scope.addContextNote(CurrentLocation);
14731 if (
Record->isInvalidDecl()) {
14752 if (M->getParent()->getTemplateSpecializationKind() !=
14772 "adjusting dtor exception specs was introduced in c++11");
14782 if (DtorType->hasExceptionSpec())
14805 ExprBuilder(
const ExprBuilder&) =
delete;
14806 ExprBuilder &operator=(
const ExprBuilder&) =
delete;
14809 static Expr *assertNotNull(
Expr *E) {
14810 assert(E &&
"Expression construction must not fail.");
14816 virtual ~ExprBuilder() {}
14818 virtual Expr *build(Sema &S, SourceLocation Loc)
const = 0;
14821class RefBuilder:
public ExprBuilder {
14826 Expr *build(Sema &S, SourceLocation Loc)
const override {
14830 RefBuilder(VarDecl *Var, QualType VarType)
14831 : Var(Var), VarType(VarType) {}
14834class ThisBuilder:
public ExprBuilder {
14836 Expr *build(Sema &S, SourceLocation Loc)
const override {
14841class CastBuilder:
public ExprBuilder {
14842 const ExprBuilder &Builder;
14848 Expr *build(Sema &S, SourceLocation Loc)
const override {
14850 CK_UncheckedDerivedToBase, Kind,
14859class DerefBuilder:
public ExprBuilder {
14860 const ExprBuilder &Builder;
14863 Expr *build(Sema &S, SourceLocation Loc)
const override {
14864 return assertNotNull(
14868 DerefBuilder(
const ExprBuilder &Builder) : Builder(Builder) {}
14871class MemberBuilder:
public ExprBuilder {
14872 const ExprBuilder &Builder;
14876 LookupResult &MemberLookup;
14879 Expr *build(Sema &S, SourceLocation Loc)
const override {
14881 Builder.build(S, Loc),
Type, Loc, IsArrow, SS, SourceLocation(),
14882 nullptr, MemberLookup,
nullptr,
nullptr).get());
14885 MemberBuilder(
const ExprBuilder &Builder, QualType
Type,
bool IsArrow,
14886 LookupResult &MemberLookup)
14887 : Builder(Builder),
Type(
Type), IsArrow(IsArrow),
14888 MemberLookup(MemberLookup) {}
14891class MoveCastBuilder:
public ExprBuilder {
14892 const ExprBuilder &Builder;
14895 Expr *build(Sema &S, SourceLocation Loc)
const override {
14896 return assertNotNull(
CastForMoving(S, Builder.build(S, Loc)));
14899 MoveCastBuilder(
const ExprBuilder &Builder) : Builder(Builder) {}
14902class LvalueConvBuilder:
public ExprBuilder {
14903 const ExprBuilder &Builder;
14906 Expr *build(Sema &S, SourceLocation Loc)
const override {
14907 return assertNotNull(
14911 LvalueConvBuilder(
const ExprBuilder &Builder) : Builder(Builder) {}
14914class SubscriptBuilder:
public ExprBuilder {
14915 const ExprBuilder &
Base;
14916 const ExprBuilder &Index;
14919 Expr *build(Sema &S, SourceLocation Loc)
const override {
14921 Base.build(S, Loc), Loc, Index.build(S, Loc), Loc).
get());
14924 SubscriptBuilder(
const ExprBuilder &Base,
const ExprBuilder &Index)
14936 const ExprBuilder &ToB,
const ExprBuilder &FromB) {
14945 Expr *From = FromB.build(S, Loc);
14949 Expr *To = ToB.build(S, Loc);
14954 bool NeedsCollectableMemCpy =
false;
14955 if (
auto *RD =
T->getBaseElementTypeUnsafe()->getAsRecordDecl())
14959 StringRef MemCpyName = NeedsCollectableMemCpy ?
14960 "__builtin_objc_memmove_collectable" :
14961 "__builtin_memcpy";
14974 assert(MemCpyRef.
isUsable() &&
"Builtin reference cannot fail");
14976 Expr *CallArgs[] = {
14980 Loc, CallArgs, Loc);
14982 assert(!
Call.isInvalid() &&
"Call to __builtin_memcpy cannot fail!");
15015 const ExprBuilder &To,
const ExprBuilder &From,
15016 bool CopyingBaseSubobject,
bool Copying,
15017 unsigned Depth = 0) {
15032 if (
auto *ClassDecl =
T->getAsCXXRecordDecl()) {
15046 if (Method->isCopyAssignmentOperator() ||
15047 (!Copying && Method->isMoveAssignmentOperator()))
15066 if (CopyingBaseSubobject) {
15095 Expr *FromInst = From.build(S, Loc);
15098 Loc, FromInst, Loc);
15099 if (
Call.isInvalid())
15118 Loc, BO_Assign, To.build(S, Loc), From.build(S, Loc));
15138 llvm::raw_svector_ostream OS(Str);
15139 OS <<
"__i" << Depth;
15143 IterationVarName, SizeType,
15152 RefBuilder IterationVarRef(IterationVar, SizeType);
15153 LvalueConvBuilder IterationVarRefRVal(IterationVarRef);
15159 SubscriptBuilder FromIndexCopy(From, IterationVarRefRVal);
15160 MoveCastBuilder FromIndexMove(FromIndexCopy);
15161 const ExprBuilder *FromIndex;
15163 FromIndex = &FromIndexCopy;
15165 FromIndex = &FromIndexMove;
15167 SubscriptBuilder ToIndex(To, IterationVarRefRVal);
15172 ToIndex, *FromIndex, CopyingBaseSubobject,
15173 Copying, Depth + 1);
15175 if (
Copy.isInvalid() || !
Copy.get())
15182 S.
Context, IterationVarRefRVal.build(S, Loc),
15196 Loc, Loc, InitStmt,
15203 const ExprBuilder &To,
const ExprBuilder &From,
15204 bool CopyingBaseSubobject,
bool Copying) {
15206 if (
T->isArrayType() && !
T.hasQualifiers() &&
15207 T.isTriviallyCopyableType(S.
Context))
15211 CopyingBaseSubobject,
15229 DeclaringSpecialMember DSM(*
this, ClassDecl,
15231 if (DSM.isAlreadyBeingDeclared())
15235 std::nullopt, ClassDecl,
15269 CUDA().inferTargetForImplicitSpecialMember(
15276 ClassLoc, ClassLoc,
15289 ++
getASTContext().NumImplicitCopyAssignmentOperatorsDeclared;
15321 for (
auto *I : RD->
ctors()) {
15322 if (I->isCopyConstructor()) {
15323 UserDeclaredOperation = I;
15327 assert(UserDeclaredOperation);
15331 for (
auto *I : RD->
methods()) {
15332 if (I->isCopyAssignmentOperator()) {
15333 UserDeclaredOperation = I;
15337 assert(UserDeclaredOperation);
15340 if (UserDeclaredOperation) {
15341 bool UDOIsUserProvided = UserDeclaredOperation->
isUserProvided();
15345 (UDOIsUserProvided && UDOIsDestructor)
15346 ? diag::warn_deprecated_copy_with_user_provided_dtor
15347 : (UDOIsUserProvided && !UDOIsDestructor)
15348 ? diag::warn_deprecated_copy_with_user_provided_copy
15349 : (!UDOIsUserProvided && UDOIsDestructor)
15350 ? diag::warn_deprecated_copy_with_dtor
15351 : diag::warn_deprecated_copy;
15353 << RD << IsCopyAssignment;
15359 DefaultedFunctionFPFeaturesRAII RestoreFP(*
this, CopyAssignOperator);
15365 "DefineImplicitCopyAssignment called for wrong function");
15383 Scope.addContextNote(CurrentLocation);
15418 RefBuilder OtherRef(
Other, OtherRefType);
15421 std::optional<ThisBuilder>
This;
15422 std::optional<DerefBuilder> DerefThis;
15423 std::optional<RefBuilder> ExplicitObject;
15424 bool IsArrow =
false;
15430 ExplicitObject.emplace(CopyAssignOperator->
getParamDecl(0), ObjectType);
15434 DerefThis.emplace(*
This);
15437 ExprBuilder &ObjectParameter =
15438 ExplicitObject ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15439 :
static_cast<ExprBuilder &
>(*This);
15443 for (
auto &
Base : ClassDecl->
bases()) {
15446 QualType BaseType =
Base.getType().getUnqualifiedType();
15447 if (!BaseType->isRecordType()) {
15453 BasePath.push_back(&
Base);
15457 CastBuilder From(OtherRef,
Context.getQualifiedType(BaseType, OtherQuals),
15462 ExplicitObject ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15463 :
static_cast<ExprBuilder &
>(*DerefThis),
15472 if (
Copy.isInvalid()) {
15478 Statements.push_back(
Copy.getAs<
Expr>());
15485 ExprBuilder &To = ExplicitObject
15486 ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15487 :
static_cast<ExprBuilder &
>(*DerefThis);
15494 *
this, Loc,
Context.getCanonicalTagType(ClassDecl), To, OtherRef);
15495 if (
Copy.isInvalid()) {
15499 Statements.push_back(
Copy.getAs<
Stmt>());
15503 for (
auto *Field : ClassDecl->
fields()) {
15505 if (Field->isUnnamedBitField() || Field->getParent()->isUnion())
15508 if (Field->isInvalidDecl()) {
15514 if (Field->getType()->isReferenceType()) {
15515 Diag(ClassDecl->
getLocation(), diag::err_uninitialized_member_for_assign)
15516 <<
Context.getCanonicalTagType(ClassDecl) << 0
15517 << Field->getDeclName();
15518 Diag(Field->getLocation(), diag::note_declared_at);
15525 if (!BaseType->isRecordType() && BaseType.isConstQualified()) {
15526 Diag(ClassDecl->
getLocation(), diag::err_uninitialized_member_for_assign)
15527 <<
Context.getCanonicalTagType(ClassDecl) << 1
15528 << Field->getDeclName();
15529 Diag(Field->getLocation(), diag::note_declared_at);
15535 if (Field->isZeroLengthBitField())
15538 QualType FieldType = Field->getType().getNonReferenceType();
15541 "Incomplete array type is not valid");
15547 LookupResult MemberLookup(*
this, Field->getDeclName(), Loc,
15552 MemberBuilder From(OtherRef, OtherRefType,
false, MemberLookup);
15553 MemberBuilder To(ObjectParameter, ObjectType, IsArrow, MemberLookup);
15559 if (
Copy.isInvalid()) {
15565 Statements.push_back(
Copy.getAs<
Stmt>());
15571 (ExplicitObject ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15572 :
LangOpts.HLSL ?
static_cast<ExprBuilder &
>(*This)
15573 :
static_cast<ExprBuilder &
>(*DerefThis))
15574 .build(*
this, Loc);
15579 Statements.push_back(Return.
getAs<
Stmt>());
15592 assert(!Body.
isInvalid() &&
"Compound statement creation cannot fail");
15598 L->CompletedImplicitDefinition(CopyAssignOperator);
15605 DeclaringSpecialMember DSM(*
this, ClassDecl,
15607 if (DSM.isAlreadyBeingDeclared())
15614 std::nullopt, ClassDecl,
15644 CUDA().inferTargetForImplicitSpecialMember(
15651 ClassLoc, ClassLoc,
15664 ++
getASTContext().NumImplicitMoveAssignmentOperatorsDeclared;
15687 assert(!Class->isDependentContext() &&
"should not define dependent move");
15693 if (Class->getNumVBases() == 0 || Class->hasTrivialMoveAssignment() ||
15694 Class->getNumBases() < 2)
15698 typedef llvm::DenseMap<CXXRecordDecl*, CXXBaseSpecifier*> VBaseMap;
15701 for (
auto &BI : Class->bases()) {
15702 Worklist.push_back(&BI);
15703 while (!Worklist.empty()) {
15709 if (!
Base->hasNonTrivialMoveAssignment())
15734 VBases.insert(std::make_pair(
Base->getCanonicalDecl(), &BI))
15736 if (Existing && Existing != &BI) {
15737 S.
Diag(CurrentLocation, diag::warn_vbase_moved_multiple_times)
15740 << (
Base->getCanonicalDecl() ==
15743 S.
Diag(BI.getBeginLoc(), diag::note_vbase_moved_here)
15744 << (
Base->getCanonicalDecl() ==
15745 BI.getType()->getAsCXXRecordDecl()->getCanonicalDecl())
15749 Existing =
nullptr;
15759 llvm::append_range(Worklist, llvm::make_pointer_range(
Base->bases()));
15767 DefaultedFunctionFPFeaturesRAII RestoreFP(*
this, MoveAssignOperator);
15773 "DefineImplicitMoveAssignment called for wrong function");
15803 Scope.addContextNote(CurrentLocation);
15819 RefBuilder OtherRef(
Other, OtherRefType);
15821 MoveCastBuilder MoveOther(OtherRef);
15824 std::optional<ThisBuilder>
This;
15825 std::optional<DerefBuilder> DerefThis;
15826 std::optional<RefBuilder> ExplicitObject;
15828 bool IsArrow =
false;
15833 ExplicitObject.emplace(MoveAssignOperator->
getParamDecl(0), ObjectType);
15837 DerefThis.emplace(*
This);
15840 ExprBuilder &ObjectParameter =
15841 ExplicitObject ? *ExplicitObject :
static_cast<ExprBuilder &
>(*This);
15845 for (
auto &
Base : ClassDecl->
bases()) {
15856 QualType BaseType =
Base.getType().getUnqualifiedType();
15857 if (!BaseType->isRecordType()) {
15863 BasePath.push_back(&
Base);
15867 CastBuilder From(OtherRef, BaseType,
VK_XValue, BasePath);
15872 ExplicitObject ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15873 :
static_cast<ExprBuilder &
>(*DerefThis),
15882 if (Move.isInvalid()) {
15888 Statements.push_back(Move.getAs<
Expr>());
15895 ExprBuilder &To = ExplicitObject
15896 ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15897 :
static_cast<ExprBuilder &
>(*DerefThis);
15904 *
this, Loc,
Context.getCanonicalTagType(ClassDecl), To, OtherRef);
15905 if (
Copy.isInvalid()) {
15909 Statements.push_back(
Copy.getAs<
Stmt>());
15913 for (
auto *Field : ClassDecl->
fields()) {
15915 if (Field->isUnnamedBitField() || Field->getParent()->isUnion())
15918 if (Field->isInvalidDecl()) {
15924 if (Field->getType()->isReferenceType()) {
15925 Diag(ClassDecl->
getLocation(), diag::err_uninitialized_member_for_assign)
15926 <<
Context.getCanonicalTagType(ClassDecl) << 0
15927 << Field->getDeclName();
15928 Diag(Field->getLocation(), diag::note_declared_at);
15935 if (!BaseType->isRecordType() && BaseType.isConstQualified()) {
15936 Diag(ClassDecl->
getLocation(), diag::err_uninitialized_member_for_assign)
15937 <<
Context.getCanonicalTagType(ClassDecl) << 1
15938 << Field->getDeclName();
15939 Diag(Field->getLocation(), diag::note_declared_at);
15945 if (Field->isZeroLengthBitField())
15948 QualType FieldType = Field->getType().getNonReferenceType();
15951 "Incomplete array type is not valid");
15956 LookupResult MemberLookup(*
this, Field->getDeclName(), Loc,
15960 MemberBuilder From(MoveOther, OtherRefType,
15961 false, MemberLookup);
15962 MemberBuilder To(ObjectParameter, ObjectType, IsArrow, MemberLookup);
15964 assert(!From.build(*
this, Loc)->isLValue() &&
15965 "Member reference with rvalue base must be rvalue except for reference "
15966 "members, which aren't allowed for move assignment.");
15973 if (Move.isInvalid()) {
15979 Statements.push_back(Move.getAs<
Stmt>());
15985 (ExplicitObject ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15986 :
LangOpts.HLSL ?
static_cast<ExprBuilder &
>(*This)
15987 :
static_cast<ExprBuilder &
>(*DerefThis))
15988 .build(*
this, Loc);
15994 Statements.push_back(Return.
getAs<
Stmt>());
16007 assert(!Body.
isInvalid() &&
"Compound statement creation cannot fail");
16013 L->CompletedImplicitDefinition(MoveAssignOperator);
16024 DeclaringSpecialMember DSM(*
this, ClassDecl,
16026 if (DSM.isAlreadyBeingDeclared())
16030 std::nullopt, ClassDecl,
16047 =
Context.DeclarationNames.getCXXConstructorName(
16048 Context.getCanonicalType(ClassType));
16067 CUDA().inferTargetForImplicitSpecialMember(
16093 ClassDecl->
hasAttr<TrivialABIAttr>() ||
16126 "DefineImplicitCopyConstructor - call it for implicit copy ctor");
16131 assert(ClassDecl &&
"DefineImplicitCopyConstructor - invalid constructor");
16142 Scope.addContextNote(CurrentLocation);
16172 DeclaringSpecialMember DSM(*
this, ClassDecl,
16174 if (DSM.isAlreadyBeingDeclared())
16178 std::nullopt, ClassDecl,
16191 =
Context.DeclarationNames.getCXXConstructorName(
16192 Context.getCanonicalType(ClassType));
16212 CUDA().inferTargetForImplicitSpecialMember(
16219 ClassLoc, ClassLoc,
16232 ClassDecl->
hasAttr<TrivialABIAttr>() ||
16265 "DefineImplicitMoveConstructor - call it for implicit move ctor");
16270 assert(ClassDecl &&
"DefineImplicitMoveConstructor - invalid constructor");
16281 Scope.addContextNote(CurrentLocation);
16327 if (CallOp != Invoker) {
16346 if (Invoker != CallOp) {
16359 assert(FunctionRef &&
"Can't refer to __invoke function?");
16367 L->CompletedImplicitDefinition(Conv);
16368 if (Invoker != CallOp)
16369 L->CompletedImplicitDefinition(Invoker);
16397 Diag(CurrentLocation, diag::note_lambda_to_block_conv);
16406 Diag(CurrentLocation, diag::note_lambda_to_block_conv);
16412 Stmt *ReturnS = Return.
get();
16419 L->CompletedImplicitDefinition(Conv);
16426 switch (Args.size()) {
16431 if (!Args[1]->isDefaultArgument())
16436 return !Args[0]->isDefaultArgument();
16445 bool HadMultipleCandidates,
bool IsListInitialization,
16446 bool IsStdInitListInitialization,
bool RequiresZeroInit,
16448 bool Elidable =
false;
16467 Expr *SubExpr = ExprArgs[0];
16478 Elidable, ExprArgs, HadMultipleCandidates,
16479 IsListInitialization,
16480 IsStdInitListInitialization, RequiresZeroInit,
16481 ConstructKind, ParenRange);
16487 bool HadMultipleCandidates,
bool IsListInitialization,
16488 bool IsStdInitListInitialization,
bool RequiresZeroInit,
16490 if (
auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl)) {
16500 ConstructLoc, DeclInitType,
Constructor, Elidable, ExprArgs,
16501 HadMultipleCandidates, IsListInitialization, IsStdInitListInitialization,
16502 RequiresZeroInit, ConstructKind, ParenRange);
16510 bool HadMultipleCandidates,
bool IsListInitialization,
16511 bool IsStdInitListInitialization,
bool RequiresZeroInit,
16516 "given constructor for wrong type");
16524 HadMultipleCandidates, IsListInitialization,
16525 IsStdInitListInitialization, RequiresZeroInit,
16557 PDiag(diag::err_access_dtor_var)
16567 bool HasConstantInit =
false;
16574 diag::err_constexpr_var_requires_const_destruction) << VD;
16585 if (!VD->
hasAttr<AlwaysDestroyAttr>())
16597 bool AllowExplicit,
16598 bool IsListInitialization) {
16600 unsigned NumArgs = ArgsPtr.size();
16601 Expr **Args = ArgsPtr.data();
16607 if (NumArgs < NumParams)
16608 ConvertedArgs.reserve(NumParams);
16610 ConvertedArgs.reserve(NumArgs);
16618 CallType, AllowExplicit, IsListInitialization);
16619 ConvertedArgs.append(AllArgs.begin(), AllArgs.end());
16630 bool SeenTypedOperators =
Context.hasSeenTypeAwareOperatorNewOrDelete();
16637 if (DeallocType.
isNull())
16648 constexpr unsigned RequiredParameterCount =
16651 if (NumParams != RequiredParameterCount)
16656 if (llvm::any_of(FnDecl->
parameters().drop_front(),
16658 return ParamDecl->getType()->isDependentType();
16663 if (SpecializedTypeIdentity.
isNull())
16667 ArgTypes.reserve(NumParams);
16673 ArgTypes.push_back(SpecializedTypeIdentity);
16694 diag::err_operator_new_delete_declared_in_namespace)
16701 diag::err_operator_new_delete_declared_static)
16711 Qualifiers PtrQuals = PtrTy->getPointeeType().getQualifiers();
16714 PtrTy->getPointeeType().getUnqualifiedType(), PtrQuals)));
16721 bool *WasMalformed) {
16722 const Decl *MalformedDecl =
nullptr;
16725 nullptr, &MalformedDecl))
16728 if (!MalformedDecl)
16732 *WasMalformed =
true;
16750 SemaRef, FD,
nullptr);
16751 unsigned DestroyingDeleteIdx = IsPotentiallyTypeAware + 1;
16760 unsigned DependentParamTypeDiag,
unsigned InvalidParamTypeDiag) {
16761 auto NormalizeType = [&SemaRef](
QualType T) {
16765 if (
const auto PtrTy =
T->template getAs<PointerType>())
16772 unsigned FirstNonTypeParam = 0;
16773 bool MalformedTypeIdentity =
false;
16775 SemaRef, FnDecl, &MalformedTypeIdentity);
16776 unsigned MinimumMandatoryArgumentCount = 1;
16777 unsigned SizeParameterIndex = 0;
16778 if (IsPotentiallyTypeAware) {
16782 SemaRef.
Diag(FnDecl->
getLocation(), diag::warn_ext_type_aware_allocators);
16785 SizeParameterIndex = 1;
16786 MinimumMandatoryArgumentCount =
16789 SizeParameterIndex = 2;
16790 MinimumMandatoryArgumentCount =
16793 FirstNonTypeParam = 1;
16796 bool IsPotentiallyDestroyingDelete =
16799 if (IsPotentiallyDestroyingDelete) {
16800 ++MinimumMandatoryArgumentCount;
16801 ++SizeParameterIndex;
16804 if (NumParams < MinimumMandatoryArgumentCount)
16806 diag::err_operator_new_delete_too_few_parameters)
16807 << IsPotentiallyTypeAware << IsPotentiallyDestroyingDelete
16808 << FnDecl->
getDeclName() << MinimumMandatoryArgumentCount;
16810 for (
unsigned Idx = 0; Idx < MinimumMandatoryArgumentCount; ++Idx) {
16814 diag::err_operator_new_default_arg)
16819 QualType CanResultType = NormalizeType(FnType->getReturnType());
16820 QualType CanExpectedResultType = NormalizeType(ExpectedResultType);
16821 QualType CanExpectedSizeOrAddressParamType =
16822 NormalizeType(ExpectedSizeOrAddressParamType);
16825 if (CanResultType != CanExpectedResultType) {
16828 return SemaRef.
Diag(
16830 CanResultType->isDependentType()
16831 ? diag::err_operator_new_delete_dependent_result_type
16832 : diag::err_operator_new_delete_invalid_result_type)
16839 diag::err_operator_new_delete_template_too_few_parameters)
16843 auto FallbackType) ->
bool {
16847 << IsPotentiallyTypeAware << IsPotentiallyDestroyingDelete
16853 auto ActualParamType =
16855 if (ActualParamType == CanExpectedTy)
16857 unsigned Diagnostic = ActualParamType->isDependentType()
16858 ? DependentParamTypeDiag
16859 : InvalidParamTypeDiag;
16861 << IsPotentiallyTypeAware << IsPotentiallyDestroyingDelete
16867 if (CheckType(FirstNonTypeParam, CanExpectedSizeOrAddressParamType,
"size_t"))
16874 if (!IsPotentiallyTypeAware)
16883 if (CheckType(SizeParameterIndex + 1, StdAlignValT,
"std::align_val_t"))
16887 return MalformedTypeIdentity;
16906 SizeTy, diag::err_operator_new_dependent_param_type,
16907 diag::err_operator_new_param_type);
16919 auto *MD = dyn_cast<CXXMethodDecl>(FnDecl);
16920 auto ConstructDestroyingDeleteAddressType = [&]() {
16933 SemaRef, MD,
nullptr)) {
16937 AddressParamType == ConstructDestroyingDeleteAddressType()) {
16948 diag::err_type_aware_destroying_operator_delete)
16949 << Param->getSourceRange();
16971 diag::err_operator_delete_dependent_param_type,
16972 diag::err_operator_delete_param_type))
16981 diag::err_destroying_operator_delete_not_usual);
16991 "Expected an overloaded operator declaration");
17001 if (Op == OO_Delete || Op == OO_Array_Delete)
17004 if (Op == OO_New || Op == OO_Array_New)
17014 if (
CXXMethodDecl *MethodDecl = dyn_cast<CXXMethodDecl>(FnDecl)) {
17015 if (MethodDecl->isStatic()) {
17016 if (Op == OO_Call || Op == OO_Subscript)
17019 ? diag::warn_cxx20_compat_operator_overload_static
17020 : diag::ext_operator_overload_static))
17023 return Diag(FnDecl->
getLocation(), diag::err_operator_overload_static)
17027 bool ClassOrEnumParam =
false;
17029 QualType ParamType = Param->getType().getNonReferenceType();
17032 ClassOrEnumParam =
true;
17037 if (!ClassOrEnumParam)
17039 diag::err_operator_overload_needs_class_or_enum)
17049 if (Op != OO_Call) {
17052 if (Param->hasDefaultArg()) {
17053 FirstDefaultedParam = Param;
17057 if (FirstDefaultedParam) {
17058 if (Op == OO_Subscript) {
17060 ? diag::ext_subscript_overload
17061 : diag::error_subscript_overload)
17066 diag::err_operator_overload_default_arg)
17074 {
false,
false,
false }
17075#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
17076 , { Unary, Binary, MemberOnly }
17077#include "clang/Basic/OperatorKinds.def"
17080 bool CanBeUnaryOperator = OperatorUses[Op][0];
17081 bool CanBeBinaryOperator = OperatorUses[Op][1];
17082 bool MustBeMemberOperator = OperatorUses[Op][2];
17093 if (Op != OO_Call && Op != OO_Subscript &&
17094 ((NumParams == 1 && !CanBeUnaryOperator) ||
17095 (NumParams == 2 && !CanBeBinaryOperator) || (NumParams < 1) ||
17096 (NumParams > 2))) {
17098 unsigned ErrorKind;
17099 if (CanBeUnaryOperator && CanBeBinaryOperator) {
17101 }
else if (CanBeUnaryOperator) {
17104 assert(CanBeBinaryOperator &&
17105 "All non-call overloaded operators are unary or binary!");
17108 return Diag(FnDecl->
getLocation(), diag::err_operator_overload_must_be)
17109 << FnDecl->
getDeclName() << NumParams << ErrorKind;
17112 if (Op == OO_Subscript && NumParams != 2) {
17114 ? diag::ext_subscript_overload
17115 : diag::error_subscript_overload)
17116 << FnDecl->
getDeclName() << (NumParams == 1 ? 0 : 2);
17121 if (Op != OO_Call &&
17123 return Diag(FnDecl->
getLocation(), diag::err_operator_overload_variadic)
17130 diag::err_operator_overload_must_be_member)
17144 if ((Op == OO_PlusPlus || Op == OO_MinusMinus) && NumParams == 2) {
17151 diag::err_operator_overload_post_incdec_must_be_int)
17152 << LastParam->
getType() << (Op == OO_MinusMinus);
17164 if (TemplateParams->
size() == 1) {
17166 dyn_cast<NonTypeTemplateParmDecl>(TemplateParams->
getParam(0));
17180 if (SemaRef.
getLangOpts().CPlusPlus20 && PmDecl &&
17183 PmDecl->
getType()->
getAs<DeducedTemplateSpecializationType>()))
17185 }
else if (TemplateParams->
size() == 2) {
17187 dyn_cast<TemplateTypeParmDecl>(TemplateParams->
getParam(0));
17189 dyn_cast<NonTypeTemplateParmDecl>(TemplateParams->
getParam(1));
17195 if (
const auto *TArgs =
17197 TArgs && TArgs->getDepth() == PmType->
getDepth() &&
17198 TArgs->getIndex() == PmType->
getIndex()) {
17201 diag::ext_string_literal_operator_template);
17208 diag::err_literal_operator_template)
17215 Diag(FnDecl->
getLocation(), diag::err_literal_operator_outside_namespace)
17224 Diag(LSD->getExternLoc(), diag::note_extern_c_begins_here);
17243 diag::err_literal_operator_template_with_params);
17253 QualType ParamType = Param->getType().getUnqualifiedType();
17271 Diag(Param->getSourceRange().getBegin(),
17272 diag::err_literal_operator_param)
17273 << ParamType <<
"'const char *'" << Param->getSourceRange();
17278 Diag(Param->getSourceRange().getBegin(), diag::err_literal_operator_param)
17279 << ParamType <<
Context.LongDoubleTy << Param->getSourceRange();
17283 Diag(Param->getSourceRange().getBegin(), diag::err_literal_operator_param)
17284 << ParamType <<
Context.UnsignedLongLongTy << Param->getSourceRange();
17288 Diag(Param->getSourceRange().getBegin(),
17289 diag::err_literal_operator_invalid_param)
17290 << ParamType << Param->getSourceRange();
17299 QualType FirstParamType = (*Param)->getType().getUnqualifiedType();
17306 Diag((*Param)->getSourceRange().getBegin(),
17307 diag::err_literal_operator_param)
17308 << FirstParamType <<
"'const char *'" << (*Param)->getSourceRange();
17315 Diag((*Param)->getSourceRange().getBegin(),
17316 diag::err_literal_operator_param)
17317 << FirstParamType <<
"'const char *'" << (*Param)->getSourceRange();
17330 Diag((*Param)->getSourceRange().getBegin(),
17331 diag::err_literal_operator_param)
17332 << FirstParamType <<
"'const char *'" << (*Param)->getSourceRange();
17340 QualType SecondParamType = (*Param)->getType().getUnqualifiedType();
17341 if (!
Context.hasSameType(SecondParamType,
Context.getSizeType())) {
17342 Diag((*Param)->getSourceRange().getBegin(),
17343 diag::err_literal_operator_param)
17344 << SecondParamType <<
Context.getSizeType()
17345 << (*Param)->getSourceRange();
17349 Diag(FnDecl->
getLocation(), diag::err_literal_operator_bad_param_count);
17358 if (Param->hasDefaultArg()) {
17359 Diag(Param->getDefaultArgRange().getBegin(),
17360 diag::err_literal_operator_default_argument)
17361 << Param->getDefaultArgRange();
17376 <<
static_cast<int>(Status)
17387 assert(Lit->
isUnevaluated() &&
"Unexpected string literal kind");
17393 else if (Lang ==
"C++")
17396 Diag(LangStr->
getExprLoc(), diag::err_language_linkage_spec_unknown)
17416 if (
getLangOpts().CPlusPlusModules && isCurrentModulePurview()) {
17417 Module *GlobalModule = PushImplicitGlobalModuleFragment(ExternLoc);
17440 PopImplicitGlobalModuleFragment();
17443 return LinkageSpec;
17467 ExDeclType =
Context.getArrayDecayedType(ExDeclType);
17469 ExDeclType =
Context.getPointerType(ExDeclType);
17476 Diag(Loc, diag::err_catch_rvalue_ref);
17481 Diag(Loc, diag::err_catch_variably_modified) << ExDeclType;
17487 unsigned DK = diag::err_catch_incomplete;
17489 BaseType = Ptr->getPointeeType();
17491 DK = diag::err_catch_incomplete_ptr;
17494 BaseType = Ref->getPointeeType();
17496 DK = diag::err_catch_incomplete_ref;
17498 if (!
Invalid && (Mode == 0 || !BaseType->isVoidType()) &&
17502 if (!
Invalid && BaseType.isWebAssemblyReferenceType()) {
17503 Diag(Loc, diag::err_wasm_reftype_tc) << 1;
17507 if (!
Invalid && Mode != 1 && BaseType->isSizelessType()) {
17508 Diag(Loc, diag::err_catch_sizeless) << (Mode == 2 ? 1 : 0) << BaseType;
17514 diag::err_abstract_type_in_decl,
17523 T = RT->getPointeeType();
17525 if (
T->isObjCObjectType()) {
17526 Diag(Loc, diag::err_objc_object_catch);
17528 }
else if (
T->isObjCObjectPointerType()) {
17531 Diag(Loc, diag::warn_objc_pointer_cxx_catch_fragile);
17540 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(ExDecl))
17565 Expr *opaqueValue =
17615 Diag(PrevDecl->getLocation(), diag::note_previous_definition);
17617 }
else if (PrevDecl->isTemplateParameter())
17645 Expr *AssertMessageExpr,
17651 AssertMessageExpr, RParenLoc,
false);
17656 case BuiltinType::Char_S:
17657 case BuiltinType::Char_U:
17659 case BuiltinType::Char8:
17662 case BuiltinType::Char16:
17665 case BuiltinType::Char32:
17668 case BuiltinType::WChar_S:
17669 case BuiltinType::WChar_U:
17673 llvm_unreachable(
"Non-character type");
17683 char Arr[UNI_MAX_UTF8_BYTES_PER_CODE_POINT];
17686 llvm::raw_svector_ostream OS(Str);
17690 if (K == BuiltinType::Char_S || K == BuiltinType::Char_U ||
17691 K == BuiltinType::Char8 ||
Value <= 0x7F) {
17693 if (!Escaped.empty())
17696 OS << static_cast<char>(
Value);
17701 case BuiltinType::Char16:
17702 case BuiltinType::Char32:
17703 case BuiltinType::WChar_S:
17704 case BuiltinType::WChar_U: {
17705 if (llvm::ConvertCodePointToUTF8(
Value, Ptr))
17709 << llvm::format_hex_no_prefix(
Value, TyWidth / 4,
true);
17713 llvm_unreachable(
"Non-character type is passed");
17725 switch (
V.getKind()) {
17727 if (
T->isBooleanType()) {
17731 int64_t BoolValue =
V.getInt().getExtValue();
17732 assert((BoolValue == 0 || BoolValue == 1) &&
17733 "Bool type, but value is not 0 or 1");
17734 llvm::raw_svector_ostream OS(Str);
17735 OS << (BoolValue ?
"true" :
"false");
17737 llvm::raw_svector_ostream OS(Str);
17742 switch (BTy->getKind()) {
17743 case BuiltinType::Char_S:
17744 case BuiltinType::Char_U:
17745 case BuiltinType::Char8:
17746 case BuiltinType::Char16:
17747 case BuiltinType::Char32:
17748 case BuiltinType::WChar_S:
17749 case BuiltinType::WChar_U: {
17750 unsigned TyWidth = Context.getIntWidth(
T);
17751 assert(8 <= TyWidth && TyWidth <= 32 &&
"Unexpected integer width");
17757 << llvm::format_hex_no_prefix(CodeUnit, 2,
17759 <<
", " <<
V.getInt() <<
')';
17766 V.getInt().toString(Str);
17772 V.getFloat().toString(Str);
17776 if (
V.isNullPointer()) {
17777 llvm::raw_svector_ostream OS(Str);
17784 llvm::raw_svector_ostream OS(Str);
17786 V.getComplexFloatReal().toString(Str);
17788 V.getComplexFloatImag().toString(Str);
17793 llvm::raw_svector_ostream OS(Str);
17795 V.getComplexIntReal().toString(Str);
17797 V.getComplexIntImag().toString(Str);
17824 if (
const auto *UnaryOp = dyn_cast<UnaryOperator>(E))
17828 if (
const auto *BO = dyn_cast<BinaryOperator>(E))
17829 return (BO->isShiftOp() || BO->isAdditiveOp() || BO->isMultiplicativeOp() ||
17830 BO->isBitwiseOp());
17836 if (
const auto *Op = dyn_cast<BinaryOperator>(E);
17837 Op && Op->getOpcode() != BO_LOr) {
17838 const Expr *LHS = Op->getLHS()->IgnoreParenImpCasts();
17839 const Expr *RHS = Op->getRHS()->IgnoreParenImpCasts();
17857 for (
auto &DiagSide : DiagSides) {
17858 const Expr *Side = DiagSide.Cond;
17863 DiagSide.Result.Val, Side->
getType(), DiagSide.ValueString,
Context);
17865 if (DiagSides[0].Print && DiagSides[1].Print) {
17866 Diag(Op->getExprLoc(), diag::note_expr_evaluates_to)
17867 << DiagSides[0].ValueString << Op->getOpcodeStr()
17868 << DiagSides[1].ValueString << Op->getSourceRange();
17875template <
typename ResultType>
17879 bool ErrorOnInvalidMessage) {
17882 assert(!Message->isTypeDependent() && !Message->isValueDependent() &&
17883 "can't evaluate a dependant static assert message");
17885 if (
const auto *SL = dyn_cast<StringLiteral>(Message)) {
17886 assert(SL->isUnevaluated() &&
"expected an unevaluated string");
17887 if constexpr (std::is_same_v<APValue, ResultType>) {
17892 assert(CAT &&
"string literal isn't an array");
17896 for (
unsigned I = 0; I < SL->getLength(); I++) {
17897 Value = SL->getCodeUnit(I);
17901 Result.assign(SL->getString().begin(), SL->getString().end());
17907 QualType T = Message->getType().getNonReferenceType();
17908 auto *RD =
T->getAsCXXRecordDecl();
17910 SemaRef.
Diag(Loc, diag::err_user_defined_msg_invalid) << EvalContext;
17914 auto FindMember = [&](StringRef
Member) -> std::optional<LookupResult> {
17920 if (MemberLookup.
empty())
17921 return std::nullopt;
17922 return std::move(MemberLookup);
17925 std::optional<LookupResult> SizeMember = FindMember(
"size");
17926 std::optional<LookupResult> DataMember = FindMember(
"data");
17927 if (!SizeMember || !DataMember) {
17928 SemaRef.
Diag(Loc, diag::err_user_defined_msg_missing_member_function)
17930 << ((!SizeMember && !DataMember) ? 2
17938 Message, Message->getType(), Message->getBeginLoc(),
false,
17964 SemaRef.
Diag(Loc, diag::err_user_defined_msg_invalid_mem_fn_ret_ty)
17965 << EvalContext << 0;
17975 SemaRef.
Diag(Loc, diag::err_user_defined_msg_invalid_mem_fn_ret_ty)
17976 << EvalContext << 1;
17980 if (!ErrorOnInvalidMessage &&
17981 SemaRef.
Diags.
isIgnored(diag::warn_user_defined_msg_constexpr, Loc))
17986 Status.Diag = &Notes;
17987 if (!Message->EvaluateCharRangeAsString(
Result, EvaluatedSize.
get(),
17988 EvaluatedData.
get(), Ctx, Status) ||
17990 SemaRef.
Diag(Message->getBeginLoc(),
17991 ErrorOnInvalidMessage ? diag::err_user_defined_msg_constexpr
17992 : diag::warn_user_defined_msg_constexpr)
17994 for (
const auto &
Note : Notes)
17996 return !ErrorOnInvalidMessage;
18003 bool ErrorOnInvalidMessage) {
18005 ErrorOnInvalidMessage);
18010 bool ErrorOnInvalidMessage) {
18012 ErrorOnInvalidMessage);
18016 Expr *AssertExpr,
Expr *AssertMessage,
18019 assert(AssertExpr !=
nullptr &&
"Expected non-null condition");
18037 AssertExpr = FullAssertExpr.
get();
18040 Expr *BaseExpr = AssertExpr;
18052 diag::err_static_assert_expression_is_not_constant,
18058 if (!Failed && AssertMessage &&
Cond.getBoolValue()) {
18068 bool InTemplateDefinition =
18071 if (!Failed && !
Cond && !InTemplateDefinition) {
18073 llvm::raw_svector_ostream Msg(MsgBuffer);
18074 bool HasMessage = AssertMessage;
18075 if (AssertMessage) {
18083 Expr *InnerCond =
nullptr;
18084 std::string InnerCondDescription;
18085 std::tie(InnerCond, InnerCondDescription) =
18087 if (
const auto *ConceptIDExpr =
18088 dyn_cast_or_null<ConceptSpecializationExpr>(InnerCond)) {
18090 ConceptIDExpr->getSatisfaction();
18101 diag::err_static_assert_requirement_failed)
18102 << InnerCondDescription << !HasMessage << Msg.str()
18119 AssertExpr = FullAssertExpr.
get();
18123 AssertExpr, AssertMessage, RParenLoc,
18131 if (
const auto *PIT = dyn_cast<PackIndexingType>(
T))
18132 return PIT->getPattern();
18136static const TemplateSpecializationType *
18139 if (
const auto *ICNT = dyn_cast<InjectedClassNameType>(
T))
18140 T = ICNT->getDecl()->getCanonicalTemplateSpecializationType(Context);
18142 const auto *TST = dyn_cast<TemplateSpecializationType>(
T);
18146 TemplateDecl *TD = TST->getTemplateName().getAsTemplateDecl();
18168 if (
const auto *TST =
18170 if (isa_and_nonnull<TypeAliasTemplateDecl>(
18171 TST->getTemplateName().getAsTemplateDecl())) {
18172 S.
Diag(Loc, diag::err_dependent_friend_not_member_of_template_spec)
18179 S.
Diag(Loc, diag::err_dependent_friend_not_member_of_template_spec) << NNS;
18181 S.
Diag(Loc, diag::err_dependent_friend_not_member);
18188 bool IsInstantiation) {
18194 "nested-name-specifier of dependent friend must be a type");
18200 const TemplateSpecializationType *TST =
18212 llvm::SmallBitVector UsedParameters(Params->size());
18214 true, Params->getDepth(),
18217 for (
unsigned I = 0, N = UsedParameters.size(); I != N; ++I)
18218 if (!UsedParameters[I])
18219 UndeducedParameters.push_back(Params->getParam(I));
18222 if (UndeducedParameters.empty())
18225 Diag(Loc, diag::err_dependent_friend_undeduced_params)
18226 << (UndeducedParameters.size() > 1) <<
QualType(TST, 0);
18228 for (
NamedDecl *Param : UndeducedParameters) {
18229 if (Param->getDeclName())
18230 Diag(Param->getLocation(), diag::note_non_deducible_parameter)
18231 << Param->getDeclName();
18233 Diag(Param->getLocation(), diag::note_non_deducible_parameter)
18247 bool IsMemberSpecialization =
false;
18252 TempParamLists,
true,
18253 IsMemberSpecialization,
Invalid);
18258 if (TemplateParams) {
18259 Diag(NameLoc, diag::err_not_class_template_specialization) << 0;
18264 if (TemplateParams) {
18265 if (TemplateParams->
size() > 0) {
18273 FriendLoc, TempParamLists.size() - 1, TempParamLists.data(),
18274 IsMemberSpecialization);
18287 bool IsAllExplicitSpecializations =
18289 return List->
size() == 0;
18298 if (!TemplateId && IsAllExplicitSpecializations) {
18300 bool Owned =
false;
18301 bool IsDependent =
false;
18318 NameLoc, &TSI,
true);
18323 FriendLoc, EllipsisLoc);
18329 assert(SS.
isNotEmpty() &&
"valid templated tag with no SS and no direct?");
18332 if (TemplateParams)
18333 TPLs = TPLs.drop_back();
18353 TSI =
Context.CreateTypeSourceInfo(
T);
18366 }
else if (Unexpanded.empty()) {
18367 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
18373 if (!TempParamLists.empty()) {
18374 unsigned FriendDeclDepth = TempParamLists.front()->getDepth();
18376 if (std::optional<std::pair<unsigned, unsigned>> DI =
18378 DI && DI->first >= FriendDeclDepth) {
18379 auto *ND = dyn_cast<NamedDecl *>(
U.first);
18382 Diag(
U.second, diag::friend_template_decl_malformed_pack_expansion)
18392 if (TempParamLists.empty())
18400 if (TemplateParams)
18433 Diag(FriendLoc, diag::err_friend_not_first_in_declaration);
18465 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
18470 if (!
T->isElaboratedTypeSpecifier()) {
18471 if (TempParams.size()) {
18483 }
else if (
const RecordDecl *RD =
T->getAsRecordDecl()) {
18488 ? diag::warn_cxx98_compat_unelaborated_friend_type
18489 : diag::ext_unelaborated_friend_type)
18494 DiagCompat(FriendLoc, diag_compat::nonclass_type_friend)
18511 if (!TempParams.empty()) {
18517 TempParams, EllipsisLoc);
18520 TSI, FriendLoc, EllipsisLoc);
18555 Diag(Loc, diag::err_unexpected_friend);
18597 if (IsNamespaceOrGlobal) {
18607 Scope *DCScope = S;
18617 (FunctionContainingLocalClass =
18640 DC =
Previous.getRepresentativeDecl()->getDeclContext();
18644 DC = FunctionContainingLocalClass;
18681 if (isTemplateId) {
18696 if (!DC)
return nullptr;
18707 diag::warn_cxx98_compat_friend_is_member :
18708 diag::err_friend_is_member);
18741 if (DiagArg >= 0) {
18742 Diag(Loc, diag::err_introducing_special_friend) << DiagArg;
18758 DCScope = &FakeDCScope;
18761 bool AddToScope =
true;
18763 TemplateParams, AddToScope);
18764 if (!ND)
return nullptr;
18792 Friend->setInvalidDecl();
18798 assert(FD &&
"Expected a function declaration!");
18805 if (!TPLs.empty() && SS.
isValid())
18819 if (!TemplateParams.empty() && SS.
isValid() &&
18838 }
else if (FunctionContainingLocalClass) {
18847 }
else if (isTemplateId) {
18861 Diag(FD->
getLocation(), diag::err_friend_decl_with_def_arg_redeclared);
18863 diag::note_previous_declaration);
18865 Diag(FD->
getLocation(), diag::err_friend_decl_with_def_arg_must_be_def);
18875 FunctionDecl *Fn = dyn_cast_or_null<FunctionDecl>(Dcl);
18877 Diag(DelLoc, diag::err_deleted_non_function);
18882 Fn->setWillHaveBody(
false);
18884 if (
const FunctionDecl *Prev = Fn->getPreviousDecl()) {
18888 Prev->getPreviousDecl()) &&
18889 !Prev->isDefined()) {
18890 Diag(DelLoc, diag::err_deleted_decl_not_first);
18891 Diag(Prev->getLocation().isInvalid() ? DelLoc : Prev->getLocation(),
18892 Prev->isImplicit() ? diag::note_previous_implicit_declaration
18893 : diag::note_previous_declaration);
18896 Fn->setInvalidDecl();
18904 Fn = Fn->getCanonicalDecl();
18909 Diag(Fn->getLocation(), diag::err_attribute_dll_deleted) << DLLAttr;
18910 Fn->setInvalidDecl();
18916 Diag(DelLoc, diag::err_deleted_main);
18920 Fn->setImplicitlyInline();
18921 Fn->setDeletedAsWritten(
true, Message);
18928 auto *FD = dyn_cast<FunctionDecl>(Dcl);
18930 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(Dcl)) {
18931 if (FTD->getTemplatedDecl()->getDefaultedFunctionKind().isComparison()) {
18932 Diag(DefaultLoc, diag::err_defaulted_comparison_template);
18937 Diag(DefaultLoc, diag::err_default_special_members)
18948 (!FD->isDependentContext() ||
18951 Diag(DefaultLoc, diag::err_default_special_members)
18961 ? diag::warn_cxx17_compat_defaulted_comparison
18962 : diag::ext_defaulted_comparison);
18965 FD->setDefaulted();
18966 FD->setExplicitlyDefaulted();
18967 FD->setDefaultLoc(DefaultLoc);
18970 if (FD->isDependentContext())
18976 FD->setWillHaveBody(
false);
18991 if (
const FunctionDecl *Pattern = FD->getTemplateInstantiationPattern())
19002 if (!FD->getDefaultedOrDeletedInfo() &&
19004 FD->setDefaultedOrDeletedInfo(
19030 Self.Diag(SubStmt->getBeginLoc(),
19031 diag::err_return_in_constructor_handler);
19038 for (
unsigned I = 0, E = TryBlock->
getNumHandlers(); I != E; ++I) {
19046 switch (BodyKind) {
19055 "Parsed function body should be '= delete;' or '= default;'");
19065 for (
unsigned I = 0, E = OldFT->
getNumParams(); I != E; ++I)
19069 !NewFT->getExtParameterInfo(I).isNoEscape()) {
19070 Diag(
New->getParamDecl(I)->getLocation(),
19071 diag::warn_overriding_method_missing_noescape);
19073 diag::note_overridden_marked_noescape);
19079 Diag(
New->getLocation(), diag::err_conflicting_overriding_attributes)
19086 const auto *OldCSA = Old->
getAttr<CodeSegAttr>();
19087 const auto *NewCSA =
New->getAttr<CodeSegAttr>();
19088 if ((NewCSA || OldCSA) &&
19089 (!OldCSA || !NewCSA || NewCSA->getName() != OldCSA->getName())) {
19090 Diag(
New->getLocation(), diag::err_mismatched_code_seg_override);
19096 if (
Context.hasAnyFunctionEffects()) {
19098 const auto NewFXOrig =
New->getFunctionEffects();
19100 if (OldFX != NewFXOrig) {
19104 for (
const auto &Diff : Diffs) {
19105 switch (Diff.shouldDiagnoseMethodOverride(*Old, OldFX, *
New, NewFX)) {
19109 Diag(
New->getLocation(), diag::warn_conflicting_func_effect_override)
19110 << Diff.effectName();
19115 NewFX.
insert(Diff.Old.value(), Errs);
19120 NewFT->getParamTypes(), EPI);
19121 New->setType(ModQT);
19122 if (Errs.empty()) {
19125 Diag(
New->getLocation(), diag::warn_mismatched_func_effect_override)
19126 << Diff.effectName();
19143 if (NewCC == OldCC)
19154 diag::err_conflicting_overriding_cc_attributes)
19164 if (!
New->isExplicitObjectMemberFunction())
19166 Diag(
New->getParamDecl(0)->getBeginLoc(),
19167 diag::err_explicit_object_parameter_nonmember)
19168 <<
New->getSourceRange() << 1 <<
false;
19170 New->setInvalidDecl();
19179 if (
Context.hasSameType(NewTy, OldTy) ||
19194 if (NewRT->getTypeClass() == OldRT->getTypeClass()) {
19204 diag::err_different_return_type_for_overriding_virtual_function)
19205 <<
New->getDeclName() << NewTy << OldTy
19206 <<
New->getReturnTypeSourceRange();
19213 if (!
Context.hasSameUnqualifiedType(NewClassTy, OldClassTy)) {
19222 diag::err_covariant_return_incomplete,
19223 New->getDeclName()))
19229 Diag(
New->getLocation(), diag::err_covariant_return_not_derived)
19230 <<
New->getDeclName() << NewTy << OldTy
19231 <<
New->getReturnTypeSourceRange();
19239 NewClassTy, OldClassTy,
19240 diag::err_covariant_return_inaccessible_base,
19241 diag::err_covariant_return_ambiguous_derived_to_base_conv,
19242 New->getLocation(),
New->getReturnTypeSourceRange(),
19243 New->getDeclName(),
nullptr)) {
19257 diag::err_covariant_return_type_different_qualifications)
19258 <<
New->getDeclName() << NewTy << OldTy
19259 <<
New->getReturnTypeSourceRange();
19269 diag::err_covariant_return_type_class_type_not_same_or_less_qualified)
19270 <<
New->getDeclName() << NewTy << OldTy
19271 <<
New->getReturnTypeSourceRange();
19283 Method->setRangeEnd(EndLoc);
19285 if (
Method->isVirtual() ||
Method->getParent()->isDependentContext()) {
19286 Method->setIsPureVirtual();
19290 if (!
Method->isInvalidDecl())
19291 Diag(
Method->getLocation(), diag::err_non_virtual_pure)
19292 <<
Method->getDeclName() << InitRange;
19299 else if (
auto *M = dyn_cast<CXXMethodDecl>(D))
19342 "Parser allowed 'typedef' as storage class of condition decl.");
19354 if (
auto *VD = dyn_cast<VarDecl>(Dcl))
19368 llvm::DenseMap<CXXRecordDecl *, bool>::iterator Pos =
19372 if (!Pos->second && VTable.DefinitionRequired)
19373 Pos->second =
true;
19377 VTablesUsed[VTable.Record] = VTable.DefinitionRequired;
19378 NewUses.push_back(
VTableUse(VTable.Record, VTable.Location));
19385 bool DefinitionRequired) {
19388 if (!
Class->isDynamicClass() ||
Class->isDependentContext() ||
19394 !
OpenMP().isInOpenMPDeclareTargetContext() &&
19395 !
OpenMP().isInOpenMPTargetExecutionDirective()) {
19396 if (!DefinitionRequired)
19404 std::pair<llvm::DenseMap<CXXRecordDecl *, bool>::iterator,
bool>
19410 if (DefinitionRequired && !Pos.first->second) {
19411 Pos.first->second =
true;
19421 if (
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
19442 if (
Class->isLocalClass())
19457 bool DefinedAnything =
false;
19458 for (
unsigned I = 0; I !=
VTableUses.size(); ++I) {
19463 Class->getTemplateSpecializationKind();
19467 bool DefineVTable =
true;
19472 if (
Class->isInCurrentModuleUnit()) {
19473 DefineVTable =
true;
19474 }
else if (KeyFunction && !KeyFunction->
hasBody()) {
19479 DefineVTable =
false;
19484 "Instantiations don't have key functions");
19486 }
else if (!KeyFunction) {
19491 bool IsExplicitInstantiationDeclaration =
19493 for (
auto *R :
Class->redecls()) {
19497 IsExplicitInstantiationDeclaration =
true;
19499 IsExplicitInstantiationDeclaration =
false;
19504 if (IsExplicitInstantiationDeclaration) {
19505 const bool HasExcludeFromExplicitInstantiation =
19513 return method->hasAttr<ExcludeFromExplicitInstantiationAttr>();
19515 if (!HasExcludeFromExplicitInstantiation)
19516 DefineVTable =
false;
19523 if (!DefineVTable) {
19531 DefinedAnything =
true;
19539 !(
Class->isInNamedModule() &&
Class->shouldEmitInExternalSource()))
19545 if (
Context.getTargetInfo().getCXXABI().hasKeyFunctions() &&
19546 Class->isExternallyVisible() &&
19547 !(
Class->getOwningModule() &&
19548 Class->getOwningModule()->isInterfaceOrPartition()) &&
19553 if (!KeyFunction || (KeyFunction->
hasBody(KeyFunctionDef) &&
19560 return DefinedAnything;
19565 for (
const auto *I : RD->
methods())
19566 if (I->isVirtual() && !I->isPureVirtual())
19572 bool ConstexprOnly) {
19576 for (
const auto &FinalOverrider : FinalOverriders) {
19577 for (
const auto &OverridingMethod : FinalOverrider.second) {
19578 assert(OverridingMethod.second.size() > 0 &&
"no final overrider");
19579 CXXMethodDecl *Overrider = OverridingMethod.second.front().Method;
19593 for (
const auto &I : RD->
bases()) {
19594 const auto *
Base = I.getType()->castAsCXXRecordDecl();
19595 if (
Base->getNumVBases() == 0)
19616 (void)
Target->hasBody(FNTarget);
19618 cast_or_null<CXXConstructorDecl>(FNTarget));
19623 *TCanonical =
Target?
Target->getCanonicalDecl() :
nullptr;
19625 if (!Current.insert(Canonical).second)
19630 Target->isInvalidDecl() ||
Valid.count(TCanonical)) {
19631 Valid.insert_range(Current);
19634 }
else if (TCanonical == Canonical ||
Invalid.count(TCanonical) ||
19635 Current.count(TCanonical)) {
19637 if (!
Invalid.count(TCanonical)) {
19639 diag::warn_delegating_ctor_cycle)
19643 if (TCanonical != Canonical)
19644 S.
Diag(
Target->getLocation(), diag::note_it_delegates_to);
19647 while (
C->getCanonicalDecl() != Canonical) {
19649 (void)
C->getTargetConstructor()->hasBody(FNTarget);
19650 assert(FNTarget &&
"Ctor cycle through bodiless function");
19654 S.
Diag(
C->getLocation(), diag::note_which_delegates_to);
19658 Invalid.insert_range(Current);
19669 for (DelegatingCtorDeclsType::iterator
19676 CI->setInvalidDecl();
19685 explicit FindCXXThisExpr(
Sema &S) : S(S) {}
19713 FindCXXThisExpr Finder(*
this);
19726 if (!Finder.TraverseStmt(
const_cast<Expr *
>(TRC.ConstraintExpr)))
19743 FindCXXThisExpr Finder(*
this);
19765 if (!Finder.TraverseType(E))
19775 FindCXXThisExpr Finder(*
this);
19778 for (
const auto *A :
Method->attrs()) {
19780 Expr *Arg =
nullptr;
19782 if (
const auto *G = dyn_cast<GuardedByAttr>(A))
19784 else if (
const auto *G = dyn_cast<PtGuardedByAttr>(A))
19786 else if (
const auto *AA = dyn_cast<AcquiredAfterAttr>(A))
19788 else if (
const auto *AB = dyn_cast<AcquiredBeforeAttr>(A))
19790 else if (
const auto *LR = dyn_cast<LockReturnedAttr>(A))
19791 Arg = LR->getArg();
19792 else if (
const auto *LE = dyn_cast<LocksExcludedAttr>(A))
19794 else if (
const auto *RC = dyn_cast<RequiresCapabilityAttr>(A))
19796 else if (
const auto *AC = dyn_cast<AcquireCapabilityAttr>(A))
19798 else if (
const auto *AC = dyn_cast<TryAcquireCapabilityAttr>(A)) {
19799 Arg = AC->getSuccessValue();
19801 }
else if (
const auto *RC = dyn_cast<ReleaseCapabilityAttr>(A))
19804 if (Arg && !Finder.TraverseStmt(Arg))
19807 for (
Expr *A : Args) {
19808 if (!Finder.TraverseStmt(A))
19822 Exceptions.clear();
19825 Exceptions.reserve(DynamicExceptions.size());
19826 for (
unsigned ei = 0, ee = DynamicExceptions.size(); ei != ee; ++ei) {
19833 if (!Unexpanded.empty()) {
19844 Exceptions.push_back(ET);
19854 "Parser should have made sure that the expression is boolean");
19874 D = FTD->getTemplatedDecl();
19884 DynamicExceptionRanges, NoexceptExpr, Exceptions,
19888 Context.adjustExceptionSpec(FD, ESI,
true);
19912 Diag(DeclStart, diag::err_anonymous_property);
19926 TInfo =
Context.getTrivialTypeSourceInfo(
T, Loc);
19937 diag::err_invalid_thread)
19945 switch (
Previous.getResultKind()) {
19952 PrevDecl =
Previous.getRepresentativeDecl();
19965 PrevDecl =
nullptr;
19969 PrevDecl =
nullptr;
19980 Record->setInvalidDecl();
20002 if (!ExplicitLists.empty()) {
20003 bool IsMemberSpecialization, IsInvalid;
20007 ExplicitLists,
false, IsMemberSpecialization, IsInvalid,
20019 if (ExplicitParams && !ExplicitParams->
empty()) {
20020 Info.AutoTemplateParameterDepth = ExplicitParams->
getDepth();
20021 llvm::append_range(Info.TemplateParams, *ExplicitParams);
20022 Info.NumExplicitTemplateParams = ExplicitParams->
size();
20024 Info.AutoTemplateParameterDepth = TemplateParameterDepth;
20025 Info.NumExplicitTemplateParams = 0;
20031 if (FSI.TemplateParams.size() > FSI.NumExplicitTemplateParams) {
20032 if (FSI.NumExplicitTemplateParams != 0) {
20053 assert(
Context.getTargetInfo().getCXXABI().isMicrosoft());
20063 if (NumParams == 0)
20072 for (
unsigned I = IsCopy ? 1 : 0; I != NumParams; ++I) {
Defines the clang::ASTContext interface.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines the classes used to store parsed information about declaration-specifiers and decla...
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
static bool CheckLiteralType(EvalInfo &Info, const Expr *E, const LValue *This=nullptr)
Check that this core constant expression is of literal type, and if not, produce an appropriate diagn...
Result
Implement __builtin_bit_cast and related operations.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Target Target
llvm::MachO::Record Record
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
Defines the clang::Preprocessor interface.
@ ForExternalRedeclaration
The lookup results will be used for redeclaration of a name with external linkage; non-visible lookup...
@ ForVisibleRedeclaration
The lookup results will be used for redeclaration of a name, if an entity by that name already exists...
llvm::SmallVector< std::pair< const MemRegion *, SVal >, 4 > Bindings
static void ProcessAPINotes(Sema &S, Decl *D, const api_notes::CommonEntityInfo &Info, VersionedInfoMetadata Metadata)
static AccessResult DeduceTemplateArguments(Sema &S, FriendTemplateDecl *FTD, DeclContext *DC, const TemplateSpecializationType *TST, ArrayRef< TemplateParameterList * > TPLs, TemplateSpecCandidateSet *FailedTSC, MultiLevelTemplateArgumentList &DeducedArgs)
This file declares semantic analysis for CUDA constructs.
static void DiagnoseUnsatisfiedConstraint(Sema &S, ArrayRef< UnsatisfiedConstraintRecord > Records, SourceLocation Loc, bool First=true, concepts::NestedRequirement *Req=nullptr)
static LookupResult lookupMember(Sema &S, const char *Name, CXXRecordDecl *RD, SourceLocation Loc, bool &Res)
static bool findTrivialSpecialMember(Sema &S, CXXRecordDecl *RD, CXXSpecialMemberKind CSM, unsigned Quals, bool ConstRHS, TrivialABIHandling TAH, CXXMethodDecl **Selected)
Perform lookup for a special member of the specified kind, and determine whether it is trivial.
static void checkMoveAssignmentForRepeatedMove(Sema &S, CXXRecordDecl *Class, SourceLocation CurrentLocation)
Check if we're implicitly defining a move assignment operator for a class with virtual bases.
static void checkMethodTypeQualifiers(Sema &S, Declarator &D, unsigned DiagID)
static void DelegatingCycleHelper(CXXConstructorDecl *Ctor, llvm::SmallPtrSet< CXXConstructorDecl *, 4 > &Valid, llvm::SmallPtrSet< CXXConstructorDecl *, 4 > &Invalid, llvm::SmallPtrSet< CXXConstructorDecl *, 4 > &Current, Sema &S)
static bool CheckConstexprFunctionBody(Sema &SemaRef, const FunctionDecl *Dcl, Stmt *Body, Sema::CheckConstexprKind Kind)
Check the body for the given constexpr function declaration only contains the permitted types of stat...
llvm::SmallPtrSet< QualType, 4 > IndirectBaseSet
Use small set to collect indirect bases.
static void checkCUDADeviceBuiltinSurfaceClassTemplate(Sema &S, CXXRecordDecl *Class)
static bool checkVectorDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const VectorType *VT)
static void SearchForReturnInStmt(Sema &Self, Stmt *S)
static bool checkSimpleDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const llvm::APSInt &NumElemsAPS, QualType ElemType, llvm::function_ref< ExprResult(SourceLocation, Expr *, unsigned)> GetInit)
static CXXDestructorDecl * LookupDestructorIfRelevant(Sema &S, CXXRecordDecl *Class)
static Sema::ImplicitExceptionSpecification ComputeDefaultedComparisonExceptionSpec(Sema &S, SourceLocation Loc, FunctionDecl *FD, DefaultedComparisonKind DCK)
static void extendRight(SourceRange &R, SourceRange After)
static void DiagnoseNamespaceInlineMismatch(Sema &S, SourceLocation KeywordLoc, SourceLocation Loc, IdentifierInfo *II, bool *IsInline, NamespaceDecl *PrevNS)
Diagnose a mismatch in 'inline' qualifiers when a namespace is reopened.
static bool IsPotentiallyTypeAwareOperatorNewOrDelete(Sema &SemaRef, const FunctionDecl *FD, bool *WasMalformed)
static bool RefersToRValueRef(Expr *MemRef)
static bool CheckConstexprCtorInitializer(Sema &SemaRef, const FunctionDecl *Dcl, FieldDecl *Field, llvm::SmallPtrSet< Decl *, 16 > &Inits, bool &Diagnosed, Sema::CheckConstexprKind Kind)
Check that the given field is initialized within a constexpr constructor.
static CanQualType RemoveAddressSpaceFromPtr(Sema &SemaRef, const PointerType *PtrTy)
static bool isVirtualDirectBase(CXXRecordDecl *Derived, CXXRecordDecl *Base)
Determine whether a direct base class is a virtual base class.
#define CheckPolymorphic(Type)
static void BuildBasePathArray(const CXXBasePath &Path, CXXCastPath &BasePathArray)
static void WriteCharValueForDiagnostic(uint32_t Value, const BuiltinType *BTy, unsigned TyWidth, SmallVectorImpl< char > &Str)
Convert character's value, interpreted as a code unit, to a string.
static void CheckAbstractClassUsage(AbstractUsageInfo &Info, FunctionDecl *FD)
Check for invalid uses of an abstract type in a function declaration.
static unsigned getRecordDiagFromTagKind(TagTypeKind Tag)
Get diagnostic select index for tag kind for record diagnostic message.
static IsTupleLike isTupleLike(Sema &S, SourceLocation Loc, QualType T, unsigned &OutSize)
static Expr * CastForMoving(Sema &SemaRef, Expr *E)
static bool IsPotentiallyDestroyingOperatorDelete(Sema &SemaRef, const FunctionDecl *FD)
static void extendLeft(SourceRange &R, SourceRange Before)
static bool specialMemberIsConstexpr(Sema &S, CXXRecordDecl *ClassDecl, CXXSpecialMemberKind CSM, unsigned Quals, bool ConstRHS, CXXConstructorDecl *InheritedCtor=nullptr, Sema::InheritedConstructorInfo *Inherited=nullptr)
Is the special member function which would be selected to perform the specified operation on the spec...
static void diagnoseInvalidDeclaratorChunks(Sema &S, Declarator &D, unsigned Kind)
static bool canPassInRegisters(Sema &S, CXXRecordDecl *D, TargetInfo::CallingConvKind CCK)
Determine whether a type is permitted to be passed or returned in registers, per C++ [class....
static void lookupOperatorsForDefaultedComparison(Sema &Self, Scope *S, UnresolvedSetImpl &Operators, OverloadedOperatorKind Op)
Perform the unqualified lookups that might be needed to form a defaulted comparison function for the ...
static void WriteCharTypePrefix(BuiltinType::Kind BTK, llvm::raw_ostream &OS)
static bool EvaluateAsStringImpl(Sema &SemaRef, Expr *Message, ResultType &Result, ASTContext &Ctx, Sema::StringEvaluationContext EvalContext, bool ErrorOnInvalidMessage)
static void diagnoseDeprecatedCopyOperation(Sema &S, CXXMethodDecl *CopyOp)
Diagnose an implicit copy operation for a class which is odr-used, but which is deprecated because th...
static void AddMostOverridenMethods(const CXXMethodDecl *MD, llvm::SmallPtrSetImpl< const CXXMethodDecl * > &Methods)
Add the most overridden methods from MD to Methods.
static DeclAccessPair findDecomposableBaseClass(Sema &S, SourceLocation Loc, const CXXRecordDecl *RD, CXXCastPath &BasePath)
Find the base class to decompose in a built-in decomposition of a class type.
static const void * GetKeyForBase(ASTContext &Context, QualType BaseType)
static QualType BuildStdClassTemplate(Sema &S, ClassTemplateDecl *CTD, QualType TypeParam, SourceLocation Loc)
static NamespaceDecl * getNamespaceDecl(NamespaceBaseDecl *D)
getNamespaceDecl - Returns the namespace a decl represents.
static bool isDestroyingDeleteT(QualType Type)
static StmtResult buildSingleCopyAssignRecursively(Sema &S, SourceLocation Loc, QualType T, const ExprBuilder &To, const ExprBuilder &From, bool CopyingBaseSubobject, bool Copying, unsigned Depth=0)
Builds a statement that copies/moves the given entity from From to To.
static void checkCUDADeviceBuiltinTextureClassTemplate(Sema &S, CXXRecordDecl *Class)
static void AddInitializerToDiag(const Sema::SemaDiagnosticBuilder &Diag, const CXXCtorInitializer *Previous, const CXXCtorInitializer *Current)
static bool BuildImplicitBaseInitializer(Sema &SemaRef, CXXConstructorDecl *Constructor, ImplicitInitializerKind ImplicitInitKind, CXXBaseSpecifier *BaseSpec, bool IsInheritedVirtualBase, CXXCtorInitializer *&CXXBaseInit)
static bool IsUnusedPrivateField(const FieldDecl *FD)
static void NoteIndirectBases(ASTContext &Context, IndirectBaseSet &Set, const QualType &Type)
Recursively add the bases of Type. Don't add Type itself.
static bool CheckConstexprMissingReturn(Sema &SemaRef, const FunctionDecl *Dcl)
static bool CheckConstexprFunctionStmt(Sema &SemaRef, const FunctionDecl *Dcl, Stmt *S, SmallVectorImpl< SourceLocation > &ReturnStmts, SourceLocation &Cxx1yLoc, SourceLocation &Cxx2aLoc, SourceLocation &Cxx2bLoc, Sema::CheckConstexprKind Kind)
Check the provided statement is allowed in a constexpr function definition.
static bool functionDeclHasDefaultArgument(const FunctionDecl *FD)
static bool CheckConstexprParameterTypes(Sema &SemaRef, const FunctionDecl *FD, Sema::CheckConstexprKind Kind)
Check whether a function's parameter types are all literal types.
static bool IsUsingDirectiveInToplevelContext(DeclContext *CurContext)
Determine whether a using statement is in a context where it will be apply in all contexts.
static const TemplateSpecializationType * GetClassTemplateSpecializationType(ASTContext &Context, QualType T)
static bool checkTupleLikeDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, VarDecl *Src, QualType DecompType, unsigned NumElems)
static CXXConstructorDecl * findUserDeclaredCtor(CXXRecordDecl *RD)
static bool checkMemberDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const CXXRecordDecl *OrigRD)
static bool HasAttribute(const QualType &T)
static bool CheckOperatorNewDeclaration(Sema &SemaRef, FunctionDecl *FnDecl)
static void checkForMultipleExportedDefaultConstructors(Sema &S, CXXRecordDecl *Class)
static bool CheckOperatorNewDeleteTypes(Sema &SemaRef, FunctionDecl *FnDecl, AllocationOperatorKind OperatorKind, CanQualType ExpectedResultType, CanQualType ExpectedSizeOrAddressParamType, unsigned DependentParamTypeDiag, unsigned InvalidParamTypeDiag)
static bool checkTrivialClassMembers(Sema &S, CXXRecordDecl *RD, CXXSpecialMemberKind CSM, bool ConstArg, TrivialABIHandling TAH, bool Diagnose)
Check whether the members of a class type allow a special member to be trivial.
static TemplateArgumentLoc getTrivialTypeTemplateArgument(Sema &S, SourceLocation Loc, QualType T)
static void findImplicitlyDeclaredEqualityComparisons(ASTContext &Ctx, CXXRecordDecl *RD, llvm::SmallVectorImpl< FunctionDecl * > &Spaceships)
Find the equality comparison functions that should be implicitly declared in a given class definition...
static void PopulateKeysForFields(FieldDecl *Field, SmallVectorImpl< const void * > &IdealInits)
ImplicitInitializerKind
ImplicitInitializerKind - How an implicit base or member initializer should initialize its base or me...
static bool ConvertAPValueToString(const APValue &V, QualType T, SmallVectorImpl< char > &Str, ASTContext &Context)
Convert \V to a string we can present to the user in a diagnostic \T is the type of the expression th...
static bool checkArrayDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const ConstantArrayType *CAT)
static ClassTemplateDecl * LookupStdClassTemplate(Sema &S, SourceLocation Loc, const char *ClassName, bool *WasMalformed)
static void ReferenceDllExportedMembers(Sema &S, CXXRecordDecl *Class)
static bool UsefulToPrintExpr(const Expr *E)
Some Expression types are not useful to print notes about, e.g.
static bool FindBaseInitializer(Sema &SemaRef, CXXRecordDecl *ClassDecl, QualType BaseType, const CXXBaseSpecifier *&DirectBaseSpec, const CXXBaseSpecifier *&VirtualBaseSpec)
Find the direct and/or virtual base specifiers that correspond to the given base type,...
static bool checkLiteralOperatorTemplateParameterList(Sema &SemaRef, FunctionTemplateDecl *TpDecl)
static bool ReportOverrides(Sema &S, unsigned DiagID, const CXXMethodDecl *MD, llvm::function_ref< bool(const CXXMethodDecl *)> Report)
Report an error regarding overriding, along with any relevant overridden methods.
static bool CheckBindingsCount(Sema &S, DecompositionDecl *DD, QualType DecompType, ArrayRef< BindingDecl * > Bindings, unsigned MemberCount)
static bool CheckOperatorDeleteDeclaration(Sema &SemaRef, FunctionDecl *FnDecl)
static const void * GetKeyForMember(ASTContext &Context, CXXCtorInitializer *Member)
static std::string printTemplateArgs(const PrintingPolicy &PrintingPolicy, TemplateArgumentListInfo &Args, const TemplateParameterList *Params)
static bool CheckConstexprReturnType(Sema &SemaRef, const FunctionDecl *FD, Sema::CheckConstexprKind Kind)
Check whether a function's return type is a literal type.
static void DiagnoseBaseOrMemInitializerOrder(Sema &SemaRef, const CXXConstructorDecl *Constructor, ArrayRef< CXXCtorInitializer * > Inits)
static Sema::ImplicitExceptionSpecification computeImplicitExceptionSpec(Sema &S, SourceLocation Loc, FunctionDecl *FD)
static bool isIncompleteOrZeroLengthArrayType(ASTContext &Context, QualType T)
Determine whether the given type is an incomplete or zero-lenfgth array type.
static void MarkFieldDestructorReferenced(Sema &S, SourceLocation Location, FieldDecl *Field)
TrivialSubobjectKind
The kind of subobject we are checking for triviality.
@ TSK_CompleteObject
The object is actually the complete object.
@ TSK_Field
The subobject is a non-static data member.
@ TSK_BaseClass
The subobject is a base class.
static bool hasOneRealArgument(MultiExprArg Args)
Determine whether the given list arguments contains exactly one "real" (non-default) argument.
static StmtResult buildMemcpyForAssignmentOp(Sema &S, SourceLocation Loc, QualType T, const ExprBuilder &ToB, const ExprBuilder &FromB)
When generating a defaulted copy or move assignment operator, if a field should be copied with __buil...
static QualType IgnorePackIndexing(QualType T)
static bool isStdClassTemplate(Sema &S, QualType SugaredType, QualType *TypeArg, const char *ClassName, ClassTemplateDecl **CachedDecl, const Decl **MalformedDecl)
static void DefineDefaultedFunction(Sema &S, FunctionDecl *FD, SourceLocation DefaultLoc)
static bool BuildImplicitMemberInitializer(Sema &SemaRef, CXXConstructorDecl *Constructor, ImplicitInitializerKind ImplicitInitKind, FieldDecl *Field, IndirectFieldDecl *Indirect, CXXCtorInitializer *&CXXMemberInit)
static void MarkBaseDestructorsReferenced(Sema &S, SourceLocation Location, CXXRecordDecl *ClassDecl)
static bool CheckMemberDecompositionFields(Sema &S, SourceLocation Loc, const CXXRecordDecl *OrigRD, QualType DecompType, DeclAccessPair BasePair)
static bool CollectFieldInitializer(Sema &SemaRef, BaseAndFieldInfo &Info, FieldDecl *Field, IndirectFieldDecl *Indirect=nullptr)
static CXXBaseSpecifier * findDirectBaseWithType(CXXRecordDecl *Derived, QualType DesiredBase, bool &AnyDependentBases)
Find the base specifier for a base class with the given type.
static Sema::SpecialMemberOverloadResult lookupCallFromSpecialMember(Sema &S, CXXRecordDecl *Class, CXXSpecialMemberKind CSM, unsigned FieldQuals, bool ConstRHS)
Look up the special member function that would be called by a special member function for a subobject...
static bool defaultedSpecialMemberIsConstexpr(Sema &S, CXXRecordDecl *ClassDecl, CXXSpecialMemberKind CSM, bool ConstArg, CXXConstructorDecl *InheritedCtor=nullptr, Sema::InheritedConstructorInfo *Inherited=nullptr)
Determine whether the specified special member function would be constexpr if it were implicitly defi...
static bool checkTrivialSubobjectCall(Sema &S, SourceLocation SubobjLoc, QualType SubType, bool ConstRHS, CXXSpecialMemberKind CSM, TrivialSubobjectKind Kind, TrivialABIHandling TAH, bool Diagnose)
Check whether the special member selected for a given type would be trivial.
static void DiagnoseInvisibleNamespace(const TypoCorrection &Corrected, Sema &S)
static StmtResult buildSingleCopyAssign(Sema &S, SourceLocation Loc, QualType T, const ExprBuilder &To, const ExprBuilder &From, bool CopyingBaseSubobject, bool Copying)
static FunctionProtoType::ExtProtoInfo getImplicitMethodEPI(Sema &S, CXXMethodDecl *MD)
static QualType getTupleLikeElementType(Sema &S, SourceLocation Loc, unsigned I, QualType T)
static Sema::ImplicitExceptionSpecification ComputeDefaultedSpecialMemberExceptionSpec(Sema &S, SourceLocation Loc, CXXMethodDecl *MD, CXXSpecialMemberKind CSM, Sema::InheritedConstructorInfo *ICI)
static QualType getStdTrait(Sema &S, SourceLocation Loc, StringRef Trait, TemplateArgumentListInfo &Args, unsigned DiagID)
static bool checkComplexDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const ComplexType *CT)
static bool TryNamespaceTypoCorrection(Sema &S, LookupResult &R, Scope *Sc, CXXScopeSpec &SS, SourceLocation IdentLoc, IdentifierInfo *Ident)
static bool InitializationHasSideEffects(const FieldDecl &FD)
static bool CheckOperatorNewDeleteDeclarationScope(Sema &SemaRef, const FunctionDecl *FnDecl)
static bool checkArrayLikeDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const llvm::APSInt &NumElems, QualType ElemType)
static bool CheckConstexprDeclStmt(Sema &SemaRef, const FunctionDecl *Dcl, DeclStmt *DS, SourceLocation &Cxx1yLoc, Sema::CheckConstexprKind Kind)
Check the given declaration statement is legal within a constexpr function body.
static bool IsEquivalentForUsingDecl(ASTContext &Context, NamedDecl *D1, NamedDecl *D2)
Determine whether a using declaration considers the given declarations as "equivalent",...
static TemplateArgumentLoc getTrivialIntegralTemplateArgument(Sema &S, SourceLocation Loc, QualType T, uint64_t I)
static void DiagnoseDependentFriendNotMember(Sema &S, SourceLocation Loc, NestedNameSpecifier NNS)
static bool CheckConstexprDestructorSubobjects(Sema &SemaRef, const CXXDestructorDecl *DD, Sema::CheckConstexprKind Kind)
Determine whether a destructor cannot be constexpr due to.
static bool isProvablyNotDerivedFrom(Sema &SemaRef, CXXRecordDecl *Record, const BaseSet &Bases)
Determines if the given class is provably not derived from all of the prospective base classes.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis for OpenMP constructs and clauses.
static ExprResult CheckConvertedConstantExpression(Sema &S, Expr *From, QualType T, APValue &Value, CCEKind CCE, bool RequireInt, NamedDecl *Dest)
CheckConvertedConstantExpression - Check that the expression From is a converted constant expression ...
static void MarkUsedTemplateParameters(ASTContext &Ctx, const TemplateArgument &TemplateArg, bool OnlyDeduced, unsigned Depth, llvm::SmallBitVector &Used)
Mark the template parameters that are used by this template argument.
static void collectUnexpandedParameterPacks(Sema &S, TemplateParameterList *Params, SmallVectorImpl< UnexpandedParameterPack > &Unexpanded)
static bool DiagnoseUnexpandedParameterPacks(Sema &S, TemplateTemplateParmDecl *TTP)
Check for unexpanded parameter packs within the template parameters of a template template parameter,...
static bool isInvalid(LocType Loc, bool *Invalid)
Defines various enumerations that describe declaration and type specifiers.
static QualType getPointeeType(const MemRegion *R)
Defines the clang::TypeLoc interface and its subclasses.
Allows QualTypes to be sorted and hence used in maps and sets.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
std::pair< CXXConstructorDecl *, bool > findConstructorForBase(CXXRecordDecl *Base, CXXConstructorDecl *Ctor) const
Find the constructor to use for inherited construction of a base class, and whether that base class c...
InheritedConstructorInfo(Sema &S, SourceLocation UseLoc, ConstructorUsingShadowDecl *Shadow)
a trap message and trap category.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
virtual bool HandleTopLevelDecl(DeclGroupRef D)
HandleTopLevelDecl - Handle the specified top-level declaration.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
const ConstantArrayType * getAsConstantArrayType(QualType T) const
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
DeclarationNameTable DeclarationNames
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
const LangOptions & getLangOpts() const
QualType getConstType(QualType T) const
Return the uniqued reference to the type for a const qualified type.
CallingConv getDefaultCallingConvention(bool IsVariadic, bool IsCXXMethod) const
Retrieves the default calling convention for the current context.
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
ComparisonCategories CompCategories
Types and expressions required to build C++2a three-way comparisons using operator<=>,...
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
const clang::PrintingPolicy & getPrintingPolicy() const
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
QualType getTypeDeclType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TypeDecl *Decl) const
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
QualType getPackExpansionType(QualType Pattern, UnsignedOrNone NumExpansions, bool ExpectPackInType=true) const
Form a pack expansion type with the given pattern.
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
llvm::APSInt MakeIntValue(uint64_t Value, QualType Type) const
Make an APSInt of the appropriate width and signedness for the given Value and integer Type.
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
const TargetInfo & getTargetInfo() const
CanQualType getCanonicalTagType(const TagDecl *TD) const
static bool hasSameUnqualifiedType(QualType T1, QualType T2)
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
Represents an access specifier followed by colon ':'.
static AccessSpecDecl * Create(ASTContext &C, AccessSpecifier AS, DeclContext *DC, SourceLocation ASLoc, SourceLocation ColonLoc)
TypeLoc getElementLoc() const
QualType getElementType() const
Attr - This represents one attribute.
attr::Kind getKind() const
Attr * clone(ASTContext &C) const
SourceLocation getLocation() const
Represents a C++ declaration that introduces decls from somewhere else.
unsigned shadow_size() const
Return the number of shadowed declarations associated with this using declaration.
void addShadowDecl(UsingShadowDecl *S)
shadow_iterator shadow_begin() const
void removeShadowDecl(UsingShadowDecl *S)
static BinaryOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)
static bool isCompoundAssignmentOp(Opcode Opc)
static Opcode getOverloadedOpcode(OverloadedOperatorKind OO)
Retrieve the binary opcode that corresponds to the given overloaded operator.
A binding in a decomposition declaration.
void setDecomposedDecl(DecompositionDecl *Decomposed)
Set the decomposed variable for this BindingDecl.
static BindingDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdLoc, IdentifierInfo *Id, QualType T)
void setBinding(QualType DeclaredType, Expr *Binding)
Set the binding for this BindingDecl, along with its declared type (which should be a possibly-cv-qua...
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
Wrapper for source info for block pointers.
This class is used for builtin types like 'int'.
Represents a path from a specific derived class (which is not represented as part of the path) to a p...
DeclContext::lookup_iterator Decls
The declarations found inside this base class subobject.
AccessSpecifier Access
The access along this inheritance path.
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
const CXXRecordDecl * getOrigin() const
Retrieve the type from which this base-paths search began.
bool isRecordingPaths() const
Whether we are recording paths.
void setRecordingPaths(bool RP)
Specify whether we should be recording paths or not.
void setOrigin(const CXXRecordDecl *Rec)
void clear()
Clear the base-paths results.
bool isAmbiguous(CanQualType BaseType) const
Determine whether the path from the most-derived type to the given base type is ambiguous (i....
Represents a base class of a C++ class.
SourceLocation getBeginLoc() const LLVM_READONLY
bool isVirtual() const
Determines whether the base class is a virtual base class (or not).
QualType getType() const
Retrieves the type of the base class.
SourceRange getSourceRange() const LLVM_READONLY
Retrieves the source range that contains the entire base specifier.
AccessSpecifier getAccessSpecifier() const
Returns the access specifier for this base specifier.
A boolean literal, per ([C++ lex.bool] Boolean literals).
CXXCatchStmt - This represents a C++ catch block.
Represents a call to a C++ constructor.
static CXXConstructExpr * Create(const ASTContext &Ctx, QualType Ty, SourceLocation Loc, CXXConstructorDecl *Ctor, bool Elidable, ArrayRef< Expr * > Args, bool HadMultipleCandidates, bool ListInitialization, bool StdInitListInitialization, bool ZeroInitialization, CXXConstructionKind ConstructKind, SourceRange ParenOrBraceRange)
Create a C++ construction expression.
Expr * getArg(unsigned Arg)
Return the specified argument.
bool isImmediateEscalating() const
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
Represents a C++ constructor within a class.
CXXConstructorDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool isMoveConstructor(unsigned &TypeQuals) const
Determine whether this constructor is a move constructor (C++11 [class.copy]p3), which can be used to...
init_iterator init_begin()
Retrieve an iterator to the first initializer.
CXXConstructorDecl * getTargetConstructor() const
When this constructor delegates to another, retrieve the target.
bool isCopyConstructor(unsigned &TypeQuals) const
Whether this constructor is a copy constructor (C++ [class.copy]p2, which can be used to copy the cla...
void setCtorClosureDefaultArgs(ArrayRef< CXXDefaultArgExpr * > Args)
InheritedConstructor getInheritedConstructor() const
Get the constructor that this inheriting constructor is based on.
static CXXConstructorDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, ExplicitSpecifier ES, bool UsesFPIntrin, bool isInline, bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind, InheritedConstructor Inherited=InheritedConstructor(), const AssociatedConstraint &TrailingRequiresClause={})
ArrayRef< CXXDefaultArgExpr * > getCtorClosureDefaultArgs() const
ExplicitSpecifier getExplicitSpecifier() const
Represents a C++ conversion function within a class.
QualType getConversionType() const
Returns the type that this conversion function is converting to.
Represents a C++ base or member initializer.
bool isWritten() const
Determine whether this initializer is explicitly written in the source code.
SourceRange getSourceRange() const LLVM_READONLY
Determine the source range covering the entire initializer.
SourceLocation getSourceLocation() const
Determine the source location of the initializer.
bool isAnyMemberInitializer() const
TypeSourceInfo * getTypeSourceInfo() const
Returns the declarator information for a base class or delegating initializer.
FieldDecl * getAnyMember() const
A default argument (C++ [dcl.fct.default]).
Represents a C++ destructor within a class.
static CXXDestructorDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, bool UsesFPIntrin, bool isInline, bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind, const AssociatedConstraint &TrailingRequiresClause={})
const FunctionDecl * getOperatorDelete() const
A mapping from each virtual member function to its set of final overriders.
Represents a call to an inherited base class constructor from an inheriting constructor.
Represents a call to a member function that may be written either with member call syntax (e....
CXXMethodDecl * getMethodDecl() const
Retrieve the declaration of the called method.
Represents a static or instance method of a struct/union/class.
bool isExplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An explicit object member function is a non-static member function with an explic...
CXXSpecialMemberKind getSpecialMemberKind() const
static CXXMethodDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin, bool isInline, ConstexprSpecKind ConstexprKind, SourceLocation EndLocation, const AssociatedConstraint &TrailingRequiresClause={})
unsigned getNumExplicitParams() const
CXXMethodDecl * getMostRecentDecl()
overridden_method_range overridden_methods() const
unsigned size_overridden_methods() const
method_iterator begin_overridden_methods() const
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
bool isMoveAssignmentOperator() const
Determine whether this is a move assignment operator.
QualType getFunctionObjectParameterType() const
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
The null pointer literal (C++11 [lex.nullptr])
Represents a C++ struct/union/class.
bool hasConstexprDefaultConstructor() const
Determine whether this class has a constexpr default constructor.
friend_range friends() const
bool hasTrivialMoveAssignment() const
Determine whether this class has a trivial move assignment operator (C++11 [class....
bool isTriviallyCopyable() const
Determine whether this class is considered trivially copyable per (C++11 [class]p6).
bool hasTrivialDefaultConstructor() const
Determine whether this class has a trivial default constructor (C++11 [class.ctor]p5).
bool isGenericLambda() const
Determine whether this class describes a generic lambda function object (i.e.
bool hasTrivialDestructor() const
Determine whether this class has a trivial destructor (C++ [class.dtor]p3)
bool hasUserDeclaredDestructor() const
Determine whether this class has a user-declared destructor.
bool implicitCopyConstructorHasConstParam() const
Determine whether an implicit copy constructor for this type would have a parameter with a const-qual...
bool defaultedDestructorIsDeleted() const
true if a defaulted destructor for this class would be deleted.
bool hasInheritedAssignment() const
Determine whether this class has a using-declaration that names a base class assignment operator.
bool allowConstDefaultInit() const
Determine whether declaring a const variable with this type is ok per core issue 253.
bool hasTrivialDestructorForCall() const
bool defaultedMoveConstructorIsDeleted() const
true if a defaulted move constructor for this class would be deleted.
bool isLiteral() const
Determine whether this class is a literal type.
bool hasUserDeclaredMoveAssignment() const
Determine whether this class has had a move assignment declared by the user.
bool defaultedDestructorIsConstexpr() const
Determine whether a defaulted default constructor for this class would be constexpr.
bool hasAnyDependentBases() const
Determine whether this class has any dependent base classes which are not the current instantiation.
bool isLambda() const
Determine whether this class describes a lambda function object.
bool hasTrivialMoveConstructor() const
Determine whether this class has a trivial move constructor (C++11 [class.copy]p12)
bool needsImplicitDefaultConstructor() const
Determine if we need to declare a default constructor for this class.
bool needsImplicitMoveConstructor() const
Determine whether this class should get an implicit move constructor or if any existing special membe...
bool hasUserDeclaredCopyAssignment() const
Determine whether this class has a user-declared copy assignment operator.
bool isProvablyNotDerivedFrom(const CXXRecordDecl *Base) const
Determine whether this class is provably not derived from the type Base.
method_range methods() const
CXXRecordDecl * getDefinition() const
bool needsOverloadResolutionForCopyAssignment() const
Determine whether we need to eagerly declare a defaulted copy assignment operator for this class.
static AccessSpecifier MergeAccess(AccessSpecifier PathAccess, AccessSpecifier DeclAccess)
Calculates the access of a decl that is reached along a path.
bool defaultedDefaultConstructorIsConstexpr() const
Determine whether a defaulted default constructor for this class would be constexpr.
bool hasTrivialCopyConstructor() const
Determine whether this class has a trivial copy constructor (C++ [class.copy]p6, C++11 [class....
void setImplicitMoveAssignmentIsDeleted()
Set that we attempted to declare an implicit move assignment operator, but overload resolution failed...
bool hasConstexprDestructor() const
Determine whether this class has a constexpr destructor.
bool isPolymorphic() const
Whether this class is polymorphic (C++ [class.virtual]), which means that the class contains or inher...
unsigned getNumBases() const
Retrieves the number of base classes of this class.
bool defaultedCopyConstructorIsDeleted() const
true if a defaulted copy constructor for this class would be deleted.
bool hasTrivialCopyConstructorForCall() const
bool lookupInBases(BaseMatchesCallback BaseMatches, CXXBasePaths &Paths, bool LookupInDependent=false) const
Look for entities within the base classes of this C++ class, transitively searching all base class su...
bool lambdaIsDefaultConstructibleAndAssignable() const
Determine whether this lambda should have an implicit default constructor and copy and move assignmen...
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine whether this particular class is a specialization or instantiation of a class template or m...
bool hasTrivialCopyAssignment() const
Determine whether this class has a trivial copy assignment operator (C++ [class.copy]p11,...
base_class_range vbases()
base_class_iterator vbases_begin()
void setImplicitMoveConstructorIsDeleted()
Set that we attempted to declare an implicit move constructor, but overload resolution failed so we d...
bool isAbstract() const
Determine whether this class has a pure virtual function.
bool hasVariantMembers() const
Determine whether this class has any variant members.
void setImplicitCopyConstructorIsDeleted()
Set that we attempted to declare an implicit copy constructor, but overload resolution failed so we d...
bool isDynamicClass() const
bool hasInClassInitializer() const
Whether this class has any in-class initializers for non-static data members (including those in anon...
bool needsImplicitCopyConstructor() const
Determine whether this class needs an implicit copy constructor to be lazily declared.
bool hasIrrelevantDestructor() const
Determine whether this class has a destructor which has no semantic effect.
bool hasNonTrivialCopyConstructorForCall() const
bool hasDirectFields() const
Determine whether this class has direct non-static data members.
bool hasUserDeclaredCopyConstructor() const
Determine whether this class has a user-declared copy constructor.
bool hasDefinition() const
void setImplicitCopyAssignmentIsDeleted()
Set that we attempted to declare an implicit copy assignment operator, but overload resolution failed...
bool needsImplicitDestructor() const
Determine whether this class needs an implicit destructor to be lazily declared.
ClassTemplateDecl * getDescribedClassTemplate() const
Retrieves the class template that is described by this class declaration.
void getFinalOverriders(CXXFinalOverriderMap &FinaOverriders) const
Retrieve the final overriders for each virtual member function in the class hierarchy where this clas...
bool needsOverloadResolutionForMoveConstructor() const
Determine whether we need to eagerly declare a defaulted move constructor for this class.
bool isInjectedClassName() const
Determines whether this declaration represents the injected class name.
bool needsOverloadResolutionForMoveAssignment() const
Determine whether we need to eagerly declare a move assignment operator for this class.
CXXDestructorDecl * getDestructor() const
Returns the destructor decl for this class.
bool hasNonTrivialDestructorForCall() const
bool needsOverloadResolutionForDestructor() const
Determine whether we need to eagerly declare a destructor for this class.
bool hasInheritedConstructor() const
Determine whether this class has a using-declaration that names a user-declared base class constructo...
CXXMethodDecl * getLambdaStaticInvoker() const
Retrieve the lambda static invoker, the address of which is returned by the conversion operator,...
bool needsOverloadResolutionForCopyConstructor() const
Determine whether we need to eagerly declare a defaulted copy constructor for this class.
CXXRecordDecl * getDefinitionOrSelf() const
bool hasUserDeclaredMoveConstructor() const
Determine whether this class has had a move constructor declared by the user.
bool needsImplicitMoveAssignment() const
Determine whether this class should get an implicit move assignment operator or if any existing speci...
bool needsImplicitCopyAssignment() const
Determine whether this class needs an implicit copy assignment operator to be lazily declared.
bool hasTrivialMoveConstructorForCall() const
CXXMethodDecl * getLambdaCallOperator() const
Retrieve the lambda call operator of the closure type if this is a closure type.
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
unsigned getNumVBases() const
Retrieves the number of virtual base classes of this class.
bool isDerivedFrom(const CXXRecordDecl *Base) const
Determine whether this class is derived from the class Base.
bool implicitCopyAssignmentHasConstParam() const
Determine whether an implicit copy assignment operator for this type would have a parameter with a co...
Represents a C++ nested-name-specifier or a global scope specifier.
bool isNotEmpty() const
A scope specifier is present, but may be valid or invalid.
bool isValid() const
A scope specifier is present, and it refers to a real scope.
void MakeTrivial(ASTContext &Context, NestedNameSpecifier Qualifier, SourceRange R)
Make a new nested-name-specifier from incomplete source-location information.
SourceRange getRange() const
SourceLocation getBeginLoc() const
bool isSet() const
Deprecated.
NestedNameSpecifier getScopeRep() const
Retrieve the representation of the nested-name-specifier.
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
bool isInvalid() const
An error occurred during parsing of the scope specifier.
bool isEmpty() const
No scope specifier.
Represents the this expression in C++.
SourceLocation getBeginLoc() const
SourceLocation getLocation() const
CXXTryStmt - A C++ try block, including all handlers.
CXXCatchStmt * getHandler(unsigned i)
unsigned getNumHandlers() const
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
bool isCallToStdMove() const
QualType withConst() const
Retrieves a version of this type with const applied.
CastKind getCastKind() const
static CharSourceRange getTokenRange(SourceRange R)
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
Declaration of a class template.
CXXRecordDecl * getTemplatedDecl() const
Get the underlying class declarations of the template.
Represents a class template specialization, which refers to a class template with a given set of temp...
TemplateSpecializationKind getSpecializationKind() const
Determine the kind of specialization that this declaration represents.
ClassTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
SourceLocation getPointOfInstantiation() const
Get the point of instantiation (if any), or null if none.
bool isExplicitSpecialization() const
const ComparisonCategoryInfo * lookupInfoForType(QualType Ty) const
static StringRef getCategoryString(ComparisonCategoryType Kind)
static StringRef getResultString(ComparisonCategoryResult Kind)
static std::vector< ComparisonCategoryResult > getPossibleResultsForType(ComparisonCategoryType Type)
Return the list of results which are valid for the specified comparison category type.
const CXXRecordDecl * Record
The declaration for the comparison category type from the standard library.
ComparisonCategoryType Kind
The Kind of the comparison category type.
Complex values, per C99 6.2.5p11.
QualType getElementType() const
CompoundStmt - This represents a group of statements like { stmt stmt }.
static CompoundStmt * Create(const ASTContext &C, ArrayRef< Stmt * > Stmts, FPOptionsOverride FPFeatures, SourceLocation LB, SourceLocation RB)
ConstStmtVisitor - This class implements a simple visitor for Stmt subclasses.
Represents the canonical version of C arrays with a specified constant size.
llvm::APInt getSize() const
Return the constant array size as an APInt.
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
const CXXRecordDecl * getParent() const
Returns the parent of this using shadow declaration, which is the class in which this is declared.
static ConstructorUsingShadowDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation Loc, UsingDecl *Using, NamedDecl *Target, bool IsVirtual)
SourceLocation getBeginLoc() const LLVM_READONLY
Base class for callback objects used by Sema::CorrectTypo to check the validity of a potential typo c...
A POD class for pairing a NamedDecl* with an access specifier.
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
NamedDecl * getDecl() const
AccessSpecifier getAccess() const
The results of name lookup within a DeclContext.
DeclListNode::iterator iterator
specific_decl_iterator - Iterates over a subrange of declarations stored in a DeclContext,...
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
lookup_result::iterator lookup_iterator
bool isFileContext() const
void makeDeclVisibleInContext(NamedDecl *D)
Makes a declaration visible within this context.
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
bool InEnclosingNamespaceSetOf(const DeclContext *NS) const
Test if this context is part of the enclosing namespace set of the context NS, as defined in C++0x [n...
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
bool isTranslationUnit() const
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void removeDecl(Decl *D)
Removes a declaration from this context.
void addDecl(Decl *D)
Add the declaration D into this context.
decl_iterator decls_end() const
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
bool isFunctionOrMethod() const
const LinkageSpecDecl * getExternCContext() const
Retrieve the nearest enclosing C linkage specification context.
bool Encloses(const DeclContext *DC) const
Determine whether this declaration context semantically encloses the declaration context DC.
Decl::Kind getDeclKind() const
DeclContext * getNonTransparentContext()
decl_iterator decls_begin() const
A reference to a declared variable, function, enum, etc.
static DeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *D, bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc, QualType T, ExprValueKind VK, NamedDecl *FoundD=nullptr, const TemplateArgumentListInfo *TemplateArgs=nullptr, NonOdrUseReason NOUR=NOUR_None)
NonOdrUseReason isNonOdrUse() const
Is this expression a non-odr-use reference, and if so, why?
SourceLocation getBeginLoc() const
bool isImmediateEscalating() const
Captures information about "declaration specifiers".
bool isVirtualSpecified() const
bool isModulePrivateSpecified() const
bool hasTypeSpecifier() const
Return true if any type-specifier has been found.
bool SetStorageClassSpec(Sema &S, SCS SC, SourceLocation Loc, const char *&PrevSpec, unsigned &DiagID, const PrintingPolicy &Policy)
These methods set the specified attribute of the DeclSpec and return false if there was no error.
ThreadStorageClassSpecifier TSCS
Expr * getPackIndexingExpr() const
void ClearStorageClassSpecs()
TST getTypeSpecType() const
SourceLocation getStorageClassSpecLoc() const
SCS getStorageClassSpec() const
SourceLocation getBeginLoc() const LLVM_READONLY
SourceRange getSourceRange() const LLVM_READONLY
unsigned getTypeQualifiers() const
getTypeQualifiers - Return a set of TQs.
SourceLocation getExplicitSpecLoc() const
SourceLocation getFriendSpecLoc() const
ParsedType getRepAsType() const
TSCS getThreadStorageClassSpec() const
bool isFriendSpecifiedFirst() const
ParsedAttributes & getAttributes()
SourceLocation getEllipsisLoc() const
SourceLocation getConstSpecLoc() const
SourceRange getExplicitSpecRange() const
Expr * getRepAsExpr() const
bool isInlineSpecified() const
SourceLocation getRestrictSpecLoc() const
bool SetTypeQual(TQ T, SourceLocation Loc)
void ClearConstexprSpec()
static const char * getSpecifierName(DeclSpec::TST T, const PrintingPolicy &Policy)
Turn a type-specifier-type into a string like "_Bool" or "union".
SourceLocation getThreadStorageClassSpecLoc() const
SourceLocation getAtomicSpecLoc() const
SourceLocation getVirtualSpecLoc() const
SourceLocation getConstexprSpecLoc() const
SourceLocation getTypeSpecTypeLoc() const
void forEachQualifier(llvm::function_ref< void(TQ, StringRef, SourceLocation)> Handle)
This method calls the passed in handler on each qual being set.
SourceLocation getInlineSpecLoc() const
SourceLocation getUnalignedSpecLoc() const
SourceLocation getVolatileSpecLoc() const
FriendSpecified isFriendSpecified() const
bool hasExplicitSpecifier() const
bool hasConstexprSpecifier() const
static const TST TST_auto
DeclStmt - Adaptor class for mixing declarations with statements and expressions.
SourceLocation getBeginLoc() const LLVM_READONLY
Decl - This represents one declaration (or definition), e.g.
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
bool isInStdNamespace() const
SourceLocation getEndLoc() const LLVM_READONLY
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
virtual bool isOutOfLine() const
Determine whether this declaration is declared out of line (outside its semantic context).
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
Kind
Lists the kind of concrete classes of Decl.
void markUsed(ASTContext &C)
Mark the declaration used, in the sense of odr-use.
@ FOK_Undeclared
A friend of a previously-undeclared entity.
@ FOK_None
Not a friend object.
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
bool isTemplateParameter() const
isTemplateParameter - Determines whether this declaration is a template parameter.
DeclContext * getNonTransparentDeclContext()
Return the non transparent context.
bool isInvalidDecl() const
unsigned getIdentifierNamespace() const
bool isLocalExternDecl() const
Determine whether this is a block-scope declaration with linkage.
void setAccess(AccessSpecifier AS)
SourceLocation getLocation() const
@ IDNS_Ordinary
Ordinary names.
bool isTemplateParameterPack() const
isTemplateParameter - Determines whether this declaration is a template parameter pack.
void setLocalOwningModule(Module *M)
void setImplicit(bool I=true)
void setReferenced(bool R=true)
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
SourceLocation getBeginLoc() const LLVM_READONLY
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
@ VisibleWhenImported
This declaration has an owning module, and is visible when that module is imported.
void setModuleOwnershipKind(ModuleOwnershipKind MOK)
Set whether this declaration is hidden from name lookup.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
bool isAnyOperatorNewOrDelete() const
std::string getAsString() const
Retrieve the human-readable string for this name.
const IdentifierInfo * getCXXLiteralIdentifier() const
If this name is the name of a literal operator, retrieve the identifier associated with it.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
@ CXXConversionFunctionName
NameKind getNameKind() const
Determine what kind of name this is.
bool isIdentifier() const
Predicate functions for querying what type of name this is.
Represents a ValueDecl that came out of a declarator.
SourceLocation getTypeSpecStartLoc() const
SourceLocation getBeginLoc() const LLVM_READONLY
const AssociatedConstraint & getTrailingRequiresClause() const
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
void setTypeSourceInfo(TypeSourceInfo *TI)
ArrayRef< TemplateParameterList * > getTemplateParameterLists() const
TypeSourceInfo * getTypeSourceInfo() const
Information about one declarator, including the parsed type information and the identifier.
bool isFunctionDeclarator(unsigned &idx) const
isFunctionDeclarator - This method returns true if the declarator is a function declarator (looking t...
bool isDeclarationOfFunction() const
Determine whether the declaration that will be produced from this declaration will be a function.
const DeclaratorChunk & getTypeObject(unsigned i) const
Return the specified TypeInfo from this declarator.
const DeclSpec & getDeclSpec() const
getDeclSpec - Return the declaration-specifier that this declarator was declared with.
bool isFunctionDeclarationContext() const
Return true if this declaration appears in a context where a function declarator would be a function ...
SourceLocation getIdentifierLoc() const
void SetIdentifier(const IdentifierInfo *Id, SourceLocation IdLoc)
Set the name of this declarator to be the given identifier.
SourceLocation getEndLoc() const LLVM_READONLY
type_object_range type_objects() const
Returns the range of type objects, from the identifier outwards.
bool hasGroupingParens() const
void setInvalidType(bool Val=true)
unsigned getNumTypeObjects() const
Return the number of types applied to this declarator.
bool isRedeclaration() const
DeclaratorContext getContext() const
const DecompositionDeclarator & getDecompositionDeclarator() const
SourceLocation getBeginLoc() const LLVM_READONLY
bool isFunctionDefinition() const
UnqualifiedId & getName()
Retrieve the name specified by this declarator.
const CXXScopeSpec & getCXXScopeSpec() const
getCXXScopeSpec - Return the C++ scope specifier (global scope or nested-name-specifier) that is part...
ArrayRef< TemplateParameterList * > getTemplateParameterLists() const
The template parameter lists that preceded the declarator.
void setInventedTemplateParameterList(TemplateParameterList *Invented)
Sets the template parameter list generated from the explicit template parameters along with any inven...
bool mayHaveDecompositionDeclarator() const
Return true if the context permits a C++17 decomposition declarator.
bool isInvalidType() const
SourceRange getSourceRange() const LLVM_READONLY
Get the source range that spans this declarator.
bool isDecompositionDeclarator() const
Return whether this declarator is a decomposition declarator.
bool isStaticMember()
Returns true if this declares a static member.
DeclSpec & getMutableDeclSpec()
getMutableDeclSpec - Return a non-const version of the DeclSpec.
DeclaratorChunk::FunctionTypeInfo & getFunctionTypeInfo()
getFunctionTypeInfo - Retrieves the function type info object (looking through parentheses).
const IdentifierInfo * getIdentifier() const
A decomposition declaration.
ArrayRef< BindingDecl * > bindings() const
A parsed C++17 decomposition declarator of the form '[' identifier-list ']'.
ArrayRef< Binding > bindings() const
SourceRange getSourceRange() const
SourceLocation getLSquareLoc() const
void setNameLoc(SourceLocation Loc)
void setElaboratedKeywordLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
A little helper class (which is basically a smart pointer that forwards info from DiagnosticsEngine a...
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
virtual bool TraverseConstructorInitializer(MaybeConst< CXXCtorInitializer > *Init)
static EmptyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L)
RAII object that enters a new expression evaluation context.
An instance of this object exists for each enum constant that is defined.
enumerator_range enumerators() const
EvaluatedExprVisitor - This class visits 'Expr *'s.
Store information needed for an explicit specifier.
const Expr * getExpr() const
void setKind(ExplicitSpecKind Kind)
This represents one expression.
static bool isPotentialConstantExpr(const FunctionDecl *FD, SmallVectorImpl< PartialDiagnosticAt > &Diags)
isPotentialConstantExpr - Return true if this function's definition might be usable in a constant exp...
bool isValueDependent() const
Determines whether the value of this expression depends on.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
Expr * IgnoreImplicit() LLVM_READONLY
Skip past any implicit AST nodes which might surround this expression until reaching a fixed point.
bool containsErrors() const
Whether this expression contains subexpressions which had errors.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
bool isLValue() const
isLValue - True if this expression is an "l-value" according to the rules of the current language.
bool EvaluateAsRValue(EvalResult &Result, const ASTContext &Ctx, bool InConstantContext=false) const
EvaluateAsRValue - Return true if this is a constant which we can fold to an rvalue using any crazy t...
bool isTemporaryObject(ASTContext &Ctx, const CXXRecordDecl *TempTy) const
Determine whether the result of this expression is a temporary object of the given class type.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Represents difference between two FPOptions values.
FPOptions applyOverrides(FPOptions Base)
Represents a member of a struct/union/class.
bool isMutable() const
Determines whether this field is mutable (C++ only).
Expr * getInClassInitializer() const
Get the C++11 default member initializer for this member, or null if one has not been set.
bool hasInClassInitializer() const
Determine whether this member has a C++11 default member initializer.
bool isAnonymousStructOrUnion() const
Determines whether this field is a representative for an anonymous struct or union.
InClassInitStyle getInClassInitStyle() const
Get the kind of (C++11) default member initializer that this field has.
void setInClassInitializer(Expr *NewInit)
Set the C++11 in-class initializer for this member.
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
FieldDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this field.
bool isUnnamedBitField() const
Determines whether this is an unnamed bitfield.
Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...
static FixItHint CreateInsertionFromRange(SourceLocation InsertionLoc, CharSourceRange FromRange, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code from FromRange at a specific location.
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
static FixItHint CreateRemoval(CharSourceRange RemoveRange)
Create a code modification hint that removes the given source range.
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
static FriendDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, FriendUnion Friend, SourceLocation FriendL, SourceLocation EllipsisLoc={})
static FriendTemplateDecl * Create(ASTContext &Context, DeclContext *DC, SourceLocation Loc, FriendUnion Friend, SourceLocation FriendLoc, ArrayRef< TemplateParameterList * > FriendTPLists, SourceLocation EllipsisLoc={}, TemplateName Template={})
For a defaulted function, the kind of defaulted function that it is.
CXXSpecialMemberKind asSpecialMember() const
bool isComparison() const
bool isSpecialMember() const
DefaultedComparisonKind asComparison() const
static DefaultedOrDeletedFunctionInfo * Create(ASTContext &Context, ArrayRef< DeclAccessPair > Lookups, FPOptionsOverride FPFeatures, StringLiteral *DeletedMessage=nullptr)
Represents a function declaration or definition.
static constexpr unsigned RequiredTypeAwareDeleteParameterCount
Count of mandatory parameters for type aware operator delete.
const ParmVarDecl * getParamDecl(unsigned i) const
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
ExceptionSpecificationType getExceptionSpecType() const
Gets the ExceptionSpecificationType as declared.
bool isTrivialForCall() const
ConstexprSpecKind getConstexprKind() const
DefaultedOrDeletedFunctionInfo * getDefaultedOrDeletedInfo() const
unsigned getMinRequiredArguments() const
Returns the minimum number of arguments needed to call this function.
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
bool isThisDeclarationADefinition() const
Returns whether this specific declaration of the function is also a definition that does not contain ...
bool isImmediateFunction() const
void setDefaultedOrDeletedInfo(DefaultedOrDeletedFunctionInfo *Info)
SourceRange getReturnTypeSourceRange() const
Attempt to compute an informative source range covering the function return type.
bool isDestroyingOperatorDelete() const
Determine whether this is a destroying operator delete.
bool hasCXXExplicitFunctionObjectParameter() const
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
SourceLocation getDefaultLoc() const
QualType getReturnType() const
ArrayRef< ParmVarDecl * > parameters() const
bool isExplicitlyDefaulted() const
Whether this function is explicitly defaulted.
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
MutableArrayRef< ParmVarDecl * >::iterator param_iterator
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
param_iterator param_begin()
const ParmVarDecl * getNonObjectParameter(unsigned I) const
bool isVariadic() const
Whether this function is variadic.
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
bool isDeleted() const
Whether this function has been deleted.
void setBodyContainsImmediateEscalatingExpressions(bool Set)
const TemplateArgumentList * getTemplateSpecializationArgs() const
Retrieve the template arguments used to produce this function template specialization from the primar...
FunctionEffectsRef getFunctionEffects() const
bool isTemplateInstantiation() const
Determines if the given function was instantiated from a function template.
StorageClass getStorageClass() const
Returns the storage class as written in the source.
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
static constexpr unsigned RequiredTypeAwareNewParameterCount
Count of mandatory parameters for type aware operator new.
bool isPureVirtual() const
Whether this virtual function is pure, i.e.
bool isExternC() const
Determines whether this function is a function with external, C linkage.
FunctionDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
bool isImmediateEscalating() const
void setIsDestroyingOperatorDelete(bool IsDestroyingDelete)
bool isTypeAwareOperatorNewOrDelete() const
Determine whether this is a type aware operator new or delete.
void setIsTypeAwareOperatorNewOrDelete(bool IsTypeAwareOperator=true)
bool isDefaulted() const
Whether this function is defaulted.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool isOverloadedOperator() const
Whether this function declaration represents an C++ overloaded operator, e.g., "operator+".
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
void setConstexprKind(ConstexprSpecKind CSK)
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
void setDefaulted(bool D=true)
bool isUserProvided() const
True if this method is user-declared and was not deleted or defaulted on its first declaration.
DefaultedFunctionKind getDefaultedFunctionKind() const
Determine the kind of defaulting that would be done for a given function.
QualType getDeclaredReturnType() const
Get the declared return type, which may differ from the actual return type if the return type is dedu...
bool isVirtualAsWritten() const
Whether this function is marked as virtual explicitly.
bool hasOneParamOrDefaultArgs() const
Determine whether this function has a single parameter, or multiple parameters where all but the firs...
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
size_t param_size() const
DeclarationNameInfo getNameInfo() const
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
bool isDefined(const FunctionDecl *&Definition, bool CheckForPendingFriendDefinition=false) const
Returns true if the function has a definition that does not need to be instantiated.
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
void setParams(ArrayRef< ParmVarDecl * > NewParamInfo)
bool willHaveBody() const
True if this function will eventually have a body, once it's fully parsed.
A mutable set of FunctionEffects and possibly conditions attached to them.
bool insert(const FunctionEffectWithCondition &NewEC, Conflicts &Errs)
SmallVector< Conflict > Conflicts
An immutable set of FunctionEffects and possibly conditions attached to them.
static FunctionParmPackExpr * Create(const ASTContext &Context, QualType T, ValueDecl *ParamPack, SourceLocation NameLoc, ArrayRef< ValueDecl * > Params)
Represents a prototype with parameter type info, e.g.
ExtParameterInfo getExtParameterInfo(unsigned I) const
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
unsigned getNumParams() const
bool hasTrailingReturn() const
Whether this function prototype has a trailing return type.
const QualType * param_type_iterator
QualType getParamType(unsigned i) const
bool isVariadic() const
Whether this function prototype is variadic.
ExtProtoInfo getExtProtoInfo() const
Expr * getNoexceptExpr() const
Return the expression inside noexcept(expression), or a null pointer if there is none (because the ex...
ArrayRef< QualType > getParamTypes() const
ArrayRef< QualType > exceptions() const
bool hasExtParameterInfos() const
Is there any interesting extra information for any of the parameters of this function type?
Declaration of a template function.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
Wrapper for source info for functions.
unsigned getNumParams() const
ParmVarDecl * getParam(unsigned i) const
void setParam(unsigned i, ParmVarDecl *VD)
TypeLoc getReturnLoc() const
ExtInfo withCallingConv(CallingConv cc) const
FunctionType - C99 6.7.5.3 - Function Declarators.
CallingConv getCallConv() const
QualType getReturnType() const
One of these records is kept for each identifier that is lexed.
unsigned getLength() const
Efficiently return the length of this identifier info.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
ReservedLiteralSuffixIdStatus isReservedLiteralSuffixId() const
Determine whether this is a name reserved for future standardization or the implementation (C++ [usrl...
bool isPlaceholder() const
StringRef getName() const
Return the actual identifier string.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
IfStmt - This represents an if/then/else.
RAII class that temporarily sets the "ignore all warnings" state on a DiagnosticsEngine and restores ...
ImaginaryLiteral - We support imaginary integer and floating point literals, like "1....
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
Represents an implicitly-generated value initialization of an object of a given type.
Represents a field injected from an anonymous union/struct into the parent scope.
ArrayRef< NamedDecl * > chain() const
void setInherited(bool I)
Description of a constructor that was inherited from a base class.
ConstructorUsingShadowDecl * getShadowDecl() const
const TypeClass * getTypePtr() const
Describes an C or C++ initializer list.
unsigned getNumInits() const
const Expr * getInit(unsigned Init) const
Describes the kind of initialization being performed, along with location information for tokens rela...
static InitializationKind CreateDefault(SourceLocation InitLoc)
Create a default initialization.
static InitializationKind CreateDirect(SourceLocation InitLoc, SourceLocation LParenLoc, SourceLocation RParenLoc)
Create a direct initialization.
static InitializationKind CreateCopy(SourceLocation InitLoc, SourceLocation EqualLoc, bool AllowExplicitConvs=false)
Create a copy initialization.
static InitializationKind CreateDirectList(SourceLocation InitLoc)
Describes the sequence of initializations required to initialize a given object or reference with a s...
ExprResult Perform(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, QualType *ResultType=nullptr)
Perform the actual initialization of the given entity based on the computed initialization sequence.
Describes an entity that is being initialized.
static InitializedEntity InitializeBase(ASTContext &Context, const CXXBaseSpecifier *Base, bool IsInheritedVirtualBase, const InitializedEntity *Parent=nullptr)
Create the initialization entity for a base class subobject.
static InitializedEntity InitializeMember(FieldDecl *Member, const InitializedEntity *Parent=nullptr)
Create the initialization entity for a member subobject.
static InitializedEntity InitializeBinding(VarDecl *Binding)
Create the initialization entity for a structured binding.
static InitializedEntity InitializeMemberFromDefaultMemberInitializer(FieldDecl *Member)
Create the initialization entity for a default member initializer.
static InitializedEntity InitializeVariable(VarDecl *Var)
Create the initialization entity for a variable.
static InitializedEntity InitializeParameter(ASTContext &Context, ParmVarDecl *Parm)
Create the initialization entity for a parameter.
static InitializedEntity InitializeMemberImplicit(FieldDecl *Member)
Create the initialization entity for a member subobject with implicit field initializer.
static InitializedEntity InitializeDelegation(QualType Type)
Create the initialization entity for a delegated constructor.
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
An lvalue reference type, per C++11 [dcl.ref].
bool isInitCapture(const LambdaCapture *Capture) const
Determine whether one of this lambda's captures is an init-capture.
capture_range captures() const
Retrieve this lambda's captures.
@ Default
Use default layout rules of the target.
static StringRef getSourceText(CharSourceRange Range, const SourceManager &SM, const LangOptions &LangOpts, bool *Invalid=nullptr)
Returns a string for the source that the range encompasses.
Represents a linkage specification.
static LinkageSpecDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation ExternLoc, SourceLocation LangLoc, LinkageSpecLanguageIDs Lang, bool HasBraces)
void setRBraceLoc(SourceLocation L)
A class for iterating through a result set and possibly filtering out results.
void erase()
Erase the last element returned from this iterator.
Represents the results of name lookup.
LLVM_ATTRIBUTE_REINITIALIZES void clear()
Clears out any current state.
void addDecl(NamedDecl *D)
Add a declaration to these results with its natural access.
bool empty() const
Return true if no decls were found.
void resolveKind()
Resolves the result kind of the lookup, possibly hiding decls.
SourceLocation getNameLoc() const
Gets the location of the identifier.
Filter makeFilter()
Create a filter for this result set.
NamedDecl * getFoundDecl() const
Fetch the unique decl found by this lookup.
bool isSingleResult() const
Determines if this names a single result which is not an unresolved value using decl.
UnresolvedSetImpl::iterator iterator
NamedDecl * getRepresentativeDecl() const
Fetches a representative decl. Useful for lazy diagnostics.
static bool isVisible(Sema &SemaRef, NamedDecl *D)
Determine whether the given declaration is visible to the program.
An instance of this class represents the declaration of a property member.
static MSPropertyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName N, QualType T, TypeSourceInfo *TInfo, SourceLocation StartL, IdentifierInfo *Getter, IdentifierInfo *Setter)
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
SourceLocation getExprLoc() const LLVM_READONLY
Wrapper for source info for member pointers.
A pointer to member type per C++ 8.3.3 - Pointers to members.
Describes a module or submodule.
StringRef getTopLevelModuleName() const
Retrieve the name of the top-level module.
bool isExplicitGlobalModule() const
This represents a decl that may have a name.
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
bool isPlaceholderVar(const LangOptions &LangOpts) const
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
void setModulePrivate()
Specify that this declaration was marked as being private to the module in which it was defined.
Represents a C++ namespace alias.
static NamespaceAliasDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation NamespaceLoc, SourceLocation AliasLoc, IdentifierInfo *Alias, NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc, NamespaceBaseDecl *Namespace)
Represents C++ namespaces and their aliases.
NamespaceDecl * getNamespace()
Represent a C++ namespace.
bool isInline() const
Returns true if this is an inline namespace declaration.
static NamespaceDecl * Create(ASTContext &C, DeclContext *DC, bool Inline, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, NamespaceDecl *PrevDecl, bool Nested)
NamespaceDecl * getAnonymousNamespace() const
Retrieve the anonymous namespace that inhabits this namespace, if any.
void setRBraceLoc(SourceLocation L)
Class that aids in the construction of nested-name-specifiers along with source-location information ...
void MakeTrivial(ASTContext &Context, NestedNameSpecifier Qualifier, SourceRange R)
Make a new nested-name-specifier from incomplete source-location information.
A C++ nested-name-specifier augmented with source location information.
NestedNameSpecifier getNestedNameSpecifier() const
Retrieve the nested-name-specifier to which this instance refers.
SourceRange getSourceRange() const LLVM_READONLY
Retrieve the source range covering the entirety of this nested-name-specifier.
TypeLoc getAsTypeLoc() const
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
NestedNameSpecifier getCanonical() const
Retrieves the "canonical" nested name specifier for a given nested name specifier.
bool containsUnexpandedParameterPack() const
Whether this nested-name-specifier contains an unexpanded parameter pack (for C++11 variadic template...
CXXRecordDecl * getAsRecordDecl() const
Retrieve the record declaration stored in this nested name specifier, or null.
bool isDependent() const
Whether this nested name specifier refers to a dependent type or not.
const Type * getAsType() const
@ Global
The global specifier '::'. There is no stored value.
@ Type
A type, stored as a Type*.
@ Namespace
A namespace-like entity, stored as a NamespaceBaseDecl*.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
The basic abstraction for the target Objective-C runtime.
bool isFragile() const
The inverse of isNonFragile(): does this runtime follow the set of implied behaviors for a "fragile" ...
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
@ CSK_Normal
Normal lookup.
@ CSK_Operator
C++ [over.match.oper]: Lookup of operator function candidates in a call using operator syntax.
SmallVectorImpl< OverloadCandidate >::iterator iterator
A single parameter index whose accessors require each use to make explicit the parameter index encodi...
static ParenListExpr * Create(const ASTContext &Ctx, SourceLocation LParenLoc, ArrayRef< Expr * > Exprs, SourceLocation RParenLoc)
Create a paren list.
Represents a parameter to a function.
void setDefaultArg(Expr *defarg)
void setUnparsedDefaultArg()
Specify that this parameter has an unparsed default argument.
bool hasUnparsedDefaultArg() const
Determines whether this parameter has a default argument that has not yet been parsed.
SourceRange getDefaultArgRange() const
Retrieve the source range that covers the entire default argument.
void setUninstantiatedDefaultArg(Expr *arg)
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
bool hasUninstantiatedDefaultArg() const
bool hasInheritedDefaultArg() const
static ParmVarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S, Expr *DefArg)
Expr * getUninstantiatedDefaultArg()
bool hasDefaultArg() const
Determines whether this parameter has a default argument, either parsed or not.
void setHasInheritedDefaultArg(bool I=true)
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
ParsedAttr - Represents a syntactic attribute.
IdentifierInfo * getPropertyDataSetter() const
IdentifierInfo * getPropertyDataGetter() const
static const ParsedAttributesView & none()
const ParsedAttr * getMSPropertyAttr() const
bool hasAttribute(ParsedAttr::Kind K) const
bool isAddressDiscriminated() const
Wrapper for source info for pointers.
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
IdentifierInfo * getIdentifierInfo(StringRef Name) const
Return information about the specified preprocessor identifier token.
IdentifierTable & getIdentifierTable()
ArrayRef< Expr * > semantics()
A (possibly-)qualified type.
bool hasAddressDiscriminatedPointerAuth() const
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool hasQualifiers() const
Determine whether this type has any qualifiers.
PointerAuthQualifier getPointerAuth() const
QualType getLocalUnqualifiedType() const
Return this type with all of the instance-specific qualifiers removed, but without removing any quali...
void addConst()
Add the const type qualifier to this QualType.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
unsigned getLocalCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers local to this particular QualType instan...
bool isConstQualified() const
Determine whether this type is const-qualified.
unsigned getCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers applied to this type.
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
bool hasNonTrivialObjCLifetime() const
bool isPODType(const ASTContext &Context) const
Determine whether this is a Plain Old Data (POD) type (C++ 3.9p10).
bool isAtLeastAsQualifiedAs(QualType Other, const ASTContext &Ctx) const
Determine whether this type is at least as qualified as the other given type, requiring exact equalit...
Represents a template name as written in source code.
The collection of all-type qualifiers we support.
void removeCVRQualifiers(unsigned mask)
void addAddressSpace(LangAS space)
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
@ OCL_Weak
Reading or writing from this object requires a barrier call.
void removeAddressSpace()
LangAS getAddressSpace() const
void setObjCLifetime(ObjCLifetime type)
An rvalue reference type, per C++11 [dcl.ref].
Represents a struct/union/class.
bool hasFlexibleArrayMember() const
bool hasObjectMember() const
field_iterator field_end() const
field_range fields() const
specific_decl_iterator< FieldDecl > field_iterator
RecordDecl * getDefinitionOrSelf() const
bool isAnonymousStructOrUnion() const
Whether this is an anonymous struct or union.
field_iterator field_begin() const
RedeclarableTemplateDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
void setPreviousDecl(decl_type *PrevDecl)
Set the previous declaration.
Base for LValueReferenceType and RValueReferenceType.
QualType getPointeeType() const
Scope - A scope is a transient data structure that is used while parsing the program.
void setEntity(DeclContext *E)
const Scope * getFnParent() const
getFnParent - Return the closest scope that is a function body.
unsigned getFlags() const
getFlags - Return the flags for this scope.
bool isDeclScope(const Decl *D) const
isDeclScope - Return true if this is the scope that the specified decl is declared in.
DeclContext * getEntity() const
Get the entity corresponding to this scope.
const Scope * getParent() const
getParent - Return the scope that this is nested in.
@ DeclScope
This is a scope that can contain a declaration.
void PushUsingDirective(UsingDirectiveDecl *UDir)
A generic diagnostic builder for errors which may or may not be deferred.
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
SemaDiagnosticBuilder DiagCompat(SourceLocation Loc, unsigned CompatDiagId)
Emit a compatibility diagnostic.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
A RAII object to enter scope of a compound statement.
Records and restores the CurFPFeatures state on entry/exit of compound statements.
Helper class that collects exception specifications for implicitly-declared special member functions.
void CalledStmt(Stmt *S)
Integrate an invoked statement into the collected data.
void CalledExpr(Expr *E)
Integrate an invoked expression into the collected data.
void CalledDecl(SourceLocation CallLoc, const CXXMethodDecl *Method)
Integrate another called method into the collected data.
SpecialMemberOverloadResult - The overloading result for a special member function.
CXXMethodDecl * getMethod() const
RAII object to handle the state changes required to synthesize a function body.
Abstract base class used for diagnosing integer constant expression violations.
Sema - This implements semantic analysis and AST building for C.
void DefineImplicitLambdaToFunctionPointerConversion(SourceLocation CurrentLoc, CXXConversionDecl *Conv)
Define the "body" of the conversion from a lambda object to a function pointer.
QualType SubstAutoType(QualType TypeWithAuto, QualType Replacement)
Substitute Replacement for auto in TypeWithAuto.
CXXConstructorDecl * DeclareImplicitDefaultConstructor(CXXRecordDecl *ClassDecl)
Declare the implicit default constructor for the given class.
bool MergeCXXFunctionDecl(FunctionDecl *New, FunctionDecl *Old, Scope *S)
MergeCXXFunctionDecl - Merge two declarations of the same C++ function, once we already know that the...
Attr * getImplicitCodeSegOrSectionAttrForFunction(const FunctionDecl *FD, bool IsDefinition)
Returns an implicit CodeSegAttr if a __declspec(code_seg) is found on a containing class.
MemInitResult BuildDelegatingInitializer(TypeSourceInfo *TInfo, Expr *Init, CXXRecordDecl *ClassDecl)
void CheckTypedefForVariablyModifiedType(Scope *S, TypedefNameDecl *D)
QualType getCurrentThisType()
Try to retrieve the type of the 'this' pointer.
bool CheckSpecifiedExceptionType(QualType &T, SourceRange Range)
CheckSpecifiedExceptionType - Check if the given type is valid in an exception specification.
ExprResult BuildBlockForLambdaConversion(SourceLocation CurrentLocation, SourceLocation ConvLocation, CXXConversionDecl *Conv, Expr *Src)
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
sema::CapturingScopeInfo * getEnclosingLambdaOrBlock() const
Get the innermost lambda or block enclosing the current location, if any.
Decl * ActOnAliasDeclaration(Scope *CurScope, AccessSpecifier AS, MultiTemplateParamsArg TemplateParams, SourceLocation UsingLoc, UnqualifiedId &Name, const ParsedAttributesView &AttrList, TypeResult Type, Decl *DeclFromDeclSpec)
NamedDecl * ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope)
void DiagnoseAbstractType(const CXXRecordDecl *RD)
void HideUsingShadowDecl(Scope *S, UsingShadowDecl *Shadow)
Hides a using shadow declaration.
bool CheckUsingDeclQualifier(SourceLocation UsingLoc, bool HasTypename, const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, SourceLocation NameLoc, const LookupResult *R=nullptr, const UsingDecl *UD=nullptr)
Checks that the given nested-name qualifier used in a using decl in the current context is appropriat...
bool CheckExplicitObjectOverride(CXXMethodDecl *New, const CXXMethodDecl *Old)
llvm::SmallPtrSet< SpecialMemberDecl, 4 > SpecialMembersBeingDeclared
The C++ special members which we are currently in the process of declaring.
void ActOnParamUnparsedDefaultArgument(Decl *param, SourceLocation EqualLoc, SourceLocation ArgLoc)
ActOnParamUnparsedDefaultArgument - We've seen a default argument for a function parameter,...
ExprResult BuildMemberReferenceExpr(Expr *Base, QualType BaseType, SourceLocation OpLoc, bool IsArrow, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs, const Scope *S, ActOnMemberAccessExtraArgs *ExtraArgs=nullptr)
bool isDeclInScope(NamedDecl *D, DeclContext *Ctx, Scope *S=nullptr, bool AllowInlineNamespace=false) const
isDeclInScope - If 'Ctx' is a function/method, isDeclInScope returns true if 'D' is in Scope 'S',...
bool IsOverload(FunctionDecl *New, FunctionDecl *Old, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp=false)
void BuildBasePathArray(const CXXBasePaths &Paths, CXXCastPath &BasePath)
void MergeVarDeclExceptionSpecs(VarDecl *New, VarDecl *Old)
Merge the exception specifications of two variable declarations.
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupUsingDeclName
Look up all declarations in a scope with the given name, including resolved using declarations.
@ LookupLocalFriendName
Look up a friend of a local class.
@ LookupNamespaceName
Look up a namespace name within a C++ using directive or namespace alias definition,...
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
void DiagnoseSentinelCalls(const NamedDecl *D, SourceLocation Loc, ArrayRef< Expr * > Args)
DiagnoseSentinelCalls - This routine checks whether a call or message-send is to a declaration with t...
void DiagnoseFunctionSpecifiers(const DeclSpec &DS)
Diagnose function specifiers on a declaration of an identifier that does not identify a function.
Decl * BuildStaticAssertDeclaration(SourceLocation StaticAssertLoc, Expr *AssertExpr, Expr *AssertMessageExpr, SourceLocation RParenLoc, bool Failed)
void EvaluateImplicitExceptionSpec(SourceLocation Loc, FunctionDecl *FD)
Evaluate the implicit exception specification for a defaulted special member function.
void PrintContextStack(InstantiationContextDiagFuncRef DiagFunc)
ExplicitSpecifier ActOnExplicitBoolSpecifier(Expr *E)
ActOnExplicitBoolSpecifier - Build an ExplicitSpecifier from an expression found in an explicit(bool)...
bool DiagRedefinedPlaceholderFieldDecl(SourceLocation Loc, RecordDecl *ClassDecl, const IdentifierInfo *Name)
void ActOnFinishCXXNonNestedClass()
MemInitResult BuildBaseInitializer(QualType BaseType, TypeSourceInfo *BaseTInfo, Expr *Init, CXXRecordDecl *ClassDecl, SourceLocation EllipsisLoc)
bool FindDeallocationFunction(SourceLocation StartLoc, CXXRecordDecl *RD, DeclarationName Name, FunctionDecl *&Operator, ImplicitDeallocationParameters, bool Diagnose=true)
void ForceDeclarationOfImplicitMembers(CXXRecordDecl *Class)
Force the declaration of any implicitly-declared members of this class.
void ActOnParamDefaultArgumentError(Decl *param, SourceLocation EqualLoc, Expr *DefaultArg)
ActOnParamDefaultArgumentError - Parsing or semantic analysis of the default argument for the paramet...
bool diagnoseQualifiedDeclaration(CXXScopeSpec &SS, DeclContext *DC, DeclarationName Name, SourceLocation Loc, TemplateIdAnnotation *TemplateId, bool IsMemberSpecialization)
Diagnose a declaration whose declarator-id has the given nested-name-specifier.
void DiagnoseStaticAssertDetails(const Expr *E)
Try to print more useful information about a failed static_assert with expression \E.
void DefineImplicitMoveAssignment(SourceLocation CurrentLocation, CXXMethodDecl *MethodDecl)
Defines an implicitly-declared move assignment operator.
void ActOnFinishDelayedMemberInitializers(Decl *Record)
ExprResult CreateBuiltinBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr, bool ForFoldExpression=false)
CreateBuiltinBinOp - Creates a new built-in binary operation with operator Opc at location TokLoc.
NamedDecl * ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope, ArrayRef< BindingDecl * > Bindings={})
void CheckDelegatingCtorCycles()
SmallVector< CXXMethodDecl *, 4 > DelayedDllExportMemberFunctions
void CheckExplicitObjectMemberFunction(Declarator &D, DeclarationName Name, QualType R, bool IsLambda, DeclContext *DC=nullptr)
bool DiagnoseClassNameShadow(DeclContext *DC, DeclarationNameInfo Info)
DiagnoseClassNameShadow - Implement C++ [class.mem]p13: If T is the name of a class,...
AccessResult CheckFriendAccess(NamedDecl *D)
Checks access to the target of a friend declaration.
void MarkBaseAndMemberDestructorsReferenced(SourceLocation Loc, CXXRecordDecl *Record)
MarkBaseAndMemberDestructorsReferenced - Given a record decl, mark all the non-trivial destructors of...
const TranslationUnitKind TUKind
The kind of translation unit we are processing.
QualType tryBuildStdTypeIdentity(QualType Type, SourceLocation Loc)
Looks for the std::type_identity template and instantiates it with Type, or returns a null type if ty...
DeclResult ActOnCXXConditionDeclaration(Scope *S, Declarator &D)
ActOnCXXConditionDeclarationExpr - Parsed a condition declaration of a C++ if/switch/while/for statem...
void LookupOverloadedBinOp(OverloadCandidateSet &CandidateSet, OverloadedOperatorKind Op, const UnresolvedSetImpl &Fns, ArrayRef< Expr * > Args, bool RequiresADL=true)
Perform lookup for an overloaded binary operator.
DelegatingCtorDeclsType DelegatingCtorDecls
All the delegating constructors seen so far in the file, used for cycle detection at the end of the T...
bool ActOnAccessSpecifier(AccessSpecifier Access, SourceLocation ASLoc, SourceLocation ColonLoc, const ParsedAttributesView &Attrs)
ActOnAccessSpecifier - Parsed an access specifier followed by a colon.
std::unique_ptr< CXXFieldCollector > FieldCollector
FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
void AddPragmaAttributes(Scope *S, Decl *D)
Adds the attributes that have been specified using the '#pragma clang attribute push' directives to t...
TemplateDecl * AdjustDeclIfTemplate(Decl *&Decl)
AdjustDeclIfTemplate - If the given decl happens to be a template, reset the parameter D to reference...
bool isImplicitlyDeleted(FunctionDecl *FD)
Determine whether the given function is an implicitly-deleted special member function.
void CheckImplicitSpecialMemberDeclaration(Scope *S, FunctionDecl *FD)
Check a completed declaration of an implicit special member.
void PushExpressionEvaluationContext(ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl=nullptr, ExpressionEvaluationContextRecord::ExpressionKind Type=ExpressionEvaluationContextRecord::EK_Other)
bool CompleteConstructorCall(CXXConstructorDecl *Constructor, QualType DeclInitType, MultiExprArg ArgsPtr, SourceLocation Loc, SmallVectorImpl< Expr * > &ConvertedArgs, bool AllowExplicit=false, bool IsListInitialization=false)
Given a constructor and the set of arguments provided for the constructor, convert the arguments and ...
@ Boolean
A boolean condition, from 'if', 'while', 'for', or 'do'.
bool RequireCompleteDeclContext(CXXScopeSpec &SS, DeclContext *DC)
Require that the context specified by SS be complete.
bool TemplateParameterListsAreEqual(const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New, const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain, TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc=SourceLocation())
Determine whether the given template parameter lists are equivalent.
Decl * ActOnNamespaceAliasDef(Scope *CurScope, SourceLocation NamespaceLoc, SourceLocation AliasLoc, IdentifierInfo *Alias, CXXScopeSpec &SS, SourceLocation IdentLoc, IdentifierInfo *Ident)
void CheckOverrideControl(NamedDecl *D)
CheckOverrideControl - Check C++11 override control semantics.
bool GatherArgumentsForCall(SourceLocation CallLoc, FunctionDecl *FDecl, const FunctionProtoType *Proto, unsigned FirstParam, ArrayRef< Expr * > Args, SmallVectorImpl< Expr * > &AllArgs, VariadicCallType CallType=VariadicCallType::DoesNotApply, bool AllowExplicit=false, bool IsListInitialization=false)
GatherArgumentsForCall - Collector argument expressions for various form of call prototypes.
bool ShouldDeleteSpecialMember(CXXMethodDecl *MD, CXXSpecialMemberKind CSM, InheritedConstructorInfo *ICI=nullptr, bool Diagnose=false)
Determine if a special member function should have a deleted definition when it is defaulted.
Scope * getScopeForContext(DeclContext *Ctx)
Determines the active Scope associated with the given declaration context.
CXXConstructorDecl * DeclareImplicitMoveConstructor(CXXRecordDecl *ClassDecl)
Declare the implicit move constructor for the given class.
bool ProcessAccessDeclAttributeList(AccessSpecDecl *ASDecl, const ParsedAttributesView &AttrList)
Annotation attributes are the only attributes allowed after an access specifier.
PragmaStack< FPOptionsOverride > FpPragmaStack
FunctionDecl * InstantiateFunctionDeclaration(FunctionTemplateDecl *FTD, const TemplateArgumentList *Args, SourceLocation Loc, CodeSynthesisContext::SynthesisKind CSC=CodeSynthesisContext::ExplicitTemplateArgumentSubstitution)
Instantiate (or find existing instantiation of) a function template with a given set of template argu...
void SetFunctionBodyKind(Decl *D, SourceLocation Loc, FnBodyKind BodyKind, StringLiteral *DeletedMessage=nullptr)
void referenceDLLExportedClassMethods()
void CheckCompleteDestructorVariant(SourceLocation CurrentLocation, CXXDestructorDecl *Dtor)
Do semantic checks to allow the complete destructor variant to be emitted when the destructor is defi...
NamedDecl * ActOnCXXMemberDeclarator(Scope *S, AccessSpecifier AS, Declarator &D, MultiTemplateParamsArg TemplateParameterLists, Expr *BitfieldWidth, const VirtSpecifiers &VS, InClassInitStyle InitStyle)
ActOnCXXMemberDeclarator - This is invoked when a C++ class member declarator is parsed.
bool CheckIfOverriddenFunctionIsMarkedFinal(const CXXMethodDecl *New, const CXXMethodDecl *Old)
CheckIfOverriddenFunctionIsMarkedFinal - Checks whether a virtual member function overrides a virtual...
NamedDecl * HandleDeclarator(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParameterLists)
bool CheckOverridingFunctionAttributes(CXXMethodDecl *New, const CXXMethodDecl *Old)
TemplateParameterList * MatchTemplateParametersToScopeSpecifier(SourceLocation DeclStartLoc, SourceLocation DeclLoc, const CXXScopeSpec &SS, TemplateIdAnnotation *TemplateId, ArrayRef< TemplateParameterList * > ParamLists, bool IsFriend, bool &IsMemberSpecialization, bool &Invalid, bool SuppressDiagnostic=false)
Match the given template parameter lists to the given scope specifier, returning the template paramet...
void handleTagNumbering(const TagDecl *Tag, Scope *TagScope)
void AddImplicitlyDeclaredMembersToClass(CXXRecordDecl *ClassDecl)
AddImplicitlyDeclaredMembersToClass - Adds any implicitly-declared special functions,...
bool tryResolveExplicitSpecifier(ExplicitSpecifier &ExplicitSpec)
tryResolveExplicitSpecifier - Attempt to resolve the explict specifier.
Decl * ActOnConversionDeclarator(CXXConversionDecl *Conversion)
ActOnConversionDeclarator - Called by ActOnDeclarator to complete the declaration of the given C++ co...
bool IsCXXTriviallyRelocatableType(QualType T)
Determines if a type is trivially relocatable according to the C++26 rules.
@ Other
C++26 [dcl.fct.def.general]p1 function-body: ctor-initializer[opt] compound-statement function-try-bl...
@ Delete
deleted-function-body
QualType BuildStdInitializerList(QualType Element, SourceLocation Loc)
Looks for the std::initializer_list template and instantiates it with Element, or emits an error if i...
MemInitResult BuildMemberInitializer(ValueDecl *Member, Expr *Init, SourceLocation IdLoc)
StmtResult ActOnExprStmt(ExprResult Arg, bool DiscardedValue=true)
FieldDecl * HandleField(Scope *S, RecordDecl *TagD, SourceLocation DeclStart, Declarator &D, Expr *BitfieldWidth, InClassInitStyle InitStyle, AccessSpecifier AS)
HandleField - Analyze a field of a C struct or a C++ data member.
FPOptionsOverride CurFPFeatureOverrides()
void DiagnoseHiddenVirtualMethods(CXXMethodDecl *MD)
Diagnose methods which overload virtual methods in a base class without overriding any.
UsingShadowDecl * BuildUsingShadowDecl(Scope *S, BaseUsingDecl *BUD, NamedDecl *Target, UsingShadowDecl *PrevDecl)
Builds a shadow declaration corresponding to a 'using' declaration.
ExprResult BuildCallToMemberFunction(Scope *S, Expr *MemExpr, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallToMemberFunction - Build a call to a member function.
FunctionDecl * FindDeallocationFunctionForDestructor(SourceLocation StartLoc, CXXRecordDecl *RD, bool Diagnose, bool LookForGlobal, DeclarationName Name)
NamedDecl * LookupSingleName(Scope *S, DeclarationName Name, SourceLocation Loc, LookupNameKind NameKind, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)
Look up a name, looking for a single declaration.
bool isMemberAccessibleForDeletion(CXXRecordDecl *NamingClass, DeclAccessPair Found, QualType ObjectType, SourceLocation Loc, const PartialDiagnostic &Diag)
Is the given member accessible for the purposes of deciding whether to define a special member functi...
BaseResult ActOnBaseSpecifier(Decl *classdecl, SourceRange SpecifierRange, const ParsedAttributesView &Attrs, bool Virtual, AccessSpecifier Access, ParsedType basetype, SourceLocation BaseLoc, SourceLocation EllipsisLoc)
ActOnBaseSpecifier - Parsed a base specifier.
void ActOnFinishFunctionDeclarationDeclarator(Declarator &D)
Called after parsing a function declarator belonging to a function declaration.
void ActOnParamDefaultArgument(Decl *param, SourceLocation EqualLoc, Expr *defarg)
ActOnParamDefaultArgument - Check whether the default argument provided for a function parameter is w...
void CheckConversionDeclarator(Declarator &D, QualType &R, StorageClass &SC)
CheckConversionDeclarator - Called by ActOnDeclarator to check the well-formednes of the conversion f...
bool DeduceReturnType(FunctionDecl *FD, SourceLocation Loc, bool Diagnose=true)
void ActOnFinishDelayedCXXMethodDeclaration(Scope *S, Decl *Method)
ActOnFinishDelayedCXXMethodDeclaration - We have finished processing the delayed method declaration f...
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReceiver=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
DeclarationNameInfo GetNameForDeclarator(Declarator &D)
GetNameForDeclarator - Determine the full declaration name for the given Declarator.
DiagnosticsEngine & getDiagnostics() const
void DiagnoseTypeTraitDetails(const Expr *E)
If E represents a built-in type trait, or a known standard type trait, try to print more information ...
AccessResult CheckDestructorAccess(SourceLocation Loc, CXXDestructorDecl *Dtor, const PartialDiagnostic &PDiag, QualType objectType=QualType())
bool isStdTypeIdentity(QualType Ty, QualType *TypeArgument, const Decl **MalformedDecl=nullptr)
Tests whether Ty is an instance of std::type_identity and, if it is and TypeArgument is not NULL,...
void propagateDLLAttrToBaseClassTemplate(CXXRecordDecl *Class, Attr *ClassAttr, ClassTemplateSpecializationDecl *BaseTemplateSpec, SourceLocation BaseLoc)
Perform propagation of DLL attributes from a derived class to a templated base class for MS compatibi...
bool SpecialMemberIsTrivial(CXXMethodDecl *MD, CXXSpecialMemberKind CSM, TrivialABIHandling TAH=TrivialABIHandling::IgnoreTrivialABI, bool Diagnose=false)
Determine whether a defaulted or deleted special member function is trivial, as specified in C++11 [c...
NamedDecl * ActOnFriendFunctionDecl(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParams)
void setTagNameForLinkagePurposes(TagDecl *TagFromDeclSpec, TypedefNameDecl *NewTD)
void CheckDelayedMemberExceptionSpecs()
void ActOnReenterCXXMethodParameter(Scope *S, ParmVarDecl *Param)
This is used to implement the constant expression evaluation part of the attribute enable_if extensio...
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
void CleanupVarDeclMarking()
ASTContext & getASTContext() const
ClassTemplateDecl * StdInitializerList
The C++ "std::initializer_list" template, which is defined in <initializer_list>.
CXXDestructorDecl * LookupDestructor(CXXRecordDecl *Class)
Look for the destructor of the given class.
void CheckExplicitlyDefaultedFunction(Scope *S, FunctionDecl *MD)
bool isCurrentClassName(const IdentifierInfo &II, Scope *S, const CXXScopeSpec *SS=nullptr)
isCurrentClassName - Determine whether the identifier II is the name of the class type currently bein...
void MarkVariableReferenced(SourceLocation Loc, VarDecl *Var)
Mark a variable referenced, and check whether it is odr-used (C++ [basic.def.odr]p2,...
void checkExceptionSpecification(bool IsTopLevel, ExceptionSpecificationType EST, ArrayRef< ParsedType > DynamicExceptions, ArrayRef< SourceRange > DynamicExceptionRanges, Expr *NoexceptExpr, SmallVectorImpl< QualType > &Exceptions, FunctionProtoType::ExceptionSpecInfo &ESI)
Check the given exception-specification and update the exception specification information with the r...
SmallVector< std::pair< FunctionDecl *, FunctionDecl * >, 2 > DelayedEquivalentExceptionSpecChecks
All the function redeclarations seen during a class definition that had their exception spec checks d...
bool checkThisInStaticMemberFunctionType(CXXMethodDecl *Method)
Check whether 'this' shows up in the type of a static member function after the (naturally empty) cv-...
void PopExpressionEvaluationContext()
NamespaceDecl * getOrCreateStdNamespace()
Retrieve the special "std" namespace, which may require us to implicitly define the namespace.
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
bool isInitListConstructor(const FunctionDecl *Ctor)
Determine whether Ctor is an initializer-list constructor, as defined in [dcl.init....
void ActOnStartFunctionDeclarationDeclarator(Declarator &D, unsigned TemplateParameterDepth)
Called before parsing a function declarator belonging to a function declaration.
std::string getAmbiguousPathsDisplayString(CXXBasePaths &Paths)
Builds a string representing ambiguous paths from a specific derived class to different subobjects of...
OverloadKind CheckOverload(Scope *S, FunctionDecl *New, const LookupResult &OldDecls, NamedDecl *&OldDecl, bool UseMemberUsingDeclRules)
Determine whether the given New declaration is an overload of the declarations in Old.
bool RequireLiteralType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
Ensure that the type T is a literal type.
llvm::PointerIntPair< CXXRecordDecl *, 3, CXXSpecialMemberKind > SpecialMemberDecl
void ActOnStartCXXInClassMemberInitializer()
Enter a new C++ default initializer scope.
ValueDecl * tryLookupCtorInitMemberDecl(CXXRecordDecl *ClassDecl, CXXScopeSpec &SS, ParsedType TemplateTypeTy, IdentifierInfo *MemberOrBase)
NamedDecl * BuildUsingDeclaration(Scope *S, AccessSpecifier AS, SourceLocation UsingLoc, bool HasTypenameKeyword, SourceLocation TypenameLoc, CXXScopeSpec &SS, DeclarationNameInfo NameInfo, SourceLocation EllipsisLoc, const ParsedAttributesView &AttrList, bool IsInstantiation, bool IsUsingIfExists)
Builds a using declaration.
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
bool pushCodeSynthesisContext(CodeSynthesisContext Ctx)
DeclRefExpr * BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK, SourceLocation Loc, const CXXScopeSpec *SS=nullptr)
void DefineImplicitMoveConstructor(SourceLocation CurrentLocation, CXXConstructorDecl *Constructor)
DefineImplicitMoveConstructor - Checks for feasibility of defining this constructor as the move const...
@ TPL_TemplateMatch
We are matching the template parameter lists of two templates that might be redeclarations.
EnumDecl * getStdAlignValT() const
void ActOnFinishDelayedMemberDeclarations(Scope *S, Decl *Record)
LangAS getDefaultCXXMethodAddrSpace() const
Returns default addr space for method qualifiers.
LazyDeclPtr StdBadAlloc
The C++ "std::bad_alloc" class, which is defined by the C++ standard library.
QualType BuildQualifiedType(QualType T, SourceLocation Loc, Qualifiers Qs, const DeclSpec *DS=nullptr)
void PushFunctionScope()
Enter a new function scope.
void SetDeclDefaulted(Decl *dcl, SourceLocation DefaultLoc)
void DefineImplicitCopyConstructor(SourceLocation CurrentLocation, CXXConstructorDecl *Constructor)
DefineImplicitCopyConstructor - Checks for feasibility of defining this constructor as the copy const...
FPOptions & getCurFPFeatures()
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
ConditionResult ActOnCondition(Scope *S, SourceLocation Loc, Expr *SubExpr, ConditionKind CK, bool MissingOK=false)
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
@ UPPC_UsingDeclaration
A using declaration.
@ UPPC_ExceptionType
The type of an exception.
@ UPPC_Initializer
An initializer.
@ UPPC_BaseType
The base type of a class type.
@ UPPC_FriendDeclaration
A friend declaration.
@ UPPC_DefaultArgument
A default argument.
@ UPPC_DeclarationType
The type of an arbitrary declaration.
@ UPPC_DataMemberType
The type of a data member.
@ UPPC_StaticAssertExpression
The expression in a static assertion.
Decl * ActOnStartNamespaceDef(Scope *S, SourceLocation InlineLoc, SourceLocation NamespaceLoc, SourceLocation IdentLoc, IdentifierInfo *Ident, SourceLocation LBrace, const ParsedAttributesView &AttrList, UsingDirectiveDecl *&UsingDecl, bool IsNested)
ActOnStartNamespaceDef - This is called at the start of a namespace definition.
const LangOptions & getLangOpts() const
void DiagnoseTemplateParameterShadow(SourceLocation Loc, Decl *PrevDecl, bool SupportedForCompatibility=false)
DiagnoseTemplateParameterShadow - Produce a diagnostic complaining that the template parameter 'PrevD...
TypoCorrection CorrectTypo(const DeclarationNameInfo &Typo, Sema::LookupNameKind LookupKind, Scope *S, CXXScopeSpec *SS, CorrectionCandidateCallback &CCC, CorrectTypoKind Mode, DeclContext *MemberContext=nullptr, bool EnteringContext=false, const ObjCObjectPointerType *OPT=nullptr, bool RecordFailure=true)
Try to "correct" a typo in the source code by finding visible declarations whose names are similar to...
QualType CheckComparisonCategoryType(ComparisonCategoryType Kind, SourceLocation Loc, ComparisonCategoryUsage Usage)
Lookup the specified comparison category types in the standard library, an check the VarDecls possibl...
void DiagnoseAbsenceOfOverrideControl(NamedDecl *D, bool Inconsistent)
DiagnoseAbsenceOfOverrideControl - Diagnose if 'override' keyword was not used in the declaration of ...
SmallVector< VTableUse, 16 > VTableUses
The list of vtables that are required but have not yet been materialized.
PoppedFunctionScopePtr PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, Decl *D=nullptr, QualType BlockType=QualType())
Pop a function (or block or lambda or captured region) scope from the stack.
AccessResult CheckStructuredBindingMemberAccess(SourceLocation UseLoc, CXXRecordDecl *DecomposedClass, DeclAccessPair Field)
Checks implicit access to a member in a structured binding.
void EnterTemplatedContext(Scope *S, DeclContext *DC)
Enter a template parameter scope, after it's been associated with a particular DeclContext.
void ActOnBaseSpecifiers(Decl *ClassDecl, MutableArrayRef< CXXBaseSpecifier * > Bases)
ActOnBaseSpecifiers - Attach the given base specifiers to the class, after checking whether there are...
const FunctionProtoType * ResolveExceptionSpec(SourceLocation Loc, const FunctionProtoType *FPT)
void NoteTemplateLocation(const NamedDecl &Decl, std::optional< SourceRange > ParamRange={})
void DefineDefaultedComparison(SourceLocation Loc, FunctionDecl *FD, DefaultedComparisonKind DCK)
bool isEquivalentInternalLinkageDeclaration(const NamedDecl *A, const NamedDecl *B)
Determine if A and B are equivalent internal linkage declarations from different modules,...
bool LookupParsedName(LookupResult &R, Scope *S, CXXScopeSpec *SS, QualType ObjectType, bool AllowBuiltinCreation=false, bool EnteringContext=false)
Performs name lookup for a name that was parsed in the source code, and may contain a C++ scope speci...
bool CheckConstexprFunctionDefinition(const FunctionDecl *FD, CheckConstexprKind Kind)
ExprResult BuildCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallExpr - Handle a call to Fn with the specified array of arguments.
AccessResult CheckBaseClassAccess(SourceLocation AccessLoc, QualType Base, QualType Derived, const CXXBasePath &Path, unsigned DiagID, bool ForceCheck=false, bool ForceUnprivileged=false)
Checks access for a hierarchy conversion.
bool DiagnoseUnexpandedParameterPack(SourceLocation Loc, TypeSourceInfo *T, UnexpandedParameterPackContext UPPC)
If the given type contains an unexpanded parameter pack, diagnose the error.
bool RequireNonAbstractType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
bool BuildCtorClosureDefaultArgs(SourceLocation Loc, CXXConstructorDecl *Ctor, bool IsCopy=false)
NamedDecl * getShadowedDeclaration(const TypedefNameDecl *D, const LookupResult &R)
Return the declaration shadowed by the given typedef D, or null if it doesn't shadow any declaration ...
void AddBuiltinOperatorCandidates(OverloadedOperatorKind Op, SourceLocation OpLoc, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
AddBuiltinOperatorCandidates - Add the appropriate built-in operator overloads to the candidate set (...
void CheckExtraCXXDefaultArguments(Declarator &D)
CheckExtraCXXDefaultArguments - Check for any extra default arguments in the declarator,...
void CheckCompleteDecompositionDeclaration(DecompositionDecl *DD)
void checkClassLevelDLLAttribute(CXXRecordDecl *Class)
Check class-level dllimport/dllexport attribute.
const LangOptions & LangOpts
std::pair< Expr *, std::string > findFailedBooleanCondition(Expr *Cond)
Find the failed Boolean condition within a given Boolean constant expression, and describe it with a ...
void DiagnoseReturnInConstructorExceptionHandler(CXXTryStmt *TryBlock)
void MarkVirtualMembersReferenced(SourceLocation Loc, const CXXRecordDecl *RD, bool ConstexprOnly=false)
MarkVirtualMembersReferenced - Will mark all members of the given CXXRecordDecl referenced.
ExprResult CheckForImmediateInvocation(ExprResult E, FunctionDecl *Decl)
Wrap the expression in a ConstantExpr if it is a potential immediate invocation.
ExprResult TemporaryMaterializationConversion(Expr *E)
If E is a prvalue denoting an unmaterialized temporary, materialize it as an xvalue.
NamedDeclSetType UnusedPrivateFields
Set containing all declared private fields that are not used.
void DefineInheritingConstructor(SourceLocation UseLoc, CXXConstructorDecl *Constructor)
Define the specified inheriting constructor.
bool CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD, LookupResult &Previous, bool IsMemberSpecialization, bool DeclIsDefn)
Perform semantic checking of a new function declaration.
CXXRecordDecl * getStdBadAlloc() const
QualType CheckDestructorDeclarator(Declarator &D, QualType R, StorageClass &SC)
CheckDestructorDeclarator - Called by ActOnDeclarator to check the well-formednes of the destructor d...
bool CheckPureMethod(CXXMethodDecl *Method, SourceRange InitRange)
Mark the given method pure.
void SetParamDefaultArgument(ParmVarDecl *Param, Expr *DefaultArg, SourceLocation EqualLoc)
void NoteHiddenVirtualMethods(CXXMethodDecl *MD, SmallVectorImpl< CXXMethodDecl * > &OverloadedMethods)
CXXMethodDecl * DeclareImplicitMoveAssignment(CXXRecordDecl *ClassDecl)
Declare the implicit move assignment operator for the given class.
QualType CheckTypenameType(ElaboratedTypeKeyword Keyword, SourceLocation KeywordLoc, NestedNameSpecifierLoc QualifierLoc, const IdentifierInfo &II, SourceLocation IILoc, TypeSourceInfo **TSI, bool DeducedTSTContext)
llvm::DenseMap< CXXRecordDecl *, bool > VTablesUsed
The set of classes whose vtables have been used within this translation unit, and a bit that will be ...
void CheckCXXDefaultArguments(FunctionDecl *FD)
Helpers for dealing with blocks and functions.
@ DefaultedOperator
A defaulted 'operator<=>' needed the comparison category.
SmallVector< InventedTemplateParameterInfo, 4 > InventedParameterInfos
Stack containing information needed when in C++2a an 'auto' is encountered in a function declaration ...
void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse)
Perform marking for a reference to an arbitrary declaration.
void ProcessDeclAttributeList(Scope *S, Decl *D, const ParsedAttributesView &AttrList, const ProcessDeclAttributeOptions &Options=ProcessDeclAttributeOptions())
ProcessDeclAttributeList - Apply all the decl attributes in the specified attribute list to the speci...
void MarkVTableUsed(SourceLocation Loc, CXXRecordDecl *Class, bool DefinitionRequired=false)
Note that the vtable for the given class was used at the given location.
NamedDecl * BuildUsingEnumDeclaration(Scope *S, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation EnumLoc, SourceLocation NameLoc, TypeSourceInfo *EnumType, EnumDecl *ED)
TypeLoc getReturnTypeLoc(FunctionDecl *FD) const
SmallVector< std::pair< const CXXMethodDecl *, const CXXMethodDecl * >, 2 > DelayedOverridingExceptionSpecChecks
All the overriding functions seen during a class definition that had their exception spec checks dela...
llvm::DenseMap< ParmVarDecl *, SourceLocation > UnparsedDefaultArgLocs
void MarkVirtualMemberExceptionSpecsNeeded(SourceLocation Loc, const CXXRecordDecl *RD)
Mark the exception specifications of all virtual member functions in the given class as needed.
ExprResult BuildConvertedConstantExpression(Expr *From, QualType T, CCEKind CCE, NamedDecl *Dest=nullptr)
bool RequireCompleteEnumDecl(EnumDecl *D, SourceLocation L, CXXScopeSpec *SS=nullptr)
Require that the EnumDecl is completed with its enumerators defined or instantiated.
bool CheckOverloadedOperatorDeclaration(FunctionDecl *FnDecl)
CheckOverloadedOperatorDeclaration - Check whether the declaration of this overloaded operator is wel...
void MarkVirtualBaseDestructorsReferenced(SourceLocation Location, CXXRecordDecl *ClassDecl, llvm::SmallPtrSetImpl< const CXXRecordDecl * > *DirectVirtualBases=nullptr)
Mark destructors of virtual bases of this class referenced.
void ExitDeclaratorContext(Scope *S)
void PushUsingDirective(Scope *S, UsingDirectiveDecl *UDir)
void CheckConstructor(CXXConstructorDecl *Constructor)
CheckConstructor - Checks a fully-formed constructor for well-formedness, issuing any diagnostics req...
void DefineImplicitLambdaToBlockPointerConversion(SourceLocation CurrentLoc, CXXConversionDecl *Conv)
Define the "body" of the conversion from a lambda object to a block pointer.
void DefineImplicitDestructor(SourceLocation CurrentLocation, CXXDestructorDecl *Destructor)
DefineImplicitDestructor - Checks for feasibility of defining this destructor as the default destruct...
void DiagnoseNontrivial(const CXXRecordDecl *Record, CXXSpecialMemberKind CSM)
Diagnose why the specified class does not have a trivial special member of the given kind.
Decl * ActOnUsingEnumDeclaration(Scope *CurScope, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation EnumLoc, SourceRange TyLoc, const IdentifierInfo &II, ParsedType Ty, const CXXScopeSpec &SS)
void popCodeSynthesisContext()
CXXRecordDecl * getCurrentClass(Scope *S, const CXXScopeSpec *SS)
Get the class that is directly named by the current context.
bool EvaluateAsString(Expr *Message, APValue &Result, ASTContext &Ctx, StringEvaluationContext EvalContext, bool ErrorOnInvalidMessage)
QualType BuildReferenceType(QualType T, bool LValueRef, SourceLocation Loc, DeclarationName Entity)
Build a reference type.
TemplateArgumentLoc getTrivialTemplateArgumentLoc(const TemplateArgument &Arg, QualType NTTPType, SourceLocation Loc)
Allocate a TemplateArgumentLoc where all locations have been initialized to the given location.
bool DiagnosePackIndexingInFriendNNS(SourceLocation Loc, NestedNameSpecifierLoc NNSLoc)
ExprResult ActOnFinishTrailingRequiresClause(ExprResult ConstraintExpr)
bool checkThisInStaticMemberFunctionAttributes(CXXMethodDecl *Method)
Check whether 'this' shows up in the attributes of the given static member function.
CXXBaseSpecifier * CheckBaseSpecifier(CXXRecordDecl *Class, SourceRange SpecifierRange, bool Virtual, AccessSpecifier Access, TypeSourceInfo *TInfo, SourceLocation EllipsisLoc)
Check the validity of a C++ base class specifier.
UnparsedDefaultArgInstantiationsMap UnparsedDefaultArgInstantiations
A mapping from parameters with unparsed default arguments to the set of instantiations of each parame...
void DefineImplicitDefaultConstructor(SourceLocation CurrentLocation, CXXConstructorDecl *Constructor)
DefineImplicitDefaultConstructor - Checks for feasibility of defining this constructor as the default...
std::pair< CXXRecordDecl *, SourceLocation > VTableUse
The list of classes whose vtables have been used within this translation unit, and the source locatio...
ExprResult DefaultLvalueConversion(Expr *E)
bool CheckUsingShadowDecl(BaseUsingDecl *BUD, NamedDecl *Target, const LookupResult &PreviousDecls, UsingShadowDecl *&PrevShadow)
Determines whether to create a using shadow decl for a particular decl, given the set of decls existi...
ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R, bool NeedsADL, bool AcceptInvalidDecl=false)
bool isVisible(const NamedDecl *D)
Determine whether a declaration is visible to name lookup.
bool CheckDerivedToBaseConversion(QualType Derived, QualType Base, SourceLocation Loc, SourceRange Range, CXXCastPath *BasePath=nullptr, bool IgnoreAccess=false)
Module * getCurrentModule() const
Get the module unit whose scope we are currently within.
bool CheckDeductionGuideDeclarator(Declarator &D, QualType &R, StorageClass &SC)
Check the validity of a declarator that we parsed for a deduction-guide.
void DiagPlaceholderVariableDefinition(SourceLocation Loc)
void CheckForFunctionRedefinition(FunctionDecl *FD, const FunctionDecl *EffectiveDefinition=nullptr, SkipBodyInfo *SkipBody=nullptr)
bool DiagnoseUseOfOverloadedDecl(NamedDecl *D, SourceLocation Loc)
std::unique_ptr< RecordDeclSetTy > PureVirtualClassDiagSet
PureVirtualClassDiagSet - a set of class declarations which we have emitted a list of pure virtual fu...
void ActOnFinishInlineFunctionDef(FunctionDecl *D)
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
VarDecl * BuildExceptionDeclaration(Scope *S, TypeSourceInfo *TInfo, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id)
Perform semantic analysis for the variable declaration that occurs within a C++ catch clause,...
void ActOnDocumentableDecl(Decl *D)
Should be called on all declarations that might have attached documentation comments.
ClassTemplateDecl * StdTypeIdentity
The C++ "std::type_identity" template, which is defined in <type_traits>.
DeclarationNameInfo GetNameFromUnqualifiedId(const UnqualifiedId &Name)
Retrieves the declaration name from a parsed unqualified-id.
Decl * ActOnFriendTypeDecl(Scope *S, const DeclSpec &DS, MultiTemplateParamsArg TemplateParams, SourceLocation EllipsisLoc)
Handle a friend type declaration.
ExprResult PerformContextuallyConvertToBool(Expr *From)
PerformContextuallyConvertToBool - Perform a contextual conversion of the expression From to bool (C+...
void DefineImplicitCopyAssignment(SourceLocation CurrentLocation, CXXMethodDecl *MethodDecl)
Defines an implicitly-declared copy assignment operator.
bool CheckFunctionConstraints(const FunctionDecl *FD, ConstraintSatisfaction &Satisfaction, SourceLocation UsageLoc=SourceLocation(), bool ForOverloadResolution=false)
Check whether the given function decl's trailing requires clause is satisfied, if any.
bool SetDelegatingInitializer(CXXConstructorDecl *Constructor, CXXCtorInitializer *Initializer)
bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived, CXXRecordDecl *Base, CXXBasePaths &Paths)
Determine whether the type Derived is a C++ class that is derived from the type Base.
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
bool CheckLiteralOperatorDeclaration(FunctionDecl *FnDecl)
CheckLiteralOperatorDeclaration - Check whether the declaration of this literal operator function is ...
bool DefineUsedVTables()
Define all of the vtables that have been used in this translation unit and reference any virtual memb...
CXXMethodDecl * DeclareImplicitCopyAssignment(CXXRecordDecl *ClassDecl)
Declare the implicit copy assignment operator for the given class.
void checkIllFormedTrivialABIStruct(CXXRecordDecl &RD)
Check that the C++ class annoated with "trivial_abi" satisfies all the conditions that are needed for...
void MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base=nullptr)
Perform reference-marking and odr-use handling for a DeclRefExpr.
StmtResult ActOnForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, Stmt *First, ConditionResult Second, FullExprArg Third, SourceLocation RParenLoc, Stmt *Body)
unsigned ActOnReenterTemplateScope(Decl *Template, llvm::function_ref< Scope *()> EnterScope)
ExprResult BuildCXXConstructExpr(SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl, CXXConstructorDecl *Constructor, MultiExprArg Exprs, bool HadMultipleCandidates, bool IsListInitialization, bool IsStdInitListInitialization, bool RequiresZeroInit, CXXConstructionKind ConstructKind, SourceRange ParenRange)
BuildCXXConstructExpr - Creates a complete call to a constructor, including handling of its default a...
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
SourceManager & getSourceManager() const
FunctionDecl * SubstSpaceshipAsEqualEqual(CXXRecordDecl *RD, FunctionDecl *Spaceship)
Substitute the name and return type of a defaulted 'operator<=>' to form an implicit 'operator=='.
NamedDecl * ActOnDecompositionDeclarator(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParamLists)
ExprResult BuildFieldReferenceExpr(Expr *BaseExpr, bool IsArrow, SourceLocation OpLoc, const CXXScopeSpec &SS, FieldDecl *Field, DeclAccessPair FoundDecl, const DeclarationNameInfo &MemberNameInfo)
void diagnoseFunctionEffectMergeConflicts(const FunctionEffectSet::Conflicts &Errs, SourceLocation NewLoc, SourceLocation OldLoc)
void EnterDeclaratorContext(Scope *S, DeclContext *DC)
EnterDeclaratorContext - Used when we must lookup names in the context of a declarator's nested name ...
bool CheckExplicitlyDefaultedComparison(Scope *S, FunctionDecl *MD, DefaultedComparisonKind DCK)
bool checkThisInStaticMemberFunctionExceptionSpec(CXXMethodDecl *Method)
Whether this' shows up in the exception specification of a static member function.
void ActOnFinishCXXInClassMemberInitializer(Decl *VarDecl, SourceLocation EqualLoc, ExprResult Init)
This is invoked after parsing an in-class initializer for a non-static C++ class member,...
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...
bool CheckDependentFriend(SourceLocation Loc, NestedNameSpecifierLoc NNSLoc, ArrayRef< TemplateParameterList * > TPLs, bool IsInstantiation)
void ActOnFields(Scope *S, SourceLocation RecLoc, Decl *TagDecl, ArrayRef< Decl * > Fields, SourceLocation LBrac, SourceLocation RBrac, const ParsedAttributesView &AttrList)
void CheckExplicitObjectLambda(Declarator &D)
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
void NoteDeletedInheritingConstructor(CXXConstructorDecl *CD)
void PopPragmaVisibility(bool IsNamespaceEnd, SourceLocation EndLoc)
PopPragmaVisibility - Pop the top element of the visibility stack; used for '#pragma GCC visibility' ...
Expr * MaybeCreateExprWithCleanups(Expr *SubExpr)
MaybeCreateExprWithCleanups - If the current full-expression requires any cleanups,...
void checkInitializerLifetime(const InitializedEntity &Entity, Expr *Init)
Check that the lifetime of the initializer (and its subobjects) is sufficient for initializing the en...
void CheckCompletedCXXClass(Scope *S, CXXRecordDecl *Record)
Perform semantic checks on a class definition that has been completing, introducing implicitly-declar...
void DiscardCleanupsInEvaluationContext()
void PushDeclContext(Scope *S, DeclContext *DC)
Set the current declaration context until it gets popped.
bool CheckEquivalentExceptionSpec(FunctionDecl *Old, FunctionDecl *New)
void mergeDeclAttributes(NamedDecl *New, Decl *Old, AvailabilityMergeKind AMK=AvailabilityMergeKind::Redeclaration)
mergeDeclAttributes - Copy attributes from the Old decl to the New one.
bool isDependentScopeSpecifier(const CXXScopeSpec &SS)
SourceManager & SourceMgr
bool CheckDestructor(CXXDestructorDecl *Destructor)
CheckDestructor - Checks a fully-formed destructor definition for well-formedness,...
NamedDecl * BuildUsingPackDecl(NamedDecl *InstantiatedFrom, ArrayRef< NamedDecl * > Expansions)
MemInitResult ActOnMemInitializer(Decl *ConstructorD, Scope *S, CXXScopeSpec &SS, IdentifierInfo *MemberOrBase, ParsedType TemplateTypeTy, const DeclSpec &DS, SourceLocation IdLoc, SourceLocation LParenLoc, ArrayRef< Expr * > Args, SourceLocation RParenLoc, SourceLocation EllipsisLoc)
Handle a C++ member initializer using parentheses syntax.
void SetDeclDeleted(Decl *dcl, SourceLocation DelLoc, StringLiteral *Message=nullptr)
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.
DeclResult ActOnTemplatedFriendTag(Scope *S, SourceLocation FriendLoc, unsigned TagSpec, SourceLocation TagLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, SourceLocation EllipsisLoc, const ParsedAttributesView &Attr, MultiTemplateParamsArg TempParamLists, TemplateIdAnnotation *TemplateId)
Handle a friend tag declaration where the scope specifier was templated.
void ActOnPureSpecifier(Decl *D, SourceLocation PureSpecLoc)
@ CheckValid
Identify whether this function satisfies the formal rules for constexpr functions in the current lanu...
@ Diagnose
Diagnose issues that are non-constant or that are extensions.
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
void LoadExternalVTableUses()
Load any externally-stored vtable uses.
static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo=nullptr)
Decl * ActOnUsingDirective(Scope *CurScope, SourceLocation UsingLoc, SourceLocation NamespcLoc, CXXScopeSpec &SS, SourceLocation IdentLoc, IdentifierInfo *NamespcName, const ParsedAttributesView &AttrList)
StmtResult ActOnCompoundStmt(SourceLocation L, SourceLocation R, ArrayRef< Stmt * > Elts, bool isStmtExpr)
void HandleFunctionTypeMismatch(PartialDiagnostic &PDiag, QualType FromType, QualType ToType)
HandleFunctionTypeMismatch - Gives diagnostic information for differeing function types.
void ActOnStartTrailingRequiresClause(Scope *S, Declarator &D)
void FindHiddenVirtualMethods(CXXMethodDecl *MD, SmallVectorImpl< CXXMethodDecl * > &OverloadedMethods)
Check if a method overloads virtual methods in a base class without overriding any.
IdentifierResolver IdResolver
DeclContextLookupResult LookupConstructors(CXXRecordDecl *Class)
Look up the constructors for the given class.
void ActOnStartDelayedMemberDeclarations(Scope *S, Decl *Record)
TypeResult ActOnTagTemplateIdType(TagUseKind TUK, TypeSpecifierType TagSpec, SourceLocation TagLoc, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, TemplateTy TemplateD, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgsIn, SourceLocation RAngleLoc)
Parsed an elaborated-type-specifier that refers to a template-id, such as class T::template apply.
ExprResult ActOnCXXThis(SourceLocation Loc)
CXXConstructorDecl * findInheritingConstructor(SourceLocation Loc, CXXConstructorDecl *BaseCtor, ConstructorUsingShadowDecl *DerivedShadow)
Given a derived-class using shadow declaration for a constructor and the correspnding base class cons...
void warnOnReservedIdentifier(const NamedDecl *D)
bool CheckExplicitlyDefaultedSpecialMember(CXXMethodDecl *MD, CXXSpecialMemberKind CSM, SourceLocation DefaultLoc)
bool isCurrentClassNameTypo(IdentifierInfo *&II, const CXXScopeSpec *SS)
Determine whether the identifier II is a typo for the name of the class type currently being defined.
Decl * ActOnUsingDeclaration(Scope *CurScope, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation TypenameLoc, CXXScopeSpec &SS, UnqualifiedId &Name, SourceLocation EllipsisLoc, const ParsedAttributesView &AttrList)
void ActOnDelayedCXXMethodParameter(Scope *S, Decl *Param)
ActOnDelayedCXXMethodParameter - We've already started a delayed C++ method declaration.
bool isAbstractType(SourceLocation Loc, QualType T)
ValueDecl * tryLookupUnambiguousFieldDecl(RecordDecl *ClassDecl, const IdentifierInfo *MemberOrBase)
ASTMutationListener * getASTMutationListener() const
bool SetCtorInitializers(CXXConstructorDecl *Constructor, bool AnyErrors, ArrayRef< CXXCtorInitializer * > Initializers={})
void DiagnoseImmediateEscalatingReason(FunctionDecl *FD)
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
CXXDestructorDecl * DeclareImplicitDestructor(CXXRecordDecl *ClassDecl)
Declare the implicit destructor for the given class.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
static StaticAssertDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StaticAssertLoc, Expr *AssertExpr, Expr *Message, SourceLocation RParenLoc, bool Failed)
Stmt - This represents one statement.
SourceLocation getEndLoc() const LLVM_READONLY
StmtClass getStmtClass() const
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
static bool isValidUDSuffix(const LangOptions &LangOpts, StringRef Suffix)
Determine whether a suffix is a valid ud-suffix.
StringLiteral - This represents a string literal expression, e.g.
bool isUnevaluated() const
StringRef getString() const
Represents the declaration of a struct/union/class/enum.
bool isBeingDefined() const
Return true if this decl is currently being defined.
StringRef getKindName() const
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
TagDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
TagKind getTagKind() const
bool isDependentType() const
Whether this declaration declares a type that is dependent, i.e., a type that somehow depends on temp...
void setElaboratedKeywordLoc(SourceLocation Loc)
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
A convenient class for passing around template argument information.
void addArgument(const TemplateArgumentLoc &Loc)
ArrayRef< TemplateArgumentLoc > arguments() const
Location wrapper for a TemplateArgument.
const TemplateArgument & getArgument() const
TypeSourceInfo * getTypeSourceInfo() const
Represents a template argument.
@ Type
The template argument is a type.
ArgKind getKind() const
Return the kind of stored template argument.
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
QualifiedTemplateName * getAsQualifiedTemplateName() const
Retrieve the underlying qualified template name structure, if any.
Stores a list of template parameters for a TemplateDecl and its derived classes.
NamedDecl * getParam(unsigned Idx)
SourceRange getSourceRange() const LLVM_READONLY
unsigned getDepth() const
Get the depth of this template parameter list in the set of template parameter lists.
unsigned getMinRequiredArguments() const
Returns the minimum number of arguments needed to form a template specialization.
static TemplateParameterList * Create(const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)
Expr * getRequiresClause()
The constraint-expression of the associated requires-clause.
SourceLocation getRAngleLoc() const
SourceLocation getLAngleLoc() const
static bool shouldIncludeTypeForArgument(const PrintingPolicy &Policy, const TemplateParameterList *TPL, unsigned Idx)
SourceLocation getTemplateLoc() const
unsigned getNumArgs() const
TemplateArgumentLoc getArgLoc(unsigned i) const
Declaration of a template type parameter.
unsigned getIndex() const
Retrieve the index of the template parameter.
unsigned getDepth() const
Retrieve the depth of the template parameter.
The top declaration context.
Represents the declaration of a typedef-name via a C++11 alias-declaration.
static TypeAliasDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)
void setDescribedAliasTemplate(TypeAliasTemplateDecl *TAT)
Declaration of an alias template.
static TypeAliasTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
Create a function template node.
TypeAliasDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
Represents a declaration of a type.
TyLocType push(QualType T)
Pushes space for a new TypeLoc of the given type.
TypeSpecTypeLoc pushTypeSpec(QualType T)
Pushes space for a typespec TypeLoc.
TypeSourceInfo * getTypeSourceInfo(ASTContext &Context, QualType T)
Creates a TypeSourceInfo for the given type.
Base wrapper for a particular "section" of type source info.
QualType getType() const
Get the type for which this source info wrapper provides information.
TypeLoc getNextTypeLoc() const
Get the next TypeLoc pointed by this TypeLoc, e.g for "int*" the TypeLoc is a PointerLoc and next Typ...
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
NestedNameSpecifierLoc getPrefix() const
If this type represents a qualified-id, this returns it's nested name specifier.
TypeLoc IgnoreParens() const
T castAs() const
Convert to the specified TypeLoc type, asserting that this TypeLoc is of the desired type.
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
SourceRange getLocalSourceRange() const
Get the local source range.
TypeLocClass getTypeLocClass() const
SourceLocation getEndLoc() const
Get the end source location.
T getAsAdjusted() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
SourceLocation getBeginLoc() const
Get the begin source location.
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
QualType getType() const
Return the type wrapped by this type source info.
void setNameLoc(SourceLocation Loc)
The base class of the type hierarchy.
bool isBooleanType() const
const TemplateSpecializationType * getAsNonAliasTemplateSpecializationType() const
Look through sugar for an instance of TemplateSpecializationType which is not a type alias,...
bool isIncompleteArrayType() const
bool isUndeducedAutoType() const
bool isRValueReferenceType() const
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isPointerType() const
CanQualType getCanonicalTypeUnqualified() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isEnumeralType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
TagDecl * getAsTagDecl() const
Retrieves the TagDecl that this type refers to, either because the type is a TagType or because it is...
bool isLValueReferenceType() const
bool isSpecificBuiltinType(unsigned K) const
Test for a particular builtin type.
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
QualType getCanonicalTypeInternal() const
const Type * getBaseElementTypeUnsafe() const
Get the base element type of this type, potentially discarding type qualifiers.
bool isFunctionProtoType() const
bool isOverloadableType() const
Determines whether this is a type for which one can define an overloaded operator.
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
EnumDecl * getAsEnumDecl() const
Retrieves the EnumDecl this type refers to.
bool isFunctionType() const
bool isStructureOrClassType() const
bool isRealFloatingType() const
Floating point categories.
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
bool isUnsignedIntegerType() const
Return true if this is an integer type that is unsigned, according to C99 6.2.5p6 [which returns true...
const T * getAs() const
Member-template getAs<specific type>'.
bool isRecordType() const
Base class for declarations which introduce a typedef-name.
QualType getUnderlyingType() const
Wrapper for source info for typedefs.
Simple class containing the result of Sema::CorrectTypo.
NamedDecl * getCorrectionDecl() const
Gets the pointer to the declaration of the typo correction.
SourceRange getCorrectionRange() const
void WillReplaceSpecifier(bool ForceReplacement)
DeclClass * getCorrectionDeclAs() const
NestedNameSpecifier getCorrectionSpecifier() const
Gets the NestedNameSpecifier needed to use the typo correction.
NamedDecl * getFoundDecl() const
Get the correction declaration found by name lookup (before we looked through using shadow declaratio...
Expr * getSubExpr() const
static bool isIncrementDecrementOp(Opcode Op)
static UnaryOperator * Create(const ASTContext &C, Expr *input, Opcode opc, QualType type, ExprValueKind VK, ExprObjectKind OK, SourceLocation l, bool CanOverflow, FPOptionsOverride FPFeatures)
TypeLocClass getTypeLocClass() const
Represents a C++ unqualified-id that has been parsed.
UnionParsedType ConversionFunctionId
When Kind == IK_ConversionFunctionId, the type that the conversion function names.
SourceLocation getBeginLoc() const LLVM_READONLY
SourceRange getSourceRange() const LLVM_READONLY
Return the source range that covers this unqualified-id.
UnionParsedType DestructorName
When Kind == IK_DestructorName, the type referred to by the class-name.
SourceLocation StartLocation
The location of the first token that describes this unqualified-id, which will be the location of the...
UnionParsedTemplateTy TemplateName
When Kind == IK_DeductionGuideName, the parsed template-name.
const IdentifierInfo * Identifier
When Kind == IK_Identifier, the parsed identifier, or when Kind == IK_UserLiteralId,...
UnqualifiedIdKind getKind() const
Determine what kind of name we have.
TemplateIdAnnotation * TemplateId
When Kind == IK_TemplateId or IK_ConstructorTemplateId, the template-id annotation that contains the ...
static UnresolvedLookupExpr * Create(const ASTContext &Context, CXXRecordDecl *NamingClass, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool RequiresADL, UnresolvedSetIterator Begin, UnresolvedSetIterator End, bool KnownDependent, bool KnownInstantiationDependent)
A set of unresolved declarations.
ArrayRef< DeclAccessPair > pairs() const
The iterator over UnresolvedSets.
A set of unresolved declarations.
This node is generated when a using-declaration that was annotated with attribute((using_if_exists)) ...
static UnresolvedUsingIfExistsDecl * Create(ASTContext &Ctx, DeclContext *DC, SourceLocation Loc, DeclarationName Name)
Wrapper for source info for unresolved typename using decls.
static UnresolvedUsingTypenameDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, SourceLocation TypenameLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TargetNameLoc, DeclarationName TargetName, SourceLocation EllipsisLoc)
static UnresolvedUsingValueDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, SourceLocation EllipsisLoc)
Represents a C++ using-declaration.
bool hasTypename() const
Return true if the using declaration has 'typename'.
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name.
DeclarationNameInfo getNameInfo() const
static UsingDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingL, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool HasTypenameKeyword)
SourceLocation getUsingLoc() const
Return the source location of the 'using' keyword.
Represents C++ using-directive.
static UsingDirectiveDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, SourceLocation NamespaceLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc, NamedDecl *Nominated, DeclContext *CommonAncestor)
Represents a C++ using-enum-declaration.
static UsingEnumDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingL, SourceLocation EnumL, SourceLocation NameL, TypeSourceInfo *EnumType)
static UsingPackDecl * Create(ASTContext &C, DeclContext *DC, NamedDecl *InstantiatedFrom, ArrayRef< NamedDecl * > UsingDecls)
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
static UsingShadowDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation Loc, DeclarationName Name, BaseUsingDecl *Introducer, NamedDecl *Target)
NamedDecl * getTargetDecl() const
Gets the underlying declaration which has been brought into the local scope.
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
BaseUsingDecl * getIntroducer() const
Gets the (written or instantiated) using declaration that introduced this declaration.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
void setType(QualType newType)
bool isParameterPack() const
Determine whether this value is actually a function parameter pack, init-capture pack,...
Represents a variable declaration or definition.
VarTemplateDecl * getDescribedVarTemplate() const
Retrieves the variable template that is described by this variable declaration.
static VarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S)
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
DefinitionKind isThisDeclarationADefinition(ASTContext &) const
Check whether this declaration is a definition.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool isNoDestroy(const ASTContext &) const
Is destruction of this variable entirely suppressed?
bool isInlineSpecified() const
bool isStaticDataMember() const
Determines whether this is a static data member.
bool hasGlobalStorage() const
Returns true for all variables that do not have local storage.
bool evaluateDestruction(SmallVectorImpl< PartialDiagnosticAt > &Notes) const
Evaluate the destruction of this variable to determine if it constitutes constant destruction.
bool isStaticLocal() const
Returns true if a variable with function scope is a static local variable.
QualType::DestructionKind needsDestruction(const ASTContext &Ctx) const
Would the destruction of this variable have any effect, and if so, what kind?
ThreadStorageClassSpecifier getTSCSpec() const
const Expr * getInit() const
const APValue * evaluateValue() const
Attempt to evaluate the value of the initializer attached to this declaration, and produce notes expl...
@ TLS_Dynamic
TLS with a dynamic initializer.
StorageClass getStorageClass() const
Returns the storage class as written in the source.
bool isUsableInConstantExpressions(const ASTContext &C) const
Determine whether this variable's value can be used in a constant expression, according to the releva...
void setExceptionVariable(bool EV)
Declaration of a variable template.
Represents a GCC generic vector type.
unsigned getNumElements() const
QualType getElementType() const
Represents a C++11 virt-specifier-seq.
SourceLocation getOverrideLoc() const
SourceLocation getLastLocation() const
bool isOverrideSpecified() const
SourceLocation getFinalLoc() const
bool isFinalSpecified() const
bool isFinalSpelledSealed() const
Retains information about a function, method, or block that is currently being parsed.
bool FoundImmediateEscalatingExpression
Whether we found an immediate-escalating expression.
Provides information about an attempted template argument deduction, whose success or failure was des...
Defines the clang::TargetInfo interface.
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
bool Comp(InterpState &S)
1) Pops the value from the stack.
bool Inc(InterpState &S, CodePtr OpPC, bool CanOverflow)
1) Pops a pointer from the stack 2) Load the value from the pointer 3) Writes the value increased by ...
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
Top level wrappers for InstallAPI frontend operations.
bool FTIHasNonVoidParameters(const DeclaratorChunk::FunctionTypeInfo &FTI)
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
TypeSpecifierType
Specifies the kind of type.
@ TST_typename_pack_indexing
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ OO_None
Not an overloaded operator.
@ NUM_OVERLOADED_OPERATORS
@ NonFunction
This is not an overload because the lookup results contain a non-function.
@ Match
This is not an overload because the signature exactly matches an existing declaration.
@ Overload
This is a legitimate overload: the existing declarations are functions or function templates with dif...
bool isa(CodeGen::Address addr)
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
MutableArrayRef< TemplateParameterList * > MultiTemplateParamsArg
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
@ OR_Deleted
Succeeded, but refers to a deleted function.
@ OR_Success
Overload resolution succeeded.
@ OR_Ambiguous
Ambiguous candidates found.
@ OR_No_Viable_Function
No viable function found.
ConstexprSpecKind
Define the kind of constexpr specifier.
LinkageSpecLanguageIDs
Represents the language in a linkage specification.
@ Ambiguous
Name lookup results in an ambiguity; use getAmbiguityKind to figure out what kind of ambiguity we hav...
@ NotFound
No entity found met the criteria.
@ FoundOverloaded
Name lookup found a set of overloaded functions that met the criteria.
@ Found
Name lookup found a single declaration that met the criteria.
@ FoundUnresolvedValue
Name lookup found an unresolvable value declaration and cannot yet complete.
@ NotFoundInCurrentInstantiation
No entity found met the criteria within the current instantiation,, but there were dependent base cla...
LLVM_READONLY auto escapeCStyle(CharT Ch) -> StringRef
Return C-style escaped string for special characters, or an empty string if there is no such mapping.
@ Comparison
A comparison.
InClassInitStyle
In-class initialization styles for non-static data members.
@ ICIS_ListInit
Direct list-initialization.
@ ICIS_NoInit
No in-class initializer.
@ RQ_None
No ref-qualifier was provided.
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
@ OCD_AmbiguousCandidates
Requests that only tied-for-best candidates be shown.
@ OCD_AllCandidates
Requests that all candidates be shown.
@ OK_Ordinary
An ordinary object is located at an address in memory.
@ Redeclaration
Merge availability attributes for a redeclaration, which requires an exact match.
std::pair< llvm::PointerUnion< const TemplateTypeParmType *, NamedDecl *, const TemplateSpecializationType *, const SubstBuiltinTemplatePackType * >, SourceLocation > UnexpandedParameterPack
@ If
'if' clause, allowed on all the Compute Constructs, Data Constructs, Executable Constructs,...
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
@ Delete
'delete' clause, allowed on the 'exit data' construct.
@ IK_DeductionGuideName
A deduction-guide name (a template-name)
@ IK_ImplicitSelfParam
An implicit 'self' parameter.
@ IK_TemplateId
A template-id, e.g., f<int>.
@ IK_ConstructorTemplateId
A constructor named via a template-id.
@ IK_ConstructorName
A constructor name.
@ IK_LiteralOperatorId
A user-defined literal name, e.g., operator "" _i.
@ IK_Identifier
An identifier.
@ IK_DestructorName
A destructor name.
@ IK_OperatorFunctionId
An overloaded operator name, e.g., operator+.
@ IK_ConversionFunctionId
A conversion function name, e.g., operator int.
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
std::optional< ComparisonCategoryType > getComparisonCategoryForBuiltinCmp(QualType T)
Get the comparison category that should be used when comparing values of type T.
ActionResult< Decl * > DeclResult
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
StorageClass
Storage classes.
ComparisonCategoryType commonComparisonType(ComparisonCategoryType A, ComparisonCategoryType B)
Determine the common comparison type, as defined in C++2a [class.spaceship]p4.
@ Dependent
Parse the block as a dependent block, which may be used in some template instantiations but not other...
ComparisonCategoryResult
An enumeration representing the possible results of a three-way comparison.
MutableArrayRef< Expr * > MultiExprArg
Language
The language for the input, used to select and validate the language standard and possible actions.
@ Default
Set to the current date and time.
@ Result
The result type of a method or function.
ActionResult< ParsedType > TypeResult
std::pair< unsigned, unsigned > getDepthAndIndex(const NamedDecl *ND)
Retrieve the depth and index of a template parameter.
InheritableAttr * getDLLAttr(Decl *D)
Return a DLL attribute from the declaration.
ActionResult< CXXCtorInitializer * > MemInitResult
OptionalUnsigned< unsigned > UnsignedOrNone
const FunctionProtoType * T
llvm::Expected< QualType > ExpectedType
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
@ Template
We are parsing a template declaration.
ActionResult< CXXBaseSpecifier * > BaseResult
void EscapeStringForDiagnostic(StringRef Str, SmallVectorImpl< char > &OutStr)
EscapeStringForDiagnostic - Append Str to the diagnostic buffer, escaping non-printable characters an...
ReservedLiteralSuffixIdStatus
TagTypeKind
The kind of a tag type.
@ Interface
The "__interface" keyword.
@ Struct
The "struct" keyword.
@ Class
The "class" keyword.
@ Keyword
The name has been typo-corrected to a keyword.
@ Type
The name was classified as a type.
DefaultedComparisonKind
Kinds of defaulted comparison operator functions.
@ Relational
This is an <, <=, >, or >= that should be implemented as a rewrite in terms of a <=> comparison.
@ NotEqual
This is an operator!= that should be implemented as a rewrite in terms of a == comparison.
@ ThreeWay
This is an operator<=> that should be implemented as a series of subobject comparisons.
@ None
This is not a defaultable comparison operator.
@ Equal
This is an operator== that should be implemented as a series of subobject comparisons.
LangAS
Defines the address space values used by the address space qualifier of QualType.
@ CanPassInRegs
The argument of this type can be passed directly in registers.
@ CanNeverPassInRegs
The argument of this type cannot be passed directly in registers.
@ CannotPassInRegs
The argument of this type cannot be passed directly in registers.
@ TU_Prefix
The translation unit is a prefix to a translation unit, and is not complete.
ComparisonCategoryType
An enumeration representing the different comparison categories types.
MutableArrayRef< ParsedTemplateArgument > ASTTemplateArgsPtr
CXXSpecialMemberKind
Kinds of C++ special members.
OverloadedOperatorKind getRewrittenOverloadedOperator(OverloadedOperatorKind Kind)
Get the other overloaded operator that the given operator can be rewritten into, if any such operator...
@ TNK_Concept_template
The name refers to a concept.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
DynamicRecursiveASTVisitorBase< false > DynamicRecursiveASTVisitor
@ ConsiderTrivialABI
The triviality of a method affected by "trivial_abi".
@ IgnoreTrivialABI
The triviality of a method unaffected by "trivial_abi".
@ Incomplete
Template argument deduction did not deduce a value for every template parameter.
@ Success
Template argument deduction was successful.
@ Inconsistent
Template argument deduction produced inconsistent deduced values for the given template parameter.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
CallingConv
CallingConv - Specifies the calling convention that a function uses.
TypeAwareAllocationMode typeAwareAllocationModeFromBool(bool IsTypeAwareAllocation)
U cast(CodeGen::Address addr)
@ StaticAssertMessageData
Call to data() in a static assert message.
@ StaticAssertMessageSize
Call to size() in a static assert message.
@ ExplicitBool
Condition in an explicit(bool) specifier.
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
@ None
No keyword precedes the qualified type name.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
bool isLambdaMethod(const DeclContext *DC)
bool isExternallyVisible(Linkage L)
ActionResult< Expr * > ExprResult
ExceptionSpecificationType
The various types of exception specifications that exist in C++11.
@ EST_DependentNoexcept
noexcept(expression), value-dependent
@ EST_Uninstantiated
not instantiated yet
@ EST_Unparsed
not parsed yet
@ EST_NoThrow
Microsoft __declspec(nothrow) extension.
@ EST_None
no exception specification
@ EST_MSAny
Microsoft throw(...) extension.
@ EST_BasicNoexcept
noexcept
@ EST_NoexceptFalse
noexcept(expression), evals to 'false'
@ EST_Unevaluated
not evaluated yet, for special member function
@ EST_NoexceptTrue
noexcept(expression), evals to 'true'
@ EST_Dynamic
throw(T1, T2)
ActionResult< Stmt * > StmtResult
@ NOUR_Unevaluated
This name appears in an unevaluated operand.
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Represents an element in a path from a derived class to a base class.
bool hasValidIntValue() const
True iff we've successfully evaluated the variable as a constant expression and extracted its integer...
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
DeclarationName getName() const
getName - Returns the embedded declaration name.
void setNamedTypeInfo(TypeSourceInfo *TInfo)
setNamedTypeInfo - Sets the source type info associated to the name.
void setName(DeclarationName N)
setName - Sets the embedded declaration name.
SourceLocation getBeginLoc() const
getBeginLoc - Retrieve the location of the first token.
SourceRange getSourceRange() const LLVM_READONLY
getSourceRange - The range of the declaration name.
SourceLocation getEndLoc() const LLVM_READONLY
bool containsUnexpandedParameterPack() const
Determine whether this name contains an unexpanded parameter pack.
unsigned isVariadic
isVariadic - If this function has a prototype, and if that proto ends with ',...)',...
ParamInfo * Params
Params - This is a pointer to a new[]'d array of ParamInfo objects that describe the parameters speci...
unsigned RefQualifierIsLValueRef
Whether the ref-qualifier (if any) is an lvalue reference.
DeclSpec * MethodQualifiers
DeclSpec for the function with the qualifier related info.
SourceLocation getRefQualifierLoc() const
Retrieve the location of the ref-qualifier, if any.
unsigned NumParams
NumParams - This is the number of formal parameters specified by the declarator.
bool hasMutableQualifier() const
Determine whether this lambda-declarator contains a 'mutable' qualifier.
bool hasMethodTypeQualifiers() const
Determine whether this method has qualifiers.
void freeParams()
Reset the parameter list to having zero parameters.
bool hasRefQualifier() const
Determine whether this function declaration contains a ref-qualifier.
std::unique_ptr< CachedTokens > DefaultArgTokens
DefaultArgTokens - When the parameter's default argument cannot be parsed immediately (because it occ...
One instance of this struct is used for each type in a declarator that is parsed.
SourceRange getSourceRange() const
enum clang::DeclaratorChunk::@340323374315200305336204205154073066142310370142 Kind
EvalResult is a struct with detailed info about an evaluated expression.
A simple structure that captures a vtable use for the purposes of the ExternalSemaSource.
Holds information about the various types of exception specification.
FunctionDecl * SourceDecl
The function whose exception specification this is, for EST_Unevaluated and EST_Uninstantiated.
ExceptionSpecificationType Type
The kind of exception specification this is.
ArrayRef< QualType > Exceptions
Explicitly-specified list of exception types.
Expr * NoexceptExpr
Noexcept expression, if this is a computed noexcept specification.
Extra information about a function prototype.
ExceptionSpecInfo ExceptionSpec
FunctionEffectsRef FunctionEffects
RefQualifierKind RefQualifier
FunctionType::ExtInfo ExtInfo
static StringRef getTagTypeKindName(TagTypeKind Kind)
static ElaboratedTypeKeyword getKeywordForTagTypeKind(TagTypeKind Tag)
Converts a TagTypeKind into an elaborated type keyword.
static TagTypeKind getTagTypeKindForTypeSpec(unsigned TypeSpec)
Converts a type specifier (DeclSpec::TST) into a tag type kind.
Describes how types, statements, expressions, and declarations should be printed.
A context in which code is being synthesized (where a source location alone is not sufficient to iden...
enum clang::Sema::CodeSynthesisContext::SynthesisKind Kind
SourceLocation PointOfInstantiation
The point of instantiation or synthesis within the source code.
@ MarkingClassDllexported
We are marking a class as __dllexport.
@ InitializingStructuredBinding
We are initializing a structured binding.
@ ExceptionSpecEvaluation
We are computing the exception specification for a defaulted special member function.
@ DeclaringImplicitEqualityComparison
We are declaring an implicit 'operator==' for a defaulted 'operator<=>'.
Decl * Entity
The entity that is being synthesized.
Abstract class used to diagnose incomplete types.
virtual void diagnose(Sema &S, SourceLocation Loc, QualType T)=0
Information about a template-id annotation token.
TemplateNameKind Kind
The kind of template that Template refers to.
unsigned NumArgs
NumArgs - The number of template arguments.
SourceLocation TemplateNameLoc
TemplateNameLoc - The location of the template name within the source.
ParsedTemplateArgument * getTemplateArgs()
Retrieves a pointer to the template arguments.
SourceLocation RAngleLoc
The location of the '>' after the template argument list.
SourceLocation LAngleLoc
The location of the '<' before the template argument list.
SourceLocation TemplateKWLoc
TemplateKWLoc - The location of the template keyword.
ParsedTemplateTy Template
The declaration of the template corresponding to the template-name.
OpaquePtr< T > get() const