diff --git a/Cesium.CodeGen.Tests/CodeGenDeclarationsTests.cs b/Cesium.CodeGen.Tests/CodeGenDeclarationsTests.cs index 8a9841a8..9479c0c6 100644 --- a/Cesium.CodeGen.Tests/CodeGenDeclarationsTests.cs +++ b/Cesium.CodeGen.Tests/CodeGenDeclarationsTests.cs @@ -43,4 +43,13 @@ public Task ConstTypeDef() => DoTest( @" typedef int myint; static const myint i = 0;"); + + [Fact] + public Task AnonymousUnionVariableInsideFunction() => DoTest( + @"int main() +{ + union {int i;} t; + t.i = 0; +} +"); } diff --git a/Cesium.CodeGen.Tests/verified/CodeGenDeclarationsTests.AnonymousUnionVariableInsideFunction.verified.txt b/Cesium.CodeGen.Tests/verified/CodeGenDeclarationsTests.AnonymousUnionVariableInsideFunction.verified.txt new file mode 100644 index 00000000..27ce875e --- /dev/null +++ b/Cesium.CodeGen.Tests/verified/CodeGenDeclarationsTests.AnonymousUnionVariableInsideFunction.verified.txt @@ -0,0 +1,18 @@ +System.Int32 ::main() + Locals: + _Union_Int_i V_0 + IL_0000: ldloca.s V_0 + IL_0002: ldc.i4.0 + IL_0003: stfld System.Int32 _Union_Int_i::i + IL_0008: ldc.i4.0 + IL_0009: ret + +System.Int32 ::() + Locals: + System.Int32 V_0 + IL_0000: call System.Int32 ::main() + IL_0005: stloc.s V_0 + IL_0007: ldloc.s V_0 + IL_0009: call System.Void Cesium.Runtime.RuntimeHelpers::Exit(System.Int32) + IL_000e: ldloc.s V_0 + IL_0010: ret diff --git a/Cesium.CodeGen/Contexts/TranslationUnitContext.cs b/Cesium.CodeGen/Contexts/TranslationUnitContext.cs index 8ac9439c..82e9d125 100644 --- a/Cesium.CodeGen/Contexts/TranslationUnitContext.cs +++ b/Cesium.CodeGen/Contexts/TranslationUnitContext.cs @@ -315,6 +315,11 @@ internal void EnsureAnonymousTypeGenerated(IType? type) structTypePtr.EmitType(this); } } + + if (type is StructType structTypeAnon && structTypeAnon.IsAnon) + { + structTypeAnon.EmitType(this); + } } private TypeDefinition GetOrCreateTranslationUnitType() diff --git a/Cesium.CodeGen/Ir/Expressions/Values/LValueInstanceField.cs b/Cesium.CodeGen/Ir/Expressions/Values/LValueInstanceField.cs index e956cf79..f2f65ed7 100644 --- a/Cesium.CodeGen/Ir/Expressions/Values/LValueInstanceField.cs +++ b/Cesium.CodeGen/Ir/Expressions/Values/LValueInstanceField.cs @@ -102,7 +102,7 @@ protected override FieldReference GetField(IEmitScope scope) } List? path = null; - + scope.Context.EnsureAnonymousTypeGenerated(_structType); var valueTypeReference = _structType.Resolve(scope.Context); var valueTypeDef = valueTypeReference.Resolve(); diff --git a/Cesium.IntegrationTests/structs/structs_unions.nonportable.c b/Cesium.IntegrationTests/structs/structs_unions.nonportable.c index 225f0e84..e84283b1 100644 --- a/Cesium.IntegrationTests/structs/structs_unions.nonportable.c +++ b/Cesium.IntegrationTests/structs/structs_unions.nonportable.c @@ -22,7 +22,20 @@ typedef struct { } s; } foo; +int test() { + union { + long l; + int i; + } x; + x.l = 10; + return x.i; +} + int main() { + if (test() != 10) { + return -1; + } + foo f; f._1 = 2; f._2a = 10;