wcc/check: reject self-import, both stages (#16 ENFORCE-checker)
check-(c): a package importing itself (any spelling) is a hard error, mirroring Go. Predicate is leaf==owner at the N_USE/installdecl seam — sound only after the PREP commits (dotted-test renames, package-less boundary directive). Identical wording both stages; diagnostics-only, byte-id-neutral. 948 pins the reject in both compilers; 708's pos_selfimp (which pinned the abolished self-import skip) converts to neg_selfimp + new pos_crossmod preserving the param-shadow tolerance the case existed for. Checks (a) unused and (b)/(d) name-membership stay deferred to the multi-package arc: imports are filename-keyed pulls, so those need import->file provenance this compiler lacks.
This commit is contained in:
@@ -2810,6 +2810,16 @@ check_file(Checker *c, Node *file)
|
||||
* walked in the next pass. */
|
||||
for (Node *d = file->list; d; d = d->next) {
|
||||
if (d->kind == N_USE) {
|
||||
/* check-(c) self-import: a package may not import
|
||||
* itself. Pure owner==leaf string compare, package-
|
||||
* model-independent — sound under ww's filename-keyed
|
||||
* file-inclusion imports. check-(a) unused and
|
||||
* (b)/(d) membership DEFERRED to task #8 (filename-
|
||||
* keyed pulls lack import->file->symbol provenance). */
|
||||
const char *owner = decl_mod(file, d);
|
||||
if (owner && owner[0] && strcmp(d->str, owner) == 0)
|
||||
err(c, d->pos, "self-import: package "
|
||||
"'%s' cannot import itself", owner);
|
||||
Sym *prev = scope_lookup_local(c->cur, d->str);
|
||||
if (prev != NULL) {
|
||||
/* Self-import: the driver concatenates the
|
||||
|
||||
Reference in New Issue
Block a user