fix(compiler): == / != on references is identity; only text compares by content
emit_bin_vals lowered every pointer-typed ==/!= to @lp_str_eq, so two distinct records compared their bytes up to the first zero byte. Content compare now needs both sides to be text (string, or the untyped pointer/ptr runtime code carries text in); other references use icmp eq ptr, and string vs a non-text reference is a compile error. Adds selfhost/tests/identity.ludic; both seeds regenerated. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
e010c2cecc
commit
1900f9ca80
7 changed files with 19750 additions and 19403 deletions
|
|
@ -1011,7 +1011,8 @@ are **`& | ^ << >> ~`** (`>>` is a logical/unsigned shift).
|
|||
**Strings are values.** `a + b` concatenates two strings, and `a == b` / `a != b`
|
||||
compare them **by content** (not by pointer). `"go" + dir == "goleft"` works as
|
||||
written. (Under the hood these call a small emitted string runtime; a `==`/`!=`
|
||||
against `null` is still a pointer test.)
|
||||
against `null` is still a pointer test. Every other reference — records, slices,
|
||||
enums — compares by identity, and comparing a string with one is a compile error.)
|
||||
|
||||
**Interpolation is the readable way to build them.** A backtick string
|
||||
`` `text {expr} text` `` embeds any expression in `{…}` — numbers, bools and
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue