Skip to content

Commit 49573b1

Browse files
[clang][ExtractAPI] Ensure TemplateArgumentLocations are only accessed if available (llvm#93205)
1 parent 992965b commit 49573b1

File tree

2 files changed

+65
-11
lines changed

2 files changed

+65
-11
lines changed

clang/lib/ExtractAPI/DeclarationFragments.cpp

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1073,12 +1073,22 @@ DeclarationFragmentsBuilder::getFragmentsForTemplateArguments(
10731073

10741074
if (StringRef(ArgumentFragment.begin()->Spelling)
10751075
.starts_with("type-parameter")) {
1076-
std::string ProperArgName = TemplateArgumentLocs.value()[i]
1077-
.getTypeSourceInfo()
1078-
->getType()
1079-
.getAsString();
1080-
ArgumentFragment.begin()->Spelling.swap(ProperArgName);
1076+
if (TemplateArgumentLocs.has_value() &&
1077+
TemplateArgumentLocs->size() > i) {
1078+
std::string ProperArgName = TemplateArgumentLocs.value()[i]
1079+
.getTypeSourceInfo()
1080+
->getType()
1081+
.getAsString();
1082+
ArgumentFragment.begin()->Spelling.swap(ProperArgName);
1083+
} else {
1084+
auto &Spelling = ArgumentFragment.begin()->Spelling;
1085+
Spelling.clear();
1086+
raw_string_ostream OutStream(Spelling);
1087+
CTA.print(Context.getPrintingPolicy(), OutStream, false);
1088+
OutStream.flush();
1089+
}
10811090
}
1091+
10821092
Fragments.append(std::move(ArgumentFragment));
10831093
break;
10841094
}
@@ -1194,9 +1204,9 @@ DeclarationFragmentsBuilder::getFragmentsForClassTemplateSpecialization(
11941204
cast<CXXRecordDecl>(Decl)))
11951205
.pop_back() // there is an extra semicolon now
11961206
.append("<", DeclarationFragments::FragmentKind::Text)
1197-
.append(
1198-
getFragmentsForTemplateArguments(Decl->getTemplateArgs().asArray(),
1199-
Decl->getASTContext(), std::nullopt))
1207+
.append(getFragmentsForTemplateArguments(
1208+
Decl->getTemplateArgs().asArray(), Decl->getASTContext(),
1209+
Decl->getTemplateArgsAsWritten()->arguments()))
12001210
.append(">", DeclarationFragments::FragmentKind::Text)
12011211
.appendSemicolon();
12021212
}
@@ -1237,9 +1247,9 @@ DeclarationFragmentsBuilder::getFragmentsForVarTemplateSpecialization(
12371247
.append(DeclarationFragmentsBuilder::getFragmentsForVarTemplate(Decl))
12381248
.pop_back() // there is an extra semicolon now
12391249
.append("<", DeclarationFragments::FragmentKind::Text)
1240-
.append(
1241-
getFragmentsForTemplateArguments(Decl->getTemplateArgs().asArray(),
1242-
Decl->getASTContext(), std::nullopt))
1250+
.append(getFragmentsForTemplateArguments(
1251+
Decl->getTemplateArgs().asArray(), Decl->getASTContext(),
1252+
Decl->getTemplateArgsAsWritten()->arguments()))
12431253
.append(">", DeclarationFragments::FragmentKind::Text)
12441254
.appendSemicolon();
12451255
}

clang/test/ExtractAPI/non_type_template.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,4 +310,48 @@ NestedTemplateTemplateParamPack<Bar, Bar> var;
310310
// VAR-NEXT: }
311311
// VAR-NEXT: ]
312312

313+
template <typename T>
314+
class TypeContainer {
315+
public:
316+
// RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix TYPE
317+
typedef Foo<T> Type;
318+
// TYPE-LABEL: "!testLabel": "c:non_type_template.cpp@ST>1#T@TypeContainer@T@Type",
319+
// TYPE: "declarationFragments": [
320+
// TYPE-NEXT: {
321+
// TYPE-NEXT: "kind": "keyword",
322+
// TYPE-NEXT: "spelling": "typedef"
323+
// TYPE-NEXT: },
324+
// TYPE-NEXT: {
325+
// TYPE-NEXT: "kind": "text",
326+
// TYPE-NEXT: "spelling": " "
327+
// TYPE-NEXT: },
328+
// TYPE-NEXT: {
329+
// TYPE-NEXT: "kind": "typeIdentifier",
330+
// TYPE-NEXT: "preciseIdentifier": "c:@ST>2#T#NI@Foo",
331+
// TYPE-NEXT: "spelling": "Foo"
332+
// TYPE-NEXT: },
333+
// TYPE-NEXT: {
334+
// TYPE-NEXT: "kind": "text",
335+
// TYPE-NEXT: "spelling": "<"
336+
// TYPE-NEXT: },
337+
// TYPE-NEXT: {
338+
// TYPE-NEXT: "kind": "typeIdentifier",
339+
// TYPE-NEXT: "preciseIdentifier": "c:t0.0",
340+
// TYPE-NEXT: "spelling": "T"
341+
// TYPE-NEXT: },
342+
// TYPE-NEXT: {
343+
// TYPE-NEXT: "kind": "text",
344+
// TYPE-NEXT: "spelling": "> "
345+
// TYPE-NEXT: },
346+
// TYPE-NEXT: {
347+
// TYPE-NEXT: "kind": "identifier",
348+
// TYPE-NEXT: "spelling": "Type"
349+
// TYPE-NEXT: },
350+
// TYPE-NEXT: {
351+
// TYPE-NEXT: "kind": "text",
352+
// TYPE-NEXT: "spelling": ";"
353+
// TYPE-NEXT: }
354+
// TYPE-NEXT: ]
355+
};
356+
313357
// expected-no-diagnostics

0 commit comments

Comments
 (0)