Change Log: 2.099.0
Download D 2.099.0
released Mar 06, 2022
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 bug fixes and enhancements in D 2.099.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 }
Dub changes
- Windows: Copy PDB files to targetPath, alongside executable/DLL
If the default PDB file is generated when linking an executable or DLL (e.g., no /PDB:my\path.pdb lflag), it is now copied to the target directory too.
List of all bug fixes and enhancements in D 2.099.0:
DMD Compiler regression fixes
- Bugzilla 17635: [REG 2.066.0] cannot convert unique immutable(int)** to immutable
- Bugzilla 21367: Nameless union propagates copy constructors and destructors over all members
- Bugzilla 21538: Overriding with more attributes on delegate parameter is allowed
- Bugzilla 21674: [REG v2.086] alias this triggers wrong deprecation message on function call
- Bugzilla 21719: [REG 2.072] "auto" methods of classes do not infer attributes correctly.
- Bugzilla 22130: [REG2.080.1][DIP1000] pure factory functions stopped working
- Bugzilla 22163: [REG 2.094.0] wrong code with static float array and delegate accessing it
- Bugzilla 22226: [REG 2.095.1] __ctfe + function call in conditional expression used to initialize struct member in constructor causes ICE
- Bugzilla 22254: Template instantiated twice results in different immutable qualifier
- Bugzilla 22512: importC: incomplete array type must have initializer
- Bugzilla 22659: [REG master] Error: declaration '(S[2] arr = __error__;)' is not yet implemented in CTFE
- Bugzilla 22676: fullyQualifiedName fails to compile with 2.098.1 relese -- there is some issue with call to __traits(isScalar ..
- Bugzilla 22705: importC: forward reference to struct typedef gives struct already exists
- Bugzilla 22714: ICE: Assertion failure in ClassDeclaration::isBaseOf
- Bugzilla 22730: master: "dmd -i" doesn't include unit tests from imported modules
- Bugzilla 22738: std.file.tempDir adds an addition / even when it already has one
- Bugzilla 22761: [REG 2.099] importC: Error: redeclaration with different type
- Bugzilla 22780: [REG 2.090] variable reference to scope class must be scope
- Bugzilla 22804: [REG 2.099] compiling multiple files without linking produces broken object files
- Bugzilla 22816: [REG 2.099] Parser reads files with other extensions
- Bugzilla 22817: [REG 2.099] Missing file gives misleading error message
- Bugzilla 22826: [REG 2.098] #line accepts importC linemarker flags
DMD Compiler bug fixes
- Bugzilla 2: Hook up new dmd command line arguments
- Bugzilla 3: Finish or remove MatchExp::toElem
- Bugzilla 3818: Generic error message for wrong foreach
- Bugzilla 8346: Literals 00 - 07 results in odd errors when used with UFCS
- Bugzilla 10584: Unhelpful error default constructing nested class
- Bugzilla 15711: Incorrect type inferring of [char]/string when passed via recursive template, extracting it from a structure field
- Bugzilla 15804: missing UDAs on nested struct template
- Bugzilla 17870: Can't alias a mix of parent and child class members
- Bugzilla 17977: [DIP1000] destructor allows escaping reference to a temporary struct instance
- Bugzilla 18960: Function parameter requires name with default value
- Bugzilla 19320: -cov and -O yield variable used before set
- Bugzilla 19482: attributes incorrectly applied to static foreach local variables
- Bugzilla 19873: function should be by default @system even with -preview=dip1000
- Bugzilla 20023: Separate compilation breaks dip1000 / dip1008 @safety
- Bugzilla 20691: Converting scope static array to scope dynamic array should be error
- Bugzilla 20777: User defined type as enum base type fails to compile.
- Bugzilla 20904: dip1000 implicit conversion delegates error
- Bugzilla 21431: Incorrect maximum and actual number of cases in a switch case range is reported
- Bugzilla 21844: makedeps option adds spurious/incorrect dependency
- Bugzilla 21969: importC: Error: bit fields are not supported
- Bugzilla 22124: Corrupted closure when compiling with -preview=dip1000
- Bugzilla 22127: compiler assertion failure parser on UDA and function literal
- Bugzilla 22137: -preview=dip1000 enables visibility checks for tupleof
- Bugzilla 22139: Compiler special cases object.dup when compiling with -preview=dip1000
- Bugzilla 22233: importC: (identifier)() incorrectly parsed as a cast-expression
- Bugzilla 22236: sizeof an empty C struct should be 0, not 1
- Bugzilla 22245: importC: Error: found . when expecting )
- Bugzilla 22267: ImportC: typedef-ed variable initialization with RHS in parenthesis doesn't parse
- Bugzilla 22277: removing strongly pure function calls is an incorrect optimization
- Bugzilla 22283: -preview=in -inline leads to strange error inside object.d
- Bugzilla 22285: markdown tables are not parsed correctly
- Bugzilla 22287: ambiguous virtual function for extern(C++) under Windows
- Bugzilla 22298: [DIP1000] Nested function's scope parameters can be assigned to variables in enclosing function
- Bugzilla 22305: ImportC: #pragma STDC FENV_ACCESS is not supported
- Bugzilla 22311: dmd slice length is wrong on DWARF
- Bugzilla 22323: Link error for virtual destructor of C++ class in DLL
- Bugzilla 22339: importC: error message with character literal reports as integer instead of character literal.
- Bugzilla 22342: importC: Error: function 'func()' is not callable using argument types '(int)'
- Bugzilla 22344: ImportC: overloading of functions is not allowed
- Bugzilla 22356: Can't mixin the return type of a function
- Bugzilla 22361: Failed import gives misleading error message
- Bugzilla 22365: Compiler crash: tcs.body_ null in StatementSemanticVisitor.visit(TryCatchStatement) in semantic3 pass (dmd/statementsem.d:3956)
- Bugzilla 22366: [dip1000] scope variable can be assigned to associative array
- Bugzilla 22372: Loop index incorrectly optimised out for -release -O
- Bugzilla 22387: Noreturn init loses type qualifiers
- Bugzilla 22401: importC: Error: cannot implicitly convert expression of type 'const(int[1])' to 'const(int*)'
- Bugzilla 22415: importC: Deprecation: switch case fallthrough - use 'goto case;' if intended
- Bugzilla 22421: static foreach introduces semantic difference between indexing and iteration variable
- Bugzilla 22467: DWARF: wchar_t reports wrong DECL attributes
- Bugzilla 22510: Structs with copy constructor can not be heap allocated with default constructor
- Bugzilla 22515: Aggregate definition with qualifiers has inconsistencies between structs and classes
- Bugzilla 22517: [REG 2.093][ICE] Bus error at dmd/lexer.d:398
- Bugzilla 22527: Casting out-of-range floating point value to signed integer overflows
- Bugzilla 22533: OpenBSD: Use correct size_t compat for 32-bit
- Bugzilla 22535: ImportC: gcc/clang math intrinsics are rejected.
- Bugzilla 22553: ImportC: undefined identifier __uint128_t
- Bugzilla 22566: Error: unknown architecture feature 4+avx for -target
- Bugzilla 22573: DMD compiler errors on Illumos/Solaris
- Bugzilla 22590: importC: static functions have no debug information generated for them
- Bugzilla 22598: importC: Add support for __extension__ keyword
- Bugzilla 22607: ImportC misses some float values ending with f
- Bugzilla 22619: Missing inout substitution for __copytmp temporaries caused by copy ctors
- Bugzilla 22623: ImportC: typedef'd struct definition tag not put in symbol table
- Bugzilla 22624: ImportC: struct members in static initializer misaligned following bit field
- Bugzilla 22625: ImportC: original name of typedefed struct not visible in D when compiling separately
- Bugzilla 22632: Crash happens when CTFE compares an associative array to null using ==
- Bugzilla 22634: assert for too many symbols should be error
- Bugzilla 22655: Disassembler assertion on rdtsc
- Bugzilla 22656: SSE2 instructions have inconsistent layouts in the disassembler output
- Bugzilla 22665: ImportC: qualified enum values should be of enum type on the D side, not int
- Bugzilla 22666: ImportC: Error: attributes should be specified before the function definition
- Bugzilla 22668: Deprecation when a deprecated method overrides another deprecated method
- Bugzilla 22685: Template function instantiated with lambda and overload is nested incorrectly
- Bugzilla 22686: ICE: dmd segfaults on invalid member reference in static function
- Bugzilla 22698: ImportC: nested struct tag stored in wrong scope
- Bugzilla 22699: importC: assignment cannot be used as a condition
- Bugzilla 22703: importC: C++11 unscoped enums with underlying type rejects some C types.
- Bugzilla 22708: switch statement with an undefined symbol results in many errors
- Bugzilla 22709: [dip1000] slice of static array can be escaped in @safe using ref arguments
- Bugzilla 22710: CTFE on bitfields does not account for field width
- Bugzilla 22713: ImportC: op= not correctly implemented for bit fields
- Bugzilla 22717: object.TypeInfo_Struct.equals swaps lhs and rhs parameters
- Bugzilla 22725: ImportC: segfault when compiling with -H
- Bugzilla 22726: ImportC: typedefs of tagged enums fail to compile
- Bugzilla 22727: ImportC: support for __stdcall and __fastcall is necessary for 32-bit Windows builds
- Bugzilla 22734: importC: typedef anonymous enum members not available when used from D
- Bugzilla 22749: importC: C11 does not allow taking the address of a bit-field
- Bugzilla 22756: ImportC: no __builtin_offsetof
- Bugzilla 22757: importC: typedef causes forward reference error
- Bugzilla 22758: ImportC: parenthesized expression confused with cast-expression
DMD Compiler enhancements
- Bugzilla 5096: More readable unpaired brace error
- Bugzilla 7925: extern(C++) delegates?
- Bugzilla 11008: Allow -main switch even if user-defined main function exists
- Bugzilla 20340: [betterC] -main inserts D main function even with betterC
- Bugzilla 20616: Error: undefined identifier __dollar
- Bugzilla 21160: DWARF: DW_AT_main_subprogram should be emitted for _Dmain
- Bugzilla 22113: Allow noreturn as a type for main function
- Bugzilla 22198: Compile time bounds checking for static arrays
- Bugzilla 22278: [Conditional Compilation] there should be in and out flags
- Bugzilla 22291: __traits(arguments) to return a tuple of the function arguments
- Bugzilla 22353: Header generation is producing trailing whitespace on attribute declarations
- Bugzilla 22354: Header generation is producing trailing whitespace on enum declarations
- Bugzilla 22355: LLD fallback for mscoff is broken in the presence of some old VS versions
- Bugzilla 22377: Show location for Windows extern(C++) mangling ICE
- Bugzilla 22379: OpenBSD: link -lexecinfo to get backtrace symbols
- Bugzilla 22419: Allow return type inference for main
- Bugzilla 22423: DWARF DW_TAG_subprogram should generate DW_AT_decl_column
- Bugzilla 22426: DWARF DW_AT_noreturn should be present when function is noreturn
- Bugzilla 22459: DWARF: delegate type names should be distinguishable
- Bugzilla 22468: DWARF: dchar type is missing encoding
- Bugzilla 22469: DWARF: some debug info types are named wrongly
- Bugzilla 22471: DWARF: generated main is not marked as DW_AT_artificial
- Bugzilla 22494: Search paths for dmd.conf missing from dmd man page
- Bugzilla 22508: DWARF: associative arrays should report qualified name instead of _AArray_
_ - Bugzilla 22519: [dip1000] cannot take address of ref return
- Bugzilla 22541: DIP1000: Resolve ambiguity of ref-return-scope parameters
- Bugzilla 22631: ImportC: support C++11 unscoped enums with underlying type
- Bugzilla 22672: Allow casting a ValueSeq to a compatible TypeTuple
- Bugzilla 22733: hdrgen generates inconsistent order of STC attributes for ~this()
- Bugzilla 22746: Functions that throws marked as nothrow produces bad error
- Bugzilla 22753: Deprecation message for import module shouldn't produce hifen when no message
- Bugzilla 22754: Header generator shouldn't generate trailing whitespace on visibility declaration
Phobos bug fixes
- Bugzilla 17037: std.concurrency has random segfaults
- Bugzilla 19544: Can't call inputRangeObject on ranges not supported by moveFront
- Bugzilla 20554: std.algorithm.searching.all 's static assert produces a garbled error message
- Bugzilla 21022: std.range.only does not work with const
- Bugzilla 21457: std.functional.partial ignores function overloads
- Bugzilla 22105: std.container.array.Array.length setter creates values of init-less types
- Bugzilla 22185: std.array.array() doesn't handle throwing element copying
- Bugzilla 22249: std.experimental.checkedint: Warn.onLowerBound does not compile
- Bugzilla 22255: JSONValue.opBinaryRight!"in" is const
- Bugzilla 22297: Behavior of minElement and maxElement with empty range is undocumented
- Bugzilla 22301: Only use 'from' if a packet was actually received
- Bugzilla 22325: ReplaceType fails on templated type instantiated with void-returning function
- Bugzilla 22359: joiner over an empty forward range object liable to segfault
- Bugzilla 22364: Unreachable warning for collectException[Msg] with noreturn value
- Bugzilla 22368: has[Unshared]Aliasing fails to instantiate for noreturn
- Bugzilla 22369: Unreachable statements in std.concurrency with noreturn values / callbacks
- Bugzilla 22383: Array of bottom types not recognized as a range
- Bugzilla 22384: castSwitch confused by noreturn handlers
- Bugzilla 22386: Unreachable warning for assertThrown with noreturn value
- Bugzilla 22394: std.getopt cannot handle "-"
- Bugzilla 22408: Multiple issues in AllImplicitConversionTargets
- Bugzilla 22414: clamp(a, b, c) should always return typeof(a)
- Bugzilla 22561: only().joiner fails with immutable element type
- Bugzilla 22572: Cannot define SumType over immutable struct with Nullable
- Bugzilla 22608: RandomAccessInfinite is not a valid random-access range
- Bugzilla 22647: [std.variant.Variant] Cannot compare types compliant with null comparison with 'null'
- Bugzilla 22648: [std.variant.Variant] Incorrectly written unittests
- Bugzilla 22673: .array of a range with length preallocates without checking if the length was lying or not.
- Bugzilla 22683: core.math.rndtonl can't be linked
- Bugzilla 22695: std.traits.isBuiltinType is false for typeof(null)
- Bugzilla 22704: Linker error when running the public unittests
- Bugzilla 22838: std.bitmanip.BitArray.count() reads beyond data when data size is integer size_t multiple
Phobos enhancements
- Bugzilla 13551: std.conv.to for std.typecons tuples too
- Bugzilla 17488: Platform-inconsistent behavior from getTempDir()
- Bugzilla 18051: missing enum support in formattedRead/unformatValue
- Bugzilla 21507: SysTime.toISOExtString is unusable for logging or consistent filename creation
- Bugzilla 22117: Can't store scope pointer in a SumType
- Bugzilla 22340: totalCPUs may not return accurate number of CPUs
- Bugzilla 22370: std.concurrency.spawn* should accept noreturn callables
- Bugzilla 22511: Nullable is not copyable when templated type has elaborate copy ctor
- Bugzilla 22532: std.experimental.logger Change default log level to LogLevel.warning, or LogLevel.off
- Bugzilla 22701: std.typecons.apply needlessly checks if the predicate is callable
Druntime regression fixes
- Bugzilla 22136: [REG 2.097.1] hashOf failed to compile because of different inheritance order
Druntime bug fixes
- Bugzilla 22328: Specific D types are used instead of Windows type aliases
- Bugzilla 22336: core.lifetime.move doesn't work with betterC on elaborate non zero structs
- Bugzilla 22523: DRuntime options passed after -- affect current process
- Bugzilla 22552: moveEmplace wipes context pointer of nested struct contained in non-nested struct
- Bugzilla 22630: It is possible for VS to be installed and providing VC directory without VC libraries being installed
- Bugzilla 22702: druntime not compliant with D spec re getLinkage
- Bugzilla 22721: importC: some gnu builtins are rejected
- Bugzilla 22735: __builtins.di does not implement __builtin_bswap64 correctly
- Bugzilla 22741: importC: Error: bswap isn’t a template
- Bugzilla 22744: ImportC: builtins defined in __builtins.di cause undefined symbol linker errors.
- Bugzilla 22777: stat struct in core.sys.windows.stat assumes CRuntime_DigitalMars
- Bugzilla 22779: druntime: Calling __delete with null pointer-to-struct segfaults
Druntime enhancements
- Bugzilla 14892: -profile=gc doesn't account for GC API allocations
- Bugzilla 20936: core.sync.rwmutex should have shared overloads (and make it usable in @safe code)
- Bugzilla 21005: Speed up hashOf for associative arrays
- Bugzilla 21014: aa.byKeyValue, byKey, byValue very under-documented
- Bugzilla 22378: OpenBSD: execinfo.d and unistd.d aren't being installed
- Bugzilla 22669: OpenBSD: Sync socket.d
- Bugzilla 22670: Support *BSD kqueue-backed API-compatible inotify shim library
dlang.org bug fixes
- Bugzilla 19136: is expressions don't work as documented
- Bugzilla 21717: [Oh No! Page Not Found]
- Bugzilla 22064: Missing documentation page for phobos core.builtins
- Bugzilla 22281: unreadable quotes in the upcoming 2.099 changelog
- Bugzilla 22363: Wrong link in https://dlang.org/spec/abi.html for "Garbage Collection"
- Bugzilla 22417: Slice assignment operator overloading example is incorrect
- Bugzilla 22504: spec/type.html: 6.1 Basic Data Types: Backslash missing in default value for {,d,w}char
- Bugzilla 22518: [dip1000] return without scope/ref not specified
- Bugzilla 22544: [spec] C++ and Objective-C are not single tokens
- Bugzilla 22692: Underground Rekordz link is dead
- Bugzilla 22711: Effect of template UDAs on instance members is undocumented
dlang.org enhancements
- Bugzilla 22425: Documentation on implicit conversion of arrays is incomplete
- Bugzilla 22431: Add OpenBSD to Third-party downloads list
Installer enhancements
- Bugzilla 18362: Build dmd with LTO and PGO
- Bugzilla 22078: install.sh: Recognize ARM64 as architecture
Contributors to this release (100)
A huge thanks goes to all the awesome people who made this release possible.
- 12345swordy
- Adam D. Ruppe
- aG0aep6G
- Andrei Alexandrescu
- Andrej Petrović
- Anton Curmanschii
- Antonio Cabrera
- Arun Chandrasekaran
- Ate Eskola
- Atila Neves
- BarrOff
- Bastiaan Veelo
- Ben Jones
- Bianca Fodor
- bistcuite
- Boris Carvajal
- Brian Callahan
- David Gileadi
- Dennis
- dkorpel
- DoctorNoobingstoneIPresume
- Domenico Teodonio
- Dorian Verna
- dorianverna17
- dteod
- Eddy Schauman-Haigh
- Eduard Staniloiu
- etienne02
- Florian
- fourst4r
- Gabriel
- Gabriel Dolberg
- giacomo.ratto00
- H. S. Teoh
- Harrison
- Harry T. Vennik
- Hasan Kashi
- Hiroki Noda
- human
- Iain Buclaw
- Ilya Yaroshenko
- Imperatorn
- James S Blachly
- Jan Jurzitza
- Jeremy DeHaan
- Johan Engelen
- John Colvin
- John Kilpatrick
- João Lourenço
- jpiles
- jrfondren
- Julian Fondren
- Laeeth Isharc
- Lionello Lunesu
- Lio李歐
- lucica28
- Lucien Perregaux
- Luís Ferreira
- Manu Evans
- Marcelo Silva Nascimento Mancini
- Martin Kinkelin
- Martin Nowak
- Mathias Lang
- Mathis Beer
- Max H Haughton
- Max Haughton
- Max Samukha
- Mike Parker
- MoonlightSentinel
- Nathan Sashihara
- Nicholas Wilson
- Nick Treleaven
- Paul Backus
- Per Nordlöw
- Petar Kirov
- quassy
- Razvan Nitu
- Richard Andrew Cattermole
- rikki cattermole
- Robert burner Schadek
- Ryan Frame
- Sebastian Wilzbach
- Sebastien Alaiwan
- sorin-gabriel
- Stanislav Blinov
- Stefan Koch
- Sönke Ludwig
- teo
- Teodor Dutu
- thaven
- Tim Schendekehl
- tim-dlang
- Tobias Pankrath
- Tomáš Chaloupka
- Victarus
- Vladimir Panteleev
- Walter Bright
- Walter Waldron
- wolframw
- Ömer Faruk IRMAK