diff --git a/examples/1230-ffi-extern-same-name-authors.sx b/examples/1230-ffi-extern-same-name-authors.sx new file mode 100644 index 0000000..1b3ae52 --- /dev/null +++ b/examples/1230-ffi-extern-same-name-authors.sx @@ -0,0 +1,21 @@ +// Two flat FILE imports each declare the SAME libc symbol `absval` via the +// `extern` keyword (the linkage-keyword twin of example 0729's `#foreign` +// form). The bare-call resolver must NOT count extern authors when deciding +// ambiguity — they are external C symbols, never rerouted by the bare-call +// machinery, so the existing first-wins foreign/extern dispatch binds the +// call and a same-name extern collision compiles + runs (prints 7), it does +// NOT error as ambiguous. +// +// Regression (FFI-linkage Part B): `isPlainFreeFn` / `isPlainFreeFnDecl` +// excluded a `#foreign` body but classified an empty-block `extern` fn as a +// plain free function, so the two extern authors were wrongly counted as an +// ambiguous bare-call collision. Prerequisite for migrating the fn-decl +// `#foreign` path onto `extern`. +#import "modules/std.sx"; +#import "1230-ffi-extern-same-name-authors/a.sx"; +#import "1230-ffi-extern-same-name-authors/b.sx"; + +main :: () -> i32 { + print("absval = {}\n", absval(-7)); + 0 +} diff --git a/examples/1230-ffi-extern-same-name-authors/a.sx b/examples/1230-ffi-extern-same-name-authors/a.sx new file mode 100644 index 0000000..1e60dc0 --- /dev/null +++ b/examples/1230-ffi-extern-same-name-authors/a.sx @@ -0,0 +1,6 @@ +// One of two flat authors of `absval`, an `extern` libc binding — the +// `extern` twin of example 0729's `#foreign libc "abs"`. A consumer +// flat-importing BOTH must NOT see this as an ambiguous bare-call +// collision: extern authors (external C symbols) are excluded from the +// bare-call ambiguity verdict, exactly like their `#foreign` twins. +absval :: (n: i32) -> i32 extern libc "abs"; diff --git a/examples/1230-ffi-extern-same-name-authors/b.sx b/examples/1230-ffi-extern-same-name-authors/b.sx new file mode 100644 index 0000000..f6148ce --- /dev/null +++ b/examples/1230-ffi-extern-same-name-authors/b.sx @@ -0,0 +1,2 @@ +// The second flat author of `absval` — the identical `extern` binding. +absval :: (n: i32) -> i32 extern libc "abs"; diff --git a/examples/expected/1230-ffi-extern-same-name-authors.exit b/examples/expected/1230-ffi-extern-same-name-authors.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/examples/expected/1230-ffi-extern-same-name-authors.exit @@ -0,0 +1 @@ +0 diff --git a/examples/expected/1230-ffi-extern-same-name-authors.stderr b/examples/expected/1230-ffi-extern-same-name-authors.stderr new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/examples/expected/1230-ffi-extern-same-name-authors.stderr @@ -0,0 +1 @@ + diff --git a/examples/expected/1230-ffi-extern-same-name-authors.stdout b/examples/expected/1230-ffi-extern-same-name-authors.stdout new file mode 100644 index 0000000..bb4defe --- /dev/null +++ b/examples/expected/1230-ffi-extern-same-name-authors.stdout @@ -0,0 +1 @@ +absval = 7