Migrate the two #foreign-bearing diagnostic tests whose assertions survive the cutover, with INTENTIONAL snapshot regens (reviewed): - 1172 (foreign-symbol-conflict): decl '#foreign libc "getenv"' → 'extern libc "getenv"'. Still tests the dup-C-symbol conflict; the 'foreign symbol already bound' message is the keyword-neutral INTERNAL wording (renamed to 'extern symbol' in Phase 9.1), so it persists — only the echoed source line + caret moved. - 1228 (non-transitive C-import visibility): its identity was the #foreign≡extern equivalence lock, now historical (structural via the A→B gate + unified AST). The identifier 'c_foreign_abs' itself contained 'foreign' (would fail the Phase 9.4 gate), so converted c.sx/b.sx/main to two foreign-free extern symbols (c_abs_one/c_abs_two); still pins per-symbol non-transitive visibility. Reverted the orthogonal 0→1-byte empty-stdout normalization on 1228/1231 (known writeGolden idempotency quirk, not a behavior change). Suite green (647/444).
16 lines
571 B
Plaintext
16 lines
571 B
Plaintext
// One C symbol bound twice with DIFFERENT sx signatures is diagnosed
|
|
// (issue 0128): the first registration used to silently win, mis-typing
|
|
// every call through the second declaration. Equal signatures share one
|
|
// registration silently (see std's read/write bound by several modules).
|
|
#import "modules/std.sx";
|
|
|
|
libc :: #library "c";
|
|
// std/process.sx already binds getenv as `-> *u8`; this view disagrees.
|
|
getenv_opt :: (name: [:0]u8) -> ?[:0]u8 extern libc "getenv";
|
|
|
|
main :: () -> i32 {
|
|
p := getenv_opt("PATH");
|
|
if p == null { return 1; }
|
|
return 0;
|
|
}
|