check: mode-strict-because suppression (iter 19b)

Closes the 19a/19a.1/19b arc. Corpus signal from 19a.1 (5/65
fixtures fire over-strict-mode, all deliberate RC codegen-test
fixtures) justified shipping the suppress mechanism end-to-end.

Schema: Suppress { code, because } on FnDef. Pre-19b hashes
bit-identical via skip_serializing_if. Typechecker drops matching
diagnostics; empty 'because' is Error severity; wrong codes are
silent no-ops (open-set registry).

Form-A: (suppress (code "...") (because "...")) clause, parser
+ printer round-trip clean. Form-B: '// @suppress <code>: <reason>'
above the doc string, lossless contract metadata.

5 RC fixtures migrated (.ail.json + .ailx + .prose.txt). Corpus
signal: 5/65 -> 0/65. Lint still fires on any future fn that's
accidentally over-strict without an authored reason.

Test counts: ailang-check 55->61, ailang-core 26->28, ailang-surface
21->26, ailang-prose 49->52, e2e 70 unchanged.

Known debt: .ailx comment headers lost on regen (ail render's
contract excludes comments); parse_suppress_attr accepts
duplicate code/because attrs without diagnose (bounded by canonical
print order).
This commit is contained in:
2026-05-08 19:36:04 +02:00
parent 9f3f10ce6e
commit 50b68267fe
30 changed files with 942 additions and 304 deletions
+7
View File
@@ -849,6 +849,7 @@ impl<'a> Emitter<'a> {
ty: mono_ty,
params: fdef.params.clone(),
body: mono_body,
suppress: vec![],
doc: fdef.doc.clone(),
};
// Specialised def belongs to the polymorphic def's owner
@@ -2582,6 +2583,7 @@ mod tests {
],
tail: false,
},
suppress: vec![],
doc: None,
}),
// Entry module needs a `main`, otherwise
@@ -2597,6 +2599,7 @@ mod tests {
},
params: vec![],
body: Term::Lit { lit: Literal::Unit },
suppress: vec![],
doc: None,
}),
],
@@ -2660,6 +2663,7 @@ mod tests {
}),
body: Box::new(Term::Lit { lit: Literal::Unit }),
},
suppress: vec![],
doc: None,
}),
],
@@ -2710,6 +2714,7 @@ mod tests {
body: Box::new(Term::Lit { lit: Literal::Unit }),
}),
},
suppress: vec![],
doc: None,
})],
};
@@ -2742,6 +2747,7 @@ mod tests {
body: Term::Lit {
lit: Literal::Int { value: 1 },
},
suppress: vec![],
doc: None,
})],
};
@@ -2811,6 +2817,7 @@ mod tests {
},
params: vec![],
body: Term::Lit { lit: Literal::Unit },
suppress: vec![],
doc: None,
}),
],