Change Log: 2.064
Download D 2.064
released November 5, 2013
Language Enhancements
- Introduced the ability to define and import package modules.
- Introduced a new eponymous template syntax.
- Postfix expressions are now allowed after a new expression.
- Implicit Function Template Instantiation now supports enclosing type/scope deduction.
- DDoc can now warn the user when the symbol names in a ddoc comment do not match the actual code.
- Strings literals which are sliced are now implicitly convertible to a char pointer.
- Templated and non-template functions can now be overloaded against each other.
- Cross-module template declarations can now make an overload set.
Compiler Changes
Compiler Enhancements
Phobos enhancements
- Introduced the structural typesafe conversion functions wrap and unwrap.
- std.conv.to and std.string.format are now pure functions.
- Introduced generic strip/stripLeft/stripRight functions.
- Introduced an overload of std.string.translate which can take a buffer, avoiding the need for implicit memory allocations.
- Introduced the thisExePath function to retrieve the executable path of the currently running process.
- New API for std.regex match/replace functions.
- Compile-time std.regex.ctRegex now supports lookaround just like run-time one.
List of all bug fixes and enhancements in D 2.064.
Language Enhancements
- Introduced the ability to define and import package modules.
The new package import feature allows you to define a library module which has the purpose of publicly importing any other modules in that library. The user can then simply import this one module and use the library as if the user import all the modules at once. For example:
libweb/client.d:
module libweb.client; void runClient() { }
libweb/server.d:
module libweb.server; void runServer() { }
libweb/package.d:
module libweb; public import libweb.client; public import libweb.server;
Notice that the package module must always have the file name package.d. The module name is the qualified name of the package. The user then uses the standard import syntax to import a package module, simply using the module declaration name to import the package:
test.d:
module test; import libweb; void main() { startServer(); startClient(); }
The following is an example of a package module of a sub-package:
libweb/utils/package.d:
module libweb.utils; // fully qualified name of the package, not just "utils"! // publicly import modules from within the 'libweb.utils' package. public import libweb.utils.conv; public import libweb.utils.text;
To import this subpackage, use the standard module import declaration:
test.d:
module test; import libweb.utils; void main() { }
Rationale:
Until now public import modules were implementable, but only by convention. The user would typically have to import a specific module specified by the library author, e.g. libweb.all or libweb._. Introducing the package import feature standardizes this common convention of library authors
- Introduced a new eponymous template syntax.
The new eponymous template syntax allows you to write shorter templates without having to explicitly define and repeat the template name when using traditional eponymous templates. For example, before 2.064 eponymous templates were written and used like the following:
template Tuple(T...) { alias Tuple = T; } template isIntOrFloat(T) { static if (is(T == int) || is(T == float)) enum isIntOrFloat = true; else enum isIntOrFloat = false; } void main() { alias Tup = Tuple!(int, float, string); static assert(isIntOrFloat!(Tup[0])); // int is an int or a float static assert(isIntOrFloat!(Tup[1])); // float is an int or a float static assert(!isIntOrFloat!(Tup[2])); // string is neither an int nor a float }
With the new eponymous syntax, the implementation code becomes much simpler:
alias Tuple(T...) = T; enum isIntOrFloat(T) = is(T == int) || is(T == float); void main() { alias Tup = Tuple!(int, float, string); static assert(isIntOrFloat!(Tup[0])); // int is an int or a float static assert(isIntOrFloat!(Tup[1])); // float is an int or a float static assert(!isIntOrFloat!(Tup[2])); // string is neither an int nor a float }
Notice how you need to start the declaration of such a template with an alias or enum, rather than starting it with the keyword template.
Limitations:
Currently you cannot define template constraints for these types of templates. This limitation may be lifted in a future release.
- Postfix expressions are now allowed after a new expression.
Before 2.064, you could not both instantiate a new class and call a method or access a property of the object without having to wrap the new expression in parentheses:
class Server { this(string[] args) { } void run() { } } void main(string[] args) { (new Server(args)).run(); }
In 2.064 this limitation has been lifted, allowing you to write the code as follows:
class Server { this(string[] args) { } void run() { } } void main(string[] args) { new Server(args).run(); }
Note: When instantiating a class with the default constructor, you must insert an empty set of parentheses before accessing a field or calling a method on the object:
class Server { this() { } void run() { } } void main() { new Server.run(); // error new Server().run(); // ok }
- Implicit Function Template Instantiation now supports enclosing type/scope deduction:
- DDoc can now warn the user when the symbol names in a ddoc comment do not match the actual code:
- Strings literals which are sliced are now implicitly convertible to a char pointer:
- Templated and non-template functions can now be overloaded against each other:
- Cross-module template declarations can now make an overload set:
IFTI has been improved, allowing you to write code such as the following:
struct A { struct Foo { } } struct B { struct Foo { } } /** Templated function which expects the second argument to be of type 'Foo, which is a nested in the type 'T'. */ void call(T)(T t, T.Foo foo) { } void main() { auto a = A(); auto a_f = A.Foo(); call(a, a_f); // ok auto b = B(); auto b_f = B.Foo(); call(b, b_f); // ok call(a, b_f); // fails: b_f is typed as B.Foo, not A.Foo }
This IFTI feature also allows you to retrieve the module of a symbol, by using an alias template parameter, rather than a type one:
module my_module; struct A { struct B { } } void foo(alias Mod)(Mod.A, Mod.A.B) { // 'Mod' is deduced to be the module 'my_module' which encloses the struct 'A' static assert(__traits(isSame, Mod, my_module)); } void main() { A a; A.B b; foo(a, b); // ok }
Here is an example documented function, where the parameter names are wrongly documented:
/** This is the sum function. params: x = The first parameter y = The second parameter */ int sum(int a, int b) { return a + b; }
Generating the documentation with warnings enabled will emit the following:
dmd -D -c -w test.d
test.d(8): Warning: Ddoc: function declaration has no parameter 'x' test.d(8): Warning: Ddoc: function declaration has no parameter 'y'
This feature can help ensure that the documentation for library code is always kept up-to-date.
Note: Remember to use the -w switch when building the documentation with the -D switch in order to enable these warnings.
To help ease interacting with C libraries which expect strings as null-terminated pointers, slicing string literals (not variables!) will now allow the implicit conversion to such a pointer:
extern(C) void call(const(char)* str) { } void main() { const(char)* abc = "abc"; call(abc); // already previously allowed const(char)* ab = "abc"[0 .. 2]; call(ab); // allowed in 2.064 }
auto foo(int n) { return 1; } auto foo(T)(T t) { return 2; } void main() { assert(foo(100) == 1); assert(foo("a") == 2); // Integer literal 10L can be converted to int without loss of precisions. // Then the call matches to foo(int n). assert(foo(10L) == 1); // A runtime variable 'num' typed long is not implicitly convertible to int. // Then the call matches to foo(T)(T t). long num = 10L; assert(foo(num) == 2); }
Template declarations are now overloadable just like regular function declarations. Templates with matching names from multiple modules will introduce an overload set:
module a; template Traits(T) if (is(T == double)) { enum Traits = "abc"; } auto func(T, A...)(A args) if (is(T == double)) { return 1; }
module b; template Traits(T) if (is(T == string)) { enum Traits = "def"; } auto func(T, A...)(A args) if (is(T == string)) { return 2; }
module c; import a, b; static assert(Traits!double == "abc"); // matches to a.Traits static assert(Traits!string == "def"); // matches to b.Traits void main() { assert(func!double(1, "msg") == 1); // matches to a.func(T, A...) assert(func!string(1, "msg") == 2); // matches to b.func(T, A...) }
Limitations:
Merging template overload sets by using an alias declaration is currently not supported. The limitation will be lifted in a future release.
Compiler Changes
- Allow printing dependencies to stdout for tooling support:
You can now use the -deps switch without having to specify a filename. The dependencies will then be printed to standard output, allowing both users and tools to introspect the dependencies in the output.
The types of dependencies which are printed out are as follows:
depsImport: Module imports found (same as -deps=file output, except prefixed with depsImport)
depsVersion: Versions (except standard ones and ones set in the module itself)
depsFile: String imports found, e.g. string x = import("foo.txt");
depsLib: Libraries specified with a pragma(lib) statement
depsDebug: Any debug() statements found (except the ones set in the module itself)
Compiler Enhancements
- Introduced the getUnitTests trait for retrieval and custom execution of unittests:
- Introduced the getVirtualIndex trait to get the index of a virtual function:
- Introduced the isOverrideFunction trait which indicates whether or not a function is overriding:
With the new getUnitTests trait you can retrieve all unittest in a module or an aggregate, and then run the tests manually. Here's an example of implementing a custom unittest running routine which prints out some additional statistics:
import core.runtime; import core.exception; import std.stdio; shared static this() { // this overrides the default D runtime unittest runner function, // since we're providing a __traits-based one in our main function. Runtime.moduleUnitTester = { return true; }; } unittest { assert(1); // passes. } unittest { assert(0); // fails. } unittest { assert(1); // passes. } void main() { Throwable[] errors; // collect all thrown exceptions. size_t passCount; // count the number of unittests which pass. // iterate over each unittest (this is a tuple). foreach (test; __traits(getUnitTests, my_module)) { try { test(); passCount++; } catch (Throwable error) { errors ~= error; } } // print out the errors or the statistics. if (errors.length) { writeln("Some unittests failed:\n"); foreach (error; errors) writeln(error); } else { writefln("All unittests passed. Passed unittest count: %s", passCount); } }
Note: You must compile with the -unittest flag to be able to retrieve the unittests.
Note: By default the D runtime provides its own unittest execution function. If you want to avoid it from being invoked at runtime (before the main function is called) you need to set a custom one by assigning to Runtime.moduleUnitTester in the module constructor. The one used in the above test-case simply returns true, which allows the main function to be called.
Note: The getUnitTests trait is not recursive. This means that calling it on a module will not retrieve unittests which are nested in aggregates in that module.
You can use this trait to get the index of a virtual method in the virtual method table:
class C { void foo() { } void bar() { } } class D : C { void doo() { } void doo(int) { } void doo(double) { } } void main() { /** Note that each class implicitly inherits from the Object class, so the following will most likely not begin with index 0. */ pragma(msg, __traits(getVirtualIndex, D.foo)); pragma(msg, __traits(getVirtualIndex, D.bar)); /** When dealing with overloads you can use the getOverloads trait to index into a specific method */ pragma(msg, __traits(getVirtualIndex, __traits(getOverloads, D, "doo")[0])); pragma(msg, __traits(getVirtualIndex, __traits(getOverloads, D, "doo")[1])); pragma(msg, __traits(getVirtualIndex, __traits(getOverloads, D, "doo")[2])); }
class Base { void foo() { } } class Foo : Base { override void foo() { } void bar() { } } static assert (__traits(isOverrideFunction, Base.foo) == false); static assert (__traits(isOverrideFunction, Foo.foo) == true); static assert (__traits(isOverrideFunction, Foo.bar) == false);
Phobos enhancements
- Introduced the structural typesafe conversion functions wrap and unwrap:
- std.conv.to and std.string.format are now pure functions:
- Introduced generic strip/stripLeft/stripRight functions:
- Introduced an overload of std.string.translate which can take a buffer, avoiding the need for implicit memory allocations:
- Introduced the thisExePath function to retrieve the executable path of the currently running process:
- New API for std.regex match/replace functions:
- Compile-time std.regex.ctRegex now supports lookaround just like run-time one:
Sometimes you may want your class to be usable with a function which expects a specific interface argument type, but you do not necessarily want to edit the class to inherit that interface. The class could also be implemented in another library for which you do not have the source code, which means you wouldn't be able to edit the inheritance list of that class.
The new wrap function allows you to perform a structural cast, allowing a class object to act as if it were an object of another type. For example (note: for now please pass the -allinst flag to dmd when compiling):
import std.typecons; interface IDrawable { void drawLine(int x1, int y1, int x2, int y2); } class ImageDraw // note: it does not inherit IDrawable. { void drawLine(int x1, int y1, int x2, int y2) { } } /** Draw a rectangle outline. */ void drawRect(IDrawable draw) { draw.drawLine( 0, 0, 100, 0); draw.drawLine(100, 0, 100, 100); draw.drawLine( 0, 100, 100, 100); draw.drawLine( 0, 0, 0, 100); } void main() { auto imageDraw = new ImageDraw(); drawRect(imageDraw); // error: can't call this, ImageDraw is not an IDrawable. // perform a structural cast. IDrawable i = wrap!IDrawable(imageDraw); drawRect(i); // and now imageDraw can act as an IDrawable. }
The wrap function can also be used with classes which define an opDispatch function, for example:
import std.typecons; interface IDrawable { void drawLine(int x1, int y1, int x2, int y2); void drawRect(int x, int y, int width, int height); } class ImageDraw { void opDispatch(string name, Args...)(Args args) if (name == "drawLine") { // ... } void opDispatch(string name, Args...)(Args args) if (name == "drawRect") { // ... } } /** Draw some shapes. */ void drawShapes(IDrawable draw) { draw.drawLine(0, 100, 100, 0); draw.drawRect(0, 0, 100, 100); } void main() { auto imageDraw = new ImageDraw(); IDrawable i = wrap!IDrawable(imageDraw); drawShapes(i); }
You can unwrap a structurally cast object back to its original type:
interface IDrawable { void drawLine(int x1, int y1, int x2, int y2); } class ImageDraw { void drawLine(int x1, int y1, int x2, int y2) { } } void main() { auto imageDraw = new ImageDraw(); // perform a structural cast (note the simple UFCS syntax). IDrawable i = imageDraw.wrap!IDrawable; // get back the original type (ditto, using UFCS syntax). ImageDraw draw = i.unwrap!ImageDraw; }
And you can structurally cast to multiple interface types:
import std.typecons; unittest { interface IStoppable { void stop(); } interface IRunnable { void run(); } class Timer { void run() { } void stop() { } } auto timer = new Timer(); auto obj = timer.wrap!(IStoppable, IRunnable); // extract the individual structurally casted types // from the wrapped type IStoppable iStop = obj; IRunnable iRun = obj; iRun.run(); iStop.stop(); }
Since 2.064, pure functions can take advantage of to and format. For example:
import std.conv; import std.string; void main() pure // this main is a pure function. { string date = format("%s.%s.%s", 2013, 12, 10); int one = to!int(1.0); }
The new generic strip functions allow you to not only strip strings but also any other Input range (stripLeft) or Bidirectional range (strip/stripRight), for example:
import std.algorithm; void main() { // strip whitespace. assert(" foobar ".strip!(a => a == ' ')() == "foobar"); // an audio waveform. float[] data = [0.0, 0.0, 0.1, 0.5, 0.2]; // strip leading silence in the waveform. assert(data.strip!(a => a < 0.1)().length == 3); }
To avoid implicit memory allocations translate now features overloads which can take an output range to write the contents to. For example:
import std.array; import std.string; void main() { dchar[dchar] transTable = ['a' : '1', 'b' : '2', 'c': '3']; // create our output range by using the Phobos Appender. auto buffer = appender!(dchar[])(); auto toRemove = null; // don't remove any characters. translate("abcdef", transTable, toRemove, buffer); assert(buffer.data == "123def"); // or use a static array to avoid heap allocations. // note: if the buffer is too small an exception will be thrown. dchar[6] dbuffer; translate("abcdef", transTable, toRemove, dbuffer[]); assert(dbuffer == "123def"); }
With the thisExePath function you can retrieve the current executable path:
import std.file; import std.stdio; void main(string[] args) { // Prints the full path of the current running executable. // Note: this may, or may not be the same as args[0]. The content // of args[0] is dependent of how the application was invoked, thisExePath() // is not. It's also possible to access thisExePath() from other parts of the // code than main. writeln(thisExePath()); }
The old API based around "g"(=global) flag was confusing and error prone. Moreover in some cases it was already being overriden by a function as is the case with std.regex.splitter.
New version ties the operation to the function in question, thus being simpler to understand without extra context. For the moment the "g" flag is kept working as is but the new API always overrides it where applicable. Another addition in the new API is an overload for the replace family of functions to work directly with output ranges.
To understand the difference in the API compare 2 samples below.
Before 2.064:
void main() { import std.regex, std.algorithm, std.range, std.stdio, std.string; auto m = "3.141592".match(`(\d+)\.(\d+)`); // m is a range of ranges assert(m.front.equal(["3.141592", "3", "141592"])); // global vs non-global auto word = regex(`(\w)\w*`); auto gword = regex(`(\w)\w*`, "g"); auto list = "tomatoes, potatoes, pineapple"; // this will print only 'tomatoes', which raised many questions foreach(item; list.match(word)) writeln(item.hit); // while this will print each of them foreach(item; list.match(gword)) writeln(item.hit); auto justFirst = replace!(m => toUpper(m[1]) ~ m[0].drop(1))(list, word); assert(justFirst == "Tomatoes, potatoes, pineapple"); auto allOfThem = replace!(m => toUpper(m[1]) ~ m[0].drop(1))(list, gword); assert(allOfThem == "Tomatoes, Potatoes, Pineapple"); }
After 2.064:
void main() { import std.regex, std.algorithm, std.range, std.stdio, std.string; auto m = "3.141592".matchFirst(`(\d+)\.(\d+)`); // m is simply a range of submatches assert(m.equal(["3.141592", "3", "141592"])); auto word = regex(`(\w)\w*`); auto list = "tomatoes, potatoes, pineapple"; // iterates over submatches so it will print 2 lines: // tomatoes // t foreach(item; list.matchFirst(word)) writeln(item); // so just to get the whole match: assert(list.matchFirst(word).hit == "tomatoes"); // now there is no need to check if it has "g" option // it's crystal clear in the function name foreach(item; list.matchAll(word)) writeln(item.hit); auto justFirst = replaceFirst!(m => toUpper(m[1]) ~ m[0].drop(1))(list, word); assert(justFirst == "Tomatoes, potatoes, pineapple"); auto allOfThem = replaceAll!(m => toUpper(m[1]) ~ m[0].drop(1))(list, word); assert(allOfThem == "Tomatoes, Potatoes, Pineapple"); // NEW feature - if there is no need to allocate, the resulting string // replacement may be just sent directly to the wire (an OutputRange) auto sink = stdout.lockingTextWriter(); replaceAllInto!(m => toUpper(m[1]) ~ m[0].drop(1))(sink, list, word); }
The old API still works, even though eventual deprecation is planned. Also note the new functionality in form of *Into functions that forward the replacement directly to an output range avoiding extra pressure on the heap.
Now ctRegex supports full syntax spectrum of run-time one except for set algebra inside of a character class. For instance, the following now compiles and passes:
void main() { import std.regex; // a word, but not a title-cased ASCII // ?<! inside of () means "negative lookbehind" auto pat = ctRegex!`\w+(?<![A-Z][a-z]*)`; assert(!"Hello".match(pat)); assert("good_bay".match(pat)); }
List of all bug fixes and enhancements in D 2.064:
DMD Compiler regressions
- Bugzilla 6014: rt_finalize Segmentation fault , dmd 2.053 on linux & freebsd
- Bugzilla 10074: segfault in dmd
- Bugzilla 10197: [REG2.063] Cannot cast overloaded template property result
- Bugzilla 10212: Segfault in mismatching delegate literal types
- Bugzilla 10215: Regression (2.063 release): const causes wrong float calculation
- Bugzilla 10220: array doesn't work with disabled default construction
- Bugzilla 10255: When creating lib files, dmd no longer splits module into multiple obj files
- Bugzilla 10299: [REG2.063] ICE with getting address of template
- Bugzilla 10330: Regresfsion (2.063.2): __VERSION__ is set wrong
- Bugzilla 10337: Error: mutable method glwtf.input.SignalWrapper!().SignalWrapper.Signal!().~this
- Bugzilla 10352: Regression (2.063): --eval is broken in RDMD
- Bugzilla 10357: std.typecons.Nullable!(SysTime).Nullable.__ctor!() error instantiating
- Bugzilla 10373: cannot resolve forward reference (dmd2.063)
- Bugzilla 10375: [REG2.061] private template from imported module hijacks a template type parameter(!)
- Bugzilla 10382: Regression (2.059): ICE when catching illegal type
- Bugzilla 10394: opBinaryRight!"in" and tuple
- Bugzilla 10397: ICE on concatenating string with unexisted symbol
- Bugzilla 10425: Link error with templates
- Bugzilla 10440: shared library on osx: worked in 2.062, fails in 2.063 / 2.063.2
- Bugzilla 10441: Static libraries too big
- Bugzilla 10456: struct containing enum X, alias X this and a dynamic array no longer compiles since 2.063
- Bugzilla 10481: out of memory error
- Bugzilla 10486: Segfault on assigning typeof(null) to static array
- Bugzilla 10498: __traits(compiles, ...) affect program behaviour
- Bugzilla 10503: Octal enums don't work anymore
- Bugzilla 10505: anonymous enum members cannot have different types
- Bugzilla 10537: Forward reference error on 'yield' toy example.
- Bugzilla 10548: [REG 2.064a] argument has no identifier
- Bugzilla 10558: Assertion failure on struct.c:741
- Bugzilla 10561: Regression (2.064 HEAD): anon enum members no longer have enum base type
- Bugzilla 10573: Weird linking problem with associative array cast [DMD 2.63]
- Bugzilla 10577: 2.063 Mixin Regression (works with 2.062)
- Bugzilla 10579: regression 062=>063: Cannot interpret TypeInfo at compile time
- Bugzilla 10592: Regression of overloaded template function
- Bugzilla 10600: regression(2.063.2) ICE: Assertion failed: (type->ty != Tstruct || ((TypeStruct *)type)->sym == this), function semantic, file struct.c, line 741.
- Bugzilla 10612: Regression (2.064 HEAD): ICE on using enum as hash key with mutual module imports
- Bugzilla 10617: contract with -profile -debug is not nothrow
- Bugzilla 10624: [REG2.064a] ICE with tuple comparison
- Bugzilla 10626: ICE with vector operation
- Bugzilla 10628: [REG2.063] spurious "hidden by" deprecation warning
- Bugzilla 10669: CTFE: using initialized static const class member no longer works
- Bugzilla 10673: memory corruption in interpret.c
- Bugzilla 10682: [ICE](cgcod.c line 1561) with ^^ operator and ulong
- Bugzilla 10684: Refused array op with array literal
- Bugzilla 10687: Refused cast from uint[] to array of uint-based enums at compile-time
- Bugzilla 10713: [REG2.063] ICE with typeof(this.nonExistingField) in method signature
- Bugzilla 10721: ICE with constructor with postcondition
- Bugzilla 10722: Regression (2.064 git-head): Cannot interpret struct at compile-time
- Bugzilla 10726: Bogus Circular Reference error if opEquals defined and has a loop
- Bugzilla 10727: Regression (dmd-2.061) -- DMD dumps core
- Bugzilla 10734: Assertion failure: '0' on line 1546 in file 'cast.c'
- Bugzilla 10736: Regression (2.064 git-head): Instantiation failure triggered by module import and module order
- Bugzilla 10744: [regression git-head v2.064] Rejects valid interface inheritance + wrong error message
- Bugzilla 10782: dmd segfault with string mixin, CTFE, class, non-literal initializer
- Bugzilla 10788: Regression: forward reference of enum member E from another module.
- Bugzilla 10789: Struct destructor erroneously called
- Bugzilla 10804: regression(2.063=>2.064) problem with Appender or dmd?
- Bugzilla 10808: [REG2.064a] Incorrect typeid template argument should report error
- Bugzilla 10836: 'errors compiling the function' for optimized builds
- Bugzilla 10946: Integer constant expression expected instead of...
- Bugzilla 10949: CTFE ICE after indexing error
- Bugzilla 10964: [REG][2.063] Static array assign/blit exception slips through catch block.
- Bugzilla 10981: Contracts in pure class methods are useless
- Bugzilla 10994: [REG] cannot declare statics struct with void-initialized static arrays
- Bugzilla 10998: [REG 2.063] compile-time postblit call check is incorrectly suppressed.
- Bugzilla 11010: Regression (2.063.2) typeid doesn't work on a member of an instance.
- Bugzilla 11039: Undefined instantiation from circular imports
- Bugzilla 11054: ICE: interpret.c:357: virtual void Statement::ctfeCompile(CompiledCtfeFunction*): Assertion 0 failed.
- Bugzilla 11062: inline ice with alias this and opIndexAssign
- Bugzilla 11069: DMD (github HEAD) Linker Regression
- Bugzilla 11081: Win64: duplicate COMDAT with failed compilation with lambdas
- Bugzilla 11086: dmd segfault
- Bugzilla 11105: Error on struct with multidimentional static array initialization from its element
- Bugzilla 11117: Pseudo module __entrypoint.d listed as dependency with -deps
- Bugzilla 11121: Wrong parenthesis omission in ddoc output
- Bugzilla 11127: std.range.cycle linker errors
- Bugzilla 11153: Regression (2.064 git-head): ICE during a diagnostic for missing return type
- Bugzilla 11163: [ICE](ctfeexpr.c line 355) with pragma(msg) of a wrong expression
- Bugzilla 11186: Regression (2.061): Presence of Variant and const field invokes opAssign
- Bugzilla 11197: [DMD 2.064a] Struct with postblit cannot be appended to an AA of arrays
- Bugzilla 11203: extern (C++) classes broken
- Bugzilla 11220: Regression in master: XXX__lambda2 cannot access frame of function XXX
- Bugzilla 11223: inline ice with tuple assignment and if/else
- Bugzilla 11225: Module dependency cycle causes import statements inside typeof() expressions inside templates to fail
- Bugzilla 11228: alias this confuses static array copy
- Bugzilla 11230: [REG2.064a] Inexact mangling for template function literal.
- Bugzilla 11233: DMD HEAD very slow with large static array struct field
- Bugzilla 11237: zero initializer emitted to read-only data segment, slow compilation
- Bugzilla 11242: [REG2.064beta] Fails to infer template argument with inout
- Bugzilla 11245: [REG 2.063] Can't access length of static arrays from within classes
- Bugzilla 11246: [REG 2.063] Struct initialized in constructor is destroyed first
- Bugzilla 11256: Error mixing struct with disabled default construction and templated with lambda struct
- Bugzilla 11261: Can't infer types without explicit slice in foreach
- Bugzilla 11262: std.regex.replace does not accept StaticRegex
- Bugzilla 11265: Segfault while calling instance method of class defined inside struct
- Bugzilla 11267: Resulting executable sizes varies a lot
- Bugzilla 11271: [REG 2.063] auto ref opAssign + destructor + struct literal fails
DMD Compiler bugs
- Bugzilla 952: Strange "Error:" prefix on some warning messages
- Bugzilla 1982: [CTFE] Problems with compile-time null
- Bugzilla 2407: function pointer as an enum's base type doesn't work
- Bugzilla 2486: taking address of slice rvalue should not be allowed
- Bugzilla 3096: EnumBaseType
- Bugzilla 3646: Default values of function arguments are ignored when instantiating a template.
- Bugzilla 3866: anonymous delegate with default parameters cross-talks to another anonymous delegate
- Bugzilla 4018: __FILE__ and __LINE__ as default template parameters not set to instantiation point per spec
- Bugzilla 4481: ICE(glue.c,!vthis->csym) or compiles, depending on the import statements order
- Bugzilla 4611: stack overflow or ICE(cgcod.c) when static array of structs exceeds 16MB limit
- Bugzilla 4841: -inline wrecks certain nested structs causing error "*** is a nested function and cannot be accessed from ***"
- Bugzilla 4899: Ddoc: Warnings about stray parens do not include file and line numbers for module comments
- Bugzilla 5012: ICE(cod3.c): handling a nested function in inline asm.
- Bugzilla 5655: Lambda inside static foreach saves wrong value of counter
- Bugzilla 5842: hash table corruption
- Bugzilla 5911: Closure destroys the thrown Exception .
- Bugzilla 5988: Template accepts instantiating an already-instantiated template type
- Bugzilla 6107: ICE(expression.c) when a non-template member named '__ctor' exists in a struct, and the constructor is attempted to be invoked.
- Bugzilla 6169: [CTFE] pure functions cannot compute constants using functions not marked as pure
- Bugzilla 6178: Struct inside the AA are not init correctly
- Bugzilla 6310: Missing "template instantiation" traceback when an error happens in the template parameter of an alias.
- Bugzilla 6461: multiple definitions with typeid and multiobj
- Bugzilla 6711: "with" doesn't work with "alias this"
- Bugzilla 6720: ICE(cod1.c) casting return of void function to bool
- Bugzilla 6799: ICE(type.c) involving AAs and pointers to structs
- Bugzilla 6906: Cannot assign value into associative array if contains opAssign
- Bugzilla 7051: Class member with un-@safe destructor gives confusing error
- Bugzilla 7156: ICE(go.c): with 199 or 200 repeated integer increments, only with -O
- Bugzilla 7202: Hole in type system still present for delegates
- Bugzilla 7254: ICE(cod3.c) returning strings as static arrays
- Bugzilla 7436: ICE(cg87.c) ubyte = ubyte op= float
- Bugzilla 7474: ICE(cgcs.c) on instantiating a struct with field and destructor as tuple
- Bugzilla 7522: ICE(interpret.c) Accessing a non-static member without this
- Bugzilla 7524: D1: #line __LINE__ doesn't parse
- Bugzilla 7533: Error with no line number with pure static ctor
- Bugzilla 7538: All kinds of property functions should be called before getting their types inside typeof
- Bugzilla 7565: ICE(cg87):202, postincrement of a double parameter, 64-bit only
- Bugzilla 7656: ddoc misinterprets commented parentheses in an example
- Bugzilla 7715: DDoc eats , , etc. inside d_code section
- Bugzilla 7727: "static initializer" for non-static unions too
- Bugzilla 7746: Error with 'TOK232' declaring enum of anonymous nested class type
- Bugzilla 7780: Template mixin'd members do not properly overload
- Bugzilla 7806: ICE(gloop.c) iterating with idouble, when compiling with -O
- Bugzilla 7848: pure and nothrow ignored on unittest blocks
- Bugzilla 7892: Compiler-generated struct copies can result in errors when ctor is @disable'd
- Bugzilla 7976: ICE(backend/cg87.c)assignment btw two elements of dynamic array of complex number types
- Bugzilla 7988: [CTFE] CTFE return values should be allowed in compile-time expressions
- Bugzilla 8119: Cannot cast from void* to forwarded struct pointer
- Bugzilla 8179: ICE(e2ir.c) with failed fixed size array cast
- Bugzilla 8253: CTFE ICE: calling of member function of non-CTFE class variable
- Bugzilla 8285: Issue with slice returned from CTFE function
- Bugzilla 8352: Wrong "__overloadset isn't a template" error
- Bugzilla 8360: Destruction of uninitialized temporary struct with assert
- Bugzilla 8361: [ICE] (eh.c line 316) with struct with dtor in assert
- Bugzilla 8441: mixin containing template functions causes compiler errors
- Bugzilla 8563: Exception segfault
- Bugzilla 8579: Default parameter appears a part of typeof().stringof of a function variable
- Bugzilla 8651: Slice op Slice throws exceptions (not errors), and nothrow
- Bugzilla 8733: Normalize -of path on Windows
- Bugzilla 8795: mixing in "switch" or "interface;" makes dmd segfault
- Bugzilla 8911: -property makes fullyQualifiedName fail for functions
- Bugzilla 8956: Ability to break typesystem with constructor/postblit/destructor (e.g. modify immutable)
- Bugzilla 8977: Ability to break typesystem with static struct initializer (e.g. modify immutable)
- Bugzilla 9017: __traits(compiles, { enum e = <expression tuple>; }) is true but code doesn't compile
- Bugzilla 9235: Template mixin doesn't allow to mixin non-conflicting overloads
- Bugzilla 9247: Compiler accepts opaque struct returned by value from function pointer declaration.
- Bugzilla 9319: Unexpected compiles __traits behaviour in a certain situation
- Bugzilla 9364: [ICE] Error: CTFE internal error painting S*
- Bugzilla 9396: Wrong line number when assigning nested enum to struct
- Bugzilla 9524: Unittest ddocs fail to appear following ditto
- Bugzilla 9531: __traits(parent, ...) does not work for types defined within a unittest block
- Bugzilla 9534: Distributed CHM file lacks styling
- Bugzilla 9546: getProtection trait does not work with mixin or getMember
- Bugzilla 9571: link error due to using unique ids in anonymous funcliteral
- Bugzilla 9578: "is a nested function and cannot be accessed from" problem
- Bugzilla 9586: Win64 5/6/7 struct returns
- Bugzilla 9628: Lambda in foreach loop Vs. lambda in static foreach loop
- Bugzilla 9634: [CTFE] wrong code concatenating arrays of structs
- Bugzilla 9665: Structure constant members can not be initialized if have opAssign
- Bugzilla 9710: Pointer enums crash dmd
- Bugzilla 9733: Hello world segfaults on Debian x86_64 with -m64
- Bugzilla 9782: implementing RTInfo!T causes errors for deprecated types
- Bugzilla 9859: Cannot use inout in delegate
- Bugzilla 9904: typeof(null) can be casted to aggregate type if .sizeof equals size of pointer
- Bugzilla 9921: Enum variables of type void should be illegal
- Bugzilla 9923: [ICE] (interpret.c line 167) with countUntil on Typedef[]
- Bugzilla 9938: ICE using global interface variable in CTFE
- Bugzilla 9954: Runtime wrong code with global interface var created in CTFE
- Bugzilla 9982: ICE on CTFE for pointer dereference
- Bugzilla 10007: function overrides but is not covariant
- Bugzilla 10037: Compiler should not generate opEquals method implicitly
- Bugzilla 10064: opDollar called on garbage
- Bugzilla 10065: Compiler fails without error message for tuple map
- Bugzilla 10079: Built-in generated opAssign should be pure nothrow @safe by default
- Bugzilla 10082: ICE(e2ir.c) Multiple mixin template instantiations are not checked
- Bugzilla 10083: Insufficient IFTI/eponymous template specification
- Bugzilla 10086: ICE(glue.c) or wrong code on passing variable as template value parameter
- Bugzilla 10094: NRVO with static array return should work
- Bugzilla 10099: Diagnostic for disabled default construction should improve
- Bugzilla 10113: Can't use an enum : string in a switch statement
- Bugzilla 10141: wrong error message with Tuple!(int) : Error: static assert "Cannot put a char[] into a Appender!(string)"
- Bugzilla 10156: Can't handle usage of TypeTuple argument in templated function
- Bugzilla 10196: RDMD: RDMD can't be used from MSys
- Bugzilla 10198: CTFE: Wrong code for multi-dimensional block assignment
- Bugzilla 10208: Module-level const/immutable variables with initialization value don't support UDAs
- Bugzilla 10211: CTFE: Support casts from S** to D**, if S* -> D* is supported.
- Bugzilla 10214: Incorrect "element-wise assignment is better" warning
- Bugzilla 10243: [CTFE] Wrong-code on passing dereferenced array pointer by ref
- Bugzilla 10244: ICE: expression.c:8364: virtual Expression* CallExp::semantic(Scope*): Assertion td failed
- Bugzilla 10249: incorrect mangling for overloaded symbol
- Bugzilla 10252: CTFE: Should generate error for shifts outside valid range
- Bugzilla 10254: Purity correctness is broken with constructor
- Bugzilla 10273: ICE(ctfeexpr.c): using CTFE after error in struct default values
- Bugzilla 10274: DMD 2.063 produces broken binaries
- Bugzilla 10275: CTFE: Allow const casts of struct literals
- Bugzilla 10277: Incorrect error file and line on redeclaration of TypeInfo
- Bugzilla 10279: Calling a typesafe variadic @trusted function from an @safe function results in an error.
- Bugzilla 10280: CTFE: Circular variable initializers should be detected properly
- Bugzilla 10283: ICE(interpret.c): passing struct with failed initalizer to CTFE
- Bugzilla 10288: Direct lambda call and purity inference bug
- Bugzilla 10289: compiler should infer nothrow even if Error is thrown
- Bugzilla 10296: Nested template function call and purity inference bug
- Bugzilla 10298: CTFE fails with array literal initialization
- Bugzilla 10302: Package module conflicts with package name
- Bugzilla 10319: @safe/pure/nothrow error should print fully qualified name
- Bugzilla 10325: ddoc: template constraints inconsistently shown in generated html
- Bugzilla 10327: Missing 'package.d' for DIP37 needs a better error message
- Bugzilla 10341: Range case without an associated switch statement crashes DMD
- Bugzilla 10343: Cannot resolve a forward reference to a template inside global typeof
- Bugzilla 10344: Exiting _Dmain should flush all FILE*s and return nonzero on failure
- Bugzilla 10346: No line number error with undefined template identifier
- Bugzilla 10354: DIP37: ICE with using indirectly imported template through package.d
- Bugzilla 10359: Pointer slicing allowed in @safe mode
- Bugzilla 10381: Nonsense associative array comparison
- Bugzilla 10386: Package import feature breaks with static libraries
- Bugzilla 10389: Infinite recursion on printing self-referential StructLiteralExp
- Bugzilla 10390: ICE on printing ClassReferenceExp
- Bugzilla 10405: redundant "expression has no effect" error when returning non-void in void function
- Bugzilla 10414: Delegate arguments for lazy variadic functions are only inferred in first argument
- Bugzilla 10415: Bad error message with const property of const class instance
- Bugzilla 10418: bad error message: "not a property"
- Bugzilla 10419: Unhandled exception in dmd after correct error message
- Bugzilla 10421: 'package' access should work with package module
- Bugzilla 10429: RDMD: --loop option doesn't work due to symbol conflict
- Bugzilla 10431: ICE(DMD 2.063) in struct.c:741
- Bugzilla 10432: RDMD: --dry-run option tries to read non-existent file
- Bugzilla 10433: Array sum operation in function template
- Bugzilla 10435: rdmd doesn't support the -op argument.
- Bugzilla 10451: Array of pointers to opaque struct gives forward reference errors.
- Bugzilla 10452: CTFE: Cannot compare delegates with == or 'is'
- Bugzilla 10462: interface thunk doesn't preserve EBX
- Bugzilla 10479: cannot pass implicitly to base class casted result to out contract by ref
- Bugzilla 10495: Incorrect "initializer required" error using lambdas in class with fields with disabled default construction
- Bugzilla 10497: Opaque structs cannot be dereferenced in pointer to pointer types
- Bugzilla 10504: Tuple error: no property 'offsetof' for type 'int'
- Bugzilla 10506: Purity should not be checked in a mixin statement
- Bugzilla 10519: Stray-paren in doc-unittest code generates wrong document
- Bugzilla 10526: opDispatch with IFTI should not disable UFCS
- Bugzilla 10534: Addition and subtraction of delegates allowed
- Bugzilla 10539: [REG][2.063] Implicit pointer to array dereference for .ptr property fails
- Bugzilla 10542: implicitly generated class ctor doesnt inherit base class ctor attributes
- Bugzilla 10551: [CTFE] Wrong-code on passing dereferenced array pointer by ref 2
- Bugzilla 10568: CTFE rejects function pointer safety casts
- Bugzilla 10583: DMD 2.063 dumps core with mixins involving __traits(getProtection, ..
- Bugzilla 10595: Using alias this and a hash generates wrong code
- Bugzilla 10596: A method with out contract and auto return type causes segfault
- Bugzilla 10597: opDollar not callable in static constext
- Bugzilla 10599: CTFE: assert failure interpret.c 310
- Bugzilla 10609: Refused UFCS in __traits(compile)
- Bugzilla 10610: interpret.c:4067 Assertion Failure
- Bugzilla 10618: Template instance member access disallowed in dynamic array allocation
- Bugzilla 10630: Structs with disabled default construction can't be used as out parameters
- Bugzilla 10633: Win64: wrong codegen with %=
- Bugzilla 10634: Win64: wrong codegen with .init of small structs
- Bugzilla 10639: Win64: wrong optimizer codegen with struct literal with complex fields
- Bugzilla 10642: Win64: wrong codegen comparing different sized integer arguments
- Bugzilla 10646: No front-end error for invalid casting dynamic array/static array to class reference
- Bugzilla 10651: Throwing non-Throwable object causes ICE
- Bugzilla 10676: excessive compilation times with optimized PIC build
- Bugzilla 10677: Win64: cfloat return value not forwarded correctly as function argument
- Bugzilla 10678: Win64: wrong code passing small fixed sized array as function argument
- Bugzilla 10694: wrong purity check for static variables with impure destructor
- Bugzilla 10695: __MODULE__ in string mixin crashes compiler
- Bugzilla 10715: negated bit test (bt) not recognized by optimizer
- Bugzilla 10735: Buffer overflow bug in symbol_generate()
- Bugzilla 10746: Win64: corrupt debug info with very long symbols
- Bugzilla 10752: accessing a private cached symbol a second time doesn't cause an error in __traits(compiles, ...)
- Bugzilla 10758: Unsound type checking for inout.
- Bugzilla 10761: DMD crashes on unspecified inout matching.
- Bugzilla 10768: DMD does not show deprecation message for missing 'override' keyword
- Bugzilla 10781: ctRegex! throws a huge error
- Bugzilla 10783: ICE and bad diagnostics when using non-existent symbols in switch and with statements
- Bugzilla 10792: Bad diagnostic on new eponymous enum template syntax
- Bugzilla 10793: Forward reference errors casting from void* to opaque struct pointer
- Bugzilla 10809: [REG] darwin 32 dmd release broken
- Bugzilla 10811: Order dependent IFTI failure
- Bugzilla 10813: ICE(DMD2.063) template.c:6040: Identifier* TemplateInstance::genIdent(Objects*): Assertion global.errors failed
- Bugzilla 10834: cannot use cast(void)expr if the type of expr is a struct
- Bugzilla 10840: [CTFE] *this._data.arr is not yet implemented at compile time
- Bugzilla 10842: Some integer casts wrongly remove side-effect of the operand.
- Bugzilla 10857: ICE(glue.c, bugzilla 2962?) or compiles, depending on the files order
- Bugzilla 10858: CTFE wrong code for comparison of array of pointers
- Bugzilla 10862: Assignment inside if condition still sometimes accepted
- Bugzilla 10869: Ddoc mark methods with "const" twice
- Bugzilla 10870: Ddoc adds "abstract" to interfaces
- Bugzilla 10937: struct inside union gives uninitialized error in CTFE
- Bugzilla 10942: ICE on 1087+ initializers (Internal error: backend\cgcv.c 203)
- Bugzilla 10944: [ICE](interpret.c line 310) with arith operation on missing variable
- Bugzilla 10947: const out parameter is not properly rejected
- Bugzilla 10953: Attribute inheritance needs to apply to contracts, too
- Bugzilla 10968: array element copy (1-N and N-N) ignores postblit attributes
- Bugzilla 10969: Variadic template parameter re-use in function signature
- Bugzilla 10970: Segfault in a simple test compiled without -g.
- Bugzilla 10980: static initialization of immutable structs with disabled postblit fails
- Bugzilla 10984: Frame access diagnostic should improve
- Bugzilla 10989: [CTFE] Uncaught exception messages are not pretty printed if message wasn't literal
- Bugzilla 10990: Passing in a module as a mixin to __traits(getUnitTests) behaves differently than passing in the module directly.
- Bugzilla 10992: Trait getUnitTests skips first test if aggregate contains multiple tests.
- Bugzilla 10993: mangling of voldemort types with lambdas changes during return type inference
- Bugzilla 10995: CTFE failures for structs with void initialized members
- Bugzilla 11002: Compiler doesn't see std.sys.linux.epoll.
- Bugzilla 11075: ICE(struct.c) after gagged error in struct field initializer
- Bugzilla 11125: UFCS instantiation of template causes template constraint to be skipped
- Bugzilla 11132: Odd diagnostic with C-style struct initializer when union field is present
- Bugzilla 11134: Inconsistent postblit call count depends on the pointer size
- Bugzilla 11136: ICE on incorrect module declaration
- Bugzilla 11137: Stack overflow on invalid output path
- Bugzilla 11141: Missing .pdb file with phobos64
- Bugzilla 11142: Wrong error message "no size yet for forward reference" for opaque struct
- Bugzilla 11144: Better diagnostic for typeid symbol
- Bugzilla 11145: Duplicated deprecation message "use of typedef is deprecated;"
- Bugzilla 11146: Wrong line number of "identity assignment operator overload is illegal"
- Bugzilla 11147: Nested structs in a union are not correctly initialized
- Bugzilla 11151: Undetected overlapping initialization
- Bugzilla 11159: [CTFE] Integer exponentiation give incorrect values
- Bugzilla 11164: wrong dependencies generated when compiling with -main
- Bugzilla 11182: dmd crashes on compiling regex
- Bugzilla 11187: A small transitive const bug on struct copying
DMD Compiler enhancements
- Bugzilla 658: struct pointers in with()
- Bugzilla 767: compiler shall print dependencies and pragma(lib)
- Bugzilla 5943: Power expression optimisation for 2^^unsigned
- Bugzilla 8635: Allow postfix expressions for new
- Bugzilla 9022: IFTI should support enclosing type/scope deduction
- Bugzilla 9097: Value range propagation to disable some array bound tests
- Bugzilla 9565: Index of static array should not print literal suffix
- Bugzilla 10022: Importing packages
- Bugzilla 10117: Support C++ class-scope static variables
- Bugzilla 10236: Ddoc: Warning on wrong parameter names
- Bugzilla 10334: ddoc should prefer simple syntax for template instantiations with one parameter
- Bugzilla 10367: DDoc should output enum base type
- Bugzilla 10688: Misleading error message when attempting a "private override"
- Bugzilla 10724: Allow slice of string literal to convert to const(char)*
- Bugzilla 10991: Implement trait to get vptr index of a method.
- Bugzilla 11088: Diagnostics for enum member overflows should improve
- Bugzilla 11257: Allow whole implicit conversion if one or more overlapped field could.
Phobos regressions
- Bugzilla 10218: std.typecons.opAssign is not CTFEable
- Bugzilla 10268: [REG2.063] std.typecons.Nullable!JSONValue - error instantiating
- Bugzilla 10355: fullyQualifiedName doesn't work with enums
- Bugzilla 10468: Regression (2.063): Lockstep no longer works with iota
- Bugzilla 10499: [REG 2.064] retro is no longer CTFE-able
- Bugzilla 10686: No [] operator overload for immutable Tuple
- Bugzilla 10866: Regression (2.064 git-head) Massive compiler slowdown
- Bugzilla 10896: currently tools/ddemangle doesn't compile on git master
- Bugzilla 10906: [2.064 git-head] Out of memory compiling Phobos on Windows
- Bugzilla 10913: [2.064 git-head] regex/demange compilation failure
- Bugzilla 11009: Regression (2.064 git-head): DMD consumes huge memory when it compiles enum containing many items
- Bugzilla 11057: [REG2.064dev] New std.uni has icmp() partly broken
- Bugzilla 11165: std.typecons._d_toObject conflicts with std.signals._d_toObject
- Bugzilla 11283: [REG 2.064] assert in std/windows/syserror.d
Phobos bugs
- Bugzilla 2717: alloca(0) leaves stack unaligned on OSX
- Bugzilla 4575: Uses of deprecated delete statement in D2 Phobos
- Bugzilla 5224: std.algorithm.remove!(SwapStrategy.unstable) doesn't work
- Bugzilla 5378: File.byLine terminator string
- Bugzilla 5630: array() of iterable of immutable items
- Bugzilla 5692: Printing complex numbers with negative imaginary part
- Bugzilla 5942: Bitfields are overwritten erroneously
- Bugzilla 6342: Tuple field access problem in pure function
- Bugzilla 6407: take(map) problem
- Bugzilla 6686: bitmanip bitfields are broken at 64 bits
- Bugzilla 6893: Write of enum member represented with ubyte or ulong
- Bugzilla 7756: iota(const doubles) problem
- Bugzilla 8124: std.net.isemail not included in phobos.lib
- Bugzilla 8330: std.algorithm.find doesn't handle reference type ranges correctly
- Bugzilla 8474: bitfields doesn't work with 32 bit fields
- Bugzilla 8806: fullyQualifiedName!T does not work for inner types
- Bugzilla 9310: escapeShellCommand unittests are never run
- Bugzilla 9384: std.socket: UnixAddress broken on Linux and others
- Bugzilla 9548: BigInt: Wrong comparison result: BigInt("-1") > long.min
- Bugzilla 9557: std.array.array of array of immutable structs
- Bugzilla 9559: Range of Nullable doesn't work with std.array.array
- Bugzilla 9579: std.regex.replace format argument should not require same constness as target string
- Bugzilla 9599: File.byLine doesn't function properly with take
- Bugzilla 9607: std.random.randomShuffle and partialShuffle don't work with Xorshift
- Bugzilla 9629: toUpperInPlace doesn't work properly with unicode characters
- Bugzilla 9725: std.string.format does wasteful UTF decoding
- Bugzilla 9824: Emplace is broken
- Bugzilla 9967: ParameterIdentifierTuple broken for setters
- Bugzilla 10017: Can not assign to a Variant another Variant holding a bigger structure
- Bugzilla 10078: std.string.indexOf(Char[], dchar, CaseSensitive) fails at compile time
- Bugzilla 10130: map of iota with const step
- Bugzilla 10161: std.datetime unittest failure "Libya Standard Time"
- Bugzilla 10188: Wrong Document Comment on std.format.d(176)
- Bugzilla 10216: Bad warning in std.process.kill
- Bugzilla 10265: RandomSample fails when passed an InputRange as input
- Bugzilla 10269: RandomSample should use popFrontExactly, not popFrontN, when skipping across input range
- Bugzilla 10322: std.random.RandomSample.index() returns wrong value if called before front()
- Bugzilla 10347: buildPath returns relative path when joining absolute with relative path
- Bugzilla 10348: isRooted is either wrong or poorly specified
- Bugzilla 10377: std.typecons.wrap doesn't consider private members
- Bugzilla 10408: Two-function std.algorithm.reduce of a const array
- Bugzilla 10426: Improve code coverage of std.random unittests
- Bugzilla 10463: dirEntries() segfaults on paths the user does not have access to
- Bugzilla 10469: WinAPI declarations in std.process should be moved to core.sys.windows.windows
- Bugzilla 10474: When takeExactly returns a new range type, it fails to propagate all relevant attributes
- Bugzilla 10510: enforce can't take an extern(C) function to call
- Bugzilla 10517: readln(Char)(Char[] buf) accepts non-mutable buffers
- Bugzilla 10536: std.typecons.wrap doesn't work with a class that defines opCast
- Bugzilla 10543: std.algorithm.map incorrectly uses source range length for narrow strings
- Bugzilla 10550: Xorshift32 and Xorshift160 do not generate uniformly-distributed random numbers
- Bugzilla 10570: Example of how function for AutoImplement should work for non-abstract class
- Bugzilla 10601: std.path.setExtension leaves trailing dot if extension is empty
- Bugzilla 10607: DirEntry has no constructor
- Bugzilla 10608: std.typecons.RefCounted has very poor diagnostics
- Bugzilla 10644: Win64: wrong code when passing arguments through ...
- Bugzilla 10647: AutoImplement should implement overridden member functions with 'override' attributes
- Bugzilla 10660: ddoc on std.algorithm: Cheat sheet description for 'filter' is wrong
- Bugzilla 10680: BigInt uses deprecated std.traits.unsigned
- Bugzilla 10732: Example code for std.utf.toUTFindex does not work
- Bugzilla 10773: std.algorithm.splitter produces infinite range with empty delimiter
- Bugzilla 10796: std.regex: ctRegex bug with '.' and $ in multi-line mode
- Bugzilla 10797: std.regex: ctRegex "codegen" bug with certain nested infinite loops
- Bugzilla 10799: std.regex: ctRegex lookahead support
- Bugzilla 10800: ParameterDefaultValueTuple returns an empty string for default values in property functions.
- Bugzilla 10801: std.regex: support for lookbehind in ctRegex
- Bugzilla 10802: std.regex: ctRegex fails to compile with backreference
- Bugzilla 10874: std.conv.to should support conversion from ulong to int-based enum
- Bugzilla 10893: Numerous DDoc parameter warnings in Phobos (as found by 10236)
- Bugzilla 10898: LockingTextWriter segfaults in .init state
- Bugzilla 10951: EnumMembers should document about returning duplicate members
- Bugzilla 11068: raw formatting of chars and strings is wrong
- Bugzilla 11089: std.string.toUpper doesn't work with 1:m mappings
- Bugzilla 11152: formatChar doesn't handle \0
- Bugzilla 11160: Bitfield compilation error with degenerate bitfields of length 32 & 64
- Bugzilla 11194: std.container.Array.reserve calls opAssign on uninitialized data
- Bugzilla 11222: std.string.isNumeric accepts a "+"
- Bugzilla 11232: Windows sysErrorString only supports ASCII
Phobos enhancements
- Bugzilla 4120: bigint implicit cast too bool
- Bugzilla 4124: toString() for BitArray
- Bugzilla 4850: std.conv.to isn't pure
- Bugzilla 6154: std.math.abs on std.complex numbers too
- Bugzilla 6381: math.floor, math.ceil are not pure functions.
- Bugzilla 6626: std.complex.expi()
- Bugzilla 9699: strip functions should have stripLeft/stripRight counterparts and be generic
- Bugzilla 10092: Renaming std.range.chunks as std.range.chunked
- Bugzilla 10314: Add std.traits.signed
- Bugzilla 10538: std.typecons.wrap should consider opDispatch
- Bugzilla 10621: dirEntry is (now) useless
- Bugzilla 10717: std.ascii.toLower and toUpper should return char instead of dchar and avoid me to use a bad cast(char)
- Bugzilla 10868: std.string.translate should take an optional buffer
- Bugzilla 10881: Support %f formatting for a std.complex.complex
- Bugzilla 10909: std.conv.to!(bool)(int): conversion from integer to bool
- Bugzilla 11020: Add function for getting the current executable path
- Bugzilla 11123: std.getopt should support functions
Druntime regressions
- Bugzilla 10976: thread_joinAll after main exit performed too late
Druntime bugs
- Bugzilla 6210: Associative array with array key often cannot be equated.
- Bugzilla 6372: data loss due to possible bug in garbage collector
- Bugzilla 7741: getHash inconsistent for const(char)[] vs. char[] and string
- Bugzilla 8435: BigInts don't work well in associative arrays
- Bugzilla 9783: profiling recursive function calls yields bad tree timing
- Bugzilla 9852: Empty associative array crashes program
- Bugzilla 10027: demangled name format of local function is wrong
- Bugzilla 10118: BigInt as associative array key wrong behavior
- Bugzilla 10323: getAMDcacheinfo needlessly allocates
- Bugzilla 10420: Incorrect function attributes in core.exception
- Bugzilla 10436: The runtime should print stack traces to stderr (like on *nix), not stdout
- Bugzilla 10457: _d_toObject might fail with shared libraries
- Bugzilla 10593: array's reserve/capacity go haywire if length has been changed prior
- Bugzilla 10711: shared phobos library should not depend on _Dmain
- Bugzilla 10720: ICE with is(aaOfNonCopyableStruct.nonExistingField)
- Bugzilla 10894: Numerous DDoc parameter warnings in druntime (as found by 10236)
Druntime enhancements
- Bugzilla 9190: Vector operations are not optimized for x86_64 architecture
Installer bugs
- Bugzilla 10062: installers should use CDN
Website bugs
- Bugzilla 9533: CHM generation crashes
- Bugzilla 10031: Link to old wiki on dlang.org
- Bugzilla 10230: Duplicated buttons for runnable examples
- Bugzilla 10410: Improve cast(void) documentation
- Bugzilla 10461: Incorrect example of "depend on order of evaluation" expression
- Bugzilla 10565: Level-5 titles are missing in Language reference
- Bugzilla 10605: Lambda grammar is not sufficient
- Bugzilla 10885: [std.range] refRange is missing from module description tables
- Bugzilla 11001: Need documentation for __traits(getVirtualIndex)
- Bugzilla 11036: Document that .stringof should not be used for code generation