# Changelog 1.18

## [1.18.2] (2025-10-21)

[1.18.2]: https://github.com/crystal-lang/crystal/releases/1.18.2

### Bugfixes

#### stdlib

- _(files)_ **[regression]** Revert type restriction for `IO#read_bytes` ([#16231], thanks @straight-shoota)
- _(runtime)_ Fix `Fiber::ExecutionContext.default_workers_count` to avoid taking into account unsupported values ([#16227], thanks @Sija)

[#16231]: https://github.com/crystal-lang/crystal/pull/16231
[#16227]: https://github.com/crystal-lang/crystal/pull/16227

### Infrastructure

- Changelog for 1.18.2 ([#16243], thanks @matiasgarciaisaia)

[#16243]: https://github.com/crystal-lang/crystal/pull/16243

## [1.18.1] (2025-10-17)

[1.18.1]: https://github.com/crystal-lang/crystal/releases/1.18.1

### Bugfixes

#### stdlib

- _(networking)_ **[regression]** Revert adding type restrictions on `HTTP::WebSocket#send` etc. ([#16218], thanks @straight-shoota)

[#16218]: https://github.com/crystal-lang/crystal/pull/16218

#### compiler

- _(parser)_ **[regression]** Fix allow space after base type in enum def ([#16217], thanks @straight-shoota)

[#16217]: https://github.com/crystal-lang/crystal/pull/16217

### Infrastructure

- Changelog for 1.18.1 ([#16224], thanks @matiasgarciaisaia)

[#16224]: https://github.com/crystal-lang/crystal/pull/16224

## [1.18.0] (2025-10-14)

[1.18.0]: https://github.com/crystal-lang/crystal/releases/1.18.0

### Features

#### lang

- Support `ProcPointer`s of lib funs with parameter types ([#16089], thanks @HertzDevil)
- _(annotations)_ Print deprecation warning on types and aliases ([#15962], thanks @ysbaddaden)
- _(annotations)_ Print deprecation warnings on deprecated method argument ([#15999], thanks @ysbaddaden)
- _(macros)_ **[breaking]** Expand empty `(Named)TupleLiteral` to `(Named)Tuple.new` instead of `{}` ([#16108], thanks @spuun)
- _(macros)_ Add `ArrayLiteral#*`, `StringLiteral#*` and `TupleLiteral#*` ([#16154], [#16206], thanks @jneen, @ysbaddaden)

[#16089]: https://github.com/crystal-lang/crystal/pull/16089
[#15962]: https://github.com/crystal-lang/crystal/pull/15962
[#15999]: https://github.com/crystal-lang/crystal/pull/15999
[#16108]: https://github.com/crystal-lang/crystal/pull/16108
[#16154]: https://github.com/crystal-lang/crystal/pull/16154
[#16206]: https://github.com/crystal-lang/crystal/pull/16206

#### stdlib

- Add `summary_width` and `summary_indent` to `OptionParser` ([#15326], thanks @kojix2)
- _(collection)_ Add `Set#select!` and `#reject!` ([#16060], thanks @HertzDevil)
- _(concurrency)_ Speed up `Parallel::Scheduler#quick_dequeue?` for `max=1` ([#15961], thanks @ysbaddaden)
- _(concurrency)_ Default execution context is now parallel (MT:1) ([#16136], thanks @ysbaddaden)
- _(files)_ **[deprecation]** Add `.set_blocking` to `Socket` and `IO::FileDescriptor` and deprecate `#blocking` property ([#16033], [#16129], thanks @ysbaddaden)
- _(llvm)_ Support LLVM 21.1 and 22.0 ([#16062], [#16198], thanks @HertzDevil, @straight-shoota)
- _(macros)_ Add `NumberLiteral#zero?` ([#10248], thanks @Sija)
- _(macros)_ Add `thread_local` macro ([#16173], thanks @ysbaddaden)
- _(networking)_ Fix `URI#host=` to wrap IPv6 address in brackets ([#16164], thanks @stakach)
- _(runtime)_ Lazily instantiate the event loop of isolated execution contexts ([#16063], thanks @ysbaddaden)
- _(runtime)_ Add `Fiber::ExecutionContext::Parallel#resize` ([#15956], thanks @ysbaddaden)
- _(runtime)_ Add `Crystal::System.effective_cpu_count` ([#16148], thanks @ysbaddaden)
- _(runtime)_ Improve `Fiber::ExecutionContext.default_workers_count` ([#16149], thanks @ysbaddaden)
- _(serialization)_ Add `Time::Location.from_json_object_key` ([#15957], thanks @Sija)
- _(serialization)_ Resolve YAML aliases in `YAML::Any` ([#15941], thanks @willhbr)
- _(serialization)_ Embed libxml2 version number on Windows MSVC ([#16104], thanks @HertzDevil)
- _(serialization)_ Add `JSON::Any` wrapper around `JSON::Any#inspect` output ([#15979], thanks @jneen)
- _(specs)_ Add `with_tempdir` spec helper ([#16005], thanks @straight-shoota)
- _(system)_ Add `File.readlink?` ([#16004], thanks @straight-shoota)
- _(text)_ Add `SemanticVersion.valid?` & `SemanticVersion.parse?` ([#15051], thanks @devnote-dev)
- _(text)_ Add `String.additive_identity` ([#15998], thanks @straight-shoota)
- _(text)_ Use proper ANSI reset codes in `Colorize` ([#16052], thanks @Blacksmoke16)
- _(text)_ Update Unicode to 17.0.0 ([#16160], thanks @HertzDevil)
- _(time)_ Use canonical IANA name for the local Windows system time zone ([#15967], thanks @HertzDevil)
- _(time)_ Load `Location.local` by symlink name ([#16002], [#16022], thanks @straight-shoota)
- _(time)_ Add `Time::Location.load?` ([#16121], thanks @straight-shoota)
- _(time)_ Format `Time#inspect` with Internet Extended Date/Time Format ([#16039], thanks @straight-shoota)

[#15326]: https://github.com/crystal-lang/crystal/pull/15326
[#16060]: https://github.com/crystal-lang/crystal/pull/16060
[#15961]: https://github.com/crystal-lang/crystal/pull/15961
[#16136]: https://github.com/crystal-lang/crystal/pull/16136
[#16033]: https://github.com/crystal-lang/crystal/pull/16033
[#16129]: https://github.com/crystal-lang/crystal/pull/16129
[#16062]: https://github.com/crystal-lang/crystal/pull/16062
[#16198]: https://github.com/crystal-lang/crystal/pull/16198
[#10248]: https://github.com/crystal-lang/crystal/pull/10248
[#16173]: https://github.com/crystal-lang/crystal/pull/16173
[#16164]: https://github.com/crystal-lang/crystal/pull/16164
[#16063]: https://github.com/crystal-lang/crystal/pull/16063
[#15956]: https://github.com/crystal-lang/crystal/pull/15956
[#16148]: https://github.com/crystal-lang/crystal/pull/16148
[#16149]: https://github.com/crystal-lang/crystal/pull/16149
[#15957]: https://github.com/crystal-lang/crystal/pull/15957
[#15941]: https://github.com/crystal-lang/crystal/pull/15941
[#16104]: https://github.com/crystal-lang/crystal/pull/16104
[#15979]: https://github.com/crystal-lang/crystal/pull/15979
[#16005]: https://github.com/crystal-lang/crystal/pull/16005
[#16004]: https://github.com/crystal-lang/crystal/pull/16004
[#15051]: https://github.com/crystal-lang/crystal/pull/15051
[#15998]: https://github.com/crystal-lang/crystal/pull/15998
[#16052]: https://github.com/crystal-lang/crystal/pull/16052
[#16160]: https://github.com/crystal-lang/crystal/pull/16160
[#15967]: https://github.com/crystal-lang/crystal/pull/15967
[#16002]: https://github.com/crystal-lang/crystal/pull/16002
[#16022]: https://github.com/crystal-lang/crystal/pull/16022
[#16121]: https://github.com/crystal-lang/crystal/pull/16121
[#16039]: https://github.com/crystal-lang/crystal/pull/16039

#### compiler

- _(cli)_ Add the ability to dump type information to a JSON file ([#16027], thanks @HertzDevil)
- _(interpreter)_ Support `Proc.new(Void*, Void*)` in the interpreter ([#16044], thanks @HertzDevil)
- _(interpreter:repl)_ Fully exit the process on `exit!` from REPL ([#16171], thanks @jneen)
- _(semantic)_ Resolve types when guessing return type from class method overloads ([#16118], thanks @HertzDevil)
- _(semantic)_ Guess instance variable types from global method calls ([#16119], thanks @HertzDevil)

[#16027]: https://github.com/crystal-lang/crystal/pull/16027
[#16044]: https://github.com/crystal-lang/crystal/pull/16044
[#16171]: https://github.com/crystal-lang/crystal/pull/16171
[#16118]: https://github.com/crystal-lang/crystal/pull/16118
[#16119]: https://github.com/crystal-lang/crystal/pull/16119

#### tools

- _(docs-generator)_ Add support for deprecated parameters in doc generator ([#16012], thanks @straight-shoota)
- _(hierarchy)_ Show extern union types in hierarchy tool ([#16026], thanks @HertzDevil)

[#16012]: https://github.com/crystal-lang/crystal/pull/16012
[#16026]: https://github.com/crystal-lang/crystal/pull/16026

### Bugfixes

#### stdlib

- _(files)_ Fix `fcntl` reference for `fds[1]` in socketpair setup ([#16072], thanks @kojix2)
- _(log)_ Make crystal log resilient to empty LOG_LEVEL env var ([#15963], thanks @anaPerezGhiglia)
- _(networking)_ Preserve query params in `StaticFileHandler` redirects ([#15789], thanks @syeopite)
- _(networking)_ Fix `StaticFileHandler` to return 404 on file error ([#16025], [#16077], thanks @straight-shoota)
- _(networking)_ Run `before_request` callback in `HTTP::Client` only once ([#16064], thanks @straight-shoota)
- _(networking)_ Fix `HTTP::Request#query=` typing ([#16143], thanks @Blacksmoke16)
- _(runtime)_ `Fiber::ExecutionContext::Parallel::Scheduler#tick` must be unsigned ([#16155], thanks @ysbaddaden)
- _(serialization)_ Fix add missing `#==` overloads for `Log::Metadata::Value` and `YAML::Any` ([#15732], thanks @straight-shoota)
- _(serialization)_ Fix pointer access bug in `XML::NodeSet` ([#16055], thanks @toddsundsted)
- _(serialization)_ Remove `NOERROR` from LibXML default options ([#16103], thanks @straight-shoota)
- _(serialization)_ Move `*::Serializable`'s private constructors into `macro included` hook ([#16147], thanks @HertzDevil)
- _(serialization)_ Correctly reference global JSON/YAML modules ([#16161], [#16169], thanks @Sija, @straight-shoota)
- _(serialization)_ Fix element type inference in `YAML::ArrayConverter.from_yaml` ([#16166], thanks @HertzDevil)
- _(system)_ Fix return type of `system_close_on_exec=` on Windows ([#16095], thanks @straight-shoota)
- _(time)_ Fix time zone identifier `America/Argentina/Buenos_Aires` ([#16078], thanks @straight-shoota)
- _(time)_ Fix `Time#at_beginning_of_week`,`#at_end_of_week` to respect local timezone ([#16113], thanks @straight-shoota)

[#16072]: https://github.com/crystal-lang/crystal/pull/16072
[#15963]: https://github.com/crystal-lang/crystal/pull/15963
[#15789]: https://github.com/crystal-lang/crystal/pull/15789
[#16025]: https://github.com/crystal-lang/crystal/pull/16025
[#16077]: https://github.com/crystal-lang/crystal/pull/16077
[#16064]: https://github.com/crystal-lang/crystal/pull/16064
[#16143]: https://github.com/crystal-lang/crystal/pull/16143
[#16155]: https://github.com/crystal-lang/crystal/pull/16155
[#15732]: https://github.com/crystal-lang/crystal/pull/15732
[#16055]: https://github.com/crystal-lang/crystal/pull/16055
[#16103]: https://github.com/crystal-lang/crystal/pull/16103
[#16147]: https://github.com/crystal-lang/crystal/pull/16147
[#16161]: https://github.com/crystal-lang/crystal/pull/16161
[#16169]: https://github.com/crystal-lang/crystal/pull/16169
[#16166]: https://github.com/crystal-lang/crystal/pull/16166
[#16095]: https://github.com/crystal-lang/crystal/pull/16095
[#16078]: https://github.com/crystal-lang/crystal/pull/16078
[#16113]: https://github.com/crystal-lang/crystal/pull/16113

#### compiler

- _(codegen)_ Never generate assignments to a block's underscore parameters ([#16057], thanks @HertzDevil)
- _(codegen)_ Fix `@[Primitive]` codegen for typedefs ([#16110], thanks @HertzDevil)
- _(interpreter)_ never generate assignments to a block's underscore parameters ([#16058], thanks @HertzDevil)
- _(interpreter)_ Add `writer.close_on_finalize = false` for signal pipe ([#16167], thanks @straight-shoota)
- _(interpreter:repl)_ Continue REPL prompt if input consists entirely of annotations ([#16045], thanks @HertzDevil)
- _(parser)_ Disallow unterminated escaped heredoc without trailing newline ([#16046], thanks @HertzDevil)
- _(parser)_ Require space, semicolon, or newline after class/module/etc. header ([#13375], thanks @FnControlOption)
- _(parser)_ Fix parsing `ReadInstanceVar` in short block syntax ([#16099], thanks @nobodywasishere)
- _(semantic)_ Pass through variable types unchanged in a while loop ([#15980], thanks @HertzDevil)
- _(semantic)_ deprecation warning for (expanded) deprecated def ([#15997], thanks @ysbaddaden)
- _(semantic)_ Copy annotations in  `Crystal::Arg#copy_without_location` ([#16008], thanks @ysbaddaden)
- _(semantic)_ Copy annotations in `Crystal::Def#expand_default_arguments` ([#16007], thanks @ysbaddaden)
- _(semantic)_ Copy annotations in `Crystal::Def#expand_new_default_arguments` ([#16013], thanks @ysbaddaden)
- _(semantic)_ Fix error message for `StaticArray` with non-integer generic argument `N` ([#16037], thanks @straight-shoota)
- _(semantic)_ Resolve bound type parameters from generic superclass during path lookup ([#10839], thanks @HertzDevil)
- _(semantic)_ **[regression]** Ensure hash literals are evaluated from left to right ([#16124], thanks @HertzDevil)

[#16057]: https://github.com/crystal-lang/crystal/pull/16057
[#16110]: https://github.com/crystal-lang/crystal/pull/16110
[#16058]: https://github.com/crystal-lang/crystal/pull/16058
[#16167]: https://github.com/crystal-lang/crystal/pull/16167
[#16045]: https://github.com/crystal-lang/crystal/pull/16045
[#16046]: https://github.com/crystal-lang/crystal/pull/16046
[#13375]: https://github.com/crystal-lang/crystal/pull/13375
[#16099]: https://github.com/crystal-lang/crystal/pull/16099
[#15980]: https://github.com/crystal-lang/crystal/pull/15980
[#15997]: https://github.com/crystal-lang/crystal/pull/15997
[#16008]: https://github.com/crystal-lang/crystal/pull/16008
[#16007]: https://github.com/crystal-lang/crystal/pull/16007
[#16013]: https://github.com/crystal-lang/crystal/pull/16013
[#16037]: https://github.com/crystal-lang/crystal/pull/16037
[#10839]: https://github.com/crystal-lang/crystal/pull/10839
[#16124]: https://github.com/crystal-lang/crystal/pull/16124

### Chores

#### stdlib

- Drop `Thread::Local(T)` ([#16179], thanks @ysbaddaden)
- _(concurrency)_ **[deprecation]** Deprecate `Atomic::Flag` ([#15805], thanks @ysbaddaden)
- _(files)_ **[deprecation]** Deprecate the `blocking` parameter of `File`, `Socket` and `IO::FileDescriptor` constructors ([#16034], [#16043], [#16047], thanks @ysbaddaden, @Blacksmoke16)
- _(numeric)_ **[deprecation]** Deprecate `Float::Printer::IEEE` ([#16050], thanks @HertzDevil)
- _(system)_ **[deprecation]** Deprecate `Process::Status#exit_signal` ([#16003], thanks @straight-shoota)

[#16179]: https://github.com/crystal-lang/crystal/pull/16179
[#15805]: https://github.com/crystal-lang/crystal/pull/15805
[#16034]: https://github.com/crystal-lang/crystal/pull/16034
[#16043]: https://github.com/crystal-lang/crystal/pull/16043
[#16047]: https://github.com/crystal-lang/crystal/pull/16047
[#16050]: https://github.com/crystal-lang/crystal/pull/16050
[#16003]: https://github.com/crystal-lang/crystal/pull/16003

### Performance

#### lang

- Optimize `Enum.parse?`, avoiding allocations ([#15927], [#16192], thanks @jgaskins, @straight-shoota)

[#15927]: https://github.com/crystal-lang/crystal/pull/15927
[#16192]: https://github.com/crystal-lang/crystal/pull/16192

#### stdlib

- _(numeric)_ Do not use equality checks in `Int#upto` and `#downto` ([#16076], thanks @HertzDevil)
- _(system)_ Simplify buffer for `File.readlink` ([#16021], thanks @straight-shoota)
- _(time)_ Optimize `Time#to_s` ([#16042], thanks @straight-shoota)

[#16076]: https://github.com/crystal-lang/crystal/pull/16076
[#16021]: https://github.com/crystal-lang/crystal/pull/16021
[#16042]: https://github.com/crystal-lang/crystal/pull/16042

#### compiler

- Inline `Crystal.check_type_can_be_stored` ([#16130], thanks @HertzDevil)
- _(codegen)_ Group temporary variables by file name: compound array assignments ([#16122], thanks @HertzDevil)

[#16130]: https://github.com/crystal-lang/crystal/pull/16130
[#16122]: https://github.com/crystal-lang/crystal/pull/16122

### Refactor

#### stdlib

- _(concurrency)_ Refactor redundant `begin ... end` blocks ([#16011], thanks @straight-shoota)
- _(networking)_ Reorder implementation of `HTTP::Cookies#<<` and `[]=` ([#16107], thanks @straight-shoota)
- _(runtime)_ Remove nilable pointers in `Crystal::PointerPairingHeap` ([#15973], thanks @HertzDevil)
- _(runtime)_ Remove nilable pointer in `Crystal::EventLoop::IOCP#@timer_packet` ([#15975], thanks @HertzDevil)
- _(runtime)_ Remove minimum in `Fiber::ExecutionContext::Parallel` ([#15946], thanks @ysbaddaden)
- _(runtime)_ Pass `fd` implicitly to `System::FileDescriptor` and `System::Socket` ([#16137], [#16183], thanks @ysbaddaden)
- _(runtime)_ Drop custom implementation of `Fiber::ExecutionContext::Concurrent` ([#16135], thanks @ysbaddaden)
- _(specs)_ Keep own colorization state in `Spec::CLI` ([#15926], thanks @HertzDevil)
- _(text)_ Use `ensure_suffix` instead of manually checking for suffixes ([#15858], thanks @MatheusRich)
- _(time)_ Remove the old Windows time zone name table ([#16006], thanks @HertzDevil)

[#16011]: https://github.com/crystal-lang/crystal/pull/16011
[#16107]: https://github.com/crystal-lang/crystal/pull/16107
[#15973]: https://github.com/crystal-lang/crystal/pull/15973
[#15975]: https://github.com/crystal-lang/crystal/pull/15975
[#15946]: https://github.com/crystal-lang/crystal/pull/15946
[#16137]: https://github.com/crystal-lang/crystal/pull/16137
[#16183]: https://github.com/crystal-lang/crystal/pull/16183
[#16135]: https://github.com/crystal-lang/crystal/pull/16135
[#15926]: https://github.com/crystal-lang/crystal/pull/15926
[#15858]: https://github.com/crystal-lang/crystal/pull/15858
[#16006]: https://github.com/crystal-lang/crystal/pull/16006

#### compiler

- _(codegen)_ Refactor `Compiler#must_compile?` to clarify the rules. ([#16056], thanks @kojix2)
- _(parser)_ Add `#has_any_args?` method for `ASTNode`s ([#16115], thanks @straight-shoota)

[#16056]: https://github.com/crystal-lang/crystal/pull/16056
[#16115]: https://github.com/crystal-lang/crystal/pull/16115

#### tools

- _(formatter)_ Simplify control flow in formatter for `Call` nodes ([#16170], thanks @straight-shoota)

[#16170]: https://github.com/crystal-lang/crystal/pull/16170

#### other

- Refactor `unless ... else` ([#16010], thanks @straight-shoota)
- Removed unused variables ([#16014], thanks @straight-shoota)

[#16010]: https://github.com/crystal-lang/crystal/pull/16010
[#16014]: https://github.com/crystal-lang/crystal/pull/16014

### Documentation

#### lang

- _(annotations)_ Enhance documentation of `Deprecated` annotation ([#16195], thanks @straight-shoota)

[#16195]: https://github.com/crystal-lang/crystal/pull/16195

#### stdlib

- _(benchmark)_ Add type restrictions to benchmark directory ([#15688], thanks @Vici37)
- _(concurrency)_ Improve docs for `Channel#close` ([#15910], thanks @anaPerezGhiglia)
- _(crypto)_ Fix doc example for `Crypto::BCrypt.new(String, String, Int)` ([#15931], thanks @hugopl)
- _(crypto)_ Add type restrictions to crypto directory ([#15694], thanks @Vici37)
- _(files)_ Add type restrictions to mime ([#15834], thanks @Vici37)
- _(files)_ Fix `IO::TimeoutError` documentation use of deprecated `read_timeout=` ([#16073], thanks @lachlan)
- _(files)_ Add type restrictions to io ([#15698], thanks @Vici37)
- _(llvm)_ Deprecate each `LLVM::ABI::*` classes ([#15989], thanks @ysbaddaden)
- _(log)_ Add type restrictions to Log directory ([#15777], thanks @Vici37)
- _(networking)_ Add type restrictions to Oauth directory ([#15687], thanks @Vici37)
- _(networking)_ Add type restrictions to http ([#15710], thanks @Vici37)
- _(numeric)_ Add type restrictions to big ([#15689], thanks @Vici37)
- _(runtime)_ Fix typo in `Object` docs ([#16035], thanks @plambert)
- _(runtime)_ Tweak docs for `Fiber::ExecutionContext` ([#16196], thanks @ysbaddaden)
- _(serialization)_ Add type restrictions to json ([#15840], [#16142], thanks @Vici37, @Sija)
- _(serialization)_ Add note about default constructor in `*::Serializable` ([#16080], thanks @HertzDevil)
- _(system)_ Add type restrictions to `args` parameter in `Process` ([#16031], thanks @BigBoyBarney)
- _(system)_ Add missing `File::NotFoundError` exception documentation for `File.open` ([#15826], thanks @Fijxu)
- _(text)_ Fix return type definition of `String#match_full!` method ([#16001], thanks @Sija)
- _(time)_ Update links to ISO-8601 to point to an archived version of the page ([#15985], thanks @nobodywasishere)
- _(time)_ Improve docs for `Time#to_local_in` ([#16041], thanks @straight-shoota)

[#15688]: https://github.com/crystal-lang/crystal/pull/15688
[#15910]: https://github.com/crystal-lang/crystal/pull/15910
[#15931]: https://github.com/crystal-lang/crystal/pull/15931
[#15694]: https://github.com/crystal-lang/crystal/pull/15694
[#15834]: https://github.com/crystal-lang/crystal/pull/15834
[#16073]: https://github.com/crystal-lang/crystal/pull/16073
[#15698]: https://github.com/crystal-lang/crystal/pull/15698
[#15989]: https://github.com/crystal-lang/crystal/pull/15989
[#15777]: https://github.com/crystal-lang/crystal/pull/15777
[#15687]: https://github.com/crystal-lang/crystal/pull/15687
[#15710]: https://github.com/crystal-lang/crystal/pull/15710
[#15689]: https://github.com/crystal-lang/crystal/pull/15689
[#16035]: https://github.com/crystal-lang/crystal/pull/16035
[#16196]: https://github.com/crystal-lang/crystal/pull/16196
[#15840]: https://github.com/crystal-lang/crystal/pull/15840
[#16142]: https://github.com/crystal-lang/crystal/pull/16142
[#16080]: https://github.com/crystal-lang/crystal/pull/16080
[#16031]: https://github.com/crystal-lang/crystal/pull/16031
[#15826]: https://github.com/crystal-lang/crystal/pull/15826
[#16001]: https://github.com/crystal-lang/crystal/pull/16001
[#15985]: https://github.com/crystal-lang/crystal/pull/15985
[#16041]: https://github.com/crystal-lang/crystal/pull/16041

### Specs

#### stdlib

- _(networking)_ Disable UDP multicast spec on macOS ([#15990], thanks @straight-shoota)
- _(networking)_ Extract specs for `HTTP::Cookies` to their own file ([#16106], thanks @straight-shoota)
- _(networking)_ Overhaul `HTTP::Cookies` specs ([#16117], thanks @straight-shoota)
- _(networking)_ Fix `UDPSocket` broadcast spec to not use `connect` ([#16165], thanks @ysbaddaden)
- _(runtime)_ Disable flaky spec for `Fiber::ExecutionContext::GlobalQueue` on macOS ([#16146], thanks @ysbaddaden)
- _(system)_ Enable specs for `close_on_exec` on Windows ([#14716], thanks @straight-shoota)

[#15990]: https://github.com/crystal-lang/crystal/pull/15990
[#16106]: https://github.com/crystal-lang/crystal/pull/16106
[#16117]: https://github.com/crystal-lang/crystal/pull/16117
[#16165]: https://github.com/crystal-lang/crystal/pull/16165
[#16146]: https://github.com/crystal-lang/crystal/pull/16146
[#14716]: https://github.com/crystal-lang/crystal/pull/14716

#### compiler

- Use `<<-CRYSTAL` in compiler specs consistently ([#16083], thanks @HertzDevil)
- Style the remaining multi-line compiler specs using heredocs ([#16125], thanks @HertzDevil)
- _(codegen)_ Style multi-line codegen specs using heredocs ([#16081], thanks @HertzDevil)
- _(codegen)_ Style `test_c` codegen specs using heredocs ([#16082], thanks @HertzDevil)
- _(semantic)_ Style multi-line `assert_type` specs using heredocs ([#16088], thanks @HertzDevil)
- _(semantic)_ Style multi-line `assert_error` specs using heredocs ([#16093], thanks @HertzDevil)
- _(semantic)_ Move `crystal_path_spec` fixtures to `spec/compiler/data` ([#16086], thanks @straight-shoota)

[#16083]: https://github.com/crystal-lang/crystal/pull/16083
[#16125]: https://github.com/crystal-lang/crystal/pull/16125
[#16081]: https://github.com/crystal-lang/crystal/pull/16081
[#16082]: https://github.com/crystal-lang/crystal/pull/16082
[#16088]: https://github.com/crystal-lang/crystal/pull/16088
[#16093]: https://github.com/crystal-lang/crystal/pull/16093
[#16086]: https://github.com/crystal-lang/crystal/pull/16086

#### tools

- _(formatter)_ Add specs for `x.[](y)` syntax ([#16109], thanks @straight-shoota)

[#16109]: https://github.com/crystal-lang/crystal/pull/16109

### Infrastructure

- Changelog for 1.18.0 ([#16153], thanks @straight-shoota)
- Update previous Crystal release 1.17.0 ([#15988], thanks @straight-shoota)
- Support debug builds for the MSVC Boehm GC libraries ([#15968], thanks @HertzDevil)
- Fix funding.json well-known file name ([#16000], thanks @matiasgarciaisaia)
- Lint the Bash auto-completion script ([#15993], thanks @HertzDevil)
- Merge `release/1.17`@`1.17.1` into `master` ([#16017], thanks @straight-shoota)
- Update previous Crystal release 1.17.1 ([#16016], thanks @straight-shoota)
- Add new types to GitHub issue templates ([#15811], thanks @straight-shoota)
- Disable ameba rule `Lint/Formatting` ([#16015], thanks @straight-shoota)
- Add `REUSE.toml` ([#15992], thanks @straight-shoota)
- Default to LLVM 16 in `shell.nix` ([#16023], thanks @ysbaddaden)
- Avoid updating `forward-compatibility.yml` on release update for patch releases ([#16019], thanks @straight-shoota)
- Disable `Lint/LiteralsComparison` in more spec files ([#16087], thanks @straight-shoota)
- Fix typo in Makefile comment ([#16126], thanks @kojix2)
- Fix duplicate `--error-trace` option in man page ([#16133], thanks @kojix2)
- Makefile: Skip grisu3 float printer deprecations in `std_spec` ([#16185], thanks @ysbaddaden)
- Fix changelog format for Markdown linter ([#16188], thanks @straight-shoota)
- _(ci)_ Add `fail-fast: false` for strategy CI jobs ([#15960], thanks @straight-shoota)
- _(ci)_ Add tests for latest OpenSSL and LibreSSL in Alpine edge ([#15812], thanks @straight-shoota)
- _(ci)_ Use MSYS2 Crystal package for ARM64 Windows CI ([#15991], thanks @HertzDevil)
- _(ci)_ Add macos-15 runner ([#15982], thanks @straight-shoota)
- _(ci)_ Update GH Actions ([#16067], thanks @renovate)
- _(ci)_ Update GH Actions ([#16084], thanks @renovate)
- _(ci)_ Update crate-ci/typos action to v1.35.5 ([#16102], thanks @renovate)
- _(ci)_ Update GH Actions ([#16131], thanks @renovate)
- _(ci)_ Update deprecated `macos-13` to `macos-15-intel` ([#16197], thanks @straight-shoota)
- _(ci)_ Trigger LLVM CI when codegen files are changed ([#16116], thanks @HertzDevil)
- _(ci)_ Do not use D drive on MSVC CI ([#15986], thanks @HertzDevil)

[#16153]: https://github.com/crystal-lang/crystal/pull/16153
[#15988]: https://github.com/crystal-lang/crystal/pull/15988
[#15968]: https://github.com/crystal-lang/crystal/pull/15968
[#16000]: https://github.com/crystal-lang/crystal/pull/16000
[#15993]: https://github.com/crystal-lang/crystal/pull/15993
[#16017]: https://github.com/crystal-lang/crystal/pull/16017
[#16016]: https://github.com/crystal-lang/crystal/pull/16016
[#15811]: https://github.com/crystal-lang/crystal/pull/15811
[#16015]: https://github.com/crystal-lang/crystal/pull/16015
[#15992]: https://github.com/crystal-lang/crystal/pull/15992
[#16023]: https://github.com/crystal-lang/crystal/pull/16023
[#16019]: https://github.com/crystal-lang/crystal/pull/16019
[#16087]: https://github.com/crystal-lang/crystal/pull/16087
[#16126]: https://github.com/crystal-lang/crystal/pull/16126
[#16133]: https://github.com/crystal-lang/crystal/pull/16133
[#16185]: https://github.com/crystal-lang/crystal/pull/16185
[#16188]: https://github.com/crystal-lang/crystal/pull/16188
[#15960]: https://github.com/crystal-lang/crystal/pull/15960
[#15812]: https://github.com/crystal-lang/crystal/pull/15812
[#15991]: https://github.com/crystal-lang/crystal/pull/15991
[#15982]: https://github.com/crystal-lang/crystal/pull/15982
[#16067]: https://github.com/crystal-lang/crystal/pull/16067
[#16084]: https://github.com/crystal-lang/crystal/pull/16084
[#16102]: https://github.com/crystal-lang/crystal/pull/16102
[#16131]: https://github.com/crystal-lang/crystal/pull/16131
[#16197]: https://github.com/crystal-lang/crystal/pull/16197
[#16116]: https://github.com/crystal-lang/crystal/pull/16116
[#15986]: https://github.com/crystal-lang/crystal/pull/15986
