diff --git a/src/Generator/Passes/CheckOperatorsOverloads.cs b/src/Generator/Passes/CheckOperatorsOverloads.cs index 50bd0ecd..22564dd6 100644 --- a/src/Generator/Passes/CheckOperatorsOverloads.cs +++ b/src/Generator/Passes/CheckOperatorsOverloads.cs @@ -100,9 +100,18 @@ namespace CppSharp.Passes if (!@operator.ReturnType.Qualifiers.IsConst && @operator.ReturnType.Type.IsAddress()) property.SetMethod = @operator; - // C++/CLI uses "default" as the indexer property name. if (Driver.Options.IsCLIGenerator) - property.Name = "default"; + { + // If we've a setter use the pointee as the type of the property. + var pointerType = property.Type as PointerType; + if (pointerType != null && property.HasSetter) + { + property.QualifiedType = new QualifiedType(pointerType.Pointee, property.QualifiedType.Qualifiers); + property.GetMethod.ReturnType = property.QualifiedType; + } + // C++/CLI uses "default" as the indexer property name. + property.Name = "default"; + } property.Parameters.AddRange(@operator.Parameters); diff --git a/tests/Basic/Basic.Tests.cs b/tests/Basic/Basic.Tests.cs index 0ad5c6b7..fc289418 100644 --- a/tests/Basic/Basic.Tests.cs +++ b/tests/Basic/Basic.Tests.cs @@ -234,7 +234,9 @@ public class BasicTests : GeneratorTestFixture { var someStruct = new SomeStruct(); Assert.That(someStruct[0], Is.EqualTo(1)); - Assert.That(someStruct["foo"], Is.EqualTo(1)); + Assert.That(someStruct["foo"], Is.EqualTo(1)); + someStruct[0] = 2; + Assert.That(someStruct[0], Is.EqualTo(2)); } [Test] diff --git a/tests/Basic/Basic.h b/tests/Basic/Basic.h index 4a836261..29012b47 100644 --- a/tests/Basic/Basic.h +++ b/tests/Basic/Basic.h @@ -315,8 +315,8 @@ typedef unsigned long foo_t; typedef struct DLL_API SomeStruct { SomeStruct() : p(1) {} - const foo_t& operator[](int i) const { return p; } - foo_t operator[](int i) { return p; } + foo_t& operator[](int i) { return p; } + // CSharp backend can't deal with a setter here foo_t operator[](const char* name) { return p; } foo_t p; }