From d0ab0a4a2870506531ff40d194370ac50e079967 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Mon, 4 Feb 2019 15:13:26 -0800 Subject: [PATCH 1/2] Fixed address issue on struct records by unifying types earlier --- src/fsharp/TypeChecker.fs | 24 ++++++++++++------------ tests/fsharp/core/byrefs/test.fsx | 10 +++++++++- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 0651a6407e4..6deeb06b3ce 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -6932,18 +6932,7 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, optOrigExpr, flds, mWholeExpr let requiresCtor = (GetCtorShapeCounter env = 1) // Get special expression forms for constructors let haveCtor = Option.isSome inherits - let optOrigExprInfo, tpenv = - match optOrigExpr with - | None -> None, tpenv - | Some (origExpr, _) -> - match inherits with - | Some (_, _, mInherits, _, _) -> error(Error(FSComp.SR.tcInvalidRecordConstruction(), mInherits)) - | None -> - let olde, tpenv = TcExpr cenv overallTy env tpenv origExpr - let oldvaddr, oldvaddre = mkCompGenLocal mWholeExpr "inputRecord" (if isStructTy cenv.g overallTy then mkByrefTy cenv.g overallTy else overallTy) - Some (olde, oldvaddr, oldvaddre), tpenv - - let hasOrigExpr = optOrigExprInfo.IsSome + let hasOrigExpr = optOrigExpr.IsSome let fldsList = let flds = @@ -6970,6 +6959,17 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, optOrigExpr, flds, mWholeExpr | Some v -> yield n, v | None -> () ] + let optOrigExprInfo, tpenv = + match optOrigExpr with + | None -> None, tpenv + | Some (origExpr, _) -> + match inherits with + | Some (_, _, mInherits, _, _) -> error(Error(FSComp.SR.tcInvalidRecordConstruction(), mInherits)) + | None -> + let olde, tpenv = TcExpr cenv overallTy env tpenv origExpr + let oldvaddr, oldvaddre = mkCompGenLocal mWholeExpr "inputRecord" (if isStructTy cenv.g overallTy then mkByrefTy cenv.g overallTy else overallTy) + Some (olde, oldvaddr, oldvaddre), tpenv + if hasOrigExpr && not (isRecdTy cenv.g overallTy) then errorR(Error(FSComp.SR.tcExpressionFormRequiresRecordTypes(), mWholeExpr)) diff --git a/tests/fsharp/core/byrefs/test.fsx b/tests/fsharp/core/byrefs/test.fsx index 0eba848ec2f..5583cfa7c72 100644 --- a/tests/fsharp/core/byrefs/test.fsx +++ b/tests/fsharp/core/byrefs/test.fsx @@ -1491,7 +1491,15 @@ module ByrefReturnMemberTests = module OutRefToInRefClassMethod2 = type C() = static member f1 (x: inref<'T>) = 1 - let f2 (x: outref<'T>) = C.f1(&x) + let f2 (x: outref<'T>) = C.f1(&x) + + module TestStructRecord = + [] + type AnItem = + { Link: string } + + let link item = + { item with Link = "" } let aa = if !failures then (stdout.WriteLine "Test Failed"; exit 1) From 8baa0efd436f492d47588865d38004bae66c0c3d Mon Sep 17 00:00:00 2001 From: Will Smith Date: Mon, 4 Feb 2019 15:48:16 -0800 Subject: [PATCH 2/2] Creating local after UnifyTypes --- src/fsharp/TypeChecker.fs | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 6deeb06b3ce..1e3401f7c23 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -6932,6 +6932,16 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, optOrigExpr, flds, mWholeExpr let requiresCtor = (GetCtorShapeCounter env = 1) // Get special expression forms for constructors let haveCtor = Option.isSome inherits + let optOrigExpr, tpenv = + match optOrigExpr with + | None -> None, tpenv + | Some (origExpr, _) -> + match inherits with + | Some (_, _, mInherits, _, _) -> error(Error(FSComp.SR.tcInvalidRecordConstruction(), mInherits)) + | None -> + let olde, tpenv = TcExpr cenv overallTy env tpenv origExpr + Some (olde), tpenv + let hasOrigExpr = optOrigExpr.IsSome let fldsList = @@ -6959,16 +6969,12 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, optOrigExpr, flds, mWholeExpr | Some v -> yield n, v | None -> () ] - let optOrigExprInfo, tpenv = - match optOrigExpr with - | None -> None, tpenv - | Some (origExpr, _) -> - match inherits with - | Some (_, _, mInherits, _, _) -> error(Error(FSComp.SR.tcInvalidRecordConstruction(), mInherits)) - | None -> - let olde, tpenv = TcExpr cenv overallTy env tpenv origExpr - let oldvaddr, oldvaddre = mkCompGenLocal mWholeExpr "inputRecord" (if isStructTy cenv.g overallTy then mkByrefTy cenv.g overallTy else overallTy) - Some (olde, oldvaddr, oldvaddre), tpenv + let optOrigExprInfo = + match optOrigExpr with + | None -> None + | Some(olde) -> + let oldvaddr, oldvaddre = mkCompGenLocal mWholeExpr "inputRecord" (if isStructTy cenv.g overallTy then mkByrefTy cenv.g overallTy else overallTy) + Some(olde, oldvaddr, oldvaddre) if hasOrigExpr && not (isRecdTy cenv.g overallTy) then errorR(Error(FSComp.SR.tcExpressionFormRequiresRecordTypes(), mWholeExpr))