A shift by the operand's own width or more is poison in LLVM, not a wrong number: (<< 1 32) at -O2 compiled to a bare retq. A literal count out of range is now rejected in check.ml, and emit.ml masks a computed one to width - 1, which is what the hardware does and which LLVM folds away for a constant. There is one top-level namespace, but the environment's tables are per-kind, so only a function was ever checked for a duplicate. (defn item ...) beside (defvar item ...) type checked and then died in LLVM as a redefinition of '@flan.item'; two colliding type declarations were not caught anywhere. One pass over Ast.declared_name now runs before every other collection pass. That function lives in ast.ml because Load needs the same set - the names an import renames - and two copies would drift.
Description
Languages
OCaml
67.2%
Emacs Lisp
15.2%
C
10.4%
HTML
2.9%
Standard ML
2.8%
Other
1.5%