Change Log: 2.100.0
Download D nightlies
To be released
This changelog has been automatically generated from all commits in master since the last release.
- The full-text messages are assembled from the changelog/ directories of the respective repositories: dmd, druntime, phobos, tools, dlang.org, installer, and dub.
- See the DLang-Bot documentation for details on referencing Bugzilla. The DAutoTest PR preview doesn't include the Bugzilla changelog.
- The pending changelog can be generated locally by setting up dlang.org and running the pending_changelog target:
make -f posix.mak pending_changelog
Compiler changes
- When ref scope return attributes are used on a parameter, and return scope appears, the return applies to the scope, not the ref.
- __traits(parameters) has been added to the compiler.
- Add ability to import modules to ImportC
- Casting between compatible sequences
- New command line switch -vasm which outputs assembler code per function
- The '-preview=intpromote' switch is now set by default.
- -m32 now produces MS Coff objects when targeting windows
- Ignore unittests in non-root modules
- main can now return type noreturn and supports return inference
- Falling through switch cases is now an error
- Throw expression as proposed by DIP 1034 have been implemented
- Added __traits(initSymbol) to obtain aggregate initializers
Runtime changes
Library changes
List of all upcoming bug fixes and enhancements in D 2.100.0.
Compiler changes
- When ref scope return attributes are used on a parameter, and return scope appears, the return applies to the scope, not the ref.
Formerly, the return sometimes applied to the ref instead, which can be confusing. If return scope does not appear adjacent and in that order, the return will apply to the ref.
- __traits(parameters) has been added to the compiler.
If used inside a function, this trait yields a tuple of the parameters to that function for example:
int echoPlusOne(int x) { __traits(parameters)[0] += 1; return x; }
This can be used to simply forward a functions parameters (becoming arguments of another), in effect unifying functions with variadic parameters and normal functions i.e. the following pattern is now possible without use of variadics:
int add(int x, int y) { return x + y; } auto forwardToAdd(Pack...)(Pack xy) { return add(xy); }
would become
int add(int x, int y) { return x + y; } auto forwardToAdd(int x, int y) { return add(__traits(parameters)); }
When used inside a nested function or lambda, the trait gets the arguments of that and only that nested function or lambda, not what they are contained in.
For example, these assertions hold:
int testNested(int x) { static assert(typeof(__traits(parameters)).length == 1); int add(int x, int y) { static assert(typeof(__traits(parameters)).length == 2); return x + y; } return add(x + 2, x + 3); }
When used inside a foreach using an overloaded opApply, the trait yields the parameters to the delegate and not the function the foreach appears within.
class Tree { int opApply(int delegate(size_t, Tree) dg) { if (dg(0, this)) return 1; return 0; } } void useOpApply(Tree top, int x) { foreach(idx; 0..5) { static assert(is(typeof(__traits(parameters)) == AliasSeq!(Tree, int))); } foreach(idx, elem; top) { static assert(is(typeof(__traits(parameters)) == AliasSeq!(size_t, Tree))); } }
- Add ability to import modules to ImportC
ImportC can now import modules with the __import keyword, with the C code:
__import core.stdc.stdarg; // import a D source file __import test2; // import an ImportC file
int foo() { va_list x; return 1 + A; }
test2.c is:
enum E { A = 3 };
The syntax for __import after the keyword is the same as for D's import declaration.
- Casting between compatible sequences
Prior to this release, casting between built-in sequences of the same type was not allowed.
Starting with this release, casting between sequences of the same length is accepted provided that the underlying types of the casted sequence are implicitly convertible to the target sequence types.
alias Seq(T...) = T; void foo() { Seq!(int, int) seq; auto foo = cast(long) seq; pragma(msg, typeof(foo)); // (int, int) auto bar = cast(Seq!(long, int)) seq; // allowed pragma(msg, typeof(bar)); // (long, int) }
- New command line switch -vasm which outputs assembler code per function
The new -vasm compiler switch will print to the console the generated assembler code for each function. As opossed to a typical dissasembler, it will omit all the boilerplate and output just the assembly code for each function. For example, compiling the following code:
// test.d int demo(int x) { return x * x; }
by using the command dmd test.d -c -vasm will yield:
_D4test4demoFiZi: 0000: 89 F8 mov EAX,EDI 0002: 0F AF C0 imul EAX,EAX 0005: C3 ret
- The '-preview=intpromote' switch is now set by default.
Integer promotions now follow C integral promotions rules consistently It affects the unary - and ~ operators with operands of type byte, ubyte, short, ushort, char, or wchar. The operands are promoted to int before the operator is applied, and the resulting type will now be int.
To revert to the old behavor, either use the '-revert=intpromote' switch, or explicitly cast the result of the unary operator back to the smaller integral type:
void main() { // Note: byte.max = 127, byte.min = -128 byte b = -128; int x = -b; // new behavior: x = 128 int y = cast(byte)(-b); // old behavior: y = -128 byte b2 = cast(byte) -b; // cast now required }
- -m32 now produces MS Coff objects when targeting windows
The -m32mscoff switch is deprecated and -m32 should be used in its place. A new switch -m32omf has been added to produce code for OMF. Use of this switch is discouraged because OMF will soon be unsupported.
- Ignore unittests in non-root modules
This mainly means that unittests inside templates are now only instantiated if the module lexically declaring the template is one of the root modules.
E.g., compiling some project with -unittest does NOT compile and later run any unittests in instantiations of templates declared in other libraries anymore.
Declaring unittests inside templates is considered an anti-pattern. In almost all cases, the unittests don't depend on the template parameters, but instantiate the template with fixed arguments (e.g., Nullable!T unittests instantiating Nullable!int), so compiling and running identical tests for each template instantiation is hardly desirable. But adding a unittest right below some function being tested is arguably good for locality, so unittests end up inside templates.
To make sure a template's unittests are run, it should be instantiated in the same module, e.g., some module-level unittest.
This change paved the way for a more straight-forward template emission algorithm without -unittest special cases, showing significant compile-time improvements for some projects. -allinst now emits all templates instantiated in root modules.
- main can now return type noreturn and supports return inference
If main never returns (due to an infinite loop or always throwing an exception), it can now be declared as returning noreturn. See https://dlang.org/spec/type.html#noreturn.
If main is declared with auto, the inferred return type must be one of void, int and noreturn.
- Falling through switch cases is now an error
This was deprectated in 2.072.2 because it is a common mistake to forget a break statement at the end of a switch case. The deprecation warning has now been turned into an error.
If you intend to let control flow continue from one case to the next, use the goto case; statement.
void parseNumFmt(char c, out int base, out bool uppercase) { switch (c) { case 'B': // fallthrough allowed, case has no code case 'b': base = 2; // error, accidental fallthrough to case 'X' case 'X': uppercase = true; goto case; // allowed, explicit fallthrough case 'x': base = 16; break; default: break; } }
- Throw expression as proposed by DIP 1034 have been implemented
Prior to this release, throw was considered as a statement and hence was not allowed to appear inside of other expressions. This was cumbersome e.g. when wanting to throw an expression from a lambda:
SumType!(int, string) result; result.match!( (int num) => writeln("Found ", num), // (string err) => throw new Exception(err) // expression expected (string err) { throw new Exception(err); } // ok, introduces an explicit body );
throw is now treated as an expression as specified by DIP 1034 [1], causing it to become more flexible and easier to use.
SumType!(int, string) result; result.match!( (int num) => writeln("Found ", num), (string err) => throw new Exception(err) // works );
[1] https://github.com/dlang/DIPs/blob/master/DIPs/accepted/DIP1034.md
- Added __traits(initSymbol) to obtain aggregate initializers
Using __traits(initSymbol, A) where A is either a class or a struct will yield a const(void)[] that holds the initial state of an instance of A. The slice either points to the initializer symbol of A or null if A is zero-initialised - matching the behaviour of TypeInfo.initializer().
This traits can e.g. be used to initialize malloc'ed class instances without relying on TypeInfo:
class C { int i = 4; } void main() { const void[] initSym = __traits(initSymbol, C); void* ptr = malloc(initSym.length); scope (exit) free(ptr); ptr[0..initSym.length] = initSym[]; C c = cast(C) ptr; assert(c.i == 4); }
Runtime changes
- Add support for OpenBSD ioctls
Support OpenBSD ioctls as found in OpenBSD's /usr/include/sys/filio.h, /usr/include/sys/ioccom.h, /usr/include/sys/ioctl.h, and /usr/include/sys/ttycom.h.
- Add support for @safe class opEquals
object.opEquals is now @safe if the static types being compared provide an opEquals method that is also @safe.
Library changes
- Move checkedint out of experimental.
std.experimental.checkedint is now std.checkedint. The old name is still available and publicly imports the new one, and is also deprecated.
- chunkBy @safe with forward ranges and splitWhen fully @safe
std.algorithm.iteration.splitWhen now infers safety from the underlying range, as most Phobos ranges do. std.algorithm.iteration.chunkBy also does that when instantiated with a forward range. Inference for chunkBy with a non-forward input range is not yet implemented, though.
@safe void fun() { import std.algorithm; // Grouping by particular attribute of each element: auto data = [ [1, 1], [1, 2], [2, 2], [2, 3] ]; auto r1 = data.chunkBy!((a,b) => a[0] == b[0]); assert(r1.equal!equal([ [[1, 1], [1, 2]], [[2, 2], [2, 3]] ])); auto r2 = [1, 2, 3, 4, 5, 6, 7, 8, 9].splitWhen!((x, y) => ((x*y) % 3) > 0); assert(r2.equal!equal([ [1], [2, 3, 4], [5, 6, 7], [8, 9] ])); }
- std.csv can now optionally handle csv files with variable number of columns.
By default std.csv will throw if the number of columns on a line is not equal to the number of columns of the first line. To allow, or disallow, a variable amount of columns a bool can be passed to all overloads of the csvReader function as shown below.
string text = "76,26,22\n1,2\n3,4,5,6"; auto records = text.csvReader!int(',', '"', true); assert(records.equal!equal([ [76, 26, 22], [1, 2], [3, 4, 5, 6] ]));
- Change default log level for std.experimental.logger to LogLevel.warning
std.experimental.logger.core.sharedLog now returns by default a logger with its log level set to LogLevel.warning.
- std.conv.to accepts std.typecons tuples
The previous version of to did not support conversions to std.typecons tuples. Starting with this release, tuples are now supported as highlighted in the following example:
void main() { import std.conv : to; import std.typecons : Tuple; auto data = ["10", "20", "30"]; auto a3 = data.to!(int[3]); // accepted in previous and current versions auto t3 = data.to!(Tuple!(int, int, int)); // rejected in past versions, accepted now }
List of all bug fixes and enhancements in D 2.100.0:
DMD Compiler regression fixes
- Bugzilla 17434: [REG: 2.073] import lookup ignores public import.
- Bugzilla 20015: [REG 2.086] Deprecated -preview, -revert, and -transition options not documented
- Bugzilla 20717: Unsilenced bogus "undefined identifier" error from speculative collision
- Bugzilla 21285: Delegate covariance broken between 2.092 and 2.094 (git master).
- Bugzilla 22175: assert fail when struct assignment value is desired and struct size is odd
- Bugzilla 22639: Copy constructors with default arguments not getting called
- 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 22858: [REG2.099] Incorrect alignment of void*[0]
- Bugzilla 22859: Error: forward reference of variable isAssignable for mutually recursed allSatisfy
- Bugzilla 22860: Error: unknown with mutually recursive and nested SumType
- Bugzilla 22863: [REG2.099] -main doesn't work anymore when used for linking only (without source modules)
- 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 22969: Can't mixin name of manifest constant on right-hand side of alias declaration
- 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 22852: importC: Lexer allows invalid wysiwyg and hex strings
- Bugzilla 22853: importC: Lexer allows nesting block comments
- Bugzilla 22868: __traits(parameters) returns parameters of delegate instead of function
- Bugzilla 22871: Using an alias to __traits(parameters) causes unknown error
- 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 22939: bad error message: Error: no property msg for type string
- Bugzilla 22942: Invalid section type / offset for newer XCode versions
- 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 22993: Missing quotes in octal literal hint
- 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 20778: exception messages with nulls within are treated inconsistently
- 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 22908: OpenBSD: Add getpwnam_shadow and getpwuid_shadow function prototypes
- Bugzilla 22964: array cast message is awkwardly worded
dlang.org bug fixes
- Bugzilla 15437: documentation for typeof(someTemplate) == void
- Bugzilla 21086: Wrong source link for core.thread.context
- 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