gleam-lang/gleam

Equality with an aliased variant silently returns False on JavaScript

Fermée

#5 757 ouverte le 27 mai 2026

 (2 commentaires) (0 réaction) (0 personne assignée)Rust (960 forks)batch import
help wantedhigh priority

Métriques du dépôt

Stars
 (21 417 étoiles)
Métriques de merge PR
 (Merge moyen 10j 19h) (69 PRs mergées en 30 j)

Description

  • 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

Guide contributeur