DMD 2.082.0 was released over the weekend. There were 28 major changes and 76 closed Bugzilla issues in this release, including some very welcome improvements in the toolchain. Head over to the download page to pick up the official package for your platform and visit the changelog for the details.
Tooling improvements
While there were several improvements and fixes to the compiler, standard library, and runtime in this release, there were some seemingly innocuous quality-of-life changes to the tooling that are sure to be greeted with more enthusiasm.
DUB gets dubbier
DUB, the build tool and package manager for D that ships with DMD, received a number of enhancements, including better dependency resolution, variable support in the build settings, and improved environment variable expansion.
Arguably the most welcome change will be the removal of the regular update check. Previously, DUB would check for dependency updates once a day before starting a project build. If there was no internet connection, or if there were any errors in dependency resolution, the process could hang for some time. With the removal of the daily check, upgrades will only occur when running dub upgrade
in a project directory. Add to that the brand new --dry-run
flag to get a list of any upgradable dependencies without executing the upgrades.
Signed binaries for Windows
For quite some time users of DMD on Windows have had the annoyance of seeing a warning from Windows Smartscreen when running the installer, and the occasional false positive from AntiVirus software when running DMD.
Now those in the Windows D camp can do a little victory dance, as all of the binaries in the distribution, including the installer, are signed with the D Language Foundation’s new code signing certificate. This is one more quality-of-life issue that can finally be laid to rest. On a side note, the cost of the certificate was the first expense entered into our Open Collective page.
Compiler and libraries
Many of the changes and updates in the compiler and library department are unlikely to compel anyone to shout from the rooftops, but a handful are nonetheless notable.
The compiler
One such is an expansion of the User-Defined Attribute syntax. Previously, these were only allowed on declarations. Now, they can be applied to function parameters:
// Previously, it was illegal to attach a UDA to a function parameter void example(@(22) string param) { // It's always been legal to attach UDAs to type, variable, and function declarations. @(11) string var; pragma(msg, [__traits(getAttributes, var)] == [11]); pragma(msg, [__traits(getAttributes, param)] == [22]); }
The same goes for enum members (it’s not explicitly listed in the highlights at the top of the changelog, but is mentioned in the bugfix list):
enum Foo { @(10) one, @(20) two, } void main() { pragma(msg, [__traits(getAttributes, Foo.one)] == [10]); pragma(msg, [__traits(getAttributes, Foo.two)] == [20]); }
The DasBetterC subset of D is enhanced in this release with some improvements. It’s now possible to use array literals in initializers. Previously, array literals required the use of TypeInfo
, which is part of DRuntime and therefore unavailable in -betterC
mode. Moreover, comparing arrays of structs is now supported and comparing arrays of byte-sized types should no longer generate any linker errrors.
import core.stdc.stdio; struct Sint { int x; this(int v) { x = v;} } extern(C) void main() { // No more TypeInfo error in this initializer Sint[6] a1 = [Sint(1), Sint(2), Sint(3), Sint(1), Sint(2), Sint(3)]; foreach(si; a1) printf("%i\n", si.x); // Arrays/slices of structs can now be compared assert(a1[0..3] == a1[3..$]); // No more linker error when comparing strings, either explicitly // or implicitly such as in a switch. auto s = "abc"; switch(s) { case "abc": puts("Got a match!"); break; default: break; } // And the same goes for any byte-sized type char[6] a = [1,2,3,1,2,3]; assert(a[0..3] >= a[3..$]); puts("All the asserts passed!"); }
DRuntime
Another quality-of-life fix, this one touching on the debugging experience, is a new run-time flag that can be passed to any D program compiled against the 2.082 release of the runtime or later, --DRT-trapException=0
. This allows exception trapping to be disabled from the command line.
Previously, this was supported only via a global variable, rt_trapExceptions
. To disable exception trapping, this variable had to be set to false
before DRuntime gained control of execution, which meant implementing your own extern(C) main
and calling _d_run_main
to manually initialize DRuntime which, in turn, would run the normal D main
—all of which is demonstrated in the Tip of the Week from the August 7, 2016, edition of This Week in D (you’ll also find there a nice explanation of why you might want to disable this feature. HINT: running in your debugger). A command-line flag is sooo much simpler, no?
Phobos
The std.array
module has long had an array
function that can be used to create a dynamic array from any finite range. With this release, the module gains a staticArray
function that can do the same for static arrays, though it’s limited to input ranges (which includes other arrays). When the length of a range is not knowable at compile time, it must be passed as a template argument. Otherwise, the range itself can be passed as a template argument.
import std.stdio; void main() { import std.range : iota; import std.array : staticArray; auto input = 3.iota; auto a = input.staticArray!2; pragma(msg, is(typeof(a) == int[2])); writeln(a); auto b = input.staticArray!(long[4]); pragma(msg, is(typeof(b) == long[4])); writeln(b); }
September pumpkin spice
Participation in the #dbugfix campaign for this cycle was, like last cycle, rather dismal. Even so, I’ll have an update on that topic later this month in a post of its own.
Three of eight applicants were selected for the Symmetry Autumn of Code, which officially kicked off on September 1. Stay tuned here for a post on that topic as well.
The blog has been quiet for a few weeks, but the gears are slowly and squeakily starting to grind again. Other posts lined up for this month include the next long-overdue installment in the GC Series and the launch of a new ‘D in Production’ profile.