Change Log: 2.100.0
Download D 2.100.0
released May 10, 2022
Compiler changes
- End deprecation period for using alias this for partial assignment.
- The deprecation period for D1-style operators has ended.
- scope as a type constraint on class, struct, and enum declarations is deprecated.
- The deprecation period of unannotated asm blocks has been ended.
- The deprecation period of the delete keyword has been ended.
- Improvements for the C++ header generation
- The deprecation period for scope as a type constraint on interface declarations has ended.
- The inout attribute no longer implies the return attribute
- Support contract invariant version identifier.
- Implement DIP 1038: @mustuse
- Added .tupleof property for static arrays
- Usage of this and super as types has been removed
- A missed case of switch case fallthrough has been deprecated
Library changes
Dub changes
- Builds dynamicLibrary targets as dynamic libraries instead of static libraries.
- The $DUB_BUILD_PATH variable was added
- Command environment variable substitution changed
- Posix: use /etc/dub/settings.json if DUB is installed in /usr
- Adds injection of source files from dependencies via injectSourceFiles command
List of all bug fixes and enhancements in D 2.100.0.
Compiler changes
- End deprecation period for using alias this for partial assignment.
Starting with this release, alias this may not be used for the partial assignment of a left-hand side operand. Any such assignment will result in a compiler error.
If a struct has a single member which is aliased this directly or aliased to a ref getter function that returns the mentioned member, then alias this may be used since the object will be fully initialised.
struct Allowed { int onemember; alias onemember this; } struct Rejected { int aliased; long other; alias aliased this; } void fun(Allowed a, Rejected r) { a = 0; // OK, struct has only one member. r = 0; // Error, cannot use `alias this` to partially initialize variable `r` of type `Rejected`. Use `r.aliased` }
- The deprecation period for D1-style operators has ended.
Starting with this release, any use of the deprecated D1 overload operators will result in a compiler error.
The corrective action is to replace all operators with their D2 equivalent.
The following D1 operator overloads have been removed in favor of opUnary:
- opNeg must be replaced with opUnary(string op)() if (op == "-")
- opCom must be replaced with opUnary(string op)() if (op == "~")
- opPostIncmust be replaced with opUnary(string op)() if (op == "++")
- opPostDecmust be replaced with opUnary(string op)() if (op == "--")
- opStarmust be replaced with opUnary(string op)() if (op == "*")
The following D1 operator overloads have been removed in favor of opBinary:
- opAdd must be replaced with opBinary(string op)(...) if (op == "+")
- opSub must be replaced with opBinary(string op)(...) if (op == "-")
- opMul must be replaced with opBinary(string op)(...) if (op == "*")
- opDiv must be replaced with opBinary(string op)(...) if (op == "/")
- opMod must be replaced with opBinary(string op)(...) if (op == "%")
- opAnd must be replaced with opBinary(string op)(...) if (op == "&")
- opXor must be replaced with opBinary(string op)(...) if (op == "^")
- opOr must be replaced with opBinary(string op)(...) if (op == "|")
- opShl must be replaced with opBinary(string op)(...) if (op == "<<")
- opShr must be replaced with opBinary(string op)(...) if (op == ">>")
- opUShr must be replaced with opBinary(string op)(...) if (op == ">>>")
- opCat must be replaced with opBinary(string op)(...) if (op == "~")
- opIn must be replaced with opBinary(string op)(...) if (op == "in")
The following D1 operator overloads have been removed in favor of opBinaryRight:
- opAdd_r must be replaced with opBinaryRight(string op)(...) if (op == "+")
- opSub_r must be replaced with opBinaryRight(string op)(...) if (op == "-")
- opMul_r must be replaced with opBinaryRight(string op)(...) if (op == "*")
- opDiv_r must be replaced with opBinaryRight(string op)(...) if (op == "/")
- opMod_r must be replaced with opBinaryRight(string op)(...) if (op == "%")
- opAnd_r must be replaced with opBinaryRight(string op)(...) if (op == "&")
- opXor_r must be replaced with opBinaryRight(string op)(...) if (op == "^")
- opOr_r must be replaced with opBinaryRight(string op)(...) if (op == "|")
- opShl_r must be replaced with opBinaryRight(string op)(...) if (op == "<<")
- opShr_r must be replaced with opBinaryRight(string op)(...) if (op == ">>")
- opUShr_r must be replaced with opBinaryRight(string op)(...) if (op == ">>>")
- opCat_r must be replaced with opBinaryRight(string op)(...) if (op == "~")
- opIn_r must be replaced with opBinaryRight(string op)(...) if (op == "in")
Note: The opBinaryRight overload operator takes precedence over any opBinary operators.
The following D1 operator overloads have been removed in favor of opOpAssign:
- opAddAssign must be replaced with opOpAssign(string op)(...) if (op == "+")
- opSubAssign must be replaced with opOpAssign(string op)(...) if (op == "-")
- opMulAssign must be replaced with opOpAssign(string op)(...) if (op == "*")
- opDivAssign must be replaced with opOpAssign(string op)(...) if (op == "/")
- opModAssign must be replaced with opOpAssign(string op)(...) if (op == "%")
- opAndAssign must be replaced with opOpAssign(string op)(...) if (op == "&")
- opOrAssign must be replaced with opOpAssign(string op)(...) if (op == "|")
- opXorAssign must be replaced with opOpAssign(string op)(...) if (op == "^")
- opShlAssign must be replaced with opOpAssign(string op)(...) if (op == "<<")
- opShrAssign must be replaced with opOpAssign(string op)(...) if (op == ">>")
- opUShrAssign must be replaced with opOpAssign(string op)(...) if (op == ">>>")
- opCatAssign must be replaced with opOpAssign(string op)(...) if (op == "~")
The following D1 operator overloads have been removed in favor of alias this:
- opDot must be replaced with alias this
- scope as a type constraint on class, struct, and enum declarations is deprecated.
scope as a type constraint on class declarations was meant to force users of a class to scope allocate it, which resulted in the class being placed on the stack rather than GC-allocated. While it has been scheduled for deprecation for quite some time, the compiler will emit a deprecation warning on usage starting from this release.
scope as a type constraint on struct or enum declarations has never had any effect, and has been deprecated as well.
scope class C { } // Deprecation: `scope` as a type constraint is deprecated. Use `scope` at the usage site. scope struct S { } // Ditto scope enum E { } // Ditto
Using scope to stack-allocate class is still suported, only the type constraint is deprecated.
class C { } void main () @nogc { scope c = new C; }
- The deprecation period of unannotated asm blocks has been ended.
See the Deprecated Features for more information.
Starting with this release, using asm blocks will assume to be @system, @nogc, impure and might throw, unless explicitly annotated.
- The deprecation period of the delete keyword has been ended.
See the Deprecated Features for more information.
Starting with this release, using the delete keyword will result in a compiler error.
As a replacement, users are encouraged to use destroy if feasible, or core.memory.__delete as a last resort.
- Improvements for the C++ header generation
The following features/bugfixes/improvements were implemented for the experimental C++ header generator:
- The implicitly generated context pointer for nested aggregates is now emitted as outer instead of this
- Explicit mangling via pragma(mangle, "...") is partially supported for functions / variables. The mangling is used as the identifier of extern(C) declarations because C doesn't mangle declaration names. extern(C++) declarations are ignored because there's no portable alternative for C++.
- Emits destructors not easily accessible from C++ (e.g. extern(D)) as private members, preventing the creation of instances that would not be destroyed on the C++ side.
- No longer generates extern(C) functions in aggregates that are emitted with D mangling.
Note: The header generator is still considered experimental, so please submit any bugs encountered to the bug tracker.
- The deprecation period for scope as a type constraint on interface declarations has ended.
Starting with this release, using scope as a type constraint on interface declarations will result in a compiler error.
scope interface I { } // Error: `scope` as a type constraint is obsolete. Use `scope` at the usage site.
- The inout attribute no longer implies the return attribute
The compiler would formerly add the return attribute to inout functions, under the assumption that every inout function would return its argument. However, it could also return a member of the inout argument, which would still be inout because const and immutable are transitive, while return semantics are not transitive.
@safe: struct Node { Node* next; int x; // This escapes a pointer to this struct // This used to be allowed because of `inout` @safe inout(int)* getScopePointer() inout { return &this.x; } // But what if you do not return a pointer to this struct? // `inout` applies because it's transitive, but `return ref` does not // The compiler could needlessly treat the returned pointer as a scope pointer @safe inout(int)* getNonScopePointer() inout { return &this.next.x; } // Corrective action for the first case: // if you want `inout` + `return ref`, annotate it with both @safe inout(int)* getScopePointer() inout return { return &this.x; } }
- Support contract invariant version identifier.
Sometimes it is useful to compile code only when invariants are enabled. This feature provides the reserved version identifier D_Invariants which evaluates to true or false when invariants are compiled in or not respectively.
bool hit; class Foo { this() {} invariant { hit = true; } } void main() { cast(void) new Foo(); version(D_Invariants) assert(hit); // runs if invariants are compiled in }
- Implement DIP 1038: @mustuse
@mustuse is a new attribute that can be applied to a struct or union type to make ignoring an expression of that type into a compile-time error. It can be used to implement alternative error-handling mechanisms for code that cannot use exceptions, including @nogc and BetterC code.
For more information, see DIP 1038.
- Added .tupleof property for static arrays
The .tupleof property may now be used with instances of static arrays, yielding an lvalue sequence of each element in the array.
Note that this is only for static array instances. It remains an error when used on a type, to avoid breaking older code lacking suitable checks. As a workaround, use typeof((T[N]).init.tupleof).
void foo(int, int, int) { /* ... */ } int[3] ia = [1, 2, 3]; foo(ia.tupleof); // same as `foo(1, 2, 3);` float[3] fa; //fa = ia; // error fa.tupleof = ia.tupleof; assert(fa == [1F, 2F, 3F]);
- Usage of this and super as types has been removed
Prior to this release, using this or super as a type resulted in a compiler error suggesting to use typeof(this) or typeof(super) instead. This has now been completely removed from the language, and the parser won't recognize this wrong code anymore.
- A missed case of switch case fallthrough has been deprecated
Forgetting a break; statement in a switch case has been turned from a deprecation into an error in DMD 2.099.0. However, the compiler would not issue an error when using multiple values in a single case statement:
void main() { int i = 0; switch (10) { case 10, 11: i = 4; // accidental falltrough allowed default: i = 8; } assert(i == 4); // fails }
This bug has been fixed, but to avoid breaking code, this specific case now issues a deprecation warning. Starting from DMD 2.110, it will produce an error just like other cases of switch case fallthrough.
Library changes
- New function bind in std.functional
It is used to pass the fields of a struct as arguments to a function. For example, it can be used in a range pipeline to give names to the elements of a std.typecons.Tuple:
import std.stdio; import std.range; import std.algorithm; import std.functional; void printWithLineNumbers(File f) { f.byLine .enumerate .each!(bind!((num, line) { writefln("%8d %s", num, line); })); }
See the standard library documentation for more information.
- Nullable in std.typecons can now act as a range
Nullable now offers an alternative 0 or 1 element range interface.
import std.stdio; import std.algorithm; import std.typecons; void printValues(Nullable!int[] values) { values.joiner.each!writeln(); }
- Zlib updated to 1.2.12
The bundled zlib has been updated to version 1.2.12.
Tools changes
- rdmd now supports specifying the D compiler using the RDMD_DMD environment variable
rdmd now uses the RDMD_DMD environment variable, if it is present in the environment, to choose the D compiler to use. As with the --compiler option, the variable's value must specify the name or path of a compiler with a DMD-like command line syntax, such as gdmd or ldmd2. The variable overrides the default (which is decided at the time rdmd was built), but can still be overridden by the --compiler option.
Dub changes
- Builds dynamicLibrary targets as dynamic libraries instead of static libraries.
Dub will no longer build dynamicLibrary targetType's as staticLibrary.
Except for x86_omf. This has been disabled due to numerous issues that will lead this to not doing what is expected of it.
No compiler or linker flags have been added at this time, you will need to specify the relevant flag to get the compiler to link dynamically against Phobos.
- The $DUB_BUILD_PATH variable was added
The $DUB_BUILD_PATH variable is now defined inside the postBuildCommands section. It contains the absolute path in which the package was built, and can be used to copy by-products of the build process to their intended locations.
For example, if an executable exports symbols, you will want to make the resulting import library and symbols export file available somewhere. That can be done with a dub.json section like this:
"postBuildCommands-windows": [ "copy /y $DUB_BUILD_PATH\\$DUB_TARGET_NAME.lib $PACKAGE_DIR\\lib" "copy /y $DUB_BUILD_PATH\\$DUB_TARGET_NAME.exp $PACKAGE_DIR\\lib" ],
- Command environment variable substitution changed
Now users can use the documented predefined variables inside custom command directives without the need for a wrapper shell script.
Before this would have failed:
"preBuildCommands": ["$DC -run foo.d"]
unless DC was defined as environment variable outside DUB.
It was before possible to run a script that used the $DC environment variable or on POSIX escape the $ with $$DC to make the shell substitute the variable. These workarounds are no longer needed now.
API change: none of the different command directives are no longer substituted with the process environment variables. You now access the raw commands as provided by the user in the recipe. dub describe has been adjusted and now also processes the predefined environment variables as well as the process environment variables.
- Posix: use /etc/dub/settings.json if DUB is installed in /usr
For Linux distributions that put the dub installation in /usr, there is now a special case that DUB will load from /etc/dub/settings.json (absolute path) if the installation is inside /usr.
Previously settings would have attempted to be loaded from /usr/etc/dub/settings.json if installed in /usr/bin/dub. This is still loaded if it exists, but if not /etc/dub/settings.json will be loaded.
- Adds injection of source files from dependencies via injectSourceFiles command
Each (sub)package now supports a source file that will be included in any executable or dynamic library that depends either directly or indirectly on it.
This can be used to register and unregister elements of a package within the dependant package without requiring the dependant to acknowledge that the registration mechanism needs to take place.
A comparable existing feature to this is the usage of sourceLibrary target type. A sourceLibrary targetType defers compilation of source code until it is dependent upon by a static library, dynamic library or executable (sub)package. Unlike sourceLibrary the injection of source code using this feature will inject it into every dynamic library and executable that depends on it, regardless of how deep it is in the dependency graph.
List of all bug fixes and enhancements in D 2.100.0:
DMD Compiler regression fixes
- Bugzilla 22788: [REG master] Expression header out of sync
- Bugzilla 22797: [REG master] Internal Compiler Error: cannot mixin static assert ''
- Bugzilla 22801: [REG 2.099.0-beta.1] Can't return address of return ref parameter from constructor
- Bugzilla 22810: [REG 2.088] FAIL: runnable/test15.d on BigEndian targets
- Bugzilla 22833: [REG 2.083] error: 'string' is not a member of 'std'
- Bugzilla 22844: [REG 2.089] SIGBUS, Bus error in _d_newitemU
- Bugzilla 22881: ICE Index of array outside of bounds at CTFE
- Bugzilla 22913: importC: array index expression parsed as cast
- Bugzilla 22961: importC: K&R-style main function rejected
- Bugzilla 22997: DMD crash: copy ctor can't call other ctor
- Bugzilla 22999: no switch fallthrough error with multi-valued case
- Bugzilla 23019: Missing filename when -of points to an existing directory
- Bugzilla 23036: Rvalue constructor with default parameter crashes compiler in the presence of a copy constructor
- Bugzilla 23046: [REG][CODEGEN] __simd(XMM.LODLPS) bad codegen
- Bugzilla 23087: getLinkage trait regression for overloads with v2.100.0-rc.1
- Bugzilla 23089: Linkage-related ICE regression in v2.100.0-rc.1
- Bugzilla 23097: [REG 2.100] ArrayIndexError@src/dmd/mtype.d(4767): index [18446744073709551615] is out of bounds for array of length 0
- Bugzilla 23098: array literal to scope inout parameter not allowed in safe code
DMD Compiler bug fixes
- Bugzilla 7625: inlining only works with explicit else branch
- Bugzilla 12344: .di generation doesn't include contracts in interfaces
- Bugzilla 19948: Fully qualified name not used in errors when implicit const conversion is involved
- Bugzilla 20149: [DIP1000] Local data escapes inout method if not decorated with return
- Bugzilla 20603: 'cannot use non-constant CTFE pointer in an initializer' in recursive structure with overlap
- Bugzilla 20881: [DIP1000] scope inference turns return-ref into return-scope
- Bugzilla 21008: dmd segfaults because of __traits(getMember, ...) and virtual function overriding
- Bugzilla 21324: @live not detecting overwrite of Owner without disposing of previous owned value
- Bugzilla 21546: covariant return checks for functions wrong if returning by ref
- Bugzilla 21676: [ICE][SIMD] DMD crashing with SIMD + optimizations + inlining
- Bugzilla 21975: is expression ignores implicit conversion of struct via alias this when pattern matching
- Bugzilla 22023: adding return to escaped argument of a variadic defeats @safe
- Bugzilla 22145: scope for foreach parameters is ignored
- Bugzilla 22202: Wrong error message for implicit call to @system copy constructor in @safe code
- Bugzilla 22221: [dip1000] pure function can escape parameters through Exception
- Bugzilla 22234: __traits(getLinkage) returns wrong value for extern(System) functions
- Bugzilla 22489: C header generation ignores custom mangling
- Bugzilla 22539: [dip1000] slicing of returned ref scope static array should not be allowed
- Bugzilla 22635: opCast prevent calling destructor for const this.
- Bugzilla 22751: DMD as a library crashes with fatal() on parseModule
- Bugzilla 22755: ImportC: declared symbol must be available in initializer
- Bugzilla 22756: ImportC: no __builtin_offsetof
- Bugzilla 22776: string literal printing fails on non-ASCII/non-printable chars
- Bugzilla 22782: [dip1000] address of ref can be assigned to non-scope parameter
- Bugzilla 22793: importC: __import conflicts when importing multiple modules with same package
- Bugzilla 22802: [dip1000] First ref parameter seen as return destination even with this
- Bugzilla 22806: cppmangle: Complex real mangled incorrectly
- Bugzilla 22807: ImportC: Array index is out of bounds for old-style flexible arrays.
- Bugzilla 22808: ImportC: function not decaying to pointer to function in return statement.
- Bugzilla 22809: ImportC: druntime’s definition of __builtin_offsetof leads to dereference of invalid pointer.
- Bugzilla 22812: ImportC: C11 does not allow newlines between the start and end of a directive
- Bugzilla 22818: typesafe variadic function parameter of type class should be scope
- Bugzilla 22823: dmd.root.file: File.read fails to read any file on PPC
- Bugzilla 22830: Solaris: error: module 'core.stdc.math' import 'signbit' not found
- Bugzilla 22831: No error for malformed extern(C) main function
- Bugzilla 22837: [dip1000] checkConstructorEscape quits after first non-pointer
- Bugzilla 22840: [dip1000] inout method with inferred @safe escapes local data
- Bugzilla 22841: importC: Error: variable 'var' is shadowing variable 'var'
- Bugzilla 22842: importC: cannot declare function with a typedef
- Bugzilla 22845: DWARF .debug_line section is not standard compliant
- Bugzilla 22846: [REG 2.066] SIGBUS, Bus error in _d_newarrayiT
- Bugzilla 22848: DWARF .debug_line section should be generated to conform with DW_AT_stmt_list bounds
- Bugzilla 22874: ICE: Segmentation fault building druntime on mips64el-linux
- Bugzilla 22876: importC: expression parsing affected by parentheses that should do nothing
- Bugzilla 22878: importC: glibc fallback for HUGE_VAL gives 'not representable'
- Bugzilla 22884: ImportC: function does not decay to pointer when being cast
- Bugzilla 22885: ImportC: typedef declared with itself should work
- Bugzilla 22886: ImportC: forward declaration of struct in a function prototype leads to redeclaration with different type error
- Bugzilla 22887: ImportC: typedef enum fails
- Bugzilla 22892: importC: dereferencing array as pointer is not supported
- Bugzilla 22894: importC: static struct initializer can't take address of own field
- Bugzilla 22895: importC: exponent parsed as member access
- Bugzilla 22896: importC: 'function redeclaration with different type' should ignore const
- Bugzilla 22897: importC: segfault calling forward-declared static function through pointer
- Bugzilla 22899: importC: extra parentheses in sizeof should give error with typedef types
- Bugzilla 22904: importC: syntax error for function call with casted result and parentheses around name
- Bugzilla 22906: DMD as a library hangs on semantic analysis of non regular D files
- Bugzilla 22909: importC: u8 strings rejected by parser
- Bugzilla 22910: [dip1000] return scope struct member functions allow returning this by ref
- Bugzilla 22912: importC: syntax error for function call with cast and typedef and parentheses around name
- Bugzilla 22914: outdated supplemental error "perhaps remove scope"
- Bugzilla 22915: Errors for invalid foreach aggregates should print the type
- Bugzilla 22918: importC: some types not zero-initialized in static variables
- Bugzilla 22919: [dip1000] -checkaction=context gives "assigned to __assertOp2 with longer lifetime"
- Bugzilla 22923: importC: forward-declared static variable has invalid address
- Bugzilla 22924: importC: boolean expression result should be int
- Bugzilla 22927: importC: 'struct already exists' with forward reference and function with same name
- Bugzilla 22928: importC: array does not have a boolean value
- Bugzilla 22929: importC: extern array with unknown length gives bounds errors
- Bugzilla 22930: importC: switch statement should use default:break; if no default specified
- Bugzilla 22931: importC: Error: 0 has no effect
- Bugzilla 22933: importC: goto skips declaration of variable
- Bugzilla 22934: Header generator emits context pointer as this
- Bugzilla 22935: importC: offsetof with array element gives 'dereference of invalid pointer'
- Bugzilla 22951: Dtor missing from generated C++ header
- Bugzilla 22954: Header generator emits extern(C) member functions
- Bugzilla 22955: importC: wrong alignof for D struct with specified alignment
- Bugzilla 22970: importC: taking address one past array end gives bounds error
- Bugzilla 22971: importC: can't initialize unsigned char array with string literal
- Bugzilla 22972: importC: static variable cannot be read at compile time
- Bugzilla 22974: importC: D name mangling applied to extern variable inside function
- Bugzilla 22976: importC: fails to multiply by element size when doing address-of
- Bugzilla 22988: no short-circuiting when constant folding ternary operator
- Bugzilla 22994: importC: some types not zero-initialized in static array
- Bugzilla 23000: final switch error has no line number with -checkaction=C
- Bugzilla 23002: importC: struct or union field with same name as type gives circular reference error
- Bugzilla 23003: ImportC should not import object.d
- Bugzilla 23004: importC: calling function pointer named 'init' or 'stringof' from struct or union pointer gives error
- Bugzilla 23008: importC: dmd asserts on empty struct or union as global
- Bugzilla 23009: [CODEGEN][SIMD] SIMD + optimizations + inlining + double
- Bugzilla 23011: importC: asm label to set symbol name doesn't work with externs
- Bugzilla 23017: C++ class may not derive from D class
- Bugzilla 23025: ImportC: duplicate symbol for tentative definition and definition of variable
- Bugzilla 23028: ImportC: found _Generic instead of statement
- Bugzilla 23029: ImportC: _Generic treats pointer to const and regular pointers as the same type
- Bugzilla 23031: importC: hex character escapes should be variable length
- Bugzilla 23034: importC: head-const struct confused with multiple files on command line
- Bugzilla 23037: importC: type with only type-qualifier doesn't work
- Bugzilla 23038: importC: sizeof inside struct has struct members in scope
- Bugzilla 23039: importC: declaration with array length has itself in scope
- Bugzilla 23044: importC: comma expression with function call parsed as declaration
- Bugzilla 23045: importC: casted function type is missing extern(C)
- Bugzilla 23047: [ICE][SIMD] Do not SROA vector types
- Bugzilla 23056: importC: dmd asserts for missing return statement in CTFE function
- Bugzilla 23057: importC: dmd segfault on invalid syntax
- Bugzilla 23066: importC: cannot initialize char array with string literal of different length
- Bugzilla 23075: global const string definitions should go in readonly segment
- Bugzilla 23077: codegen cannot generage XMM load/store for optimized operation that uses byte/short/...
- Bugzilla 23083: .tupleof on static array rvalue evaluates expression multiple times
DMD Compiler enhancements
- Bugzilla 3632: modify float is float to do a bitwise compare
- Bugzilla 11463: DDoc html to show the normal escaped ASCII chars
- Bugzilla 14277: Compile-time array casting error - ugly error report
- Bugzilla 20853: static array ptr cannot be used in safe code but it should be allowed
- Bugzilla 21673: [SIMD][Win64] Wrong codegen for _mm_move_ss
- Bugzilla 22027: inout shouldn't imply return
- Bugzilla 22541: DIP1000: Resolve ambiguity of ref-return-scope parameters
- Bugzilla 22770: C++ header generator generates trailing newlines
- Bugzilla 22790: ref-return-scope is always ref-return, scope, unless return-scope appear in that order
- Bugzilla 22820: Error messages for slice pointers of structs with opIndex can be improved
- Bugzilla 22821: Dub package does not use incremental compilation
- Bugzilla 22861: Build the compiler with PGO
- Bugzilla 22880: importC: support __restrict__ __signed__ __asm__
- Bugzilla 22922: Support empty array literal in -betterC
- Bugzilla 22945: [Conditional Compilation] support invariant version flag
- Bugzilla 22967: [dip1000] no return ref inference for extended return semantics
- Bugzilla 23021: [dip1000] infer return scope from pure nothrow
Phobos regression fixes
- Bugzilla 20182: [REG 2.086.0] std.traits.ParameterDefaults fails for copy constructor of nested struct
Phobos bug fixes
- Bugzilla 13541: std.windows.syserror.sysErrorString() should be nothrow
- Bugzilla 18036: Documentation of moveFront() fails to mention different behavior depending on hasElaborateCopyConstructor
- Bugzilla 22213: Base64: Missing @nogc attribute on encodeLength
- Bugzilla 22503: Invalid changelog entry for isValidCodePoint
- Bugzilla 22771: BigInt divMod can return "-0" (negative zero)
- Bugzilla 22791: std\socket.d(790) Heisenbug random failure
- Bugzilla 22851: Missing reference to std.sumtype's source in the latter's documentation
- Bugzilla 22867: std.utf.decode changes offset despite error.
- Bugzilla 22873: Wrong std.format output for inout
- Bugzilla 22901: Can't construct inout SumType
- Bugzilla 22946: WindowsException ctor is not nothrow
- Bugzilla 22947: sysErrorString throws Exception instead of WindowsException
- Bugzilla 22998: Update to zlib 1.2.12
Phobos enhancements
- Bugzilla 22736: Add destructuring bind for std.typecons.Tuple tuples
- Bugzilla 22798: defaultGetoptPrinter should be @safe
Druntime regression fixes
- Bugzilla 22829: [REG master] Undefined symbol stderr first referenced in file test19933.o
- Bugzilla 22834: runnable_cxx/stdint.d: Undefined reference to _Z15testCppI8Mangleahahah
Druntime bug fixes
- Bugzilla 18117: ldiv_t struct in core.stdc.stdlib -- int vs c_long expectations
- Bugzilla 21631: core.atomic.cas fails to compile with const ifThis (if target is a pointer)
- Bugzilla 22763: importing std.utf fails in BetterC
- Bugzilla 22822: core.sys.posix.sys.stat: PPC stat_t bindings corrupt
- Bugzilla 22832: Can't destroy class with overloaded opCast
- Bugzilla 22843: Program hangs on full gc collect with --DRT-gcopt=fork:1 if run under valgrind/callgrind
- Bugzilla 23051: OpenBSD: Build broken on 2.100.0-beta.1 due to the inout attribute no longer implying the return attribute
Druntime enhancements
- Bugzilla 18816: [betterC] Standard Streams Unlinkable
- Bugzilla 19933: MSVC: Undefined std{in,out,err} with -betterC
- Bugzilla 22766: copyEmplace does not work with copy constructor and @disable this()
- Bugzilla 22964: array cast message is awkwardly worded
dlang.org bug fixes
- Bugzilla 15437: documentation for typeof(someTemplate) == void
- Bugzilla 22215: returning expired stack pointers in @system code allowed by spec, not by implementation
- Bugzilla 22795: Access denied when trying to download DMD 2.099.0-beta.1
- Bugzilla 22850: [Oh No! Page Not Found] Contract Programming
- Bugzilla 22959: Documentation for C/D main is incomplete
Installer bug fixes
- Bugzilla 22958: [Internal] Installer uses outdated image on Azure
Contributors to this release (41)
A huge thanks goes to all the awesome people who made this release possible.
- Adam D. Ruppe
- aG0aep6G
- Andrei Alexandrescu
- Arne Ludwig
- Atila Neves
- Boris Carvajal
- Brian Callahan
- Cameron Ross
- canopyofstars
- Dennis
- Dennis Korpel
- devmynote
- dkorpel
- Etienne Brateau
- Florian
- Gabriel
- Harry T. Vennik
- human
- Iain Buclaw
- Ilya Yaroshenko
- Johan Engelen
- João Lourenço
- Luís Ferreira
- Martin Kinkelin
- Martin Nowak
- Mathias Lang
- Max Haughton
- MoonlightSentinel
- Nicholas Wilson
- Nick Treleaven
- Paul Backus
- Petar Kirov
- Rainer Schuetze
- Razvan Nitu
- rikki cattermole
- sorin-gabriel
- Steven Dwy
- Steven Schveighoffer
- Teodor Dutu
- Tim Schendekehl
- Walter Bright