Sakura Lang

V3030 effect_ceiling_exceeded

A pub fn of a package requires a std effect that the package's ceiling does not list (RFC 0003 §5.1, experimental).

An error from the effect phase. sakura explain V3030 prints this explanation offline.

A pub fn of a package requires a std effect that the package's ceiling does not list (RFC 0003 §5.1, experimental). [package] effects in sakura.toml is the ceiling: the std effects the package's public functions may require. The check unions the std effects in every pub fn's row (user-defined effects, Fail and Test are not counted) and reports each pub fn whose row goes beyond the ceiling. A package without an effects key has no ceiling and no check; effects = [] is a pure package. Either remove the effect from the function or widen the ceiling, which every consumer then has to accept on its dependency line (V8032).

Wrong:

# sakura.toml
[package]
name = "stamp"
effects = ["Clock"]
# src/lib.sak
pub fn log_now() -> Unit ! {Clock, Console} { Console.print("{Clock.monotonic_micros()}") }

Fixed:

pub fn now() -> Int ! {Clock} { Clock.monotonic_micros() }

Wrong program

compiler/tests/ui/V3030_effect_ceiling_exceeded/, which the compiler's ui suite runs through sakura check:

lib.sak:

// RFC 0003 §5.1: a `pub fn` whose row has a std effect beyond `[package] effects` is `V3030` at
// the function; private functions and user-defined effects do not count.

pub fn log_now() -> Unit ! {Clock, Console} { Console.print("{Clock.monotonic_micros()}") }

pub fn now() -> Int ! {Clock} { Clock.monotonic_micros() }

fn shout(s: String) -> Unit ! {Console} { Console.print(s) }

sakura.toml:

[package]
name = "stamp"
version = "0.1.0"
effects = ["Clock"]

sakura check --json reports this record (pretty-printed; $DIR is the fixture's directory):

{
  "schema_version": "1.0",
  "kind": "diagnostic",
  "id": "d:cba4f439b92e9161",
  "code": "V3030",
  "severity": "error",
  "phase": "effect",
  "message": "`pub fn log_now` requires `Console`, beyond package `stamp`'s ceiling `effects = [\"Clock\"]` in sakura.toml",
  "snapshot": "sha256:$SNAPSHOT",
  "symbol_id": "stamp::lib::log_now",
  "spans": [
    {
      "uri": "file://$DIR/V3030_effect_ceiling_exceeded/lib.sak",
      "content_hash": "sha256:48ea78361f48c268839fd684731a196eae0cc567be4d5e81f1dbaf6c05236eb1",
      "start_byte": 223,
      "end_byte": 230,
      "role": "primary"
    }
  ],
  "related_ids": [],
  "expected": null,
  "actual": null,
  "obligation": null,
  "counterexample": null,
  "explanation_uri": "sakura://explain/V3030",
  "fixes": []
}

Fixed program

No fixed program is checked in for this code yet; the explanation above describes the repair.

Edit on GitHub

Last updated

On this page