Browse Source

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 <dpldobrev@protonmail.com>
pull/1194/head
Dimitar Dobrev 6 years ago
parent
commit
4dcbff3d62
  1. 5
      src/Generator/Generators/CSharp/CSharpTypePrinter.cs
  2. 3
      tests/CSharp/CSharpTemplates.cpp
  3. 5
      tests/CSharp/CSharpTemplates.h

5
src/Generator/Generators/CSharp/CSharpTypePrinter.cs

@ -594,8 +594,9 @@ namespace CppSharp.Generators.CSharp @@ -594,8 +594,9 @@ namespace CppSharp.Generators.CSharp
if (a.Type.Type == null)
return a.Integral.ToString(CultureInfo.InvariantCulture);
var type = a.Type.Type.Desugar();
return type.IsPointerToPrimitiveType() ? IntPtrType :
type.IsPrimitiveType(PrimitiveType.Void) ? "object" : type.Visit(this).Type;
return type.IsPointerToPrimitiveType() && !type.IsConstCharString() ?
IntPtrType : type.IsPrimitiveType(PrimitiveType.Void) ? "object" :
type.Visit(this).Type;
}
public override TypePrinterResult VisitParameterDecl(Parameter parameter)

3
tests/CSharp/CSharpTemplates.cpp

@ -120,7 +120,8 @@ void TemplateSpecializer::completeSpecializationInParameter(DependentValueFields @@ -120,7 +120,8 @@ void TemplateSpecializer::completeSpecializationInParameter(DependentValueFields
void TemplateSpecializer::completeSpecializationInParameter(TwoTemplateArgs<int *, int *> p1,
TwoTemplateArgs<int *, int> p2,
TwoTemplateArgs<int *, float> p3)
TwoTemplateArgs<int *, float> p3,
TwoTemplateArgs<const char *, int> p4)
{
}

5
tests/CSharp/CSharpTemplates.h

@ -268,6 +268,8 @@ T DependentPointerFields<T>::takeField(T t) @@ -268,6 +268,8 @@ T DependentPointerFields<T>::takeField(T t)
template <typename K, typename V>
class TwoTemplateArgs
{
public:
void takeDependentPtrToSecondTemplateArg(const V& v);
private:
K key;
V value;
@ -534,7 +536,8 @@ public: @@ -534,7 +536,8 @@ public:
DependentValueFields<float*> p3);
void completeSpecializationInParameter(TwoTemplateArgs<int*, int*> p1,
TwoTemplateArgs<int*, int> p2,
TwoTemplateArgs<int*, float> p3);
TwoTemplateArgs<int*, float> p3,
TwoTemplateArgs<const char*, int> p4);
VirtualTemplate<void> returnSpecializedWithVoid();
private:
IndependentFields<int> independentFields;

Loading…
Cancel
Save