gleam-lang/gleam

Equality with an aliased variant silently returns False on JavaScript

Chiusa

#5757 aperta il 27 mag 2026

 (2 commenti) (0 reazioni) (0 assegnatari)Rust (960 fork)batch import
help wantedhigh priority

Metriche repository

Star
 (21.417 stelle)
Metriche merge PR
 (Merge medio 10g 19h) (69 PR mergiate in 30 g)

Descrizione

  • Gleam: 1.16.x
  • Target: javascript only — Erlang is unaffected

On the JavaScript target, comparing a value to a no-args variant that you imported under an alias can produce the wrong result. The same code compiled to Erlang works correctly.

// src/aliased_variant_bug/foo.gleam
pub type FooStatus { Active Inactive }

// src/aliased_variant_bug/bar.gleam
pub type BarStatus { Active Disabled }

// src/aliased_variant_bug.gleam
import aliased_variant_bug/bar.{type BarStatus, Active as BarActive}
import aliased_variant_bug/foo.{type FooStatus, Active}

pub fn is_foo_active(s: FooStatus) -> Bool { s == Active }
pub fn is_bar_active(s: BarStatus) -> Bool { s == BarActive }

Generated aliased_variant_bug.mjs:

import * as $bar from "./aliased_variant_bug/bar.mjs";
import { Active as BarActive } from "./aliased_variant_bug/bar.mjs";
import * as $foo from "./aliased_variant_bug/foo.mjs";
import { Active } from "./aliased_variant_bug/foo.mjs";

export function is_foo_active(s) { return s instanceof Active; }
export function is_bar_active(s) { return s instanceof Active; }  // wrong — should be BarActive

Guida contributor