Skip to content

csimp and macro_inline cannot be arbitrarily nested #14859

Description

@TwoFX

Prerequisites

Description

def specOr (x y : Bool) : Bool :=
  match x with
  | true  => true
  | false => y

@[macro_inline] def implOr (x y : Bool) : Bool :=
  match x with
  | true  => true
  | false => y

@[csimp] theorem specOr_eq_implOr : specOr = implOr := by
  funext x y; cases x <;> rfl

/-- Macro-inlining this introduces `specOr` after `toDecl` has already run `csimp`. -/
@[macro_inline] def wrapper (x y : Bool) : Bool :=
  specOr x y

def useWrapper (x y : Bool) : Bool :=
  wrapper x y

/-- info: false -/
#guard_msgs in
#eval useWrapper false false

/-- info: true -/
#guard_msgs in
#eval useWrapper true false

Context

This came up as part of #8309, where we want to mark the Decidable instances on And and Or as macro_inline.

Steps to Reproduce

  1. Run the above code

Expected behavior: Code succeeds

Actual behavior: useWrapper fails to compile with Failed to find LCNF signature for implOr

Versions

nightly-2026-08-20

Impact

Add 👍 to issues you consider important. If others are impacted by this issue, please ask them to add 👍 to it.

Metadata

Metadata

Assignees

No one assigned

    Labels

    P-lowWe are not planning to work on this issuebugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions