26#include "llvm/ADT/ArrayRef.h"
27#include "llvm/ADT/FoldingSet.h"
28#include "llvm/Support/Compiler.h"
29#include "llvm/Support/raw_ostream.h"
36DeducedTemplateStorage::DeducedTemplateStorage(
TemplateName Underlying,
40 Underlying(Underlying) {
55 ID.AddInteger(DefArgs.
Args.size());
67 return cast<TemplateTemplateParmDecl>(
74 return cast<TemplateTemplateParmDecl>(
85 unsigned Index, std::optional<unsigned> PackIndex) {
86 Replacement.Profile(ID);
87 ID.AddPointer(AssociatedDecl);
89 ID.AddInteger(PackIndex ? *PackIndex + 1 : 0);
97 Arguments(ArgPack.data()), AssociatedDeclAndFinal(AssociatedDecl, Final) {
98 assert(AssociatedDecl !=
nullptr);
108 return AssociatedDeclAndFinal.getPointer();
112 return AssociatedDeclAndFinal.getInt();
116 llvm::FoldingSetNodeID &ID,
ASTContext &Context,
120 ID.AddPointer(AssociatedDecl);
121 ID.AddInteger(Index);
122 ID.AddBoolean(Final);
126 Storage = StorageType::getFromOpaqueValue(Ptr);
131 : Storage(Storage) {}
133 : Storage(Storage) {}
135 : Storage(Storage) {}
137 : Storage(Storage) {}
142 : Storage(Deduced) {}
147 if (
auto *ND = Storage.dyn_cast<
Decl *>()) {
148 if (isa<UsingShadowDecl>(ND))
150 assert(isa<TemplateDecl>(ND));
154 if (isa<DependentTemplateName *>(Storage))
156 if (isa<QualifiedTemplateName *>(Storage))
160 cast<UncommonTemplateNameStorage *>(Storage);
176 while (std::optional<TemplateName> UnderlyingOrNone =
177 Name.desugar(IgnoreDeduced))
178 Name = *UnderlyingOrNone;
181 assert(Name.getAsDeducedTemplateName() ==
nullptr &&
182 "Unexpected canonical DeducedTemplateName; Did you mean to use "
183 "getTemplateDeclAndDefaultArgs instead?");
185 return cast_if_present<TemplateDecl>(Name.Storage.dyn_cast<
Decl *>());
188std::pair<TemplateDecl *, DefaultArguments>