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)
369 if (Param->isParameterPack()) {
370 Diag(EqualLoc, diag::err_param_default_argument_on_parameter_pack)
373 Param->setDefaultArg(
nullptr);
384 CheckDefaultArgumentVisitor DefaultArgChecker(*
this, DefaultArg);
385 if (DefaultArgChecker.Visit(DefaultArg))
398 Param->setUnparsedDefaultArg();
408 Param->setInvalidDecl();
413 Param->getType().getNonReferenceType());
416 Param->getType().getNonReferenceType());
418 Param->setDefaultArg(RE.
get());
433 if (MightBeFunction) {
437 MightBeFunction =
false;
440 for (
unsigned argIdx = 0, e = chunk.
Fun.
NumParams; argIdx != e;
443 if (Param->hasUnparsedDefaultArg()) {
444 std::unique_ptr<CachedTokens> Toks =
447 if (Toks->size() > 1)
449 Toks->back().getLocation());
452 Diag(Param->getLocation(), diag::err_param_default_argument_nonfunc)
454 }
else if (Param->getDefaultArg()) {
455 Diag(Param->getLocation(), diag::err_param_default_argument_nonfunc)
456 << Param->getDefaultArg()->getSourceRange();
457 Param->setDefaultArg(
nullptr);
461 MightBeFunction =
false;
468 return P->hasDefaultArg() && !P->hasInheritedDefaultArg();
480 ?
New->getLexicalDeclContext()
481 :
New->getDeclContext();
485 for (; PrevForDefaultArgs;
488 PrevForDefaultArgs =
New->isLocalExternDecl()
496 !
New->isCXXClassMember()) {
533 for (
unsigned p = 0, NumParams = PrevForDefaultArgs
536 p < NumParams; ++p) {
540 bool OldParamHasDfl = OldParam ? OldParam->
hasDefaultArg() :
false;
543 if (OldParamHasDfl && NewParamHasDfl) {
544 unsigned DiagDefaultParamID =
545 diag::err_param_default_argument_redefinition;
560 DiagDefaultParamID = diag::ext_param_default_argument_redefinition;
578 for (
auto Older = PrevForDefaultArgs;
580 Older = Older->getPreviousDecl();
581 OldParam = Older->getParamDecl(p);
586 }
else if (OldParamHasDfl) {
592 !
New->getLexicalDeclContext()->isDependentContext()) {
604 }
else if (NewParamHasDfl) {
605 if (
New->getDescribedFunctionTemplate()) {
608 diag::err_param_default_argument_template_redecl)
611 diag::note_template_prev_declaration)
613 }
else if (
New->getTemplateSpecializationKind()
627 <<
New->getDeclName()
629 }
else if (
New->getDeclContext()->isDependentContext()) {
641 = dyn_cast<CXXRecordDecl>(
New->getDeclContext())) {
642 if (
Record->getDescribedClassTemplate())
651 diag::err_param_default_argument_member_template_redecl)
665 if (NewSM != OldSM) {
668 Diag(NewParam->
getLocation(), diag::err_default_arg_makes_ctor_special)
679 Diag(
New->getLocation(), diag::err_constexpr_redecl_mismatch)
689 (
New->isInlineSpecified() ||
694 Diag(
New->getLocation(), diag::err_inline_decl_follows_def) <<
New;
704 !
New->isFunctionTemplateSpecialization() &&
isVisible(Old)) {
705 Diag(
New->getLocation(), diag::err_deduction_guide_redeclared);
715 Diag(
New->getLocation(), diag::err_friend_decl_with_def_arg_redeclared);
727 if (
New->isThisDeclarationInstantiatedFromAFriendDefinition() &&
736 ? diag::warn_cxx23_placeholder_var_definition
737 : diag::ext_placeholder_var_definition);
755 if (!TemplateParamLists.empty()) {
761 Diag(TemplateParamLists.front()->getTemplateLoc(),
762 diag::err_decomp_decl_template);
768 DiagID = diag::compat_pre_cxx17_decomp_decl;
771 ? diag::compat_cxx26_decomp_decl_cond
772 : diag::compat_pre_cxx26_decomp_decl_cond;
774 DiagID = diag::compat_cxx17_decomp_decl;
795 Diag(Loc, diag::err_decomp_decl_spec) << Name;
798 auto DiagCpp20Specifier = [&](StringRef Name,
SourceLocation Loc) {
799 DiagCompat(Loc, diag_compat::decomp_decl_spec) << Name;
802 if (
auto SCS = DS.getStorageClassSpec()) {
805 DS.getStorageClassSpecLoc());
808 DS.getStorageClassSpecLoc());
810 if (
auto TSCS = DS.getThreadStorageClassSpec())
812 DS.getThreadStorageClassSpecLoc());
814 if (DS.isInlineSpecified())
815 DiagBadSpecifier(
"inline", DS.getInlineSpecLoc());
822 DS.getConstexprSpecLoc());
833 Diag(DS.getVolatileSpecLoc(),
834 diag::warn_deprecated_volatile_structured_binding);
854 ? diag::err_decomp_decl_parens
855 : diag::err_decomp_decl_type)
861 if (R->isFunctionType())
866 if (DS.isConstrainedAuto()) {
869 "No other template kind should be possible for a constrained auto");
887 assert(VarName &&
"Cannot have an unnamed binding declaration");
896 Previous.getFoundDecl()->isTemplateParameter()) {
902 if (B.EllipsisLoc.isValid()) {
904 Diag(B.EllipsisLoc, diag::err_pack_outside_template);
905 QT =
Context.getPackExpansionType(
Context.DependentTy, std::nullopt,
937 auto *Old =
Previous.getRepresentativeDecl();
938 Diag(B.NameLoc, diag::err_redefinition) << B.Name;
939 Diag(Old->getLocation(), diag::note_previous_definition);
957 bool AddToScope =
true;
966 if (
OpenMP().isInOpenMPDeclareTargetContext())
967 OpenMP().checkDeclIsAllowedInOpenMPTarget(
nullptr,
New);
977 unsigned MemberCount) {
978 auto BindingWithPackItr = llvm::find_if(
980 bool HasPack = BindingWithPackItr !=
Bindings.end();
983 IsValid =
Bindings.size() == MemberCount;
986 IsValid = MemberCount >=
Bindings.size() - 1;
989 if (IsValid && HasPack) {
991 unsigned PackSize = MemberCount -
Bindings.size() + 1;
997 for (
unsigned I = 0; I < PackSize; ++I) {
1002 NestedBDs[I] = NestedBD;
1015 S.
Diag(DD->
getLocation(), diag::err_decomp_decl_wrong_number_bindings)
1017 << (MemberCount <
Bindings.size());
1032 for (
auto *B : DD->flat_bindings()) {
1037 E = GetInit(Loc, E.
get(), I++);
1040 B->setBinding(ElemType, E.
get());
1049 const llvm::APSInt &NumElems,
1052 S,
Bindings, Src, DecompType, NumElems, ElemType,
1083 S,
Bindings, Src, DecompType, llvm::APSInt::get(2),
1087 return S.CreateBuiltinUnaryOp(Loc, I ? UO_Imag : UO_Real, Base);
1095 llvm::raw_svector_ostream OS(SS);
1107 return std::string(OS.str());
1112 auto DiagnoseMissing = [&] {
1122 return DiagnoseMissing();
1132 return DiagnoseMissing();
1133 if (
Result.isAmbiguous())
1138 Result.suppressDiagnostics();
1140 S.
Diag(Loc, diag::err_std_type_trait_not_class_template) << Trait;
1141 S.
Diag(
Found->getLocation(), diag::note_declared_at);
1155 Loc, TraitTy, DiagID,
1165 assert(RD &&
"specialization of class template is not a class?");
1170static TemplateArgumentLoc
1177static TemplateArgumentLoc
1182namespace {
enum class IsTupleLike { TupleLike, NotTupleLike, Error }; }
1185 unsigned &OutSize) {
1195 return IsTupleLike::NotTupleLike;
1203 return IsTupleLike::NotTupleLike;
1212 : R(R), Args(Args) {}
1215 return S.
Diag(Loc, diag::err_decomp_decl_std_tuple_size_not_constant)
1219 } Diagnoser(R, Args);
1224 return IsTupleLike::Error;
1229 return IsTupleLike::Error;
1233 if (Size < 0 || Size >=
UINT_MAX) {
1236 S.
Diag(Loc, diag::err_decomp_decl_std_tuple_size_invalid)
1239 << StringRef(Str.data(), Str.size());
1240 return IsTupleLike::Error;
1243 OutSize = Size.getExtValue();
1244 return IsTupleLike::TupleLike;
1258 diag::err_decomp_decl_std_tuple_element_not_specialized);
1267 auto *TD = R.getAsSingle<
TypeDecl>();
1269 R.suppressDiagnostics();
1270 S.
Diag(Loc, diag::err_decomp_decl_std_tuple_element_not_specialized)
1274 S.
Diag(R.getRepresentativeDecl()->getLocation(), diag::note_declared_at);
1283struct InitializingBinding {
1285 InitializingBinding(Sema &S, BindingDecl *BD) : S(S) {
1286 Sema::CodeSynthesisContext Ctx;
1292 ~InitializingBinding() {
1301 unsigned NumElems) {
1315 bool UseMemberGet =
false;
1325 dyn_cast<FunctionTemplateDecl>(D->getUnderlyingDecl())) {
1327 if (TPL->
size() != 0 &&
1330 UseMemberGet =
true;
1338 for (
auto *B : DD->flat_bindings()) {
1339 InitializingBinding InitContext(S, B);
1362 MemberGet, &Args,
nullptr);
1404 B->getDeclName().getAsIdentifierInfo(),
U,
1409 if (
const auto *CIAttr = Src->
getAttr<ConstInitAttr>())
1410 BindingVD->addAttr(CIAttr->clone(S.
Context));
1411 BindingVD->setImplicit();
1413 BindingVD->setInlineSpecified();
1414 BindingVD->getLexicalDeclContext()->addHiddenDecl(BindingVD);
1419 E =
Seq.Perform(S, Entity, Kind,
Init);
1425 BindingVD->setInit(E.
get());
1433 B->setBinding(T, E.
get());
1448 return Specifier->getType()->getAsCXXRecordDecl()->hasDirectFields();
1457 ClassWithFields = RD;
1469 for (
auto &P : Paths) {
1473 BestPath->back().Base->getType())) {
1475 S.
Diag(Loc, diag::err_decomp_decl_multiple_bases_with_members)
1476 <<
false << RD << BestPath->back().Base->getType()
1477 << P.back().Base->getType();
1479 }
else if (P.Access < BestPath->
Access) {
1485 QualType BaseType = BestPath->back().Base->getType();
1487 S.
Diag(Loc, diag::err_decomp_decl_ambiguous_base)
1494 *BestPath, diag::err_decomp_decl_inaccessible_base);
1497 ClassWithFields = BaseType->getAsCXXRecordDecl();
1505 S.
Diag(Loc, diag::err_decomp_decl_multiple_bases_with_members)
1506 << (ClassWithFields == RD) << RD << ClassWithFields
1507 << Paths.
front().back().Base->getType();
1518 const auto *RD = cast_or_null<CXXRecordDecl>(BasePair.
getDecl());
1522 for (
auto *FD : RD->fields()) {
1523 if (FD->isUnnamedBitField())
1528 if (!FD->getDeclName()) {
1529 if (RD->isLambda()) {
1530 S.
Diag(Loc, diag::err_decomp_decl_lambda);
1531 S.
Diag(RD->getLocation(), diag::note_lambda_decl);
1535 if (FD->isAnonymousStructOrUnion()) {
1536 S.
Diag(Loc, diag::err_decomp_decl_anon_union_member)
1538 S.
Diag(FD->getLocation(), diag::note_declared_at);
1551 BasePair.
getAccess(), FD->getAccess())));
1560 diag::err_incomplete_type))
1566 const auto *RD = cast_or_null<CXXRecordDecl>(BasePair.
getDecl());
1573 unsigned NumFields = llvm::count_if(
1574 RD->fields(), [](
FieldDecl *FD) { return !FD->isUnnamedBitField(); });
1581 auto FlatBindings = DD->flat_bindings();
1582 assert(llvm::range_size(FlatBindings) == NumFields);
1583 auto FlatBindingsItr = FlatBindings.begin();
1589 for (
auto *FD : RD->fields()) {
1594 assert(FlatBindingsItr != FlatBindings.end());
1636 if (B->getType().isNull())
1637 B->setType(
Context.DependentTy);
1649 if (
auto *CAT =
Context.getAsConstantArrayType(DecompType)) {
1670 case IsTupleLike::Error:
1674 case IsTupleLike::TupleLike:
1679 case IsTupleLike::NotTupleLike:
1688 << DD << !RD << DecompType;
1703 assert(!T->isDependentType());
1708 T =
Context.getQualifiedType(Unqual, Quals);
1711 return static_cast<unsigned>(CAT->getSize().getZExtValue());
1713 return VT->getNumElements();
1719 case IsTupleLike::Error:
1720 return std::nullopt;
1721 case IsTupleLike::TupleLike:
1723 case IsTupleLike::NotTupleLike:
1728 if (!OrigRD || OrigRD->
isUnion())
1729 return std::nullopt;
1732 return std::nullopt;
1737 const auto *RD = cast_or_null<CXXRecordDecl>(BasePair.
getDecl());
1739 return std::nullopt;
1741 unsigned NumFields = llvm::count_if(
1742 RD->fields(), [](
FieldDecl *FD) { return !FD->isUnnamedBitField(); });
1745 return std::nullopt;
1756 "Should only be called if types are otherwise the same.");
1764 NewType = R->getPointeeType();
1783 New->setInvalidDecl();
1797 if (FTD->isMemberSpecialization())
1806 if (Param->hasDefaultArg())
1817 if (Param->hasDefaultArg() || Param->isParameterPack() ||
1821 if (Param->isInvalidDecl())
1823 else if (Param->getIdentifier())
1824 Diag(Param->getLocation(), diag::err_param_default_argument_missing_name)
1825 << Param->getIdentifier();
1827 Diag(Param->getLocation(), diag::err_param_default_argument_missing);
1834template <
typename... Ts>
1838 if (T->isDependentType())
1844 std::forward<Ts>(DiagArgs)...);
1847 return !T->isLiteralType(SemaRef.
Context);
1850 llvm_unreachable(
"unknown CheckConstexprKind");
1858 "this check is obsolete for C++23");
1861 T->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
1869 SemaRef.
Diag(Loc, diag::note_constexpr_dtor_subobject)
1877 if (!Check(B.getBaseTypeLoc(), B.getType(),
nullptr))
1880 if (!Check(FD->getLocation(), FD->getType(), FD))
1891 "this check is obsolete for C++23");
1892 unsigned ArgIndex = 0;
1895 e = FT->param_type_end();
1896 i != e; ++i, ++ArgIndex) {
1898 assert(PD &&
"null in a parameter list");
1901 diag::err_constexpr_non_literal_param, ArgIndex + 1,
1914 "this check is obsolete for C++23");
1916 diag::err_constexpr_non_literal_return,
1935 default: llvm_unreachable(
"Invalid tag kind for record diagnostic!");
1963 for (
const auto &I : RD->
vbases())
1964 Diag(I.getBeginLoc(), diag::note_constexpr_virtual_base_here)
1965 << I.getSourceRange();
1979 Diag(
Method->getLocation(), diag::warn_cxx17_compat_constexpr_virtual);
1985 Diag(
Method->getLocation(), diag::err_constexpr_virtual);
1992 if (WrittenVirtual !=
Method)
1994 diag::note_overridden_virtual_function);
2005 if (
auto *Dtor = dyn_cast<CXXDestructorDecl>(NewFD)) {
2010 !Dtor->getParent()->defaultedDestructorIsConstexpr()) {
2025 "CheckConstexprFunctionDefinition called on function with no body");
2040 for (
const auto *DclIt : DS->
decls()) {
2041 switch (DclIt->getKind()) {
2042 case Decl::StaticAssert:
2044 case Decl::UsingShadow:
2045 case Decl::UsingDirective:
2046 case Decl::UnresolvedUsingTypename:
2047 case Decl::UnresolvedUsingValue:
2048 case Decl::UsingEnum:
2056 case Decl::TypeAlias: {
2060 if (TN->getUnderlyingType()->isVariablyModifiedType()) {
2063 TypeLoc TL = TN->getTypeSourceInfo()->getTypeLoc();
2074 case Decl::CXXRecord:
2079 diag_compat::constexpr_type_definition)
2087 case Decl::EnumConstant:
2088 case Decl::IndirectField:
2095 case Decl::Decomposition: {
2101 if (VD->isThisDeclarationADefinition()) {
2102 if (VD->isStaticLocal()) {
2105 diag_compat::constexpr_static_var)
2112 if (SemaRef.
LangOpts.CPlusPlus23) {
2114 diag::warn_cxx20_compat_constexpr_var,
2117 SemaRef, Kind, VD->getLocation(), VD->getType(),
2118 diag::err_constexpr_local_var_non_literal_type,
2122 if (!VD->getType()->isDependentType() &&
2123 !VD->hasInit() && !VD->isCXXForRangeDecl()) {
2126 diag_compat::constexpr_local_var_no_init)
2135 SemaRef.
DiagCompat(VD->getLocation(), diag_compat::constexpr_local_var)
2143 case Decl::NamespaceAlias:
2144 case Decl::Function:
2153 SemaRef.
Diag(DS->
getBeginLoc(), diag::err_constexpr_body_invalid_stmt)
2187 if (Field->isInvalidDecl())
2190 if (Field->isUnnamedBitField())
2196 if (Field->isAnonymousStructOrUnion() &&
2197 (Field->getType()->isUnionType()
2198 ? !Field->getType()->getAsCXXRecordDecl()->hasVariantMembers()
2199 : Field->getType()->getAsCXXRecordDecl()->isEmpty()))
2202 if (!
Inits.count(Field)) {
2206 diag_compat::constexpr_ctor_missing_init);
2209 SemaRef.
Diag(Field->getLocation(),
2210 diag::note_constexpr_ctor_missing_init);
2214 }
else if (Field->isAnonymousStructOrUnion()) {
2215 const auto *RD = Field->getType()->castAsRecordDecl();
2216 for (
auto *I : RD->fields())
2219 if (!RD->isUnion() ||
Inits.count(I))
2237 case Stmt::NullStmtClass:
2241 case Stmt::DeclStmtClass:
2251 case Stmt::ReturnStmtClass:
2263 case Stmt::AttributedStmtClass:
2268 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind);
2270 case Stmt::CompoundStmtClass: {
2276 for (
auto *BodyIt : CompStmt->
body()) {
2278 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2284 case Stmt::IfStmtClass: {
2291 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2293 if (
If->getElse() &&
2295 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2300 case Stmt::WhileStmtClass:
2301 case Stmt::DoStmtClass:
2302 case Stmt::ForStmtClass:
2303 case Stmt::CXXForRangeStmtClass:
2304 case Stmt::ContinueStmtClass:
2314 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2319 case Stmt::SwitchStmtClass:
2320 case Stmt::CaseStmtClass:
2321 case Stmt::DefaultStmtClass:
2322 case Stmt::BreakStmtClass:
2330 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2335 case Stmt::LabelStmtClass:
2336 case Stmt::GotoStmtClass:
2342 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2347 case Stmt::GCCAsmStmtClass:
2348 case Stmt::MSAsmStmtClass:
2350 case Stmt::CXXTryStmtClass:
2356 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2361 case Stmt::CXXCatchStmtClass:
2366 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2418 diag_compat::constexpr_function_try_block)
2433 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2444 }
else if (Cxx2bLoc.
isValid()) {
2445 SemaRef.
DiagCompat(Cxx2bLoc, diag_compat::cxx23_constexpr_body_invalid_stmt)
2447 }
else if (Cxx2aLoc.
isValid()) {
2448 SemaRef.
DiagCompat(Cxx2aLoc, diag_compat::cxx20_constexpr_body_invalid_stmt)
2450 }
else if (Cxx1yLoc.
isValid()) {
2451 SemaRef.
DiagCompat(Cxx1yLoc, diag_compat::cxx14_constexpr_body_invalid_stmt)
2456 = dyn_cast<CXXConstructorDecl>(Dcl)) {
2469 diag_compat::constexpr_union_ctor_no_init);
2476 assert(RD->
getNumVBases() == 0 &&
"constexpr ctor with virtual bases");
2480 bool AnyAnonStructUnionMembers =
false;
2481 unsigned Fields = 0;
2483 E = RD->
field_end(); I != E; ++I, ++Fields) {
2484 if (I->isAnonymousStructOrUnion()) {
2485 AnyAnonStructUnionMembers =
true;
2493 if (AnyAnonStructUnionMembers ||
2503 Inits.insert(ID->chain_begin(), ID->chain_end());
2506 bool Diagnosed =
false;
2507 for (
auto *I : RD->
fields())
2514 if (ReturnStmts.empty()) {
2529 }
else if (ReturnStmts.size() > 1) {
2533 diag_compat::constexpr_body_multiple_return);
2534 for (
unsigned I = 0; I < ReturnStmts.size() - 1; ++I)
2535 SemaRef.
Diag(ReturnStmts[I],
2536 diag::note_constexpr_body_previous_return);
2564 !SemaRef.
getLangOpts().CheckConstexprFunctionBodies ||
2567 diag::ext_constexpr_function_never_constant_expr, Dcl->
getLocation());
2572 diag::ext_constexpr_function_never_constant_expr)
2575 for (
const auto &
Diag : Diags)
2591 if (SemaRef.
getLangOpts().CPlusPlus23 && !IsVoidOrDependentType)
2598 bool OK = SemaRef.
getLangOpts().CPlusPlus14 && IsVoidOrDependentType;
2600 OK ? diag::warn_cxx11_compat_constexpr_body_no_return
2601 : diag::err_constexpr_body_no_return)
2615 Diag(it->second, diag::err_immediate_function_used_before_definition)
2628 "expected an immediate function");
2629 assert(FD->
hasBody() &&
"expected the function to have a body");
2634 bool ImmediateFnIsConstructor;
2641 ShouldVisitImplicitCode =
true;
2642 ShouldVisitLambdaBody =
false;
2648 if (CurrentConstructor && CurrentInit) {
2656 SemaRef.Diag(Loc, diag::note_immediate_function_reason)
2657 << ImmediateFn << Fn << Fn->isConsteval() << IsCall
2659 << (InitializedField !=
nullptr)
2660 << (CurrentInit && !CurrentInit->
isWritten())
2661 << InitializedField << Range;
2663 bool TraverseCallExpr(
CallExpr *E)
override {
2664 if (
const auto *DR =
2666 DR && DR->isImmediateEscalating()) {
2672 if (!TraverseStmt(A))
2679 if (
const auto *ReferencedFn = dyn_cast<FunctionDecl>(E->
getDecl());
2681 Diag(E, ReferencedFn,
false);
2704 return DynamicRecursiveASTVisitor::TraverseCXXConstructorDecl(Ctr);
2707 bool TraverseType(
QualType T,
bool TraverseQualifier)
override {
2710 bool VisitBlockExpr(
BlockExpr *T)
override {
return true; }
2712 } Visitor(*
this, FD);
2713 Visitor.TraverseDecl(FD);
2724 return dyn_cast_or_null<CXXRecordDecl>(DC);
2727 return dyn_cast_or_null<CXXRecordDecl>(
CurContext);
2745 CurDecl = dyn_cast_or_null<CXXRecordDecl>(DC);
2747 CurDecl = dyn_cast_or_null<CXXRecordDecl>(
CurContext);
2766 if (BaseType->containsErrors()) {
2771 if (EllipsisLoc.
isValid() && !BaseType->containsUnexpandedParameterPack()) {
2772 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
2786 if (BaseDecl->isUnion()) {
2787 Diag(BaseLoc, diag::err_union_as_base_class) << SpecifierRange;
2791 if (BaseType.hasQualifiers()) {
2793 BaseType.getQualifiers().getAsString(
Context.getPrintingPolicy());
2794 Diag(BaseLoc, diag::warn_qual_base_type)
2795 << Quals << llvm::count(Quals,
' ') + 1 << BaseType;
2796 Diag(BaseLoc, diag::note_base_class_specified_here) << BaseType;
2800 if (
Context.getTargetInfo().getCXXABI().isMicrosoft() ||
2801 Context.getTargetInfo().getTriple().isPS()) {
2803 if (
auto *BaseSpec =
2804 dyn_cast<ClassTemplateSpecializationDecl>(BaseDecl)) {
2813 Class->setInvalidDecl();
2817 BaseDecl = BaseDecl->getDefinition();
2818 assert(BaseDecl &&
"Base type is not incomplete, but has no definition");
2823 const auto *BaseCSA = BaseDecl->getAttr<CodeSegAttr>();
2824 const auto *DerivedCSA =
Class->getAttr<CodeSegAttr>();
2825 if ((DerivedCSA || BaseCSA) &&
2826 (!BaseCSA || !DerivedCSA ||
2827 BaseCSA->getName() != DerivedCSA->getName())) {
2828 Diag(
Class->getLocation(), diag::err_mismatched_code_seg_base);
2829 Diag(BaseDecl->getLocation(), diag::note_base_class_specified_here)
2840 if (BaseDecl->hasFlexibleArrayMember()) {
2841 Diag(BaseLoc, diag::err_base_class_has_flexible_array_member)
2842 << BaseDecl->getDeclName();
2849 if (FinalAttr *FA = BaseDecl->getAttr<FinalAttr>()) {
2850 Diag(BaseLoc, diag::err_class_marked_final_used_as_base)
2851 << BaseDecl->getDeclName() << FA->isSpelledAsSealed();
2852 Diag(BaseDecl->getLocation(), diag::note_entity_declared_at)
2853 << BaseDecl->getDeclName() << FA->getRange();
2858 if (BaseDecl->isInvalidDecl())
2859 Class->setInvalidDecl();
2860 }
else if (BaseType->isDependentType()) {
2867 if (!
Class->isDependentContext())
2868 Class->setInvalidDecl();
2871 Diag(BaseLoc, diag::err_base_must_be_class) << SpecifierRange;
2883 Access, TInfo, EllipsisLoc);
2900 Class->setIsParsingBaseSpecifiers();
2910 Diag(AL.getLoc(), diag::err_base_specifier_attribute)
2911 << AL << AL.isRegularKeywordAttribute() << AL.getRange();
2924 if (
Class->isUnion()) {
2925 Diag(
Class->getLocation(), diag::err_base_clause_on_union)
2935 Class->setInvalidDecl();
2952 for (
const auto &BaseSpec :
Decl->bases()) {
2953 QualType Base = Context.getCanonicalType(BaseSpec.getType())
2954 .getUnqualifiedType();
2971 std::map<QualType, CXXBaseSpecifier*, QualTypeOrdering> KnownBaseTypes;
2978 unsigned NumGoodBases = 0;
2980 for (
unsigned idx = 0; idx < Bases.size(); ++idx) {
2990 Diag(Bases[idx]->getBeginLoc(), diag::err_duplicate_base_class)
2991 << KnownBase->
getType() << Bases[idx]->getSourceRange();
2995 Context.Deallocate(Bases[idx]);
3000 KnownBase = Bases[idx];
3001 Bases[NumGoodBases++] = Bases[idx];
3006 if (Bases.size() > 1)
3010 if (
Class->isInterface() &&
3011 (!RD->isInterfaceLike() ||
3017 << RD->getSourceRange();
3020 if (RD->hasAttr<WeakAttr>())
3027 Class->setBases(Bases.data(), NumGoodBases);
3030 for (
unsigned idx = 0; idx < NumGoodBases; ++idx) {
3032 QualType BaseType = Bases[idx]->getType();
3036 if (BaseType->isDependentType())
3040 .getUnqualifiedType();
3042 if (IndirectBaseTypes.count(CanonicalBase)) {
3046 =
Class->isDerivedFrom(CanonicalBase->getAsCXXRecordDecl(), Paths);
3051 Diag(Bases[idx]->getBeginLoc(), diag::warn_inaccessible_base_class)
3053 << Bases[idx]->getSourceRange();
3055 assert(Bases[idx]->isVirtual());
3060 Context.Deallocate(Bases[idx]);
3068 if (!ClassDecl || Bases.empty())
3080 if (!
Base || !Derived)
3108 Base->getAsCXXRecordDecl(), Paths);
3114 Base->getAsCXXRecordDecl(), Paths);
3123 for (
unsigned I = Path.size(); I != 0; --I) {
3124 if (Path[I - 1].
Base->isVirtual()) {
3131 for (
unsigned I = Start, E = Path.size(); I != E; ++I)
3138 assert(BasePathArray.empty() &&
"Base path array must be empty!");
3140 return ::BuildBasePathArray(Paths.
front(), BasePathArray);
3145 unsigned InaccessibleBaseID,
3146 unsigned AmbiguousBaseConvID,
3150 bool IgnoreAccess) {
3158 if (!DerivationOkay)
3163 Path = &Paths.
front();
3170 if (PossiblePath.size() == 1) {
3171 Path = &PossiblePath;
3172 if (AmbiguousBaseConvID)
3173 Diag(Loc, diag::ext_ms_ambiguous_direct_base)
3174 <<
Base << Derived << Range;
3181 if (!IgnoreAccess) {
3200 if (AmbiguousBaseConvID) {
3210 assert(StillOkay &&
"Can only be used with a derived-to-base conversion");
3219 Diag(Loc, AmbiguousBaseConvID)
3220 << Derived <<
Base << PathDisplayStr << Range << Name;
3229 bool IgnoreAccess) {
3231 Derived,
Base, diag::err_upcast_to_inaccessible_base,
3232 diag::err_ambiguous_derived_to_base_conv, Loc, Range,
DeclarationName(),
3233 BasePath, IgnoreAccess);
3237 std::string PathDisplayStr;
3238 std::set<unsigned> DisplayedPaths;
3240 if (DisplayedPaths.insert(Path.back().SubobjectNumber).second) {
3243 PathDisplayStr +=
"\n ";
3247 PathDisplayStr +=
" -> " + Element.Base->getType().getAsString();
3251 return PathDisplayStr;
3261 assert(Access !=
AS_none &&
"Invalid kind for syntactic access specifier!");
3290 if (!OverloadedMethods.empty()) {
3291 if (OverrideAttr *OA = D->
getAttr<OverrideAttr>()) {
3292 Diag(OA->getLocation(),
3293 diag::override_keyword_hides_virtual_member_function)
3294 <<
"override" << (OverloadedMethods.size() > 1);
3295 }
else if (FinalAttr *FA = D->
getAttr<FinalAttr>()) {
3296 Diag(FA->getLocation(),
3297 diag::override_keyword_hides_virtual_member_function)
3298 << (FA->isSpelledAsSealed() ?
"sealed" :
"final")
3299 << (OverloadedMethods.size() > 1);
3310 if (OverrideAttr *OA = D->
getAttr<OverrideAttr>()) {
3311 Diag(OA->getLocation(),
3312 diag::override_keyword_only_allowed_on_virtual_member_functions)
3316 if (FinalAttr *FA = D->
getAttr<FinalAttr>()) {
3317 Diag(FA->getLocation(),
3318 diag::override_keyword_only_allowed_on_virtual_member_functions)
3319 << (FA->isSpelledAsSealed() ?
"sealed" :
"final")
3331 if (MD->
hasAttr<OverrideAttr>() && !HasOverriddenMethods)
3332 Diag(MD->
getLocation(), diag::err_function_marked_override_not_overriding)
3346 SpellingLoc =
getSourceManager().getImmediateExpansionRange(Loc).getBegin();
3352 auto EmitDiag = [&](
unsigned DiagInconsistent,
unsigned DiagSuggest) {
3363 diag::warn_inconsistent_destructor_marked_not_override_overriding,
3364 diag::warn_suggest_destructor_marked_not_override_overriding);
3366 EmitDiag(diag::warn_inconsistent_function_marked_not_override_overriding,
3367 diag::warn_suggest_function_marked_not_override_overriding);
3373 FinalAttr *FA = Old->
getAttr<FinalAttr>();
3377 Diag(
New->getLocation(), diag::err_final_function_overridden)
3378 <<
New->getDeclName()
3379 << FA->isSpelledAsSealed();
3388 return !RD->isCompleteDefinition() ||
3389 !RD->hasTrivialDefaultConstructor() ||
3390 !RD->hasTrivialDestructor();
3394void Sema::CheckShadowInheritedFields(
const SourceLocation &Loc,
3395 DeclarationName FieldName,
3396 const CXXRecordDecl *RD,
3398 if (Diags.isIgnored(diag::warn_shadow_field, Loc))
3402 std::map<CXXRecordDecl*, NamedDecl*> Bases;
3403 auto FieldShadowed = [&](
const CXXBaseSpecifier *
Specifier,
3404 CXXBasePath &Path) {
3405 const auto Base =
Specifier->getType()->getAsCXXRecordDecl();
3407 if (Bases.find(Base) != Bases.end())
3409 for (
const auto Field :
Base->lookup(FieldName)) {
3413 assert(Bases.find(Base) == Bases.end());
3421 CXXBasePaths Paths(
true,
true,
3426 for (
const auto &P : Paths) {
3427 auto Base = P.back().Base->getType()->getAsCXXRecordDecl();
3428 auto It = Bases.find(Base);
3430 if (It == Bases.end())
3432 auto BaseField = It->second;
3433 assert(BaseField->getAccess() !=
AS_private);
3436 Diag(Loc, diag::warn_shadow_field)
3437 << FieldName << RD <<
Base << DeclIsField;
3438 Diag(BaseField->getLocation(), diag::note_shadow_field);
3444template <
typename AttrType>
3446 if (
const TagDecl *TD = T->getAsTagDecl())
3447 return TD->hasAttr<AttrType>();
3449 return TDT->getDecl()->hasAttr<AttrType>();
3492 unsigned InvalidDecl;
3493 bool ShowDeclName =
true;
3506 ShowDeclName =
false;
3511 ShowDeclName =
false;
3526 Diag(Loc, diag::err_invalid_member_in_interface)
3527 << (InvalidDecl-1) << Name;
3529 Diag(Loc, diag::err_invalid_member_in_interface)
3530 << (InvalidDecl-1) <<
"";
3540 Diag(Loc, diag::err_hlsl_cstor_dstor);
3568 diag::err_storageclass_invalid_for_member);
3575 !isFunc && TemplateParameterLists.empty();
3588 const char *PrevSpec;
3593 assert(!Failed &&
"Making a constexpr member const shouldn't fail");
3597 const char *PrevSpec;
3601 Context.getPrintingPolicy())) {
3603 "This is the only DeclSpec that should fail to be applied");
3607 isInstField =
false;
3618 Diag(Loc, diag::err_bad_variable_name)
3655 if (MSPropertyAttr) {
3657 BitWidth, InitStyle, AS, *MSPropertyAttr);
3660 isInstField =
false;
3663 BitWidth, InitStyle, AS);
3676 if (
Member->isInvalidDecl()) {
3681 Diag(Loc, diag::err_static_not_bitfield)
3685 Diag(Loc, diag::err_typedef_not_bitfield)
3690 Diag(Loc, diag::err_not_integral_type_bitfield)
3691 << Name << cast<ValueDecl>(
Member)->getType()
3696 Member->setInvalidDecl();
3701 NonTemplateMember = FunTmpl->getTemplatedDecl();
3703 NonTemplateMember = VarTmpl->getTemplatedDecl();
3709 if (NonTemplateMember !=
Member)
3715 if (
auto *DG = dyn_cast<CXXDeductionGuideDecl>(NonTemplateMember)) {
3716 auto *TD = DG->getDeducedTemplate();
3719 if (AS != TD->getAccess() &&
3720 TD->getDeclContext()->getRedeclContext()->Equals(
3721 DG->getDeclContext()->getRedeclContext())) {
3722 Diag(DG->getBeginLoc(), diag::err_deduction_guide_wrong_access);
3723 Diag(TD->getBeginLoc(), diag::note_deduction_guide_template_access)
3727 if (
const auto *AccessSpec = dyn_cast<AccessSpecDecl>(D))
3728 LastAccessSpec = AccessSpec;
3730 assert(LastAccessSpec &&
"differing access with no access specifier");
3731 Diag(LastAccessSpec->
getBeginLoc(), diag::note_deduction_guide_access)
3742 ? FinalAttr::Keyword_sealed
3743 : FinalAttr::Keyword_final));
3753 assert((Name || isInstField) &&
"No identifier for non-field ?");
3759 if (!
Diags.isIgnored(diag::warn_unused_private_field, FD->
getLocation()) &&
3771 class UninitializedFieldVisitor
3776 llvm::SmallPtrSetImpl<ValueDecl*> &Decls;
3779 llvm::SmallPtrSetImpl<QualType> &BaseClasses;
3794 UninitializedFieldVisitor(
Sema &S,
3795 llvm::SmallPtrSetImpl<ValueDecl*> &Decls,
3796 llvm::SmallPtrSetImpl<QualType> &BaseClasses)
3797 : Inherited(S.Context), S(S), Decls(Decls), BaseClasses(BaseClasses),
3801 bool IsInitListMemberExprInitialized(
MemberExpr *ME,
3802 bool CheckReferenceOnly) {
3804 bool ReferenceField =
false;
3809 Fields.push_back(FD);
3811 ReferenceField =
true;
3817 if (CheckReferenceOnly && !ReferenceField)
3822 auto UsedFields = llvm::drop_begin(llvm::reverse(Fields));
3823 auto UsedIter = UsedFields.begin();
3824 const auto UsedEnd = UsedFields.end();
3826 for (
const unsigned Orig : InitFieldIndex) {
3827 if (UsedIter == UsedEnd)
3829 const unsigned UsedIndex = (*UsedIter)->getFieldIndex();
3830 if (UsedIndex < Orig)
3832 if (UsedIndex > Orig)
3840 void HandleMemberExpr(MemberExpr *ME,
bool CheckReferenceOnly,
3847 MemberExpr *FieldME = ME;
3852 while (MemberExpr *SubME =
3853 dyn_cast<MemberExpr>(
Base->IgnoreParenImpCasts())) {
3858 if (FieldDecl *FD = dyn_cast<FieldDecl>(SubME->getMemberDecl()))
3863 AllPODFields =
false;
3865 Base = SubME->getBase();
3873 if (AddressOf && AllPODFields)
3878 if (ImplicitCastExpr *BaseCast = dyn_cast<ImplicitCastExpr>(Base)) {
3883 if (BaseCast->getCastKind() == CK_UncheckedDerivedToBase) {
3884 QualType T = BaseCast->getType();
3893 if (!Decls.count(FoundVD))
3898 if (InitList && !AddressOf && FoundVD == InitListFieldDecl) {
3900 if (IsInitListMemberExprInitialized(ME, CheckReferenceOnly)) {
3905 if (CheckReferenceOnly && !IsReference)
3909 unsigned diag = IsReference
3910 ? diag::warn_reference_field_is_uninit
3911 : diag::warn_field_is_uninit;
3915 diag::note_uninit_in_this_constructor)
3920 void HandleValue(Expr *E,
bool AddressOf) {
3923 if (MemberExpr *ME = dyn_cast<MemberExpr>(E)) {
3924 HandleMemberExpr(ME,
false ,
3929 if (ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E)) {
3930 Visit(CO->getCond());
3931 HandleValue(CO->getTrueExpr(), AddressOf);
3932 HandleValue(CO->getFalseExpr(), AddressOf);
3936 if (BinaryConditionalOperator *BCO =
3937 dyn_cast<BinaryConditionalOperator>(E)) {
3938 Visit(BCO->getCond());
3939 HandleValue(BCO->getFalseExpr(), AddressOf);
3943 if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E)) {
3944 HandleValue(OVE->getSourceExpr(), AddressOf);
3948 if (BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
3949 switch (BO->getOpcode()) {
3954 HandleValue(BO->getLHS(), AddressOf);
3955 Visit(BO->getRHS());
3958 Visit(BO->getLHS());
3959 HandleValue(BO->getRHS(), AddressOf);
3967 void CheckInitListExpr(InitListExpr *ILE) {
3968 InitFieldIndex.push_back(0);
3969 for (
auto *Child : ILE->
children()) {
3970 if (InitListExpr *SubList = dyn_cast<InitListExpr>(Child)) {
3971 CheckInitListExpr(SubList);
3975 ++InitFieldIndex.back();
3977 InitFieldIndex.pop_back();
3980 void CheckInitializer(Expr *E,
const CXXConstructorDecl *FieldConstructor,
3981 FieldDecl *Field,
const Type *BaseClass) {
3984 for (ValueDecl* VD : DeclsToRemove)
3986 DeclsToRemove.clear();
3989 InitListExpr *ILE = dyn_cast<InitListExpr>(E);
3993 InitListFieldDecl =
Field;
3994 InitFieldIndex.clear();
3995 CheckInitListExpr(ILE);
4007 void VisitMemberExpr(MemberExpr *ME) {
4009 HandleMemberExpr(ME,
true ,
false );
4012 void VisitImplicitCastExpr(ImplicitCastExpr *E) {
4018 Inherited::VisitImplicitCastExpr(E);
4021 void VisitCXXConstructExpr(CXXConstructExpr *E) {
4023 Expr *ArgExpr = E->
getArg(0);
4024 if (InitListExpr *ILE = dyn_cast<InitListExpr>(ArgExpr))
4027 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(ArgExpr))
4028 if (ICE->getCastKind() == CK_NoOp)
4029 ArgExpr = ICE->getSubExpr();
4030 HandleValue(ArgExpr,
false );
4033 Inherited::VisitCXXConstructExpr(E);
4036 void VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
4039 HandleValue(Callee,
false );
4045 Inherited::VisitCXXMemberCallExpr(E);
4048 void VisitCallExpr(CallExpr *E) {
4051 HandleValue(E->
getArg(0),
false);
4055 Inherited::VisitCallExpr(E);
4058 void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
4062 return Inherited::VisitCXXOperatorCallExpr(E);
4066 HandleValue(Arg->IgnoreParenImpCasts(),
false );
4069 void VisitBinaryOperator(BinaryOperator *E) {
4073 if (MemberExpr *ME = dyn_cast<MemberExpr>(E->
getLHS()))
4074 if (FieldDecl *FD = dyn_cast<FieldDecl>(ME->
getMemberDecl()))
4076 DeclsToRemove.push_back(FD);
4079 HandleValue(E->
getLHS(),
false );
4084 Inherited::VisitBinaryOperator(E);
4087 void VisitUnaryOperator(UnaryOperator *E) {
4093 if (MemberExpr *ME = dyn_cast<MemberExpr>(E->
getSubExpr())) {
4094 HandleValue(ME->
getBase(),
true );
4099 Inherited::VisitUnaryOperator(E);
4109 static void DiagnoseUninitializedFields(
4110 Sema &SemaRef,
const CXXConstructorDecl *
Constructor) {
4126 llvm::SmallPtrSet<ValueDecl*, 4> UninitializedFields;
4129 for (
auto *I : RD->
decls()) {
4130 if (
auto *FD = dyn_cast<FieldDecl>(I)) {
4131 UninitializedFields.insert(FD);
4132 }
else if (
auto *IFD = dyn_cast<IndirectFieldDecl>(I)) {
4133 UninitializedFields.insert(IFD->getAnonField());
4137 llvm::SmallPtrSet<QualType, 4> UninitializedBaseClasses;
4138 for (
const auto &I : RD->
bases())
4139 UninitializedBaseClasses.insert(I.getType().getCanonicalType());
4141 if (UninitializedFields.empty() && UninitializedBaseClasses.empty())
4144 UninitializedFieldVisitor UninitializedChecker(SemaRef,
4145 UninitializedFields,
4146 UninitializedBaseClasses);
4148 for (
const auto *FieldInit :
Constructor->inits()) {
4149 if (UninitializedFields.empty() && UninitializedBaseClasses.empty())
4152 Expr *InitExpr = FieldInit->getInit();
4156 if (CXXDefaultInitExpr *
Default =
4157 dyn_cast<CXXDefaultInitExpr>(InitExpr)) {
4158 InitExpr =
Default->getExpr();
4162 UninitializedChecker.CheckInitializer(InitExpr,
Constructor,
4163 FieldInit->getAnyMember(),
4164 FieldInit->getBaseClass());
4166 UninitializedChecker.CheckInitializer(InitExpr,
nullptr,
4167 FieldInit->getAnyMember(),
4168 FieldInit->getBaseClass());
4189 if (ParamDecl->getDeclName())
4206 return ConstraintExpr;
4221 return Seq.Perform(*
this, Entity, Kind, InitExpr);
4239 "must set init style when field is created");
4276 DirectBaseSpec =
nullptr;
4277 for (
const auto &
Base : ClassDecl->
bases()) {
4281 DirectBaseSpec = &
Base;
4289 VirtualBaseSpec =
nullptr;
4290 if (!DirectBaseSpec || !DirectBaseSpec->
isVirtual()) {
4299 if (Path.back().Base->isVirtual()) {
4300 VirtualBaseSpec = Path.back().Base;
4307 return DirectBaseSpec || VirtualBaseSpec;
4321 DS, IdLoc, InitList,
4339 DS, IdLoc, List, EllipsisLoc);
4348 explicit MemInitializerValidatorCCC(
CXXRecordDecl *ClassDecl)
4349 : ClassDecl(ClassDecl) {}
4351 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
4354 return Member->getDeclContext()->getRedeclContext()->Equals(ClassDecl);
4360 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
4361 return std::make_unique<MemInitializerValidatorCCC>(*
this);
4365 CXXRecordDecl *ClassDecl;
4382 Diag(Loc, diag::err_using_placeholder_variable) << Name;
4398 for (
auto *D : ClassDecl->
lookup(MemberOrBase)) {
4400 bool IsPlaceholder = D->isPlaceholderVar(
getLangOpts());
4402 if (IsPlaceholder && D->getDeclContext() == ND->
getDeclContext())
4433 if (!ConstructorD || !
Init)
4439 = dyn_cast<CXXConstructorDecl>(ConstructorD);
4463 ClassDecl, SS, TemplateTypeTy, MemberOrBase)) {
4465 Diag(EllipsisLoc, diag::err_pack_expansion_member_init)
4475 if (TemplateTypeTy) {
4477 if (BaseType.isNull())
4494 if (R.isAmbiguous())
return true;
4497 R.suppressDiagnostics();
4500 bool NotUnknownSpecialization =
false;
4503 NotUnknownSpecialization = !
Record->hasAnyDependentBases();
4505 if (!NotUnknownSpecialization) {
4511 if (BaseType.isNull())
4514 TInfo =
Context.CreateTypeSourceInfo(BaseType);
4524 R.setLookupName(MemberOrBase);
4531 UnqualifiedBase->getCanonicalInjectedSpecializationType(
Context));
4533 for (
auto const &
Base : ClassDecl->
bases()) {
4535 Base.getType()->getAs<TemplateSpecializationType>();
4537 Context.hasSameTemplateName(BaseTemplate->getTemplateName(), TN,
4539 Diag(IdLoc, diag::ext_unqualified_base_class)
4541 BaseType =
Base.getType();
4550 MemInitializerValidatorCCC CCC(ClassDecl);
4551 if (R.empty() && BaseType.isNull() &&
4553 CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), S, &SS,
4560 PDiag(diag::err_mem_init_not_member_or_class_suggest)
4561 << MemberOrBase <<
true);
4568 DirectBaseSpec, VirtualBaseSpec)) {
4573 PDiag(diag::err_mem_init_not_member_or_class_suggest)
4574 << MemberOrBase <<
false,
4587 if (!TyD && BaseType.isNull()) {
4588 Diag(IdLoc, diag::err_mem_init_not_member_or_class)
4589 << MemberOrBase <<
SourceRange(IdLoc,
Init->getSourceRange().getEnd());
4594 if (BaseType.isNull()) {
4599 if (
const auto *TD = dyn_cast<TagDecl>(TyD)) {
4605 TL.setNameLoc(IdLoc);
4606 }
else if (
auto *TN = dyn_cast<TypedefNameDecl>(TyD)) {
4612 }
else if (
auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(TyD)) {
4621 BaseType =
Context.getTypeDeclType(TyD);
4629 TInfo =
Context.getTrivialTypeSourceInfo(BaseType, IdLoc);
4639 assert((DirectMember || IndirectMember) &&
4640 "Member must be a FieldDecl or IndirectFieldDecl");
4645 if (
Member->isInvalidDecl())
4650 Args =
MultiExprArg(ParenList->getExprs(), ParenList->getNumExprs());
4652 Args =
MultiExprArg(InitList->getInits(), InitList->getNumInits());
4660 if (
Member->getType()->isDependentType() ||
Init->isTypeDependent()) {
4665 bool InitList =
false;
4678 IdLoc,
Init->getBeginLoc(),
Init->getEndLoc())
4722 return Diag(NameLoc, diag::err_delegating_ctor)
4724 Diag(NameLoc, diag::warn_cxx98_compat_delegating_ctor);
4726 bool InitList =
true;
4730 Args =
MultiExprArg(ParenList->getExprs(), ParenList->getNumExprs());
4741 NameLoc,
Init->getBeginLoc(),
Init->getEndLoc())
4750 "Delegating constructor with no target?");
4756 DelegationInit.
get(), InitRange.
getBegin(),
false);
4761 InitRange.
getEnd(), Args, ClassType);
4773 DelegationInit =
Init;
4787 if (!BaseType->isDependentType() && !BaseType->isRecordType())
4788 return Diag(BaseLoc, diag::err_base_init_does_not_name_class)
4802 (BaseType->isDependentType() ||
Init->isTypeDependent());
4807 if (!BaseType->containsUnexpandedParameterPack()) {
4808 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
4836 if (!DirectBaseSpec && !VirtualBaseSpec) {
4845 return Diag(BaseLoc, diag::err_not_direct_base_or_virtual)
4846 << BaseType <<
Context.getCanonicalTagType(ClassDecl)
4857 InitRange.
getEnd(), EllipsisLoc);
4864 if (DirectBaseSpec && VirtualBaseSpec)
4865 return Diag(BaseLoc, diag::err_base_init_direct_and_virtual)
4870 BaseSpec = VirtualBaseSpec;
4873 bool InitList =
true;
4877 Args =
MultiExprArg(ParenList->getExprs(), ParenList->getNumExprs());
4917 InitRange.
getEnd(), EllipsisLoc);
4927 TargetType, ExprLoc);
4947 bool IsInheritedVirtualBase,
4951 IsInheritedVirtualBase);
4955 switch (ImplicitInitKind) {
4961 BaseInit = InitSeq.Perform(SemaRef, InitEntity, InitKind, {});
4967 bool Moving = ImplicitInitKind ==
IIK_Move;
4969 QualType ParamType = Param->getType().getNonReferenceType();
4989 BasePath.push_back(BaseSpec);
4991 CK_UncheckedDerivedToBase,
4999 BaseInit = InitSeq.
Perform(SemaRef, InitEntity, InitKind, CopyCtorArg);
5031 if (Field->isInvalidDecl())
5037 bool Moving = ImplicitInitKind ==
IIK_Move;
5039 QualType ParamType = Param->getType().getNonReferenceType();
5042 if (Field->isZeroLengthBitField())
5045 Expr *MemberExprBase =
5058 LookupResult MemberLookup(SemaRef, Field->getDeclName(), Loc,
5094 InitSeq.Perform(SemaRef, Entity, InitKind,
MultiExprArg(&CtorArgE, 1));
5109 "Unhandled implicit init kind!");
5122 ExprResult MemberInit = InitSeq.Perform(SemaRef, InitEntity, InitKind, {});
5125 if (MemberInit.isInvalid())
5142 if (!Field->getParent()->isUnion()) {
5145 diag::err_uninitialized_member_in_ctor)
5148 << Field->getDeclName();
5149 SemaRef.
Diag(Field->getLocation(), diag::note_declared_at);
5155 diag::err_uninitialized_member_in_ctor)
5158 << Field->getDeclName();
5159 SemaRef.
Diag(Field->getLocation(), diag::note_declared_at);
5176 CXXMemberInit =
nullptr;
5181struct BaseAndFieldInfo {
5183 CXXConstructorDecl *Ctor;
5184 bool AnyErrorsInInits;
5186 llvm::DenseMap<const void *, CXXCtorInitializer*> AllBaseFields;
5187 SmallVector<CXXCtorInitializer*, 8> AllToInit;
5188 llvm::DenseMap<TagDecl*, FieldDecl*> ActiveUnionMember;
5190 BaseAndFieldInfo(Sema &S, CXXConstructorDecl *Ctor,
bool ErrorsInInits)
5191 : S(S), Ctor(Ctor), AnyErrorsInInits(ErrorsInInits) {
5203 bool isImplicitCopyOrMove()
const {
5214 llvm_unreachable(
"Invalid ImplicitInitializerKind!");
5217 bool addFieldInitializer(CXXCtorInitializer *
Init) {
5218 AllToInit.push_back(
Init);
5227 bool isInactiveUnionMember(FieldDecl *Field) {
5232 if (FieldDecl *Active =
5233 ActiveUnionMember.lookup(
Record->getCanonicalDecl()))
5234 return Active !=
Field->getCanonicalDecl();
5237 if (isImplicitCopyOrMove())
5242 if (
Field->hasInClassInitializer())
5246 if (!
Field->isAnonymousStructOrUnion())
5248 CXXRecordDecl *FieldRD =
Field->getType()->getAsCXXRecordDecl();
5255 bool isWithinInactiveUnionMember(FieldDecl *Field,
5256 IndirectFieldDecl *Indirect) {
5258 return isInactiveUnionMember(Field);
5260 for (
auto *
C : Indirect->
chain()) {
5261 FieldDecl *
Field = dyn_cast<FieldDecl>(
C);
5262 if (Field && isInactiveUnionMember(Field))
5273 if (T->isIncompleteArrayType())
5277 if (ArrayT->isZeroSize())
5280 T = ArrayT->getElementType();
5289 if (Field->isInvalidDecl())
5294 Info.AllBaseFields.lookup(Field->getCanonicalDecl()))
5295 return Info.addFieldInitializer(
Init);
5309 if (Info.isWithinInactiveUnionMember(Field, Indirect))
5312 if (Field->hasInClassInitializer() && !Info.isImplicitCopyOrMove()) {
5330 return Info.addFieldInitializer(
Init);
5340 if (Info.AnyErrorsInInits)
5351 return Info.addFieldInitializer(
Init);
5378 if (Class->isInvalidDecl())
5380 if (Class->hasIrrelevantDestructor())
5389 if (Field->isInvalidDecl())
5399 if (!FieldClassDecl)
5403 if (FieldClassDecl->isUnion() && FieldClassDecl->isAnonymousStructOrUnion())
5411 S.
PDiag(diag::err_access_dtor_field)
5412 << Field->getDeclName() << FieldType);
5425 bool VisitVirtualBases = !ClassDecl->
isAbstract();
5432 if (Dtor && Dtor->isUsed())
5433 VisitVirtualBases =
false;
5439 for (
const auto &
Base : ClassDecl->
bases()) {
5440 auto *BaseClassDecl =
Base.getType()->getAsCXXRecordDecl();
5445 if (
Base.isVirtual()) {
5446 if (!VisitVirtualBases)
5448 DirectVirtualBases.insert(BaseClassDecl);
5457 S.
PDiag(diag::err_access_dtor_base)
5458 <<
Base.getType() <<
Base.getSourceRange(),
5465 if (VisitVirtualBases)
5467 &DirectVirtualBases);
5475 if (!Initializers.empty()) {
5476 Constructor->setNumCtorInitializers(Initializers.size());
5479 memcpy(baseOrMemberInitializers, Initializers.data(),
5481 Constructor->setCtorInitializers(baseOrMemberInitializers);
5491 BaseAndFieldInfo Info(*
this,
Constructor, AnyErrors);
5499 bool HadError =
false;
5502 if (
Member->isBaseInitializer())
5503 Info.AllBaseFields[
Member->getBaseClass()->getAsCanonical<RecordType>()] =
5506 Info.AllBaseFields[
Member->getAnyMember()->getCanonicalDecl()] =
Member;
5509 for (
auto *
C : F->chain()) {
5512 Info.ActiveUnionMember.insert(std::make_pair(
5517 Info.ActiveUnionMember.insert(std::make_pair(
5525 for (
auto &I : ClassDecl->
bases()) {
5527 DirectVBases.insert(&I);
5531 for (
auto &VBase : ClassDecl->
vbases()) {
5533 VBase.getType()->getAsCanonical<RecordType>())) {
5541 Diag(
Value->getSourceLocation(), diag::warn_abstract_vbase_init_ignored)
5542 << VBase.getType() << ClassDecl;
5546 Info.AllToInit.push_back(
Value);
5547 }
else if (!AnyErrors && !ClassDecl->
isAbstract()) {
5552 bool IsInheritedVirtualBase = !DirectVBases.count(&VBase);
5555 &VBase, IsInheritedVirtualBase,
5561 Info.AllToInit.push_back(CXXBaseInit);
5568 if (
Base.isVirtual())
5572 Base.getType()->getAsCanonical<RecordType>())) {
5573 Info.AllToInit.push_back(
Value);
5574 }
else if (!AnyErrors) {
5583 Info.AllToInit.push_back(CXXBaseInit);
5588 for (
auto *Mem : ClassDecl->
decls()) {
5589 if (
auto *F = dyn_cast<FieldDecl>(Mem)) {
5594 if (F->isUnnamedBitField())
5600 if (F->isAnonymousStructOrUnion() && !Info.isImplicitCopyOrMove())
5609 if (Info.isImplicitCopyOrMove())
5612 if (
auto *F = dyn_cast<IndirectFieldDecl>(Mem)) {
5613 if (F->getType()->isIncompleteArrayType()) {
5615 "Incomplete array type is not valid");
5627 unsigned NumInitializers = Info.AllToInit.size();
5628 if (NumInitializers > 0) {
5629 Constructor->setNumCtorInitializers(NumInitializers);
5632 memcpy(baseOrMemberInitializers, Info.AllToInit.data(),
5634 Constructor->setCtorInitializers(baseOrMemberInitializers);
5660 if (
const RecordType *RT = Field->getType()->getAsCanonical<RecordType>()) {
5668 IdealInits.push_back(Field->getCanonicalDecl());
5672 return Context.getCanonicalType(BaseType).getTypePtr();
5677 if (!
Member->isAnyMemberInitializer())
5680 return Member->getAnyMember()->getCanonicalDecl();
5686 if (
Previous->isAnyMemberInitializer())
5700 if (
Constructor->getDeclContext()->isDependentContext())
5705 bool ShouldCheckOrder =
false;
5707 if (!SemaRef.
Diags.
isIgnored(diag::warn_initializer_out_of_order,
5708 Init->getSourceLocation())) {
5709 ShouldCheckOrder =
true;
5713 if (!ShouldCheckOrder)
5724 for (
const auto &VBase : ClassDecl->
vbases())
5728 for (
const auto &
Base : ClassDecl->
bases()) {
5729 if (
Base.isVirtual())
5735 for (
auto *Field : ClassDecl->
fields()) {
5736 if (Field->isUnnamedBitField())
5742 unsigned NumIdealInits = IdealInitKeys.size();
5743 unsigned IdealIndex = 0;
5752 for (
unsigned InitIndex = 0; InitIndex !=
Inits.size(); ++InitIndex) {
5757 for (; IdealIndex != NumIdealInits; ++IdealIndex)
5758 if (InitKey == IdealInitKeys[IdealIndex])
5764 if (IdealIndex == NumIdealInits && InitIndex) {
5765 WarnIndexes.push_back(InitIndex);
5768 for (IdealIndex = 0; IdealIndex != NumIdealInits; ++IdealIndex)
5769 if (InitKey == IdealInitKeys[IdealIndex])
5772 assert(IdealIndex < NumIdealInits &&
5773 "initializer not found in initializer list");
5775 CorrelatedInitOrder.emplace_back(IdealIndex, InitIndex);
5778 if (WarnIndexes.empty())
5782 llvm::sort(CorrelatedInitOrder, llvm::less_first());
5788 Inits[WarnIndexes.front() - 1]->getSourceLocation(),
5789 WarnIndexes.size() == 1 ? diag::warn_initializer_out_of_order
5790 : diag::warn_some_initializers_out_of_order);
5792 for (
unsigned I = 0; I < CorrelatedInitOrder.size(); ++I) {
5793 if (CorrelatedInitOrder[I].second == I)
5799 Inits[I]->getSourceRange(),
5802 Inits[CorrelatedInitOrder[I].second]->getSourceRange()),
5808 if (WarnIndexes.size() == 1) {
5810 Inits[WarnIndexes.front()]);
5816 for (
unsigned WarnIndex : WarnIndexes) {
5819 diag::note_initializer_out_of_order);
5826bool CheckRedundantInit(Sema &S,
5827 CXXCtorInitializer *
Init,
5828 CXXCtorInitializer *&PrevInit) {
5834 if (FieldDecl *Field =
Init->getAnyMember())
5836 diag::err_multiple_mem_initialization)
5837 <<
Field->getDeclName()
5838 <<
Init->getSourceRange();
5840 const Type *BaseClass =
Init->getBaseClass();
5841 assert(BaseClass &&
"neither field nor base");
5843 diag::err_multiple_base_initialization)
5844 << QualType(BaseClass, 0)
5845 <<
Init->getSourceRange();
5853typedef std::pair<NamedDecl *, CXXCtorInitializer *> UnionEntry;
5854typedef llvm::DenseMap<RecordDecl*, UnionEntry> RedundantUnionMap;
5856bool CheckRedundantUnionInit(Sema &S,
5857 CXXCtorInitializer *
Init,
5858 RedundantUnionMap &Unions) {
5859 FieldDecl *
Field =
Init->getAnyMember();
5860 RecordDecl *Parent =
Field->getParent();
5861 NamedDecl *Child =
Field;
5865 UnionEntry &En = Unions[Parent];
5866 if (En.first && En.first != Child) {
5868 diag::err_multiple_mem_union_initialization)
5869 <<
Field->getDeclName()
5870 <<
Init->getSourceRange();
5871 S.
Diag(En.second->getSourceLocation(), diag::note_previous_initializer)
5872 << 0 << En.second->getSourceRange();
5895 if (!ConstructorDecl)
5901 = dyn_cast<CXXConstructorDecl>(ConstructorDecl);
5904 Diag(ColonLoc, diag::err_only_constructors_take_base_inits);
5911 llvm::DenseMap<const void *, CXXCtorInitializer *> Members;
5914 RedundantUnionMap MemberUnions;
5916 bool HadError =
false;
5917 for (
unsigned i = 0; i < MemInits.size(); i++) {
5921 Init->setSourceOrder(i);
5923 if (
Init->isAnyMemberInitializer()) {
5925 if (CheckRedundantInit(*
this,
Init, Members[Key]) ||
5926 CheckRedundantUnionInit(*
this,
Init, MemberUnions))
5928 }
else if (
Init->isBaseInitializer()) {
5930 if (CheckRedundantInit(*
this,
Init, Members[Key]))
5933 assert(
Init->isDelegatingInitializer());
5935 if (MemInits.size() != 1) {
5937 diag::err_delegating_initializer_alone)
5938 <<
Init->getSourceRange() << MemInits[i ? 0 : 1]->getSourceRange();
5970 for (
auto *Field : ClassDecl->
fields()) {
5979 llvm::SmallPtrSetImpl<const CXXRecordDecl *> *DirectVirtualBases) {
5981 for (
const auto &VBase : ClassDecl->
vbases()) {
5982 auto *BaseClassDecl = VBase.getType()->getAsCXXRecordDecl();
5987 if (DirectVirtualBases && DirectVirtualBases->count(BaseClassDecl))
5996 PDiag(diag::err_access_dtor_vbase)
5997 << CT << VBase.getType(),
6000 CT, VBase.getType(), diag::err_access_dtor_vbase, 0,
6014 = dyn_cast<CXXConstructorDecl>(CDtorDecl)) {
6016 !ClassDecl || ClassDecl->isInvalidDecl()) {
6028 const auto *RD =
Context.getBaseElementType(T)->getAsCXXRecordDecl();
6050 T =
Context.getBaseElementType(T);
6065 if (
Diags.isLastDiagnosticIgnored())
6075 for (
const auto &M : FinalOverriders) {
6076 for (
const auto &SO : M.second) {
6082 if (SO.second.size() != 1)
6086 if (!
Method->isPureVirtual())
6089 if (!SeenPureMethods.insert(
Method).second)
6092 Diag(
Method->getLocation(), diag::note_pure_virtual_function)
6103struct AbstractUsageInfo {
6113 void DiagnoseAbstractType() {
6122struct CheckAbstractUsage {
6123 AbstractUsageInfo &Info;
6124 const NamedDecl *Ctx;
6126 CheckAbstractUsage(AbstractUsageInfo &Info,
const NamedDecl *Ctx)
6127 : Info(Info), Ctx(Ctx) {}
6131#define ABSTRACT_TYPELOC(CLASS, PARENT)
6132#define TYPELOC(CLASS, PARENT) \
6133 case TypeLoc::CLASS: Check(TL.castAs<CLASS##TypeLoc>(), Sel); break;
6134#include "clang/AST/TypeLocNodes.def"
6140 for (
unsigned I = 0, E = TL.
getNumParams(); I != E; ++I) {
6155 for (
unsigned I = 0, E = TL.
getNumArgs(); I != E; ++I) {
6156 TemplateArgumentLoc TAL = TL.
getArgLoc(I);
6165#define CheckPolymorphic(Type) \
6166 void Check(Type TL, Sema::AbstractDiagSelID Sel) { \
6167 Visit(TL.getNextTypeLoc(), Sema::AbstractNone); \
6182 return Visit(
Next, Sel);
6190 if (T->isArrayType()) {
6194 CanQualType CT = T->getCanonicalTypeUnqualified();
6195 if (CT != Info.AbstractType)
return;
6206 Info.DiagnoseAbstractType();
6210void AbstractUsageInfo::CheckType(
const NamedDecl *D, TypeLoc TL,
6212 CheckAbstractUsage(*
this, D).Visit(TL, Sel);
6247 for (
auto *D : RD->
decls()) {
6248 if (D->isImplicit())
continue;
6251 if (
auto *FD = dyn_cast<FriendDecl>(D)) {
6252 D = FD->getFriendDecl();
6257 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
6259 }
else if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(D)) {
6263 }
else if (
auto *FD = dyn_cast<FieldDecl>(D)) {
6266 }
else if (
auto *VD = dyn_cast<VarDecl>(D)) {
6268 }
else if (
auto *VTD = dyn_cast<VarTemplateDecl>(D)) {
6272 }
else if (
auto *RD = dyn_cast<CXXRecordDecl>(D)) {
6274 }
else if (
auto *CTD = dyn_cast<ClassTemplateDecl>(D)) {
6285 assert(ClassAttr->
getKind() == attr::DLLExport);
6295 struct MarkingClassDllexported {
6306 ~MarkingClassDllexported() {
6309 } MarkingDllexportedContext(S, Class, ClassAttr->
getLocation());
6316 if (!
Member->hasAttr<DLLExportAttr>())
6321 auto *VD = dyn_cast<VarDecl>(
Member);
6322 if (VD && VD->getStorageClass() ==
SC_Static &&
6326 auto *MD = dyn_cast<CXXMethodDecl>(
Member);
6330 if (MD->isUserProvided()) {
6340 auto *CD = dyn_cast<CXXConstructorDecl>(MD);
6343 CD->getAttr<DLLExportAttr>()->getLocation(), CD);
6351 }
else if (MD->isExplicitlyDefaulted()) {
6360 }
else if (!MD->isTrivial() ||
6361 MD->isCopyAssignmentOperator() ||
6362 MD->isMoveAssignmentOperator()) {
6386 auto *CD = dyn_cast<CXXConstructorDecl>(
Member);
6387 if (!CD || !CD->isDefaultConstructor())
6389 auto *
Attr = CD->getAttr<DLLExportAttr>();
6395 if (!Class->isDependentContext()) {
6400 if (LastExportedDefaultCtor) {
6402 diag::err_attribute_dll_ambiguous_default_ctor)
6404 S.
Diag(CD->getLocation(), diag::note_entity_declared_at)
6405 << CD->getDeclName();
6408 LastExportedDefaultCtor = CD;
6414 bool ErrorReported =
false;
6415 auto reportIllegalClassTemplate = [&ErrorReported](
Sema &S,
6419 S.
Diag(TD->getLocation(),
6420 diag::err_cuda_device_builtin_surftex_cls_template)
6422 ErrorReported =
true;
6427 auto *SD = dyn_cast<ClassTemplateSpecializationDecl>(Class);
6429 S.
Diag(Class->getLocation(),
6430 diag::err_cuda_device_builtin_surftex_ref_decl)
6432 S.
Diag(Class->getLocation(),
6433 diag::note_cuda_device_builtin_surftex_should_be_template_class)
6437 TD = SD->getSpecializedTemplate();
6441 unsigned N = Params->
size();
6444 reportIllegalClassTemplate(S, TD);
6446 diag::note_cuda_device_builtin_surftex_cls_should_have_n_args)
6450 reportIllegalClassTemplate(S, TD);
6452 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6456 auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Params->
getParam(1));
6457 if (!NTTP || !NTTP->getType()->isIntegralOrEnumerationType()) {
6458 reportIllegalClassTemplate(S, TD);
6460 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6468 bool ErrorReported =
false;
6469 auto reportIllegalClassTemplate = [&ErrorReported](
Sema &S,
6473 S.
Diag(TD->getLocation(),
6474 diag::err_cuda_device_builtin_surftex_cls_template)
6476 ErrorReported =
true;
6481 auto *SD = dyn_cast<ClassTemplateSpecializationDecl>(Class);
6483 S.
Diag(Class->getLocation(),
6484 diag::err_cuda_device_builtin_surftex_ref_decl)
6486 S.
Diag(Class->getLocation(),
6487 diag::note_cuda_device_builtin_surftex_should_be_template_class)
6491 TD = SD->getSpecializedTemplate();
6495 unsigned N = Params->
size();
6498 reportIllegalClassTemplate(S, TD);
6500 diag::note_cuda_device_builtin_surftex_cls_should_have_n_args)
6504 reportIllegalClassTemplate(S, TD);
6506 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6510 auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Params->
getParam(1));
6511 if (!NTTP || !NTTP->getType()->isIntegralOrEnumerationType()) {
6512 reportIllegalClassTemplate(S, TD);
6514 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6519 auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Params->
getParam(2));
6520 if (!NTTP || !NTTP->getType()->isIntegralOrEnumerationType()) {
6521 reportIllegalClassTemplate(S, TD);
6523 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6532 if (
Method->isUserProvided())
6543 if (
Context.getTargetInfo().shouldDLLImportComdatSymbols() && !ClassAttr) {
6544 if (
auto *Spec = dyn_cast<ClassTemplatePartialSpecializationDecl>(
Class)) {
6545 if (
Attr *TemplateAttr =
6546 getDLLAttr(Spec->getSpecializedTemplate()->getTemplatedDecl())) {
6548 A->setInherited(
true);
6561 if ((
Context.getTargetInfo().getCXXABI().isMicrosoft() ||
6562 Context.getTargetInfo().getTriple().isPS()) &&
6563 (!
Class->isExternallyVisible() &&
Class->hasExternalFormalLinkage())) {
6564 Class->dropAttrs<DLLExportAttr, DLLImportAttr>();
6568 if (!
Class->isExternallyVisible()) {
6569 Diag(
Class->getLocation(), diag::err_attribute_dll_not_extern)
6570 <<
Class << ClassAttr;
6574 if (
Context.getTargetInfo().shouldDLLImportComdatSymbols() &&
6585 diag::err_attribute_dll_member_of_dll_class)
6586 << MemberAttr << ClassAttr;
6587 Diag(ClassAttr->getLocation(), diag::note_previous_attribute);
6588 Member->setInvalidDecl();
6592 if (
Class->getDescribedClassTemplate())
6597 const bool ClassExported = ClassAttr->
getKind() == attr::DLLExport;
6602 const bool PropagatedImport =
6612 !
Context.getTargetInfo().getTriple().isOSCygMing()) {
6613 if (
auto *DEA =
Class->getAttr<DLLExportAttr>()) {
6614 Class->addAttr(DLLExportOnDeclAttr::Create(
Context, DEA->getLoc()));
6615 Class->dropAttr<DLLExportAttr>();
6625 if (ClassExported &&
getLangOpts().DllExportInlines) {
6628 if (
auto *S = dyn_cast<ConstructorUsingShadowDecl>(D))
6629 Shadows.push_back(S);
6651 if (
Member->hasAttr<ExcludeFromExplicitInstantiationAttr>())
6666 if (ClassExported &&
getLangOpts().DllExportInlines) {
6683 diag::warn_dllexport_inherited_ctor_unsupported)
6689 .areArgsDestroyedLeftToRightInCallee()) {
6690 bool HasCalleeCleanupParam =
false;
6692 if (P->needsDestruction(
Context)) {
6693 HasCalleeCleanupParam =
true;
6696 if (HasCalleeCleanupParam) {
6698 diag::warn_dllexport_inherited_ctor_unsupported)
6720 if (!
Context.getTargetInfo().shouldDLLImportComdatSymbols() &&
6723 if (
auto *CD = dyn_cast<CXXConstructorDecl>(MD);
6724 !CD || !CD->getInheritedConstructor())
6731 auto *Ctor = dyn_cast<CXXConstructorDecl>(MD);
6748 if (VD && PropagatedImport)
6762 if (ClassExported) {
6774 Member->addAttr(NewAttr);
6784 "friend re-decl should not already have a DLLAttr");
6814 NewAttr->setInherited(
true);
6815 BaseTemplateSpec->
addAttr(NewAttr);
6819 if (
auto *ImportAttr = dyn_cast<DLLImportAttr>(NewAttr))
6820 ImportAttr->setPropagatedToBaseTemplate();
6841 Diag(BaseLoc, diag::warn_attribute_dll_instantiated_base_class)
6846 diag::note_template_class_explicit_specialization_was_here)
6847 << BaseTemplateSpec;
6850 diag::note_template_class_instantiation_was_here)
6851 << BaseTemplateSpec;
6857 if (
auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
6869 if (MD->isCopyAssignmentOperator())
6872 if (MD->isMoveAssignmentOperator())
6883 case OO_ExclaimEqual:
6895 case OO_GreaterEqual:
6936 llvm_unreachable(
"Invalid special member.");
6954 bool CopyCtorIsTrivial =
false, CopyCtorIsTrivialForCall =
false;
6955 bool DtorIsTrivialForCall =
false;
6966 CopyCtorIsTrivial =
true;
6968 CopyCtorIsTrivialForCall =
true;
6972 if (CD->isCopyConstructor() && !CD->isDeleted() &&
6973 !CD->isIneligibleOrNotSelected()) {
6974 if (CD->isTrivial())
6975 CopyCtorIsTrivial =
true;
6976 if (CD->isTrivialForCall())
6977 CopyCtorIsTrivialForCall =
true;
6985 DtorIsTrivialForCall =
true;
6987 if (!DD->isDeleted() && DD->isTrivialForCall())
6988 DtorIsTrivialForCall =
true;
6992 if (CopyCtorIsTrivialForCall && DtorIsTrivialForCall)
7006 uint64_t TypeSize = isAArch64 ? 128 : 64;
7018 bool HasNonDeletedCopyOrMove =
false;
7024 HasNonDeletedCopyOrMove =
true;
7031 HasNonDeletedCopyOrMove =
true;
7039 if (MD->isDeleted() || MD->isIneligibleOrNotSelected())
7042 auto *CD = dyn_cast<CXXConstructorDecl>(MD);
7043 if (CD && CD->isCopyOrMoveConstructor())
7044 HasNonDeletedCopyOrMove =
true;
7048 if (!MD->isTrivialForCall())
7052 return HasNonDeletedCopyOrMove;
7063 bool IssuedDiagnostic =
false;
7066 if (!IssuedDiagnostic) {
7068 IssuedDiagnostic =
true;
7070 S.
Diag(O->getLocation(), diag::note_overridden_virtual_function);
7073 return IssuedDiagnostic;
7080 if (
Record->isAbstract() && !
Record->isInvalidDecl()) {
7081 AbstractUsageInfo Info(*
this,
Record);
7088 if (!
Record->isInvalidDecl() && !
Record->isDependentType() &&
7089 !
Record->isAggregate() && !
Record->hasUserDeclaredConstructor() &&
7091 bool Complained =
false;
7092 for (
const auto *F :
Record->fields()) {
7093 if (F->hasInClassInitializer() || F->isUnnamedBitField())
7096 if (F->getType()->isReferenceType() ||
7097 (F->getType().isConstQualified() && F->getType()->isScalarType())) {
7099 Diag(
Record->getLocation(), diag::warn_no_constructor_for_refconst)
7104 Diag(F->getLocation(), diag::note_refconst_member_not_initialized)
7105 << F->getType()->isReferenceType()
7106 << F->getDeclName();
7111 if (
Record->getIdentifier()) {
7126 Record->hasUserDeclaredConstructor()) ||
7128 Diag(Element->getLocation(), diag::err_member_name_of_class)
7136 if (
Record->isPolymorphic() && !
Record->isDependentType()) {
7139 !
Record->hasAttr<FinalAttr>())
7141 diag::warn_non_virtual_dtor)
7145 if (
Record->isAbstract()) {
7146 if (FinalAttr *FA =
Record->getAttr<FinalAttr>()) {
7147 Diag(
Record->getLocation(), diag::warn_abstract_final_class)
7148 << FA->isSpelledAsSealed();
7154 if (!
Record->hasAttr<FinalAttr>()) {
7156 if (
const FinalAttr *FA = dtor->getAttr<FinalAttr>()) {
7157 Diag(FA->getLocation(), diag::warn_final_dtor_non_final_class)
7158 << FA->isSpelledAsSealed()
7161 (FA->isSpelledAsSealed() ?
" sealed" :
" final"));
7163 diag::note_final_dtor_non_final_class_silence)
7164 <<
Context.getCanonicalTagType(
Record) << FA->isSpelledAsSealed();
7170 if (
Record->hasAttr<TrivialABIAttr>())
7175 bool HasTrivialABI =
Record->hasAttr<TrivialABIAttr>();
7178 Record->setHasTrivialSpecialMemberForCall();
7188 auto CheckCompletedMemberFunction = [&](
CXXMethodDecl *MD) {
7199 MD->
isDeleted() ? diag::err_deleted_override
7200 : diag::err_non_deleted_override,
7202 return MD->isDeleted() != V->isDeleted();
7214 : diag::err_non_consteval_override,
7216 return MD->isConsteval() != V->isConsteval();
7225 auto CheckForDefaultedFunction = [&](
FunctionDecl *FD) ->
bool {
7226 if (!FD || FD->
isInvalidDecl() || !FD->isExplicitlyDefaulted())
7232 DefaultedSecondaryComparisons.push_back(FD);
7240 if (!
Record->isInvalidDecl() &&
7241 Record->hasAttr<VTablePointerAuthenticationAttr>())
7246 bool Incomplete = CheckForDefaultedFunction(M);
7249 if (
Record->isDependentType())
7255 if (!M->isImplicit() && !M->isUserProvided()) {
7259 Record->finishedDefaultedOrDeletedMember(M);
7260 M->setTrivialForCall(
7264 Record->setTrivialForCallFlags(M);
7273 M->isUserProvided()) {
7274 M->setTrivialForCall(HasTrivialABI);
7275 Record->setTrivialForCallFlags(M);
7278 if (!M->isInvalidDecl() && M->isExplicitlyDefaulted() &&
7279 M->hasAttr<DLLExportAttr>()) {
7285 M->dropAttr<DLLExportAttr>();
7287 if (M->hasAttr<DLLExportAttr>()) {
7293 bool EffectivelyConstexprDestructor =
true;
7298 llvm::SmallDenseSet<QualType> Visited;
7299 auto Check = [&Visited](
QualType T,
auto &&Check) ->
bool {
7300 if (!Visited.insert(T->getCanonicalTypeUnqualified()).second)
7303 T->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
7311 if (!Check(B.getType(), Check))
7314 if (!Check(FD->
getType(), Check))
7318 EffectivelyConstexprDestructor =
7326 M->isDefaulted() && M->isConstexpr() && M->size_overridden_methods() &&
7327 EffectivelyConstexprDestructor)
7331 CheckCompletedMemberFunction(M);
7340 CompleteMemberFunction(Dtor);
7342 bool HasMethodWithOverrideControl =
false,
7343 HasOverridingMethodWithoutOverrideControl =
false;
7344 for (
auto *D :
Record->decls()) {
7345 if (
auto *M = dyn_cast<CXXMethodDecl>(D)) {
7348 if (!
Record->isDependentType()) {
7354 if (M->hasAttr<OverrideAttr>()) {
7355 HasMethodWithOverrideControl =
true;
7356 }
else if (M->size_overridden_methods() > 0) {
7357 HasOverridingMethodWithoutOverrideControl =
true;
7360 if (M->isVirtualAsWritten() &&
Record->isEffectivelyFinal()) {
7361 Diag(M->getLocation(), diag::warn_unnecessary_virtual_specifier)
7368 CompleteMemberFunction(M);
7369 }
else if (
auto *F = dyn_cast<FriendDecl>(D)) {
7370 CheckForDefaultedFunction(
7371 dyn_cast_or_null<FunctionDecl>(F->getFriendDecl()));
7375 if (HasOverridingMethodWithoutOverrideControl) {
7376 bool HasInconsistentOverrideControl = HasMethodWithOverrideControl;
7377 for (
auto *M :
Record->methods())
7382 for (
FunctionDecl *FD : DefaultedSecondaryComparisons) {
7386 if (
auto *MD = dyn_cast<CXXMethodDecl>(FD))
7387 CheckCompletedMemberFunction(MD);
7408 if (
Context.getLangOpts().getLayoutCompatibility() ==
7412 Diag(
Record->getLocation(), diag::warn_cxx_ms_struct);
7418 bool ClangABICompat4 =
7419 Context.getLangOpts().isCompatibleWith(LangOptions::ClangABI::Ver4);
7421 Context.getTargetInfo().getCallingConvKind(ClangABICompat4);
7426 if (
Record->getArgPassingRestrictions() !=
7428 Record->setArgPassingRestrictions(
7436 if (
Context.getTargetInfo().getCXXABI().areArgsDestroyedLeftToRightInCallee())
7437 Record->setParamDestroyedInCallee(
true);
7438 else if (
Record->hasNonTrivialDestructor())
7439 Record->setParamDestroyedInCallee(CanPass);
7448 if (
Record->hasAttr<CUDADeviceBuiltinSurfaceTypeAttr>())
7450 else if (
Record->hasAttr<CUDADeviceBuiltinTextureTypeAttr>())
7456 TypeAwareDecls{{OO_New, {}},
7459 {OO_Array_New, {}}};
7460 for (
auto *D :
Record->decls()) {
7467 auto CheckMismatchedTypeAwareAllocators =
7470 auto &NewDecls = TypeAwareDecls[NewKind];
7471 auto &DeleteDecls = TypeAwareDecls[DeleteKind];
7472 if (NewDecls.empty() == DeleteDecls.empty())
7475 Context.DeclarationNames.getCXXOperatorName(
7476 NewDecls.empty() ? DeleteKind : NewKind);
7478 Context.DeclarationNames.getCXXOperatorName(
7479 NewDecls.empty() ? NewKind : DeleteKind);
7481 diag::err_type_aware_allocator_missing_matching_operator)
7484 for (
auto MD : NewDecls)
7486 diag::note_unmatched_type_aware_allocator_declared)
7488 for (
auto MD : DeleteDecls)
7490 diag::note_unmatched_type_aware_allocator_declared)
7493 CheckMismatchedTypeAwareAllocators(OO_New, OO_Delete);
7494 CheckMismatchedTypeAwareAllocators(OO_Array_New, OO_Array_Delete);
7510 unsigned LHSQuals = 0;
7513 LHSQuals = FieldQuals;
7515 unsigned RHSQuals = FieldQuals;
7537 llvm::DenseMap<CXXRecordDecl *, ConstructorUsingShadowDecl *>
7543 : S(S), UseLoc(UseLoc) {
7544 bool DiagnosedMultipleConstructedBases =
false;
7550 for (
auto *D : Shadow->
redecls()) {
7551 auto *DShadow = cast<ConstructorUsingShadowDecl>(D);
7552 auto *DNominatedBase = DShadow->getNominatedBaseClass();
7553 auto *DConstructedBase = DShadow->getConstructedBaseClass();
7555 InheritedFromBases.insert(
7556 std::make_pair(DNominatedBase->getCanonicalDecl(),
7557 DShadow->getNominatedBaseClassShadowDecl()));
7558 if (DShadow->constructsVirtualBase())
7559 InheritedFromBases.insert(
7560 std::make_pair(DConstructedBase->getCanonicalDecl(),
7561 DShadow->getConstructedBaseClassShadowDecl()));
7563 assert(DNominatedBase == DConstructedBase);
7568 if (!ConstructedBase) {
7569 ConstructedBase = DConstructedBase;
7570 ConstructedBaseIntroducer = D->getIntroducer();
7571 }
else if (ConstructedBase != DConstructedBase &&
7573 if (!DiagnosedMultipleConstructedBases) {
7574 S.Diag(UseLoc, diag::err_ambiguous_inherited_constructor)
7575 << Shadow->getTargetDecl();
7576 S.Diag(ConstructedBaseIntroducer->getLocation(),
7577 diag::note_ambiguous_inherited_constructor_using)
7579 DiagnosedMultipleConstructedBases = true;
7581 S.Diag(D->getIntroducer()->getLocation(),
7582 diag::note_ambiguous_inherited_constructor_using)
7583 << DConstructedBase;
7587 if (DiagnosedMultipleConstructedBases)
7588 Shadow->setInvalidDecl();
7594 std::pair<CXXConstructorDecl *, bool>
7596 auto It = InheritedFromBases.find(
Base->getCanonicalDecl());
7597 if (It == InheritedFromBases.end())
7598 return std::make_pair(
nullptr,
false);
7602 return std::make_pair(
7603 S.findInheritingConstructor(UseLoc, Ctor, It->second),
7604 It->second->constructsVirtualBase());
7607 return std::make_pair(Ctor,
false);
7624 if (InheritedCtor) {
7627 Inherited->findConstructorForBase(ClassDecl, InheritedCtor).first;
7629 return BaseCtor->isConstexpr();
7697 if (Ctor && ClassDecl->
isUnion())
7717 for (
const auto &B : ClassDecl->
bases()) {
7718 auto *BaseClassDecl = B.getType()->getAsCXXRecordDecl();
7722 InheritedCtor, Inherited))
7735 for (
const auto *F : ClassDecl->
fields()) {
7736 if (F->isInvalidDecl())
7739 F->hasInClassInitializer())
7742 if (
const RecordType *RecordTy = BaseType->getAsCanonical<RecordType>()) {
7743 auto *FieldRecDecl =
7746 BaseType.getCVRQualifiers(),
7747 ConstArg && !F->isMutable()))
7762struct ComputingExceptionSpec {
7765 ComputingExceptionSpec(Sema &S, FunctionDecl *FD, SourceLocation Loc)
7767 Sema::CodeSynthesisContext Ctx;
7773 ~ComputingExceptionSpec() {
7779static Sema::ImplicitExceptionSpecification
7783 Sema::InheritedConstructorInfo *ICI);
7785static Sema::ImplicitExceptionSpecification
7790static Sema::ImplicitExceptionSpecification
7793 if (DFK.isSpecialMember())
7796 if (DFK.isComparison())
7798 DFK.asComparison());
7801 assert(CD->getInheritedConstructor() &&
7802 "only defaulted functions and inherited constructors have implicit "
7805 S, Loc, CD->getInheritedConstructor().getShadowDecl());
7832 auto ESI = IES.getExceptionSpec();
7850 PT.getNonReferenceType()->getAsCXXRecordDecl()) {
7871 "not an explicitly-defaulted special member");
7881 bool HadError =
false;
7894 bool ShouldDeleteForTypeMismatch =
false;
7895 unsigned ExpectedParams = 1;
7907 if (DeleteOnTypeMismatch)
7908 ShouldDeleteForTypeMismatch =
true;
7918 bool CanHaveConstParam =
false;
7928 ReturnType =
Type->getReturnType();
7933 std::nullopt, RD,
false);
7934 DeclType =
Context.getAddrSpaceQualType(
7936 QualType ExpectedReturnType =
Context.getLValueReferenceType(DeclType);
7938 if (!
Context.hasSameType(ReturnType, ExpectedReturnType)) {
7939 Diag(MD->
getLocation(), diag::err_defaulted_special_member_return_type)
7941 << ExpectedReturnType;
7947 if (DeleteOnTypeMismatch)
7948 ShouldDeleteForTypeMismatch =
true;
7965 if (!ExplicitObjectParameter.
isNull() &&
7968 Context.getCanonicalTagType(RD)))) {
7969 if (DeleteOnTypeMismatch)
7970 ShouldDeleteForTypeMismatch =
true;
7973 diag::err_defaulted_special_member_explicit_object_mismatch)
7986 bool HasConstParam =
false;
7987 if (ExpectedParams &&
ArgType->isReferenceType()) {
7993 if (DeleteOnTypeMismatch)
7994 ShouldDeleteForTypeMismatch =
true;
7997 diag::err_defaulted_special_member_volatile_param)
8003 if (HasConstParam && !CanHaveConstParam) {
8004 if (DeleteOnTypeMismatch)
8005 ShouldDeleteForTypeMismatch =
true;
8009 diag::err_defaulted_special_member_copy_const_param)
8015 diag::err_defaulted_special_member_move_const_param)
8020 }
else if (ExpectedParams) {
8024 "unexpected non-ref argument");
8058 diag::err_incorrect_defaulted_constexpr_with_vb)
8060 for (
const auto &I : RD->
vbases())
8061 Diag(I.getBeginLoc(), diag::note_constexpr_virtual_base_here);
8080 if (!
Type->hasExceptionSpec()) {
8089 Context.getFunctionType(ReturnType,
Type->getParamTypes(), EPI));
8098 if (ShouldDeleteForTypeMismatch) {
8103 Diag(DefaultLoc, diag::note_replace_equals_default_to_delete)
8107 if (ShouldDeleteForTypeMismatch && !HadError) {
8109 diag::warn_cxx17_compat_defaulted_method_type_mismatch)
8116 Diag(MD->
getLocation(), diag::err_out_of_line_default_deletes) << CSM;
8117 assert(!ShouldDeleteForTypeMismatch &&
"deleted non-first decl");
8139template<
typename Derived,
typename ResultList,
typename Result,
8141class DefaultedComparisonVisitor {
8146 DefaultedComparisonKind DCK)
8147 : S(S), RD(RD), FD(FD), DCK(DCK) {
8151 Fns.assign(Info->getUnqualifiedLookups().begin(),
8152 Info->getUnqualifiedLookups().end());
8156 ResultList visit() {
8164 case DefaultedComparisonKind::None:
8165 llvm_unreachable(
"not a defaulted comparison");
8167 case DefaultedComparisonKind::Equal:
8168 case DefaultedComparisonKind::ThreeWay:
8169 getDerived().visitSubobjects(Results, RD, ParamLvalType.
getQualifiers());
8172 case DefaultedComparisonKind::NotEqual:
8173 case DefaultedComparisonKind::Relational:
8174 Results.add(getDerived().visitExpandedSubobject(
8175 ParamLvalType, getDerived().getCompleteObject()));
8178 llvm_unreachable(
"");
8182 Derived &getDerived() {
return static_cast<Derived&
>(*this); }
8188 bool visitSubobjects(ResultList &Results, CXXRecordDecl *
Record,
8192 for (CXXBaseSpecifier &Base :
Record->bases())
8193 if (Results.add(getDerived().visitSubobject(
8195 getDerived().getBase(&Base))))
8199 for (FieldDecl *Field :
Record->fields()) {
8202 if (
Field->isUnnamedBitField())
8205 if (
Field->isAnonymousStructOrUnion()) {
8206 if (visitSubobjects(Results,
Field->getType()->getAsCXXRecordDecl(),
8213 Qualifiers FieldQuals = Quals;
8214 if (
Field->isMutable())
8216 QualType FieldType =
8219 if (Results.add(getDerived().visitSubobject(
8220 FieldType, getDerived().getField(Field))))
8228 Result visitSubobject(QualType
Type, Subobject Subobj) {
8231 if (
auto *CAT = dyn_cast_or_null<ConstantArrayType>(AT))
8232 return getDerived().visitSubobjectArray(CAT->getElementType(),
8233 CAT->getSize(), Subobj);
8234 return getDerived().visitExpandedSubobject(
Type, Subobj);
8237 Result visitSubobjectArray(QualType
Type,
const llvm::APInt &Size,
8239 return getDerived().visitSubobject(
Type, Subobj);
8246 DefaultedComparisonKind DCK;
8247 UnresolvedSet<16> Fns;
8252struct DefaultedComparisonInfo {
8257 static DefaultedComparisonInfo deleted() {
8258 DefaultedComparisonInfo
Deleted;
8263 bool add(
const DefaultedComparisonInfo &R) {
8273struct DefaultedComparisonSubobject {
8281class DefaultedComparisonAnalyzer
8282 :
public DefaultedComparisonVisitor<DefaultedComparisonAnalyzer,
8283 DefaultedComparisonInfo,
8284 DefaultedComparisonInfo,
8285 DefaultedComparisonSubobject> {
8287 enum DiagnosticKind { NoDiagnostics, ExplainDeleted, ExplainConstexpr };
8290 DiagnosticKind Diagnose;
8293 using Base = DefaultedComparisonVisitor;
8294 using Result = DefaultedComparisonInfo;
8295 using Subobject = DefaultedComparisonSubobject;
8299 DefaultedComparisonAnalyzer(Sema &S, CXXRecordDecl *RD, FunctionDecl *FD,
8300 DefaultedComparisonKind DCK,
8301 DiagnosticKind Diagnose = NoDiagnostics)
8302 :
Base(S, RD, FD, DCK), Diagnose(Diagnose) {}
8305 if ((DCK == DefaultedComparisonKind::Equal ||
8306 DCK == DefaultedComparisonKind::ThreeWay) &&
8311 if (Diagnose == ExplainDeleted) {
8315 return Result::deleted();
8318 return Base::visit();
8322 Subobject getCompleteObject() {
8323 return Subobject{Subobject::CompleteObject, RD, FD->
getLocation()};
8326 Subobject getBase(CXXBaseSpecifier *Base) {
8327 return Subobject{Subobject::Base,
Base->getType()->getAsCXXRecordDecl(),
8328 Base->getBaseTypeLoc()};
8331 Subobject getField(FieldDecl *Field) {
8332 return Subobject{Subobject::Member,
Field,
Field->getLocation()};
8335 Result visitExpandedSubobject(QualType
Type, Subobject Subobj) {
8339 if (
Type->isReferenceType()) {
8340 if (Diagnose == ExplainDeleted) {
8341 S.
Diag(Subobj.Loc, diag::note_defaulted_comparison_reference_member)
8344 return Result::deleted();
8349 Expr *Args[] = {&Xi, &Xi};
8353 assert(OO !=
OO_None &&
"not an overloaded operator!");
8354 return visitBinaryOperator(OO, Args, Subobj);
8360 OverloadCandidateSet *SpaceshipCandidates =
nullptr) {
8364 OverloadCandidateSet CandidateSet(
8366 OverloadCandidateSet::OperatorRewriteInfo(
8368 !SpaceshipCandidates));
8373 CandidateSet.exclude(FD);
8375 if (Args[0]->
getType()->isOverloadableType())
8386 switch (CandidateSet.BestViableFunction(S, FD->
getLocation(), Best)) {
8392 if ((DCK == DefaultedComparisonKind::NotEqual ||
8393 DCK == DefaultedComparisonKind::Relational) &&
8394 !Best->RewriteKind) {
8395 if (Diagnose == ExplainDeleted) {
8396 if (Best->Function) {
8397 S.
Diag(Best->Function->getLocation(),
8398 diag::note_defaulted_comparison_not_rewritten_callee)
8401 assert(Best->Conversions.size() == 2 &&
8402 Best->Conversions[0].isUserDefined() &&
8403 "non-user-defined conversion from class to built-in "
8405 S.
Diag(Best->Conversions[0]
8406 .UserDefined.FoundConversionFunction.getDecl()
8408 diag::note_defaulted_comparison_not_rewritten_conversion)
8412 return Result::deleted();
8422 CXXRecordDecl *ArgClass = Args[0]->getType()->getAsCXXRecordDecl();
8423 if (ArgClass && Best->FoundDecl.getDecl() &&
8424 Best->FoundDecl.getDecl()->isCXXClassMember()) {
8425 QualType ObjectType = Subobj.Kind == Subobject::Member
8426 ? Args[0]->getType()
8429 ArgClass, Best->FoundDecl, ObjectType, Subobj.Loc,
8430 Diagnose == ExplainDeleted
8431 ? S.
PDiag(diag::note_defaulted_comparison_inaccessible)
8432 << FD << Subobj.Kind << Subobj.Decl
8434 return Result::deleted();
8437 bool NeedsDeducing =
8440 if (FunctionDecl *BestFD = Best->Function) {
8445 assert(!BestFD->isDeleted() &&
"wrong overload resolution result");
8447 if (Diagnose == ExplainConstexpr && !BestFD->isConstexpr()) {
8448 if (Subobj.Kind != Subobject::CompleteObject)
8449 S.
Diag(Subobj.Loc, diag::note_defaulted_comparison_not_constexpr)
8450 << Subobj.
Kind << Subobj.Decl;
8451 S.
Diag(BestFD->getLocation(),
8452 diag::note_defaulted_comparison_not_constexpr_here);
8454 return Result::deleted();
8456 R.Constexpr &= BestFD->isConstexpr();
8458 if (NeedsDeducing) {
8463 if (BestFD->getReturnType()->isUndeducedType() &&
8469 if (Diagnose == NoDiagnostics) {
8472 diag::err_defaulted_comparison_cannot_deduce_undeduced_auto)
8473 << Subobj.
Kind << Subobj.Decl;
8476 diag::note_defaulted_comparison_cannot_deduce_undeduced_auto)
8477 << Subobj.
Kind << Subobj.Decl;
8478 S.
Diag(BestFD->getLocation(),
8479 diag::note_defaulted_comparison_cannot_deduce_callee)
8480 << Subobj.
Kind << Subobj.Decl;
8482 return Result::deleted();
8485 BestFD->getCallResultType());
8487 if (Diagnose == ExplainDeleted) {
8488 S.
Diag(Subobj.Loc, diag::note_defaulted_comparison_cannot_deduce)
8489 << Subobj.
Kind << Subobj.Decl
8490 << BestFD->getCallResultType().withoutLocalFastQualifiers();
8491 S.
Diag(BestFD->getLocation(),
8492 diag::note_defaulted_comparison_cannot_deduce_callee)
8493 << Subobj.
Kind << Subobj.Decl;
8495 return Result::deleted();
8497 R.Category = Info->Kind;
8500 QualType T = Best->BuiltinParamTypes[0];
8501 assert(T == Best->BuiltinParamTypes[1] &&
8502 "builtin comparison for different types?");
8503 assert(Best->BuiltinParamTypes[2].isNull() &&
8504 "invalid builtin comparison");
8509 if (Diagnose == ExplainDeleted) {
8511 diag::note_defaulted_comparison_vector_types)
8513 S.
Diag(Subobj.Decl->getLocation(), diag::note_declared_at);
8515 return Result::deleted();
8518 if (NeedsDeducing) {
8519 std::optional<ComparisonCategoryType> Cat =
8521 assert(Cat &&
"no category for builtin comparison?");
8532 if (Diagnose == ExplainDeleted) {
8535 Kind = OO == OO_EqualEqual ? 1 : 2;
8536 CandidateSet.NoteCandidates(
8538 Subobj.Loc, S.
PDiag(diag::note_defaulted_comparison_ambiguous)
8539 << FD << Kind << Subobj.Kind << Subobj.Decl),
8542 R = Result::deleted();
8546 if (Diagnose == ExplainDeleted) {
8547 if ((DCK == DefaultedComparisonKind::NotEqual ||
8548 DCK == DefaultedComparisonKind::Relational) &&
8549 !Best->RewriteKind) {
8550 S.
Diag(Best->Function->getLocation(),
8551 diag::note_defaulted_comparison_not_rewritten_callee)
8555 diag::note_defaulted_comparison_calls_deleted)
8556 << FD << Subobj.
Kind << Subobj.Decl;
8560 R = Result::deleted();
8566 if (OO == OO_Spaceship &&
8570 if (!
R.add(visitBinaryOperator(OO_EqualEqual, Args, Subobj,
8572 R.add(visitBinaryOperator(OO_Less, Args, Subobj, &CandidateSet));
8576 if (Diagnose == ExplainDeleted) {
8577 S.
Diag(Subobj.Loc, diag::note_defaulted_comparison_no_viable_function)
8578 << FD << (OO == OO_EqualEqual || OO == OO_ExclaimEqual)
8579 << Subobj.
Kind << Subobj.Decl;
8583 if (SpaceshipCandidates) {
8584 SpaceshipCandidates->NoteCandidates(
8589 diag::note_defaulted_comparison_no_viable_function_synthesized)
8590 << (OO == OO_EqualEqual ? 0 : 1);
8593 CandidateSet.NoteCandidates(
8598 R = Result::deleted();
8607struct StmtListResult {
8608 bool IsInvalid =
false;
8609 llvm::SmallVector<Stmt*, 16> Stmts;
8612 IsInvalid |= S.isInvalid();
8615 Stmts.push_back(S.get());
8622class DefaultedComparisonSynthesizer
8623 :
public DefaultedComparisonVisitor<DefaultedComparisonSynthesizer,
8624 StmtListResult, StmtResult,
8625 std::pair<ExprResult, ExprResult>> {
8627 unsigned ArrayDepth = 0;
8630 using Base = DefaultedComparisonVisitor;
8631 using ExprPair = std::pair<ExprResult, ExprResult>;
8635 DefaultedComparisonSynthesizer(Sema &S, CXXRecordDecl *RD, FunctionDecl *FD,
8636 DefaultedComparisonKind DCK,
8637 SourceLocation BodyLoc)
8638 :
Base(S, RD, FD, DCK), Loc(BodyLoc) {}
8642 Sema::CompoundScopeRAII CompoundScope(S);
8644 StmtListResult Stmts = visit();
8645 if (Stmts.IsInvalid)
8650 case DefaultedComparisonKind::None:
8651 llvm_unreachable(
"not a defaulted comparison");
8653 case DefaultedComparisonKind::Equal: {
8662 auto OldStmts = std::move(Stmts.Stmts);
8663 Stmts.Stmts.clear();
8666 auto FinishCmp = [&] {
8667 if (Expr *Prior = CmpSoFar.
get()) {
8669 if (RetVal.
isUnset() && Stmts.Stmts.empty())
8672 else if (Stmts.add(buildIfNotCondReturnFalse(Prior)))
8678 for (Stmt *EAsStmt : llvm::reverse(OldStmts)) {
8679 Expr *E = dyn_cast<Expr>(EAsStmt);
8682 if (FinishCmp() || Stmts.add(EAsStmt))
8691 CmpSoFar = S.CreateBuiltinBinOp(Loc, BO_LAnd, E, CmpSoFar.
get());
8697 std::reverse(Stmts.Stmts.begin(), Stmts.Stmts.end());
8700 RetVal = S.ActOnCXXBoolLiteral(Loc, tok::kw_true);
8704 case DefaultedComparisonKind::ThreeWay: {
8708 ComparisonCategoryType::StrongOrdering, Loc,
8709 Sema::ComparisonCategoryUsage::DefaultedOperator);
8712 VarDecl *EqualVD = S.Context.CompCategories.getInfoForType(
StrongOrdering)
8713 .getValueInfo(ComparisonCategoryResult::Equal)
8715 RetVal = getDecl(EqualVD);
8718 RetVal = buildStaticCastToR(RetVal.
get());
8722 case DefaultedComparisonKind::NotEqual:
8723 case DefaultedComparisonKind::Relational:
8724 RetVal =
cast<Expr>(Stmts.Stmts.pop_back_val());
8731 StmtResult ReturnStmt = S.BuildReturnStmt(Loc, RetVal.
get());
8732 if (ReturnStmt.isInvalid())
8734 Stmts.Stmts.push_back(ReturnStmt.get());
8736 return S.ActOnCompoundStmt(Loc, Loc, Stmts.Stmts,
false);
8741 return S.BuildDeclarationNameExpr(
8742 CXXScopeSpec(), DeclarationNameInfo(VD->
getDeclName(), Loc), VD);
8750 ExprPair getCompleteObject() {
8753 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD);
8754 MD && MD->isImplicitObjectMemberFunction()) {
8756 LHS = S.ActOnCXXThis(Loc);
8758 LHS = S.CreateBuiltinUnaryOp(Loc, UO_Deref, LHS.
get());
8760 LHS = getParam(Param++);
8767 ExprPair getBase(CXXBaseSpecifier *Base) {
8768 ExprPair Obj = getCompleteObject();
8769 if (Obj.first.isInvalid() || Obj.second.isInvalid())
8772 const auto CastToBase = [&](Expr *E) {
8773 QualType ToType = S.Context.getQualifiedType(
8775 return S.ImpCastExprToType(E, ToType, CK_DerivedToBase,
VK_LValue, &Path);
8777 return {CastToBase(Obj.first.get()), CastToBase(Obj.second.get())};
8780 ExprPair getField(FieldDecl *Field) {
8781 ExprPair Obj = getCompleteObject();
8782 if (Obj.first.isInvalid() || Obj.second.isInvalid())
8786 DeclarationNameInfo NameInfo(
Field->getDeclName(), Loc);
8787 return {S.BuildFieldReferenceExpr(Obj.first.get(),
false, Loc,
8788 CXXScopeSpec(), Field,
Found, NameInfo),
8789 S.BuildFieldReferenceExpr(Obj.second.get(),
false, Loc,
8790 CXXScopeSpec(), Field,
Found, NameInfo)};
8797 if (
Cond.isInvalid())
8800 ExprResult NotCond = S.CreateBuiltinUnaryOp(Loc, UO_LNot,
Cond.get());
8805 assert(!
False.isInvalid() &&
"should never fail");
8807 if (ReturnFalse.isInvalid())
8810 return S.ActOnIfStmt(Loc, IfStatementKind::Ordinary, Loc,
nullptr,
8811 S.ActOnCondition(
nullptr, Loc, NotCond.
get(),
8812 Sema::ConditionKind::Boolean),
8813 Loc, ReturnFalse.get(), SourceLocation(),
nullptr);
8818 QualType SizeType = S.Context.getSizeType();
8819 Size =
Size.zextOrTrunc(S.Context.getTypeSize(SizeType));
8822 IdentifierInfo *IterationVarName =
nullptr;
8825 llvm::raw_svector_ostream
OS(Str);
8826 OS <<
"i" << ArrayDepth;
8827 IterationVarName = &S.Context.Idents.get(
OS.str());
8830 S.Context, S.CurContext, Loc, Loc, IterationVarName, SizeType,
8831 S.Context.getTrivialTypeSourceInfo(SizeType, Loc),
SC_None);
8832 llvm::APInt
Zero(S.Context.getTypeSize(SizeType), 0);
8835 Stmt *
Init =
new (S.Context) DeclStmt(DeclGroupRef(IterationVar), Loc, Loc);
8837 auto IterRef = [&] {
8839 CXXScopeSpec(), DeclarationNameInfo(IterationVarName, Loc),
8841 assert(!Ref.
isInvalid() &&
"can't reference our own variable?");
8847 Loc, BO_NE, IterRef(),
8849 assert(!
Cond.isInvalid() &&
"should never fail");
8852 ExprResult Inc = S.CreateBuiltinUnaryOp(Loc, UO_PreInc, IterRef());
8853 assert(!
Inc.isInvalid() &&
"should never fail");
8859 return S.CreateBuiltinArraySubscriptExpr(E.get(), Loc, IterRef(), Loc);
8861 Subobj.first = Index(Subobj.first);
8862 Subobj.second = Index(Subobj.second);
8869 if (Substmt.isInvalid())
8875 if (Expr *ElemCmp = dyn_cast<Expr>(Substmt.get())) {
8876 assert(DCK == DefaultedComparisonKind::Equal &&
8877 "should have non-expression statement");
8878 Substmt = buildIfNotCondReturnFalse(ElemCmp);
8879 if (Substmt.isInvalid())
8884 return S.ActOnForStmt(Loc, Loc,
Init,
8885 S.ActOnCondition(
nullptr, Loc,
Cond.get(),
8886 Sema::ConditionKind::Boolean),
8887 S.MakeFullDiscardedValueExpr(
Inc.get()), Loc,
8892 if (Obj.first.isInvalid() || Obj.second.isInvalid())
8898 if (
Type->isOverloadableType())
8899 Op = S.CreateOverloadedBinOp(Loc, Opc, Fns, Obj.first.get(),
8900 Obj.second.get(),
true,
8903 Op = S.CreateBuiltinBinOp(Loc, Opc, Obj.first.get(), Obj.second.get());
8908 case DefaultedComparisonKind::None:
8909 llvm_unreachable(
"not a defaulted comparison");
8911 case DefaultedComparisonKind::Equal:
8914 Op = S.PerformContextuallyConvertToBool(Op.
get());
8919 case DefaultedComparisonKind::ThreeWay: {
8924 Op = buildStaticCastToR(Op.
get());
8929 IdentifierInfo *Name = &S.Context.Idents.get(
"cmp");
8932 S.Context.getTrivialTypeSourceInfo(R, Loc),
SC_None);
8933 S.AddInitializerToDecl(VD, Op.
get(),
false);
8934 Stmt *InitStmt =
new (S.Context) DeclStmt(DeclGroupRef(VD), Loc, Loc);
8940 llvm::APInt ZeroVal(S.Context.getIntWidth(S.Context.IntTy), 0);
8945 Comp = S.CreateOverloadedBinOp(Loc, BO_NE, Fns, VDRef.
get(),
Zero,
true,
8948 Comp = S.CreateBuiltinBinOp(Loc, BO_NE, VDRef.
get(),
Zero);
8949 if (
Comp.isInvalid())
8951 Sema::ConditionResult
Cond = S.ActOnCondition(
8952 nullptr, Loc,
Comp.get(), Sema::ConditionKind::Boolean);
8953 if (
Cond.isInvalid())
8957 VDRef = getDecl(VD);
8960 StmtResult ReturnStmt = S.BuildReturnStmt(Loc, VDRef.
get());
8961 if (ReturnStmt.isInvalid())
8965 return S.ActOnIfStmt(Loc, IfStatementKind::Ordinary, Loc, InitStmt,
Cond,
8966 Loc, ReturnStmt.get(),
8967 SourceLocation(),
nullptr);
8970 case DefaultedComparisonKind::NotEqual:
8971 case DefaultedComparisonKind::Relational:
8976 llvm_unreachable(
"");
8982 assert(!
R->isUndeducedType() &&
"type should have been deduced already");
8987 return S.BuildCXXNamedCast(Loc, tok::kw_static_cast,
8988 S.Context.getTrivialTypeSourceInfo(R, Loc), E,
8989 SourceRange(Loc, Loc), SourceRange(Loc, Loc));
9000 Self.LookupOverloadedOperatorName(OO, S, Operators);
9013 if (Op == OO_Spaceship) {
9014 Lookup(OO_ExclaimEqual);
9016 Lookup(OO_EqualEqual);
9047 assert(!MD->isStatic() &&
"comparison function cannot be a static member");
9049 if (MD->getRefQualifier() ==
RQ_RValue) {
9050 Diag(MD->getLocation(), diag::err_ref_qualifier_comparison_operator);
9056 MD->setType(
Context.getFunctionType(FPT->getReturnType(),
9057 FPT->getParamTypes(), EPI));
9063 QualType T = MD->getFunctionObjectParameterReferenceType();
9064 if (!T.getNonReferenceType().isConstQualified() &&
9065 (MD->isImplicitObjectMemberFunction() || T->isLValueReferenceType())) {
9067 if (MD->isExplicitObjectMemberFunction()) {
9068 Loc = MD->getParamDecl(0)->getBeginLoc();
9070 MD->getParamDecl(0)->getExplicitObjectParamThisLoc());
9072 Loc = MD->getLocation();
9078 if (!MD->isImplicit()) {
9079 Diag(Loc, diag::err_defaulted_comparison_non_const)
9084 if (MD->isExplicitObjectMemberFunction()) {
9085 assert(T->isLValueReferenceType());
9086 MD->getParamDecl(0)->setType(
Context.getLValueReferenceType(
9087 T.getNonReferenceType().withConst()));
9092 MD->setType(
Context.getFunctionType(FPT->getReturnType(),
9093 FPT->getParamTypes(), EPI));
9097 if (MD->isVolatile()) {
9098 Diag(MD->getLocation(), diag::err_volatile_comparison_operator);
9104 MD->setType(
Context.getFunctionType(FPT->getReturnType(),
9105 FPT->getParamTypes(), EPI));
9111 (IsMethod ? 1 : 2)) {
9115 <<
int(IsMethod) <<
int(DCK);
9121 QualType ParmTy = Param->getType();
9128 ExpectedTy =
Context.getCanonicalTagType(RD);
9130 CTy = Ref->getPointeeType();
9140 RD = CTy->getAsCXXRecordDecl();
9141 Ok &= RD !=
nullptr;
9155 <<
int(DCK) << ParmTy << RefTy <<
int(!IsMethod) << PlainTy
9156 << Param->getSourceRange();
9158 assert(!IsMethod &&
"should know expected type for method");
9160 diag::err_defaulted_comparison_param_unknown)
9161 <<
int(DCK) << ParmTy << Param->getSourceRange();
9167 Diag(FD->
getLocation(), diag::err_defaulted_comparison_param_mismatch)
9169 << ParmTy << Param->getSourceRange();
9174 assert(RD &&
"must have determined class");
9183 diag::err_defaulted_comparison_not_friend,
int(DCK),
9188 return declaresSameEntity(F->getFriendDecl(), FD);
9191 <<
int(DCK) <<
int(0) << RD;
9203 Diag(FD->
getLocation(), diag::err_defaulted_comparison_return_type_not_bool)
9213 RT->getContainedDeducedType() &&
9215 RT->getContainedAutoType()->isConstrained())) {
9217 diag::err_defaulted_comparison_deduced_return_type_not_auto)
9229 DefaultedComparisonInfo Info =
9230 DefaultedComparisonAnalyzer(*
this, RD, FD, DCK).visit();
9244 DefaultedComparisonAnalyzer(*
this, RD, FD, DCK,
9245 DefaultedComparisonAnalyzer::ExplainDeleted)
9256 diag::note_previous_declaration);
9268 DefaultedComparisonAnalyzer(*
this, RD, FD, DCK,
9269 DefaultedComparisonAnalyzer::ExplainDeleted)
9291 Context.adjustDeducedFunctionResultType(
9319 Diag(FD->
getBeginLoc(), diag::err_defaulted_comparison_constexpr_mismatch)
9321 DefaultedComparisonAnalyzer(*
this, RD, FD, DCK,
9322 DefaultedComparisonAnalyzer::ExplainConstexpr)
9343 EPI.ExceptionSpec.SourceDecl = FD;
9345 FPT->getParamTypes(), EPI));
9360 EqualEqual->setImplicit();
9375 Scope.addContextNote(UseLoc);
9382 CXXRecordDecl *RD = PT.getNonReferenceType()->getAsCXXRecordDecl();
9386 DefaultedComparisonSynthesizer(*
this, RD, FD, DCK, BodyLoc).build();
9400 L->CompletedImplicitDefinition(FD);
9407 ComputingExceptionSpec CES(S, FD, Loc);
9437 DefaultedComparisonSynthesizer(S, RD, FD, DCK, BodyLoc).build();
9438 if (!Body.isInvalid())
9459 for (
auto &Check : Overriding)
9471template<
typename Derived>
9472struct SpecialMemberVisitor {
9479 bool IsConstructor =
false, IsAssignment =
false, ConstArg =
false;
9483 : S(S), MD(MD), CSM(CSM), ICI(ICI) {
9488 IsConstructor =
true;
9492 IsAssignment =
true;
9497 llvm_unreachable(
"invalid special member kind");
9501 if (const ReferenceType *RT =
9502 MD->getNonObjectParameter(0)->getType()->getAs<ReferenceType>())
9503 ConstArg = RT->getPointeeType().isConstQualified();
9507 Derived &getDerived() {
return static_cast<Derived&
>(*this); }
9510 bool isMove()
const {
9511 return CSM == CXXSpecialMemberKind::MoveConstructor ||
9512 CSM == CXXSpecialMemberKind::MoveAssignment;
9516 Sema::SpecialMemberOverloadResult lookupIn(CXXRecordDecl *
Class,
9517 unsigned Quals,
bool IsMutable) {
9519 ConstArg && !IsMutable);
9524 Sema::SpecialMemberOverloadResult lookupInheritedCtor(CXXRecordDecl *
Class) {
9527 assert(CSM == CXXSpecialMemberKind::DefaultConstructor);
9536 typedef llvm::PointerUnion<CXXBaseSpecifier*, FieldDecl*> Subobject;
9539 static SourceLocation getSubobjectLoc(Subobject Subobj) {
9542 if (
auto *B = dyn_cast<CXXBaseSpecifier *>(Subobj))
9543 return B->getBaseTypeLoc();
9550 VisitNonVirtualBases,
9555 VisitPotentiallyConstructedBases,
9561 bool visit(BasesToVisit Bases) {
9564 if (Bases == VisitPotentiallyConstructedBases)
9565 Bases = RD->
isAbstract() ? VisitNonVirtualBases : VisitAllBases;
9567 for (
auto &B : RD->
bases())
9568 if ((Bases == VisitDirectBases || !B.isVirtual()) &&
9569 getDerived().visitBase(&B))
9572 if (Bases == VisitAllBases)
9573 for (
auto &B : RD->
vbases())
9574 if (getDerived().visitBase(&B))
9577 for (
auto *F : RD->
fields())
9578 if (!F->isInvalidDecl() && !F->isUnnamedBitField() &&
9579 getDerived().visitField(F))
9588struct SpecialMemberDeletionInfo
9589 : SpecialMemberVisitor<SpecialMemberDeletionInfo> {
9594 bool AllFieldsAreConst;
9596 SpecialMemberDeletionInfo(Sema &S, CXXMethodDecl *MD,
9598 Sema::InheritedConstructorInfo *ICI,
bool Diagnose)
9599 : SpecialMemberVisitor(S, MD, CSM, ICI), Diagnose(Diagnose),
9600 Loc(MD->getLocation()), AllFieldsAreConst(
true) {}
9605 return ICI ? CXXSpecialMemberKind::Invalid : CSM;
9608 bool shouldDeleteForVariantObjCPtrMember(FieldDecl *FD, QualType FieldType);
9610 bool shouldDeleteForVariantPtrAuthMember(
const FieldDecl *FD);
9612 bool visitBase(CXXBaseSpecifier *Base) {
return shouldDeleteForBase(Base); }
9613 bool visitField(FieldDecl *Field) {
return shouldDeleteForField(Field); }
9615 bool shouldDeleteForBase(CXXBaseSpecifier *Base);
9616 bool shouldDeleteForField(FieldDecl *FD);
9617 bool shouldDeleteForAllConstMembers();
9619 bool shouldDeleteForClassSubobject(CXXRecordDecl *
Class, Subobject Subobj,
9621 bool shouldDeleteForSubobjectCall(Subobject Subobj,
9622 Sema::SpecialMemberOverloadResult SMOR,
9623 bool IsDtorCallInCtor);
9625 bool isAccessible(Subobject Subobj, CXXMethodDecl *D);
9631bool SpecialMemberDeletionInfo::isAccessible(Subobject Subobj,
9632 CXXMethodDecl *target) {
9637 if (CXXBaseSpecifier *base = Subobj.dyn_cast<CXXBaseSpecifier*>()) {
9652bool SpecialMemberDeletionInfo::shouldDeleteForSubobjectCall(
9653 Subobject Subobj, Sema::SpecialMemberOverloadResult SMOR,
9654 bool IsDtorCallInCtor) {
9656 FieldDecl *
Field = Subobj.dyn_cast<FieldDecl*>();
9665 } DiagKind = NotSet;
9668 if (CSM == CXXSpecialMemberKind::DefaultConstructor && Field &&
9669 Field->getParent()->isUnion()) {
9679 DiagKind = !
Decl ? NoDecl : DeletedDecl;
9681 DiagKind = MultipleDecl;
9682 else if (!isAccessible(Subobj, Decl))
9683 DiagKind = InaccessibleDecl;
9684 else if (!IsDtorCallInCtor && Field &&
Field->getParent()->isUnion() &&
9685 !
Decl->isTrivial()) {
9691 if (CSM == CXXSpecialMemberKind::DefaultConstructor) {
9699 DiagKind = NonTrivialDecl;
9701 DiagKind = NonTrivialDecl;
9705 if (DiagKind == NotSet)
9711 diag::note_deleted_special_member_class_subobject)
9713 << DiagKind << IsDtorCallInCtor <<
false;
9717 diag::note_deleted_special_member_class_subobject)
9718 << getEffectiveCSM() << MD->
getParent() <<
false
9719 <<
Base->getType() << DiagKind << IsDtorCallInCtor
9723 if (DiagKind == DeletedDecl)
9733bool SpecialMemberDeletionInfo::shouldDeleteForClassSubobject(
9734 CXXRecordDecl *
Class, Subobject Subobj,
unsigned Quals) {
9735 FieldDecl *
Field = Subobj.dyn_cast<FieldDecl*>();
9736 bool IsMutable =
Field &&
Field->isMutable();
9752 if (!(CSM == CXXSpecialMemberKind::DefaultConstructor && Field &&
9753 Field->hasInClassInitializer()) &&
9754 shouldDeleteForSubobjectCall(Subobj, lookupIn(
Class, Quals, IsMutable),
9761 if (IsConstructor) {
9762 Sema::SpecialMemberOverloadResult SMOR =
9764 false,
false,
false,
false);
9765 if (shouldDeleteForSubobjectCall(Subobj, SMOR,
true))
9772bool SpecialMemberDeletionInfo::shouldDeleteForVariantObjCPtrMember(
9773 FieldDecl *FD, QualType FieldType) {
9782 if (CSM == CXXSpecialMemberKind::DefaultConstructor &&
9788 S.
Diag(FD->
getLocation(), diag::note_deleted_special_member_class_subobject)
9789 << getEffectiveCSM() << ParentClass <<
true << FD << 4
9796bool SpecialMemberDeletionInfo::shouldDeleteForVariantPtrAuthMember(
9797 const FieldDecl *FD) {
9806 if (CSM == CXXSpecialMemberKind::DefaultConstructor ||
9807 CSM == CXXSpecialMemberKind::Destructor)
9812 S.
Diag(FD->
getLocation(), diag::note_deleted_special_member_class_subobject)
9813 << getEffectiveCSM() << ParentClass <<
true << FD << 4
9822bool SpecialMemberDeletionInfo::shouldDeleteForBase(CXXBaseSpecifier *Base) {
9823 CXXRecordDecl *BaseClass =
Base->getType()->getAsCXXRecordDecl();
9830 Sema::SpecialMemberOverloadResult SMOR = lookupInheritedCtor(BaseClass);
9831 if (
auto *BaseCtor = SMOR.
getMethod()) {
9836 if (BaseCtor->isDeleted() && Diagnose) {
9838 diag::note_deleted_special_member_class_subobject)
9839 << getEffectiveCSM() << MD->
getParent() <<
false
9840 <<
Base->getType() << 1 <<
false
9844 return BaseCtor->isDeleted();
9846 return shouldDeleteForClassSubobject(BaseClass, Base, 0);
9851bool SpecialMemberDeletionInfo::shouldDeleteForField(FieldDecl *FD) {
9855 if (inUnion() && shouldDeleteForVariantObjCPtrMember(FD, FieldType))
9858 if (inUnion() && shouldDeleteForVariantPtrAuthMember(FD))
9861 if (CSM == CXXSpecialMemberKind::DefaultConstructor) {
9866 S.
Diag(FD->
getLocation(), diag::note_deleted_default_ctor_uninit_field)
9867 << !!ICI << MD->
getParent() << FD << FieldType << 0;
9877 S.
Diag(FD->
getLocation(), diag::note_deleted_default_ctor_uninit_field)
9883 AllFieldsAreConst =
false;
9884 }
else if (CSM == CXXSpecialMemberKind::CopyConstructor) {
9889 S.
Diag(FD->
getLocation(), diag::note_deleted_copy_ctor_rvalue_reference)
9893 }
else if (IsAssignment) {
9898 << isMove() << MD->
getParent() << FD << FieldType << 0;
9913 if (!inUnion() && FieldRecord->
isUnion() &&
9915 bool AllVariantFieldsAreConst =
true;
9918 for (
auto *UI : FieldRecord->
fields()) {
9921 if (shouldDeleteForVariantObjCPtrMember(&*UI, UnionFieldType))
9924 if (shouldDeleteForVariantPtrAuthMember(&*UI))
9928 AllVariantFieldsAreConst =
false;
9931 if (UnionFieldRecord &&
9932 shouldDeleteForClassSubobject(UnionFieldRecord, UI,
9938 if (CSM == CXXSpecialMemberKind::DefaultConstructor &&
9939 AllVariantFieldsAreConst && !FieldRecord->
field_empty()) {
9942 diag::note_deleted_default_ctor_all_const)
9953 if (shouldDeleteForClassSubobject(FieldRecord, FD,
9964bool SpecialMemberDeletionInfo::shouldDeleteForAllConstMembers() {
9967 if (CSM == CXXSpecialMemberKind::DefaultConstructor && inUnion() &&
9968 AllFieldsAreConst) {
9969 bool AnyFields =
false;
9971 if ((AnyFields = !F->isUnnamedBitField()))
9977 diag::note_deleted_default_ctor_all_const)
10023 bool DeletesOnlyMatchingCopy =
10028 (!DeletesOnlyMatchingCopy ||
10033 for (
auto *I : RD->
ctors()) {
10034 if (I->isMoveConstructor()) {
10035 UserDeclaredMove = I;
10039 assert(UserDeclaredMove);
10041 (!DeletesOnlyMatchingCopy ||
10046 for (
auto *I : RD->
methods()) {
10047 if (I->isMoveAssignmentOperator()) {
10048 UserDeclaredMove = I;
10052 assert(UserDeclaredMove);
10055 if (UserDeclaredMove) {
10057 diag::note_deleted_copy_user_declared_move)
10074 Context.DeclarationNames.getCXXOperatorName(OO_Delete);
10079 OperatorDelete, IDP,
10087 SpecialMemberDeletionInfo SMI(*
this, MD, CSM, ICI,
Diagnose);
10095 if (SMI.visit(SMI.IsAssignment ? SMI.VisitDirectBases
10096 : SMI.VisitPotentiallyConstructedBases))
10099 if (SMI.shouldDeleteForAllConstMembers())
10110 auto RealCSM = CSM;
10114 return CUDA().inferTargetForImplicitSpecialMember(RD, RealCSM, MD,
10123 assert(DFK &&
"not a defaultable function");
10130 DefaultedComparisonAnalyzer(
10132 DFK.
asComparison(), DefaultedComparisonAnalyzer::ExplainDeleted)
10153 *Selected =
nullptr;
10157 llvm_unreachable(
"not a special member");
10175 for (
auto *CI : RD->
ctors()) {
10176 if (!CI->isDefaultConstructor())
10183 *Selected = DefCtor;
10216 }
else if (!Selected) {
10224 goto NeedOverloadResolution;
10234 }
else if (!Selected) {
10239 goto NeedOverloadResolution;
10243 NeedOverloadResolution:
10272 llvm_unreachable(
"unknown special method kind");
10276 for (
auto *CI : RD->
ctors())
10277 if (!CI->isImplicit())
10284 dyn_cast<CXXConstructorDecl>(TI->getTemplatedDecl()))
10314 ConstRHS, TAH, Diagnose ? &Selected :
nullptr))
10322 S.
Diag(SubobjLoc, diag::note_nontrivial_no_def_ctor)
10325 S.
Diag(CD->getLocation(), diag::note_user_declared_ctor);
10326 }
else if (!Selected)
10327 S.
Diag(SubobjLoc, diag::note_nontrivial_no_copy)
10332 << Kind << SubType.getUnqualifiedType() << CSM;
10334 S.
Diag(SubobjLoc, diag::note_nontrivial_user_provided)
10335 << Kind << SubType.getUnqualifiedType() << CSM;
10340 S.
Diag(SubobjLoc, diag::note_nontrivial_subobject)
10341 << Kind << SubType.getUnqualifiedType() << CSM;
10357 for (
const auto *FI : RD->
fields()) {
10358 if (FI->isInvalidDecl() || FI->isUnnamedBitField())
10364 if (FI->isAnonymousStructOrUnion()) {
10366 CSM, ConstArg, TAH, Diagnose))
10376 FI->hasInClassInitializer()) {
10378 S.
Diag(FI->getLocation(), diag::note_nontrivial_default_member_init)
10389 S.
Diag(FI->getLocation(), diag::note_nontrivial_objc_ownership)
10394 bool ConstRHS = ConstArg && !FI->isMutable();
10418 "not special enough");
10422 bool ConstArg =
false;
10446 const bool ClangABICompat14 =
10447 Context.getLangOpts().isCompatibleWith(LangOptions::ClangABI::Ver14);
10450 ClangABICompat14)) {
10454 <<
Context.getLValueReferenceType(
10455 Context.getCanonicalTagType(RD).withConst());
10473 <<
Context.getRValueReferenceType(
Context.getCanonicalTagType(RD));
10480 llvm_unreachable(
"not a special member");
10486 diag::note_nontrivial_default_arg)
10505 for (
const auto &BI : RD->
bases())
10547 Diag(BS.
getBeginLoc(), diag::note_nontrivial_has_virtual) << RD << 1;
10552 for (
const auto *MI : RD->
methods()) {
10553 if (MI->isVirtual()) {
10555 Diag(MLoc, diag::note_nontrivial_has_virtual) << RD << 0;
10560 llvm_unreachable(
"dynamic class with no vbases and no virtual functions");
10568struct FindHiddenVirtualMethod {
10576 static bool CheckMostOverridenMethods(
10578 const llvm::SmallPtrSetImpl<const CXXMethodDecl *> &Methods) {
10582 if (CheckMostOverridenMethods(O, Methods))
10592 auto *BaseRecord = Specifier->getType()->castAsRecordDecl();
10596 bool foundSameNameMethod =
false;
10598 for (Path.
Decls = BaseRecord->lookup(Name).begin();
10603 foundSameNameMethod =
true;
10620 if (!CheckMostOverridenMethods(MD, OverridenAndUsingBaseMethods))
10621 overloadedMethods.push_back(MD);
10625 if (foundSameNameMethod)
10626 OverloadedMethods.append(overloadedMethods.begin(),
10627 overloadedMethods.end());
10628 return foundSameNameMethod;
10635 llvm::SmallPtrSetImpl<const CXXMethodDecl *>& Methods) {
10651 FindHiddenVirtualMethod FHVM;
10660 ND = shad->getTargetDecl();
10666 OverloadedMethods = FHVM.OverloadedMethods;
10671 for (
const CXXMethodDecl *overloadedMD : OverloadedMethods) {
10673 diag::note_hidden_overloaded_virtual_declared_here) << overloadedMD;
10675 Diag(overloadedMD->getLocation(), PD);
10688 if (!OverloadedMethods.empty()) {
10690 << MD << (OverloadedMethods.size() > 1);
10697 auto PrintDiagAndRemoveAttr = [&](
unsigned N) {
10700 Diag(RD.
getAttr<TrivialABIAttr>()->getLocation(),
10701 diag::ext_cannot_use_trivial_abi) << &RD;
10702 Diag(RD.
getAttr<TrivialABIAttr>()->getLocation(),
10703 diag::note_cannot_use_trivial_abi_reason) << &RD << N;
10710 PrintDiagAndRemoveAttr(1);
10714 for (
const auto &B : RD.
bases()) {
10717 if (!B.getType()->isDependentType() &&
10718 !B.getType()->getAsCXXRecordDecl()->canPassInRegisters()) {
10719 PrintDiagAndRemoveAttr(2);
10723 if (B.isVirtual()) {
10724 PrintDiagAndRemoveAttr(3);
10729 for (
const auto *FD : RD.
fields()) {
10734 PrintDiagAndRemoveAttr(4);
10740 PrintDiagAndRemoveAttr(6);
10744 if (
const auto *RT =
10746 if (!RT->isDependentType() &&
10748 ->canPassInRegisters()) {
10749 PrintDiagAndRemoveAttr(5);
10758 auto HasNonDeletedCopyOrMoveConstructor = [&]() {
10770 if (CD->isCopyOrMoveConstructor() && !CD->isDeleted())
10775 if (!HasNonDeletedCopyOrMoveConstructor()) {
10776 PrintDiagAndRemoveAttr(0);
10784 diag::err_incomplete_type_vtable_pointer_auth))
10792 assert(PrimaryBase);
10795 if (!BasePtr.getType()->getAsCXXRecordDecl()->isDynamicClass())
10797 Base = BasePtr.getType()->getAsCXXRecordDecl();
10800 if (!
Base ||
Base == PrimaryBase || !
Base->isPolymorphic())
10802 Diag(RD.
getAttr<VTablePointerAuthenticationAttr>()->getLocation(),
10803 diag::err_non_top_level_vtable_pointer_auth)
10805 PrimaryBase =
Base;
10809 Diag(RD.
getAttr<VTablePointerAuthenticationAttr>()->getLocation(),
10810 diag::err_non_polymorphic_vtable_pointer_auth)
10823 if (AL.getKind() != ParsedAttr::AT_Visibility)
10826 Diag(AL.getLoc(), diag::warn_attribute_after_definition_ignored) << AL;
10834 LBrac, RBrac, AttrList);
10856 Spaceships.clear();
10862 Spaceships.push_back(FD);
10871 if (
auto *FD = dyn_cast<FunctionDecl>(ND))
10872 if (FD->isExplicitlyDefaulted())
10873 Spaceships.push_back(FD);
10903 else if (
Context.getTargetInfo().getCXXABI().isMicrosoft() &&
10968 DefaultedSpaceships);
10969 for (
auto *FD : DefaultedSpaceships)
10976 llvm::function_ref<
Scope *()> EnterScope) {
10984 DeclContext *LookupDC = dyn_cast<DeclContext>(D);
10988 ParameterLists.push_back(TPL);
10992 ParameterLists.push_back(FTD->getTemplateParameters());
10993 }
else if (
VarDecl *VD = dyn_cast<VarDecl>(D)) {
10997 ParameterLists.push_back(VTD->getTemplateParameters());
10998 else if (
auto *PSD = dyn_cast<VarTemplatePartialSpecializationDecl>(D))
10999 ParameterLists.push_back(PSD->getTemplateParameters());
11001 }
else if (
TagDecl *TD = dyn_cast<TagDecl>(D)) {
11003 ParameterLists.push_back(TPL);
11007 ParameterLists.push_back(CTD->getTemplateParameters());
11008 else if (
auto *PSD = dyn_cast<ClassTemplatePartialSpecializationDecl>(D))
11009 ParameterLists.push_back(PSD->getTemplateParameters());
11014 unsigned Count = 0;
11015 Scope *InnermostTemplateScope =
nullptr;
11019 if (Params->size() == 0)
11022 InnermostTemplateScope = EnterScope();
11024 if (Param->getDeclName()) {
11025 InnermostTemplateScope->
AddDecl(Param);
11033 if (InnermostTemplateScope) {
11034 assert(LookupDC &&
"no enclosing DeclContext for template lookup");
11042 if (!RecordD)
return;
11049 if (!RecordD)
return;
11058 if (Param->getDeclName())
11077 if (Param->getDeclName())
11097 if (!
Method->isInvalidDecl())
11106 bool DiagOccurred =
false;
11108 [DiagID, &S, &DiagOccurred](
DeclSpec::TQ, StringRef QualName,
11115 DiagOccurred =
true;
11133 S.
Diag(PointerLoc, diag::err_invalid_ctor_dtor_decl)
11201 = dyn_cast<CXXRecordDecl>(
Constructor->getDeclContext());
11212 !
Constructor->isFunctionTemplateSpecialization()) {
11214 Constructor->getParamDecl(0)->getType()->getCanonicalTypeUnqualified();
11216 if (ParamType == ClassTy) {
11218 const char *ConstRef
11219 =
Constructor->getParamDecl(0)->getIdentifier() ?
"const &"
11221 Diag(ParamLoc, diag::err_constructor_byvalue_arg)
11243 Context.DeclarationNames.getCXXOperatorName(OO_Delete);
11246 Loc, RD,
true,
false, Name)) {
11247 Expr *ThisArg =
nullptr;
11252 if (OperatorDelete->isDestroyingOperatorDelete()) {
11253 unsigned AddressParamIndex = 0;
11254 if (OperatorDelete->isTypeAwareOperatorNewOrDelete())
11255 ++AddressParamIndex;
11257 OperatorDelete->getParamDecl(AddressParamIndex)->getType();
11264 OperatorDelete->getParamDecl(AddressParamIndex)->getLocation());
11265 assert(!
This.isInvalid() &&
"couldn't form 'this' expr in dtor?");
11268 if (
This.isInvalid()) {
11271 Diag(Loc, diag::note_implicit_delete_this_in_destructor_here);
11274 ThisArg =
This.get();
11280 Destructor->setOperatorDelete(OperatorDelete, ThisArg);
11283 Context.getTargetInfo().callGlobalDeleteInDeletingDtor(
11295 if (GlobalOperatorDelete) {
11297 Destructor->setOperatorGlobalDelete(GlobalOperatorDelete);
11301 if (
Context.getTargetInfo().emitVectorDeletingDtors(
11303 bool DestructorIsExported =
Destructor->hasAttr<DLLExportAttr>();
11306 Context.DeclarationNames.getCXXOperatorName(OO_Array_Delete);
11309 false, VDeleteName);
11315 Destructor->setGlobalOperatorArrayDelete(GlobalArrOperatorDelete);
11316 if (GlobalArrOperatorDelete &&
11317 (
Context.classMaybeNeedsVectorDeletingDestructor(RD) ||
11318 DestructorIsExported))
11320 }
else if (!ArrOperatorDelete) {
11323 true, VDeleteName);
11325 Destructor->setOperatorArrayDelete(ArrOperatorDelete);
11326 if (ArrOperatorDelete &&
11327 (
Context.classMaybeNeedsVectorDeletingDestructor(RD) ||
11328 DestructorIsExported))
11347 << DeclaratorType << isa<TypeAliasDecl>(TT->getDecl());
11348 else if (
const TemplateSpecializationType *TST =
11349 DeclaratorType->
getAs<TemplateSpecializationType>())
11350 if (TST->isTypeAlias())
11352 << DeclaratorType << 1;
11442 if (R.getEnd().isInvalid())
11443 R.setEnd(Before.
getEnd());
11447 if (After.isInvalid())
11449 if (R.getBegin().isInvalid())
11450 R.setBegin(After.getBegin());
11451 R.setEnd(After.getEnd());
11500 unsigned NumParam = Proto->getNumParams();
11504 if (NumParam == 1) {
11506 if (
const auto *
First =
11507 dyn_cast_if_present<ParmVarDecl>(FTI.
Params[0].
Param);
11508 First &&
First->isExplicitObjectParameter())
11512 if (NumParam != 0) {
11517 }
else if (Proto->isVariadic()) {
11524 if (Proto->getReturnType() != ConvType) {
11525 bool NeedsTypedef =
false;
11529 bool PastFunctionChunk =
false;
11531 switch (Chunk.Kind) {
11533 if (!PastFunctionChunk) {
11534 if (Chunk.Fun.HasTrailingReturnType) {
11539 PastFunctionChunk =
true;
11544 NeedsTypedef =
true;
11564 After.isValid() ? After.getBegin() :
11566 auto &&DB =
Diag(Loc, diag::err_conv_function_with_complex_decl);
11567 DB << Before << After;
11569 if (!NeedsTypedef) {
11573 if (After.isInvalid() && ConvTSI) {
11581 }
else if (!Proto->getReturnType()->isDependentType()) {
11582 DB << 1 << Proto->getReturnType();
11584 DB << 2 << Proto->getReturnType();
11595 ConvType = Proto->getReturnType();
11603 ConvType =
Context.getPointerType(ConvType);
11607 ConvType =
Context.getPointerType(ConvType);
11615 R =
Context.getFunctionType(ConvType, {}, Proto->getExtProtoInfo());
11621 ? diag::warn_cxx98_compat_explicit_conversion_functions
11622 : diag::ext_explicit_conversion_functions)
11627 assert(Conversion &&
"Expected to receive a conversion function declaration");
11648 ConvType =
Context.getCanonicalType(ConvType).getUnqualifiedType();
11649 if (ConvType == ClassType)
11654 << ClassType << ConvType;
11657 << ClassType << ConvType;
11668 << ConvType->
castAs<AutoType>()->getKeyword()
11672 return ConversionTemplate;
11697 for (
unsigned Idx = 0; Idx < FTI.
NumParams; Idx++) {
11698 const auto &ParamInfo = FTI.
Params[Idx];
11699 if (!ParamInfo.Param)
11702 if (!Param->isExplicitObjectParameter())
11705 ExplicitObjectParam = Param;
11708 Diag(Param->getLocation(),
11709 diag::err_explicit_object_parameter_must_be_first)
11710 << IsLambda << Param->getSourceRange();
11713 if (!ExplicitObjectParam)
11718 diag::err_explicit_object_default_arg)
11727 diag::err_explicit_object_parameter_nonmember)
11734 diag::err_explicit_object_parameter_nonmember)
11759 !isa_and_present<CXXRecordDecl>(
11762 diag::err_explicit_object_parameter_nonmember)
11769 diag::err_explicit_object_parameter_mutable)
11777 assert(D.
isInvalidType() &&
"Explicit object parameter in non-member "
11778 "should have been diagnosed already");
11786 diag::err_explicit_object_parameter_constructor)
11796struct BadSpecifierDiagnoser {
11799 ~BadSpecifierDiagnoser() {
11803 template<
typename T>
void check(SourceLocation SpecLoc, T Spec) {
11807 return check(SpecLoc,
11810 void check(SourceLocation SpecLoc,
const char *Spec) {
11812 Diagnostic << SourceRange(SpecLoc, SpecLoc);
11813 if (!Specifiers.empty()) Specifiers +=
" ";
11814 Specifiers += Spec;
11818 Sema::SemaDiagnosticBuilder Diagnostic;
11819 std::string Specifiers;
11827 assert(GuidedTemplateDecl &&
"missing template decl for deduction guide");
11832 if (!
CurContext->getRedeclContext()->Equals(
11835 << GuidedTemplateDecl;
11841 if (DS.hasTypeSpecifier() || DS.getTypeQualifiers() ||
11842 DS.getStorageClassSpecLoc().isValid() || DS.isInlineSpecified() ||
11843 DS.isNoreturnSpecified() || DS.hasConstexprSpecifier()) {
11844 BadSpecifierDiagnoser Diagnoser(
11846 diag::err_deduction_guide_invalid_specifier);
11848 Diagnoser.check(DS.getStorageClassSpecLoc(), DS.getStorageClassSpec());
11849 DS.ClearStorageClassSpecs();
11853 Diagnoser.check(DS.getInlineSpecLoc(),
"inline");
11854 Diagnoser.check(DS.getNoreturnSpecLoc(),
"_Noreturn");
11855 Diagnoser.check(DS.getConstexprSpecLoc(),
"constexpr");
11856 DS.ClearConstexprSpec();
11858 Diagnoser.check(DS.getConstSpecLoc(),
"const");
11859 Diagnoser.check(DS.getRestrictSpecLoc(),
"__restrict");
11860 Diagnoser.check(DS.getVolatileSpecLoc(),
"volatile");
11861 Diagnoser.check(DS.getAtomicSpecLoc(),
"_Atomic");
11862 Diagnoser.check(DS.getUnalignedSpecLoc(),
"__unaligned");
11863 DS.ClearTypeQualifiers();
11865 Diagnoser.check(DS.getTypeSpecComplexLoc(), DS.getTypeSpecComplex());
11866 Diagnoser.check(DS.getTypeSpecSignLoc(), DS.getTypeSpecSign());
11867 Diagnoser.check(DS.getTypeSpecWidthLoc(), DS.getTypeSpecWidth());
11868 Diagnoser.check(DS.getTypeSpecTypeLoc(), DS.getTypeSpecType());
11869 DS.ClearTypeSpecType();
11876 bool FoundFunction =
false;
11882 diag::err_deduction_guide_with_complex_decl)
11886 if (!Chunk.Fun.hasTrailingReturnType())
11888 diag::err_deduction_guide_no_trailing_return_type);
11893 ParsedType TrailingReturnType = Chunk.Fun.getTrailingReturnType();
11896 assert(TSI &&
"deduction guide has valid type but invalid return type?");
11897 bool AcceptableReturnType =
false;
11898 bool MightInstantiateToSpecialization =
false;
11901 TemplateName SpecifiedName = RetTST.getTypePtr()->getTemplateName();
11902 bool TemplateMatches =
Context.hasSameTemplateName(
11903 SpecifiedName, GuidedTemplate,
true);
11911 if (SimplyWritten && TemplateMatches)
11912 AcceptableReturnType =
true;
11917 MightInstantiateToSpecialization =
11921 MightInstantiateToSpecialization =
true;
11924 if (!AcceptableReturnType)
11926 diag::err_deduction_guide_bad_trailing_return_type)
11927 << GuidedTemplate << TSI->
getType()
11928 << MightInstantiateToSpecialization
11933 FoundFunction =
true;
11952 assert(*IsInline != PrevNS->
isInline());
11962 S.
Diag(Loc, diag::warn_inline_namespace_reopened_noninline)
11965 S.
Diag(Loc, diag::err_inline_namespace_mismatch);
11983 bool IsInline = InlineLoc.
isValid();
11984 bool IsInvalid =
false;
11985 bool IsStd =
false;
11986 bool AddToKnown =
false;
11997 auto DiagnoseInlineStdNS = [&]() {
11998 assert(IsInline && II->
isStr(
"std") &&
11999 CurContext->getRedeclContext()->isTranslationUnit() &&
12000 "Precondition of DiagnoseInlineStdNS not met");
12001 Diag(InlineLoc, diag::err_inline_namespace_std)
12020 R.isSingleResult() ? R.getRepresentativeDecl() :
nullptr;
12021 PrevNS = dyn_cast_or_null<NamespaceDecl>(PrevDecl);
12025 if (IsInline && II->
isStr(
"std") &&
12026 CurContext->getRedeclContext()->isTranslationUnit())
12027 DiagnoseInlineStdNS();
12028 else if (IsInline != PrevNS->
isInline())
12030 &IsInline, PrevNS);
12031 }
else if (PrevDecl) {
12033 Diag(Loc, diag::err_redefinition_different_kind)
12038 }
else if (II->
isStr(
"std") &&
12039 CurContext->getRedeclContext()->isTranslationUnit()) {
12041 DiagnoseInlineStdNS();
12046 AddToKnown = !IsInline;
12049 AddToKnown = !IsInline;
12063 if (PrevNS && IsInline != PrevNS->
isInline())
12065 &IsInline, PrevNS);
12078 if (
const VisibilityAttr *
Attr = Namespc->
getAttr<VisibilityAttr>())
12084 KnownNamespaces[Namespc] =
false;
12092 TU->setAnonymousNamespace(Namespc);
12144 return dyn_cast_or_null<NamespaceDecl>(D);
12148 NamespaceDecl *Namespc = dyn_cast_or_null<NamespaceDecl>(Dcl);
12149 assert(Namespc &&
"Invalid parameter, expected NamespaceDecl");
12152 if (Namespc->
hasAttr<VisibilityAttr>())
12155 if (DeferredExportedNamespaces.erase(Namespc))
12160 return cast_or_null<CXXRecordDecl>(
12169 return cast_or_null<NamespaceDecl>(
12175enum UnsupportedSTLSelect {
12182struct InvalidSTLDiagnoser {
12187 QualType operator()(UnsupportedSTLSelect Sel = USS_Other, StringRef Name =
"",
12188 const VarDecl *VD =
nullptr) {
12190 auto D = S.
Diag(Loc, diag::err_std_compare_type_not_supported)
12191 << TyForDiags << ((
int)Sel);
12192 if (Sel == USS_InvalidMember || Sel == USS_MissingMember) {
12193 assert(!Name.empty());
12197 if (Sel == USS_InvalidMember) {
12210 "Looking for comparison category type outside of C++.");
12225 if (Info && FullyCheckedComparisonCategories[
static_cast<unsigned>(Kind)]) {
12236 std::string NameForDiags =
"std::";
12238 Diag(Loc, diag::err_implied_comparison_category_type_not_found)
12239 << NameForDiags << (int)Usage;
12243 assert(Info->
Kind == Kind);
12254 InvalidSTLDiagnoser UnsupportedSTLError{*
this, Loc, TyForDiags(Info)};
12257 return UnsupportedSTLError(USS_NonTrivial);
12262 if (
Base->isEmpty())
12265 return UnsupportedSTLError();
12273 if (std::distance(FIt, FEnd) != 1 ||
12274 !FIt->getType()->isIntegralOrEnumerationType()) {
12275 return UnsupportedSTLError();
12285 return UnsupportedSTLError(USS_MissingMember, MemName);
12288 assert(VD &&
"should not be null!");
12295 return UnsupportedSTLError(USS_InvalidMember, MemName, VD);
12301 return UnsupportedSTLError();
12308 FullyCheckedComparisonCategories[
static_cast<unsigned>(Kind)] =
true;
12318 &
PP.getIdentifierTable().get(
"std"),
12331 const char *ClassName,
12333 const Decl **MalformedDecl) {
12341 auto ReportMatchingNameAsMalformed = [&](
NamedDecl *D) {
12342 if (!MalformedDecl)
12350 *MalformedDecl = D;
12355 if (
const TemplateSpecializationType *TST =
12357 Template = dyn_cast_or_null<ClassTemplateDecl>(
12358 TST->getTemplateName().getAsTemplateDecl());
12359 Arguments = TST->template_arguments();
12360 }
else if (
const auto *TT = SugaredType->
getAs<TagType>()) {
12362 Arguments = TT->getTemplateArgs(S.
Context);
12366 ReportMatchingNameAsMalformed(SugaredType->
getAsTagDecl());
12370 if (!*CachedDecl) {
12389 *MalformedDecl = TemplateClass;
12397 if (
Template->getCanonicalDecl() != (*CachedDecl)->getCanonicalDecl())
12402 QualType ArgType = Arguments[0].getAsType();
12408 if (S.
getLangOpts().ObjCAutoRefCount && ArgType->isObjCLifetimeType() &&
12409 !ArgType.getObjCLifetime()) {
12414 *TypeArg = ArgType;
12422 "Looking for std::initializer_list outside of C++.");
12432 const Decl **MalformedDecl) {
12434 "Looking for std::type_identity outside of C++.");
12444 const char *ClassName,
12445 bool *WasMalformed) {
12456 Result.suppressDiagnostics();
12459 S.
Diag(
Found->getLocation(), diag::err_malformed_std_class_template)
12462 *WasMalformed =
true;
12471 S.
Diag(
Template->getLocation(), diag::err_malformed_std_class_template)
12474 *WasMalformed =
true;
12489 Loc, Args,
nullptr,
12495 bool WasMalformed =
false;
12500 Diag(Loc, diag::err_implied_std_initializer_list_not_found);
12528 ArgType = RT->getPointeeType().getUnqualifiedType();
12537 case Decl::TranslationUnit:
12539 case Decl::LinkageSpec:
12549class NamespaceValidatorCCC final :
public CorrectionCandidateCallback {
12551 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
12557 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
12558 return std::make_unique<NamespaceValidatorCCC>(*
this);
12567 Module *M = ND->getOwningModule();
12568 assert(M &&
"hidden namespace definition not in a module?");
12572 diag::err_module_unimported_use_header)
12577 diag::err_module_unimported_use)
12587 NamespaceValidatorCCC CCC{};
12589 S.
CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), Sc, &SS, CCC,
12597 if (isa_and_nonnull<NamespaceDecl>(Corrected.getFoundDecl()) &&
12598 Corrected.requiresImport()) {
12601 std::string CorrectedStr(Corrected.getAsString(S.
getLangOpts()));
12602 bool DroppedSpecifier =
12603 Corrected.WillReplaceSpecifier() && Ident->
getName() == CorrectedStr;
12605 S.
PDiag(diag::err_using_directive_member_suggest)
12606 << Ident << DC << DroppedSpecifier << SS.
getRange(),
12607 S.
PDiag(diag::note_namespace_defined_here));
12610 S.
PDiag(diag::err_using_directive_suggest) << Ident,
12611 S.
PDiag(diag::note_namespace_defined_here));
12613 R.addDecl(Corrected.getFoundDecl());
12624 assert(!SS.
isInvalid() &&
"Invalid CXXScopeSpec.");
12625 assert(NamespcName &&
"Invalid NamespcName.");
12626 assert(IdentLoc.
isValid() &&
"Invalid NamespceName location.");
12637 if (R.isAmbiguous())
12646 NamespcName->
isStr(
"std")) {
12647 Diag(IdentLoc, diag::ext_using_undefined_std);
12657 NamedDecl *Named = R.getRepresentativeDecl();
12659 assert(
NS &&
"expected namespace decl");
12678 CommonAncestor = CommonAncestor->
getParent();
12682 IdentLoc, Named, CommonAncestor);
12686 Diag(IdentLoc, diag::warn_using_directive_in_header);
12691 Diag(IdentLoc, diag::err_expected_namespace_name) << SS.
getRange();
12741 ? diag::warn_cxx98_compat_using_decl_constructor
12742 : diag::err_using_decl_constructor)
12759 llvm_unreachable(
"cannot parse qualified deduction guide name");
12770 ? diag::err_access_decl
12771 : diag::warn_access_decl_deprecated)
12782 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
12790 SS, TargetNameInfo, EllipsisLoc, AttrList,
12809 ? diag::err_using_enum_is_dependent
12810 : diag::err_unknown_typename)
12818 Diag(IdentLoc, diag::err_using_enum_is_dependent);
12824 Diag(IdentLoc, diag::err_using_enum_not_enum) << EnumTy;
12828 if (TSI ==
nullptr)
12829 TSI =
Context.getTrivialTypeSourceInfo(EnumTy, IdentLoc);
12850 return Context.hasSameType(TD1->getUnderlyingType(),
12851 TD2->getUnderlyingType());
12885 if (
auto *Using = dyn_cast<UsingDecl>(BUD)) {
12897 Diag(Using->getLocation(),
12898 diag::err_using_decl_nested_name_specifier_is_current_class)
12899 << Using->getQualifierLoc().getSourceRange();
12901 Using->setInvalidDecl();
12905 Diag(Using->getQualifierLoc().getBeginLoc(),
12906 diag::err_using_decl_nested_name_specifier_is_not_base_class)
12908 << Using->getQualifierLoc().getSourceRange();
12910 Using->setInvalidDecl();
12915 if (
Previous.empty())
return false;
12926 NamedDecl *NonTag =
nullptr, *Tag =
nullptr;
12927 bool FoundEquivalentDecl =
false;
12929 NamedDecl *D = Element->getUnderlyingDecl();
12936 if (
auto *RD = dyn_cast<CXXRecordDecl>(D)) {
12951 PrevShadow = Shadow;
12952 FoundEquivalentDecl =
true;
12956 FoundEquivalentDecl =
true;
12963 if (FoundEquivalentDecl)
12969 (isa_and_nonnull<UnresolvedUsingIfExistsDecl>(NonTag))) {
12970 if (!NonTag && !Tag)
12973 Diag(
Target->getLocation(), diag::note_using_decl_target);
12974 Diag((NonTag ? NonTag : Tag)->getLocation(),
12975 diag::note_using_decl_conflict);
13004 Diag(
Target->getLocation(), diag::note_using_decl_target);
13014 if (!Tag)
return false;
13017 Diag(
Target->getLocation(), diag::note_using_decl_target);
13018 Diag(Tag->getLocation(), diag::note_using_decl_conflict);
13024 if (!NonTag)
return false;
13027 Diag(
Target->getLocation(), diag::note_using_decl_target);
13037 for (
auto &B : Derived->
bases())
13038 if (B.getType()->getAsCXXRecordDecl() ==
Base)
13039 return B.isVirtual();
13040 llvm_unreachable(
"not a direct base class");
13054 if (
auto *TargetTD = dyn_cast<TemplateDecl>(
Target))
13055 NonTemplateTarget = TargetTD->getTemplatedDecl();
13060 bool IsVirtualBase =
13062 Using->getQualifier().getAsRecordDecl());
13110 bool &AnyDependentBases) {
13114 CanQualType BaseType =
Base.getType()->getCanonicalTypeUnqualified();
13115 if (CanonicalDesiredBase == BaseType)
13117 if (BaseType->isDependentType())
13118 AnyDependentBases =
true;
13124class UsingValidatorCCC final :
public CorrectionCandidateCallback {
13126 UsingValidatorCCC(
bool HasTypenameKeyword,
bool IsInstantiation,
13127 NestedNameSpecifier NNS, CXXRecordDecl *RequireMemberOf)
13128 : HasTypenameKeyword(HasTypenameKeyword),
13129 IsInstantiation(IsInstantiation), OldNNS(NNS),
13130 RequireMemberOf(RequireMemberOf) {}
13132 bool ValidateCandidate(
const TypoCorrection &Candidate)
override {
13146 if (RequireMemberOf) {
13147 auto *FoundRecord = dyn_cast<CXXRecordDecl>(ND);
13148 if (FoundRecord && FoundRecord->isInjectedClassName()) {
13162 if (
Specifier.getKind() != NestedNameSpecifier::Kind::Type ||
13168 bool AnyDependentBases =
false;
13171 AnyDependentBases) &&
13172 !AnyDependentBases)
13182 auto *FoundRecord = dyn_cast<CXXRecordDecl>(ND);
13183 if (FoundRecord && FoundRecord->isInjectedClassName())
13188 return HasTypenameKeyword || !IsInstantiation;
13190 return !HasTypenameKeyword;
13193 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
13194 return std::make_unique<UsingValidatorCCC>(*
this);
13198 bool HasTypenameKeyword;
13199 bool IsInstantiation;
13200 NestedNameSpecifier OldNNS;
13201 CXXRecordDecl *RequireMemberOf;
13228 bool IsUsingIfExists) {
13229 assert(!SS.
isInvalid() &&
"Invalid CXXScopeSpec.");
13231 assert(IdentLoc.
isValid() &&
"Invalid TargetName location.");
13240 if (
auto *RD = dyn_cast<CXXRecordDecl>(
CurContext))
13241 UsingName.
setName(
Context.DeclarationNames.getCXXConstructorName(
13242 Context.getCanonicalTagType(RD)));
13253 assert(IsInstantiation &&
"no scope in non-instantiation");
13281 Diag(UsingLoc, diag::err_using_if_exists_on_ctor);
13287 if (!LookupContext || EllipsisLoc.
isValid()) {
13291 SS, NameInfo, IdentLoc))
13295 Previous.getFoundDecl()->isTemplateParameter())
13298 if (HasTypenameKeyword) {
13301 UsingLoc, TypenameLoc,
13303 IdentLoc, NameInfo.
getName(),
13307 QualifierLoc, NameInfo, EllipsisLoc);
13315 auto Build = [&](
bool Invalid) {
13318 UsingName, HasTypenameKeyword);
13325 auto BuildInvalid = [&]{
return Build(
true); };
13326 auto BuildValid = [&]{
return Build(
false); };
13329 return BuildInvalid();
13338 if (!IsInstantiation)
13339 R.setHideTags(
false);
13344 R.setBaseObjectType(
13355 if (R.empty() && IsUsingIfExists)
13373 PP.NeedsStdLibCxxWorkaroundBefore(2016'12'21) &&
13376 UsingValidatorCCC CCC(HasTypenameKeyword, IsInstantiation, SS.
getScopeRep(),
13379 CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), S, &SS, CCC,
13384 << NameInfo.
getName() << LookupContext << 0
13389 NamedDecl *ND = Corrected.getCorrectionDecl();
13391 return BuildInvalid();
13394 auto *RD = dyn_cast<CXXRecordDecl>(ND);
13400 if (Corrected.WillReplaceSpecifier()) {
13404 QualifierLoc = Builder.getWithLocInContext(
Context);
13410 UsingName.
setName(
Context.DeclarationNames.getCXXConstructorName(
13411 Context.getCanonicalTagType(CurClass)));
13423 Diag(IdentLoc, diag::err_no_member)
13425 return BuildInvalid();
13429 if (R.isAmbiguous())
13430 return BuildInvalid();
13432 if (HasTypenameKeyword) {
13436 Diag(IdentLoc, diag::err_using_typename_non_type);
13439 diag::note_using_decl_target);
13440 return BuildInvalid();
13446 if (IsInstantiation && R.getAsSingle<
TypeDecl>()) {
13447 Diag(IdentLoc, diag::err_using_dependent_value_is_type);
13448 Diag(R.getFoundDecl()->getLocation(), diag::note_using_decl_target);
13449 return BuildInvalid();
13456 Diag(IdentLoc, diag::err_using_decl_can_not_refer_to_namespace)
13461 return BuildInvalid();
13471 R.suppressDiagnostics();
13493 if (
CurContext->getRedeclContext()->isRecord()) {
13503 if (UED->getEnumDecl() == ED) {
13504 Diag(UsingLoc, diag::err_using_enum_decl_redeclaration)
13516 EnumLoc, NameLoc, EnumType);
13549 UPD->setAccess(InstantiatedFrom->
getAccess());
13555 assert(!UD->
hasTypename() &&
"expecting a constructor name");
13561 bool AnyDependentBases =
false;
13564 if (!
Base && !AnyDependentBases) {
13565 Diag(UD->
getUsingLoc(), diag::err_using_decl_constructor_not_in_direct_base)
13572 Base->setInheritConstructors();
13578 bool HasTypenameKeyword,
13591 if (!
CurContext->getRedeclContext()->isRecord()) {
13598 for (
auto *D : Prev) {
13600 bool OldCouldBeEnumerator =
13603 OldCouldBeEnumerator ? diag::err_redefinition
13604 : diag::err_redefinition_different_kind)
13605 << Prev.getLookupName();
13618 if (
const auto *UD = dyn_cast<UsingDecl>(D)) {
13619 DTypename = UD->hasTypename();
13620 DQual = UD->getQualifier();
13621 }
else if (
const auto *UD = dyn_cast<UnresolvedUsingValueDecl>(D)) {
13623 DQual = UD->getQualifier();
13624 }
else if (
const auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(D)) {
13626 DQual = UD->getQualifier();
13632 if (HasTypenameKeyword != DTypename)
continue;
13640 Diag(NameLoc, diag::err_using_decl_redeclaration) << SS.
getRange();
13654 assert(
bool(NamedContext) == (R || UD) && !(R && UD) &&
13655 "resolvable context must have exactly one set of decls");
13659 bool Cxx20Enumerator =
false;
13660 if (NamedContext) {
13669 if (
auto *ED = dyn_cast<EnumDecl>(NamedContext)) {
13673 if (EC && R && ED->isScoped())
13676 ? diag::warn_cxx17_compat_using_decl_scoped_enumerator
13677 : diag::ext_using_decl_scoped_enumerator)
13681 NamedContext = ED->getDeclContext();
13701 ? diag::warn_cxx17_compat_using_decl_class_member_enumerator
13702 : diag::err_using_decl_can_not_refer_to_class_member)
13705 if (Cxx20Enumerator)
13708 auto *RD = NamedContext
13717 }
else if (R->getAsSingle<
TypeDecl>()) {
13720 Diag(SS.
getBeginLoc(), diag::note_using_decl_class_member_workaround)
13721 << diag::MemClassWorkaround::AliasDecl
13728 Diag(InsertLoc, diag::note_using_decl_class_member_workaround)
13729 << diag::MemClassWorkaround::TypedefDecl
13734 }
else if (R->getAsSingle<
VarDecl>()) {
13744 Diag(UsingLoc, diag::note_using_decl_class_member_workaround)
13745 << diag::MemClassWorkaround::ReferenceDecl << FixIt;
13758 Diag(UsingLoc, diag::note_using_decl_class_member_workaround)
13760 ? diag::MemClassWorkaround::ConstexprVar
13761 : diag::MemClassWorkaround::ConstVar)
13770 if (!NamedContext) {
13786 ? diag::warn_cxx17_compat_using_decl_non_member_enumerator
13787 : diag::err_using_decl_nested_name_specifier_is_not_class)
13790 if (Cxx20Enumerator)
13811 if (Cxx20Enumerator) {
13812 Diag(NameLoc, diag::warn_cxx17_compat_using_decl_non_member_enumerator)
13819 diag::err_using_decl_nested_name_specifier_is_current_class)
13826 diag::err_using_decl_nested_name_specifier_is_not_base_class)
13842 if (
Type.isInvalid())
13861 TemplateParamLists.size()
13868 Previous.getFoundDecl()->isTemplateParameter()) {
13874 "name in alias declaration must be an identifier");
13897 if (TemplateParamLists.size()) {
13902 if (TemplateParamLists.size() != 1) {
13903 Diag(UsingLoc, diag::err_alias_template_extra_headers)
13904 <<
SourceRange(TemplateParamLists[1]->getTemplateLoc(),
13905 TemplateParamLists[TemplateParamLists.size()-1]->getRAngleLoc());
13909 auto It = llvm::find_if(
13910 llvm::reverse(TemplateParamLists),
13912 assert(It != TemplateParamLists.rend() &&
13913 "if all template parameter lists were empty, this should have "
13914 "been rejected as an explicit specialization");
13915 TemplateParams = *It;
13930 Diag(UsingLoc, diag::err_redefinition_different_kind)
13945 OldTemplateParams =
13981 else if (OldDecl) {
13988 if (
auto *TD = dyn_cast_or_null<TagDecl>(DeclFromDeclSpec)) {
14011 if (R.isAmbiguous())
14016 Diag(IdentLoc, diag::err_expected_namespace_name) << SS.
getRange();
14020 assert(!R.isAmbiguous() && !R.empty());
14048 Diag(AliasLoc, diag::err_redefinition_different_namespace_alias)
14050 Diag(AD->getLocation(), diag::note_previous_namespace_alias)
14051 << AD->getNamespace();
14056 ? diag::err_redefinition
14057 : diag::err_redefinition_different_kind;
14058 Diag(AliasLoc, DiagID) << Alias;
14079struct SpecialMemberExceptionSpecInfo
14080 : SpecialMemberVisitor<SpecialMemberExceptionSpecInfo> {
14088 : SpecialMemberVisitor(S, MD, CSM, ICI), Loc(Loc), ExceptSpec(S) {}
14093 void visitClassSubobject(
CXXRecordDecl *Class, Subobject Subobj,
14096 void visitSubobjectCall(Subobject Subobj,
14101bool SpecialMemberExceptionSpecInfo::visitBase(CXXBaseSpecifier *Base) {
14102 auto *BaseClass =
Base->getType()->getAsCXXRecordDecl();
14106 Sema::SpecialMemberOverloadResult SMOR = lookupInheritedCtor(BaseClass);
14107 if (
auto *BaseCtor = SMOR.
getMethod()) {
14108 visitSubobjectCall(Base, BaseCtor);
14112 visitClassSubobject(BaseClass, Base, 0);
14116bool SpecialMemberExceptionSpecInfo::visitField(FieldDecl *FD) {
14117 if (CSM == CXXSpecialMemberKind::DefaultConstructor &&
14136void SpecialMemberExceptionSpecInfo::visitClassSubobject(CXXRecordDecl *
Class,
14139 FieldDecl *
Field = Subobj.dyn_cast<FieldDecl*>();
14140 bool IsMutable =
Field &&
Field->isMutable();
14141 visitSubobjectCall(Subobj, lookupIn(
Class, Quals, IsMutable));
14144void SpecialMemberExceptionSpecInfo::visitSubobjectCall(
14145 Subobject Subobj, Sema::SpecialMemberOverloadResult SMOR) {
14148 if (CXXMethodDecl *MD = SMOR.
getMethod())
14149 ExceptSpec.
CalledDecl(getSubobjectLoc(Subobj), MD);
14178 ComputingExceptionSpec CES(S, MD, Loc);
14185 SpecialMemberExceptionSpecInfo Info(S, MD, CSM, ICI, MD->
getLocation());
14187 return Info.ExceptSpec;
14194 diag::err_exception_spec_incomplete_type))
14195 return Info.ExceptSpec;
14212 Info.visit(Info.IsConstructor ? Info.VisitPotentiallyConstructedBases
14213 : Info.VisitAllBases);
14215 return Info.ExceptSpec;
14220struct DeclaringSpecialMember {
14223 Sema::ContextRAII SavedContext;
14224 bool WasAlreadyBeingDeclared;
14227 : S(S), D(RD, CSM), SavedContext(S, RD) {
14229 if (WasAlreadyBeingDeclared)
14236 Sema::CodeSynthesisContext Ctx;
14237 Ctx.Kind = Sema::CodeSynthesisContext::DeclaringSpecialMember;
14244 Ctx.PointOfInstantiation = RD->getLocation();
14246 Ctx.SpecialMember = CSM;
14247 S.pushCodeSynthesisContext(Ctx);
14250 ~DeclaringSpecialMember() {
14251 if (!WasAlreadyBeingDeclared) {
14258 bool isAlreadyBeingDeclared()
const {
14259 return WasAlreadyBeingDeclared;
14271 if (
auto *Acceptable = R.getAcceptableDecl(D))
14272 R.addDecl(Acceptable);
14274 R.suppressDiagnostics();
14280void Sema::setupImplicitSpecialMemberType(
CXXMethodDecl *SpecialMem,
14286 LangAS AS = getDefaultCXXMethodAddrSpace();
14291 auto QT = Context.getFunctionType(ResultTy, Args, EPI);
14299 Context.getTrivialTypeSourceInfo(SpecialMem->
getType());
14313 "Should not build implicit default constructor!");
14315 DeclaringSpecialMember DSM(*
this, ClassDecl,
14317 if (DSM.isAlreadyBeingDeclared())
14327 =
Context.DeclarationNames.getCXXConstructorName(ClassType);
14339 setupImplicitSpecialMemberType(DefaultCon,
Context.VoidTy, {});
14342 CUDA().inferTargetForImplicitSpecialMember(
14363 ClassDecl->
addDecl(DefaultCon);
14373 "DefineImplicitDefaultConstructor - call it for implicit default ctor");
14378 assert(ClassDecl &&
"DefineImplicitDefaultConstructor - invalid constructor");
14392 Scope.addContextNote(CurrentLocation);
14439 ->getInheritedConstructor()
14446 Context.getTrivialTypeSourceInfo(BaseCtor->
getType(), UsingLoc);
14457 false, BaseCtor, &ICI);
14474 EPI.ExceptionSpec.SourceDecl = DerivedCtor;
14480 for (
unsigned I = 0, N = FPT->
getNumParams(); I != N; ++I) {
14484 Context, DerivedCtor, UsingLoc, UsingLoc,
nullptr,
14491 ParamDecls.push_back(PD);
14496 assert(!BaseCtor->
isDeleted() &&
"should not use deleted constructor");
14499 Derived->
addDecl(DerivedCtor);
14505 return DerivedCtor;
14536 Scope.addContextNote(CurrentLocation);
14539 Constructor->getInheritedConstructor().getShadowDecl();
14541 Constructor->getInheritedConstructor().getConstructor();
14555 for (
bool VBase : {
false,
true}) {
14557 if (B.isVirtual() != VBase)
14560 auto *BaseRD = B.getType()->getAsCXXRecordDecl();
14565 if (!BaseCtor.first)
14570 InitLoc, B.getType(), BaseCtor.first, VBase, BaseCtor.second);
14572 auto *TInfo =
Context.getTrivialTypeSourceInfo(B.getType(), InitLoc);
14574 Context, TInfo, VBase, InitLoc,
Init.get(), InitLoc,
14608 DeclaringSpecialMember DSM(*
this, ClassDecl,
14610 if (DSM.isAlreadyBeingDeclared())
14620 =
Context.DeclarationNames.getCXXDestructorName(ClassType);
14635 CUDA().inferTargetForImplicitSpecialMember(
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;
15364 "DefineImplicitCopyAssignment called for wrong function");
15382 Scope.addContextNote(CurrentLocation);
15417 RefBuilder OtherRef(
Other, OtherRefType);
15420 std::optional<ThisBuilder>
This;
15421 std::optional<DerefBuilder> DerefThis;
15422 std::optional<RefBuilder> ExplicitObject;
15423 bool IsArrow =
false;
15429 ExplicitObject.emplace(CopyAssignOperator->
getParamDecl(0), ObjectType);
15433 DerefThis.emplace(*
This);
15436 ExprBuilder &ObjectParameter =
15437 ExplicitObject ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15438 :
static_cast<ExprBuilder &
>(*This);
15442 for (
auto &
Base : ClassDecl->
bases()) {
15445 QualType BaseType =
Base.getType().getUnqualifiedType();
15446 if (!BaseType->isRecordType()) {
15452 BasePath.push_back(&
Base);
15456 CastBuilder From(OtherRef,
Context.getQualifiedType(BaseType, OtherQuals),
15461 ExplicitObject ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15462 :
static_cast<ExprBuilder &
>(*DerefThis),
15471 if (
Copy.isInvalid()) {
15477 Statements.push_back(
Copy.getAs<
Expr>());
15481 for (
auto *Field : ClassDecl->
fields()) {
15484 if (Field->isUnnamedBitField() || Field->getParent()->isUnion())
15487 if (Field->isInvalidDecl()) {
15493 if (Field->getType()->isReferenceType()) {
15494 Diag(ClassDecl->
getLocation(), diag::err_uninitialized_member_for_assign)
15495 <<
Context.getCanonicalTagType(ClassDecl) << 0
15496 << Field->getDeclName();
15497 Diag(Field->getLocation(), diag::note_declared_at);
15504 if (!BaseType->isRecordType() && BaseType.isConstQualified()) {
15505 Diag(ClassDecl->
getLocation(), diag::err_uninitialized_member_for_assign)
15506 <<
Context.getCanonicalTagType(ClassDecl) << 1
15507 << Field->getDeclName();
15508 Diag(Field->getLocation(), diag::note_declared_at);
15514 if (Field->isZeroLengthBitField())
15517 QualType FieldType = Field->getType().getNonReferenceType();
15520 "Incomplete array type is not valid");
15526 LookupResult MemberLookup(*
this, Field->getDeclName(), Loc,
15531 MemberBuilder From(OtherRef, OtherRefType,
false, MemberLookup);
15532 MemberBuilder To(ObjectParameter, ObjectType, IsArrow, MemberLookup);
15538 if (
Copy.isInvalid()) {
15544 Statements.push_back(
Copy.getAs<
Stmt>());
15550 (ExplicitObject ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15551 :
LangOpts.HLSL ?
static_cast<ExprBuilder &
>(*This)
15552 :
static_cast<ExprBuilder &
>(*DerefThis))
15553 .build(*
this, Loc);
15558 Statements.push_back(Return.
getAs<
Stmt>());
15571 assert(!Body.
isInvalid() &&
"Compound statement creation cannot fail");
15577 L->CompletedImplicitDefinition(CopyAssignOperator);
15584 DeclaringSpecialMember DSM(*
this, ClassDecl,
15586 if (DSM.isAlreadyBeingDeclared())
15593 std::nullopt, ClassDecl,
15623 CUDA().inferTargetForImplicitSpecialMember(
15630 ClassLoc, ClassLoc,
15643 ++
getASTContext().NumImplicitMoveAssignmentOperatorsDeclared;
15666 assert(!Class->isDependentContext() &&
"should not define dependent move");
15672 if (Class->getNumVBases() == 0 || Class->hasTrivialMoveAssignment() ||
15673 Class->getNumBases() < 2)
15677 typedef llvm::DenseMap<CXXRecordDecl*, CXXBaseSpecifier*> VBaseMap;
15680 for (
auto &BI : Class->bases()) {
15681 Worklist.push_back(&BI);
15682 while (!Worklist.empty()) {
15688 if (!
Base->hasNonTrivialMoveAssignment())
15713 VBases.insert(std::make_pair(
Base->getCanonicalDecl(), &BI))
15715 if (Existing && Existing != &BI) {
15716 S.
Diag(CurrentLocation, diag::warn_vbase_moved_multiple_times)
15719 << (
Base->getCanonicalDecl() ==
15722 S.
Diag(BI.getBeginLoc(), diag::note_vbase_moved_here)
15723 << (
Base->getCanonicalDecl() ==
15724 BI.getType()->getAsCXXRecordDecl()->getCanonicalDecl())
15728 Existing =
nullptr;
15738 llvm::append_range(Worklist, llvm::make_pointer_range(
Base->bases()));
15751 "DefineImplicitMoveAssignment called for wrong function");
15781 Scope.addContextNote(CurrentLocation);
15797 RefBuilder OtherRef(
Other, OtherRefType);
15799 MoveCastBuilder MoveOther(OtherRef);
15802 std::optional<ThisBuilder>
This;
15803 std::optional<DerefBuilder> DerefThis;
15804 std::optional<RefBuilder> ExplicitObject;
15806 bool IsArrow =
false;
15811 ExplicitObject.emplace(MoveAssignOperator->
getParamDecl(0), ObjectType);
15815 DerefThis.emplace(*
This);
15818 ExprBuilder &ObjectParameter =
15819 ExplicitObject ? *ExplicitObject :
static_cast<ExprBuilder &
>(*This);
15823 for (
auto &
Base : ClassDecl->
bases()) {
15834 QualType BaseType =
Base.getType().getUnqualifiedType();
15835 if (!BaseType->isRecordType()) {
15841 BasePath.push_back(&
Base);
15845 CastBuilder From(OtherRef, BaseType,
VK_XValue, BasePath);
15850 ExplicitObject ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15851 :
static_cast<ExprBuilder &
>(*DerefThis),
15860 if (Move.isInvalid()) {
15866 Statements.push_back(Move.getAs<
Expr>());
15870 for (
auto *Field : ClassDecl->
fields()) {
15873 if (Field->isUnnamedBitField() || Field->getParent()->isUnion())
15876 if (Field->isInvalidDecl()) {
15882 if (Field->getType()->isReferenceType()) {
15883 Diag(ClassDecl->
getLocation(), diag::err_uninitialized_member_for_assign)
15884 <<
Context.getCanonicalTagType(ClassDecl) << 0
15885 << Field->getDeclName();
15886 Diag(Field->getLocation(), diag::note_declared_at);
15893 if (!BaseType->isRecordType() && BaseType.isConstQualified()) {
15894 Diag(ClassDecl->
getLocation(), diag::err_uninitialized_member_for_assign)
15895 <<
Context.getCanonicalTagType(ClassDecl) << 1
15896 << Field->getDeclName();
15897 Diag(Field->getLocation(), diag::note_declared_at);
15903 if (Field->isZeroLengthBitField())
15906 QualType FieldType = Field->getType().getNonReferenceType();
15909 "Incomplete array type is not valid");
15914 LookupResult MemberLookup(*
this, Field->getDeclName(), Loc,
15918 MemberBuilder From(MoveOther, OtherRefType,
15919 false, MemberLookup);
15920 MemberBuilder To(ObjectParameter, ObjectType, IsArrow, MemberLookup);
15922 assert(!From.build(*
this, Loc)->isLValue() &&
15923 "Member reference with rvalue base must be rvalue except for reference "
15924 "members, which aren't allowed for move assignment.");
15931 if (Move.isInvalid()) {
15937 Statements.push_back(Move.getAs<
Stmt>());
15943 (ExplicitObject ?
static_cast<ExprBuilder &
>(*ExplicitObject)
15944 :
LangOpts.HLSL ?
static_cast<ExprBuilder &
>(*This)
15945 :
static_cast<ExprBuilder &
>(*DerefThis))
15946 .build(*
this, Loc);
15952 Statements.push_back(Return.
getAs<
Stmt>());
15965 assert(!Body.
isInvalid() &&
"Compound statement creation cannot fail");
15971 L->CompletedImplicitDefinition(MoveAssignOperator);
15982 DeclaringSpecialMember DSM(*
this, ClassDecl,
15984 if (DSM.isAlreadyBeingDeclared())
15988 std::nullopt, ClassDecl,
16005 =
Context.DeclarationNames.getCXXConstructorName(
16006 Context.getCanonicalType(ClassType));
16025 CUDA().inferTargetForImplicitSpecialMember(
16051 ClassDecl->
hasAttr<TrivialABIAttr>() ||
16083 "DefineImplicitCopyConstructor - call it for implicit copy ctor");
16088 assert(ClassDecl &&
"DefineImplicitCopyConstructor - invalid constructor");
16099 Scope.addContextNote(CurrentLocation);
16129 DeclaringSpecialMember DSM(*
this, ClassDecl,
16131 if (DSM.isAlreadyBeingDeclared())
16135 std::nullopt, ClassDecl,
16148 =
Context.DeclarationNames.getCXXConstructorName(
16149 Context.getCanonicalType(ClassType));
16169 CUDA().inferTargetForImplicitSpecialMember(
16176 ClassLoc, ClassLoc,
16189 ClassDecl->
hasAttr<TrivialABIAttr>() ||
16221 "DefineImplicitMoveConstructor - call it for implicit move ctor");
16226 assert(ClassDecl &&
"DefineImplicitMoveConstructor - invalid constructor");
16237 Scope.addContextNote(CurrentLocation);
16279 CallOp->getDescribedFunctionTemplate(), TemplateArgs, CurrentLocation);
16283 if (CallOp != Invoker) {
16292 if (CallOp->isInvalidDecl())
16302 if (Invoker != CallOp) {
16315 assert(FunctionRef &&
"Can't refer to __invoke function?");
16323 L->CompletedImplicitDefinition(Conv);
16324 if (Invoker != CallOp)
16325 L->CompletedImplicitDefinition(Invoker);
16353 Diag(CurrentLocation, diag::note_lambda_to_block_conv);
16362 Diag(CurrentLocation, diag::note_lambda_to_block_conv);
16368 Stmt *ReturnS = Return.
get();
16375 L->CompletedImplicitDefinition(Conv);
16382 switch (Args.size()) {
16387 if (!Args[1]->isDefaultArgument())
16392 return !Args[0]->isDefaultArgument();
16401 bool HadMultipleCandidates,
bool IsListInitialization,
16402 bool IsStdInitListInitialization,
bool RequiresZeroInit,
16404 bool Elidable =
false;
16423 Expr *SubExpr = ExprArgs[0];
16434 Elidable, ExprArgs, HadMultipleCandidates,
16435 IsListInitialization,
16436 IsStdInitListInitialization, RequiresZeroInit,
16437 ConstructKind, ParenRange);
16443 bool HadMultipleCandidates,
bool IsListInitialization,
16444 bool IsStdInitListInitialization,
bool RequiresZeroInit,
16446 if (
auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl)) {
16456 ConstructLoc, DeclInitType,
Constructor, Elidable, ExprArgs,
16457 HadMultipleCandidates, IsListInitialization, IsStdInitListInitialization,
16458 RequiresZeroInit, ConstructKind, ParenRange);
16466 bool HadMultipleCandidates,
bool IsListInitialization,
16467 bool IsStdInitListInitialization,
bool RequiresZeroInit,
16472 "given constructor for wrong type");
16480 HadMultipleCandidates, IsListInitialization,
16481 IsStdInitListInitialization, RequiresZeroInit,
16513 PDiag(diag::err_access_dtor_var)
16523 bool HasConstantInit =
false;
16530 diag::err_constexpr_var_requires_const_destruction) << VD;
16541 if (!VD->
hasAttr<AlwaysDestroyAttr>())
16553 bool AllowExplicit,
16554 bool IsListInitialization) {
16556 unsigned NumArgs = ArgsPtr.size();
16557 Expr **Args = ArgsPtr.data();
16563 if (NumArgs < NumParams)
16564 ConvertedArgs.reserve(NumParams);
16566 ConvertedArgs.reserve(NumArgs);
16574 CallType, AllowExplicit, IsListInitialization);
16575 ConvertedArgs.append(AllArgs.begin(), AllArgs.end());
16586 bool SeenTypedOperators =
Context.hasSeenTypeAwareOperatorNewOrDelete();
16593 if (DeallocType.
isNull())
16604 constexpr unsigned RequiredParameterCount =
16607 if (NumParams != RequiredParameterCount)
16612 if (llvm::any_of(FnDecl->
parameters().drop_front(),
16614 return ParamDecl->getType()->isDependentType();
16619 if (SpecializedTypeIdentity.
isNull())
16623 ArgTypes.reserve(NumParams);
16629 ArgTypes.push_back(SpecializedTypeIdentity);
16650 diag::err_operator_new_delete_declared_in_namespace)
16657 diag::err_operator_new_delete_declared_static)
16667 Qualifiers PtrQuals = PtrTy->getPointeeType().getQualifiers();
16670 PtrTy->getPointeeType().getUnqualifiedType(), PtrQuals)));
16677 bool *WasMalformed) {
16678 const Decl *MalformedDecl =
nullptr;
16681 nullptr, &MalformedDecl))
16684 if (!MalformedDecl)
16688 *WasMalformed =
true;
16706 SemaRef, FD,
nullptr);
16707 unsigned DestroyingDeleteIdx = IsPotentiallyTypeAware + 1;
16716 unsigned DependentParamTypeDiag,
unsigned InvalidParamTypeDiag) {
16717 auto NormalizeType = [&SemaRef](
QualType T) {
16721 if (
const auto PtrTy = T->template getAs<PointerType>())
16728 unsigned FirstNonTypeParam = 0;
16729 bool MalformedTypeIdentity =
false;
16731 SemaRef, FnDecl, &MalformedTypeIdentity);
16732 unsigned MinimumMandatoryArgumentCount = 1;
16733 unsigned SizeParameterIndex = 0;
16734 if (IsPotentiallyTypeAware) {
16738 SemaRef.
Diag(FnDecl->
getLocation(), diag::warn_ext_type_aware_allocators);
16741 SizeParameterIndex = 1;
16742 MinimumMandatoryArgumentCount =
16745 SizeParameterIndex = 2;
16746 MinimumMandatoryArgumentCount =
16749 FirstNonTypeParam = 1;
16752 bool IsPotentiallyDestroyingDelete =
16755 if (IsPotentiallyDestroyingDelete) {
16756 ++MinimumMandatoryArgumentCount;
16757 ++SizeParameterIndex;
16760 if (NumParams < MinimumMandatoryArgumentCount)
16762 diag::err_operator_new_delete_too_few_parameters)
16763 << IsPotentiallyTypeAware << IsPotentiallyDestroyingDelete
16764 << FnDecl->
getDeclName() << MinimumMandatoryArgumentCount;
16766 for (
unsigned Idx = 0; Idx < MinimumMandatoryArgumentCount; ++Idx) {
16770 diag::err_operator_new_default_arg)
16775 QualType CanResultType = NormalizeType(FnType->getReturnType());
16776 QualType CanExpectedResultType = NormalizeType(ExpectedResultType);
16777 QualType CanExpectedSizeOrAddressParamType =
16778 NormalizeType(ExpectedSizeOrAddressParamType);
16781 if (CanResultType != CanExpectedResultType) {
16784 return SemaRef.
Diag(
16786 CanResultType->isDependentType()
16787 ? diag::err_operator_new_delete_dependent_result_type
16788 : diag::err_operator_new_delete_invalid_result_type)
16795 diag::err_operator_new_delete_template_too_few_parameters)
16799 auto FallbackType) ->
bool {
16803 << IsPotentiallyTypeAware << IsPotentiallyDestroyingDelete
16809 auto ActualParamType =
16811 if (ActualParamType == CanExpectedTy)
16813 unsigned Diagnostic = ActualParamType->isDependentType()
16814 ? DependentParamTypeDiag
16815 : InvalidParamTypeDiag;
16817 << IsPotentiallyTypeAware << IsPotentiallyDestroyingDelete
16823 if (CheckType(FirstNonTypeParam, CanExpectedSizeOrAddressParamType,
"size_t"))
16830 if (!IsPotentiallyTypeAware)
16839 if (CheckType(SizeParameterIndex + 1, StdAlignValT,
"std::align_val_t"))
16843 return MalformedTypeIdentity;
16862 SizeTy, diag::err_operator_new_dependent_param_type,
16863 diag::err_operator_new_param_type);
16875 auto *MD = dyn_cast<CXXMethodDecl>(FnDecl);
16876 auto ConstructDestroyingDeleteAddressType = [&]() {
16889 SemaRef, MD,
nullptr)) {
16893 AddressParamType == ConstructDestroyingDeleteAddressType()) {
16904 diag::err_type_aware_destroying_operator_delete)
16905 << Param->getSourceRange();
16927 diag::err_operator_delete_dependent_param_type,
16928 diag::err_operator_delete_param_type))
16937 diag::err_destroying_operator_delete_not_usual);
16947 "Expected an overloaded operator declaration");
16957 if (Op == OO_Delete || Op == OO_Array_Delete)
16960 if (Op == OO_New || Op == OO_Array_New)
16970 if (
CXXMethodDecl *MethodDecl = dyn_cast<CXXMethodDecl>(FnDecl)) {
16971 if (MethodDecl->isStatic()) {
16972 if (Op == OO_Call || Op == OO_Subscript)
16975 ? diag::warn_cxx20_compat_operator_overload_static
16976 : diag::ext_operator_overload_static))
16979 return Diag(FnDecl->
getLocation(), diag::err_operator_overload_static)
16983 bool ClassOrEnumParam =
false;
16985 QualType ParamType = Param->getType().getNonReferenceType();
16988 ClassOrEnumParam =
true;
16993 if (!ClassOrEnumParam)
16995 diag::err_operator_overload_needs_class_or_enum)
17005 if (Op != OO_Call) {
17008 if (Param->hasDefaultArg()) {
17009 FirstDefaultedParam = Param;
17013 if (FirstDefaultedParam) {
17014 if (Op == OO_Subscript) {
17016 ? diag::ext_subscript_overload
17017 : diag::error_subscript_overload)
17022 diag::err_operator_overload_default_arg)
17030 {
false,
false,
false }
17031#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
17032 , { Unary, Binary, MemberOnly }
17033#include "clang/Basic/OperatorKinds.def"
17036 bool CanBeUnaryOperator = OperatorUses[Op][0];
17037 bool CanBeBinaryOperator = OperatorUses[Op][1];
17038 bool MustBeMemberOperator = OperatorUses[Op][2];
17049 if (Op != OO_Call && Op != OO_Subscript &&
17050 ((NumParams == 1 && !CanBeUnaryOperator) ||
17051 (NumParams == 2 && !CanBeBinaryOperator) || (NumParams < 1) ||
17052 (NumParams > 2))) {
17054 unsigned ErrorKind;
17055 if (CanBeUnaryOperator && CanBeBinaryOperator) {
17057 }
else if (CanBeUnaryOperator) {
17060 assert(CanBeBinaryOperator &&
17061 "All non-call overloaded operators are unary or binary!");
17064 return Diag(FnDecl->
getLocation(), diag::err_operator_overload_must_be)
17065 << FnDecl->
getDeclName() << NumParams << ErrorKind;
17068 if (Op == OO_Subscript && NumParams != 2) {
17070 ? diag::ext_subscript_overload
17071 : diag::error_subscript_overload)
17072 << FnDecl->
getDeclName() << (NumParams == 1 ? 0 : 2);
17077 if (Op != OO_Call &&
17079 return Diag(FnDecl->
getLocation(), diag::err_operator_overload_variadic)
17086 diag::err_operator_overload_must_be_member)
17100 if ((Op == OO_PlusPlus || Op == OO_MinusMinus) && NumParams == 2) {
17107 diag::err_operator_overload_post_incdec_must_be_int)
17108 << LastParam->
getType() << (Op == OO_MinusMinus);
17120 if (TemplateParams->
size() == 1) {
17122 dyn_cast<NonTypeTemplateParmDecl>(TemplateParams->
getParam(0));
17136 if (SemaRef.
getLangOpts().CPlusPlus20 && PmDecl &&
17139 PmDecl->
getType()->
getAs<DeducedTemplateSpecializationType>()))
17141 }
else if (TemplateParams->
size() == 2) {
17143 dyn_cast<TemplateTypeParmDecl>(TemplateParams->
getParam(0));
17145 dyn_cast<NonTypeTemplateParmDecl>(TemplateParams->
getParam(1));
17151 if (
const auto *TArgs =
17153 TArgs && TArgs->getDepth() == PmType->
getDepth() &&
17154 TArgs->getIndex() == PmType->
getIndex()) {
17157 diag::ext_string_literal_operator_template);
17164 diag::err_literal_operator_template)
17171 Diag(FnDecl->
getLocation(), diag::err_literal_operator_outside_namespace)
17180 Diag(LSD->getExternLoc(), diag::note_extern_c_begins_here);
17199 diag::err_literal_operator_template_with_params);
17209 QualType ParamType = Param->getType().getUnqualifiedType();
17227 Diag(Param->getSourceRange().getBegin(),
17228 diag::err_literal_operator_param)
17229 << ParamType <<
"'const char *'" << Param->getSourceRange();
17234 Diag(Param->getSourceRange().getBegin(), diag::err_literal_operator_param)
17235 << ParamType <<
Context.LongDoubleTy << Param->getSourceRange();
17239 Diag(Param->getSourceRange().getBegin(), diag::err_literal_operator_param)
17240 << ParamType <<
Context.UnsignedLongLongTy << Param->getSourceRange();
17244 Diag(Param->getSourceRange().getBegin(),
17245 diag::err_literal_operator_invalid_param)
17246 << ParamType << Param->getSourceRange();
17255 QualType FirstParamType = (*Param)->getType().getUnqualifiedType();
17262 Diag((*Param)->getSourceRange().getBegin(),
17263 diag::err_literal_operator_param)
17264 << FirstParamType <<
"'const char *'" << (*Param)->getSourceRange();
17271 Diag((*Param)->getSourceRange().getBegin(),
17272 diag::err_literal_operator_param)
17273 << FirstParamType <<
"'const char *'" << (*Param)->getSourceRange();
17286 Diag((*Param)->getSourceRange().getBegin(),
17287 diag::err_literal_operator_param)
17288 << FirstParamType <<
"'const char *'" << (*Param)->getSourceRange();
17296 QualType SecondParamType = (*Param)->getType().getUnqualifiedType();
17297 if (!
Context.hasSameType(SecondParamType,
Context.getSizeType())) {
17298 Diag((*Param)->getSourceRange().getBegin(),
17299 diag::err_literal_operator_param)
17300 << SecondParamType <<
Context.getSizeType()
17301 << (*Param)->getSourceRange();
17305 Diag(FnDecl->
getLocation(), diag::err_literal_operator_bad_param_count);
17314 if (Param->hasDefaultArg()) {
17315 Diag(Param->getDefaultArgRange().getBegin(),
17316 diag::err_literal_operator_default_argument)
17317 << Param->getDefaultArgRange();
17332 <<
static_cast<int>(Status)
17343 assert(Lit->
isUnevaluated() &&
"Unexpected string literal kind");
17349 else if (Lang ==
"C++")
17352 Diag(LangStr->
getExprLoc(), diag::err_language_linkage_spec_unknown)
17372 if (
getLangOpts().CPlusPlusModules && isCurrentModulePurview()) {
17373 Module *GlobalModule = PushImplicitGlobalModuleFragment(ExternLoc);
17396 PopImplicitGlobalModuleFragment();
17399 return LinkageSpec;
17423 ExDeclType =
Context.getArrayDecayedType(ExDeclType);
17425 ExDeclType =
Context.getPointerType(ExDeclType);
17432 Diag(Loc, diag::err_catch_rvalue_ref);
17437 Diag(Loc, diag::err_catch_variably_modified) << ExDeclType;
17443 unsigned DK = diag::err_catch_incomplete;
17445 BaseType = Ptr->getPointeeType();
17447 DK = diag::err_catch_incomplete_ptr;
17450 BaseType = Ref->getPointeeType();
17452 DK = diag::err_catch_incomplete_ref;
17454 if (!
Invalid && (Mode == 0 || !BaseType->isVoidType()) &&
17458 if (!
Invalid && BaseType.isWebAssemblyReferenceType()) {
17459 Diag(Loc, diag::err_wasm_reftype_tc) << 1;
17463 if (!
Invalid && Mode != 1 && BaseType->isSizelessType()) {
17464 Diag(Loc, diag::err_catch_sizeless) << (Mode == 2 ? 1 : 0) << BaseType;
17470 diag::err_abstract_type_in_decl,
17481 if (T->isObjCObjectType()) {
17482 Diag(Loc, diag::err_objc_object_catch);
17484 }
else if (T->isObjCObjectPointerType()) {
17487 Diag(Loc, diag::warn_objc_pointer_cxx_catch_fragile);
17496 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(ExDecl))
17521 Expr *opaqueValue =
17571 Diag(PrevDecl->getLocation(), diag::note_previous_definition);
17573 }
else if (PrevDecl->isTemplateParameter())
17601 Expr *AssertMessageExpr,
17607 AssertMessageExpr, RParenLoc,
false);
17612 case BuiltinType::Char_S:
17613 case BuiltinType::Char_U:
17615 case BuiltinType::Char8:
17618 case BuiltinType::Char16:
17621 case BuiltinType::Char32:
17624 case BuiltinType::WChar_S:
17625 case BuiltinType::WChar_U:
17629 llvm_unreachable(
"Non-character type");
17639 char Arr[UNI_MAX_UTF8_BYTES_PER_CODE_POINT];
17642 llvm::raw_svector_ostream OS(Str);
17646 if (K == BuiltinType::Char_S || K == BuiltinType::Char_U ||
17647 K == BuiltinType::Char8 ||
Value <= 0x7F) {
17649 if (!Escaped.empty())
17652 OS << static_cast<char>(
Value);
17657 case BuiltinType::Char16:
17658 case BuiltinType::Char32:
17659 case BuiltinType::WChar_S:
17660 case BuiltinType::WChar_U: {
17661 if (llvm::ConvertCodePointToUTF8(
Value, Ptr))
17665 << llvm::format_hex_no_prefix(
Value, TyWidth / 4,
true);
17669 llvm_unreachable(
"Non-character type is passed");
17681 switch (
V.getKind()) {
17683 if (T->isBooleanType()) {
17687 int64_t BoolValue =
V.getInt().getExtValue();
17688 assert((BoolValue == 0 || BoolValue == 1) &&
17689 "Bool type, but value is not 0 or 1");
17690 llvm::raw_svector_ostream OS(Str);
17691 OS << (BoolValue ?
"true" :
"false");
17693 llvm::raw_svector_ostream OS(Str);
17698 switch (BTy->getKind()) {
17699 case BuiltinType::Char_S:
17700 case BuiltinType::Char_U:
17701 case BuiltinType::Char8:
17702 case BuiltinType::Char16:
17703 case BuiltinType::Char32:
17704 case BuiltinType::WChar_S:
17705 case BuiltinType::WChar_U: {
17706 unsigned TyWidth = Context.getIntWidth(T);
17707 assert(8 <= TyWidth && TyWidth <= 32 &&
"Unexpected integer width");
17713 << llvm::format_hex_no_prefix(CodeUnit, 2,
17715 <<
", " <<
V.getInt() <<
')';
17722 V.getInt().toString(Str);
17728 V.getFloat().toString(Str);
17732 if (
V.isNullPointer()) {
17733 llvm::raw_svector_ostream OS(Str);
17740 llvm::raw_svector_ostream OS(Str);
17742 V.getComplexFloatReal().toString(Str);
17744 V.getComplexFloatImag().toString(Str);
17749 llvm::raw_svector_ostream OS(Str);
17751 V.getComplexIntReal().toString(Str);
17753 V.getComplexIntImag().toString(Str);
17780 if (
const auto *UnaryOp = dyn_cast<UnaryOperator>(E))
17784 if (
const auto *BO = dyn_cast<BinaryOperator>(E))
17785 return (BO->isShiftOp() || BO->isAdditiveOp() || BO->isMultiplicativeOp() ||
17786 BO->isBitwiseOp());
17792 if (
const auto *Op = dyn_cast<BinaryOperator>(E);
17793 Op && Op->getOpcode() != BO_LOr) {
17794 const Expr *LHS = Op->getLHS()->IgnoreParenImpCasts();
17795 const Expr *RHS = Op->getRHS()->IgnoreParenImpCasts();
17813 for (
auto &DiagSide : DiagSides) {
17814 const Expr *Side = DiagSide.Cond;
17819 DiagSide.Result.Val, Side->
getType(), DiagSide.ValueString,
Context);
17821 if (DiagSides[0].Print && DiagSides[1].Print) {
17822 Diag(Op->getExprLoc(), diag::note_expr_evaluates_to)
17823 << DiagSides[0].ValueString << Op->getOpcodeStr()
17824 << DiagSides[1].ValueString << Op->getSourceRange();
17831template <
typename ResultType>
17835 bool ErrorOnInvalidMessage) {
17838 assert(!Message->isTypeDependent() && !Message->isValueDependent() &&
17839 "can't evaluate a dependant static assert message");
17841 if (
const auto *SL = dyn_cast<StringLiteral>(Message)) {
17842 assert(SL->isUnevaluated() &&
"expected an unevaluated string");
17843 if constexpr (std::is_same_v<APValue, ResultType>) {
17848 assert(CAT &&
"string literal isn't an array");
17852 for (
unsigned I = 0; I < SL->getLength(); I++) {
17853 Value = SL->getCodeUnit(I);
17857 Result.assign(SL->getString().begin(), SL->getString().end());
17863 QualType T = Message->getType().getNonReferenceType();
17864 auto *RD = T->getAsCXXRecordDecl();
17866 SemaRef.
Diag(Loc, diag::err_user_defined_msg_invalid) << EvalContext;
17870 auto FindMember = [&](StringRef
Member) -> std::optional<LookupResult> {
17876 if (MemberLookup.
empty())
17877 return std::nullopt;
17878 return std::move(MemberLookup);
17881 std::optional<LookupResult> SizeMember = FindMember(
"size");
17882 std::optional<LookupResult> DataMember = FindMember(
"data");
17883 if (!SizeMember || !DataMember) {
17884 SemaRef.
Diag(Loc, diag::err_user_defined_msg_missing_member_function)
17886 << ((!SizeMember && !DataMember) ? 2
17894 Message, Message->getType(), Message->getBeginLoc(),
false,
17920 SemaRef.
Diag(Loc, diag::err_user_defined_msg_invalid_mem_fn_ret_ty)
17921 << EvalContext << 0;
17931 SemaRef.
Diag(Loc, diag::err_user_defined_msg_invalid_mem_fn_ret_ty)
17932 << EvalContext << 1;
17936 if (!ErrorOnInvalidMessage &&
17937 SemaRef.
Diags.
isIgnored(diag::warn_user_defined_msg_constexpr, Loc))
17942 Status.Diag = &Notes;
17943 if (!Message->EvaluateCharRangeAsString(
Result, EvaluatedSize.
get(),
17944 EvaluatedData.
get(), Ctx, Status) ||
17946 SemaRef.
Diag(Message->getBeginLoc(),
17947 ErrorOnInvalidMessage ? diag::err_user_defined_msg_constexpr
17948 : diag::warn_user_defined_msg_constexpr)
17950 for (
const auto &
Note : Notes)
17952 return !ErrorOnInvalidMessage;
17959 bool ErrorOnInvalidMessage) {
17961 ErrorOnInvalidMessage);
17966 bool ErrorOnInvalidMessage) {
17968 ErrorOnInvalidMessage);
17972 Expr *AssertExpr,
Expr *AssertMessage,
17975 assert(AssertExpr !=
nullptr &&
"Expected non-null condition");
17993 AssertExpr = FullAssertExpr.
get();
17996 Expr *BaseExpr = AssertExpr;
18008 diag::err_static_assert_expression_is_not_constant,
18014 if (!Failed && AssertMessage &&
Cond.getBoolValue()) {
18024 bool InTemplateDefinition =
18027 if (!Failed && !
Cond && !InTemplateDefinition) {
18029 llvm::raw_svector_ostream Msg(MsgBuffer);
18030 bool HasMessage = AssertMessage;
18031 if (AssertMessage) {
18039 Expr *InnerCond =
nullptr;
18040 std::string InnerCondDescription;
18041 std::tie(InnerCond, InnerCondDescription) =
18043 if (
const auto *ConceptIDExpr =
18044 dyn_cast_or_null<ConceptSpecializationExpr>(InnerCond)) {
18046 ConceptIDExpr->getSatisfaction();
18057 diag::err_static_assert_requirement_failed)
18058 << InnerCondDescription << !HasMessage << Msg.str()
18075 AssertExpr = FullAssertExpr.
get();
18079 AssertExpr, AssertMessage, RParenLoc,
18092 "dependent nested-name-specifier must be a type");
18095 if (
const auto *PIT = dyn_cast<PackIndexingType>(T))
18096 T = PIT->getPattern();
18098 if (
const auto *TST = dyn_cast<TemplateSpecializationType>(T)) {
18099 if (isa_and_nonnull<ClassTemplateDecl>(
18100 TST->getTemplateName().getAsTemplateDecl()))
18107 Diag(Loc, diag::err_dependent_friend_not_member);
18118 bool IsMemberSpecialization =
false;
18123 TagLoc, NameLoc, SS,
nullptr, TempParamLists,
true,
18124 IsMemberSpecialization,
Invalid)) {
18125 if (TemplateParams->size() > 0) {
18133 FriendLoc, TempParamLists.size() - 1, TempParamLists.data(),
18134 IsMemberSpecialization);
18139 Diag(TemplateParams->getTemplateLoc(), diag::err_template_tag_noparams)
18146 bool isAllExplicitSpecializations =
18148 return List->
size() == 0;
18157 if (isAllExplicitSpecializations) {
18159 bool Owned =
false;
18160 bool IsDependent =
false;
18177 NameLoc, &TSI,
true);
18182 FriendLoc, EllipsisLoc);
18188 assert(SS.
isNotEmpty() &&
"valid templated tag with no SS and no direct?");
18195 unsigned FriendDeclDepth = TempParamLists.front()->getDepth();
18198 DI && DI->first >= FriendDeclDepth) {
18199 auto *ND = dyn_cast<NamedDecl *>(
U.first);
18202 Diag(
U.second, diag::friend_template_decl_malformed_pack_expansion)
18223 if (TempParamLists.empty())
18231 FriendLoc, TempParamLists, EllipsisLoc);
18259 Diag(FriendLoc, diag::err_friend_not_first_in_declaration);
18291 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
18296 if (!T->isElaboratedTypeSpecifier()) {
18297 if (TempParams.size()) {
18309 }
else if (
const RecordDecl *RD = T->getAsRecordDecl()) {
18314 ? diag::warn_cxx98_compat_unelaborated_friend_type
18315 : diag::ext_unelaborated_friend_type)
18320 DiagCompat(FriendLoc, diag_compat::nonclass_type_friend)
18337 if (!TempParams.empty()) {
18343 TempParams, EllipsisLoc);
18346 TSI, FriendLoc, EllipsisLoc);
18381 Diag(Loc, diag::err_unexpected_friend);
18419 if (IsNamespaceOrGlobal) {
18429 Scope *DCScope = S;
18439 (FunctionContainingLocalClass =
18462 DC =
Previous.getRepresentativeDecl()->getDeclContext();
18466 DC = FunctionContainingLocalClass;
18503 if (isTemplateId) {
18518 if (!DC)
return nullptr;
18529 diag::warn_cxx98_compat_friend_is_member :
18530 diag::err_friend_is_member);
18542 if (TemplateParams.size() && SS.
isValid() &&
18544 TemplateParams.front()))
18571 if (DiagArg >= 0) {
18572 Diag(Loc, diag::err_introducing_special_friend) << DiagArg;
18588 DCScope = &FakeDCScope;
18591 bool AddToScope =
true;
18593 TemplateParams, AddToScope);
18594 if (!ND)
return nullptr;
18625 FD = FTD->getTemplatedDecl();
18642 }
else if (FunctionContainingLocalClass) {
18651 }
else if (isTemplateId) {
18665 Diag(FD->
getLocation(), diag::err_friend_decl_with_def_arg_redeclared);
18667 diag::note_previous_declaration);
18669 Diag(FD->
getLocation(), diag::err_friend_decl_with_def_arg_must_be_def);
18674 if (TPL.size() > 0 && SS.
isValid()) {
18696 FunctionDecl *Fn = dyn_cast_or_null<FunctionDecl>(Dcl);
18698 Diag(DelLoc, diag::err_deleted_non_function);
18703 Fn->setWillHaveBody(
false);
18705 if (
const FunctionDecl *Prev = Fn->getPreviousDecl()) {
18709 Prev->getPreviousDecl()) &&
18710 !Prev->isDefined()) {
18711 Diag(DelLoc, diag::err_deleted_decl_not_first);
18712 Diag(Prev->getLocation().isInvalid() ? DelLoc : Prev->getLocation(),
18713 Prev->isImplicit() ? diag::note_previous_implicit_declaration
18714 : diag::note_previous_declaration);
18717 Fn->setInvalidDecl();
18725 Fn = Fn->getCanonicalDecl();
18730 Diag(Fn->getLocation(), diag::err_attribute_dll_deleted) << DLLAttr;
18731 Fn->setInvalidDecl();
18737 Diag(DelLoc, diag::err_deleted_main);
18741 Fn->setImplicitlyInline();
18742 Fn->setDeletedAsWritten(
true, Message);
18749 auto *FD = dyn_cast<FunctionDecl>(Dcl);
18751 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(Dcl)) {
18753 Diag(DefaultLoc, diag::err_defaulted_comparison_template);
18758 Diag(DefaultLoc, diag::err_default_special_members)
18769 (!FD->isDependentContext() ||
18772 Diag(DefaultLoc, diag::err_default_special_members)
18782 ? diag::warn_cxx17_compat_defaulted_comparison
18783 : diag::ext_defaulted_comparison);
18786 FD->setDefaulted();
18787 FD->setExplicitlyDefaulted();
18788 FD->setDefaultLoc(DefaultLoc);
18791 if (FD->isDependentContext())
18797 FD->setWillHaveBody(
false);
18812 if (
const FunctionDecl *Pattern = FD->getTemplateInstantiationPattern())
18841 Self.Diag(SubStmt->getBeginLoc(),
18842 diag::err_return_in_constructor_handler);
18849 for (
unsigned I = 0, E = TryBlock->
getNumHandlers(); I != E; ++I) {
18857 switch (BodyKind) {
18866 "Parsed function body should be '= delete;' or '= default;'");
18876 for (
unsigned I = 0, E = OldFT->
getNumParams(); I != E; ++I)
18880 !NewFT->getExtParameterInfo(I).isNoEscape()) {
18881 Diag(
New->getParamDecl(I)->getLocation(),
18882 diag::warn_overriding_method_missing_noescape);
18884 diag::note_overridden_marked_noescape);
18890 Diag(
New->getLocation(), diag::err_conflicting_overriding_attributes)
18897 const auto *OldCSA = Old->
getAttr<CodeSegAttr>();
18898 const auto *NewCSA =
New->getAttr<CodeSegAttr>();
18899 if ((NewCSA || OldCSA) &&
18900 (!OldCSA || !NewCSA || NewCSA->getName() != OldCSA->getName())) {
18901 Diag(
New->getLocation(), diag::err_mismatched_code_seg_override);
18907 if (
Context.hasAnyFunctionEffects()) {
18909 const auto NewFXOrig =
New->getFunctionEffects();
18911 if (OldFX != NewFXOrig) {
18915 for (
const auto &Diff : Diffs) {
18916 switch (Diff.shouldDiagnoseMethodOverride(*Old, OldFX, *
New, NewFX)) {
18920 Diag(
New->getLocation(), diag::warn_conflicting_func_effect_override)
18921 << Diff.effectName();
18926 NewFX.
insert(Diff.Old.value(), Errs);
18931 NewFT->getParamTypes(), EPI);
18932 New->setType(ModQT);
18933 if (Errs.empty()) {
18936 Diag(
New->getLocation(), diag::warn_mismatched_func_effect_override)
18937 << Diff.effectName();
18954 if (NewCC == OldCC)
18965 diag::err_conflicting_overriding_cc_attributes)
18975 if (!
New->isExplicitObjectMemberFunction())
18977 Diag(
New->getParamDecl(0)->getBeginLoc(),
18978 diag::err_explicit_object_parameter_nonmember)
18979 <<
New->getSourceRange() << 1 <<
false;
18981 New->setInvalidDecl();
18990 if (
Context.hasSameType(NewTy, OldTy) ||
19005 if (NewRT->getTypeClass() == OldRT->getTypeClass()) {
19015 diag::err_different_return_type_for_overriding_virtual_function)
19016 <<
New->getDeclName() << NewTy << OldTy
19017 <<
New->getReturnTypeSourceRange();
19024 if (!
Context.hasSameUnqualifiedType(NewClassTy, OldClassTy)) {
19033 diag::err_covariant_return_incomplete,
19034 New->getDeclName()))
19040 Diag(
New->getLocation(), diag::err_covariant_return_not_derived)
19041 <<
New->getDeclName() << NewTy << OldTy
19042 <<
New->getReturnTypeSourceRange();
19050 NewClassTy, OldClassTy,
19051 diag::err_covariant_return_inaccessible_base,
19052 diag::err_covariant_return_ambiguous_derived_to_base_conv,
19053 New->getLocation(),
New->getReturnTypeSourceRange(),
19054 New->getDeclName(),
nullptr)) {
19068 diag::err_covariant_return_type_different_qualifications)
19069 <<
New->getDeclName() << NewTy << OldTy
19070 <<
New->getReturnTypeSourceRange();
19080 diag::err_covariant_return_type_class_type_not_same_or_less_qualified)
19081 <<
New->getDeclName() << NewTy << OldTy
19082 <<
New->getReturnTypeSourceRange();
19094 Method->setRangeEnd(EndLoc);
19096 if (
Method->isVirtual() ||
Method->getParent()->isDependentContext()) {
19097 Method->setIsPureVirtual();
19101 if (!
Method->isInvalidDecl())
19102 Diag(
Method->getLocation(), diag::err_non_virtual_pure)
19103 <<
Method->getDeclName() << InitRange;
19110 else if (
auto *M = dyn_cast<CXXMethodDecl>(D))
19153 "Parser allowed 'typedef' as storage class of condition decl.");
19165 if (
auto *VD = dyn_cast<VarDecl>(Dcl))
19179 llvm::DenseMap<CXXRecordDecl *, bool>::iterator Pos =
19183 if (!Pos->second && VTable.DefinitionRequired)
19184 Pos->second =
true;
19188 VTablesUsed[VTable.Record] = VTable.DefinitionRequired;
19189 NewUses.push_back(
VTableUse(VTable.Record, VTable.Location));
19196 bool DefinitionRequired) {
19199 if (!
Class->isDynamicClass() ||
Class->isDependentContext() ||
19205 !
OpenMP().isInOpenMPDeclareTargetContext() &&
19206 !
OpenMP().isInOpenMPTargetExecutionDirective()) {
19207 if (!DefinitionRequired)
19215 std::pair<llvm::DenseMap<CXXRecordDecl *, bool>::iterator,
bool>
19221 if (DefinitionRequired && !Pos.first->second) {
19222 Pos.first->second =
true;
19232 if (
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
19253 if (
Class->isLocalClass())
19268 bool DefinedAnything =
false;
19269 for (
unsigned I = 0; I !=
VTableUses.size(); ++I) {
19274 Class->getTemplateSpecializationKind();
19278 bool DefineVTable =
true;
19283 if (
Class->isInCurrentModuleUnit()) {
19284 DefineVTable =
true;
19285 }
else if (KeyFunction && !KeyFunction->
hasBody()) {
19290 DefineVTable =
false;
19295 "Instantiations don't have key functions");
19297 }
else if (!KeyFunction) {
19302 bool IsExplicitInstantiationDeclaration =
19304 for (
auto *R :
Class->redecls()) {
19308 IsExplicitInstantiationDeclaration =
true;
19310 IsExplicitInstantiationDeclaration =
false;
19315 if (IsExplicitInstantiationDeclaration) {
19316 const bool HasExcludeFromExplicitInstantiation =
19324 return method->hasAttr<ExcludeFromExplicitInstantiationAttr>();
19326 if (!HasExcludeFromExplicitInstantiation)
19327 DefineVTable =
false;
19334 if (!DefineVTable) {
19342 DefinedAnything =
true;
19350 !(
Class->isInNamedModule() &&
Class->shouldEmitInExternalSource()))
19356 if (
Context.getTargetInfo().getCXXABI().hasKeyFunctions() &&
19357 Class->isExternallyVisible() &&
19358 !(
Class->getOwningModule() &&
19359 Class->getOwningModule()->isInterfaceOrPartition()) &&
19364 if (!KeyFunction || (KeyFunction->
hasBody(KeyFunctionDef) &&
19371 return DefinedAnything;
19376 for (
const auto *I : RD->
methods())
19377 if (I->isVirtual() && !I->isPureVirtual())
19383 bool ConstexprOnly) {
19387 for (
const auto &FinalOverrider : FinalOverriders) {
19388 for (
const auto &OverridingMethod : FinalOverrider.second) {
19389 assert(OverridingMethod.second.size() > 0 &&
"no final overrider");
19390 CXXMethodDecl *Overrider = OverridingMethod.second.front().Method;
19404 for (
const auto &I : RD->
bases()) {
19405 const auto *
Base = I.getType()->castAsCXXRecordDecl();
19406 if (
Base->getNumVBases() == 0)
19427 (void)
Target->hasBody(FNTarget);
19429 cast_or_null<CXXConstructorDecl>(FNTarget));
19434 *TCanonical =
Target?
Target->getCanonicalDecl() :
nullptr;
19436 if (!Current.insert(Canonical).second)
19441 Target->isInvalidDecl() ||
Valid.count(TCanonical)) {
19442 Valid.insert_range(Current);
19445 }
else if (TCanonical == Canonical ||
Invalid.count(TCanonical) ||
19446 Current.count(TCanonical)) {
19448 if (!
Invalid.count(TCanonical)) {
19450 diag::warn_delegating_ctor_cycle)
19454 if (TCanonical != Canonical)
19455 S.
Diag(
Target->getLocation(), diag::note_it_delegates_to);
19458 while (
C->getCanonicalDecl() != Canonical) {
19460 (void)
C->getTargetConstructor()->hasBody(FNTarget);
19461 assert(FNTarget &&
"Ctor cycle through bodiless function");
19465 S.
Diag(
C->getLocation(), diag::note_which_delegates_to);
19469 Invalid.insert_range(Current);
19480 for (DelegatingCtorDeclsType::iterator
19487 CI->setInvalidDecl();
19496 explicit FindCXXThisExpr(
Sema &S) : S(S) {}
19524 FindCXXThisExpr Finder(*
this);
19537 if (!Finder.TraverseStmt(
const_cast<Expr *
>(TRC.ConstraintExpr)))
19554 FindCXXThisExpr Finder(*
this);
19576 if (!Finder.TraverseType(E))
19586 FindCXXThisExpr Finder(*
this);
19589 for (
const auto *A :
Method->attrs()) {
19591 Expr *Arg =
nullptr;
19593 if (
const auto *G = dyn_cast<GuardedByAttr>(A))
19595 else if (
const auto *G = dyn_cast<PtGuardedByAttr>(A))
19597 else if (
const auto *AA = dyn_cast<AcquiredAfterAttr>(A))
19599 else if (
const auto *AB = dyn_cast<AcquiredBeforeAttr>(A))
19601 else if (
const auto *LR = dyn_cast<LockReturnedAttr>(A))
19602 Arg = LR->getArg();
19603 else if (
const auto *LE = dyn_cast<LocksExcludedAttr>(A))
19605 else if (
const auto *RC = dyn_cast<RequiresCapabilityAttr>(A))
19607 else if (
const auto *AC = dyn_cast<AcquireCapabilityAttr>(A))
19609 else if (
const auto *AC = dyn_cast<TryAcquireCapabilityAttr>(A)) {
19610 Arg = AC->getSuccessValue();
19612 }
else if (
const auto *RC = dyn_cast<ReleaseCapabilityAttr>(A))
19615 if (Arg && !Finder.TraverseStmt(Arg))
19618 for (
Expr *A : Args) {
19619 if (!Finder.TraverseStmt(A))
19633 Exceptions.clear();
19636 Exceptions.reserve(DynamicExceptions.size());
19637 for (
unsigned ei = 0, ee = DynamicExceptions.size(); ei != ee; ++ei) {
19644 if (!Unexpanded.empty()) {
19655 Exceptions.push_back(ET);
19665 "Parser should have made sure that the expression is boolean");
19685 D = FTD->getTemplatedDecl();
19695 DynamicExceptionRanges, NoexceptExpr, Exceptions,
19699 Context.adjustExceptionSpec(FD, ESI,
true);
19723 Diag(DeclStart, diag::err_anonymous_property);
19737 TInfo =
Context.getTrivialTypeSourceInfo(T, Loc);
19748 diag::err_invalid_thread)
19756 switch (
Previous.getResultKind()) {
19763 PrevDecl =
Previous.getRepresentativeDecl();
19776 PrevDecl =
nullptr;
19780 PrevDecl =
nullptr;
19791 Record->setInvalidDecl();
19813 if (!ExplicitLists.empty()) {
19814 bool IsMemberSpecialization, IsInvalid;
19818 ExplicitLists,
false, IsMemberSpecialization, IsInvalid,
19830 if (ExplicitParams && !ExplicitParams->
empty()) {
19831 Info.AutoTemplateParameterDepth = ExplicitParams->
getDepth();
19832 llvm::append_range(Info.TemplateParams, *ExplicitParams);
19833 Info.NumExplicitTemplateParams = ExplicitParams->
size();
19835 Info.AutoTemplateParameterDepth = TemplateParameterDepth;
19836 Info.NumExplicitTemplateParams = 0;
19842 if (FSI.TemplateParams.size() > FSI.NumExplicitTemplateParams) {
19843 if (FSI.NumExplicitTemplateParams != 0) {
19864 assert(
Context.getTargetInfo().getCXXABI().isMicrosoft());
19874 if (NumParams == 0)
19883 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 bool DeduceTemplateArguments(Sema &S, TemplateParameterList *TPL, TemplateDecl *TD, ArrayRef< TemplateArgument > PatternArgs, ArrayRef< TemplateArgument > Args, TemplateDeductionInfo &Info, TemplateSpecCandidateSet *FailedTSC, bool CopyDeducedArgs)
This file declares semantic analysis for CUDA constructs.
static void DiagnoseUnsatisfiedConstraint(Sema &S, ArrayRef< UnsatisfiedConstraintRecord > Records, SourceLocation Loc, bool First=true, concepts::NestedRequirement *Req=nullptr)
static LookupResult lookupMember(Sema &S, const char *Name, CXXRecordDecl *RD, SourceLocation Loc, bool &Res)
static bool findTrivialSpecialMember(Sema &S, CXXRecordDecl *RD, CXXSpecialMemberKind CSM, unsigned Quals, bool ConstRHS, TrivialABIHandling TAH, CXXMethodDecl **Selected)
Perform lookup for a special member of the specified kind, and determine whether it is trivial.
static void checkMoveAssignmentForRepeatedMove(Sema &S, CXXRecordDecl *Class, SourceLocation CurrentLocation)
Check if we're implicitly defining a move assignment operator for a class with virtual bases.
static void checkMethodTypeQualifiers(Sema &S, Declarator &D, unsigned DiagID)
static void DelegatingCycleHelper(CXXConstructorDecl *Ctor, llvm::SmallPtrSet< CXXConstructorDecl *, 4 > &Valid, llvm::SmallPtrSet< CXXConstructorDecl *, 4 > &Invalid, llvm::SmallPtrSet< CXXConstructorDecl *, 4 > &Current, Sema &S)
static bool CheckConstexprFunctionBody(Sema &SemaRef, const FunctionDecl *Dcl, Stmt *Body, Sema::CheckConstexprKind Kind)
Check the body for the given constexpr function declaration only contains the permitted types of stat...
llvm::SmallPtrSet< QualType, 4 > IndirectBaseSet
Use small set to collect indirect bases.
static void checkCUDADeviceBuiltinSurfaceClassTemplate(Sema &S, CXXRecordDecl *Class)
static bool checkVectorDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const VectorType *VT)
static void SearchForReturnInStmt(Sema &Self, Stmt *S)
static bool checkSimpleDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const llvm::APSInt &NumElemsAPS, QualType ElemType, llvm::function_ref< ExprResult(SourceLocation, Expr *, unsigned)> GetInit)
static CXXDestructorDecl * LookupDestructorIfRelevant(Sema &S, CXXRecordDecl *Class)
static void extendRight(SourceRange &R, SourceRange After)
static void DiagnoseNamespaceInlineMismatch(Sema &S, SourceLocation KeywordLoc, SourceLocation Loc, IdentifierInfo *II, bool *IsInline, NamespaceDecl *PrevNS)
Diagnose a mismatch in 'inline' qualifiers when a namespace is reopened.
static bool IsPotentiallyTypeAwareOperatorNewOrDelete(Sema &SemaRef, const FunctionDecl *FD, bool *WasMalformed)
static bool RefersToRValueRef(Expr *MemRef)
static bool CheckConstexprCtorInitializer(Sema &SemaRef, const FunctionDecl *Dcl, FieldDecl *Field, llvm::SmallPtrSet< Decl *, 16 > &Inits, bool &Diagnosed, Sema::CheckConstexprKind Kind)
Check that the given field is initialized within a constexpr constructor.
static CanQualType RemoveAddressSpaceFromPtr(Sema &SemaRef, const PointerType *PtrTy)
static bool isVirtualDirectBase(CXXRecordDecl *Derived, CXXRecordDecl *Base)
Determine whether a direct base class is a virtual base class.
#define CheckPolymorphic(Type)
static void BuildBasePathArray(const CXXBasePath &Path, CXXCastPath &BasePathArray)
static void WriteCharValueForDiagnostic(uint32_t Value, const BuiltinType *BTy, unsigned TyWidth, SmallVectorImpl< char > &Str)
Convert character's value, interpreted as a code unit, to a string.
static void CheckAbstractClassUsage(AbstractUsageInfo &Info, FunctionDecl *FD)
Check for invalid uses of an abstract type in a function declaration.
static unsigned getRecordDiagFromTagKind(TagTypeKind Tag)
Get diagnostic select index for tag kind for record diagnostic message.
static IsTupleLike isTupleLike(Sema &S, SourceLocation Loc, QualType T, unsigned &OutSize)
static Expr * CastForMoving(Sema &SemaRef, Expr *E)
static bool IsPotentiallyDestroyingOperatorDelete(Sema &SemaRef, const FunctionDecl *FD)
static void extendLeft(SourceRange &R, SourceRange Before)
static bool specialMemberIsConstexpr(Sema &S, CXXRecordDecl *ClassDecl, CXXSpecialMemberKind CSM, unsigned Quals, bool ConstRHS, CXXConstructorDecl *InheritedCtor=nullptr, Sema::InheritedConstructorInfo *Inherited=nullptr)
Is the special member function which would be selected to perform the specified operation on the spec...
static void diagnoseInvalidDeclaratorChunks(Sema &S, Declarator &D, unsigned Kind)
static bool canPassInRegisters(Sema &S, CXXRecordDecl *D, TargetInfo::CallingConvKind CCK)
Determine whether a type is permitted to be passed or returned in registers, per C++ [class....
static void lookupOperatorsForDefaultedComparison(Sema &Self, Scope *S, UnresolvedSetImpl &Operators, OverloadedOperatorKind Op)
Perform the unqualified lookups that might be needed to form a defaulted comparison function for the ...
static void WriteCharTypePrefix(BuiltinType::Kind BTK, llvm::raw_ostream &OS)
static bool EvaluateAsStringImpl(Sema &SemaRef, Expr *Message, ResultType &Result, ASTContext &Ctx, Sema::StringEvaluationContext EvalContext, bool ErrorOnInvalidMessage)
static void diagnoseDeprecatedCopyOperation(Sema &S, CXXMethodDecl *CopyOp)
Diagnose an implicit copy operation for a class which is odr-used, but which is deprecated because th...
static void AddMostOverridenMethods(const CXXMethodDecl *MD, llvm::SmallPtrSetImpl< const CXXMethodDecl * > &Methods)
Add the most overridden methods from MD to Methods.
static DeclAccessPair findDecomposableBaseClass(Sema &S, SourceLocation Loc, const CXXRecordDecl *RD, CXXCastPath &BasePath)
Find the base class to decompose in a built-in decomposition of a class type.
static const void * GetKeyForBase(ASTContext &Context, QualType BaseType)
static QualType BuildStdClassTemplate(Sema &S, ClassTemplateDecl *CTD, QualType TypeParam, SourceLocation Loc)
static NamespaceDecl * getNamespaceDecl(NamespaceBaseDecl *D)
getNamespaceDecl - Returns the namespace a decl represents.
static Sema::ImplicitExceptionSpecification ComputeDefaultedComparisonExceptionSpec(Sema &S, SourceLocation Loc, FunctionDecl *FD, Sema::DefaultedComparisonKind DCK)
static bool isDestroyingDeleteT(QualType Type)
static StmtResult buildSingleCopyAssignRecursively(Sema &S, SourceLocation Loc, QualType T, const ExprBuilder &To, const ExprBuilder &From, bool CopyingBaseSubobject, bool Copying, unsigned Depth=0)
Builds a statement that copies/moves the given entity from From to To.
static void checkCUDADeviceBuiltinTextureClassTemplate(Sema &S, CXXRecordDecl *Class)
static void AddInitializerToDiag(const Sema::SemaDiagnosticBuilder &Diag, const CXXCtorInitializer *Previous, const CXXCtorInitializer *Current)
static bool BuildImplicitBaseInitializer(Sema &SemaRef, CXXConstructorDecl *Constructor, ImplicitInitializerKind ImplicitInitKind, CXXBaseSpecifier *BaseSpec, bool IsInheritedVirtualBase, CXXCtorInitializer *&CXXBaseInit)
static bool IsUnusedPrivateField(const FieldDecl *FD)
static void NoteIndirectBases(ASTContext &Context, IndirectBaseSet &Set, const QualType &Type)
Recursively add the bases of Type. Don't add Type itself.
static bool CheckConstexprMissingReturn(Sema &SemaRef, const FunctionDecl *Dcl)
static bool CheckConstexprFunctionStmt(Sema &SemaRef, const FunctionDecl *Dcl, Stmt *S, SmallVectorImpl< SourceLocation > &ReturnStmts, SourceLocation &Cxx1yLoc, SourceLocation &Cxx2aLoc, SourceLocation &Cxx2bLoc, Sema::CheckConstexprKind Kind)
Check the provided statement is allowed in a constexpr function definition.
static bool functionDeclHasDefaultArgument(const FunctionDecl *FD)
static bool CheckConstexprParameterTypes(Sema &SemaRef, const FunctionDecl *FD, Sema::CheckConstexprKind Kind)
Check whether a function's parameter types are all literal types.
static bool IsUsingDirectiveInToplevelContext(DeclContext *CurContext)
Determine whether a using statement is in a context where it will be apply in all contexts.
static bool checkTupleLikeDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, VarDecl *Src, QualType DecompType, unsigned NumElems)
static CXXConstructorDecl * findUserDeclaredCtor(CXXRecordDecl *RD)
static bool checkMemberDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const CXXRecordDecl *OrigRD)
static bool HasAttribute(const QualType &T)
static bool CheckOperatorNewDeclaration(Sema &SemaRef, FunctionDecl *FnDecl)
static void checkForMultipleExportedDefaultConstructors(Sema &S, CXXRecordDecl *Class)
static bool CheckOperatorNewDeleteTypes(Sema &SemaRef, FunctionDecl *FnDecl, AllocationOperatorKind OperatorKind, CanQualType ExpectedResultType, CanQualType ExpectedSizeOrAddressParamType, unsigned DependentParamTypeDiag, unsigned InvalidParamTypeDiag)
static bool checkTrivialClassMembers(Sema &S, CXXRecordDecl *RD, CXXSpecialMemberKind CSM, bool ConstArg, TrivialABIHandling TAH, bool Diagnose)
Check whether the members of a class type allow a special member to be trivial.
static TemplateArgumentLoc getTrivialTypeTemplateArgument(Sema &S, SourceLocation Loc, QualType T)
static void findImplicitlyDeclaredEqualityComparisons(ASTContext &Ctx, CXXRecordDecl *RD, llvm::SmallVectorImpl< FunctionDecl * > &Spaceships)
Find the equality comparison functions that should be implicitly declared in a given class definition...
static void PopulateKeysForFields(FieldDecl *Field, SmallVectorImpl< const void * > &IdealInits)
ImplicitInitializerKind
ImplicitInitializerKind - How an implicit base or member initializer should initialize its base or me...
static bool ConvertAPValueToString(const APValue &V, QualType T, SmallVectorImpl< char > &Str, ASTContext &Context)
Convert \V to a string we can present to the user in a diagnostic \T is the type of the expression th...
static bool checkArrayDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const ConstantArrayType *CAT)
static ClassTemplateDecl * LookupStdClassTemplate(Sema &S, SourceLocation Loc, const char *ClassName, bool *WasMalformed)
static void ReferenceDllExportedMembers(Sema &S, CXXRecordDecl *Class)
static bool UsefulToPrintExpr(const Expr *E)
Some Expression types are not useful to print notes about, e.g.
static bool FindBaseInitializer(Sema &SemaRef, CXXRecordDecl *ClassDecl, QualType BaseType, const CXXBaseSpecifier *&DirectBaseSpec, const CXXBaseSpecifier *&VirtualBaseSpec)
Find the direct and/or virtual base specifiers that correspond to the given base type,...
static bool checkLiteralOperatorTemplateParameterList(Sema &SemaRef, FunctionTemplateDecl *TpDecl)
static bool ReportOverrides(Sema &S, unsigned DiagID, const CXXMethodDecl *MD, llvm::function_ref< bool(const CXXMethodDecl *)> Report)
Report an error regarding overriding, along with any relevant overridden methods.
static bool CheckBindingsCount(Sema &S, DecompositionDecl *DD, QualType DecompType, ArrayRef< BindingDecl * > Bindings, unsigned MemberCount)
static bool CheckOperatorDeleteDeclaration(Sema &SemaRef, FunctionDecl *FnDecl)
static const void * GetKeyForMember(ASTContext &Context, CXXCtorInitializer *Member)
static std::string printTemplateArgs(const PrintingPolicy &PrintingPolicy, TemplateArgumentListInfo &Args, const TemplateParameterList *Params)
static bool CheckConstexprReturnType(Sema &SemaRef, const FunctionDecl *FD, Sema::CheckConstexprKind Kind)
Check whether a function's return type is a literal type.
static void DiagnoseBaseOrMemInitializerOrder(Sema &SemaRef, const CXXConstructorDecl *Constructor, ArrayRef< CXXCtorInitializer * > Inits)
static Sema::ImplicitExceptionSpecification computeImplicitExceptionSpec(Sema &S, SourceLocation Loc, FunctionDecl *FD)
static bool isIncompleteOrZeroLengthArrayType(ASTContext &Context, QualType T)
Determine whether the given type is an incomplete or zero-lenfgth array type.
static void MarkFieldDestructorReferenced(Sema &S, SourceLocation Location, FieldDecl *Field)
TrivialSubobjectKind
The kind of subobject we are checking for triviality.
@ TSK_CompleteObject
The object is actually the complete object.
@ TSK_Field
The subobject is a non-static data member.
@ TSK_BaseClass
The subobject is a base class.
static bool hasOneRealArgument(MultiExprArg Args)
Determine whether the given list arguments contains exactly one "real" (non-default) argument.
static StmtResult buildMemcpyForAssignmentOp(Sema &S, SourceLocation Loc, QualType T, const ExprBuilder &ToB, const ExprBuilder &FromB)
When generating a defaulted copy or move assignment operator, if a field should be copied with __buil...
static bool isStdClassTemplate(Sema &S, QualType SugaredType, QualType *TypeArg, const char *ClassName, ClassTemplateDecl **CachedDecl, const Decl **MalformedDecl)
static void DefineDefaultedFunction(Sema &S, FunctionDecl *FD, SourceLocation DefaultLoc)
static bool BuildImplicitMemberInitializer(Sema &SemaRef, CXXConstructorDecl *Constructor, ImplicitInitializerKind ImplicitInitKind, FieldDecl *Field, IndirectFieldDecl *Indirect, CXXCtorInitializer *&CXXMemberInit)
static void MarkBaseDestructorsReferenced(Sema &S, SourceLocation Location, CXXRecordDecl *ClassDecl)
static bool CheckMemberDecompositionFields(Sema &S, SourceLocation Loc, const CXXRecordDecl *OrigRD, QualType DecompType, DeclAccessPair BasePair)
static bool CollectFieldInitializer(Sema &SemaRef, BaseAndFieldInfo &Info, FieldDecl *Field, IndirectFieldDecl *Indirect=nullptr)
static CXXBaseSpecifier * findDirectBaseWithType(CXXRecordDecl *Derived, QualType DesiredBase, bool &AnyDependentBases)
Find the base specifier for a base class with the given type.
static Sema::SpecialMemberOverloadResult lookupCallFromSpecialMember(Sema &S, CXXRecordDecl *Class, CXXSpecialMemberKind CSM, unsigned FieldQuals, bool ConstRHS)
Look up the special member function that would be called by a special member function for a subobject...
static bool defaultedSpecialMemberIsConstexpr(Sema &S, CXXRecordDecl *ClassDecl, CXXSpecialMemberKind CSM, bool ConstArg, CXXConstructorDecl *InheritedCtor=nullptr, Sema::InheritedConstructorInfo *Inherited=nullptr)
Determine whether the specified special member function would be constexpr if it were implicitly defi...
static bool checkTrivialSubobjectCall(Sema &S, SourceLocation SubobjLoc, QualType SubType, bool ConstRHS, CXXSpecialMemberKind CSM, TrivialSubobjectKind Kind, TrivialABIHandling TAH, bool Diagnose)
Check whether the special member selected for a given type would be trivial.
static void DiagnoseInvisibleNamespace(const TypoCorrection &Corrected, Sema &S)
static StmtResult buildSingleCopyAssign(Sema &S, SourceLocation Loc, QualType T, const ExprBuilder &To, const ExprBuilder &From, bool CopyingBaseSubobject, bool Copying)
static FunctionProtoType::ExtProtoInfo getImplicitMethodEPI(Sema &S, CXXMethodDecl *MD)
static QualType getTupleLikeElementType(Sema &S, SourceLocation Loc, unsigned I, QualType T)
static Sema::ImplicitExceptionSpecification ComputeDefaultedSpecialMemberExceptionSpec(Sema &S, SourceLocation Loc, CXXMethodDecl *MD, CXXSpecialMemberKind CSM, Sema::InheritedConstructorInfo *ICI)
static QualType getStdTrait(Sema &S, SourceLocation Loc, StringRef Trait, TemplateArgumentListInfo &Args, unsigned DiagID)
static bool checkComplexDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const ComplexType *CT)
static bool TryNamespaceTypoCorrection(Sema &S, LookupResult &R, Scope *Sc, CXXScopeSpec &SS, SourceLocation IdentLoc, IdentifierInfo *Ident)
static bool InitializationHasSideEffects(const FieldDecl &FD)
static bool CheckOperatorNewDeleteDeclarationScope(Sema &SemaRef, const FunctionDecl *FnDecl)
static bool checkArrayLikeDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const llvm::APSInt &NumElems, QualType ElemType)
static bool CheckConstexprDeclStmt(Sema &SemaRef, const FunctionDecl *Dcl, DeclStmt *DS, SourceLocation &Cxx1yLoc, Sema::CheckConstexprKind Kind)
Check the given declaration statement is legal within a constexpr function body.
static bool IsEquivalentForUsingDecl(ASTContext &Context, NamedDecl *D1, NamedDecl *D2)
Determine whether a using declaration considers the given declarations as "equivalent",...
static TemplateArgumentLoc getTrivialIntegralTemplateArgument(Sema &S, SourceLocation Loc, QualType T, uint64_t I)
static bool CheckConstexprDestructorSubobjects(Sema &SemaRef, const CXXDestructorDecl *DD, Sema::CheckConstexprKind Kind)
Determine whether a destructor cannot be constexpr due to.
static bool isProvablyNotDerivedFrom(Sema &SemaRef, CXXRecordDecl *Record, const BaseSet &Bases)
Determines if the given class is provably not derived from all of the prospective base classes.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis for OpenMP constructs and clauses.
static ExprResult CheckConvertedConstantExpression(Sema &S, Expr *From, QualType T, APValue &Value, CCEKind CCE, bool RequireInt, NamedDecl *Dest)
CheckConvertedConstantExpression - Check that the expression From is a converted constant expression ...
static void collectUnexpandedParameterPacks(Sema &S, TemplateParameterList *Params, SmallVectorImpl< UnexpandedParameterPack > &Unexpanded)
static bool DiagnoseUnexpandedParameterPacks(Sema &S, TemplateTemplateParmDecl *TTP)
Check for unexpanded parameter packs within the template parameters of a template template parameter,...
static bool isInvalid(LocType Loc, bool *Invalid)
Defines various enumerations that describe declaration and type specifiers.
static QualType getPointeeType(const MemRegion *R)
Defines the clang::TypeLoc interface and its subclasses.
Allows QualTypes to be sorted and hence used in maps and sets.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
std::pair< CXXConstructorDecl *, bool > findConstructorForBase(CXXRecordDecl *Base, CXXConstructorDecl *Ctor) const
Find the constructor to use for inherited construction of a base class, and whether that base class c...
InheritedConstructorInfo(Sema &S, SourceLocation UseLoc, ConstructorUsingShadowDecl *Shadow)
a trap message and trap category.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
virtual bool HandleTopLevelDecl(DeclGroupRef D)
HandleTopLevelDecl - Handle the specified top-level declaration.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
const ConstantArrayType * getAsConstantArrayType(QualType T) const
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
DeclarationNameTable DeclarationNames
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
const LangOptions & getLangOpts() const
QualType getConstType(QualType T) const
Return the uniqued reference to the type for a const qualified type.
CallingConv getDefaultCallingConvention(bool IsVariadic, bool IsCXXMethod) const
Retrieves the default calling convention for the current context.
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
ComparisonCategories CompCategories
Types and expressions required to build C++2a three-way comparisons using operator<=>,...
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
const clang::PrintingPolicy & getPrintingPolicy() const
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
QualType getTypeDeclType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TypeDecl *Decl) const
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
QualType getPackExpansionType(QualType Pattern, UnsignedOrNone NumExpansions, bool ExpectPackInType=true) const
Form a pack expansion type with the given pattern.
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
llvm::APSInt MakeIntValue(uint64_t Value, QualType Type) const
Make an APSInt of the appropriate width and signedness for the given Value and integer Type.
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
const TargetInfo & getTargetInfo() const
CanQualType getCanonicalTagType(const TagDecl *TD) const
static bool hasSameUnqualifiedType(QualType T1, QualType T2)
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
Represents an access specifier followed by colon ':'.
static AccessSpecDecl * Create(ASTContext &C, AccessSpecifier AS, DeclContext *DC, SourceLocation ASLoc, SourceLocation ColonLoc)
TypeLoc getElementLoc() const
QualType getElementType() const
Attr - This represents one attribute.
attr::Kind getKind() const
Attr * clone(ASTContext &C) const
SourceLocation getLocation() const
Represents a C++ declaration that introduces decls from somewhere else.
unsigned shadow_size() const
Return the number of shadowed declarations associated with this using declaration.
void addShadowDecl(UsingShadowDecl *S)
shadow_iterator shadow_begin() const
void removeShadowDecl(UsingShadowDecl *S)
static BinaryOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)
static bool isCompoundAssignmentOp(Opcode Opc)
static Opcode getOverloadedOpcode(OverloadedOperatorKind OO)
Retrieve the binary opcode that corresponds to the given overloaded operator.
A binding in a decomposition declaration.
static BindingDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdLoc, IdentifierInfo *Id, QualType T)
void setBinding(QualType DeclaredType, Expr *Binding)
Set the binding for this BindingDecl, along with its declared type (which should be a possibly-cv-qua...
void setDecomposedDecl(ValueDecl *Decomposed)
Set the decomposed variable for this BindingDecl.
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
Wrapper for source info for block pointers.
This class is used for builtin types like 'int'.
Represents a path from a specific derived class (which is not represented as part of the path) to a p...
DeclContext::lookup_iterator Decls
The declarations found inside this base class subobject.
AccessSpecifier Access
The access along this inheritance path.
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
const CXXRecordDecl * getOrigin() const
Retrieve the type from which this base-paths search began.
bool isRecordingPaths() const
Whether we are recording paths.
void setRecordingPaths(bool RP)
Specify whether we should be recording paths or not.
void setOrigin(const CXXRecordDecl *Rec)
void clear()
Clear the base-paths results.
bool isAmbiguous(CanQualType BaseType) const
Determine whether the path from the most-derived type to the given base type is ambiguous (i....
Represents a base class of a C++ class.
SourceLocation getBeginLoc() const LLVM_READONLY
bool isVirtual() const
Determines whether the base class is a virtual base class (or not).
QualType getType() const
Retrieves the type of the base class.
SourceRange getSourceRange() const LLVM_READONLY
Retrieves the source range that contains the entire base specifier.
AccessSpecifier getAccessSpecifier() const
Returns the access specifier for this base specifier.
A boolean literal, per ([C++ lex.bool] Boolean literals).
CXXCatchStmt - This represents a C++ catch block.
Represents a call to a C++ constructor.
static CXXConstructExpr * Create(const ASTContext &Ctx, QualType Ty, SourceLocation Loc, CXXConstructorDecl *Ctor, bool Elidable, ArrayRef< Expr * > Args, bool HadMultipleCandidates, bool ListInitialization, bool StdInitListInitialization, bool ZeroInitialization, CXXConstructionKind ConstructKind, SourceRange ParenOrBraceRange)
Create a C++ construction expression.
Expr * getArg(unsigned Arg)
Return the specified argument.
bool isImmediateEscalating() const
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
Represents a C++ constructor within a class.
CXXConstructorDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool isMoveConstructor(unsigned &TypeQuals) const
Determine whether this constructor is a move constructor (C++11 [class.copy]p3), which can be used to...
init_iterator init_begin()
Retrieve an iterator to the first initializer.
CXXConstructorDecl * getTargetConstructor() const
When this constructor delegates to another, retrieve the target.
bool isCopyConstructor(unsigned &TypeQuals) const
Whether this constructor is a copy constructor (C++ [class.copy]p2, which can be used to copy the cla...
bool isDefaultConstructor() const
Whether this constructor is a default constructor (C++ [class.ctor]p5), which can be used to default-...
void setCtorClosureDefaultArgs(ArrayRef< CXXDefaultArgExpr * > Args)
InheritedConstructor getInheritedConstructor() const
Get the constructor that this inheriting constructor is based on.
static CXXConstructorDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, ExplicitSpecifier ES, bool UsesFPIntrin, bool isInline, bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind, InheritedConstructor Inherited=InheritedConstructor(), const AssociatedConstraint &TrailingRequiresClause={})
ArrayRef< CXXDefaultArgExpr * > getCtorClosureDefaultArgs() const
ExplicitSpecifier getExplicitSpecifier() const
Represents a C++ conversion function within a class.
QualType getConversionType() const
Returns the type that this conversion function is converting to.
Represents a C++ base or member initializer.
bool isWritten() const
Determine whether this initializer is explicitly written in the source code.
SourceRange getSourceRange() const LLVM_READONLY
Determine the source range covering the entire initializer.
SourceLocation getSourceLocation() const
Determine the source location of the initializer.
bool isAnyMemberInitializer() const
TypeSourceInfo * getTypeSourceInfo() const
Returns the declarator information for a base class or delegating initializer.
FieldDecl * getAnyMember() const
A default argument (C++ [dcl.fct.default]).
Represents a C++ destructor within a class.
static CXXDestructorDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, bool UsesFPIntrin, bool isInline, bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind, const AssociatedConstraint &TrailingRequiresClause={})
const FunctionDecl * getOperatorDelete() const
A mapping from each virtual member function to its set of final overriders.
Represents a call to an inherited base class constructor from an inheriting constructor.
Represents a call to a member function that may be written either with member call syntax (e....
CXXMethodDecl * getMethodDecl() const
Retrieve the declaration of the called method.
Represents a static or instance method of a struct/union/class.
bool isExplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An explicit object member function is a non-static member function with an explic...
static CXXMethodDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin, bool isInline, ConstexprSpecKind ConstexprKind, SourceLocation EndLocation, const AssociatedConstraint &TrailingRequiresClause={})
unsigned getNumExplicitParams() const
CXXMethodDecl * getMostRecentDecl()
overridden_method_range overridden_methods() const
unsigned size_overridden_methods() const
method_iterator begin_overridden_methods() const
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
bool isMoveAssignmentOperator() const
Determine whether this is a move assignment operator.
QualType getFunctionObjectParameterType() const
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
The null pointer literal (C++11 [lex.nullptr])
Represents a C++ struct/union/class.
bool hasConstexprDefaultConstructor() const
Determine whether this class has a constexpr default constructor.
friend_range friends() const
bool hasTrivialMoveAssignment() const
Determine whether this class has a trivial move assignment operator (C++11 [class....
bool isTriviallyCopyable() const
Determine whether this class is considered trivially copyable per (C++11 [class]p6).
bool hasTrivialDefaultConstructor() const
Determine whether this class has a trivial default constructor (C++11 [class.ctor]p5).
bool isGenericLambda() const
Determine whether this class describes a generic lambda function object (i.e.
bool hasTrivialDestructor() const
Determine whether this class has a trivial destructor (C++ [class.dtor]p3)
bool hasUserDeclaredDestructor() const
Determine whether this class has a user-declared destructor.
bool implicitCopyConstructorHasConstParam() const
Determine whether an implicit copy constructor for this type would have a parameter with a const-qual...
bool defaultedDestructorIsDeleted() const
true if a defaulted destructor for this class would be deleted.
bool hasInheritedAssignment() const
Determine whether this class has a using-declaration that names a base class assignment operator.
bool allowConstDefaultInit() const
Determine whether declaring a const variable with this type is ok per core issue 253.
bool hasTrivialDestructorForCall() const
bool defaultedMoveConstructorIsDeleted() const
true if a defaulted move constructor for this class would be deleted.
bool isLiteral() const
Determine whether this class is a literal type.
bool hasUserDeclaredMoveAssignment() const
Determine whether this class has had a move assignment declared by the user.
bool defaultedDestructorIsConstexpr() const
Determine whether a defaulted default constructor for this class would be constexpr.
bool hasAnyDependentBases() const
Determine whether this class has any dependent base classes which are not the current instantiation.
bool isLambda() const
Determine whether this class describes a lambda function object.
bool hasTrivialMoveConstructor() const
Determine whether this class has a trivial move constructor (C++11 [class.copy]p12)
bool needsImplicitDefaultConstructor() const
Determine if we need to declare a default constructor for this class.
bool needsImplicitMoveConstructor() const
Determine whether this class should get an implicit move constructor or if any existing special membe...
bool hasUserDeclaredCopyAssignment() const
Determine whether this class has a user-declared copy assignment operator.
bool isProvablyNotDerivedFrom(const CXXRecordDecl *Base) const
Determine whether this class is provably not derived from the type Base.
method_range methods() const
CXXRecordDecl * getDefinition() const
bool needsOverloadResolutionForCopyAssignment() const
Determine whether we need to eagerly declare a defaulted copy assignment operator for this class.
static AccessSpecifier MergeAccess(AccessSpecifier PathAccess, AccessSpecifier DeclAccess)
Calculates the access of a decl that is reached along a path.
bool defaultedDefaultConstructorIsConstexpr() const
Determine whether a defaulted default constructor for this class would be constexpr.
bool hasTrivialCopyConstructor() const
Determine whether this class has a trivial copy constructor (C++ [class.copy]p6, C++11 [class....
void setImplicitMoveAssignmentIsDeleted()
Set that we attempted to declare an implicit move assignment operator, but overload resolution failed...
bool hasConstexprDestructor() const
Determine whether this class has a constexpr destructor.
bool isPolymorphic() const
Whether this class is polymorphic (C++ [class.virtual]), which means that the class contains or inher...
unsigned getNumBases() const
Retrieves the number of base classes of this class.
bool defaultedCopyConstructorIsDeleted() const
true if a defaulted copy constructor for this class would be deleted.
bool hasTrivialCopyConstructorForCall() const
bool lookupInBases(BaseMatchesCallback BaseMatches, CXXBasePaths &Paths, bool LookupInDependent=false) const
Look for entities within the base classes of this C++ class, transitively searching all base class su...
bool lambdaIsDefaultConstructibleAndAssignable() const
Determine whether this lambda should have an implicit default constructor and copy and move assignmen...
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine whether this particular class is a specialization or instantiation of a class template or m...
bool hasTrivialCopyAssignment() const
Determine whether this class has a trivial copy assignment operator (C++ [class.copy]p11,...
base_class_range vbases()
base_class_iterator vbases_begin()
void setImplicitMoveConstructorIsDeleted()
Set that we attempted to declare an implicit move constructor, but overload resolution failed so we d...
bool isAbstract() const
Determine whether this class has a pure virtual function.
bool hasVariantMembers() const
Determine whether this class has any variant members.
void setImplicitCopyConstructorIsDeleted()
Set that we attempted to declare an implicit copy constructor, but overload resolution failed so we d...
bool isDynamicClass() const
bool hasInClassInitializer() const
Whether this class has any in-class initializers for non-static data members (including those in anon...
bool needsImplicitCopyConstructor() const
Determine whether this class needs an implicit copy constructor to be lazily declared.
bool hasIrrelevantDestructor() const
Determine whether this class has a destructor which has no semantic effect.
bool hasNonTrivialCopyConstructorForCall() const
bool hasDirectFields() const
Determine whether this class has direct non-static data members.
bool hasUserDeclaredCopyConstructor() const
Determine whether this class has a user-declared copy constructor.
bool hasDefinition() const
void setImplicitCopyAssignmentIsDeleted()
Set that we attempted to declare an implicit copy assignment operator, but overload resolution failed...
bool needsImplicitDestructor() const
Determine whether this class needs an implicit destructor to be lazily declared.
ClassTemplateDecl * getDescribedClassTemplate() const
Retrieves the class template that is described by this class declaration.
void getFinalOverriders(CXXFinalOverriderMap &FinaOverriders) const
Retrieve the final overriders for each virtual member function in the class hierarchy where this clas...
bool needsOverloadResolutionForMoveConstructor() const
Determine whether we need to eagerly declare a defaulted move constructor for this class.
bool isInjectedClassName() const
Determines whether this declaration represents the injected class name.
bool needsOverloadResolutionForMoveAssignment() const
Determine whether we need to eagerly declare a move assignment operator for this class.
CXXDestructorDecl * getDestructor() const
Returns the destructor decl for this class.
bool hasNonTrivialDestructorForCall() const
bool needsOverloadResolutionForDestructor() const
Determine whether we need to eagerly declare a destructor for this class.
bool hasInheritedConstructor() const
Determine whether this class has a using-declaration that names a user-declared base class constructo...
CXXMethodDecl * getLambdaStaticInvoker() const
Retrieve the lambda static invoker, the address of which is returned by the conversion operator,...
bool needsOverloadResolutionForCopyConstructor() const
Determine whether we need to eagerly declare a defaulted copy constructor for this class.
CXXRecordDecl * getDefinitionOrSelf() const
bool hasUserDeclaredMoveConstructor() const
Determine whether this class has had a move constructor declared by the user.
bool needsImplicitMoveAssignment() const
Determine whether this class should get an implicit move assignment operator or if any existing speci...
bool needsImplicitCopyAssignment() const
Determine whether this class needs an implicit copy assignment operator to be lazily declared.
bool hasTrivialMoveConstructorForCall() const
CXXMethodDecl * getLambdaCallOperator() const
Retrieve the lambda call operator of the closure type if this is a closure type.
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
unsigned getNumVBases() const
Retrieves the number of virtual base classes of this class.
bool isDerivedFrom(const CXXRecordDecl *Base) const
Determine whether this class is derived from the class Base.
bool implicitCopyAssignmentHasConstParam() const
Determine whether an implicit copy assignment operator for this type would have a parameter with a co...
Represents a C++ nested-name-specifier or a global scope specifier.
bool isNotEmpty() const
A scope specifier is present, but may be valid or invalid.
bool isValid() const
A scope specifier is present, and it refers to a real scope.
void MakeTrivial(ASTContext &Context, NestedNameSpecifier Qualifier, SourceRange R)
Make a new nested-name-specifier from incomplete source-location information.
SourceRange getRange() const
SourceLocation getBeginLoc() const
bool isSet() const
Deprecated.
NestedNameSpecifier getScopeRep() const
Retrieve the representation of the nested-name-specifier.
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
bool isInvalid() const
An error occurred during parsing of the scope specifier.
bool isEmpty() const
No scope specifier.
Represents the this expression in C++.
SourceLocation getBeginLoc() const
SourceLocation getLocation() const
CXXTryStmt - A C++ try block, including all handlers.
CXXCatchStmt * getHandler(unsigned i)
unsigned getNumHandlers() const
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
bool isCallToStdMove() const
QualType withConst() const
Retrieves a version of this type with const applied.
CastKind getCastKind() const
static CharSourceRange getTokenRange(SourceRange R)
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
Declaration of a class template.
CXXRecordDecl * getTemplatedDecl() const
Get the underlying class declarations of the template.
Represents a class template specialization, which refers to a class template with a given set of temp...
TemplateSpecializationKind getSpecializationKind() const
Determine the kind of specialization that this declaration represents.
ClassTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
SourceLocation getPointOfInstantiation() const
Get the point of instantiation (if any), or null if none.
bool isExplicitSpecialization() const
const ComparisonCategoryInfo * lookupInfoForType(QualType Ty) const
static StringRef getCategoryString(ComparisonCategoryType Kind)
static StringRef getResultString(ComparisonCategoryResult Kind)
static std::vector< ComparisonCategoryResult > getPossibleResultsForType(ComparisonCategoryType Type)
Return the list of results which are valid for the specified comparison category type.
const CXXRecordDecl * Record
The declaration for the comparison category type from the standard library.
ComparisonCategoryType Kind
The Kind of the comparison category type.
Complex values, per C99 6.2.5p11.
QualType getElementType() const
CompoundStmt - This represents a group of statements like { stmt stmt }.
static CompoundStmt * Create(const ASTContext &C, ArrayRef< Stmt * > Stmts, FPOptionsOverride FPFeatures, SourceLocation LB, SourceLocation RB)
ConstStmtVisitor - This class implements a simple visitor for Stmt subclasses.
Represents the canonical version of C arrays with a specified constant size.
llvm::APInt getSize() const
Return the constant array size as an APInt.
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
const CXXRecordDecl * getParent() const
Returns the parent of this using shadow declaration, which is the class in which this is declared.
static ConstructorUsingShadowDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation Loc, UsingDecl *Using, NamedDecl *Target, bool IsVirtual)
SourceLocation getBeginLoc() const LLVM_READONLY
Base class for callback objects used by Sema::CorrectTypo to check the validity of a potential typo c...
A POD class for pairing a NamedDecl* with an access specifier.
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
NamedDecl * getDecl() const
AccessSpecifier getAccess() const
The results of name lookup within a DeclContext.
DeclListNode::iterator iterator
specific_decl_iterator - Iterates over a subrange of declarations stored in a DeclContext,...
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
lookup_result::iterator lookup_iterator
bool isFileContext() const
void makeDeclVisibleInContext(NamedDecl *D)
Makes a declaration visible within this context.
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
bool InEnclosingNamespaceSetOf(const DeclContext *NS) const
Test if this context is part of the enclosing namespace set of the context NS, as defined in C++0x [n...
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
bool isTranslationUnit() const
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void removeDecl(Decl *D)
Removes a declaration from this context.
void addDecl(Decl *D)
Add the declaration D into this context.
decl_iterator decls_end() const
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
bool isFunctionOrMethod() const
const LinkageSpecDecl * getExternCContext() const
Retrieve the nearest enclosing C linkage specification context.
bool Encloses(const DeclContext *DC) const
Determine whether this declaration context semantically encloses the declaration context DC.
Decl::Kind getDeclKind() const
DeclContext * getNonTransparentContext()
decl_iterator decls_begin() const
A reference to a declared variable, function, enum, etc.
static DeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *D, bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc, QualType T, ExprValueKind VK, NamedDecl *FoundD=nullptr, const TemplateArgumentListInfo *TemplateArgs=nullptr, NonOdrUseReason NOUR=NOUR_None)
NonOdrUseReason isNonOdrUse() const
Is this expression a non-odr-use reference, and if so, why?
SourceLocation getBeginLoc() const
bool isImmediateEscalating() const
Captures information about "declaration specifiers".
bool isVirtualSpecified() const
bool isModulePrivateSpecified() const
bool hasTypeSpecifier() const
Return true if any type-specifier has been found.
bool SetStorageClassSpec(Sema &S, SCS SC, SourceLocation Loc, const char *&PrevSpec, unsigned &DiagID, const PrintingPolicy &Policy)
These methods set the specified attribute of the DeclSpec and return false if there was no error.
ThreadStorageClassSpecifier TSCS
Expr * getPackIndexingExpr() const
void ClearStorageClassSpecs()
TST getTypeSpecType() const
SourceLocation getStorageClassSpecLoc() const
SCS getStorageClassSpec() const
SourceLocation getBeginLoc() const LLVM_READONLY
SourceRange getSourceRange() const LLVM_READONLY
unsigned getTypeQualifiers() const
getTypeQualifiers - Return a set of TQs.
SourceLocation getExplicitSpecLoc() const
SourceLocation getFriendSpecLoc() const
ParsedType getRepAsType() const
TSCS getThreadStorageClassSpec() const
bool isFriendSpecifiedFirst() const
ParsedAttributes & getAttributes()
SourceLocation getEllipsisLoc() const
SourceLocation getConstSpecLoc() const
SourceRange getExplicitSpecRange() const
Expr * getRepAsExpr() const
bool isInlineSpecified() const
SourceLocation getRestrictSpecLoc() const
bool SetTypeQual(TQ T, SourceLocation Loc)
void ClearConstexprSpec()
static const char * getSpecifierName(DeclSpec::TST T, const PrintingPolicy &Policy)
Turn a type-specifier-type into a string like "_Bool" or "union".
SourceLocation getThreadStorageClassSpecLoc() const
SourceLocation getAtomicSpecLoc() const
SourceLocation getVirtualSpecLoc() const
SourceLocation getConstexprSpecLoc() const
SourceLocation getTypeSpecTypeLoc() const
void forEachQualifier(llvm::function_ref< void(TQ, StringRef, SourceLocation)> Handle)
This method calls the passed in handler on each qual being set.
SourceLocation getInlineSpecLoc() const
SourceLocation getUnalignedSpecLoc() const
SourceLocation getVolatileSpecLoc() const
FriendSpecified isFriendSpecified() const
bool hasExplicitSpecifier() const
bool hasConstexprSpecifier() const
static const TST TST_auto
DeclStmt - Adaptor class for mixing declarations with statements and expressions.
SourceLocation getBeginLoc() const LLVM_READONLY
Decl - This represents one declaration (or definition), e.g.
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
bool isInStdNamespace() const
SourceLocation getEndLoc() const LLVM_READONLY
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
virtual bool isOutOfLine() const
Determine whether this declaration is declared out of line (outside its semantic context).
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
Kind
Lists the kind of concrete classes of Decl.
void markUsed(ASTContext &C)
Mark the declaration used, in the sense of odr-use.
@ FOK_Undeclared
A friend of a previously-undeclared entity.
@ FOK_None
Not a friend object.
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
bool isTemplateParameter() const
isTemplateParameter - Determines whether this declaration is a template parameter.
DeclContext * getNonTransparentDeclContext()
Return the non transparent context.
bool isInvalidDecl() const
unsigned getIdentifierNamespace() const
bool isLocalExternDecl() const
Determine whether this is a block-scope declaration with linkage.
void setAccess(AccessSpecifier AS)
SourceLocation getLocation() const
@ IDNS_Ordinary
Ordinary names.
bool isTemplateParameterPack() const
isTemplateParameter - Determines whether this declaration is a template parameter pack.
void setLocalOwningModule(Module *M)
void setImplicit(bool I=true)
void setReferenced(bool R=true)
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
SourceLocation getBeginLoc() const LLVM_READONLY
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
@ VisibleWhenImported
This declaration has an owning module, and is visible when that module is imported.
void setModuleOwnershipKind(ModuleOwnershipKind MOK)
Set whether this declaration is hidden from name lookup.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
bool isAnyOperatorNewOrDelete() const
std::string getAsString() const
Retrieve the human-readable string for this name.
const IdentifierInfo * getCXXLiteralIdentifier() const
If this name is the name of a literal operator, retrieve the identifier associated with it.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
@ CXXConversionFunctionName
NameKind getNameKind() const
Determine what kind of name this is.
bool isIdentifier() const
Predicate functions for querying what type of name this is.
Represents a ValueDecl that came out of a declarator.
SourceLocation getTypeSpecStartLoc() const
SourceLocation getBeginLoc() const LLVM_READONLY
const AssociatedConstraint & getTrailingRequiresClause() const
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
void setTypeSourceInfo(TypeSourceInfo *TI)
ArrayRef< TemplateParameterList * > getTemplateParameterLists() const
TypeSourceInfo * getTypeSourceInfo() const
Information about one declarator, including the parsed type information and the identifier.
bool isFunctionDeclarator(unsigned &idx) const
isFunctionDeclarator - This method returns true if the declarator is a function declarator (looking t...
bool isDeclarationOfFunction() const
Determine whether the declaration that will be produced from this declaration will be a function.
const DeclaratorChunk & getTypeObject(unsigned i) const
Return the specified TypeInfo from this declarator.
const DeclSpec & getDeclSpec() const
getDeclSpec - Return the declaration-specifier that this declarator was declared with.
bool isFunctionDeclarationContext() const
Return true if this declaration appears in a context where a function declarator would be a function ...
SourceLocation getIdentifierLoc() const
void SetIdentifier(const IdentifierInfo *Id, SourceLocation IdLoc)
Set the name of this declarator to be the given identifier.
SourceLocation getEndLoc() const LLVM_READONLY
type_object_range type_objects() const
Returns the range of type objects, from the identifier outwards.
bool hasGroupingParens() const
void setInvalidType(bool Val=true)
unsigned getNumTypeObjects() const
Return the number of types applied to this declarator.
bool isRedeclaration() const
DeclaratorContext getContext() const
const DecompositionDeclarator & getDecompositionDeclarator() const
SourceLocation getBeginLoc() const LLVM_READONLY
bool isFunctionDefinition() const
UnqualifiedId & getName()
Retrieve the name specified by this declarator.
const CXXScopeSpec & getCXXScopeSpec() const
getCXXScopeSpec - Return the C++ scope specifier (global scope or nested-name-specifier) that is part...
ArrayRef< TemplateParameterList * > getTemplateParameterLists() const
The template parameter lists that preceded the declarator.
void setInventedTemplateParameterList(TemplateParameterList *Invented)
Sets the template parameter list generated from the explicit template parameters along with any inven...
bool mayHaveDecompositionDeclarator() const
Return true if the context permits a C++17 decomposition declarator.
bool isInvalidType() const
SourceRange getSourceRange() const LLVM_READONLY
Get the source range that spans this declarator.
bool isDecompositionDeclarator() const
Return whether this declarator is a decomposition declarator.
bool isStaticMember()
Returns true if this declares a static member.
DeclSpec & getMutableDeclSpec()
getMutableDeclSpec - Return a non-const version of the DeclSpec.
DeclaratorChunk::FunctionTypeInfo & getFunctionTypeInfo()
getFunctionTypeInfo - Retrieves the function type info object (looking through parentheses).
const IdentifierInfo * getIdentifier() const
A decomposition declaration.
ArrayRef< BindingDecl * > bindings() const
A parsed C++17 decomposition declarator of the form '[' identifier-list ']'.
ArrayRef< Binding > bindings() const
SourceRange getSourceRange() const
SourceLocation getLSquareLoc() const
void setNameLoc(SourceLocation Loc)
void setElaboratedKeywordLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
A little helper class (which is basically a smart pointer that forwards info from DiagnosticsEngine a...
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
virtual bool TraverseConstructorInitializer(MaybeConst< CXXCtorInitializer > *Init)
static EmptyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L)
RAII object that enters a new expression evaluation context.
An instance of this object exists for each enum constant that is defined.
enumerator_range enumerators() const
EvaluatedExprVisitor - This class visits 'Expr *'s.
Store information needed for an explicit specifier.
const Expr * getExpr() const
void setKind(ExplicitSpecKind Kind)
This represents one expression.
static bool isPotentialConstantExpr(const FunctionDecl *FD, SmallVectorImpl< PartialDiagnosticAt > &Diags)
isPotentialConstantExpr - Return true if this function's definition might be usable in a constant exp...
bool isValueDependent() const
Determines whether the value of this expression depends on.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
Expr * IgnoreImplicit() LLVM_READONLY
Skip past any implicit AST nodes which might surround this expression until reaching a fixed point.
bool containsErrors() const
Whether this expression contains subexpressions which had errors.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
bool isLValue() const
isLValue - True if this expression is an "l-value" according to the rules of the current language.
bool EvaluateAsRValue(EvalResult &Result, const ASTContext &Ctx, bool InConstantContext=false) const
EvaluateAsRValue - Return true if this is a constant which we can fold to an rvalue using any crazy t...
bool isTemporaryObject(ASTContext &Ctx, const CXXRecordDecl *TempTy) const
Determine whether the result of this expression is a temporary object of the given class type.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Represents difference between two FPOptions values.
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 * > FriendTypeTPLists={}, SourceLocation EllipsisLoc={})
static DefaultedOrDeletedFunctionInfo * Create(ASTContext &Context, ArrayRef< DeclAccessPair > Lookups, StringLiteral *DeletedMessage=nullptr)
Represents a function declaration or definition.
static constexpr unsigned RequiredTypeAwareDeleteParameterCount
Count of mandatory parameters for type aware operator delete.
const ParmVarDecl * getParamDecl(unsigned i) const
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
ExceptionSpecificationType getExceptionSpecType() const
Gets the ExceptionSpecificationType as declared.
bool isTrivialForCall() const
ConstexprSpecKind getConstexprKind() const
DefaultedOrDeletedFunctionInfo * getDefaultedOrDeletedInfo() const
unsigned getMinRequiredArguments() const
Returns the minimum number of arguments needed to call this function.
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
bool isThisDeclarationADefinition() const
Returns whether this specific declaration of the function is also a definition that does not contain ...
bool isImmediateFunction() const
void setDefaultedOrDeletedInfo(DefaultedOrDeletedFunctionInfo *Info)
SourceRange getReturnTypeSourceRange() const
Attempt to compute an informative source range covering the function return type.
bool isDestroyingOperatorDelete() const
Determine whether this is a destroying operator delete.
bool hasCXXExplicitFunctionObjectParameter() const
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
SourceLocation getDefaultLoc() const
QualType getReturnType() const
ArrayRef< ParmVarDecl * > parameters() const
bool isExplicitlyDefaulted() const
Whether this function is explicitly defaulted.
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
MutableArrayRef< ParmVarDecl * >::iterator param_iterator
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
param_iterator param_begin()
const ParmVarDecl * getNonObjectParameter(unsigned I) const
bool isVariadic() const
Whether this function is variadic.
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
bool isDeleted() const
Whether this function has been deleted.
void setBodyContainsImmediateEscalatingExpressions(bool Set)
const TemplateArgumentList * getTemplateSpecializationArgs() const
Retrieve the template arguments used to produce this function template specialization from the primar...
FunctionEffectsRef getFunctionEffects() const
bool isTemplateInstantiation() const
Determines if the given function was instantiated from a function template.
StorageClass getStorageClass() const
Returns the storage class as written in the source.
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
static constexpr unsigned RequiredTypeAwareNewParameterCount
Count of mandatory parameters for type aware operator new.
bool isPureVirtual() const
Whether this virtual function is pure, i.e.
bool isExternC() const
Determines whether this function is a function with external, C linkage.
FunctionDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
bool isImmediateEscalating() const
void setIsDestroyingOperatorDelete(bool IsDestroyingDelete)
bool isTypeAwareOperatorNewOrDelete() const
Determine whether this is a type aware operator new or delete.
void setIsTypeAwareOperatorNewOrDelete(bool IsTypeAwareOperator=true)
bool isDefaulted() const
Whether this function is defaulted.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool isOverloadedOperator() const
Whether this function declaration represents an C++ overloaded operator, e.g., "operator+".
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
void setConstexprKind(ConstexprSpecKind CSK)
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
void setDefaulted(bool D=true)
bool isUserProvided() const
True if this method is user-declared and was not deleted or defaulted on its first declaration.
QualType getDeclaredReturnType() const
Get the declared return type, which may differ from the actual return type if the return type is dedu...
bool isVirtualAsWritten() const
Whether this function is marked as virtual explicitly.
bool hasOneParamOrDefaultArgs() const
Determine whether this function has a single parameter, or multiple parameters where all but the firs...
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
size_t param_size() const
DeclarationNameInfo getNameInfo() const
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
bool isDefined(const FunctionDecl *&Definition, bool CheckForPendingFriendDefinition=false) const
Returns true if the function has a definition that does not need to be instantiated.
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
void setParams(ArrayRef< ParmVarDecl * > NewParamInfo)
bool willHaveBody() const
True if this function will eventually have a body, once it's fully parsed.
A mutable set of FunctionEffects and possibly conditions attached to them.
bool insert(const FunctionEffectWithCondition &NewEC, Conflicts &Errs)
SmallVector< Conflict > Conflicts
An immutable set of FunctionEffects and possibly conditions attached to them.
static FunctionParmPackExpr * Create(const ASTContext &Context, QualType T, ValueDecl *ParamPack, SourceLocation NameLoc, ArrayRef< ValueDecl * > Params)
Represents a prototype with parameter type info, e.g.
ExtParameterInfo getExtParameterInfo(unsigned I) const
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
unsigned getNumParams() const
bool hasTrailingReturn() const
Whether this function prototype has a trailing return type.
const QualType * param_type_iterator
QualType getParamType(unsigned i) const
bool isVariadic() const
Whether this function prototype is variadic.
ExtProtoInfo getExtProtoInfo() const
Expr * getNoexceptExpr() const
Return the expression inside noexcept(expression), or a null pointer if there is none (because the ex...
ArrayRef< QualType > getParamTypes() const
ArrayRef< QualType > exceptions() const
bool hasExtParameterInfos() const
Is there any interesting extra information for any of the parameters of this function type?
Declaration of a template function.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
Wrapper for source info for functions.
unsigned getNumParams() const
ParmVarDecl * getParam(unsigned i) const
void setParam(unsigned i, ParmVarDecl *VD)
TypeLoc getReturnLoc() const
ExtInfo withCallingConv(CallingConv cc) const
FunctionType - C99 6.7.5.3 - Function Declarators.
CallingConv getCallConv() const
QualType getReturnType() const
One of these records is kept for each identifier that is lexed.
unsigned getLength() const
Efficiently return the length of this identifier info.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
ReservedLiteralSuffixIdStatus isReservedLiteralSuffixId() const
Determine whether this is a name reserved for future standardization or the implementation (C++ [usrl...
bool isPlaceholder() const
StringRef getName() const
Return the actual identifier string.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
IfStmt - This represents an if/then/else.
ImaginaryLiteral - We support imaginary integer and floating point literals, like "1....
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
Represents an implicitly-generated value initialization of an object of a given type.
Represents a field injected from an anonymous union/struct into the parent scope.
ArrayRef< NamedDecl * > chain() const
void setInherited(bool I)
Description of a constructor that was inherited from a base class.
ConstructorUsingShadowDecl * getShadowDecl() const
const TypeClass * getTypePtr() const
Describes an C or C++ initializer list.
unsigned getNumInits() const
const Expr * getInit(unsigned Init) const
Describes the kind of initialization being performed, along with location information for tokens rela...
static InitializationKind CreateDefault(SourceLocation InitLoc)
Create a default initialization.
static InitializationKind CreateDirect(SourceLocation InitLoc, SourceLocation LParenLoc, SourceLocation RParenLoc)
Create a direct initialization.
static InitializationKind CreateCopy(SourceLocation InitLoc, SourceLocation EqualLoc, bool AllowExplicitConvs=false)
Create a copy initialization.
static InitializationKind CreateDirectList(SourceLocation InitLoc)
Describes the sequence of initializations required to initialize a given object or reference with a s...
ExprResult Perform(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, QualType *ResultType=nullptr)
Perform the actual initialization of the given entity based on the computed initialization sequence.
Describes an entity that is being initialized.
static InitializedEntity InitializeBase(ASTContext &Context, const CXXBaseSpecifier *Base, bool IsInheritedVirtualBase, const InitializedEntity *Parent=nullptr)
Create the initialization entity for a base class subobject.
static InitializedEntity InitializeMember(FieldDecl *Member, const InitializedEntity *Parent=nullptr)
Create the initialization entity for a member subobject.
static InitializedEntity InitializeBinding(VarDecl *Binding)
Create the initialization entity for a structured binding.
static InitializedEntity InitializeMemberFromDefaultMemberInitializer(FieldDecl *Member)
Create the initialization entity for a default member initializer.
static InitializedEntity InitializeVariable(VarDecl *Var)
Create the initialization entity for a variable.
static InitializedEntity InitializeParameter(ASTContext &Context, ParmVarDecl *Parm)
Create the initialization entity for a parameter.
static InitializedEntity InitializeMemberImplicit(FieldDecl *Member)
Create the initialization entity for a member subobject with implicit field initializer.
static InitializedEntity InitializeDelegation(QualType Type)
Create the initialization entity for a delegated constructor.
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
An lvalue reference type, per C++11 [dcl.ref].
bool isInitCapture(const LambdaCapture *Capture) const
Determine whether one of this lambda's captures is an init-capture.
capture_range captures() const
Retrieve this lambda's captures.
@ Default
Use default layout rules of the target.
static StringRef getSourceText(CharSourceRange Range, const SourceManager &SM, const LangOptions &LangOpts, bool *Invalid=nullptr)
Returns a string for the source that the range encompasses.
Represents a linkage specification.
static LinkageSpecDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation ExternLoc, SourceLocation LangLoc, LinkageSpecLanguageIDs Lang, bool HasBraces)
void setRBraceLoc(SourceLocation L)
A class for iterating through a result set and possibly filtering out results.
void erase()
Erase the last element returned from this iterator.
Represents the results of name lookup.
LLVM_ATTRIBUTE_REINITIALIZES void clear()
Clears out any current state.
void addDecl(NamedDecl *D)
Add a declaration to these results with its natural access.
bool empty() const
Return true if no decls were found.
void resolveKind()
Resolves the result kind of the lookup, possibly hiding decls.
SourceLocation getNameLoc() const
Gets the location of the identifier.
Filter makeFilter()
Create a filter for this result set.
NamedDecl * getFoundDecl() const
Fetch the unique decl found by this lookup.
bool isSingleResult() const
Determines if this names a single result which is not an unresolved value using decl.
UnresolvedSetImpl::iterator iterator
NamedDecl * getRepresentativeDecl() const
Fetches a representative decl. Useful for lazy diagnostics.
static bool isVisible(Sema &SemaRef, NamedDecl *D)
Determine whether the given declaration is visible to the program.
An instance of this class represents the declaration of a property member.
static MSPropertyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName N, QualType T, TypeSourceInfo *TInfo, SourceLocation StartL, IdentifierInfo *Getter, IdentifierInfo *Setter)
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
SourceLocation getExprLoc() const LLVM_READONLY
Wrapper for source info for member pointers.
A pointer to member type per C++ 8.3.3 - Pointers to members.
Describes a module or submodule.
StringRef getTopLevelModuleName() const
Retrieve the name of the top-level module.
bool isExplicitGlobalModule() const
This represents a decl that may have a name.
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
bool isPlaceholderVar(const LangOptions &LangOpts) const
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
void setModulePrivate()
Specify that this declaration was marked as being private to the module in which it was defined.
Represents a C++ namespace alias.
static NamespaceAliasDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation NamespaceLoc, SourceLocation AliasLoc, IdentifierInfo *Alias, NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc, NamespaceBaseDecl *Namespace)
Represents C++ namespaces and their aliases.
NamespaceDecl * getNamespace()
Represent a C++ namespace.
bool isInline() const
Returns true if this is an inline namespace declaration.
static NamespaceDecl * Create(ASTContext &C, DeclContext *DC, bool Inline, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, NamespaceDecl *PrevDecl, bool Nested)
NamespaceDecl * getAnonymousNamespace() const
Retrieve the anonymous namespace that inhabits this namespace, if any.
void setRBraceLoc(SourceLocation L)
Class that aids in the construction of nested-name-specifiers along with source-location information ...
void MakeTrivial(ASTContext &Context, NestedNameSpecifier Qualifier, SourceRange R)
Make a new nested-name-specifier from incomplete source-location information.
A C++ nested-name-specifier augmented with source location information.
SourceRange getSourceRange() const LLVM_READONLY
Retrieve the source range covering the entirety of this nested-name-specifier.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
NestedNameSpecifier getCanonical() const
Retrieves the "canonical" nested name specifier for a given nested name specifier.
bool containsUnexpandedParameterPack() const
Whether this nested-name-specifier contains an unexpanded parameter pack (for C++11 variadic template...
bool isDependent() const
Whether this nested name specifier refers to a dependent type or not.
const Type * getAsType() const
@ Global
The global specifier '::'. There is no stored value.
@ 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.
For a defaulted function, the kind of defaulted function that it is.
DefaultedComparisonKind asComparison() const
bool isSpecialMember() const
bool isComparison() const
CXXSpecialMemberKind asSpecialMember() const
Helper class that collects exception specifications for implicitly-declared special member functions.
void CalledStmt(Stmt *S)
Integrate an invoked statement into the collected data.
void CalledExpr(Expr *E)
Integrate an invoked expression into the collected data.
void CalledDecl(SourceLocation CallLoc, const CXXMethodDecl *Method)
Integrate another called method into the collected data.
SpecialMemberOverloadResult - The overloading result for a special member function.
CXXMethodDecl * getMethod() const
RAII object to handle the state changes required to synthesize a function body.
Abstract base class used for diagnosing integer constant expression violations.
Sema - This implements semantic analysis and AST building for C.
void DefineImplicitLambdaToFunctionPointerConversion(SourceLocation CurrentLoc, CXXConversionDecl *Conv)
Define the "body" of the conversion from a lambda object to a function pointer.
QualType SubstAutoType(QualType TypeWithAuto, QualType Replacement)
Substitute Replacement for auto in TypeWithAuto.
CXXConstructorDecl * DeclareImplicitDefaultConstructor(CXXRecordDecl *ClassDecl)
Declare the implicit default constructor for the given class.
bool MergeCXXFunctionDecl(FunctionDecl *New, FunctionDecl *Old, Scope *S)
MergeCXXFunctionDecl - Merge two declarations of the same C++ function, once we already know that the...
Attr * getImplicitCodeSegOrSectionAttrForFunction(const FunctionDecl *FD, bool IsDefinition)
Returns an implicit CodeSegAttr if a __declspec(code_seg) is found on a containing class.
MemInitResult BuildDelegatingInitializer(TypeSourceInfo *TInfo, Expr *Init, CXXRecordDecl *ClassDecl)
void CheckTypedefForVariablyModifiedType(Scope *S, TypedefNameDecl *D)
QualType getCurrentThisType()
Try to retrieve the type of the 'this' pointer.
bool CheckSpecifiedExceptionType(QualType &T, SourceRange Range)
CheckSpecifiedExceptionType - Check if the given type is valid in an exception specification.
ExprResult BuildBlockForLambdaConversion(SourceLocation CurrentLocation, SourceLocation ConvLocation, CXXConversionDecl *Conv, Expr *Src)
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
Decl * ActOnAliasDeclaration(Scope *CurScope, AccessSpecifier AS, MultiTemplateParamsArg TemplateParams, SourceLocation UsingLoc, UnqualifiedId &Name, const ParsedAttributesView &AttrList, TypeResult Type, Decl *DeclFromDeclSpec)
NamedDecl * ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope)
void DiagnoseAbstractType(const CXXRecordDecl *RD)
void HideUsingShadowDecl(Scope *S, UsingShadowDecl *Shadow)
Hides a using shadow declaration.
bool CheckUsingDeclQualifier(SourceLocation UsingLoc, bool HasTypename, const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, SourceLocation NameLoc, const LookupResult *R=nullptr, const UsingDecl *UD=nullptr)
Checks that the given nested-name qualifier used in a using decl in the current context is appropriat...
bool CheckExplicitObjectOverride(CXXMethodDecl *New, const CXXMethodDecl *Old)
llvm::SmallPtrSet< SpecialMemberDecl, 4 > SpecialMembersBeingDeclared
The C++ special members which we are currently in the process of declaring.
void ActOnParamUnparsedDefaultArgument(Decl *param, SourceLocation EqualLoc, SourceLocation ArgLoc)
ActOnParamUnparsedDefaultArgument - We've seen a default argument for a function parameter,...
DefaultedFunctionKind getDefaultedFunctionKind(const FunctionDecl *FD)
Determine the kind of defaulting that would be done for a given function.
ExprResult BuildMemberReferenceExpr(Expr *Base, QualType BaseType, SourceLocation OpLoc, bool IsArrow, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs, const Scope *S, ActOnMemberAccessExtraArgs *ExtraArgs=nullptr)
bool isDeclInScope(NamedDecl *D, DeclContext *Ctx, Scope *S=nullptr, bool AllowInlineNamespace=false) const
isDeclInScope - If 'Ctx' is a function/method, isDeclInScope returns true if 'D' is in Scope 'S',...
bool IsOverload(FunctionDecl *New, FunctionDecl *Old, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp=false)
void BuildBasePathArray(const CXXBasePaths &Paths, CXXCastPath &BasePath)
void MergeVarDeclExceptionSpecs(VarDecl *New, VarDecl *Old)
Merge the exception specifications of two variable declarations.
CXXSpecialMemberKind getSpecialMember(const CXXMethodDecl *MD)
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupUsingDeclName
Look up all declarations in a scope with the given name, including resolved using declarations.
@ LookupLocalFriendName
Look up a friend of a local class.
@ LookupNamespaceName
Look up a namespace name within a C++ using directive or namespace alias definition,...
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
void DiagnoseSentinelCalls(const NamedDecl *D, SourceLocation Loc, ArrayRef< Expr * > Args)
DiagnoseSentinelCalls - This routine checks whether a call or message-send is to a declaration with t...
void DiagnoseFunctionSpecifiers(const DeclSpec &DS)
Diagnose function specifiers on a declaration of an identifier that does not identify a function.
Decl * BuildStaticAssertDeclaration(SourceLocation StaticAssertLoc, Expr *AssertExpr, Expr *AssertMessageExpr, SourceLocation RParenLoc, bool Failed)
void EvaluateImplicitExceptionSpec(SourceLocation Loc, FunctionDecl *FD)
Evaluate the implicit exception specification for a defaulted special member function.
void PrintContextStack(InstantiationContextDiagFuncRef DiagFunc)
ExplicitSpecifier ActOnExplicitBoolSpecifier(Expr *E)
ActOnExplicitBoolSpecifier - Build an ExplicitSpecifier from an expression found in an explicit(bool)...
bool DiagRedefinedPlaceholderFieldDecl(SourceLocation Loc, RecordDecl *ClassDecl, const IdentifierInfo *Name)
void ActOnFinishCXXNonNestedClass()
MemInitResult BuildBaseInitializer(QualType BaseType, TypeSourceInfo *BaseTInfo, Expr *Init, CXXRecordDecl *ClassDecl, SourceLocation EllipsisLoc)
bool FindDeallocationFunction(SourceLocation StartLoc, CXXRecordDecl *RD, DeclarationName Name, FunctionDecl *&Operator, ImplicitDeallocationParameters, bool Diagnose=true)
void ForceDeclarationOfImplicitMembers(CXXRecordDecl *Class)
Force the declaration of any implicitly-declared members of this class.
void ActOnParamDefaultArgumentError(Decl *param, SourceLocation EqualLoc, Expr *DefaultArg)
ActOnParamDefaultArgumentError - Parsing or semantic analysis of the default argument for the paramet...
bool diagnoseQualifiedDeclaration(CXXScopeSpec &SS, DeclContext *DC, DeclarationName Name, SourceLocation Loc, TemplateIdAnnotation *TemplateId, bool IsMemberSpecialization)
Diagnose a declaration whose declarator-id has the given nested-name-specifier.
void DiagnoseStaticAssertDetails(const Expr *E)
Try to print more useful information about a failed static_assert with expression \E.
void DefineImplicitMoveAssignment(SourceLocation CurrentLocation, CXXMethodDecl *MethodDecl)
Defines an implicitly-declared move assignment operator.
void ActOnFinishDelayedMemberInitializers(Decl *Record)
ExprResult CreateBuiltinBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr, bool ForFoldExpression=false)
CreateBuiltinBinOp - Creates a new built-in binary operation with operator Opc at location TokLoc.
NamedDecl * ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope, ArrayRef< BindingDecl * > Bindings={})
void CheckDelegatingCtorCycles()
SmallVector< CXXMethodDecl *, 4 > DelayedDllExportMemberFunctions
void CheckExplicitObjectMemberFunction(Declarator &D, DeclarationName Name, QualType R, bool IsLambda, DeclContext *DC=nullptr)
bool DiagnoseClassNameShadow(DeclContext *DC, DeclarationNameInfo Info)
DiagnoseClassNameShadow - Implement C++ [class.mem]p13: If T is the name of a class,...
AccessResult CheckFriendAccess(NamedDecl *D)
Checks access to the target of a friend declaration.
void MarkBaseAndMemberDestructorsReferenced(SourceLocation Loc, CXXRecordDecl *Record)
MarkBaseAndMemberDestructorsReferenced - Given a record decl, mark all the non-trivial destructors of...
const TranslationUnitKind TUKind
The kind of translation unit we are processing.
QualType tryBuildStdTypeIdentity(QualType Type, SourceLocation Loc)
Looks for the std::type_identity template and instantiates it with Type, or returns a null type if ty...
DeclResult ActOnCXXConditionDeclaration(Scope *S, Declarator &D)
ActOnCXXConditionDeclarationExpr - Parsed a condition declaration of a C++ if/switch/while/for statem...
void LookupOverloadedBinOp(OverloadCandidateSet &CandidateSet, OverloadedOperatorKind Op, const UnresolvedSetImpl &Fns, ArrayRef< Expr * > Args, bool RequiresADL=true)
Perform lookup for an overloaded binary operator.
DelegatingCtorDeclsType DelegatingCtorDecls
All the delegating constructors seen so far in the file, used for cycle detection at the end of the T...
bool ActOnAccessSpecifier(AccessSpecifier Access, SourceLocation ASLoc, SourceLocation ColonLoc, const ParsedAttributesView &Attrs)
ActOnAccessSpecifier - Parsed an access specifier followed by a colon.
std::unique_ptr< CXXFieldCollector > FieldCollector
FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
void AddPragmaAttributes(Scope *S, Decl *D)
Adds the attributes that have been specified using the '#pragma clang attribute push' directives to t...
TemplateDecl * AdjustDeclIfTemplate(Decl *&Decl)
AdjustDeclIfTemplate - If the given decl happens to be a template, reset the parameter D to reference...
bool isImplicitlyDeleted(FunctionDecl *FD)
Determine whether the given function is an implicitly-deleted special member function.
void CheckImplicitSpecialMemberDeclaration(Scope *S, FunctionDecl *FD)
Check a completed declaration of an implicit special member.
void PushExpressionEvaluationContext(ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl=nullptr, ExpressionEvaluationContextRecord::ExpressionKind Type=ExpressionEvaluationContextRecord::EK_Other)
bool CompleteConstructorCall(CXXConstructorDecl *Constructor, QualType DeclInitType, MultiExprArg ArgsPtr, SourceLocation Loc, SmallVectorImpl< Expr * > &ConvertedArgs, bool AllowExplicit=false, bool IsListInitialization=false)
Given a constructor and the set of arguments provided for the constructor, convert the arguments and ...
@ Boolean
A boolean condition, from 'if', 'while', 'for', or 'do'.
bool RequireCompleteDeclContext(CXXScopeSpec &SS, DeclContext *DC)
Require that the context specified by SS be complete.
bool TemplateParameterListsAreEqual(const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New, const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain, TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc=SourceLocation())
Determine whether the given template parameter lists are equivalent.
Decl * ActOnNamespaceAliasDef(Scope *CurScope, SourceLocation NamespaceLoc, SourceLocation AliasLoc, IdentifierInfo *Alias, CXXScopeSpec &SS, SourceLocation IdentLoc, IdentifierInfo *Ident)
void CheckOverrideControl(NamedDecl *D)
CheckOverrideControl - Check C++11 override control semantics.
bool GatherArgumentsForCall(SourceLocation CallLoc, FunctionDecl *FDecl, const FunctionProtoType *Proto, unsigned FirstParam, ArrayRef< Expr * > Args, SmallVectorImpl< Expr * > &AllArgs, VariadicCallType CallType=VariadicCallType::DoesNotApply, bool AllowExplicit=false, bool IsListInitialization=false)
GatherArgumentsForCall - Collector argument expressions for various form of call prototypes.
bool ShouldDeleteSpecialMember(CXXMethodDecl *MD, CXXSpecialMemberKind CSM, InheritedConstructorInfo *ICI=nullptr, bool Diagnose=false)
Determine if a special member function should have a deleted definition when it is defaulted.
DeclResult ActOnTemplatedFriendTag(Scope *S, SourceLocation FriendLoc, unsigned TagSpec, SourceLocation TagLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, SourceLocation EllipsisLoc, const ParsedAttributesView &Attr, MultiTemplateParamsArg TempParamLists)
Handle a friend tag declaration where the scope specifier was templated.
Scope * getScopeForContext(DeclContext *Ctx)
Determines the active Scope associated with the given declaration context.
CXXConstructorDecl * DeclareImplicitMoveConstructor(CXXRecordDecl *ClassDecl)
Declare the implicit move constructor for the given class.
bool ProcessAccessDeclAttributeList(AccessSpecDecl *ASDecl, const ParsedAttributesView &AttrList)
Annotation attributes are the only attributes allowed after an access specifier.
FunctionDecl * InstantiateFunctionDeclaration(FunctionTemplateDecl *FTD, const TemplateArgumentList *Args, SourceLocation Loc, CodeSynthesisContext::SynthesisKind CSC=CodeSynthesisContext::ExplicitTemplateArgumentSubstitution)
Instantiate (or find existing instantiation of) a function template with a given set of template argu...
void SetFunctionBodyKind(Decl *D, SourceLocation Loc, FnBodyKind BodyKind, StringLiteral *DeletedMessage=nullptr)
void referenceDLLExportedClassMethods()
void CheckCompleteDestructorVariant(SourceLocation CurrentLocation, CXXDestructorDecl *Dtor)
Do semantic checks to allow the complete destructor variant to be emitted when the destructor is defi...
NamedDecl * ActOnCXXMemberDeclarator(Scope *S, AccessSpecifier AS, Declarator &D, MultiTemplateParamsArg TemplateParameterLists, Expr *BitfieldWidth, const VirtSpecifiers &VS, InClassInitStyle InitStyle)
ActOnCXXMemberDeclarator - This is invoked when a C++ class member declarator is parsed.
bool CheckIfOverriddenFunctionIsMarkedFinal(const CXXMethodDecl *New, const CXXMethodDecl *Old)
CheckIfOverriddenFunctionIsMarkedFinal - Checks whether a virtual member function overrides a virtual...
NamedDecl * HandleDeclarator(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParameterLists)
bool CheckOverridingFunctionAttributes(CXXMethodDecl *New, const CXXMethodDecl *Old)
TemplateParameterList * MatchTemplateParametersToScopeSpecifier(SourceLocation DeclStartLoc, SourceLocation DeclLoc, const CXXScopeSpec &SS, TemplateIdAnnotation *TemplateId, ArrayRef< TemplateParameterList * > ParamLists, bool IsFriend, bool &IsMemberSpecialization, bool &Invalid, bool SuppressDiagnostic=false)
Match the given template parameter lists to the given scope specifier, returning the template paramet...
void handleTagNumbering(const TagDecl *Tag, Scope *TagScope)
void AddImplicitlyDeclaredMembersToClass(CXXRecordDecl *ClassDecl)
AddImplicitlyDeclaredMembersToClass - Adds any implicitly-declared special functions,...
bool tryResolveExplicitSpecifier(ExplicitSpecifier &ExplicitSpec)
tryResolveExplicitSpecifier - Attempt to resolve the explict specifier.
Decl * ActOnConversionDeclarator(CXXConversionDecl *Conversion)
ActOnConversionDeclarator - Called by ActOnDeclarator to complete the declaration of the given C++ co...
bool IsCXXTriviallyRelocatableType(QualType T)
Determines if a type is trivially relocatable according to the C++26 rules.
@ Other
C++26 [dcl.fct.def.general]p1 function-body: ctor-initializer[opt] compound-statement function-try-bl...
@ Delete
deleted-function-body
QualType BuildStdInitializerList(QualType Element, SourceLocation Loc)
Looks for the std::initializer_list template and instantiates it with Element, or emits an error if i...
MemInitResult BuildMemberInitializer(ValueDecl *Member, Expr *Init, SourceLocation IdLoc)
StmtResult ActOnExprStmt(ExprResult Arg, bool DiscardedValue=true)
FieldDecl * HandleField(Scope *S, RecordDecl *TagD, SourceLocation DeclStart, Declarator &D, Expr *BitfieldWidth, InClassInitStyle InitStyle, AccessSpecifier AS)
HandleField - Analyze a field of a C struct or a C++ data member.
FPOptionsOverride CurFPFeatureOverrides()
void DiagnoseHiddenVirtualMethods(CXXMethodDecl *MD)
Diagnose methods which overload virtual methods in a base class without overriding any.
UsingShadowDecl * BuildUsingShadowDecl(Scope *S, BaseUsingDecl *BUD, NamedDecl *Target, UsingShadowDecl *PrevDecl)
Builds a shadow declaration corresponding to a 'using' declaration.
ExprResult BuildCallToMemberFunction(Scope *S, Expr *MemExpr, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallToMemberFunction - Build a call to a member function.
FunctionDecl * FindDeallocationFunctionForDestructor(SourceLocation StartLoc, CXXRecordDecl *RD, bool Diagnose, bool LookForGlobal, DeclarationName Name)
NamedDecl * LookupSingleName(Scope *S, DeclarationName Name, SourceLocation Loc, LookupNameKind NameKind, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)
Look up a name, looking for a single declaration.
bool isMemberAccessibleForDeletion(CXXRecordDecl *NamingClass, DeclAccessPair Found, QualType ObjectType, SourceLocation Loc, const PartialDiagnostic &Diag)
Is the given member accessible for the purposes of deciding whether to define a special member functi...
BaseResult ActOnBaseSpecifier(Decl *classdecl, SourceRange SpecifierRange, const ParsedAttributesView &Attrs, bool Virtual, AccessSpecifier Access, ParsedType basetype, SourceLocation BaseLoc, SourceLocation EllipsisLoc)
ActOnBaseSpecifier - Parsed a base specifier.
void ActOnFinishFunctionDeclarationDeclarator(Declarator &D)
Called after parsing a function declarator belonging to a function declaration.
void ActOnParamDefaultArgument(Decl *param, SourceLocation EqualLoc, Expr *defarg)
ActOnParamDefaultArgument - Check whether the default argument provided for a function parameter is w...
void CheckConversionDeclarator(Declarator &D, QualType &R, StorageClass &SC)
CheckConversionDeclarator - Called by ActOnDeclarator to check the well-formednes of the conversion f...
bool DeduceReturnType(FunctionDecl *FD, SourceLocation Loc, bool Diagnose=true)
void ActOnFinishDelayedCXXMethodDeclaration(Scope *S, Decl *Method)
ActOnFinishDelayedCXXMethodDeclaration - We have finished processing the delayed method declaration f...
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReceiver=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
DeclarationNameInfo GetNameForDeclarator(Declarator &D)
GetNameForDeclarator - Determine the full declaration name for the given Declarator.
DiagnosticsEngine & getDiagnostics() const
void DiagnoseTypeTraitDetails(const Expr *E)
If E represents a built-in type trait, or a known standard type trait, try to print more information ...
AccessResult CheckDestructorAccess(SourceLocation Loc, CXXDestructorDecl *Dtor, const PartialDiagnostic &PDiag, QualType objectType=QualType())
bool isStdTypeIdentity(QualType Ty, QualType *TypeArgument, const Decl **MalformedDecl=nullptr)
Tests whether Ty is an instance of std::type_identity and, if it is and TypeArgument is not NULL,...
void propagateDLLAttrToBaseClassTemplate(CXXRecordDecl *Class, Attr *ClassAttr, ClassTemplateSpecializationDecl *BaseTemplateSpec, SourceLocation BaseLoc)
Perform propagation of DLL attributes from a derived class to a templated base class for MS compatibi...
bool SpecialMemberIsTrivial(CXXMethodDecl *MD, CXXSpecialMemberKind CSM, TrivialABIHandling TAH=TrivialABIHandling::IgnoreTrivialABI, bool Diagnose=false)
Determine whether a defaulted or deleted special member function is trivial, as specified in C++11 [c...
NamedDecl * ActOnFriendFunctionDecl(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParams)
void setTagNameForLinkagePurposes(TagDecl *TagFromDeclSpec, TypedefNameDecl *NewTD)
void CheckDelayedMemberExceptionSpecs()
void ActOnReenterCXXMethodParameter(Scope *S, ParmVarDecl *Param)
This is used to implement the constant expression evaluation part of the attribute enable_if extensio...
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
void CleanupVarDeclMarking()
ASTContext & getASTContext() const
ClassTemplateDecl * StdInitializerList
The C++ "std::initializer_list" template, which is defined in <initializer_list>.
CXXDestructorDecl * LookupDestructor(CXXRecordDecl *Class)
Look for the destructor of the given class.
void CheckExplicitlyDefaultedFunction(Scope *S, FunctionDecl *MD)
bool isCurrentClassName(const IdentifierInfo &II, Scope *S, const CXXScopeSpec *SS=nullptr)
isCurrentClassName - Determine whether the identifier II is the name of the class type currently bein...
void MarkVariableReferenced(SourceLocation Loc, VarDecl *Var)
Mark a variable referenced, and check whether it is odr-used (C++ [basic.def.odr]p2,...
void checkExceptionSpecification(bool IsTopLevel, ExceptionSpecificationType EST, ArrayRef< ParsedType > DynamicExceptions, ArrayRef< SourceRange > DynamicExceptionRanges, Expr *NoexceptExpr, SmallVectorImpl< QualType > &Exceptions, FunctionProtoType::ExceptionSpecInfo &ESI)
Check the given exception-specification and update the exception specification information with the r...
SmallVector< std::pair< FunctionDecl *, FunctionDecl * >, 2 > DelayedEquivalentExceptionSpecChecks
All the function redeclarations seen during a class definition that had their exception spec checks d...
bool checkThisInStaticMemberFunctionType(CXXMethodDecl *Method)
Check whether 'this' shows up in the type of a static member function after the (naturally empty) cv-...
void PopExpressionEvaluationContext()
NamespaceDecl * getOrCreateStdNamespace()
Retrieve the special "std" namespace, which may require us to implicitly define the namespace.
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
bool isInitListConstructor(const FunctionDecl *Ctor)
Determine whether Ctor is an initializer-list constructor, as defined in [dcl.init....
void ActOnStartFunctionDeclarationDeclarator(Declarator &D, unsigned TemplateParameterDepth)
Called before parsing a function declarator belonging to a function declaration.
std::string getAmbiguousPathsDisplayString(CXXBasePaths &Paths)
Builds a string representing ambiguous paths from a specific derived class to different subobjects of...
DefaultedComparisonKind
Kinds of defaulted comparison operator functions.
@ Relational
This is an <, <=, >, or >= that should be implemented as a rewrite in terms of a <=> comparison.
@ NotEqual
This is an operator!= that should be implemented as a rewrite in terms of a == comparison.
@ ThreeWay
This is an operator<=> that should be implemented as a series of subobject comparisons.
@ None
This is not a defaultable comparison operator.
@ Equal
This is an operator== that should be implemented as a series of subobject comparisons.
OverloadKind CheckOverload(Scope *S, FunctionDecl *New, const LookupResult &OldDecls, NamedDecl *&OldDecl, bool UseMemberUsingDeclRules)
Determine whether the given New declaration is an overload of the declarations in Old.
bool RequireLiteralType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
Ensure that the type T is a literal type.
llvm::PointerIntPair< CXXRecordDecl *, 3, CXXSpecialMemberKind > SpecialMemberDecl
void ActOnStartCXXInClassMemberInitializer()
Enter a new C++ default initializer scope.
ValueDecl * tryLookupCtorInitMemberDecl(CXXRecordDecl *ClassDecl, CXXScopeSpec &SS, ParsedType TemplateTypeTy, IdentifierInfo *MemberOrBase)
NamedDecl * BuildUsingDeclaration(Scope *S, AccessSpecifier AS, SourceLocation UsingLoc, bool HasTypenameKeyword, SourceLocation TypenameLoc, CXXScopeSpec &SS, DeclarationNameInfo NameInfo, SourceLocation EllipsisLoc, const ParsedAttributesView &AttrList, bool IsInstantiation, bool IsUsingIfExists)
Builds a using declaration.
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
bool pushCodeSynthesisContext(CodeSynthesisContext Ctx)
DeclRefExpr * BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK, SourceLocation Loc, const CXXScopeSpec *SS=nullptr)
void DefineImplicitMoveConstructor(SourceLocation CurrentLocation, CXXConstructorDecl *Constructor)
DefineImplicitMoveConstructor - Checks for feasibility of defining this constructor as the move const...
@ TPL_TemplateMatch
We are matching the template parameter lists of two templates that might be redeclarations.
EnumDecl * getStdAlignValT() const
void ActOnFinishDelayedMemberDeclarations(Scope *S, Decl *Record)
LangAS getDefaultCXXMethodAddrSpace() const
Returns default addr space for method qualifiers.
LazyDeclPtr StdBadAlloc
The C++ "std::bad_alloc" class, which is defined by the C++ standard library.
QualType BuildQualifiedType(QualType T, SourceLocation Loc, Qualifiers Qs, const DeclSpec *DS=nullptr)
void PushFunctionScope()
Enter a new function scope.
void SetDeclDefaulted(Decl *dcl, SourceLocation DefaultLoc)
void DefineImplicitCopyConstructor(SourceLocation CurrentLocation, CXXConstructorDecl *Constructor)
DefineImplicitCopyConstructor - Checks for feasibility of defining this constructor as the copy const...
FPOptions & getCurFPFeatures()
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
ConditionResult ActOnCondition(Scope *S, SourceLocation Loc, Expr *SubExpr, ConditionKind CK, bool MissingOK=false)
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
@ UPPC_UsingDeclaration
A using declaration.
@ UPPC_ExceptionType
The type of an exception.
@ UPPC_Initializer
An initializer.
@ UPPC_BaseType
The base type of a class type.
@ UPPC_FriendDeclaration
A friend declaration.
@ UPPC_DefaultArgument
A default argument.
@ UPPC_DeclarationType
The type of an arbitrary declaration.
@ UPPC_DataMemberType
The type of a data member.
@ UPPC_StaticAssertExpression
The expression in a static assertion.
Decl * ActOnStartNamespaceDef(Scope *S, SourceLocation InlineLoc, SourceLocation NamespaceLoc, SourceLocation IdentLoc, IdentifierInfo *Ident, SourceLocation LBrace, const ParsedAttributesView &AttrList, UsingDirectiveDecl *&UsingDecl, bool IsNested)
ActOnStartNamespaceDef - This is called at the start of a namespace definition.
const LangOptions & getLangOpts() const
void DiagnoseTemplateParameterShadow(SourceLocation Loc, Decl *PrevDecl, bool SupportedForCompatibility=false)
DiagnoseTemplateParameterShadow - Produce a diagnostic complaining that the template parameter 'PrevD...
TypoCorrection CorrectTypo(const DeclarationNameInfo &Typo, Sema::LookupNameKind LookupKind, Scope *S, CXXScopeSpec *SS, CorrectionCandidateCallback &CCC, CorrectTypoKind Mode, DeclContext *MemberContext=nullptr, bool EnteringContext=false, const ObjCObjectPointerType *OPT=nullptr, bool RecordFailure=true)
Try to "correct" a typo in the source code by finding visible declarations whose names are similar to...
QualType CheckComparisonCategoryType(ComparisonCategoryType Kind, SourceLocation Loc, ComparisonCategoryUsage Usage)
Lookup the specified comparison category types in the standard library, an check the VarDecls possibl...
void DiagnoseAbsenceOfOverrideControl(NamedDecl *D, bool Inconsistent)
DiagnoseAbsenceOfOverrideControl - Diagnose if 'override' keyword was not used in the declaration of ...
SmallVector< VTableUse, 16 > VTableUses
The list of vtables that are required but have not yet been materialized.
PoppedFunctionScopePtr PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, Decl *D=nullptr, QualType BlockType=QualType())
Pop a function (or block or lambda or captured region) scope from the stack.
AccessResult CheckStructuredBindingMemberAccess(SourceLocation UseLoc, CXXRecordDecl *DecomposedClass, DeclAccessPair Field)
Checks implicit access to a member in a structured binding.
void EnterTemplatedContext(Scope *S, DeclContext *DC)
Enter a template parameter scope, after it's been associated with a particular DeclContext.
void ActOnBaseSpecifiers(Decl *ClassDecl, MutableArrayRef< CXXBaseSpecifier * > Bases)
ActOnBaseSpecifiers - Attach the given base specifiers to the class, after checking whether there are...
const FunctionProtoType * ResolveExceptionSpec(SourceLocation Loc, const FunctionProtoType *FPT)
void NoteTemplateLocation(const NamedDecl &Decl, std::optional< SourceRange > ParamRange={})
void DefineDefaultedComparison(SourceLocation Loc, FunctionDecl *FD, DefaultedComparisonKind DCK)
bool isEquivalentInternalLinkageDeclaration(const NamedDecl *A, const NamedDecl *B)
Determine if A and B are equivalent internal linkage declarations from different modules,...
bool LookupParsedName(LookupResult &R, Scope *S, CXXScopeSpec *SS, QualType ObjectType, bool AllowBuiltinCreation=false, bool EnteringContext=false)
Performs name lookup for a name that was parsed in the source code, and may contain a C++ scope speci...
bool CheckConstexprFunctionDefinition(const FunctionDecl *FD, CheckConstexprKind Kind)
ExprResult BuildCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallExpr - Handle a call to Fn with the specified array of arguments.
AccessResult CheckBaseClassAccess(SourceLocation AccessLoc, QualType Base, QualType Derived, const CXXBasePath &Path, unsigned DiagID, bool ForceCheck=false, bool ForceUnprivileged=false)
Checks access for a hierarchy conversion.
bool DiagnoseUnexpandedParameterPack(SourceLocation Loc, TypeSourceInfo *T, UnexpandedParameterPackContext UPPC)
If the given type contains an unexpanded parameter pack, diagnose the error.
bool RequireNonAbstractType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
bool BuildCtorClosureDefaultArgs(SourceLocation Loc, CXXConstructorDecl *Ctor, bool IsCopy=false)
NamedDecl * getShadowedDeclaration(const TypedefNameDecl *D, const LookupResult &R)
Return the declaration shadowed by the given typedef D, or null if it doesn't shadow any declaration ...
void AddBuiltinOperatorCandidates(OverloadedOperatorKind Op, SourceLocation OpLoc, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
AddBuiltinOperatorCandidates - Add the appropriate built-in operator overloads to the candidate set (...
void CheckExtraCXXDefaultArguments(Declarator &D)
CheckExtraCXXDefaultArguments - Check for any extra default arguments in the declarator,...
void CheckCompleteDecompositionDeclaration(DecompositionDecl *DD)
void checkClassLevelDLLAttribute(CXXRecordDecl *Class)
Check class-level dllimport/dllexport attribute.
const LangOptions & LangOpts
std::pair< Expr *, std::string > findFailedBooleanCondition(Expr *Cond)
Find the failed Boolean condition within a given Boolean constant expression, and describe it with a ...
void DiagnoseReturnInConstructorExceptionHandler(CXXTryStmt *TryBlock)
void MarkVirtualMembersReferenced(SourceLocation Loc, const CXXRecordDecl *RD, bool ConstexprOnly=false)
MarkVirtualMembersReferenced - Will mark all members of the given CXXRecordDecl referenced.
ExprResult CheckForImmediateInvocation(ExprResult E, FunctionDecl *Decl)
Wrap the expression in a ConstantExpr if it is a potential immediate invocation.
ExprResult TemporaryMaterializationConversion(Expr *E)
If E is a prvalue denoting an unmaterialized temporary, materialize it as an xvalue.
NamedDeclSetType UnusedPrivateFields
Set containing all declared private fields that are not used.
void DefineInheritingConstructor(SourceLocation UseLoc, CXXConstructorDecl *Constructor)
Define the specified inheriting constructor.
bool CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD, LookupResult &Previous, bool IsMemberSpecialization, bool DeclIsDefn)
Perform semantic checking of a new function declaration.
CXXRecordDecl * getStdBadAlloc() const
QualType CheckDestructorDeclarator(Declarator &D, QualType R, StorageClass &SC)
CheckDestructorDeclarator - Called by ActOnDeclarator to check the well-formednes of the destructor d...
bool CheckPureMethod(CXXMethodDecl *Method, SourceRange InitRange)
Mark the given method pure.
void SetParamDefaultArgument(ParmVarDecl *Param, Expr *DefaultArg, SourceLocation EqualLoc)
void NoteHiddenVirtualMethods(CXXMethodDecl *MD, SmallVectorImpl< CXXMethodDecl * > &OverloadedMethods)
CXXMethodDecl * DeclareImplicitMoveAssignment(CXXRecordDecl *ClassDecl)
Declare the implicit move assignment operator for the given class.
QualType CheckTypenameType(ElaboratedTypeKeyword Keyword, SourceLocation KeywordLoc, NestedNameSpecifierLoc QualifierLoc, const IdentifierInfo &II, SourceLocation IILoc, TypeSourceInfo **TSI, bool DeducedTSTContext)
llvm::DenseMap< CXXRecordDecl *, bool > VTablesUsed
The set of classes whose vtables have been used within this translation unit, and a bit that will be ...
void CheckCXXDefaultArguments(FunctionDecl *FD)
Helpers for dealing with blocks and functions.
@ DefaultedOperator
A defaulted 'operator<=>' needed the comparison category.
SmallVector< InventedTemplateParameterInfo, 4 > InventedParameterInfos
Stack containing information needed when in C++2a an 'auto' is encountered in a function declaration ...
void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse)
Perform marking for a reference to an arbitrary declaration.
void ProcessDeclAttributeList(Scope *S, Decl *D, const ParsedAttributesView &AttrList, const ProcessDeclAttributeOptions &Options=ProcessDeclAttributeOptions())
ProcessDeclAttributeList - Apply all the decl attributes in the specified attribute list to the speci...
void MarkVTableUsed(SourceLocation Loc, CXXRecordDecl *Class, bool DefinitionRequired=false)
Note that the vtable for the given class was used at the given location.
NamedDecl * BuildUsingEnumDeclaration(Scope *S, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation EnumLoc, SourceLocation NameLoc, TypeSourceInfo *EnumType, EnumDecl *ED)
TypeLoc getReturnTypeLoc(FunctionDecl *FD) const
SmallVector< std::pair< const CXXMethodDecl *, const CXXMethodDecl * >, 2 > DelayedOverridingExceptionSpecChecks
All the overriding functions seen during a class definition that had their exception spec checks dela...
llvm::DenseMap< ParmVarDecl *, SourceLocation > UnparsedDefaultArgLocs
void MarkVirtualMemberExceptionSpecsNeeded(SourceLocation Loc, const CXXRecordDecl *RD)
Mark the exception specifications of all virtual member functions in the given class as needed.
ExprResult BuildConvertedConstantExpression(Expr *From, QualType T, CCEKind CCE, NamedDecl *Dest=nullptr)
bool CheckDependentFriend(SourceLocation Loc, NestedNameSpecifier NNS, TemplateParameterList *FPL)
bool RequireCompleteEnumDecl(EnumDecl *D, SourceLocation L, CXXScopeSpec *SS=nullptr)
Require that the EnumDecl is completed with its enumerators defined or instantiated.
bool CheckOverloadedOperatorDeclaration(FunctionDecl *FnDecl)
CheckOverloadedOperatorDeclaration - Check whether the declaration of this overloaded operator is wel...
void MarkVirtualBaseDestructorsReferenced(SourceLocation Location, CXXRecordDecl *ClassDecl, llvm::SmallPtrSetImpl< const CXXRecordDecl * > *DirectVirtualBases=nullptr)
Mark destructors of virtual bases of this class referenced.
void ExitDeclaratorContext(Scope *S)
void PushUsingDirective(Scope *S, UsingDirectiveDecl *UDir)
void CheckConstructor(CXXConstructorDecl *Constructor)
CheckConstructor - Checks a fully-formed constructor for well-formedness, issuing any diagnostics req...
void DefineImplicitLambdaToBlockPointerConversion(SourceLocation CurrentLoc, CXXConversionDecl *Conv)
Define the "body" of the conversion from a lambda object to a block pointer.
void DefineImplicitDestructor(SourceLocation CurrentLocation, CXXDestructorDecl *Destructor)
DefineImplicitDestructor - Checks for feasibility of defining this destructor as the default destruct...
void DiagnoseNontrivial(const CXXRecordDecl *Record, CXXSpecialMemberKind CSM)
Diagnose why the specified class does not have a trivial special member of the given kind.
Decl * ActOnUsingEnumDeclaration(Scope *CurScope, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation EnumLoc, SourceRange TyLoc, const IdentifierInfo &II, ParsedType Ty, const CXXScopeSpec &SS)
void popCodeSynthesisContext()
CXXRecordDecl * getCurrentClass(Scope *S, const CXXScopeSpec *SS)
Get the class that is directly named by the current context.
bool EvaluateAsString(Expr *Message, APValue &Result, ASTContext &Ctx, StringEvaluationContext EvalContext, bool ErrorOnInvalidMessage)
QualType BuildReferenceType(QualType T, bool LValueRef, SourceLocation Loc, DeclarationName Entity)
Build a reference type.
TemplateArgumentLoc getTrivialTemplateArgumentLoc(const TemplateArgument &Arg, QualType NTTPType, SourceLocation Loc)
Allocate a TemplateArgumentLoc where all locations have been initialized to the given location.
ExprResult ActOnFinishTrailingRequiresClause(ExprResult ConstraintExpr)
bool checkThisInStaticMemberFunctionAttributes(CXXMethodDecl *Method)
Check whether 'this' shows up in the attributes of the given static member function.
CXXBaseSpecifier * CheckBaseSpecifier(CXXRecordDecl *Class, SourceRange SpecifierRange, bool Virtual, AccessSpecifier Access, TypeSourceInfo *TInfo, SourceLocation EllipsisLoc)
Check the validity of a C++ base class specifier.
UnparsedDefaultArgInstantiationsMap UnparsedDefaultArgInstantiations
A mapping from parameters with unparsed default arguments to the set of instantiations of each parame...
void DefineImplicitDefaultConstructor(SourceLocation CurrentLocation, CXXConstructorDecl *Constructor)
DefineImplicitDefaultConstructor - Checks for feasibility of defining this constructor as the default...
std::pair< CXXRecordDecl *, SourceLocation > VTableUse
The list of classes whose vtables have been used within this translation unit, and the source locatio...
ExprResult DefaultLvalueConversion(Expr *E)
bool CheckUsingShadowDecl(BaseUsingDecl *BUD, NamedDecl *Target, const LookupResult &PreviousDecls, UsingShadowDecl *&PrevShadow)
Determines whether to create a using shadow decl for a particular decl, given the set of decls existi...
ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R, bool NeedsADL, bool AcceptInvalidDecl=false)
bool isVisible(const NamedDecl *D)
Determine whether a declaration is visible to name lookup.
bool CheckDerivedToBaseConversion(QualType Derived, QualType Base, SourceLocation Loc, SourceRange Range, CXXCastPath *BasePath=nullptr, bool IgnoreAccess=false)
Module * getCurrentModule() const
Get the module unit whose scope we are currently within.
bool CheckDeductionGuideDeclarator(Declarator &D, QualType &R, StorageClass &SC)
Check the validity of a declarator that we parsed for a deduction-guide.
void DiagPlaceholderVariableDefinition(SourceLocation Loc)
void CheckForFunctionRedefinition(FunctionDecl *FD, const FunctionDecl *EffectiveDefinition=nullptr, SkipBodyInfo *SkipBody=nullptr)
bool DiagnoseUseOfOverloadedDecl(NamedDecl *D, SourceLocation Loc)
std::unique_ptr< RecordDeclSetTy > PureVirtualClassDiagSet
PureVirtualClassDiagSet - a set of class declarations which we have emitted a list of pure virtual fu...
void ActOnFinishInlineFunctionDef(FunctionDecl *D)
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
VarDecl * BuildExceptionDeclaration(Scope *S, TypeSourceInfo *TInfo, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id)
Perform semantic analysis for the variable declaration that occurs within a C++ catch clause,...
void ActOnDocumentableDecl(Decl *D)
Should be called on all declarations that might have attached documentation comments.
ClassTemplateDecl * StdTypeIdentity
The C++ "std::type_identity" template, which is defined in <type_traits>.
DeclarationNameInfo GetNameFromUnqualifiedId(const UnqualifiedId &Name)
Retrieves the declaration name from a parsed unqualified-id.
Decl * ActOnFriendTypeDecl(Scope *S, const DeclSpec &DS, MultiTemplateParamsArg TemplateParams, SourceLocation EllipsisLoc)
Handle a friend type declaration.
ExprResult PerformContextuallyConvertToBool(Expr *From)
PerformContextuallyConvertToBool - Perform a contextual conversion of the expression From to bool (C+...
void DefineImplicitCopyAssignment(SourceLocation CurrentLocation, CXXMethodDecl *MethodDecl)
Defines an implicitly-declared copy assignment operator.
bool CheckFunctionConstraints(const FunctionDecl *FD, ConstraintSatisfaction &Satisfaction, SourceLocation UsageLoc=SourceLocation(), bool ForOverloadResolution=false)
Check whether the given function decl's trailing requires clause is satisfied, if any.
bool SetDelegatingInitializer(CXXConstructorDecl *Constructor, CXXCtorInitializer *Initializer)
bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived, CXXRecordDecl *Base, CXXBasePaths &Paths)
Determine whether the type Derived is a C++ class that is derived from the type Base.
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
bool CheckLiteralOperatorDeclaration(FunctionDecl *FnDecl)
CheckLiteralOperatorDeclaration - Check whether the declaration of this literal operator function is ...
bool DefineUsedVTables()
Define all of the vtables that have been used in this translation unit and reference any virtual memb...
CXXMethodDecl * DeclareImplicitCopyAssignment(CXXRecordDecl *ClassDecl)
Declare the implicit copy assignment operator for the given class.
void checkIllFormedTrivialABIStruct(CXXRecordDecl &RD)
Check that the C++ class annoated with "trivial_abi" satisfies all the conditions that are needed for...
void MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base=nullptr)
Perform reference-marking and odr-use handling for a DeclRefExpr.
StmtResult ActOnForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, Stmt *First, ConditionResult Second, FullExprArg Third, SourceLocation RParenLoc, Stmt *Body)
unsigned ActOnReenterTemplateScope(Decl *Template, llvm::function_ref< Scope *()> EnterScope)
ExprResult BuildCXXConstructExpr(SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl, CXXConstructorDecl *Constructor, MultiExprArg Exprs, bool HadMultipleCandidates, bool IsListInitialization, bool IsStdInitListInitialization, bool RequiresZeroInit, CXXConstructionKind ConstructKind, SourceRange ParenRange)
BuildCXXConstructExpr - Creates a complete call to a constructor, including handling of its default a...
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
SourceManager & getSourceManager() const
FunctionDecl * SubstSpaceshipAsEqualEqual(CXXRecordDecl *RD, FunctionDecl *Spaceship)
Substitute the name and return type of a defaulted 'operator<=>' to form an implicit 'operator=='.
NamedDecl * ActOnDecompositionDeclarator(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParamLists)
ExprResult BuildFieldReferenceExpr(Expr *BaseExpr, bool IsArrow, SourceLocation OpLoc, const CXXScopeSpec &SS, FieldDecl *Field, DeclAccessPair FoundDecl, const DeclarationNameInfo &MemberNameInfo)
void diagnoseFunctionEffectMergeConflicts(const FunctionEffectSet::Conflicts &Errs, SourceLocation NewLoc, SourceLocation OldLoc)
void EnterDeclaratorContext(Scope *S, DeclContext *DC)
EnterDeclaratorContext - Used when we must lookup names in the context of a declarator's nested name ...
bool CheckExplicitlyDefaultedComparison(Scope *S, FunctionDecl *MD, DefaultedComparisonKind DCK)
bool checkThisInStaticMemberFunctionExceptionSpec(CXXMethodDecl *Method)
Whether this' shows up in the exception specification of a static member function.
void ActOnFinishCXXInClassMemberInitializer(Decl *VarDecl, SourceLocation EqualLoc, ExprResult Init)
This is invoked after parsing an in-class initializer for a non-static C++ class member,...
llvm::FoldingSet< SpecialMemberOverloadResultEntry > SpecialMemberCache
A cache of special member function overload resolution results for C++ records.
QualType BuildPackIndexingType(QualType Pattern, Expr *IndexExpr, SourceLocation Loc, SourceLocation EllipsisLoc, bool FullySubstituted=false, ArrayRef< QualType > Expansions={})
Decl * ActOnStartLinkageSpecification(Scope *S, SourceLocation ExternLoc, Expr *LangStr, SourceLocation LBraceLoc)
ActOnStartLinkageSpecification - Parsed the beginning of a C++ linkage specification,...
void FilterUsingLookup(Scope *S, LookupResult &lookup)
Remove decls we can't actually see from a lookup being used to declare shadow using decls.
Decl * ActOnExceptionDeclarator(Scope *S, Declarator &D)
ActOnExceptionDeclarator - Parsed the exception-declarator in a C++ catch handler.
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
ExprResult BuildCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *Init=nullptr)
BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating the default expr if needed.
void PushNamespaceVisibilityAttr(const VisibilityAttr *Attr, SourceLocation Loc)
PushNamespaceVisibilityAttr - Note that we've entered a namespace with a visibility attribute.
void ActOnDefaultCtorInitializers(Decl *CDtorDecl)
void ActOnMemInitializers(Decl *ConstructorDecl, SourceLocation ColonLoc, ArrayRef< CXXCtorInitializer * > MemInits, bool AnyErrors)
ActOnMemInitializers - Handle the member initializers for a constructor.
bool CheckTemplateDeclScope(Scope *S, TemplateParameterList *TemplateParams)
Check whether a template can be declared within this scope.
ExprResult PerformImplicitConversion(Expr *From, QualType ToType, const ImplicitConversionSequence &ICS, AssignmentAction Action, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
PerformImplicitConversion - Perform an implicit conversion of the expression From to the type ToType ...
void ActOnCXXEnterDeclInitializer(Scope *S, Decl *Dcl)
ActOnCXXEnterDeclInitializer - Invoked when we are about to parse an initializer for the declaration ...
FunctionDecl * BuildTypeAwareUsualDelete(FunctionTemplateDecl *FnDecl, QualType AllocType, SourceLocation)
void ActOnFinishCXXMemberSpecification(Scope *S, SourceLocation RLoc, Decl *TagDecl, SourceLocation LBrac, SourceLocation RBrac, const ParsedAttributesView &AttrList)
void CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl, const LookupResult &R)
Diagnose variable or built-in function shadowing.
void AdjustDestructorExceptionSpec(CXXDestructorDecl *Destructor)
Build an exception spec for destructors that don't have one.
Decl * ActOnStaticAssertDeclaration(SourceLocation StaticAssertLoc, Expr *AssertExpr, Expr *AssertMessageExpr, SourceLocation RParenLoc)
void DiagnoseUnknownAttribute(const ParsedAttr &AL)
StmtResult BuildReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp, bool AllowRecovery=false)
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
bool CheckImmediateEscalatingFunctionDefinition(FunctionDecl *FD, const sema::FunctionScopeInfo *FSI)
void CheckCompleteVariableDeclaration(VarDecl *VD)
ExprResult ActOnRequiresClause(ExprResult ConstraintExpr)
QualType CheckTemplateIdType(ElaboratedTypeKeyword Keyword, TemplateName Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs, Scope *Scope, bool ForNestedNameSpecifier)
void checkClassLevelCodeSegAttribute(CXXRecordDecl *Class)
bool isStdInitializerList(QualType Ty, QualType *Element)
Tests whether Ty is an instance of std::initializer_list and, if it is and Element is not NULL,...
RedeclarationKind forRedeclarationInCurContext() const
LazyDeclPtr StdNamespace
The C++ "std" namespace, where the standard library resides.
bool CheckUsingDeclRedeclaration(SourceLocation UsingLoc, bool HasTypenameKeyword, const CXXScopeSpec &SS, SourceLocation NameLoc, const LookupResult &Previous)
Checks that the given using declaration is not an invalid redeclaration.
void FinalizeVarWithDestructor(VarDecl *VD, CXXRecordDecl *DeclInit)
FinalizeVarWithDestructor - Prepare for calling destructor on the constructed variable.
ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, VerifyICEDiagnoser &Diagnoser, AllowFoldKind CanFold=AllowFoldKind::No)
VerifyIntegerConstantExpression - Verifies that an expression is an ICE, and reports the appropriate ...
IntrusiveRefCntPtr< ExternalSemaSource > ExternalSource
Source of additional semantic information.
void ActOnFinishCXXMemberDecls()
Perform any semantic analysis which needs to be delayed until all pending class member declarations h...
llvm::SmallPtrSet< const Decl *, 4 > ParsingInitForAutoVars
ParsingInitForAutoVars - a set of declarations with auto types for which we are currently parsing the...
void NoteDeletedFunction(FunctionDecl *FD)
Emit a note explaining that this function is deleted.
sema::AnalysisBasedWarnings AnalysisWarnings
Worker object for performing CFG-based warnings.
ExprResult CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc, Expr *Idx, SourceLocation RLoc)
Decl * ActOnFinishLinkageSpecification(Scope *S, Decl *LinkageSpec, SourceLocation RBraceLoc)
ActOnFinishLinkageSpecification - Complete the definition of the C++ linkage specification LinkageSpe...
bool CheckInheritingConstructorUsingDecl(UsingDecl *UD)
Additional checks for a using declaration referring to a constructor name.
@ ConstantEvaluated
The current context is "potentially evaluated" in C++11 terms, but the expression is evaluated at com...
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
QualType BuildDecltypeType(Expr *E, bool AsUnevaluated=true)
If AsUnevaluated is false, E is treated as though it were an evaluated context, such as when building...
TypeSourceInfo * GetTypeForDeclarator(Declarator &D)
GetTypeForDeclarator - Convert the type for the specified declarator to Type instances.
void diagnoseTypo(const TypoCorrection &Correction, const PartialDiagnostic &TypoDiag, bool ErrorRecovery=true)
DeclResult ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, const ParsedAttributesView &Attr, AccessSpecifier AS, SourceLocation ModulePrivateLoc, MultiTemplateParamsArg TemplateParameterLists, bool &OwnedDecl, bool &IsDependent, SourceLocation ScopedEnumKWLoc, bool ScopedEnumUsesClassTag, TypeResult UnderlyingType, bool IsTypeSpecifier, bool IsTemplateParamOrArg, OffsetOfKind OOK, SkipBodyInfo *SkipBody=nullptr)
This is invoked when we see 'struct foo' or 'struct {'.
void ActOnFinishNamespaceDef(Decl *Dcl, SourceLocation RBrace)
ActOnFinishNamespaceDef - This callback is called after a namespace is exited.
MemInitResult BuildMemInitializer(Decl *ConstructorD, Scope *S, CXXScopeSpec &SS, IdentifierInfo *MemberOrBase, ParsedType TemplateTypeTy, const DeclSpec &DS, SourceLocation IdLoc, Expr *Init, SourceLocation EllipsisLoc)
Handle a C++ member initializer.
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
void actOnDelayedExceptionSpecification(Decl *D, ExceptionSpecificationType EST, SourceRange SpecificationRange, ArrayRef< ParsedType > DynamicExceptions, ArrayRef< SourceRange > DynamicExceptionRanges, Expr *NoexceptExpr)
Add an exception-specification to the given member or friend function (or function template).
Scope * TUScope
Translation Unit Scope - useful to Objective-C actions that need to lookup file scope declarations in...
void ActOnFields(Scope *S, SourceLocation RecLoc, Decl *TagDecl, ArrayRef< Decl * > Fields, SourceLocation LBrac, SourceLocation RBrac, const ParsedAttributesView &AttrList)
void CheckExplicitObjectLambda(Declarator &D)
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
void NoteDeletedInheritingConstructor(CXXConstructorDecl *CD)
void PopPragmaVisibility(bool IsNamespaceEnd, SourceLocation EndLoc)
PopPragmaVisibility - Pop the top element of the visibility stack; used for '#pragma GCC visibility' ...
Expr * MaybeCreateExprWithCleanups(Expr *SubExpr)
MaybeCreateExprWithCleanups - If the current full-expression requires any cleanups,...
void checkInitializerLifetime(const InitializedEntity &Entity, Expr *Init)
Check that the lifetime of the initializer (and its subobjects) is sufficient for initializing the en...
void CheckCompletedCXXClass(Scope *S, CXXRecordDecl *Record)
Perform semantic checks on a class definition that has been completing, introducing implicitly-declar...
void DiscardCleanupsInEvaluationContext()
void PushDeclContext(Scope *S, DeclContext *DC)
Set the current declaration context until it gets popped.
bool CheckEquivalentExceptionSpec(FunctionDecl *Old, FunctionDecl *New)
void mergeDeclAttributes(NamedDecl *New, Decl *Old, AvailabilityMergeKind AMK=AvailabilityMergeKind::Redeclaration)
mergeDeclAttributes - Copy attributes from the Old decl to the New one.
bool isDependentScopeSpecifier(const CXXScopeSpec &SS)
SourceManager & SourceMgr
bool CheckDestructor(CXXDestructorDecl *Destructor)
CheckDestructor - Checks a fully-formed destructor definition for well-formedness,...
NamedDecl * BuildUsingPackDecl(NamedDecl *InstantiatedFrom, ArrayRef< NamedDecl * > Expansions)
MemInitResult ActOnMemInitializer(Decl *ConstructorD, Scope *S, CXXScopeSpec &SS, IdentifierInfo *MemberOrBase, ParsedType TemplateTypeTy, const DeclSpec &DS, SourceLocation IdLoc, SourceLocation LParenLoc, ArrayRef< Expr * > Args, SourceLocation RParenLoc, SourceLocation EllipsisLoc)
Handle a C++ member initializer using parentheses syntax.
void SetDeclDeleted(Decl *dcl, SourceLocation DelLoc, StringLiteral *Message=nullptr)
void ActOnStartDelayedCXXMethodDeclaration(Scope *S, Decl *Method)
ActOnStartDelayedCXXMethodDeclaration - We have completed parsing a top-level (non-nested) C++ class,...
DiagnosticsEngine & Diags
FullExprArg MakeFullDiscardedValueExpr(Expr *Arg)
TypeAwareAllocationMode ShouldUseTypeAwareOperatorNewOrDelete() const
CXXConstructorDecl * DeclareImplicitCopyConstructor(CXXRecordDecl *ClassDecl)
Declare the implicit copy constructor for the given class.
NamespaceDecl * getStdNamespace() const
llvm::SmallPtrSet< const CXXRecordDecl *, 8 > RecordDeclSetTy
void DeclareImplicitEqualityComparison(CXXRecordDecl *RD, FunctionDecl *Spaceship)
bool AttachBaseSpecifiers(CXXRecordDecl *Class, MutableArrayRef< CXXBaseSpecifier * > Bases)
Performs the actual work of attaching the given base class specifiers to a C++ class.
void ActOnCXXExitDeclInitializer(Scope *S, Decl *Dcl)
ActOnCXXExitDeclInitializer - Invoked after we are finished parsing an initializer for the declaratio...
static bool adjustContextForLocalExternDecl(DeclContext *&DC)
Adjust the DeclContext for a function or variable that might be a function-local external declaration...
SpecialMemberOverloadResult LookupSpecialMember(CXXRecordDecl *D, CXXSpecialMemberKind SM, bool ConstArg, bool VolatileArg, bool RValueThis, bool ConstThis, bool VolatileThis)
NamedDecl * ActOnTypedefNameDecl(Scope *S, DeclContext *DC, TypedefNameDecl *D, LookupResult &Previous, bool &Redeclaration)
ActOnTypedefNameDecl - Perform semantic checking for a declaration which declares a typedef-name,...
ExprResult ActOnIntegerConstant(SourceLocation Loc, int64_t Val)
ExprResult BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field)
Decl * ActOnEmptyDeclaration(Scope *S, const ParsedAttributesView &AttrList, SourceLocation SemiLoc)
Handle a C++11 empty-declaration and attribute-declaration.
friend class InitializationSequence
void diagnoseIgnoredQualifiers(unsigned DiagID, unsigned Quals, SourceLocation FallbackLoc, SourceLocation ConstQualLoc=SourceLocation(), SourceLocation VolatileQualLoc=SourceLocation(), SourceLocation RestrictQualLoc=SourceLocation(), SourceLocation AtomicQualLoc=SourceLocation(), SourceLocation UnalignedQualLoc=SourceLocation())
llvm::MapVector< NamedDecl *, SourceLocation > UndefinedButUsed
UndefinedInternals - all the used, undefined objects which require a definition in this translation u...
QualType CheckConstructorDeclarator(Declarator &D, QualType R, StorageClass &SC)
CheckConstructorDeclarator - Called by ActOnDeclarator to check the well-formedness of the constructo...
ExprResult ConvertParamDefaultArgument(ParmVarDecl *Param, Expr *DefaultArg, SourceLocation EqualLoc)
void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD)
ProcessDeclAttributes - Given a declarator (PD) with attributes indicated in it, apply them to D.
void FilterLookupForScope(LookupResult &R, DeclContext *Ctx, Scope *S, bool ConsiderLinkage, bool AllowInlineNamespace)
Filters out lookup results that don't fall within the given scope as determined by isDeclInScope.
ExprResult ConvertMemberDefaultInitExpression(FieldDecl *FD, Expr *InitExpr, SourceLocation InitLoc)
bool IsInvalidSMECallConversion(QualType FromType, QualType ToType)
void checkIncorrectVTablePointerAuthenticationAttribute(CXXRecordDecl &RD)
Check that VTable Pointer authentication is only being set on the first first instantiation of the vt...
static Scope * getScopeForDeclContext(Scope *S, DeclContext *DC)
Finds the scope corresponding to the given decl context, if it happens to be an enclosing scope.
bool isUsualDeallocationFunction(const CXXMethodDecl *FD)
void DiagnoseDeletedDefaultedFunction(FunctionDecl *FD)
Produce notes explaining why a defaulted function was defined as deleted.
ExprResult BuildCXXNamedCast(SourceLocation OpLoc, tok::TokenKind Kind, TypeSourceInfo *Ty, Expr *E, SourceRange AngleBrackets, SourceRange Parens)
bool CheckOverridingFunctionExceptionSpec(const CXXMethodDecl *New, const CXXMethodDecl *Old)
CheckOverridingFunctionExceptionSpec - Checks whether the exception spec is a subset of base spec.
SmallVector< CXXRecordDecl *, 4 > DelayedDllExportClasses
void MarkFunctionReferenced(SourceLocation Loc, FunctionDecl *Func, bool MightBeOdrUse=true)
Mark a function referenced, and check whether it is odr-used (C++ [basic.def.odr]p2,...
bool CheckTemplateParameterList(TemplateParameterList *NewParams, TemplateParameterList *OldParams, TemplateParamListContext TPC, SkipBodyInfo *SkipBody=nullptr)
Checks the validity of a template parameter list, possibly considering the template parameter list fr...
bool CheckOverridingFunctionReturnType(const CXXMethodDecl *New, const CXXMethodDecl *Old)
CheckOverridingFunctionReturnType - Checks whether the return types are covariant,...
ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())
Attempts to produce a RecoveryExpr after some AST node cannot be created.
UnsignedOrNone GetDecompositionElementCount(QualType DecompType, SourceLocation Loc)
DeclResult CheckClassTemplate(Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, const ParsedAttributesView &Attr, TemplateParameterList *TemplateParams, AccessSpecifier AS, SourceLocation ModulePrivateLoc, SourceLocation FriendLoc, unsigned NumOuterTemplateParamLists, TemplateParameterList **OuterTemplateParamLists, bool IsMemberSpecialization, SkipBodyInfo *SkipBody=nullptr)
Decl * ActOnDeclarator(Scope *S, Declarator &D)
MSPropertyDecl * HandleMSProperty(Scope *S, RecordDecl *TagD, SourceLocation DeclStart, Declarator &D, Expr *BitfieldWidth, InClassInitStyle InitStyle, AccessSpecifier AS, const ParsedAttr &MSPropertyAttr)
HandleMSProperty - Analyze a __delcspec(property) field of a C++ class.
void UpdateExceptionSpec(FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI)
bool CheckRedeclarationInModule(NamedDecl *New, NamedDecl *Old)
A wrapper function for checking the semantic restrictions of a redeclaration within a module.
LazyDeclPtr StdAlignValT
The C++ "std::align_val_t" enum class, which is defined by the C++ standard library.
void ActOnPureSpecifier(Decl *D, SourceLocation PureSpecLoc)
@ CheckValid
Identify whether this function satisfies the formal rules for constexpr functions in the current lanu...
@ Diagnose
Diagnose issues that are non-constant or that are extensions.
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
void LoadExternalVTableUses()
Load any externally-stored vtable uses.
static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo=nullptr)
Decl * ActOnUsingDirective(Scope *CurScope, SourceLocation UsingLoc, SourceLocation NamespcLoc, CXXScopeSpec &SS, SourceLocation IdentLoc, IdentifierInfo *NamespcName, const ParsedAttributesView &AttrList)
StmtResult ActOnCompoundStmt(SourceLocation L, SourceLocation R, ArrayRef< Stmt * > Elts, bool isStmtExpr)
void HandleFunctionTypeMismatch(PartialDiagnostic &PDiag, QualType FromType, QualType ToType)
HandleFunctionTypeMismatch - Gives diagnostic information for differeing function types.
void ActOnStartTrailingRequiresClause(Scope *S, Declarator &D)
void FindHiddenVirtualMethods(CXXMethodDecl *MD, SmallVectorImpl< CXXMethodDecl * > &OverloadedMethods)
Check if a method overloads virtual methods in a base class without overriding any.
IdentifierResolver IdResolver
DeclContextLookupResult LookupConstructors(CXXRecordDecl *Class)
Look up the constructors for the given class.
void ActOnStartDelayedMemberDeclarations(Scope *S, Decl *Record)
ExprResult ActOnCXXThis(SourceLocation Loc)
CXXConstructorDecl * findInheritingConstructor(SourceLocation Loc, CXXConstructorDecl *BaseCtor, ConstructorUsingShadowDecl *DerivedShadow)
Given a derived-class using shadow declaration for a constructor and the correspnding base class cons...
void warnOnReservedIdentifier(const NamedDecl *D)
bool CheckExplicitlyDefaultedSpecialMember(CXXMethodDecl *MD, CXXSpecialMemberKind CSM, SourceLocation DefaultLoc)
bool isCurrentClassNameTypo(IdentifierInfo *&II, const CXXScopeSpec *SS)
Determine whether the identifier II is a typo for the name of the class type currently being defined.
Decl * ActOnUsingDeclaration(Scope *CurScope, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation TypenameLoc, CXXScopeSpec &SS, UnqualifiedId &Name, SourceLocation EllipsisLoc, const ParsedAttributesView &AttrList)
void ActOnDelayedCXXMethodParameter(Scope *S, Decl *Param)
ActOnDelayedCXXMethodParameter - We've already started a delayed C++ method declaration.
bool isAbstractType(SourceLocation Loc, QualType T)
ValueDecl * tryLookupUnambiguousFieldDecl(RecordDecl *ClassDecl, const IdentifierInfo *MemberOrBase)
ASTMutationListener * getASTMutationListener() const
bool SetCtorInitializers(CXXConstructorDecl *Constructor, bool AnyErrors, ArrayRef< CXXCtorInitializer * > Initializers={})
void DiagnoseImmediateEscalatingReason(FunctionDecl *FD)
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
CXXDestructorDecl * DeclareImplicitDestructor(CXXRecordDecl *ClassDecl)
Declare the implicit destructor for the given class.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
static StaticAssertDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StaticAssertLoc, Expr *AssertExpr, Expr *Message, SourceLocation RParenLoc, bool Failed)
Stmt - This represents one statement.
SourceLocation getEndLoc() const LLVM_READONLY
StmtClass getStmtClass() const
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
static bool isValidUDSuffix(const LangOptions &LangOpts, StringRef Suffix)
Determine whether a suffix is a valid ud-suffix.
StringLiteral - This represents a string literal expression, e.g.
bool isUnevaluated() const
StringRef getString() const
Represents the declaration of a struct/union/class/enum.
bool isBeingDefined() const
Return true if this decl is currently being defined.
StringRef getKindName() const
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
TagDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
TagKind getTagKind() const
bool isDependentType() const
Whether this declaration declares a type that is dependent, i.e., a type that somehow depends on temp...
void setElaboratedKeywordLoc(SourceLocation Loc)
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
A convenient class for passing around template argument information.
void addArgument(const TemplateArgumentLoc &Loc)
ArrayRef< TemplateArgumentLoc > arguments() const
Location wrapper for a TemplateArgument.
const TemplateArgument & getArgument() const
TypeSourceInfo * getTypeSourceInfo() const
Represents a template argument.
@ Type
The template argument is a type.
ArgKind getKind() const
Return the kind of stored template argument.
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
QualifiedTemplateName * getAsQualifiedTemplateName() const
Retrieve the underlying qualified template name structure, if any.
Stores a list of template parameters for a TemplateDecl and its derived classes.
NamedDecl * getParam(unsigned Idx)
SourceRange getSourceRange() const LLVM_READONLY
unsigned getDepth() const
Get the depth of this template parameter list in the set of template parameter lists.
unsigned getMinRequiredArguments() const
Returns the minimum number of arguments needed to form a template specialization.
static TemplateParameterList * Create(const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)
Expr * getRequiresClause()
The constraint-expression of the associated requires-clause.
SourceLocation getRAngleLoc() const
SourceLocation getLAngleLoc() const
static bool shouldIncludeTypeForArgument(const PrintingPolicy &Policy, const TemplateParameterList *TPL, unsigned Idx)
SourceLocation getTemplateLoc() const
unsigned getNumArgs() const
TemplateArgumentLoc getArgLoc(unsigned i) const
Declaration of a template type parameter.
unsigned getIndex() const
Retrieve the index of the template parameter.
unsigned getDepth() const
Retrieve the depth of the template parameter.
The top declaration context.
Represents the declaration of a typedef-name via a C++11 alias-declaration.
static TypeAliasDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)
void setDescribedAliasTemplate(TypeAliasTemplateDecl *TAT)
Declaration of an alias template.
static TypeAliasTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
Create a function template node.
TypeAliasDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
Represents a declaration of a type.
TyLocType push(QualType T)
Pushes space for a new TypeLoc of the given type.
TypeSpecTypeLoc pushTypeSpec(QualType T)
Pushes space for a typespec TypeLoc.
TypeSourceInfo * getTypeSourceInfo(ASTContext &Context, QualType T)
Creates a TypeSourceInfo for the given type.
Base wrapper for a particular "section" of type source info.
QualType getType() const
Get the type for which this source info wrapper provides information.
TypeLoc getNextTypeLoc() const
Get the next TypeLoc pointed by this TypeLoc, e.g for "int*" the TypeLoc is a PointerLoc and next Typ...
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
TypeLoc IgnoreParens() const
T castAs() const
Convert to the specified TypeLoc type, asserting that this TypeLoc is of the desired type.
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
SourceRange getLocalSourceRange() const
Get the local source range.
TypeLocClass getTypeLocClass() const
SourceLocation getEndLoc() const
Get the end source location.
T getAsAdjusted() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
SourceLocation getBeginLoc() const
Get the begin source location.
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
QualType getType() const
Return the type wrapped by this type source info.
void setNameLoc(SourceLocation Loc)
The base class of the type hierarchy.
bool isBooleanType() const
const TemplateSpecializationType * getAsNonAliasTemplateSpecializationType() const
Look through sugar for an instance of TemplateSpecializationType which is not a type alias,...
bool isIncompleteArrayType() const
bool isUndeducedAutoType() const
bool isRValueReferenceType() const
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isPointerType() const
CanQualType getCanonicalTypeUnqualified() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isEnumeralType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
TagDecl * getAsTagDecl() const
Retrieves the TagDecl that this type refers to, either because the type is a TagType or because it is...
bool isLValueReferenceType() const
bool isSpecificBuiltinType(unsigned K) const
Test for a particular builtin type.
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
QualType getCanonicalTypeInternal() const
const Type * getBaseElementTypeUnsafe() const
Get the base element type of this type, potentially discarding type qualifiers.
bool isFunctionProtoType() const
bool isOverloadableType() const
Determines whether this is a type for which one can define an overloaded operator.
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
EnumDecl * getAsEnumDecl() const
Retrieves the EnumDecl this type refers to.
bool isFunctionType() const
bool isStructureOrClassType() const
bool isRealFloatingType() const
Floating point categories.
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
bool isUnsignedIntegerType() const
Return true if this is an integer type that is unsigned, according to C99 6.2.5p6 [which returns true...
const T * getAs() const
Member-template getAs<specific type>'.
bool isRecordType() const
Base class for declarations which introduce a typedef-name.
QualType getUnderlyingType() const
Wrapper for source info for typedefs.
Simple class containing the result of Sema::CorrectTypo.
NamedDecl * getCorrectionDecl() const
Gets the pointer to the declaration of the typo correction.
SourceRange getCorrectionRange() const
void WillReplaceSpecifier(bool ForceReplacement)
DeclClass * getCorrectionDeclAs() const
NestedNameSpecifier getCorrectionSpecifier() const
Gets the NestedNameSpecifier needed to use the typo correction.
NamedDecl * getFoundDecl() const
Get the correction declaration found by name lookup (before we looked through using shadow declaratio...
Expr * getSubExpr() const
static bool isIncrementDecrementOp(Opcode Op)
static UnaryOperator * Create(const ASTContext &C, Expr *input, Opcode opc, QualType type, ExprValueKind VK, ExprObjectKind OK, SourceLocation l, bool CanOverflow, FPOptionsOverride FPFeatures)
Represents a C++ unqualified-id that has been parsed.
UnionParsedType ConversionFunctionId
When Kind == IK_ConversionFunctionId, the type that the conversion function names.
SourceLocation getBeginLoc() const LLVM_READONLY
SourceRange getSourceRange() const LLVM_READONLY
Return the source range that covers this unqualified-id.
UnionParsedType DestructorName
When Kind == IK_DestructorName, the type referred to by the class-name.
SourceLocation StartLocation
The location of the first token that describes this unqualified-id, which will be the location of the...
UnionParsedTemplateTy TemplateName
When Kind == IK_DeductionGuideName, the parsed template-name.
const IdentifierInfo * Identifier
When Kind == IK_Identifier, the parsed identifier, or when Kind == IK_UserLiteralId,...
UnqualifiedIdKind getKind() const
Determine what kind of name we have.
TemplateIdAnnotation * TemplateId
When Kind == IK_TemplateId or IK_ConstructorTemplateId, the template-id annotation that contains the ...
static UnresolvedLookupExpr * Create(const ASTContext &Context, CXXRecordDecl *NamingClass, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool RequiresADL, UnresolvedSetIterator Begin, UnresolvedSetIterator End, bool KnownDependent, bool KnownInstantiationDependent)
A set of unresolved declarations.
ArrayRef< DeclAccessPair > pairs() const
The iterator over UnresolvedSets.
A set of unresolved declarations.
This node is generated when a using-declaration that was annotated with attribute((using_if_exists)) ...
static UnresolvedUsingIfExistsDecl * Create(ASTContext &Ctx, DeclContext *DC, SourceLocation Loc, DeclarationName Name)
Wrapper for source info for unresolved typename using decls.
static UnresolvedUsingTypenameDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, SourceLocation TypenameLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TargetNameLoc, DeclarationName TargetName, SourceLocation EllipsisLoc)
static UnresolvedUsingValueDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, SourceLocation EllipsisLoc)
Represents a C++ using-declaration.
bool hasTypename() const
Return true if the using declaration has 'typename'.
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name.
DeclarationNameInfo getNameInfo() const
static UsingDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingL, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool HasTypenameKeyword)
SourceLocation getUsingLoc() const
Return the source location of the 'using' keyword.
Represents C++ using-directive.
static UsingDirectiveDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, SourceLocation NamespaceLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc, NamedDecl *Nominated, DeclContext *CommonAncestor)
Represents a C++ using-enum-declaration.
static UsingEnumDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingL, SourceLocation EnumL, SourceLocation NameL, TypeSourceInfo *EnumType)
static UsingPackDecl * Create(ASTContext &C, DeclContext *DC, NamedDecl *InstantiatedFrom, ArrayRef< NamedDecl * > UsingDecls)
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
static UsingShadowDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation Loc, DeclarationName Name, BaseUsingDecl *Introducer, NamedDecl *Target)
NamedDecl * getTargetDecl() const
Gets the underlying declaration which has been brought into the local scope.
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
BaseUsingDecl * getIntroducer() const
Gets the (written or instantiated) using declaration that introduced this declaration.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
void setType(QualType newType)
bool isParameterPack() const
Determine whether this value is actually a function parameter pack, init-capture pack,...
Represents a variable declaration or definition.
VarTemplateDecl * getDescribedVarTemplate() const
Retrieves the variable template that is described by this variable declaration.
static VarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S)
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
DefinitionKind isThisDeclarationADefinition(ASTContext &) const
Check whether this declaration is a definition.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool isNoDestroy(const ASTContext &) const
Is destruction of this variable entirely suppressed?
bool isInlineSpecified() const
bool isStaticDataMember() const
Determines whether this is a static data member.
bool hasGlobalStorage() const
Returns true for all variables that do not have local storage.
bool evaluateDestruction(SmallVectorImpl< PartialDiagnosticAt > &Notes) const
Evaluate the destruction of this variable to determine if it constitutes constant destruction.
bool isStaticLocal() const
Returns true if a variable with function scope is a static local variable.
QualType::DestructionKind needsDestruction(const ASTContext &Ctx) const
Would the destruction of this variable have any effect, and if so, what kind?
ThreadStorageClassSpecifier getTSCSpec() const
const Expr * getInit() const
const APValue * evaluateValue() const
Attempt to evaluate the value of the initializer attached to this declaration, and produce notes expl...
@ TLS_Dynamic
TLS with a dynamic initializer.
StorageClass getStorageClass() const
Returns the storage class as written in the source.
bool isUsableInConstantExpressions(const ASTContext &C) const
Determine whether this variable's value can be used in a constant expression, according to the releva...
void setExceptionVariable(bool EV)
Declaration of a variable template.
Represents a GCC generic vector type.
unsigned getNumElements() const
QualType getElementType() const
Represents a C++11 virt-specifier-seq.
SourceLocation getOverrideLoc() const
SourceLocation getLastLocation() const
bool isOverrideSpecified() const
SourceLocation getFinalLoc() const
bool isFinalSpecified() const
bool isFinalSpelledSealed() const
Retains information about a function, method, or block that is currently being parsed.
bool FoundImmediateEscalatingExpression
Whether we found an immediate-escalating expression.
Provides information about an attempted template argument deduction, whose success or failure was des...
Defines the clang::TargetInfo interface.
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
bool Comp(InterpState &S)
1) Pops the value from the stack.
bool Inc(InterpState &S, CodePtr OpPC, bool CanOverflow)
1) Pops a pointer from the stack 2) Load the value from the pointer 3) Writes the value increased by ...
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
The JSON file list parser is used to communicate input to InstallAPI.
bool FTIHasNonVoidParameters(const DeclaratorChunk::FunctionTypeInfo &FTI)
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
@ TST_typename_pack_indexing
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ OO_None
Not an overloaded operator.
@ NUM_OVERLOADED_OPERATORS
@ NonFunction
This is not an overload because the lookup results contain a non-function.
@ Match
This is not an overload because the signature exactly matches an existing declaration.
@ Overload
This is a legitimate overload: the existing declarations are functions or function templates with dif...
bool isa(CodeGen::Address addr)
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
MutableArrayRef< TemplateParameterList * > MultiTemplateParamsArg
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
@ OR_Deleted
Succeeded, but refers to a deleted function.
@ OR_Success
Overload resolution succeeded.
@ OR_Ambiguous
Ambiguous candidates found.
@ OR_No_Viable_Function
No viable function found.
ConstexprSpecKind
Define the kind of constexpr specifier.
LinkageSpecLanguageIDs
Represents the language in a linkage specification.
@ Ambiguous
Name lookup results in an ambiguity; use getAmbiguityKind to figure out what kind of ambiguity we hav...
@ NotFound
No entity found met the criteria.
@ FoundOverloaded
Name lookup found a set of overloaded functions that met the criteria.
@ Found
Name lookup found a single declaration that met the criteria.
@ FoundUnresolvedValue
Name lookup found an unresolvable value declaration and cannot yet complete.
@ NotFoundInCurrentInstantiation
No entity found met the criteria within the current instantiation,, but there were dependent base cla...
LLVM_READONLY auto escapeCStyle(CharT Ch) -> StringRef
Return C-style escaped string for special characters, or an empty string if there is no such mapping.
@ Comparison
A comparison.
InClassInitStyle
In-class initialization styles for non-static data members.
@ ICIS_ListInit
Direct list-initialization.
@ ICIS_NoInit
No in-class initializer.
@ RQ_None
No ref-qualifier was provided.
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
@ OCD_AmbiguousCandidates
Requests that only tied-for-best candidates be shown.
@ OCD_AllCandidates
Requests that all candidates be shown.
@ OK_Ordinary
An ordinary object is located at an address in memory.
@ Redeclaration
Merge availability attributes for a redeclaration, which requires an exact match.
std::pair< llvm::PointerUnion< const TemplateTypeParmType *, NamedDecl *, const TemplateSpecializationType *, const SubstBuiltinTemplatePackType * >, SourceLocation > UnexpandedParameterPack
@ If
'if' clause, allowed on all the Compute Constructs, Data Constructs, Executable Constructs,...
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
@ Delete
'delete' clause, allowed on the 'exit data' construct.
@ IK_DeductionGuideName
A deduction-guide name (a template-name)
@ IK_ImplicitSelfParam
An implicit 'self' parameter.
@ IK_TemplateId
A template-id, e.g., f<int>.
@ IK_ConstructorTemplateId
A constructor named via a template-id.
@ IK_ConstructorName
A constructor name.
@ IK_LiteralOperatorId
A user-defined literal name, e.g., operator "" _i.
@ IK_Identifier
An identifier.
@ IK_DestructorName
A destructor name.
@ IK_OperatorFunctionId
An overloaded operator name, e.g., operator+.
@ IK_ConversionFunctionId
A conversion function name, e.g., operator int.
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
std::optional< ComparisonCategoryType > getComparisonCategoryForBuiltinCmp(QualType T)
Get the comparison category that should be used when comparing values of type T.
ActionResult< Decl * > DeclResult
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
StorageClass
Storage classes.
ComparisonCategoryType commonComparisonType(ComparisonCategoryType A, ComparisonCategoryType B)
Determine the common comparison type, as defined in C++2a [class.spaceship]p4.
@ Dependent
Parse the block as a dependent block, which may be used in some template instantiations but not other...
ComparisonCategoryResult
An enumeration representing the possible results of a three-way comparison.
MutableArrayRef< Expr * > MultiExprArg
Language
The language for the input, used to select and validate the language standard and possible actions.
@ Default
Set to the current date and time.
@ Result
The result type of a method or function.
ActionResult< ParsedType > TypeResult
std::pair< unsigned, unsigned > getDepthAndIndex(const NamedDecl *ND)
Retrieve the depth and index of a template parameter.
InheritableAttr * getDLLAttr(Decl *D)
Return a DLL attribute from the declaration.
ActionResult< CXXCtorInitializer * > MemInitResult
OptionalUnsigned< unsigned > UnsignedOrNone
llvm::Expected< QualType > ExpectedType
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
@ Template
We are parsing a template declaration.
ActionResult< CXXBaseSpecifier * > BaseResult
void EscapeStringForDiagnostic(StringRef Str, SmallVectorImpl< char > &OutStr)
EscapeStringForDiagnostic - Append Str to the diagnostic buffer, escaping non-printable characters an...
ReservedLiteralSuffixIdStatus
TagTypeKind
The kind of a tag type.
@ Interface
The "__interface" keyword.
@ Struct
The "struct" keyword.
@ Class
The "class" keyword.
@ Keyword
The name has been typo-corrected to a keyword.
@ Type
The name was classified as a type.
LangAS
Defines the address space values used by the address space qualifier of QualType.
@ CanPassInRegs
The argument of this type can be passed directly in registers.
@ CanNeverPassInRegs
The argument of this type cannot be passed directly in registers.
@ CannotPassInRegs
The argument of this type cannot be passed directly in registers.
@ TU_Prefix
The translation unit is a prefix to a translation unit, and is not complete.
ComparisonCategoryType
An enumeration representing the different comparison categories types.
CXXSpecialMemberKind
Kinds of C++ special members.
OverloadedOperatorKind getRewrittenOverloadedOperator(OverloadedOperatorKind Kind)
Get the other overloaded operator that the given operator can be rewritten into, if any such operator...
@ TNK_Concept_template
The name refers to a concept.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
DynamicRecursiveASTVisitorBase< false > DynamicRecursiveASTVisitor
@ ConsiderTrivialABI
The triviality of a method affected by "trivial_abi".
@ IgnoreTrivialABI
The triviality of a method unaffected by "trivial_abi".
@ Incomplete
Template argument deduction did not deduce a value for every template parameter.
@ Success
Template argument deduction was successful.
@ Inconsistent
Template argument deduction produced inconsistent deduced values for the given template parameter.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
CallingConv
CallingConv - Specifies the calling convention that a function uses.
TypeAwareAllocationMode typeAwareAllocationModeFromBool(bool IsTypeAwareAllocation)
U cast(CodeGen::Address addr)
@ StaticAssertMessageData
Call to data() in a static assert message.
@ StaticAssertMessageSize
Call to size() in a static assert message.
@ ExplicitBool
Condition in an explicit(bool) specifier.
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
@ None
No keyword precedes the qualified type name.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
bool isLambdaMethod(const DeclContext *DC)
bool isExternallyVisible(Linkage L)
ActionResult< Expr * > ExprResult
ExceptionSpecificationType
The various types of exception specifications that exist in C++11.
@ EST_DependentNoexcept
noexcept(expression), value-dependent
@ EST_Uninstantiated
not instantiated yet
@ EST_Unparsed
not parsed yet
@ EST_NoThrow
Microsoft __declspec(nothrow) extension.
@ EST_None
no exception specification
@ EST_MSAny
Microsoft throw(...) extension.
@ EST_BasicNoexcept
noexcept
@ EST_NoexceptFalse
noexcept(expression), evals to 'false'
@ EST_Unevaluated
not evaluated yet, for special member function
@ EST_NoexceptTrue
noexcept(expression), evals to 'true'
@ EST_Dynamic
throw(T1, T2)
ActionResult< Stmt * > StmtResult
@ NOUR_Unevaluated
This name appears in an unevaluated operand.
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Represents an element in a path from a derived class to a base class.
bool hasValidIntValue() const
True iff we've successfully evaluated the variable as a constant expression and extracted its integer...
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
DeclarationName getName() const
getName - Returns the embedded declaration name.
void setNamedTypeInfo(TypeSourceInfo *TInfo)
setNamedTypeInfo - Sets the source type info associated to the name.
void setName(DeclarationName N)
setName - Sets the embedded declaration name.
SourceLocation getBeginLoc() const
getBeginLoc - Retrieve the location of the first token.
SourceRange getSourceRange() const LLVM_READONLY
getSourceRange - The range of the declaration name.
SourceLocation getEndLoc() const LLVM_READONLY
bool containsUnexpandedParameterPack() const
Determine whether this name contains an unexpanded parameter pack.
unsigned isVariadic
isVariadic - If this function has a prototype, and if that proto ends with ',...)',...
ParamInfo * Params
Params - This is a pointer to a new[]'d array of ParamInfo objects that describe the parameters speci...
unsigned RefQualifierIsLValueRef
Whether the ref-qualifier (if any) is an lvalue reference.
DeclSpec * MethodQualifiers
DeclSpec for the function with the qualifier related info.
SourceLocation getRefQualifierLoc() const
Retrieve the location of the ref-qualifier, if any.
unsigned NumParams
NumParams - This is the number of formal parameters specified by the declarator.
bool hasMutableQualifier() const
Determine whether this lambda-declarator contains a 'mutable' qualifier.
bool hasMethodTypeQualifiers() const
Determine whether this method has qualifiers.
void freeParams()
Reset the parameter list to having zero parameters.
bool hasRefQualifier() const
Determine whether this function declaration contains a ref-qualifier.
std::unique_ptr< CachedTokens > DefaultArgTokens
DefaultArgTokens - When the parameter's default argument cannot be parsed immediately (because it occ...
One instance of this struct is used for each type in a declarator that is parsed.
SourceRange getSourceRange() const
enum clang::DeclaratorChunk::@340323374315200305336204205154073066142310370142 Kind
EvalResult is a struct with detailed info about an evaluated expression.
A simple structure that captures a vtable use for the purposes of the ExternalSemaSource.
Holds information about the various types of exception specification.
FunctionDecl * SourceDecl
The function whose exception specification this is, for EST_Unevaluated and EST_Uninstantiated.
ExceptionSpecificationType Type
The kind of exception specification this is.
ArrayRef< QualType > Exceptions
Explicitly-specified list of exception types.
Expr * NoexceptExpr
Noexcept expression, if this is a computed noexcept specification.
Extra information about a function prototype.
ExceptionSpecInfo ExceptionSpec
FunctionEffectsRef FunctionEffects
RefQualifierKind RefQualifier
FunctionType::ExtInfo ExtInfo
static StringRef getTagTypeKindName(TagTypeKind Kind)
static ElaboratedTypeKeyword getKeywordForTagTypeKind(TagTypeKind Tag)
Converts a TagTypeKind into an elaborated type keyword.
static TagTypeKind getTagTypeKindForTypeSpec(unsigned TypeSpec)
Converts a type specifier (DeclSpec::TST) into a tag type kind.
Describes how types, statements, expressions, and declarations should be printed.
A context in which code is being synthesized (where a source location alone is not sufficient to iden...
enum clang::Sema::CodeSynthesisContext::SynthesisKind Kind
SourceLocation PointOfInstantiation
The point of instantiation or synthesis within the source code.
@ MarkingClassDllexported
We are marking a class as __dllexport.
@ InitializingStructuredBinding
We are initializing a structured binding.
@ ExceptionSpecEvaluation
We are computing the exception specification for a defaulted special member function.
@ DeclaringImplicitEqualityComparison
We are declaring an implicit 'operator==' for a defaulted 'operator<=>'.
Decl * Entity
The entity that is being synthesized.
Abstract class used to diagnose incomplete types.
virtual void diagnose(Sema &S, SourceLocation Loc, QualType T)=0
Information about a template-id annotation token.
TemplateNameKind Kind
The kind of template that Template refers to.
SourceLocation TemplateNameLoc
TemplateNameLoc - The location of the template name within the source.
SourceLocation RAngleLoc
The location of the '>' after the template argument list.
SourceLocation LAngleLoc
The location of the '<' before the template argument list.
OpaquePtr< T > get() const