Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions src/fsharp/TypeChecker.fs
Original file line number Diff line number Diff line change
Expand Up @@ -5535,7 +5535,6 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p
errorR (Error (FSComp.SR.tcUnionCaseDoesNotTakeArguments (), m))
[], args


| arg :: rest when numArgTys = 1 ->
if numArgTys = 1 && not (List.isEmpty rest) then
errorR (Error (FSComp.SR.tcUnionCaseRequiresOneArgument (), m))
Expand All @@ -5544,23 +5543,24 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p
| [arg] -> [arg], []

| args ->
errorR (Error (FSComp.SR.tcUnionCaseExpectsTupledArguments numArgTys, m))
[], args

let args, extraPatterns =
let numArgs = args.Length
if numArgs = numArgTys then
args, extraPatterns
elif numArgs < numArgTys then
if numArgTys > 1 then
// Expects tuple without enough args
errorR (Error (FSComp.SR.tcUnionCaseExpectsTupledArguments numArgTys, m))
else
errorR (UnionCaseWrongArguments (env.DisplayEnv, numArgTys, numArgs, m))
args @ (List.init (numArgTys - numArgs) (fun _ -> SynPat.Wild (m.MakeSynthetic()))), extraPatterns
else
if numArgs < numArgTys then
if numArgs <> 0 && numArgTys <> 0 then
errorR (UnionCaseWrongArguments (env.DisplayEnv, numArgTys, numArgs, m))
args @ (List.init (numArgTys - numArgs) (fun _ -> SynPat.Wild (m.MakeSynthetic()))), extraPatterns
else
let args, remaining = args |> List.splitAt numArgTys
for remainingArg in remaining do
errorR (UnionCaseWrongArguments (env.DisplayEnv, numArgTys, numArgs, remainingArg.Range))
args, extraPatterns @ remaining
let args, remaining = args |> List.splitAt numArgTys
for remainingArg in remaining do
errorR (UnionCaseWrongArguments (env.DisplayEnv, numArgTys, numArgs, remainingArg.Range))
args, extraPatterns @ remaining

let extraPatterns = extraPatterns @ extraPatternsFromNames
let args', acc = TcPatterns warnOnUpper cenv env vFlags (tpenv, names, takenNames) argTys args
Expand Down
19 changes: 18 additions & 1 deletion tests/service/PatternMatchCompilationTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ match A with
"""
assertHasSymbolUsages ["x"; "y"] checkResults
dumpErrors checkResults |> shouldEqual [
"(7,2--7,10): This constructor is applied to 2 argument(s) but expects 3"
"(7,2--7,10): This union case expects 3 arguments in tupled form"
"(6,6--6,7): Incomplete pattern matches on this expression. For example, the value 'A' may indicate a case not covered by the pattern(s)."
]

Expand Down Expand Up @@ -257,6 +257,23 @@ match TraceLevel.Off with
]


[<Test>]
let ``Caseless DU`` () =
let _, checkResults = getParseAndCheckResults """
type DU = Case of int

let f du =
match du with
| Case -> ()

let dowork () =
f (Case 1)
0 // return an integer exit code"""
assertHasSymbolUsages ["DU"; "dowork"; "du"; "f"] checkResults
dumpErrors checkResults |> shouldEqual [
"(6,6--6,10): This constructor is applied to 0 argument(s) but expects 1"
]

[<Test>]
let ``Or 01 - No errors`` () =
let _, checkResults = getParseAndCheckResults """
Expand Down