49#include "llvm/ADT/ArrayRef.h"
50#include "llvm/ADT/STLExtras.h"
51#include "llvm/ADT/STLForwardCompat.h"
52#include "llvm/ADT/StringExtras.h"
53#include "llvm/Support/ConvertUTF.h"
54#include "llvm/Support/SaveAndRestore.h"
71class CheckDefaultArgumentVisitor
74 const Expr *DefaultArg;
77 CheckDefaultArgumentVisitor(
Sema &S,
const Expr *DefaultArg)
78 : S(S), DefaultArg(DefaultArg) {}
83 bool VisitLambdaExpr(
const LambdaExpr *Lambda);
88bool CheckDefaultArgumentVisitor::VisitExpr(
const Expr *
Node) {
89 bool IsInvalid =
false;
90 for (
const Stmt *SubStmt :
Node->children())
92 IsInvalid |= Visit(SubStmt);
99bool CheckDefaultArgumentVisitor::VisitDeclRefExpr(
const DeclRefExpr *DRE) {
102 if (!isa<VarDecl, BindingDecl>(
Decl))
105 if (
const auto *Param = dyn_cast<ParmVarDecl>(
Decl)) {
116 diag::err_param_default_argument_references_param)
117 << Param->getDeclName() << DefaultArg->getSourceRange();
118 }
else if (
auto *VD =
Decl->getPotentiallyDecomposedVarDecl()) {
133 diag::err_param_default_argument_references_local)
140bool CheckDefaultArgumentVisitor::VisitCXXThisExpr(
const CXXThisExpr *ThisE) {
145 diag::err_param_default_argument_references_this)
149bool CheckDefaultArgumentVisitor::VisitPseudoObjectExpr(
154 if (
const auto *OVE = dyn_cast<OpaqueValueExpr>(
E)) {
155 E = OVE->getSourceExpr();
156 assert(
E &&
"pseudo-object binding without source expression?");
164bool CheckDefaultArgumentVisitor::VisitLambdaExpr(
const LambdaExpr *Lambda) {
173 return S.
Diag(LC.getLocation(), diag::err_lambda_capture_default_arg);
175 auto *
D = cast<VarDecl>(LC.getCapturedVar());
208 llvm_unreachable(
"should not see unresolved exception specs here");
237 "should not generate implicit declarations for dependent cases");
241 assert(EST ==
EST_Dynamic &&
"EST case not considered earlier.");
243 "Shouldn't collect exceptions when throw-all is guaranteed.");
248 Exceptions.push_back(
E);
276 if (
Self->canThrow(S))
283 diag::err_typecheck_decl_incomplete_type))
302 CheckCompletedExpr(Arg, EqualLoc);
315 UnparsedDefaultArgInstantiationsMap::iterator InstPos
318 for (
unsigned I = 0, N = InstPos->second.size(); I != N; ++I)
319 InstPos->second[I]->setUninstantiatedDefaultArg(Arg);
329 if (!param || !DefaultArg)
337 Diag(EqualLoc, diag::err_param_default_argument)
350 Diag(EqualLoc, diag::err_param_default_argument_on_parameter_pack)
364 CheckDefaultArgumentVisitor DefaultArgChecker(*
this, DefaultArg);
365 if (DefaultArgChecker.Visit(DefaultArg))
396 Param->
getType().getNonReferenceType());
409 bool MightBeFunction =
D.isFunctionDeclarationContext();
410 for (
unsigned i = 0, e =
D.getNumTypeObjects(); i != e; ++i) {
413 if (MightBeFunction) {
417 MightBeFunction =
false;
420 for (
unsigned argIdx = 0, e = chunk.
Fun.
NumParams; argIdx != e;
424 std::unique_ptr<CachedTokens> Toks =
427 if (Toks->size() > 1)
429 Toks->back().getLocation());
441 MightBeFunction =
false;
448 return P->hasDefaultArg() && !P->hasInheritedDefaultArg();
465 for (; PrevForDefaultArgs;
513 for (
unsigned p = 0, NumParams = PrevForDefaultArgs
516 p < NumParams; ++p) {
520 bool OldParamHasDfl = OldParam ? OldParam->
hasDefaultArg() :
false;
523 if (OldParamHasDfl && NewParamHasDfl) {
524 unsigned DiagDefaultParamID =
525 diag::err_param_default_argument_redefinition;
540 DiagDefaultParamID = diag::ext_param_default_argument_redefinition;
558 for (
auto Older = PrevForDefaultArgs;
560 Older = Older->getPreviousDecl();
561 OldParam = Older->getParamDecl(p);
566 }
else if (OldParamHasDfl) {
584 }
else if (NewParamHasDfl) {
588 diag::err_param_default_argument_template_redecl)
591 diag::note_template_prev_declaration)
622 if (
Record->getDescribedClassTemplate())
624 else if (isa<ClassTemplatePartialSpecializationDecl>(
Record))
631 diag::err_param_default_argument_member_template_redecl)
641 if (isa<CXXConstructorDecl>(New) &&
645 if (NewSM != OldSM) {
648 Diag(NewParam->
getLocation(), diag::err_default_arg_makes_ctor_special)
683 if (isa<CXXDeductionGuideDecl>(New) &&
695 Diag(New->
getLocation(), diag::err_friend_decl_with_def_arg_redeclared);
716 ? diag::warn_cxx23_placeholder_var_definition
717 : diag::ext_placeholder_var_definition);
723 assert(
D.isDecompositionDeclarator());
729 if (!
D.mayHaveDecompositionDeclarator()) {
735 if (!TemplateParamLists.empty()) {
738 Diag(TemplateParamLists.front()->getTemplateLoc(),
739 diag::err_decomp_decl_template);
745 ? diag::ext_decomp_decl
747 ? diag::ext_decomp_decl_cond
748 : diag::warn_cxx14_compat_decomp_decl)
763 auto &DS =
D.getDeclSpec();
771 if (
auto SCS = DS.getStorageClassSpec()) {
774 CPlusPlus20SpecifierLocs.push_back(DS.getStorageClassSpecLoc());
777 BadSpecifierLocs.push_back(DS.getStorageClassSpecLoc());
780 if (
auto TSCS = DS.getThreadStorageClassSpec()) {
782 CPlusPlus20SpecifierLocs.push_back(DS.getThreadStorageClassSpecLoc());
784 if (DS.hasConstexprSpecifier()) {
785 BadSpecifiers.push_back(
787 BadSpecifierLocs.push_back(DS.getConstexprSpecLoc());
789 if (DS.isInlineSpecified()) {
790 BadSpecifiers.push_back(
"inline");
791 BadSpecifierLocs.push_back(DS.getInlineSpecLoc());
794 if (!BadSpecifiers.empty()) {
795 auto &&Err =
Diag(BadSpecifierLocs.front(), diag::err_decomp_decl_spec);
796 Err << (
int)BadSpecifiers.size()
797 << llvm::join(BadSpecifiers.begin(), BadSpecifiers.end(),
" ");
800 for (
auto Loc : BadSpecifierLocs)
802 }
else if (!CPlusPlus20Specifiers.empty()) {
803 auto &&Warn =
Diag(CPlusPlus20SpecifierLocs.front(),
805 ? diag::warn_cxx17_compat_decomp_decl_spec
806 : diag::ext_decomp_decl_spec);
807 Warn << (
int)CPlusPlus20Specifiers.size()
808 << llvm::join(CPlusPlus20Specifiers.begin(),
809 CPlusPlus20Specifiers.end(),
" ");
810 for (
auto Loc : CPlusPlus20SpecifierLocs)
822 Diag(DS.getVolatileSpecLoc(),
823 diag::warn_deprecated_volatile_structured_binding);
836 D.hasGroupingParens() ||
D.getNumTypeObjects() > 1 ||
837 (
D.getNumTypeObjects() == 1 &&
840 (
D.hasGroupingParens() ||
841 (
D.getNumTypeObjects() &&
843 ? diag::err_decomp_decl_parens
844 : diag::err_decomp_decl_type)
855 if (DS.isConstrainedAuto()) {
858 "No other template kind should be possible for a constrained auto");
872 for (
auto &B :
D.getDecompositionDeclarator().bindings()) {
876 assert(VarName &&
"Cannot have an unnamed binding declaration");
879 RedeclarationKind::ForVisibleRedeclaration);
885 Previous.getFoundDecl()->isTemplateParameter()) {
896 NamedDecl *ShadowedDecl =
D.getCXXScopeSpec().isEmpty()
919 auto *Old =
Previous.getRepresentativeDecl();
920 Diag(B.NameLoc, diag::err_redefinition) << B.Name;
921 Diag(Old->getLocation(), diag::note_previous_definition);
923 }
else if (ShadowedDecl && !
D.isRedeclaration()) {
936 RedeclarationKind::ForVisibleRedeclaration);
939 bool AddToScope =
true;
948 if (
OpenMP().isInOpenMPDeclareTargetContext())
958 if ((int64_t)
Bindings.size() != NumElems) {
959 S.
Diag(Src->
getLocation(), diag::err_decomp_decl_wrong_number_bindings)
972 E = GetInit(
Loc,
E.get(), I++);
975 B->setBinding(ElemType,
E.get());
984 const llvm::APSInt &NumElems,
987 S,
Bindings, Src, DecompType, NumElems, ElemType,
1018 S,
Bindings, Src, DecompType, llvm::APSInt::get(2),
1022 return S.CreateBuiltinUnaryOp(Loc, I ? UO_Imag : UO_Real, Base);
1030 llvm::raw_svector_ostream
OS(SS);
1042 return std::string(
OS.str());
1049 auto DiagnoseMissing = [&] {
1059 return DiagnoseMissing();
1069 return DiagnoseMissing();
1070 if (
Result.isAmbiguous())
1075 Result.suppressDiagnostics();
1077 S.
Diag(
Loc, diag::err_std_type_trait_not_class_template) << Trait;
1078 S.
Diag(
Found->getLocation(), diag::note_declared_at);
1089 Loc, TraitTy, DiagID,
1096 assert(RD &&
"specialization of class template is not a class?");
1115namespace {
enum class IsTupleLike { TupleLike, NotTupleLike,
Error }; }
1118 llvm::APSInt &Size) {
1133 return IsTupleLike::NotTupleLike;
1142 : R(R), Args(Args) {}
1145 return S.
Diag(
Loc, diag::err_decomp_decl_std_tuple_size_not_constant)
1149 } Diagnoser(R, Args);
1154 return IsTupleLike::Error;
1158 return IsTupleLike::Error;
1160 return IsTupleLike::TupleLike;
1175 S, R,
Loc,
"tuple_element", Args,
1176 diag::err_decomp_decl_std_tuple_element_not_specialized))
1182 S.
Diag(
Loc, diag::err_decomp_decl_std_tuple_element_not_specialized)
1194struct InitializingBinding {
1203 ~InitializingBinding() {
1212 const llvm::APSInt &TupleSize) {
1213 if ((int64_t)
Bindings.size() != TupleSize) {
1214 S.
Diag(Src->
getLocation(), diag::err_decomp_decl_wrong_number_bindings)
1230 bool UseMemberGet =
false;
1240 dyn_cast<FunctionTemplateDecl>(
D->getUnderlyingDecl())) {
1242 if (TPL->
size() != 0 &&
1243 isa<NonTypeTemplateParmDecl>(TPL->
getParam(0))) {
1245 UseMemberGet =
true;
1254 InitializingBinding InitContext(S, B);
1277 MemberGet, &Args,
nullptr);
1291 Expr *Arg =
E.get();
1312 B->getDeclName().getAsIdentifierInfo(), RefType,
1316 RefVD->setImplicit();
1318 RefVD->setInlineSpecified();
1319 RefVD->getLexicalDeclContext()->addHiddenDecl(RefVD);
1324 E =
Seq.Perform(S, Entity, Kind,
Init);
1330 RefVD->setInit(
E.get());
1339 B->setBinding(
T,
E.get());
1354 return Specifier->getType()->getAsCXXRecordDecl()->hasDirectFields();
1363 ClassWithFields = RD;
1375 for (
auto &
P : Paths) {
1379 BestPath->back().Base->getType())) {
1381 S.
Diag(
Loc, diag::err_decomp_decl_multiple_bases_with_members)
1382 <<
false << RD << BestPath->back().Base->getType()
1383 <<
P.back().Base->getType();
1385 }
else if (
P.Access < BestPath->
Access) {
1391 QualType BaseType = BestPath->back().Base->getType();
1393 S.
Diag(
Loc, diag::err_decomp_decl_ambiguous_base)
1400 *BestPath, diag::err_decomp_decl_inaccessible_base);
1411 S.
Diag(
Loc, diag::err_decomp_decl_multiple_bases_with_members)
1412 << (ClassWithFields == RD) << RD << ClassWithFields
1413 << Paths.front().back().Base->getType();
1424 diag::err_incomplete_type))
1436 auto DiagnoseBadNumberOfBindings = [&]() ->
bool {
1437 unsigned NumFields = llvm::count_if(
1438 RD->
fields(), [](
FieldDecl *FD) { return !FD->isUnnamedBitField(); });
1439 assert(
Bindings.size() != NumFields);
1440 S.
Diag(Src->
getLocation(), diag::err_decomp_decl_wrong_number_bindings)
1450 for (
auto *FD : RD->
fields()) {
1451 if (FD->isUnnamedBitField())
1456 if (!FD->getDeclName()) {
1463 if (FD->isAnonymousStructOrUnion()) {
1466 S.
Diag(FD->getLocation(), diag::note_declared_at);
1475 return DiagnoseBadNumberOfBindings();
1486 BasePair.
getAccess(), FD->getAccess())));
1509 if (FD->isMutable())
1515 return DiagnoseBadNumberOfBindings();
1557 llvm::APSInt TupleSize(32);
1559 case IsTupleLike::Error:
1563 case IsTupleLike::TupleLike:
1568 case IsTupleLike::NotTupleLike:
1577 << DD << !RD << DecompType;
1595 "Should only be called if types are otherwise the same.");
1606 NewType =
P->getPointeeType();
1636 if (FTD->isMemberSpecialization())
1663 Diag(Param->
getLocation(), diag::err_param_default_argument_missing_name)
1673template <
typename... Ts>
1683 std::forward<Ts>(DiagArgs)...);
1689 llvm_unreachable(
"unknown CheckConstexprKind");
1697 "this check is obsolete for C++23");
1716 if (!Check(B.getBaseTypeLoc(), B.getType(),
nullptr))
1719 if (!Check(FD->getLocation(), FD->getType(), FD))
1730 "this check is obsolete for C++23");
1731 unsigned ArgIndex = 0;
1734 e = FT->param_type_end();
1735 i != e; ++i, ++ArgIndex) {
1737 assert(PD &&
"null in a parameter list");
1740 diag::err_constexpr_non_literal_param, ArgIndex + 1,
1753 "this check is obsolete for C++23");
1755 diag::err_constexpr_non_literal_return,
1774 default: llvm_unreachable(
"Invalid tag kind for record diagnostic!");
1800 << isa<CXXConstructorDecl>(NewFD)
1802 for (
const auto &I : RD->
vbases())
1803 Diag(I.getBeginLoc(), diag::note_constexpr_virtual_base_here)
1804 << I.getSourceRange();
1809 if (!isa<CXXConstructorDecl>(NewFD)) {
1814 const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(NewFD);
1818 Diag(Method->
getLocation(), diag::warn_cxx17_compat_constexpr_virtual);
1831 if (WrittenVirtual != Method)
1833 diag::note_overridden_virtual_function);
1844 if (
auto *Dtor = dyn_cast<CXXDestructorDecl>(NewFD)) {
1849 !Dtor->getParent()->defaultedDestructorIsConstexpr()) {
1864 "CheckConstexprFunctionDefinition called on function with no body");
1879 for (
const auto *DclIt : DS->
decls()) {
1880 switch (DclIt->getKind()) {
1881 case Decl::StaticAssert:
1883 case Decl::UsingShadow:
1884 case Decl::UsingDirective:
1885 case Decl::UnresolvedUsingTypename:
1886 case Decl::UnresolvedUsingValue:
1887 case Decl::UsingEnum:
1895 case Decl::TypeAlias: {
1898 const auto *TN = cast<TypedefNameDecl>(DclIt);
1899 if (TN->getUnderlyingType()->isVariablyModifiedType()) {
1902 TypeLoc TL = TN->getTypeSourceInfo()->getTypeLoc();
1905 << isa<CXXConstructorDecl>(Dcl);
1913 case Decl::CXXRecord:
1915 if (cast<TagDecl>(DclIt)->isThisDeclarationADefinition()) {
1919 ? diag::warn_cxx11_compat_constexpr_type_definition
1920 : diag::ext_constexpr_type_definition)
1921 << isa<CXXConstructorDecl>(Dcl);
1928 case Decl::EnumConstant:
1929 case Decl::IndirectField:
1936 case Decl::Decomposition: {
1941 const auto *VD = cast<VarDecl>(DclIt);
1942 if (VD->isThisDeclarationADefinition()) {
1943 if (VD->isStaticLocal()) {
1947 ? diag::warn_cxx20_compat_constexpr_var
1948 : diag::ext_constexpr_static_var)
1949 << isa<CXXConstructorDecl>(Dcl)
1957 diag::warn_cxx20_compat_constexpr_var,
1958 isa<CXXConstructorDecl>(Dcl),
1961 SemaRef, Kind, VD->getLocation(), VD->getType(),
1962 diag::err_constexpr_local_var_non_literal_type,
1963 isa<CXXConstructorDecl>(Dcl))) {
1966 if (!VD->getType()->isDependentType() &&
1967 !VD->hasInit() && !VD->isCXXForRangeDecl()) {
1972 ? diag::warn_cxx17_compat_constexpr_local_var_no_init
1973 : diag::ext_constexpr_local_var_no_init)
1974 << isa<CXXConstructorDecl>(Dcl);
1984 ? diag::warn_cxx11_compat_constexpr_local_var
1985 : diag::ext_constexpr_local_var)
1986 << isa<CXXConstructorDecl>(Dcl);
1993 case Decl::NamespaceAlias:
1994 case Decl::Function:
2004 << isa<CXXConstructorDecl>(Dcl) << Dcl->
isConsteval();
2029 llvm::SmallSet<Decl*, 16> &Inits,
2037 if (Field->isInvalidDecl())
2040 if (Field->isUnnamedBitField())
2046 if (Field->isAnonymousStructOrUnion() &&
2047 (Field->getType()->isUnionType()
2048 ? !Field->getType()->getAsCXXRecordDecl()->hasVariantMembers()
2049 : Field->getType()->getAsCXXRecordDecl()->isEmpty()))
2052 if (!Inits.count(Field)) {
2057 ? diag::warn_cxx17_compat_constexpr_ctor_missing_init
2058 : diag::ext_constexpr_ctor_missing_init);
2062 diag::note_constexpr_ctor_missing_init);
2066 }
else if (Field->isAnonymousStructOrUnion()) {
2068 for (
auto *I : RD->
fields())
2071 if (!RD->
isUnion() || Inits.count(I))
2088 switch (S->getStmtClass()) {
2089 case Stmt::NullStmtClass:
2093 case Stmt::DeclStmtClass:
2103 case Stmt::ReturnStmtClass:
2105 if (isa<CXXConstructorDecl>(Dcl)) {
2108 Cxx1yLoc = S->getBeginLoc();
2112 ReturnStmts.push_back(S->getBeginLoc());
2115 case Stmt::AttributedStmtClass:
2119 SemaRef, Dcl, cast<AttributedStmt>(S)->getSubStmt(), ReturnStmts,
2120 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind);
2122 case Stmt::CompoundStmtClass: {
2125 Cxx1yLoc = S->getBeginLoc();
2128 for (
auto *BodyIt : CompStmt->
body()) {
2130 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2136 case Stmt::IfStmtClass: {
2139 Cxx1yLoc = S->getBeginLoc();
2143 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2145 if (
If->getElse() &&
2147 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2152 case Stmt::WhileStmtClass:
2153 case Stmt::DoStmtClass:
2154 case Stmt::ForStmtClass:
2155 case Stmt::CXXForRangeStmtClass:
2156 case Stmt::ContinueStmtClass:
2162 Cxx1yLoc = S->getBeginLoc();
2163 for (
Stmt *SubStmt : S->children()) {
2166 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2171 case Stmt::SwitchStmtClass:
2172 case Stmt::CaseStmtClass:
2173 case Stmt::DefaultStmtClass:
2174 case Stmt::BreakStmtClass:
2178 Cxx1yLoc = S->getBeginLoc();
2179 for (
Stmt *SubStmt : S->children()) {
2182 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2187 case Stmt::LabelStmtClass:
2188 case Stmt::GotoStmtClass:
2190 Cxx2bLoc = S->getBeginLoc();
2191 for (
Stmt *SubStmt : S->children()) {
2194 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2199 case Stmt::GCCAsmStmtClass:
2200 case Stmt::MSAsmStmtClass:
2202 case Stmt::CXXTryStmtClass:
2204 Cxx2aLoc = S->getBeginLoc();
2205 for (
Stmt *SubStmt : S->children()) {
2208 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2213 case Stmt::CXXCatchStmtClass:
2217 SemaRef, Dcl, cast<CXXCatchStmt>(S)->getHandlerBlock(), ReturnStmts,
2218 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2228 Cxx1yLoc = S->getBeginLoc();
2233 SemaRef.
Diag(S->getBeginLoc(), diag::err_constexpr_body_invalid_stmt)
2234 << isa<CXXConstructorDecl>(Dcl) << Dcl->
isConsteval();
2249 if (isa<CXXTryStmt>(Body)) {
2271 ? diag::ext_constexpr_function_try_block_cxx20
2272 : diag::warn_cxx17_compat_constexpr_function_try_block)
2273 << isa<CXXConstructorDecl>(Dcl);
2287 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2298 }
else if (Cxx2bLoc.
isValid()) {
2301 ? diag::warn_cxx20_compat_constexpr_body_invalid_stmt
2302 : diag::ext_constexpr_body_invalid_stmt_cxx23)
2303 << isa<CXXConstructorDecl>(Dcl);
2304 }
else if (Cxx2aLoc.
isValid()) {
2307 ? diag::warn_cxx17_compat_constexpr_body_invalid_stmt
2308 : diag::ext_constexpr_body_invalid_stmt_cxx20)
2309 << isa<CXXConstructorDecl>(Dcl);
2310 }
else if (Cxx1yLoc.
isValid()) {
2313 ? diag::warn_cxx11_compat_constexpr_body_invalid_stmt
2314 : diag::ext_constexpr_body_invalid_stmt)
2315 << isa<CXXConstructorDecl>(Dcl);
2319 = dyn_cast<CXXConstructorDecl>(Dcl)) {
2328 if (Constructor->getNumCtorInitializers() == 0 &&
2334 ? diag::warn_cxx17_compat_constexpr_union_ctor_no_init
2335 : diag::ext_constexpr_union_ctor_no_init);
2340 }
else if (!Constructor->isDependentContext() &&
2341 !Constructor->isDelegatingConstructor()) {
2342 assert(RD->
getNumVBases() == 0 &&
"constexpr ctor with virtual bases");
2346 bool AnyAnonStructUnionMembers =
false;
2347 unsigned Fields = 0;
2350 if (I->isAnonymousStructOrUnion()) {
2351 AnyAnonStructUnionMembers =
true;
2359 if (AnyAnonStructUnionMembers ||
2360 Constructor->getNumCtorInitializers() != RD->
getNumBases() + Fields) {
2364 llvm::SmallSet<Decl*, 16> Inits;
2365 for (
const auto *I: Constructor->inits()) {
2369 Inits.insert(ID->chain_begin(), ID->chain_end());
2372 bool Diagnosed =
false;
2373 for (
auto *I : RD->
fields())
2380 if (ReturnStmts.empty()) {
2395 }
else if (ReturnStmts.size() > 1) {
2401 ? diag::warn_cxx11_compat_constexpr_body_multiple_return
2402 : diag::ext_constexpr_body_multiple_return);
2403 for (
unsigned I = 0; I < ReturnStmts.size() - 1; ++I)
2405 diag::note_constexpr_body_previous_return);
2436 diag::ext_constexpr_function_never_constant_expr, Dcl->
getLocation());
2441 diag::ext_constexpr_function_never_constant_expr)
2442 << isa<CXXConstructorDecl>(Dcl) << Dcl->
isConsteval()
2444 for (
size_t I = 0, N =
Diags.size(); I != N; ++I)
2469 OK ? diag::warn_cxx11_compat_constexpr_body_no_return
2470 : diag::err_constexpr_body_no_return)
2484 Diag(it->second, diag::err_immediate_function_used_before_definition)
2497 "expected an immediate function");
2498 assert(FD->
hasBody() &&
"expected the function to have a body");
2503 bool ImmediateFnIsConstructor;
2508 : SemaRef(SemaRef), ImmediateFn(FD),
2509 ImmediateFnIsConstructor(isa<CXXConstructorDecl>(FD)) {
2510 ShouldVisitImplicitCode =
true;
2511 ShouldVisitLambdaBody =
false;
2517 if (CurrentConstructor && CurrentInit) {
2525 SemaRef.
Diag(
Loc, diag::note_immediate_function_reason)
2526 << ImmediateFn << Fn << Fn->isConsteval() << IsCall
2527 << isa<CXXConstructorDecl>(Fn) << ImmediateFnIsConstructor
2528 << (InitializedField !=
nullptr)
2529 << (CurrentInit && !CurrentInit->
isWritten())
2530 << InitializedField <<
Range;
2532 bool TraverseCallExpr(
CallExpr *
E)
override {
2533 if (
const auto *DR =
2535 DR && DR->isImmediateEscalating()) {
2536 Diag(
E,
E->getDirectCallee(),
true);
2540 for (
Expr *A :
E->arguments())
2541 if (!TraverseStmt(A))
2548 if (
const auto *ReferencedFn = dyn_cast<FunctionDecl>(
E->getDecl());
2549 ReferencedFn &&
E->isImmediateEscalating()) {
2550 Diag(
E, ReferencedFn,
false);
2559 if (
E->isImmediateEscalating()) {
2573 return DynamicRecursiveASTVisitor::TraverseCXXConstructorDecl(Ctr);
2576 bool TraverseType(
QualType T)
override {
return true; }
2577 bool VisitBlockExpr(
BlockExpr *
T)
override {
return true; }
2579 } Visitor(*
this, FD);
2580 Visitor.TraverseDecl(FD);
2591 return dyn_cast_or_null<CXXRecordDecl>(DC);
2594 return dyn_cast_or_null<CXXRecordDecl>(
CurContext);
2612 CurDecl = dyn_cast_or_null<CXXRecordDecl>(DC);
2614 CurDecl = dyn_cast_or_null<CXXRecordDecl>(
CurContext);
2639 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
2653 if (BaseDecl->isUnion()) {
2654 Diag(BaseLoc, diag::err_union_as_base_class) << SpecifierRange;
2662 if (
auto *BaseSpec =
2663 dyn_cast<ClassTemplateSpecializationDecl>(BaseDecl)) {
2672 Class->setInvalidDecl();
2676 BaseDecl = BaseDecl->getDefinition();
2677 assert(BaseDecl &&
"Base type is not incomplete, but has no definition");
2682 const auto *BaseCSA = BaseDecl->getAttr<CodeSegAttr>();
2683 const auto *DerivedCSA =
Class->getAttr<CodeSegAttr>();
2684 if ((DerivedCSA || BaseCSA) &&
2685 (!BaseCSA || !DerivedCSA ||
2686 BaseCSA->getName() != DerivedCSA->getName())) {
2687 Diag(
Class->getLocation(), diag::err_mismatched_code_seg_base);
2688 Diag(BaseDecl->getLocation(), diag::note_base_class_specified_here)
2699 if (BaseDecl->hasFlexibleArrayMember()) {
2700 Diag(BaseLoc, diag::err_base_class_has_flexible_array_member)
2701 << BaseDecl->getDeclName();
2708 if (FinalAttr *FA = BaseDecl->getAttr<FinalAttr>()) {
2709 Diag(BaseLoc, diag::err_class_marked_final_used_as_base)
2710 << BaseDecl->getDeclName() << FA->isSpelledAsSealed();
2711 Diag(BaseDecl->getLocation(), diag::note_entity_declared_at)
2712 << BaseDecl->getDeclName() << FA->getRange();
2717 if (BaseDecl->isInvalidDecl())
2718 Class->setInvalidDecl();
2726 if (!
Class->isDependentContext())
2727 Class->setInvalidDecl();
2730 Diag(BaseLoc, diag::err_base_must_be_class) << SpecifierRange;
2742 Access, TInfo, EllipsisLoc);
2759 Class->setIsParsingBaseSpecifiers();
2767 Diag(AL.getLoc(), diag::warn_unknown_attribute_ignored)
2768 << AL << AL.getRange();
2770 Diag(AL.getLoc(), diag::err_base_specifier_attribute)
2771 << AL << AL.isRegularKeywordAttribute() << AL.getRange();
2784 if (
Class->isUnion()) {
2785 Diag(
Class->getLocation(), diag::err_base_clause_on_union)
2795 Class->setInvalidDecl();
2811 auto Decl = Rec->getAsCXXRecordDecl();
2814 for (
const auto &BaseSpec :
Decl->bases()) {
2833 std::map<QualType, CXXBaseSpecifier*, QualTypeOrdering> KnownBaseTypes;
2840 unsigned NumGoodBases = 0;
2842 for (
unsigned idx = 0; idx < Bases.size(); ++idx) {
2852 Diag(Bases[idx]->getBeginLoc(), diag::err_duplicate_base_class)
2853 << KnownBase->
getType() << Bases[idx]->getSourceRange();
2862 KnownBase = Bases[idx];
2863 Bases[NumGoodBases++] = Bases[idx];
2868 if (Bases.size() > 1)
2873 if (
Class->isInterface() &&
2890 Class->setBases(Bases.data(), NumGoodBases);
2893 for (
unsigned idx = 0; idx < NumGoodBases; ++idx) {
2895 QualType BaseType = Bases[idx]->getType();
2905 if (IndirectBaseTypes.count(CanonicalBase)) {
2909 =
Class->isDerivedFrom(CanonicalBase->getAsCXXRecordDecl(), Paths);
2913 if (Paths.isAmbiguous(CanonicalBase))
2914 Diag(Bases[idx]->getBeginLoc(), diag::warn_inaccessible_base_class)
2916 << Bases[idx]->getSourceRange();
2918 assert(Bases[idx]->isVirtual());
2931 if (!ClassDecl || Bases.empty())
2988 for (
unsigned I =
Path.size(); I != 0; --I) {
2989 if (
Path[I - 1].
Base->isVirtual()) {
2996 for (
unsigned I = Start,
E =
Path.size(); I !=
E; ++I)
3003 assert(BasePathArray.empty() &&
"Base path array must be empty!");
3004 assert(Paths.isRecordingPaths() &&
"Must record paths!");
3005 return ::BuildBasePathArray(Paths.front(), BasePathArray);
3010 unsigned InaccessibleBaseID,
3011 unsigned AmbiguousBaseConvID,
3015 bool IgnoreAccess) {
3023 if (!DerivationOkay)
3028 Path = &Paths.front();
3035 if (PossiblePath.size() == 1) {
3036 Path = &PossiblePath;
3037 if (AmbiguousBaseConvID)
3038 Diag(
Loc, diag::ext_ms_ambiguous_direct_base)
3046 if (!IgnoreAccess) {
3065 if (AmbiguousBaseConvID) {
3073 Paths.setRecordingPaths(
true);
3075 assert(StillOkay &&
"Can only be used with a derived-to-base conversion");
3084 Diag(
Loc, AmbiguousBaseConvID)
3085 << Derived <<
Base << PathDisplayStr <<
Range << Name;
3094 bool IgnoreAccess) {
3096 Derived,
Base, diag::err_upcast_to_inaccessible_base,
3098 BasePath, IgnoreAccess);
3102 std::string PathDisplayStr;
3103 std::set<unsigned> DisplayedPaths;
3106 if (DisplayedPaths.insert(
Path->back().SubobjectNumber).second) {
3109 PathDisplayStr +=
"\n ";
3111 for (CXXBasePath::const_iterator Element =
Path->begin();
3112 Element !=
Path->end(); ++Element)
3113 PathDisplayStr +=
" -> " + Element->Base->getType().getAsString();
3117 return PathDisplayStr;
3127 assert(Access !=
AS_none &&
"Invalid kind for syntactic access specifier!");
3156 if (!OverloadedMethods.empty()) {
3157 if (OverrideAttr *OA =
D->
getAttr<OverrideAttr>()) {
3158 Diag(OA->getLocation(),
3159 diag::override_keyword_hides_virtual_member_function)
3160 <<
"override" << (OverloadedMethods.size() > 1);
3161 }
else if (FinalAttr *FA =
D->
getAttr<FinalAttr>()) {
3162 Diag(FA->getLocation(),
3163 diag::override_keyword_hides_virtual_member_function)
3164 << (FA->isSpelledAsSealed() ?
"sealed" :
"final")
3165 << (OverloadedMethods.size() > 1);
3176 if (OverrideAttr *OA =
D->
getAttr<OverrideAttr>()) {
3177 Diag(OA->getLocation(),
3178 diag::override_keyword_only_allowed_on_virtual_member_functions)
3182 if (FinalAttr *FA =
D->
getAttr<FinalAttr>()) {
3183 Diag(FA->getLocation(),
3184 diag::override_keyword_only_allowed_on_virtual_member_functions)
3185 << (FA->isSpelledAsSealed() ?
"sealed" :
"final")
3197 if (MD->
hasAttr<OverrideAttr>() && !HasOverriddenMethods)
3198 Diag(MD->
getLocation(), diag::err_function_marked_override_not_overriding)
3218 auto EmitDiag = [&](
unsigned DiagInconsistent,
unsigned DiagSuggest) {
3227 if (isa<CXXDestructorDecl>(MD))
3229 diag::warn_inconsistent_destructor_marked_not_override_overriding,
3230 diag::warn_suggest_destructor_marked_not_override_overriding);
3232 EmitDiag(diag::warn_inconsistent_function_marked_not_override_overriding,
3233 diag::warn_suggest_function_marked_not_override_overriding);
3239 FinalAttr *FA = Old->
getAttr<FinalAttr>();
3245 << FA->isSpelledAsSealed();
3254 return !RD->isCompleteDefinition() ||
3255 !RD->hasTrivialDefaultConstructor() ||
3256 !RD->hasTrivialDestructor();
3268 std::map<CXXRecordDecl*, NamedDecl*> Bases;
3271 const auto Base =
Specifier->getType()->getAsCXXRecordDecl();
3273 if (Bases.find(
Base) != Bases.end())
3275 for (
const auto Field :
Base->lookup(FieldName)) {
3276 if ((isa<FieldDecl>(Field) || isa<IndirectFieldDecl>(Field)) &&
3279 assert(Bases.find(
Base) == Bases.end());
3292 for (
const auto &
P : Paths) {
3293 auto Base =
P.back().Base->getType()->getAsCXXRecordDecl();
3294 auto It = Bases.find(
Base);
3296 if (It == Bases.end())
3298 auto BaseField = It->second;
3299 assert(BaseField->getAccess() !=
AS_private);
3302 Diag(
Loc, diag::warn_shadow_field)
3303 << FieldName << RD <<
Base << DeclIsField;
3304 Diag(BaseField->getLocation(), diag::note_shadow_field);
3324 Expr *BitWidth =
static_cast<Expr*
>(BW);
3329 bool isFunc =
D.isDeclarationOfFunction();
3331 D.getDeclSpec().getAttributes().getMSPropertyAttr();
3333 if (cast<CXXRecordDecl>(
CurContext)->isInterface()) {
3337 unsigned InvalidDecl;
3338 bool ShowDeclName =
true;
3348 else switch (Name.getNameKind()) {
3351 ShowDeclName =
false;
3356 ShowDeclName =
false;
3371 Diag(
Loc, diag::err_invalid_member_in_interface)
3372 << (InvalidDecl-1) << Name;
3374 Diag(
Loc, diag::err_invalid_member_in_interface)
3375 << (InvalidDecl-1) <<
"";
3396 D.getMutableDeclSpec().ClearStorageClassSpecs();
3401 diag::err_storageclass_invalid_for_member);
3402 D.getMutableDeclSpec().ClearStorageClassSpecs();
3408 !isFunc && TemplateParameterLists.empty();
3420 D.getMutableDeclSpec().ClearConstexprSpec();
3421 const char *PrevSpec;
3423 bool Failed =
D.getMutableDeclSpec().SetTypeQual(
3426 assert(!Failed &&
"Making a constexpr member const shouldn't fail");
3430 const char *PrevSpec;
3432 if (
D.getMutableDeclSpec().SetStorageClassSpec(
3436 "This is the only DeclSpec that should fail to be applied");
3440 isInstField =
false;
3450 if (!Name.isIdentifier()) {
3451 Diag(
Loc, diag::err_bad_variable_name)
3458 Diag(
D.getIdentifierLoc(), diag::err_member_with_template_arguments)
3461 D.getName().TemplateId->RAngleLoc)
3462 <<
D.getName().TemplateId->LAngleLoc;
3463 D.SetIdentifier(II,
Loc);
3476 ?
D.getName().TemplateId
3482 Diag(
D.getIdentifierLoc(), diag::err_member_qualification)
3488 if (MSPropertyAttr) {
3490 BitWidth, InitStyle, AS, *MSPropertyAttr);
3493 isInstField =
false;
3496 BitWidth, InitStyle, AS);
3501 CheckShadowInheritedFields(
Loc, Name, cast<CXXRecordDecl>(
CurContext));
3509 if (
Member->isInvalidDecl()) {
3511 }
else if (isa<VarDecl>(
Member) || isa<VarTemplateDecl>(
Member)) {
3514 Diag(
Loc, diag::err_static_not_bitfield)
3516 }
else if (isa<TypedefDecl>(
Member)) {
3518 Diag(
Loc, diag::err_typedef_not_bitfield)
3523 Diag(
Loc, diag::err_not_integral_type_bitfield)
3524 << Name << cast<ValueDecl>(
Member)->getType()
3529 Member->setInvalidDecl();
3534 NonTemplateMember = FunTmpl->getTemplatedDecl();
3536 NonTemplateMember = VarTmpl->getTemplatedDecl();
3542 if (NonTemplateMember !=
Member)
3548 if (
auto *DG = dyn_cast<CXXDeductionGuideDecl>(NonTemplateMember)) {
3549 auto *TD = DG->getDeducedTemplate();
3552 if (AS != TD->getAccess() &&
3553 TD->getDeclContext()->getRedeclContext()->Equals(
3554 DG->getDeclContext()->getRedeclContext())) {
3555 Diag(DG->getBeginLoc(), diag::err_deduction_guide_wrong_access);
3556 Diag(TD->getBeginLoc(), diag::note_deduction_guide_template_access)
3559 for (
const auto *
D : cast<CXXRecordDecl>(
CurContext)->decls()) {
3560 if (
const auto *AccessSpec = dyn_cast<AccessSpecDecl>(
D))
3561 LastAccessSpec = AccessSpec;
3563 assert(LastAccessSpec &&
"differing access with no access specifier");
3564 Diag(LastAccessSpec->
getBeginLoc(), diag::note_deduction_guide_access)
3575 ? FinalAttr::Keyword_sealed
3576 : FinalAttr::Keyword_final));
3586 assert((Name || isInstField) &&
"No identifier for non-field ?");
3596 auto DeclHasUnusedAttr = [](
const QualType &
T) {
3598 return TD->hasAttr<UnusedAttr>();
3600 return TDT->getDecl()->hasAttr<UnusedAttr>();
3608 !DeclHasUnusedAttr(FD->
getType()) &&
3618 class UninitializedFieldVisitor
3623 llvm::SmallPtrSetImpl<ValueDecl*> &Decls;
3626 llvm::SmallPtrSetImpl<QualType> &BaseClasses;
3641 UninitializedFieldVisitor(
Sema &S,
3642 llvm::SmallPtrSetImpl<ValueDecl*> &Decls,
3643 llvm::SmallPtrSetImpl<QualType> &BaseClasses)
3644 : Inherited(S.Context), S(S), Decls(Decls), BaseClasses(BaseClasses),
3645 Constructor(nullptr), InitList(
false), InitListFieldDecl(nullptr) {}
3648 bool IsInitListMemberExprInitialized(
MemberExpr *ME,
3649 bool CheckReferenceOnly) {
3651 bool ReferenceField =
false;
3656 Fields.push_back(FD);
3658 ReferenceField =
true;
3664 if (CheckReferenceOnly && !ReferenceField)
3670 for (
const FieldDecl *FD : llvm::drop_begin(llvm::reverse(Fields)))
3673 for (
auto UsedIter = UsedFieldIndex.begin(),
3674 UsedEnd = UsedFieldIndex.end(),
3675 OrigIter = InitFieldIndex.begin(),
3676 OrigEnd = InitFieldIndex.end();
3677 UsedIter != UsedEnd && OrigIter != OrigEnd; ++UsedIter, ++OrigIter) {
3678 if (*UsedIter < *OrigIter)
3680 if (*UsedIter > *OrigIter)
3687 void HandleMemberExpr(
MemberExpr *ME,
bool CheckReferenceOnly,
3700 dyn_cast<MemberExpr>(
Base->IgnoreParenImpCasts())) {
3702 if (isa<VarDecl>(SubME->getMemberDecl()))
3705 if (
FieldDecl *FD = dyn_cast<FieldDecl>(SubME->getMemberDecl()))
3710 AllPODFields =
false;
3712 Base = SubME->getBase();
3715 if (!isa<CXXThisExpr>(
Base->IgnoreParenImpCasts())) {
3720 if (AddressOf && AllPODFields)
3726 while (isa<ImplicitCastExpr>(BaseCast->getSubExpr())) {
3727 BaseCast = cast<ImplicitCastExpr>(BaseCast->getSubExpr());
3730 if (BaseCast->getCastKind() == CK_UncheckedDerivedToBase) {
3740 if (!Decls.count(FoundVD))
3745 if (InitList && !AddressOf && FoundVD == InitListFieldDecl) {
3747 if (IsInitListMemberExprInitialized(ME, CheckReferenceOnly)) {
3752 if (CheckReferenceOnly && !IsReference)
3756 unsigned diag = IsReference
3757 ? diag::warn_reference_field_is_uninit
3758 : diag::warn_field_is_uninit;
3762 diag::note_uninit_in_this_constructor)
3767 void HandleValue(
Expr *
E,
bool AddressOf) {
3771 HandleMemberExpr(ME,
false ,
3777 Visit(CO->getCond());
3778 HandleValue(CO->getTrueExpr(), AddressOf);
3779 HandleValue(CO->getFalseExpr(), AddressOf);
3784 dyn_cast<BinaryConditionalOperator>(
E)) {
3785 Visit(BCO->getCond());
3786 HandleValue(BCO->getFalseExpr(), AddressOf);
3791 HandleValue(OVE->getSourceExpr(), AddressOf);
3796 switch (BO->getOpcode()) {
3801 HandleValue(BO->getLHS(), AddressOf);
3802 Visit(BO->getRHS());
3805 Visit(BO->getLHS());
3806 HandleValue(BO->getRHS(), AddressOf);
3815 InitFieldIndex.push_back(0);
3816 for (
auto *Child : ILE->
children()) {
3817 if (
InitListExpr *SubList = dyn_cast<InitListExpr>(Child)) {
3818 CheckInitListExpr(SubList);
3822 ++InitFieldIndex.back();
3824 InitFieldIndex.pop_back();
3833 DeclsToRemove.clear();
3840 InitListFieldDecl =
Field;
3841 InitFieldIndex.clear();
3842 CheckInitListExpr(ILE);
3856 HandleMemberExpr(ME,
true ,
false );
3860 if (
E->getCastKind() == CK_LValueToRValue) {
3861 HandleValue(
E->getSubExpr(),
false );
3865 Inherited::VisitImplicitCastExpr(
E);
3869 if (
E->getConstructor()->isCopyConstructor()) {
3870 Expr *ArgExpr =
E->getArg(0);
3871 if (
InitListExpr *ILE = dyn_cast<InitListExpr>(ArgExpr))
3875 if (ICE->getCastKind() == CK_NoOp)
3876 ArgExpr = ICE->getSubExpr();
3877 HandleValue(ArgExpr,
false );
3880 Inherited::VisitCXXConstructExpr(
E);
3885 if (isa<MemberExpr>(Callee)) {
3886 HandleValue(Callee,
false );
3887 for (
auto *Arg :
E->arguments())
3892 Inherited::VisitCXXMemberCallExpr(
E);
3897 if (
E->isCallToStdMove()) {
3898 HandleValue(
E->getArg(0),
false);
3902 Inherited::VisitCallExpr(
E);
3908 if (isa<UnresolvedLookupExpr>(Callee))
3909 return Inherited::VisitCXXOperatorCallExpr(
E);
3912 for (
auto *Arg :
E->arguments())
3913 HandleValue(Arg->IgnoreParenImpCasts(),
false );
3919 if (
E->getOpcode() == BO_Assign)
3920 if (
MemberExpr *ME = dyn_cast<MemberExpr>(
E->getLHS()))
3923 DeclsToRemove.push_back(FD);
3925 if (
E->isCompoundAssignmentOp()) {
3926 HandleValue(
E->getLHS(),
false );
3931 Inherited::VisitBinaryOperator(
E);
3935 if (
E->isIncrementDecrementOp()) {
3936 HandleValue(
E->getSubExpr(),
false );
3939 if (
E->getOpcode() == UO_AddrOf) {
3940 if (
MemberExpr *ME = dyn_cast<MemberExpr>(
E->getSubExpr())) {
3941 HandleValue(ME->
getBase(),
true );
3946 Inherited::VisitUnaryOperator(
E);
3956 static void DiagnoseUninitializedFields(
3976 for (
auto *I : RD->
decls()) {
3977 if (
auto *FD = dyn_cast<FieldDecl>(I)) {
3978 UninitializedFields.insert(FD);
3979 }
else if (
auto *IFD = dyn_cast<IndirectFieldDecl>(I)) {
3980 UninitializedFields.insert(IFD->getAnonField());
3985 for (
const auto &I : RD->
bases())
3986 UninitializedBaseClasses.insert(I.getType().getCanonicalType());
3988 if (UninitializedFields.empty() && UninitializedBaseClasses.empty())
3991 UninitializedFieldVisitor UninitializedChecker(
SemaRef,
3992 UninitializedFields,
3993 UninitializedBaseClasses);
3995 for (
const auto *FieldInit :
Constructor->inits()) {
3996 if (UninitializedFields.empty() && UninitializedBaseClasses.empty())
3999 Expr *InitExpr = FieldInit->getInit();
4004 dyn_cast<CXXDefaultInitExpr>(InitExpr)) {
4005 InitExpr =
Default->getExpr();
4009 UninitializedChecker.CheckInitializer(InitExpr, Constructor,
4010 FieldInit->getAnyMember(),
4011 FieldInit->getBaseClass());
4013 UninitializedChecker.CheckInitializer(InitExpr,
nullptr,
4014 FieldInit->getAnyMember(),
4015 FieldInit->getBaseClass());
4028 if (!
D.isFunctionDeclarator())
4030 auto &FTI =
D.getFunctionTypeInfo();
4035 auto *ParamDecl = cast<NamedDecl>(Param.Param);
4036 if (ParamDecl->getDeclName())
4057 return ConstraintExpr;
4072 return Seq.Perform(*
this, Entity, Kind, InitExpr);
4083 if (isa<MSPropertyDecl>(
D)) {
4090 "must set init style when field is created");
4104 assert(
Init.isUsable() &&
"Init should at least have a RecoveryExpr");
4110 if (!
Init.isInvalid())
4112 if (
Init.isInvalid()) {
4130 DirectBaseSpec =
nullptr;
4131 for (
const auto &
Base : ClassDecl->
bases()) {
4135 DirectBaseSpec = &
Base;
4143 VirtualBaseSpec =
nullptr;
4144 if (!DirectBaseSpec || !DirectBaseSpec->
isVirtual()) {
4154 if (
Path->back().Base->isVirtual()) {
4155 VirtualBaseSpec =
Path->back().Base;
4162 return DirectBaseSpec || VirtualBaseSpec;
4176 DS, IdLoc, InitList,
4194 DS, IdLoc, List, EllipsisLoc);
4203 explicit MemInitializerValidatorCCC(
CXXRecordDecl *ClassDecl)
4204 : ClassDecl(ClassDecl) {}
4206 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
4209 return Member->getDeclContext()->getRedeclContext()->Equals(ClassDecl);
4210 return isa<TypeDecl>(ND);
4215 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
4216 return std::make_unique<MemInitializerValidatorCCC>(*
this);
4231 return isa<FieldDecl, IndirectFieldDecl>(Elem) &&
4237 Diag(
Loc, diag::err_using_placeholder_variable) << Name;
4242 if (isa<FieldDecl, IndirectFieldDecl>(ND) &&
4253 for (
auto *
D : ClassDecl->
lookup(MemberOrBase)) {
4254 if (isa<FieldDecl, IndirectFieldDecl>(
D)) {
4255 bool IsPlaceholder =
D->isPlaceholderVar(
getLangOpts());
4262 return cast<ValueDecl>(
D);
4263 ND = cast<ValueDecl>(
D);
4300 = dyn_cast<CXXConstructorDecl>(ConstructorD);
4324 ClassDecl, SS, TemplateTypeTy, MemberOrBase)) {
4326 Diag(EllipsisLoc, diag::err_pack_expansion_member_init)
4336 if (TemplateTypeTy) {
4361 bool NotUnknownSpecialization =
false;
4364 NotUnknownSpecialization = !
Record->hasAnyDependentBases();
4366 if (!NotUnknownSpecialization) {
4391 auto *TempSpec = cast<TemplateSpecializationType>(
4392 UnqualifiedBase->getInjectedClassNameSpecialization());
4394 for (
auto const &
Base : ClassDecl->
bases()) {
4400 Diag(IdLoc, diag::ext_unqualified_base_class)
4402 BaseType =
Base.getType();
4411 MemInitializerValidatorCCC CCC(ClassDecl);
4420 PDiag(diag::err_mem_init_not_member_or_class_suggest)
4421 << MemberOrBase <<
true);
4428 DirectBaseSpec, VirtualBaseSpec)) {
4433 PDiag(diag::err_mem_init_not_member_or_class_suggest)
4434 << MemberOrBase <<
false,
4447 if (!TyD && BaseType.
isNull()) {
4448 Diag(IdLoc, diag::err_mem_init_not_member_or_class)
4449 << MemberOrBase <<
SourceRange(IdLoc,
Init->getSourceRange().getEnd());
4477 assert((DirectMember || IndirectMember) &&
4478 "Member must be a FieldDecl or IndirectFieldDecl");
4483 if (
Member->isInvalidDecl())
4488 Args =
MultiExprArg(ParenList->getExprs(), ParenList->getNumExprs());
4490 Args =
MultiExprArg(InitList->getInits(), InitList->getNumInits());
4498 if (
Member->getType()->isDependentType() ||
Init->isTypeDependent()) {
4503 bool InitList =
false;
4504 if (isa<InitListExpr>(
Init)) {
4516 IdLoc,
Init->getBeginLoc(),
Init->getEndLoc())
4560 return Diag(NameLoc, diag::err_delegating_ctor)
4562 Diag(NameLoc, diag::warn_cxx98_compat_delegating_ctor);
4564 bool InitList =
true;
4568 Args =
MultiExprArg(ParenList->getExprs(), ParenList->getNumExprs());
4577 NameLoc,
Init->getBeginLoc(),
Init->getEndLoc())
4585 cast<CXXConstructExpr>(DelegationInit.
get())->getConstructor()) &&
4586 "Delegating constructor with no target?");
4592 DelegationInit.
get(), InitRange.
getBegin(),
false);
4610 DelegationInit =
Init;
4625 return Diag(BaseLoc, diag::err_base_init_does_not_name_class)
4645 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
4674 if (!DirectBaseSpec && !VirtualBaseSpec) {
4683 return Diag(BaseLoc, diag::err_not_direct_base_or_virtual)
4695 InitRange.
getEnd(), EllipsisLoc);
4702 if (DirectBaseSpec && VirtualBaseSpec)
4703 return Diag(BaseLoc, diag::err_base_init_direct_and_virtual)
4708 BaseSpec = VirtualBaseSpec;
4711 bool InitList =
true;
4715 Args =
MultiExprArg(ParenList->getExprs(), ParenList->getNumExprs());
4755 InitRange.
getEnd(), EllipsisLoc);
4765 TargetType, ExprLoc);
4785 bool IsInheritedVirtualBase,
4789 IsInheritedVirtualBase);
4793 switch (ImplicitInitKind) {
4799 BaseInit = InitSeq.Perform(
SemaRef, InitEntity, InitKind, {});
4805 bool Moving = ImplicitInitKind ==
IIK_Move;
4806 ParmVarDecl *Param = Constructor->getParamDecl(0);
4812 Constructor->getLocation(), ParamType,
4827 BasePath.push_back(BaseSpec);
4829 CK_UncheckedDerivedToBase,
4837 BaseInit = InitSeq.
Perform(
SemaRef, InitEntity, InitKind, CopyCtorArg);