Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1113,8 +1113,7 @@ private void VisitRecordDecl(RecordDecl recordDecl)
long alignment32 = -1;
long alignment64 = -1;

GetTypeSize(recordDecl, recordDecl.TypeForDecl, ref alignment32, ref alignment64, out var size32,
out var size64);
GetTypeSize(recordDecl, recordDecl.TypeForDecl, ref alignment32, ref alignment64, out var size32, out var size64);

string nativeNameWithExtras = null, nativeInheritance = null;
if ((cxxRecordDecl != null) && cxxRecordDecl.Bases.Any())
Expand Down Expand Up @@ -1151,7 +1150,7 @@ private void VisitRecordDecl(RecordDecl recordDecl)
Alignment64 = alignment64,
Size32 = size32,
Size64 = size64,
Pack = recordDecl.HasAttrs && recordDecl.Attrs.Any((attr) => attr.Kind == CX_AttrKind.CX_AttrKind_MaxFieldAlignment) && ((alignment != alignment32) || (alignment != alignment64)) ? alignment : 0,
Pack = alignment < maxAlignm ? alignment : 0,
MaxFieldAlignment = maxAlignm,
Kind = layoutKind
},
Expand Down Expand Up @@ -2183,8 +2182,7 @@ void VisitConstantArrayFieldDecl(RecordDecl recordDecl, FieldDecl constantArray)
long alignment32 = -1;
long alignment64 = -1;

GetTypeSize(constantArray, constantArray.Type, ref alignment32, ref alignment64, out var size32,
out var size64);
GetTypeSize(constantArray, constantArray.Type, ref alignment32, ref alignment64, out var size32, out var size64);

if ((size32 == 0 || size64 == 0) && _testOutputBuilder != null)
{
Expand All @@ -2201,7 +2199,7 @@ void VisitConstantArrayFieldDecl(RecordDecl recordDecl, FieldDecl constantArray)
Alignment64 = alignment64,
Size32 = size32,
Size64 = size64,
Pack = recordDecl.HasAttrs && recordDecl.Attrs.Any((attr) => attr.Kind == CX_AttrKind.CX_AttrKind_MaxFieldAlignment) && ((alignment != alignment32) || (alignment != alignment64)) ? alignment : 0,
Pack = alignment < maxAlignm ? alignment : 0,
MaxFieldAlignment = maxAlignm,
Kind = LayoutKind.Sequential
},
Expand Down Expand Up @@ -3136,8 +3134,7 @@ private bool IsConstant(Expr initExpr)
long alignment32 = -1;
long alignment64 = -1;

GetTypeSize(unaryExprOrTypeTraitExpr, argumentType, ref alignment32, ref alignment64, out var size32,
out var size64);
GetTypeSize(unaryExprOrTypeTraitExpr, argumentType, ref alignment32, ref alignment64, out var size32, out var size64);

switch (unaryExprOrTypeTraitExpr.Kind)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1323,36 +1323,42 @@ struct MyStruct2 {
};
";

const string ExpectedOutputContents = @"using System.Runtime.InteropServices;
var usingStatement = "using System.Runtime.InteropServices;\n\n";
var packing = " [StructLayout(LayoutKind.Sequential, Pack = 4)]\n";

namespace ClangSharp.Test
{
if (!Environment.Is64BitProcess)
{
usingStatement = string.Empty;
packing = string.Empty;
}

var expectedOutputContents = $@"{usingStatement}namespace ClangSharp.Test
{{
public unsafe partial struct MyStruct1
{
{{
[NativeTypeName(""unsigned int"")]
public uint Field1;

public void* Field2;

[NativeTypeName(""unsigned int"")]
public uint Field3;
}
}}

[StructLayout(LayoutKind.Sequential, Pack = 4)]
public unsafe partial struct MyStruct2
{
{packing} public unsafe partial struct MyStruct2
{{
[NativeTypeName(""unsigned int"")]
public uint Field1;

public void* Field2;

[NativeTypeName(""unsigned int"")]
public uint Field3;
}
}
}}
}}
";

return ValidateGeneratedCSharpCompatibleUnixBindingsAsync(InputContents, ExpectedOutputContents);
return ValidateGeneratedCSharpCompatibleUnixBindingsAsync(InputContents, expectedOutputContents);
}

public override Task PointerToSelfTest()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,12 +133,13 @@ union MyUnion3
unsigned int o0_b1_1 : 1;
};
";
var expectedPack = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? ", Pack = 1" : "";

var expectedOutputContents = $@"using System.Runtime.InteropServices;

namespace ClangSharp.Test
{{
[StructLayout(LayoutKind.Explicit)]
[StructLayout(LayoutKind.Explicit{expectedPack})]
public partial struct MyUnion1
{{
[FieldOffset(0)]
Expand Down Expand Up @@ -287,7 +288,7 @@ public uint o8_b0_1
}}
}}

[StructLayout(LayoutKind.Explicit)]
[StructLayout(LayoutKind.Explicit{expectedPack})]
public partial struct MyUnion3
{{
[FieldOffset(0)]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1327,36 +1327,42 @@ struct MyStruct2 {
};
";

const string ExpectedOutputContents = @"using System.Runtime.InteropServices;
var usingStatement = "using System.Runtime.InteropServices;\n\n";
var packing = " [StructLayout(LayoutKind.Sequential, Pack = 4)]\n";

namespace ClangSharp.Test
{
if (!Environment.Is64BitProcess)
{
usingStatement = string.Empty;
packing = string.Empty;
}

var expectedOutputContents = $@"{usingStatement}namespace ClangSharp.Test
{{
public unsafe partial struct MyStruct1
{
{{
[NativeTypeName(""unsigned int"")]
public uint Field1;

public void* Field2;

[NativeTypeName(""unsigned int"")]
public uint Field3;
}
}}

[StructLayout(LayoutKind.Sequential, Pack = 4)]
public unsafe partial struct MyStruct2
{
{packing} public unsafe partial struct MyStruct2
{{
[NativeTypeName(""unsigned int"")]
public uint Field1;

public void* Field2;

[NativeTypeName(""unsigned int"")]
public uint Field3;
}
}
}}
}}
";

return ValidateGeneratedCSharpCompatibleWindowsBindingsAsync(InputContents, ExpectedOutputContents);
return ValidateGeneratedCSharpCompatibleWindowsBindingsAsync(InputContents, expectedOutputContents);
}

public override Task PointerToSelfTest()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,11 +134,13 @@ union MyUnion3
};
";

var expectedPack = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? ", Pack = 1" : "";

var expectedOutputContents = $@"using System.Runtime.InteropServices;

namespace ClangSharp.Test
{{
[StructLayout(LayoutKind.Explicit)]
[StructLayout(LayoutKind.Explicit{expectedPack})]
public partial struct MyUnion1
{{
[FieldOffset(0)]
Expand Down Expand Up @@ -293,7 +295,7 @@ public uint o8_b0_1
}}
}}

[StructLayout(LayoutKind.Explicit)]
[StructLayout(LayoutKind.Explicit{expectedPack})]
public partial struct MyUnion3
{{
[FieldOffset(0)]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1302,36 +1302,42 @@ struct MyStruct2 {
};
";

const string ExpectedOutputContents = @"using System.Runtime.InteropServices;
var usingStatement = "using System.Runtime.InteropServices;\n\n";
var packing = " [StructLayout(LayoutKind.Sequential, Pack = 4)]\n";

namespace ClangSharp.Test
{
if (!Environment.Is64BitProcess)
{
usingStatement = string.Empty;
packing = string.Empty;
}

var expectedOutputContents = $@"{usingStatement}namespace ClangSharp.Test
{{
public unsafe partial struct MyStruct1
{
{{
[NativeTypeName(""unsigned int"")]
public uint Field1;

public void* Field2;

[NativeTypeName(""unsigned int"")]
public uint Field3;
}
}}

[StructLayout(LayoutKind.Sequential, Pack = 4)]
public unsafe partial struct MyStruct2
{
{packing} public unsafe partial struct MyStruct2
{{
[NativeTypeName(""unsigned int"")]
public uint Field1;

public void* Field2;

[NativeTypeName(""unsigned int"")]
public uint Field3;
}
}
}}
}}
";

return ValidateGeneratedCSharpLatestUnixBindingsAsync(InputContents, ExpectedOutputContents);
return ValidateGeneratedCSharpLatestUnixBindingsAsync(InputContents, expectedOutputContents);
}

public override Task PointerToSelfTest()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,11 +134,13 @@ union MyUnion3
};
";

var expectedPack = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? ", Pack = 1" : "";

var expectedOutputContents = $@"using System.Runtime.InteropServices;

namespace ClangSharp.Test
{{
[StructLayout(LayoutKind.Explicit)]
[StructLayout(LayoutKind.Explicit{expectedPack})]
public partial struct MyUnion1
{{
[FieldOffset(0)]
Expand Down Expand Up @@ -287,7 +289,7 @@ public uint o8_b0_1
}}
}}

[StructLayout(LayoutKind.Explicit)]
[StructLayout(LayoutKind.Explicit{expectedPack})]
public partial struct MyUnion3
{{
[FieldOffset(0)]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1306,36 +1306,42 @@ struct MyStruct2 {
};
";

const string ExpectedOutputContents = @"using System.Runtime.InteropServices;
var usingStatement = "using System.Runtime.InteropServices;\n\n";
var packing = " [StructLayout(LayoutKind.Sequential, Pack = 4)]\n";

namespace ClangSharp.Test
{
if (!Environment.Is64BitProcess)
{
usingStatement = string.Empty;
packing = string.Empty;
}

var expectedOutputContents = $@"{usingStatement}namespace ClangSharp.Test
{{
public unsafe partial struct MyStruct1
{
{{
[NativeTypeName(""unsigned int"")]
public uint Field1;

public void* Field2;

[NativeTypeName(""unsigned int"")]
public uint Field3;
}
}}

[StructLayout(LayoutKind.Sequential, Pack = 4)]
public unsafe partial struct MyStruct2
{
{packing} public unsafe partial struct MyStruct2
{{
[NativeTypeName(""unsigned int"")]
public uint Field1;

public void* Field2;

[NativeTypeName(""unsigned int"")]
public uint Field3;
}
}
}}
}}
";

return ValidateGeneratedCSharpLatestWindowsBindingsAsync(InputContents, ExpectedOutputContents);
return ValidateGeneratedCSharpLatestWindowsBindingsAsync(InputContents, expectedOutputContents);
}

public override Task PointerToSelfTest()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,11 +134,13 @@ union MyUnion3
};
";

var expectedPack = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? ", Pack = 1" : "";

var expectedOutputContents = $@"using System.Runtime.InteropServices;

namespace ClangSharp.Test
{{
[StructLayout(LayoutKind.Explicit)]
[StructLayout(LayoutKind.Explicit{expectedPack})]
public partial struct MyUnion1
{{
[FieldOffset(0)]
Expand Down Expand Up @@ -293,7 +295,7 @@ public uint o8_b0_1
}}
}}

[StructLayout(LayoutKind.Explicit)]
[StructLayout(LayoutKind.Explicit{expectedPack})]
public partial struct MyUnion3
{{
[FieldOffset(0)]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1302,7 +1302,9 @@ struct MyStruct2 {
};
";

const string ExpectedOutputContents = @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes"" ?>
var packing = Environment.Is64BitProcess ? " layout=\"Sequential\" pack=\"4\"" : string.Empty;

var expectedOutputContents = $@"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes"" ?>
<bindings>
<namespace name=""ClangSharp.Test"">
<struct name=""MyStruct1"" access=""public"" unsafe=""true"">
Expand All @@ -1316,7 +1318,7 @@ struct MyStruct2 {
<type native=""unsigned int"">uint</type>
</field>
</struct>
<struct name=""MyStruct2"" access=""public"" unsafe=""true"" layout=""Sequential"" pack=""4"">
<struct name=""MyStruct2"" access=""public"" unsafe=""true""{packing}>
<field name=""Field1"" access=""public"">
<type native=""unsigned int"">uint</type>
</field>
Expand All @@ -1331,7 +1333,7 @@ struct MyStruct2 {
</bindings>
";

return ValidateGeneratedXmlCompatibleUnixBindingsAsync(InputContents, ExpectedOutputContents);
return ValidateGeneratedXmlCompatibleUnixBindingsAsync(InputContents, expectedOutputContents);
}

public override Task PointerToSelfTest()
Expand Down
Loading