Report a bug
If you spot a problem with this page, click here to create a Bugzilla issue.
Improve this page
Quickly fork, edit online, and submit a pull request for this page. Requires a signed-in GitHub account. This works well for small changes. If you'd like to make larger changes you may want to consider using a local clone.

Change Log: 2.095.0

previous version: 2.094.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


2.095.0 comes with 19 major changes and 94 fixed Bugzilla issues. A huge thanks goes to the 63 contributors who made 2.095.0 possible.

List of all upcoming bug fixes and enhancements in D 2.095.0.

Compiler changes

  1. Add __traits(child, parent, member)

    Takes two arguments. The first must be a symbol or expression and the second must be a symbol, such as an alias to a member of parent. The result is member interpreted with its this context set to parent. This is the inverse of __traits(parent, member).

    struct A
    {
        int i;
        int foo(int j) {
            return i * j;
        }
    }
    
    alias Ai = A.i;
    
    void main()
    {
        A a;
    
        __traits(child, a, Ai) = 3;
        assert(a.i == 3);
        assert(__traits(child, a, A.foo)(2) == 6);
    }
    
  2. Improve type determination for array literals

    There were some cases where DMD wasn't able to determine the common type for array literal elements. Mismatched enums and literals containing only mutable and immutable elements should now be correctly inferred.

  3. Template usage diagnostics via -vtemplates has been improved.

    Every template having at least one instantiation is now printed using standard compiler diagnostics formatting for easy navigation to the point of its declaration.

    All messages of this kind are sorted by descending unique instantiation count.

    If the flag argument list-instances is passed (such as -vtemplates=list-instances), each location where a template was instantiated is printed along with the reason for the instantiation (implicit or explicit).

    For instance, a D source file named main.d containing

    void foo(int I)() { }
    void goo1(int I)() { }
    void goo2(int I)() { goo1!(I); }
    
    void test()
    {
        foo!(1)();
        foo!(1)();
        foo!(2)();
    
        goo1!(1)();
    
        goo2!(1)();
    }
    

    compiled with -vtemplates=list-instances will output

    main.d(1): vtemplate: 3 (2 unique) instantiation(s) of template `foo(int I)()` found, they are:
    main.d(7): vtemplate: explicit instance `foo!1`
    main.d(8): vtemplate: explicit instance `foo!1`
    main.d(9): vtemplate: explicit instance `foo!2`
    main.d(2): vtemplate: 2 (1 unique) instantiation(s) of template `goo1(int I)()` found, they are:
    main.d(11): vtemplate: explicit instance `goo1!1`
    main.d(3): vtemplate: implicit instance `goo1!1`
    main.d(3): vtemplate: 1 (1 unique) instantiation(s) of template `goo2(int I)()` found, they are:
    main.d(13): vtemplate: explicit instance `goo2!1`
    
  4. C++ header generation omits Ignored ... comments by default

    The C++ header generated used to write comments when it encountered non-extern(C++) declarations, e.g.

    // test.d
    void foo() {}
    
    // test.h
    [...]
    // ignoring function test.foo because of linkage
    

    This caused a lot of bloat in the generated header file and is now customizable via the `-HC= switch which accepts either verbose (write comments) and silent (omit comments). The default was changed to silent.

    Note: The header generator is still considerer experimental, so please submit any bugs encountered to the bug tracker.

  5. Exception-throwing code can now be used in debug blocks

    When writing debug code, one isn't interested statically ensuring that a function block doesn't throw, but a pleasant debugging experience as e.g. writing to the console or logfiles typically can't be nothrow. DMD already allowed to escape pure and @nogc within debug statement. With this release, exception-throwing code can be called from debug statements too:

    import std.stdio;
    void main() nothrow
    {
        debug writeln("Your throwing log statement.");
    }
    
  6. Always inline pragma(inline, true) functions regardless of -inline compiler switch.

    Marking a function with pragma(inline, true) will now cause it to be always inlined when called, and a compile error will result if it cannot be inlined.

    If the pragma(inline, true) is embedded in the function body rather than outside it, it may not always take effect. (It depends on whether the function body is analyzed before it is called or not.)

    If a function marked with pragma(inline, true) cannot be inlined it will now issue a warning if and only if the -wi command line switch is given. Previously, it would issue an error.

  7. The deprecation period for implicit override has ended

    Implicit overrides of base classes methods were deprecated in 2.075.0 (released 2017-07-19) when issue 17349 was fixed by PR 6731.

    The deprecation period has now ended and the following code will always error from now:

    class Base
    {
        void myFunction();
        void myOtherFunction(void* ptr);
    }
    
    class Child : Base
    {
        // Error: Implicitly overriding `Base.myFunction`
        void myFunction() const;
        // Error: Implicitly overriding `Base.myOtherFunction(void*)`
        void myOtherFunction(const void* ptr);
    }
    
  8. Strict implicit conversion rules for Vector types

    Previously, the compiler allowed any __vector type to be implicitly convertible with any other __vector type.

    int4 x = 2;
    float8 y = x;
    short8 z = y / 3;
    

    In this release, __vector types now, like static arrays, can only be implicitly converted to either qualified types of itself, or void.

    const int4 a = 5;
    int4 b = a;         // OK, both are int4
    void16 c = a;       // OK, cast to void of same size.
    float4 d = b;       // Error, cannot implicitly convert int4 to float4.
    

    Explicit conversions between __vector types can be done, but only between vectors of the same size.

    long2 a = 8;
    short8 b = cast(short8)a;   // OK
    short16 c = cast(short16)b; // Error, cannot cast because of different sizes.
    

    Users of the __simd and __simd_sto intrinsics will have to either add explicit casts from void16 to the appropriate type at each use, or operate strictly with void16 vectors until a value is required to be peeked.

    float4 fun1(float4 a, float4 b)
    {
        a = cast(float4)__simd(XMM.ADDPD, a, b);
        a = cast(float4)__simd(XMM.ADDSS, a, b);
        return a;
    }
    
    float4 fun2(void16 a, void16 b)
    {
        a = __simd(XMM.ADDPD, a, b);
        a = __simd(XMM.ADDSS, a, b);
        return cast(float4)a;
    }
    
  9. Parameters marked as in will now be properly displayed

    In earlier releases, using in on parameters would be lowered too early, leading to confusing display: error messages would show the parameter as const (or scope const if -preview=in was used), and so would header generations or stack traces. The header generation was problematic, as a header generated with -preview=in would be different from one generated without. From this release, in will now display correctly in every message. As this requires an update to the mangling, some older debuggers or tools might not be able to properly demangle functions that uses in parameters.

  10. DDoc Markdown support has been enabled by default

    Ddoc's Markdown has now been enabled by default. The full list of supported Markdown features (headings, emphasized text, links, and more) is described in the Ddoc documentation page.

    For the more cautious, a list of all instances of Markdown features can be logged with -transition=vmarkdown. If you encounter issues with this transition, you can temporarily disable the processing of the Markdown features with -revert=markdown and report an issue.

    A huge thanks goes to David Gileadi for championing this issue!

  11. Added support for input parameters (in parameter, -preview=in)

    D has supported the in, ref, and out storage classes on parameters since its inception. out and ref are commonly used, however in was usually left behind, as, while it was originally intended as an alias to const scope, it was made an alias to const when support for scope was introduced (DIP1000).

    DMD v2.092.0 rectified this by adding -preview=in to mean const scope, as it was originally intended, instead of const without the switch.

    However, this didn't really capture the intended meaning of in: the be applied on input parameters. Input parameters are parameters that a function intend to only examine, without modifying it, nor keeping a reference to them around. This is covered by const scope. However, some input parameters can be pretty large, or copying them can have side effects (postblit, copy constructor), hence those should be passed by reference to avoid runtime overhead. Which prompts a new issue: D doesn't support passing rvalues by references. Hence, when designing an API accepting an input parameter, a common practice was to have both an in-accepting overload, and an in ref-accepting one. While this works well for a single parameter, it also suffers from combinatorial explosion.

    This release reworks the meaning of in to properly support all those use cases. in parameters will now be passed by reference when optimal, and will accept rvalue. When using the switch, in ref parameters will also trigger an error.

    Note that the rules for passing by reference are as follow:

    • If the type has an elaborate copy or destruction (postblit, copy constructor, destructor),
    the type is always passed by reference.
    • If the type is not copy-able, it will always be passed by reference.
    • Reference types (dynamic arrays, function pointers, delegates, associative arrays, classes) do not get passed by ref. This allows for covariance on delegates.
    • Otherwise, if the type's size requires it, it will be passed by reference. Currently, types which are over twice the machine word size will be passed by reference, however this is controlled by the backend and can be changed based on the platform's ABI.

  12. Usage of vector types and operations on an unsupported -mcpu= will now error

    Previously, the compiler accepted the following code as being supported by all -mcpu= types on both OSX 32-bit and all 64-bit targets.

    __vector(long[4]) x;    // AVX type
    x += 1;                 // AVX2 operation
    

    In this release, all __vector types and operations now check the current CPU being targeted for, and will issue an error if there is insufficient support.

    This also allows for conditional compilation using __traits(compiles) to probe which operations are supported at compile-time.

    static if (__traits(compiles, long4))
    {
        // Compiled in if `-mcpu=avx` or higher
    }
    
    static if (__traits(compiles, { int4 x; x += 1; }))
    {
        // Compiled in if `-mcpu=baseline` or higher
    }
    
    static if (__traits(compiles, { int4 x; x *= 1; }))
    {
        // Compiled in if `-mcpu=avx` or higher
    }
    
    static if (__traits(compiles, { int8 x; x += 1; }))
    {
        // Compiled in if `-mcpu=avx2` or higher
    }
    

    The following tables describe what minimum -mcpu= level is required.

    Minimum Required -mcpu= for 128-bit Vector Types
    void16byte16ubyte16short8ushort8int4uint4long2ulong2float4double2
    baselinebaselinebaselinebaselinebaselinebaselinebaselinebaselinebaselinebaselinebaseline

    Minimum Required -mcpu= for 128-bit Vector Operators
    Operatorbyte16ubyte16short8ushort8int4uint4long2ulong2float4double2
    +baselinebaselinebaselinebaselinebaselinebaselinebaselinebaselinebaselinebaseline
    -baselinebaselinebaselinebaselinebaselinebaselinebaselinebaselinebaselinebaseline
    *baselinebaselineavxavxbaselinebaseline
    /baselinebaseline
    &baselinebaselinebaselinebaselinebaselinebaselinebaselinebaseline
    |baselinebaselinebaselinebaselinebaselinebaselinebaselinebaseline
    ^baselinebaselinebaselinebaselinebaselinebaselinebaselinebaseline
    +=baselinebaselinebaselinebaselinebaselinebaselinebaselinebaselinebaselinebaseline
    -=baselinebaselinebaselinebaselinebaselinebaselinebaselinebaselinebaselinebaseline
    *=baselinebaselineavxavxbaselinebaseline
    /=baselinebaseline
    &=baselinebaselinebaselinebaselinebaselinebaselinebaselinebaseline
    |=baselinebaselinebaselinebaselinebaselinebaselinebaselinebaseline
    ^=baselinebaselinebaselinebaselinebaselinebaselinebaselinebaseline
    unary~baselinebaselinebaselinebaselinebaselinebaselinebaselinebaseline
    unary+baselinebaselinebaselinebaselinebaselinebaselinebaselinebaselinebaselinebaseline
    unary-baselinebaselinebaselinebaselinebaselinebaselinebaselinebaselinebaselinebaseline

    Minimum Required -mcpu= for 256-bit Vector Types
    void32byte32ubyte32short16ushort16int8uint8long4ulong4float8double4
    avxavxavxavxavxavxavxavxavxavxavx

    Minimum Required -mcpu= for 256-bit Vector Operators
    Operatorbyte32ubyte32short16ushort16int8uint8long4ulong4float8double4
    +avx2avx2avx2avx2avx2avx2avx2avx2avxavx
    -avx2avx2avx2avx2avx2avx2avx2avx2avxavx
    *avx2avx2avx2avx2avxavx
    /avxavx
    &avx2avx2avx2avx2avx2avx2avx2avx2
    |avx2avx2avx2avx2avx2avx2avx2avx2
    ^avx2avx2avx2avx2avx2avx2avx2avx2
    +=avx2avx2avx2avx2avx2avx2avx2avx2avxavx
    -=avx2avx2avx2avx2avx2avx2avx2avx2avxavx
    *=avx2avx2avx2avx2avxavx
    /=avxavx
    &=avx2avx2avx2avx2avx2avx2avx2avx2
    |=avx2avx2avx2avx2avx2avx2avx2avx2
    ^=avx2avx2avx2avx2avx2avx2avx2avx2
    unary~avx2avx2avx2avx2avx2avx2avx2avx2
    unary+baselinebaselinebaselinebaselinebaselinebaselinebaselinebaselinebaselinebaseline
    unary-avx2avx2avx2avx2avx2avx2avx2avx2avxavx

Runtime changes

  1. Equality of arrays of structs is consistent again, as before v2.078

    Since v2.078, some array equality comparisons (e.g., if both arrays are dynamic arrays) have been wrongly using a .tupleof comparison for structs without custom opEquals, basically enforcing -preview=fieldwise for these array comparisons.

    union U
    {
        string s;
    }
    
    void main()
    {
        static immutable from = "from", from2 = "from2";
        U[] a = [{ s : from }];
        U[1] b = [{ s : from2[0..4] }];
        assert(a[0] != b[0]);
        assert(a != b);
        assert(a != b[]); // worked before v2.078, been failing since, now working again
    }
    
  2. core.memory.GC.allocatedInCurrentThread() was added, which makes -profile=gc faster

    The new function core.memory.GC.allocatedInCurrentThread() returns the same as core.memory.GC.stats().allocatedInCurrentThread, but is faster, because it avoids calculating other statistics. It is used for -profile=gc and makes it faster, too.

Installer changes

  1. Installation script now supports get-path <compiler>

    get-path <compiler> has been added as a new action to the install script. This action allows printing information about a compiler binary. The behavior of get-path can be changed with the following additional options:

    • --install install compiler if not found locally
    • --dmd returns the path of a specific compiler executable (DMD-alike interface)
    • --dub returns the path of the DUB executable

    Examples

    curl https://dlang.org/install.sh | bash -s get-path --install
    /home/user/dlang/dmd-2.093.0/linux/bin64/dmd
    

    ~/dlang/install.sh get-path ldc-1.23.0 --install
    /home/user/dlang/ldc-1.23.0/bin/ldc2
    

    ~/dlang/install.sh get-path --dmd ldc --install
    /home/user/dlang/ldc-1.23.0/bin/ldmd2
    

    ~/dlang/install.sh get-path --dub ldc --install
    /home/user/dlang/ldc-1.23.0/bin/dub
    

    ~/dlang/install.sh get-path --dub dub-1.22.0 --install
    /home/user/dlang/dub-1.22.0/dub
    

    ~/dlang/install.sh get-path --dub ldc,dub-1.22.0 --install
    /home/user/dlang/dub-1.22.0/dub
    

    If a compiler installation isn't found and --install has not been passed, an error will be issued.

  2. DMD binary releases are now built with LDC

    Binary releases for Linux, OSX, and FreeBSD are now built with LDC. This follows the switch to LDC as host compiler for Windows releases with 2.091.0.

    Building DMD with LDC should provide a significant speedup of the compiler (20-30%).

    This change comes with the following limitations:

    • no more FreeBSD 32-bit binary releases (no 32-bit LDC host compiler)
    • additional binary tools copied over from previous dmd releases are no longer included (see c0de0295e6b1f9a802bb04a97cca9f06c5b0dccd (optlink still included)) They are still available via https://digitalmars.com/ or from older dmd releases.

Dub changes

  1. 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.

  2. 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"
        ],
    
  3. 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.


List of all bug fixes and enhancements in D 2.095.0:

DMD Compiler regressions

  1. Bugzilla 20608: [REG2.087] Cannot pass tuple.expand to auto ref T... template argument pack
  2. Bugzilla 21272: Overzealous and inconsistent foreach shadowing deprecations for nested functions
  3. Bugzilla 21282: mixin of AliasSeq "cannot alias an expression"
  4. Bugzilla 21285: Delegate covariance broken between 2.092 and 2.094 (git master).
  5. Bugzilla 21294: [REG 2.095]: DMD fails to link since PR11743
  6. Bugzilla 21312: [REG 2.095] Newly triggered is not an lvalue and cannot be modified
  7. Bugzilla 21325: Flags not set for ?: evaluation with floating point operands
  8. Bugzilla 21328: Forwarding static float array element inside a lambda crashes dmd backend
  9. Bugzilla 21357: [REG2.093] postblit aliases old and new struct pointers
  10. Bugzilla 21364: Improperly aligned struct when one member is a GPR and the other is an XMM
  11. Bugzilla 21372: False deprecation raised for templated overloaded struct method

DMD Compiler bugs

  1. Bugzilla 3713: Tail call optimization not enabled with the ?: operator
  2. Bugzilla 8156: Very slow compilation with string-imported file ~100 MiB
  3. Bugzilla 10664: Win64: exception handling does not work with COMDAT folding
  4. Bugzilla 11049: array bounds error uses module file name rather than file name modified by #line directive
  5. Bugzilla 11435: Pushing indirect ref to byte or short can read beyond edge of valid memory
  6. Bugzilla 14708: destructor for temporary not called during stack unwinding
  7. Bugzilla 15909: Duplicate case error reports characters as numbers
  8. Bugzilla 19754: cast() sometimes yields lvalue, sometimes yields rvalue
  9. Bugzilla 19970: [CTFE] 0 ptr is not null
  10. Bugzilla 20195: -preview=nosharedaccess has some access problems
  11. Bugzilla 20324: Calling __traits(getUnitTests) on a template causes compiler segfault
  12. Bugzilla 20604: [ICE] dtoh ICE with nested template structs (and probably most templates
  13. Bugzilla 20652: extern(C++) doesn't seem to mangle the types in core.simd right
  14. Bugzilla 20714: Struct with postblitting member does not call it's copy constructor
  15. Bugzilla 20716: Wrong code/ABI for extern(C++) interface method that returns non-POD
  16. Bugzilla 20916: hard to find where a deprecation comes from
  17. Bugzilla 20965: Implicitly generated postblit overrides disabled copy ctor
  18. Bugzilla 20970: Test Suite Azure Pipelines Windows_LDC_Debug x64-debug-ldc failed due to heisenbug
  19. Bugzilla 21218: dtoh: protection attributes should be emitted to headers
  20. Bugzilla 21227: import(".\file") doesn't work on Windows
  21. Bugzilla 21234: Import expression can read files outside of -J path in case of symlink/hardlink
  22. Bugzilla 21246: Compiler must show mismatching types when functions do not properly override
  23. Bugzilla 21255: "overload alias ... forward declaration" when overload set of imported template functions is passed to alias template parameter
  24. Bugzilla 21271: C++ header generation ignores extern(D) class methods affecting vtable layout
  25. Bugzilla 21283: [C++] Wrong mangling for ref of parameter pack
  26. Bugzilla 21293: dtoh: segfault when encountering opaque enum
  27. Bugzilla 21299: [LINK] undefined reference to dmd.root.stringtable.StringValue!(Type).StringValue.lstring()
  28. Bugzilla 21300: C++ header generation produce nonsense code on enum with enum as parent
  29. Bugzilla 21320: @live mistakes borrowed pointer for owner in parameter
  30. Bugzilla 21330: __traits(getUnitTests) should include unittests from anonymous mixins
  31. Bugzilla 21353: 'With()' statement ignores symbol visibility in some cases.
  32. Bugzilla 21398: Name clash between import and method triggers a segfault
  33. Bugzilla 21424: Variable is incremented twice
  34. Bugzilla 21464: Superfluous module-level import affects attribute inference
  35. Bugzilla 21479: ternary operator returns wrong val with ref return
  36. Bugzilla 21514: [ICE] cod1.d:4015: Assertion `retregs || !*pretregs' failed with -m32

DMD Compiler enhancements

  1. Bugzilla 8044: Print names, not casted values when using enum template parameter
  2. Bugzilla 21204: Error in generated copy constructor gives confusing message
  3. Bugzilla 21259: struct initialization with deprecated fields should issue deprecation warnings
  4. Bugzilla 21275: Overload resolution bypasses private access
  5. Bugzilla 21340: extern(C++,(emptyTuple)) should result in no namespace not an error

Phobos bugs

  1. Bugzilla 13930: std.concurrency can't send immutable AA to another thread
  2. Bugzilla 15425: std.traits.hasIndirections fails to recognize nested structs
  3. Bugzilla 18789: std.stdio messes up UTF conversions on output
  4. Bugzilla 18801: std.stdio.File doesn't work with MSVCRT's UTF-8 mode
  5. Bugzilla 20924: std.numeric.gcd cannot be used with const BigInt
  6. Bugzilla 21231: Unreachable warning for empty struct in VariantN with preview=fieldwise
  7. Bugzilla 21249: clamp() is not stable and is not constrained
  8. Bugzilla 21253: Can't compile Variant.visit!(...) with generic function
  9. Bugzilla 21256: Segfault with Appender!string.init.toString()
  10. Bugzilla 21296: std.variant.Variant cannot be initialized with immutable AA
  11. Bugzilla 21302: std.uni's documentation contains a dead link to its source file
  12. Bugzilla 21337: join can iterates ranges multiple times
  13. Bugzilla 21383: std.random.uniform!T(urng) when T is dchar disregards urng and always uses a thread-local random
  14. Bugzilla 21384: std.random.uniform!T() and std.random.uniform!T(urng) when T is dchar with any qualifiers can exceed dchar.max
  15. Bugzilla 21452: isCallable erroneously returns false on function templates

Phobos enhancements

  1. Bugzilla 6484: compose can't take multi arg functions
  2. Bugzilla 20869: std.algorithm.mutation : move is overly trusting of opPostMove
  3. Bugzilla 20980: std.bigint.BigInt: special case x & non-negative int to avoid unnecessary allocation
  4. Bugzilla 21233: std.conv.parse doesn't report the number of characters consumed
  5. Bugzilla 21237: isLvalueAssignable and isRvalueAssignable should be public
  6. Bugzilla 21347: std.functional.adjoin should work in BetterC
  7. Bugzilla 21407: Make std.math.NaN and std.math.getNaNPayload work in CTFE
  8. Bugzilla 21408: Make std.math.nextUp and nextDown and nextafter work in CTFE for extended-precision real
  9. Bugzilla 21430: Add const to front, save, & length properties of range returned by std.bitmanip.bitsSet

Druntime bugs

  1. Bugzilla 14226: invalid Runtime.traceHandler setup
  2. Bugzilla 21315: TypeInfo_StaticArray.swap is broken
  3. Bugzilla 21323: (64-bit Windows only) core.stdcpp.vector could not have core.stdcpp.vector as element
  4. Bugzilla 21344: core.stdcpp.string.basic_string does not implement opEquals
  5. Bugzilla 21346: core.stdcpp.vector.vector does not implement opEquals
  6. Bugzilla 21365: TypeInfo.swap must not allow reachable memory to be freed if interrupted by a garbage collection pass
  7. Bugzilla 21421: core.stdcpp.new_.cpp_delete does not work with classes
  8. Bugzilla 21441: TypeInfo_Enum.destroy and TypeInfo_Enum.postblit not calling destroy and postblit of base type
  9. Bugzilla 21442: Calling AA.remove from a destructor might lead to InvalidMemoryOperationError
  10. Bugzilla 21468: Inscrutable template error when core.stdcpp.vector of a struct with a core.stdcpp.vector field is referenced before the struct's definition
  11. Bugzilla 21484: Infinite recursion in core.memory : GC.{get,set,clr}Attr(const scope void*...)

Druntime enhancements

  1. Bugzilla 21030: Reduce template function instantiations related to array equality
  2. Bugzilla 21417: core.stdcpp.new_.cpp_delete unnecessarily requires destruction to be @nogc
  3. Bugzilla 21426: dup, idup for arrays plus keys, values for associative arrays: call postblits directly instead of via TypeInfo function pointer

dlang.org bugs

  1. Bugzilla 21189: Plain Old Data and copy constructors
  2. Bugzilla 21273: [spec] Inexistent contrast for shell snippets make them unreadable (CSS)

Installer bugs

  1. Bugzilla 21433: "bash: line 952: --list-keys: command not found" when running install.sh on Catalina
  2. Bugzilla 21439: install.sh is disabled for LDC on FreeBSD

Contributors to this release (63)

A huge thanks goes to all the awesome people who made this release possible.

previous version: 2.094.0