diff --git a/src/Lean/Meta/Match/Match.lean b/src/Lean/Meta/Match/Match.lean index f789d81254..4813dddca4 100644 --- a/src/Lean/Meta/Match/Match.lean +++ b/src/Lean/Meta/Match/Match.lean @@ -51,7 +51,13 @@ where loop lhss alts minors def assignGoalOf (p : Problem) (e : Expr) : MetaM Unit := - withGoalOf p (assignExprMVar p.mvarId e) + withGoalOf p do + let mvar := mkMVar p.mvarId + let mvarType ← inferType mvar + let eType ← inferType e + unless (← isDefEq mvarType eType) do + throwError "dependent elimination failed, type mismatch when solving alternative with type{indentExpr eType}\nbut expected{indentExpr mvarType}" + assignExprMVar p.mvarId e structure State where used : Std.HashSet Nat := {} -- used alternatives diff --git a/tests/lean/1057.lean b/tests/lean/1057.lean new file mode 100644 index 0000000000..790677c096 --- /dev/null +++ b/tests/lean/1057.lean @@ -0,0 +1,9 @@ +inductive T + | t : T + +@[reducible] def T.eval : T → Type + | T.t => Int + +def T.default (τ : T) : τ.eval := + match τ, τ.eval with + | T.t, .(Int) => (0 : Int) diff --git a/tests/lean/1057.lean.expected.out b/tests/lean/1057.lean.expected.out new file mode 100644 index 0000000000..b74edcc4d2 --- /dev/null +++ b/tests/lean/1057.lean.expected.out @@ -0,0 +1,4 @@ +1057.lean:8:2-9:28: error: dependent elimination failed, type mismatch when solving alternative with type + motive t Int +but expected + motive t x✝