# Changelog 1.12 ## [1.12.2] (2024-05-31) _Patch release with a bug fix necessary for support of latest libgc._ [1.12.2]: https://github.com/crystal-lang/crystal/releases/1.12.2 ### Bugfixes #### stdlib - _(runtime)_ Don't allocate in `Fiber.unsafe_each` and `Thread.unsafe_each` ([#14635], thanks @ysbaddaden) [#14635]: https://github.com/crystal-lang/crystal/pull/14635 ### Infrastructure - Changelog for 1.12.2 ([#14640], thanks @straight-shoota) [#14640]: https://github.com/crystal-lang/crystal/pull/14640 ## [1.12.1] (2024-04-11) [1.12.1]: https://github.com/crystal-lang/crystal/releases/1.12.1 ### Bugfixes #### tools - _(formatter)_ **[regression]** Fix formatter with whitespace before closing parenthesis ([#14471], thanks @straight-shoota) [#14471]: https://github.com/crystal-lang/crystal/pull/14471 ### Infrastructure - Changelog for 1.12.1 ([#14472], thanks @straight-shoota) [#14472]: https://github.com/crystal-lang/crystal/pull/14472 ## [1.12.0] (2024-04-09) [1.12.0]: https://github.com/crystal-lang/crystal/releases/1.12.0 ### Features #### lang - Allow multiple parameters and blocks for operators ending in `=` ([#14159], thanks @HertzDevil) [#14159]: https://github.com/crystal-lang/crystal/pull/14159 #### stdlib - _(concurrency)_ MT: reduce interleaved backtraces in spawn unhandled exceptions ([#14220], thanks @ysbaddaden) - _(concurrency)_ Fix: opening/reading from fifo/chardev files are blocking the thread ([#14255], thanks @ysbaddaden) - _(concurrency)_ Fix: Atomics and Locks (ARM, AArch64, X86) ([#14293], thanks @ysbaddaden) - _(files)_ Add `IO::FileDescriptor::Handle` ([#14390], thanks @straight-shoota) - _(macros)_ Add macro methods for lib-related nodes ([#14218], thanks @HertzDevil) - _(macros)_ Add macro methods for `Primitive` ([#14263], thanks @HertzDevil) - _(macros)_ Add macro methods for `TypeOf` ([#14262], thanks @HertzDevil) - _(macros)_ Add macro methods for `Alias` ([#14261], thanks @HertzDevil) - _(macros)_ Add macro methods for `Asm` and `AsmOperand` ([#14268], thanks @HertzDevil) - _(macros)_ Relax `delegate`'s setter detection ([#14282], thanks @HertzDevil) - _(numeric)_ Add `BigRational#%`, `#tdiv`, `#remainder` ([#14306], thanks @HertzDevil) - _(runtime)_ **[experimental]** Add `ReferenceStorage` for manual allocation of references ([#14270], thanks @HertzDevil) - _(runtime)_ Add MSVC invalid parameter handler ([#14313], thanks @HertzDevil) - _(system)_ Add `Signal#trap_handler?` ([#14126], thanks @stakach) - _(system)_ Thread: set name ([#14257], thanks @ysbaddaden) - _(system)_ Add `Process.on_terminate` ([#13694], thanks @stakach) - _(time)_ Add support for `Etc/UTC` time zone identifier without tzdb ([#14185], thanks @femto) [#14220]: https://github.com/crystal-lang/crystal/pull/14220 [#14255]: https://github.com/crystal-lang/crystal/pull/14255 [#14293]: https://github.com/crystal-lang/crystal/pull/14293 [#14390]: https://github.com/crystal-lang/crystal/pull/14390 [#14218]: https://github.com/crystal-lang/crystal/pull/14218 [#14263]: https://github.com/crystal-lang/crystal/pull/14263 [#14262]: https://github.com/crystal-lang/crystal/pull/14262 [#14261]: https://github.com/crystal-lang/crystal/pull/14261 [#14268]: https://github.com/crystal-lang/crystal/pull/14268 [#14282]: https://github.com/crystal-lang/crystal/pull/14282 [#14306]: https://github.com/crystal-lang/crystal/pull/14306 [#14270]: https://github.com/crystal-lang/crystal/pull/14270 [#14313]: https://github.com/crystal-lang/crystal/pull/14313 [#14126]: https://github.com/crystal-lang/crystal/pull/14126 [#14257]: https://github.com/crystal-lang/crystal/pull/14257 [#13694]: https://github.com/crystal-lang/crystal/pull/13694 [#14185]: https://github.com/crystal-lang/crystal/pull/14185 #### compiler - Add `CRYSTAL_CONFIG_CC` compiler config ([#14318], thanks @straight-shoota) - _(cli)_ Respect `NO_COLOR` in the compiler ([#14260], thanks @HertzDevil) - _(cli)_ Respect `--static` on Windows ([#14292], thanks @HertzDevil) - _(cli)_ Allow `--single-module` and `--threads` for `eval` and `spec` ([#14341], thanks @HertzDevil) - _(codegen)_ Add `--frame-pointers` to control preservation of frame pointers ([#13860], thanks @refi64) - _(codegen)_ x86-64 Solaris / illumos support ([#14343], thanks @HertzDevil) - _(interpreter)_ Support `@[Link]`'s DLL search order in the interpreter on Windows ([#14146], thanks @HertzDevil) - _(interpreter)_ Automatically detect MSVC tools on Windows interpreter ([#14391], thanks @HertzDevil) - _(parser)_ Allow calling `#[]=` with a block using method syntax ([#14161], thanks @HertzDevil) - _(semantic)_ Change short_reference for top-level macros to `::foo` ([#14203], thanks @femto) [#14318]: https://github.com/crystal-lang/crystal/pull/14318 [#14260]: https://github.com/crystal-lang/crystal/pull/14260 [#14292]: https://github.com/crystal-lang/crystal/pull/14292 [#14341]: https://github.com/crystal-lang/crystal/pull/14341 [#13860]: https://github.com/crystal-lang/crystal/pull/13860 [#14343]: https://github.com/crystal-lang/crystal/pull/14343 [#14146]: https://github.com/crystal-lang/crystal/pull/14146 [#14391]: https://github.com/crystal-lang/crystal/pull/14391 [#14161]: https://github.com/crystal-lang/crystal/pull/14161 [#14203]: https://github.com/crystal-lang/crystal/pull/14203 #### tools - Add `crystal tool flags` ([#14234], thanks @straight-shoota) - _(formatter)_ Add more whitespace around `ProcLiteral`s ([#14209], thanks @HertzDevil) [#14234]: https://github.com/crystal-lang/crystal/pull/14234 [#14209]: https://github.com/crystal-lang/crystal/pull/14209 ### Bugfixes #### lang - _(macros)_ Remove extra newline in top-level `FunDef`'s string representation ([#14212], thanks @HertzDevil) - _(macros)_ Remove `T*` and `T[N]` macro interpolation behavior inside libs ([#14215], thanks @HertzDevil) [#14212]: https://github.com/crystal-lang/crystal/pull/14212 [#14215]: https://github.com/crystal-lang/crystal/pull/14215 #### stdlib - _(collection)_ Fix `Hash#update` when default block also adds given key ([#14417], thanks @HertzDevil) - _(collection)_ Fix `Hash#put_if_absent` putting duplicate keys ([#14427], thanks @HertzDevil) - _(concurrency)_ Reserve stack space on non-main threads for crash recovery on Windows ([#14187], thanks @HertzDevil) - _(concurrency)_ Add memory barrier to `Mutex#unlock` on aarch64 ([#14272], thanks @jgaskins) - _(concurrency)_ init schedulers before we spawn fibers ([#14339], thanks @ysbaddaden) - _(files)_ Make `FileUtils.mv` work across filesystems on Windows ([#14320], thanks @HertzDevil) - _(llvm)_ Use correct string size for `LLVM::Type#inline_asm` ([#14265], thanks @HertzDevil) - _(llvm)_ Fix System V ABI for packed structs with misaligned fields ([#14324], thanks @HertzDevil) - _(networking)_ OpenSSL 3.x reports unexpected EOF as SSL error ([#14219], thanks @ysbaddaden) - _(numeric)_ Make equality between `Complex` and other numbers exact ([#14309], thanks @HertzDevil) - _(numeric)_ Fix `#hash` for the `Big*` number types ([#14308], thanks @HertzDevil) - _(runtime)_ Do not allocate memory in the segmentation fault signal handler ([#14327], thanks @HertzDevil) - _(runtime)_ Fix crash stack trace decoding on macOS ([#14335], thanks @HertzDevil) - _(runtime)_ `Crystal::RWLock` should be a struct ([#14345], thanks @ysbaddaden) - _(runtime)_ Fix `min_by?` in IOCP event loop `#run_once` ([#14394], thanks @straight-shoota) - _(serialization)_ `XML::Reader`: Disallow attributes containing null bytes ([#14193], thanks @HertzDevil) - _(serialization)_ Always call `LibXML.xmlInitParser` when requiring XML libraries ([#14191], thanks @HertzDevil) - _(system)_ Fix macro `Crystal::LIBRARY_PATH.split` when cross-compiling ([#14330], thanks @HertzDevil) - _(system)_ Add `SA_RESTART` flag to sigaction syscall ([#14351], thanks @ysbaddaden) - _(text)_ Add `Nil` return type restriction to `String::Formatter#consume_substitution` ([#14430], thanks @straight-shoota) [#14417]: https://github.com/crystal-lang/crystal/pull/14417 [#14427]: https://github.com/crystal-lang/crystal/pull/14427 [#14187]: https://github.com/crystal-lang/crystal/pull/14187 [#14272]: https://github.com/crystal-lang/crystal/pull/14272 [#14339]: https://github.com/crystal-lang/crystal/pull/14339 [#14320]: https://github.com/crystal-lang/crystal/pull/14320 [#14265]: https://github.com/crystal-lang/crystal/pull/14265 [#14324]: https://github.com/crystal-lang/crystal/pull/14324 [#14219]: https://github.com/crystal-lang/crystal/pull/14219 [#14309]: https://github.com/crystal-lang/crystal/pull/14309 [#14308]: https://github.com/crystal-lang/crystal/pull/14308 [#14327]: https://github.com/crystal-lang/crystal/pull/14327 [#14335]: https://github.com/crystal-lang/crystal/pull/14335 [#14345]: https://github.com/crystal-lang/crystal/pull/14345 [#14394]: https://github.com/crystal-lang/crystal/pull/14394 [#14193]: https://github.com/crystal-lang/crystal/pull/14193 [#14191]: https://github.com/crystal-lang/crystal/pull/14191 [#14330]: https://github.com/crystal-lang/crystal/pull/14330 [#14351]: https://github.com/crystal-lang/crystal/pull/14351 [#14430]: https://github.com/crystal-lang/crystal/pull/14430 #### compiler - _(cli)_ `build --no-codegen` output file name error ([#14239], thanks @apainintheneck) - _(codegen)_ Do not handle inline assembly with `"intel"` flag as AT&T syntax ([#14264], thanks @HertzDevil) - _(codegen)_ **[breaking]** Respect alignments above `alignof(Void*)` inside union values ([#14279], thanks @HertzDevil) - _(codegen)_ Fix stack corruption in union-to-union casts ([#14289], thanks @HertzDevil) - _(codegen)_ Don't copy DLL to output directory if file already exists ([#14315], thanks @HertzDevil) - _(codegen)_ Fix `Proc#call` that takes and returns large extern structs by value ([#14323], thanks @HertzDevil) - _(codegen)_ Never discard ivar initializer inside `.allocate` and `.pre_initialize` ([#14337], thanks @HertzDevil) - _(codegen)_ Use separate names for constant and class variable internals ([#14445], thanks @HertzDevil) - _(interpreter)_ fix fiber's resumable property ([#14252], thanks @ysbaddaden) - _(interpreter)_ Ensure all constants only have one initializer in the interpreter ([#14381], thanks @HertzDevil) - _(interpreter)_ Handle NaN comparisons in the interpreter ([#14441], thanks @HertzDevil) - _(interpreter)_ Check `UInt16#to_u8` for overflow in the interpreter ([#14436], thanks @HertzDevil) - _(interpreter)_ Fix interpreter internal overflow for `UInt128#to_f32` and `#to_f32!` ([#14437], thanks @HertzDevil) - _(parser)_ Fix name locations of `FunDef` and `External` nodes ([#14267], thanks @HertzDevil) - _(parser)_ Fix end locations of `Alias` nodes ([#14271], thanks @HertzDevil) [#14239]: https://github.com/crystal-lang/crystal/pull/14239 [#14264]: https://github.com/crystal-lang/crystal/pull/14264 [#14279]: https://github.com/crystal-lang/crystal/pull/14279 [#14289]: https://github.com/crystal-lang/crystal/pull/14289 [#14315]: https://github.com/crystal-lang/crystal/pull/14315 [#14323]: https://github.com/crystal-lang/crystal/pull/14323 [#14337]: https://github.com/crystal-lang/crystal/pull/14337 [#14445]: https://github.com/crystal-lang/crystal/pull/14445 [#14252]: https://github.com/crystal-lang/crystal/pull/14252 [#14381]: https://github.com/crystal-lang/crystal/pull/14381 [#14441]: https://github.com/crystal-lang/crystal/pull/14441 [#14436]: https://github.com/crystal-lang/crystal/pull/14436 [#14437]: https://github.com/crystal-lang/crystal/pull/14437 [#14267]: https://github.com/crystal-lang/crystal/pull/14267 [#14271]: https://github.com/crystal-lang/crystal/pull/14271 #### tools - _(formatter)_ Fix format for `asm` with comments ([#14278], thanks @straight-shoota) - _(formatter)_ Fix formatter for white space in `a.[b]` syntax ([#14346], thanks @straight-shoota) - _(formatter)_ Fix formatter on call without parentheses followed by doc comment ([#14354], thanks @straight-shoota) - _(formatter)_ Do not remove the whitespace in `foo ()` when formatting ([#14439], thanks @HertzDevil) [#14278]: https://github.com/crystal-lang/crystal/pull/14278 [#14346]: https://github.com/crystal-lang/crystal/pull/14346 [#14354]: https://github.com/crystal-lang/crystal/pull/14354 [#14439]: https://github.com/crystal-lang/crystal/pull/14439 ### Chores #### stdlib - _(concurrency)_ **[deprecation]** Drop flag `openbsd6.2` ([#14233], thanks @straight-shoota) - _(files)_ **[deprecation]** Deprecate timeout setters with `Number` arguments ([#14372], thanks @straight-shoota) [#14233]: https://github.com/crystal-lang/crystal/pull/14233 [#14372]: https://github.com/crystal-lang/crystal/pull/14372 #### compiler - _(codegen)_ Drop pinning Dwarf version 2 for android ([#14243], thanks @straight-shoota) [#14243]: https://github.com/crystal-lang/crystal/pull/14243 ### Performance #### stdlib - _(collection)_ Optimize hash lookup in `Enumerable#group_by` ([#14235], thanks @straight-shoota) - _(concurrency)_ Use per-scheduler stack pools (let's recycle) ([#14100], thanks @ysbaddaden) [#14235]: https://github.com/crystal-lang/crystal/pull/14235 [#14100]: https://github.com/crystal-lang/crystal/pull/14100 #### compiler - _(codegen)_ on demand distribution to forked processes ([#14273], thanks @ysbaddaden) - _(interpreter)_ Use `Fiber::StackPool` in the interpreter ([#14395], thanks @HertzDevil) [#14273]: https://github.com/crystal-lang/crystal/pull/14273 [#14395]: https://github.com/crystal-lang/crystal/pull/14395 ### Refactor #### stdlib - _(files)_ Replace some Microsoft C runtime funs with Win32 equivalents ([#14316], thanks @HertzDevil) - _(files)_ Move timeout properties to `Socket` and `IO::FileDescriptor` ([#14367], thanks @straight-shoota) - _(files)_ Add type restrictions to `#unbuffered_*` implementations ([#14382], thanks @straight-shoota) - _(networking)_ Refactor `HTTP::Client` timeout ivars to `Time::Span` ([#14371], thanks @straight-shoota) - _(networking)_ Refactor `Socket#system_receive` to return `Address` ([#14384], thanks @straight-shoota) - _(networking)_ Refactor `#system_connect` without yield ([#14383], thanks @straight-shoota) - _(numeric)_ Add `Crystal::Hasher.reduce_num` and `#number` ([#14304], thanks @HertzDevil) - _(runtime)_ Refactor and add comments to IOCP `#run_once` ([#14380], thanks @straight-shoota) - _(specs)_ **[deprecation]** Move most of spec runner's state into `Spec::CLI` ([#14170], thanks @HertzDevil) - _(specs)_ Add `Spec::Formatter#should_print_summary?` ([#14397], thanks @HertzDevil) [#14316]: https://github.com/crystal-lang/crystal/pull/14316 [#14367]: https://github.com/crystal-lang/crystal/pull/14367 [#14382]: https://github.com/crystal-lang/crystal/pull/14382 [#14371]: https://github.com/crystal-lang/crystal/pull/14371 [#14384]: https://github.com/crystal-lang/crystal/pull/14384 [#14383]: https://github.com/crystal-lang/crystal/pull/14383 [#14304]: https://github.com/crystal-lang/crystal/pull/14304 [#14380]: https://github.com/crystal-lang/crystal/pull/14380 [#14170]: https://github.com/crystal-lang/crystal/pull/14170 [#14397]: https://github.com/crystal-lang/crystal/pull/14397 #### compiler - Ensure `Crystal::Visitor#visit` returns `Bool` ([#14266], thanks @HertzDevil) - _(parser)_ Add `Token::Kind#unary_operator?` ([#14342], thanks @straight-shoota) - _(parser)_ Add `Lexer#wants_def_or_macro_name` ([#14352], thanks @straight-shoota) [#14266]: https://github.com/crystal-lang/crystal/pull/14266 [#14342]: https://github.com/crystal-lang/crystal/pull/14342 [#14352]: https://github.com/crystal-lang/crystal/pull/14352 ### Documentation #### stdlib - _(collection)_ Fix docs `:inherit:` pragma for `Indexable#first` ([#14296], thanks @lachlan) - _(collection)_ Fix `Hash.new(initial_capacity, &block)` doc to use relevant example ([#14429], thanks @lachlan) - _(crypto)_ Improve OpenSSL module documentation ([#14410], thanks @summer-alice) - _(numeric)_ Enhance docs for `Int#downto` ([#14176], thanks @jkthorne) - _(runtime)_ Document builtin constants ([#14276], thanks @straight-shoota) - _(runtime)_ Fix `Pointer#+(offset: Int64)` doc parameter name typo ([#14428], thanks @lachlan) - _(runtime)_ Improve documentation for `at_exit` handler conditions ([#14426], thanks @straight-shoota) - _(system)_ Fix typo in Signal docs ([#14400], thanks @joshrickard) - _(text)_ Fix `Colorize.enabled?`'s documentation ([#14258], thanks @HertzDevil) [#14296]: https://github.com/crystal-lang/crystal/pull/14296 [#14429]: https://github.com/crystal-lang/crystal/pull/14429 [#14410]: https://github.com/crystal-lang/crystal/pull/14410 [#14176]: https://github.com/crystal-lang/crystal/pull/14176 [#14276]: https://github.com/crystal-lang/crystal/pull/14276 [#14428]: https://github.com/crystal-lang/crystal/pull/14428 [#14426]: https://github.com/crystal-lang/crystal/pull/14426 [#14400]: https://github.com/crystal-lang/crystal/pull/14400 [#14258]: https://github.com/crystal-lang/crystal/pull/14258 ### Specs #### stdlib - Fix spelling in `spec/std/uri/params_spec.cr` ([#14302], thanks @jbampton) - _(files)_ Refactor expectations with `SpecChannelStatus` to be explicit ([#14378], thanks @straight-shoota) - _(files)_ Move some `IO::FileDescriptor` specs to the correct file ([#14431], thanks @HertzDevil) - _(system)_ Always preserve the environment for specs that modify `ENV` ([#14211], thanks @HertzDevil) - _(system)_ Ensure Windows time zone specs request `SeTimeZonePrivilege` properly ([#14297], thanks @HertzDevil) - _(text)_ Add single source of UTF-8 test sequences for specs ([#14433], thanks @HertzDevil) - _(time)_ Fix requires for `time/time_spec.cr` and `time/format_spec.cr` ([#14385], thanks @HertzDevil) [#14302]: https://github.com/crystal-lang/crystal/pull/14302 [#14378]: https://github.com/crystal-lang/crystal/pull/14378 [#14431]: https://github.com/crystal-lang/crystal/pull/14431 [#14211]: https://github.com/crystal-lang/crystal/pull/14211 [#14297]: https://github.com/crystal-lang/crystal/pull/14297 [#14433]: https://github.com/crystal-lang/crystal/pull/14433 [#14385]: https://github.com/crystal-lang/crystal/pull/14385 #### compiler - Remove the prelude from some compiler specs ([#14336], thanks @HertzDevil) - _(interpreter)_ Fix: don't run thread specs with the interpreter ([#14287], thanks @ysbaddaden) - _(interpreter)_ Add `pending_interpreted` ([#14386], thanks @HertzDevil) - _(interpreter)_ Remove `spec/interpreter_std_spec.cr` ([#14399], thanks @HertzDevil) - _(semantic)_ Enable `@[Primitive(:va_arg)]` semantic spec on Windows ([#14338], thanks @HertzDevil) [#14336]: https://github.com/crystal-lang/crystal/pull/14336 [#14287]: https://github.com/crystal-lang/crystal/pull/14287 [#14386]: https://github.com/crystal-lang/crystal/pull/14386 [#14399]: https://github.com/crystal-lang/crystal/pull/14399 [#14338]: https://github.com/crystal-lang/crystal/pull/14338 ### Infrastructure - Changelog for 1.12.0 ([#14232], thanks @straight-shoota) - Remove filtering of already mentioned PRs ([#14229], thanks @straight-shoota) - Mention RFC process in contribution instructions ([#14291], thanks @straight-shoota) - Drop Nikola sponsor mention from Readme ([#14290], thanks @straight-shoota) - Enhance changelog script to pull milestone info from GitHub ([#14230], thanks @straight-shoota) - Add `shard.yml` ([#14365], thanks @straight-shoota) - Update vendored dependencies ([#14373], thanks @straight-shoota) - Fix `Milestone` JSON bindings in `github-changelog` helper ([#14404], thanks @straight-shoota) - Make repository configurable for reusable `github-changelog` ([#14407], thanks @straight-shoota) - Use link refs for PR links in changelog ([#14406], thanks @straight-shoota) - Implement pagination for GitHub API in `github-changelog` helper ([#14412], thanks @straight-shoota) - Add `scripts/update-changelog.sh` ([#14231], thanks @straight-shoota) - Update distribution-scripts ([#14457], thanks @straight-shoota) - Change some line endings from CRLF to LF ([#14299], thanks @HertzDevil) - Update copyright year in NOTICE.md ([#14329], thanks @HertzDevil) - Install system dependencies in the Windows GUI installer ([#14328], thanks @HertzDevil) - Skip building `llvm_ext.cc` on LLVM 18 or above ([#14357], thanks @HertzDevil) - _(ci)_ Update previous Crystal release 1.11.0 ([#14189], thanks @straight-shoota) - _(ci)_ Update previous Crystal release 1.11.1 ([#14224], thanks @straight-shoota) - _(ci)_ Update previous Crystal release - 1.11.2 ([#14251], thanks @straight-shoota) - _(ci)_ Update GH Actions ([#14246], thanks @renovate) - _(ci)_ Upgrade `resource_class` for `test_preview_mt` ([#14274], thanks @straight-shoota) - _(ci)_ Upgrade from old machine images approaching EOL ([#14275], thanks @straight-shoota) - _(ci)_ Update Windows library versions ([#14355], thanks @HertzDevil) - _(ci)_ Update cachix/install-nix-action action to v26 ([#14375], thanks @renovate) - _(ci)_ Update shards 0.18.0 ([#14411], thanks @straight-shoota) - _(ci)_ Support LLVM 18.1 ([#14277], thanks @HertzDevil) - _(ci)_ Use `Makefile.win` for Shards on Windows CI ([#14414], thanks @HertzDevil) [#14232]: https://github.com/crystal-lang/crystal/pull/14232 [#14229]: https://github.com/crystal-lang/crystal/pull/14229 [#14291]: https://github.com/crystal-lang/crystal/pull/14291 [#14290]: https://github.com/crystal-lang/crystal/pull/14290 [#14230]: https://github.com/crystal-lang/crystal/pull/14230 [#14365]: https://github.com/crystal-lang/crystal/pull/14365 [#14373]: https://github.com/crystal-lang/crystal/pull/14373 [#14404]: https://github.com/crystal-lang/crystal/pull/14404 [#14407]: https://github.com/crystal-lang/crystal/pull/14407 [#14406]: https://github.com/crystal-lang/crystal/pull/14406 [#14412]: https://github.com/crystal-lang/crystal/pull/14412 [#14231]: https://github.com/crystal-lang/crystal/pull/14231 [#14457]: https://github.com/crystal-lang/crystal/pull/14457 [#14299]: https://github.com/crystal-lang/crystal/pull/14299 [#14329]: https://github.com/crystal-lang/crystal/pull/14329 [#14328]: https://github.com/crystal-lang/crystal/pull/14328 [#14357]: https://github.com/crystal-lang/crystal/pull/14357 [#14189]: https://github.com/crystal-lang/crystal/pull/14189 [#14224]: https://github.com/crystal-lang/crystal/pull/14224 [#14251]: https://github.com/crystal-lang/crystal/pull/14251 [#14246]: https://github.com/crystal-lang/crystal/pull/14246 [#14274]: https://github.com/crystal-lang/crystal/pull/14274 [#14275]: https://github.com/crystal-lang/crystal/pull/14275 [#14355]: https://github.com/crystal-lang/crystal/pull/14355 [#14375]: https://github.com/crystal-lang/crystal/pull/14375 [#14411]: https://github.com/crystal-lang/crystal/pull/14411 [#14277]: https://github.com/crystal-lang/crystal/pull/14277 [#14414]: https://github.com/crystal-lang/crystal/pull/14414