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

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


2.101.0 comes with 17 major changes and 229 fixed Bugzilla issues. A huge thanks goes to the 78 contributors who made 2.101.0 possible.

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

Compiler changes

  1. 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`
    }
    
  2. 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

  3. 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;
    }
    
  4. 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.

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

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

  7. 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.
    
  8. 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;
        }
    }
    
  9. 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
    }
    
  10. 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 https://github.com/dlang/DIPs/blob/master/DIPs/accepted/DIP1038.md, DIP 1038.

  11. 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]);
    
  12. 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.

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

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

  2. 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();
    }
    
  3. Zlib updated to 1.2.12

    The bundled zlib has been updated to version 1.2.12.

Tools changes

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


List of all bug fixes and enhancements in D 2.101.0:

DMD Compiler regression fixes

  1. Bugzilla 20809: return statement might access memory from destructed temporary
  2. Bugzilla 21197: Wrong lifetime inference with DIP1000 in dmd 2.093.0
  3. Bugzilla 23019: Missing filename when -of points to an existing directory
  4. Bugzilla 23076: SIMD assert fail with -inline -O converting float to short
  5. Bugzilla 23100: empty array literal passed to scope param not 'falsey' anymore
  6. Bugzilla 23148: Missing invariant symbol with static library when template function declares struct with destructor and invariant that instantiates template with lambda, also main has a lambda
  7. Bugzilla 23170: Array literal passed to map in lambda, then returned from nested function, is memory corrupted
  8. Bugzilla 23172: [REG2.100] Wrong cast inserted for ternary operator and non-int enums
  9. Bugzilla 23181: [REG 2.099] AssertError@src/dmd/e2ir.d(6094): Trying reference _d_arraysetctor
  10. Bugzilla 23247: Deprecation: argument 0.0L for format specification "%La" must be double, not real
  11. Bugzilla 23271: goto skips declaration of variable bugred.A.test.__appendtmp4
  12. Bugzilla 23291: Members of arrays of shared classes cannot be compared
  13. Bugzilla 23337: Wrongly elided postblit/copy ctor for array construction (_d_arrayctor lowering)
  14. Bugzilla 23386: Segfault on enum member UDA inside template
  15. Bugzilla 23431: [REG 2.101.0][ICE] Segmentation fault in Dsymbol::toParent() (this=0x0) at dmd/dsymbol.d:561
  16. Bugzilla 23433: [REG 2.081][ICE] Segmentation fault in dmd.blockexit.checkThrow at at src/dmd/blockexit.d:557
  17. Bugzilla 23439: [REG 2.098] Error: CTFE internal error: literal 'assert(false, "Accessed expression of type noreturn")'

DMD Compiler bug fixes

  1. Bugzilla 2: Hook up new dmd command line arguments
  2. Bugzilla 9161: Linker error on linux if struct has @disabled ~this();
  3. Bugzilla 13123: Disallow throwing contracts for nothrow functions
  4. Bugzilla 13732: Regular templates can use "template this", and they allow any type to be passed
  5. Bugzilla 14694: Functions nested within functions need their body in the generated .di file
  6. Bugzilla 15525: SEGV running semantic analysis on non-root decl that has errors.
  7. Bugzilla 16575: [ICE] extern(C++) function with D specific types
  8. Bugzilla 17764: [scope][DIP1000] Escape checker defeated by composition transformations
  9. Bugzilla 18973: @disable on const toHash causes unresolved symbol error
  10. Bugzilla 19178: Static initialization of 2d static arrays in structs produces garbage or doesn't compile sometimes
  11. Bugzilla 19285: false positive GC inferred
  12. Bugzilla 20143: ICE in optimizer on real 0/0 returned as double
  13. Bugzilla 20365: Copy constructor not invoked on static arrays of structs but the postblit works
  14. Bugzilla 20823: [DIP 1000] un-@safe code fails with dip1000
  15. Bugzilla 21314: ICE on extern(c++) static class variables
  16. Bugzilla 21416: betterC mode program with C++ interface fails to link
  17. Bugzilla 21432: [CTFE] Cannot declare enum array in function scope
  18. Bugzilla 21443: scope (failure) with a return breaks safety
  19. Bugzilla 21477: TypeInfo errors in betterC are cryptic
  20. Bugzilla 21676: [ICE][SIMD] DMD crashing with SIMD + optimizations + inlining
  21. Bugzilla 21723: Linker error: two module static library, main compiled inline, invariant that defines a function, type alias, and an alias lambda
  22. Bugzilla 21956: ice on foreach over an AA of noreturn
  23. Bugzilla 22108: DIP1000 parameter mistakenly interpreted as return scope instead of scope
  24. Bugzilla 22134: Deprecate returning a discarded void value from a function
  25. Bugzilla 22351: extern(C++) function contravariant in D, but not C++
  26. Bugzilla 22390: Compiler crash when iterating empty array of bottom types
  27. Bugzilla 22429: importC: designator-list not supported yet
  28. Bugzilla 22610: ImportC: 3 extra initializer(s) for struct __tag21
  29. Bugzilla 22626: Can't use synchronized member functions with -nosharedaccess
  30. Bugzilla 22652: importC: Braceless initializer of nested struct is rejected.
  31. Bugzilla 22664: Disassembler mistakes rdtscp for invlpg ECX
  32. Bugzilla 22674: ImportC: compatible types declared in different translation units are not treated equivalent in D.
  33. Bugzilla 22680: @safe hole with destructors
  34. Bugzilla 22706: Bad error on explicit instantiation of function template with auto ref parameter
  35. Bugzilla 22724: ImportC: VC extension __pragma(pack) is not implemented
  36. Bugzilla 22784: pragma(printf) applies to nested functions
  37. Bugzilla 22865: __traits(compiles) affects inferrence of attributes
  38. Bugzilla 22875: importC: cannot assign const typedef with pointers to non-const one
  39. Bugzilla 22925: importC: multi-dimensional array is not a static and cannot have static initializer
  40. Bugzilla 22952: Compiler fails to find package.d modules via -mv map
  41. Bugzilla 22973: importC: sizeof with array and pointer access gives array type has incomplete element type
  42. Bugzilla 23006: importC: dmd segfaults on static initializer for multi-dimensional array inside struct
  43. Bugzilla 23007: importC: dmd segfaults for extra braces in array initializer
  44. Bugzilla 23009: [CODEGEN][SIMD] SIMD + optimizations + inlining + double
  45. Bugzilla 23010: mixed in aliaseqs used as type dont initualize
  46. Bugzilla 23012: importC: asm label to set symbol name not applied from forward declaration
  47. Bugzilla 23018: importC: syntax error for sizeof with postfix operator on parenthesized expression
  48. Bugzilla 23022: [dip1000] typesafe variadic parameter should not infer return
  49. Bugzilla 23027: ImportC: Array of struct is not a static and cannot have static initializer
  50. Bugzilla 23030: importC: errors using typedef struct after first use as const
  51. Bugzilla 23037: importC: type with only type-qualifier doesn't work
  52. Bugzilla 23038: importC: sizeof inside struct has struct members in scope
  53. Bugzilla 23039: importC: declaration with array length has itself in scope
  54. Bugzilla 23042: -betterC still includes RTInfo
  55. Bugzilla 23044: importC: comma expression with function call parsed as declaration
  56. Bugzilla 23045: importC: casted function type is missing extern(C)
  57. Bugzilla 23047: [ICE][SIMD] Do not SROA vector types
  58. Bugzilla 23050: Incorrect disassembly of code with -vasm and 0xBE and 0xBF opcodes
  59. Bugzilla 23054: importC: struct compound-literal assigned by pointer has wrong storage duration
  60. Bugzilla 23056: importC: dmd asserts for missing return statement in CTFE function
  61. Bugzilla 23057: importC: dmd segfault on invalid syntax
  62. Bugzilla 23063: It is possible to return a noreturn value
  63. Bugzilla 23068: [betterC] BetterC does not respect -checkaction=halt
  64. Bugzilla 23073: [dip1000] scope inference from pure doesn't consider self-assignment
  65. Bugzilla 23082: stringof of template alias overloaded with function accessed by trait: segfault.
  66. Bugzilla 23088: spurious case of "expression has no effect"
  67. Bugzilla 23102: pinholeopt, "Conditional jump or move depends on uninitialised value(s)"
  68. Bugzilla 23105: __trait(getMember) and mixin() of the same code as a string behave differently
  69. Bugzilla 23108: ICE: AssertError@src/dmd/clone.d(567): Assertion failure
  70. Bugzilla 23109: ICE: AssertError@src/dmd/dclass.d(449): Assertion failure
  71. Bugzilla 23112: code passes @nogc, allocates anyway
  72. Bugzilla 23114: Can't use noreturn operand in arithmetic expression
  73. Bugzilla 23120: dmd illegal instruction throw expression
  74. Bugzilla 23123: -vasm wrong result for cmpxchg16b
  75. Bugzilla 23135: Covariance rules for C++ member functions mismatch D
  76. Bugzilla 23138: Overrides of member functions of an inherited class ignores attribute "downcast"
  77. Bugzilla 23159: [betterC] scope(failure) use in betterC gives confusing error
  78. Bugzilla 23166: seg fault when compiling with -inline
  79. Bugzilla 23167: inaccurate diagnostic for internal tuple bound violation
  80. Bugzilla 23168: [DIP1000] return scope wrongly rewritten for structs with no indirections
  81. Bugzilla 23169: [DIP1000] Mangling does not distinguish return and return scope
  82. Bugzilla 23173: "Error: signed integer overflow" for compiler generated string of long.min
  83. Bugzilla 23174: Can't alias tuple when it's part of dot expression following a struct literal
  84. Bugzilla 23176: -vasm misses immediates for some SSE2 instructions
  85. Bugzilla 23178: Unknown error using alias to __traits evaluated as expression
  86. Bugzilla 23192: Can't iterate aggregate fields with static foreach inside a member function
  87. Bugzilla 23205: Can't declare mixin template inside a function
  88. Bugzilla 23206: ImportC: __declspec(noreturn) does not compile
  89. Bugzilla 23207: dmd hangs compiling druntime/src/core/stdc/errno.c
  90. Bugzilla 23213: ImportC - variable length array does not compile
  91. Bugzilla 23214: ImportC: typedef with unsigned types does not compile
  92. Bugzilla 23217: ImportC: extra initializer(s) error for array of structs
  93. Bugzilla 23222: vcg-ast segfaults on aliases to parent module
  94. Bugzilla 23223: Aliases to modules print the modules contents into ast dump
  95. Bugzilla 23224: ImportC: memory model switch is not passed to C preprocessor
  96. Bugzilla 23225: OpenBSD: cpp invocation cannot find files
  97. Bugzilla 23230: cannot implicitly convert expression define of type char[7] to char
  98. Bugzilla 23234: Delegate literal with inferred return value that requires following alias-this uses class cast instead.
  99. Bugzilla 23235: [DIP1000] typesafe variadic parameters should automatically be scope
  100. Bugzilla 23236: can't initialize a @mustuse member in constructor
  101. Bugzilla 23241: __traits getMember breaks compilation when hit an alias
  102. Bugzilla 23249: Deprecation: argument &p for format specification "%m" must be char*, not char**
  103. Bugzilla 23251: Deprecation: format specifier "%[a-z]" is invalid
  104. Bugzilla 23252: Deprecation: format specifier "%[]]" is invalid
  105. Bugzilla 23254: Deprecation: format specifier "%S" and "%C" are invalid
  106. Bugzilla 23256: must supply -mscrtlib manually when compiling for Windows
  107. Bugzilla 23258: ICE on SumType of two arrays of classes
  108. Bugzilla 23262: typesafe variadic function parameter cannot infer return
  109. Bugzilla 23293: ImportC: _Bool bit fields layout does not match gcc
  110. Bugzilla 23308: Can't resolve overload of varargs function if one parameter is the result of a ternary expression
  111. Bugzilla 23327: [ICE] SEGV in AssocArray!(Identifier, Dsymbol).AssocArray.opIndex(const(Identifier)) at src/dmd/root/aav.d:313
  112. Bugzilla 23331: implicit cast from noreturn crashes compiler in various ways
  113. Bugzilla 23338: braceless subarray initalizers for struct fields fails
  114. Bugzilla 23340: std.path: expandTilde erroneously raises onOutOfMemory on failed getpwam_r()
  115. Bugzilla 23342: ImportC: Array compound literals use the GC
  116. Bugzilla 23343: ImportC: functions declared with asm label to set symbol name gets extra underscore prepended
  117. Bugzilla 23345: ImportC: out of order designated initializers initialize to wrong value
  118. Bugzilla 23346: ImportC: pragma pack is not popped
  119. Bugzilla 23347: ImportC: pragma pack causes asm label to set symbol name to be ignored
  120. Bugzilla 23348: not handling braceless sub structs in initializers
  121. Bugzilla 23351: A bunch of Mayonix's dmd-segfaulting programs
  122. Bugzilla 23355: invalid template parameter loses error location in some cases
  123. Bugzilla 23357: ImportC: compatible types with definitions leads to redeclaration error when used from D.
  124. Bugzilla 23368: Throwing a null exception at compile time crashes the compiler
  125. Bugzilla 23379: Cast of expressions with type noreturn result in ice
  126. Bugzilla 23380: [dip1000] class parameter should not be treated as ref qua lifetime
  127. Bugzilla 23406: [seg fault] enums can cause compile time seg faults with assignments using alias this
  128. Bugzilla 23461: dmd: src/dmd/backend/cod1.d:2037: Assertion false failed

DMD Compiler enhancements

  1. Bugzilla 7372: Error provides too little information to diagnose the problem (error: undefined identifier)
  2. Bugzilla 14690: pragma(inline, true) functions must have their bodies emitted in the .di file
  3. Bugzilla 16701: Remove Restriction of "package.d" Source File Module Forced to All Lowercase
  4. Bugzilla 17575: named mixin template error message
  5. Bugzilla 21243: Allow lambdas to return auto ref
  6. Bugzilla 21673: [SIMD][Win64] Wrong codegen for _mm_move_ss
  7. Bugzilla 22911: dtoh: make include directives sorted for generated headers
  8. Bugzilla 23079: [dip1000] be more lenient when taking address of ref return
  9. Bugzilla 23141: Improve -release switch description
  10. Bugzilla 23142: Scope should not apply to unittests
  11. Bugzilla 23143: ImportC: forward enum declarations need to be supported
  12. Bugzilla 23165: lambda functions are not inlined
  13. Bugzilla 23191: [dip1000] scope parameter can be returned in @system code
  14. Bugzilla 23216: Better Error Message For foreach_reverse Without Bidirectional Range
  15. Bugzilla 23284: Enhance floating point not representable error message
  16. Bugzilla 23295: [dip1000] explain why scope inference failed
  17. Bugzilla 23306: @disable new() ought not disable scope A = new A
  18. Bugzilla 23369: Confusing error message for duplicate import
  19. Bugzilla 23376: Allow multi-code-point HTML entities
  20. Bugzilla 23384: Suggest calling matching base class method when hidden

Phobos regression fixes

  1. Bugzilla 23132: "cannot access frame pointer" comparing two ranges for equality from v2.099.0
  2. Bugzilla 23140: Array!T where T is a shared class no longer works
  3. Bugzilla 23238: Cannot write a const Nullable(T, T nullValue)
  4. Bugzilla 23245: [REG 2.099] std.format ignores non-const toString method of static array element
  5. Bugzilla 23246: [REG 2.099] std.format ignores non-const toString method of associative array value
  6. Bugzilla 23268: clamp no longer accepts shorts
  7. Bugzilla 23400: [REG 2.099] Can't format enum value whose base type has non-const opEquals

Phobos bug fixes

  1. Bugzilla 14543: std.algorithm.searching.until does not handle range sentinels nicely
  2. Bugzilla 16034: map should be possible with a reference only
  3. Bugzilla 16232: std.experimental.logger.core.sharedLog isn't thread-safe
  4. Bugzilla 18631: std.random.choice does not work with const arrays
  5. Bugzilla 22637: std.conv to!double and parse!double dont throw on under/overflow
  6. Bugzilla 23182: Can't assign struct with opAssign to SumType in CTFE
  7. Bugzilla 23196: File constructor fails to preallocate oom error, uses exception instead
  8. Bugzilla 23215: calling std.file.remove with null string segfaults in strlen
  9. Bugzilla 23250: Unicode regional indicators are not paired correctly
  10. Bugzilla 23270: std.random.dice is poorly documented
  11. Bugzilla 23288: zlib: Fix potential buffer overflow
  12. Bugzilla 23324: Incorrect source link in std.format docs
  13. Bugzilla 23350: Nondeterministic test failure in std.concurrency
  14. Bugzilla 23362: Permutations should be a forward range

Phobos enhancements

  1. Bugzilla 13893: "rawRead must take a non-empty buffer"
  2. Bugzilla 18735: all versions of find and canfind should identify usage of predicate
  3. Bugzilla 21000: -preview=nosharedaccess precludes use of stdin,stdout,stderr
  4. Bugzilla 23101: [std.sumtype] canMatch does not account ref
  5. Bugzilla 23298: std.string wrap wraps early
  6. Bugzilla 23333: DList range can be @nogc
  7. Bugzilla 23370: std.base64 can have more @nogc functions

Druntime bug fixes

  1. Bugzilla 15939: GC.collect causes deadlock in multi-threaded environment
  2. Bugzilla 23060: MacOS: core.sys.posix.sys.socket missing some definitions
  3. Bugzilla 23065: importC: __builtin_expect should use c_long
  4. Bugzilla 23067: importC: offsetof macro assumes size_t is defined
  5. Bugzilla 23129: object.destroy doesn't consider initialize=false on D classes
  6. Bugzilla 23228: OpenBSD: No SIGRTMIN or SIGRTMAX
  7. Bugzilla 23302: std.algorithm.comparison.predSwitch producing SwitchError with error message as the filename

Druntime enhancements

  1. Bugzilla 23456: OpenBSD: Add waitid support

dlang.org bug fixes

  1. Bugzilla 14542: Table of contents in specification PDF is broken
  2. Bugzilla 15379: "final" attribute on function parameter
  3. Bugzilla 15476: DDOC_UNDEFINED_MACRO is undocumented
  4. Bugzilla 17324: Floating point 1/(1/x) > 0 if x > 0 not generally true
  5. Bugzilla 17514: "positive" -> "nonnegative"
  6. Bugzilla 17623: Unexpected failure of an assertion on empty strings
  7. Bugzilla 18496: Complement expressions now actually int promote
  8. Bugzilla 18855: Behavior of Anonymous Union is Undocumented
  9. Bugzilla 18887: inout badly described
  10. Bugzilla 19869: FunctionLiteral allows incorrect forms
  11. Bugzilla 21188: Anonymous structs - not described
  12. Bugzilla 21279: cast expression between integer types is not defined
  13. Bugzilla 21781: [Oh No! Page Not Found] Links to core libs from Better C
  14. Bugzilla 22237: AA.update is underspecified
  15. Bugzilla 22835: Undocumented type specializations of is-expression
  16. Bugzilla 23062: Function/delegate inference example does not compile
  17. Bugzilla 23194: Add our company to the list of D firms
  18. Bugzilla 23237: dmd 2.100.1 download link error.
  19. Bugzilla 23276: DOC: ">" instead of ">" in dmd-windows.html
  20. Bugzilla 23296: Value Range Propagation not documented
  21. Bugzilla 23314: Language spec falsely states that struct field invariants are checked
  22. Bugzilla 23325: Assigning dynamic array to static array not documented
  23. Bugzilla 23358: Link unusable due to space insertion

dlang.org enhancements

  1. Bugzilla 15286: is(typeof(symbol))
  2. Bugzilla 19036: .tupleof order guarantee
  3. Bugzilla 22141: Property .capacity is not listed in the array properties section
  4. Bugzilla 23186: wchar/dchar do not have their endianess defined
  5. Bugzilla 23359: Rename InOut to ParameterStorageClass

Contributors to this release (78)

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

previous version: 2.100.0