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
if (a.Type.Type == null) if (a.Type.Type == null)
return a.Integral.ToString(CultureInfo.InvariantCulture); return a.Integral.ToString(CultureInfo.InvariantCulture);
var type = a.Type.Type.Desugar(); var type = a.Type.Type.Desugar();
return type.IsPointerToPrimitiveType() ? IntPtrType : return type.IsPointerToPrimitiveType() && !type.IsConstCharString() ?
type.IsPrimitiveType(PrimitiveType.Void) ? "object" : type.Visit(this).Type; IntPtrType : type.IsPrimitiveType(PrimitiveType.Void) ? "object" :
type.Visit(this).Type;
} }
public override TypePrinterResult VisitParameterDecl(Parameter parameter) public override TypePrinterResult VisitParameterDecl(Parameter parameter)

3
tests/CSharp/CSharpTemplates.cpp

@ -120,7 +120,8 @@ void TemplateSpecializer::completeSpecializationInParameter(DependentValueFields
void TemplateSpecializer::completeSpecializationInParameter(TwoTemplateArgs<int *, int *> p1, void TemplateSpecializer::completeSpecializationInParameter(TwoTemplateArgs<int *, int *> p1,
TwoTemplateArgs<int *, int> p2, 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)
template <typename K, typename V> template <typename K, typename V>
class TwoTemplateArgs class TwoTemplateArgs
{ {
public:
void takeDependentPtrToSecondTemplateArg(const V& v);
private: private:
K key; K key;
V value; V value;
@ -534,7 +536,8 @@ public:
DependentValueFields<float*> p3); DependentValueFields<float*> p3);
void completeSpecializationInParameter(TwoTemplateArgs<int*, int*> p1, void completeSpecializationInParameter(TwoTemplateArgs<int*, int*> p1,
TwoTemplateArgs<int*, int> p2, TwoTemplateArgs<int*, int> p2,
TwoTemplateArgs<int*, float> p3); TwoTemplateArgs<int*, float> p3,
TwoTemplateArgs<const char*, int> p4);
VirtualTemplate<void> returnSpecializedWithVoid(); VirtualTemplate<void> returnSpecializedWithVoid();
private: private:
IndependentFields<int> independentFields; IndependentFields<int> independentFields;

Loading…
Cancel
Save