diff --git a/src/Meziantou.Analyzer/Rules/AvoidUnusedInternalTypesAnalyzer.cs b/src/Meziantou.Analyzer/Rules/AvoidUnusedInternalTypesAnalyzer.cs index cc00cbf56..cc1e05a6e 100644 --- a/src/Meziantou.Analyzer/Rules/AvoidUnusedInternalTypesAnalyzer.cs +++ b/src/Meziantou.Analyzer/Rules/AvoidUnusedInternalTypesAnalyzer.cs @@ -260,6 +260,12 @@ private void AddUsedType(ITypeSymbol typeSymbol) AddUsedType(arrayTypeSymbol.ElementType); } + // Handle pointer types + if (typeSymbol is IPointerTypeSymbol pointerTypeSymbol) + { + AddUsedType(pointerTypeSymbol.PointedAtType); + } + // Handle generic type arguments if (typeSymbol is INamedTypeSymbol namedTypeSymbol) { diff --git a/tests/Meziantou.Analyzer.Test/Rules/AvoidUnusedInternalTypesAnalyzerTests.cs b/tests/Meziantou.Analyzer.Test/Rules/AvoidUnusedInternalTypesAnalyzerTests.cs index 8d99e5266..6c5baf8d3 100644 --- a/tests/Meziantou.Analyzer.Test/Rules/AvoidUnusedInternalTypesAnalyzerTests.cs +++ b/tests/Meziantou.Analyzer.Test/Rules/AvoidUnusedInternalTypesAnalyzerTests.cs @@ -1370,4 +1370,33 @@ await CreateProjectBuilder() .WithSourceCode(SourceCode) .ValidateAsync(); } + + [Fact] + public async Task InternalStructUsedAsPointerInMethodParameter_NoDiagnostic() + { + const string SourceCode = """ + using System; + + internal struct SECURITY_ATTRIBUTES + { + internal uint nLength; + internal IntPtr lpSecurityDescriptor; + internal bool bInheritHandle; + } + + public class FileOperations + { + private static unsafe void CreateFilePrivate( + string lpFileName, + int dwDesiredAccess, + int dwShareMode, + SECURITY_ATTRIBUTES* lpSecurityAttributes) + { + } + } + """; + await CreateProjectBuilder() + .WithSourceCode(SourceCode) + .ValidateAsync(); + } }