A RetroSearch Logo

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

Search Query:

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

clang: lib/Sema/SemaTemplate.cpp Source File

39#include "llvm/ADT/SmallBitVector.h" 40#include "llvm/ADT/StringExtras.h" 41#include "llvm/Support/SaveAndRestore.h" 44using namespace clang

;

52 return SourceRange

(Ps[0]->getTemplateLoc(), Ps[N-1]->getRAngleLoc());

60 for

(

Scope

*TempParamScope = S->getTemplateParamParent(); TempParamScope;

61

TempParamScope = TempParamScope->getParent()->getTemplateParamParent()) {

66 auto

ParamsAtDepth = [&](

unsigned D

) { Depth = std::max(Depth,

D

+ 1); };

71 if

(

auto

*LSI = dyn_cast<LambdaScopeInfo>(FSI)) {

72 if

(!LSI->TemplateParams.empty()) {

73

ParamsAtDepth(LSI->AutoTemplateParameterDepth);

76 if

(LSI->GLTemplateParameterList) {

77

ParamsAtDepth(LSI->GLTemplateParameterList->getDepth());

87 if

(!Info.TemplateParams.empty()) {

88

ParamsAtDepth(Info.AutoTemplateParameterDepth);

103 bool

AllowFunctionTemplates,

104 bool

AllowDependent) {

105 D

=

D

->getUnderlyingDecl();

107 if

(isa<TemplateDecl>(

D

)) {

108 if

(!AllowFunctionTemplates && isa<FunctionTemplateDecl>(

D

))

114 if

(

const auto

*

Record

= dyn_cast<CXXRecordDecl>(

D

)) {

126 if

(

Record

->isInjectedClassName()) {

127 Record

= cast<CXXRecordDecl>(

Record

->getDeclContext());

128 if

(

Record

->getDescribedClassTemplate())

129 return Record

->getDescribedClassTemplate();

131 if

(

const auto

*Spec = dyn_cast<ClassTemplateSpecializationDecl>(

Record

))

132 return

Spec->getSpecializedTemplate();

141 if

(AllowDependent && isa<UnresolvedUsingValueDecl>(

D

))

148 bool

AllowFunctionTemplates,

149 bool

AllowDependent) {

160 bool

AllowFunctionTemplates,

162 bool

AllowNonTemplateFunctions) {

166 if

(AllowNonTemplateFunctions &&

167

isa<FunctionDecl>((*I)->getUnderlyingDecl()))

176 bool

hasTemplateKeyword,

179 bool

EnteringContext,

181 bool

&MemberOfUnknownSpecialization,

182 bool

Disambiguation) {

186

MemberOfUnknownSpecialization =

false

;

188 switch

(Name.getKind()) {

195

Name.OperatorFunctionId.Operator);

235 bool

AnyFunctionTemplates =

false

;

238 if

(isa<FunctionTemplateDecl>(FoundTemplate))

239

AnyFunctionTemplates =

true

;

242

FoundUsingShadow = dyn_cast<UsingShadowDecl>(FoundD);

250 if

(!

D

&& !AnyFunctionTemplates) {

251

R.suppressDiagnostics();

268 unsigned

ResultCount = R.

end

() - R.

begin

();

269 if

(!

D

&& ResultCount > 1) {

280

assert(

D

&&

"unambiguous result is not a template name"

);

283 if

(isa<UnresolvedUsingValueDecl>(

D

)) {

285

MemberOfUnknownSpecialization =

true

;

292

assert(!FoundUsingShadow || FoundUsingShadow->

getTargetDecl

() == TD);

299 if

(isa<FunctionTemplateDecl>(TD)) {

305

assert(isa<ClassTemplateDecl>(TD) || isa<TemplateTemplateParmDecl>(TD) ||

306

isa<TypeAliasTemplateDecl>(TD) || isa<VarTemplateDecl>(TD) ||

307

isa<BuiltinTemplateDecl>(TD) || isa<ConceptDecl>(TD));

330 if

(R.

empty

())

return false

;

367 Diag

(IILoc, diag::err_template_kw_missing)

377 QualType

ObjectType,

bool

EnteringContext,

380 bool

AllowTypoCorrection) {

387 Found

.setTemplateNameLookup(

true

);

391 bool

IsDependent =

false

;

392 if

(!ObjectType.

isNull

()) {

395

assert(SS.

isEmpty

() &&

"ObjectType and scope specifier cannot coexist"

);

401 "Caller should have completed object type"

);

433 bool

ObjectTypeSearchedInScope =

false

;

434 bool

AllowFunctionTemplatesInLookup =

true

;

450

IsDependent |=

Found

.wasNotFoundInCurrentInstantiation();

466 if

(!ObjectType.

isNull

()) {

470

AllowFunctionTemplatesInLookup =

false

;

471

ObjectTypeSearchedInScope =

true

;

474

IsDependent |=

Found

.wasNotFoundInCurrentInstantiation();

477 if

(

Found

.isAmbiguous())

494 if

(AllFunctions || (

Found

.empty() && !IsDependent)) {

498

*ATK = (

Found

.empty() &&

Found

.getLookupName().isIdentifier())

506 if

(

Found

.empty() && !IsDependent && AllowTypoCorrection) {

514

FilterCCC.WantExpressionKeywords =

false

;

515

FilterCCC.WantRemainingKeywords =

false

;

516

FilterCCC.WantCXXNamedCasts =

true

;

520 if

(

auto

*ND = Corrected.getFoundDecl())

523 if

(

Found

.isAmbiguous()) {

525

}

else if

(!

Found

.empty()) {

526 Found

.setLookupName(Corrected.getCorrection());

528

std::string CorrectedStr(Corrected.getAsString(

getLangOpts

()));

529 bool

DroppedSpecifier = Corrected.WillReplaceSpecifier() &&

530

Name.getAsString() == CorrectedStr;

532

<< Name << LookupCtx << DroppedSpecifier

542 Found

.empty() ? nullptr :

Found

.getRepresentativeDecl();

544 if

(

Found

.empty()) {

546 Found

.setNotFoundInCurrentInstantiation();

552 if

(ExampleLookupResult && RequiredTemplate) {

553 Diag

(

Found

.getNameLoc(), diag::err_template_kw_refers_to_non_template)

558

diag::note_template_kw_refers_to_non_template)

559

<<

Found

.getLookupName();

566 if

(S && !ObjectType.

isNull

() && !ObjectTypeSearchedInScope &&

583 if

(FoundOuter.

empty

()) {

592

FoundOuter.

clear

();

593

}

else if

(!

Found

.isSuppressingAmbiguousDiagnostics()) {

597 if

(!

Found

.isSingleResult() ||

601

diag::ext_nested_name_member_ref_lookup_ambiguous)

602

<<

Found

.getLookupName()

604 Diag

(

Found

.getRepresentativeDecl()->getLocation(),

605

diag::note_ambig_member_ref_object_type)

608

diag::note_ambig_member_ref_scope);

631 bool

MissingTemplateKeyword =

false

;

634 if

(

auto

*DRE = dyn_cast<DeclRefExpr>(

TemplateName

.get())) {

635

NameInfo = DRE->getNameInfo();

636

SS.

Adopt

(DRE->getQualifierLoc());

638 Found

= DRE->getFoundDecl();

639

}

else if

(

auto

*ME = dyn_cast<MemberExpr>(

TemplateName

.get())) {

640

NameInfo = ME->getMemberNameInfo();

641

SS.

Adopt

(ME->getQualifierLoc());

643

LookupCtx = ME->getBase()->getType()->getAsCXXRecordDecl();

644 Found

= ME->getMemberDecl();

645

}

else if

(

auto

*DSDRE =

646

dyn_cast<DependentScopeDeclRefExpr>(

TemplateName

.get())) {

647

NameInfo = DSDRE->getNameInfo();

648

SS.

Adopt

(DSDRE->getQualifierLoc());

649

MissingTemplateKeyword =

true

;

650

}

else if

(

auto

*DSME =

651

dyn_cast<CXXDependentScopeMemberExpr>(

TemplateName

.get())) {

652

NameInfo = DSME->getMemberNameInfo();

653

SS.

Adopt

(DSME->getQualifierLoc());

654

MissingTemplateKeyword =

true

;

656

llvm_unreachable(

"unexpected kind of potential template name"

);

661 if

(MissingTemplateKeyword) {

670

TemplateCandidateFilter(

Sema

&S) : S(S) {

671

WantTypeSpecifiers =

false

;

672

WantExpressionKeywords =

false

;

673

WantRemainingKeywords =

false

;

674

WantCXXNamedCasts =

true

;

676 bool

ValidateCandidate(

const TypoCorrection

&Candidate)

override

{

682

std::unique_ptr<CorrectionCandidateCallback> clone()

override

{

683 return

std::make_unique<TemplateCandidateFilter>(*

this

);

688

TemplateCandidateFilter CCC(*

this

);

691 auto

*ND = Corrected.getFoundDecl();

694 if

(ND || Corrected.isKeyword()) {

696

std::string CorrectedStr(Corrected.getAsString(

getLangOpts

()));

697 bool

DroppedSpecifier = Corrected.WillReplaceSpecifier() &&

698

Name.getAsString() == CorrectedStr;

700 PDiag

(diag::err_non_template_in_member_template_id_suggest)

701

<< Name << LookupCtx << DroppedSpecifier

705 PDiag

(diag::err_non_template_in_template_id_suggest)

710

diag::note_non_template_in_template_id_found);

715 Diag

(NameInfo.

getLoc

(), diag::err_non_template_in_template_id)

718 Diag

(

Found

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

725 bool

isAddressOfOperand,

741 nullptr

, NameInfo, TemplateArgs);

764 bool

InstantiatedFromMember,

769

assert(isa<TagDecl>(Instantiation) || isa<FunctionDecl>(Instantiation) ||

770

isa<VarDecl>(Instantiation));

772 bool

IsEntityBeingDefined =

false

;

773 if

(

const TagDecl

*TD = dyn_cast_or_null<TagDecl>(PatternDef))

774

IsEntityBeingDefined = TD->isBeingDefined();

776 if

(PatternDef && !IsEntityBeingDefined) {

791 if

(!Complain || (PatternDef && PatternDef->

isInvalidDecl

()))

795 if

(

TagDecl

*TD = dyn_cast<TagDecl>(Instantiation))

798 Diag

(PointOfInstantiation,

799

diag::err_template_instantiate_within_definition)

805

}

else if

(InstantiatedFromMember) {

806 if

(isa<FunctionDecl>(Instantiation)) {

807 Diag

(PointOfInstantiation,

808

diag::err_explicit_instantiation_undefined_member)

811 Diag

(Pattern->

getLocation

(), diag::note_explicit_instantiation_here);

813

assert(isa<TagDecl>(Instantiation) &&

"Must be a TagDecl!"

);

814 Diag

(PointOfInstantiation,

815

diag::err_implicit_instantiate_member_undefined)

820 if

(isa<FunctionDecl>(Instantiation)) {

821 Diag

(PointOfInstantiation,

822

diag::err_explicit_instantiation_undefined_func_template)

824 Diag

(Pattern->

getLocation

(), diag::note_explicit_instantiation_here);

825

}

else if

(isa<TagDecl>(Instantiation)) {

826 Diag

(PointOfInstantiation, diag::err_template_instantiate_undefined)

831

assert(isa<VarDecl>(Instantiation) &&

"Must be a VarDecl!"

);

832 if

(isa<VarTemplateSpecializationDecl>(Instantiation)) {

833 Diag

(PointOfInstantiation,

834

diag::err_explicit_instantiation_undefined_var_template)

838 Diag

(PointOfInstantiation,

839

diag::err_explicit_instantiation_undefined_member)

842 Diag

(Pattern->

getLocation

(), diag::note_explicit_instantiation_here);

856 bool

SupportedForCompatibility) {

869

? diag::ext_template_param_shadow

870

: (SupportedForCompatibility ? diag::ext_compat_template_param_shadow

871

: diag::err_template_param_shadow);

872 const auto

*ND = cast<NamedDecl>(PrevDecl);

873 Diag

(

Loc

, DiagId) << ND->getDeclName();

878 if

(

TemplateDecl

*Temp = dyn_cast_or_null<TemplateDecl>(

D

)) {

879 D

= Temp->getTemplatedDecl();

888 "Only template template arguments can be pack expansions here"

);

889

assert(

getAsTemplate

().get().containsUnexpandedParameterPack() &&

890 "Template template argument pack expansion without packs"

);

892 Result

.EllipsisLoc = EllipsisLoc;

927

llvm_unreachable(

"Unhandled parsed template argument"

);

932 for

(

unsigned

I = 0,

Last

= TemplateArgsIn.size(); I !=

Last

; ++I)

942

RedeclarationKind::ForVisibleRedeclaration);

952

assert(TInfo &&

"template argument with no location"

);

960

EllipsisLoc = PET.getEllipsisLoc();

961

TL = PET.getPatternLoc();

966

SS.

Adopt

(ET.getQualifierLoc());

967

TL = ET.getNamedTypeLoc();

971 TemplateName

Name = DTST.getTypePtr()->getTemplateName();

973

DTST.getTemplateNameLoc());

994 unsigned

Depth,

unsigned

Position,

997 bool

HasTypeConstraint) {

998

assert(S->isTemplateParamScope() &&

999 "Template type parameter not in template parameter scope!"

);

1001 bool

IsParameterPack = EllipsisLoc.

isValid

();

1004

KeyLoc, ParamNameLoc, Depth, Position,

1005

ParamName,

Typename

, IsParameterPack,

1011

CSI->LocalPacks.push_back(Param);

1024 if

(DefaultArg && IsParameterPack) {

1025 Diag

(EqualLoc, diag::err_template_param_pack_default_arg);

1026

DefaultArg =

nullptr

;

1034

assert(DefaultTInfo &&

"expected source information for type"

);

1062 return

TemplateArgs;

1075

diag::err_type_constraint_non_type_concept);

1084 if

(!WereArgsSpecified &&

1087

diag::err_type_constraint_missing_arguments)

1106 bool

AllowUnexpandedPack) {

1123 if

(EllipsisLoc.

isInvalid

() && !AllowUnexpandedPack) {

1132

ConceptName, CD,

USD ? cast<NamedDecl>(USD) : CD,

1138template

<

typename

ArgumentLocAppender>

1153

Appender(ConstraintArgs);

1162

FoundDecl ? FoundDecl : NamedConcept, NamedConcept,

1164 if

(ImmediatelyDeclaredConstraint.

isInvalid

() || !EllipsisLoc.

isValid

())

1165 return

ImmediatelyDeclaredConstraint;

1181

ImmediatelyDeclaredConstraint.

get

(), BO_LAnd,

1182

EllipsisLoc,

nullptr

,

1199

*TemplateArgs) :

nullptr

;

1201 QualType

ParamAsArgument = ConstrainedType;

1204

*

this

,

NS

, NameInfo, NamedConcept, FoundDecl,

1207

ParamAsArgument, ConstrainedParameter->

getLocation

(),

1210

for (const auto &ArgLoc : TemplateArgs->arguments())

1211

ConstraintArgs.addArgument(ArgLoc);

1214 if

(ImmediatelyDeclaredConstraint.

isInvalid

())

1224

ImmediatelyDeclaredConstraint.

get

());

1235

diag::err_unsupported_placeholder_constraint)

1254

for (unsigned I = 0, C = TL.getNumArgs(); I != C; ++I)

1255

ConstraintArgs.addArgument(TL.getArgLoc(I));

1258 if

(ImmediatelyDeclaredConstraint.

isInvalid

() ||

1259

!ImmediatelyDeclaredConstraint.

isUsable

())

1263

ImmediatelyDeclaredConstraint.

get

());

1293 Diag

(

Loc

, diag::err_template_nontype_parm_rvalue_ref) <<

T

;

1303 Diag

(

Loc

, diag::err_template_nontype_parm_bad_type) <<

T

;

1311 Diag

(

Loc

, diag::err_template_nontype_parm_not_structural) <<

T

;

1318 for

(

const FieldDecl

*FD : RD->fields()) {

1320 Diag

(FD->getLocation(), diag::note_not_structural_non_public) <<

T

<< 0;

1323 if

(FD->isMutable()) {

1324 Diag

(FD->getLocation(), diag::note_not_structural_mutable_field) <<

T

;

1327 if

(FD->getType()->isRValueReferenceType()) {

1328 Diag

(FD->getLocation(), diag::note_not_structural_rvalue_ref_field)

1335 for

(

const auto

&BaseSpec : RD->bases()) {

1336 if

(BaseSpec.getAccessSpecifier() !=

AS_public

) {

1337 Diag

(BaseSpec.getBaseTypeLoc(), diag::note_not_structural_non_public)

1348 for

(

const FieldDecl

*FD : RD->fields()) {

1351

SubLoc = FD->getLocation();

1359 for

(

const auto

&BaseSpec : RD->bases()) {

1362

SubLoc = BaseSpec.getBaseTypeLoc();

1370

assert(Kind != -1 &&

"couldn't find reason why type is not structural"

);

1371 Diag

(SubLoc, diag::note_not_structural_subobject)

1372

<<

T

<< Kind << SubType;

1385 Diag

(

Loc

, diag::err_variably_modified_nontype_template_param)

1409 return T

.getUnqualifiedType();

1427 return T

.getUnqualifiedType();

1438 Diag

(

Loc

, diag::err_template_nontype_parm_bad_structural_type) <<

T

;

1442 Diag

(

Loc

, diag::warn_cxx17_compat_template_nontype_parm_type) <<

T

;

1443 return T

.getUnqualifiedType();

1454 auto

CheckValidDeclSpecifiers = [

this

, &

D

] {

1468 Diag

(

Loc

, diag::err_invalid_decl_specifier_in_nontype_parm)

1505

CheckValidDeclSpecifiers();

1508 if

(isa<AutoType>(

T

))

1509 Diag

(

D

.getIdentifierLoc(),

1510

diag::warn_cxx14_compat_template_nontype_parm_auto_type)

1513

assert(S->isTemplateParamScope() &&

1514 "Non-type template parameter not in template parameter scope!"

);

1526 bool

IsParameterPack =

D

.hasEllipsis();

1529 D

.getIdentifierLoc(), Depth, Position, ParamName,

T

, IsParameterPack,

1534 if

(TL.isConstrained()) {

1535 if

(

D

.getEllipsisLoc().isInvalid() &&

1537

assert(TL.getConceptReference()->getTemplateArgsAsWritten());

1539

TL.getConceptReference()->getTemplateArgsAsWritten()->arguments())

1553

CSI->LocalPacks.push_back(Param);

1567 if

(

Default

&& IsParameterPack) {

1568 Diag

(EqualLoc, diag::err_template_param_pack_default_arg);

1591

assert(S->isTemplateParamScope() &&

1592 "Template template parameter not in template parameter scope!"

);

1595 bool

IsParameterPack = EllipsisLoc.

isValid

();

1598

NameLoc.

isInvalid

() ? TmpLoc : NameLoc, Depth, Position, IsParameterPack,

1604

LSI->LocalPacks.push_back(Param);

1615 if

(Params->

size

() == 0) {

1616 Diag

(Param->

getLocation

(), diag::err_template_template_parm_no_parms)

1624 if

(IsParameterPack && !

Default

.isInvalid()) {

1625 Diag

(EqualLoc, diag::err_template_param_pack_default_arg);

1640 Diag

(DefaultArg.

getLocation

(), diag::err_template_arg_not_valid_template)

1658class

ConstraintRefersToContainingTemplateChecker

1659

:

public TreeTransform

<ConstraintRefersToContainingTemplateChecker> {

1660 bool

Result =

false

;

1662 unsigned

TemplateDepth = 0;

1666 void

CheckIfContainingRecord(

const CXXRecordDecl

*CheckingRD) {

1672

DC && !DC->isFileContext(); DC = DC->getParent())

1673 if

(

const auto

*RD = dyn_cast<CXXRecordDecl>(DC))

1674 if

(CheckingRD == RD->getMostRecentDecl())

1679 if

(

D

->getDepth() < TemplateDepth)

1684

TransformType(

D

->getType());

1690

ConstraintRefersToContainingTemplateChecker(

Sema

&SemaRef,

1692 unsigned

TemplateDepth)

1693

: inherited(SemaRef),

Friend

(

Friend

), TemplateDepth(TemplateDepth) {}

1694 bool

getResult()

const

{

return

Result; }

1700 using

inherited::TransformTemplateTypeParmType;

1705 return

inherited::TransformTemplateTypeParmType(

1717 if

(

auto

*TD = dyn_cast<TypedefNameDecl>(

D

))

1718

TransformType(TD->getUnderlyingType());

1719 else if

(

auto

*NTTPD = dyn_cast<NonTypeTemplateParmDecl>(

D

))

1720

CheckNonTypeTemplateParmDecl(NTTPD);

1721 else if

(

auto

*VD = dyn_cast<ValueDecl>(

D

))

1722

TransformType(VD->getType());

1723 else if

(

auto

*TD = dyn_cast<TemplateDecl>(

D

))

1724

TransformTemplateParameterList(TD->getTemplateParameters());

1725 else if

(

auto

*RD = dyn_cast<CXXRecordDecl>(

D

))

1726

CheckIfContainingRecord(RD);

1727 else if

(isa<NamedDecl>(

D

)) {

1730

llvm_unreachable(

"Don't know how to handle this declaration type yet"

);

1738 const Expr

*Constraint) {

1739

assert(

Friend

->getFriendObjectKind() &&

"Only works on a friend"

);

1740

ConstraintRefersToContainingTemplateChecker Checker(*

this

,

Friend

,

1742

Checker.TransformExpr(

const_cast<Expr

*

>

(Constraint));

1743 return

Checker.getResult();

1753 Expr

*RequiresClause) {

1755 Diag

(ExportLoc, diag::warn_template_export_unsupported);

1761 Context

, TemplateLoc, LAngleLoc,

1762 llvm::ArrayRef

(Params.data(), Params.size()), RAngleLoc, RequiresClause);

1797 return

cast<TemplateDecl>(

D

)->getTemplateParameters();

1807

assert(TemplateParams && TemplateParams->

size

() > 0 &&

1808 "No template parameters"

);

1810 "Can only declare or define class templates"

);

1819 "can't build template of enumerated type"

);

1823 Diag

(KWLoc, diag::err_template_unnamed_class);

1838 if

(!SemanticContext) {

1843

? diag::warn_template_qualified_friend_ignored

1844

: diag::err_template_qualified_declarator_no_match)

1856 ContextRAII

SavedContext(*

this

, SemanticContext);

1903 if

(S->isTemplateParamScope())

1908

PrevDecl = (*

Previous

.begin())->getUnderlyingDecl();

1914

PrevDecl =

nullptr

;

1920

dyn_cast_or_null<ClassTemplateDecl>(PrevDecl);

1925 if

(!PrevClassTemplate && isa_and_nonnull<CXXRecordDecl>(PrevDecl) &&

1926

cast<CXXRecordDecl>(PrevDecl)->isInjectedClassName()) {

1929

= cast<CXXRecordDecl>(PrevDecl)->getDescribedClassTemplate();

1930 if

(!PrevClassTemplate && isa<ClassTemplateSpecializationDecl>(PrevDecl)) {

1932

= cast<ClassTemplateSpecializationDecl>(PrevDecl)

1933

->getSpecializedTemplate();

1943 if

(!SS.

isSet

()) {

1956

PrevDecl = PrevClassTemplate =

nullptr

;

1957

SemanticContext = OutermostContext;

1971

PrevDecl = (*

Previous

.begin())->getUnderlyingDecl();

1975

SemanticContext, S, SS.

isValid

()))

1976

PrevDecl = PrevClassTemplate =

nullptr

;

1978 if

(

auto

*Shadow = dyn_cast_or_null<UsingShadowDecl>(

1979

PrevDecl ?

Previous

.getRepresentativeDecl() :

nullptr

)) {

1981

!(PrevClassTemplate &&

1984 Diag

(KWLoc, diag::err_using_decl_conflict_reverse);

1985 Diag

(Shadow->getTargetDecl()->getLocation(),

1986

diag::note_using_decl_target);

1987 Diag

(Shadow->getIntroducer()->getLocation(), diag::note_using_decl) << 0;

1989

PrevDecl = PrevClassTemplate =

nullptr

;

1993 if

(PrevClassTemplate) {

2002

TemplateParams, PrevClassTemplate,

2015 Diag

(KWLoc, diag::err_use_with_wrong_tag)

2031 auto

*Tmpl = cast<CXXRecordDecl>(Hidden)->getDescribedClassTemplate();

2032

assert(Tmpl &&

"original definition of a class template is not a " 2033 "class template?"

);

2037 Diag

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

2038 Diag

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

2045

}

else if

(PrevDecl) {

2051 Diag

(NameLoc, diag::err_redefinition_different_kind) << Name;

2065

(SS.

isSet

() && SemanticContext && SemanticContext->

isRecord

() &&

2078

? diag::err_friend_decl_does_not_match

2079

: diag::err_member_decl_does_not_match)

2080

<< Name << SemanticContext <<

true

<< SS.

getRange

();

2090 bool

ShouldAddRedecl =

2095

PrevClassTemplate && ShouldAddRedecl ?

2099 if

(NumOuterTemplateParamLists > 0)

2102 llvm::ArrayRef

(OuterTemplateParamLists, NumOuterTemplateParamLists));

2116 if

(ShouldAddRedecl)

2121 if

(ModulePrivateLoc.

isValid

())

2127

assert(

T

->

isDependentType

() &&

"Class template type is not dependent?"

);

2132 if

(PrevClassTemplate &&

2150 if

(PrevClassTemplate)

2186 if

(PrevClassTemplate)

2227

diag::warn_cxx98_compat_template_parameter_default_in_function_template

2228

: diag::ext_template_parameter_default_in_function_template)

2237

S.

Diag

(ParamLoc, diag::err_template_parameter_default_template_member)

2246

S.

Diag

(ParamLoc, diag::err_template_parameter_default_friend_template)

2255

llvm_unreachable(

"Invalid TemplateParamListContext!"

);

2268 for

(

unsigned

I = 0, N = Params->

size

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

2273 if

(TC->hasExplicitTemplateArgs())

2274 for

(

auto

&ArgLoc : TC->getTemplateArgsAsWritten()->arguments())

2282 if

(!NTTP->isParameterPack() &&

2284

NTTP->getTypeSourceInfo(),

2292

= dyn_cast<TemplateTemplateParmDecl>(

P

))

2312 bool

SawDefaultArgument =

false

;

2318

OldParam = OldParams->

begin

();

2320 bool

RemoveDefaultArguments =

false

;

2322

NewParamEnd = NewParams->

end

();

2323

NewParam != NewParamEnd; ++NewParam) {

2326 bool

RedundantDefaultArg =

false

;

2329 bool

InconsistentDefaultArg =

false

;

2331

std::string PrevModuleName;

2337 bool

MissingDefaultArg =

false

;

2340 bool

SawParameterPack =

false

;

2343

= dyn_cast<TemplateTypeParmDecl>(*NewParam)) {

2345 if

(NewTypeParm->hasDefaultArgument() &&

2347

*

this

, TPC, NewTypeParm->getLocation(),

2348

NewTypeParm->getDefaultArgument().getSourceRange()))

2349

NewTypeParm->removeDefaultArgument();

2353

= OldParams? cast<TemplateTypeParmDecl>(*OldParam) :

nullptr

;

2354 if

(NewTypeParm->isParameterPack()) {

2355

assert(!NewTypeParm->hasDefaultArgument() &&

2356 "Parameter packs can't have a default argument!"

);

2357

SawParameterPack =

true

;

2359

NewTypeParm->hasDefaultArgument() &&

2362

NewDefaultLoc = NewTypeParm->getDefaultArgumentLoc();

2363

SawDefaultArgument =

true

;

2366

RedundantDefaultArg =

true

;

2367 else if

(!

getASTContext

().isSameDefaultTemplateArgument(OldTypeParm,

2369

InconsistentDefaultArg =

true

;

2373

PreviousDefaultArgLoc = NewDefaultLoc;

2377

NewTypeParm->setInheritedDefaultArgument(

Context

, OldTypeParm);

2379

}

else if

(NewTypeParm->hasDefaultArgument()) {

2380

SawDefaultArgument =

true

;

2381

PreviousDefaultArgLoc = NewTypeParm->getDefaultArgumentLoc();

2382

}

else if

(SawDefaultArgument)

2383

MissingDefaultArg =

true

;

2385

= dyn_cast<NonTypeTemplateParmDecl>(*NewParam)) {

2387 if

(!NewNonTypeParm->isParameterPack() &&

2389

NewNonTypeParm->getTypeSourceInfo(),

2396 if

(NewNonTypeParm->hasDefaultArgument() &&

2398

*

this

, TPC, NewNonTypeParm->getLocation(),

2399

NewNonTypeParm->getDefaultArgument().getSourceRange())) {

2400

NewNonTypeParm->removeDefaultArgument();

2405

= OldParams? cast<NonTypeTemplateParmDecl>(*OldParam) :

nullptr

;

2406 if

(NewNonTypeParm->isParameterPack()) {

2407

assert(!NewNonTypeParm->hasDefaultArgument() &&

2408 "Parameter packs can't have a default argument!"

);

2409 if

(!NewNonTypeParm->isPackExpansion())

2410

SawParameterPack =

true

;

2412

NewNonTypeParm->hasDefaultArgument() &&

2415

NewDefaultLoc = NewNonTypeParm->getDefaultArgumentLoc();

2416

SawDefaultArgument =

true

;

2418

RedundantDefaultArg =

true

;

2420

OldNonTypeParm, NewNonTypeParm)) {

2421

InconsistentDefaultArg =

true

;

2425

PreviousDefaultArgLoc = NewDefaultLoc;

2429

NewNonTypeParm->setInheritedDefaultArgument(

Context

, OldNonTypeParm);

2431

}

else if

(NewNonTypeParm->hasDefaultArgument()) {

2432

SawDefaultArgument =

true

;

2433

PreviousDefaultArgLoc = NewNonTypeParm->getDefaultArgumentLoc();

2434

}

else if

(SawDefaultArgument)

2435

MissingDefaultArg =

true

;

2438

= cast<TemplateTemplateParmDecl>(*NewParam);

2455

= OldParams? cast<TemplateTemplateParmDecl>(*OldParam) :

nullptr

;

2458 "Parameter packs can't have a default argument!"

);

2460

SawParameterPack =

true

;

2461

}

else if

(OldTemplateParm &&

2467

SawDefaultArgument =

true

;

2469

RedundantDefaultArg =

true

;

2471

OldTemplateParm, NewTemplateParm)) {

2472

InconsistentDefaultArg =

true

;

2476

PreviousDefaultArgLoc = NewDefaultLoc;

2481

PreviousDefaultArgLoc

2484

SawDefaultArgument =

true

;

2485

PreviousDefaultArgLoc

2487

}

else if

(SawDefaultArgument)

2488

MissingDefaultArg =

true

;

2494 if

(SawParameterPack && (NewParam + 1) != NewParamEnd &&

2497 Diag

((*NewParam)->getLocation(),

2498

diag::err_template_param_pack_must_be_last_template_parameter);

2515 if

(RedundantDefaultArg) {

2516 Diag

(NewDefaultLoc, diag::err_template_param_default_arg_redefinition);

2517 Diag

(OldDefaultLoc, diag::note_template_param_prev_default_arg);

2519

}

else if

(InconsistentDefaultArg) {

2522 Diag

(NewDefaultLoc,

2523

diag::err_template_param_default_arg_inconsistent_redefinition);

2524 Diag

(OldDefaultLoc,

2525

diag::note_template_param_prev_default_arg_in_other_module)

2528

}

else if

(MissingDefaultArg &&

2536 Diag

((*NewParam)->getLocation(),

2537

diag::err_template_param_default_arg_missing);

2538 Diag

(PreviousDefaultArgLoc, diag::note_template_param_prev_default_arg);

2540

RemoveDefaultArguments =

true

;

2551 if

(RemoveDefaultArguments) {

2553

NewParamEnd = NewParams->

end

();

2554

NewParam != NewParamEnd; ++NewParam) {

2556

TTP->removeDefaultArgument();

2558

= dyn_cast<NonTypeTemplateParmDecl>(*NewParam))

2559

NTTP->removeDefaultArgument();

2561

cast<TemplateTemplateParmDecl>(*NewParam)->removeDefaultArgument();

2579 bool

IgnoreNonTypeDependent;

2584

DependencyChecker(

unsigned

Depth,

bool

IgnoreNonTypeDependent)

2585

: Depth(Depth), IgnoreNonTypeDependent(IgnoreNonTypeDependent),

2589

: IgnoreNonTypeDependent(IgnoreNonTypeDependent), Match(

false

) {

2592

Depth = PD->getDepth();

2594

dyn_cast<NonTypeTemplateParmDecl>(ND)) {

2595

Depth = PD->getDepth();

2597

Depth = cast<TemplateTemplateParmDecl>(ND)->getDepth();

2602 if

(ParmDepth >= Depth) {

2610 bool

TraverseStmt(

Stmt

*S)

override

{

2615 if

(

auto

*

E

= dyn_cast_or_null<Expr>(S))

2621 bool

TraverseTypeLoc(

TypeLoc

TL)

override

{

2622 if

(IgnoreNonTypeDependent && !TL.

isNull

() &&

2634 return

IgnoreNonTypeDependent || !Matches(

T

->getDepth());

2640 if

(Matches(PD->getDepth()))

2647

dyn_cast<NonTypeTemplateParmDecl>(

E

->getDecl()))

2650 return

DynamicRecursiveASTVisitor::VisitDeclRefExpr(

E

);

2654 return

TraverseType(

T

->getReplacementType());

2657 bool

VisitSubstTemplateTypeParmPackType(

2659 return

TraverseTemplateArgument(

T

->getArgumentPack());

2663 return

TraverseType(

T

->getInjectedSpecializationType());

2672 if

(!Params->

size

())

2675

DependencyChecker Checker(Params,

false

);

2676

Checker.TraverseType(

T

);

2677 return

Checker.Match;

2687 if

(

const Type

*CurType = NNS->getAsType()) {

2703 bool

&IsMemberSpecialization,

bool

&

Invalid

,

bool

SuppressDiagnostic) {

2704

IsMemberSpecialization =

false

;

2725 while

(!

T

.isNull()) {

2726

NestedTypes.push_back(

T

);

2732

= dyn_cast<ClassTemplateSpecializationDecl>(

Record

)) {

2733 if

(!isa<ClassTemplatePartialSpecializationDecl>(Spec) &&

2735

ExplicitSpecLoc = Spec->getLocation();

2738

}

else if

(

Record

->getTemplateSpecializationKind()

2740

ExplicitSpecLoc =

Record

->getLocation();

2753 if

(

TemplateDecl

*Template = TST->getTemplateName().getAsTemplateDecl()) {

2754 if

(

TypeDecl

*

Parent

= dyn_cast<TypeDecl>(Template->getDeclContext()))

2799

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

2807 bool

SawNonEmptyTemplateParameterList =

false

;

2809 auto

CheckExplicitSpecialization = [&](

SourceRange Range

,

bool

Recovery) {

2810 if

(SawNonEmptyTemplateParameterList) {

2811 if

(!SuppressDiagnostic)

2812 Diag

(DeclLoc, diag::err_specialize_member_of_template)

2813

<< !Recovery <<

Range

;

2815

IsMemberSpecialization =

false

;

2824 if

(CheckExplicitSpecialization(

Range

,

true

))

2829 if

(!ParamLists.empty())

2830

ExpectedTemplateLoc = ParamLists[0]->getTemplateLoc();

2832

ExpectedTemplateLoc = DeclStartLoc;

2834 if

(!SuppressDiagnostic)

2835 Diag

(DeclLoc, diag::err_template_spec_needs_header)

2842 for

(

unsigned

TypeIdx = 0, NumTypes = NestedTypes.size(); TypeIdx != NumTypes;

2844 T

= NestedTypes[TypeIdx];

2847 bool

NeedEmptyTemplateHeader =

false

;

2850 bool

NeedNonemptyTemplateHeader =

false

;

2863

= dyn_cast<ClassTemplatePartialSpecializationDecl>(

Record

)) {

2864

ExpectedTemplateParams = Partial->getTemplateParameters();

2865

NeedNonemptyTemplateHeader =

true

;

2866

}

else if

(

Record

->isDependentType()) {

2867 if

(

Record

->getDescribedClassTemplate()) {

2868

ExpectedTemplateParams =

Record

->getDescribedClassTemplate()

2869

->getTemplateParameters();

2870

NeedNonemptyTemplateHeader =

true

;

2873

= dyn_cast<ClassTemplateSpecializationDecl>(

Record

)) {

2879

NeedEmptyTemplateHeader =

true

;

2882

}

else if

(

Record

->getTemplateSpecializationKind()) {

2883 if

(

Record

->getTemplateSpecializationKind()

2885

TypeIdx == NumTypes - 1)

2886

IsMemberSpecialization =

true

;

2892 if

(

TemplateDecl

*Template = TST->getTemplateName().getAsTemplateDecl()) {

2893

ExpectedTemplateParams = Template->getTemplateParameters();

2894

NeedNonemptyTemplateHeader =

true

;

2899

NeedNonemptyTemplateHeader =

false

;

2909 if

(

ParamIdx

< ParamLists.size()) {

2910 if

(ParamLists[

ParamIdx

]->size() == 0) {

2911 if

(CheckExplicitSpecialization(ParamLists[

ParamIdx

]->getSourceRange(),

2915

SawNonEmptyTemplateParameterList =

true

;

2918 if

(NeedEmptyTemplateHeader) {

2921 if

(TypeIdx == NumTypes - 1)

2922

IsMemberSpecialization =

true

;

2924 if

(

ParamIdx

< ParamLists.size()) {

2925 if

(ParamLists[

ParamIdx

]->size() > 0) {

2927 if

(!SuppressDiagnostic)

2929

diag::err_template_param_list_matches_nontemplate)

2932

ParamLists[

ParamIdx

]->getRAngleLoc())

2944 if

(DiagnoseMissingExplicitSpecialization(

2951 if

(NeedNonemptyTemplateHeader) {

2957 if

(

ParamIdx

< ParamLists.size() &&

2959

ExpectedTemplateParams =

nullptr

;

2964 if

(

ParamIdx

< ParamLists.size()) {

2966 if

(ExpectedTemplateParams &&

2968

ExpectedTemplateParams,

2981 if

(!SuppressDiagnostic)

2982 Diag

(DeclLoc, diag::err_template_spec_needs_template_parameters)

2993 if

(

ParamIdx

>= ParamLists.size()) {

2994 if

(TemplateId && !IsFriend) {

3010 if

(

ParamIdx

< ParamLists.size() - 1) {

3011 bool

HasAnyExplicitSpecHeader =

false

;

3012 bool

AllExplicitSpecHeaders =

true

;

3013 for

(

unsigned

I =

ParamIdx

,

E

= ParamLists.size() - 1; I !=

E

; ++I) {

3014 if

(ParamLists[I]->size() == 0)

3015

HasAnyExplicitSpecHeader =

true

;

3017

AllExplicitSpecHeaders =

false

;

3020 if

(!SuppressDiagnostic)

3022

AllExplicitSpecHeaders ? diag::ext_template_spec_extra_headers

3023

: diag::err_template_spec_extra_headers)

3025

ParamLists[ParamLists.size() - 2]->getRAngleLoc());

3030 if

(ExplicitSpecLoc.

isValid

() && HasAnyExplicitSpecHeader &&

3031

!SuppressDiagnostic)

3032 Diag

(ExplicitSpecLoc,

3033

diag::note_explicit_template_spec_does_not_need_header)

3034

<< NestedTypes.back();

3039 if

(!AllExplicitSpecHeaders)

3050 if

(ParamLists.back()->size() == 0 &&

3051

CheckExplicitSpecialization(ParamLists[

ParamIdx

]->getSourceRange(),

3057 return

ParamLists.back();

3061 if

(

TemplateDecl

*Template = Name.getAsTemplateDecl()) {

3062 Diag

(Template->getLocation(), diag::note_template_declared_here)

3063

<< (isa<FunctionTemplateDecl>(Template)

3065

: isa<ClassTemplateDecl>(Template)

3067

: isa<VarTemplateDecl>(Template)

3069

: isa<TypeAliasTemplateDecl>(Template) ? 3 : 4)

3070

<< Template->getDeclName();

3078 Diag

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

3079

<< 0 << (*I)->getDeclName();

3112 return

BaseTemplateInst;

3117 switch

(Ts.size()) {

3127 return

lookUpCommonType(Ts[0], Ts[0]);

3141 return

lookUpCommonType(D1, D2);

3146 auto

CheckConditionalOperands = [&](

bool

ConstRefQual) ->

QualType

{

3185 if

(

auto

Res = CheckConditionalOperands(

false

); !Res.isNull())

3198 return

CheckConditionalOperands(

true

);

3209 for

(

auto T

: llvm::drop_begin(Ts)) {

3231 QualType

OrigType = Converted[1].getAsType();

3235

SemaRef.

Diag

(TemplateArgs[1].getLocation(),

3236

diag::err_integer_sequence_integral_element_type);

3251

OrigType, TemplateArgs[1].getLocation())));

3253 if

(llvm::APSInt NumArgs = NumArgsArg.

getAsIntegral

(); NumArgs >= 0) {

3255 for

(llvm::APSInt I(NumArgs.getBitWidth(), NumArgs.isUnsigned());

3259

TA, OrigType, TemplateArgs[2].getLocation()));

3264

SemaRef.

Diag

(TemplateArgs[2].getLocation(),

3265

diag::err_integer_sequence_negative_length);

3272

TemplateLoc, SyntheticTemplateArgs);

3279

assert(Converted.size() == 2 &&

3280 "__type_pack_element should be given an index and a parameter pack"

);

3288

assert(Index >= 0 &&

"the index used with __type_pack_element should be of " 3289 "type std::size_t, and hence be non-negative"

);

3291 if

(Index >= Ts.pack_size()) {

3292

SemaRef.

Diag

(TemplateArgs[0].getLocation(),

3293

diag::err_type_pack_element_out_of_bounds);

3298

int64_t N = Index.getExtValue();

3299 return

Ts.getPackAsArray()[N].getAsType();

3303

assert(Converted.size() == 4);

3304 if

(llvm::any_of(Converted, [](

auto

&

C

) {

return C

.isDependent(); }))

3308 TemplateName

BaseTemplate = Converted[0].getAsTemplate();

3309 TemplateName

HasTypeMember = Converted[1].getAsTemplate();

3310 QualType

HasNoTypeMember = Converted[2].getAsType();

3317

CT, TemplateArgs[1].getLocation())));

3321 return

HasNoTypeMember;

3324

llvm_unreachable(

"unexpected BuiltinTemplateDecl!"

);

3343 if

(BinOp->getOpcode() == BO_LAnd) {

3350

Terms.push_back(Clause);

3359 if

(!BinOp)

return

Cond;

3361 if

(BinOp->getOpcode() != BO_LOr)

return

Cond;

3364 Expr

*LHS = BinOp->getLHS();

3366 if

(!InnerBinOp)

return

Cond;

3368 if

(InnerBinOp->getOpcode() != BO_EQ ||

3369

!isa<IntegerLiteral>(InnerBinOp->getRHS()))

3379 if

(MacroName ==

"CONCEPT_REQUIRES"

|| MacroName ==

"CONCEPT_REQUIRES_"

)

3380 return

BinOp->getRHS();

3390class

FailedBooleanConditionPrinterHelper :

public PrinterHelper

{

3392 explicit

FailedBooleanConditionPrinterHelper(

const PrintingPolicy

&

P

)

3395 bool

handledStmt(

Stmt

*

E

, raw_ostream &OS)

override

{

3396 const auto

*DR = dyn_cast<DeclRefExpr>(

E

);

3397 if

(DR && DR->getQualifier()) {

3400

DR->getQualifier()->print(OS, Policy,

true

);

3404 if

(

const auto

*IV = dyn_cast<VarTemplateSpecializationDecl>(VD)) {

3407

OS, IV->getTemplateArgs().asArray(), Policy,

3408

IV->getSpecializedTemplate()->getTemplateParameters());

3421

std::pair<Expr *, std::string>

3430 Expr

*FailedCond =

nullptr

;

3431 for

(

Expr

*Term : Terms) {

3435 if

(isa<CXXBoolLiteralExpr>(TermAsWritten) ||

3436

isa<IntegerLiteral>(TermAsWritten))

3445 if

(Term->EvaluateAsBooleanCondition(Succeeded,

Context

) &&

3447

FailedCond = TermAsWritten;

3454

std::string Description;

3456

llvm::raw_string_ostream Out(Description);

3459

FailedBooleanConditionPrinterHelper Helper(Policy);

3460

FailedCond->

printPretty

(Out, &Helper, Policy, 0,

"\n"

,

nullptr

);

3462 return

{ FailedCond, Description };

3469

Name.getUnderlying().getAsDependentTemplateName();

3479 if

(Name.getAsAssumedTemplateName() &&

3483 auto

[Template, DefaultArgs] = Name.getTemplateDeclAndDefaultArgs();

3485 if

(!Template || isa<FunctionTemplateDecl>(Template) ||

3486

isa<VarTemplateDecl>(Template) || isa<ConceptDecl>(Template)) {

3489 if

(Name.getAsSubstTemplateTemplateParmPack())

3493 Diag

(TemplateLoc, diag::err_template_id_not_a_type)

3503

DefaultArgs,

false

,

3511

dyn_cast<TypeAliasTemplateDecl>(Template)) {

3527

!

getLangOpts

().RetainSubstTemplateTypeParmTypeAstNodes);

3533

*

this

,

TemplateLoc,

3543

std::optional<ContextRAII> SavedContext;

3545

SavedContext.emplace(*

this

,

AliasTemplate

->getDeclContext());

3550 if

(CanonType.

isNull

()) {

3556 if

(*DeductionInfo &&

3557

(*DeductionInfo)->hasSFINAEDiagnostic() &&

3558

(*DeductionInfo)->peekSFINAEDiagnostic().second.getDiagID() ==

3559

diag::err_typename_nested_not_found_enable_if &&

3560

TemplateArgs[0].getArgument().getKind()

3563

std::string FailedDescription;

3564

std::tie(FailedCond, FailedDescription) =

3570

(*DeductionInfo)->takeSFINAEDiagnostic(OldDiag);

3574

(*DeductionInfo)->addSFINAEDiagnostic(

3576 PDiag

(diag::err_typename_nested_not_found_requirement)

3577

<< FailedDescription

3585

}

else if

(

auto

*BTD = dyn_cast<BuiltinTemplateDecl>(Template)) {

3587

TemplateLoc, TemplateArgs);

3588

}

else if

(Name.isDependent() ||

3607 if

(isa<ClassTemplateDecl>(Template)) {

3610 if

(Ctx->isFileContext())

break

;

3614 if

(!

Record

)

continue

;

3618 if

(!isa<ClassTemplatePartialSpecializationDecl>(

Record

) &&

3619

!

Record

->getDescribedClassTemplate())

3625 QualType

Injected = cast<InjectedClassNameType>(ICNT)

3626

->getInjectedSpecializationType();

3639

dyn_cast<ClassTemplateDecl>(Template)) {

3642 void

*InsertPos =

nullptr

;

3676

assert(isa<RecordType>(CanonType) &&

3677 "type of non-dependent specialization is not a RecordType"

);

3679

llvm_unreachable(

"Unhandled template kind"

);

3696 auto

*ATN = Name.getAsAssumedTemplateName();

3697

assert(ATN &&

"not an assumed template name"

);

3698

II = ATN->getDeclName().getAsIdentifierInfo();

3714

assert(ATN &&

"not an assumed template name"

);

3722

std::unique_ptr<CorrectionCandidateCallback> clone()

override

{

3723 return

std::make_unique<CandidateCallback>(*

this

);

3749 bool

IsCtorOrDtorName,

bool

IsClassName,

3754 if

(!IsCtorOrDtorName && !IsClassName && SS.

isSet

()) {

3780

TemplateD, TemplateII, TemplateIILoc, LAngleLoc,

3781

TemplateArgsIn, RAngleLoc);

3788 auto

*LookupRD = dyn_cast_or_null<CXXRecordDecl>(LookupCtx);

3789 if

(LookupRD && LookupRD->getIdentifier() == TemplateII) {

3790 Diag

(TemplateIILoc,

3792

? diag::err_out_of_line_qualified_id_type_names_constructor

3793

: diag::ext_out_of_line_qualified_id_type_names_constructor)

3809

assert(SS.

getScopeRep

() == DTN->getQualifier());

3823 for

(

unsigned

I = 0, N = SpecTL.

getNumArgs

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

3840 for

(

unsigned

i = 0, e = SpecTL.

getNumArgs

(); i != e; ++i)

3879

assert(SS.

getScopeRep

() == DTN->getQualifier());

3881

Keyword, DTN->getQualifier(), DTN->getIdentifier(),

3894 for

(

unsigned

I = 0, N = SpecTL.

getNumArgs

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

3905 Diag

(TemplateLoc, diag::err_tag_reference_non_tag)

3907 Diag

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

3919

assert(

Id

&&

"templated class must have an identifier"

);

3923 Diag

(TagLoc, diag::err_use_with_wrong_tag)

3938 for

(

unsigned

i = 0, e = SpecTL.

getNumArgs

(); i != e; ++i)

3973 return

TPT && !

Type

.hasQualifiers() &&

3979 if

(!DRE || !DRE->

getDecl

())

3982

dyn_cast<NonTypeTemplateParmDecl>(DRE->

getDecl

());

3988

dyn_cast_or_null<TemplateTemplateParmDecl>(

3992

llvm_unreachable(

"unexpected kind of template argument"

);

3997 if

(Params->

size

() != Args.size())

4000 unsigned

Depth = Params->

getDepth

();

4002 for

(

unsigned

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

4021template

<

typename

PartialSpecDecl>

4023 if

(Partial->getDeclContext()->isDependentContext())

4032 auto

*Template = Partial->getSpecializedTemplate();

4033

S.

Diag

(Partial->getLocation(),

4034

diag::ext_partial_spec_not_more_specialized_than_primary)

4035

<< isa<VarTemplateDecl>(Template);

4044

diag::note_partial_spec_not_more_specialized_than_primary)

4050

Template->getAssociatedConstraints(TemplateAC);

4051

Partial->getAssociatedConstraints(PartialAC);

4058 const

llvm::SmallBitVector &DeducibleParams) {

4059 for

(

unsigned

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

4060 if

(!DeducibleParams[I]) {

4073template

<

typename

PartialSpecDecl>

4075

PartialSpecDecl *Partial) {

4088 auto

*TemplateParams = Partial->getTemplateParameters();

4089

llvm::SmallBitVector DeducibleParams(TemplateParams->size());

4091

TemplateParams->getDepth(), DeducibleParams);

4093 if

(!DeducibleParams.all()) {

4094 unsigned

NumNonDeducible = DeducibleParams.size() - DeducibleParams.count();

4095

S.

Diag

(Partial->getLocation(), diag::ext_partial_specs_not_deducible)

4096

<< isa<VarTemplatePartialSpecializationDecl>(Partial)

4097

<< (NumNonDeducible > 1)

4099

Partial->getTemplateArgsAsWritten()->RAngleLoc);

4120

llvm::SmallBitVector DeducibleParams(TemplateParams->size());

4122 for

(

unsigned

I = 0; I != TemplateParams->size(); ++I) {

4124 auto

*Param = TemplateParams->getParam(I);

4126

DeducibleParams[I] =

true

;

4129 if

(!DeducibleParams.all()) {

4130 unsigned

NumNonDeducible = DeducibleParams.size() - DeducibleParams.count();

4131 Diag

(TD->

getLocation

(), diag::err_deduction_guide_template_not_deducible)

4132

<< (NumNonDeducible > 1);

4143 "Variable template specialization is declared with a template id."

);

4156

dyn_cast_or_null<VarTemplateDecl>(Name.getAsTemplateDecl());

4159 if

(

auto

*OTS = Name.getAsOverloadedTemplate())

4160

FnTemplate = *OTS->begin();

4162

FnTemplate = dyn_cast_or_null<FunctionTemplateDecl>(Name.getAsTemplateDecl());

4164 return Diag

(

D

.getIdentifierLoc(), diag::err_var_spec_no_template_but_method)

4166 return Diag

(

D

.getIdentifierLoc(), diag::err_var_spec_no_template)

4170 if

(

const auto

*DSA =

VarTemplate

->getAttr<NoSpecializationsAttr>()) {

4171 auto

Message = DSA->getMessage();

4172 Diag

(TemplateNameLoc, diag::warn_invalid_specialization)

4174 Diag

(DSA->getLoc(), diag::note_marked_here) << DSA;

4178 for

(

unsigned

I = 0, N = TemplateArgs.

size

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

4198

TemplateArgs.

size

(),

4204 if

(!Name.isDependent() &&

4207 Diag

(TemplateNameLoc, diag::err_partial_spec_fully_specialized)

4220 Diag

(TemplateNameLoc, diag::err_partial_spec_args_match_primary_template)

4230 void

*InsertPos =

nullptr

;

4234

PrevDecl =

VarTemplate

->findPartialSpecialization(

4256

PrevDecl =

nullptr

;

4260

cast_or_null<VarTemplatePartialSpecializationDecl>(PrevDecl);

4269 VarTemplate

->AddPartialSpecialization(Partial, InsertPos);

4308 Diag

(TemplateNameLoc, diag::err_specialization_after_instantiation)

4312

diag::note_instantiation_required_here)

4342struct

PartialSpecMatchResult {

4352

assert(Template &&

"A variable template id without template?"

);

4357

Template, TemplateNameLoc,

4371 void

*InsertPos =

nullptr

;

4385 bool

AmbiguousPartialSpec =

false

;

4411

!Partial->getMostRecentDecl()->isMemberSpecialization())

4426

Matched.push_back(PartialSpecMatchResult());

4427

Matched.back().Partial = Partial;

4432 if

(Matched.size() >= 1) {

4434 if

(Matched.size() == 1) {

4447

PEnd = Matched.end();

4450

PointOfInstantiation) ==

4458

PEnd = Matched.end();

4461 P

->Partial, Best->Partial,

4462

PointOfInstantiation) != Best->Partial) {

4463

AmbiguousPartialSpec =

true

;

4470

InstantiationPattern = Best->Partial;

4471

PartialSpecArgs = Best->Args;

4483

Template, InstantiationPattern, PartialSpecArgs, TemplateArgs,

4488 if

(AmbiguousPartialSpec) {

4491 Diag

(PointOfInstantiation, diag::err_partial_spec_ordering_ambiguous)

4496 Diag

(

P

.Partial->getLocation(), diag::note_partial_spec_match)

4503

dyn_cast<VarTemplatePartialSpecializationDecl>(InstantiationPattern))

4504 Decl

->setInstantiationOf(

D

, PartialSpecArgs);

4508

assert(

Decl

&&

"No variable template specialization?"

);

4519 if

(

Decl

.isInvalid())

4536 Diag

(

Loc

, diag::err_template_missing_args)

4544 bool

TemplateKeyword,

4559

assert(NamedConcept &&

"A concept template id without a template?"

);

4566

NamedConcept, ConceptNameInfo.

getLoc

(),

4579 bool

AreArgsDependent =

4589 if

(!AreArgsDependent &&

4599

TemplateKWLoc, ConceptNameInfo, FoundDecl, NamedConcept,

4602 Context

, CL, CSD, AreArgsDependent ?

nullptr

: &Satisfaction);

4621

assert(!R.

isAmbiguous

() &&

"ambiguous lookup when building templateid"

);

4625 if

(!TemplateArgs && !isa<FunctionTemplateDecl>(TD)) {

4631 bool

KnownDependent =

false

;

4640

KnownDependent =

true

;

4655

R.

begin

(), R.

end

(), KnownDependent,

4672

assert(TemplateArgs || TemplateKWLoc.

isValid

());

4676 false

, TemplateKWLoc))

4687 Diag

(NameInfo.

getLoc

(), diag::err_no_member)

4705 bool

EnteringContext,

4707 bool

AllowInjectedClassName) {

4708 if

(TemplateKWLoc.

isValid

() && S && !S->getTemplateParamParent())

4709 Diag

(TemplateKWLoc,

4711

diag::warn_cxx98_compat_template_outside_of_template :

4712

diag::ext_template_outside_of_template)

4722 else if

(ObjectType)

4741 bool

MemberOfUnknownSpecialization;

4743

ObjectType, EnteringContext,

Result

,

4744

MemberOfUnknownSpecialization);

4747 auto

*LookupRD = dyn_cast_or_null<CXXRecordDecl>(LookupCtx);

4748 if

(!AllowInjectedClassName && SS.

isNotEmpty

() && LookupRD &&

4750

Name.Identifier && LookupRD->getIdentifier() == Name.Identifier) {

4760 Diag

(Name.getBeginLoc(),

4761

diag::ext_out_of_line_qualified_id_type_names_constructor)

4769 if

(!MemberOfUnknownSpecialization) {

4783 nullptr

,

false

) &&

4786 Diag

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

4789 Diag

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

4797 switch

(Name.getKind()) {

4805

Qualifier, Name.OperatorFunctionId.Operator));

4819 Diag

(Name.getBeginLoc(),

4820

diag::err_template_kw_refers_to_dependent_non_template)

4822

<< TemplateKWLoc.

isValid

() << TemplateKWLoc;

4859

dyn_cast<DependentScopeDeclRefExpr>(Arg.

getAsExpr

())) {

4860

SS.

Adopt

(ArgExpr->getQualifierLoc());

4861

NameInfo = ArgExpr->getNameInfo();

4863

dyn_cast<CXXDependentScopeMemberExpr>(Arg.

getAsExpr

())) {

4864 if

(ArgExpr->isImplicitAccess()) {

4865

SS.

Adopt

(ArgExpr->getQualifierLoc());

4866

NameInfo = ArgExpr->getMemberNameInfo();

4875 Result

.wasNotFoundInCurrentInstantiation()) {

4876

assert(SS.

getScopeRep

() &&

"dependent scope expr must has a scope!"

);

4880

? diag::ext_ms_template_type_arg_missing_typename

4881

: diag::err_template_arg_must_be_type_suggest)

4913

SugaredConverted.push_back(Arg);

4914

CanonicalConverted.push_back(Arg);

4920 Diag

(SR.

getBegin

(), diag::err_template_arg_must_be_type) << SR;

4942

CanonicalConverted.push_back(

4991 for

(

unsigned

i = 0, e = Param->

getDepth

(); i != e; ++i)

4994 bool

ForLambdaCallOperator =

false

;

4995 if

(

const auto

*Rec = dyn_cast<CXXRecordDecl>(Template->

getDeclContext

()))

4996

ForLambdaCallOperator = Rec->isLambda();

4998

!ForLambdaCallOperator);

5046 for

(

unsigned

i = 0, e = Param->

getDepth

(); i != e; ++i)

5053

TemplateArgLists, Output);

5089

SugaredConverted,

SourceRange

(TemplateLoc, RAngleLoc));

5096 for

(

unsigned

i = 0, e = Param->

getDepth

(); i != e; ++i)

5121

HasDefaultArg =

false

;

5127

HasDefaultArg =

true

;

5130

TypeParm, SugaredConverted,

5131

CanonicalConverted, Output))

5137

= dyn_cast<NonTypeTemplateParmDecl>(Param)) {

5141

HasDefaultArg =

true

;

5144

NonTypeParm, SugaredConverted,

5145

CanonicalConverted, Output))

5151

= cast<TemplateTemplateParmDecl>(Param);

5155

HasDefaultArg =

true

;

5158

*

this

, Template, TemplateLoc, RAngleLoc, TempTempParm, SugaredConverted,

5159

CanonicalConverted, QualifierLoc);

5180

QualLoc = ETLoc.getQualifierLoc();

5181

TLoc = ETLoc.getNamedTypeLoc();

5187

QualLoc, InjLoc.getNameLoc());

5195

dyn_cast<ClassTemplateSpecializationDecl>(RecLoc.getDecl()))

5198

QualLoc, RecLoc.getNameLoc());

5207 unsigned

ArgumentPackIndex,

5221 QualType

NTTPType = NTTP->getType();

5222 if

(NTTP->isParameterPack() && NTTP->isExpandedParameterPack())

5223

NTTPType = NTTP->getExpansionType(ArgumentPackIndex);

5226

!isa<TemplateTemplateParmDecl>(Template) &&

5241

NTTPType =

SubstType

(PET->getPattern(), MLTAL, NTTP->getLocation(),

5242

NTTP->getDeclName());

5244

NTTPType =

SubstType

(NTTPType, MLTAL, NTTP->getLocation(),

5245

NTTP->getDeclName());

5250 if

(!NTTPType.

isNull

())

5252

NTTP->getLocation());

5257 auto

checkExpr = [&](

Expr

*

E

) ->

Expr

* {

5273

llvm_unreachable(

"Should never see a NULL template argument here"

);

5277 Expr

*R = checkExpr(

E

);

5303 if

(!checkExpr(R.

get

()))

5336 if

(

E

.isInvalid())

5342

CanonicalResult,

false

,

5344 if

(

E

.isInvalid())

5375 Diag

(SR.

getBegin

(), diag::err_template_arg_nontype_ambig) << SR <<

T

;

5377 Diag

(SR.

getBegin

(), diag::err_template_arg_must_be_expr) << SR;

5383

llvm_unreachable(

"Caller must expand template argument packs"

);

5428

ArgLoc = ConvertedArg;

5433

llvm_unreachable(

"Should never see a NULL template argument here"

);

5451 Diag

(ArgLoc.

getLocation

(), diag::err_template_arg_must_be_template)

5459

llvm_unreachable(

"non-type argument with template template parameter"

);

5462

llvm_unreachable(

"Caller must expand template argument packs"

);

5469template

<

typename

TemplateParmDecl>

5472 const

TemplateParmDecl *

D

,

5477

->getTemplateParameters()

5478

->getParam(

D

->getIndex()));

5485 D

->getDefaultArgumentLoc(), Modules,

5496

S.

Diag

(

Loc

, diag::err_template_arg_list_different_arity)

5529 bool

isTemplateTemplateParameter = isa<TemplateTemplateParmDecl>(Template);

5532 unsigned

ArgIdx = 0, NumArgs = NewArgs.

size

();

5535

ParamEnd = Params->

end

(),

5539 if

(

size_t ParamIdx

= Param - ParamBegin;

5542

assert(ArgIdx == NumArgs &&

"bad default argument deduction"

);

5544

assert(Param + DefaultArgs.

Args

.size() <= ParamEnd);

5559 if

(*Expansions == SugaredArgumentPack.size()) {

5564

SugaredArgumentPack.clear();

5568

CanonicalArgumentPack.clear();

5573

}

else if

(ArgIdx == NumArgs && !PartialTemplateArgs) {

5575 Diag

(TemplateLoc, diag::err_template_arg_list_different_arity)

5584 if

(ArgIdx < NumArgs) {

5586 bool

NonPackParameter =

5596 if

(!(*Param)->isTemplateParameterPack() ||

5603

RAngleLoc, SugaredArgumentPack.size(), CTAI,

5618

RAngleLoc, SugaredArgumentPack.size(), CTAI,

5625 if

(ArgIsExpansion && NonPackParameter) {

5629 if

(isa<TypeAliasTemplateDecl, ConceptDecl>(Template)) {

5631

diag::err_template_expansion_into_fixed_list)

5632

<< (isa<ConceptDecl>(Template) ? 1 : 0)

5643 if

(ArgIsExpansion && (CTAI.

MatchingTTP

|| NonPackParameter)) {

5647 if

(!SugaredArgumentPack.empty()) {

5651

SugaredArgumentPack.begin(),

5652

SugaredArgumentPack.end());

5653

SugaredArgumentPack.clear();

5656

CanonicalArgumentPack.begin(),

5657

CanonicalArgumentPack.end());

5658

CanonicalArgumentPack.clear();

5661 while

(ArgIdx < NumArgs) {

5672 if

((*Param)->isTemplateParameterPack()) {

5687 if

(PartialTemplateArgs) {

5688 if

((*Param)->isTemplateParameterPack() && !SugaredArgumentPack.empty()) {

5699 if

((*Param)->isTemplateParameterPack()) {

5701 "Should have dealt with this already"

);

5706 if

(Param + 1 != ParamEnd) {

5709 "Concept templates must have parameter packs at the end."

);

5715

SugaredArgumentPack.clear();

5719

CanonicalArgumentPack.clear();

5738 if

(!HasDefaultArg) {

5743

dyn_cast<NonTypeTemplateParmDecl>(*Param))

5747

cast<TemplateTemplateParmDecl>(*Param),

5777 if

(isTemplateTemplateParameter)

5792 while

(ArgIdx < NumArgs &&

5793

NewArgs[ArgIdx].

getArgument

().isPackExpansion()) {

5803 if

(ArgIdx < NumArgs) {

5804 Diag

(TemplateLoc, diag::err_template_arg_list_different_arity)

5815 if

(UpdateArgsWithConversions)

5816

TemplateArgs = std::move(NewArgs);

5818 if

(!PartialTemplateArgs) {

5825 if

(

auto

*TD = dyn_cast<TemplateDecl>(NewContext))

5827 auto

*RD = dyn_cast<CXXRecordDecl>(NewContext);

5830 if

(

const auto

*Method =

5832

ThisQuals = Method->getMethodQualifiers();

5855 class

UnnamedLocalNoLinkageFinder

5856

:

public TypeVisitor

<UnnamedLocalNoLinkageFinder, bool>

5864

UnnamedLocalNoLinkageFinder(

Sema

&S,

SourceRange

SR) : S(S), SR(SR) { }

5867 return T

.isNull() ?

false

: inherited::Visit(

T

.getTypePtr());

5870#define TYPE(Class, Parent) \ 5871 bool Visit##Class##Type(const Class##Type *); 5872#define ABSTRACT_TYPE(Class, Parent) \ 5873 bool Visit##Class##Type(const Class##Type *) { return false; } 5874#define NON_CANONICAL_TYPE(Class, Parent) \ 5875 bool Visit##Class##Type(const Class##Type *) { return false; } 5876#include "clang/AST/TypeNodes.inc" 5878 bool

VisitTagDecl(

const TagDecl

*Tag);

5883bool

UnnamedLocalNoLinkageFinder::VisitBuiltinType(

const BuiltinType

*) {

5887bool

UnnamedLocalNoLinkageFinder::VisitComplexType(

const ComplexType

*

T

) {

5888 return

Visit(

T

->getElementType());

5891bool

UnnamedLocalNoLinkageFinder::VisitPointerType(

const PointerType

*

T

) {

5895bool

UnnamedLocalNoLinkageFinder::VisitBlockPointerType(

5900bool

UnnamedLocalNoLinkageFinder::VisitLValueReferenceType(

5905bool

UnnamedLocalNoLinkageFinder::VisitRValueReferenceType(

5910bool

UnnamedLocalNoLinkageFinder::VisitMemberPointerType(

5915bool

UnnamedLocalNoLinkageFinder::VisitConstantArrayType(

5917 return

Visit(

T

->getElementType());

5920bool

UnnamedLocalNoLinkageFinder::VisitIncompleteArrayType(

5922 return

Visit(

T

->getElementType());

5925bool

UnnamedLocalNoLinkageFinder::VisitVariableArrayType(

5927 return

Visit(

T

->getElementType());

5930bool

UnnamedLocalNoLinkageFinder::VisitDependentSizedArrayType(

5932 return

Visit(

T

->getElementType());

5935bool

UnnamedLocalNoLinkageFinder::VisitDependentSizedExtVectorType(

5937 return

Visit(

T

->getElementType());

5940bool

UnnamedLocalNoLinkageFinder::VisitDependentSizedMatrixType(

5942 return

Visit(

T

->getElementType());

5945bool

UnnamedLocalNoLinkageFinder::VisitDependentAddressSpaceType(

5950bool

UnnamedLocalNoLinkageFinder::VisitVectorType(

const VectorType

*

T

) {

5951 return

Visit(

T

->getElementType());

5954bool

UnnamedLocalNoLinkageFinder::VisitDependentVectorType(

5956 return

Visit(

T

->getElementType());

5959bool

UnnamedLocalNoLinkageFinder::VisitExtVectorType(

const ExtVectorType

*

T

) {

5960 return

Visit(

T

->getElementType());

5963bool

UnnamedLocalNoLinkageFinder::VisitConstantMatrixType(

5965 return

Visit(

T

->getElementType());

5968bool

UnnamedLocalNoLinkageFinder::VisitFunctionProtoType(

5978bool

UnnamedLocalNoLinkageFinder::VisitFunctionNoProtoType(

5983bool

UnnamedLocalNoLinkageFinder::VisitUnresolvedUsingType(

5988bool

UnnamedLocalNoLinkageFinder::VisitTypeOfExprType(

const TypeOfExprType

*) {

5992bool

UnnamedLocalNoLinkageFinder::VisitTypeOfType(

const TypeOfType

*

T

) {

5993 return

Visit(

T

->getUnmodifiedType());

5996bool

UnnamedLocalNoLinkageFinder::VisitDecltypeType(

const DecltypeType

*) {

6000bool

UnnamedLocalNoLinkageFinder::VisitPackIndexingType(

6005bool

UnnamedLocalNoLinkageFinder::VisitUnaryTransformType(

6010bool

UnnamedLocalNoLinkageFinder::VisitAutoType(

const AutoType

*

T

) {

6011 return

Visit(

T

->getDeducedType());

6014bool

UnnamedLocalNoLinkageFinder::VisitDeducedTemplateSpecializationType(

6016 return

Visit(

T

->getDeducedType());

6019bool

UnnamedLocalNoLinkageFinder::VisitRecordType(

const RecordType

*

T

) {

6020 return

VisitTagDecl(

T

->getDecl());

6023bool

UnnamedLocalNoLinkageFinder::VisitEnumType(

const EnumType

*

T

) {

6024 return

VisitTagDecl(

T

->getDecl());

6027bool

UnnamedLocalNoLinkageFinder::VisitTemplateTypeParmType(

6032bool

UnnamedLocalNoLinkageFinder::VisitSubstTemplateTypeParmPackType(

6037bool

UnnamedLocalNoLinkageFinder::VisitTemplateSpecializationType(

6042bool

UnnamedLocalNoLinkageFinder::VisitInjectedClassNameType(

6044 return

VisitTagDecl(

T

->getDecl());

6047bool

UnnamedLocalNoLinkageFinder::VisitDependentNameType(

6049 return

VisitNestedNameSpecifier(

T

->getQualifier());

6052bool

UnnamedLocalNoLinkageFinder::VisitDependentTemplateSpecializationType(

6054 if

(

auto

*Q =

T

->getQualifier())

6055 return

VisitNestedNameSpecifier(Q);

6059bool

UnnamedLocalNoLinkageFinder::VisitPackExpansionType(

6061 return

Visit(

T

->getPattern());

6064bool

UnnamedLocalNoLinkageFinder::VisitObjCObjectType(

const ObjCObjectType

*) {

6068bool

UnnamedLocalNoLinkageFinder::VisitObjCInterfaceType(

6073bool

UnnamedLocalNoLinkageFinder::VisitObjCObjectPointerType(

6078bool

UnnamedLocalNoLinkageFinder::VisitAtomicType(

const AtomicType

*

T

) {

6079 return

Visit(

T

->getValueType());

6082bool

UnnamedLocalNoLinkageFinder::VisitPipeType(

const PipeType

*

T

) {

6086bool

UnnamedLocalNoLinkageFinder::VisitBitIntType(

const BitIntType

*

T

) {

6090bool

UnnamedLocalNoLinkageFinder::VisitArrayParameterType(

6092 return

VisitConstantArrayType(

T

);

6095bool

UnnamedLocalNoLinkageFinder::VisitDependentBitIntType(

6100bool

UnnamedLocalNoLinkageFinder::VisitTagDecl(

const TagDecl

*Tag) {

6101 if

(

Tag

->getDeclContext()->isFunctionOrMethod()) {

6102

S.

Diag

(SR.getBegin(),

6104

diag::warn_cxx98_compat_template_arg_local_type :

6105

diag::ext_template_arg_local_type)

6110 if

(!

Tag

->hasNameForLinkage()) {

6111

S.

Diag

(SR.getBegin(),

6113

diag::warn_cxx98_compat_template_arg_unnamed_type :

6114

diag::ext_template_arg_unnamed_type) << SR;

6115

S.

Diag

(

Tag

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

6122bool

UnnamedLocalNoLinkageFinder::VisitNestedNameSpecifier(

6140

llvm_unreachable(

"Invalid NestedNameSpecifier::Kind!"

);

6143bool

UnnamedLocalNoLinkageFinder::VisitHLSLAttributedResourceType(

6145 if

(

T

->hasContainedType() && Visit(

T

->getContainedType()))

6147 return

Visit(

T

->getWrappedType());

6151

assert(ArgInfo &&

"invalid TypeSourceInfo"

);

6157 return Diag

(SR.

getBegin

(), diag::err_variably_modified_template_arg) << Arg;

6159 return Diag

(SR.

getBegin

(), diag::err_template_arg_overload_type) << SR;

6170

UnnamedLocalNoLinkageFinder Finder(*

this

, SR);

6171

(void)Finder.Visit(CanonArg);

6188 Decl

*Entity =

nullptr

) {

6194 if

(Entity && Entity->hasAttr<DLLImportAttr>())

6199 "Incomplete parameter type in isNullPointerValueTemplateArgument!"

);

6208

Arg = ArgRV.

get

();

6212

EvalResult.

Diag

= &Notes;

6220 if

(Notes.size() == 1 && Notes[0].second.getDiagID() ==

6221

diag::note_invalid_subexpr_in_const_expr) {

6222

DiagLoc = Notes[0].first;

6226

S.

Diag

(DiagLoc, diag::err_template_arg_not_address_constant)

6228 for

(

unsigned

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

6229

S.

Diag

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

6247 bool

ObjCLifetimeConversion;

6250

ObjCLifetimeConversion))

6255

S.

Diag

(Arg->

getExprLoc

(), diag::err_template_arg_wrongtype_null_constant)

6274

std::string Code =

"static_cast<"

+ ParamType.

getAsString

() +

">("

;

6275

S.

Diag

(Arg->

getExprLoc

(), diag::err_template_arg_untyped_null_constant)

6294 bool

ObjCLifetimeConversion;

6298

ObjCLifetimeConversion)) {

6303 if

(!ParamRef->getPointeeType()->isFunctionType()) {

6313 unsigned

ParamQuals = ParamRef->getPointeeType().getCVRQualifiers();

6316 if

((ParamQuals | ArgQuals) != ParamQuals) {

6318

diag::err_template_arg_ref_bind_ignores_quals)

6336

S.

Diag

(Arg->

getBeginLoc

(), diag::err_template_arg_not_convertible)

6355 bool

AddressTaken =

false

;

6362 bool

ExtWarnMSTemplateArg =

false

;

6365 while

(

UnaryOperator

*UnOp = dyn_cast<UnaryOperator>(Arg)) {

6367 if

(UnOpKind == UO_Deref)

6368

ExtWarnMSTemplateArg =

true

;

6369 if

(UnOpKind == UO_AddrOf || UnOpKind == UO_Deref) {

6372

FirstOpKind = UnOpKind;

6373

FirstOpLoc = UnOp->getOperatorLoc();

6379 if

(ExtWarnMSTemplateArg)

6380

S.

Diag

(ArgIn->

getBeginLoc

(), diag::ext_ms_deref_template_argument)

6383 if

(FirstOpKind == UO_AddrOf)

6384

AddressTaken =

true

;

6388

assert(FirstOpKind == UO_Deref);

6411 bool

ExtraParens =

false

;

6413 if

(!

Invalid

&& !ExtraParens) {

6416

? diag::warn_cxx98_compat_template_arg_extra_parens

6417

: diag::ext_template_arg_extra_parens)

6419

ExtraParens =

true

;

6422

Arg =

Parens

->getSubExpr();

6426

dyn_cast<SubstNonTypeTemplateParmExpr>(Arg))

6430 if

(UnOp->getOpcode() == UO_AddrOf) {

6431

Arg = UnOp->getSubExpr();

6432

AddressTaken =

true

;

6433

AddrOpLoc = UnOp->getOperatorLoc();

6438

dyn_cast<SubstNonTypeTemplateParmExpr>(Arg))

6443 if

(

DeclRefExpr

*DRE = dyn_cast<DeclRefExpr>(Arg))

6444

Entity = DRE->getDecl();

6445 else if

(

CXXUuidofExpr

*CUE = dyn_cast<CXXUuidofExpr>(Arg))

6446

Entity = CUE->getGuidDecl();

6453

S.

Diag

(Arg->

getExprLoc

(), diag::warn_cxx98_compat_template_arg_null);

6456

CanonicalConverted =

6473

CanonicalConverted =

6486 if

(isa<FieldDecl>(Entity) || isa<IndirectFieldDecl>(Entity)) {

6494 if

(

CXXMethodDecl

*Method = dyn_cast<CXXMethodDecl>(Entity)) {

6495 if

(!Method->isStatic()) {

6504 VarDecl

*Var = dyn_cast<VarDecl>(Entity);

6505 MSGuidDecl

*Guid = dyn_cast<MSGuidDecl>(Entity);

6508 if

(!

Func

&& !Var && !Guid) {

6510

S.

Diag

(Arg->

getBeginLoc

(), diag::err_template_arg_not_object_or_func)

6512

S.

Diag

(Entity->

getLocation

(), diag::note_template_arg_refers_here);

6520

? diag::warn_cxx98_compat_template_arg_object_internal

6521

: diag::ext_template_arg_object_internal)

6523

S.

Diag

(Entity->

getLocation

(), diag::note_template_arg_internal_object)

6526

S.

Diag

(Arg->

getBeginLoc

(), diag::err_template_arg_object_no_linkage)

6528

S.

Diag

(Entity->

getLocation

(), diag::note_template_arg_internal_object)

6557

S.

Diag

(AddrOpLoc, diag::err_template_arg_address_of_non_pointer)

6563

S.

Diag

(AddrOpLoc, diag::err_template_arg_address_of_non_pointer)

6568

ArgType = Entity->

getType

();

6605

CanonicalConverted =

6621 Expr

*Arg = ResultArg;

6622 bool

ObjCLifetimeConversion;

6634 bool

ExtraParens =

false

;

6636 if

(!

Invalid

&& !ExtraParens) {

6639

? diag::warn_cxx98_compat_template_arg_extra_parens

6640

: diag::ext_template_arg_extra_parens)

6642

ExtraParens =

true

;

6645

Arg =

Parens

->getSubExpr();

6649

dyn_cast<SubstNonTypeTemplateParmExpr>(Arg))

6654 if

(UnOp->getOpcode() == UO_AddrOf) {

6655

DRE = dyn_cast<DeclRefExpr>(UnOp->getSubExpr());

6661 else if

((DRE = dyn_cast<DeclRefExpr>(Arg))) {

6664 if

(isa<NonTypeTemplateParmDecl>(VD)) {

6667

CanonicalConverted =

6671

CanonicalConverted =

6690

S.

Diag

(ResultArg->

getExprLoc

(), diag::warn_cxx98_compat_template_arg_null);

6702

ObjCLifetimeConversion)) {

6709

S.

Diag

(ResultArg->

getBeginLoc

(), diag::err_template_arg_not_convertible)

6717

diag::err_template_arg_not_pointer_to_member_form)

6720 if

(isa<FieldDecl>(DRE->

getDecl

()) ||

6721

isa<IndirectFieldDecl>(DRE->

getDecl

()) ||

6722

isa<CXXMethodDecl>(DRE->

getDecl

())) {

6723

assert((isa<FieldDecl>(DRE->

getDecl

()) ||

6724

isa<IndirectFieldDecl>(DRE->

getDecl

()) ||

6725

cast<CXXMethodDecl>(DRE->

getDecl

())

6726

->isImplicitObjectMemberFunction()) &&

6727 "Only non-static member pointers can make it here"

);

6733

CanonicalConverted =

6738

CanonicalConverted =

6746

S.

Diag

(Arg->

getBeginLoc

(), diag::err_template_arg_not_pointer_to_member_form)

6756 bool

PartialOrderingTTP,

6769 auto

*AT = dyn_cast<AutoType>(DeducedT);

6770 if

(AT && AT->isDecltypeAuto()) {

6781 Expr

*DeductionArg = Arg;

6782 if

(

auto

*PE = dyn_cast<PackExpansionExpr>(DeductionArg))

6783

DeductionArg = PE->getPattern();

6786 if

(isa<DeducedTemplateSpecializationType>(DeducedT)) {

6790

DeductionArg->

getBeginLoc

(),

false

, DeductionArg);

6791 Expr

*Inits[1] = {DeductionArg};

6794 if

(ParamType.

isNull

())

6810 if

(ParamType.

isNull

())

6814

diag::err_non_type_template_parm_type_deduction_failure)

6826 if

(ParamType.

isNull

()) {

6834 "non-type template parameter type cannot be qualified"

);

6860 Diag

(StartLoc, diag::err_deduced_non_type_template_arg_type_mismatch)

6871 auto

*PE = dyn_cast<PackExpansionExpr>(Arg);

6873

Arg = PE->getPattern();

6879 if

(

E

.isInvalid())

6885

PE->getNumExpansions());

6903 if

(ParamType->

isRecordType

() && isa<DeclRefExpr>(InnerArg) &&

6905 NamedDecl

*ND = cast<DeclRefExpr>(InnerArg)->getDecl();

6906 if

(

auto

*TPO = dyn_cast<TemplateParamObjectDecl>(ND)) {

6909

CanonicalConverted =

6913 if

(isa<NonTypeTemplateParmDecl>(ND)) {

6915

CanonicalConverted =

6926 bool

IsConvertedConstantExpression =

true

;

6927 if

(isa<InitListExpr>(Arg) || ParamType->

isRecordType

()) {

6930 Expr

*Inits[1] = {Arg};

6944

IsConvertedConstantExpression =

false

;

6953 if

(IsConvertedConstantExpression) {

6957

assert(!ArgResult.

isUnset

());

6970

CanonicalConverted =

6978 false

, PreNarrowingValue);

6982 if

(

Value

.isLValue()) {

6995

isa<LifetimeExtendedTemporaryDecl, UnnamedGlobalConstantDecl>(VD))) {

7001 if

(

Value

.hasLValuePath() &&

Value

.getLValuePath().size() == 1 && VD &&

7003 Value

.getLValuePath()[0].getAsArrayIndex() == 0 &&

7008 return

ArgResult.

get

();

7013 if

(!

Value

.hasLValuePath() ||

Value

.getLValuePath().size() ||

7014 Value

.isLValueOnePastTheEnd()) {

7015 Diag

(StartLoc, diag::err_non_type_template_arg_subobject)

7020 "null reference should not be a constant expression"

);

7022 "non-null value of type nullptr_t?"

);

7026 if

(

Value

.isAddrLabelDiff())

7027 return Diag

(StartLoc, diag::err_non_type_template_arg_addr_label_diff);

7031 return

ArgResult.

get

();

7059

llvm::APSInt

Value

;

7069

CanonicalConverted =

7079

IntegerType =

Enum

->getDecl()->getIntegerType();

7085

CanonicalConverted =

7093

Arg = ArgResult.

get

();

7104

llvm::APSInt

Value

;

7106 Diag

(Arg->

getBeginLoc

(), diag::err_template_arg_not_integral_or_enumeral)

7119 return

S.

Diag

(

Loc

, diag::err_template_arg_not_ice) <<

T

;

7121

} Diagnoser(ArgType);

7157

CanonicalConverted =

7164

IntegerType =

Enum

->getDecl()->getIntegerType();

7171 if

(

Value

.getBitWidth() != AllowedBits)

7175

llvm::APSInt OldValue =

Value

;

7182 if

(

Value

.getBitWidth() != AllowedBits)

7188

(OldValue.isSigned() && OldValue.isNegative())) {

7196 unsigned

RequiredBits;

7198

RequiredBits = OldValue.getActiveBits();

7199 else if

(OldValue.isUnsigned())

7200

RequiredBits = OldValue.getActiveBits() + 1;

7202

RequiredBits = OldValue.getSignificantBits();

7203 if

(RequiredBits > AllowedBits) {

7213

CanonicalConverted =

7263

*

this

, Param, ParamType, Arg, SugaredConverted,

7264

CanonicalConverted))

7270

*

this

, Param, ParamType, Arg, SugaredConverted, CanonicalConverted))

7281 "Only object pointers allowed here"

);

7284

*

this

, Param, ParamType, Arg, SugaredConverted, CanonicalConverted))

7296

assert(ParamRefType->getPointeeType()->isIncompleteOrObjectType() &&

7297 "Only object references allowed here"

);

7301

ParamRefType->getPointeeType(),

7316

*

this

, Param, ParamType, Arg, SugaredConverted, CanonicalConverted))

7325

CanonicalConverted =

7332 Diag

(Arg->

getExprLoc

(), diag::err_template_arg_not_convertible)

7333

<< Arg->

getType

() << ParamType;

7341 Diag

(Arg->

getExprLoc

(), diag::warn_cxx98_compat_template_arg_null);

7355

*

this

, Param, ParamType, Arg, SugaredConverted, CanonicalConverted))

7367 bool

*MatchedPackOnParmToNonPackOnArg) {

7369 auto

[Template, DefaultArgs] = Name.getTemplateDeclAndDefaultArgs();

7372

assert(Name.isDependent() &&

"Non-dependent template isn't a declaration?"

);

7376 if

(Template->isInvalidDecl())

7391 if

(!isa<ClassTemplateDecl>(Template) &&

7392

!isa<TemplateTemplateParmDecl>(Template) &&

7393

!isa<TypeAliasTemplateDecl>(Template) &&

7394

!isa<BuiltinTemplateDecl>(Template)) {

7395

assert(isa<FunctionTemplateDecl>(Template) &&

7396 "Only function templates are possible here"

);

7397 Diag

(Arg.

getLocation

(), diag::err_template_arg_not_valid_template);

7398 Diag

(Template->getLocation(), diag::note_template_arg_refers_here_func)

7406

Params, Param, Template, DefaultArgs, Arg.

getLocation

(),

7418 if

(ParamsAC.empty())

7421

Template->getAssociatedConstraints(TemplateAC);

7423 bool

IsParamAtLeastAsConstrained;

7425

IsParamAtLeastAsConstrained))

7427 if

(!IsParamAtLeastAsConstrained) {

7429

diag::err_template_template_parameter_not_at_least_as_constrained)

7431 Diag

(Param->

getLocation

(), diag::note_entity_declared_at) << Param;

7432 Diag

(Template->getLocation(), diag::note_entity_declared_at) << Template;

7441 unsigned

HereDiagID,

7442 unsigned

ExternalDiagID) {

7447

llvm::raw_svector_ostream Out(Str);

7455

std::optional<SourceRange> ParamRange) {

7458

diag::note_template_decl_external);

7459 if

(ParamRange && ParamRange->isValid()) {

7461 "Parameter range has location when Decl does not"

);

7468

diag::note_template_param_external);

7491

? CK_NullToMemberPointer

7492

: CK_NullToPointer);

7495 "Only declaration template arguments permitted here"

);

7504

(isa<CXXMethodDecl>(VD) || isa<FieldDecl>(VD) ||

7505

isa<IndirectFieldDecl>(VD)));

7533

assert(isa<TemplateParamObjectDecl>(VD) &&

7534 "arg for class template param not a template parameter object"

);

7539 "unexpected type for decl template argument"

);

7541

dyn_cast_if_present<NonTypeTemplateParmDecl>(

TemplateParam

)) {

7542 QualType

TemplateParamType = NTTP->getType();

7556 "value kind mismatch for non-type template argument"

);

7576 "unexpected conversion required for non-type template argument"

);

7603 T

= ET->getDecl()->getIntegerType();

7654

llvm_unreachable(

"unexpected template argument value"

);

7679 return

MakeInitList(

7692 return

MakeInitList(Elts);

7697

llvm_unreachable(

"Unexpected APValue kind."

);

7713

llvm_unreachable(

"Unhandled APValue::ValueKind enum"

);

7725

llvm_unreachable(

"not a non-type template argument"

);

7743

llvm_unreachable(

"Unhandled TemplateArgument::ArgKind enum"

);

7750 const NamedDecl

*OldInstFrom,

bool

Complain,

7755 unsigned

NextDiag = diag::err_template_param_different_kind;

7756 if

(TemplateArgLoc.

isValid

()) {

7757

S.

Diag

(TemplateArgLoc, diag::err_template_arg_template_params_mismatch);

7758

NextDiag = diag::note_template_param_different_kind;

7775 unsigned

NextDiag = diag::err_template_parameter_pack_non_pack;

7776 if

(TemplateArgLoc.

isValid

()) {

7777

S.

Diag

(TemplateArgLoc,

7778

diag::err_template_arg_template_params_mismatch);

7779

NextDiag = diag::note_template_parameter_pack_non_pack;

7782 unsigned

ParamKind = isa<TemplateTypeParmDecl>(New)? 0

7783

: isa<NonTypeTemplateParmDecl>(New)? 1

7787

S.

Diag

(Old->

getLocation

(), diag::note_template_parameter_pack_here)

7796

= dyn_cast<NonTypeTemplateParmDecl>(Old)) {

7807 unsigned

NextDiag = diag::err_template_nontype_parm_different_type;

7808 if

(TemplateArgLoc.

isValid

()) {

7809

S.

Diag

(TemplateArgLoc,

7810

diag::err_template_arg_template_params_mismatch);

7811

NextDiag = diag::note_template_nontype_parm_different_type;

7815

S.

Diag

(OldNTTP->getLocation(),

7816

diag::note_template_nontype_parm_prev_declaration)

7817

<< OldNTTP->getType();

7827

dyn_cast<TemplateTemplateParmDecl>(Old)) {

7831

OldTTP->getTemplateParameters(), Complain,

7840

!isa<TemplateTemplateParmDecl>(Old)) {

7841 const Expr

*NewC =

nullptr

, *OldC =

nullptr

;

7843 if

(isa<TemplateTypeParmDecl>(New)) {

7844 if

(

const auto

*TC = cast<TemplateTypeParmDecl>(New)->getTypeConstraint())

7845

NewC = TC->getImmediatelyDeclaredConstraint();

7846 if

(

const auto

*TC = cast<TemplateTypeParmDecl>(Old)->getTypeConstraint())

7847

OldC = TC->getImmediatelyDeclaredConstraint();

7848

}

else if

(isa<NonTypeTemplateParmDecl>(New)) {

7849 if

(

const Expr

*

E

= cast<NonTypeTemplateParmDecl>(New)

7850

->getPlaceholderTypeConstraint())

7852 if

(

const Expr

*

E

= cast<NonTypeTemplateParmDecl>(Old)

7853

->getPlaceholderTypeConstraint())

7856

llvm_unreachable(

"unexpected template parameter type"

);

7858 auto

Diagnose = [&] {

7860

diag::err_template_different_type_constraint);

7862

diag::note_template_prev_declaration) <<

0;

7865 if

(!NewC != !OldC) {

7892 unsigned

NextDiag = diag::err_template_param_list_different_arity;

7893 if

(TemplateArgLoc.

isValid

()) {

7894

S.

Diag

(TemplateArgLoc, diag::err_template_arg_template_params_mismatch);

7895

NextDiag = diag::note_template_param_list_different_arity;

7910 if

(Old->

size

() != New->

size

()) {

7927

OldParmEnd = Old->

end

();

7928

OldParm != OldParmEnd; ++OldParm, ++NewParm) {

7929 if

(NewParm == NewParmEnd) {

7936

OldInstFrom, Complain, Kind,

7942 if

(NewParm != NewParmEnd) {

7956

diag::err_template_different_requires_clause);

7958

diag::note_template_prev_declaration) <<

0;

7961 if

(!NewRC != !OldRC) {

7986

S = S->getDeclParent();

7992 if

(Ctx && Ctx->isExternCContext()) {

7996 Diag

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

7999

Ctx = Ctx ? Ctx->getRedeclContext() :

nullptr

;

8011 if

(Ctx->isFileContext())

8016 if

(RD->isLocalClass())

8018

diag::err_template_inside_local_class)

8026

diag::err_template_outside_namespace_or_class_scope)

8037 return Record

->getTemplateSpecializationKind();

8039 return Function

->getTemplateSpecializationKind();

8040 if

(

VarDecl

*Var = dyn_cast<VarDecl>(

D

))

8041 return

Var->getTemplateSpecializationKind();

8078 if

(isa<ClassTemplateDecl>(Specialized))

8080 else if

(isa<VarTemplateDecl>(Specialized))

8082 else if

(isa<FunctionTemplateDecl>(Specialized))

8084 else if

(isa<CXXMethodDecl>(Specialized))

8086 else if

(isa<VarDecl>(Specialized))

8088 else if

(isa<RecordDecl>(Specialized))

8090 else if

(isa<EnumDecl>(Specialized) && S.

getLangOpts

().CPlusPlus11)

8093

S.

Diag

(

Loc

, diag::err_template_spec_unknown_kind)

8095

S.

Diag

(Specialized->

getLocation

(), diag::note_specialized_entity);

8103

S.

Diag

(

Loc

, diag::err_template_spec_decl_function_scope)

8118

: DC->

Equals

(SpecializedContext))) {

8119 if

(isa<TranslationUnitDecl>(SpecializedContext))

8120

S.

Diag

(

Loc

, diag::err_template_spec_redecl_global_scope)

8121

<< EntityKind << Specialized;

8123 auto

*ND = cast<NamedDecl>(SpecializedContext);

8124 int Diag

= diag::err_template_spec_redecl_out_of_scope;

8126 Diag

= diag::ext_ms_template_spec_redecl_out_of_scope;

8127

S.

Diag

(

Loc

,

Diag

) << EntityKind << Specialized

8128

<< ND << isa<CXXRecordDecl>(ND);

8131

S.

Diag

(Specialized->getLocation(), diag::note_specialized_entity);

8145

DependencyChecker Checker(Depth,

true

);

8146

Checker.TraverseStmt(

E

);

8147 if

(Checker.MatchLoc.isInvalid())

8149 return

Checker.MatchLoc;

8155

DependencyChecker Checker(Depth,

true

);

8156

Checker.TraverseTypeLoc(TL);

8157 if

(Checker.MatchLoc.isInvalid())

8159 return

Checker.MatchLoc;

8167 for

(

unsigned

I = 0; I != NumArgs; ++I) {

8170

S, TemplateNameLoc, Param, Args[I].pack_begin(),

8171

Args[I].pack_size(), IsDefaultArgument))

8184

ArgExpr = Expansion->getPattern();

8188

ArgExpr = ICE->getSubExpr();

8198 if

(

DeclRefExpr

*DRE = dyn_cast<DeclRefExpr>(ArgExpr))

8199 if

(isa<NonTypeTemplateParmDecl>(DRE->getDecl()))

8219 if

(ParamUseRange.

isValid

()) {

8220 if

(IsDefaultArgument) {

8221

S.

Diag

(TemplateNameLoc,

8222

diag::err_dependent_non_type_arg_in_partial_spec);

8224

diag::note_dependent_non_type_default_arg_in_partial_spec)

8228

diag::err_dependent_non_type_arg_in_partial_spec)

8236 if

(ParamUseRange.

isValid

()) {

8237

S.

Diag

(IsDefaultArgument ? TemplateNameLoc : ArgExpr->

getBeginLoc

(),

8238

diag::err_dependent_typed_non_type_arg_in_partial_spec)

8258 for

(

unsigned

I = 0, N = TemplateParams->

size

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

8260

= dyn_cast<NonTypeTemplateParmDecl>(TemplateParams->

getParam

(I));

8265

Param, &TemplateArgs[I],

8266

1, I >= NumExplicit))

8287

= dyn_cast_or_null<ClassTemplateDecl>(Name.getAsTemplateDecl());

8290 Diag

(TemplateNameLoc, diag::err_not_class_template_specialization)

8291

<< (Name.getAsTemplateDecl() &&

8292

isa<TemplateTemplateParmDecl>(Name.getAsTemplateDecl()));

8296 if

(

const auto

*DSA =

ClassTemplate

->getAttr<NoSpecializationsAttr>()) {

8297 auto

Message = DSA->getMessage();

8298 Diag

(TemplateNameLoc, diag::warn_invalid_specialization)

8300 Diag

(DSA->getLoc(), diag::note_marked_here) << DSA;

8303 if

(S->isTemplateParamScope())

8308 bool

isMemberSpecialization =

false

;

8309 bool

isPartialSpecialization =

false

;

8314

TemplateNameLoc, &TemplateId,

8326

KWLoc, TemplateNameLoc, SS, &TemplateId, TemplateParameterLists,

8341 if

(TemplateParams && TemplateParams->

size

() > 0) {

8342

isPartialSpecialization =

true

;

8345 Diag

(KWLoc, diag::err_partial_specialization_friend)

8353 for

(

unsigned

I = 0, N = TemplateParams->

size

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

8356 if

(TTP->hasDefaultArgument()) {

8357 Diag

(TTP->getDefaultArgumentLoc(),

8358

diag::err_default_arg_in_partial_spec);

8359

TTP->removeDefaultArgument();

8362

= dyn_cast<NonTypeTemplateParmDecl>(Param)) {

8363 if

(NTTP->hasDefaultArgument()) {

8364 Diag

(NTTP->getDefaultArgumentLoc(),

8365

diag::err_default_arg_in_partial_spec)

8366

<< NTTP->getDefaultArgument().getSourceRange();

8367

NTTP->removeDefaultArgument();

8373

diag::err_default_arg_in_partial_spec)

8379

}

else if

(TemplateParams) {

8381 Diag

(KWLoc, diag::err_template_spec_friend)

8388 "should have a 'template<>' for this decl"

);

8395 "Invalid enum tag in class template spec!"

);

8399 Diag

(KWLoc, diag::err_use_with_wrong_tag)

8404

diag::note_previous_use);

8413 for

(

unsigned

I = 0, N = TemplateArgs.

size

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

8415

isPartialSpecialization

8431 if

(isPartialSpecialization) {

8433

TemplateArgs.

size

(),

8439 if

(!Name.isDependent() &&

8442 Diag

(TemplateNameLoc, diag::err_partial_spec_fully_specialized)

8444

isPartialSpecialization =

false

;

8449 void

*InsertPos =

nullptr

;

8452 if

(isPartialSpecialization)

8466

isPartialSpecialization))

8471 if

(isPartialSpecialization) {

8489 Diag

(TemplateNameLoc, diag::err_partial_spec_args_match_primary_template)

8493

S, TagSpec, TUK, KWLoc, SS,

ClassTemplate

->getIdentifier(),

8497

TemplateParameterLists.data());

8502

= cast_or_null<ClassTemplatePartialSpecializationDecl>(PrevDecl);

8505 Context

, Kind, DC, KWLoc, TemplateNameLoc, TemplateParams,

8509 if

(TemplateParameterLists.size() > 1 && SS.

isSet

()) {

8511 Context

, TemplateParameterLists.drop_back(1));

8515 ClassTemplate

->AddPartialSpecialization(Partial, InsertPos);

8532 if

(TemplateParameterLists.size() > 0) {

8534

TemplateParameterLists);

8567 Diag

(TemplateNameLoc, diag::err_specialization_after_instantiation)

8571

diag::note_instantiation_required_here)

8609 if

(ModulePrivateLoc.

isValid

())

8611

<< (isPartialSpecialization? 1 : 0)

8637

Name, TemplateNameLoc, TemplateArgs, CanonType);

8674

diag::err_concept_decls_may_only_appear_in_global_namespace_scope);

8678 if

(TemplateParameterLists.size() > 1) {

8679 Diag

(NameLoc, diag::err_concept_extra_headers);

8685 if

(Params->

size

() == 0) {

8686 Diag

(NameLoc, diag::err_concept_no_parameters);

8693

ParamEnd = Params->

end

();

8694

ParamIt != ParamEnd; ++ParamIt) {

8695 Decl const

*Param = *ParamIt;

8697 if

(++ParamIt == ParamEnd)

8700

diag::err_template_param_pack_must_be_last_template_parameter);

8711 Diag

(NameLoc, diag::err_concept_no_associated_constraints);

8732 bool Found

=

false

;

8748 Expr

*ConstraintExpr,

8750

assert(!

C

->hasDefinition() &&

"Concept already defined"

);

8753 C

->setDefinition(ConstraintExpr);

8764 bool

AddToScope =

true

;

8768 if

(!WasAlreadyAdded && AddToScope)

8781 auto

*OldConcept = dyn_cast<ConceptDecl>(

Previous

.getRepresentativeDecl()->getUnderlyingDecl());

8783 auto

*Old =

Previous

.getRepresentativeDecl();

8784 Diag

(NewDecl->

getLocation

(), diag::err_redefinition_different_kind)

8787

AddToScope =

false

;

8793 Diag

(NewDecl->

getLocation

(), diag::err_redefinition_different_concept)

8796

AddToScope =

false

;

8804

AddToScope =

false

;

8807 if

(!

Previous

.isSingleResult()) {

8818 if

(!

Concept

->isInvalidDecl() && !

Concept

->hasDefinition()) {

8820 Diag

(

Concept

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

8829 if

(MinGW || (isa<FunctionDecl>(

D

) &&

8830

cast<FunctionDecl>(

D

)->isFunctionTemplateSpecialization()))

8831 D

->

dropAttrs

<DLLImportAttr, DLLExportAttr>();

8834

FD->setInlineSpecified(

false

);

8845 for

(

Decl

*Prev =

D

; Prev && !PrevDiagLoc.

isValid

();

8846

Prev = Prev->getPreviousDecl()) {

8847

PrevDiagLoc = Prev->getLocation();

8849

assert(PrevDiagLoc.

isValid

() &&

8850 "Explicit instantiation without point of instantiation?"

);

8860 bool

&HasNoEffect) {

8861

HasNoEffect =

false

;

8868 "previous declaration must be implicit!"

);

8881 if

(PrevPointOfInstantiation.

isInvalid

()) {

8895

PrevPointOfInstantiation.

isValid

()) &&

8896 "Explicit instantiation without point of instantiation?"

);

8910 Diag

(NewLoc, diag::err_specialization_after_instantiation)

8912 Diag

(PrevPointOfInstantiation, diag::note_instantiation_required_here)

8917

llvm_unreachable(

"The switch over PrevTSK must be exhaustive."

);

8923

HasNoEffect =

true

;

8938

HasNoEffect =

true

;

8947

diag::err_explicit_instantiation_declaration_after_definition);

8953

diag::note_explicit_instantiation_definition_here);

8954

HasNoEffect =

true

;

8957

llvm_unreachable(

"Unexpected TemplateSpecializationKind!"

);

8973 Diag

(NewLoc, diag::warn_explicit_instantiation_after_specialization)

8976

diag::note_previous_template_specialization);

8977

HasNoEffect =

true

;

8992

HasNoEffect =

true

;

9007

? diag::ext_explicit_instantiation_duplicate

9008

: diag::err_explicit_instantiation_duplicate)

9011

diag::note_previous_explicit_instantiation);

9012

HasNoEffect =

true

;

9017

llvm_unreachable(

"Missing specialization/instantiation case?"

);

9027 enum

DiscardReason { NotAFunctionTemplate, NotAMemberOfEnclosing };

9031 if

(!isa<FunctionTemplateDecl>(

D

)) {

9033

DiscardedCandidates.push_back(std::make_pair(NotAFunctionTemplate,

D

));

9040

DiscardedCandidates.push_back(std::make_pair(NotAMemberOfEnclosing,

D

));

9048 Diag

(FD->

getLocation

(), diag::err_dependent_function_template_spec_no_match)

9050 for

(

auto

&

P

: DiscardedCandidates)

9051 Diag

(

P

.second->getLocation(),

9052

diag::note_dependent_function_template_spec_discard_reason)

9053

<<

P

.first << IsFriend;

9058

ExplicitTemplateArgs);

9071

llvm::SmallDenseMap<FunctionDecl *, TemplateArgumentListInfo, 8>

9072

ConvertedTemplateArgs;

9095 if

(

auto

*NewMD = dyn_cast<CXXMethodDecl>(FD);

9096

!

getLangOpts

().CPlusPlus14 && NewMD && NewMD->isConstexpr() &&

9097

!isa<CXXConstructorDecl, CXXDestructorDecl>(NewMD)) {

9098 auto

*OldMD = dyn_cast<CXXMethodDecl>(FunTmpl->getTemplatedDecl());

9099 if

(OldMD && OldMD->isConst()) {

9109 if

(ExplicitTemplateArgs)

9110

Args = *ExplicitTemplateArgs;

9122

cast<FunctionTemplateDecl>(FunTmpl->getFirstDecl()),

9123

ExplicitTemplateArgs ? &Args :

nullptr

, FT,

Specialization

, Info);

9128

I.getPair(), FunTmpl->getTemplatedDecl(),

9144

I.getPair(), FunTmpl->getTemplatedDecl(),

9151 if

(ExplicitTemplateArgs)

9160 if

(QualifiedFriend && Candidates.

empty

()) {

9166 if

(

auto

*OldFD = dyn_cast<FunctionDecl>(OldND->getUnderlyingDecl()))

9177 PDiag

(diag::err_function_template_spec_ambiguous)

9178

<< FD->

getDeclName

() << (ExplicitTemplateArgs !=

nullptr

),

9179 PDiag

(diag::note_function_template_spec_matched));

9188 const auto

*DSA = PT->getAttr<NoSpecializationsAttr>()) {

9189 auto

Message = DSA->getMessage();

9191

<< PT << !Message.empty() << Message;

9192 Diag

(DSA->getLoc(), diag::note_marked_here) << DSA;

9220 auto

*SpecializationFPT =

9231

assert(SpecInfo &&

"Function template specialization info missing?"

);

9269 bool

HasNoEffect =

false

;

9295 "This must be the only existing declaration of this specialization"

);

9310

FD->setFunctionTemplateSpecialization(

9313

ExplicitTemplateArgs ? &ConvertedTemplateArgs[

Specialization

] :

nullptr

);

9332

assert(!

Member

->isTemplateDecl() && !

Member

->getDescribedTemplate() &&

9333 "Only for non-template members"

);

9336 NamedDecl

*FoundInstantiation =

nullptr

;

9346 auto

*Method = dyn_cast<CXXMethodDecl>(Candidate->getUnderlyingDecl());

9364

Method->getTrailingRequiresClause() &&

9368

!Satisfaction.IsSatisfied))

9371

Candidates.

addDecl

(Candidate);

9375 if

(Candidates.

empty

())

9384 auto

*Method = cast<CXXMethodDecl>(I->getUnderlyingDecl());

9388

BestMethod = Method;

9392

FoundInstantiation = *Best;

9393

Instantiation = BestMethod;

9398 bool

Ambiguous =

false

;

9401 auto

*Method = cast<CXXMethodDecl>(I->getUnderlyingDecl());

9410 Diag

(

Member

->getLocation(), diag::err_function_member_spec_ambiguous)

9411

<<

Member

<< (InstantiatedFrom ? InstantiatedFrom : Instantiation);

9412 for

(

NamedDecl

*Candidate : Candidates) {

9413

Candidate = Candidate->getUnderlyingDecl();

9414 Diag

(Candidate->getLocation(), diag::note_function_member_spec_matched)

9419

}

else if

(isa<VarDecl>(

Member

)) {

9422

(PrevVar = dyn_cast<VarDecl>(

Previous

.getFoundDecl())))

9424

FoundInstantiation =

Previous

.getRepresentativeDecl();

9425

Instantiation = PrevVar;

9429

}

else if

(isa<RecordDecl>(

Member

)) {

9432

(PrevRecord = dyn_cast<CXXRecordDecl>(

Previous

.getFoundDecl()))) {

9433

FoundInstantiation =

Previous

.getRepresentativeDecl();

9434

Instantiation = PrevRecord;

9438

}

else if

(isa<EnumDecl>(

Member

)) {

9441

(PrevEnum = dyn_cast<EnumDecl>(

Previous

.getFoundDecl()))) {

9442

FoundInstantiation =

Previous

.getRepresentativeDecl();

9443

Instantiation = PrevEnum;

9449 if

(!Instantiation) {

9463 if

(InstantiatedFrom && isa<CXXMethodDecl>(

Member

)) {

9464

cast<CXXMethodDecl>(

Member

)->setInstantiationOfMemberFunction(

9465

cast<CXXMethodDecl>(InstantiatedFrom),

9467

}

else if

(InstantiatedFrom && isa<CXXRecordDecl>(

Member

)) {

9468

cast<CXXRecordDecl>(

Member

)->setInstantiationOfMemberClass(

9469

cast<CXXRecordDecl>(InstantiatedFrom),

9474 Previous

.addDecl(FoundInstantiation);

9479 if

(!InstantiatedFrom) {

9480 Diag

(

Member

->getLocation(), diag::err_spec_member_not_instantiated)

9492

assert(MSInfo &&

"Member specialization info missing?"

);

9494 bool

HasNoEffect =

false

;

9506

Instantiation,

Member

->getLocation(),

9512 if

(

auto

*MemberFunction = dyn_cast<FunctionDecl>(

Member

)) {

9513 FunctionDecl

*InstantiationFunction = cast<FunctionDecl>(Instantiation);

9518 if

(InstantiationFunction->

isDeleted

()) {

9521

InstantiationFunction);

9527

MemberFunction->setInstantiationOfMemberFunction(

9529

}

else if

(

auto

*MemberVar = dyn_cast<VarDecl>(

Member

)) {

9530

MemberVar->setInstantiationOfStaticDataMember(

9532

}

else if

(

auto

*MemberClass = dyn_cast<CXXRecordDecl>(

Member

)) {

9533

MemberClass->setInstantiationOfMemberClass(

9535

}

else if

(

auto

*MemberEnum = dyn_cast<EnumDecl>(

Member

)) {

9536

MemberEnum->setInstantiationOfMemberEnum(

9539

llvm_unreachable(

"unknown member specialization kind"

);

9545 Previous

.addDecl(FoundInstantiation);

9554template

<

typename

DeclT>

9565

OrigD->setLocation(

Loc

);

9570 NamedDecl

*Instantiation = cast<NamedDecl>(

Member

->getCanonicalDecl());

9571 if

(Instantiation ==

Member

)

9574 if

(

auto

*

Function

= dyn_cast<CXXMethodDecl>(Instantiation))

9576 else if

(

auto

*Var = dyn_cast<VarDecl>(Instantiation))

9578 else if

(

auto

*

Record

= dyn_cast<CXXRecordDecl>(Instantiation))

9580 else if

(

auto

*

Enum

= dyn_cast<EnumDecl>(Instantiation))

9583

llvm_unreachable(

"unknown member specialization kind"

);

9591 bool

WasQualifiedName) {

9596

S.

Diag

(InstLoc, diag::err_explicit_instantiation_in_class)

9609 if

(WasQualifiedName) {

9610 if

(CurContext->

Encloses

(OrigContext))

9617 if

(

NamespaceDecl

*NS = dyn_cast<NamespaceDecl>(OrigContext)) {

9618 if

(WasQualifiedName)

9621

diag::err_explicit_instantiation_out_of_scope :

9622

diag::warn_explicit_instantiation_out_of_scope_0x)

9627

diag::err_explicit_instantiation_unqualified_wrong_namespace :

9628

diag::warn_explicit_instantiation_unqualified_wrong_namespace_0x)

9633

diag::err_explicit_instantiation_must_be_global :

9634

diag::warn_explicit_instantiation_must_be_global_0x)

9643 bool

WasQualifiedName,

9650

S.

Diag

(InstLoc, diag::err_explicit_instantiation_internal_linkage) <<

D

;

9678 if

(isa<TemplateSpecializationType>(

T

))

9688 auto

*A = cast_or_null<InheritableAttr>(

getDLLAttr

(Def));

9689

assert(A &&

"dllExportImportClassTemplateSpecialization called " 9690 "on Def without dllexport or dllimport"

);

9695 "delayed exports present at explicit instantiation"

);

9699 for

(

auto

&B : Def->

bases

()) {

9700 if

(

auto

*BT = dyn_cast_or_null<ClassTemplateSpecializationDecl>(

9701

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

9721 "Invalid enum tag in class template explicit instantiation!"

);

9727 Diag

(TemplateNameLoc, diag::err_tag_reference_non_tag)

9728

<< TD << NTK << llvm::to_underlying(Kind);

9734

Kind,

false

, KWLoc,

9736 Diag

(KWLoc, diag::err_use_with_wrong_tag)

9741

diag::note_previous_use);

9758 if

(AL.getKind() == ParsedAttr::AT_DLLExport) {

9760

diag::warn_attribute_dllexport_explicit_instantiation_decl);

9761 Diag

(AL.getLoc(), diag::note_attribute);

9766 if

(

auto

*A =

ClassTemplate

->getTemplatedDecl()->getAttr<DLLExportAttr>()) {

9768

diag::warn_attribute_dllexport_explicit_instantiation_decl);

9769 Diag

(A->getLocation(), diag::note_attribute);

9775 bool

DLLImportExplicitInstantiationDef =

false

;

9780 ClassTemplate

->getTemplatedDecl()->getAttr<DLLImportAttr>();

9782 if

(AL.getKind() == ParsedAttr::AT_DLLImport)

9784 if

(AL.getKind() == ParsedAttr::AT_DLLExport) {

9792

DLLImportExplicitInstantiationDef =

true

;

9811 void

*InsertPos =

nullptr

;

9823 if

(AL.getKind() == ParsedAttr::AT_DLLExport) {

9825

diag::warn_attribute_dllexport_explicit_instantiation_def);

9837 bool

HasNoEffect =

false

;

9840

PrevDecl, PrevDecl_TSK,

9857

PrevDecl =

nullptr

;

9861

DLLImportExplicitInstantiationDef) {

9863

HasNoEffect =

false

;

9878 if

(

const auto

*A = PrevDecl->

getAttr

<MSInheritanceAttr>()) {

9880

Clone->setInherited(

true

);

9886 if

(!HasNoEffect && !PrevDecl) {

9899 bool

PreviouslyDLLExported =

Specialization

->hasAttr<DLLExportAttr>();

9924

= cast_or_null<ClassTemplateSpecializationDecl>(

9936

Def = cast_or_null<ClassTemplateSpecializationDecl>(

9944

DLLImportExplicitInstantiationDef)) {

9953 auto

*A = cast<InheritableAttr>(

9955

A->setInherited(

true

);

9963 bool

NewlyDLLExported =

9964

!PreviouslyDLLExported &&

Specialization

->hasAttr<DLLExportAttr>();

9980 "Def and Specialization should match for implicit instantiation"

);

9988

PrevDecl->

hasAttr

<DLLExportAttr>()) {

10012 bool

Owned =

false

;

10013 bool

IsDependent =

false

;

10021

assert(!IsDependent &&

"explicit instantiation of dependent name not yet handled"

);

10026 TagDecl

*Tag = cast<TagDecl>(TagD);

10027

assert(!Tag->isEnum() &&

"shouldn't see enumerations here"

);

10029 if

(Tag->isInvalidDecl())

10035 Diag

(TemplateLoc, diag::err_explicit_instantiation_nontemplate_type)

10037 Diag

(

Record

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

10048 Diag

(TemplateLoc, diag::ext_explicit_instantiation_without_qualified_id)

10063

= cast_or_null<CXXRecordDecl>(

Record

->getPreviousDecl());

10068 bool

HasNoEffect =

false

;

10069

assert(MSInfo &&

"No member specialization information?"

);

10081

= cast_or_null<CXXRecordDecl>(

Record

->getDefinition());

10089 Diag

(TemplateLoc, diag::err_explicit_instantiation_undefined_member)

10090

<< 0 <<

Record

->getDeclName() <<

Record

->getDeclContext();

10100

RecordDef = cast_or_null<CXXRecordDecl>(

Record

->getDefinition());

10129 if

(!

D

.isInvalidType())

10131

diag::err_explicit_instantiation_requires_name)

10138

S = S->getDeclParent();

10150 Diag

(

D

.getIdentifierLoc(), diag::err_explicit_instantiation_of_typedef)

10153

}

else if

(

D

.getDeclSpec().getStorageClassSpec()

10156 Diag

(

D

.getIdentifierLoc(), diag::err_explicit_instantiation_storage_class)

10159 D

.getMutableDeclSpec().ClearStorageClassSpecs();

10167 if

(

D

.getDeclSpec().isInlineSpecified())

10168 Diag

(

D

.getDeclSpec().getInlineSpecLoc(),

10170

diag::err_explicit_instantiation_inline :

10171

diag::warn_explicit_instantiation_inline_0x)

10173 if

(

D

.getDeclSpec().hasConstexprSpecifier() && R->

isFunctionType

())

10176 Diag

(

D

.getDeclSpec().getConstexprSpecLoc(),

10177

diag::err_explicit_instantiation_constexpr);

10182 Diag

(

D

.getDeclSpec().

getBeginLoc

(), diag::err_deduction_guide_specialized)

10213 if

(!PrevTemplate) {

10216 Diag

(

D

.getIdentifierLoc(), diag::err_explicit_instantiation_not_known)

10220 Diag

((*P)->getLocation(), diag::note_explicit_instantiation_here);

10226 Diag

(

D

.getIdentifierLoc(),

10227

diag::err_explicit_instantiation_data_member_not_instantiated)

10229 Diag

(Prev->

getLocation

(), diag::note_explicit_instantiation_here);

10242 Diag

(

T

->getTypeLoc().getBeginLoc(),

10243

diag::err_auto_not_allowed_var_inst);

10251 Diag

(

D

.getIdentifierLoc(),

10252

diag::err_explicit_instantiation_without_template_id)

10254 Diag

(PrevTemplate->getLocation(),

10255

diag::note_explicit_instantiation_here);

10264 D

.getIdentifierLoc(), TemplateArgs);

10272 Diag

(

D

.getIdentifierLoc(), diag::err_explicit_instantiation_dependent);

10278

Prev = cast<VarDecl>(Res.

get

());

10292 Diag

(

D

.getIdentifierLoc(),

10293

diag::ext_explicit_instantiation_without_qualified_id)

10294

<< Prev <<

D

.getCXXScopeSpec().getRange();

10301 bool

HasNoEffect =

false

;

10303

PrevTSK, POI, HasNoEffect))

10306 if

(!HasNoEffect) {

10309 if

(

auto

*VTSD = dyn_cast<VarTemplatePartialSpecializationDecl>(Prev)) {

10310

VTSD->setExternKeywordLoc(ExternLoc);

10311

VTSD->setTemplateKeywordLoc(TemplateLoc);

10325 Diag

(

T

->getTypeLoc().getBeginLoc(),

10326

diag::err_invalid_var_template_spec_type)

10327

<< 0 << PrevTemplate << R << Prev->

getType

();

10328 Diag

(PrevTemplate->getLocation(), diag::note_template_declared_here)

10329

<< 2 << PrevTemplate->getDeclName();

10334 return

(

Decl

*)

nullptr

;

10339 bool

HasExplicitTemplateArgs =

false

;

10343

HasExplicitTemplateArgs =

true

;

10356 P

!= PEnd; ++

P

) {

10358 if

(!HasExplicitTemplateArgs) {

10359 if

(

CXXMethodDecl

*Method = dyn_cast<CXXMethodDecl>(Prev)) {

10363 if

(Method->getPrimaryTemplate()) {

10364

TemplateMatches.

addDecl

(Method,

P

.getAccess());

10367 C

.FoundDecl =

P

.getPair();

10368 C

.Function = Method;

10371 if

(Method->getTrailingRequiresClause() &&

10375 C

.Viable =

false

;

10390

FunTmpl, (HasExplicitTemplateArgs ? &TemplateArgs :

nullptr

), R,

10421 if

(!NonTemplateMatches.

empty

()) {

10432

Msg = diag::err_explicit_instantiation_ambiguous;

10436

Msg = diag::err_explicit_instantiation_no_candidate;

10452

TemplateMatches.

begin

(), TemplateMatches.

end

(),

10453

FailedTemplateCandidates,

D

.getIdentifierLoc(),

10454 PDiag

(diag::err_explicit_instantiation_not_known) << Name,

10455 PDiag

(diag::err_explicit_instantiation_ambiguous) << Name,

10456 PDiag

(diag::note_explicit_instantiation_candidate));

10458 if

(

Result

== TemplateMatches.

end

())

10472 if

(FPT->hasExceptionSpec()) {

10474

diag::err_mismatched_exception_spec_explicit_instantiation;

10476

DiagID = diag::ext_mismatched_exception_spec_explicit_instantiation;

10479 PDiag

(diag::note_explicit_instantiation_here),

10489 Diag

(

D

.getIdentifierLoc(),

10490

diag::err_explicit_instantiation_member_function_not_instantiated)

10499 if

(!PrevDecl &&

Specialization

->isThisDeclarationADefinition())

10503 bool

HasNoEffect =

false

;

10514 return

(

Decl

*)

nullptr

;

10525 if

(

auto

*RD = dyn_cast<CXXRecordDecl>(

Specialization

->getDeclContext()))

10526 if

(RD->getIdentifier() && RD->getIdentifier()->isStr(

"valarray"

) &&

10527

RD->isInStdNamespace())

10528 return

(

Decl

*)

nullptr

;

10541 Specialization

->setTemplateSpecializationKind(TSK,

D

.getIdentifierLoc());

10559 D

.getCXXScopeSpec().isSet() &&

10561 Diag

(

D

.getIdentifierLoc(),

10562

diag::ext_explicit_instantiation_without_qualified_id)

10569 D

.getIdentifierLoc(),

D

.getCXXScopeSpec().isSet(), TSK);

10572 return

(

Decl

*)

nullptr

;

10581

assert(Name &&

"Expected a name in a dependent tag"

);

10590 Diag

(NameLoc, diag::err_dependent_tag_decl)

10617 if

(TypenameLoc.

isValid

() && S && !S->getTemplateParamParent())

10620

diag::warn_cxx98_compat_typename_outside_of_template :

10621

diag::ext_typename_outside_of_template)

10631

TypenameLoc, QualifierLoc, II, IdLoc, &TSI,

10645 if

(TypenameLoc.

isValid

() && S && !S->getTemplateParamParent())

10648

diag::warn_cxx98_compat_typename_outside_of_template :

10649

diag::ext_typename_outside_of_template)

10654 if

(TypenameLoc.

isValid

()) {

10657 if

(LookupRD && LookupRD->getIdentifier() == TemplateII) {

10658 Diag

(TemplateIILoc,

10659

diag::ext_out_of_line_qualified_id_type_names_constructor)

10661

<< (TemplateKWLoc.

isValid

() ? 1 : 0

);

10672

assert(DTN &&

"dependent template has non-dependent name?"

);

10673

assert(DTN->getQualifier() == SS.

getScopeRep

());

10675 if

(!DTN->isIdentifier()) {

10676 Diag

(TemplateIILoc, diag::err_template_id_not_a_type) << Template;

10683

DTN->getIdentifier(), TemplateArgs.

arguments

());

10695 for

(

unsigned

I = 0, N = TemplateArgs.

size

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

10712 for

(

unsigned

I = 0, N = TemplateArgs.

size

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

10730 if

(!II.

isStr

(

"type"

))

10739 if

(!EnableIfTSTLoc || EnableIfTSTLoc.

getNumArgs

() == 0)

10752 if

(!EnableIfII || !EnableIfII->

isStr

(

"enable_if"

))

10780 bool

DeducedTSTContext) {

10782

DeducedTSTContext);

10787 if

(isa<DependentNameType>(

T

)) {

10811

SS.

Adopt

(QualifierLoc);

10814 if

(QualifierLoc) {

10841 unsigned

DiagID = 0;

10842 Decl

*Referenced =

nullptr

;

10843 switch

(

Result

.getResultKind()) {

10848 Expr

*Cond =

nullptr

;

10849 if

(Ctx &&

isEnableIf

(QualifierLoc, II, CondRange, Cond)) {

10854

std::string FailedDescription;

10855

std::tie(FailedCond, FailedDescription) =

10859

diag::err_typename_nested_not_found_requirement)

10860

<< FailedDescription

10866

diag::err_typename_nested_not_found_enable_if)

10867

<< Ctx << CondRange;

10871

DiagID = Ctx ? diag::err_typename_nested_not_found

10872

: diag::err_unknown_typename;

10881 Diag

(IILoc, diag::err_typename_refers_to_using_value_decl)

10882

<< Name << Ctx << FullRange;

10884

= dyn_cast<UnresolvedUsingValueDecl>(

Result

.getRepresentativeDecl())){

10886 Diag

(

Loc

, diag::note_using_value_decl_missing_typename)

10916 auto

*LookupRD = dyn_cast_or_null<CXXRecordDecl>(Ctx);

10917 auto

*FoundRD = dyn_cast<CXXRecordDecl>(

Type

);

10919

FoundRD->isInjectedClassName() &&

10921 Diag

(IILoc, diag::ext_out_of_line_qualified_id_type_names_constructor)

10938 if

(!DeducedTSTContext) {

10943 Diag

(IILoc, diag::err_dependent_deduced_tst)

10946 Diag

(IILoc, diag::err_deduced_tst)

10958

DiagID = Ctx ? diag::err_typename_nested_not_type

10959

: diag::err_typename_not_type;

10960

Referenced =

Result

.getFoundDecl();

10964

DiagID = Ctx ? diag::err_typename_nested_not_type

10965

: diag::err_typename_not_type;

10966

Referenced = *

Result

.begin();

10978 Diag

(IILoc, DiagID) << FullRange << Name << Ctx;

10980 Diag

(IILoc, DiagID) << FullRange << Name;

10983

Ctx ? diag::note_typename_member_refers_here

10984

: diag::note_typename_refers_here)

10991 class

CurrentInstantiationRebuilder

10999

CurrentInstantiationRebuilder(

Sema

&SemaRef,

11003 Loc

(

Loc

), Entity(Entity) { }

11010 bool

AlreadyTransformed(

QualType T

) {

11025

this->Entity = Entity;

11041

CurrentInstantiationRebuilder Rebuilder(*

this

,

Loc

, Name);

11042 return

Rebuilder.TransformType(

T

);

11046

CurrentInstantiationRebuilder Rebuilder(*

this

,

E

->

getExprLoc

(),

11048 return

Rebuilder.TransformExpr(

E

);

11056

CurrentInstantiationRebuilder Rebuilder(*

this

, SS.

getRange

().

getBegin

(),

11059

= Rebuilder.TransformNestedNameSpecifierLoc(QualifierLoc);

11063

SS.

Adopt

(Rebuilt);

11069 for

(

unsigned

I = 0, N = Params->

size

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

11073 if

(isa<TemplateTypeParmDecl>(Param))

11078

= dyn_cast<TemplateTemplateParmDecl>(Param)) {

11080

TTP->getTemplateParameters()))

11122 unsigned

NumArgs) {

11124

llvm::raw_svector_ostream Out(Str);

11126 if

(!Params || Params->

size

() == 0 || NumArgs == 0)

11127 return

std::string();

11129 for

(

unsigned

I = 0, N = Params->

size

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

11139

Out <<

Id

->getName();

11151 return

std::string(Out.str());

11159 auto

LPT = std::make_unique<LateParsedTemplate>();

11162

LPT->Toks.swap(Toks);

11209class

ExplicitSpecializationVisibilityChecker {

11221 if

(

auto

*FD = dyn_cast<FunctionDecl>(ND))

11222 return

checkImpl(FD);

11223 if

(

auto

*RD = dyn_cast<CXXRecordDecl>(ND))

11224 return

checkImpl(RD);

11225 if

(

auto

*VD = dyn_cast<VarDecl>(ND))

11226 return

checkImpl(VD);

11227 if

(

auto

*ED = dyn_cast<EnumDecl>(ND))

11228 return

checkImpl(ED);

11232 void

diagnose(

NamedDecl

*

D

,

bool

IsPartialSpec) {

11233 auto Kind

= IsPartialSpec ? Sema::MissingImportKind::PartialSpecialization

11234

: Sema::MissingImportKind::ExplicitSpecialization;

11235 const bool

Recover =

true

;

11240 if

(Modules.empty())

11246 bool

CheckMemberSpecialization(

const NamedDecl

*

D

) {

11247 return Kind

== Sema::AcceptableKind::Visible

11252 bool

CheckExplicitSpecialization(

const NamedDecl

*

D

) {

11253 return Kind

== Sema::AcceptableKind::Visible

11258 bool

CheckDeclaration(

const NamedDecl

*

D

) {

11275 template

<

typename

SpecDecl>

11276 void

checkImpl(SpecDecl *Spec) {

11277 bool

IsHiddenExplicitSpecialization =

false

;

11279

IsHiddenExplicitSpecialization = Spec->getMemberSpecializationInfo()

11280

? !CheckMemberSpecialization(Spec)

11281

: !CheckExplicitSpecialization(Spec);

11283

checkInstantiated(Spec);

11286 if

(IsHiddenExplicitSpecialization)

11287

diagnose(Spec->getMostRecentDecl(),

false

);

11296 auto

*SD = dyn_cast<ClassTemplateSpecializationDecl>(RD);

11300 auto

From = SD->getSpecializedTemplateOrPartial();

11303 else if

(

auto

*TD =

11305 if

(!CheckDeclaration(TD))

11306

diagnose(TD,

true

);

11311 void

checkInstantiated(

VarDecl

*RD) {

11312 auto

*SD = dyn_cast<VarTemplateSpecializationDecl>(RD);

11316 auto

From = SD->getSpecializedTemplateOrPartial();

11319 else if

(

auto

*TD =

11321 if

(!CheckDeclaration(TD))

11322

diagnose(TD,

true

);

11327 void

checkInstantiated(

EnumDecl

*FD) {}

11329 template

<

typename

TemplDecl>

11330 void

checkTemplate(TemplDecl *TD) {

11331 if

(TD->isMemberSpecialization()) {

11332 if

(!CheckMemberSpecialization(TD))

11333

diagnose(TD->getMostRecentDecl(),

false

);

11343

ExplicitSpecializationVisibilityChecker(*

this

,

Loc

,

11353

ExplicitSpecializationVisibilityChecker(*

this

,

Loc

,

11361 if

(

const auto

*FD = dyn_cast<FunctionDecl>(N)) {

11369 if

(!CSC.isInstantiationRecord() || CSC.PointOfInstantiation.isInvalid())

11371 return

CSC.PointOfInstantiation;

Defines the clang::ASTContext interface.

Defines enum values for all the target-independent builtin functions.

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

static Decl::Kind getKind(const Decl *D)

Defines the C++ template declaration subclasses.

Defines the clang::Expr interface and subclasses for C++ expressions.

Defines the clang::LangOptions interface.

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::Record Record

Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.

MatchFinder::MatchResult MatchResult

static std::string toString(const clang::SanitizerSet &Sanitizers)

Produce a string containing comma-separated names of sanitizers in Sanitizers set.

This file declares semantic analysis for CUDA constructs.

static void SetNestedNameSpecifier(Sema &S, DeclaratorDecl *DD, Declarator &D)

static bool DependsOnTemplateParameters(QualType T, TemplateParameterList *Params)

Determines whether a given type depends on the given parameter list.

static TemplateSpecializationKind getTemplateSpecializationKind(Decl *D)

Determine what kind of template specialization the given declaration is.

static Expr * BuildExpressionFromNonTypeTemplateArgumentValue(Sema &S, QualType T, const APValue &Val, SourceLocation Loc)

static void maybeDiagnoseTemplateParameterShadow(Sema &SemaRef, Scope *S, SourceLocation Loc, const IdentifierInfo *Name)

static TemplateArgumentLoc convertTypeTemplateArgumentToTemplate(ASTContext &Context, TypeLoc TLoc)

Convert a template-argument that we parsed as a type into a template, if possible.

static bool CheckTemplateSpecializationScope(Sema &S, NamedDecl *Specialized, NamedDecl *PrevDecl, SourceLocation Loc, bool IsPartialSpecialization)

Check whether a specialization is well-formed in the current context.

static bool ScopeSpecifierHasTemplateId(const CXXScopeSpec &SS)

Determine whether the given scope specifier has a template-id in it.

static SourceRange findTemplateParameterInType(unsigned Depth, Expr *E)

static Sema::SemaDiagnosticBuilder noteLocation(Sema &S, const NamedDecl &Decl, unsigned HereDiagID, unsigned ExternalDiagID)

static SourceRange getRangeOfTypeInNestedNameSpecifier(ASTContext &Context, QualType T, const CXXScopeSpec &SS)

static Expr * BuildExpressionFromIntegralTemplateArgumentValue(Sema &S, QualType OrigT, const llvm::APSInt &Int, SourceLocation Loc)

Construct a new expression that refers to the given integral template argument with the given source-...

static SourceRange findTemplateParameter(unsigned Depth, TypeLoc TL)

static NullPointerValueKind isNullPointerValueTemplateArgument(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *Arg, Decl *Entity=nullptr)

Determine whether the given template argument is a null pointer value of the appropriate type.

static ExprResult formImmediatelyDeclaredConstraint(Sema &S, NestedNameSpecifierLoc NS, DeclarationNameInfo NameInfo, ConceptDecl *NamedConcept, NamedDecl *FoundDecl, SourceLocation LAngleLoc, SourceLocation RAngleLoc, QualType ConstrainedType, SourceLocation ParamNameLoc, ArgumentLocAppender Appender, SourceLocation EllipsisLoc)

static bool SubstDefaultTemplateArgument(Sema &SemaRef, TemplateDecl *Template, SourceLocation TemplateLoc, SourceLocation RAngleLoc, TemplateTypeParmDecl *Param, ArrayRef< TemplateArgument > SugaredConverted, ArrayRef< TemplateArgument > CanonicalConverted, TemplateArgumentLoc &Output)

Substitute template arguments into the default template argument for the given template type paramete...

static bool CheckNonTypeTemplatePartialSpecializationArgs(Sema &S, SourceLocation TemplateNameLoc, NonTypeTemplateParmDecl *Param, const TemplateArgument *Args, unsigned NumArgs, bool IsDefaultArgument)

Subroutine of Sema::CheckTemplatePartialSpecializationArgs that checks non-type template partial spec...

static void StripImplicitInstantiation(NamedDecl *D, bool MinGW)

Strips various properties off an implicit instantiation that has just been explicitly specialized.

static bool isEnableIf(NestedNameSpecifierLoc NNS, const IdentifierInfo &II, SourceRange &CondRange, Expr *&Cond)

Determine whether this failed name lookup should be treated as being disabled by a usage of std::enab...

static void DiagnoseTemplateParameterListArityMismatch(Sema &S, TemplateParameterList *New, TemplateParameterList *Old, Sema::TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc)

Diagnose a known arity mismatch when comparing template argument lists.

static bool isTemplateArgumentTemplateParameter(const TemplateArgument &Arg, unsigned Depth, unsigned Index)

static QualType builtinCommonTypeImpl(Sema &S, TemplateName BaseTemplate, SourceLocation TemplateLoc, ArrayRef< TemplateArgument > Ts)

static TemplateArgumentListInfo makeTemplateArgumentListInfo(Sema &S, TemplateIdAnnotation &TemplateId)

Convert the parser's template argument list representation into our form.

static bool CheckTemplateArgumentIsCompatibleWithParameter(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *ArgIn, Expr *Arg, QualType ArgType)

Checks whether the given template argument is compatible with its template parameter.

static bool CheckTemplateArgumentAddressOfObjectOrFunction(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *ArgIn, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted)

Checks whether the given template argument is the address of an object or function according to C++ [...

static void collectConjunctionTerms(Expr *Clause, SmallVectorImpl< Expr * > &Terms)

Collect all of the separable terms in the given condition, which might be a conjunction.

static void checkMoreSpecializedThanPrimary(Sema &S, PartialSpecDecl *Partial)

static bool CheckTemplateArgumentPointerToMember(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *&ResultArg, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted)

Checks whether the given template argument is a pointer to member constant according to C++ [temp....

static SourceLocation DiagLocForExplicitInstantiation(NamedDecl *D, SourceLocation PointOfInstantiation)

Compute the diagnostic location for an explicit instantiation.

static bool RemoveLookupResult(LookupResult &R, NamedDecl *C)

static bool isEnableIfAliasTemplate(TypeAliasTemplateDecl *AliasTemplate)

Determine whether this alias template is "enable_if_t".

static bool DiagnoseUnexpandedParameterPacks(Sema &S, TemplateTemplateParmDecl *TTP)

Check for unexpanded parameter packs within the template parameters of a template template parameter,...

static bool CheckExplicitInstantiationScope(Sema &S, NamedDecl *D, SourceLocation InstLoc, bool WasQualifiedName)

Check the scope of an explicit instantiation.

static TemplateArgumentLoc translateTemplateArgument(Sema &SemaRef, const ParsedTemplateArgument &Arg)

static bool isSameAsPrimaryTemplate(TemplateParameterList *Params, ArrayRef< TemplateArgument > Args)

static void checkTemplatePartialSpecialization(Sema &S, PartialSpecDecl *Partial)

static bool CheckExplicitInstantiation(Sema &S, NamedDecl *D, SourceLocation InstLoc, bool WasQualifiedName, TemplateSpecializationKind TSK)

Common checks for whether an explicit instantiation of D is valid.

static Expr * lookThroughRangesV3Condition(Preprocessor &PP, Expr *Cond)

static bool DiagnoseDefaultTemplateArgument(Sema &S, Sema::TemplateParamListContext TPC, SourceLocation ParamLoc, SourceRange DefArgRange)

Diagnose the presence of a default template argument on a template parameter, which is ill-formed in ...

static QualType checkBuiltinTemplateIdType(Sema &SemaRef, BuiltinTemplateDecl *BTD, ArrayRef< TemplateArgument > Converted, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs)

static void noteNonDeducibleParameters(Sema &S, TemplateParameterList *TemplateParams, const llvm::SmallBitVector &DeducibleParams)

static void completeMemberSpecializationImpl(Sema &S, DeclT *OrigD, SourceLocation Loc)

Complete the explicit specialization of a member of a class template by updating the instantiated mem...

static bool diagnoseMissingArgument(Sema &S, SourceLocation Loc, TemplateDecl *TD, const TemplateParmDecl *D, TemplateArgumentListInfo &Args)

Diagnose a missing template argument.

static bool MatchTemplateParameterKind(Sema &S, NamedDecl *New, const Sema::TemplateCompareNewDeclInfo &NewInstFrom, NamedDecl *Old, const NamedDecl *OldInstFrom, bool Complain, Sema::TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc)

Match two template parameters within template parameter lists.

static void dllExportImportClassTemplateSpecialization(Sema &S, ClassTemplateSpecializationDecl *Def)

Make a dllexport or dllimport attr on a class template specialization take effect.

Defines the clang::SourceLocation class and associated facilities.

static const TemplateArgument & getArgument(const TemplateArgument &A)

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

const LValueBase getLValueBase() const

APSInt & getComplexIntImag()

ValueKind getKind() const

APFixedPoint & getFixedPoint()

const ValueDecl * getMemberPointerDecl() const

APValue & getVectorElt(unsigned I)

unsigned getVectorLength() const

bool isMemberPointer() const

std::string getAsString(const ASTContext &Ctx, QualType Ty) const

@ Indeterminate

This object has an indeterminate value (C++ [basic.indet]).

@ None

There is no such object (it's outside its lifetime).

bool isNullPointer() const

APSInt & getComplexIntReal()

APFloat & getComplexFloatImag()

APFloat & getComplexFloatReal()

virtual bool HandleTopLevelDecl(DeclGroupRef D)

HandleTopLevelDecl - Handle the specified top-level declaration.

virtual void AssignInheritanceModel(CXXRecordDecl *RD)

Callback invoked when an MSInheritanceAttr has been attached to a CXXRecordDecl.

Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...

TranslationUnitDecl * getTranslationUnitDecl() const

unsigned getIntWidth(QualType T) const

QualType getDependentTemplateSpecializationType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, const IdentifierInfo *Name, ArrayRef< TemplateArgumentLoc > Args) const

TemplateArgument getCanonicalTemplateArgument(const TemplateArgument &Arg) const

Retrieve the "canonical" template argument.

DeclarationNameTable DeclarationNames

QualType getTemplateSpecializationType(TemplateName T, ArrayRef< TemplateArgument > Args, QualType Canon=QualType()) const

QualType getInjectedClassNameType(CXXRecordDecl *Decl, QualType TST) const

getInjectedClassNameType - Return the unique reference to the injected class name type for the specif...

CanQualType getCanonicalType(QualType T) const

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

bool hasSameType(QualType T1, QualType T2) const

Determine whether the given types T1 and T2 are equivalent.

TemplateName getQualifiedTemplateName(NestedNameSpecifier *NNS, bool TemplateKeyword, TemplateName Template) const

Retrieve the template name that represents a qualified template name such as std::vector.

TemplateName getCanonicalTemplateName(TemplateName Name, bool IgnoreDeduced=false) const

Retrieves the "canonical" template name that refers to a given template.

QualType getPointerType(QualType T) const

Return the uniqued reference to the type for a pointer 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 getDecayedType(QualType T) const

Return the uniqued reference to the decayed version of the given type.

QualType getBaseElementType(const ArrayType *VAT) const

Return the innermost element type of an array type.

QualType getCanonicalTemplateSpecializationType(TemplateName T, ArrayRef< TemplateArgument > Args) const

QualType getDeducedTemplateSpecializationType(TemplateName Template, QualType DeducedType, bool IsDependent) const

C++17 deduced class template specialization type.

CanQualType UnresolvedTemplateTy

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

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

bool isSameEntity(const NamedDecl *X, const NamedDecl *Y) const

Determine whether the two declarations refer to the same entity.

TypeSourceInfo * getTemplateSpecializationTypeInfo(TemplateName T, SourceLocation TLoc, const TemplateArgumentListInfo &Args, QualType Canon=QualType()) const

QualType getQualifiedType(SplitQualType split) const

Un-split a SplitQualType.

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

bool hasSameUnqualifiedType(QualType T1, QualType T2) const

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

uint64_t getTypeSize(QualType T) const

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

TemplateName getDependentTemplateName(NestedNameSpecifier *NNS, const IdentifierInfo *Name) const

Retrieve the template name that represents a dependent template name such as MetaFun::template apply.

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

Allocate an uninitialized TypeSourceInfo.

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

bool hasSimilarType(QualType T1, QualType T2) const

Determine if two types are similar, according to the C++ rules.

const TargetInfo & getTargetInfo() const

TemplateName getOverloadedTemplateName(UnresolvedSetIterator Begin, UnresolvedSetIterator End) const

Retrieve the template name that corresponds to a non-empty lookup.

QualType getUnconstrainedType(QualType T) const

Remove any type constraints from a template parameter type, for equivalence comparison of template pa...

void setPrimaryMergedDecl(Decl *D, Decl *Primary)

TemplateName getAssumedTemplateName(DeclarationName Name) const

Retrieve a template name representing an unqualified-id that has been assumed to name a template for ...

Represents a constant array type that does not decay to a pointer when used as a function parameter.

A structure for storing the information associated with a name that has been assumed to be a template...

DeclarationName getDeclName() const

Get the name of the template.

Attr - This represents one attribute.

AutoTypeKeyword getAutoKeyword() const

const NestedNameSpecifierLoc getNestedNameSpecifierLoc() const

SourceLocation getRAngleLoc() const

ConceptDecl * getNamedConcept() const

SourceLocation getLAngleLoc() const

NamedDecl * getFoundDecl() const

DeclarationNameInfo getConceptNameInfo() const

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

bool isDecltypeAuto() const

A fixed int type of a specified bitwidth.

Represents the builtin template declaration which is used to implement __make_integer_seq and other b...

BuiltinTemplateKind getBuiltinTemplateKind() const

This class is used for builtin types like 'int'.

static CStyleCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind K, Expr *Op, const CXXCastPath *BasePath, FPOptionsOverride FPO, TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation R)

static CXXBoolLiteralExpr * Create(const ASTContext &C, bool Val, QualType Ty, SourceLocation Loc)

Represents a C++ member access expression where the actual member referenced could not be resolved be...

static CXXDependentScopeMemberExpr * Create(const ASTContext &Ctx, Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierFoundInScope, DeclarationNameInfo MemberNameInfo, const TemplateArgumentListInfo *TemplateArgs)

Represents a static or instance method of a struct/union/class.

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

Represents a C++ struct/union/class.

CXXRecordDecl * getMostRecentDecl()

CXXRecordDecl * getInstantiatedFromMemberClass() const

If this record is an instantiation of a member class, retrieves the member class from which it was in...

CXXRecordDecl * getDefinition() const

static CXXRecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, CXXRecordDecl *PrevDecl=nullptr, bool DelayTypeCreation=false)

TemplateSpecializationKind getTemplateSpecializationKind() const

Determine whether this particular class is a specialization or instantiation of a class template or m...

void setDescribedClassTemplate(ClassTemplateDecl *Template)

MemberSpecializationInfo * getMemberSpecializationInfo() const

If this class is an instantiation of a member class of a class template specialization,...

void setTemplateSpecializationKind(TemplateSpecializationKind TSK)

Set the kind of specialization or template instantiation this is.

CXXRecordDecl * getPreviousDecl()

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.

char * location_data() const

Retrieve the data associated with the source-location information.

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.

void Adopt(NestedNameSpecifierLoc Other)

Adopt an existing nested-name-specifier (with source-range information).

A Microsoft C++ __uuidof expression, which gets the _GUID that corresponds to the supplied type or ex...

Declaration of a class template.

CXXRecordDecl * getTemplatedDecl() const

Get the underlying class declarations of the template.

static ClassTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)

Create a class template node.

ClassTemplateDecl * getInstantiatedFromMemberTemplate() const

QualType getInjectedClassNameSpecialization()

Retrieve the template specialization type of the injected-class-name for this class template.

ClassTemplatePartialSpecializationDecl * getInstantiatedFromMember() const

Retrieve the member class template partial specialization from which this particular class template p...

static ClassTemplatePartialSpecializationDecl * Create(ASTContext &Context, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, TemplateParameterList *Params, ClassTemplateDecl *SpecializedTemplate, ArrayRef< TemplateArgument > Args, QualType CanonInjectedType, ClassTemplatePartialSpecializationDecl *PrevDecl)

void setMemberSpecialization()

Note that this member template is a specialization.

Represents a class template specialization, which refers to a class template with a given set of temp...

SourceLocation getPointOfInstantiation() const

Get the point of instantiation (if any), or null if none.

static ClassTemplateSpecializationDecl * Create(ASTContext &Context, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, ClassTemplateDecl *SpecializedTemplate, ArrayRef< TemplateArgument > Args, ClassTemplateSpecializationDecl *PrevDecl)

void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)

Set the template argument list as written in the sources.

Complex values, per C99 6.2.5p11.

Declaration of a C++20 concept.

Expr * getConstraintExpr() const

bool isTypeConcept() const

ConceptDecl * getCanonicalDecl() override

Retrieves the "canonical" declaration of the given declaration.

static ConceptDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, Expr *ConstraintExpr=nullptr)

static ConceptReference * Create(const ASTContext &C, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, NamedDecl *FoundDecl, ConceptDecl *NamedConcept, const ASTTemplateArgumentListInfo *ArgsAsWritten)

static ConceptSpecializationExpr * Create(const ASTContext &C, ConceptReference *ConceptRef, ImplicitConceptSpecializationDecl *SpecDecl, const ConstraintSatisfaction *Satisfaction)

const TypeClass * getTypePtr() const

Represents the canonical version of C arrays with a specified constant size.

static ConstantExpr * Create(const ASTContext &Context, Expr *E, const APValue &Result)

Represents a concrete matrix type with constant number of rows and columns.

The result of a constraint satisfaction check, containing the necessary information to diagnose an un...

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)

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

isTransparentContext - Determines whether this context is a "transparent" context,...

bool isDependentContext() const

Determines whether this context is dependent on a template parameter.

bool InEnclosingNamespaceSetOf(const DeclContext *NS) const

Test if this context is part of the enclosing namespace set of the context NS, as defined in C++0x [n...

bool isTranslationUnit() const

DeclContext * getRedeclContext()

getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...

void addDecl(Decl *D)

Add the declaration D into this context.

DeclContext * getEnclosingNamespaceContext()

Retrieve the nearest enclosing namespace context.

bool isFunctionOrMethod() const

DeclContext * getLookupParent()

Find the parent context of this context that will be used for unqualified name lookup.

bool Encloses(const DeclContext *DC) const

Determine whether this declaration context encloses the declaration context DC.

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

NestedNameSpecifier * getQualifier() const

If the name was qualified, retrieves the nested-name-specifier that precedes the name.

Captures information about "declaration specifiers".

bool isVirtualSpecified() const

bool isNoreturnSpecified() const

SourceLocation getStorageClassSpecLoc() const

SCS getStorageClassSpec() const

SourceLocation getNoreturnSpecLoc() const

SourceLocation getExplicitSpecLoc() const

TSCS getThreadStorageClassSpec() const

bool isInlineSpecified() const

SourceLocation getThreadStorageClassSpecLoc() const

SourceLocation getVirtualSpecLoc() const

SourceLocation getConstexprSpecLoc() const

SourceLocation getInlineSpecLoc() const

bool hasExplicitSpecifier() const

bool hasConstexprSpecifier() const

Decl - This represents one declaration (or definition), e.g.

Decl * getPreviousDecl()

Retrieve the previous declaration that declares the same entity as this declaration,...

FriendObjectKind getFriendObjectKind() const

Determines whether this declaration is the object of a friend declaration and, if so,...

bool isParameterPack() const

Whether this declaration is a parameter pack.

void setInvalidDecl(bool Invalid=true)

setInvalidDecl - Indicates the Decl had a semantic error.

@ FOK_None

Not a friend object.

bool isTemplated() const

Determine whether this declaration is a templated entity (whether it is.

Module * getOwningModule() const

Get the module that owns this declaration (for visibility purposes).

FunctionDecl * getAsFunction() LLVM_READONLY

Returns the function itself, or the templated function if this is a function template.

Module * getImportedOwningModule() const

Get the imported owning module, if this decl is from an imported (non-local) module.

static DeclContext * castToDeclContext(const Decl *)

void setObjectOfFriendDecl(bool PerformFriendInjection=false)

Changes the namespace of this declaration to reflect that it's the object of a friend declaration.

bool isTemplateParameter() const

isTemplateParameter - Determines whether this declaration is a template parameter.

bool isInvalidDecl() const

void setAccess(AccessSpecifier AS)

SourceLocation getLocation() const

bool isTemplateParameterPack() const

isTemplateParameter - Determines whether this declaration is a template parameter pack.

DeclContext * getDeclContext()

AccessSpecifier getAccess() const

SourceLocation getBeginLoc() const LLVM_READONLY

void print(raw_ostream &Out, unsigned Indentation=0, bool PrintInstantiation=false) const

DeclContext * getLexicalDeclContext()

getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).

void setLexicalDeclContext(DeclContext *DC)

virtual Decl * getCanonicalDecl()

Retrieves the "canonical" declaration of the given declaration.

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.

void setTypeSourceInfo(TypeSourceInfo *TI)

TypeSourceInfo * getTypeSourceInfo() const

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

Represents the type decltype(expr) (C++11).

Represents a C++17 deduced template specialization type.

Common base class for placeholders for types that get replaced by placeholder type deduction: C++11 a...

Represents an extended address space qualifier where the input address space value is dependent.

void setNameLoc(SourceLocation Loc)

void setElaboratedKeywordLoc(SourceLocation Loc)

void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)

Represents a qualified type name for which the type name is dependent.

A qualified reference to a name whose declaration cannot yet be resolved.

static DependentScopeDeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs)

Represents an array type in C++ whose size is a value-dependent expression.

Represents an extended vector type where either the type or size is dependent.

Represents a matrix type where the type and the number of rows and columns is dependent on a template...

Represents a dependent template name that cannot be resolved prior to template instantiation.

bool isIdentifier() const

Determine whether this template name refers to an identifier.

NestedNameSpecifier * getQualifier() const

Return the nested name specifier that qualifies this name.

const IdentifierInfo * getIdentifier() const

Returns the identifier to which this template name refers.

void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)

unsigned getNumArgs() const

void setTemplateKeywordLoc(SourceLocation Loc)

void setElaboratedKeywordLoc(SourceLocation Loc)

void setRAngleLoc(SourceLocation Loc)

void setLAngleLoc(SourceLocation Loc)

void setArgLocInfo(unsigned i, TemplateArgumentLocInfo AI)

void setTemplateNameLoc(SourceLocation Loc)

Represents a template specialization type whose template cannot be resolved, e.g.

Represents a vector type where either the type or size is dependent.

Recursive AST visitor that supports extension via dynamic dispatch.

virtual bool TraverseStmt(MaybeConst< Stmt > *S)

Recursively visit a statement or expression, by dispatching to Traverse*() based on the argument's dy...

virtual bool TraverseTypeLoc(TypeLoc TL)

Recursively visit a type with location, by dispatching to Traverse*TypeLoc() based on the argument ty...

virtual bool TraverseTemplateName(TemplateName Template)

Recursively visit a template name and dispatch to the appropriate method.

void setElaboratedKeywordLoc(SourceLocation Loc)

TypeLoc getNamedTypeLoc() const

void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)

RAII object that enters a new expression evaluation context.

MemberSpecializationInfo * getMemberSpecializationInfo() const

If this enumeration is an instantiation of a member enumeration of a class template specialization,...

EnumDecl * getInstantiatedFromMemberEnum() const

Returns the enumeration (declared within the template) from which this enumeration type was instantia...

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

This represents one expression.

Expr * IgnoreParenCasts() LLVM_READONLY

Skip past any parentheses and casts which might surround this expression until reaching a fixed point...

bool isValueDependent() const

Determines whether the value of this expression depends on.

ExprValueKind getValueKind() const

getValueKind - The value kind that this expression produces.

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

bool isLValue() const

isLValue - True if this expression is an "l-value" according to the rules of the current language.

@ NPC_NeverValueDependent

Specifies that the expression should never be value-dependent.

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

Expr * IgnoreImpCasts() LLVM_READONLY

Skip past any implicit casts which might surround this expression until reaching a fixed point.

NullPointerConstantKind isNullPointerConstant(ASTContext &Ctx, NullPointerConstantValueDependence NPC) const

isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to a Null pointer constant.

SourceLocation getExprLoc() const LLVM_READONLY

getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...

ExtVectorType - Extended vector type.

Represents a member of a struct/union/class.

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.

static FixedPointLiteral * CreateFromRawInt(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l, unsigned Scale)

static FloatingLiteral * Create(const ASTContext &C, const llvm::APFloat &V, bool isexact, QualType Type, SourceLocation L)

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={})

Represents a function declaration or definition.

ConstexprSpecKind getConstexprKind() const

bool isFunctionTemplateSpecialization() const

Determine whether this function is a function template specialization.

SourceLocation getPointOfInstantiation() const

Retrieve the (first) point of instantiation of a function template specialization or a member of a cl...

FunctionTemplateDecl * getPrimaryTemplate() const

Retrieve the primary template that this function template specialization either specializes or was in...

MemberSpecializationInfo * getMemberSpecializationInfo() const

If this function is an instantiation of a member function of a class template specialization,...

FunctionDecl * getCanonicalDecl() override

Retrieves the "canonical" declaration of the given declaration.

bool isDeleted() const

Whether this function has been deleted.

TemplatedKind getTemplatedKind() const

What kind of templated function this is.

void setDependentTemplateSpecialization(ASTContext &Context, const UnresolvedSetImpl &Templates, const TemplateArgumentListInfo *TemplateArgs)

Specifies that this function declaration is actually a dependent function template specialization.

void setLateTemplateParsed(bool ILT=true)

State that this templated function will be late parsed.

TemplateSpecializationKind getTemplateSpecializationKind() const

Determine what kind of template instantiation this function represents.

void setDeletedAsWritten(bool D=true, StringLiteral *Message=nullptr)

FunctionDecl * getInstantiatedFromMemberFunction() const

If this function is an instantiation of a member function of a class template specialization,...

Represents a K&R-style 'int foo()' function, which has no information available about its arguments.

Represents a prototype with parameter type info, e.g.

ExtProtoInfo getExtProtoInfo() const

ArrayRef< QualType > getParamTypes() const

ArrayRef< QualType > param_types() const

Declaration of a template function.

FunctionDecl * getTemplatedDecl() const

Get the underlying function declaration of the template.

Provides information about a function template specialization, which is a FunctionDecl that has been ...

bool isExplicitSpecialization() const

void setTemplateSpecializationKind(TemplateSpecializationKind TSK)

Set the template specialization kind.

SourceLocation getPointOfInstantiation() const

Retrieve the first point of instantiation of this function template specialization.

TemplateSpecializationKind getTemplateSpecializationKind() const

Determine what kind of template specialization this is.

QualType getReturnType() const

One of these records is kept for each identifier that is lexed.

bool isStr(const char(&Str)[StrLen]) const

Return true if this is the identifier for the specified string.

StringRef getName() const

Return the actual identifier string.

void AddDecl(NamedDecl *D)

AddDecl - Link the decl to its shadowed decl chain.

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

static ImplicitConceptSpecializationDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation SL, ArrayRef< TemplateArgument > ConvertedArgs)

Represents a C array with an unspecified size.

const TypeClass * getTypePtr() const

Describes an C or C++ initializer list.

Describes the kind of initialization being performed, along with location information for tokens rela...

static InitializationKind CreateForInit(SourceLocation Loc, bool DirectInit, Expr *Init)

Create an initialization from an initializer (which, for direct initialization from a parenthesized l...

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 InitializeTemplateParameter(QualType T, NonTypeTemplateParmDecl *Param)

Create the initialization entity for a template parameter.

Wrapper for source info for injected class names of class templates.

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

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

Represents a linkage specification.

A stack-allocated class that identifies which local variable declaration instantiations are present i...

NamedDecl * getPartiallySubstitutedPack(const TemplateArgument **ExplicitArgs=nullptr, unsigned *NumExplicitArgs=nullptr) const

Retrieve the partially-substitued template parameter pack.

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.

bool wasNotFoundInCurrentInstantiation() const

Determine whether no result was found because we could not search into dependent base classes of the ...

LLVM_ATTRIBUTE_REINITIALIZES void clear()

Clears out any current state.

void setTemplateNameLookup(bool TemplateName)

Sets whether this is a template-name lookup.

DeclClass * getAsSingle() const

bool empty() const

Return true if no decls were found.

SourceLocation getNameLoc() const

Gets the location of the identifier.

Filter makeFilter()

Create a filter for this result set.

NamedDecl * getFoundDecl() const

Fetch the unique decl found by this lookup.

bool isSingleResult() const

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

CXXRecordDecl * getNamingClass() const

Returns the 'naming class' for this lookup, i.e.

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.

DeclarationName getLookupName() const

Gets the name to look up.

const DeclarationNameInfo & getLookupNameInfo() const

Gets the name info to look up.

A pointer to member type per C++ 8.3.3 - Pointers to members.

QualType getPointeeType() const

Provides information a specialization of a member of a class template, which may be a member function...

TemplateSpecializationKind getTemplateSpecializationKind() const

Determine what kind of template specialization this is.

SourceLocation getPointOfInstantiation() const

Retrieve the first point of instantiation of this member.

std::string getFullModuleName(bool AllowStringLiterals=false) const

Retrieve the full name of this module, including the path from its top-level module.

Data structure that captures multiple levels of template argument lists for use in template instantia...

const ArgList & getInnermost() const

Retrieve the innermost template argument list.

void addOuterTemplateArguments(Decl *AssociatedDecl, ArgList Args, bool Final)

Add a new outmost level to the multi-level template argument list.

void addOuterRetainedLevels(unsigned Num)

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.

StringRef getName() const

Get the name of identifier for this declaration as a StringRef.

DeclarationName getDeclName() const

Get the actual, stored name of the declaration, which may be a special name.

NamedDecl * getMostRecentDecl()

Linkage getFormalLinkage() const

Get the linkage from a semantic point of view.

void setModulePrivate()

Specify that this declaration was marked as being private to the module in which it was defined.

bool hasLinkage() const

Determine whether this declaration has linkage.

Represent a C++ namespace.

A C++ nested-name-specifier augmented with source location information.

TypeLoc getTypeLoc() const

For a nested-name-specifier that refers to a type, retrieve the type with source-location information...

NestedNameSpecifierLoc getPrefix() const

Return the prefix of this nested-name-specifier.

NestedNameSpecifier * getNestedNameSpecifier() const

Retrieve the nested-name-specifier to which this instance refers.

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.

SpecifierKind getKind() const

Determine what kind of nested name specifier is stored.

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

Builds a specifier combining a prefix and an identifier.

NestedNameSpecifier * getPrefix() const

Return the prefix of this nested name specifier.

@ NamespaceAlias

A namespace alias, stored as a NamespaceAliasDecl*.

@ TypeSpec

A type, stored as a Type*.

@ TypeSpecWithTemplate

A type that was preceded by the 'template' keyword, stored as a Type*.

@ Super

Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.

@ Identifier

An identifier, stored as an IdentifierInfo*.

@ Global

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

@ Namespace

A namespace, stored as a NamespaceDecl*.

const Type * getAsType() const

Retrieve the type stored in this nested name specifier.

NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.

SourceLocation getDefaultArgumentLoc() const

Retrieve the location of the default argument, if any.

bool hasDefaultArgument() const

Determine whether this template parameter has a default argument.

const TemplateArgumentLoc & getDefaultArgument() const

Retrieve the default argument, if any.

static NonTypeTemplateParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, unsigned D, unsigned P, const IdentifierInfo *Id, QualType T, bool ParameterPack, TypeSourceInfo *TInfo)

bool isParameterPack() const

Whether this parameter is a non-type template parameter pack.

unsigned getIndex() const

Get the index of the template parameter within its parameter list.

unsigned getDepth() const

Get the nesting depth of the template parameter.

void setPlaceholderTypeConstraint(Expr *E)

void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)

Set the default argument for this template parameter, and whether that default argument was inherited...

Interfaces are the core concept in Objective-C for object oriented design.

Represents a pointer to an Objective C object.

Represents a class type in Objective C.

static OpaquePtr make(TemplateName P)

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.

SmallVectorImpl< OverloadCandidate >::iterator iterator

void NoteCandidates(PartialDiagnosticAt PA, Sema &S, OverloadCandidateDisplayKind OCD, ArrayRef< Expr * > Args, StringRef Opc="", SourceLocation Loc=SourceLocation(), llvm::function_ref< bool(OverloadCandidate &)> Filter=[](OverloadCandidate &) { return true;})

When overload resolution fails, prints diagnostic messages containing the candidates in the candidate...

OverloadingResult BestViableFunction(Sema &S, SourceLocation Loc, OverloadCandidateSet::iterator &Best)

Find the best viable function on this overload set, if it exists.

OverloadCandidate & addCandidate(unsigned NumConversions=0, ConversionSequenceList Conversions={})

Add a new candidate with NumConversions conversion sequence slots to the overload set.

A structure for storing the information associated with an overloaded template name.

NamedDecl *const * iterator

Represents a C++11 pack expansion that produces a sequence of expressions.

Represents a pack expansion of types.

A single parameter index whose accessors require each use to make explicit the parameter index encodi...

ParenExpr - This represents a parenthesized expression, e.g.

ParsedAttr - Represents a syntactic attribute.

Represents the parsed form of a C++ template argument.

KindType getKind() const

Determine what kind of template argument we have.

SourceLocation getLocation() const

Retrieve the location of the template argument.

ParsedTemplateTy getAsTemplate() const

Retrieve the template template argument's template name.

ParsedTemplateArgument getTemplatePackExpansion(SourceLocation EllipsisLoc) const

Retrieve a pack expansion of the given template template argument.

ParsedType getAsType() const

Retrieve the template type argument's type.

@ Type

A template type parameter, stored as a type.

@ Template

A template template argument, stored as a template name.

@ NonType

A non-type template parameter, stored as an expression.

SourceLocation getEllipsisLoc() const

Retrieve the location of the ellipsis that makes a template template argument into a pack expansion.

Expr * getAsExpr() const

Retrieve the non-type template argument's expression.

const CXXScopeSpec & getScopeSpec() const

Retrieve the nested-name-specifier that precedes the template name in a template template argument.

PointerType - C99 6.7.5.1 - Pointer Declarators.

QualType getPointeeType() const

Engages in a tight little dance with the lexer to efficiently preprocess tokens.

StringRef getImmediateMacroName(SourceLocation Loc)

Retrieve the name of the immediate macro expansion.

A (possibly-)qualified type.

bool hasQualifiers() const

Determine whether this type has any qualifiers.

QualType getNonLValueExprType(const ASTContext &Context) const

Determine the type of a (typically non-lvalue) expression with the specified result type.

void addConst()

Add the const type qualifier to this QualType.

bool isNull() const

Return true if this QualType doesn't point to a type yet.

const Type * getTypePtr() const

Retrieves a pointer to the underlying (unqualified) type.

Qualifiers::ObjCLifetime getObjCLifetime() const

Returns lifetime attribute of this type.

QualType getNonReferenceType() const

If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...

QualType getUnqualifiedType() const

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

void * getAsOpaquePtr() const

QualType getNonPackExpansionType() const

Remove an outer pack expansion type (if any) from this type.

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)

The collection of all-type qualifiers we support.

@ OCL_Strong

Assigning into this object requires the old value to be released and the new value to be retained.

void setObjCLifetime(ObjCLifetime type)

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

Represents a struct/union/class.

RecordDecl * getDefinition() const

Returns the RecordDecl that actually defines this struct/union/class.

Wrapper for source info for record types.

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

bool isMemberSpecialization() const

Determines whether this template was a specialization of a member template.

void setMemberSpecialization()

Note that this member template is a specialization.

decl_type * getPreviousDecl()

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

void setPreviousDecl(decl_type *PrevDecl)

Set the previous declaration.

Base for LValueReferenceType and RValueReferenceType.

QualType getPointeeType() const

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

unsigned getFlags() const

getFlags - Return the flags for this scope.

const Scope * getParent() const

getParent - Return the scope that this is nested in.

@ TemplateParamScope

This is a scope that corresponds to the template parameters of a C++ template.

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.

CUDAFunctionTarget IdentifyTarget(const FunctionDecl *D, bool IgnoreImplicitHDAttr=false)

Determines whether the given function is a CUDA device/host/kernel/etc.

void inheritTargetAttrs(FunctionDecl *FD, const FunctionTemplateDecl &TD)

Copies target attributes from the template TD to the function FD.

RAII object used to change the argument pack substitution index within a Sema object.

RAII object used to temporarily allow the C++ 'this' expression to be used, with the given qualifiers...

Whether and why a template name is required in this lookup.

SourceLocation getTemplateKeywordLoc() const

bool hasTemplateKeyword() const

RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...

bool hasErrorOccurred() const

Determine whether any SFINAE errors have been trapped.

Abstract base class used for diagnosing integer constant expression violations.

Sema - This implements semantic analysis and AST building for C.

bool hasReachableDefinition(NamedDecl *D, NamedDecl **Suggested, bool OnlyNeedComplete=false)

Determine if D has a reachable definition.

ParsedType CreateParsedType(QualType T, TypeSourceInfo *TInfo)

Package the given type and TSI into a ParsedType.

VarTemplateSpecializationDecl * BuildVarTemplateInstantiation(VarTemplateDecl *VarTemplate, VarDecl *FromVar, const TemplateArgumentList *PartialSpecArgs, const TemplateArgumentListInfo &TemplateArgsInfo, SmallVectorImpl< TemplateArgument > &Converted, SourceLocation PointOfInstantiation, LateInstantiatedAttrVec *LateAttrs=nullptr, LocalInstantiationScope *StartingScope=nullptr)

QualType getCurrentThisType()

Try to retrieve the type of the 'this' pointer.

DeclResult ActOnClassTemplateSpecialization(Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc, SourceLocation ModulePrivateLoc, CXXScopeSpec &SS, TemplateIdAnnotation &TemplateId, const ParsedAttributesView &Attr, MultiTemplateParamsArg TemplateParameterLists, SkipBodyInfo *SkipBody=nullptr)

ConceptDecl * ActOnStartConceptDefinition(Scope *S, MultiTemplateParamsArg TemplateParameterLists, const IdentifierInfo *Name, SourceLocation NameLoc)

SmallVector< CodeSynthesisContext, 16 > CodeSynthesisContexts

List of active code synthesis contexts.

LocalInstantiationScope * CurrentInstantiationScope

The current instantiation scope used to store local variables.

sema::CapturingScopeInfo * getEnclosingLambdaOrBlock() const

Get the innermost lambda or block enclosing the current location, if any.

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.

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

ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp=false)

LookupNameKind

Describes the kind of name lookup to perform.

@ LookupOrdinaryName

Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....

@ LookupMemberName

Member name lookup, which finds the names of class/struct/union members.

@ LookupTagName

Tag name lookup, which finds the names of enums, classes, structs, and unions.

ExprResult ActOnConstantExpression(ExprResult Res)

TemplateName SubstTemplateName(NestedNameSpecifierLoc QualifierLoc, TemplateName Name, SourceLocation Loc, const MultiLevelTemplateArgumentList &TemplateArgs)

bool LookupTemplateName(LookupResult &R, Scope *S, CXXScopeSpec &SS, QualType ObjectType, bool EnteringContext, RequiredTemplateKind RequiredTemplate=SourceLocation(), AssumedTemplateKind *ATK=nullptr, bool AllowTypoCorrection=true)

bool SetMemberAccessSpecifier(NamedDecl *MemberDecl, NamedDecl *PrevMemberDecl, AccessSpecifier LexicalAS)

SetMemberAccessSpecifier - Set the access specifier of a member.

bool BuildTypeConstraint(const CXXScopeSpec &SS, TemplateIdAnnotation *TypeConstraint, TemplateTypeParmDecl *ConstrainedParameter, SourceLocation EllipsisLoc, bool AllowUnexpandedPack)

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.

TemplateParameterList * ActOnTemplateParameterList(unsigned Depth, SourceLocation ExportLoc, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)

ActOnTemplateParameterList - Builds a TemplateParameterList, optionally constrained by RequiresClause...

TypeResult ActOnTemplateIdType(Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, TemplateTy Template, const IdentifierInfo *TemplateII, SourceLocation TemplateIILoc, SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc, bool IsCtorOrDtorName=false, bool IsClassName=false, ImplicitTypenameContext AllowImplicitTypename=ImplicitTypenameContext::No)

NamedDecl * ActOnTemplateTemplateParameter(Scope *S, SourceLocation TmpLoc, TemplateParameterList *Params, bool Typename, SourceLocation EllipsisLoc, IdentifierInfo *ParamName, SourceLocation ParamNameLoc, unsigned Depth, unsigned Position, SourceLocation EqualLoc, ParsedTemplateArgument DefaultArg)

ActOnTemplateTemplateParameter - Called when a C++ template template parameter (e....

bool ActOnTypeConstraint(const CXXScopeSpec &SS, TemplateIdAnnotation *TypeConstraint, TemplateTypeParmDecl *ConstrainedParameter, SourceLocation EllipsisLoc)

bool hasVisibleDeclaration(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)

Determine whether any declaration of an entity is visible.

bool DiagnoseClassNameShadow(DeclContext *DC, DeclarationNameInfo Info)

DiagnoseClassNameShadow - Implement C++ [class.mem]p13: If T is the name of a class,...

void NoteAllFoundTemplates(TemplateName Name)

bool DiagnoseUninstantiableTemplate(SourceLocation PointOfInstantiation, NamedDecl *Instantiation, bool InstantiatedFromMember, const NamedDecl *Pattern, const NamedDecl *PatternDef, TemplateSpecializationKind TSK, bool Complain=true)

Determine whether we would be unable to instantiate this template (because it either has no definitio...

TypeResult ActOnDependentTag(Scope *S, unsigned TagSpec, TagUseKind TUK, const CXXScopeSpec &SS, const IdentifierInfo *Name, SourceLocation TagLoc, SourceLocation NameLoc)

TemplateDecl * AdjustDeclIfTemplate(Decl *&Decl)

AdjustDeclIfTemplate - If the given decl happens to be a template, reset the parameter D to reference...

void InstantiateClassTemplateSpecializationMembers(SourceLocation PointOfInstantiation, ClassTemplateSpecializationDecl *ClassTemplateSpec, TemplateSpecializationKind TSK)

Instantiate the definitions of all of the members of the given class template specialization,...

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.

TemplateArgumentLoc SubstDefaultTemplateArgumentIfAvailable(TemplateDecl *Template, SourceLocation TemplateLoc, SourceLocation RAngleLoc, Decl *Param, ArrayRef< TemplateArgument > SugaredConverted, ArrayRef< TemplateArgument > CanonicalConverted, bool &HasDefaultArg)

If the given template parameter has a default template argument, substitute into that default templat...

ExprResult RebuildExprInCurrentInstantiation(Expr *E)

DeclResult ActOnVarTemplateSpecialization(Scope *S, Declarator &D, TypeSourceInfo *DI, LookupResult &Previous, SourceLocation TemplateKWLoc, TemplateParameterList *TemplateParams, StorageClass SC, bool IsPartialSpecialization)

ClassTemplatePartialSpecializationDecl * getMoreSpecializedPartialSpecialization(ClassTemplatePartialSpecializationDecl *PS1, ClassTemplatePartialSpecializationDecl *PS2, SourceLocation Loc)

Returns the more specialized class template partial specialization according to the rules of partial ...

FunctionDecl * getMoreConstrainedFunction(FunctionDecl *FD1, FunctionDecl *FD2)

Returns the more constrained function according to the rules of partial ordering by constraints (C++ ...

void referenceDLLExportedClassMethods()

static NamedDecl * getAsTemplateNameDecl(NamedDecl *D, bool AllowFunctionTemplates=true, bool AllowDependent=true)

Try to interpret the lookup result D as a template-name.

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

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 AddAlignmentAttributesForRecord(RecordDecl *RD)

AddAlignmentAttributesForRecord - Adds any needed alignment attributes to a the record decl,...

bool RequireStructuralType(QualType T, SourceLocation Loc)

Require the given type to be a structural type, and diagnose if it is not.

ExprResult EvaluateConvertedConstantExpression(Expr *E, QualType T, APValue &Value, CCEKind CCE, bool RequireInt, const APValue &PreNarrowingValue)

EvaluateConvertedConstantExpression - Evaluate an Expression That is a converted constant expression ...

ConceptDecl * ActOnFinishConceptDefinition(Scope *S, ConceptDecl *C, Expr *ConstraintExpr, const ParsedAttributesView &Attrs)

FPOptionsOverride CurFPFeatureOverrides()

ExprResult ActOnDependentIdExpression(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, bool isAddressOfOperand, const TemplateArgumentListInfo *TemplateArgs)

ActOnDependentIdExpression - Handle a dependent id-expression that was just parsed.

bool hasVisibleExplicitSpecialization(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)

Determine if there is a visible declaration of D that is an explicit specialization declaration for a...

bool IsInsideALocalClassWithinATemplateFunction()

Decl * ActOnTemplateDeclarator(Scope *S, MultiTemplateParamsArg TemplateParameterLists, Declarator &D)

NamedDecl * LookupSingleName(Scope *S, DeclarationName Name, SourceLocation Loc, LookupNameKind NameKind, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)

Look up a name, looking for a single declaration.

bool CheckConceptUseInDefinition(ConceptDecl *Concept, SourceLocation Loc)

LateParsedTemplateMapT LateParsedTemplateMap

void UnmarkAsLateParsedTemplate(FunctionDecl *FD)

bool isTemplateTemplateParameterAtLeastAsSpecializedAs(TemplateParameterList *PParam, TemplateDecl *PArg, TemplateDecl *AArg, const DefaultArguments &DefaultArgs, SourceLocation ArgLoc, bool PartialOrdering, bool *MatchedPackOnParmToNonPackOnArg)

CheckTemplateArgumentKind

Specifies the context in which a particular template argument is being checked.

@ CTAK_Specified

The template argument was specified in the code or was instantiated with some deduced template argume...

@ CTAK_Deduced

The template argument was deduced via template argument deduction.

void CheckTemplatePartialSpecialization(ClassTemplatePartialSpecializationDecl *Partial)

TemplateNameKind isTemplateName(Scope *S, CXXScopeSpec &SS, bool hasTemplateKeyword, const UnqualifiedId &Name, ParsedType ObjectType, bool EnteringContext, TemplateTy &Template, bool &MemberOfUnknownSpecialization, bool Disambiguation=false)

ParsedTemplateArgument ActOnTemplateTypeArgument(TypeResult ParsedType)

Convert a parsed type into a parsed template argument.

bool DiagnoseUnknownTemplateName(const IdentifierInfo &II, SourceLocation IILoc, Scope *S, const CXXScopeSpec *SS, TemplateTy &SuggestedTemplate, TemplateNameKind &SuggestedKind)

bool IsQualificationConversion(QualType FromType, QualType ToType, bool CStyle, bool &ObjCLifetimeConversion)

IsQualificationConversion - Determines whether the conversion from an rvalue of type FromType to ToTy...

bool ConstraintExpressionDependsOnEnclosingTemplate(const FunctionDecl *Friend, unsigned TemplateDepth, const Expr *Constraint)

bool CheckTemplatePartialSpecializationArgs(SourceLocation Loc, TemplateDecl *PrimaryTemplate, unsigned NumExplicitArgs, ArrayRef< TemplateArgument > Args)

Check the non-type template arguments of a class template partial specialization according to C++ [te...

DeclarationNameInfo GetNameForDeclarator(Declarator &D)

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

DiagnosticsEngine & getDiagnostics() const

ExprResult BuildExpressionFromNonTypeTemplateArgument(const TemplateArgument &Arg, SourceLocation Loc)

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

FunctionDecl * ResolveAddressOfOverloadedFunction(Expr *AddressOfExpr, QualType TargetType, bool Complain, DeclAccessPair &Found, bool *pHadMultipleCandidates=nullptr)

ResolveAddressOfOverloadedFunction - Try to resolve the address of an overloaded function (C++ [over....

void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)

Add this decl to the scope shadowed decl chains.

void checkSpecializationReachability(SourceLocation Loc, NamedDecl *Spec)

bool hasVisibleDefaultArgument(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)

Determine if the template parameter D has a visible default argument.

ASTContext & getASTContext() const

void translateTemplateArguments(const ASTTemplateArgsPtr &In, TemplateArgumentListInfo &Out)

Translates template arguments as provided by the parser into template arguments used by semantic anal...

UnresolvedSetIterator getMostSpecialized(UnresolvedSetIterator SBegin, UnresolvedSetIterator SEnd, TemplateSpecCandidateSet &FailedCandidates, SourceLocation Loc, const PartialDiagnostic &NoneDiag, const PartialDiagnostic &AmbigDiag, const PartialDiagnostic &CandidateDiag, bool Complain=true, QualType TargetType=QualType())

Retrieve the most specialized of the given function template specializations.

bool IsIntegralPromotion(Expr *From, QualType FromType, QualType ToType)

IsIntegralPromotion - Determines whether the conversion from the expression From (whose potentially-a...

TypeSourceInfo * SubstType(TypeSourceInfo *T, const MultiLevelTemplateArgumentList &TemplateArgs, SourceLocation Loc, DeclarationName Entity, bool AllowDeducedTST=false)

Perform substitution on the type T with a given set of template arguments.

bool IsRedefinitionInModule(const NamedDecl *New, const NamedDecl *Old) const

Check the redefinition in C++20 Modules.

bool CheckTemplateTemplateArgument(TemplateTemplateParmDecl *Param, TemplateParameterList *Params, TemplateArgumentLoc &Arg, bool PartialOrdering, bool *MatchedPackOnParmToNonPackOnArg)

Check a template argument against its corresponding template template parameter.

ExprResult BuildTemplateIdExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, bool RequiresADL, const TemplateArgumentListInfo *TemplateArgs)

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.

TemplateParameterList * GetTemplateParameterList(TemplateDecl *TD)

Returns the template parameter list with all default template argument information.

void InstantiateVariableDefinition(SourceLocation PointOfInstantiation, VarDecl *Var, bool Recursive=false, bool DefinitionRequired=false, bool AtEndOfTU=false)

Instantiate the definition of the given variable from its template.

void MarkAsLateParsedTemplate(FunctionDecl *FD, Decl *FnD, CachedTokens &Toks)

bool RequireLiteralType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)

Ensure that the type T is a literal type.

PrintingPolicy getPrintingPolicy() const

Retrieve a suitable printing policy for diagnostics.

bool isAcceptableTagRedeclaration(const TagDecl *Previous, TagTypeKind NewTag, bool isDefinition, SourceLocation NewTagLoc, const IdentifierInfo *Name)

Determine whether a tag with a given kind is acceptable as a redeclaration of the given tag declarati...

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)

unsigned NumSFINAEErrors

The number of SFINAE diagnostics that have been trapped.

TemplateParameterListEqualKind

Enumeration describing how template parameter lists are compared for equality.

@ TPL_TemplateTemplateParmMatch

We are matching the template parameter lists of two template template parameters as part of matching ...

@ TPL_TemplateMatch

We are matching the template parameter lists of two templates that might be redeclarations.

@ TPL_TemplateParamsEquivalent

We are determining whether the template-parameters are equivalent according to C++ [temp....

NamedDecl * ActOnTypeParameter(Scope *S, bool Typename, SourceLocation EllipsisLoc, SourceLocation KeyLoc, IdentifierInfo *ParamName, SourceLocation ParamNameLoc, unsigned Depth, unsigned Position, SourceLocation EqualLoc, ParsedType DefaultArg, bool HasTypeConstraint)

ActOnTypeParameter - Called when a C++ template type parameter (e.g., "typename T") has been parsed.

bool CheckFunctionTemplateSpecialization(FunctionDecl *FD, TemplateArgumentListInfo *ExplicitTemplateArgs, LookupResult &Previous, bool QualifiedFriend=false)

Perform semantic analysis for the given function template specialization.

@ FoundFunctions

This is assumed to be a template name because lookup found one or more functions (but no function tem...

@ None

This is not assumed to be a template name.

@ FoundNothing

This is assumed to be a template name because lookup found nothing.

bool CheckTemplateArgument(NamedDecl *Param, TemplateArgumentLoc &Arg, NamedDecl *Template, SourceLocation TemplateLoc, SourceLocation RAngleLoc, unsigned ArgumentPackIndex, CheckTemplateArgumentInfo &CTAI, CheckTemplateArgumentKind CTAK)

Check that the given template argument corresponds to the given template parameter.

bool RebuildNestedNameSpecifierInCurrentInstantiation(CXXScopeSpec &SS)

ArrayRef< InventedTemplateParameterInfo > getInventedParameterInfos() const

void inferGslOwnerPointerAttribute(CXXRecordDecl *Record)

Add [[gsl::Owner]] and [[gsl::Pointer]] attributes for std:: types.

FPOptions & getCurFPFeatures()

SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)

Calls Lexer::getLocForEndOfToken()

bool EnsureTemplateArgumentListConstraints(TemplateDecl *Template, const MultiLevelTemplateArgumentList &TemplateArgs, SourceRange TemplateIDRange)

Ensure that the given template arguments satisfy the constraints associated with the given template,...

@ UPPC_PartialSpecialization

Partial specialization.

@ UPPC_DefaultArgument

A default argument.

@ UPPC_ExplicitSpecialization

Explicit specialization.

@ UPPC_NonTypeTemplateParameterType

The type of a non-type template parameter.

@ UPPC_TypeConstraint

A type constraint.

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

bool RebuildTemplateParamsInCurrentInstantiation(TemplateParameterList *Params)

Rebuild the template parameters now that we know we're in a current instantiation.

bool AttachTypeConstraint(NestedNameSpecifierLoc NS, DeclarationNameInfo NameInfo, ConceptDecl *NamedConcept, NamedDecl *FoundDecl, const TemplateArgumentListInfo *TemplateArgs, TemplateTypeParmDecl *ConstrainedParameter, QualType ConstrainedType, SourceLocation EllipsisLoc)

Attach a type-constraint to a template parameter.

void EnterTemplatedContext(Scope *S, DeclContext *DC)

Enter a template parameter scope, after it's been associated with a particular DeclContext.

const FunctionProtoType * ResolveExceptionSpec(SourceLocation Loc, const FunctionProtoType *FPT)

void NoteTemplateLocation(const NamedDecl &Decl, std::optional< SourceRange > ParamRange={})

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

ExprResult BuildCXXFoldExpr(UnresolvedLookupExpr *Callee, SourceLocation LParenLoc, Expr *LHS, BinaryOperatorKind Operator, SourceLocation EllipsisLoc, Expr *RHS, SourceLocation RParenLoc, std::optional< unsigned > NumExpansions)

bool isPotentialImplicitMemberAccess(const CXXScopeSpec &SS, LookupResult &R, bool IsAddressOfOperand)

Check whether an expression might be an implicit class member access.

bool DiagnoseUnexpandedParameterPack(SourceLocation Loc, TypeSourceInfo *T, UnexpandedParameterPackContext UPPC)

If the given type contains an unexpanded parameter pack, diagnose the error.

bool hasVisibleMemberSpecialization(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)

Determine if there is a visible declaration of D that is a member specialization declaration (as oppo...

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

void InstantiateClassMembers(SourceLocation PointOfInstantiation, CXXRecordDecl *Instantiation, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateSpecializationKind TSK)

Instantiates the definitions of all of the member of the given class, which is an instantiation of a ...

std::pair< Expr *, std::string > findFailedBooleanCondition(Expr *Cond)

Find the failed Boolean condition within a given Boolean constant expression, and describe it with a ...

QualType CheckTypenameType(ElaboratedTypeKeyword Keyword, SourceLocation KeywordLoc, NestedNameSpecifierLoc QualifierLoc, const IdentifierInfo &II, SourceLocation IILoc, TypeSourceInfo **TSI, bool DeducedTSTContext)

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.

bool hasAnyAcceptableTemplateNames(LookupResult &R, bool AllowFunctionTemplates=true, bool AllowDependent=true, bool AllowNonTemplateFunctions=false)

ExprResult BuildConvertedConstantExpression(Expr *From, QualType T, CCEKind CCE, NamedDecl *Dest=nullptr)

bool CheckDependentFunctionTemplateSpecialization(FunctionDecl *FD, const TemplateArgumentListInfo *ExplicitTemplateArgs, LookupResult &Previous)

Perform semantic analysis for the given dependent function template specialization.

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 hasExplicitCallingConv(QualType T)

NonTagKind getNonTagTypeDeclKind(const Decl *D, TagTypeKind TTK)

Given a non-tag type declaration, returns an enum useful for indicating what kind of non-tag type thi...

bool CheckTemplateTypeArgument(TemplateTypeParmDecl *Param, TemplateArgumentLoc &Arg, SmallVectorImpl< TemplateArgument > &SugaredConverted, SmallVectorImpl< TemplateArgument > &CanonicalConverted)

bool AreConstraintExpressionsEqual(const NamedDecl *Old, const Expr *OldConstr, const TemplateCompareNewDeclInfo &New, const Expr *NewConstr)

bool InstantiateClassTemplateSpecialization(SourceLocation PointOfInstantiation, ClassTemplateSpecializationDecl *ClassTemplateSpec, TemplateSpecializationKind TSK, bool Complain=true, bool PrimaryHasMatchedPackOnParmToNonPackOnArg=false)

void AddPushedVisibilityAttribute(Decl *RD)

AddPushedVisibilityAttribute - If '#pragma GCC visibility' was used, add an appropriate visibility at...

std::optional< sema::TemplateDeductionInfo * > isSFINAEContext() const

Determines whether we are currently in a context where template argument substitution failures are no...

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)

QualType DeduceTemplateSpecializationFromInitializer(TypeSourceInfo *TInfo, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Init)

bool MaybeEmitAmbiguousAtomicConstraintsDiagnostic(NamedDecl *D1, ArrayRef< const Expr * > AC1, NamedDecl *D2, ArrayRef< const Expr * > AC2)

If D1 was not at least as constrained as D2, but would've been if a pair of atomic constraints involv...

ExprResult DefaultLvalueConversion(Expr *E)

ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R, bool NeedsADL, bool AcceptInvalidDecl=false)

void NoteOverloadCandidate(const NamedDecl *Found, const FunctionDecl *Fn, OverloadCandidateRewriteKind RewriteKind=OverloadCandidateRewriteKind(), QualType DestType=QualType(), bool TakingAddress=false)

bool hasReachableDefaultArgument(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)

Determine if the template parameter D has a reachable default argument.

DeclContext * CurContext

CurContext - This is the current declaration context of parsing.

MultiLevelTemplateArgumentList getTemplateInstantiationArgs(const NamedDecl *D, const DeclContext *DC=nullptr, bool Final=false, std::optional< ArrayRef< TemplateArgument > > Innermost=std::nullopt, bool RelativeToPrimary=false, const FunctionDecl *Pattern=nullptr, bool ForConstraintInstantiation=false, bool SkipForSpecialization=false, bool ForDefaultArgumentSubstitution=false)

Retrieve the template argument list(s) that should be used to instantiate the definition of the given...

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.

TypeSourceInfo * RebuildTypeInCurrentInstantiation(TypeSourceInfo *T, SourceLocation Loc, DeclarationName Name)

Rebuilds a type within the context of the current instantiation.

QualType BuiltinDecay(QualType BaseType, SourceLocation Loc)

void CompleteMemberSpecialization(NamedDecl *Member, LookupResult &Previous)

bool CheckFunctionConstraints(const FunctionDecl *FD, ConstraintSatisfaction &Satisfaction, SourceLocation UsageLoc=SourceLocation(), bool ForOverloadResolution=false)

Check whether the given function decl's trailing requires clause is satisfied, if any.

TemplateNameKindForDiagnostics getTemplateNameKindForDiagnostics(TemplateName Name)

void notePreviousDefinition(const NamedDecl *Old, SourceLocation New)

bool CheckSpecializationInstantiationRedecl(SourceLocation NewLoc, TemplateSpecializationKind ActOnExplicitInstantiationNewTSK, NamedDecl *PrevDecl, TemplateSpecializationKind PrevTSK, SourceLocation PrevPtOfInstantiation, bool &SuppressNew)

Diagnose cases where we have an explicit template specialization before/after an explicit template in...

bool CheckTypeConstraint(TemplateIdAnnotation *TypeConstraint)

TemplateNameKind ActOnTemplateName(Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const UnqualifiedId &Name, ParsedType ObjectType, bool EnteringContext, TemplateTy &Template, bool AllowInjectedClassName=false)

Form a template name from a name that is syntactically required to name a template,...

bool hasVisibleDefinition(NamedDecl *D, NamedDecl **Suggested, bool OnlyNeedComplete=false)

Determine if D has a visible definition.

NonTagKind

Common ways to introduce type names without a tag for use in diagnostics.

void diagnoseExprIntendedAsTemplateName(Scope *S, ExprResult TemplateName, SourceLocation Less, SourceLocation Greater)

ExprResult FixOverloadedFunctionReference(Expr *E, DeclAccessPair FoundDecl, FunctionDecl *Fn)

FixOverloadedFunctionReference - E is an expression that refers to a C++ overloaded function (possibl...

DeclResult CheckVarTemplateId(VarTemplateDecl *Template, SourceLocation TemplateLoc, SourceLocation TemplateNameLoc, const TemplateArgumentListInfo &TemplateArgs)

Get the specialization of the given variable template corresponding to the specified argument list,...

ExprResult BuildPossibleImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, const TemplateArgumentListInfo *TemplateArgs, const Scope *S)

Builds an expression which might be an implicit member expression.

DeclContext * computeDeclContext(QualType T)

Compute the DeclContext that is associated with the given type.

QualType CheckNonTypeTemplateParameterType(TypeSourceInfo *&TSI, SourceLocation Loc)

Check that the type of a non-type template parameter is well-formed.

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

void diagnoseMissingImport(SourceLocation Loc, const NamedDecl *Decl, MissingImportKind MIK, bool Recover=true)

Diagnose that the specified declaration needs to be visible but isn't, and suggest a module import th...

void FilterAcceptableTemplateNames(LookupResult &R, bool AllowFunctionTemplates=true, bool AllowDependent=true)

TypeSourceInfo * SubstAutoTypeSourceInfoDependent(TypeSourceInfo *TypeWithAuto)

bool IsAtLeastAsConstrained(NamedDecl *D1, MutableArrayRef< const Expr * > AC1, NamedDecl *D2, MutableArrayRef< const Expr * > AC2, bool &Result)

Check whether the given declaration's associated constraints are at least as constrained than another...

bool CheckTemplateDeclScope(Scope *S, TemplateParameterList *TemplateParams)

Check whether a template can be declared within this scope.

void AddMsStructLayoutForRecord(RecordDecl *RD)

AddMsStructLayoutForRecord - Adds ms_struct layout attribute to record.

TemplateParameterList * SubstTemplateParams(TemplateParameterList *Params, DeclContext *Owner, const MultiLevelTemplateArgumentList &TemplateArgs, bool EvaluateConstraints=true)

SourceLocation getTopMostPointOfInstantiation(const NamedDecl *) const

Returns the top most location responsible for the definition of N.

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.

ParsedTemplateArgument ActOnPackExpansion(const ParsedTemplateArgument &Arg, SourceLocation EllipsisLoc)

Invoked when parsing a template argument followed by an ellipsis, which creates a pack expansion.

void ActOnUndeclaredTypeTemplateName(Scope *S, TemplateTy &Name, TemplateNameKind &TNK, SourceLocation NameLoc, IdentifierInfo *&II)

Try to resolve an undeclared template name as a type template.

bool CheckMemberSpecialization(NamedDecl *Member, LookupResult &Previous)

Perform semantic analysis for the given non-template member specialization.

TypeResult ActOnTypenameType(Scope *S, SourceLocation TypenameLoc, const CXXScopeSpec &SS, const IdentifierInfo &II, SourceLocation IdLoc, ImplicitTypenameContext IsImplicitTypename=ImplicitTypenameContext::No)

Called when the parser has parsed a C++ typename specifier, e.g., "typename T::type".

bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)

bool InstantiateClass(SourceLocation PointOfInstantiation, CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateSpecializationKind TSK, bool Complain=true)

Instantiate the definition of a class from a given pattern.

bool hasReachableMemberSpecialization(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)

Determine if there is a reachable declaration of D that is a member specialization declaration (as op...

RedeclarationKind forRedeclarationInCurContext() const

bool SubstTemplateArgument(const TemplateArgumentLoc &Input, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateArgumentLoc &Output, SourceLocation Loc={}, const DeclarationName &Entity={})

void InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, FunctionDecl *Function, bool Recursive=false, bool DefinitionRequired=false, bool AtEndOfTU=false)

Instantiate the definition of the given function from its template.

@ CCEK_InjectedTTP

Injected parameter of a template template parameter.

@ CCEK_TemplateArg

Value of a non-type template parameter.

void InstantiateAttrsForDecl(const MultiLevelTemplateArgumentList &TemplateArgs, const Decl *Pattern, Decl *Inst, LateInstantiatedAttrVec *LateAttrs=nullptr, LocalInstantiationScope *OuterMostScope=nullptr)

void mergeDeclAttributes(NamedDecl *New, Decl *Old, AvailabilityMergeKind AMK=AMK_Redeclaration)

mergeDeclAttributes - Copy attributes from the Old decl to the New one.

void MarkUnusedFileScopedDecl(const DeclaratorDecl *D)

If it's a file scoped decl that must warn if not used, keep track of it.

ExprResult BuildQualifiedTemplateIdExpr(CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs, bool IsAddressOfOperand)

void MarkUsedTemplateParameters(const Expr *E, bool OnlyDeduced, unsigned Depth, llvm::SmallBitVector &Used)

Mark which template parameters are used in a given expression.

DeclResult ActOnExplicitInstantiation(Scope *S, SourceLocation ExternLoc, SourceLocation TemplateLoc, unsigned TagSpec, SourceLocation KWLoc, const CXXScopeSpec &SS, TemplateTy Template, SourceLocation TemplateNameLoc, SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc, const ParsedAttributesView &Attr)

QualType CheckConditionalOperands(ExprResult &Cond, ExprResult &LHS, ExprResult &RHS, ExprValueKind &VK, ExprObjectKind &OK, SourceLocation QuestionLoc)

Note that LHS is not null here, even if this is the gnu "x ?: y" extension.

@ ConstantEvaluated

The current context is "potentially evaluated" in C++11 terms, but the expression is evaluated at com...

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

ExprResult BuildDependentDeclRefExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs)

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

NestedNameSpecifierLoc SubstNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, const MultiLevelTemplateArgumentList &TemplateArgs)

bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)

Ensure that the type T is a complete type.

bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)

Perform qualified name lookup into a given context.

bool CheckEquivalentExceptionSpec(FunctionDecl *Old, FunctionDecl *New)

void makeMergedDefinitionVisible(NamedDecl *ND)

Make a merged definition of an existing hidden definition ND visible at the specified location.

bool isDependentScopeSpecifier(const CXXScopeSpec &SS)

bool hasReachableExplicitSpecialization(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)

Determine if there is a reachable declaration of D that is an explicit specialization declaration for...

bool isDeductionGuideName(Scope *S, const IdentifierInfo &Name, SourceLocation NameLoc, CXXScopeSpec &SS, ParsedTemplateTy *Template=nullptr)

Determine whether a particular identifier might be the name in a C++1z deduction-guide declaration.

ExprResult DefaultFunctionArrayConversion(Expr *E, bool Diagnose=true)

DefaultFunctionArrayConversion (C99 6.3.2.1p3, C99 6.3.2.1p4).

NamedDecl * ActOnNonTypeTemplateParameter(Scope *S, Declarator &D, unsigned Depth, unsigned Position, SourceLocation EqualLoc, Expr *DefaultArg)

void diagnoseMissingTemplateArguments(TemplateName Name, SourceLocation Loc)

void CheckFunctionOrTemplateParamDeclarator(Scope *S, Declarator &D)

Common checks for a parameter-declaration that should apply to both function parameters and non-type ...

TemplateParamListContext

The context in which we are checking a template parameter list.

@ TPC_FriendFunctionTemplate

@ TPC_ClassTemplateMember

@ TPC_FriendClassTemplate

@ TPC_FriendFunctionTemplateDefinition

void checkSpecializationVisibility(SourceLocation Loc, NamedDecl *Spec)

We've found a use of a templated declaration that would trigger an implicit instantiation.

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.

TemplateDeductionResult DeduceTemplateArguments(ClassTemplatePartialSpecializationDecl *Partial, ArrayRef< TemplateArgument > TemplateArgs, sema::TemplateDeductionInfo &Info)

bool resolveAssumedTemplateNameAsType(Scope *S, TemplateName &Name, SourceLocation NameLoc, bool Diagnose=true)

static Scope * getScopeForDeclContext(Scope *S, DeclContext *DC)

Finds the scope corresponding to the given decl context, if it happens to be an enclosing scope.

ExprResult CheckConceptTemplateId(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &ConceptNameInfo, NamedDecl *FoundDecl, ConceptDecl *NamedConcept, const TemplateArgumentListInfo *TemplateArgs)

void CheckConceptRedefinition(ConceptDecl *NewDecl, LookupResult &Previous, bool &AddToScope)

SmallVector< CXXRecordDecl *, 4 > DelayedDllExportClasses

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 isMoreSpecializedThanPrimary(ClassTemplatePartialSpecializationDecl *T, sema::TemplateDeductionInfo &Info)

ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())

Attempts to produce a RecoveryExpr after some AST node cannot be created.

void ProcessAPINotes(Decl *D)

Map any API notes provided for this declaration to attributes on the declaration.

std::string getTemplateArgumentBindingsText(const TemplateParameterList *Params, const TemplateArgumentList &Args)

Produces a formatted string that describes the binding of template parameters to template arguments.

bool CheckRedeclarationInModule(NamedDecl *New, NamedDecl *Old)

A wrapper function for checking the semantic restrictions of a redeclaration within a module.

bool CheckTemplateArgumentList(TemplateDecl *Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs, const DefaultArguments &DefaultArgs, bool PartialTemplateArgs, CheckTemplateArgumentInfo &CTAI, bool UpdateArgsWithConversions=true, bool *ConstraintsNotSatisfied=nullptr)

Check that the given template arguments can be provided to the given template, converting the argumen...

@ Diagnose

Diagnose issues that are non-constant or that are extensions.

unsigned getTemplateDepth(Scope *S) const

Determine the number of levels of enclosing template parameters.

ExprResult BuildExpressionFromDeclTemplateArgument(const TemplateArgument &Arg, QualType ParamType, SourceLocation Loc, NamedDecl *TemplateParam=nullptr)

Given a non-type template argument that refers to a declaration and the type of its corresponding non...

TemplateDeductionResult DeduceAutoType(TypeLoc AutoTypeLoc, Expr *Initializer, QualType &Result, sema::TemplateDeductionInfo &Info, bool DependentDeduction=false, bool IgnoreConstraints=false, TemplateSpecCandidateSet *FailedTSC=nullptr)

Deduce the type for an auto type-specifier (C++11 [dcl.spec.auto]p6)

bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)

Perform unqualified name lookup starting from a given scope.

static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo=nullptr)

QualType adjustCCAndNoReturn(QualType ArgFunctionType, QualType FunctionType, bool AdjustExceptionSpec=false)

Adjust the type ArgFunctionType to match the calling convention, noreturn, and optionally the excepti...

void NoteTemplateParameterLocation(const NamedDecl &Decl)

IdentifierResolver IdResolver

ArrayRef< sema::FunctionScopeInfo * > getFunctionScopes() const

void CheckDeductionGuideTemplate(FunctionTemplateDecl *TD)

bool IsFunctionConversion(QualType FromType, QualType ToType, QualType &ResultTy)

Determine whether the conversion from FromType to ToType is a valid conversion that strips "noexcept"...

TypeResult ActOnTagTemplateIdType(TagUseKind TUK, TypeSpecifierType TagSpec, SourceLocation TagLoc, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, TemplateTy TemplateD, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgsIn, SourceLocation RAngleLoc)

Parsed an elaborated-type-specifier that refers to a template-id, such as class T::template apply.

bool hasReachableDeclaration(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)

Determine whether any declaration of an entity is reachable.

void MarkDeducedTemplateParameters(const FunctionTemplateDecl *FunctionTemplate, llvm::SmallBitVector &Deduced)

bool DiagnoseUnexpandedParameterPacks(SourceLocation Loc, UnexpandedParameterPackContext UPPC, ArrayRef< UnexpandedParameterPack > Unexpanded)

Diagnose unexpanded parameter packs.

void warnOnReservedIdentifier(const NamedDecl *D)

void inferNullableClassAttribute(CXXRecordDecl *CRD)

Add _Nullable attributes for std:: types.

ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)

Encodes a location in the source.

bool isValid() const

Return true if this is a valid SourceLocation object.

A trivial tuple used to represent a source range.

SourceLocation getEnd() const

SourceLocation getBegin() const

Stmt - This represents one statement.

SourceLocation getEndLoc() const LLVM_READONLY

void printPretty(raw_ostream &OS, PrinterHelper *Helper, const PrintingPolicy &Policy, unsigned Indentation=0, StringRef NewlineSymbol="\n", const ASTContext *Context=nullptr) const

SourceRange getSourceRange() const LLVM_READONLY

SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...

SourceLocation getBeginLoc() const LLVM_READONLY

Represents a reference to a non-type template parameter that has been substituted with a template arg...

Represents the result of substituting a set of types for a template type parameter pack.

Represents the result of substituting a type for a template type parameter.

Represents the declaration of a struct/union/class/enum.

StringRef getKindName() const

void startDefinition()

Starts the definition of this tag declaration.

void setTemplateParameterListsInfo(ASTContext &Context, ArrayRef< TemplateParameterList * > TPLists)

TagKind getTagKind() const

bool isBeingDefined() const

Determines whether this type is in the process of being defined.

bool isMicrosoft() const

Is this ABI an MSVC-compatible ABI?

const llvm::Triple & getTriple() const

Returns the target triple of the primary target.

TargetCXXABI getCXXABI() const

Get the C++ ABI currently in use.

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.

SourceLocation getRAngleLoc() const

void setLAngleLoc(SourceLocation Loc)

void setRAngleLoc(SourceLocation Loc)

void addArgument(const TemplateArgumentLoc &Loc)

llvm::ArrayRef< TemplateArgumentLoc > arguments() const

SourceLocation getLAngleLoc() const

A template argument list.

const TemplateArgument * data() const

Retrieve a pointer to the template argument list.

static TemplateArgumentList * CreateCopy(ASTContext &Context, ArrayRef< TemplateArgument > Args)

Create a new template argument list that copies the given set of template arguments.

unsigned size() const

Retrieve the number of template arguments in this template argument list.

Location wrapper for a TemplateArgument.

SourceLocation getLocation() const

SourceLocation getTemplateEllipsisLoc() const

TemplateArgumentLocInfo getLocInfo() const

const TemplateArgument & getArgument() const

SourceLocation getTemplateNameLoc() const

TypeSourceInfo * getTypeSourceInfo() const

SourceRange getSourceRange() const LLVM_READONLY

NestedNameSpecifierLoc getTemplateQualifierLoc() const

Expr * getSourceExpression() const

Represents a template argument.

QualType getStructuralValueType() const

Get the type of a StructuralValue.

Expr * getAsExpr() const

Retrieve the template argument as an expression.

bool isDependent() const

Whether this template argument is dependent on a template parameter such that its result can change f...

bool isInstantiationDependent() const

Whether this template argument is dependent on a template parameter.

pack_iterator pack_begin() const

Iterator referencing the first argument of a template argument pack.

QualType getNonTypeTemplateArgumentType() const

If this is a non-type template argument, get its type.

QualType getAsType() const

Retrieve the type for a type template argument.

llvm::APSInt getAsIntegral() const

Retrieve the template argument as an integral value.

static TemplateArgument CreatePackCopy(ASTContext &Context, ArrayRef< TemplateArgument > Args)

Create a new template argument pack by copying the given set of template arguments.

TemplateName getAsTemplate() const

Retrieve the template name for a template name argument.

TemplateArgument getPackExpansionPattern() const

When the template argument is a pack expansion, returns the pattern of the pack expansion.

bool isNull() const

Determine whether this template argument has no value.

unsigned pack_size() const

The number of template arguments in the given template argument pack.

void print(const PrintingPolicy &Policy, raw_ostream &Out, bool IncludeType) const

Print this template argument to the given output stream.

QualType getIntegralType() const

Retrieve the type of the integral value.

ValueDecl * getAsDecl() const

Retrieve the declaration for a declaration non-type template argument.

@ Declaration

The template argument is a declaration that was provided for a pointer, reference,...

@ Template

The template argument is a template name that was provided for a template template parameter.

@ StructuralValue

The template argument is a non-type template argument that can't be represented by the special-case D...

@ Pack

The template argument is actually a parameter pack.

@ TemplateExpansion

The template argument is a pack expansion of a template name that was provided for a template templat...

@ NullPtr

The template argument is a null pointer or null pointer to member that was provided for a non-type te...

@ Type

The template argument is a type.

@ Null

Represents an empty template argument, e.g., one that has not been deduced.

@ Integral

The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...

@ Expression

The template argument is an expression, and we've not resolved it to one of the other forms yet,...

ArgKind getKind() const

Return the kind of stored template argument.

bool isPackExpansion() const

Determine whether this template argument is a pack expansion.

TemplateName getAsTemplateOrTemplatePattern() const

Retrieve the template argument as a template name; if the argument is a pack expansion,...

const APValue & getAsStructuralValue() const

Get the value of a StructuralValue.

The base class of all kinds of template declarations (e.g., class, function, etc.).

bool hasAssociatedConstraints() const

NamedDecl * getTemplatedDecl() const

Get the underlying, templated declaration.

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.

bool isNull() const

Determine whether this template name is NULL.

DependentTemplateName * getAsDependentTemplateName() const

Retrieve the underlying dependent template name structure, if any.

AssumedTemplateStorage * getAsAssumedTemplateName() const

Retrieve information on a name that has been assumed to be a template-name in order to permit a call ...

UsingShadowDecl * getAsUsingShadowDecl() const

Retrieve the using shadow declaration through which the underlying template declaration is introduced...

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.

bool hasAssociatedConstraints() const

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)

NamedDecl *const * const_iterator

Iterates through the template parameters in this list.

Expr * getRequiresClause()

The constraint-expression of the associated requires-clause.

SourceLocation getRAngleLoc() const

SourceLocation getLAngleLoc() const

void getAssociatedConstraints(llvm::SmallVectorImpl< const Expr * > &AC) const

All associated constraints derived from this template parameter list, including the requires clause a...

static bool shouldIncludeTypeForArgument(const PrintingPolicy &Policy, const TemplateParameterList *TPL, unsigned Idx)

SourceLocation getTemplateLoc() const

TemplateSpecCandidateSet - A set of generalized overload candidates, used in template specializations...

void NoteCandidates(Sema &S, SourceLocation Loc)

NoteCandidates - When no template specialization match is found, prints diagnostic messages containin...

SourceLocation getLocation() const

TemplateSpecCandidate & addCandidate()

Add a new candidate with NumConversions conversion sequence slots to the overload set.

unsigned getNumArgs() const

void setArgLocInfo(unsigned i, TemplateArgumentLocInfo AI)

void setTemplateKeywordLoc(SourceLocation Loc)

TemplateArgumentLoc getArgLoc(unsigned i) const

void setTemplateNameLoc(SourceLocation Loc)

void setLAngleLoc(SourceLocation Loc)

void setRAngleLoc(SourceLocation Loc)

Represents a type template specialization; the template must be a class template, a type alias templa...

TemplateName getTemplateName() const

Retrieve the name of the template that we are specializing.

static bool anyDependentTemplateArguments(ArrayRef< TemplateArgumentLoc > Args, ArrayRef< TemplateArgument > Converted)

Determine whether any of the given template arguments are dependent.

TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.

TemplateParameterList * getExpansionTemplateParameters(unsigned I) const

Retrieve a particular expansion type within an expanded parameter pack.

bool isPackExpansion() const

Whether this parameter pack is a pack expansion.

const TemplateArgumentLoc & getDefaultArgument() const

Retrieve the default argument, if any.

void setInheritedDefaultArgument(const ASTContext &C, TemplateTemplateParmDecl *Prev)

bool isParameterPack() const

Whether this template template parameter is a template parameter pack.

unsigned getIndex() const

Get the index of the template parameter within its parameter list.

void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)

Set the default argument for this template parameter, and whether that default argument was inherited...

unsigned getDepth() const

Get the nesting depth of the template parameter.

bool isExpandedParameterPack() const

Whether this parameter is a template template parameter pack that has a known list of different templ...

static TemplateTemplateParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation L, unsigned D, unsigned P, bool ParameterPack, IdentifierInfo *Id, bool Typename, TemplateParameterList *Params)

void removeDefaultArgument()

Removes the default argument of this template parameter.

bool hasDefaultArgument() const

Determine whether this template parameter has a default argument.

Declaration of a template type parameter.

SourceLocation getDefaultArgumentLoc() const

Retrieves the location of the default argument declaration.

const TemplateArgumentLoc & getDefaultArgument() const

Retrieve the default argument, if any.

static TemplateTypeParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation KeyLoc, SourceLocation NameLoc, unsigned D, unsigned P, IdentifierInfo *Id, bool Typename, bool ParameterPack, bool HasTypeConstraint=false, std::optional< unsigned > NumExpanded=std::nullopt)

bool hasDefaultArgument() const

Determine whether this template parameter has a default argument.

bool isParameterPack() const

Returns whether this is a parameter pack.

unsigned getDepth() const

Retrieve the depth of the template parameter.

void setTypeConstraint(ConceptReference *CR, Expr *ImmediatelyDeclaredConstraint)

void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)

Set the default argument for this template parameter.

Wrapper for template type parameters.

TemplateTypeParmDecl * getDecl() const

unsigned getIndex() const

unsigned getDepth() const

A semantic tree transformation that allows one to transform one abstract syntax tree into another.

Represents the declaration of a typedef-name via a C++11 alias-declaration.

Declaration of an alias template.

Models the abbreviated syntax to constrain a template type parameter: template <convertible_to<string...

Represents a declaration of a type.

SourceLocation getBeginLoc() const LLVM_READONLY

TyLocType push(QualType T)

Pushes space for a new TypeLoc of the given type.

TypeSourceInfo * getTypeSourceInfo(ASTContext &Context, QualType T)

Creates a TypeSourceInfo for the given type.

Base wrapper for a particular "section" of type source info.

QualType getType() const

Get the type for which this source info wrapper provides information.

T getAs() const

Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...

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.

AutoTypeLoc getContainedAutoTypeLoc() const

Get the typeloc of an AutoType whose type will be deduced for a variable with an initializer of this ...

SourceLocation getBeginLoc() const

Get the begin source location.

Represents a typeof (or typeof) expression (a C23 feature and GCC extension) or a typeof_unqual expre...

Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...

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.

SourceLocation getNameLoc() const

static ElaboratedTypeKeyword getKeywordForTagTypeKind(TagTypeKind Tag)

Converts a TagTypeKind into an elaborated type keyword.

static TagTypeKind getTagTypeKindForTypeSpec(unsigned TypeSpec)

Converts a type specifier (DeclSpec::TST) into a tag type kind.

The base class of the type hierarchy.

bool isIncompleteOrObjectType() const

Return true if this is an incomplete or object type, in other words, not a function type.

CXXRecordDecl * getAsCXXRecordDecl() const

Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...

bool isBooleanType() const

bool isSignedIntegerOrEnumerationType() const

Determines whether this is an integer type that is signed or an enumeration types whose underlying ty...

bool isUnsignedIntegerOrEnumerationType() const

Determines whether this is an integer type that is unsigned or an enumeration types whose underlying ...

bool isRValueReferenceType() const

bool isVoidPointerType() const

bool isPointerType() const

const T * castAs() const

Member-template castAs<specific type>.

bool isReferenceType() const

bool isEnumeralType() const

bool isScalarType() const

bool isIntegralType(const ASTContext &Ctx) const

Determine whether this type is an integral type.

const Type * getArrayElementTypeNoTypeQual() const

If this is an array type, return the element type of the array, potentially with type qualifiers miss...

QualType getPointeeType() const

If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.

bool isIntegralOrEnumerationType() const

Determine whether this type is an integral or enumeration type.

bool isAnyCharacterType() const

Determine whether this type is any of the built-in character types.

bool isObjCObjectOrInterfaceType() const

AutoType * getContainedAutoType() const

Get the AutoType whose type will be deduced for a variable with an initializer of this type.

bool isInstantiationDependentType() const

Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...

bool isLValueReferenceType() const

bool isBitIntType() const

bool isBuiltinType() const

Helper methods to distinguish type categories.

bool isStructuralType() const

Determine if this type is a structural type, per C++20 [temp.param]p7.

bool isDependentType() const

Whether this type is a dependent type, meaning that its definition somehow depends on a template para...

bool isChar16Type() const

DeducedType * getContainedDeducedType() const

Get the DeducedType whose type will be deduced for a variable with an initializer of this type.

bool containsUnexpandedParameterPack() const

Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...

QualType getCanonicalTypeInternal() const

bool isMemberPointerType() const

bool isChar32Type() const

bool isVariablyModifiedType() const

Whether this type is a variably-modified type (C99 6.7.5).

bool isObjCLifetimeType() const

Returns true if objects of this type have lifetime semantics under ARC.

bool isUndeducedType() const

Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...

bool hasUnnamedOrLocalType() const

Whether this type is or contains a local or unnamed type.

bool isPointerOrReferenceType() const

bool isIncompleteType(NamedDecl **Def=nullptr) const

Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...

bool isFunctionType() const

bool isVectorType() const

bool isWideCharType() const

const T * getAs() const

Member-template getAs<specific type>'.

bool isNullPtrType() const

bool isRecordType() const

QualType getUnderlyingType() const

Simple class containing the result of Sema::CorrectTypo.

NamedDecl * getCorrectionDecl() const

Gets the pointer to the declaration of the typo correction.

DeclClass * getCorrectionDeclAs() const

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

A unary type transform, which is a type constructed from another.

Represents a C++ unqualified-id that has been parsed.

A reference to a name which we were able to look up during parsing but could not resolve to a specifi...

static UnresolvedLookupExpr * Create(const ASTContext &Context, CXXRecordDecl *NamingClass, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool RequiresADL, UnresolvedSetIterator Begin, UnresolvedSetIterator End, bool KnownDependent, bool KnownInstantiationDependent)

void addDecl(NamedDecl *D)

The iterator over UnresolvedSets.

A set of unresolved declarations.

Represents the dependent type named by a dependently-scoped typename using declaration,...

Represents a dependent using declaration which was not marked with typename.

Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...

NamedDecl * getTargetDecl() const

Gets the underlying declaration which has been brought into the local scope.

Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...

void setType(QualType newType)

Represents a variable declaration or definition.

TLSKind getTLSKind() const

bool isStaticDataMember() const

Determines whether this is a static data member.

VarDecl * getInstantiatedFromStaticDataMember() const

If this variable is an instantiated static data member of a class template specialization,...

void setTemplateSpecializationKind(TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())

For a static data member that was instantiated from a static data member of a class template,...

SourceLocation getPointOfInstantiation() const

If this variable is an instantiation of a variable template or a static data member of a class templa...

TemplateSpecializationKind getTemplateSpecializationKind() const

If this variable is an instantiation of a variable template or a static data member of a class templa...

MemberSpecializationInfo * getMemberSpecializationInfo() const

If this variable is an instantiation of a static data member of a class template specialization,...

Declaration of a variable template.

VarDecl * getTemplatedDecl() const

Get the underlying variable declarations of the template.

llvm::FoldingSetVector< VarTemplatePartialSpecializationDecl > & getPartialSpecializations() const

Retrieve the set of partial specializations of this class template.

VarTemplateSpecializationDecl * findSpecialization(ArrayRef< TemplateArgument > Args, void *&InsertPos)

Return the specialization with the provided arguments if it exists, otherwise return the insertion po...

VarTemplateDecl * getMostRecentDecl()

static VarTemplatePartialSpecializationDecl * Create(ASTContext &Context, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, TemplateParameterList *Params, VarTemplateDecl *SpecializedTemplate, QualType T, TypeSourceInfo *TInfo, StorageClass S, ArrayRef< TemplateArgument > Args)

void setMemberSpecialization()

Note that this member template is a specialization.

VarTemplatePartialSpecializationDecl * getInstantiatedFromMember() const

Retrieve the member variable template partial specialization from which this particular variable temp...

Represents a variable template specialization, which refers to a variable template with a given set o...

SourceLocation getPointOfInstantiation() const

Get the point of instantiation (if any), or null if none.

void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)

Set the template argument list as written in the sources.

static VarTemplateSpecializationDecl * Create(ASTContext &Context, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, VarTemplateDecl *SpecializedTemplate, QualType T, TypeSourceInfo *TInfo, StorageClass S, ArrayRef< TemplateArgument > Args)

TemplateSpecializationKind getSpecializationKind() const

Determine the kind of specialization that this declaration represents.

Represents a C array with a specified size that is not an integer-constant-expression.

Represents a GCC generic vector type.

Retains information about a function, method, or block that is currently being parsed.

Provides information about an attempted template argument deduction, whose success or failure was des...

TemplateArgumentList * takeSugared()

Take ownership of the deduced template argument lists.

bool hasSFINAEDiagnostic() const

Is a SFINAE diagnostic available?

void takeSFINAEDiagnostic(PartialDiagnosticAt &PD)

Take ownership of the SFINAE diagnostic.

Defines the clang::TargetInfo interface.

__inline void unsigned int _2

The JSON file list parser is used to communicate input to InstallAPI.

TypeSpecifierType

Specifies the kind of type.

bool isa(CodeGen::Address addr)

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

bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)

@ ovl_fail_constraints_not_satisfied

This candidate was not viable because its associated constraints were not satisfied.

OverloadCandidateDisplayKind

@ OCD_AmbiguousCandidates

Requests that only tied-for-best candidates be shown.

@ OCD_AllCandidates

Requests that all candidates be shown.

ExprObjectKind

A further classification of the kind of object referenced by an l-value or x-value.

@ OK_Ordinary

An ordinary object is located at an address in memory.

@ IK_TemplateId

A template-id, e.g., f<int>.

@ IK_LiteralOperatorId

A user-defined literal name, e.g., operator "" _i.

@ IK_Identifier

An identifier.

@ IK_OperatorFunctionId

An overloaded operator name, e.g., operator+.

StorageClass

Storage classes.

@ CRK_None

Candidate is not a rewritten candidate.

@ Internal

Internal linkage, which indicates that the entity can be referred to from within the translation unit...

TemplateDecl * getAsTypeTemplateDecl(Decl *D)

@ Result

The result type of a method or function.

InheritableAttr * getDLLAttr(Decl *D)

Return a DLL attribute from the declaration.

ActionResult< Expr * > ExprResult

TagTypeKind

The kind of a tag type.

@ Enum

The "enum" keyword.

MutableArrayRef< TemplateParameterList * > MultiTemplateParamsArg

DeductionFailureInfo MakeDeductionFailureInfo(ASTContext &Context, TemplateDeductionResult TDK, sema::TemplateDeductionInfo &Info)

Convert from Sema's representation of template deduction information to the form used in overload-can...

@ BTK__type_pack_element

This names the __type_pack_element BuiltinTemplateDecl.

@ BTK__builtin_common_type

This names the __builtin_common_type BuiltinTemplateDecl.

@ BTK__make_integer_seq

This names the __make_integer_seq BuiltinTemplateDecl.

llvm::PointerUnion< TemplateTypeParmDecl *, NonTypeTemplateParmDecl *, TemplateTemplateParmDecl * > TemplateParameter

Stores a template parameter of any kind.

CastKind

CastKind - The kind of operation required for a conversion.

std::optional< unsigned > getExpandedPackSize(const NamedDecl *Param)

Check whether the template parameter is a pack expansion, and if so, determine the number of paramete...

SourceRange getTemplateParamsRange(TemplateParameterList const *const *Params, unsigned NumParams)

Retrieves the range of the given template parameter lists.

bool isSubstitutedDefaultArgument(ASTContext &Ctx, TemplateArgument Arg, const NamedDecl *Param, ArrayRef< TemplateArgument > Args, unsigned Depth)

Make a best-effort determination of whether the type T can be produced by substituting Args into the ...

TemplateNameKind

Specifies the kind of template name that an identifier refers to.

@ TNK_Var_template

The name refers to a variable template whose specialization produces a variable.

@ TNK_Type_template

The name refers to a template whose specialization produces a type.

@ TNK_Dependent_template_name

The name refers to a dependent template name:

@ TNK_Function_template

The name refers to a function template or a set of overloaded functions that includes at least one fu...

@ TNK_Concept_template

The name refers to a concept.

@ TNK_Non_template

The name does not refer to a template.

@ TNK_Undeclared_template

Lookup for the name failed, but we're assuming it was a template name anyway.

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

void printTemplateArgumentList(raw_ostream &OS, ArrayRef< TemplateArgument > Args, const PrintingPolicy &Policy, const TemplateParameterList *TPL=nullptr)

Print a template argument list, including the '<' and '>' enclosing the template arguments.

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.

TemplateDeductionResult

Describes the result of template argument deduction.

@ ConstraintsNotSatisfied

The deduced arguments did not satisfy the constraints associated with the template.

@ CUDATargetMismatch

CUDA Target attributes do not match.

@ Success

Template argument deduction was successful.

@ AlreadyDiagnosed

Some error which was already diagnosed.

ActionResult< Decl * > DeclResult

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

ElaboratedTypeKeyword

The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...

@ None

No keyword precedes the qualified type name.

@ Enum

The "enum" keyword introduces the elaborated-type-specifier.

@ Typename

The "typename" keyword precedes the qualified type name, e.g., typename T::type.

@ Parens

New-expression has a C++98 paren-delimited initializer.

AccessSpecifier

A C++ access specifier (public, private, protected), plus the special value "none" which means differ...

Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".

static const ASTTemplateArgumentListInfo * Create(const ASTContext &C, const TemplateArgumentListInfo &List)

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.

SourceLocation getBeginLoc() const

getBeginLoc - Retrieve the location of the first token.

SourceLocation getEndLoc() const LLVM_READONLY

ArrayRef< TemplateArgument > Args

EvalResult is a struct with detailed info about an evaluated expression.

APValue Val

Val - This is the value the expression can be folded to.

SmallVectorImpl< PartialDiagnosticAt > * Diag

Diag - If this is non-null, it will be filled in with a stack of notes indicating why evaluation fail...

bool HasSideEffects

Whether the evaluated expression has side effects.

Extra information about a function prototype.

OverloadCandidate - A single candidate in an overload set (C++ 13.3).

Describes how types, statements, expressions, and declarations should be printed.

unsigned PrintCanonicalTypes

Whether to print types as written or canonically.

unsigned TerseOutput

Provide a 'terse' output.

bool MatchingTTP

If true, assume these template arguments are the injected template arguments for a template template ...

bool PartialOrdering

The check is being performed in the context of partial ordering.

SmallVector< TemplateArgument, 4 > SugaredConverted

The checked, converted argument will be added to the end of these vectors.

SmallVector< TemplateArgument, 4 > CanonicalConverted

bool MatchedPackOnParmToNonPackOnArg

Is set to true when, in the context of TTP matching, a pack parameter matches non-pack arguments.

A context in which code is being synthesized (where a source location alone is not sufficient to iden...

@ BuildingDeductionGuides

We are building deduction guides for a class.

A stack object to be created when performing template instantiation.

bool isInvalid() const

Determines whether we have exceeded the maximum recursive template instantiations.

Location information for a TemplateArgument.

Information about a template-id annotation token.

const IdentifierInfo * Name

FIXME: Temporarily stores the name of a specialization.

unsigned NumArgs

NumArgs - The number of template arguments.

SourceLocation TemplateNameLoc

TemplateNameLoc - The location of the template name within the source.

ParsedTemplateArgument * getTemplateArgs()

Retrieves a pointer to the template arguments.

SourceLocation RAngleLoc

The location of the '>' after the template argument list.

SourceLocation LAngleLoc

The location of the '<' before the template argument list.

ParsedTemplateTy Template

The declaration of the template corresponding to the template-name.

void set(DeclAccessPair Found, Decl *Spec, DeductionFailureInfo Info)

Contains all information for a given match.


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