Browse Source

Generate valid C# for unions in templates with non-type args

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1641/head
Dimitar Dobrev 4 years ago
parent
commit
634c231853
  1. 2
      src/Generator/Driver.cs
  2. 4
      src/Generator/Passes/FlattenAnonymousTypesToFields.cs
  3. 7
      tests/CSharp/CSharp.Tests.cs
  4. 6
      tests/CSharp/CSharpTemplates.h

2
src/Generator/Driver.cs

@ -221,8 +221,8 @@ namespace CppSharp
if (Options.IsCSharpGenerator) if (Options.IsCSharpGenerator)
TranslationUnitPasses.AddPass(new EqualiseAccessOfOverrideAndBasePass()); TranslationUnitPasses.AddPass(new EqualiseAccessOfOverrideAndBasePass());
TranslationUnitPasses.AddPass(new CheckIgnoredDeclsPass());
TranslationUnitPasses.AddPass(new FlattenAnonymousTypesToFields()); TranslationUnitPasses.AddPass(new FlattenAnonymousTypesToFields());
TranslationUnitPasses.AddPass(new CheckIgnoredDeclsPass());
TranslationUnitPasses.AddPass(new MarkUsedClassInternalsPass()); TranslationUnitPasses.AddPass(new MarkUsedClassInternalsPass());
if (Options.IsCSharpGenerator) if (Options.IsCSharpGenerator)

4
src/Generator/Passes/FlattenAnonymousTypesToFields.cs

@ -31,8 +31,6 @@ namespace CppSharp.Passes
ReplaceField(@class, i, fieldType); ReplaceField(@class, i, fieldType);
fieldType.Fields.Clear(); fieldType.Fields.Clear();
fieldType.ExplicitlyIgnore(); fieldType.ExplicitlyIgnore();
if (fieldType.IsUnion)
@class.HasUnionFields = true;
} }
if (@class.Layout == null) if (@class.Layout == null)
@ -50,6 +48,8 @@ namespace CppSharp.Passes
ReplaceLayoutField(@class, i, fieldType); ReplaceLayoutField(@class, i, fieldType);
fieldType.Fields.Clear(); fieldType.Fields.Clear();
fieldType.ExplicitlyIgnore(); fieldType.ExplicitlyIgnore();
if (fieldType.IsUnion)
@class.HasUnionFields = true;
} }
return true; return true;

7
tests/CSharp/CSharp.Tests.cs

@ -38,6 +38,7 @@ public unsafe class CSharpTests
new HasProtectedVirtual().Dispose(); new HasProtectedVirtual().Dispose();
new Proprietor(5).Dispose(); new Proprietor(5).Dispose();
new HasCtorWithMappedToEnum<TestFlag>(TestFlag.Flag1).Dispose(); new HasCtorWithMappedToEnum<TestFlag>(TestFlag.Flag1).Dispose();
new TestAnonymousMemberNameCollision().Dispose();
using (var testOverrideFromSecondaryBase = new TestOverrideFromSecondaryBase()) using (var testOverrideFromSecondaryBase = new TestOverrideFromSecondaryBase())
{ {
testOverrideFromSecondaryBase.function(); testOverrideFromSecondaryBase.function();
@ -1749,12 +1750,6 @@ public unsafe class CSharpTests
Assert.That(CSharp.CSharp.TakeTypemapTypedefParam(false), Is.False); Assert.That(CSharp.CSharp.TakeTypemapTypedefParam(false), Is.False);
} }
[Test]
public void TestAnonymousMemberNameCollision()
{
StringAssert.EndsWith(nameof(CSharp.TestAnonymousMemberNameCollision._0.__0), "__0");
}
[Test] [Test]
public void TestStringMarshall() public void TestStringMarshall()
{ {

6
tests/CSharp/CSharpTemplates.h

@ -832,6 +832,12 @@ class ClassWithNonTypeTemplateArgument
{ {
public: public:
ClassWithNonTypeTemplateArgument() { } ClassWithNonTypeTemplateArgument() { }
private:
union
{
int i;
DependentValueFields<TestFlag> d;
};
}; };
class SpecializationOfClassWithNonTypeTemplateArgument : public ClassWithNonTypeTemplateArgument<0> class SpecializationOfClassWithNonTypeTemplateArgument : public ClassWithNonTypeTemplateArgument<0>

Loading…
Cancel
Save