From f3007b479c85d408dd93d90e968300459c823cf3 Mon Sep 17 00:00:00 2001 From: Oscar Spencer Date: Wed, 13 Mar 2024 18:15:31 -0500 Subject: [PATCH] fix(compiler): Allow proper disambiguation of enum variants (#2068) --- compiler/src/typed/typepat.re | 10 ++++++---- compiler/test/suites/types.re | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/compiler/src/typed/typepat.re b/compiler/src/typed/typepat.re index f7f1f50aa1..cb2d2f3048 100644 --- a/compiler/src/typed/typepat.re +++ b/compiler/src/typed/typepat.re @@ -819,10 +819,12 @@ and type_pat_aux = ([{ppat_desc: desc, ppat_loc: loc}], true); }; let opath = - /*try - let (p0, p, _) = extract_concrete_variant !env expected_ty in - Some (p0, p, true) - with Not_found ->*/ None; + try({ + let (p0, p, _) = extract_concrete_variant(env^, expected_ty); + Some((p0, p, true)); + }) { + | Not_found => None + }; let candidates = switch (lid.txt, constrs) { diff --git a/compiler/test/suites/types.re b/compiler/test/suites/types.re index c3aa4acc44..0776ebfc68 100644 --- a/compiler/test/suites/types.re +++ b/compiler/test/suites/types.re @@ -199,6 +199,26 @@ describe("aliased types", ({test, testSkip}) => { |}, "expression was expected of type Aliases.Foo = Number", ); + assertRun( + "disambiguation_enum_1", + {| + enum A { V } + enum B { V } + let f = x => match (x) { V: A => print(true) } + f(V) + |}, + "true\n", + ); + assertRun( + "disambiguation_record_1", + {| + record A { v: Number } + record B { v: Number } + let f = x => match (x) { { v }: A => print(v) } + f({v: 5}) + |}, + "5\n", + ); assertRun( "regression_annotated_type_func_1", {|