Skip to content

LeafExpressionConverter ignores ValueTuple and assumes System.Tuple #6515

Closed
@kevmal

Description

@kevmal

https://github.com/Microsoft/visualfsharp/blob/0058f88769ab1585c131680eb94a33cf37a71438/src/fsharp/FSharp.Core/Linq.fs#L748-L757

For example

FSharp.Linq.RuntimeHelpers.LeafExpressionConverter.QuotationToExpression(<@struct(1,1)@>)

outputs

val it : Expression =
  new Tuple`2(1, 1) {Arguments = seq [1; 1];
                     CanReduce = false;
                     Constructor = Void .ctor(Int32, Int32);
                     Members = null;
                     NodeType = New;
                     Type = System.Tuple`2[System.Int32,System.Int32];}

So things like

let f (struct(a,b)) = (a,b)
FSharp.Linq.RuntimeHelpers.LeafExpressionConverter.QuotationToExpression(<@f struct(1,1)@>)

raises the exception

> System.ArgumentException: Expression of type 'System.Tuple`2[System.Int32,System.Int32]' cannot be used for parameter of type 'System.ValueTuple`2[System.Int32,System.Int32]' of method 'System.Tuple`2[System.Int32,System.Int32] f[Int32,Int32](System.ValueTuple`2[System.Int32,System.Int32])'
   at System.Linq.Expressions.Expression.ValidateOneArgument(MethodBase method, ExpressionType nodeKind, Expression arg, ParameterInfo pi)
   at System.Linq.Expressions.Expression.ValidateArgumentTypes(MethodBase method, ExpressionType nodeKind, ReadOnlyCollection`1& arguments)
   at System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, IEnumerable`1 arguments)
   at Microsoft.FSharp.Linq.RuntimeHelpers.LeafExpressionConverter.ConvExprToLinqInContext(ConvEnv env, FSharpExpr inp)
   at <StartupCode$FSI_0019>.$FSI_0019.main@()
Stopped due to error

Metadata

Metadata

Assignees

No one assigned

    Labels

    Area-LibraryIssues for FSharp.Core not covered elsewhereBug

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions