Skip to content

Commit ab7e6b6

Browse files
[clang][ExtractAPI] Ensure TemplateArgumentLocations are only accessed if available (#93205)
1 parent 8178a3a commit ab7e6b6

File tree

2 files changed

+65
-11
lines changed

2 files changed

+65
-11
lines changed

clang/lib/ExtractAPI/DeclarationFragments.cpp

+21-11
Original file line numberDiff line numberDiff line change
@@ -1084,12 +1084,22 @@ DeclarationFragmentsBuilder::getFragmentsForTemplateArguments(
10841084

10851085
if (StringRef(ArgumentFragment.begin()->Spelling)
10861086
.starts_with("type-parameter")) {
1087-
std::string ProperArgName = TemplateArgumentLocs.value()[i]
1088-
.getTypeSourceInfo()
1089-
->getType()
1090-
.getAsString();
1091-
ArgumentFragment.begin()->Spelling.swap(ProperArgName);
1087+
if (TemplateArgumentLocs.has_value() &&
1088+
TemplateArgumentLocs->size() > i) {
1089+
std::string ProperArgName = TemplateArgumentLocs.value()[i]
1090+
.getTypeSourceInfo()
1091+
->getType()
1092+
.getAsString();
1093+
ArgumentFragment.begin()->Spelling.swap(ProperArgName);
1094+
} else {
1095+
auto &Spelling = ArgumentFragment.begin()->Spelling;
1096+
Spelling.clear();
1097+
raw_string_ostream OutStream(Spelling);
1098+
CTA.print(Context.getPrintingPolicy(), OutStream, false);
1099+
OutStream.flush();
1100+
}
10921101
}
1102+
10931103
Fragments.append(std::move(ArgumentFragment));
10941104
break;
10951105
}
@@ -1212,9 +1222,9 @@ DeclarationFragmentsBuilder::getFragmentsForClassTemplateSpecialization(
12121222
cast<CXXRecordDecl>(Decl)))
12131223
.pop_back() // there is an extra semicolon now
12141224
.append("<", DeclarationFragments::FragmentKind::Text)
1215-
.append(
1216-
getFragmentsForTemplateArguments(Decl->getTemplateArgs().asArray(),
1217-
Decl->getASTContext(), std::nullopt))
1225+
.append(getFragmentsForTemplateArguments(
1226+
Decl->getTemplateArgs().asArray(), Decl->getASTContext(),
1227+
Decl->getTemplateArgsAsWritten()->arguments()))
12181228
.append(">", DeclarationFragments::FragmentKind::Text)
12191229
.appendSemicolon();
12201230
}
@@ -1255,9 +1265,9 @@ DeclarationFragmentsBuilder::getFragmentsForVarTemplateSpecialization(
12551265
.append(DeclarationFragmentsBuilder::getFragmentsForVarTemplate(Decl))
12561266
.pop_back() // there is an extra semicolon now
12571267
.append("<", DeclarationFragments::FragmentKind::Text)
1258-
.append(
1259-
getFragmentsForTemplateArguments(Decl->getTemplateArgs().asArray(),
1260-
Decl->getASTContext(), std::nullopt))
1268+
.append(getFragmentsForTemplateArguments(
1269+
Decl->getTemplateArgs().asArray(), Decl->getASTContext(),
1270+
Decl->getTemplateArgsAsWritten()->arguments()))
12611271
.append(">", DeclarationFragments::FragmentKind::Text)
12621272
.appendSemicolon();
12631273
}

clang/test/ExtractAPI/non_type_template.cpp

+44
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)