leanprover / leanprover/lean4

`csimp` and `macro_inline` cannot be arbitrarily nested

Open
#14,859 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug P-low
Dominant language
Lean
Stars
9.2k
Forks
990
Avg merge
1d 17h
Merged PRs (30d)
175

Description

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.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by running the minimal reproducer against the reported nightly version and inspect the compiler stages named in the issue: macro_inline, csimp, and toDecl. The work is done when arbitrarily nested uses compile successfully and both #guard_msgs evaluations produce the expected false and true results.

Written by the indexing model from the issue text.

Assessment

Domain
compilers
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Clearly specified
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.