Cross-module example (main → b → c) referencing c's lib-less C imports transitively. The non-transitive C-import gate (lower/decl.zig c_import_bare) must police the legacy `#foreign` form and the new `extern` keyword IDENTICALLY — same 'C function not visible' diagnostic, not the generic top-level-name wording. Today the extern twin escapes the c_import_bare gate (body is an empty block, not foreign_expr) and is only caught by the general isNameVisible gate, yielding the generic message. Expected snapshot pins the DESIRED equivalent wording; the next commit aligns the gate to green it. Prerequisite for migrating the fn-decl `#foreign` path onto `extern`. 443/444 corpus (1228 xfail), 444 unit.
8 lines
409 B
Plaintext
8 lines
409 B
Plaintext
// Two spellings of the same lib-less C-symbol import: the legacy
|
|
// `#foreign` form and the new `extern` keyword. Both declare a C
|
|
// function resolved at link time with no library reference. The
|
|
// FFI-linkage migration (Part B) requires the two to be policed
|
|
// IDENTICALLY by the non-transitive C-import visibility gate.
|
|
c_foreign_abs :: (x: i32) -> i32 #foreign;
|
|
c_extern_abs :: (x: i32) -> i32 extern;
|