Skip to content

Commit 5ccdd58

Browse files
committed
Use property-based serialization for TemplateArgument.
1 parent 2c07b1e commit 5ccdd58

File tree

4 files changed

+101
-90
lines changed

4 files changed

+101
-90
lines changed

clang/include/clang/AST/AbstractBasicReader.h

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -197,54 +197,6 @@ class DataStreamBasicReader : public BasicReaderBase<Impl> {
197197
return FunctionProtoType::ExtParameterInfo::getFromOpaqueValue(value);
198198
}
199199

200-
TemplateArgument readTemplateArgument(bool canonicalize = false) {
201-
if (canonicalize) {
202-
return getASTContext().getCanonicalTemplateArgument(
203-
readTemplateArgument(false));
204-
}
205-
206-
auto kind = asImpl().readTemplateArgumentKind();
207-
switch (kind) {
208-
case TemplateArgument::Null:
209-
return TemplateArgument();
210-
case TemplateArgument::Type:
211-
return TemplateArgument(asImpl().readQualType());
212-
case TemplateArgument::Declaration: {
213-
auto decl = asImpl().readValueDeclRef();
214-
auto type = asImpl().readQualType();
215-
return TemplateArgument(decl, type);
216-
}
217-
case TemplateArgument::NullPtr:
218-
return TemplateArgument(asImpl().readQualType(), /*nullptr*/ true);
219-
case TemplateArgument::Integral: {
220-
auto value = asImpl().readAPSInt();
221-
auto type = asImpl().readQualType();
222-
return TemplateArgument(getASTContext(), value, type);
223-
}
224-
case TemplateArgument::Template:
225-
return TemplateArgument(asImpl().readTemplateName());
226-
case TemplateArgument::TemplateExpansion: {
227-
auto name = asImpl().readTemplateName();
228-
auto numExpansions = asImpl().template readOptional<uint32_t>();
229-
return TemplateArgument(name, numExpansions);
230-
}
231-
case TemplateArgument::Expression:
232-
return TemplateArgument(asImpl().readExprRef());
233-
case TemplateArgument::Pack: {
234-
llvm::SmallVector<TemplateArgument, 8> packBuffer;
235-
auto pack = asImpl().template readArray<TemplateArgument>(packBuffer);
236-
237-
// Copy the pack into the ASTContext.
238-
TemplateArgument *contextPack =
239-
new (getASTContext()) TemplateArgument[pack.size()];
240-
for (size_t i = 0, e = pack.size(); i != e; ++i)
241-
contextPack[i] = pack[i];
242-
return TemplateArgument(llvm::makeArrayRef(contextPack, pack.size()));
243-
}
244-
}
245-
llvm_unreachable("bad template argument kind");
246-
}
247-
248200
NestedNameSpecifier *readNestedNameSpecifier() {
249201
auto &ctx = getASTContext();
250202

clang/include/clang/AST/AbstractBasicWriter.h

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -178,47 +178,6 @@ class DataStreamBasicWriter : public BasicWriterBase<Impl> {
178178
asImpl().writeUInt32(epi.getOpaqueValue());
179179
}
180180

181-
void writeTemplateArgument(const TemplateArgument &arg) {
182-
asImpl().writeTemplateArgumentKind(arg.getKind());
183-
switch (arg.getKind()) {
184-
case TemplateArgument::Null:
185-
return;
186-
case TemplateArgument::Type:
187-
asImpl().writeQualType(arg.getAsType());
188-
return;
189-
case TemplateArgument::Declaration:
190-
asImpl().writeValueDeclRef(arg.getAsDecl());
191-
asImpl().writeQualType(arg.getParamTypeForDecl());
192-
return;
193-
case TemplateArgument::NullPtr:
194-
asImpl().writeQualType(arg.getNullPtrType());
195-
return;
196-
case TemplateArgument::Integral:
197-
asImpl().writeAPSInt(arg.getAsIntegral());
198-
asImpl().writeQualType(arg.getIntegralType());
199-
return;
200-
case TemplateArgument::Template:
201-
asImpl().writeTemplateName(arg.getAsTemplateOrTemplatePattern());
202-
return;
203-
case TemplateArgument::TemplateExpansion: {
204-
asImpl().writeTemplateName(arg.getAsTemplateOrTemplatePattern());
205-
// Convert Optional<unsigned> to Optional<uint32>, just in case.
206-
Optional<unsigned> numExpansions = arg.getNumTemplateExpansions();
207-
Optional<uint32_t> numExpansions32;
208-
if (numExpansions) numExpansions32 = *numExpansions;
209-
asImpl().template writeOptional<uint32_t>(numExpansions32);
210-
return;
211-
}
212-
case TemplateArgument::Expression:
213-
asImpl().writeExprRef(arg.getAsExpr());
214-
return;
215-
case TemplateArgument::Pack:
216-
asImpl().template writeArray<TemplateArgument>(arg.pack_elements());
217-
return;
218-
}
219-
llvm_unreachable("bad template argument kind");
220-
}
221-
222181
void writeNestedNameSpecifier(NestedNameSpecifier *NNS) {
223182
// Nested name specifiers usually aren't too long. I think that 8 would
224183
// typically accommodate the vast majority.

clang/include/clang/AST/PropertiesBase.td

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,3 +401,95 @@ let Class = PropertyTypeCase<TemplateName, "SubstTemplateTemplateParmPack"> in {
401401
return ctx.getSubstTemplateTemplateParmPack(parameterPack, argumentPack);
402402
}]>;
403403
}
404+
405+
// Type cases for TemplateArgument.
406+
def : PropertyTypeKind<TemplateArgument, TemplateArgumentKind,
407+
"node.getKind()">;
408+
let Class = PropertyTypeCase<TemplateArgument, "Null"> in {
409+
def : Creator<[{
410+
return TemplateArgument();
411+
}]>;
412+
}
413+
let Class = PropertyTypeCase<TemplateArgument, "Type"> in {
414+
def : Property<"type", QualType> {
415+
let Read = [{ node.getAsType() }];
416+
}
417+
def : Creator<[{
418+
return TemplateArgument(type);
419+
}]>;
420+
}
421+
let Class = PropertyTypeCase<TemplateArgument, "Declaration"> in {
422+
def : Property<"declaration", ValueDeclRef> {
423+
let Read = [{ node.getAsDecl() }];
424+
}
425+
def : Property<"parameterType", QualType> {
426+
let Read = [{ node.getParamTypeForDecl() }];
427+
}
428+
def : Creator<[{
429+
return TemplateArgument(declaration, parameterType);
430+
}]>;
431+
}
432+
let Class = PropertyTypeCase<TemplateArgument, "NullPtr"> in {
433+
def : Property<"type", QualType> {
434+
let Read = [{ node.getNullPtrType() }];
435+
}
436+
def : Creator<[{
437+
return TemplateArgument(type, /*nullptr*/ true);
438+
}]>;
439+
}
440+
let Class = PropertyTypeCase<TemplateArgument, "Integral"> in {
441+
def : Property<"value", APSInt> {
442+
let Read = [{ node.getAsIntegral() }];
443+
}
444+
def : Property<"type", QualType> {
445+
let Read = [{ node.getIntegralType() }];
446+
}
447+
def : Creator<[{
448+
return TemplateArgument(ctx, value, type);
449+
}]>;
450+
}
451+
let Class = PropertyTypeCase<TemplateArgument, "Template"> in {
452+
def : Property<"name", TemplateName> {
453+
let Read = [{ node.getAsTemplateOrTemplatePattern() }];
454+
}
455+
def : Creator<[{
456+
return TemplateArgument(name);
457+
}]>;
458+
}
459+
let Class = PropertyTypeCase<TemplateArgument, "TemplateExpansion"> in {
460+
def : Property<"name", TemplateName> {
461+
let Read = [{ node.getAsTemplateOrTemplatePattern() }];
462+
}
463+
def : Property<"numExpansions", Optional<UInt32>> {
464+
let Read = [{
465+
// Translate unsigned -> uint32_t just in case.
466+
node.getNumTemplateExpansions().map(
467+
[](unsigned i) { return uint32_t(i); })
468+
}];
469+
}
470+
def : Creator<[{
471+
auto numExpansionsUnsigned =
472+
numExpansions.map([](uint32_t i) { return unsigned(i); });
473+
return TemplateArgument(name, numExpansionsUnsigned);
474+
}]>;
475+
}
476+
let Class = PropertyTypeCase<TemplateArgument, "Expression"> in {
477+
def : Property<"expression", ExprRef> {
478+
let Read = [{ node.getAsExpr() }];
479+
}
480+
def : Creator<[{
481+
return TemplateArgument(expression);
482+
}]>;
483+
}
484+
let Class = PropertyTypeCase<TemplateArgument, "Pack"> in {
485+
def : Property<"elements", Array<TemplateArgument>> {
486+
let Read = [{ node.pack_elements() }];
487+
}
488+
def : Creator<[{
489+
// Copy the pack into the ASTContext.
490+
TemplateArgument *ctxElements = new (ctx) TemplateArgument[elements.size()];
491+
for (size_t i = 0, e = elements.size(); i != e; ++i)
492+
ctxElements[i] = elements[i];
493+
return TemplateArgument(llvm::makeArrayRef(ctxElements, elements.size()));
494+
}]>;
495+
}

clang/include/clang/Serialization/ASTRecordReader.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,15 @@ class ASTRecordReader
228228
// TemplateName readTemplateName(); (inherited)
229229

230230
/// Read a template argument, advancing Idx. (inherited)
231-
// TemplateArgument readTemplateArgument(bool Canonicalize = false);
231+
// TemplateArgument readTemplateArgument();
232+
using DataStreamBasicReader::readTemplateArgument;
233+
TemplateArgument readTemplateArgument(bool Canonicalize) {
234+
TemplateArgument Arg = readTemplateArgument();
235+
if (Canonicalize) {
236+
Arg = getContext().getCanonicalTemplateArgument(Arg);
237+
}
238+
return Arg;
239+
}
232240

233241
/// Read a template parameter list, advancing Idx.
234242
TemplateParameterList *readTemplateParameterList();

0 commit comments

Comments
 (0)