let rec is_irrefutable_pattern (a_pattern: Ast.patt): bool =
  match a_pattern with
      <:patt< () >> -> true             (* unit *)
    | <:patt< ( $p$ : $_$ ) >> ->       (* type constraint *)
      is_irrefutable_pattern p
    | <:patt< ( $p1$ as $_p2$ ) >> ->   (* alias *)
      is_irrefutable_pattern p1
    | <:patt< { $r$ } >> ->             (* record *)
      is_irrefutable_pattern r
    | <:patt< $_$ = $p$ >> ->           (* field in a record *)
      is_irrefutable_pattern p
    | <:patt< $r1$; $r2$ >> ->          (* sum of fields *)
        is_irrefutable_pattern r1 && is_irrefutable_pattern r2
    | <:patt< $t1$, $t2$ >> ->          (* sum in a tuple *)
      is_irrefutable_pattern t1 && is_irrefutable_pattern t2
    | <:patt< ($tup:t$) >> ->           (* tuple *)
      is_irrefutable_pattern t
    | <:patt< $lid:_$ >> -> true        (* variable *)
    | <:patt< _ >> -> true              (* wildcard *)
    | _ -> false