Jadpo is experimental and not ready for production. These docs follow the compiler's main branch as of 5 Nov 2026. What's built · Install 0.3.0
jadpo
ReferenceErrors

ErrorsLogic · rule

semantic.unused_variable

On this page

A variable is given a value that nothing ever reads.

Area 3, Logic; not declinable; the next step is usually the agent's.

Why Jadpo refuses it

A name in the code tells the reader that its value matters later. A value nobody reads is either left over from an edit or a sign that the code reads the wrong name, and a reviewer can't tell which. So every variable is read, or it isn't written.

What it looks like

main.jadpo:

example
type Stock = Int {    min: 0}function with_delivery(per_pack: Stock, delivery: Stock) -> Stock {    var needed: Stock = per_pack    return Stock(per_pack + delivery)}
jadpo checkcheck failed: 1 error, 1 file

error needed is never used

--> main.jadpo:6:9

  |6 |     var needed: Stock = per_pack  |         ^^^^^^ never read
reason
A value nobody reads is never bound to a name, so a reader never wonders what it was for.
next
Use needed, or remove its var line (agent)
rule
semantic.unused_variable
help
https://jadpo.dev/docs/errors/semantic.unused_variable

(agent) at the end of the next: line means your coding agent can make the fix itself.

A match arm that names a variant's data and never reads it is the same error. Here the arm only needs to know the payment was made:

main.jadpo:

example
type ReceiptId = Uuid {}type PaymentOutcome = Enum {    pending    paid: {        receipt_id: ReceiptId    }}type Flag = Bool {}function is_paid(outcome: PaymentOutcome) -> Flag {    return match outcome {        PaymentOutcome.pending -> false        PaymentOutcome.paid(paid) -> true    }}
jadpo checkcheck failed: 1 error, 1 file

error paid is never used

--> main.jadpo:15:29

   |15 |         PaymentOutcome.paid(paid) -> true   |                             ^^^^ never read
reason
A value nobody reads is never bound to a name; a pattern without brackets matches the case without naming its data.
next
Remove (paid) from the pattern (agent)
rule
semantic.unused_variable
help
https://jadpo.dev/docs/errors/semantic.unused_variable

A for loop whose body never reads its item is the error too, and its next: line suggests counting the list with list.count instead.

How to fix it

If the code was meant to read the variable, read it where it was meant to be used:

example
    return Stock(needed + delivery)

The result is worked out from needed, so the name says what the value is for.

If nothing needs it, remove its var line. main.jadpo becomes:

example
type Stock = Int {    min: 0}function with_delivery(per_pack: Stock, delivery: Stock) -> Stock {    return Stock(per_pack + delivery)}

The function works out the same result, with one name fewer to follow.

If a match arm doesn't read the data, remove the brackets and the name from its pattern:

example
    return match outcome {        PaymentOutcome.pending -> false        PaymentOutcome.paid -> true    }

The arm still matches every paid outcome, without naming its receipt.

Markdown for agents: /docs/errors/semantic.unused_variable.md.Built from Jadpo main at aee2e8f.