Bug 56611

Summary: Regression: ArrayTypeMismatchException when running F# script
Product: [Mono] Runtime Reporter: Jason Imison <jason.imison>
Component: ReflectionAssignee: Zoltan Varga <vargaz>
Severity: normal CC: kukulcanenator, masafa, mono-bugs+runtime, v-gagano, vargaz
Priority: ---    
Version: 5.0 (2017-02)   
Target Milestone: 15.3   
Hardware: PC   
OS: Mac OS   
Tags: Is this bug a regression?: Yes
Last known good build:

Description Jason Imison 2017-05-18 12:30:08 UTC
Save the following script as bug.fsx

type Observation = { Label:string; Pixels:int[] }

let x = [|""|] |> Array.map (fun s -> { Label = s; Pixels =[|1|]})

printfn "%A" x

run `fsharpi bug.fsx`

output from Mono 5.0

System.ArrayTypeMismatchException: Attempted to access an element as a type incompatible with the array.
  at (wrapper stelemref) System.Object:virt_stelemref_sealed_class (intptr,object)
  at <StartupCode$FSI_0003>.$FSI_0003.main@ () [0x0009f] in <ac8e9934757e4d50a3930165400b2c10>:0
  at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&)
  at System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00032] in <b697cffb61b74023aa9c587e6c49beb3>:0

output from Mono 4.8

[|{Label = "";
   Pixels = [|1|];}|]
Comment 1 Jason Imison 2017-05-18 12:33:21 UTC
Corresponding ticket in fsharp/fsharp https://github.com/fsharp/fsharp/issues/739
Comment 2 Jason Imison 2017-05-18 12:37:33 UTC
I tested the same version of the compiler with both Mono 4.8 and Mono 5.0 and only 5.0 exhibits this issue.
Comment 3 Marek Safar 2017-05-18 17:55:37 UTC
Jason, 15.2.2 is done and as we don't have a fix yet it won't make it
Comment 4 Dave Thomas 2017-05-19 11:29:43 UTC
Yay for first class F# support.
Comment 5 Aleksey Kliger 2017-05-23 01:55:30 UTC
git blame says this is due to https://github.com/mono/mono/commit/a0ad8154f7cdca706802aa196d95686e0f8d3b7b

I don't entirely understand yet what broke.

Here's a smaller reproduction bug.fsx:

type Observation = { Label:string }

let x = [| ({ Label = "" } |]
(So it's not type inference misbehaving somehow)
Comment 6 Zoltan Varga 2017-05-23 04:01:58 UTC
This happens because mono_class_setup_fields () is called on the incomplete type Observer from mono_bounded_array_class_get (). So later, when the type is finished, its fields are not initialized again, so the Label field will have offset 0.
Comment 7 Zoltan Varga 2017-05-30 22:20:57 UTC
Comment 8 Zoltan Varga 2017-05-31 17:25:50 UTC
Fixed in master/2017-04.
Comment 9 Jason Imison 2017-06-08 14:40:27 UTC
Tested on Mono

Works great, thanks! I can add a regression test into the F# tests.