lean4-htt/tests/elab/3467.lean
Garmelon 08eb78a5b2
chore: switch to new test/bench suite (#12590)
This PR sets up the new integrated test/bench suite. It then migrates
all benchmarks and some related tests to the new suite. There's also
some documentation and some linting.

For now, a lot of the old tests are left alone so this PR doesn't become
even larger than it already is. Eventually, all tests should be migrated
to the new suite though so there isn't a confusing mix of two systems.
2026-02-25 13:51:53 +00:00

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