Skip to content

Commit 43548e8

Browse files
authored
Merge pull request #331 from kostasbesson/feature/issue-300
[issue-300] Fix for Unmanaged Structs Using GenerateType.VersionTolerant (MEMPACK041)
2 parents 7e70a28 + 1a19f74 commit 43548e8

3 files changed

Lines changed: 28 additions & 1 deletion

File tree

src/MemoryPack.Generator/DiagnosticDescriptors.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,4 +332,12 @@ internal static class DiagnosticDescriptors
332332
category: Category,
333333
defaultSeverity: DiagnosticSeverity.Error,
334334
isEnabledByDefault: true);
335+
336+
public static readonly DiagnosticDescriptor VersionTolerantOnUnmanagedStruct = new(
337+
id: "MEMPACK041",
338+
title: "Invalid usage of VersionTolerant on unmanaged struct",
339+
messageFormat: "The unmanaged struct '{0}' cannot be used for VersionTolerant serialization.",
340+
category: Category,
341+
defaultSeverity: DiagnosticSeverity.Error,
342+
isEnabledByDefault: true);
335343
}

src/MemoryPack.Generator/MemoryPackGenerator.Parser.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,12 @@ public bool Validate(TypeDeclarationSyntax syntax, IGeneratorContext context, bo
294294

295295
if (this.IsUnmanagedType)
296296
{
297+
if (GenerateType is GenerateType.VersionTolerant)
298+
{
299+
context.ReportDiagnostic(Diagnostic.Create(DiagnosticDescriptors.VersionTolerantOnUnmanagedStruct, syntax.Identifier.GetLocation(), Symbol.Name));
300+
noError = false;
301+
}
302+
297303
var structLayoutFields = this.Symbol.GetAllMembers()
298304
.OfType<IFieldSymbol>()
299305
.Select(x =>

tests/MemoryPack.Tests/GeneratorDiagnosticsTest.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -687,9 +687,22 @@ public Tester(int i1)
687687
}
688688
689689
""");
690+
}
691+
692+
[Fact]
693+
public void MEMPACK041_UnmanagedStructCannotBeVersionTolerant()
694+
{
695+
Compile(41, """
696+
using MemoryPack;
690697
698+
[MemoryPackable(GenerateType.VersionTolerant)]
699+
public partial struct Tester
700+
{
701+
[MemoryPackOrder(0)]
702+
public int I1 { get; init; }
703+
}
704+
""");
691705
}
692706
}
693707

694-
695708
#endif

0 commit comments

Comments
 (0)