This PR updates the styling and wording of error messages produced in inductive type declarations and anonymous constructor notation, including hints for inferable constructor visibility updates.
139 lines
3.2 KiB
Text
139 lines
3.2 KiB
Text
import Lean
|
|
/-!
|
|
# Tests for structure resolution order.
|
|
|
|
https://github.com/leanprover/lean4/issues/3467
|
|
https://github.com/leanprover/lean4/issues/1881
|
|
-/
|
|
|
|
/-!
|
|
Basic diamond
|
|
-/
|
|
|
|
set_option structure.strictResolutionOrder true
|
|
set_option trace.Elab.structure.resolutionOrder true
|
|
|
|
/-- trace: [Elab.structure.resolutionOrder] computed resolution order: [A] -/
|
|
#guard_msgs in structure A
|
|
/-- trace: [Elab.structure.resolutionOrder] computed resolution order: [B, A] -/
|
|
#guard_msgs in structure B extends A
|
|
/-- trace: [Elab.structure.resolutionOrder] computed resolution order: [C, A] -/
|
|
#guard_msgs in structure C extends A
|
|
/-- trace: [Elab.structure.resolutionOrder] computed resolution order: [D, B, C, A] -/
|
|
#guard_msgs in structure D extends B, C
|
|
|
|
def A.x (a : A) : Bool := default
|
|
def B.x (b : B) : Nat := default
|
|
def A.y (c : A) : Bool := default
|
|
def C.y (d : C) : Nat := default
|
|
|
|
variable (a : A) (b : B) (c : C) (d : D)
|
|
|
|
/-- info: a.x : Bool -/
|
|
#guard_msgs in #check a.x
|
|
/-- info: b.x : Nat -/
|
|
#guard_msgs in #check b.x
|
|
/-- info: c.x : Bool -/
|
|
#guard_msgs in #check c.x
|
|
/-- info: d.x : Nat -/
|
|
#guard_msgs in #check d.x
|
|
/-- info: a.y : Bool -/
|
|
#guard_msgs in #check a.y
|
|
/-- info: b.y : Bool -/
|
|
#guard_msgs in #check b.y
|
|
/-- info: c.y : Nat -/
|
|
#guard_msgs in #check c.y
|
|
/-- info: d.toC.y : Nat -/
|
|
#guard_msgs in #check d.y
|
|
|
|
|
|
/-!
|
|
Example resolution order failure
|
|
-/
|
|
|
|
/--
|
|
warning: Failed to compute strict resolution order:
|
|
- parent `B` must come after parent `D`
|
|
---
|
|
trace: [Elab.structure.resolutionOrder] computed resolution order: [D', B, D, C, A]
|
|
-/
|
|
#guard_msgs in
|
|
structure D' extends B, D
|
|
|
|
|
|
/-!
|
|
Example from issue 3467.
|
|
-/
|
|
|
|
namespace Issue3467
|
|
|
|
/-- trace: [Elab.structure.resolutionOrder] computed resolution order: [Issue3467.X] -/
|
|
#guard_msgs in
|
|
structure X where
|
|
base : Nat
|
|
|
|
/-- trace: [Elab.structure.resolutionOrder] computed resolution order: [Issue3467.A, Issue3467.X] -/
|
|
#guard_msgs in
|
|
structure A extends X where
|
|
countA : Nat
|
|
|
|
/-- trace: [Elab.structure.resolutionOrder] computed resolution order: [Issue3467.B, Issue3467.X] -/
|
|
#guard_msgs in
|
|
structure B extends X where
|
|
countB : Nat
|
|
|
|
namespace A
|
|
|
|
def getTwiceCountA (a : A) := a.countA * 2
|
|
|
|
end A
|
|
|
|
namespace B
|
|
|
|
def getTwiceCountB (b : B) := b.countB * 2
|
|
|
|
end B
|
|
|
|
/--
|
|
trace: [Elab.structure.resolutionOrder] computed resolution order: [Issue3467.C, Issue3467.A, Issue3467.B, Issue3467.X]
|
|
-/
|
|
#guard_msgs in
|
|
structure C extends A, B
|
|
|
|
def getCounts (c : C) :=
|
|
c.countA + c.countB
|
|
|
|
def getTwiceCounts (c : C) :=
|
|
c.getTwiceCountA + c.getTwiceCountB
|
|
-- ^^^^ used to fail to resolve
|
|
|
|
end Issue3467
|
|
|
|
|
|
namespace Issue1881
|
|
|
|
/-- trace: [Elab.structure.resolutionOrder] computed resolution order: [Issue1881.Foo1] -/
|
|
#guard_msgs in
|
|
structure Foo1 where
|
|
a : Nat
|
|
b : Nat
|
|
|
|
/-- trace: [Elab.structure.resolutionOrder] computed resolution order: [Issue1881.Foo2] -/
|
|
#guard_msgs in
|
|
structure Foo2 where
|
|
a : Nat
|
|
c : Nat
|
|
|
|
/--
|
|
trace: [Elab.structure.resolutionOrder] computed resolution order: [Issue1881.Foo3, Issue1881.Foo1, Issue1881.Foo2]
|
|
-/
|
|
#guard_msgs in
|
|
structure Foo3 extends Foo1, Foo2 where
|
|
d : Nat
|
|
|
|
def Foo1.bar1 (_ : Foo1) : Nat := 0
|
|
def Foo2.bar2 (_ : Foo2) : Nat := 1
|
|
example (x : Foo3) := x.bar1 -- works
|
|
example (x : Foo3) := x.bar2 -- now works
|
|
|
|
end Issue1881
|