|
| 1 | +Ddoc |
| 2 | + |
| 3 | +$(CHANGELOG_NAV_INJECT) |
| 4 | + |
| 5 | +$(VERSION Apr 01, 2023, =================================================, |
| 6 | + |
| 7 | +$(CHANGELOG_HEADER_STATISTICS |
| 8 | +$(VER) comes with 9 major changes and 66 fixed Bugzilla issues. |
| 9 | + A huge thanks goes to the |
| 10 | + $(LINK2 #contributors, 43 contributors) |
| 11 | + who made $(VER) possible.) |
| 12 | + |
| 13 | +$(BUGSTITLE_TEXT_HEADER Compiler changes, |
| 14 | + |
| 15 | +$(LI $(RELATIVE_LINK2 dmd.check,Add __check(assign-expression) to ImportC)) |
| 16 | +$(LI $(RELATIVE_LINK2 dmd.deprecate-alias-this-for-classes,Alias this for classes is deprecated)) |
| 17 | +$(LI $(RELATIVE_LINK2 dmd.dip25-default,`-preview=dip25` has been enabled by default)) |
| 18 | +$(LI $(RELATIVE_LINK2 dmd.extern-dllimport,export int a; now generates dllexport instead of dllimport)) |
| 19 | +$(LI $(RELATIVE_LINK2 dmd.get-is-virtual-function,Deprecate `traits(isVirtualFunction)` and `traits(getVirtualFunctions)`)) |
| 20 | + |
| 21 | +) |
| 22 | + |
| 23 | +$(BUGSTITLE_TEXT_HEADER Library changes, |
| 24 | + |
| 25 | +$(LI $(RELATIVE_LINK2 grapheme_walker_update,Unicode grapheme walking updated to conform to Unicode version 15)) |
| 26 | +$(LI $(RELATIVE_LINK2 joiner_assert_message,Better static assert messages for `std.algorithm.iteration.joiner`)) |
| 27 | +$(LI $(RELATIVE_LINK2 sort_assert_messaged,Better static assert messages for `std.algorithm.sorting.sort`)) |
| 28 | + |
| 29 | +) |
| 30 | + |
| 31 | +$(BUGSTITLE_TEXT_HEADER Dub changes, |
| 32 | + |
| 33 | +$(LI $(RELATIVE_LINK2 colors,The `--color` argument now accepts values `auto`, `never`, `always`)) |
| 34 | + |
| 35 | +) |
| 36 | + |
| 37 | +$(CHANGELOG_SEP_HEADER_TEXT_NONEMPTY) |
| 38 | + |
| 39 | +$(CHANGELOG_SEP_HEADER_TEXT) |
| 40 | + |
| 41 | +$(BUGSTITLE_TEXT_BODY Compiler changes, |
| 42 | + |
| 43 | +$(LI $(LNAME2 dmd.check,Add __check(assign-expression) to ImportC) |
| 44 | +$(CHANGELOG_SOURCE_FILE dmd, changelog/dmd.check.dd) |
| 45 | +$(P |
| 46 | +C code normally relies on `#include <assert.h>` to add support for assert's. D has them builtin to the |
| 47 | +language, which is much more convenient and does not rely on a preprocessor. This extension adds |
| 48 | +) |
| 49 | + |
| 50 | +--- |
| 51 | +__check(assign-expression) |
| 52 | +--- |
| 53 | + |
| 54 | +$(P |
| 55 | +as an expression to ImportC. The compiler switch -checkaction=C gives it the same behavior |
| 56 | +as C's assert macro. If the compiler switch -release is thrown, the `__check`'s are ignored. |
| 57 | +The `__check` expressions are handy for writing C programs that are free of reliance on `#include`. |
| 58 | +) |
| 59 | + |
| 60 | +$(P |
| 61 | +`__assert` is not used due to conflicts with some C .h files. |
| 62 | +) |
| 63 | +) |
| 64 | + |
| 65 | +$(LI $(LNAME2 dmd.deprecate-alias-this-for-classes,Alias this for classes is deprecated) |
| 66 | +$(CHANGELOG_SOURCE_FILE dmd, changelog/dmd.deprecate-alias-this-for-classes.dd) |
| 67 | +$(P |
| 68 | +Using `alias this` for classes has not been clearly specified and the lookup rules in such circumstances are not defined. As a consequence, various failures or crashes may appear when `alias this` is used in conjunction with classes. Starting with this release, `alias this` for classes is being deprecated. As an alternative, getter/setter methods may be used to replace the `alias this`. This can be generically handled by: |
| 69 | +) |
| 70 | + |
| 71 | +```d |
| 72 | +static foreach(member, __traits(allMembers, LeClass)) |
| 73 | + mixin("ref auto " ~ member() { return $field_name." ~ member ~ "; }"); |
| 74 | +``` |
| 75 | +) |
| 76 | + |
| 77 | +$(LI $(LNAME2 dmd.dip25-default,`-preview=dip25` has been enabled by default) |
| 78 | +$(CHANGELOG_SOURCE_FILE dmd, changelog/dmd.dip25-default.dd) |
| 79 | +$(P |
| 80 | +Deprecation warnings for [DIP25](http://dlang.org/dips/25) violations have been enabled since 2.092. |
| 81 | +Starting with this release, it will report errors, unless the `-revert=dip25` switch is used. |
| 82 | +Using the switch (or its short version `-dip25`) is now deprecated. |
| 83 | +) |
| 84 | + |
| 85 | +--- |
| 86 | +ref int escapeRef(ref int x) {return x;} |
| 87 | + |
| 88 | +// Formerly: |
| 89 | +// Deprecation: returning `x` escapes a reference to parameter `x` |
| 90 | +// perhaps annotate the parameter with `return` |
| 91 | +// |
| 92 | +// Now it is an error, unless `-revert=dip25` is used |
| 93 | +--- |
| 94 | +) |
| 95 | + |
| 96 | +$(LI $(LNAME2 dmd.extern-dllimport,export int a; now generates dllexport instead of dllimport) |
| 97 | +$(CHANGELOG_SOURCE_FILE dmd, changelog/dmd.extern-dllimport.dd) |
| 98 | +$(P |
| 99 | +In order to make it dllimport, use: |
| 100 | +) |
| 101 | + |
| 102 | +--- |
| 103 | +export extern int a; |
| 104 | +--- |
| 105 | +) |
| 106 | + |
| 107 | +$(LI $(LNAME2 dmd.get-is-virtual-function,Deprecate `traits(isVirtualFunction)` and `traits(getVirtualFunctions)`) |
| 108 | +$(CHANGELOG_SOURCE_FILE dmd, changelog/dmd.get-is-virtual-function.dd) |
| 109 | +$(P |
| 110 | +Up until this release, D had both `traits(isVirtualFunction)` and `traits(isVirtualMethod)` |
| 111 | +(and their coressponding `traits(get...)` counterpart). The differenrcte between the two is |
| 112 | +that `isVirtualFunction` returns true for `final` methods that do not override anything. This |
| 113 | +is in contradiction with the D spec which states that `final` functions that do not override |
| 114 | +other functions cannot be virtual. `isVirtualMethod` correctly returns `false` in that case. |
| 115 | +) |
| 116 | + |
| 117 | +$(P |
| 118 | +Starting with this release, both `traits(isVirtualFunction)` and `traits(getVirtualFunctions)` |
| 119 | +are deprecated. If the behavior of `traits(isVirtualFunction)` is desired, it can be achieved by |
| 120 | +`traits(isVirtualMethod, f) || (traits(isFinalFunction, f) && !traits(isOverrideFunction, f))`. |
| 121 | +) |
| 122 | +) |
| 123 | + |
| 124 | + |
| 125 | +) |
| 126 | + |
| 127 | +$(BUGSTITLE_TEXT_BODY Library changes, |
| 128 | + |
| 129 | +$(LI $(LNAME2 grapheme_walker_update,Unicode grapheme walking updated to conform to Unicode version 15) |
| 130 | +$(CHANGELOG_SOURCE_FILE phobos, changelog/grapheme_walker_update.dd) |
| 131 | +$(P |
| 132 | +Up until now `graphemeStride`, `byGrapheme` and `decodeGrapheme` functions in |
| 133 | +`std.uni` have used obsolete rules from earlier Unicode standards. |
| 134 | +) |
| 135 | + |
| 136 | +$(P |
| 137 | +This release brings grapheme breaking rules up to date with Unicode version 15. |
| 138 | +This means Phobos functions now recognise extended pictogram sequences and |
| 139 | +prepend characters. |
| 140 | +) |
| 141 | +) |
| 142 | + |
| 143 | +$(LI $(LNAME2 joiner_assert_message,Better static assert messages for `std.algorithm.iteration.joiner`) |
| 144 | +$(CHANGELOG_SOURCE_FILE phobos, changelog/joiner_assert_message.dd) |
| 145 | +$(P |
| 146 | +Up until now `filter` used a template constraint to check if the passed Data |
| 147 | +could be used. If it were not, it was very tedious to figure out why. |
| 148 | +) |
| 149 | + |
| 150 | +$(P |
| 151 | +As the template constraint is not used to overload the symbol template |
| 152 | +function, the constrains are move into static asserts with expressive error |
| 153 | +messages. |
| 154 | +) |
| 155 | +) |
| 156 | + |
| 157 | +$(LI $(LNAME2 sort_assert_messaged,Better static assert messages for `std.algorithm.sorting.sort`) |
| 158 | +$(CHANGELOG_SOURCE_FILE phobos, changelog/sort_assert_messaged.dd) |
| 159 | +$(P |
| 160 | +Up until now `sort` used a template constraint to check if the passed Range |
| 161 | +could be used. If it were not, it was very tedious to figure out why. |
| 162 | +) |
| 163 | + |
| 164 | +$(P |
| 165 | +As the template constraint is not used to overload the symbol template |
| 166 | +function, the constrains are move into static asserts with expressive error |
| 167 | +messages. |
| 168 | +) |
| 169 | +) |
| 170 | + |
| 171 | + |
| 172 | +) |
| 173 | + |
| 174 | +$(BUGSTITLE_TEXT_BODY Dub changes, |
| 175 | + |
| 176 | +$(LI $(LNAME2 colors,The `--color` argument now accepts values `auto`, `never`, `always`) |
| 177 | +$(CHANGELOG_SOURCE_FILE dub, changelog/colors.dd) |
| 178 | +$(P |
| 179 | +The previous `automatic`, `on`, `off` values are still supported, but |
| 180 | +undocumented, because they are used in almost no other program like this. For |
| 181 | +consistency, with other Linux tools especially, we have implemented and switched |
| 182 | +the defaults to the widely-used `auto`, `never`, `always` values. |
| 183 | +) |
| 184 | +) |
| 185 | + |
| 186 | + |
| 187 | +) |
| 188 | + |
| 189 | +$(CHANGELOG_SEP_TEXT_BUGZILLA) |
| 190 | + |
| 191 | +$(BUGSTITLE_BUGZILLA DMD Compiler regression fixes, |
| 192 | + |
| 193 | +$(LI $(BUGZILLA 15985): [REG2.068/2.069] Code doesn't link unless compiled with -debug) |
| 194 | +$(LI $(BUGZILLA 18472): [Reg 2.078] betterC: cannot use format at compile time.) |
| 195 | +$(LI $(BUGZILLA 21772): [REG2.069] Consecutive different-signed double.nans in an array literal take the sign of the previous nan $(LPAREN)same for float and real$(RPAREN)) |
| 196 | +$(LI $(BUGZILLA 23688): FTBFS: error: cannot convert 'Expression' to 'Expression*') |
| 197 | +$(LI $(BUGZILLA 23710): [REG master] Reachable code inside an 'if $(LPAREN)false$(RPAREN)' block no longer gets codegen) |
| 198 | +) |
| 199 | +$(BUGSTITLE_BUGZILLA DMD Compiler bug fixes, |
| 200 | + |
| 201 | +$(LI $(BUGZILLA 11051): Unmatched case in a final switch should throw in both release and non-release mode) |
| 202 | +$(LI $(BUGZILLA 16098): align$(LPAREN)N$(RPAREN) not respected for stack variables if N > platform stack alignment) |
| 203 | +$(LI $(BUGZILLA 20781): Can call @live function without checking dip1021 rules) |
| 204 | +$(LI $(BUGZILLA 21492): betterC: TypeInfo is generated for code guarded by if$(LPAREN)__ctfe$(RPAREN)) |
| 205 | +$(LI $(BUGZILLA 21821): Optimizer assumes immutables do not change, but they can in @system code) |
| 206 | +$(LI $(BUGZILLA 22916): [dip1000] copy of ref return still treated as scope variable) |
| 207 | +$(LI $(BUGZILLA 23145): Stack allocation of scope new variables defeats @safe) |
| 208 | +$(LI $(BUGZILLA 23195): Win64 function ABI bug for small non-POD arguments) |
| 209 | +$(LI $(BUGZILLA 23261): druntime core.std.attribute.Tagged1_2 constructor is unsafe) |
| 210 | +$(LI $(BUGZILLA 23387): ImportC: identical structs defined in two C files lead to duplicate .init symbol on macOS) |
| 211 | +$(LI $(BUGZILLA 23407): ImportC: function-local struct definition as part of variable declaration doesn’t shadow global definition) |
| 212 | +$(LI $(BUGZILLA 23545): export int a; should generate dllexport, not dllimport) |
| 213 | +$(LI $(BUGZILLA 23583): ImportC: undefined identifier __builtin___memmove_chk) |
| 214 | +$(LI $(BUGZILLA 23584): ImportC: __builtin_bit_cast not supported) |
| 215 | +$(LI $(BUGZILLA 23598): Circular reference bug with static if and eponymous templates) |
| 216 | +$(LI $(BUGZILLA 23606): betterC with CTFE and gc) |
| 217 | +$(LI $(BUGZILLA 23616): ImportC: clang __has_feature and __has_extension not recognized) |
| 218 | +$(LI $(BUGZILLA 23617): traits$(LPAREN)child$(RPAREN) compile error need this for something that doesn't need this) |
| 219 | +$(LI $(BUGZILLA 23622): ImportC #defines conflict with declarations) |
| 220 | +$(LI $(BUGZILLA 23635): Nonsensical "`case` must be a `string` or an integral constant, not `x`") |
| 221 | +$(LI $(BUGZILLA 23639): Casting to shared not allowed with -preview=nosharedaccess) |
| 222 | +$(LI $(BUGZILLA 23650): Using typeid with struct defined in in __traits$(LPAREN)compiles, ...$(RPAREN) causes linker error) |
| 223 | +$(LI $(BUGZILLA 23651): Order dependency in semantic analysis of template members) |
| 224 | +$(LI $(BUGZILLA 23658): .di generation of variables should turn them into declarations) |
| 225 | +$(LI $(BUGZILLA 23669): [DIP1000] Compound assignment to length of slice member variable in scope method fails) |
| 226 | +$(LI $(BUGZILLA 23676): Static foreach hangs compilation for some time) |
| 227 | +$(LI $(BUGZILLA 23682): dip1000 problem with return by ref) |
| 228 | +$(LI $(BUGZILLA 23694): compilable/ctests2.c:51:9: error: initializer element is not constant) |
| 229 | +$(LI $(BUGZILLA 23711): compilable/testcstuff1.c:63:1: error: invalid use of restrict) |
| 230 | +$(LI $(BUGZILLA 23717): runnable/bitfields.c:192:5: error: unknown type name S; use struct keyword to refer to the type) |
| 231 | +) |
| 232 | +$(BUGSTITLE_BUGZILLA DMD Compiler enhancements, |
| 233 | + |
| 234 | +$(LI $(BUGZILLA 11316): Some cases of missing delegate argument type inference) |
| 235 | +$(LI $(BUGZILLA 13656): clarify error message upon trying to declare a variable of type ref) |
| 236 | +$(LI $(BUGZILLA 16495): __traits$(LPAREN)fullyQualifedName$(RPAREN) instead of std.traits.fullyQualifiedName) |
| 237 | +$(LI $(BUGZILLA 20101): BetterC: Template instantiation in CTFE only context should skip codegen / nogc / ... Phases) |
| 238 | +$(LI $(BUGZILLA 23558): add __traits$(LPAREN)getModuleClasses [, module name]$(RPAREN)) |
| 239 | +$(LI $(BUGZILLA 23597): .di files not compatible with -i) |
| 240 | +) |
| 241 | +$(BUGSTITLE_BUGZILLA Phobos bug fixes, |
| 242 | + |
| 243 | +$(LI $(BUGZILLA 23474): Grapheme should end after carriage return if not followed by line feed.) |
| 244 | +$(LI $(BUGZILLA 23600): [std.format.read] formattedRead static asserts with Tuple and compile time format string) |
| 245 | +$(LI $(BUGZILLA 23668): Can't stable sort structs with disabled default constructor.) |
| 246 | +$(LI $(BUGZILLA 23724): HTTP.onReceive example does not compile) |
| 247 | +) |
| 248 | +$(BUGSTITLE_BUGZILLA Phobos enhancements, |
| 249 | + |
| 250 | +$(LI $(BUGZILLA 19567): [std.stdio] Not really helpful documentation of `tell`) |
| 251 | +$(LI $(BUGZILLA 20397): [std.algorithm] documentation nthPermutation) |
| 252 | +$(LI $(BUGZILLA 23683): std.file.setTimes requests more permissions than needed) |
| 253 | +$(LI $(BUGZILLA 23706): Do not escape POSIX shell parameters unless necessary) |
| 254 | +) |
| 255 | +$(BUGSTITLE_BUGZILLA Druntime bug fixes, |
| 256 | + |
| 257 | +$(LI $(BUGZILLA 19575): core.cpuid not usable without a runtime) |
| 258 | +$(LI $(BUGZILLA 23625): Function ZeroMemory missing in windows headers) |
| 259 | +) |
| 260 | +$(BUGSTITLE_BUGZILLA dlang.org bug fixes, |
| 261 | + |
| 262 | +$(LI $(BUGZILLA 6583): cast$(LPAREN)$(RPAREN) operation not fully specified) |
| 263 | +$(LI $(BUGZILLA 11493): dlang.org/type.html incorrectly says that you can't cast from -1 to unsigned types) |
| 264 | +$(LI $(BUGZILLA 16707): [Templates] run variadic templates example failed) |
| 265 | +$(LI $(BUGZILLA 21132): Ff two keys in an associative array literal are equal) |
| 266 | +$(LI $(BUGZILLA 21178): It is not explained what is "unknown") |
| 267 | +$(LI $(BUGZILLA 23716): ImportC: Missing documentation on the asm keyword accepted as an extension) |
| 268 | +) |
| 269 | +$(BUGSTITLE_BUGZILLA dlang.org enhancements, |
| 270 | + |
| 271 | +$(LI $(BUGZILLA 18765): [Arrays] Docs need info on initialization of static array with element literal) |
| 272 | +$(LI $(BUGZILLA 20997): Missing example of scope guard executing after return statement) |
| 273 | +$(LI $(BUGZILLA 22418): Error in documentation on strings) |
| 274 | +$(LI $(BUGZILLA 22594): Update "Interfacing to C" to include intptr_t and uintptr_t) |
| 275 | +$(LI $(BUGZILLA 23612): Template constraints article not listed in article index) |
| 276 | +$(LI $(BUGZILLA 23636): No spec docs for shared qualifer) |
| 277 | +$(LI $(BUGZILLA 23730): Clarify IsExpression `Identifier :` and `== TypeCtor` spec) |
| 278 | +) |
| 279 | +$(BUGSTITLE_BUGZILLA Tools bug fixes, |
| 280 | + |
| 281 | +$(LI $(BUGZILLA 23624): Race condition in test runner for DMD) |
| 282 | +$(LI $(BUGZILLA 23634): Possible data race with runnable example tester) |
| 283 | +) |
| 284 | +) |
| 285 | +$(D_CONTRIBUTORS_HEADER 43) |
| 286 | +$(D_CONTRIBUTORS |
| 287 | + $(D_CONTRIBUTOR Amaury) |
| 288 | + $(D_CONTRIBUTOR Andra Maslaev) |
| 289 | + $(D_CONTRIBUTOR Andrea Fontana) |
| 290 | + $(D_CONTRIBUTOR Ate Eskola) |
| 291 | + $(D_CONTRIBUTOR Ben Jones) |
| 292 | + $(D_CONTRIBUTOR BVRazvan) |
| 293 | + $(D_CONTRIBUTOR Daniel Zuncke) |
| 294 | + $(D_CONTRIBUTOR DanutAldea) |
| 295 | + $(D_CONTRIBUTOR Dennis) |
| 296 | + $(D_CONTRIBUTOR Dennis Korpel) |
| 297 | + $(D_CONTRIBUTOR Drehuta Andreea) |
| 298 | + $(D_CONTRIBUTOR Dumitrache Adrian-George) |
| 299 | + $(D_CONTRIBUTOR Hiroki Noda) |
| 300 | + $(D_CONTRIBUTOR Iain Buclaw) |
| 301 | + $(D_CONTRIBUTOR Ikey Doherty) |
| 302 | + $(D_CONTRIBUTOR ioanavivi12) |
| 303 | + $(D_CONTRIBUTOR Jan Jurzitza) |
| 304 | + $(D_CONTRIBUTOR Johan Engelen) |
| 305 | + $(D_CONTRIBUTOR João Lourenço) |
| 306 | + $(D_CONTRIBUTOR KytoDragon) |
| 307 | + $(D_CONTRIBUTOR Luís Ferreira) |
| 308 | + $(D_CONTRIBUTOR Mateiuss) |
| 309 | + $(D_CONTRIBUTOR MathewColin) |
| 310 | + $(D_CONTRIBUTOR Mathias Lang) |
| 311 | + $(D_CONTRIBUTOR matthriscu) |
| 312 | + $(D_CONTRIBUTOR Mike Parker) |
| 313 | + $(D_CONTRIBUTOR Nathan Sashihara) |
| 314 | + $(D_CONTRIBUTOR Nick Treleaven) |
| 315 | + $(D_CONTRIBUTOR Paul Backus) |
| 316 | + $(D_CONTRIBUTOR Quirin F. Schroll) |
| 317 | + $(D_CONTRIBUTOR Rareș Constantin) |
| 318 | + $(D_CONTRIBUTOR Razvan Mihai Popa) |
| 319 | + $(D_CONTRIBUTOR Razvan Nitu) |
| 320 | + $(D_CONTRIBUTOR richard (rikki) andrew cattermole) |
| 321 | + $(D_CONTRIBUTOR Robert burner Schadek) |
| 322 | + $(D_CONTRIBUTOR Robert Grancsa) |
| 323 | + $(D_CONTRIBUTOR Robert Stoica) |
| 324 | + $(D_CONTRIBUTOR Rosca Rares) |
| 325 | + $(D_CONTRIBUTOR Steven Schveighoffer) |
| 326 | + $(D_CONTRIBUTOR Teodor Dutu) |
| 327 | + $(D_CONTRIBUTOR Tudor Brindus) |
| 328 | + $(D_CONTRIBUTOR Vladimir Panteleev) |
| 329 | + $(D_CONTRIBUTOR Walter Bright) |
| 330 | +) |
| 331 | +$(D_CONTRIBUTORS_FOOTER) |
| 332 | +$(CHANGELOG_NAV_INJECT) |
| 333 | + |
| 334 | +Macros: |
| 335 | + VER=2.103.0 |
| 336 | + TITLE=Change Log: $(VER) |
0 commit comments