A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://clang.llvm.org/doxygen/SemaDeclCXX_8cpp_source.html below:

clang: lib/Sema/SemaDeclCXX.cpp Source File

49#include "llvm/ADT/ArrayRef.h" 50#include "llvm/ADT/STLExtras.h" 51#include "llvm/ADT/STLForwardCompat.h" 52#include "llvm/ADT/StringExtras.h" 53#include "llvm/Support/ConvertUTF.h" 54#include "llvm/Support/SaveAndRestore.h" 59using namespace clang

;

71class

CheckDefaultArgumentVisitor

74 const Expr

*DefaultArg;

77

CheckDefaultArgumentVisitor(

Sema

&S,

const Expr

*DefaultArg)

78

: S(S), DefaultArg(DefaultArg) {}

83 bool

VisitLambdaExpr(

const LambdaExpr

*Lambda);

88bool

CheckDefaultArgumentVisitor::VisitExpr(

const Expr

*

Node

) {

89 bool

IsInvalid =

false

;

90 for

(

const Stmt

*SubStmt :

Node

->children())

92

IsInvalid |= Visit(SubStmt);

99bool

CheckDefaultArgumentVisitor::VisitDeclRefExpr(

const DeclRefExpr

*DRE) {

102 if

(!isa<VarDecl, BindingDecl>(

Decl

))

105 if

(

const auto

*Param = dyn_cast<ParmVarDecl>(

Decl

)) {

116

diag::err_param_default_argument_references_param)

117

<< Param->getDeclName() << DefaultArg->getSourceRange();

118

}

else if

(

auto

*VD =

Decl

->getPotentiallyDecomposedVarDecl()) {

133

diag::err_param_default_argument_references_local)

140bool

CheckDefaultArgumentVisitor::VisitCXXThisExpr(

const CXXThisExpr

*ThisE) {

145

diag::err_param_default_argument_references_this)

149bool

CheckDefaultArgumentVisitor::VisitPseudoObjectExpr(

154 if

(

const auto

*OVE = dyn_cast<OpaqueValueExpr>(

E

)) {

155 E

= OVE->getSourceExpr();

156

assert(

E

&&

"pseudo-object binding without source expression?"

);

164bool

CheckDefaultArgumentVisitor::VisitLambdaExpr(

const LambdaExpr

*Lambda) {

173 return

S.

Diag

(LC.getLocation(), diag::err_lambda_capture_default_arg);

175 auto

*

D

= cast<VarDecl>(LC.getCapturedVar());

186 if

(!Method || ComputedEST ==

EST_MSAny

)

208

llvm_unreachable(

"should not see unresolved exception specs here"

);

237 "should not generate implicit declarations for dependent cases"

);

241

assert(EST ==

EST_Dynamic

&&

"EST case not considered earlier."

);

243 "Shouldn't collect exceptions when throw-all is guaranteed."

);

248

Exceptions.push_back(

E

);

276 if

(

Self

->canThrow(S))

283

diag::err_typecheck_decl_incomplete_type))

302

CheckCompletedExpr(Arg, EqualLoc);

315

UnparsedDefaultArgInstantiationsMap::iterator InstPos

318 for

(

unsigned

I = 0, N = InstPos->second.size(); I != N; ++I)

319

InstPos->second[I]->setUninstantiatedDefaultArg(Arg);

329 if

(!param || !DefaultArg)

337 Diag

(EqualLoc, diag::err_param_default_argument)

350 Diag

(EqualLoc, diag::err_param_default_argument_on_parameter_pack)

364

CheckDefaultArgumentVisitor DefaultArgChecker(*

this

, DefaultArg);

365 if

(DefaultArgChecker.Visit(DefaultArg))

396

Param->

getType

().getNonReferenceType());

409 bool

MightBeFunction =

D

.isFunctionDeclarationContext();

410 for

(

unsigned

i = 0, e =

D

.getNumTypeObjects(); i != e; ++i) {

413 if

(MightBeFunction) {

417

MightBeFunction =

false

;

420 for

(

unsigned

argIdx = 0, e = chunk.

Fun

.

NumParams

; argIdx != e;

424

std::unique_ptr<CachedTokens> Toks =

427 if

(Toks->size() > 1)

429

Toks->back().getLocation());

432 Diag

(Param->

getLocation

(), diag::err_param_default_argument_nonfunc)

435 Diag

(Param->

getLocation

(), diag::err_param_default_argument_nonfunc)

441

MightBeFunction =

false

;

448

return P->hasDefaultArg() && !P->hasInheritedDefaultArg();

465 for

(

; PrevForDefaultArgs;

513 for

(

unsigned

p = 0, NumParams = PrevForDefaultArgs

516

p < NumParams; ++p) {

520 bool

OldParamHasDfl = OldParam ? OldParam->

hasDefaultArg

() :

false

;

523 if

(OldParamHasDfl && NewParamHasDfl) {

524 unsigned

DiagDefaultParamID =

525

diag::err_param_default_argument_redefinition;

540

DiagDefaultParamID = diag::ext_param_default_argument_redefinition;

558 for

(

auto

Older = PrevForDefaultArgs;

560

Older = Older->getPreviousDecl();

561

OldParam = Older->getParamDecl(p);

566

}

else if

(OldParamHasDfl) {

584

}

else if

(NewParamHasDfl) {

588

diag::err_param_default_argument_template_redecl)

591

diag::note_template_prev_declaration)

622 if

(

Record

->getDescribedClassTemplate())

624 else if

(isa<ClassTemplatePartialSpecializationDecl>(

Record

))

631

diag::err_param_default_argument_member_template_redecl)

641 if

(isa<CXXConstructorDecl>(New) &&

645 if

(NewSM != OldSM) {

648 Diag

(NewParam->

getLocation

(), diag::err_default_arg_makes_ctor_special)

683 if

(isa<CXXDeductionGuideDecl>(New) &&

695 Diag

(New->

getLocation

(), diag::err_friend_decl_with_def_arg_redeclared);

716

? diag::warn_cxx23_placeholder_var_definition

717

: diag::ext_placeholder_var_definition);

723

assert(

D

.isDecompositionDeclarator());

729 if

(!

D

.mayHaveDecompositionDeclarator()) {

735 if

(!TemplateParamLists.empty()) {

738 Diag

(TemplateParamLists.front()->getTemplateLoc(),

739

diag::err_decomp_decl_template);

745

? diag::ext_decomp_decl

747

? diag::ext_decomp_decl_cond

748

: diag::warn_cxx14_compat_decomp_decl)

763 auto

&DS =

D

.getDeclSpec();

771 if

(

auto

SCS = DS.getStorageClassSpec()) {

774

CPlusPlus20SpecifierLocs.push_back(DS.getStorageClassSpecLoc());

777

BadSpecifierLocs.push_back(DS.getStorageClassSpecLoc());

780 if

(

auto

TSCS = DS.getThreadStorageClassSpec()) {

782

CPlusPlus20SpecifierLocs.push_back(DS.getThreadStorageClassSpecLoc());

784 if

(DS.hasConstexprSpecifier()) {

785

BadSpecifiers.push_back(

787

BadSpecifierLocs.push_back(DS.getConstexprSpecLoc());

789 if

(DS.isInlineSpecified()) {

790

BadSpecifiers.push_back(

"inline"

);

791

BadSpecifierLocs.push_back(DS.getInlineSpecLoc());

794 if

(!BadSpecifiers.empty()) {

795 auto

&&Err =

Diag

(BadSpecifierLocs.front(), diag::err_decomp_decl_spec);

796

Err << (

int

)BadSpecifiers.size()

797

<< llvm::join(BadSpecifiers.begin(), BadSpecifiers.end(),

" "

);

800 for

(

auto Loc

: BadSpecifierLocs)

802

}

else if

(!CPlusPlus20Specifiers.empty()) {

803 auto

&&Warn =

Diag

(CPlusPlus20SpecifierLocs.front(),

805

? diag::warn_cxx17_compat_decomp_decl_spec

806

: diag::ext_decomp_decl_spec);

807

Warn << (

int

)CPlusPlus20Specifiers.size()

808

<< llvm::join(CPlusPlus20Specifiers.begin(),

809

CPlusPlus20Specifiers.end(),

" "

);

810 for

(

auto Loc

: CPlusPlus20SpecifierLocs)

822 Diag

(DS.getVolatileSpecLoc(),

823

diag::warn_deprecated_volatile_structured_binding);

836 D

.hasGroupingParens() ||

D

.getNumTypeObjects() > 1 ||

837

(

D

.getNumTypeObjects() == 1 &&

840

(

D

.hasGroupingParens() ||

841

(

D

.getNumTypeObjects() &&

843

? diag::err_decomp_decl_parens

844

: diag::err_decomp_decl_type)

855 if

(DS.isConstrainedAuto()) {

858 "No other template kind should be possible for a constrained auto"

);

872 for

(

auto

&B :

D

.getDecompositionDeclarator().bindings()) {

876

assert(VarName &&

"Cannot have an unnamed binding declaration"

);

879

RedeclarationKind::ForVisibleRedeclaration);

885 Previous

.getFoundDecl()->isTemplateParameter()) {

892 if

(B.EllipsisLoc.isValid()) {

893 if

(!cast<Decl>(DC)->isTemplated())

894 Diag

(B.EllipsisLoc, diag::err_pack_outside_template);

904 NamedDecl

*ShadowedDecl =

D

.getCXXScopeSpec().isEmpty()

917 bool

sameDC = (

Previous

.end() - 1)

927 auto

*Old =

Previous

.getRepresentativeDecl();

928 Diag

(B.NameLoc, diag::err_redefinition) << B.Name;

929 Diag

(Old->getLocation(), diag::note_previous_definition);

931

}

else if

(ShadowedDecl && !

D

.isRedeclaration()) {

944

RedeclarationKind::ForVisibleRedeclaration);

947 bool

AddToScope =

true

;

956 if

(

OpenMP

().isInOpenMPDeclareTargetContext())

967 unsigned

MemberCount) {

968 auto

BindingWithPackItr =

970

[](

BindingDecl

*

D

) ->

bool

{ return D->isParameterPack(); });

971 bool

HasPack = BindingWithPackItr !=

Bindings

.end();

974

IsValid =

Bindings

.size() == MemberCount;

977

IsValid = MemberCount >=

Bindings

.size() - 1;

980 if

(IsValid && HasPack) {

982 unsigned

PackSize = MemberCount -

Bindings

.size() + 1;

987

DecompType, PackSize);

993 for

(

Expr

*&

E

: RP->getExprs()) {

997

NestedBD->setDecomposedDecl(DD);

1006

S.

Diag

(DD->

getLocation

(), diag::err_decomp_decl_wrong_number_bindings)

1007

<< DecompType << (

unsigned

)

Bindings

.size() << MemberCount << MemberCount

1008

<< (MemberCount <

Bindings

.size());

1017 auto

*DD = cast<DecompositionDecl>(Src);

1023 for

(

auto

*B : DD->flat_bindings()) {

1026 if

(

E

.isInvalid())

1028 E

= GetInit(

Loc

,

E

.get(), I++);

1029 if

(

E

.isInvalid())

1031

B->setBinding(ElemType,

E

.get());

1040 const

llvm::APSInt &NumElems,

1043

S,

Bindings

, Src, DecompType, NumElems, ElemType,

1046 if

(

E

.isInvalid())

1056

llvm::APSInt(CAT->

getSize

()),

1074

S,

Bindings

, Src, DecompType, llvm::APSInt::get(2),

1078

return S.CreateBuiltinUnaryOp(Loc, I ? UO_Imag : UO_Real, Base);

1086

llvm::raw_svector_ostream

OS

(SS);

1098 return

std::string(

OS

.str());

1105 auto

DiagnoseMissing = [&] {

1115 return

DiagnoseMissing();

1125 return

DiagnoseMissing();

1126 if

(

Result

.isAmbiguous())

1131 Result

.suppressDiagnostics();

1133

S.

Diag

(

Loc

, diag::err_std_type_trait_not_class_template) << Trait;

1134

S.

Diag

(

Found

->getLocation(), diag::note_declared_at);

1145 Loc

, TraitTy, DiagID,

1152

assert(RD &&

"specialization of class template is not a class?"

);

1171namespace

{

enum class

IsTupleLike { TupleLike, NotTupleLike,

Error

}; }

1174

llvm::APSInt &Size) {

1189 return

IsTupleLike::NotTupleLike;

1198

: R(R), Args(Args) {}

1201 return

S.

Diag

(

Loc

, diag::err_decomp_decl_std_tuple_size_not_constant)

1205

} Diagnoser(R, Args);

1209 if

(

E

.isInvalid())

1210 return

IsTupleLike::Error;

1213 if

(

E

.isInvalid())

1214 return

IsTupleLike::Error;

1216 return

IsTupleLike::TupleLike;

1231

S, R,

Loc

,

"tuple_element"

, Args,

1232

diag::err_decomp_decl_std_tuple_element_not_specialized))

1238

S.

Diag

(

Loc

, diag::err_decomp_decl_std_tuple_element_not_specialized)

1250struct

InitializingBinding {

1259

~InitializingBinding() {

1268 const

llvm::APSInt &TupleSize) {

1269 auto

*DD = cast<DecompositionDecl>(Src);

1283 bool

UseMemberGet =

false

;

1293

dyn_cast<FunctionTemplateDecl>(

D

->getUnderlyingDecl())) {

1295 if

(TPL->

size

() != 0 &&

1296

isa<NonTypeTemplateParmDecl>(TPL->

getParam

(0))) {

1298

UseMemberGet =

true

;

1306 for

(

auto

*B : DD->flat_bindings()) {

1307

InitializingBinding InitContext(S, B);

1311 if

(

E

.isInvalid())

1330

MemberGet, &Args,

nullptr

);

1331 if

(

E

.isInvalid())

1344 Expr

*Arg =

E

.get();

1347 if

(

E

.isInvalid())

1365

B->getDeclName().getAsIdentifierInfo(), RefType,

1369

RefVD->setImplicit();

1371

RefVD->setInlineSpecified();

1372

RefVD->getLexicalDeclContext()->addHiddenDecl(RefVD);

1377 E

=

Seq

.Perform(S, Entity, Kind,

Init

);

1378 if

(

E

.isInvalid())

1381 if

(

E

.isInvalid())

1383

RefVD->setInit(

E

.get());

1389 if

(

E

.isInvalid())

1392

B->setBinding(

T

,

E

.get());

1407 return Specifier

->getType()->getAsCXXRecordDecl()->hasDirectFields();

1416

ClassWithFields = RD;

1428 for

(

auto

&

P

: Paths) {

1432

BestPath->back().Base->getType())) {

1434

S.

Diag

(

Loc

, diag::err_decomp_decl_multiple_bases_with_members)

1435

<<

false

<< RD << BestPath->back().Base->getType()

1436

<<

P

.back().Base->getType();

1438

}

else if

(

P

.Access < BestPath->

Access

) {

1444 QualType

BaseType = BestPath->back().Base->getType();

1446

S.

Diag

(

Loc

, diag::err_decomp_decl_ambiguous_base)

1453

*BestPath, diag::err_decomp_decl_inaccessible_base);

1463 if

(ClassWithFields->

lookupInBases

(BaseHasFields, Paths)) {

1464

S.

Diag

(

Loc

, diag::err_decomp_decl_multiple_bases_with_members)

1465

<< (ClassWithFields == RD) << RD << ClassWithFields

1466

<< Paths.front().back().Base->getType();

1477

diag::err_incomplete_type))

1489 auto

*DD = cast<DecompositionDecl>(Src);

1490 unsigned

NumFields = llvm::count_if(

1491

RD->

fields

(), [](

FieldDecl

*FD) { return !FD->isUnnamedBitField(); });

1498 auto

FlatBindings = DD->flat_bindings();

1499

assert(llvm::range_size(FlatBindings) == NumFields);

1500 auto

FlatBindingsItr = FlatBindings.begin();

1501 for

(

auto

*FD : RD->

fields

()) {

1515

S.

Diag

(Src->

getLocation

(), diag::err_decomp_decl_anon_union_member)

1525

assert(FlatBindingsItr != FlatBindings.end());

1540 if

(

E

.isInvalid())

1544 if

(

E

.isInvalid())

1550 if

(

E

.isInvalid())

1559 if

(FD->isMutable())

1574 for

(

auto

*B : DD->

bindings

()) {

1576 if

(B->getType().isNull())

1608

llvm::APSInt TupleSize(32);

1610 case

IsTupleLike::Error:

1614 case

IsTupleLike::TupleLike:

1619 case

IsTupleLike::NotTupleLike:

1628

<< DD << !RD << DecompType;

1646 "Should only be called if types are otherwise the same."

);

1657

NewType =

P

->getPointeeType();

1687 if

(FTD->isMemberSpecialization())

1714 Diag

(Param->

getLocation

(), diag::err_param_default_argument_missing_name)

1717 Diag

(Param->

getLocation

(), diag::err_param_default_argument_missing);

1724template

<

typename

... Ts>

1734

std::forward<Ts>(DiagArgs)...);

1740

llvm_unreachable(

"unknown CheckConstexprKind"

);

1748 "this check is obsolete for C++23"

);

1767 if

(!Check(B.getBaseTypeLoc(), B.getType(),

nullptr

))

1770 if

(!Check(FD->getLocation(), FD->getType(), FD))

1781 "this check is obsolete for C++23"

);

1782 unsigned

ArgIndex = 0;

1785

e = FT->param_type_end();

1786

i != e; ++i, ++ArgIndex) {

1788

assert(PD &&

"null in a parameter list"

);

1791

diag::err_constexpr_non_literal_param, ArgIndex + 1,

1804 "this check is obsolete for C++23"

);

1806

diag::err_constexpr_non_literal_return,

1825 default

: llvm_unreachable(

"Invalid tag kind for record diagnostic!"

);

1851

<< isa<CXXConstructorDecl>(NewFD)

1853 for

(

const auto

&I : RD->

vbases

())

1854 Diag

(I.getBeginLoc(), diag::note_constexpr_virtual_base_here)

1855

<< I.getSourceRange();

1860 if

(!isa<CXXConstructorDecl>(NewFD)) {

1865 const CXXMethodDecl

*Method = dyn_cast<CXXMethodDecl>(NewFD);

1869 Diag

(Method->

getLocation

(), diag::warn_cxx17_compat_constexpr_virtual);

1882 if

(WrittenVirtual != Method)

1884

diag::note_overridden_virtual_function);

1895 if

(

auto

*Dtor = dyn_cast<CXXDestructorDecl>(NewFD)) {

1900

!Dtor->getParent()->defaultedDestructorIsConstexpr()) {

1915 "CheckConstexprFunctionDefinition called on function with no body"

);

1930 for

(

const auto

*DclIt : DS->

decls

()) {

1931 switch

(DclIt->getKind()) {

1932 case

Decl::StaticAssert:

1934 case

Decl::UsingShadow:

1935 case

Decl::UsingDirective:

1936 case

Decl::UnresolvedUsingTypename:

1937 case

Decl::UnresolvedUsingValue:

1938 case

Decl::UsingEnum:

1946 case

Decl::TypeAlias: {

1949 const auto

*TN = cast<TypedefNameDecl>(DclIt);

1950 if

(TN->getUnderlyingType()->isVariablyModifiedType()) {

1953 TypeLoc

TL = TN->getTypeSourceInfo()->getTypeLoc();

1956

<< isa<CXXConstructorDecl>(Dcl);

1964 case

Decl::CXXRecord:

1966 if

(cast<TagDecl>(DclIt)->isThisDeclarationADefinition()) {

1970

? diag::warn_cxx11_compat_constexpr_type_definition

1971

: diag::ext_constexpr_type_definition)

1972

<< isa<CXXConstructorDecl>(Dcl);

1979 case

Decl::EnumConstant:

1980 case

Decl::IndirectField:

1987 case

Decl::Decomposition: {

1992 const auto

*VD = cast<VarDecl>(DclIt);

1993 if

(VD->isThisDeclarationADefinition()) {

1994 if

(VD->isStaticLocal()) {

1998

? diag::warn_cxx20_compat_constexpr_var

1999

: diag::ext_constexpr_static_var)

2000

<< isa<CXXConstructorDecl>(Dcl)

2008

diag::warn_cxx20_compat_constexpr_var,

2009

isa<CXXConstructorDecl>(Dcl),

2012 SemaRef

, Kind, VD->getLocation(), VD->getType(),

2013

diag::err_constexpr_local_var_non_literal_type,

2014

isa<CXXConstructorDecl>(Dcl))) {

2017 if

(!VD->getType()->isDependentType() &&

2018

!VD->hasInit() && !VD->isCXXForRangeDecl()) {

2023

? diag::warn_cxx17_compat_constexpr_local_var_no_init

2024

: diag::ext_constexpr_local_var_no_init)

2025

<< isa<CXXConstructorDecl>(Dcl);

2035

? diag::warn_cxx11_compat_constexpr_local_var

2036

: diag::ext_constexpr_local_var)

2037

<< isa<CXXConstructorDecl>(Dcl);

2044 case

Decl::NamespaceAlias:

2045 case

Decl::Function:

2055

<< isa<CXXConstructorDecl>(Dcl) << Dcl->

isConsteval

();

2080

llvm::SmallSet<Decl*, 16> &Inits,

2088 if

(Field->isInvalidDecl())

2091 if

(Field->isUnnamedBitField())

2097 if

(Field->isAnonymousStructOrUnion() &&

2098

(Field->getType()->isUnionType()

2099

? !Field->getType()->getAsCXXRecordDecl()->hasVariantMembers()

2100

: Field->getType()->getAsCXXRecordDecl()->isEmpty()))

2103 if

(!Inits.count(Field)) {

2108

? diag::warn_cxx17_compat_constexpr_ctor_missing_init

2109

: diag::ext_constexpr_ctor_missing_init);

2113

diag::note_constexpr_ctor_missing_init);

2117

}

else if

(Field->isAnonymousStructOrUnion()) {

2119 for

(

auto

*I : RD->

fields

())

2122 if

(!RD->

isUnion

() || Inits.count(I))

2139 switch

(S->getStmtClass()) {

2140 case

Stmt::NullStmtClass:

2144 case

Stmt::DeclStmtClass:

2154 case

Stmt::ReturnStmtClass:

2156 if

(isa<CXXConstructorDecl>(Dcl)) {

2159

Cxx1yLoc = S->getBeginLoc();

2163

ReturnStmts.push_back(S->getBeginLoc());

2166 case

Stmt::AttributedStmtClass:

2170 SemaRef

, Dcl, cast<AttributedStmt>(S)->getSubStmt(), ReturnStmts,

2171

Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind);

2173 case

Stmt::CompoundStmtClass: {

2176

Cxx1yLoc = S->getBeginLoc();

2179 for

(

auto

*BodyIt : CompStmt->

body

()) {

2181

Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))

2187 case

Stmt::IfStmtClass: {

2190

Cxx1yLoc = S->getBeginLoc();

2194

Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))

2196 if

(

If

->getElse() &&

2198

Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))

2203 case

Stmt::WhileStmtClass:

2204 case

Stmt::DoStmtClass:

2205 case

Stmt::ForStmtClass:

2206 case

Stmt::CXXForRangeStmtClass:

2207 case

Stmt::ContinueStmtClass:

2213

Cxx1yLoc = S->getBeginLoc();

2214 for

(

Stmt

*SubStmt : S->children()) {

2217

Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))

2222 case

Stmt::SwitchStmtClass:

2223 case

Stmt::CaseStmtClass:

2224 case

Stmt::DefaultStmtClass:

2225 case

Stmt::BreakStmtClass:

2229

Cxx1yLoc = S->getBeginLoc();

2230 for

(

Stmt

*SubStmt : S->children()) {

2233

Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))

2238 case

Stmt::LabelStmtClass:

2239 case

Stmt::GotoStmtClass:

2241

Cxx2bLoc = S->getBeginLoc();

2242 for

(

Stmt

*SubStmt : S->children()) {

2245

Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))

2250 case

Stmt::GCCAsmStmtClass:

2251 case

Stmt::MSAsmStmtClass:

2253 case

Stmt::CXXTryStmtClass:

2255

Cxx2aLoc = S->getBeginLoc();

2256 for

(

Stmt

*SubStmt : S->children()) {

2259

Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))

2264 case

Stmt::CXXCatchStmtClass:

2268 SemaRef

, Dcl, cast<CXXCatchStmt>(S)->getHandlerBlock(), ReturnStmts,

2269

Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))

2279

Cxx1yLoc = S->getBeginLoc();

2284 SemaRef

.

Diag

(S->getBeginLoc(), diag::err_constexpr_body_invalid_stmt)

2285

<< isa<CXXConstructorDecl>(Dcl) << Dcl->

isConsteval

();

2300 if

(isa<CXXTryStmt>(Body)) {

2322

? diag::ext_constexpr_function_try_block_cxx20

2323

: diag::warn_cxx17_compat_constexpr_function_try_block)

2324

<< isa<CXXConstructorDecl>(Dcl);

2338

Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))

2349

}

else if

(Cxx2bLoc.

isValid

()) {

2352

? diag::warn_cxx20_compat_constexpr_body_invalid_stmt

2353

: diag::ext_constexpr_body_invalid_stmt_cxx23)

2354

<< isa<CXXConstructorDecl>(Dcl);

2355

}

else if

(Cxx2aLoc.

isValid

()) {

2358

? diag::warn_cxx17_compat_constexpr_body_invalid_stmt

2359

: diag::ext_constexpr_body_invalid_stmt_cxx20)

2360

<< isa<CXXConstructorDecl>(Dcl);

2361

}

else if

(Cxx1yLoc.

isValid

()) {

2364

? diag::warn_cxx11_compat_constexpr_body_invalid_stmt

2365

: diag::ext_constexpr_body_invalid_stmt)

2366

<< isa<CXXConstructorDecl>(Dcl);

2370

= dyn_cast<CXXConstructorDecl>(Dcl)) {

2379 if

(Constructor->getNumCtorInitializers() == 0 &&

2385

? diag::warn_cxx17_compat_constexpr_union_ctor_no_init

2386

: diag::ext_constexpr_union_ctor_no_init);

2391

}

else if

(!Constructor->isDependentContext() &&

2392

!Constructor->isDelegatingConstructor()) {

2393

assert(RD->

getNumVBases

() == 0 &&

"constexpr ctor with virtual bases"

);

2397 bool

AnyAnonStructUnionMembers =

false

;

2398 unsigned

Fields = 0;

2401 if

(I->isAnonymousStructOrUnion()) {

2402

AnyAnonStructUnionMembers =

true

;

2410 if

(AnyAnonStructUnionMembers ||

2411

Constructor->getNumCtorInitializers() != RD->

getNumBases

() + Fields) {

2415

llvm::SmallSet<Decl*, 16> Inits;

2416 for

(

const auto

*I: Constructor->inits()) {

2420

Inits.insert(ID->chain_begin(), ID->chain_end());

2423 bool

Diagnosed =

false

;

2424 for

(

auto

*I : RD->

fields

())

2431 if

(ReturnStmts.empty()) {

2446

}

else if

(ReturnStmts.size() > 1) {

2452

? diag::warn_cxx11_compat_constexpr_body_multiple_return

2453

: diag::ext_constexpr_body_multiple_return);

2454 for

(

unsigned

I = 0; I < ReturnStmts.size() - 1; ++I)

2456

diag::note_constexpr_body_previous_return);

2487

diag::ext_constexpr_function_never_constant_expr, Dcl->

getLocation

());

2492

diag::ext_constexpr_function_never_constant_expr)

2493

<< isa<CXXConstructorDecl>(Dcl) << Dcl->

isConsteval

()

2495 for

(

size_t

I = 0, N =

Diags

.size(); I != N; ++I)

2520

OK ? diag::warn_cxx11_compat_constexpr_body_no_return

2521

: diag::err_constexpr_body_no_return)

2535 Diag

(it->second, diag::err_immediate_function_used_before_definition)

2548 "expected an immediate function"

);

2549

assert(FD->

hasBody

() &&

"expected the function to have a body"

);

2554 bool

ImmediateFnIsConstructor;

2559

: SemaRef(SemaRef), ImmediateFn(FD),

2560

ImmediateFnIsConstructor(isa<CXXConstructorDecl>(FD)) {

2561

ShouldVisitImplicitCode =

true

;

2562

ShouldVisitLambdaBody =

false

;

2568 if

(CurrentConstructor && CurrentInit) {

2576

SemaRef.

Diag

(

Loc

, diag::note_immediate_function_reason)

2577

<< ImmediateFn << Fn << Fn->isConsteval() << IsCall

2578

<< isa<CXXConstructorDecl>(Fn) << ImmediateFnIsConstructor

2579

<< (InitializedField !=

nullptr

)

2580

<< (CurrentInit && !CurrentInit->

isWritten

())

2581

<< InitializedField <<

Range

;

2583 bool

TraverseCallExpr(

CallExpr

*

E

)

override

{

2584 if

(

const auto

*DR =

2586

DR && DR->isImmediateEscalating()) {

2587 Diag

(

E

,

E

->getDirectCallee(),

true

);

2591 for

(

Expr

*A :

E

->arguments())

2592 if

(!TraverseStmt(A))

2599 if

(

const auto

*ReferencedFn = dyn_cast<FunctionDecl>(

E

->getDecl());

2600

ReferencedFn &&

E

->isImmediateEscalating()) {

2601 Diag

(

E

, ReferencedFn,

false

);

2610 if

(

E

->isImmediateEscalating()) {

2624 return

DynamicRecursiveASTVisitor::TraverseCXXConstructorDecl(Ctr);

2627 bool

TraverseType(

QualType T

)

override

{

return true

; }

2628 bool

VisitBlockExpr(

BlockExpr

*

T

)

override

{

return true

; }

2630

} Visitor(*

this

, FD);

2631

Visitor.TraverseDecl(FD);

2642 return

dyn_cast_or_null<CXXRecordDecl>(DC);

2645 return

dyn_cast_or_null<CXXRecordDecl>(

CurContext

);

2663

CurDecl = dyn_cast_or_null<CXXRecordDecl>(DC);

2665

CurDecl = dyn_cast_or_null<CXXRecordDecl>(

CurContext

);

2690 Diag

(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)

2704 if

(BaseDecl->isUnion()) {

2705 Diag

(BaseLoc, diag::err_union_as_base_class) << SpecifierRange;

2712 Diag

(BaseLoc, diag::warn_qual_base_type)

2713

<< Quals << std::count(Quals.begin(), Quals.end(),

' '

) + 1

2715 Diag

(BaseLoc, diag::note_base_class_specified_here) << BaseType;

2722 if

(

auto

*BaseSpec =

2723

dyn_cast<ClassTemplateSpecializationDecl>(BaseDecl)) {

2732 Class

->setInvalidDecl();

2736

BaseDecl = BaseDecl->getDefinition();

2737

assert(BaseDecl &&

"Base type is not incomplete, but has no definition"

);

2742 const auto

*BaseCSA = BaseDecl->getAttr<CodeSegAttr>();

2743 const auto

*DerivedCSA =

Class

->getAttr<CodeSegAttr>();

2744 if

((DerivedCSA || BaseCSA) &&

2745

(!BaseCSA || !DerivedCSA ||

2746

BaseCSA->getName() != DerivedCSA->getName())) {

2747 Diag

(

Class

->getLocation(), diag::err_mismatched_code_seg_base);

2748 Diag

(BaseDecl->getLocation(), diag::note_base_class_specified_here)

2759 if

(BaseDecl->hasFlexibleArrayMember()) {

2760 Diag

(BaseLoc, diag::err_base_class_has_flexible_array_member)

2761

<< BaseDecl->getDeclName();

2768 if

(FinalAttr *FA = BaseDecl->getAttr<FinalAttr>()) {

2769 Diag

(BaseLoc, diag::err_class_marked_final_used_as_base)

2770

<< BaseDecl->getDeclName() << FA->isSpelledAsSealed();

2771 Diag

(BaseDecl->getLocation(), diag::note_entity_declared_at)

2772

<< BaseDecl->getDeclName() << FA->getRange();

2777 if

(BaseDecl->isInvalidDecl())

2778 Class

->setInvalidDecl();

2786 if

(!

Class

->isDependentContext())

2787 Class

->setInvalidDecl();

2790 Diag

(BaseLoc, diag::err_base_must_be_class) << SpecifierRange;

2802

Access, TInfo, EllipsisLoc);

2819 Class

->setIsParsingBaseSpecifiers();

2827 Diag

(AL.getLoc(), diag::warn_unknown_attribute_ignored)

2828

<< AL << AL.getRange();

2830 Diag

(AL.getLoc(), diag::err_base_specifier_attribute)

2831

<< AL << AL.isRegularKeywordAttribute() << AL.getRange();

2844 if

(

Class

->isUnion()) {

2845 Diag

(

Class

->getLocation(), diag::err_base_clause_on_union)

2855 Class

->setInvalidDecl();

2871 auto Decl

= Rec->getAsCXXRecordDecl();

2874 for

(

const auto

&BaseSpec :

Decl

->bases()) {

2877 if

(

Set

.insert(

Base

).second)

2893

std::map<QualType, CXXBaseSpecifier*, QualTypeOrdering> KnownBaseTypes;

2900 unsigned

NumGoodBases = 0;

2902 for

(

unsigned

idx = 0; idx < Bases.size(); ++idx) {

2912 Diag

(Bases[idx]->getBeginLoc(), diag::err_duplicate_base_class)

2913

<< KnownBase->

getType

() << Bases[idx]->getSourceRange();

2922

KnownBase = Bases[idx];

2923

Bases[NumGoodBases++] = Bases[idx];

2928 if

(Bases.size() > 1)

2933 if

(

Class

->isInterface() &&

2938 Diag

(KnownBase->

getBeginLoc

(), diag::err_invalid_base_in_interface)

2943 if

(RD->

hasAttr

<WeakAttr>())

2950 Class

->setBases(Bases.data(), NumGoodBases);

2953 for

(

unsigned

idx = 0; idx < NumGoodBases; ++idx) {

2955 QualType

BaseType = Bases[idx]->getType();

2965 if

(IndirectBaseTypes.count(CanonicalBase)) {

2969

=

Class

->isDerivedFrom(CanonicalBase->getAsCXXRecordDecl(), Paths);

2973 if

(Paths.isAmbiguous(CanonicalBase))

2974 Diag

(Bases[idx]->getBeginLoc(), diag::warn_inaccessible_base_class)

2976

<< Bases[idx]->getSourceRange();

2978

assert(Bases[idx]->isVirtual());

2991 if

(!ClassDecl || Bases.empty())

3048 for

(

unsigned

I =

Path

.size(); I != 0; --I) {

3049 if

(

Path

[I - 1].

Base

->isVirtual()) {

3056 for

(

unsigned

I = Start,

E

=

Path

.size(); I !=

E

; ++I)

3063

assert(BasePathArray.empty() &&

"Base path array must be empty!"

);

3064

assert(Paths.isRecordingPaths() &&

"Must record paths!"

);

3065

return ::BuildBasePathArray(Paths.front(), BasePathArray);

3070 unsigned

InaccessibleBaseID,

3071 unsigned

AmbiguousBaseConvID,

3075 bool

IgnoreAccess) {

3083 if

(!DerivationOkay)

3088 Path

= &Paths.front();

3095 if

(PossiblePath.size() == 1) {

3096 Path

= &PossiblePath;

3097 if

(AmbiguousBaseConvID)

3098 Diag

(

Loc

, diag::ext_ms_ambiguous_direct_base)

3106 if

(!IgnoreAccess) {

3125 if

(AmbiguousBaseConvID) {

3133

Paths.setRecordingPaths(

true

);

3135

assert(StillOkay &&

"Can only be used with a derived-to-base conversion"

);

3144 Diag

(

Loc

, AmbiguousBaseConvID)

3145

<< Derived <<

Base

<< PathDisplayStr <<

Range

<< Name;

3154 bool

IgnoreAccess) {

3156

Derived,

Base

, diag::err_upcast_to_inaccessible_base,

3158

BasePath, IgnoreAccess);

3162

std::string PathDisplayStr;

3163

std::set<unsigned> DisplayedPaths;

3166 if

(DisplayedPaths.insert(

Path

->back().SubobjectNumber).second) {

3169

PathDisplayStr +=

"\n "

;

3171 for

(CXXBasePath::const_iterator Element =

Path

->begin();

3172

Element !=

Path

->end(); ++Element)

3173

PathDisplayStr +=

" -> "

+ Element->Base->getType().getAsString();

3177 return

PathDisplayStr;

3187

assert(Access !=

AS_none

&&

"Invalid kind for syntactic access specifier!"

);

3216 if

(!OverloadedMethods.empty()) {

3217 if

(OverrideAttr *OA =

D

->

getAttr

<OverrideAttr>()) {

3218 Diag

(OA->getLocation(),

3219

diag::override_keyword_hides_virtual_member_function)

3220

<<

"override"

<< (OverloadedMethods.size() > 1);

3221

}

else if

(FinalAttr *FA =

D

->

getAttr

<FinalAttr>()) {

3222 Diag

(FA->getLocation(),

3223

diag::override_keyword_hides_virtual_member_function)

3224

<< (FA->isSpelledAsSealed() ?

"sealed"

:

"final"

)

3225

<< (OverloadedMethods.size() > 1);

3236 if

(OverrideAttr *OA =

D

->

getAttr

<OverrideAttr>()) {

3237 Diag

(OA->getLocation(),

3238

diag::override_keyword_only_allowed_on_virtual_member_functions)

3242 if

(FinalAttr *FA =

D

->

getAttr

<FinalAttr>()) {

3243 Diag

(FA->getLocation(),

3244

diag::override_keyword_only_allowed_on_virtual_member_functions)

3245

<< (FA->isSpelledAsSealed() ?

"sealed"

:

"final"

)

3257 if

(MD->

hasAttr

<OverrideAttr>() && !HasOverriddenMethods)

3258 Diag

(MD->

getLocation

(), diag::err_function_marked_override_not_overriding)

3278 auto

EmitDiag = [&](

unsigned

DiagInconsistent,

unsigned

DiagSuggest) {

3287 if

(isa<CXXDestructorDecl>(MD))

3289

diag::warn_inconsistent_destructor_marked_not_override_overriding,

3290

diag::warn_suggest_destructor_marked_not_override_overriding);

3292

EmitDiag(diag::warn_inconsistent_function_marked_not_override_overriding,

3293

diag::warn_suggest_function_marked_not_override_overriding);

3299

FinalAttr *FA = Old->

getAttr

<FinalAttr>();

3305

<< FA->isSpelledAsSealed();

3314 return

!RD->isCompleteDefinition() ||

3315

!RD->hasTrivialDefaultConstructor() ||

3316

!RD->hasTrivialDestructor();

3328

std::map<CXXRecordDecl*, NamedDecl*> Bases;

3331 const auto Base

=

Specifier

->getType()->getAsCXXRecordDecl();

3333 if

(Bases.find(

Base

) != Bases.end())

3335 for

(

const auto

Field :

Base

->lookup(FieldName)) {

3336 if

((isa<FieldDecl>(Field) || isa<IndirectFieldDecl>(Field)) &&

3339

assert(Bases.find(

Base

) == Bases.end());

3352 for

(

const auto

&

P

: Paths) {

3353 auto Base

=

P

.back().Base->getType()->getAsCXXRecordDecl();

3354 auto

It = Bases.find(

Base

);

3356 if

(It == Bases.end())

3358 auto

BaseField = It->second;

3359

assert(BaseField->getAccess() !=

AS_private

);

3362 Diag

(

Loc

, diag::warn_shadow_field)

3363

<< FieldName << RD <<

Base

<< DeclIsField;

3364 Diag

(BaseField->getLocation(), diag::note_shadow_field);

3370template

<

typename

AttrType>

3373 return

TD->hasAttr<AttrType>();

3375 return

TDT->getDecl()->hasAttr<AttrType>();

3382 if

(HasAttribute<WarnUnusedAttr>(FieldType))

3387

!HasAttribute<UnusedAttr>(FieldType) &&

3407 Expr

*BitWidth =

static_cast<Expr

*

>

(BW);

3412 bool

isFunc =

D

.isDeclarationOfFunction();

3414 D

.getDeclSpec().getAttributes().getMSPropertyAttr();

3416 if

(cast<CXXRecordDecl>(

CurContext

)->isInterface()) {

3420 unsigned

InvalidDecl;

3421 bool

ShowDeclName =

true

;

3431 else switch

(Name.getNameKind()) {

3434

ShowDeclName =

false

;

3439

ShowDeclName =

false

;

3454 Diag

(

Loc

, diag::err_invalid_member_in_interface)

3455

<< (InvalidDecl-1) << Name;

3457 Diag

(

Loc

, diag::err_invalid_member_in_interface)

3458

<< (InvalidDecl-1) <<

""

;

3479 D

.getMutableDeclSpec().ClearStorageClassSpecs();

3484

diag::err_storageclass_invalid_for_member);

3485 D

.getMutableDeclSpec().ClearStorageClassSpecs();

3491

!isFunc && TemplateParameterLists.empty();

3503 D

.getMutableDeclSpec().ClearConstexprSpec();

3504 const char

*PrevSpec;

3506 bool

Failed =

D

.getMutableDeclSpec().SetTypeQual(

3509

assert(!Failed &&

"Making a constexpr member const shouldn't fail"

);

3513 const char

*PrevSpec;

3515 if

(

D

.getMutableDeclSpec().SetStorageClassSpec(

3519 "This is the only DeclSpec that should fail to be applied"

);

3523

isInstField =

false

;

3533 if

(!Name.isIdentifier()) {

3534 Diag

(

Loc

, diag::err_bad_variable_name)

3541 Diag

(

D

.getIdentifierLoc(), diag::err_member_with_template_arguments)

3544 D

.getName().TemplateId->RAngleLoc)

3545

<<

D

.getName().TemplateId->LAngleLoc;

3546 D

.SetIdentifier(II,

Loc

);

3559

?

D

.getName().TemplateId

3565 Diag

(

D

.getIdentifierLoc(), diag::err_member_qualification)

3571 if

(MSPropertyAttr) {

3573

BitWidth, InitStyle, AS, *MSPropertyAttr);

3576

isInstField =

false

;

3579

BitWidth, InitStyle, AS);

3584

CheckShadowInheritedFields(

Loc

, Name, cast<CXXRecordDecl>(

CurContext

));

3592 if

(

Member

->isInvalidDecl()) {

3594

}

else if

(isa<VarDecl>(

Member

) || isa<VarTemplateDecl>(

Member

)) {

3597 Diag

(

Loc

, diag::err_static_not_bitfield)

3599

}

else if

(isa<TypedefDecl>(

Member

)) {

3601 Diag

(

Loc

, diag::err_typedef_not_bitfield)

3606 Diag

(

Loc

, diag::err_not_integral_type_bitfield)

3607

<< Name << cast<ValueDecl>(

Member

)->getType()

3611

BitWidth =

nullptr

;

3612 Member

->setInvalidDecl();

3617

NonTemplateMember = FunTmpl->getTemplatedDecl();

3619

NonTemplateMember = VarTmpl->getTemplatedDecl();

3625 if

(NonTemplateMember !=

Member

)

3631 if

(

auto

*DG = dyn_cast<CXXDeductionGuideDecl>(NonTemplateMember)) {

3632 auto

*TD = DG->getDeducedTemplate();

3635 if

(AS != TD->getAccess() &&

3636

TD->getDeclContext()->getRedeclContext()->Equals(

3637

DG->getDeclContext()->getRedeclContext())) {

3638 Diag

(DG->getBeginLoc(), diag::err_deduction_guide_wrong_access);

3639 Diag

(TD->getBeginLoc(), diag::note_deduction_guide_template_access)

3642 for

(

const auto

*

D

: cast<CXXRecordDecl>(

CurContext

)->decls()) {

3643 if

(

const auto

*AccessSpec = dyn_cast<AccessSpecDecl>(

D

))

3644

LastAccessSpec = AccessSpec;

3646

assert(LastAccessSpec &&

"differing access with no access specifier"

);

3647 Diag

(LastAccessSpec->

getBeginLoc

(), diag::note_deduction_guide_access)

3658

? FinalAttr::Keyword_sealed

3659

: FinalAttr::Keyword_final));

3669

assert((Name || isInstField) &&

"No identifier for non-field ?"

);

3687 class

UninitializedFieldVisitor

3692

llvm::SmallPtrSetImpl<ValueDecl*> &Decls;

3695

llvm::SmallPtrSetImpl<QualType> &BaseClasses;

3710

UninitializedFieldVisitor(

Sema

&S,

3711

llvm::SmallPtrSetImpl<ValueDecl*> &Decls,

3712

llvm::SmallPtrSetImpl<QualType> &BaseClasses)

3713

: Inherited(S.Context), S(S), Decls(Decls), BaseClasses(BaseClasses),

3714

Constructor(nullptr), InitList(

false

), InitListFieldDecl(nullptr) {}

3717 bool

IsInitListMemberExprInitialized(

MemberExpr

*ME,

3718 bool

CheckReferenceOnly) {

3720 bool

ReferenceField =

false

;

3725

Fields.push_back(FD);

3727

ReferenceField =

true

;

3733 if

(CheckReferenceOnly && !ReferenceField)

3739 for

(

const FieldDecl

*FD : llvm::drop_begin(llvm::reverse(Fields)))

3742 for

(

auto

UsedIter = UsedFieldIndex.begin(),

3743

UsedEnd = UsedFieldIndex.end(),

3744

OrigIter = InitFieldIndex.begin(),

3745

OrigEnd = InitFieldIndex.end();

3746

UsedIter != UsedEnd && OrigIter != OrigEnd; ++UsedIter, ++OrigIter) {

3747 if

(*UsedIter < *OrigIter)

3749 if

(*UsedIter > *OrigIter)

3756 void

HandleMemberExpr(

MemberExpr

*ME,

bool

CheckReferenceOnly,

3769

dyn_cast<MemberExpr>(

Base

->IgnoreParenImpCasts())) {

3771 if

(isa<VarDecl>(SubME->getMemberDecl()))

3774 if

(

FieldDecl

*FD = dyn_cast<FieldDecl>(SubME->getMemberDecl()))

3779

AllPODFields =

false

;

3781 Base

= SubME->getBase();

3784 if

(!isa<CXXThisExpr>(

Base

->IgnoreParenImpCasts())) {

3789 if

(AddressOf && AllPODFields)

3795 while

(isa<ImplicitCastExpr>(BaseCast->getSubExpr())) {

3796

BaseCast = cast<ImplicitCastExpr>(BaseCast->getSubExpr());

3799 if

(BaseCast->getCastKind() == CK_UncheckedDerivedToBase) {

3803

S.

Diag

(FieldME->

getExprLoc

(), diag::warn_base_class_is_uninit)

3809 if

(!Decls.count(FoundVD))

3814 if

(InitList && !AddressOf && FoundVD == InitListFieldDecl) {

3816 if

(IsInitListMemberExprInitialized(ME, CheckReferenceOnly)) {

3821 if

(CheckReferenceOnly && !IsReference)

3825 unsigned

diag = IsReference

3826

? diag::warn_reference_field_is_uninit

3827

: diag::warn_field_is_uninit;

3831

diag::note_uninit_in_this_constructor)

3836 void

HandleValue(

Expr

*

E

,

bool

AddressOf) {

3839 if

(

MemberExpr

*ME = dyn_cast<MemberExpr>(

E

)) {

3840

HandleMemberExpr(ME,

false

,

3846

Visit(CO->getCond());

3847

HandleValue(CO->getTrueExpr(), AddressOf);

3848

HandleValue(CO->getFalseExpr(), AddressOf);

3853

dyn_cast<BinaryConditionalOperator>(

E

)) {

3854

Visit(BCO->getCond());

3855

HandleValue(BCO->getFalseExpr(), AddressOf);

3860

HandleValue(OVE->getSourceExpr(), AddressOf);

3865 switch

(BO->getOpcode()) {

3870

HandleValue(BO->getLHS(), AddressOf);

3871

Visit(BO->getRHS());

3874

Visit(BO->getLHS());

3875

HandleValue(BO->getRHS(), AddressOf);

3884

InitFieldIndex.push_back(0);

3885 for

(

auto

*Child : ILE->

children

()) {

3886 if

(

InitListExpr

*SubList = dyn_cast<InitListExpr>(Child)) {

3887

CheckInitListExpr(SubList);

3891

++InitFieldIndex.back();

3893

InitFieldIndex.pop_back();

3902

DeclsToRemove.clear();

3909

InitListFieldDecl =

Field

;

3910

InitFieldIndex.clear();

3911

CheckInitListExpr(ILE);

3925

HandleMemberExpr(ME,

true

,

false

);

3929 if

(

E

->getCastKind() == CK_LValueToRValue) {

3930

HandleValue(

E

->getSubExpr(),

false

);

3934

Inherited::VisitImplicitCastExpr(

E

);

3938 if

(

E

->getConstructor()->isCopyConstructor()) {

3939 Expr

*ArgExpr =

E

->getArg(0);

3940 if

(

InitListExpr

*ILE = dyn_cast<InitListExpr>(ArgExpr))

3944 if

(ICE->getCastKind() == CK_NoOp)

3945

ArgExpr = ICE->getSubExpr();

3946

HandleValue(ArgExpr,

false

);

3949

Inherited::VisitCXXConstructExpr(

E

);

3954 if

(isa<MemberExpr>(Callee)) {

3955

HandleValue(Callee,

false

);

3956 for

(

auto

*Arg :

E

->arguments())

3961

Inherited::VisitCXXMemberCallExpr(

E

);

3966 if

(

E

->isCallToStdMove()) {

3967

HandleValue(

E

->getArg(0),

false

);

3971

Inherited::VisitCallExpr(

E

);

3977 if

(isa<UnresolvedLookupExpr>(Callee))

3978 return

Inherited::VisitCXXOperatorCallExpr(

E

);

3981 for

(

auto

*Arg :

E

->arguments())

3982

HandleValue(Arg->IgnoreParenImpCasts(),

false

);

3988 if

(

E

->getOpcode() == BO_Assign)

3989 if

(

MemberExpr

*ME = dyn_cast<MemberExpr>(

E

->getLHS()))

3992

DeclsToRemove.push_back(FD);

3994 if

(

E

->isCompoundAssignmentOp()) {

3995

HandleValue(

E

->getLHS(),

false

);

3996

Visit(

E

->getRHS());

4000

Inherited::VisitBinaryOperator(

E

);

4004 if

(

E

->isIncrementDecrementOp()) {

4005

HandleValue(

E

->getSubExpr(),

false

);

4008 if

(

E

->getOpcode() == UO_AddrOf) {

4009 if

(

MemberExpr

*ME = dyn_cast<MemberExpr>(

E

->getSubExpr())) {

4010

HandleValue(ME->

getBase

(),

true

);

4015

Inherited::VisitUnaryOperator(

E

);

4025 static void

DiagnoseUninitializedFields(

4045 for

(

auto

*I : RD->

decls

()) {

4046 if

(

auto

*FD = dyn_cast<FieldDecl>(I)) {

4047

UninitializedFields.insert(FD);

4048

}

else if

(

auto

*IFD = dyn_cast<IndirectFieldDecl>(I)) {

4049

UninitializedFields.insert(IFD->getAnonField());

4054 for

(

const auto

&I : RD->

bases

())

4055

UninitializedBaseClasses.insert(I.getType().getCanonicalType());

4057 if

(UninitializedFields.empty() && UninitializedBaseClasses.empty())

4060

UninitializedFieldVisitor UninitializedChecker(

SemaRef

,

4061

UninitializedFields,

4062

UninitializedBaseClasses);

4064 for

(

const auto

*FieldInit :

Constructor

->inits()) {

4065 if

(UninitializedFields.empty() && UninitializedBaseClasses.empty())

4068 Expr

*InitExpr = FieldInit->getInit();

4073

dyn_cast<CXXDefaultInitExpr>(InitExpr)) {

4074

InitExpr =

Default

->getExpr();

4078

UninitializedChecker.CheckInitializer(InitExpr, Constructor,

4079

FieldInit->getAnyMember(),

4080

FieldInit->getBaseClass());

4082

UninitializedChecker.CheckInitializer(InitExpr,

nullptr

,

4083

FieldInit->getAnyMember(),

4084

FieldInit->getBaseClass());

4097 if

(!

D

.isFunctionDeclarator())

4099 auto

&FTI =

D

.getFunctionTypeInfo();

4104 auto

*ParamDecl = cast<NamedDecl>(Param.Param);

4105 if

(ParamDecl->getDeclName())

4126 return

ConstraintExpr;

4141 return Seq

.Perform(*

this

, Entity, Kind, InitExpr);

4152 if

(isa<MSPropertyDecl>(

D

)) {

4159 "must set init style when field is created"

);

4173

assert(

Init

.isUsable() &&

"Init should at least have a RecoveryExpr"

);

4179 if

(!

Init

.isInvalid())

4181 if

(

Init

.isInvalid()) {

4199

DirectBaseSpec =

nullptr

;

4200 for

(

const auto

&

Base

: ClassDecl->

bases

()) {

4204

DirectBaseSpec = &

Base

;

4212

VirtualBaseSpec =

nullptr

;

4213 if

(!DirectBaseSpec || !DirectBaseSpec->

isVirtual

()) {

4223 if

(

Path

->back().Base->isVirtual()) {

4224

VirtualBaseSpec =

Path

->back().Base;

4231 return

DirectBaseSpec || VirtualBaseSpec;

4245

DS, IdLoc, InitList,

4263

DS, IdLoc, List, EllipsisLoc);

4272 explicit

MemInitializerValidatorCCC(

CXXRecordDecl

*ClassDecl)

4273

: ClassDecl(ClassDecl) {}

4275 bool

ValidateCandidate(

const TypoCorrection

&candidate)

override

{

4278 return Member

->getDeclContext()->getRedeclContext()->Equals(ClassDecl);

4279 return

isa<TypeDecl>(ND);

4284

std::unique_ptr<CorrectionCandidateCallback> clone()

override

{

4285 return

std::make_unique<MemInitializerValidatorCCC>(*

this

);

4300 return

isa<FieldDecl, IndirectFieldDecl>(Elem) &&

4306 Diag

(

Loc

, diag::err_using_placeholder_variable) << Name;

4311 if

(isa<FieldDecl, IndirectFieldDecl>(ND) &&

4322 for

(

auto

*

D

: ClassDecl->

lookup

(MemberOrBase)) {

4323 if

(isa<FieldDecl, IndirectFieldDecl>(

D

)) {

4324 bool

IsPlaceholder =

D

->isPlaceholderVar(

getLangOpts

());

4331 return

cast<ValueDecl>(

D

);

4332

ND = cast<ValueDecl>(

D

);

4369

= dyn_cast<CXXConstructorDecl>(ConstructorD);

4393

ClassDecl, SS, TemplateTypeTy, MemberOrBase)) {

4395 Diag

(EllipsisLoc, diag::err_pack_expansion_member_init)

4405 if

(TemplateTypeTy) {

4430 bool

NotUnknownSpecialization =

false

;

4433

NotUnknownSpecialization = !

Record

->hasAnyDependentBases();

4435 if

(!NotUnknownSpecialization) {

4460 auto

*TempSpec = cast<TemplateSpecializationType>(

4461

UnqualifiedBase->getInjectedClassNameSpecialization());

4463 for

(

auto const

&

Base

: ClassDecl->

bases

()) {

4469 Diag

(IdLoc, diag::ext_unqualified_base_class)

4471

BaseType =

Base

.getType();

4480

MemInitializerValidatorCCC CCC(ClassDecl);

4489 PDiag

(diag::err_mem_init_not_member_or_class_suggest)

4490

<< MemberOrBase <<

true

);

4497

DirectBaseSpec, VirtualBaseSpec)) {

4502 PDiag

(diag::err_mem_init_not_member_or_class_suggest)

4503

<< MemberOrBase <<

false

,

4508 Diag

(BaseSpec->

getBeginLoc

(), diag::note_base_class_specified_here)

4516 if

(!TyD && BaseType.

isNull

()) {

4517 Diag

(IdLoc, diag::err_mem_init_not_member_or_class)

4518

<< MemberOrBase <<

SourceRange

(IdLoc,

Init

->getSourceRange().getEnd());

4523 if

(BaseType.

isNull

()) {

4546

assert((DirectMember || IndirectMember) &&

4547 "Member must be a FieldDecl or IndirectFieldDecl"

);

4552 if

(

Member

->isInvalidDecl())

4557

Args =

MultiExprArg

(ParenList->getExprs(), ParenList->getNumExprs());

4559

Args =

MultiExprArg

(InitList->getInits(), InitList->getNumInits());

4567 if

(

Member

->getType()->isDependentType() ||

Init

->isTypeDependent()) {

4572 bool

InitList =

false

;

4573 if

(isa<InitListExpr>(

Init

)) {

4585

IdLoc,

Init

->getBeginLoc(),

Init

->getEndLoc())

4629 return Diag

(NameLoc, diag::err_delegating_ctor)

4631 Diag

(NameLoc, diag::warn_cxx98_compat_delegating_ctor);

4633 bool

InitList =

true

;

4637

Args =

MultiExprArg

(ParenList->getExprs(), ParenList->getNumExprs());

4646

NameLoc,

Init

->getBeginLoc(),

Init

->getEndLoc())

4654

cast<CXXConstructExpr>(DelegationInit.

get

())->getConstructor()) &&

4655 "Delegating constructor with no target?"

);

4661

DelegationInit.

get

(), InitRange.

getBegin

(),

false

);

4679

DelegationInit =

Init

;

4694 return Diag

(BaseLoc, diag::err_base_init_does_not_name_class)

4711 if

(EllipsisLoc.

isValid

()) {

4714 Diag

(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)

4743 if

(!DirectBaseSpec && !VirtualBaseSpec) {

4752 return Diag

(BaseLoc, diag::err_not_direct_base_or_virtual)

4764

InitRange.

getEnd

(), EllipsisLoc);

4771 if

(DirectBaseSpec && VirtualBaseSpec)

4772 return Diag

(BaseLoc, diag::err_base_init_direct_and_virtual)

4777

BaseSpec = VirtualBaseSpec;

4780 bool

InitList =

true

;

4784

Args =

MultiExprArg

(ParenList->getExprs(), ParenList->getNumExprs());

4794 ExprResult

BaseInit = InitSeq.

Perform

(*

this

, BaseEntity, Kind, Args,

nullptr

);

4824

InitRange.

getEnd

(), EllipsisLoc);

4834

TargetType, ExprLoc);

4854 bool

IsInheritedVirtualBase,

4858

IsInheritedVirtualBase);

4862 switch

(ImplicitInitKind) {

4868

BaseInit = InitSeq.Perform(

SemaRef

, InitEntity, InitKind, {});

4874 bool

Moving = ImplicitInitKind ==

IIK_Move

;

4875 ParmVarDecl

*Param = Constructor->getParamDecl(0);

4881

Constructor->getLocation(), ParamType,

4896

BasePath.push_back(BaseSpec);

4898

CK_UncheckedDerivedToBase,

4906

BaseInit = InitSeq.

Perform

(

SemaRef

, InitEntity, InitKind, CopyCtorArg);

4929 ValueDecl

*Referenced = cast<MemberExpr>(MemRef)->getMemberDecl();

4938 if

(Field->isInvalidDecl())

4944 bool

Moving = ImplicitInitKind ==

IIK_Move

;

4945 ParmVarDecl

*Param = Constructor->getParamDecl(0);

4949 if

(Field->isZeroLengthBitField())

4952 Expr

*MemberExprBase =

5018 "Unhandled implicit init kind!"

);

5036 if

(MemberInit.isInvalid())

5053 if

(!Field->getParent()->isUnion()) {

5056

diag::err_uninitialized_member_in_ctor)

5057

<< (

int

)Constructor->isImplicit()

5059

<< 0 << Field->getDeclName();

5060 SemaRef

.

Diag

(Field->getLocation(), diag::note_declared_at);

5066

diag::err_uninitialized_member_in_ctor)

5067

<< (

int

)Constructor->isImplicit()

5069

<< 1 << Field->getDeclName();

5070 SemaRef

.

Diag

(Field->getLocation(), diag::note_declared_at);

5087

CXXMemberInit =

nullptr

;

5092struct

BaseAndFieldInfo {

5095 bool

AnyErrorsInInits;

5097

llvm::DenseMap<const void *, CXXCtorInitializer*> AllBaseFields;

5099

llvm::DenseMap<TagDecl*, FieldDecl*> ActiveUnionMember;

5102

: S(S), Ctor(Ctor), AnyErrorsInInits(ErrorsInInits) {

5114 bool

isImplicitCopyOrMove()

const

{

5125

llvm_unreachable(

"Invalid ImplicitInitializerKind!"

);

5129

AllToInit.push_back(

Init

);

5132 if

(

Init

->getInit()->HasSideEffects(S.

Context

))

5138 bool

isInactiveUnionMember(

FieldDecl

*Field) {

5140 if

(!

Record

->isUnion())

5144

ActiveUnionMember.lookup(

Record

->getCanonicalDecl()))

5145 return

Active !=

Field

->getCanonicalDecl();

5148 if

(isImplicitCopyOrMove())

5153 if

(

Field

->hasInClassInitializer())

5157 if

(!

Field

->isAnonymousStructOrUnion())

5166 bool

isWithinInactiveUnionMember(

FieldDecl

*Field,

5169 return

isInactiveUnionMember(Field);

5173 if

(Field && isInactiveUnionMember(Field))

5188 if

(ArrayT->isZeroSize())

5191 T

= ArrayT->getElementType();

5200 if

(Field->isInvalidDecl())

5205

Info.AllBaseFields.lookup(Field->getCanonicalDecl()))

5206 return

Info.addFieldInitializer(

Init

);

5220 if

(Info.isWithinInactiveUnionMember(Field,

Indirect

))

5223 if

(Field->hasInClassInitializer() && !Info.isImplicitCopyOrMove()) {

5241 return

Info.addFieldInitializer(

Init

);

5251 if

(Info.AnyErrorsInInits)

5262 return

Info.addFieldInitializer(

Init

);

5269

Constructor->setNumCtorInitializers(1);

5273

Constructor->setCtorInitializers(initializer);

5282

DiagnoseUninitializedFields(*

this

, Constructor);

5289 if

(Constructor->isDependentContext()) {

5292 if

(!Initializers.empty()) {

5293

Constructor->setNumCtorInitializers(Initializers.size());

5296 memcpy

(baseOrMemberInitializers, Initializers.data(),

5298

Constructor->setCtorInitializers(baseOrMemberInitializers);

5303

Constructor->setInvalidDecl();

5308

BaseAndFieldInfo Info(*

this

, Constructor, AnyErrors);

5312 CXXRecordDecl

*ClassDecl = Constructor->getParent()->getDefinition();

5316 bool

HadError =

false

;

5318 for

(

unsigned

i = 0; i < Initializers.size(); i++) {

5321 if

(

Member

->isBaseInitializer())

5324

Info.AllBaseFields[

Member

->getAnyMember()->getCanonicalDecl()] =

Member

;

5327 for

(

auto

*

C

: F->chain()) {

5330

Info.ActiveUnionMember.insert(std::make_pair(

5335

Info.ActiveUnionMember.insert(std::make_pair(

5343 for

(

auto

&I : ClassDecl->

bases

()) {

5345

DirectVBases.insert(&I);

5349 for

(

auto

&VBase : ClassDecl->

vbases

()) {

5351

= Info.AllBaseFields.lookup(VBase.getType()->getAs<

RecordType

>())) {

5359 Diag

(

Value

->getSourceLocation(), diag::warn_abstract_vbase_init_ignored)

5360

<< VBase.getType() << ClassDecl;

5364

Info.AllToInit.push_back(

Value

);

5365

}

else if

(!AnyErrors && !ClassDecl->

isAbstract

()) {

5370 bool

IsInheritedVirtualBase = !DirectVBases.count(&VBase);

5373

&VBase, IsInheritedVirtualBase,

5379

Info.AllToInit.push_back(CXXBaseInit);

5384 for

(

auto

&

Base

: ClassDecl->

bases

()) {

5386 if

(

Base

.isVirtual())

5390

= Info.AllBaseFields.lookup(

Base

.getType()->getAs<

RecordType

>())) {

5391

Info.AllToInit.push_back(

Value

);

5392

}

else if

(!AnyErrors) {

5401

Info.AllToInit.push_back(CXXBaseInit);

5406 for

(

auto

*Mem : ClassDecl->

decls

()) {

5407 if

(

auto

*F = dyn_cast<FieldDecl>(Mem)) {

5412 if

(F->isUnnamedBitField())

5418 if

(F->isAnonymousStructOrUnion() && !Info.isImplicitCopyOrMove())

5427 if

(Info.isImplicitCopyOrMove())

5430 if

(

auto

*F = dyn_cast<IndirectFieldDecl>(Mem)) {

5431 if

(F->getType()->isIncompleteArrayType()) {

5433 "Incomplete array type is not valid"

);

5445 unsigned

NumInitializers = Info.AllToInit.size();

5446 if

(NumInitializers > 0) {

5447

Constructor->setNumCtorInitializers(NumInitializers);

5450 memcpy

(baseOrMemberInitializers, Info.AllToInit.data(),

5452

Constructor->setCtorInitializers(baseOrMemberInitializers);

5457

Constructor->getParent());

5467 for

(

auto

*Field : RD->

fields

())

5472

IdealInits.push_back(Field->getCanonicalDecl());

5481 if

(!

Member

->isAnyMemberInitializer())

5484 return Member

->getAnyMember()->getCanonicalDecl();

5490 if

(

Previous

->isAnyMemberInitializer())

5493 Diag

<< 1 <<

Previous

->getTypeSourceInfo()->getType();

5495 if

(Current->isAnyMemberInitializer())

5496 Diag

<< 0 << Current->getAnyMember();

5498 Diag

<< 1 << Current->getTypeSourceInfo()->getType();

5504 if

(Constructor->getDeclContext()->isDependentContext())

5509 bool

ShouldCheckOrder =

false

;

5510 for

(

unsigned

InitIndex = 0; InitIndex != Inits.size(); ++InitIndex) {

5513 Init

->getSourceLocation())) {

5514

ShouldCheckOrder =

true

;

5518 if

(!ShouldCheckOrder)

5529 for

(

const auto

&VBase : ClassDecl->

vbases

())

5533 for

(

const auto

&

Base

: ClassDecl->

bases

()) {

5534 if

(

Base

.isVirtual())

5540 for

(

auto

*Field : ClassDecl->

fields

()) {

5541 if

(Field->isUnnamedBitField())

5547 unsigned

NumIdealInits = IdealInitKeys.size();

5548 unsigned

IdealIndex = 0;

5557 for

(

unsigned

InitIndex = 0; InitIndex != Inits.size(); ++InitIndex) {

5562 for

(; IdealIndex != NumIdealInits; ++IdealIndex)

5563 if

(InitKey == IdealInitKeys[IdealIndex])

5569 if

(IdealIndex == NumIdealInits && InitIndex) {

5570

WarnIndexes.push_back(InitIndex);

5573 for

(IdealIndex = 0; IdealIndex != NumIdealInits; ++IdealIndex)

5574 if

(InitKey == IdealInitKeys[IdealIndex])

5577

assert(IdealIndex < NumIdealInits &&

5578 "initializer not found in initializer list"

);

5580

CorrelatedInitOrder.emplace_back(IdealIndex, InitIndex);

5583 if

(WarnIndexes.empty())

5587

llvm::sort(CorrelatedInitOrder, llvm::less_first());

5593

Inits[WarnIndexes.front() - 1]->getSourceLocation(),

5594

WarnIndexes.size() == 1 ? diag::warn_initializer_out_of_order

5595

: diag::warn_some_initializers_out_of_order);

5597 for

(

unsigned

I = 0; I < CorrelatedInitOrder.size(); ++I) {

5598 if

(CorrelatedInitOrder[I].second == I)

5604

Inits[I]->getSourceRange(),

5607

Inits[CorrelatedInitOrder[I].second]->getSourceRange()),

5613 if

(WarnIndexes.size() == 1) {

5615

Inits[WarnIndexes.front()]);

5621 for

(

unsigned

WarnIndex : WarnIndexes) {

5624

diag::note_initializer_out_of_order);

5631bool

CheckRedundantInit(

Sema

&S,

5640

S.

Diag

(

Init

->getSourceLocation(),

5641

diag::err_multiple_mem_initialization)

5642

<<

Field

->getDeclName()

5643

<<

Init

->getSourceRange();

5645 const Type

*BaseClass =

Init

->getBaseClass();

5646

assert(BaseClass &&

"neither field nor base"

);

5647

S.

Diag

(

Init

->getSourceLocation(),

5648

diag::err_multiple_base_initialization)

5650

<<

Init

->getSourceRange();

5658typedef

std::pair<NamedDecl *, CXXCtorInitializer *> UnionEntry;

5659typedef

llvm::DenseMap<RecordDecl*, UnionEntry> RedundantUnionMap;

5661bool

CheckRedundantUnionInit(

Sema

&S,

5663

RedundantUnionMap &Unions) {

5668 while

(

Parent

->isAnonymousStructOrUnion() ||

Parent

->isUnion()) {

5669 if

(

Parent

->isUnion()) {

5670

UnionEntry &En = Unions[

Parent

];

5671 if

(En.first && En.first != Child) {

5672

S.

Diag

(

Init

->getSourceLocation(),

5673

diag::err_multiple_mem_union_initialization)

5674

<<

Field

->getDeclName()

5675

<<

Init

->getSourceRange();

5676

S.

Diag

(En.second->getSourceLocation(), diag::note_previous_initializer)

5677

<< 0 << En.second->getSourceRange();

5684 if

(!

Parent

->isAnonymousStructOrUnion())

5700 if

(!ConstructorDecl)

5706

= dyn_cast<CXXConstructorDecl>(ConstructorDecl);

5709 Diag

(ColonLoc, diag::err_only_constructors_take_base_inits);

5716

llvm::DenseMap<const void *, CXXCtorInitializer *> Members;

5719

RedundantUnionMap MemberUnions;

5721 bool

HadError =

false

;

5722 for

(

unsigned

i = 0; i < MemInits.size(); i++) {

5726 Init

->setSourceOrder(i);

5728 if

(

Init

->isAnyMemberInitializer()) {

5730 if

(CheckRedundantInit(*

this

,

Init

, Members[Key]) ||

5731

CheckRedundantUnionInit(*

this

,

Init

, MemberUnions))

5733

}

else if

(

Init

->isBaseInitializer()) {

5735 if

(CheckRedundantInit(*

this

,

Init

, Members[Key]))

5738

assert(

Init

->isDelegatingInitializer());

5740 if

(MemInits.size() != 1) {

5742

diag::err_delegating_initializer_alone)

5743

<<

Init

->getSourceRange() << MemInits[i ? 0 : 1]->getSourceRange();

5759

DiagnoseUninitializedFields(*

this

, Constructor);

5776 for

(

auto

*Field : ClassDecl->

fields

()) {

5777 if

(Field->isInvalidDecl())

5804 PDiag

(diag::err_access_dtor_field)

5805

<< Field->getDeclName()

5814 bool

VisitVirtualBases = !ClassDecl->

isAbstract

();

5821 if

(Dtor && Dtor->

isUsed

())

5822

VisitVirtualBases =

false

;

5828 for

(

const auto

&

Base

: ClassDecl->

bases

()) {

5834 if

(

Base

.isVirtual()) {

5835 if

(!VisitVirtualBases)

5837

DirectVirtualBases.insert(RT);

5854 PDiag

(diag::err_access_dtor_base)

5855

<<

Base

.getType() <<

Base

.getSourceRange(),

5862 if

(VisitVirtualBases)

5864

&DirectVirtualBases);

5869

llvm::SmallPtrSetImpl<const RecordType *> *DirectVirtualBases) {

5871 for

(

const auto

&VBase : ClassDecl->

vbases

()) {

5876 if

(DirectVirtualBases && DirectVirtualBases->count(RT))

5892 PDiag

(diag::err_access_dtor_vbase)

5898

diag::err_access_dtor_vbase, 0, ClassDecl->

getLocation

(),

5912

= dyn_cast<CXXConstructorDecl>(CDtorDecl)) {

5914

!ClassDecl || ClassDecl->isInvalidDecl()) {

5918

DiagnoseUninitializedFields(*

this

, Constructor);

5973 for

(CXXFinalOverriderMap::iterator M = FinalOverriders.begin(),

5974

MEnd = FinalOverriders.end();

5978

SOEnd = M->second.end();

5979

SO != SOEnd; ++SO) {

5986 if

(SO->second.size() != 1)

5989 if

(!SO->second.front().Method->isPureVirtual())

5992 if

(!SeenPureMethods.insert(SO->second.front().Method).second)

5995 Diag

(SO->second.front().Method->getLocation(),

5996

diag::note_pure_virtual_function)

5997

<< SO->second.front().Method->getDeclName() << RD->

getDeclName

();

6007struct

AbstractUsageInfo {

6015

AbstractType(S.Context.getCanonicalType(

6016

S.Context.getTypeDeclType(

Record

))),

6019 void

DiagnoseAbstractType() {

6028struct

CheckAbstractUsage {

6029

AbstractUsageInfo &Info;

6032

CheckAbstractUsage(AbstractUsageInfo &Info,

const NamedDecl

*Ctx)

6033

: Info(Info), Ctx(Ctx) {}

6037#define ABSTRACT_TYPELOC(CLASS, PARENT) 6038#define TYPELOC(CLASS, PARENT) \ 6039 case TypeLoc::CLASS: Check(TL.castAs<CLASS##TypeLoc>(), Sel); break; 6040#include "clang/AST/TypeLocNodes.def" 6061 for

(

unsigned

I = 0,

E

= TL.

getNumArgs

(); I !=

E

; ++I) {

6071#define CheckPolymorphic(Type) \ 6072 void Check(Type TL, Sema::AbstractDiagSelID Sel) { \ 6073 Visit(TL.getNextTypeLoc(), Sema::AbstractNone); \ 6088 return

Visit(Next, Sel);

6098 T

= Info.S.Context.getBaseElementType(

T

);

6101 if

(CT != Info.AbstractType)

return

;

6106

Info.S.Diag(Ctx->getLocation(), diag::err_array_of_abstract_type)

6109

Info.S.Diag(Ctx->getLocation(), diag::err_abstract_type_in_decl)

6112

Info.DiagnoseAbstractType();

6118

CheckAbstractUsage(*

this

,

D

).Visit(TL, Sel);

6153 for

(

auto

*

D

: RD->

decls

()) {

6157 if

(

auto

*FD = dyn_cast<FriendDecl>(

D

)) {

6158 D

= FD->getFriendDecl();

6159 if

(!

D

)

continue

;

6163 if

(

auto

*FD = dyn_cast<FunctionDecl>(

D

)) {

6165

}

else if

(

auto

*FTD = dyn_cast<FunctionTemplateDecl>(

D

)) {

6169

}

else if

(

auto

*FD = dyn_cast<FieldDecl>(

D

)) {

6172

}

else if

(

auto

*VD = dyn_cast<VarDecl>(

D

)) {

6174

}

else if

(

auto

*VTD = dyn_cast<VarTemplateDecl>(

D

)) {

6178

}

else if

(

auto

*RD = dyn_cast<CXXRecordDecl>(

D

)) {

6180

}

else if

(

auto

*CTD = dyn_cast<ClassTemplateDecl>(

D

)) {

6191

assert(ClassAttr->

getKind

() == attr::DLLExport);

6201 struct

MarkingClassDllexported {

6208

Ctx.PointOfInstantiation = AttrLoc;

6209

Ctx.Entity =

Class

;

6212

~MarkingClassDllexported() {

6222 if

(!

Member

->hasAttr<DLLExportAttr>())

6227 auto

*VD = dyn_cast<VarDecl>(

Member

);

6228 if

(VD && VD->getStorageClass() ==

SC_Static

&&

6232 auto

*MD = dyn_cast<CXXMethodDecl>(

Member

);

6236 if

(MD->isUserProvided()) {

6246 auto

*CD = dyn_cast<CXXConstructorDecl>(MD);

6247 if

(CD && CD->isDefaultConstructor() && TSK ==

TSK_Undeclared

) {

6256

}

else if

(MD->isExplicitlyDefaulted()) {

6265

}

else if

(!MD->isTrivial() ||

6266

MD->isCopyAssignmentOperator() ||

6267

MD->isMoveAssignmentOperator()) {

6291 auto

*CD = dyn_cast<CXXConstructorDecl>(

Member

);

6292 if

(!CD || !CD->isDefaultConstructor())

6294 auto

*

Attr

= CD->getAttr<DLLExportAttr>();

6300 if

(!

Class

->isDependentContext()) {

6307 if

(LastExportedDefaultCtor) {

6309

diag::err_attribute_dll_ambiguous_default_ctor)

6311

S.

Diag

(CD->getLocation(), diag::note_entity_declared_at)

6312

<< CD->getDeclName();

6315

LastExportedDefaultCtor = CD;

6321 bool

ErrorReported =

false

;

6322 auto

reportIllegalClassTemplate = [&ErrorReported](

Sema

&S,

6326

S.

Diag

(TD->getLocation(),

6327

diag::err_cuda_device_builtin_surftex_cls_template)

6329

ErrorReported =

true

;

6334 auto

*SD = dyn_cast<ClassTemplateSpecializationDecl>(

Class

);

6337

diag::err_cuda_device_builtin_surftex_ref_decl)

6340

diag::note_cuda_device_builtin_surftex_should_be_template_class)

6344

TD = SD->getSpecializedTemplate();

6348 unsigned

N = Params->

size

();

6351

reportIllegalClassTemplate(S, TD);

6353

diag::note_cuda_device_builtin_surftex_cls_should_have_n_args)

6356 if

(N > 0 && !isa<TemplateTypeParmDecl>(Params->

getParam

(0))) {

6357

reportIllegalClassTemplate(S, TD);

6359

diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)

6363 auto

*NTTP = dyn_cast<NonTypeTemplateParmDecl>(Params->

getParam

(1));

6364 if

(!NTTP || !NTTP->getType()->isIntegralOrEnumerationType()) {

6365

reportIllegalClassTemplate(S, TD);

6367

diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)

6375 bool

ErrorReported =

false

;

6376 auto

reportIllegalClassTemplate = [&ErrorReported](

Sema

&S,

6380

S.

Diag

(TD->getLocation(),

6381

diag::err_cuda_device_builtin_surftex_cls_template)

6383

ErrorReported =

true

;

6388 auto

*SD = dyn_cast<ClassTemplateSpecializationDecl>(

Class

);

6391

diag::err_cuda_device_builtin_surftex_ref_decl)

6394

diag::note_cuda_device_builtin_surftex_should_be_template_class)

6398

TD = SD->getSpecializedTemplate();

6402 unsigned

N = Params->

size

();

6405

reportIllegalClassTemplate(S, TD);

6407

diag::note_cuda_device_builtin_surftex_cls_should_have_n_args)

6410 if

(N > 0 && !isa<TemplateTypeParmDecl>(Params->

getParam

(0))) {

6411

reportIllegalClassTemplate(S, TD);

6413

diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)

6417 auto

*NTTP = dyn_cast<NonTypeTemplateParmDecl>(Params->

getParam

(1));

6418 if

(!NTTP || !NTTP->getType()->isIntegralOrEnumerationType()) {

6419

reportIllegalClassTemplate(S, TD);

6421

diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)

6426 auto

*NTTP = dyn_cast<NonTypeTemplateParmDecl>(Params->

getParam

(2));

6427 if

(!NTTP || !NTTP->getType()->isIntegralOrEnumerationType()) {

6428

reportIllegalClassTemplate(S, TD);

6430

diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)

6438 for

(

auto

*Method :

Class

->methods()) {

6439 if

(Method->isUserProvided())

6451 if

(

auto

*Spec = dyn_cast<ClassTemplatePartialSpecializationDecl>(

Class

)) {

6452 if

(

Attr

*TemplateAttr =

6453 getDLLAttr

(Spec->getSpecializedTemplate()->getTemplatedDecl())) {

6454 auto

*A = cast<InheritableAttr>(TemplateAttr->clone(

getASTContext

()));

6455

A->setInherited(

true

);

6470

(!

Class

->isExternallyVisible() &&

Class

->hasExternalFormalLinkage())) {

6471 Class

->dropAttrs<DLLExportAttr, DLLImportAttr>();

6475 if

(!

Class

->isExternallyVisible()) {

6476 Diag

(

Class

->getLocation(), diag::err_attribute_dll_not_extern)

6477

<<

Class

<< ClassAttr;

6485 if

(!isa<VarDecl>(

Member

) && !isa<CXXMethodDecl>(

Member

))

6492

diag::err_attribute_dll_member_of_dll_class)

6493

<< MemberAttr << ClassAttr;

6494 Diag

(ClassAttr->getLocation(), diag::note_previous_attribute);

6495 Member

->setInvalidDecl();

6499 if

(

Class

->getDescribedClassTemplate())

6504 const bool

ClassExported = ClassAttr->

getKind

() == attr::DLLExport;

6509 const bool

PropagatedImport =

6511

cast<DLLImportAttr>(ClassAttr)->wasPropagatedToBaseTemplate();

6517 if

(ClassExported && !ClassAttr->

isInherited

() &&

6520 Class

->dropAttr<DLLExportAttr>();

6554 auto

*Ctor = dyn_cast<CXXConstructorDecl>(MD);

6563

(Ctor || isa<CXXDestructorDecl>(MD)) && MD->

isTrivial

())

6570 if

(VD && PropagatedImport)

6584 if

(ClassExported) {

6596 Member

->addAttr(NewAttr);

6606 "friend re-decl should not already have a DLLAttr"

);

6636

NewAttr->setInherited(

true

);

6637

BaseTemplateSpec->

addAttr

(NewAttr);

6641 if

(

auto

*ImportAttr = dyn_cast<DLLImportAttr>(NewAttr))

6642

ImportAttr->setPropagatedToBaseTemplate();

6663 Diag

(BaseLoc, diag::warn_attribute_dll_instantiated_base_class)

6668

diag::note_template_class_explicit_specialization_was_here)

6669

<< BaseTemplateSpec;

6672

diag::note_template_class_instantiation_was_here)

6673

<< BaseTemplateSpec;

6679 if

(

auto

*MD = dyn_cast<CXXMethodDecl>(FD)) {

6691 if

(MD->isCopyAssignmentOperator())

6694 if

(MD->isMoveAssignmentOperator())

6697 if

(isa<CXXDestructorDecl>(FD))

6705 case

OO_ExclaimEqual:

6717 case

OO_GreaterEqual:

6740

cast<CXXConstructorDecl>(FD));

6758

llvm_unreachable(

"Invalid special member."

);

6772 return

!

D

->hasNonTrivialDestructorForCall() &&

6773

!

D

->hasNonTrivialCopyConstructorForCall();

6776 bool

CopyCtorIsTrivial =

false

, CopyCtorIsTrivialForCall =

false

;

6777 bool

DtorIsTrivialForCall =

false

;

6785 if

(

D

->needsImplicitCopyConstructor()) {

6786 if

(!

D

->defaultedCopyConstructorIsDeleted()) {

6787 if

(

D

->hasTrivialCopyConstructor())

6788

CopyCtorIsTrivial =

true

;

6789 if

(

D

->hasTrivialCopyConstructorForCall())

6790

CopyCtorIsTrivialForCall =

true

;

6794 if

(CD->isCopyConstructor() && !CD->isDeleted() &&

6795

!CD->isIneligibleOrNotSelected()) {

6796 if

(CD->isTrivial())

6797

CopyCtorIsTrivial =

true

;

6798 if

(CD->isTrivialForCall())

6799

CopyCtorIsTrivialForCall =

true

;

6804 if

(

D

->needsImplicitDestructor()) {

6805 if

(!

D

->defaultedDestructorIsDeleted() &&

6806 D

->hasTrivialDestructorForCall())

6807

DtorIsTrivialForCall =

true

;

6808

}

else if

(

const auto

*DD =

D

->getDestructor()) {

6809 if

(!DD->isDeleted() && DD->isTrivialForCall())

6810

DtorIsTrivialForCall =

true

;

6814 if

(CopyCtorIsTrivialForCall && DtorIsTrivialForCall)

6828

uint64_t TypeSize = isAArch64 ? 128 : 64;

6830 if

(CopyCtorIsTrivial &&

6840 bool

HasNonDeletedCopyOrMove =

false

;

6842 if

(

D

->needsImplicitCopyConstructor() &&

6843

!

D

->defaultedCopyConstructorIsDeleted()) {

6844 if

(!

D

->hasTrivialCopyConstructorForCall())

6846

HasNonDeletedCopyOrMove =

true

;

6849 if

(S.

getLangOpts

().CPlusPlus11 &&

D

->needsImplicitMoveConstructor() &&

6850

!

D

->defaultedMoveConstructorIsDeleted()) {

6851 if

(!

D

->hasTrivialMoveConstructorForCall())

6853

HasNonDeletedCopyOrMove =

true

;

6856 if

(

D

->needsImplicitDestructor() && !

D

->defaultedDestructorIsDeleted() &&

6857

!

D

->hasTrivialDestructorForCall())

6861 if

(MD->isDeleted() || MD->isIneligibleOrNotSelected())

6864 auto

*CD = dyn_cast<CXXConstructorDecl>(MD);

6865 if

(CD && CD->isCopyOrMoveConstructor())

6866

HasNonDeletedCopyOrMove =

true

;

6867 else if

(!isa<CXXDestructorDecl>(MD))

6870 if

(!MD->isTrivialForCall())

6874 return

HasNonDeletedCopyOrMove;

6885 bool

IssuedDiagnostic =

false

;

6888 if

(!IssuedDiagnostic) {

6890

IssuedDiagnostic =

true

;

6892

S.

Diag

(O->getLocation(), diag::note_overridden_virtual_function);

6895 return

IssuedDiagnostic;

6902 if

(

Record

->isAbstract() && !

Record

->isInvalidDecl()) {

6903

AbstractUsageInfo Info(*

this

,

Record

);

6910 if

(!

Record

->isInvalidDecl() && !

Record

->isDependentType() &&

6911

!

Record

->isAggregate() && !

Record

->hasUserDeclaredConstructor() &&

6913 bool

Complained =

false

;

6914 for

(

const auto

*F :

Record

->fields()) {

6915 if

(F->hasInClassInitializer() || F->isUnnamedBitField())

6918 if

(F->getType()->isReferenceType() ||

6919

(F->getType().isConstQualified() && F->getType()->isScalarType())) {

6921 Diag

(

Record

->getLocation(), diag::warn_no_constructor_for_refconst)

6922

<< llvm::to_underlying(

Record

->getTagKind()) <<

Record

;

6926 Diag

(F->getLocation(), diag::note_refconst_member_not_initialized)

6927

<< F->getType()->isReferenceType()

6928

<< F->getDeclName();

6933 if

(

Record

->getIdentifier()) {

6946 if

(((isa<FieldDecl>(

D

) || isa<UnresolvedUsingValueDecl>(

D

)) &&

6947 Record

->hasUserDeclaredConstructor()) ||

6948

isa<IndirectFieldDecl>(

D

)) {

6949 Diag

((*I)->getLocation(), diag::err_member_name_of_class)

6950

<<

D

->getDeclName();

6957 if

(

Record

->isPolymorphic() && !

Record

->isDependentType()) {

6960

!

Record

->hasAttr<FinalAttr>())

6965 if

(

Record

->isAbstract()) {

6966 if

(FinalAttr *FA =

Record

->getAttr<FinalAttr>()) {

6967 Diag

(

Record

->getLocation(), diag::warn_abstract_final_class)

6968

<< FA->isSpelledAsSealed();

6974 if

(!

Record

->hasAttr<FinalAttr>()) {

6976 if

(

const

FinalAttr *FA = dtor->getAttr<FinalAttr>()) {

6977 Diag

(FA->getLocation(), diag::warn_final_dtor_non_final_class)

6978

<< FA->isSpelledAsSealed()

6981

(FA->isSpelledAsSealed() ?

" sealed"

:

" final"

));

6983

diag::note_final_dtor_non_final_class_silence)

6990 if

(

Record

->hasAttr<TrivialABIAttr>())

6995 bool

HasTrivialABI =

Record

->hasAttr<TrivialABIAttr>();

6998 Record

->setHasTrivialSpecialMemberForCall();

7008 auto

CheckCompletedMemberFunction = [&](

CXXMethodDecl

*MD) {

7011 if

(

ReportOverrides

(*

this

, diag::err_static_overrides_virtual, MD,

7019

MD->

isDeleted

() ? diag::err_deleted_override

7020

: diag::err_non_deleted_override,

7024 if

(MD->isDefaulted() && MD->isDeleted())

7033

MD->isConsteval() ? diag::err_consteval_override

7034

: diag::err_non_consteval_override,

7036 return

MD->isConsteval() !=

V

->isConsteval();

7038 if

(MD->isDefaulted() && MD->isDeleted())

7045 auto

CheckForDefaultedFunction = [&](

FunctionDecl

*FD) ->

bool

{

7046 if

(!FD || FD->

isInvalidDecl

() || !FD->isExplicitlyDefaulted())

7052

DefaultedSecondaryComparisons.push_back(FD);

7060 if

(!

Record

->isInvalidDecl() &&

7061 Record

->hasAttr<VTablePointerAuthenticationAttr>())

7066 bool Incomplete

= CheckForDefaultedFunction(M);

7069 if

(

Record

->isDependentType())

7075 if

(!M->isImplicit() && !M->isUserProvided()) {

7079 Record

->finishedDefaultedOrDeletedMember(M);

7080

M->setTrivialForCall(

7083 Record

->setTrivialForCallFlags(M);

7092

M->isUserProvided()) {

7093

M->setTrivialForCall(HasTrivialABI);

7094 Record

->setTrivialForCallFlags(M);

7097 if

(!M->isInvalidDecl() && M->isExplicitlyDefaulted() &&

7098

M->hasAttr<DLLExportAttr>()) {

7104

M->dropAttr<DLLExportAttr>();

7106 if

(M->hasAttr<DLLExportAttr>()) {

7112 bool

EffectivelyConstexprDestructor =

true

;

7116 if

(isa<CXXDestructorDecl>(M)) {

7117 auto

Check = [](

QualType T

,

auto

&&Check) ->

bool

{

7126 QualType

CanUnqualT =

T

.getCanonicalType().getUnqualifiedType();

7128 if

(B.getType().getCanonicalType().getUnqualifiedType() !=

7130

!Check(B.getType(), Check))

7135

!Check(FD->

getType

(), Check))

7139

EffectivelyConstexprDestructor =

7147

M->isDefaulted() && M->isConstexpr() && M->size_overridden_methods() &&

7148

EffectivelyConstexprDestructor)

7152

CheckCompletedMemberFunction(M);

7161

CompleteMemberFunction(Dtor);

7163 bool

HasMethodWithOverrideControl =

false

,

7164

HasOverridingMethodWithoutOverrideControl =

false

;

7165 for

(

auto

*

D

:

Record

->decls()) {

7166 if

(

auto

*M = dyn_cast<CXXMethodDecl>(

D

)) {

7169 if

(!

Record

->isDependentType()) {

7174 if

(M->hasAttr<OverrideAttr>())

7175

HasMethodWithOverrideControl =

true

;

7176 else if

(M->size_overridden_methods() > 0)

7177

HasOverridingMethodWithoutOverrideControl =

true

;

7180 if

(!isa<CXXDestructorDecl>(M))

7181

CompleteMemberFunction(M);

7182

}

else if

(

auto

*F = dyn_cast<FriendDecl>(

D

)) {

7183

CheckForDefaultedFunction(

7184

dyn_cast_or_null<FunctionDecl>(F->getFriendDecl()));

7188 if

(HasOverridingMethodWithoutOverrideControl) {

7189 bool

HasInconsistentOverrideControl = HasMethodWithOverrideControl;

7190 for

(

auto

*M :

Record

->methods())

7195 for

(

FunctionDecl

*FD : DefaultedSecondaryComparisons) {

7199 if

(

auto

*MD = dyn_cast<CXXMethodDecl>(FD))

7200

CheckCompletedMemberFunction(MD);

7217

(

Record

->isPolymorphic() ||

Record

->getNumBases())) {

7218 Diag

(

Record

->getLocation(), diag::warn_cxx_ms_struct);

7224 bool

ClangABICompat4 =

7232 if

(

Record

->getArgPassingRestrictions() !=

7234 Record

->setArgPassingRestrictions(

7243 Record

->setParamDestroyedInCallee(

true

);

7244 else if

(

Record

->hasNonTrivialDestructor())

7245 Record

->setParamDestroyedInCallee(CanPass);

7254 if

(

Record

->hasAttr<CUDADeviceBuiltinSurfaceTypeAttr>())

7256 else if

(

Record

->hasAttr<CUDADeviceBuiltinTextureTypeAttr>())

7274 unsigned

LHSQuals = 0;

7277

LHSQuals = FieldQuals;

7279 unsigned

RHSQuals = FieldQuals;

7301

llvm::DenseMap<CXXRecordDecl *, ConstructorUsingShadowDecl *>

7307

: S(S), UseLoc(UseLoc) {

7308 bool

DiagnosedMultipleConstructedBases =

false

;

7314 for

(

auto

*

D

: Shadow->

redecls

()) {

7315 auto

*DShadow = cast<ConstructorUsingShadowDecl>(

D

);

7316 auto

*DNominatedBase = DShadow->getNominatedBaseClass();

7317 auto

*DConstructedBase = DShadow->getConstructedBaseClass();

7319

InheritedFromBases.insert(

7320

std::make_pair(DNominatedBase->getCanonicalDecl(),

7321

DShadow->getNominatedBaseClassShadowDecl()));

7322 if

(DShadow->constructsVirtualBase())

7323

InheritedFromBases.insert(

7324

std::make_pair(DConstructedBase->getCanonicalDecl(),

7325

DShadow->getConstructedBaseClassShadowDecl()));

7327

assert(DNominatedBase == DConstructedBase);

7332 if

(!ConstructedBase) {

7333

ConstructedBase = DConstructedBase;

7334

ConstructedBaseIntroducer =

D

->getIntroducer();

7335

}

else if

(ConstructedBase != DConstructedBase &&

7337 if

(!DiagnosedMultipleConstructedBases) {

7338

S.

Diag

(UseLoc, diag::err_ambiguous_inherited_constructor)

7341

diag::note_ambiguous_inherited_constructor_using)

7343

DiagnosedMultipleConstructedBases =

true

;

7346

diag::note_ambiguous_inherited_constructor_using)

7347

<< DConstructedBase;

7351 if

(DiagnosedMultipleConstructedBases)

7358

std::pair<CXXConstructorDecl *, bool>

7360 auto

It = InheritedFromBases.find(

Base

->getCanonicalDecl());

7361 if

(It == InheritedFromBases.end())

7362 return

std::make_pair(

nullptr

,

false

);

7366 return

std::make_pair(

7368

It->second->constructsVirtualBase());

7371 return

std::make_pair(Ctor,

false

);

7388 if

(InheritedCtor) {

7391

Inherited->findConstructorForBase(ClassDecl, InheritedCtor).first;

7393 return

BaseCtor->isConstexpr();

7461 if

(Ctor && ClassDecl->

isUnion

())

7481 for

(

const auto

&B : ClassDecl->

bases

()) {

7487

InheritedCtor, Inherited))

7500 for

(

const auto

*F : ClassDecl->

fields

()) {

7501 if

(F->isInvalidDecl())

7504

F->hasInClassInitializer())

7508 CXXRecordDecl

*FieldRecDecl = cast<CXXRecordDecl>(RecordTy->getDecl());

7511

ConstArg && !F->isMutable()))

7526struct

ComputingExceptionSpec {

7533

Ctx.PointOfInstantiation =

Loc

;

7537

~ComputingExceptionSpec() {

7557 if

(DFK.isSpecialMember())

7559

S,

Loc

, cast<CXXMethodDecl>(FD), DFK.asSpecialMember(),

nullptr

);

7560 if

(DFK.isComparison())

7562

DFK.asComparison());

7564 auto

*CD = cast<CXXConstructorDecl>(FD);

7565

assert(CD->getInheritedConstructor() &&

7566 "only defaulted functions and inherited constructors have implicit " 7567 "exception specs"

);

7569

S,

Loc

, CD->getInheritedConstructor().getShadowDecl());

7596 auto

ESI = IES.getExceptionSpec();

7614

PT.getNonReferenceType()->getAsCXXRecordDecl()) {

7635 "not an explicitly-defaulted special member"

);

7645 bool

HadError =

false

;

7658 bool

ShouldDeleteForTypeMismatch =

false

;

7659 unsigned

ExpectedParams = 1;

7671 if

(DeleteOnTypeMismatch)

7672

ShouldDeleteForTypeMismatch =

true

;

7674 Diag

(MD->

getLocation

(), diag::err_defaulted_special_member_variadic)

7682 bool

CanHaveConstParam =

false

;

7692

ReturnType =

Type

->getReturnType();

7697

DeclType,

nullptr

);

7703 Diag

(MD->

getLocation

(), diag::err_defaulted_special_member_return_type)

7705

<< ExpectedReturnType;

7711 if

(DeleteOnTypeMismatch)

7712

ShouldDeleteForTypeMismatch =

true

;

7729 if

(!ExplicitObjectParameter.

isNull

() &&

7733 if

(DeleteOnTypeMismatch)

7734

ShouldDeleteForTypeMismatch =

true

;

7737

diag::err_defaulted_special_member_explicit_object_mismatch)

7750 bool

HasConstParam =

false

;

7757 if

(DeleteOnTypeMismatch)

7758

ShouldDeleteForTypeMismatch =

true

;

7761

diag::err_defaulted_special_member_volatile_param)

7762

<< llvm::to_underlying(CSM);

7767 if

(HasConstParam && !CanHaveConstParam) {

7768 if

(DeleteOnTypeMismatch)

7769

ShouldDeleteForTypeMismatch =

true

;

7773

diag::err_defaulted_special_member_copy_const_param)

7779

diag::err_defaulted_special_member_move_const_param)

7784

}

else if

(ExpectedParams) {

7788 "unexpected non-ref argument"

);

7817

: isa<CXXConstructorDecl>(MD))) &&

7822

diag::err_incorrect_defaulted_constexpr_with_vb)

7823

<< llvm::to_underlying(CSM);

7824 for

(

const auto

&I : RD->

vbases

())

7825 Diag

(I.getBeginLoc(), diag::note_constexpr_virtual_base_here);

7828

<< llvm::to_underlying(CSM) << MD->

isConsteval

();

7844 if

(!

Type

->hasExceptionSpec()) {

7862

<< llvm::to_underlying(CSM);

7863 if

(ShouldDeleteForTypeMismatch) {

7865

<< llvm::to_underlying(CSM);

7869 Diag

(DefaultLoc, diag::note_replace_equals_default_to_delete)

7873 if

(ShouldDeleteForTypeMismatch && !HadError) {

7875

diag::warn_cxx17_compat_defaulted_method_type_mismatch)

7876

<< llvm::to_underlying(CSM);

7883

<< llvm::to_underlying(CSM);

7884

assert(!ShouldDeleteForTypeMismatch &&

"deleted non-first decl"

);

7906template

<

typename

Derived,

typename

ResultList,

typename Result

,

7908class

DefaultedComparisonVisitor {

7913

DefaultedComparisonKind DCK)

7914

: S(S), RD(RD), FD(FD), DCK(DCK) {

7918

Fns.assign(Info->getUnqualifiedLookups().begin(),

7919

Info->getUnqualifiedLookups().end());

7923

ResultList visit() {

7931 case

DefaultedComparisonKind::None:

7932

llvm_unreachable(

"not a defaulted comparison"

);

7934 case

DefaultedComparisonKind::Equal:

7935 case

DefaultedComparisonKind::ThreeWay:

7936

getDerived().visitSubobjects(Results, RD, ParamLvalType.

getQualifiers

());

7939 case

DefaultedComparisonKind::NotEqual:

7940 case

DefaultedComparisonKind::Relational:

7941

Results.add(getDerived().visitExpandedSubobject(

7942

ParamLvalType, getDerived().getCompleteObject()));

7945

llvm_unreachable(

""

);

7949

Derived &getDerived() {

return static_cast<

Derived&

>

(*this); }

7960 if

(Results.add(getDerived().visitSubobject(

7962

getDerived().getBase(&

Base

))))

7969 if

(

Field

->isUnnamedBitField())

7972 if

(

Field

->isAnonymousStructOrUnion()) {

7973 if

(visitSubobjects(Results,

Field

->getType()->getAsCXXRecordDecl(),

7981 if

(

Field

->isMutable())

7986 if

(Results.add(getDerived().visitSubobject(

7987

FieldType, getDerived().getField(Field))))

7995

Result visitSubobject(

QualType Type

, Subobject Subobj) {

7998 if

(

auto

*CAT = dyn_cast_or_null<ConstantArrayType>(AT))

7999 return

getDerived().visitSubobjectArray(CAT->getElementType(),

8000

CAT->getSize(), Subobj);

8001 return

getDerived().visitExpandedSubobject(

Type

, Subobj);

8004

Result visitSubobjectArray(

QualType Type

,

const

llvm::APInt &Size,

8006 return

getDerived().visitSubobject(

Type

, Subobj);

8013

DefaultedComparisonKind DCK;

8019struct

DefaultedComparisonInfo {

8024 static

DefaultedComparisonInfo deleted() {

8025

DefaultedComparisonInfo

Deleted

;

8030 bool

add(

const

DefaultedComparisonInfo &R) {

8040struct

DefaultedComparisonSubobject {

8048class

DefaultedComparisonAnalyzer

8049

:

public

DefaultedComparisonVisitor<DefaultedComparisonAnalyzer,

8050

DefaultedComparisonInfo,

8051

DefaultedComparisonInfo,

8052

DefaultedComparisonSubobject> {

8054 enum

DiagnosticKind { NoDiagnostics, ExplainDeleted, ExplainConstexpr };

8057

DiagnosticKind Diagnose;

8060 using Base

= DefaultedComparisonVisitor;

8061 using

Result = DefaultedComparisonInfo;

8062 using

Subobject = DefaultedComparisonSubobject;

8067

DefaultedComparisonKind DCK,

8068

DiagnosticKind Diagnose = NoDiagnostics)

8069

:

Base

(S, RD, FD, DCK), Diagnose(Diagnose) {}

8072 if

((DCK == DefaultedComparisonKind::Equal ||

8073

DCK == DefaultedComparisonKind::ThreeWay) &&

8078 if

(Diagnose == ExplainDeleted) {

8080

<< FD << RD->

isUnion

() << RD;

8082 return

Result::deleted();

8085 return

Base::visit();

8089

Subobject getCompleteObject() {

8090 return

Subobject{Subobject::CompleteObject, RD, FD->

getLocation

()};

8094 return

Subobject{Subobject::Base,

Base

->getType()->getAsCXXRecordDecl(),

8095 Base

->getBaseTypeLoc()};

8099 return

Subobject{Subobject::Member,

Field

,

Field

->getLocation()};

8102

Result visitExpandedSubobject(

QualType Type

, Subobject Subobj) {

8107 if

(Diagnose == ExplainDeleted) {

8108

S.

Diag

(Subobj.Loc, diag::note_defaulted_comparison_reference_member)

8111 return

Result::deleted();

8116 Expr

*Args[] = {&Xi, &Xi};

8120

assert(OO !=

OO_None

&&

"not an overloaded operator!"

);

8121 return

visitBinaryOperator(OO, Args, Subobj);

8135

!SpaceshipCandidates));

8140

CandidateSet.exclude(FD);

8142 if

(Args[0]->getType()->isOverloadableType())

8153 switch

(CandidateSet.BestViableFunction(S, FD->

getLocation

(), Best)) {

8159 if

((DCK == DefaultedComparisonKind::NotEqual ||

8160

DCK == DefaultedComparisonKind::Relational) &&

8161

!Best->RewriteKind) {

8162 if

(Diagnose == ExplainDeleted) {

8163 if

(Best->Function) {

8164

S.

Diag

(Best->Function->getLocation(),

8165

diag::note_defaulted_comparison_not_rewritten_callee)

8168

assert(Best->Conversions.size() == 2 &&

8169

Best->Conversions[0].isUserDefined() &&

8170 "non-user-defined conversion from class to built-in " 8172

S.

Diag

(Best->Conversions[0]

8173

.UserDefined.FoundConversionFunction.getDecl()

8175

diag::note_defaulted_comparison_not_rewritten_conversion)

8179 return

Result::deleted();

8189 CXXRecordDecl

*ArgClass = Args[0]->getType()->getAsCXXRecordDecl();

8190 if

(ArgClass && Best->FoundDecl.getDecl() &&

8191

Best->FoundDecl.getDecl()->isCXXClassMember()) {

8192 QualType

ObjectType = Subobj.Kind == Subobject::Member

8193

? Args[0]->getType()

8196

ArgClass, Best->FoundDecl, ObjectType, Subobj.Loc,

8197

Diagnose == ExplainDeleted

8198

? S.

PDiag

(diag::note_defaulted_comparison_inaccessible)

8199

<< FD << Subobj.Kind << Subobj.Decl

8201 return

Result::deleted();

8204 bool

NeedsDeducing =

8212

assert(!BestFD->isDeleted() &&

"wrong overload resolution result"

);

8214 if

(Diagnose == ExplainConstexpr && !BestFD->isConstexpr()) {

8215 if

(Subobj.Kind != Subobject::CompleteObject)

8216

S.

Diag

(Subobj.Loc, diag::note_defaulted_comparison_not_constexpr)

8217

<< Subobj.

Kind

<< Subobj.Decl;

8218

S.

Diag

(BestFD->getLocation(),

8219

diag::note_defaulted_comparison_not_constexpr_here);

8221 return

Result::deleted();

8223

R.Constexpr &= BestFD->isConstexpr();

8225 if

(NeedsDeducing) {

8230 if

(BestFD->getReturnType()->isUndeducedType() &&

8236 if

(Diagnose == NoDiagnostics) {

8239

diag::err_defaulted_comparison_cannot_deduce_undeduced_auto)

8240

<< Subobj.

Kind

<< Subobj.Decl;

8243

diag::note_defaulted_comparison_cannot_deduce_undeduced_auto)

8244

<< Subobj.

Kind

<< Subobj.Decl;

8245

S.

Diag

(BestFD->getLocation(),

8246

diag::note_defaulted_comparison_cannot_deduce_callee)

8247

<< Subobj.

Kind

<< Subobj.Decl;

8249 return

Result::deleted();

8252

BestFD->getCallResultType());

8254 if

(Diagnose == ExplainDeleted) {

8255

S.

Diag

(Subobj.Loc, diag::note_defaulted_comparison_cannot_deduce)

8256

<< Subobj.

Kind

<< Subobj.Decl

8257

<< BestFD->getCallResultType().withoutLocalFastQualifiers();

8258

S.

Diag

(BestFD->getLocation(),

8259

diag::note_defaulted_comparison_cannot_deduce_callee)

8260

<< Subobj.

Kind

<< Subobj.Decl;

8262 return

Result::deleted();

8264

R.Category = Info->Kind;

8267 QualType T

= Best->BuiltinParamTypes[0];

8268

assert(

T

== Best->BuiltinParamTypes[1] &&

8269 "builtin comparison for different types?"

);

8270

assert(Best->BuiltinParamTypes[2].isNull() &&

8271 "invalid builtin comparison"

);

8273 if

(NeedsDeducing) {

8274

std::optional<ComparisonCategoryType> Cat =

8276

assert(Cat &&

"no category for builtin comparison?"

);

8287 if

(Diagnose == ExplainDeleted) {

8290 Kind

= OO == OO_EqualEqual ? 1 : 2;

8291

CandidateSet.NoteCandidates(

8293

Subobj.Loc, S.

PDiag

(diag::note_defaulted_comparison_ambiguous)

8294

<< FD <<

Kind

<< Subobj.Kind << Subobj.Decl),

8297

R = Result::deleted();

8301 if

(Diagnose == ExplainDeleted) {

8302 if

((DCK == DefaultedComparisonKind::NotEqual ||

8303

DCK == DefaultedComparisonKind::Relational) &&

8304

!Best->RewriteKind) {

8305

S.

Diag

(Best->Function->getLocation(),

8306

diag::note_defaulted_comparison_not_rewritten_callee)

8309

S.

Diag

(Subobj.Loc,

8310

diag::note_defaulted_comparison_calls_deleted)

8311

<< FD << Subobj.

Kind

<< Subobj.Decl;

8315

R = Result::deleted();

8321 if

(OO == OO_Spaceship &&

8325 if

(!R.add(visitBinaryOperator(OO_EqualEqual, Args, Subobj,

8327

R.add(visitBinaryOperator(OO_Less, Args, Subobj, &CandidateSet));

8331 if

(Diagnose == ExplainDeleted) {

8332

S.

Diag

(Subobj.Loc, diag::note_defaulted_comparison_no_viable_function)

8333

<< FD << (OO == OO_EqualEqual || OO == OO_ExclaimEqual)

8334

<< Subobj.

Kind

<< Subobj.Decl;

8338 if

(SpaceshipCandidates) {

8339

SpaceshipCandidates->NoteCandidates(

8343

S.

Diag

(Subobj.Loc,

8344

diag::note_defaulted_comparison_no_viable_function_synthesized)

8345

<< (OO == OO_EqualEqual ? 0 : 1);

8348

CandidateSet.NoteCandidates(

8353

R = Result::deleted();

8362struct

StmtListResult {

8363 bool

IsInvalid =

false

;

8367

IsInvalid |= S.isInvalid();

8370

Stmts.push_back(S.get());

8377class

DefaultedComparisonSynthesizer

8378

:

public

DefaultedComparisonVisitor<DefaultedComparisonSynthesizer,

8379

StmtListResult, StmtResult,

8380

std::pair<ExprResult, ExprResult>> {

8382 unsigned

ArrayDepth = 0;

8385 using Base

= DefaultedComparisonVisitor;

8386 using

ExprPair = std::pair<ExprResult, ExprResult>;

8391

DefaultedComparisonKind DCK,

8393

:

Base

(S, RD, FD, DCK),

Loc

(BodyLoc) {}

8399

StmtListResult Stmts = visit();

8400 if

(Stmts.IsInvalid)

8405 case

DefaultedComparisonKind::None:

8406

llvm_unreachable(

"not a defaulted comparison"

);

8408 case

DefaultedComparisonKind::Equal: {

8417 auto

OldStmts = std::move(Stmts.Stmts);

8418

Stmts.Stmts.clear();

8421 auto

FinishCmp = [&] {

8422 if

(

Expr

*Prior = CmpSoFar.

get

()) {

8424 if

(RetVal.

isUnset

() && Stmts.Stmts.empty())

8427 else if

(Stmts.add(buildIfNotCondReturnFalse(Prior)))

8433 for

(

Stmt

*EAsStmt : llvm::reverse(OldStmts)) {

8434 Expr

*

E

= dyn_cast<Expr>(EAsStmt);

8437 if

(FinishCmp() || Stmts.add(EAsStmt))

8452

std::reverse(Stmts.Stmts.begin(), Stmts.Stmts.end());

8459 case

DefaultedComparisonKind::ThreeWay: {

8463

ComparisonCategoryType::StrongOrdering,

Loc

,

8464

Sema::ComparisonCategoryUsage::DefaultedOperator);

8470

RetVal = getDecl(EqualVD);

8473

RetVal = buildStaticCastToR(RetVal.

get

());

8477 case

DefaultedComparisonKind::NotEqual:

8478 case

DefaultedComparisonKind::Relational:

8479

RetVal = cast<Expr>(Stmts.Stmts.pop_back_val());

8505

ExprPair getCompleteObject() {

8508 if

(

const auto

*MD = dyn_cast<CXXMethodDecl>(FD);

8515

LHS = getParam(Param++);

8523

ExprPair Obj = getCompleteObject();

8524 if

(Obj.first.isInvalid() || Obj.second.isInvalid())

8527 const auto

CastToBase = [&](

Expr

*

E

) {

8532 return

{CastToBase(Obj.first.get()), CastToBase(Obj.second.get())};

8536

ExprPair Obj = getCompleteObject();

8537 if

(Obj.first.isInvalid() || Obj.second.isInvalid())

8560

assert(!

False

.isInvalid() &&

"should never fail"

);

8567

Sema::ConditionKind::Boolean),

8580

llvm::raw_svector_ostream OS(Str);

8581

OS <<

"i"

<< ArrayDepth;

8592 auto

IterRef = [&] {

8596

assert(!Ref.

isInvalid

() &&

"can't reference our own variable?"

);

8602 Loc

, BO_NE, IterRef(),

8604

assert(!Cond.

isInvalid

() &&

"should never fail"

);

8608

assert(!

Inc

.isInvalid() &&

"should never fail"

);

8612 if

(

E

.isInvalid())

8616

Subobj.first = Index(Subobj.first);

8617

Subobj.second = Index(Subobj.second);

8630 if

(

Expr

*ElemCmp = dyn_cast<Expr>(Substmt.

get

())) {

8631

assert(DCK == DefaultedComparisonKind::Equal &&

8632 "should have non-expression statement"

);

8633

Substmt = buildIfNotCondReturnFalse(ElemCmp);

8641

Sema::ConditionKind::Boolean),

8647 if

(Obj.first.isInvalid() || Obj.second.isInvalid())

8655

Obj.second.get(),

true

,

8663 case

DefaultedComparisonKind::None:

8664

llvm_unreachable(

"not a defaulted comparison"

);

8666 case

DefaultedComparisonKind::Equal:

8674 case

DefaultedComparisonKind::ThreeWay: {

8679

Op = buildStaticCastToR(Op.

get

());

8704 if

(

Comp

.isInvalid())

8707 nullptr

,

Loc

,

Comp

.get(), Sema::ConditionKind::Boolean);

8712

VDRef = getDecl(VD);

8725 case

DefaultedComparisonKind::NotEqual:

8726 case

DefaultedComparisonKind::Relational:

8731

llvm_unreachable(

""

);

8737

assert(!R->

isUndeducedType

() &&

"type should have been deduced already"

);

8755 Self

.LookupOverloadedOperatorName(OO, S, Operators);

8768 if

(Op == OO_Spaceship) {

8769

Lookup(OO_ExclaimEqual);

8771

Lookup(OO_EqualEqual);

8799 bool

IsMethod = isa<CXXMethodDecl>(FD);

8801 auto

*MD = cast<CXXMethodDecl>(FD);

8802

assert(!MD->

isStatic

() &&

"comparison function cannot be a static member"

);

8805 Diag

(MD->

getLocation

(), diag::err_ref_qualifier_comparison_operator);

8812

FPT->getParamTypes(), EPI));

8819 if

(!

T

.getNonReferenceType().isConstQualified() &&

8829

InsertLoc =

Loc

.getRParenLoc();

8834 Diag

(

Loc

, diag::err_defaulted_comparison_non_const)

8842 T

.getNonReferenceType().withConst()));

8848

FPT->getParamTypes(), EPI));

8860

FPT->getParamTypes(), EPI));

8866

(IsMethod ? 1 : 2)) {

8870

<<

int

(IsMethod) <<

int

(DCK);

8876 QualType

ParmTy = Param->getType();

8885

CTy = Ref->getPointeeType();

8895

RD = CTy->getAsCXXRecordDecl();

8896 Ok

&= RD !=

nullptr

;

8910

<<

int

(DCK) << ParmTy << RefTy <<

int

(!IsMethod) << PlainTy

8911

<< Param->getSourceRange();

8913

assert(!IsMethod &&

"should know expected type for method"

);

8915

diag::err_defaulted_comparison_param_unknown)

8916

<<

int

(DCK) << ParmTy << Param->getSourceRange();

8922 Diag

(FD->

getLocation

(), diag::err_defaulted_comparison_param_mismatch)

8924

<< ParmTy << Param->getSourceRange();

8929

assert(RD &&

"must have determined class"

);

8938

diag::err_defaulted_comparison_not_friend,

int

(DCK),

8943

return FD->getCanonicalDecl() ==

8944

F->getFriendDecl()->getCanonicalDecl();

8947

<<

int

(DCK) <<

int

(0) << RD;

8959 Diag

(FD->

getLocation

(), diag::err_defaulted_comparison_return_type_not_bool)

8969

RT->getContainedDeducedType() &&

8971

RT->getContainedAutoType()->isConstrained())) {

8973

diag::err_defaulted_comparison_deduced_return_type_not_auto)

8985

DefaultedComparisonInfo Info =

8986

DefaultedComparisonAnalyzer(*

this

, RD, FD, DCK).visit();

8998 Diag

(FD->

getLocation

(), diag::err_non_first_default_compare_deletes)

9000

DefaultedComparisonAnalyzer(*

this

, RD, FD, DCK,

9001

DefaultedComparisonAnalyzer::ExplainDeleted)

9009 Diag

(FD->

getLocation

(), diag::err_non_first_default_compare_in_class)

9012

diag::note_previous_declaration);

9024

DefaultedComparisonAnalyzer(*

this

, RD, FD, DCK,

9025

DefaultedComparisonAnalyzer::ExplainDeleted)

9075 Diag

(FD->

getBeginLoc

(), diag::err_defaulted_comparison_constexpr_mismatch)

9077

DefaultedComparisonAnalyzer(*

this

, RD, FD, DCK,

9078

DefaultedComparisonAnalyzer::ExplainConstexpr)

9099

EPI.ExceptionSpec.SourceDecl = FD;

9101

FPT->getParamTypes(), EPI));

9111

Ctx.PointOfInstantiation = Spaceship->getEndLoc();

9112

Ctx.Entity = Spaceship;

9116

EqualEqual->setImplicit();

9131 Scope

.addContextNote(UseLoc);

9138 CXXRecordDecl

*RD = PT.getNonReferenceType()->getAsCXXRecordDecl();

9142

DefaultedComparisonSynthesizer(*

this

, RD, FD, DCK, BodyLoc).build();

9156

L->CompletedImplicitDefinition(FD);

9163

ComputingExceptionSpec CES(S, FD,

Loc

);

9193

DefaultedComparisonSynthesizer(S, RD, FD, DCK, BodyLoc).build();

9215 for

(

auto

&Check : Overriding)

9227template

<

typename

Derived>

9228struct

SpecialMemberVisitor {

9235 bool

IsConstructor =

false

, IsAssignment =

false

, ConstArg =

false

;

9239

: S(S), MD(MD), CSM(CSM), ICI(ICI) {

9241 case

CXXSpecialMemberKind::DefaultConstructor:

9242 case

CXXSpecialMemberKind::CopyConstructor:

9243 case

CXXSpecialMemberKind::MoveConstructor:

9244

IsConstructor =

true

;

9246 case

CXXSpecialMemberKind::CopyAssignment:

9247 case

CXXSpecialMemberKind::MoveAssignment:

9248

IsAssignment =

true

;

9250 case

CXXSpecialMemberKind::Destructor:

9252 case

CXXSpecialMemberKind::Invalid:

9253

llvm_unreachable(

"invalid special member kind"

);

9259

ConstArg = RT->getPointeeType().isConstQualified();

9263

Derived &getDerived() {

return static_cast<

Derived&

>

(*this); }

9266 bool

isMove()

const

{

9267 return

CSM == CXXSpecialMemberKind::MoveConstructor ||

9268

CSM == CXXSpecialMemberKind::MoveAssignment;

9273 unsigned

Quals,

bool

IsMutable) {

9275

ConstArg && !IsMutable);

9283

assert(CSM == CXXSpecialMemberKind::DefaultConstructor);

9285

cast<CXXConstructorDecl>(MD)->getInheritedConstructor().getConstructor();

9292 typedef

llvm::PointerUnion<CXXBaseSpecifier*, FieldDecl*> Subobject;

9298 if

(

auto

*B = dyn_cast<CXXBaseSpecifier *>(Subobj))

9299 return

B->getBaseTypeLoc();

9301 return

cast<FieldDecl *>(Subobj)->getLocation();

9306

VisitNonVirtualBases,

9311

VisitPotentiallyConstructedBases,

9317 bool

visit(BasesToVisit Bases) {

9320 if

(Bases == VisitPotentiallyConstructedBases)

9321

Bases = RD->

isAbstract

() ? VisitNonVirtualBases : VisitAllBases;

9323 for

(

auto

&B : RD->

bases

())

9324 if

((Bases == VisitDirectBases || !B.isVirtual()) &&

9325

getDerived().visitBase(&B))

9328 if

(Bases == VisitAllBases)

9329 for

(

auto

&B : RD->

vbases

())

9330 if

(getDerived().visitBase(&B))

9333 for

(

auto

*F : RD->

fields

())

9334 if

(!F->isInvalidDecl() && !F->isUnnamedBitField() &&

9335

getDerived().visitField(F))

9344struct

SpecialMemberDeletionInfo

9345

: SpecialMemberVisitor<SpecialMemberDeletionInfo> {

9350 bool

AllFieldsAreConst;

9355

: SpecialMemberVisitor(S, MD, CSM, ICI), Diagnose(Diagnose),

9356 Loc

(MD->getLocation()), AllFieldsAreConst(

true

) {}

9361 return

ICI ? CXXSpecialMemberKind::Invalid : CSM;

9367 bool

visitField(

FieldDecl

*Field) {

return

shouldDeleteForField(Field); }

9370 bool

shouldDeleteForField(

FieldDecl

*FD);

9371 bool

shouldDeleteForAllConstMembers();

9373 bool

shouldDeleteForClassSubobject(

CXXRecordDecl

*Class, Subobject Subobj,

9375 bool

shouldDeleteForSubobjectCall(Subobject Subobj,

9377 bool

IsDtorCallInCtor);

9385bool

SpecialMemberDeletionInfo::isAccessible(Subobject Subobj,

9406bool

SpecialMemberDeletionInfo::shouldDeleteForSubobjectCall(

9408 bool

IsDtorCallInCtor) {

9415

DiagKind = !

Decl

? 0 : 1;

9418 else if

(!isAccessible(Subobj,

Decl

))

9420 else if

(!IsDtorCallInCtor && Field &&

Field

->getParent()->isUnion() &&

9421

!

Decl

->isTrivial()) {

9433 const auto

*RD = cast<CXXRecordDecl>(

Field

->getParent());

9447

diag::note_deleted_special_member_class_subobject)

9448

<< llvm::to_underlying(getEffectiveCSM()) << MD->

getParent

()

9449

<<

true

<<

Field

<< DiagKind << IsDtorCallInCtor

9454

diag::note_deleted_special_member_class_subobject)

9455

<< llvm::to_underlying(getEffectiveCSM()) << MD->

getParent

()

9456

<<

false

<<

Base

->getType() << DiagKind

9457

<< IsDtorCallInCtor <<

false

;

9470bool

SpecialMemberDeletionInfo::shouldDeleteForClassSubobject(

9473 bool

IsMutable =

Field

&&

Field

->isMutable();

9490 Field

->hasInClassInitializer()) &&

9491

shouldDeleteForSubobjectCall(Subobj, lookupIn(

Class

, Quals, IsMutable),

9498 if

(IsConstructor) {

9501 false

,

false

,

false

,

false

);

9502 if

(shouldDeleteForSubobjectCall(Subobj, SMOR,

true

))

9509bool

SpecialMemberDeletionInfo::shouldDeleteForVariantObjCPtrMember(

9524 auto

*ParentClass = cast<CXXRecordDecl>(FD->

getParent

());

9525

S.

Diag

(FD->

getLocation

(), diag::note_deleted_special_member_class_subobject)

9526

<< llvm::to_underlying(getEffectiveCSM()) << ParentClass

9527

<<

true

<< FD << 4 <<

false 9545 if

(

auto

*BaseCtor = SMOR.

getMethod

()) {

9550 if

(BaseCtor->isDeleted() &&

Diagnose

) {

9552

diag::note_deleted_special_member_class_subobject)

9553

<< llvm::to_underlying(getEffectiveCSM()) << MD->

getParent

()

9554

<<

false

<<

Base

->getType() <<

1

9558 return

BaseCtor->isDeleted();

9560 return

shouldDeleteForClassSubobject(BaseClass,

Base

, 0);

9565bool

SpecialMemberDeletionInfo::shouldDeleteForField(

FieldDecl

*FD) {

9569 if

(inUnion() && shouldDeleteForVariantObjCPtrMember(FD, FieldType))

9577

S.

Diag

(FD->

getLocation

(), diag::note_deleted_default_ctor_uninit_field)

9578

<< !!ICI << MD->

getParent

() << FD << FieldType <<

0;

9588

S.

Diag

(FD->

getLocation

(), diag::note_deleted_default_ctor_uninit_field)

9594

AllFieldsAreConst =

false

;

9600

S.

Diag

(FD->

getLocation

(), diag::note_deleted_copy_ctor_rvalue_reference)

9601

<< MD->

getParent

() << FD << FieldType;

9604

}

else if

(IsAssignment) {

9609

<< isMove() << MD->

getParent

() << FD << FieldType <<

0;

9624 if

(!inUnion() && FieldRecord->

isUnion

() &&

9626 bool

AllVariantFieldsAreConst =

true

;

9629 for

(

auto

*UI : FieldRecord->

fields

()) {

9632 if

(shouldDeleteForVariantObjCPtrMember(&*UI, UnionFieldType))

9636

AllVariantFieldsAreConst =

false

;

9639 if

(UnionFieldRecord &&

9640

shouldDeleteForClassSubobject(UnionFieldRecord, UI,

9647

AllVariantFieldsAreConst && !FieldRecord->

field_empty

()) {

9650

diag::note_deleted_default_ctor_all_const)

9661 if

(shouldDeleteForClassSubobject(FieldRecord, FD,

9672bool

SpecialMemberDeletionInfo::shouldDeleteForAllConstMembers() {

9676

AllFieldsAreConst) {

9677 bool

AnyFields =

false

;

9679 if

((AnyFields = !F->isUnnamedBitField()))

9685

diag::note_deleted_default_ctor_all_const)

9702

assert(!RD->

isDependentType

() &&

"do deletion after instantiation"

);

9738 bool

DeletesOnlyMatchingCopy =

9743

(!DeletesOnlyMatchingCopy ||

9748 for

(

auto

*I : RD->

ctors

()) {

9749 if

(I->isMoveConstructor()) {

9750

UserDeclaredMove = I;

9754

assert(UserDeclaredMove);

9756

(!DeletesOnlyMatchingCopy ||

9761 for

(

auto

*I : RD->

methods

()) {

9762 if

(I->isMoveAssignmentOperator()) {

9763

UserDeclaredMove = I;

9767

assert(UserDeclaredMove);

9770 if

(UserDeclaredMove) {

9772

diag::note_deleted_copy_user_declared_move)

9790

OperatorDelete,

false

)) {

9792 Diag

(RD->

getLocation

(), diag::note_deleted_dtor_no_operator_delete);

9797

SpecialMemberDeletionInfo SMI(*

this

, MD, CSM, ICI,

Diagnose

);

9805 if

(SMI.visit(SMI.IsAssignment ? SMI.VisitDirectBases

9806

: SMI.VisitPotentiallyConstructedBases))

9809 if

(SMI.shouldDeleteForAllConstMembers())

9833

assert(DFK &&

"not a defaultable function"

);

9840

DefaultedComparisonAnalyzer(

9842

DFK.

asComparison

(), DefaultedComparisonAnalyzer::ExplainDeleted)

9864

*Selected =

nullptr

;

9868

llvm_unreachable(

"not a special member"

);

9886 for

(

auto

*CI : RD->

ctors

()) {

9887 if

(!CI->isDefaultConstructor())

9894

*Selected = DefCtor;

9927

}

else if

(!Selected) {

9935 goto

NeedOverloadResolution;

9945

}

else if

(!Selected) {

9950 goto

NeedOverloadResolution;

9954

NeedOverloadResolution:

9983

llvm_unreachable(

"unknown special method kind"

);

9987 for

(

auto

*CI : RD->

ctors

())

9988 if

(!CI->isImplicit())

9995

dyn_cast<CXXConstructorDecl>(TI->getTemplatedDecl()))

10026

ConstRHS, TAH,

Diagnose

? &Selected :

nullptr

))

10034

S.

Diag

(SubobjLoc, diag::note_nontrivial_no_def_ctor)

10037

S.

Diag

(CD->getLocation(), diag::note_user_declared_ctor);

10038

}

else if

(!Selected)

10039

S.

Diag

(SubobjLoc, diag::note_nontrivial_no_copy)

10044

S.

Diag

(Selected->

getLocation

(), diag::note_nontrivial_user_provided)

10047

S.

Diag

(SubobjLoc, diag::note_nontrivial_user_provided)

10053

S.

Diag

(SubobjLoc, diag::note_nontrivial_subobject)

10071 for

(

const auto

*FI : RD->

fields

()) {

10072 if

(FI->isInvalidDecl() || FI->isUnnamedBitField())

10078 if

(FI->isAnonymousStructOrUnion()) {

10090

FI->hasInClassInitializer()) {

10092

S.

Diag

(FI->getLocation(), diag::note_nontrivial_default_member_init)

10103

S.

Diag

(FI->getLocation(), diag::note_nontrivial_objc_ownership)

10108 bool

ConstRHS = ConstArg && !FI->isMutable();

10131 "not special enough"

);

10135 bool

ConstArg =

false

;

10163

ClangABICompat14)) {

10193

llvm_unreachable(

"not a special member"

);

10199

diag::note_nontrivial_default_arg)

10218 for

(

const auto

&BI : RD->

bases

())

10243 Diag

(MD->

getLocation

(), diag::note_nontrivial_virtual_dtor) << RD;

10260 Diag

(BS.

getBeginLoc

(), diag::note_nontrivial_has_virtual) << RD << 1;

10265 for

(

const auto

*MI : RD->

methods

()) {

10266 if

(MI->isVirtual()) {

10268 Diag

(MLoc, diag::note_nontrivial_has_virtual) << RD << 0;

10273

llvm_unreachable(

"dynamic class with no vbases and no virtual functions"

);

10281struct

FindHiddenVirtualMethod {

10289 static bool

CheckMostOverridenMethods(

10291 const

llvm::SmallPtrSetImpl<const CXXMethodDecl *> &Methods) {

10295 if

(CheckMostOverridenMethods(O, Methods))

10311 bool

foundSameNameMethod =

false

;

10318

foundSameNameMethod =

true

;

10335 if

(!CheckMostOverridenMethods(MD, OverridenAndUsingBaseMethods))

10336

overloadedMethods.push_back(MD);

10340 if

(foundSameNameMethod)

10341

OverloadedMethods.append(overloadedMethods.begin(),

10342

overloadedMethods.end());

10343 return

foundSameNameMethod;

10350

llvm::SmallPtrSetImpl<const CXXMethodDecl *>& Methods) {

10366

FindHiddenVirtualMethod FHVM;

10377

ND = shad->getTargetDecl();

10383

OverloadedMethods = FHVM.OverloadedMethods;

10388 for

(

unsigned

i = 0, e = OverloadedMethods.size(); i != e; ++i) {

10391

diag::note_hidden_overloaded_virtual_declared_here) << overloadedMD;

10406 if

(!OverloadedMethods.empty()) {

10408

<< MD << (OverloadedMethods.size() > 1);

10415 auto

PrintDiagAndRemoveAttr = [&](

unsigned

N) {

10418 Diag

(RD.

getAttr

<TrivialABIAttr>()->getLocation(),

10419

diag::ext_cannot_use_trivial_abi) << &RD;

10420 Diag

(RD.

getAttr

<TrivialABIAttr>()->getLocation(),

10421

diag::note_cannot_use_trivial_abi_reason) << &RD << N;

10427 auto

HasNonDeletedCopyOrMoveConstructor = [&]() {

10439 if

(CD->isCopyOrMoveConstructor() && !CD->isDeleted())

10444 if

(!HasNonDeletedCopyOrMoveConstructor()) {

10445

PrintDiagAndRemoveAttr(0);

10451

PrintDiagAndRemoveAttr(1);

10455 for

(

const auto

&B : RD.

bases

()) {

10458 if

(!B.getType()->isDependentType() &&

10459

!B.getType()->getAsCXXRecordDecl()->canPassInRegisters()) {

10460

PrintDiagAndRemoveAttr(2);

10464 if

(B.isVirtual()) {

10465

PrintDiagAndRemoveAttr(3);

10470 for

(

const auto

*FD : RD.

fields

()) {

10475

PrintDiagAndRemoveAttr(4);

10480 if

(!RT->isDependentType() &&

10481

!cast<CXXRecordDecl>(RT->getDecl())->canPassInRegisters()) {

10482

PrintDiagAndRemoveAttr(5);

10491

diag::err_incomplete_type_vtable_pointer_auth))

10499

assert(PrimaryBase);

10502 if

(!BasePtr.getType()->getAsCXXRecordDecl()->isDynamicClass())

10504 Base

= BasePtr.getType()->getAsCXXRecordDecl();

10507 if

(!

Base

||

Base

== PrimaryBase || !

Base

->isPolymorphic())

10509 Diag

(RD.

getAttr

<VTablePointerAuthenticationAttr>()->getLocation(),

10510

diag::err_non_top_level_vtable_pointer_auth)

10512

PrimaryBase =

Base

;

10516 Diag

(RD.

getAttr

<VTablePointerAuthenticationAttr>()->getLocation(),

10517

diag::err_non_polymorphic_vtable_pointer_auth)

10530 if

(AL.getKind() != ParsedAttr::AT_Visibility)

10533 Diag

(AL.getLoc(), diag::warn_attribute_after_definition_ignored) << AL;

10541

LBrac, RBrac, AttrList);

10559 if

(!FD)

continue

;

10563

Spaceships.clear();

10569

Spaceships.push_back(FD);

10578 if

(

auto

*FD = dyn_cast<FunctionDecl>(ND))

10579 if

(FD->isExplicitlyDefaulted())

10580

Spaceships.push_back(FD);

10675

DefaultedSpaceships);

10676 for

(

auto

*FD : DefaultedSpaceships)

10683

llvm::function_ref<

Scope

*()> EnterScope) {

10694 for

(

unsigned

i = 0; i < DD->getNumTemplateParameterLists(); ++i)

10695

ParameterLists.push_back(DD->getTemplateParameterList(i));

10699

ParameterLists.push_back(FTD->getTemplateParameters());

10700

}

else if

(

VarDecl

*VD = dyn_cast<VarDecl>(

D

)) {

10704

ParameterLists.push_back(VTD->getTemplateParameters());

10705 else if

(

auto

*PSD = dyn_cast<VarTemplatePartialSpecializationDecl>(

D

))

10706

ParameterLists.push_back(PSD->getTemplateParameters());

10708

}

else if

(

TagDecl

*TD = dyn_cast<TagDecl>(

D

)) {

10709 for

(

unsigned

i = 0; i < TD->getNumTemplateParameterLists(); ++i)

10710

ParameterLists.push_back(TD->getTemplateParameterList(i));

10714

ParameterLists.push_back(CTD->getTemplateParameters());

10715 else if

(

auto

*PSD = dyn_cast<ClassTemplatePartialSpecializationDecl>(

D

))

10716

ParameterLists.push_back(PSD->getTemplateParameters());

10721 unsigned

Count = 0;

10722 Scope

*InnermostTemplateScope =

nullptr

;

10726 if

(Params->size() == 0)

10729

InnermostTemplateScope = EnterScope();

10731 if

(Param->getDeclName()) {

10732

InnermostTemplateScope->

AddDecl

(Param);

10740 if

(InnermostTemplateScope) {

10741

assert(LookupDC &&

"no enclosing DeclContext for template lookup"

);

10749 if

(!RecordD)

return

;

10756 if

(!RecordD)

return

;

10813 bool

DiagOccured =

false

;

10815

[DiagID, &S, &DiagOccured](

DeclSpec::TQ

, StringRef QualName,

10822

DiagOccured =

true

;

10825 D

.setInvalidType();

10831 if

(

D

.isInvalidType() ||

D

.getNumTypeObjects() <= 1)

10840

S.

Diag

(PointerLoc, diag::err_invalid_ctor_dtor_decl)

10842 D

.setInvalidType();

10847 bool

isVirtual =

D

.getDeclSpec().isVirtualSpecified();

10855 if

(!

D

.isInvalidType())

10856 Diag

(

D

.getIdentifierLoc(), diag::err_constructor_cannot_be)

10857

<<

"virtual"

<<

SourceRange

(

D

.getDeclSpec().getVirtualSpecLoc())

10859 D

.setInvalidType();

10862 if

(!

D

.isInvalidType())

10863 Diag

(

D

.getIdentifierLoc(), diag::err_constructor_cannot_be)

10864

<<

"static"

<<

SourceRange

(

D

.getDeclSpec().getStorageClassSpecLoc())

10866 D

.setInvalidType();

10870 if

(

unsigned

TypeQuals =

D

.getDeclSpec().getTypeQualifiers()) {

10872

diag::err_constructor_return_type, TypeQuals,

SourceLocation

(),

10873 D

.getDeclSpec().getConstSpecLoc(),

D

.getDeclSpec().getVolatileSpecLoc(),

10874 D

.getDeclSpec().getRestrictSpecLoc(),

10875 D

.getDeclSpec().getAtomicSpecLoc());

10876 D

.setInvalidType();

10889 D

.setInvalidType();

10908

= dyn_cast<CXXRecordDecl>(Constructor->getDeclContext());

10910 return

Constructor->setInvalidDecl();

10917 if

(!Constructor->isInvalidDecl() &&

10918

Constructor->hasOneParamOrDefaultArgs() &&

10919

Constructor->getTemplateSpecializationKind() !=

10921 QualType

ParamType = Constructor->getParamDecl(0)->getType();

10924 SourceLocation

ParamLoc = Constructor->getParamDecl(0)->getLocation();

10925 const char

*ConstRef

10926

= Constructor->getParamDecl(0)->getIdentifier() ?

"const &" 10928 Diag

(ParamLoc, diag::err_constructor_byvalue_arg)

10933

Constructor->setInvalidDecl();

10952 Expr

*ThisArg =

nullptr

;

10957 if

(OperatorDelete->isDestroyingOperatorDelete()) {

10958 QualType

ParamType = OperatorDelete->getParamDecl(0)->getType();

10965 ActOnCXXThis

(OperatorDelete->getParamDecl(0)->getLocation());

10966

assert(!This.isInvalid() &&

"couldn't form 'this' expr in dtor?"

);

10969 if

(This.isInvalid()) {

10972 Diag

(

Loc

, diag::note_implicit_delete_this_in_destructor_here);

10975

ThisArg = This.get();

10981 Destructor

->setOperatorDelete(OperatorDelete, ThisArg);

10997 Diag

(

D

.getIdentifierLoc(), diag::ext_destructor_typedef_name)

10998

<< DeclaratorType << isa<TypeAliasDecl>(TT->getDecl());

11001 if

(TST->isTypeAlias())

11002 Diag

(

D

.getIdentifierLoc(), diag::ext_destructor_typedef_name)

11003

<< DeclaratorType << 1;

11014 if

(!

D

.isInvalidType())

11015 Diag

(

D

.getIdentifierLoc(), diag::err_destructor_cannot_be)

11016

<<

"static"

<<

SourceRange

(

D

.getDeclSpec().getStorageClassSpecLoc())

11022 if

(!

D

.isInvalidType()) {

11031 if

(

D

.getDeclSpec().hasTypeSpecifier())

11032 Diag

(

D

.getIdentifierLoc(), diag::err_destructor_return_type)

11033

<<

SourceRange

(

D

.getDeclSpec().getTypeSpecTypeLoc())

11035 else if

(

unsigned

TypeQuals =

D

.getDeclSpec().getTypeQualifiers()) {

11038 D

.getDeclSpec().getConstSpecLoc(),

11039 D

.getDeclSpec().getVolatileSpecLoc(),

11040 D

.getDeclSpec().getRestrictSpecLoc(),

11041 D

.getDeclSpec().getAtomicSpecLoc());

11042 D

.setInvalidType();

11056 D

.setInvalidType();

11061 Diag

(

D

.getIdentifierLoc(), diag::err_destructor_with_params);

11065 D

.setInvalidType();

11070 Diag

(

D

.getIdentifierLoc(), diag::err_destructor_variadic);

11071 D

.setInvalidType();

11078 if

(!

D

.isInvalidType())

11098 if

(After.isInvalid())

11102

R.

setEnd

(After.getEnd());

11112 if

(!

D

.isInvalidType())

11113 Diag

(

D

.getIdentifierLoc(), diag::err_conv_function_not_member)

11114

<<

SourceRange

(

D

.getDeclSpec().getStorageClassSpecLoc())

11116 D

.setInvalidType();

11134 Diag

(

D

.getIdentifierLoc(), diag::err_conv_function_return_type)

11137 D

.setInvalidType();

11144 Diag

(

D

.getIdentifierLoc(), diag::err_conv_function_with_complex_decl)

11146 D

.setInvalidType();

11151 unsigned

NumParam = Proto->getNumParams();

11155 if

(NumParam == 1) {

11157 if

(

const auto

*

First

=

11158

dyn_cast_if_present<ParmVarDecl>(FTI.

Params

[0].

Param

);

11159 First

&&

First

->isExplicitObjectParameter())

11163 if

(NumParam != 0) {

11164 Diag

(

D

.getIdentifierLoc(), diag::err_conv_function_with_params);

11167 D

.setInvalidType();

11168

}

else if

(Proto->isVariadic()) {

11169 Diag

(

D

.getIdentifierLoc(), diag::err_conv_function_variadic);

11170 D

.setInvalidType();

11175 if

(Proto->getReturnType() != ConvType) {

11176 bool

NeedsTypedef =

false

;

11180 bool

PastFunctionChunk =

false

;

11181 for

(

auto

&Chunk :

D

.type_objects()) {

11182 switch

(Chunk.Kind) {

11184 if

(!PastFunctionChunk) {

11185 if

(Chunk.Fun.HasTrailingReturnType) {

11190

PastFunctionChunk =

true

;

11195

NeedsTypedef =

true

;

11204 extendLeft

(Before, Chunk.getSourceRange());

11215

After.isValid() ? After.getBegin() :

11216 D

.getIdentifierLoc();

11217 auto

&&DB =

Diag

(

Loc

, diag::err_conv_function_with_complex_decl);

11218

DB << Before << After;

11220 if

(!NeedsTypedef) {

11224 if

(After.isInvalid() && ConvTSI) {

11232

}

else if

(!Proto->getReturnType()->isDependentType()) {

11233

DB <<

1 << Proto->getReturnType();

11235

DB <<

2 << Proto->getReturnType();

11246

ConvType = Proto->getReturnType();

11253 Diag

(

D

.getIdentifierLoc(), diag::err_conv_function_to_array);

11255 D

.setInvalidType();

11257 Diag

(

D

.getIdentifierLoc(), diag::err_conv_function_to_function);

11259 D

.setInvalidType();

11265 if

(

D

.isInvalidType())

11272

? diag::warn_cxx98_compat_explicit_conversion_functions

11273

: diag::ext_explicit_conversion_functions)

11278

assert(Conversion &&

"Expected to receive a conversion function declaration"

);

11301 if

(ConvType == ClassType)

11306

<< ClassType << ConvType;

11309

<< ClassType << ConvType;

11324 return

ConversionTemplate;

11342 if

(!

D

.isFunctionDeclarator())

11349 for

(

unsigned

Idx = 0; Idx < FTI.

NumParams

; Idx++) {

11350 const auto

&ParamInfo = FTI.

Params

[Idx];

11351 if

(!ParamInfo.Param)

11353 ParmVarDecl

*Param = cast<ParmVarDecl>(ParamInfo.Param);

11357

ExplicitObjectParam = Param;

11361

diag::err_explicit_object_parameter_must_be_first)

11365 if

(!ExplicitObjectParam)

11370

diag::err_explicit_object_default_arg)

11376 D

.isStaticMember())) {

11378

diag::err_explicit_object_parameter_nonmember)

11380 D

.setInvalidType();

11383 if

(

D

.getDeclSpec().isVirtualSpecified()) {

11385

diag::err_explicit_object_parameter_nonmember)

11387 D

.setInvalidType();

11409 if

(

D

.getDeclSpec().isFriendSpecified() &&

11410

!isa_and_present<CXXRecordDecl>(

11413

diag::err_explicit_object_parameter_nonmember)

11415 D

.setInvalidType();

11420

diag::err_explicit_object_parameter_mutable)

11428

assert(

D

.isInvalidType() &&

"Explicit object parameter in non-member " 11429 "should have been diagnosed already"

);

11437

diag::err_explicit_object_parameter_constructor)

11440 D

.setInvalidType();

11447struct

BadSpecifierDiagnoser {

11450

~BadSpecifierDiagnoser() {

11458 return

check(SpecLoc,

11464 if

(!Specifiers.empty()) Specifiers +=

" "

;

11465

Specifiers += Spec;

11470

std::string Specifiers;

11476 TemplateName

GuidedTemplate =

D

.getName().TemplateName.get().get();

11478

assert(GuidedTemplateDecl &&

"missing template decl for deduction guide"

);

11485 Diag

(

D

.getIdentifierLoc(), diag::err_deduction_guide_wrong_scope)

11486

<< GuidedTemplateDecl;

11490 auto

&DS =

D

.getMutableDeclSpec();

11492 if

(DS.hasTypeSpecifier() || DS.getTypeQualifiers() ||

11493

DS.getStorageClassSpecLoc().isValid() || DS.isInlineSpecified() ||

11494

DS.isNoreturnSpecified() || DS.hasConstexprSpecifier()) {

11495

BadSpecifierDiagnoser Diagnoser(

11496

*

this

,

D

.getIdentifierLoc(),

11497

diag::err_deduction_guide_invalid_specifier);

11499

Diagnoser.check(DS.getStorageClassSpecLoc(), DS.getStorageClassSpec());

11500

DS.ClearStorageClassSpecs();

11504

Diagnoser.check(DS.getInlineSpecLoc(),

"inline"

);

11505

Diagnoser.check(DS.getNoreturnSpecLoc(),

"_Noreturn"

);

11506

Diagnoser.check(DS.getConstexprSpecLoc(),

"constexpr"

);

11507

DS.ClearConstexprSpec();

11509

Diagnoser.check(DS.getConstSpecLoc(),

"const"

);

11510

Diagnoser.check(DS.getRestrictSpecLoc(),

"__restrict"

);

11511

Diagnoser.check(DS.getVolatileSpecLoc(),

"volatile"

);

11512

Diagnoser.check(DS.getAtomicSpecLoc(),

"_Atomic"

);

11513

Diagnoser.check(DS.getUnalignedSpecLoc(),

"__unaligned"

);

11514

DS.ClearTypeQualifiers();

11516

Diagnoser.check(DS.getTypeSpecComplexLoc(), DS.getTypeSpecComplex());

11517

Diagnoser.check(DS.getTypeSpecSignLoc(), DS.getTypeSpecSign());

11518

Diagnoser.check(DS.getTypeSpecWidthLoc(), DS.getTypeSpecWidth());

11519

Diagnoser.check(DS.getTypeSpecTypeLoc(), DS.getTypeSpecType());

11520

DS.ClearTypeSpecType();

11523 if

(

D

.isInvalidType())

11527 bool

FoundFunction =

false

;

11533

diag::err_deduction_guide_with_complex_decl)

11537 if

(!Chunk.Fun.hasTrailingReturnType())

11539

diag::err_deduction_guide_no_trailing_return_type);

11544 ParsedType

TrailingReturnType = Chunk.Fun.getTrailingReturnType();

11547

assert(TSI &&

"deduction guide has valid type but invalid return type?"

);

11548 bool

AcceptableReturnType =

false

;

11549 bool

MightInstantiateToSpecialization =

false

;

11552 TemplateName

SpecifiedName = RetTST.getTypePtr()->getTemplateName();

11554

SpecifiedName, GuidedTemplate,

true

);

11558

assert(

Qualifiers

&&

"expected QualifiedTemplate"

);

11559 bool

SimplyWritten = !

Qualifiers

->hasTemplateKeyword() &&

11561 if

(SimplyWritten && TemplateMatches)

11562

AcceptableReturnType =

true

;

11567

MightInstantiateToSpecialization =

11568

!(TD && isa<ClassTemplateDecl>(TD) && !TemplateMatches);

11571

MightInstantiateToSpecialization =

true

;

11574 if

(!AcceptableReturnType)

11576

diag::err_deduction_guide_bad_trailing_return_type)

11577

<< GuidedTemplate << TSI->

getType

()

11578

<< MightInstantiateToSpecialization

11583

FoundFunction =

true

;

11586 if

(

D

.isFunctionDefinition())

11588 Diag

(

D

.getIdentifierLoc(), diag::err_deduction_guide_defines_function);

11602

assert(*IsInline != PrevNS->

isInline

());

11612

S.

Diag

(

Loc

, diag::warn_inline_namespace_reopened_noninline)

11615

S.

Diag

(

Loc

, diag::err_inline_namespace_mismatch);

11633 bool

IsInline = InlineLoc.

isValid

();

11634 bool

IsInvalid =

false

;

11635 bool

IsStd =

false

;

11636 bool

AddToKnown =

false

;

11647 auto

DiagnoseInlineStdNS = [&]() {

11648

assert(IsInline && II->

isStr

(

"std"

) &&

11650 "Precondition of DiagnoseInlineStdNS not met"

);

11651 Diag

(InlineLoc, diag::err_inline_namespace_std)

11667

RedeclarationKind::ForExternalRedeclaration);

11671

PrevNS = dyn_cast_or_null<NamespaceDecl>(PrevDecl);

11675 if

(IsInline && II->

isStr

(

"std"

) &&

11677

DiagnoseInlineStdNS();

11678 else if

(IsInline != PrevNS->

isInline

())

11680

&IsInline, PrevNS);

11681

}

else if

(PrevDecl) {

11683 Diag

(

Loc

, diag::err_redefinition_different_kind)

11688

}

else if

(II->

isStr

(

"std"

) &&

11691

DiagnoseInlineStdNS();

11696

AddToKnown = !IsInline;

11699

AddToKnown = !IsInline;

11713 if

(PrevNS && IsInline != PrevNS->

isInline

())

11715

&IsInline, PrevNS);

11728 if

(

const

VisibilityAttr *

Attr

= Namespc->

getAttr

<VisibilityAttr>())

11734

KnownNamespaces[Namespc] =

false

;

11742

TU->setAnonymousNamespace(Namespc);

11744

cast<NamespaceDecl>(

Parent

)->setAnonymousNamespace(Namespc);

11793 return

AD->getNamespace();

11794 return

dyn_cast_or_null<NamespaceDecl>(

D

);

11798 NamespaceDecl

*Namespc = dyn_cast_or_null<NamespaceDecl>(Dcl);

11799

assert(Namespc &&

"Invalid parameter, expected NamespaceDecl"

);

11802 if

(Namespc->

hasAttr

<VisibilityAttr>())

11805 if

(DeferredExportedNamespaces.erase(Namespc))

11810 return

cast_or_null<CXXRecordDecl>(

11819 return

cast_or_null<NamespaceDecl>(

11824enum

UnsupportedSTLSelect {

11831struct

InvalidSTLDiagnoser {

11836 QualType

operator()(UnsupportedSTLSelect Sel = USS_Other, StringRef Name =

""

,

11837 const VarDecl

*VD =

nullptr

) {

11839 auto D

= S.

Diag

(

Loc

, diag::err_std_compare_type_not_supported)

11840

<< TyForDiags << ((

int

)Sel);

11841 if

(Sel == USS_InvalidMember || Sel == USS_MissingMember) {

11842

assert(!Name.empty());

11846 if

(Sel == USS_InvalidMember) {

11859 "Looking for comparison category type outside of C++."

);

11873 if

(Info && FullyCheckedComparisonCategories[

static_cast<unsigned>

(Kind)]) {

11884

std::string NameForDiags =

"std::"

;

11886 Diag

(

Loc

, diag::err_implied_comparison_category_type_not_found)

11887

<< NameForDiags << (

int

)Usage;

11891

assert(Info->

Kind

== Kind);

11902

InvalidSTLDiagnoser UnsupportedSTLError{*

this

,

Loc

, TyForDiags(Info)};

11905 return

UnsupportedSTLError(USS_NonTrivial);

11910 if

(

Base

->isEmpty())

11913 return

UnsupportedSTLError();

11921 if

(std::distance(FIt, FEnd) != 1 ||

11922

!FIt->getType()->isIntegralOrEnumerationType()) {

11923 return

UnsupportedSTLError();

11933 return

UnsupportedSTLError(USS_MissingMember, MemName);

11936

assert(VD &&

"should not be null!"

);

11943 return

UnsupportedSTLError(USS_InvalidMember, MemName, VD);

11949 return

UnsupportedSTLError();

11956

FullyCheckedComparisonCategories[

static_cast<unsigned>

(Kind)] =

true

;

11980 "Looking for std::initializer_list outside of C++."

);

11994

dyn_cast<ClassTemplateSpecializationDecl>(RT->getDecl());

12003

TST = ICN->getInjectedTST();

12007

Template = dyn_cast_or_null<ClassTemplateDecl>(

12028 if

(!isa<TemplateTypeParmDecl>(Params->

getParam

(0)))

12040

*Element = Arguments[0].getAsType();

12047

S.

Diag

(

Loc

, diag::err_implied_std_initializer_list_not_found);

12054

S.

Diag

(

Loc

, diag::err_implied_std_initializer_list_not_found);

12059 Result

.suppressDiagnostics();

12062

S.

Diag

(

Found

->getLocation(), diag::err_malformed_std_initializer_list);

12070

!isa<TemplateTypeParmDecl>(Params->

getParam

(0))) {

12071

S.

Diag

(Template->

getLocation

(), diag::err_malformed_std_initializer_list);

12115 case

Decl::TranslationUnit:

12117 case

Decl::LinkageSpec:

12129 bool

ValidateCandidate(

const TypoCorrection

&candidate)

override

{

12131 return

isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND);

12135

std::unique_ptr<CorrectionCandidateCallback> clone()

override

{

12136 return

std::make_unique<NamespaceValidatorCCC>(*

this

);

12144 auto

*ND = cast<NamespaceDecl>(Corrected.

getFoundDecl

());

12145 Module

*M = ND->getOwningModule();

12146

assert(M &&

"hidden namespace definition not in a module?"

);

12150

diag::err_module_unimported_use_header)

12155

diag::err_module_unimported_use)

12165

NamespaceValidatorCCC CCC{};

12175 if

(isa_and_nonnull<NamespaceDecl>(Corrected.getFoundDecl()) &&

12176

Corrected.requiresImport()) {

12179

std::string CorrectedStr(Corrected.getAsString(S.

getLangOpts

()));

12180 bool

DroppedSpecifier =

12181

Corrected.WillReplaceSpecifier() && Ident->

getName

() == CorrectedStr;

12183

S.

PDiag

(diag::err_using_directive_member_suggest)

12184

<< Ident << DC << DroppedSpecifier << SS.

getRange

(),

12185

S.

PDiag

(diag::note_namespace_defined_here));

12188

S.

PDiag

(diag::err_using_directive_suggest) << Ident,

12189

S.

PDiag

(diag::note_namespace_defined_here));

12191

R.

addDecl

(Corrected.getFoundDecl());

12202

assert(!SS.

isInvalid

() &&

"Invalid CXXScopeSpec."

);

12203

assert(NamespcName &&

"Invalid NamespcName."

);

12204

assert(IdentLoc.

isValid

() &&

"Invalid NamespceName location."

);

12207

S = S->getDeclParent();

12225

NamespcName->

isStr

(

"std"

)) {

12226 Diag

(IdentLoc, diag::ext_using_undefined_std);

12234 if

(!R.

empty

()) {

12237

assert(

NS

&&

"expected namespace decl"

);

12256

CommonAncestor = CommonAncestor->

getParent

();

12260

IdentLoc, Named, CommonAncestor);

12264 Diag

(IdentLoc, diag::warn_using_directive_in_header);

12269 Diag

(IdentLoc, diag::err_expected_namespace_name) << SS.

getRange

();

12285 if

(Ctx && !Ctx->isFunctionOrMethod())

12286

Ctx->addDecl(UDir);

12302 Diag

(Name.getBeginLoc(), diag::err_using_requires_qualname);

12306 switch

(Name.getKind()) {

12317 Diag

(Name.getBeginLoc(),

12319

? diag::warn_cxx98_compat_using_decl_constructor

12320

: diag::err_using_decl_constructor)

12328 Diag

(Name.getBeginLoc(), diag::err_using_decl_destructor) << SS.

getRange

();

12332 Diag

(Name.getBeginLoc(), diag::err_using_decl_template_id)

12333

<<

SourceRange

(Name.TemplateId->LAngleLoc, Name.TemplateId->RAngleLoc);

12337

llvm_unreachable(

"cannot parse qualified deduction guide name"

);

12348

? diag::err_access_decl

12349

: diag::warn_access_decl_deprecated)

12360 Diag

(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)

12368

SS, TargetNameInfo, EllipsisLoc, AttrList,

12370

AttrList.

hasAttribute

(ParsedAttr::AT_UsingIfExists));

12382

assert(SS && !SS->

isInvalid

() &&

"ScopeSpec is invalid"

);

12386 if

(EnumTy.

isNull

()) {

12388

? diag::err_using_enum_is_dependent

12389

: diag::err_unknown_typename)

12395 Diag

(IdentLoc, diag::err_using_enum_is_dependent);

12401 Diag

(IdentLoc, diag::err_using_enum_not_enum) << EnumTy;

12405 if

(

auto

*Def =

Enum

->getDefinition())

12408 if

(TSI ==

nullptr

)

12431

TD2->getUnderlyingType());

12435 if

(isa<UnresolvedUsingIfExistsDecl>(D1) &&

12436

isa<UnresolvedUsingIfExistsDecl>(D2))

12465 if

(

auto

*Using = dyn_cast<UsingDecl>(BUD)) {

12469 if

(isa<EnumDecl>(OrigDC))

12477 Diag

(Using->getLocation(),

12478

diag::err_using_decl_nested_name_specifier_is_current_class)

12479

<< Using->getQualifierLoc().getSourceRange();

12481

Using->setInvalidDecl();

12485 Diag

(Using->getQualifierLoc().getBeginLoc(),

12486

diag::err_using_decl_nested_name_specifier_is_not_base_class)

12487

<< Using->getQualifier() << cast<CXXRecordDecl>(

CurContext

)

12488

<< Using->getQualifierLoc().getSourceRange();

12490

Using->setInvalidDecl();

12495 if

(

Previous

.empty())

return false

;

12498 if

(isa<UsingShadowDecl>(

Target

))

12499 Target

= cast<UsingShadowDecl>(

Target

)->getTargetDecl();

12506 NamedDecl

*NonTag =

nullptr

, *Tag =

nullptr

;

12507 bool

FoundEquivalentDecl =

false

;

12514 if

(isa<UsingDecl>(

D

) || isa<UsingPackDecl>(

D

) || isa<UsingEnumDecl>(

D

))

12517 if

(

auto

*RD = dyn_cast<CXXRecordDecl>(

D

)) {

12522

!isa<IndirectFieldDecl>(

Target

) &&

12523

!isa<UnresolvedUsingValueDecl>(

Target

) &&

12532

PrevShadow = Shadow;

12533

FoundEquivalentDecl =

true

;

12537

FoundEquivalentDecl =

true

;

12541

(isa<TagDecl>(

D

) ? Tag : NonTag) =

D

;

12544 if

(FoundEquivalentDecl)

12549 if

(isa<UnresolvedUsingIfExistsDecl>(

Target

) !=

12550

(isa_and_nonnull<UnresolvedUsingIfExistsDecl>(NonTag))) {

12551 if

(!NonTag && !Tag)

12554 Diag

(

Target

->getLocation(), diag::note_using_decl_target);

12555 Diag

((NonTag ? NonTag : Tag)->getLocation(),

12556

diag::note_using_decl_conflict);

12585 Diag

(

Target

->getLocation(), diag::note_using_decl_target);

12593 if

(isa<TagDecl>(

Target

)) {

12595 if

(!Tag)

return false

;

12598 Diag

(

Target

->getLocation(), diag::note_using_decl_target);

12599 Diag

(Tag->getLocation(), diag::note_using_decl_conflict);

12605 if

(!NonTag)

return false

;

12608 Diag

(

Target

->getLocation(), diag::note_using_decl_target);

12618 for

(

auto

&B : Derived->

bases

())

12619 if

(B.getType()->getAsCXXRecordDecl() ==

Base

)

12620 return

B.isVirtual();

12621

llvm_unreachable(

"not a direct base class"

);

12629 if

(isa<UsingShadowDecl>(

Target

)) {

12630 Target

= cast<UsingShadowDecl>(

Target

)->getTargetDecl();

12631

assert(!isa<UsingShadowDecl>(

Target

) &&

"nested shadow declaration"

);

12635 if

(

auto

*TargetTD = dyn_cast<TemplateDecl>(

Target

))

12636

NonTemplateTarget = TargetTD->getTemplatedDecl();

12639 if

(NonTemplateTarget && isa<CXXConstructorDecl>(NonTemplateTarget)) {

12640 UsingDecl

*Using = cast<UsingDecl>(BUD);

12641 bool

IsVirtualBase =

12643

Using->getQualifier()->getAsRecordDecl());

12670

cast<CXXRecordDecl>(Shadow->

getDeclContext

())->removeConversion(Shadow);

12677

S->RemoveDecl(Shadow);

12691 bool

&AnyDependentBases) {

12695 for

(

auto

&

Base

: Derived->

bases

()) {

12696 CanQualType

BaseType =

Base

.getType()->getCanonicalTypeUnqualified();

12697 if

(CanonicalDesiredBase == BaseType)

12699 if

(BaseType->isDependentType())

12700

AnyDependentBases =

true

;

12708

UsingValidatorCCC(

bool

HasTypenameKeyword,

bool

IsInstantiation,

12710

: HasTypenameKeyword(HasTypenameKeyword),

12711

IsInstantiation(IsInstantiation), OldNNS(NNS),

12712

RequireMemberOf(RequireMemberOf) {}

12714 bool

ValidateCandidate(

const TypoCorrection

&Candidate)

override

{

12718 if

(!ND || isa<NamespaceDecl>(ND))

12728 if

(RequireMemberOf) {

12729 auto

*FoundRecord = dyn_cast<CXXRecordDecl>(ND);

12730 if

(FoundRecord && FoundRecord->isInjectedClassName()) {

12751 bool

AnyDependentBases =

false

;

12754

AnyDependentBases) &&

12755

!AnyDependentBases)

12759 if

(!RD || RequireMemberOf->isProvablyNotDerivedFrom(RD))

12765 auto

*FoundRecord = dyn_cast<CXXRecordDecl>(ND);

12766 if

(FoundRecord && FoundRecord->isInjectedClassName())

12770 if

(isa<TypeDecl>(ND))

12771 return

HasTypenameKeyword || !IsInstantiation;

12773 return

!HasTypenameKeyword;

12776

std::unique_ptr<CorrectionCandidateCallback> clone()

override

{

12777 return

std::make_unique<UsingValidatorCCC>(*

this

);

12781 bool

HasTypenameKeyword;

12782 bool

IsInstantiation;

12811 bool

IsUsingIfExists) {

12812

assert(!SS.

isInvalid

() &&

"Invalid CXXScopeSpec."

);

12814

assert(IdentLoc.

isValid

() &&

"Invalid TargetName location."

);

12823 if

(

auto

*RD = dyn_cast<CXXRecordDecl>(

CurContext

))

12829

RedeclarationKind::ForVisibleRedeclaration);

12836

assert(IsInstantiation &&

"no scope in non-instantiation"

);

12864 Diag

(UsingLoc, diag::err_using_if_exists_on_ctor);

12870 if

(!LookupContext || EllipsisLoc.

isValid

()) {

12874

SS, NameInfo, IdentLoc))

12877 if

(HasTypenameKeyword) {

12880

UsingLoc, TypenameLoc,

12882

IdentLoc, NameInfo.

getName

(),

12886

QualifierLoc, NameInfo, EllipsisLoc);

12894 auto

Build = [&](

bool Invalid

) {

12897

UsingName, HasTypenameKeyword);

12904 auto

BuildInvalid = [&]{

return

Build(

true

); };

12905 auto

BuildValid = [&]{

return

Build(

false

); };

12908 return

BuildInvalid();

12917 if

(!IsInstantiation)

12934 if

(R.

empty

() && IsUsingIfExists)

12951

isa<TranslationUnitDecl>(LookupContext) &&

12954

UsingValidatorCCC CCC(HasTypenameKeyword, IsInstantiation, SS.

getScopeRep

(),

12962

<< NameInfo.

getName

() << LookupContext << 0

12967 NamedDecl

*ND = Corrected.getCorrectionDecl();

12969 return

BuildInvalid();

12972 auto

*RD = dyn_cast<CXXRecordDecl>(ND);

12975

RD = cast<CXXRecordDecl>(RD->

getParent

());

12978 if

(Corrected.WillReplaceSpecifier()) {

12980

Builder.MakeTrivial(

Context

, Corrected.getCorrectionSpecifier(),

12982

QualifierLoc = Builder.getWithLocInContext(

Context

);

12987 auto

*CurClass = cast<CXXRecordDecl>(

CurContext

);

13001 Diag

(IdentLoc, diag::err_no_member)

13003 return

BuildInvalid();

13008 return

BuildInvalid();

13010 if

(HasTypenameKeyword) {

13014 Diag

(IdentLoc, diag::err_using_typename_non_type);

13016 Diag

((*I)->getUnderlyingDecl()->getLocation(),

13017

diag::note_using_decl_target);

13018 return

BuildInvalid();

13025 Diag

(IdentLoc, diag::err_using_dependent_value_is_type);

13027 return

BuildInvalid();

13034 Diag

(IdentLoc, diag::err_using_decl_can_not_refer_to_namespace)

13039 return

BuildInvalid();

13075

RedeclarationKind::ForVisibleRedeclaration);

13081 if

(UED->getEnumDecl() == ED) {

13082 Diag

(UsingLoc, diag::err_using_enum_decl_redeclaration)

13108

RedeclarationKind::ForVisibleRedeclaration);

13121

assert(isa<UnresolvedUsingValueDecl>(InstantiatedFrom) ||

13122

isa<UnresolvedUsingTypenameDecl>(InstantiatedFrom) ||

13123

isa<UsingPackDecl>(InstantiatedFrom));

13127

UPD->setAccess(InstantiatedFrom->

getAccess

());

13133

assert(!UD->

hasTypename

() &&

"expecting a constructor name"

);

13136

assert(SourceType &&

13137 "Using decl naming constructor doesn't have type in scope spec."

);

13141 bool

AnyDependentBases =

false

;

13143

AnyDependentBases);

13144 if

(!

Base

&& !AnyDependentBases) {

13146

diag::err_using_decl_constructor_not_in_direct_base)

13148

<<

QualType

(SourceType, 0) << TargetClass;

13154 Base

->setInheritConstructors();

13160 bool

HasTypenameKeyword,

13179 if

(Qual->

isDependent

() && !HasTypenameKeyword) {

13180 for

(

auto

*

D

: Prev) {

13181 if

(!isa<TypeDecl>(

D

) && !isa<UsingDecl>(

D

) && !isa<UsingPackDecl>(

D

)) {

13182 bool

OldCouldBeEnumerator =

13183

isa<UnresolvedUsingValueDecl>(

D

) || isa<EnumConstantDecl>(

D

);

13185

OldCouldBeEnumerator ? diag::err_redefinition

13186

: diag::err_redefinition_different_kind)

13187

<< Prev.getLookupName();

13203 if

(

UsingDecl

*UD = dyn_cast<UsingDecl>(

D

)) {

13204

DTypename = UD->hasTypename();

13205

DQual = UD->getQualifier();

13207

= dyn_cast<UnresolvedUsingValueDecl>(

D

)) {

13208

DTypename =

false

;

13209

DQual = UD->getQualifier();

13211

= dyn_cast<UnresolvedUsingTypenameDecl>(

D

)) {

13213

DQual = UD->getQualifier();

13218 if

(HasTypenameKeyword != DTypename)

continue

;

13226 Diag

(NameLoc, diag::err_using_decl_redeclaration) << SS.

getRange

();

13240

assert(

bool

(NamedContext) == (R || UD) && !(R && UD) &&

13241 "resolvable context must have exactly one set of decls"

);

13245 bool

Cxx20Enumerator =

false

;

13246 if

(NamedContext) {

13255 if

(

auto

*ED = dyn_cast<EnumDecl>(NamedContext)) {

13259 if

(EC && R && ED->isScoped())

13262

? diag::warn_cxx17_compat_using_decl_scoped_enumerator

13263

: diag::ext_using_decl_scoped_enumerator)

13267

NamedContext = ED->getDeclContext();

13287

? diag::warn_cxx17_compat_using_decl_class_member_enumerator

13288

: diag::err_using_decl_can_not_refer_to_class_member)

13291 if

(Cxx20Enumerator)

13294 auto

*RD = NamedContext

13306 Diag

(SS.

getBeginLoc

(), diag::note_using_decl_class_member_workaround)

13307

<< diag::MemClassWorkaround::AliasDecl

13314 Diag

(InsertLoc, diag::note_using_decl_class_member_workaround)

13315

<< diag::MemClassWorkaround::TypedefDecl

13330 Diag

(UsingLoc, diag::note_using_decl_class_member_workaround)

13331

<< diag::MemClassWorkaround::ReferenceDecl << FixIt;

13344 Diag

(UsingLoc, diag::note_using_decl_class_member_workaround)

13346

? diag::MemClassWorkaround::ConstexprVar

13347

: diag::MemClassWorkaround::ConstVar)

13356 if

(!NamedContext) {

13367 if

(!NamedContext->

isRecord

()) {

13372

? diag::warn_cxx17_compat_using_decl_non_member_enumerator

13373

: diag::err_using_decl_nested_name_specifier_is_not_class)

13376 if

(Cxx20Enumerator)

13393

cast<CXXRecordDecl>(NamedContext))) {

13395 if

(Cxx20Enumerator) {

13396 Diag

(NameLoc, diag::warn_cxx17_compat_using_decl_non_member_enumerator)

13403

diag::err_using_decl_nested_name_specifier_is_current_class)

13408 if

(!cast<CXXRecordDecl>(NamedContext)->isInvalidDecl()) {

13410

diag::err_using_decl_nested_name_specifier_is_not_base_class)

13435

Bases.insert(

Base

);

13440 if

(!cast<CXXRecordDecl>(

CurContext

)->forallBases(Collect))

13446 return

!Bases.count(

Base

);

13451 if

(Bases.count(cast<CXXRecordDecl>(NamedContext)) ||

13452

!cast<CXXRecordDecl>(NamedContext)->forallBases(IsNotBase))

13456

diag::err_using_decl_nested_name_specifier_is_not_base_class)

13470 if

(

Type

.isInvalid())

13489

TemplateParamLists.size()

13491

: RedeclarationKind::ForVisibleRedeclaration);

13495 if

(

Previous

.isSingleResult() &&

13496 Previous

.getFoundDecl()->isTemplateParameter()) {

13502 "name in alias declaration must be an identifier"

);

13504

Name.StartLocation,

13505

Name.Identifier, TInfo);

13520

S = S->getDeclParent();

13522 bool

Redeclaration =

false

;

13525 if

(TemplateParamLists.size()) {

13529 if

(TemplateParamLists.size() != 1) {

13530 Diag

(UsingLoc, diag::err_alias_template_extra_headers)

13531

<<

SourceRange

(TemplateParamLists[1]->getTemplateLoc(),

13532

TemplateParamLists[TemplateParamLists.size()-1]->getRAngleLoc());

13545

Redeclaration =

true

;

13548 if

(!OldDecl && !

Invalid

) {

13549 Diag

(UsingLoc, diag::err_redefinition_different_kind)

13550

<< Name.Identifier;

13564

OldTemplateParams =

13575 Diag

(NewTD->

getLocation

(), diag::err_redefinition_different_typedef)

13592

Name.Identifier, TemplateParams,

13600 else if

(OldDecl) {

13607 if

(

auto

*TD = dyn_cast_or_null<TagDecl>(DeclFromDeclSpec)) {

13635 Diag

(IdentLoc, diag::err_expected_namespace_name) << SS.

getRange

();

13644

RedeclarationKind::ForVisibleRedeclaration);

13667 Diag

(AliasLoc, diag::err_redefinition_different_namespace_alias)

13669 Diag

(AD->getLocation(), diag::note_previous_namespace_alias)

13670

<< AD->getNamespace();

13675

? diag::err_redefinition

13676

: diag::err_redefinition_different_kind;

13677 Diag

(AliasLoc, DiagID) << Alias;

13698struct

SpecialMemberExceptionSpecInfo

13699

: SpecialMemberVisitor<SpecialMemberExceptionSpecInfo> {

13707

: SpecialMemberVisitor(S, MD, CSM, ICI),

Loc

(

Loc

), ExceptSpec(S) {}

13712 void

visitClassSubobject(

CXXRecordDecl

*Class, Subobject Subobj,

13715 void

visitSubobjectCall(Subobject Subobj,

13725 auto

*BaseClass = cast<CXXRecordDecl>(RT->getDecl());

13727 if

(

auto

*BaseCtor = SMOR.

getMethod

()) {

13728

visitSubobjectCall(

Base

, BaseCtor);

13732

visitClassSubobject(BaseClass,

Base

, 0);

13736bool

SpecialMemberExceptionSpecInfo::visitField(

FieldDecl

*FD) {

13748

ExceptSpec.CalledExpr(

E

);

13751

visitClassSubobject(cast<CXXRecordDecl>(RT->getDecl()), FD,

13761 bool

IsMutable =

Field

&&

Field

->isMutable();

13762

visitSubobjectCall(Subobj, lookupIn(

Class

, Quals, IsMutable));

13765void

SpecialMemberExceptionSpecInfo::visitSubobjectCall(

13770

ExceptSpec.CalledDecl(getSubobjectLoc(Subobj), MD);

13799

ComputingExceptionSpec CES(S, MD,

Loc

);

13806

SpecialMemberExceptionSpecInfo Info(S, MD, CSM, ICI, MD->

getLocation

());

13808 return

Info.ExceptSpec;

13815

diag::err_exception_spec_incomplete_type))

13816 return

Info.ExceptSpec;

13833

Info.visit(Info.IsConstructor ? Info.VisitPotentiallyConstructedBases

13834

: Info.VisitAllBases);

13836 return

Info.ExceptSpec;

13841struct

DeclaringSpecialMember {

13845 bool

WasAlreadyBeingDeclared;

13848

: S(S),

D

(RD, CSM), SavedContext(S, RD) {

13850 if

(WasAlreadyBeingDeclared)

13867

Ctx.SpecialMember = CSM;

13871

~DeclaringSpecialMember() {

13872 if

(!WasAlreadyBeingDeclared) {

13879 bool

isAlreadyBeingDeclared()

const

{

13880 return

WasAlreadyBeingDeclared;

13890

RedeclarationKind::ForExternalRedeclaration);

13901void

Sema::setupImplicitSpecialMemberType(

CXXMethodDecl

*SpecialMem,

13934 "Should not build implicit default constructor!"

);

13936

DeclaringSpecialMember DSM(*

this

, ClassDecl,

13938 if

(DSM.isAlreadyBeingDeclared())

13961

setupImplicitSpecialMemberType(DefaultCon,

Context

.

VoidTy

, {});

13985

ClassDecl->

addDecl

(DefaultCon);

13992

assert((Constructor->isDefaulted() && Constructor->isDefaultConstructor() &&

13993

!Constructor->doesThisDeclarationHaveABody() &&

13994

!Constructor->isDeleted()) &&

13995 "DefineImplicitDefaultConstructor - call it for implicit default ctor"

);

13996 if

(Constructor->willHaveBody() || Constructor->isInvalidDecl())

14000

assert(ClassDecl &&

"DefineImplicitDefaultConstructor - invalid constructor"

);

14014 Scope

.addContextNote(CurrentLocation);

14017

Constructor->setInvalidDecl();

14022

? Constructor->getEndLoc()

14023

: Constructor->getLocation();

14025

Constructor->markUsed(

Context

);

14028

L->CompletedImplicitDefinition(Constructor);

14031

DiagnoseUninitializedFields(*

this

, Constructor);

14057

->getInheritedConstructor()

14060 return

cast<CXXConstructorDecl>(Ctor);

14075 false

, BaseCtor, &ICI);

14078 Context

, Derived, UsingLoc, NameInfo, TInfo->

getType

(), TInfo,

14092

EPI.ExceptionSpec.SourceDecl = DerivedCtor;

14098 for

(

unsigned

I = 0, N = FPT->

getNumParams

(); I != N; ++I) {

14102 Context

, DerivedCtor, UsingLoc, UsingLoc,

nullptr

,

14109

ParamDecls.push_back(PD);

14114

assert(!BaseCtor->

isDeleted

() &&

"should not use deleted constructor"

);

14117

Derived->

addDecl

(DerivedCtor);

14123 return

DerivedCtor;

14137

assert(Constructor->getInheritedConstructor() &&

14138

!Constructor->doesThisDeclarationHaveABody() &&

14139

!Constructor->isDeleted());

14140 if

(Constructor->willHaveBody() || Constructor->isInvalidDecl())

14154 Scope

.addContextNote(CurrentLocation);

14157

Constructor->getInheritedConstructor().getShadowDecl();

14159

Constructor->getInheritedConstructor().getConstructor();

14173 for

(

bool

VBase : {

false

,

true

}) {

14175 if

(B.isVirtual() != VBase)

14178 auto

*BaseRD = B.getType()->getAsCXXRecordDecl();

14183 if

(!BaseCtor.first)

14188

InitLoc, B.getType(), BaseCtor.first, VBase, BaseCtor.second);

14192 Context

, TInfo, VBase, InitLoc,

Init

.get(), InitLoc,

14201

Constructor->setInvalidDecl();

14206

Constructor->markUsed(

Context

);

14209

L->CompletedImplicitDefinition(Constructor);

14212

DiagnoseUninitializedFields(*

this

, Constructor);

14222

DeclaringSpecialMember DSM(*

this

, ClassDecl,

14224 if

(DSM.isAlreadyBeingDeclared())

14285

!

Destructor

->doesThisDeclarationHaveABody() &&

14287 "DefineImplicitDestructor - call it for implicit default dtor"

);

14292

assert(ClassDecl &&

"DefineImplicitDestructor - invalid destructor"

);

14303 Scope

.addContextNote(CurrentLocation);

14320

L->CompletedImplicitDefinition(

Destructor

);

14331 "implicit complete dtors unneeded outside MS ABI"

);

14333 "complete dtor only exists for classes with vbases"

);

14338 Scope

.addContextNote(CurrentLocation);

14346 if

(

Record

->isInvalidDecl()) {

14367 if

(M->getParent()->getTemplateSpecializationKind() !=

14387 "adjusting dtor exception specs was introduced in c++11"

);

14397 if

(DtorType->hasExceptionSpec())

14420

ExprBuilder(

const

ExprBuilder&) =

delete

;

14421

ExprBuilder &operator=(

const

ExprBuilder&) =

delete

;

14424 static Expr

*assertNotNull(

Expr

*

E

) {

14425

assert(

E

&&

"Expression construction must not fail."

);

14431 virtual

~ExprBuilder() {}

14436class

RefBuilder:

public

ExprBuilder {

14446

: Var(Var), VarType(VarType) {}

14449class

ThisBuilder:

public

ExprBuilder {

14456class

CastBuilder:

public

ExprBuilder {

14457 const

ExprBuilder &Builder;

14465

CK_UncheckedDerivedToBase,

Kind

,

14474class

DerefBuilder:

public

ExprBuilder {

14475 const

ExprBuilder &Builder;

14479 return

assertNotNull(

14483

DerefBuilder(

const

ExprBuilder &Builder) : Builder(Builder) {}

14486class

MemberBuilder:

public

ExprBuilder {

14487 const

ExprBuilder &Builder;

14497 nullptr

, MemberLookup,

nullptr

,

nullptr

).get());

14500

MemberBuilder(

const

ExprBuilder &Builder,

QualType Type

,

bool

IsArrow,

14502

: Builder(Builder),

Type

(

Type

), IsArrow(IsArrow),

14503

MemberLookup(MemberLookup) {}

14506class

MoveCastBuilder:

public

ExprBuilder {

14507 const

ExprBuilder &Builder;

14514

MoveCastBuilder(

const

ExprBuilder &Builder) : Builder(Builder) {}

14517class

LvalueConvBuilder:

public

ExprBuilder {

14518 const

ExprBuilder &Builder;

14522 return

assertNotNull(

14526

LvalueConvBuilder(

const

ExprBuilder &Builder) : Builder(Builder) {}

14529class

SubscriptBuilder:

public

ExprBuilder {

14530 const

ExprBuilder &

Base

;

14531 const

ExprBuilder &Index;

14539

SubscriptBuilder(

const

ExprBuilder &

Base

,

const

ExprBuilder &Index)

14551 const

ExprBuilder &ToB,

const

ExprBuilder &FromB) {

14560 Expr

*From = FromB.build(S,

Loc

);

14564 Expr

*To = ToB.build(S,

Loc

);

14570 bool

NeedsCollectableMemCpy =

14571 E

->isRecordType() &&

14572 E

->castAs<

RecordType

>()->getDecl()->hasObjectMember();

14575

StringRef MemCpyName = NeedsCollectableMemCpy ?

14576 "__builtin_objc_memmove_collectable"

:

14577 "__builtin_memcpy"

;

14590

assert(MemCpyRef.

isUsable

() &&

"Builtin reference cannot fail"

);

14592 Expr

*CallArgs[] = {

14598

assert(!

Call

.isInvalid() &&

"Call to __builtin_memcpy cannot fail!"

);

14631 const

ExprBuilder &To,

const

ExprBuilder &From,

14632 bool

CopyingBaseSubobject,

bool

Copying,

14633 unsigned

Depth = 0) {

14649 CXXRecordDecl

*ClassDecl = cast<CXXRecordDecl>(RecordTy->getDecl());

14684 if

(CopyingBaseSubobject) {

14708 nullptr

,

nullptr

,

14715 Expr

*FromInst = From.build(S,

Loc

);

14719 if

(

Call

.isInvalid())

14738 Loc

, BO_Assign, To.build(S,

Loc

), From.build(S,

Loc

));

14739 if

(Assignment.isInvalid())

14758

llvm::raw_svector_ostream

OS

(Str);

14759 OS

<<

"__i"

<< Depth;

14763

IterationVarName, SizeType,

14772

RefBuilder IterationVarRef(IterationVar, SizeType);

14773

LvalueConvBuilder IterationVarRefRVal(IterationVarRef);

14779

SubscriptBuilder FromIndexCopy(From, IterationVarRefRVal);

14780

MoveCastBuilder FromIndexMove(FromIndexCopy);

14781 const

ExprBuilder *FromIndex;

14783

FromIndex = &FromIndexCopy;

14785

FromIndex = &FromIndexMove;

14787

SubscriptBuilder ToIndex(To, IterationVarRefRVal);

14792

ToIndex, *FromIndex, CopyingBaseSubobject,

14793

Copying, Depth + 1);

14795 if

(

Copy

.isInvalid() || !

Copy

.get())

14802

S.

Context

, IterationVarRefRVal.build(S,

Loc

),

14823 const

ExprBuilder &To,

const

ExprBuilder &From,

14824 bool

CopyingBaseSubobject,

bool

Copying) {

14826 if

(

T

->

isArrayType

() && !

T

.isConstQualified() && !

T

.isVolatileQualified() &&

14827 T

.isTriviallyCopyableType(S.

Context

))

14831

CopyingBaseSubobject,

14849

DeclaringSpecialMember DSM(*

this

, ClassDecl,

14851 if

(DSM.isAlreadyBeingDeclared())

14856

ArgType,

nullptr

);

14886

setupImplicitSpecialMemberType(

CopyAssignment

, RetType, ArgType);

14896

ClassLoc, ClassLoc,

14938

}

else if

(!isa<CXXConstructorDecl>(CopyOp) &&

14941 for

(

auto

*I : RD->

ctors

()) {

14942 if

(I->isCopyConstructor()) {

14943

UserDeclaredOperation = I;

14947

assert(UserDeclaredOperation);

14948

}

else if

(isa<CXXConstructorDecl>(CopyOp) &&

14951 for

(

auto

*I : RD->

methods

()) {

14952 if

(I->isCopyAssignmentOperator()) {

14953

UserDeclaredOperation = I;

14957

assert(UserDeclaredOperation);

14960 if

(UserDeclaredOperation) {

14961 bool

UDOIsUserProvided = UserDeclaredOperation->

isUserProvided

();

14962 bool

UDOIsDestructor = isa<CXXDestructorDecl>(UserDeclaredOperation);

14963 bool

IsCopyAssignment = !isa<CXXConstructorDecl>(CopyOp);

14965

(UDOIsUserProvided && UDOIsDestructor)

14966

? diag::warn_deprecated_copy_with_user_provided_dtor

14967

: (UDOIsUserProvided && !UDOIsDestructor)

14968

? diag::warn_deprecated_copy_with_user_provided_copy

14969

: (!UDOIsUserProvided && UDOIsDestructor)

14970

? diag::warn_deprecated_copy_with_dtor

14971

: diag::warn_deprecated_copy;

14973

<< RD << IsCopyAssignment;

14984 "DefineImplicitCopyAssignment called for wrong function"

);

15002 Scope

.addContextNote(CurrentLocation);

15037

RefBuilder OtherRef(

Other

, OtherRefType);

15040

std::optional<ThisBuilder> This;

15041

std::optional<DerefBuilder> DerefThis;

15042

std::optional<RefBuilder> ExplicitObject;

15043 bool

IsArrow =

false

;

15049

ExplicitObject.emplace(CopyAssignOperator->

getParamDecl

(0), ObjectType);

15053

DerefThis.emplace(*This);

15056

ExprBuilder &ObjectParameter =

15057

ExplicitObject ?

static_cast<

ExprBuilder &

>

(*ExplicitObject)

15058

:

static_cast<

ExprBuilder &

>

(*This);

15062 for

(

auto

&

Base

: ClassDecl->

bases

()) {

15065 QualType

BaseType =

Base

.getType().getUnqualifiedType();

15072

BasePath.push_back(&

Base

);

15081

ExplicitObject ?

static_cast<

ExprBuilder &

>

(*ExplicitObject)

15082

:

static_cast<

ExprBuilder &

>

(*DerefThis),

15091 if

(

Copy

.isInvalid()) {

15097

Statements.push_back(

Copy

.getAs<

Expr

>());

15101 for

(

auto

*Field : ClassDecl->

fields

()) {

15104 if

(Field->isUnnamedBitField() || Field->getParent()->isUnion())

15107 if

(Field->isInvalidDecl()) {

15113 if

(Field->getType()->isReferenceType()) {

15114 Diag

(ClassDecl->

getLocation

(), diag::err_uninitialized_member_for_assign)

15116 Diag

(Field->getLocation(), diag::note_declared_at);

15124 Diag

(ClassDecl->

getLocation

(), diag::err_uninitialized_member_for_assign)

15126 Diag

(Field->getLocation(), diag::note_declared_at);

15132 if

(Field->isZeroLengthBitField())

15135 QualType

FieldType = Field->getType().getNonReferenceType();

15138 "Incomplete array type is not valid"

);

15146

MemberLookup.

addDecl

(Field);

15149

MemberBuilder From(OtherRef, OtherRefType,

false

, MemberLookup);

15150

MemberBuilder To(ObjectParameter, ObjectType, IsArrow, MemberLookup);

15156 if

(

Copy

.isInvalid()) {

15162

Statements.push_back(

Copy

.getAs<

Stmt

>());

15168

(ExplicitObject ?

static_cast<

ExprBuilder &

>

(*ExplicitObject)

15169

:

LangOpts

.HLSL ?

static_cast<

ExprBuilder &

>

(*This)

15170

:

static_cast<

ExprBuilder &

>

(*DerefThis))

15171

.build(*

this

,

Loc

);

15176

Statements.push_back(Return.

getAs

<

Stmt

>());

15189

assert(!Body.

isInvalid

() &&

"Compound statement creation cannot fail"

);

15195

L->CompletedImplicitDefinition(CopyAssignOperator);

15202

DeclaringSpecialMember DSM(*

this

, ClassDecl,

15204 if

(DSM.isAlreadyBeingDeclared())

15212

ArgType,

nullptr

);

15238

setupImplicitSpecialMemberType(

MoveAssignment

, RetType, ArgType);

15248

ClassLoc, ClassLoc,

15284

assert(!

Class

->isDependentContext() &&

"should not define dependent move"

);

15290 if

(

Class

->getNumVBases() == 0 ||

Class

->hasTrivialMoveAssignment() ||

15291 Class

->getNumBases() < 2)

15295 typedef

llvm::DenseMap<CXXRecordDecl*, CXXBaseSpecifier*> VBaseMap;

15298 for

(

auto

&BI :

Class

->bases()) {

15299

Worklist.push_back(&BI);

15300 while

(!Worklist.empty()) {

15306 if

(!

Base

->hasNonTrivialMoveAssignment())

15331

VBases.insert(std::make_pair(

Base

->getCanonicalDecl(), &BI))

15333 if

(Existing && Existing != &BI) {

15334

S.

Diag

(CurrentLocation, diag::warn_vbase_moved_multiple_times)

15337

<< (

Base

->getCanonicalDecl() ==

15340

S.

Diag

(BI.getBeginLoc(), diag::note_vbase_moved_here)

15341

<< (

Base

->getCanonicalDecl() ==

15342

BI.getType()->getAsCXXRecordDecl()->getCanonicalDecl())

15346

Existing =

nullptr

;

15356

llvm::append_range(Worklist, llvm::make_pointer_range(

Base

->bases()));

15369 "DefineImplicitMoveAssignment called for wrong function"

);

15399 Scope

.addContextNote(CurrentLocation);

15415

RefBuilder OtherRef(

Other

, OtherRefType);

15417

MoveCastBuilder MoveOther(OtherRef);

15420

std::optional<ThisBuilder> This;

15421

std::optional<DerefBuilder> DerefThis;

15422

std::optional<RefBuilder> ExplicitObject;

15424 bool

IsArrow =

false

;

15429

ExplicitObject.emplace(MoveAssignOperator->

getParamDecl

(0), ObjectType);

15433

DerefThis.emplace(*This);

15436

ExprBuilder &ObjectParameter =

15437

ExplicitObject ? *ExplicitObject :

static_cast<

ExprBuilder &

>

(*This);

15441 for

(

auto

&

Base

: ClassDecl->

bases

()) {

15452 QualType

BaseType =

Base

.getType().getUnqualifiedType();

15459

BasePath.push_back(&

Base

);

15463

CastBuilder From(OtherRef, BaseType,

VK_XValue

, BasePath);

15468

ExplicitObject ?

static_cast<

ExprBuilder &

>

(*ExplicitObject)

15469

:

static_cast<

ExprBuilder &

>

(*DerefThis),

15478 if

(Move.isInvalid()) {

15484

Statements.push_back(Move.getAs<

Expr

>());

15488 for

(

auto

*Field : ClassDecl->

fields

()) {

15491 if

(Field->isUnnamedBitField() || Field->getParent()->isUnion())

15494 if

(Field->isInvalidDecl()) {

15500 if

(Field->getType()->isReferenceType()) {

15501 Diag

(ClassDecl->

getLocation

(), diag::err_uninitialized_member_for_assign)

15503 Diag

(Field->getLocation(), diag::note_declared_at);

15511 Diag

(ClassDecl->

getLocation

(), diag::err_uninitialized_member_for_assign)

15513 Diag

(Field->getLocation(), diag::note_declared_at);

15519 if

(Field->isZeroLengthBitField())

15522 QualType

FieldType = Field->getType().getNonReferenceType();

15525 "Incomplete array type is not valid"

);

15532

MemberLookup.

addDecl

(Field);

15534

MemberBuilder From(MoveOther, OtherRefType,

15535 false

, MemberLookup);

15536

MemberBuilder To(ObjectParameter, ObjectType, IsArrow, MemberLookup);

15538

assert(!From.build(*

this

,

Loc

)->isLValue() &&

15539 "Member reference with rvalue base must be rvalue except for reference " 15540 "members, which aren't allowed for move assignment."

);

15547 if

(Move.isInvalid()) {

15553

Statements.push_back(Move.getAs<

Stmt

>());

15559

(ExplicitObject ?

static_cast<

ExprBuilder &

>

(*ExplicitObject)

15560

:

LangOpts

.HLSL ?

static_cast<

ExprBuilder &

>

(*This)

15561

:

static_cast<

ExprBuilder &

>

(*DerefThis))

15562

.build(*

this

,

Loc

);

15568

Statements.push_back(Return.

getAs

<

Stmt

>());

15581

assert(!Body.

isInvalid

() &&

"Compound statement creation cannot fail"

);

15587

L->CompletedImplicitDefinition(MoveAssignOperator);

15598

DeclaringSpecialMember DSM(*

this

, ClassDecl,

15600 if

(DSM.isAlreadyBeingDeclared())

15606

ArgType,

nullptr

);

15667

ClassDecl->

hasAttr

<TrivialABIAttr>() ||

15699 "DefineImplicitCopyConstructor - call it for implicit copy ctor"

);

15704

assert(ClassDecl &&

"DefineImplicitCopyConstructor - invalid constructor"

);

15715 Scope

.addContextNote(CurrentLocation);

15745

DeclaringSpecialMember DSM(*

this

, ClassDecl,

15747 if

(DSM.isAlreadyBeingDeclared())

15754

ArgType,

nullptr

);

15792

ClassLoc, ClassLoc,

15805

ClassDecl->

hasAttr

<TrivialABIAttr>() ||

15837 "DefineImplicitMoveConstructor - call it for implicit move ctor"

);

15842

assert(ClassDecl &&

"DefineImplicitMoveConstructor - invalid constructor"

);

15853 Scope

.addContextNote(CurrentLocation);

15899 if

(CallOp != Invoker) {

15918 if

(Invoker != CallOp) {

15931

assert(FunctionRef &&

"Can't refer to __invoke function?"

);

15939

L->CompletedImplicitDefinition(Conv);

15940 if

(Invoker != CallOp)

15941

L->CompletedImplicitDefinition(Invoker);

15969 Diag

(CurrentLocation, diag::note_lambda_to_block_conv);

15978 Diag

(CurrentLocation, diag::note_lambda_to_block_conv);

15984 Stmt

*ReturnS = Return.

get

();

15991

L->CompletedImplicitDefinition(Conv);

15998 switch

(Args.size()) {

16003 if

(!Args[1]->isDefaultArgument())

16008 return

!Args[0]->isDefaultArgument();

16017 bool

HadMultipleCandidates,

bool

IsListInitialization,

16018 bool

IsStdInitListInitialization,

bool

RequiresZeroInit,

16020 bool

Elidable =

false

;

16039 Expr

*SubExpr = ExprArgs[0];

16049

FoundDecl, Constructor,

16050

Elidable, ExprArgs, HadMultipleCandidates,

16051

IsListInitialization,

16052

IsStdInitListInitialization, RequiresZeroInit,

16053

ConstructKind, ParenRange);

16059 bool

HadMultipleCandidates,

bool

IsListInitialization,

16060 bool

IsStdInitListInitialization,

bool

RequiresZeroInit,

16062 if

(

auto

*Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl)) {

16072

ConstructLoc, DeclInitType, Constructor, Elidable, ExprArgs,

16073

HadMultipleCandidates, IsListInitialization, IsStdInitListInitialization,

16074

RequiresZeroInit, ConstructKind, ParenRange);

16082 bool

HadMultipleCandidates,

bool

IsListInitialization,

16083 bool

IsStdInitListInitialization,

bool

RequiresZeroInit,

16086

Constructor->getParent(),

16088 "given constructor for wrong type"

);

16095 Context

, DeclInitType, ConstructLoc, Constructor, Elidable, ExprArgs,

16096

HadMultipleCandidates, IsListInitialization,

16097

IsStdInitListInitialization, RequiresZeroInit,

16129 PDiag

(diag::err_access_dtor_var)

16139 bool

HasConstantInit =

false

;

16146

diag::err_constexpr_var_requires_const_destruction) << VD;

16147 for

(

unsigned

I = 0, N = Notes.size(); I != N; ++I)

16148 Diag

(Notes[I].first, Notes[I].second);

16157 if

(!VD->

hasAttr

<AlwaysDestroyAttr>())

16169 bool

AllowExplicit,

16170 bool

IsListInitialization) {

16172 unsigned

NumArgs = ArgsPtr.size();

16173 Expr

**Args = ArgsPtr.data();

16179 if

(NumArgs < NumParams)

16180

ConvertedArgs.reserve(NumParams);

16182

ConvertedArgs.reserve(NumArgs);

16189

CallType, AllowExplicit, IsListInitialization);

16190

ConvertedArgs.append(AllArgs.begin(), AllArgs.end());

16194

CheckConstructorCall(Constructor, DeclInitType,

16205 if

(isa<NamespaceDecl>(DC)) {

16207

diag::err_operator_new_delete_declared_in_namespace)

16211 if

(isa<TranslationUnitDecl>(DC) &&

16214

diag::err_operator_new_delete_declared_static)

16234 unsigned

DependentParamTypeDiag,

16235 unsigned

InvalidParamTypeDiag) {

16256

? diag::err_operator_new_delete_dependent_result_type

16257

: diag::err_operator_new_delete_invalid_result_type)

16258

<< FnDecl->

getDeclName

() << ExpectedResultType;

16264

diag::err_operator_new_delete_template_too_few_parameters)

16270

diag::err_operator_new_delete_too_few_parameters)

16277 if

(

const auto

*PtrTy =

16281 if

(

auto

ExpectedPtrTy = ExpectedFirstParamType->

getAs

<

PointerType

>())

16282

ExpectedFirstParamType =

16288

ExpectedFirstParamType) {

16293

? DependentParamTypeDiag

16294

: InvalidParamTypeDiag)

16295

<< FnDecl->

getDeclName

() << ExpectedFirstParamType;

16318

diag::err_operator_new_dependent_param_type,

16319

diag::err_operator_new_param_type))

16326

diag::err_operator_new_default_arg)

16341 auto

*MD = dyn_cast<CXXMethodDecl>(FnDecl);

16357

diag::err_operator_delete_dependent_param_type,

16358

diag::err_operator_delete_param_type))

16367

diag::err_destroying_operator_delete_not_usual);

16376 "Expected an overloaded operator declaration"

);

16386 if

(Op == OO_Delete || Op == OO_Array_Delete)

16389 if

(Op == OO_New || Op == OO_Array_New)

16399 if

(

CXXMethodDecl

*MethodDecl = dyn_cast<CXXMethodDecl>(FnDecl)) {

16400 if

(MethodDecl->isStatic()) {

16401 if

(Op == OO_Call || Op == OO_Subscript)

16404

? diag::warn_cxx20_compat_operator_overload_static

16405

: diag::ext_operator_overload_static))

16408 return Diag

(FnDecl->

getLocation

(), diag::err_operator_overload_static)

16412 bool

ClassOrEnumParam =

false

;

16413 for

(

auto

*Param : FnDecl->

parameters

()) {

16414 QualType

ParamType = Param->getType().getNonReferenceType();

16417

ClassOrEnumParam =

true

;

16422 if

(!ClassOrEnumParam)

16424

diag::err_operator_overload_needs_class_or_enum)

16434 if

(Op != OO_Call) {

16436 for

(

auto

*Param : FnDecl->

parameters

()) {

16437 if

(Param->hasDefaultArg()) {

16438

FirstDefaultedParam = Param;

16442 if

(FirstDefaultedParam) {

16443 if

(Op == OO_Subscript) {

16445

? diag::ext_subscript_overload

16446

: diag::error_subscript_overload)

16451

diag::err_operator_overload_default_arg)

16459

{

false

,

false

,

false

}

16460#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 16461 , { Unary, Binary, MemberOnly } 16462#include "clang/Basic/OperatorKinds.def" 16465 bool

CanBeUnaryOperator = OperatorUses[Op][0];

16466 bool

CanBeBinaryOperator = OperatorUses[Op][1];

16467 bool

MustBeMemberOperator = OperatorUses[Op][2];

16474

(isa<CXXMethodDecl>(FnDecl) &&

16478 if

(Op != OO_Call && Op != OO_Subscript &&

16479

((NumParams == 1 && !CanBeUnaryOperator) ||

16480

(NumParams == 2 && !CanBeBinaryOperator) || (NumParams < 1) ||

16481

(NumParams > 2))) {

16483 unsigned

ErrorKind;

16484 if

(CanBeUnaryOperator && CanBeBinaryOperator) {

16486

}

else if

(CanBeUnaryOperator) {

16489

assert(CanBeBinaryOperator &&

16490 "All non-call overloaded operators are unary or binary!"

);

16493 return Diag

(FnDecl->

getLocation

(), diag::err_operator_overload_must_be)

16494

<< FnDecl->

getDeclName

() << NumParams << ErrorKind;

16497 if

(Op == OO_Subscript && NumParams != 2) {

16499

? diag::ext_subscript_overload

16500

: diag::error_subscript_overload)

16501

<< FnDecl->

getDeclName

() << (NumParams == 1 ? 0 : 2);

16506 if

(Op != OO_Call &&

16508 return Diag

(FnDecl->

getLocation

(), diag::err_operator_overload_variadic)

16513 if

(MustBeMemberOperator && !isa<CXXMethodDecl>(FnDecl)) {

16515

diag::err_operator_overload_must_be_member)

16529 if

((Op == OO_PlusPlus || Op == OO_MinusMinus) && NumParams == 2) {

16536

diag::err_operator_overload_post_incdec_must_be_int)

16537

<< LastParam->

getType

() << (Op == OO_MinusMinus);

16549 if

(TemplateParams->

size

() == 1) {

16551

dyn_cast<NonTypeTemplateParmDecl>(TemplateParams->

getParam

(0));

16570

}

else if

(TemplateParams->

size

() == 2) {

16572

dyn_cast<TemplateTypeParmDecl>(TemplateParams->

getParam

(0));

16574

dyn_cast<NonTypeTemplateParmDecl>(TemplateParams->

getParam

(1));

16586

diag::ext_string_literal_operator_template);

16593

diag::err_literal_operator_template)

16599 if

(isa<CXXMethodDecl>(FnDecl)) {

16600 Diag

(FnDecl->

getLocation

(), diag::err_literal_operator_outside_namespace)

16609 Diag

(LSD->getExternLoc(), diag::note_extern_c_begins_here);

16628

diag::err_literal_operator_template_with_params);

16657

diag::err_literal_operator_param)

16674

diag::err_literal_operator_invalid_param)

16684 QualType

FirstParamType = (*Param)->getType().getUnqualifiedType();

16691 Diag

((*Param)->getSourceRange().getBegin(),

16692

diag::err_literal_operator_param)

16693

<< FirstParamType <<

"'const char *'"

<< (*Param)->getSourceRange();

16700 Diag

((*Param)->getSourceRange().getBegin(),

16701

diag::err_literal_operator_param)

16702

<< FirstParamType <<

"'const char *'"

<< (*Param)->getSourceRange();

16715 Diag

((*Param)->getSourceRange().getBegin(),

16716

diag::err_literal_operator_param)

16717

<< FirstParamType <<

"'const char *'"

<< (*Param)->getSourceRange();

16725 QualType

SecondParamType = (*Param)->getType().getUnqualifiedType();

16727 Diag

((*Param)->getSourceRange().getBegin(),

16728

diag::err_literal_operator_param)

16730

<< (*Param)->getSourceRange();

16734 Diag

(FnDecl->

getLocation

(), diag::err_literal_operator_bad_param_count);

16742 for

(

auto

*Param : FnDecl->

parameters

()) {

16743 if

(Param->hasDefaultArg()) {

16744 Diag

(Param->getDefaultArgRange().getBegin(),

16745

diag::err_literal_operator_default_argument)

16746

<< Param->getDefaultArgRange();

16761

<<

static_cast<int>

(Status)

16772

assert(Lit->

isUnevaluated

() &&

"Unexpected string literal kind"

);

16778 else if

(Lang ==

"C++"

)

16781 Diag

(LangStr->

getExprLoc

(), diag::err_language_linkage_spec_unknown)

16801 if

(

getLangOpts

().CPlusPlusModules && isCurrentModulePurview()) {

16802 Module

*GlobalModule = PushImplicitGlobalModuleFragment(ExternLoc);

16825

PopImplicitGlobalModuleFragment();

16828 return

LinkageSpec;

16861 Diag

(

Loc

, diag::err_catch_rvalue_ref);

16866 Diag

(

Loc

, diag::err_catch_variably_modified) << ExDeclType;

16872 unsigned

DK = diag::err_catch_incomplete;

16876

DK = diag::err_catch_incomplete_ptr;

16879

BaseType = Ref->getPointeeType();

16881

DK = diag::err_catch_incomplete_ref;

16888 Diag

(

Loc

, diag::err_wasm_reftype_tc) << 1;

16893 Diag

(

Loc

, diag::err_catch_sizeless) << (Mode == 2 ? 1 : 0) << BaseType;

16899

diag::err_abstract_type_in_decl,

16911 Diag

(

Loc

, diag::err_objc_object_catch);

16916 Diag

(

Loc

, diag::warn_objc_pointer_cxx_catch_fragile);

16921

ExDeclType, TInfo,

SC_None

);

16925 if

(

getLangOpts

().ObjCAutoRefCount &&

ObjC

().inferObjCARCLifetime(ExDecl))

16950 Expr

*opaqueValue =

16953 ExprResult

result = sequence.

Perform

(*

this

, entity, initKind, opaqueValue);

16979 bool Invalid

=

D

.isInvalidType();

16985 D

.getIdentifierLoc());

16992

RedeclarationKind::ForVisibleRedeclaration)) {

16996

assert(!S->isDeclScope(PrevDecl));

16998 Diag

(

D

.getIdentifierLoc(), diag::err_redefinition)

16999

<<

D

.getIdentifier();

17000 Diag

(PrevDecl->getLocation(), diag::note_previous_definition);

17002

}

else if

(PrevDecl->isTemplateParameter())

17007 if

(

D

.getCXXScopeSpec().isSet() && !

Invalid

) {

17008 Diag

(

D

.getIdentifierLoc(), diag::err_qualified_catch_declarator)

17009

<<

D

.getCXXScopeSpec().getRange();

17014

S, TInfo,

D

.

getBeginLoc

(),

D

.getIdentifierLoc(),

D

.getIdentifier());

17030 Expr

*AssertMessageExpr,

17036

AssertMessageExpr, RParenLoc,

false

);

17041 case

BuiltinType::Char_S:

17042 case

BuiltinType::Char_U:

17044 case

BuiltinType::Char8:

17047 case

BuiltinType::Char16:

17050 case

BuiltinType::Char32:

17053 case

BuiltinType::WChar_S:

17054 case

BuiltinType::WChar_U:

17058

llvm_unreachable(

"Non-character type"

);

17068 char

Arr[UNI_MAX_UTF8_BYTES_PER_CODE_POINT];

17071

llvm::raw_svector_ostream

OS

(Str);

17075 if

(K == BuiltinType::Char_S || K == BuiltinType::Char_U ||

17076

K == BuiltinType::Char8 ||

Value

<= 0x7F) {

17077

StringRef Escaped = escapeCStyle<EscapeChar::Single>(

Value

);

17078 if

(!Escaped.empty())

17081

OS << static_cast<char>(

Value

);

17086 case

BuiltinType::Char16:

17087 case

BuiltinType::Char32:

17088 case

BuiltinType::WChar_S:

17089 case

BuiltinType::WChar_U: {

17090 if

(llvm::ConvertCodePointToUTF8(

Value

, Ptr))

17094

<< llvm::format_hex_no_prefix(

Value

, TyWidth / 4,

true

);

17098

llvm_unreachable(

"Non-character type is passed"

);

17107 if

(!

V

.hasValue())

17110 switch

(

V

.getKind()) {

17116

int64_t BoolValue =

V

.getInt().getExtValue();

17117

assert((BoolValue == 0 || BoolValue == 1) &&

17118 "Bool type, but value is not 0 or 1"

);

17119

llvm::raw_svector_ostream

OS

(Str);

17120 OS

<< (BoolValue ?

"true"

:

"false"

);

17122

llvm::raw_svector_ostream

OS

(Str);

17127 switch

(BTy->getKind()) {

17128 case

BuiltinType::Char_S:

17129 case

BuiltinType::Char_U:

17130 case

BuiltinType::Char8:

17131 case

BuiltinType::Char16:

17132 case

BuiltinType::Char32:

17133 case

BuiltinType::WChar_S:

17134 case

BuiltinType::WChar_U: {

17136

assert(8 <= TyWidth && TyWidth <= 32 &&

"Unexpected integer width"

);

17137

uint32_t CodeUnit =

static_cast<

uint32_t

>

(

V

.getInt().getZExtValue());

17142

<< llvm::format_hex_no_prefix(CodeUnit,

2,

17144

<<

", "

<<

V

.getInt() <<

')'

;

17151 V

.getInt().toString(Str);

17157 V

.getFloat().toString(Str);

17161 if

(

V

.isNullPointer()) {

17162

llvm::raw_svector_ostream

OS

(Str);

17169

llvm::raw_svector_ostream

OS

(Str);

17171 V

.getComplexFloatReal().toString(Str);

17173 V

.getComplexFloatImag().toString(Str);

17178

llvm::raw_svector_ostream

OS

(Str);

17180 V

.getComplexIntReal().toString(Str);

17182 V

.getComplexIntImag().toString(Str);

17205 if

(isa<SubstNonTypeTemplateParmExpr>(

E

))

17209 if

(

const auto

*UnaryOp = dyn_cast<UnaryOperator>(

E

))

17213 if

(

const auto

*BO = dyn_cast<BinaryOperator>(

E

))

17214 return

(BO->isShiftOp() || BO->isAdditiveOp() || BO->isMultiplicativeOp() ||

17215

BO->isBitwiseOp());

17221 if

(

const auto

*Op = dyn_cast<BinaryOperator>(

E

);

17222

Op && Op->getOpcode() != BO_LOr) {

17223 const Expr

*LHS = Op->getLHS()->IgnoreParenImpCasts();

17224 const Expr

*RHS = Op->getRHS()->IgnoreParenImpCasts();

17242 for

(

unsigned

I = 0; I < 2; I++) {

17243 const Expr

*Side = DiagSide[I].Cond;

17247

DiagSide[I].Print =

17249

DiagSide[I].ValueString,

Context

);

17251 if

(DiagSide[0].Print && DiagSide[1].Print) {

17252 Diag

(Op->getExprLoc(), diag::note_expr_evaluates_to)

17253

<< DiagSide[0].ValueString << Op->getOpcodeStr()

17254

<< DiagSide[1].ValueString << Op->getSourceRange();

17262 bool

ErrorOnInvalidMessage) {

17264

assert(!Message->isTypeDependent() && !Message->isValueDependent() &&

17265 "can't evaluate a dependant static assert message"

);

17267 if

(

const auto

*SL = dyn_cast<StringLiteral>(Message)) {

17268

assert(SL->isUnevaluated() &&

"expected an unevaluated string"

);

17269 Result

.assign(SL->getString().begin(), SL->getString().end());

17274 QualType T

= Message->getType().getNonReferenceType();

17277 Diag

(

Loc

, diag::err_static_assert_invalid_message);

17281 auto

FindMember = [&](StringRef

Member

,

bool

&

Empty

,

17282 bool Diag

=

false

) -> std::optional<LookupResult> {

17289 if

(MemberLookup.

empty

())

17290 return

std::nullopt;

17291 return

std::move(MemberLookup);

17294 bool

SizeNotFound, DataNotFound;

17295

std::optional<LookupResult> SizeMember = FindMember(

"size"

, SizeNotFound);

17296

std::optional<LookupResult> DataMember = FindMember(

"data"

, DataNotFound);

17297 if

(SizeNotFound || DataNotFound) {

17298 Diag

(

Loc

, diag::err_static_assert_missing_member_function)

17299

<< ((SizeNotFound && DataNotFound) ? 2

17305 if

(!SizeMember || !DataMember) {

17307

FindMember(

"size"

, SizeNotFound,

true

);

17309

FindMember(

"data"

, DataNotFound,

true

);

17315

Message, Message->getType(), Message->getBeginLoc(),

false

,

17339 Diag

(

Loc

, diag::err_static_assert_invalid_mem_fn_ret_ty) <<

0;

17349 Diag

(

Loc

, diag::err_static_assert_invalid_mem_fn_ret_ty) <<

1;

17353 if

(!ErrorOnInvalidMessage &&

17359

Status.Diag = &Notes;

17360 if

(!Message->EvaluateCharRangeAsString(

Result

, EvaluatedSize.

get

(),

17361

EvaluatedData.

get

(), Ctx, Status) ||

17363 Diag

(Message->getBeginLoc(),

17364

ErrorOnInvalidMessage ? diag::err_static_assert_message_constexpr

17365

: diag::warn_static_assert_message_constexpr);

17366 for

(

const auto

&

Note

: Notes)

17368 return

!ErrorOnInvalidMessage;

17374 Expr

*AssertExpr,

Expr

*AssertMessage,

17377

assert(AssertExpr !=

nullptr

&&

"Expected non-null condition"

);

17395

AssertExpr = FullAssertExpr.

get

();

17398 Expr

*BaseExpr = AssertExpr;

17410

diag::err_static_assert_expression_is_not_constant,

17416 if

(!Failed && AssertMessage && Cond.getBoolValue()) {

17425 bool

InTemplateDefinition =

17428 if

(!Failed && !Cond && !InTemplateDefinition) {

17430

llvm::raw_svector_ostream Msg(MsgBuffer);

17431 bool

HasMessage = AssertMessage;

17432 if

(AssertMessage) {

17436

AssertMessage, Str,

Context

,

true

) ||

17440 Expr

*InnerCond =

nullptr

;

17441

std::string InnerCondDescription;

17442

std::tie(InnerCond, InnerCondDescription) =

17444 if

(InnerCond && isa<ConceptSpecializationExpr>(InnerCond)) {

17452

}

else if

(InnerCond && !isa<CXXBoolLiteralExpr>(InnerCond)

17453

&& !isa<IntegerLiteral>(InnerCond)) {

17455

diag::err_static_assert_requirement_failed)

17456

<< InnerCondDescription << !HasMessage << Msg.str()

17473

AssertExpr = FullAssertExpr.

get

();

17477

AssertExpr, AssertMessage, RParenLoc,

17491 bool

IsMemberSpecialization =

false

;

17496

TagLoc, NameLoc, SS,

nullptr

, TempParamLists,

true

,

17497

IsMemberSpecialization,

Invalid

)) {

17498 if

(TemplateParams->size() > 0) {

17506

FriendLoc, TempParamLists.size() - 1,

17507

TempParamLists.data())

17511 Diag

(TemplateParams->getTemplateLoc(), diag::err_template_tag_noparams)

17513

IsMemberSpecialization =

true

;

17519 bool

isAllExplicitSpecializations =

true

;

17520 for

(

unsigned

I = TempParamLists.size(); I-- > 0; ) {

17521 if

(TempParamLists[I]->size()) {

17522

isAllExplicitSpecializations =

false

;

17533 if

(isAllExplicitSpecializations) {

17535 bool

Owned =

false

;

17536 bool

IsDependent =

false

;

17556 if

(isa<DependentNameType>(

T

)) {

17571

EllipsisLoc, TempParamLists);

17577

assert(SS.

isNotEmpty

() &&

"valid templated tag with no SS and no direct?"

);

17584 unsigned

FriendDeclDepth = TempParamLists.front()->getDepth();

17587 auto

*ND = dyn_cast<NamedDecl *>(

U

.first);

17589

ND = cast<const TemplateTypeParmType *>(

U

.first)->getDecl();

17590 Diag

(

U

.second, diag::friend_template_decl_malformed_pack_expansion)

17599 Diag

(NameLoc, diag::warn_template_qualified_friend_unsupported)

17611

EllipsisLoc, TempParamLists);

17613 Friend

->setUnsupportedFriend(

true

);

17637 Diag

(FriendLoc, diag::err_friend_not_first_in_declaration);

17667 if

(EllipsisLoc.

isValid

() &&

17669 Diag

(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)

17675 if

(TempParams.size()) {

17692

? diag::warn_cxx98_compat_unelaborated_friend_type

17693

: diag::ext_unelaborated_friend_type)

17699

? diag::warn_cxx98_compat_nonclass_type_friend

17700

: diag::ext_nonclass_type_friend)

17717 if

(!TempParams.empty())

17723

TSI, FriendLoc, EllipsisLoc);

17758 Diag

(

Loc

, diag::err_unexpected_friend);

17782

assert(NameInfo.

getName

());

17793 Scope

*DCScope = S;

17795

RedeclarationKind::ForExternalRedeclaration);

17803 FunctionDecl

*FunctionContainingLocalClass =

nullptr

;

17805

(FunctionContainingLocalClass =

17806

cast<CXXRecordDecl>(

CurContext

)->isLocalClass())) {

17818

DCScope = S->getFnParent();

17828

DC =

Previous

.getRepresentativeDecl()->getDeclContext();

17832

DC = FunctionContainingLocalClass;

17869 if

(isTemplateId) {

17870 if

(isa<TranslationUnitDecl>(LookupDC))

break

;

17884 if

(!DC)

return nullptr

;

17895

diag::warn_cxx98_compat_friend_is_member :

17896

diag::err_friend_is_member);

17905

assert(isa<CXXRecordDecl>(DC) &&

"friend declaration not in class?"

);

17910 switch

(

D

.getName().

getKind

()) {

17932 if

(DiagArg >= 0) {

17933 Diag

(

Loc

, diag::err_introducing_special_friend) << DiagArg;

17944

DCScope = &FakeDCScope;

17947 bool

AddToScope =

true

;

17949

TemplateParams, AddToScope);

17950 if

(!ND)

return nullptr

;

17972 D

.getIdentifierLoc(), ND,

17984

FD = FTD->getTemplatedDecl();

17986

FD = cast<FunctionDecl>(ND);

17992 if

(

D

.isFunctionDefinition()) {

18006

}

else if

(FunctionContainingLocalClass) {

18007 Diag

(NameInfo.

getBeginLoc

(), diag::err_friend_def_in_local_class);

18015

}

else if

(isTemplateId) {

18016 Diag

(NameInfo.

getBeginLoc

(), diag::err_friend_specialization_def);

18028 if

(

D

.isRedeclaration()) {

18029 Diag

(FD->

getLocation

(), diag::err_friend_decl_with_def_arg_redeclared);

18030 Diag

(

Previous

.getRepresentativeDecl()->getLocation(),

18031

diag::note_previous_declaration);

18032

}

else if

(!

D

.isFunctionDefinition())

18033 Diag

(FD->

getLocation

(), diag::err_friend_decl_with_def_arg_must_be_def);

18038 Diag

(FD->

getLocation

(), diag::warn_template_qualified_friend_unsupported)

18054 FunctionDecl

*Fn = dyn_cast_or_null<FunctionDecl>(Dcl);

18056 Diag

(DelLoc, diag::err_deleted_non_function);

18061

Fn->setWillHaveBody(

false

);

18063 if

(

const FunctionDecl

*Prev = Fn->getPreviousDecl()) {

18067

Prev->getPreviousDecl()) &&

18068

!Prev->isDefined()) {

18069 Diag

(DelLoc, diag::err_deleted_decl_not_first);

18070 Diag

(Prev->getLocation().isInvalid() ? DelLoc : Prev->getLocation(),

18071

Prev->isImplicit() ? diag::note_previous_implicit_declaration

18072

: diag::note_previous_declaration);

18075

Fn->setInvalidDecl();

18083

Fn = Fn->getCanonicalDecl();

18088 Diag

(Fn->getLocation(), diag::err_attribute_dll_deleted) << DLLAttr;

18089

Fn->setInvalidDecl();

18095 Diag

(DelLoc, diag::err_deleted_main);

18099

Fn->setImplicitlyInline();

18100

Fn->setDeletedAsWritten(

true

, Message);

18107 auto

*FD = dyn_cast<FunctionDecl>(Dcl);

18109 if

(

auto

*FTD = dyn_cast<FunctionTemplateDecl>(Dcl)) {

18111 Diag

(DefaultLoc, diag::err_defaulted_comparison_template);

18116 Diag

(DefaultLoc, diag::err_default_special_members)

18127

(!FD->isDependentContext() ||

18128

(!isa<CXXConstructorDecl>(FD) &&

18130 Diag

(DefaultLoc, diag::err_default_special_members)

18140

? diag::warn_cxx17_compat_defaulted_comparison

18141

: diag::ext_defaulted_comparison);

18144

FD->setDefaulted();

18145

FD->setExplicitlyDefaulted();

18146

FD->setDefaultLoc(DefaultLoc);

18149 if

(FD->isDependentContext())

18155

FD->setWillHaveBody(

false

);

18168 if

(isa<CXXMethodDecl>(FD)) {

18170 if

(

const FunctionDecl

*Pattern = FD->getTemplateInstantiationPattern())

18184 auto

*MD = cast<CXXMethodDecl>(FD);

18195 for

(

Stmt

*SubStmt : S->children()) {

18198 if

(isa<ReturnStmt>(SubStmt))

18199 Self

.Diag(SubStmt->getBeginLoc(),

18200

diag::err_return_in_constructor_handler);

18201 if

(!isa<Expr>(SubStmt))

18215 switch

(BodyKind) {

18224 "Parsed function body should be '= delete;' or '= default;'"

);

18234 for

(

unsigned

I = 0,

E

= OldFT->

getNumParams

(); I !=

E

; ++I)

18238

!NewFT->getExtParameterInfo(I).isNoEscape()) {

18240

diag::warn_overriding_method_missing_noescape);

18242

diag::note_overridden_marked_noescape);

18248 Diag

(New->

getLocation

(), diag::err_conflicting_overriding_attributes)

18255 const auto

*OldCSA = Old->

getAttr

<CodeSegAttr>();

18256 const auto

*NewCSA = New->

getAttr

<CodeSegAttr>();

18257 if

((NewCSA || OldCSA) &&

18258

(!OldCSA || !NewCSA || NewCSA->getName() != OldCSA->getName())) {

18269 if

(OldFX != NewFXOrig) {

18273 for

(

const auto

&Diff : Diffs) {

18274 switch

(Diff.shouldDiagnoseMethodOverride(*Old, OldFX, *New, NewFX)) {

18278 Diag

(New->

getLocation

(), diag::warn_mismatched_func_effect_override)

18279

<< Diff.effectName();

18284

NewFX.

insert

(Diff.Old.value(), Errs);

18289

NewFT->getParamTypes(), EPI);

18304 if

(NewCC == OldCC)

18315

diag::err_conflicting_overriding_cc_attributes)

18328

diag::err_explicit_object_parameter_nonmember)

18355 if

(NewRT->getTypeClass() == OldRT->getTypeClass()) {

18365

diag::err_different_return_type_for_overriding_virtual_function)

18381 if

(!RT->isBeingDefined() &&

18383

diag::err_covariant_return_incomplete,

18400

NewClassTy, OldClassTy,

18401

diag::err_covariant_return_inaccessible_base,

18402

diag::err_covariant_return_ambiguous_derived_to_base_conv,

18418

diag::err_covariant_return_type_different_qualifications)

18430

diag::err_covariant_return_type_class_type_not_same_or_less_qualified)

18460 else if

(

auto

*M = dyn_cast<CXXMethodDecl>(

D

))

18498 if

(

auto

*VD = dyn_cast<VarDecl>(

D

);

18525 "Parser allowed 'typedef' as storage class of condition decl."

);

18531 if

(isa<FunctionDecl>(Dcl)) {

18537 if

(

auto

*VD = dyn_cast<VarDecl>(Dcl))

18550 for

(

unsigned

I = 0, N = VTables.size(); I != N; ++I) {

18551

llvm::DenseMap<CXXRecordDecl *, bool>::iterator Pos

18555 if

(!Pos->second && VTables[I].DefinitionRequired)

18556

Pos->second =

true

;

18560 VTablesUsed

[VTables[I].Record] = VTables[I].DefinitionRequired;

18561

NewUses.push_back(

VTableUse

(VTables[I].

Record

, VTables[I].Location));

18568 bool

DefinitionRequired) {

18571 if

(!

Class

->isDynamicClass() ||

Class

->isDependentContext() ||

18577

!

OpenMP

().isInOpenMPDeclareTargetContext() &&

18578

!

OpenMP

().isInOpenMPTargetExecutionDirective()) {

18579 if

(!DefinitionRequired)

18587

std::pair<llvm::DenseMap<CXXRecordDecl *, bool>::iterator,

bool

>

18593 if

(DefinitionRequired && !Pos.first->second) {

18594

Pos.first->second =

true

;

18607 if

(

Class

->hasUserDeclaredDestructor() && !DD->

isDefined

()) {

18623 if

(

Class

->isLocalClass())

18638 bool

DefinedAnything =

false

;

18639 for

(

unsigned

I = 0; I !=

VTableUses

.size(); ++I) {

18644 Class

->getTemplateSpecializationKind();

18648 bool

DefineVTable =

true

;

18653 if

(

Class

->isInCurrentModuleUnit()) {

18654

DefineVTable =

true

;

18655

}

else if

(KeyFunction && !KeyFunction->

hasBody

()) {

18660

DefineVTable =

false

;

18665 "Instantiations don't have key functions"

);

18667

}

else if

(!KeyFunction) {

18672 bool

IsExplicitInstantiationDeclaration =

18674 for

(

auto

*R :

Class

->redecls()) {

18676

= cast<CXXRecordDecl>(R)->getTemplateSpecializationKind();

18678

IsExplicitInstantiationDeclaration =

true

;

18680

IsExplicitInstantiationDeclaration =

false

;

18685 if

(IsExplicitInstantiationDeclaration)

18686

DefineVTable =

false

;

18692 if

(!DefineVTable) {

18700

DefinedAnything =

true

;

18713 if

(!KeyFunction || (KeyFunction->

hasBody

(KeyFunctionDef) &&

18715 Diag

(

Class

->getLocation(), diag::warn_weak_vtable) <<

Class

;

18720 return

DefinedAnything;

18725 for

(

const auto

*I : RD->

methods

())

18726 if

(I->isVirtual() && !I->isPureVirtual())

18732 bool

ConstexprOnly) {

18736 for

(CXXFinalOverriderMap::const_iterator I = FinalOverriders.begin(),

18737 E

= FinalOverriders.end();

18740

OE = I->second.end();

18742

assert(OI->second.size() > 0 &&

"no final overrider"

);

18757 for

(

const auto

&I : RD->

bases

()) {

18758 const auto

*

Base

=

18760 if

(

Base

->getNumVBases() == 0)

18783

cast_or_null<CXXConstructorDecl>(FNTarget));

18790 if

(!Current.insert(Canonical).second)

18794 if

(!

Target

|| !

Target

->isDelegatingConstructor() ||

18795 Target

->isInvalidDecl() || Valid.count(TCanonical)) {

18796

Valid.insert(Current.begin(), Current.end());

18799

}

else if

(TCanonical == Canonical ||

Invalid

.count(TCanonical) ||

18800

Current.count(TCanonical)) {

18802 if

(!

Invalid

.count(TCanonical)) {

18804

diag::warn_delegating_ctor_cycle)

18808 if

(TCanonical != Canonical)

18809

S.

Diag

(

Target

->getLocation(), diag::note_it_delegates_to);

18812 while

(

C

->getCanonicalDecl() != Canonical) {

18814

(void)

C

->getTargetConstructor()->hasBody(FNTarget);

18815

assert(FNTarget &&

"Ctor cycle through bodiless function"

);

18818

cast<CXXConstructorDecl>(FNTarget));

18819

S.

Diag

(

C

->getLocation(), diag::note_which_delegates_to);

18823 Invalid

.insert(Current.begin(), Current.end());

18834 for

(DelegatingCtorDeclsType::iterator

18840 for

(

auto

CI =

Invalid

.begin(), CE =

Invalid

.end(); CI != CE; ++CI)

18841

(*CI)->setInvalidDecl();

18850 explicit

FindCXXThisExpr(

Sema

&S) : S(S) {}

18853

S.

Diag

(

E

->getLocation(), diag::err_this_static_member_func)

18854

<<

E

->isImplicit();

18878

FindCXXThisExpr Finder(*

this

);

18891 if

(!Finder.TraverseStmt(

E

))

18908

FindCXXThisExpr Finder(*

this

);

18930 if

(!Finder.TraverseType(

E

))

18940

FindCXXThisExpr Finder(*

this

);

18943 for

(

const auto

*A : Method->

attrs

()) {

18945 Expr

*Arg =

nullptr

;

18947 if

(

const auto

*G = dyn_cast<GuardedByAttr>(A))

18949 else if

(

const auto

*G = dyn_cast<PtGuardedByAttr>(A))

18951 else if

(

const auto

*AA = dyn_cast<AcquiredAfterAttr>(A))

18953 else if

(

const auto

*AB = dyn_cast<AcquiredBeforeAttr>(A))

18955 else if

(

const auto

*ETLF = dyn_cast<ExclusiveTrylockFunctionAttr>(A)) {

18956

Arg = ETLF->getSuccessValue();

18958

}

else if

(

const auto

*STLF = dyn_cast<SharedTrylockFunctionAttr>(A)) {

18959

Arg = STLF->getSuccessValue();

18961

}

else if

(

const auto

*LR = dyn_cast<LockReturnedAttr>(A))

18962

Arg = LR->getArg();

18963 else if

(

const auto

*LE = dyn_cast<LocksExcludedAttr>(A))

18965 else if

(

const auto

*RC = dyn_cast<RequiresCapabilityAttr>(A))

18967 else if

(

const auto

*AC = dyn_cast<AcquireCapabilityAttr>(A))

18969 else if

(

const auto

*AC = dyn_cast<TryAcquireCapabilityAttr>(A))

18971 else if

(

const auto

*RC = dyn_cast<ReleaseCapabilityAttr>(A))

18974 if

(Arg && !Finder.TraverseStmt(Arg))

18977 for

(

unsigned

I = 0, N = Args.size(); I != N; ++I) {

18978 if

(!Finder.TraverseStmt(Args[I]))

18992

Exceptions.clear();

18995

Exceptions.reserve(DynamicExceptions.size());

18996 for

(

unsigned

ei = 0, ee = DynamicExceptions.size(); ei != ee; ++ei) {

19003 if

(!Unexpanded.empty()) {

19014

Exceptions.push_back(ET);

19024 "Parser should have made sure that the expression is boolean"

);

19044 D

= FTD->getTemplatedDecl();

19054

DynamicExceptionRanges, NoexceptExpr, Exceptions,

19082 Diag

(DeclStart, diag::err_anonymous_property);

19094 D

.setInvalidType();

19102 if

(

D

.getDeclSpec().isInlineSpecified())

19103 Diag

(

D

.getDeclSpec().getInlineSpecLoc(), diag::err_inline_non_function)

19105 if

(

DeclSpec::TSCS

TSCS =

D

.getDeclSpec().getThreadStorageClassSpec())

19106 Diag

(

D

.getDeclSpec().getThreadStorageClassSpecLoc(),

19107

diag::err_invalid_thread)

19113

RedeclarationKind::ForVisibleRedeclaration);

19115 switch

(

Previous

.getResultKind()) {

19122

PrevDecl =

Previous

.getRepresentativeDecl();

19135

PrevDecl =

nullptr

;

19139

PrevDecl =

nullptr

;

19150 Record

->setInvalidDecl();

19152 if

(

D

.getDeclSpec().isModulePrivateSpecified())

19161 Record

->addDecl(NewPD);

19172 if

(!ExplicitLists.empty()) {

19173 bool

IsMemberSpecialization, IsInvalid;

19177

ExplicitLists,

false

, IsMemberSpecialization, IsInvalid,

19189 if

(ExplicitParams && !ExplicitParams->

empty

()) {

19190

Info.AutoTemplateParameterDepth = ExplicitParams->

getDepth

();

19191

llvm::append_range(Info.TemplateParams, *ExplicitParams);

19192

Info.NumExplicitTemplateParams = ExplicitParams->

size

();

19194

Info.AutoTemplateParameterDepth = TemplateParameterDepth;

19195

Info.NumExplicitTemplateParams = 0;

19201 if

(FSI.TemplateParams.size() > FSI.NumExplicitTemplateParams) {

19202 if

(FSI.NumExplicitTemplateParams != 0) {

Defines the clang::ASTContext interface.

enum clang::sema::@1704::IndirectLocalPathEntry::EntryKind Kind

Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....

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...

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.

llvm::SmallVector< std::pair< const MemRegion *, SVal >, 4 > Bindings

This file declares semantic analysis for CUDA constructs.

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 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 RefersToRValueRef(Expr *MemRef)

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.

static IsTupleLike isTupleLike(Sema &S, SourceLocation Loc, QualType T, llvm::APSInt &Size)

#define CheckPolymorphic(Type)

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 bool checkTrivialSubobjectCall(Sema &S, SourceLocation SubobjLoc, QualType SubType, bool ConstRHS, CXXSpecialMemberKind CSM, TrivialSubobjectKind Kind, Sema::TrivialABIHandling TAH, bool Diagnose)

Check whether the special member selected for a given type would be trivial.

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 Expr * CastForMoving(Sema &SemaRef, Expr *E)

static void extendLeft(SourceRange &R, SourceRange Before)

static bool checkTrivialClassMembers(Sema &S, CXXRecordDecl *RD, CXXSpecialMemberKind CSM, bool ConstArg, Sema::TrivialABIHandling TAH, bool Diagnose)

Check whether the members of a class type allow a special member to be trivial.

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 findTrivialSpecialMember(Sema &S, CXXRecordDecl *RD, CXXSpecialMemberKind CSM, unsigned Quals, bool ConstRHS, Sema::TrivialABIHandling TAH, CXXMethodDecl **Selected)

Perform lookup for a special member of the specified kind, and determine whether it is trivial.

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 bool CheckOperatorNewDeleteTypes(Sema &SemaRef, const FunctionDecl *FnDecl, CanQualType ExpectedResultType, CanQualType ExpectedFirstParamType, unsigned DependentParamTypeDiag, unsigned InvalidParamTypeDiag)

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 Sema::ImplicitExceptionSpecification ComputeDefaultedComparisonExceptionSpec(Sema &S, SourceLocation Loc, FunctionDecl *FD, Sema::DefaultedComparisonKind DCK)

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 checkTupleLikeDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, VarDecl *Src, QualType DecompType, const llvm::APSInt &TupleSize)

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 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 void checkForMultipleExportedDefaultConstructors(Sema &S, CXXRecordDecl *Class)

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 NamespaceDecl * getNamespaceDecl(NamedDecl *D)

getNamespaceDecl - Returns the namespace a decl represents.

static bool checkArrayDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const ConstantArrayType *CAT)

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 ClassTemplateDecl * LookupStdInitializerList(Sema &S, SourceLocation Loc)

static bool CheckOperatorNewDeclaration(Sema &SemaRef, const FunctionDecl *FnDecl)

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.

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 void DefineDefaultedFunction(Sema &S, FunctionDecl *FD, SourceLocation DefaultLoc)

static bool BuildImplicitMemberInitializer(Sema &SemaRef, CXXConstructorDecl *Constructor, ImplicitInitializerKind ImplicitInitKind, FieldDecl *Field, IndirectFieldDecl *Indirect, CXXCtorInitializer *&CXXMemberInit)

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 lookupStdTypeTraitMember(Sema &S, LookupResult &TraitMemberLookup, SourceLocation Loc, StringRef Trait, TemplateArgumentListInfo &Args, unsigned DiagID)

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 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 CheckConstexprCtorInitializer(Sema &SemaRef, const FunctionDecl *Dcl, FieldDecl *Field, llvm::SmallSet< Decl *, 16 > &Inits, bool &Diagnosed, Sema::CheckConstexprKind Kind)

Check that the given field is initialized within a constexpr constructor.

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 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.

const NestedNameSpecifier * Specifier

__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)

APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...

virtual void HandleVTable(CXXRecordDecl *RD)

Callback involved at the end of a translation unit to notify the consumer that a vtable for the given...

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 ...

TranslationUnitDecl * getTranslationUnitDecl() const

const ConstantArrayType * getAsConstantArrayType(QualType T) const

QualType getRValueReferenceType(QualType T) const

Return the uniqued reference to the type for an rvalue reference to the specified type.

unsigned getIntWidth(QualType T) const

QualType getTagDeclType(const TagDecl *Decl) const

Return the unique reference to the type for the specified TagDecl (struct/union/class/enum) decl.

DeclarationNameTable DeclarationNames

QualType getRecordType(const RecordDecl *Decl) const

unsigned NumImplicitCopyAssignmentOperatorsDeclared

The number of implicitly-declared copy assignment operators for which declarations were built.

CanQualType getCanonicalType(QualType T) const

Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...

unsigned NumImplicitDestructorsDeclared

The number of implicitly-declared destructors for which declarations were built.

bool hasSameType(QualType T1, QualType T2) const

Determine whether the given types T1 and T2 are equivalent.

CallingConv getDefaultCallingConvention(bool IsVariadic, bool IsCXXMethod, bool IsBuiltin=false) const

Retrieves the default calling convention for the current target.

QualType getPointerType(QualType T) const

Return the uniqued reference to the type for a pointer to the specified type.

const CXXMethodDecl * getCurrentKeyFunction(const CXXRecordDecl *RD)

Get our current best idea for the key function of the given record decl, or nullptr if there isn't on...

void Deallocate(void *Ptr) const

QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const

Return the uniqued reference to the type for an lvalue reference to the specified type.

QualType getTypeDeclType(const TypeDecl *Decl, const TypeDecl *PrevDecl=nullptr) const

Return the unique reference to the type for the specified type declaration.

const LangOptions & getLangOpts() const

QualType getConstType(QualType T) const

Return the uniqued reference to the type for a const qualified type.

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<=>,...

unsigned NumImplicitDefaultConstructorsDeclared

The number of implicitly-declared default constructors for which declarations were built.

TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const

Allocate a TypeSourceInfo where all locations have been initialized to a given location,...

bool hasAnyFunctionEffects() const

CanQualType getSizeType() const

Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.

unsigned NumImplicitMoveConstructorsDeclared

The number of implicitly-declared move constructors for which declarations were built.

unsigned NumImplicitCopyConstructorsDeclared

The number of implicitly-declared copy constructors for which declarations were built.

unsigned NumImplicitDestructors

The number of implicitly-declared destructors.

QualType getQualifiedType(SplitQualType split) const

Un-split a SplitQualType.

QualType getElaboratedType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, QualType NamedType, TagDecl *OwnedTagDecl=nullptr) const

QualType getPackExpansionType(QualType Pattern, std::optional< unsigned > NumExpansions, bool ExpectPackInType=true) const

Form a pack expansion type with the given pattern.

void adjustExceptionSpec(FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI, bool AsWritten=false)

Change the exception specification on a function once it is delay-parsed, instantiated,...

const clang::PrintingPolicy & getPrintingPolicy() const

bool hasSameUnqualifiedType(QualType T1, QualType T2) const

Determine whether the given types are equivalent after cvr-qualifiers have been removed.

const ArrayType * getAsArrayType(QualType T) const

Type Query functions.

uint64_t getTypeSize(QualType T) const

Return the size of the specified (complete) type T, in bits.

unsigned NumImplicitDefaultConstructors

The number of implicitly-declared default constructors.

CharUnits getTypeSizeInChars(QualType T) const

Return the size of the specified (complete) type T, in characters.

unsigned NumImplicitMoveAssignmentOperatorsDeclared

The number of implicitly-declared move assignment operators for which declarations were built.

unsigned NumImplicitMoveConstructors

The number of implicitly-declared move constructors.

TypeSourceInfo * CreateTypeSourceInfo(QualType T, unsigned Size=0) const

Allocate an uninitialized TypeSourceInfo.

QualType getExceptionObjectType(QualType T) const

CanQualType UnsignedLongLongTy

QualType getArrayDecayedType(QualType T) const

Return the properly qualified result of decaying the specified array type to a pointer.

QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const

Return a normal function type with a typed argument list.

QualType getDependentNameType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, const IdentifierInfo *Name, QualType Canon=QualType()) const

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.

bool hasSameTemplateName(const TemplateName &X, const TemplateName &Y, bool IgnoreDeduced=false) const

Determine whether the given template names refer to the same template.

const TargetInfo & getTargetInfo() const

QualType getAutoDeductType() const

C++11 deduction pattern for 'auto' type.

unsigned NumImplicitCopyConstructors

The number of implicitly-declared copy constructors.

QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const

Return the uniqued reference to the type for an address space qualified type with the specified type ...

ExternalASTSource * getExternalSource() const

Retrieve a pointer to the external AST source associated with this AST context, if any.

unsigned NumImplicitCopyAssignmentOperators

The number of implicitly-declared copy assignment operators.

void adjustDeducedFunctionResultType(FunctionDecl *FD, QualType ResultType)

Change the result type of a function type once it is deduced.

NestedNameSpecifier * getCanonicalNestedNameSpecifier(NestedNameSpecifier *NNS) const

Retrieves the "canonical" nested name specifier for a given nested name specifier.

unsigned NumImplicitMoveAssignmentOperators

The number of implicitly-declared move assignment operators.

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)

Wrapper for source info for arrays.

TypeLoc getElementLoc() const

Represents an array type, per C99 6.7.5.2 - Array Declarators.

QualType getElementType() const

Attr - This represents one attribute.

attr::Kind getKind() const

Attr * clone(ASTContext &C) const

SourceLocation getLocation() const

Represents a C++11 auto or C++14 decltype(auto) type, possibly constrained by a type-constraint.

AutoTypeKeyword getKeyword() 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)

BinaryConditionalOperator - The GNU extension to the conditional operator which allows the middle ope...

A builtin binary operation expression such as "x + y" or "x <= y".

static BinaryOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)

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...

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...

std::list< CXXBasePath >::iterator paths_iterator

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.

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...

ExplicitSpecifier getExplicitSpecifier()

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-...

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(), Expr *TrailingRequiresClause=nullptr)

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.

FieldDecl * getAnyMember() const

A use of a default initializer in a constructor or in aggregate initialization.

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, Expr *TrailingRequiresClause=nullptr)

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...

bool isImplicitObjectMemberFunction() const

[C++2b][dcl.fct]/p7 An implicit object member function is a non-static member function without an exp...

unsigned getNumExplicitParams() const

CXXMethodDecl * getMostRecentDecl()

overridden_method_range overridden_methods() const

unsigned size_overridden_methods() const

QualType getFunctionObjectParameterReferenceType() const

Return the type of the object pointed by this.

RefQualifierKind getRefQualifier() const

Retrieve the ref-qualifier associated with this method.

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.

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, Expr *TrailingRequiresClause=nullptr)

QualType getFunctionObjectParameterType() const

bool isCopyAssignmentOperator() const

Determine whether this is a copy-assignment operator, regardless of whether it was declared implicitl...

CXXMethodDecl * getCanonicalDecl() override

Retrieves the "canonical" declaration of the given declaration.

The null pointer literal (C++11 [lex.nullptr])

A call to an overloaded operator written using operator syntax.

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 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.

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 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 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 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.

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 isInterfaceLike() const

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.

NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const

Retrieve a nested-name-specifier with location information, copied into the given AST context.

NestedNameSpecifier * getScopeRep() const

Retrieve the representation of the nested-name-specifier.

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

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]).

CanQual< T > getUnqualifiedType() const

Retrieve the unqualified form of this type.

CanProxy< U > getAs() const

Retrieve a canonical type pointer with a different static type, upcasting or downcasting as needed.

const T * getTypePtr() const

Retrieve the underlying type pointer, which refers to a canonical type.

static CharSourceRange getTokenRange(SourceRange R)

SourceLocation getBegin() const

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.

ClassTemplateDecl * getCanonicalDecl() override

Retrieves the canonical declaration of this 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

const ComparisonCategoryInfo & getInfoForType(QualType Ty) const

Return the comparison category information as specified by getCategoryForType(Ty).

const ComparisonCategoryInfo * lookupInfo(ComparisonCategoryType Kind) const

Return the cached comparison category information for the specified 'Kind'.

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.

const ValueInfo * getValueInfo(ComparisonCategoryResult ValueKind) const

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)

ConditionalOperator - The ?: ternary operator.

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)

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.

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.

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.

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

bool isStdNamespace() 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 encloses the declaration context DC.

void addHiddenDecl(Decl *D)

Add the declaration D to this context without modifying any lookup tables.

Decl::Kind getDeclKind() const

DeclContext * getNonTransparentContext()

decl_iterator decls_begin() const

A reference to a declared variable, function, enum, etc.

SourceLocation getBeginLoc() const LLVM_READONLY

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?

Captures information about "declaration specifiers".

bool hasTypeSpecifier() const

Return true if any type-specifier has been found.

Expr * getPackIndexingExpr() const

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

bool isFriendSpecifiedFirst() const

SourceLocation getEllipsisLoc() const

SourceLocation getConstSpecLoc() const

SourceRange getExplicitSpecRange() const

Expr * getRepAsExpr() const

SourceLocation getRestrictSpecLoc() const

static const char * getSpecifierName(DeclSpec::TST T, const PrintingPolicy &Policy)

Turn a type-specifier-type into a string like "_Bool" or "union".

SourceLocation getAtomicSpecLoc() 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 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,...

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 clearIdentifierNamespace()

Clears the namespace of this declaration.

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)

bool isUsed(bool CheckUsedAttr=true) const

Whether any (re-)declaration of the entity was used, meaning that a definition is required.

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.

virtual SourceRange getSourceRange() const LLVM_READONLY

Source range that this declaration covers.

The name of a declaration.

IdentifierInfo * getAsIdentifierInfo() const

Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...

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

unsigned getNumTemplateParameterLists() const

void setTypeSourceInfo(TypeSourceInfo *TI)

Expr * getTrailingRequiresClause()

Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...

TypeSourceInfo * getTypeSourceInfo() const

Information about one declarator, including the parsed type information and the identifier.

SourceLocation getIdentifierLoc() const

SourceLocation getBeginLoc() const LLVM_READONLY

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 isInvalidType() const

A decomposition declaration.

llvm::ArrayRef< BindingDecl * > bindings() const

A parsed C++17 decomposition declarator of the form '[' identifier-list ']'.

SourceRange getSourceRange() const

SourceLocation getLSquareLoc() const

Represents a C++17 deduced template specialization type.

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 isLastDiagnosticIgnored() const

Determine whether the previous diagnostic was ignored.

bool isIgnored(unsigned DiagID, SourceLocation Loc) const

Determine whether the diagnostic is known to be ignored.

Recursive AST visitor that supports extension via dynamic dispatch.

virtual bool TraverseConstructorInitializer(MaybeConst< CXXCtorInitializer > *Init)

Recursively visit a constructor initializer.

void setElaboratedKeywordLoc(SourceLocation Loc)

TypeLoc getNamedTypeLoc() const

void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)

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

A helper class that allows the use of isa/cast/dyncast to detect TagType objects of enums.

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, e.g.

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.

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.

unsigned getFieldIndex() const

Returns the index of this field within its record, as appropriate for passing to ASTRecordLayout::get...

const RecordDecl * getParent() const

Returns the parent of this field declaration, which is the struct in which this field is defined.

FieldDecl * getCanonicalDecl() override

Retrieves the canonical declaration of this field.

bool isUnnamedBitField() const

Determines whether this is an unnamed bitfield.

Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...

static FixItHint CreateInsertionFromRange(SourceLocation InsertionLoc, CharSourceRange FromRange, bool BeforePreviousInsertions=false)

Create a code modification hint that inserts the given code from FromRange at a specific location.

static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)

Create a code modification hint that replaces the given source range with the given code string.

static FixItHint CreateRemoval(CharSourceRange RemoveRange)

Create a code modification hint that removes the given source range.

static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)

Create a code modification hint that inserts the given code string at a specific location.

FriendDecl - Represents the declaration of a friend entity, which can be a function,...

static FriendDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, FriendUnion Friend_, SourceLocation FriendL, SourceLocation EllipsisLoc={}, ArrayRef< TemplateParameterList * > FriendTypeTPLists={})

void setUnsupportedFriend(bool Unsupported)

static FriendTemplateDecl * Create(ASTContext &Context, DeclContext *DC, SourceLocation Loc, MutableArrayRef< TemplateParameterList * > Params, FriendUnion Friend, SourceLocation FriendLoc)

static DefaultedOrDeletedFunctionInfo * Create(ASTContext &Context, ArrayRef< DeclAccessPair > Lookups, StringLiteral *DeletedMessage=nullptr)

Represents a function declaration or definition.

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

unsigned getMinRequiredArguments() const

Returns the minimum number of arguments needed to call this function.

bool isFunctionTemplateSpecialization() const

Determine whether this function is a function template specialization.

FunctionTemplateDecl * getDescribedFunctionTemplate() const

Retrieves the function template that is described by this function declaration.

void setIsPureVirtual(bool P=true)

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.

FunctionTypeLoc getFunctionTypeLoc() const

Find the source location information for how the type of this function was written.

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.

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.

bool isImmediateEscalating() const

bool isThisDeclarationInstantiatedFromAFriendDefinition() const

Determine whether this specific declaration of the function is a friend declaration that was instanti...

void setRangeEnd(SourceLocation E)

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.

bool isInlineSpecified() const

Determine whether the "inline" keyword was specified for this function.

DefaultedOrDeletedFunctionInfo * getDefalutedOrDeletedInfo() const

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)

An immutable set of FunctionEffects and possibly conditions attached to them.

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.

QualType getParamType(unsigned i) const

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.

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.

void RemoveDecl(NamedDecl *D)

RemoveDecl - Unlink the decl from its shadowed decl chain.

void AddDecl(NamedDecl *D)

AddDecl - Link the decl to its shadowed decl chain.

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....

ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...

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.

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, bool Implicit=false)

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 InitializeDelegation(QualType Type)

Create the initialization entity for a delegated constructor.

The injected class name of a C++ class template or class template partial specialization.

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].

Describes the capture of a variable or of this, or of a C++1y init-capture.

A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...

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.

@ Ver4

Attempt to be ABI-compatible with code generated by Clang 4.0.x (SVN r291814).

@ Ver14

Attempt to be ABI-compatible with code generated by Clang 14.0.x.

bool isCompatibleWithMSVC(MSVCMajorVersion MajorVersion) const

void push_back(const T &LocalValue)

iterator begin(Source *source, bool LocalOnly=false)

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)

bool isLocalPackExpansion(const Decl *D)

Determine whether D is a pack expansion created in this scope.

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.

@ FoundOverloaded

Name lookup found a set of overloaded functions that met the criteria.

@ FoundUnresolvedValue

Name lookup found an unresolvable value declaration and cannot yet complete.

@ 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.

@ NotFoundInCurrentInstantiation

No entity found met the criteria within the current instantiation,, but there were dependent base cla...

@ Found

Name lookup found a single declaration that met the criteria.

LLVM_ATTRIBUTE_REINITIALIZES void clear()

Clears out any current state.

void setBaseObjectType(QualType T)

Sets the base object type for this lookup.

DeclClass * getAsSingle() const

void addDecl(NamedDecl *D)

Add a declaration to these results with its natural access.

void setLookupName(DeclarationName Name)

Sets the name to look up.

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.

void setHideTags(bool Hide)

Sets whether tag declarations should be hidden by non-tag declarations during resolution.

NamedDecl * getAcceptableDecl(NamedDecl *D) const

Retrieve the accepted (re)declaration of the given declaration, if there is one.

bool isSingleResult() const

Determines if this names a single result which is not an unresolved value using decl.

Sema::LookupNameKind getLookupKind() const

Gets the kind of lookup to perform.

NamedDecl * getRepresentativeDecl() const

Fetches a representative decl. Useful for lazy diagnostics.

void suppressDiagnostics()

Suppress the diagnostics that would normally fire because of this lookup.

static bool isVisible(Sema &SemaRef, NamedDecl *D)

Determine whether the given declaration is visible to the program.

const DeclarationNameInfo & getLookupNameInfo() const

Gets the name info to look up.

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.

bool isCXXClassMember() const

Determine whether this declaration is a C++ class member.

Represents a C++ namespace alias.

static NamespaceAliasDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation NamespaceLoc, SourceLocation AliasLoc, IdentifierInfo *Alias, NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc, NamedDecl *Namespace)

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 ...

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>::".

bool isDependent() const

Whether this nested name specifier refers to a dependent type or not.

static NestedNameSpecifier * Create(const ASTContext &Context, NestedNameSpecifier *Prefix, const IdentifierInfo *II)

Builds a specifier combining a prefix and an identifier.

@ Global

The global specifier '::'. There is no stored value.

bool containsUnexpandedParameterPack() const

Whether this nested-name-specifier contains an unexpanded parameter pack (for C++11 variadic template...

const Type * getAsType() const

Retrieve the type stored in this nested name specifier.

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

MapType::iterator iterator

MapType::const_iterator const_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)

SourceLocation getExplicitObjectParamThisLoc() const

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

bool isExplicitObjectParameter() 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()

bool hasAttribute(ParsedAttr::Kind K) 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()

PseudoObjectExpr - An expression which accesses a pseudo-object l-value.

ArrayRef< Expr * > semantics()

A (possibly-)qualified type.

bool isVolatileQualified() const

Determine whether this type is volatile-qualified.

bool hasQualifiers() const

Determine whether this type has any qualifiers.

QualType withConst() 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.

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 getCanonicalType() const

QualType getUnqualifiedType() const

Retrieve the unqualified variant of the given type, removing as little sugar as possible.

bool isWebAssemblyReferenceType() const

Returns true if it is a WebAssembly Reference Type.

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 addAddressSpace(LangAS space)

@ OCL_Weak

Reading or writing from this object requires a barrier call.

void removeAddressSpace()

std::string getAsString() const

LangAS getAddressSpace() const

An rvalue reference type, per C++11 [dcl.ref].

Represents a struct/union/class.

bool hasFlexibleArrayMember() const

field_iterator field_end() const

field_range fields() const

bool isInjectedClassName() const

Determines whether this declaration represents the injected class name.

bool isAnonymousStructOrUnion() const

Whether this is an anonymous struct or union.

field_iterator field_begin() const

A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...

RecordDecl * getDecl() const

decl_type * getFirstDecl()

Return the first declaration of this declaration or itself if this is the only declaration.

decl_type * getPreviousDecl()

Return the previous declaration of this declaration or NULL if this is the first declaration.

decl_type * getMostRecentDecl()

Returns the most recent (re)declaration of this declaration.

void setPreviousDecl(decl_type *PrevDecl)

Set the previous declaration.

redecl_range redecls() const

Returns an iterator range for all the redeclarations of the same decl.

Base for LValueReferenceType and RValueReferenceType.

QualType getPointeeType() const

static ResolvedUnexpandedPackExpr * Create(ASTContext &C, SourceLocation BeginLoc, QualType T, unsigned NumExprs)

ReturnStmt - This represents a return, optionally of an expression: return; return 4;.

Scope - A scope is a transient data structure that is used while parsing the program.

void setEntity(DeclContext *E)

const Scope * getParent() const

getParent - Return the scope that this is nested in.

@ DeclScope

This is a scope that can contain a declaration.

A generic diagnostic builder for errors which may or may not be deferred.

SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)

Emit a diagnostic.

PartialDiagnostic PDiag(unsigned DiagID=0)

Build a partial diagnostic.

bool inferTargetForImplicitSpecialMember(CXXRecordDecl *ClassDecl, CXXSpecialMemberKind CSM, CXXMethodDecl *MemberDecl, bool ConstRHS, bool Diagnose)

Given a implicit special member, infer its CUDA target from the calls it needs to make to underlying ...

void checkDeclIsAllowedInOpenMPTarget(Expr *E, Decl *D, SourceLocation IdLoc=SourceLocation())

Check declaration inside target region.

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 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 EvaluateStaticAssertMessageAsString(Expr *Message, std::string &Result, ASTContext &Ctx, bool ErrorOnInvalidMessage)

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)

TemplateArgumentLoc getTrivialTemplateArgumentLoc(const TemplateArgument &Arg, QualType NTTPType, SourceLocation Loc, NamedDecl *TemplateParam=nullptr)

Allocate a TemplateArgumentLoc where all locations have been initialized to the given location.

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 * ActOnUsingEnumDeclaration(Scope *CurScope, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation EnumLoc, SourceRange TyLoc, const IdentifierInfo &II, ParsedType Ty, CXXScopeSpec *SS=nullptr)

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.

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)

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)

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.

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 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.

PoppedFunctionScopePtr PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, const Decl *D=nullptr, QualType BlockType=QualType())

Pop a function (or block or lambda or captured region) scope from the stack.

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)

ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, VerifyICEDiagnoser &Diagnoser, AllowFoldKind CanFold=NoFold)

VerifyIntegerConstantExpression - Verifies that an expression is an ICE, and reports the appropriate ...

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...

@ 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.

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...

DeclarationNameInfo GetNameForDeclarator(Declarator &D)

GetNameForDeclarator - Determine the full declaration name for the given Declarator.

DiagnosticsEngine & getDiagnostics() const

AccessResult CheckDestructorAccess(SourceLocation Loc, CXXDestructorDecl *Dtor, const PartialDiagnostic &PDiag, QualType objectType=QualType())

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...

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.

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 CreateOverloadedBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, const UnresolvedSetImpl &Fns, Expr *LHS, Expr *RHS, bool RequiresADL=true, bool AllowRewrittenCandidates=true, FunctionDecl *DefaultedFn=nullptr)

Create a binary operation that may resolve to an overloaded operator.

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.

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.

DeclRefExpr * BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK, SourceLocation Loc, const CXXScopeSpec *SS=nullptr)

ExprResult CheckConvertedConstantExpression(Expr *From, QualType T, llvm::APSInt &Value, CCEKind CCE)

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()

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.

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.

void collectUnexpandedParameterPacks(TemplateArgument Arg, SmallVectorImpl< UnexpandedParameterPack > &Unexpanded)

Collect the set of unexpanded parameter packs within the given template argument.

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)

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 (...

ExprResult ActOnCXXBoolLiteral(SourceLocation OpLoc, tok::TokenKind Kind)

ActOnCXXBoolLiteral - Parse {true,false} literals.

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.

bool CheckConstraintSatisfaction(const NamedDecl *Template, ArrayRef< const Expr * > ConstraintExprs, const MultiLevelTemplateArgumentList &TemplateArgLists, SourceRange TemplateIDRange, ConstraintSatisfaction &Satisfaction)

Check whether the given list of constraint expressions are satisfied (as if in a 'conjunction') given...

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)

QualType getElaboratedType(ElaboratedTypeKeyword Keyword, const CXXScopeSpec &SS, QualType T, TagDecl *OwnedTagDecl=nullptr)

Retrieve a version of the type 'T' that is elaborated by Keyword, qualified by the nested-name-specif...

bool RequireCompleteEnumDecl(EnumDecl *D, SourceLocation L, CXXScopeSpec *SS=nullptr)

Require that the EnumDecl is completed with its enumerators defined or instantiated.

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 CheckOverloadedOperatorDeclaration(FunctionDecl *FnDecl)

CheckOverloadedOperatorDeclaration - Check whether the declaration of this overloaded operator is wel...

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.

void popCodeSynthesisContext()

CXXRecordDecl * getCurrentClass(Scope *S, const CXXScopeSpec *SS)

Get the class that is directly named by the current context.

void pushCodeSynthesisContext(CodeSynthesisContext Ctx)

QualType BuildReferenceType(QualType T, bool LValueRef, SourceLocation Loc, DeclarationName Entity)

Build a reference type.

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.

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, SkipBodyInfo *SkipBody=nullptr)

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.

bool FindDeallocationFunction(SourceLocation StartLoc, CXXRecordDecl *RD, DeclarationName Name, FunctionDecl *&Operator, bool Diagnose=true, bool WantSize=false, bool WantAligned=false)

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.

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 SetDelegatingInitializer(CXXConstructorDecl *Constructor, CXXCtorInitializer *Initializer)

@ TAH_IgnoreTrivialABI

The triviality of a method unaffected by "trivial_abi".

@ TAH_ConsiderTrivialABI

The triviality of a method affected by "trivial_abi".

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 MarkVirtualBaseDestructorsReferenced(SourceLocation Location, CXXRecordDecl *ClassDecl, llvm::SmallPtrSetImpl< const RecordType * > *DirectVirtualBases=nullptr)

Mark destructors of virtual bases of this class referenced.

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.

QualType CheckTemplateIdType(TemplateName Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs)

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 ...

bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReciever=nullptr, bool SkipTrailingRequiresClause=false)

Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.

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)

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 InstantiateDefaultCtorDefaultArgs(CXXConstructorDecl *Ctor)

In the MS ABI, we need to instantiate default arguments of dllexported default constructors along wit...

void CheckCompleteVariableDeclaration(VarDecl *VD)

ExprResult ActOnRequiresClause(ExprResult ConstraintExpr)

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.

@ CCEK_StaticAssertMessageSize

Call to size() in a static assert message.

@ CCEK_ExplicitBool

Condition in an explicit(bool) specifier.

@ CCEK_StaticAssertMessageData

Call to data() in a static assert message.

void mergeDeclAttributes(NamedDecl *New, Decl *Old, AvailabilityMergeKind AMK=AMK_Redeclaration)

mergeDeclAttributes - Copy attributes from the Old decl to the New one.

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...

@ Ovl_NonFunction

This is not an overload because the lookup results contain a non-function.

@ Ovl_Overload

This is a legitimate overload: the existing declarations are functions or function templates with dif...

@ Ovl_Match

This is not an overload because the signature exactly matches an existing declaration.

void NoteDeletedFunction(FunctionDecl *FD)

Emit a note explaining that this function is deleted.

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()

SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts

A stack of expression evaluation contexts.

void PushDeclContext(Scope *S, DeclContext *DC)

Set the current declaration context until it gets popped.

bool CheckEquivalentExceptionSpec(FunctionDecl *Old, FunctionDecl *New)

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)

CXXConstructorDecl * DeclareImplicitCopyConstructor(CXXRecordDecl *ClassDecl)

Declare the implicit copy constructor for the given class.

NamespaceDecl * getStdNamespace() const

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.

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.

FunctionDecl * FindDeallocationFunctionForDestructor(SourceLocation StartLoc, CXXRecordDecl *RD)

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.

void AddInitializerToDecl(Decl *dcl, Expr *init, bool DirectInit)

AddInitializerToDecl - Adds the initializer Init to the declaration dcl.

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,...

bool GatherArgumentsForCall(SourceLocation CallLoc, FunctionDecl *FDecl, const FunctionProtoType *Proto, unsigned FirstParam, ArrayRef< Expr * > Args, SmallVectorImpl< Expr * > &AllArgs, VariadicCallType CallType=VariadicDoesNotApply, bool AllowExplicit=false, bool IsListInitialization=false)

GatherArgumentsForCall - Collector argument expressions for various form of call prototypes.

ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())

Attempts to produce a RecoveryExpr after some AST node cannot be created.

Decl * ActOnDeclarator(Scope *S, Declarator &D)

StmtResult ActOnIfStmt(SourceLocation IfLoc, IfStatementKind StatementKind, SourceLocation LParenLoc, Stmt *InitStmt, ConditionResult Cond, SourceLocation RParenLoc, Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal)

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)

void ProcessAPINotes(Decl *D)

Map any API notes provided for this declaration to attributes on the declaration.

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.

ExprResult CreateBuiltinBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr)

CreateBuiltinBinOp - Creates a new built-in binary operation with operator Opc at location TokLoc.

void DiagnoseUnsatisfiedConstraint(const ConstraintSatisfaction &Satisfaction, bool First=true)

Emit diagnostics explaining why a constraint expression was deemed unsatisfied.

void ActOnPureSpecifier(Decl *D, SourceLocation PureSpecLoc)

bool IsDerivedFrom(SourceLocation Loc, QualType Derived, QualType Base)

Determine whether the type Derived is a C++ class that is derived from the type Base.

@ 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)

bool SpecialMemberIsTrivial(CXXMethodDecl *MD, CXXSpecialMemberKind CSM, TrivialABIHandling TAH=TAH_IgnoreTrivialABI, bool Diagnose=false)

Determine whether a defaulted or deleted special member function is trivial, as specified in C++11 [c...

ExprResult ActOnCXXThis(SourceLocation Loc)

bool DiagnoseUnexpandedParameterPacks(SourceLocation Loc, UnexpandedParameterPackContext UPPC, ArrayRef< UnexpandedParameterPack > Unexpanded)

Diagnose unexpanded parameter packs.

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)

bool CheckCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *Init=nullptr, bool SkipImmediateInvocations=true)

Instantiate or parse a C++ default argument expression as necessary.

ValueDecl * tryLookupUnambiguousFieldDecl(RecordDecl *ClassDecl, const IdentifierInfo *MemberOrBase)

ASTMutationListener * getASTMutationListener() const

ExprResult CorrectDelayedTyposInExpr(Expr *E, VarDecl *InitDecl=nullptr, bool RecoverUncorrectedTypos=false, llvm::function_ref< ExprResult(Expr *)> Filter=[](Expr *E) -> ExprResult { return E;})

Process any TypoExprs in the given Expr and its children, generating diagnostics as appropriate and r...

bool SetCtorInitializers(CXXConstructorDecl *Constructor, bool AnyErrors, ArrayRef< CXXCtorInitializer * > Initializers={})

void DiagnoseImmediateEscalatingReason(FunctionDecl *FD)

ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)

void FinalizeVarWithDestructor(VarDecl *VD, const RecordType *DeclInitType)

FinalizeVarWithDestructor - Prepare for calling destructor on the constructed variable.

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 isInMainFile(SourceLocation Loc) const

Returns whether the PresumedLoc for a given SourceLocation is in the main file.

SourceLocation getSpellingLoc(SourceLocation Loc) const

Given a SourceLocation object, return the spelling location referenced by the ID.

CharSourceRange getImmediateExpansionRange(SourceLocation Loc) const

Return the start/end of the expansion information for an expansion location.

bool isInSystemHeader(SourceLocation Loc) const

Returns if a SourceLocation is in a system header.

SourceLocation getExpansionLoc(SourceLocation Loc) const

Given a SourceLocation object Loc, return the expansion location referenced by the ID.

A trivial tuple used to represent a source range.

void setBegin(SourceLocation b)

SourceLocation getEnd() const

SourceLocation getBegin() const

void setEnd(SourceLocation e)

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

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.

SourceRange getSourceRange() const override LLVM_READONLY

Source range that this declaration covers.

TagKind getTagKind() const

bool isDependentType() const

Whether this declaration declares a type that is dependent, i.e., a type that somehow depends on temp...

bool areArgsDestroyedLeftToRightInCallee() const

Are arguments to a call destroyed left to right in the callee? This is a fundamental language change,...

bool isMicrosoft() const

Is this ABI an MSVC-compatible ABI?

bool hasKeyFunctions() const

Does this ABI use key functions? If so, class data such as the vtable is emitted with strong linkage ...

const llvm::Triple & getTriple() const

Returns the target triple of the primary target.

virtual CallingConvKind getCallingConvKind(bool ClangABICompat4) const

TargetCXXABI getCXXABI() const

Get the C++ ABI currently in use.

virtual bool shouldDLLImportComdatSymbols() const

Does this target aim for semantic compatibility with Microsoft C++ code using dllimport/export attrib...

A convenient class for passing around template argument information.

void addArgument(const TemplateArgumentLoc &Loc)

llvm::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

Represents a type template specialization; the template must be a class template, a type alias templa...

ArrayRef< TemplateArgument > template_arguments() const

TemplateName getTemplateName() const

Retrieve the name of the template that we are specializing.

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.

unsigned getIndex() const

unsigned getDepth() const

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.

const Type * getTypeForDecl() const

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.

A reasonable base class for TypeLocs that correspond to types that are written as a type-specifier.

static ElaboratedTypeKeyword getKeywordForTagTypeKind(TagTypeKind Tag)

Converts a TagTypeKind into an elaborated type keyword.

static StringRef getTagTypeKindName(TagTypeKind Kind)

static TagTypeKind getTagTypeKindForTypeSpec(unsigned TypeSpec)

Converts a type specifier (DeclSpec::TST) into a tag type kind.

The base class of the type hierarchy.

bool isSizelessType() const

As an extension, we classify types as one of "sized" or "sizeless"; every type is one or the other.

CXXRecordDecl * getAsCXXRecordDecl() const

Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...

bool isBooleanType() const

bool isLiteralType(const ASTContext &Ctx) const

Return true if this is a literal type (C++11 [basic.types]p10)

bool isIncompleteArrayType() const

bool isUndeducedAutoType() const

bool isRValueReferenceType() const

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

bool isElaboratedTypeSpecifier() const

Determine wither this type is a C++ elaborated-type-specifier.

QualType getPointeeType() const

If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.

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

bool containsErrors() const

Whether this type is an error type.

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 isObjCObjectType() const

bool isUndeducedType() const

Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...

bool isFunctionType() const

bool isObjCObjectPointerType() const

bool isStructureOrClassType() const

bool isRealFloatingType() const

Floating point categories.

const T * getAs() const

Member-template getAs<specific type>'.

bool isRecordType() const

TagDecl * getAsTagDecl() const

Retrieves the TagDecl that this type refers to, either because the type is a TagType or because it is...

RecordDecl * getAsRecordDecl() const

Retrieves the RecordDecl this type refers to.

Base class for declarations which introduce a typedef-name.

QualType getUnderlyingType() const

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...

UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...

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.

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)

Represents a dependent using declaration which was marked with typename.

static UnresolvedUsingTypenameDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, SourceLocation TypenameLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TargetNameLoc, DeclarationName TargetName, SourceLocation EllipsisLoc)

Represents a dependent using declaration which was not marked with typename.

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'.

DeclarationNameInfo getNameInfo() const

static UsingDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingL, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool HasTypenameKeyword)

NestedNameSpecifier * getQualifier() const

Retrieve the nested-name-specifier that qualifies the name.

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.

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? If so, the variable need not have a usable destr...

bool isInlineSpecified() const

APValue * evaluateValue() const

Attempt to evaluate the value of the initializer attached to this declaration, and produce notes expl...

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 hasConstantInitialization() const

Determine whether this variable has constant initialization.

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

@ 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.

Defines the clang::TargetInfo interface.

const AstTypeMatcher< RecordType > recordType

Matches record types (e.g.

bool Inc(InterpState &S, CodePtr OpPC)

1) Pops a pointer from the stack 2) Load the value from the pointer 3) Writes the value increased by ...

bool Zero(InterpState &S, CodePtr OpPC)

bool Comp(InterpState &S, CodePtr OpPC)

1) Pops the value from the stack.

Stencil access(llvm::StringRef BaseId, Stencil Member)

Constructs a MemberExpr that accesses the named member (Member) of the object bound to BaseId.

The JSON file list parser is used to communicate input to InstallAPI.

bool FTIHasNonVoidParameters(const DeclaratorChunk::FunctionTypeInfo &FTI)

TypeSpecifierType

Specifies the kind of type.

@ TST_typename_pack_indexing

OverloadedOperatorKind

Enumeration specifying the different kinds of C++ overloaded operators.

@ OO_None

Not an overloaded operator.

@ NUM_OVERLOADED_OPERATORS

bool isa(CodeGen::Address addr)

bool isTemplateInstantiation(TemplateSpecializationKind Kind)

Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...

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.

@ Specialization

We are substituting template parameters for template arguments in order to form a template specializa...

LinkageSpecLanguageIDs

Represents the language in a linkage specification.

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 (&&).

@ 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.

@ 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.

@ 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.

std::optional< ComparisonCategoryType > getComparisonCategoryForBuiltinCmp(QualType T)

Get the comparison category that should be used when comparing values of type T.

StorageClass

Storage classes.

ThreadStorageClassSpecifier

Thread storage-class-specifier.

ComparisonCategoryType commonComparisonType(ComparisonCategoryType A, ComparisonCategoryType B)

Determine the common comparison type, as defined in C++2a [class.spaceship]p4.

ComparisonCategoryResult

An enumeration representing the possible results of a three-way comparison.

std::pair< llvm::PointerUnion< const TemplateTypeParmType *, NamedDecl *, ResolvedUnexpandedPackExpr * >, SourceLocation > UnexpandedParameterPack

Language

The language for the input, used to select and validate the language standard and possible actions.

@ Result

The result type of a method or function.

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.

bool isComputedNoexcept(ExceptionSpecificationType ESpecType)

void EscapeStringForDiagnostic(StringRef Str, SmallVectorImpl< char > &OutStr)

EscapeStringForDiagnostic - Append Str to the diagnostic buffer, escaping non-printable characters an...

ReservedLiteralSuffixIdStatus

ActionResult< Expr * > ExprResult

TagTypeKind

The kind of a tag type.

@ Interface

The "__interface" keyword.

@ Struct

The "struct" keyword.

@ Class

The "class" keyword.

MutableArrayRef< TemplateParameterList * > MultiTemplateParamsArg

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.

ActionResult< Stmt * > StmtResult

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.

ActionResult< ParsedType > TypeResult

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.

const FunctionProtoType * T

bool declaresSameEntity(const Decl *D1, const Decl *D2)

Determine whether two declarations declare the same entity.

std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt

A partial diagnostic along with the source location where this diagnostic occurs.

@ Incomplete

Template argument deduction did not deduce a value for every template parameter.

@ 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.

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)

ExceptionSpecificationType

The various types of exception specifications that exist in C++11.

@ EST_DependentNoexcept

noexcept(expression), value-dependent

@ EST_DynamicNone

throw()

@ 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)

AccessSpecifier

A C++ access specifier (public, private, protected), plus the special value "none" which means differ...

MutableArrayRef< Expr * > MultiExprArg

@ NOUR_Unevaluated

This name appears in an unevaluated operand.

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::@223 Kind

EvalResult is a struct with detailed info about an evaluated expression.

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

T * get(ExternalASTSource *Source) const

Retrieve the pointer to the AST node that this lazy pointer points to.

Information about operator rewrites to consider when adding operator functions to a candidate set.

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...

@ 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.

@ DeclaringSpecialMember

We are declaring an implicit special member function.

@ DeclaringImplicitEqualityComparison

We are declaring an implicit 'operator==' for a defaulted 'operator<=>'.

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.


RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4