Skip to content

Commit 77d05bb

Browse files
vzarytovskiinojafT-Gro
authored
Backport #15845 to 17.7 (#15848)
Co-authored-by: Florian Verdonck <florian.verdonck@outlook.com> Co-authored-by: Tomas Grosup <tomasgrosup@microsoft.com>
1 parent 30bbce6 commit 77d05bb

6 files changed

Lines changed: 100 additions & 4 deletions

File tree

eng/Versions.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<!-- F# Version components -->
1616
<FSMajorVersion>7</FSMajorVersion>
1717
<FSMinorVersion>0</FSMinorVersion>
18-
<FSBuildVersion>400</FSBuildVersion>
18+
<FSBuildVersion>401</FSBuildVersion>
1919
<FSRevisionVersion>0</FSRevisionVersion>
2020
<!-- -->
2121
<!-- F# Language version -->

global.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"xcopy-msbuild": "17.6.0-2"
1616
},
1717
"native-tools": {
18-
"perl": "5.32.1.1"
18+
"perl": "5.38.0.1"
1919
},
2020
"msbuild-sdks": {
2121
"Microsoft.DotNet.Arcade.Sdk": "8.0.0-beta.23320.3",

src/Compiler/Checking/CheckDeclarations.fs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3958,8 +3958,10 @@ module TcDeclarations =
39583958
if tcref.TyparsNoRange.Length = synTypars.Length then
39593959
(tcref.TyparsNoRange, synTypars)
39603960
||> List.zip
3961-
|> List.iter (fun (typar, SynTyparDecl.SynTyparDecl(_, SynTypar(ident = untypedIdent))) ->
3962-
typar.SetIdent(untypedIdent)
3961+
|> List.iter (fun (typar, SynTyparDecl.SynTyparDecl (_, tp)) ->
3962+
let (SynTypar(ident = untypedIdent; staticReq = sr)) = tp
3963+
if typar.StaticReq = sr then
3964+
typar.SetIdent(untypedIdent)
39633965
)
39643966

39653967
res

tests/FSharp.Compiler.ComponentTests/ConstraintSolver/MemberConstraints.fs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,31 @@ else ()
4646
|> run
4747
|> shouldSucceed
4848
|> withExitCode 0
49+
50+
[<Fact>]
51+
let ``Respect nowarn 957 for extension method`` () =
52+
FSharp """
53+
module Foo
54+
55+
type DataItem<'data> =
56+
{ Identifier: string
57+
Label: string
58+
Data: 'data }
59+
60+
static member Create<'data>(identifier: string, label: string, data: 'data) =
61+
{ DataItem.Identifier = identifier
62+
DataItem.Label = label
63+
DataItem.Data = data }
64+
65+
#nowarn "957"
66+
67+
type DataItem< ^input> with
68+
69+
static member inline Create(item: ^input) =
70+
let stringValue: string = (^input: (member get_StringValue: unit -> string) (item))
71+
let friendlyStringValue: string = (^input: (member get_FriendlyStringValue: unit -> string) (item))
72+
73+
DataItem.Create< ^input>(stringValue, friendlyStringValue, item)
74+
"""
75+
|> compile
76+
|> shouldSucceed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
module Extensions
2+
3+
type DataItem<'data> =
4+
{ Identifier: string
5+
Label: string
6+
Data: 'data }
7+
8+
static member Create<'data>(identifier: string, label: string, data: 'data) =
9+
{ DataItem.Identifier = identifier
10+
DataItem.Label = label
11+
DataItem.Data = data }
12+
13+
#nowarn "957"
14+
15+
type DataItem< ^input> with
16+
17+
static member inline Create(item: ^input) =
18+
let stringValue: string = (^input: (member get_StringValue: unit -> string) (item))
19+
20+
let friendlyStringValue: string =
21+
(^input: (member get_FriendlyStringValue: unit -> string) (item))
22+
23+
DataItem.Create< ^input>(stringValue, friendlyStringValue, item)

tests/FSharp.Compiler.ComponentTests/Signatures/TypeTests.fs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,49 @@ type System.Collections.Concurrent.ConcurrentDictionary<'key,'value> with
133133
134134
member TryFind: key: 'key -> 'value option"""
135135

136+
[<Fact>]
137+
let ``Don't update typar name in type extension when TyparStaticReq doesn't match`` () =
138+
FSharp """
139+
module Extensions
140+
141+
type DataItem<'data> =
142+
{ Identifier: string
143+
Label: string
144+
Data: 'data }
145+
146+
static member Create<'data>(identifier: string, label: string, data: 'data) =
147+
{ DataItem.Identifier = identifier
148+
DataItem.Label = label
149+
DataItem.Data = data }
150+
151+
#nowarn "957"
152+
153+
type DataItem< ^input> with
154+
155+
static member inline Create(item: ^input) =
156+
let stringValue: string = (^input: (member get_StringValue: unit -> string) (item))
157+
158+
let friendlyStringValue: string =
159+
(^input: (member get_FriendlyStringValue: unit -> string) (item))
160+
161+
DataItem.Create< ^input>(stringValue, friendlyStringValue, item)
162+
"""
163+
|> printSignatures
164+
|> should equal
165+
"""
166+
module Extensions
167+
168+
type DataItem<'data> =
169+
{
170+
Identifier: string
171+
Label: string
172+
Data: 'data
173+
}
174+
175+
static member inline Create: item: ^input -> DataItem<^input> when ^input: (member get_StringValue: unit -> string) and ^input: (member get_FriendlyStringValue: unit -> string)
176+
177+
static member Create<'data> : identifier: string * label: string * data: 'data -> DataItem<'data>"""
178+
136179
[<Fact>]
137180
let ``ValText for C# abstract member override`` () =
138181
let csharp = CSharp """

0 commit comments

Comments
 (0)