Skip to content
This repository was archived by the owner on Dec 23, 2024. It is now read-only.

Commit 774f6af

Browse files
Happypig375nosami
authored andcommitted
Add char to types resolvable by GenericZero (dotnet#8298)
* Add char to types resolvable by GenericZero * Add char to get_Zero solving * Add char to test * Add char to test * Add char to test again * Fix naming
1 parent 183f27d commit 774f6af

File tree

4 files changed

+37
-33
lines changed

4 files changed

+37
-33
lines changed

src/fsharp/ConstraintSolver.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1316,7 +1316,7 @@ and SolveMemberConstraint (csenv: ConstraintSolverEnv) ignoreUnresolvedOverload
13161316
// We pretend for uniformity that the numeric types have a static property called Zero and One
13171317
// As with constants, only zero is polymorphic in its units
13181318
| [], [ty], false, "get_Zero", []
1319-
when IsNumericType g ty ->
1319+
when IsNumericType g ty || isCharTy g ty ->
13201320
do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty ty
13211321
return TTraitBuiltIn
13221322

src/fsharp/FSharp.Core/prim-types.fs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2369,6 +2369,7 @@ namespace Microsoft.FSharp.Core
23692369
elif aty.Equals(typeof<nativeint>) then unboxPrim<'T> (box 0n)
23702370
elif aty.Equals(typeof<byte>) then unboxPrim<'T> (box 0uy)
23712371
elif aty.Equals(typeof<uint16>) then unboxPrim<'T> (box 0us)
2372+
elif aty.Equals(typeof<char>) then unboxPrim<'T> (box '\000')
23722373
elif aty.Equals(typeof<uint32>) then unboxPrim<'T> (box 0u)
23732374
elif aty.Equals(typeof<uint64>) then unboxPrim<'T> (box 0UL)
23742375
elif aty.Equals(typeof<unativeint>) then unboxPrim<'T> (box 0un)
@@ -2392,7 +2393,7 @@ namespace Microsoft.FSharp.Core
23922393
elif aty.Equals(typeof<nativeint>) then unboxPrim<'T> (box 1n)
23932394
elif aty.Equals(typeof<byte>) then unboxPrim<'T> (box 1uy)
23942395
elif aty.Equals(typeof<uint16>) then unboxPrim<'T> (box 1us)
2395-
elif aty.Equals(typeof<char>) then unboxPrim<'T> (box (retype 1us : char))
2396+
elif aty.Equals(typeof<char>) then unboxPrim<'T> (box '\001')
23962397
elif aty.Equals(typeof<uint32>) then unboxPrim<'T> (box 1u)
23972398
elif aty.Equals(typeof<uint64>) then unboxPrim<'T> (box 1UL)
23982399
elif aty.Equals(typeof<unativeint>) then unboxPrim<'T> (box 1un)
@@ -2420,6 +2421,7 @@ namespace Microsoft.FSharp.Core
24202421
when ^T : unativeint = 0un
24212422
when ^T : int16 = 0s
24222423
when ^T : uint16 = 0us
2424+
when ^T : char = '\000'
24232425
when ^T : sbyte = 0y
24242426
when ^T : byte = 0uy
24252427
when ^T : decimal = 0M
@@ -2440,7 +2442,7 @@ namespace Microsoft.FSharp.Core
24402442
when ^T : unativeint = 1un
24412443
when ^T : int16 = 1s
24422444
when ^T : uint16 = 1us
2443-
when ^T : char = (retype 1us : char)
2445+
when ^T : char = '\001'
24442446
when ^T : sbyte = 1y
24452447
when ^T : byte = 1uy
24462448
when ^T : decimal = 1M

tests/fsharp/core/members/basics/test.fs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3038,6 +3038,7 @@ module ContraintTest = begin
30383038
open System.Numerics
30393039
let check s p = printf "Test %s: %s\n" s (if p then "pass" else "fail")
30403040
do check "d3oc001" (LanguagePrimitives.GenericZero<BigInteger> = 0I)
3041+
do check "d3oc002" (LanguagePrimitives.GenericZero<char> = '\000')
30413042
do check "d3oc003a" (LanguagePrimitives.GenericZero<int> = 0)
30423043
do check "d3oc003b" (LanguagePrimitives.GenericZero<unativeint> = 0un)
30433044
do check "d3oc003c" (LanguagePrimitives.GenericZero<uint64> = 0UL)
@@ -3051,7 +3052,8 @@ module ContraintTest = begin
30513052
do check "d3oc003k" (LanguagePrimitives.GenericZero<sbyte> = 0y)
30523053
do check "d3oc003l" (LanguagePrimitives.GenericZero<decimal> = 0M)
30533054

3054-
do check "d3oc001q" (LanguagePrimitives.GenericOne<BigInteger> = 1I)
3055+
do check "d3oc113q" (LanguagePrimitives.GenericOne<BigInteger> = 1I)
3056+
do check "d3oc113w" (LanguagePrimitives.GenericOne<char> = '\001')
30553057
do check "d3oc113e" (LanguagePrimitives.GenericOne<int> = 1)
30563058
do check "d3oc113r" (LanguagePrimitives.GenericOne<unativeint> = 1un)
30573059
do check "d3oc113t" (LanguagePrimitives.GenericOne<uint64> = 1UL)

tests/fsharp/tools/eval/test.fsx

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1193,35 +1193,35 @@ module EvaluationTests =
11931193

11941194
module InlinedOperationsStillDynamicallyAvailableTests =
11951195

1196-
checkEval "vroievr093" (<@ LanguagePrimitives.GenericZero<sbyte> @>) 0y
1197-
checkEval "vroievr091" (<@ LanguagePrimitives.GenericZero<int16> @>) 0s
1198-
checkEval "vroievr091" (<@ LanguagePrimitives.GenericZero<int32> @>) 0
1199-
checkEval "vroievr091" (<@ LanguagePrimitives.GenericZero<int64> @>) 0L
1200-
checkEval "vroievr091" (<@ LanguagePrimitives.GenericZero<nativeint> @>) 0n
1201-
checkEval "vroievr093" (<@ LanguagePrimitives.GenericZero<byte> @>) 0uy
1202-
checkEval "vroievr091" (<@ LanguagePrimitives.GenericZero<uint16> @>) 0us
1203-
checkEval "vroievr091" (<@ LanguagePrimitives.GenericZero<uint32> @>) 0u
1204-
checkEval "vroievr091" (<@ LanguagePrimitives.GenericZero<uint64> @>) 0UL
1205-
checkEval "vroievr091" (<@ LanguagePrimitives.GenericZero<unativeint> @>) 0un
1206-
checkEval "vroievr091" (<@ LanguagePrimitives.GenericZero<float> @>) 0.0
1207-
checkEval "vroievr091" (<@ LanguagePrimitives.GenericZero<float32> @>) 0.0f
1208-
checkEval "vroievr092" (<@ LanguagePrimitives.GenericZero<decimal> @>) 0M
1209-
1210-
1211-
1212-
checkEval "vroievr093" (<@ LanguagePrimitives.GenericOne<sbyte> @>) 1y
1213-
checkEval "vroievr191" (<@ LanguagePrimitives.GenericOne<int16> @>) 1s
1214-
checkEval "vroievr191" (<@ LanguagePrimitives.GenericOne<int32> @>) 1
1215-
checkEval "vroievr191" (<@ LanguagePrimitives.GenericOne<int64> @>) 1L
1216-
checkEval "vroievr191" (<@ LanguagePrimitives.GenericOne<nativeint> @>) 1n
1217-
checkEval "vroievr193" (<@ LanguagePrimitives.GenericOne<byte> @>) 1uy
1218-
checkEval "vroievr191" (<@ LanguagePrimitives.GenericOne<uint16> @>) 1us
1219-
checkEval "vroievr191" (<@ LanguagePrimitives.GenericOne<uint32> @>) 1u
1220-
checkEval "vroievr191" (<@ LanguagePrimitives.GenericOne<uint64> @>) 1UL
1221-
checkEval "vroievr191" (<@ LanguagePrimitives.GenericOne<unativeint> @>) 1un
1222-
checkEval "vroievr191" (<@ LanguagePrimitives.GenericOne<float> @>) 1.0
1223-
checkEval "vroievr191" (<@ LanguagePrimitives.GenericOne<float32> @>) 1.0f
1224-
checkEval "vroievr192" (<@ LanguagePrimitives.GenericOne<decimal> @>) 1M
1196+
checkEval "vroievr091a" (<@ LanguagePrimitives.GenericZero<char> @>) '\000'
1197+
checkEval "vroievr091b" (<@ LanguagePrimitives.GenericZero<sbyte> @>) 0y
1198+
checkEval "vroievr091c" (<@ LanguagePrimitives.GenericZero<int16> @>) 0s
1199+
checkEval "vroievr091d" (<@ LanguagePrimitives.GenericZero<int32> @>) 0
1200+
checkEval "vroievr091e" (<@ LanguagePrimitives.GenericZero<int64> @>) 0L
1201+
checkEval "vroievr091f" (<@ LanguagePrimitives.GenericZero<nativeint> @>) 0n
1202+
checkEval "vroievr091g" (<@ LanguagePrimitives.GenericZero<byte> @>) 0uy
1203+
checkEval "vroievr091h" (<@ LanguagePrimitives.GenericZero<uint16> @>) 0us
1204+
checkEval "vroievr091i" (<@ LanguagePrimitives.GenericZero<uint32> @>) 0u
1205+
checkEval "vroievr091j" (<@ LanguagePrimitives.GenericZero<uint64> @>) 0UL
1206+
checkEval "vroievr091k" (<@ LanguagePrimitives.GenericZero<unativeint> @>) 0un
1207+
checkEval "vroievr091l" (<@ LanguagePrimitives.GenericZero<float> @>) 0.0
1208+
checkEval "vroievr091m" (<@ LanguagePrimitives.GenericZero<float32> @>) 0.0f
1209+
checkEval "vroievr091n" (<@ LanguagePrimitives.GenericZero<decimal> @>) 0M
1210+
1211+
checkEval "vroievr092a" (<@ LanguagePrimitives.GenericOne<char> @>) '\001'
1212+
checkEval "vroievr092b" (<@ LanguagePrimitives.GenericOne<sbyte> @>) 1y
1213+
checkEval "vroievr092c" (<@ LanguagePrimitives.GenericOne<int16> @>) 1s
1214+
checkEval "vroievr092d" (<@ LanguagePrimitives.GenericOne<int32> @>) 1
1215+
checkEval "vroievr092e" (<@ LanguagePrimitives.GenericOne<int64> @>) 1L
1216+
checkEval "vroievr092f" (<@ LanguagePrimitives.GenericOne<nativeint> @>) 1n
1217+
checkEval "vroievr092g" (<@ LanguagePrimitives.GenericOne<byte> @>) 1uy
1218+
checkEval "vroievr092h" (<@ LanguagePrimitives.GenericOne<uint16> @>) 1us
1219+
checkEval "vroievr092i" (<@ LanguagePrimitives.GenericOne<uint32> @>) 1u
1220+
checkEval "vroievr092j" (<@ LanguagePrimitives.GenericOne<uint64> @>) 1UL
1221+
checkEval "vroievr092k" (<@ LanguagePrimitives.GenericOne<unativeint> @>) 1un
1222+
checkEval "vroievr092l" (<@ LanguagePrimitives.GenericOne<float> @>) 1.0
1223+
checkEval "vroievr092m" (<@ LanguagePrimitives.GenericOne<float32> @>) 1.0f
1224+
checkEval "vroievr092n" (<@ LanguagePrimitives.GenericOne<decimal> @>) 1M
12251225

12261226
check "vroievr0971" (LanguagePrimitives.AdditionDynamic 3y 4y) 7y
12271227
check "vroievr0972" (LanguagePrimitives.AdditionDynamic 3s 4s) 7s

0 commit comments

Comments
 (0)