From f895b4306841b5d3c8cb8eef61712b2d2a5d967f Mon Sep 17 00:00:00 2001 From: KevinRansom Date: Mon, 14 Dec 2020 02:09:38 -0800 Subject: [PATCH] fix 10505 -- stringbuilder/iformatable --- src/fsharp/FSharp.Core/prim-types.fs | 9 +++++++-- .../FSharp.Core/OperatorsModule2.fs | 9 +++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/fsharp/FSharp.Core/prim-types.fs b/src/fsharp/FSharp.Core/prim-types.fs index 0aba6593b02..01908497136 100644 --- a/src/fsharp/FSharp.Core/prim-types.fs +++ b/src/fsharp/FSharp.Core/prim-types.fs @@ -4555,8 +4555,13 @@ namespace Microsoft.FSharp.Core | _ -> value.ToString() // other commmon mscorlib reference types - when 'T : StringBuilder = let x = (# "" value : StringBuilder #) in x.ToString() - when 'T : IFormattable = let x = (# "" value : IFormattable #) in x.ToString(null, CultureInfo.InvariantCulture) + when 'T : StringBuilder = + if value = unsafeDefault<'T> then "" + else let x = (# "" value : StringBuilder #) in x.ToString() + + when 'T : IFormattable = + if value = unsafeDefault<'T> then "" + else let x = (# "" value : IFormattable #) in x.ToString(null, CultureInfo.InvariantCulture) [] [] diff --git a/tests/FSharp.Core.UnitTests/FSharp.Core/OperatorsModule2.fs b/tests/FSharp.Core.UnitTests/FSharp.Core/OperatorsModule2.fs index 3a7cc87778d..5e30b9aada9 100644 --- a/tests/FSharp.Core.UnitTests/FSharp.Core/OperatorsModule2.fs +++ b/tests/FSharp.Core.UnitTests/FSharp.Core/OperatorsModule2.fs @@ -6,6 +6,7 @@ namespace FSharp.Core.UnitTests.Operators open System +open System.Text open System.Globalization open System.Threading @@ -754,6 +755,12 @@ type OperatorsModule2() = let result = Operators.string (null:string) Assert.AreEqual("", result) + let result = Operators.string (null:StringBuilder) + Assert.AreEqual("", result) + + let result = Operators.string (null:IFormattable) + Assert.AreEqual("", result) + // value type let result = Operators.string 100 Assert.AreEqual("100", result) @@ -801,6 +808,8 @@ type OperatorsModule2() = // reset the culture Thread.CurrentThread.CurrentCulture <- currentCI + + [] member _.``string: don't raise FS0670 anymore``() = // The type used here, when compiled, should not raise this error: