From e8bf2f682bf19ed291ceb9ba0df7b96f92da8194 Mon Sep 17 00:00:00 2001 From: Andrii Kurdiumov Date: Sat, 14 Feb 2026 17:28:44 +0100 Subject: [PATCH 1/2] Fix using anonymous unions in the function variables --- .../CodeGenDeclarationsTests.cs | 9 +++++++++ ...ousUnionVariableInsideFunction.verified.txt | 18 ++++++++++++++++++ .../Contexts/TranslationUnitContext.cs | 5 +++++ .../Expressions/Values/LValueInstanceField.cs | 2 +- .../structs/structs_unions.nonportable.c | 11 ++++++++++- 5 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 Cesium.CodeGen.Tests/verified/CodeGenDeclarationsTests.AnonymousUnionVariableInsideFunction.verified.txt diff --git a/Cesium.CodeGen.Tests/CodeGenDeclarationsTests.cs b/Cesium.CodeGen.Tests/CodeGenDeclarationsTests.cs index 8a9841a84..9479c0c6d 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 000000000..27ce875ed --- /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 8ac9439cb..82e9d1252 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 e956cf79e..f2f65ed7a 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 225f0e844..b4727dfa5 100644 --- a/Cesium.IntegrationTests/structs/structs_unions.nonportable.c +++ b/Cesium.IntegrationTests/structs/structs_unions.nonportable.c @@ -22,6 +22,15 @@ typedef struct { } s; } foo; +int test() { + union { + long l; + int i; + } x; + x.l = 10; + return x.i; +} + int main() { foo f; f._1 = 2; @@ -29,5 +38,5 @@ int main() { f._3u = 10; f.uni._5u = 10; f.s._7 = 10; - return f._1 + f._2a + f._4u + f.uni._6u + f.s._7; + return f._1 + f._2a + f._4u + f.uni._6u + f.s._7 + (test() - 10); } From 816b5a34dab9da1d265db7d94d6e60e030d97812 Mon Sep 17 00:00:00 2001 From: Andrii Kurdiumov Date: Sat, 14 Feb 2026 17:33:10 +0100 Subject: [PATCH 2/2] 1 --- .../structs/structs_unions.nonportable.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Cesium.IntegrationTests/structs/structs_unions.nonportable.c b/Cesium.IntegrationTests/structs/structs_unions.nonportable.c index b4727dfa5..e84283b1f 100644 --- a/Cesium.IntegrationTests/structs/structs_unions.nonportable.c +++ b/Cesium.IntegrationTests/structs/structs_unions.nonportable.c @@ -32,11 +32,15 @@ int test() { } int main() { + if (test() != 10) { + return -1; + } + foo f; f._1 = 2; f._2a = 10; f._3u = 10; f.uni._5u = 10; f.s._7 = 10; - return f._1 + f._2a + f._4u + f.uni._6u + f.s._7 + (test() - 10); + return f._1 + f._2a + f._4u + f.uni._6u + f.s._7; }