Skip to content

Commit 0b62dec

Browse files
committed
Fix incorrect template argument kind
1 parent 7e211d6 commit 0b62dec

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

sources/libClangSharp/ClangSharp.cpp

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,38 @@ using namespace clang::cxstring;
2626
using namespace clang::cxtu;
2727
using namespace clang::cxtype;
2828

29+
CXTemplateArgumentKind ConvertTemplateArgumentKind(TemplateArgument::ArgKind kind) {
30+
switch (kind) {
31+
case TemplateArgument::Null:
32+
return CXTemplateArgumentKind_Null;
33+
case TemplateArgument::Type:
34+
return CXTemplateArgumentKind_Type;
35+
case TemplateArgument::Declaration:
36+
return CXTemplateArgumentKind_Declaration;
37+
case TemplateArgument::NullPtr:
38+
return CXTemplateArgumentKind_NullPtr;
39+
case TemplateArgument::Integral:
40+
return CXTemplateArgumentKind_Integral;
41+
case TemplateArgument::StructuralValue:
42+
// Does not exist in CXTemplateArgumentKind
43+
return CXTemplateArgumentKind_Invalid;
44+
case TemplateArgument::Template:
45+
return CXTemplateArgumentKind_Template;
46+
case TemplateArgument::TemplateExpansion:
47+
return CXTemplateArgumentKind_TemplateExpansion;
48+
case TemplateArgument::Expression:
49+
return CXTemplateArgumentKind_Expression;
50+
case TemplateArgument::Pack:
51+
return CXTemplateArgumentKind_Pack;
52+
default:
53+
return CXTemplateArgumentKind_Invalid;
54+
}
55+
}
56+
2957
CX_TemplateArgument MakeCXTemplateArgument(const TemplateArgument* TA, CXTranslationUnit TU, bool needsDispose = false) {
3058
if (TA) {
3159
assert(TU && "Invalid arguments!");
32-
return { static_cast<CXTemplateArgumentKind>(TA->getKind()), (needsDispose ? 1 : 0), TA, TU };
60+
return { ConvertTemplateArgumentKind(TA->getKind()), (needsDispose ? 1 : 0), TA, TU };
3361
}
3462

3563
return { };

tests/ClangSharp.UnitTests/CursorTests/DeclTest.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,26 @@ class MyClass<int, U>
7474
var templateParameter = classTemplatePartialSpecializationDecl.TemplateParameters.Single();
7575
Assert.That(templateParameter.Name, Is.EqualTo("U"));
7676
}
77+
78+
[Test]
79+
public void TemplateParameterPackTest()
80+
{
81+
var inputContents = $@"template<class... Types>
82+
class tuple;
83+
84+
tuple<int, long> SomeFunction();
85+
";
86+
87+
using var translationUnit = CreateTranslationUnit(inputContents);
88+
89+
var functionDecl = translationUnit.TranslationUnitDecl.Decls.OfType<FunctionDecl>().Single();
90+
var tupleDecl = functionDecl.ReturnType.AsCXXRecordDecl as ClassTemplateSpecializationDecl;
91+
Assert.That(tupleDecl, Is.Not.Null);
92+
Assert.That(tupleDecl!.TemplateArgs.Count, Is.EqualTo(1));
93+
94+
var packElements = tupleDecl.TemplateArgs[0].PackElements;
95+
Assert.That(packElements.Count, Is.EqualTo(2));
96+
Assert.That(packElements[0].AsType.AsString, Is.EqualTo("int"));
97+
Assert.That(packElements[1].AsType.AsString, Is.EqualTo("long"));
98+
}
7799
}

0 commit comments

Comments
 (0)