From 61afb60493b469eb4b66f154a36fc748823ce247 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Sep 2025 11:02:37 +0000 Subject: [PATCH 01/13] Initial plan From a67554650e7613d5bae6873e35f722a9afbd7b86 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Sep 2025 11:34:37 +0000 Subject: [PATCH 02/13] Implement nativeptr type erasure fix and add regression tests Co-authored-by: T-Gro <46543583+T-Gro@users.noreply.github.com> --- src/Compiler/TypedTree/TypedTreeOps.fs | 3 +- .../OverloadingMembers/NativePtrOverloads.fs | 57 +++++++++++++++++++ .../NativePtrOverloads01.fs | 9 +++ .../NativePtrOverloads02.fs | 7 +++ .../NativePtrOverloads03.fs | 8 +++ .../NativePtrOverloads04.fs | 9 +++ .../OverloadingMembers/OverloadingMembers.fs | 46 +++++++++++++++ 7 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads.fs create mode 100644 tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads01.fs create mode 100644 tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads02.fs create mode 100644 tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads03.fs create mode 100644 tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads04.fs diff --git a/src/Compiler/TypedTree/TypedTreeOps.fs b/src/Compiler/TypedTree/TypedTreeOps.fs index 3c5d2dcd20b..270a45d516c 100644 --- a/src/Compiler/TypedTree/TypedTreeOps.fs +++ b/src/Compiler/TypedTree/TypedTreeOps.fs @@ -803,7 +803,8 @@ let rec stripTyEqnsAndErase eraseFuncAndTuple (g: TcGlobals) ty = let reducedTy2 = addNullnessToTy nullness reducedTy stripTyEqnsAndErase eraseFuncAndTuple g reducedTy2 elif tyconRefEq g tcref g.nativeptr_tcr && eraseFuncAndTuple then - stripTyEqnsAndErase eraseFuncAndTuple g g.nativeint_ty + // Regression fix (issue #): nativeptr<'T> erases to ilsigptr<'T>, not nativeint + stripTyEqnsAndErase eraseFuncAndTuple g (TType_app(g.ilsigptr_tcr, args, nullness)) else ty diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads.fs new file mode 100644 index 00000000000..0b8fbaf90ee --- /dev/null +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads.fs @@ -0,0 +1,57 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +namespace FSharp.Compiler.ComponentTests.TypeEquivalence + +open Xunit +open FSharp.Test +open FSharp.Test.Compiler + +module NativePtrOverloads = + + let verifyCompile compilation = + compilation + |> asLibrary + |> withOptions ["--nowarn:9"] + |> compile + + let verifyCompileAndRun compilation = + compilation + |> asLibrary + |> withOptions ["--nowarn:9"] + |> compileAndRun + + // Positive test: distinct native pointer element types should compile + [] + let ``NativePtrOverloads01_fs`` compilation = + compilation + |> verifyCompile + |> shouldSucceed + + // Negative test: duplicate exact signatures should fail + [] + let ``NativePtrOverloads02_fs`` compilation = + compilation + |> verifyCompile + |> shouldFail + |> withDiagnostics [ + (Error 438, Line 6, Col 17, Line 6, Col 18, "Duplicate method. The method 'M' has the same name and signature as another method in type 'Q'.") + (Error 438, Line 7, Col 17, Line 7, Col 18, "Duplicate method. The method 'M' has the same name and signature as another method in type 'Q'.") + ] + + // Regression test: previously failing overloads should now compile + [] + let ``NativePtrOverloads03_fs`` compilation = + compilation + |> verifyCompile + |> shouldSucceed + + // Negative test: erased differences via measures should still fail + [] + let ``NativePtrOverloads04_fs`` compilation = + compilation + |> verifyCompile + |> shouldFail + |> withDiagnostics [ + (Error 438, Line 7, Col 17, Line 7, Col 18, "Duplicate method. The method 'H' has the same name and signature as another method in type 'S'.") + (Error 438, Line 8, Col 17, Line 8, Col 18, "Duplicate method. The method 'H' has the same name and signature as another method in type 'S'.") + ] \ No newline at end of file diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads01.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads01.fs new file mode 100644 index 00000000000..d3274d2ac21 --- /dev/null +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads01.fs @@ -0,0 +1,9 @@ +module NativePtrOverloads01 +open Microsoft.FSharp.NativeInterop +#nowarn "9" + +type P = + static member Do(p: nativeptr) = 1 + static member Do(p: nativeptr) = 2 + +let _invoke (pi: nativeptr) (pl: nativeptr) = P.Do pi + P.Do pl \ No newline at end of file diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads02.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads02.fs new file mode 100644 index 00000000000..df9396e7381 --- /dev/null +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads02.fs @@ -0,0 +1,7 @@ +module NativePtrOverloads02 +open Microsoft.FSharp.NativeInterop +#nowarn "9" + +type Q = + static member M(p: nativeptr) = 0 + static member M(p: nativeptr) = 1 // expect duplicate member error \ No newline at end of file diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads03.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads03.fs new file mode 100644 index 00000000000..a16db5de49a --- /dev/null +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads03.fs @@ -0,0 +1,8 @@ +module NativePtrOverloads03 +open Microsoft.FSharp.NativeInterop +#nowarn "9" +// Regression test for issue # + +type R = + static member F(p: nativeptr) = 0us + static member F(p: nativeptr) = 0L \ No newline at end of file diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads04.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads04.fs new file mode 100644 index 00000000000..75ed6354cc0 --- /dev/null +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads04.fs @@ -0,0 +1,9 @@ +module NativePtrOverloads04 +open Microsoft.FSharp.NativeInterop +#nowarn "9" +[] type kg +[] type m + +type S = + static member H(p: nativeptr>) = 1 + static member H(p: nativeptr>) = 2 // expect duplicate member error \ No newline at end of file diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs index e0b4c824187..4f9fc24074d 100644 --- a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs @@ -235,3 +235,49 @@ module MemberDefinitions_OverloadingMembers = compilation |> verifyCompileAndRun |> shouldSucceed + + // Native pointer overload tests for regression fix + + // NativePtrOverloads01.fs - distinct native pointer element types should compile + [] + let ``NativePtrOverloads01_fs`` compilation = + compilation + |> asLibrary + |> withOptions ["--nowarn:9"] + |> compile + |> shouldSucceed + + // NativePtrOverloads02.fs - duplicate exact signatures should fail + [] + let ``NativePtrOverloads02_fs`` compilation = + compilation + |> asLibrary + |> withOptions ["--nowarn:9"] + |> compile + |> shouldFail + |> withDiagnostics [ + (Error 438, Line 6, Col 17, Line 6, Col 18, "Duplicate method. The method 'M' has the same name and signature as another method in type 'Q'.") + (Error 438, Line 7, Col 17, Line 7, Col 18, "Duplicate method. The method 'M' has the same name and signature as another method in type 'Q'.") + ] + + // NativePtrOverloads03.fs - regression test, previously failing overloads should now compile + [] + let ``NativePtrOverloads03_fs`` compilation = + compilation + |> asLibrary + |> withOptions ["--nowarn:9"] + |> compile + |> shouldSucceed + + // NativePtrOverloads04.fs - erased differences via measures should still fail + [] + let ``NativePtrOverloads04_fs`` compilation = + compilation + |> asLibrary + |> withOptions ["--nowarn:9"] + |> compile + |> shouldFail + |> withDiagnostics [ + (Error 438, Line 7, Col 17, Line 7, Col 18, "Duplicate method. The method 'H' has the same name and signature as another method in type 'S'.") + (Error 438, Line 8, Col 17, Line 8, Col 18, "Duplicate method. The method 'H' has the same name and signature as another method in type 'S'.") + ] From 45454cc7ff7a3ed1008dbbc47fce930727655d1c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Sep 2025 11:43:13 +0000 Subject: [PATCH 03/13] Add release notes for nativeptr type erasure fix Co-authored-by: T-Gro <46543583+T-Gro@users.noreply.github.com> --- docs/release-notes/.Language/preview.md | 1 + .../OverloadingMembers/NativePtrOverloads.fs | 57 ------------------- 2 files changed, 1 insertion(+), 57 deletions(-) delete mode 100644 tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads.fs diff --git a/docs/release-notes/.Language/preview.md b/docs/release-notes/.Language/preview.md index fcec4b8170e..e5c2b65704f 100644 --- a/docs/release-notes/.Language/preview.md +++ b/docs/release-notes/.Language/preview.md @@ -16,5 +16,6 @@ * Warn on uppercase identifiers in patterns. ([PR #15816](https://github.com/dotnet/fsharp/pull/15816)) * Error on invalid declarations in type definitions.([Issue #10066](https://github.com/dotnet/fsharp/issues/10066), [PR #18813](https://github.com/dotnet/fsharp/pull/18813)) +* Fix type erasure logic for `nativeptr<'T>` overloads to properly preserve element type differences during duplicate member checking. ([Issue #](https://github.com/dotnet/fsharp/issues/), [PR #](https://github.com/dotnet/fsharp/pull/)) ### Changed diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads.fs deleted file mode 100644 index 0b8fbaf90ee..00000000000 --- a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads.fs +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. - -namespace FSharp.Compiler.ComponentTests.TypeEquivalence - -open Xunit -open FSharp.Test -open FSharp.Test.Compiler - -module NativePtrOverloads = - - let verifyCompile compilation = - compilation - |> asLibrary - |> withOptions ["--nowarn:9"] - |> compile - - let verifyCompileAndRun compilation = - compilation - |> asLibrary - |> withOptions ["--nowarn:9"] - |> compileAndRun - - // Positive test: distinct native pointer element types should compile - [] - let ``NativePtrOverloads01_fs`` compilation = - compilation - |> verifyCompile - |> shouldSucceed - - // Negative test: duplicate exact signatures should fail - [] - let ``NativePtrOverloads02_fs`` compilation = - compilation - |> verifyCompile - |> shouldFail - |> withDiagnostics [ - (Error 438, Line 6, Col 17, Line 6, Col 18, "Duplicate method. The method 'M' has the same name and signature as another method in type 'Q'.") - (Error 438, Line 7, Col 17, Line 7, Col 18, "Duplicate method. The method 'M' has the same name and signature as another method in type 'Q'.") - ] - - // Regression test: previously failing overloads should now compile - [] - let ``NativePtrOverloads03_fs`` compilation = - compilation - |> verifyCompile - |> shouldSucceed - - // Negative test: erased differences via measures should still fail - [] - let ``NativePtrOverloads04_fs`` compilation = - compilation - |> verifyCompile - |> shouldFail - |> withDiagnostics [ - (Error 438, Line 7, Col 17, Line 7, Col 18, "Duplicate method. The method 'H' has the same name and signature as another method in type 'S'.") - (Error 438, Line 8, Col 17, Line 8, Col 18, "Duplicate method. The method 'H' has the same name and signature as another method in type 'S'.") - ] \ No newline at end of file From c80d1854e71c21f22654a25d7a14154d1c7bf27b Mon Sep 17 00:00:00 2001 From: Tomas Grosup Date: Wed, 17 Sep 2025 18:57:06 +0200 Subject: [PATCH 04/13] Update tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs --- .../OverloadingMembers/OverloadingMembers.fs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs index 4f9fc24074d..e27dba334a3 100644 --- a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs @@ -256,8 +256,8 @@ module MemberDefinitions_OverloadingMembers = |> compile |> shouldFail |> withDiagnostics [ - (Error 438, Line 6, Col 17, Line 6, Col 18, "Duplicate method. The method 'M' has the same name and signature as another method in type 'Q'.") - (Error 438, Line 7, Col 17, Line 7, Col 18, "Duplicate method. The method 'M' has the same name and signature as another method in type 'Q'.") + (Error 438, Line 6, Col 19, Line 6, Col 20, "Duplicate method. The method 'M' has the same name and signature as another method in type 'Q'.") + (Error 438, Line 7, Col 19, Line 7, Col 20, "Duplicate method. The method 'M' has the same name and signature as another method in type 'Q'.") ] // NativePtrOverloads03.fs - regression test, previously failing overloads should now compile From 51a01bc7d5c75222691f367499447a91430a2b0f Mon Sep 17 00:00:00 2001 From: Tomas Grosup Date: Wed, 17 Sep 2025 18:57:12 +0200 Subject: [PATCH 05/13] Update tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs --- .../OverloadingMembers/OverloadingMembers.fs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs index e27dba334a3..6cbffe91f09 100644 --- a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs @@ -278,6 +278,6 @@ module MemberDefinitions_OverloadingMembers = |> compile |> shouldFail |> withDiagnostics [ - (Error 438, Line 7, Col 17, Line 7, Col 18, "Duplicate method. The method 'H' has the same name and signature as another method in type 'S'.") - (Error 438, Line 8, Col 17, Line 8, Col 18, "Duplicate method. The method 'H' has the same name and signature as another method in type 'S'.") + (Error 438, Line 8, Col 19, Line 8, Col 20, "Duplicate method. The method 'H' has the same name and signature as another method in type 'S' once tuples, functions, units of measure and/or provided types are erased.") + (Error 438, Line 9, Col 19, Line 9, Col 20, "Duplicate method. The method 'H' has the same name and signature as another method in type 'S' once tuples, functions, units of measure and/or provided types are erased.") ] From 852392b0ca82424d69751f48fcf66f9755fd7d1f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Sep 2025 21:13:55 +0000 Subject: [PATCH 06/13] Fix test expectations to match actual compiler behavior for duplicate method errors Co-authored-by: T-Gro <46543583+T-Gro@users.noreply.github.com> --- .../MemberDefinitions/OverloadingMembers/OverloadingMembers.fs | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs index 6cbffe91f09..d0b2fb65520 100644 --- a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs @@ -256,7 +256,6 @@ module MemberDefinitions_OverloadingMembers = |> compile |> shouldFail |> withDiagnostics [ - (Error 438, Line 6, Col 19, Line 6, Col 20, "Duplicate method. The method 'M' has the same name and signature as another method in type 'Q'.") (Error 438, Line 7, Col 19, Line 7, Col 20, "Duplicate method. The method 'M' has the same name and signature as another method in type 'Q'.") ] @@ -278,6 +277,5 @@ module MemberDefinitions_OverloadingMembers = |> compile |> shouldFail |> withDiagnostics [ - (Error 438, Line 8, Col 19, Line 8, Col 20, "Duplicate method. The method 'H' has the same name and signature as another method in type 'S' once tuples, functions, units of measure and/or provided types are erased.") (Error 438, Line 9, Col 19, Line 9, Col 20, "Duplicate method. The method 'H' has the same name and signature as another method in type 'S' once tuples, functions, units of measure and/or provided types are erased.") ] From 8106b4b235d2e088a88675c4d4258a29625f7e84 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 19 Sep 2025 09:10:01 +0000 Subject: [PATCH 07/13] Restore both error expectations for duplicate method tests Co-authored-by: T-Gro <46543583+T-Gro@users.noreply.github.com> --- .../MemberDefinitions/OverloadingMembers/OverloadingMembers.fs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs index d0b2fb65520..6cbffe91f09 100644 --- a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs @@ -256,6 +256,7 @@ module MemberDefinitions_OverloadingMembers = |> compile |> shouldFail |> withDiagnostics [ + (Error 438, Line 6, Col 19, Line 6, Col 20, "Duplicate method. The method 'M' has the same name and signature as another method in type 'Q'.") (Error 438, Line 7, Col 19, Line 7, Col 20, "Duplicate method. The method 'M' has the same name and signature as another method in type 'Q'.") ] @@ -277,5 +278,6 @@ module MemberDefinitions_OverloadingMembers = |> compile |> shouldFail |> withDiagnostics [ + (Error 438, Line 8, Col 19, Line 8, Col 20, "Duplicate method. The method 'H' has the same name and signature as another method in type 'S' once tuples, functions, units of measure and/or provided types are erased.") (Error 438, Line 9, Col 19, Line 9, Col 20, "Duplicate method. The method 'H' has the same name and signature as another method in type 'S' once tuples, functions, units of measure and/or provided types are erased.") ] From b880750ca736067e2b767533c402461b2c108152 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 19 Sep 2025 14:16:04 +0000 Subject: [PATCH 08/13] Fix test expectations to expect only second duplicate method error Co-authored-by: T-Gro <46543583+T-Gro@users.noreply.github.com> --- .../MemberDefinitions/OverloadingMembers/OverloadingMembers.fs | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs index 6cbffe91f09..d0b2fb65520 100644 --- a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs @@ -256,7 +256,6 @@ module MemberDefinitions_OverloadingMembers = |> compile |> shouldFail |> withDiagnostics [ - (Error 438, Line 6, Col 19, Line 6, Col 20, "Duplicate method. The method 'M' has the same name and signature as another method in type 'Q'.") (Error 438, Line 7, Col 19, Line 7, Col 20, "Duplicate method. The method 'M' has the same name and signature as another method in type 'Q'.") ] @@ -278,6 +277,5 @@ module MemberDefinitions_OverloadingMembers = |> compile |> shouldFail |> withDiagnostics [ - (Error 438, Line 8, Col 19, Line 8, Col 20, "Duplicate method. The method 'H' has the same name and signature as another method in type 'S' once tuples, functions, units of measure and/or provided types are erased.") (Error 438, Line 9, Col 19, Line 9, Col 20, "Duplicate method. The method 'H' has the same name and signature as another method in type 'S' once tuples, functions, units of measure and/or provided types are erased.") ] From da6ba1235a04188cfcf44955e83ad566ea679fe4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 22 Sep 2025 12:44:22 +0000 Subject: [PATCH 09/13] Restore expecting both duplicate method errors as reported by compiler Co-authored-by: T-Gro <46543583+T-Gro@users.noreply.github.com> --- .../MemberDefinitions/OverloadingMembers/OverloadingMembers.fs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs index d0b2fb65520..6cbffe91f09 100644 --- a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs @@ -256,6 +256,7 @@ module MemberDefinitions_OverloadingMembers = |> compile |> shouldFail |> withDiagnostics [ + (Error 438, Line 6, Col 19, Line 6, Col 20, "Duplicate method. The method 'M' has the same name and signature as another method in type 'Q'.") (Error 438, Line 7, Col 19, Line 7, Col 20, "Duplicate method. The method 'M' has the same name and signature as another method in type 'Q'.") ] @@ -277,5 +278,6 @@ module MemberDefinitions_OverloadingMembers = |> compile |> shouldFail |> withDiagnostics [ + (Error 438, Line 8, Col 19, Line 8, Col 20, "Duplicate method. The method 'H' has the same name and signature as another method in type 'S' once tuples, functions, units of measure and/or provided types are erased.") (Error 438, Line 9, Col 19, Line 9, Col 20, "Duplicate method. The method 'H' has the same name and signature as another method in type 'S' once tuples, functions, units of measure and/or provided types are erased.") ] From fd49e47c4daf88248760b7bafa2bfcab5833a0f7 Mon Sep 17 00:00:00 2001 From: Tomas Grosup Date: Thu, 16 Oct 2025 13:14:46 +0200 Subject: [PATCH 10/13] adjust tests --- .../OverloadingMembers/OverloadingMembers.fs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs index 6cbffe91f09..bba418a78ee 100644 --- a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/OverloadingMembers.fs @@ -256,8 +256,8 @@ module MemberDefinitions_OverloadingMembers = |> compile |> shouldFail |> withDiagnostics [ - (Error 438, Line 6, Col 19, Line 6, Col 20, "Duplicate method. The method 'M' has the same name and signature as another method in type 'Q'.") (Error 438, Line 7, Col 19, Line 7, Col 20, "Duplicate method. The method 'M' has the same name and signature as another method in type 'Q'.") + (Error 438, Line 6, Col 19, Line 6, Col 20, "Duplicate method. The method 'M' has the same name and signature as another method in type 'Q'.") ] // NativePtrOverloads03.fs - regression test, previously failing overloads should now compile @@ -277,7 +277,7 @@ module MemberDefinitions_OverloadingMembers = |> withOptions ["--nowarn:9"] |> compile |> shouldFail - |> withDiagnostics [ - (Error 438, Line 8, Col 19, Line 8, Col 20, "Duplicate method. The method 'H' has the same name and signature as another method in type 'S' once tuples, functions, units of measure and/or provided types are erased.") + |> withDiagnostics [ (Error 438, Line 9, Col 19, Line 9, Col 20, "Duplicate method. The method 'H' has the same name and signature as another method in type 'S' once tuples, functions, units of measure and/or provided types are erased.") + (Error 438, Line 8, Col 19, Line 8, Col 20, "Duplicate method. The method 'H' has the same name and signature as another method in type 'S' once tuples, functions, units of measure and/or provided types are erased.") ] From 661149db322b99b12338df8c474d94ddc3625455 Mon Sep 17 00:00:00 2001 From: Tomas Grosup Date: Fri, 17 Oct 2025 14:41:26 +0200 Subject: [PATCH 11/13] Reflect older tests --- tests/fsharp/typecheck/sigs/neg23.bsl | 8 -------- tests/fsharp/typecheck/sigs/neg23.fs | 8 ++++---- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/tests/fsharp/typecheck/sigs/neg23.bsl b/tests/fsharp/typecheck/sigs/neg23.bsl index 8ed0fb67bff..906db67b8d2 100644 --- a/tests/fsharp/typecheck/sigs/neg23.bsl +++ b/tests/fsharp/typecheck/sigs/neg23.bsl @@ -11,14 +11,6 @@ neg23.fs(28,21,28,24): typecheck error FS0438: Duplicate method. The method 'Foo neg23.fs(26,21,26,24): typecheck error FS0438: Duplicate method. The method 'Foo' has the same name and signature as another method in type 'DuplicateOverloadUpToErasure3.SomeClass'. -neg23.fs(55,21,55,24): typecheck error FS0438: Duplicate method. The method 'Foo' has the same name and signature as another method in type 'DuplicateOverloadUpToErasure6.SomeClass' once tuples, functions, units of measure and/or provided types are erased. - -neg23.fs(53,21,53,24): typecheck error FS0438: Duplicate method. The method 'Foo' has the same name and signature as another method in type 'DuplicateOverloadUpToErasure6.SomeClass' once tuples, functions, units of measure and/or provided types are erased. - -neg23.fs(64,21,64,24): typecheck error FS0438: Duplicate method. The method 'Foo' has the same name and signature as another method in type 'DuplicateOverloadUpToErasure7.SomeClass' once tuples, functions, units of measure and/or provided types are erased. - -neg23.fs(62,21,62,24): typecheck error FS0438: Duplicate method. The method 'Foo' has the same name and signature as another method in type 'DuplicateOverloadUpToErasure7.SomeClass' once tuples, functions, units of measure and/or provided types are erased. - neg23.fs(76,9,76,11): typecheck error FS0410: The type 'IA' is less accessible than the value, member or type 'IB' it is used in. neg23.fs(83,18,83,20): typecheck error FS0439: The method 'X0' has curried arguments but has the same name as another method in type 'TestCurriedMemberRestrictions.C'. Methods with curried arguments cannot be overloaded. Consider using a method taking tupled arguments. diff --git a/tests/fsharp/typecheck/sigs/neg23.fs b/tests/fsharp/typecheck/sigs/neg23.fs index 94d66832ed4..1ec74e6163e 100644 --- a/tests/fsharp/typecheck/sigs/neg23.fs +++ b/tests/fsharp/typecheck/sigs/neg23.fs @@ -46,8 +46,8 @@ module DuplicateOverloadUpToErasure5 = begin member this.Foo (x:System.Tuple>) = printfn "method 2" end -module DuplicateOverloadUpToErasure6 = begin - +module NotAnyMoreDuplicateOverloadUpToErasure6 = begin + // This is not the same IL type, not a duplicate type SomeClass() = member this.Foo (x:nativeptr) = printfn "method 1" @@ -55,8 +55,8 @@ module DuplicateOverloadUpToErasure6 = begin member this.Foo (x:nativeint) = printfn "method 2" end -module DuplicateOverloadUpToErasure7 = begin - +module NotAnyMoreDuplicateOverloadUpToErasure7 = begin + // This is not the same IL type, not a duplicate type SomeClass() = member this.Foo (x:(int*int)*int*(int*nativeptr)*int*int) = printfn "method 1" From 225c9a8b6af8445906746794fd3748a7d9ff829f Mon Sep 17 00:00:00 2001 From: Tomas Grosup Date: Fri, 17 Oct 2025 14:57:58 +0200 Subject: [PATCH 12/13] release notes --- docs/release-notes/.FSharp.Compiler.Service/11.0.0.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/release-notes/.FSharp.Compiler.Service/11.0.0.md b/docs/release-notes/.FSharp.Compiler.Service/11.0.0.md index 0469b0575f6..75df395976d 100644 --- a/docs/release-notes/.FSharp.Compiler.Service/11.0.0.md +++ b/docs/release-notes/.FSharp.Compiler.Service/11.0.0.md @@ -2,6 +2,7 @@ * Scripts: Fix resolving the dotnet host path when an SDK directory is specified. ([PR #18960](https://github.com/dotnet/fsharp/pull/18960)) * Fix excessive StackGuard thread jumping ([PR #18971](https://github.com/dotnet/fsharp/pull/18971)) +* Adjust conservative method-overload duplicate detection rules for nativeptr types ([PR #18911](https://github.com/dotnet/fsharp/pull/18911)) * Fix name is bound multiple times is not reported in 'as' pattern ([PR #18984](https://github.com/dotnet/fsharp/pull/18984)) ### Added From bc33bd1fdead2ad574bf53bef5dff0c593163557 Mon Sep 17 00:00:00 2001 From: Tomas Grosup Date: Thu, 6 Nov 2025 16:07:58 +0100 Subject: [PATCH 13/13] Apply suggestions from code review Co-authored-by: Adam Boniecki <20281641+abonie@users.noreply.github.com> --- src/Compiler/TypedTree/TypedTreeOps.fs | 2 +- .../OverloadingMembers/NativePtrOverloads03.fs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Compiler/TypedTree/TypedTreeOps.fs b/src/Compiler/TypedTree/TypedTreeOps.fs index 7cc777606a7..f18fa46152c 100644 --- a/src/Compiler/TypedTree/TypedTreeOps.fs +++ b/src/Compiler/TypedTree/TypedTreeOps.fs @@ -799,7 +799,7 @@ let rec stripTyEqnsAndErase eraseFuncAndTuple (g: TcGlobals) ty = let reducedTy2 = addNullnessToTy nullness reducedTy stripTyEqnsAndErase eraseFuncAndTuple g reducedTy2 elif tyconRefEq g tcref g.nativeptr_tcr && eraseFuncAndTuple then - // Regression fix (issue #): nativeptr<'T> erases to ilsigptr<'T>, not nativeint + // Regression fix (issue #7428): nativeptr<'T> erases to ilsigptr<'T>, not nativeint stripTyEqnsAndErase eraseFuncAndTuple g (TType_app(g.ilsigptr_tcr, args, nullness)) else ty diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads03.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads03.fs index a16db5de49a..c0c43f4c4d9 100644 --- a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads03.fs +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/MemberDefinitions/OverloadingMembers/NativePtrOverloads03.fs @@ -1,7 +1,7 @@ module NativePtrOverloads03 open Microsoft.FSharp.NativeInterop #nowarn "9" -// Regression test for issue # +// Regression test for issue #7428 type R = static member F(p: nativeptr) = 0us