Skip to content

Commit 4dcbff3

Browse files
committed
Fix the generated C# for a case with 2 template args
When a template with 2 args and a method with a dependent pointer was specialized with const char*, there were methods with identical signatures generated for different specializations. Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent 76ba6d4 commit 4dcbff3

File tree

3 files changed

+9
-4
lines changed

3 files changed

+9
-4
lines changed

src/Generator/Generators/CSharp/CSharpTypePrinter.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -594,8 +594,9 @@ public TypePrinterResult VisitTemplateArgument(TemplateArgument a)
594594
if (a.Type.Type == null)
595595
return a.Integral.ToString(CultureInfo.InvariantCulture);
596596
var type = a.Type.Type.Desugar();
597-
return type.IsPointerToPrimitiveType() ? IntPtrType :
598-
type.IsPrimitiveType(PrimitiveType.Void) ? "object" : type.Visit(this).Type;
597+
return type.IsPointerToPrimitiveType() && !type.IsConstCharString() ?
598+
IntPtrType : type.IsPrimitiveType(PrimitiveType.Void) ? "object" :
599+
type.Visit(this).Type;
599600
}
600601

601602
public override TypePrinterResult VisitParameterDecl(Parameter parameter)

tests/CSharp/CSharpTemplates.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,8 @@ void TemplateSpecializer::completeSpecializationInParameter(DependentValueFields
120120

121121
void TemplateSpecializer::completeSpecializationInParameter(TwoTemplateArgs<int *, int *> p1,
122122
TwoTemplateArgs<int *, int> p2,
123-
TwoTemplateArgs<int *, float> p3)
123+
TwoTemplateArgs<int *, float> p3,
124+
TwoTemplateArgs<const char *, int> p4)
124125
{
125126
}
126127

tests/CSharp/CSharpTemplates.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,8 @@ T DependentPointerFields<T>::takeField(T t)
268268
template <typename K, typename V>
269269
class TwoTemplateArgs
270270
{
271+
public:
272+
void takeDependentPtrToSecondTemplateArg(const V& v);
271273
private:
272274
K key;
273275
V value;
@@ -534,7 +536,8 @@ class DLL_API TemplateSpecializer
534536
DependentValueFields<float*> p3);
535537
void completeSpecializationInParameter(TwoTemplateArgs<int*, int*> p1,
536538
TwoTemplateArgs<int*, int> p2,
537-
TwoTemplateArgs<int*, float> p3);
539+
TwoTemplateArgs<int*, float> p3,
540+
TwoTemplateArgs<const char*, int> p4);
538541
VirtualTemplate<void> returnSpecializedWithVoid();
539542
private:
540543
IndependentFields<int> independentFields;

0 commit comments

Comments
 (0)