This PR adds a warning to any `def` of class type that does not also declare an appropriate reducibility. The warning check runs after elaboration (checking the actual reducibility status via `getReducibilityStatus`) rather than syntactically checking modifiers before elaboration. This is necessary to accommodate patterns like `@[to_additive (attr := implicit_reducible)]` in Mathlib, where the reducibility attribute is applied during `.afterCompilation` by another attribute, and would be missed by a purely syntactic check. --------- Co-authored-by: Paul Reichert <6992158+datokrat@users.noreply.github.com> Co-authored-by: Kim Morrison <kim@tqft.net> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
84 lines
1.7 KiB
Text
84 lines
1.7 KiB
Text
module
|
||
|
||
set_option warn.classDefReducibility false
|
||
|
||
inductive Foo (α : Type u) (β : Type v) where
|
||
| mk₁ : α → Foo α β
|
||
| mk₂ : List β → Foo α β
|
||
|
||
deriving instance Inhabited for Foo
|
||
|
||
def ex1 : Inhabited (Foo α β) :=
|
||
inferInstance
|
||
|
||
inductive Bla (α : Type u) (β : Type v) where
|
||
| mk₁ : α → Bla α β
|
||
| mk₂ : β → Bla α β
|
||
|
||
deriving instance Inhabited for Bla
|
||
|
||
def ex2 [Inhabited α] : Inhabited (Foo α β) :=
|
||
inferInstance
|
||
|
||
structure Point (α : Type) where
|
||
x : α
|
||
y : α
|
||
deriving Inhabited
|
||
|
||
def ex3 [Inhabited α] : Inhabited (Point α) :=
|
||
inferInstance
|
||
|
||
inductive Lst (α : Type) where
|
||
| nil
|
||
| cons : α → Lst α → Lst α
|
||
deriving Inhabited
|
||
|
||
def ex4 : Inhabited (Lst α) :=
|
||
inferInstance
|
||
|
||
mutual
|
||
|
||
inductive FooLst (α : Type) where
|
||
| nil
|
||
| cons : Boo α → FooLst α → FooLst α
|
||
deriving Inhabited
|
||
|
||
inductive Boo (α : Type) where
|
||
| node : FooLst α → Boo α
|
||
deriving Inhabited
|
||
|
||
end
|
||
|
||
def ex5 : Inhabited (Boo α) :=
|
||
inferInstance
|
||
|
||
structure A where
|
||
deriving Inhabited
|
||
|
||
/--
|
||
info: @[implicit_reducible] private def instInhabitedA : Inhabited A :=
|
||
{ default := instInhabitedA.default }
|
||
-/
|
||
#guard_msgs in
|
||
#print instInhabitedA
|
||
|
||
/-! Public structures with private fields should yield public opaque instances. -/
|
||
|
||
public structure PrivField where
|
||
private a : Nat
|
||
deriving Inhabited
|
||
|
||
/-- info: instInhabitedPrivField.default -/
|
||
#guard_msgs in
|
||
#with_exporting
|
||
#reduce (default : PrivField)
|
||
|
||
/-! ...which should not be compatible with explicit `@[expose]`. -/
|
||
|
||
/--
|
||
error: cannot use `deriving ... @[expose]` with `PrivFieldExp` as it has one or more private constructors
|
||
-/
|
||
#guard_msgs in
|
||
public structure PrivFieldExp where
|
||
private a : Nat
|
||
deriving @[expose] Inhabited
|