2020#include " clang/AST/TemplateBase.h"
2121#include " clang/AST/TemplateName.h"
2222#include " clang/AST/Type.h"
23- #include " clang/AST/ODRHash.h"
24- #include " clang/AST/ExprCXX.h"
2523#include " clang/AST/TypeLoc.h"
2624#include " clang/Basic/Builtins.h"
2725#include " clang/Basic/LLVM.h"
@@ -333,43 +331,16 @@ RedeclarableTemplateDecl::CommonBase *RedeclarableTemplateDecl::getCommonPtr() c
333331 return Common;
334332}
335333
336- void RedeclarableTemplateDecl::loadLazySpecializationsImpl (
337- bool OnlyPartial/* =false*/ ) const {
334+ void RedeclarableTemplateDecl::loadLazySpecializationsImpl () const {
338335 // Grab the most recent declaration to ensure we've loaded any lazy
339336 // redeclarations of this template.
340337 CommonBase *CommonBasePtr = getMostRecentDecl ()->getCommonPtr ();
341- if (auto *Specs = CommonBasePtr->LazySpecializations ) {
342- if (!OnlyPartial)
343- CommonBasePtr->LazySpecializations = nullptr ;
344- for (uint32_t I = 0 , N = Specs[0 ].DeclID ; I != N; ++I) {
345- // Skip over already loaded specializations.
346- if (!Specs[I+1 ].ODRHash )
347- continue ;
348- if (!OnlyPartial || Specs[I+1 ].IsPartial )
349- (void )loadLazySpecializationImpl (Specs[I+1 ]);
350- }
351- }
352- }
353-
354- Decl *RedeclarableTemplateDecl::loadLazySpecializationImpl (
355- LazySpecializationInfo &LazySpecInfo) const {
356- uint32_t ID = LazySpecInfo.DeclID ;
357- assert (ID && " Loading already loaded specialization!" );
358- // Note that we loaded the specialization.
359- LazySpecInfo.DeclID = LazySpecInfo.ODRHash = LazySpecInfo.IsPartial = 0 ;
360- return getASTContext ().getExternalSource ()->GetExternalDecl (ID);
361- }
362-
363- void
364- RedeclarableTemplateDecl::loadLazySpecializationsImpl (ArrayRef<TemplateArgument>
365- Args,
366- TemplateParameterList *TPL) const {
367- CommonBase *CommonBasePtr = getMostRecentDecl ()->getCommonPtr ();
368- if (auto *Specs = CommonBasePtr->LazySpecializations ) {
369- unsigned Hash = TemplateArgumentList::ComputeODRHash (Args);
370- for (uint32_t I = 0 , N = Specs[0 ].DeclID ; I != N; ++I)
371- if (Specs[I+1 ].ODRHash && Specs[I+1 ].ODRHash == Hash)
372- (void )loadLazySpecializationImpl (Specs[I+1 ]);
338+ if (CommonBasePtr->LazySpecializations ) {
339+ ASTContext &Context = getASTContext ();
340+ uint32_t *Specs = CommonBasePtr->LazySpecializations ;
341+ CommonBasePtr->LazySpecializations = nullptr ;
342+ for (uint32_t I = 0 , N = *Specs++; I != N; ++I)
343+ (void )Context.getExternalSource ()->GetExternalDecl (Specs[I]);
373344 }
374345}
375346
@@ -380,8 +351,6 @@ RedeclarableTemplateDecl::findSpecializationImpl(
380351 ProfileArguments&&... ProfileArgs) {
381352 using SETraits = SpecEntryTraits<EntryType>;
382353
383- loadLazySpecializationsImpl (std::forward<ProfileArguments>(ProfileArgs)...);
384-
385354 llvm::FoldingSetNodeID ID;
386355 EntryType::Profile (ID, std::forward<ProfileArguments>(ProfileArgs)...,
387356 getASTContext ());
@@ -397,14 +366,10 @@ void RedeclarableTemplateDecl::addSpecializationImpl(
397366
398367 if (InsertPos) {
399368#ifndef NDEBUG
400- auto Args = SETraits::getTemplateArgs (Entry);
401- // Due to hash collisions, it can happen that we load another template
402- // specialization with the same hash. This is fine, as long as the next
403- // call to findSpecializationImpl does not find a matching Decl for the
404- // template arguments.
405- loadLazySpecializationsImpl (Args);
406369 void *CorrectInsertPos;
407- assert (!findSpecializationImpl (Specializations, CorrectInsertPos, Args) &&
370+ assert (!findSpecializationImpl (Specializations,
371+ CorrectInsertPos,
372+ SETraits::getTemplateArgs (Entry)) &&
408373 InsertPos == CorrectInsertPos &&
409374 " given incorrect InsertPos for specialization" );
410375#endif
@@ -478,14 +443,12 @@ FunctionTemplateDecl::getSpecializations() const {
478443FunctionDecl *
479444FunctionTemplateDecl::findSpecialization (ArrayRef<TemplateArgument> Args,
480445 void *&InsertPos) {
481- auto *Common = getCommonPtr ();
482- return findSpecializationImpl (Common->Specializations , InsertPos, Args);
446+ return findSpecializationImpl (getSpecializations (), InsertPos, Args);
483447}
484448
485449void FunctionTemplateDecl::addSpecialization (
486450 FunctionTemplateSpecializationInfo *Info, void *InsertPos) {
487- auto *Common = getCommonPtr ();
488- addSpecializationImpl<FunctionTemplateDecl>(Common->Specializations , Info,
451+ addSpecializationImpl<FunctionTemplateDecl>(getSpecializations (), Info,
489452 InsertPos);
490453}
491454
@@ -545,9 +508,8 @@ ClassTemplateDecl *ClassTemplateDecl::CreateDeserialized(ASTContext &C,
545508 DeclarationName (), nullptr , nullptr );
546509}
547510
548- void ClassTemplateDecl::LoadLazySpecializations (
549- bool OnlyPartial/* =false*/ ) const {
550- loadLazySpecializationsImpl (OnlyPartial);
511+ void ClassTemplateDecl::LoadLazySpecializations () const {
512+ loadLazySpecializationsImpl ();
551513}
552514
553515llvm::FoldingSetVector<ClassTemplateSpecializationDecl> &
@@ -558,7 +520,7 @@ ClassTemplateDecl::getSpecializations() const {
558520
559521llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> &
560522ClassTemplateDecl::getPartialSpecializations () const {
561- LoadLazySpecializations (/* PartialOnly = */ true );
523+ LoadLazySpecializations ();
562524 return getCommonPtr ()->PartialSpecializations ;
563525}
564526
@@ -572,15 +534,12 @@ ClassTemplateDecl::newCommon(ASTContext &C) const {
572534ClassTemplateSpecializationDecl *
573535ClassTemplateDecl::findSpecialization (ArrayRef<TemplateArgument> Args,
574536 void *&InsertPos) {
575- auto *Common = getCommonPtr ();
576- return findSpecializationImpl (Common->Specializations , InsertPos, Args);
537+ return findSpecializationImpl (getSpecializations (), InsertPos, Args);
577538}
578539
579540void ClassTemplateDecl::AddSpecialization (ClassTemplateSpecializationDecl *D,
580541 void *InsertPos) {
581- auto *Common = getCommonPtr ();
582- addSpecializationImpl<ClassTemplateDecl>(Common->Specializations , D,
583- InsertPos);
542+ addSpecializationImpl<ClassTemplateDecl>(getSpecializations (), D, InsertPos);
584543}
585544
586545ClassTemplatePartialSpecializationDecl *
@@ -925,14 +884,6 @@ TemplateArgumentList::CreateCopy(ASTContext &Context,
925884 return new (Mem) TemplateArgumentList (Args);
926885}
927886
928- unsigned TemplateArgumentList::ComputeODRHash (ArrayRef<TemplateArgument> Args) {
929- ODRHash Hasher;
930- for (TemplateArgument TA : Args)
931- Hasher.AddTemplateArgument (TA);
932-
933- return Hasher.CalculateHash ();
934- }
935-
936887FunctionTemplateSpecializationInfo *FunctionTemplateSpecializationInfo::Create (
937888 ASTContext &C, FunctionDecl *FD, FunctionTemplateDecl *Template,
938889 TemplateSpecializationKind TSK, const TemplateArgumentList *TemplateArgs,
@@ -1275,9 +1226,8 @@ VarTemplateDecl *VarTemplateDecl::CreateDeserialized(ASTContext &C,
12751226 DeclarationName (), nullptr , nullptr );
12761227}
12771228
1278- void VarTemplateDecl::LoadLazySpecializations (
1279- bool OnlyPartial/* =false*/ ) const {
1280- loadLazySpecializationsImpl (OnlyPartial);
1229+ void VarTemplateDecl::LoadLazySpecializations () const {
1230+ loadLazySpecializationsImpl ();
12811231}
12821232
12831233llvm::FoldingSetVector<VarTemplateSpecializationDecl> &
@@ -1288,7 +1238,7 @@ VarTemplateDecl::getSpecializations() const {
12881238
12891239llvm::FoldingSetVector<VarTemplatePartialSpecializationDecl> &
12901240VarTemplateDecl::getPartialSpecializations () const {
1291- LoadLazySpecializations (/* PartialOnly = */ true );
1241+ LoadLazySpecializations ();
12921242 return getCommonPtr ()->PartialSpecializations ;
12931243}
12941244
@@ -1302,14 +1252,12 @@ VarTemplateDecl::newCommon(ASTContext &C) const {
13021252VarTemplateSpecializationDecl *
13031253VarTemplateDecl::findSpecialization (ArrayRef<TemplateArgument> Args,
13041254 void *&InsertPos) {
1305- auto *Common = getCommonPtr ();
1306- return findSpecializationImpl (Common->Specializations , InsertPos, Args);
1255+ return findSpecializationImpl (getSpecializations (), InsertPos, Args);
13071256}
13081257
13091258void VarTemplateDecl::AddSpecialization (VarTemplateSpecializationDecl *D,
13101259 void *InsertPos) {
1311- auto *Common = getCommonPtr ();
1312- addSpecializationImpl<VarTemplateDecl>(Common->Specializations , D, InsertPos);
1260+ addSpecializationImpl<VarTemplateDecl>(getSpecializations (), D, InsertPos);
13131261}
13141262
13151263VarTemplatePartialSpecializationDecl *
0 commit comments