Ddoc

$(CHANGELOG_NAV_INJECT)

$(VERSION Jan 01, 2019, =================================================,

$(CHANGELOG_HEADER_STATISTICS
$(VER) comes with 21 major changes and 100 fixed Bugzilla issues.
                            A huge thanks goes to the 53 contributors who made $(VER) possible.)

$(BUGSTITLE_TEXT_HEADER Compiler changes,

$(LI $(RELATIVE_LINK2 alias_from_trait,Aliases can be created directly from a `__trait`.))
$(LI $(RELATIVE_LINK2 check-switch,Added -check switch to turn on and off each category of runtime checks.))
$(LI $(RELATIVE_LINK2 checkaction,Add `-checkaction=D|C|halt` compiler switch.))
$(LI $(RELATIVE_LINK2 color,`-color` and `-color=on` will now always output colorized console output))
$(LI $(RELATIVE_LINK2 debugmixins,The code generated by `mixin` statements can now be saved with -mixin))
$(LI $(RELATIVE_LINK2 deprecated_binary_literals,Deprecate invalid binary literals))
$(LI $(RELATIVE_LINK2 deprecated_extern_pascal,Deprecated `extern(Pascal)` linkage))
$(LI $(RELATIVE_LINK2 fqn_imports_bypass_private_imports_error,The deprecation phase for fully qualified names that bypassed private imports is finished))
$(LI $(RELATIVE_LINK2 posix_cpp_template_mangling,Templates are now mangled correctly on POSIX))
$(LI $(RELATIVE_LINK2 wchar_t,Added `__c_wchar_t` as a correct mangling type for C's `wchar_t`))

)

$(BUGSTITLE_TEXT_HEADER Runtime changes,

$(LI $(RELATIVE_LINK2 array,Added `core.stdcpp.array`.))
$(LI $(RELATIVE_LINK2 crt_externs,Add D header file $(REF_ALTTEXT `core.sys.darwin.crt_externs`, crt_externs, core, sys, darwin) for $(LINK2 https://opensource.apple.com/source/Libc/Libc-1244.30.3/include/crt_externs.h.auto.html, libc/crt_externs.h) on Darwin.))
$(LI $(RELATIVE_LINK2 destroy_noinit,Added `initialize` template argument to `object.destroy()`.))
$(LI $(RELATIVE_LINK2 string_view,Added `core.stdcpp.string_view`.))

)

$(BUGSTITLE_TEXT_HEADER Library changes,

$(LI $(RELATIVE_LINK2 pr6580,Add overload `std.random.unpredictableSeed!UIntType`))

)

$(BUGSTITLE_TEXT_HEADER Dub changes,

$(LI $(RELATIVE_LINK2 addcommand,Add Command))
$(LI $(RELATIVE_LINK2 dubEnvVar,dub now supports `$DUB` variable))
$(LI $(RELATIVE_LINK2 pre-post-run-commands,Pre/Post run commands added))
$(LI $(RELATIVE_LINK2 shebang-without-d-extension,Shebang without .d extension))
$(LI $(RELATIVE_LINK2 sortJson,Sort JSON))
$(LI $(RELATIVE_LINK2 version-identifier-filter,Added experimental feature to improve build cache efficiency))

)

$(CHANGELOG_SEP_HEADER_TEXT_NONEMPTY)

$(CHANGELOG_SEP_HEADER_TEXT)

$(BUGSTITLE_TEXT_BODY Compiler changes,

$(LI $(LNAME2 alias_from_trait,Aliases can be created directly from a `__trait`.)
$(CHANGELOG_SOURCE_FILE dmd, changelog/alias_from_trait.dd)
$(P
Aliases can be created directly from the traits that return symbol(s) or tuples.
This includes `getMember`, `allMembers`, `derivedMembers`, `parent`, `getOverloads`,
`getVirtualFunctions`, `getVirtualMethods`, `getUnitTests`, `getAttributes` and finally `getAliasThis`.
Previously an `AliasSeq` was necessary in order to alias their return.
Now the grammar allows to write shorter declarations:
)

---
struct Foo
{
    static int a;
}

alias oldWay = AliasSeq!(__traits(getMember, Foo, "a"))[0];
alias newWay = __traits(getMember, Foo, "a");
---

$(P
To permit this it was more interesting to include `__trait` in the basic types
rather than just changing the alias syntax. So additionally, wherever a type appears
a `__trait` can be used, for example in a variable declaration:
)

---
struct Foo { static struct Bar {} }
const(__traits(getMember, Foo, "Bar")) fooBar;
static assert(is(typeof(fooBar) == const(Foo.Bar)));
---
)

$(LI $(LNAME2 check-switch,Added -check switch to turn on and off each category of runtime checks.)
$(CHANGELOG_SOURCE_FILE dmd, changelog/check-switch.dd)
$(P
Option("check=[assert|bounds|in|invariant|out|switch][=[on|off]]",
            `Overrides default, -boundscheck, -release and -unittest options to enable or disable specific checks.
                $(UL
                    $(LI $(B assert): assertion checking)
                    $(LI $(B bounds): array bounds)
                    $(LI $(B in): in contracts)
                    $(LI $(B invariant): class/struct invariants)
                    $(LI $(B out): out contracts)
                    $(LI $(B switch): switch default)
                )
                $(UL
                    $(LI $(B on) or not specified: specified check is enabled.)
                    $(LI $(B off): specified check is disabled.)
                )`
        )
)
)

$(LI $(LNAME2 checkaction,Add `-checkaction=D|C|halt` compiler switch.)
$(CHANGELOG_SOURCE_FILE dmd, changelog/checkaction.dd)
$(P
It covers action taken when an assert fails, a bounds check fails,
or a final switch error happens. D means the usual D behavior of
throwing an `Error`, C means call the C runtime library assert failure
function, and halt means halt the program execution.
)

$(P
The halt is the main addition here, it enables very lightweight assert's.
)
)

$(LI $(LNAME2 color,`-color` and `-color=on` will now always output colorized console output)
$(CHANGELOG_SOURCE_FILE dmd, changelog/color.dd)
$(P
Before this release `-color` wouldn't output colorized console output if
the terminal detection failed.
With this release, a new option `auto` is introduced for `-color=<value>`
which will continue to be the default:
)

$(P
$(UL
    $(LI `auto`: enable colorized output if a tty is detected (default))
    $(LI `on`: always use colored output.)
    $(LI `off`: never use colored output.)
)
)

$(P
Hence, it is now possible to use `-color` (a shortcut for `-color=on`) to
force DMD to emit colorized console output.
For example, this will now use colorized console output:
)

$(P
$(CONSOLE
\> echo $(DOLLAR)(echo "test" | dmd -color - 2>&1)
__stdin.d(2): $(RED Error): no identifier for declarator $(B test)
)
)
)

$(LI $(LNAME2 debugmixins,The code generated by `mixin` statements can now be saved with -mixin)
$(CHANGELOG_SOURCE_FILE dmd, changelog/debugmixins.dd)
$(P
This is useful to debug errors in compilation and provides source for debuggers to show when requested.
)
)

$(LI $(LNAME2 deprecated_binary_literals,Deprecate invalid binary literals)
$(CHANGELOG_SOURCE_FILE dmd, changelog/deprecated_binary_literals.dd)
$(P
Prior to this release, binary literals without any digits after the prefix `0b`
were considered valid. This has now been deprecated.
)
---
auto foo = 0b;   // deprecated
auto bar = 0b_;  // deprecated
auto baz = 0b0;  // conforming equivalent
---
)

$(LI $(LNAME2 deprecated_extern_pascal,Deprecated `extern(Pascal)` linkage)
$(CHANGELOG_SOURCE_FILE dmd, changelog/deprecated_extern_pascal.dd)
$(P
This linkage is completely unused, being an heritage from a few decades ago.
Additionally, it's only supported by DMD and cause mangling ambiguity.
)
)

$(LI $(LNAME2 fqn_imports_bypass_private_imports_error,The deprecation phase for fully qualified names that bypassed private imports is finished)
$(CHANGELOG_SOURCE_FILE dmd, changelog/fqn_imports_bypass_private_imports_error.dd)
---
// a.d
import std.stdio;
---

---
// b.d
import a;

void main()
{
    std.stdio.writefln("foo");         // deprecation before patch, now errors
}
---

$(P
In order to compile the example successfully, `public` needs to be added
to the import located in `a.d` : `public import std.stdio;` or `import std.stdio;`
needs to be added to `b.d`.
)
)

$(LI $(LNAME2 posix_cpp_template_mangling,Templates are now mangled correctly on POSIX)
$(CHANGELOG_SOURCE_FILE dmd, changelog/posix_cpp_template_mangling.dd)
$(P
Before this version, anything including `extern(C++)` templates
was not correctly mangled on OSX, Linux, and FreeBSD, leading to linker errors.
)
)

$(LI $(LNAME2 wchar_t,Added `__c_wchar_t` as a correct mangling type for C's `wchar_t`)
$(CHANGELOG_SOURCE_FILE dmd, changelog/wchar_t.dd)
$(P
This allows code interfacing with C++ that uses `wchar_t` to link correctly.
It replaces `wchar` (Windows) and `dchar` (Posix) as the memory type for the
DRuntime alias `wchar_t`.
)
)


)

$(BUGSTITLE_TEXT_BODY Runtime changes,

$(LI $(LNAME2 array,Added `core.stdcpp.array`.)
$(CHANGELOG_SOURCE_FILE druntime, changelog/array.dd)
$(P
Added `core.stdcpp.array`, which links against C++ `std::array`
)
)

$(LI $(LNAME2 crt_externs,Add D header file $(REF_ALTTEXT `core.sys.darwin.crt_externs`, crt_externs, core, sys, darwin) for $(LINK2 https://opensource.apple.com/source/Libc/Libc-1244.30.3/include/crt_externs.h.auto.html, libc/crt_externs.h) on Darwin.)
$(CHANGELOG_SOURCE_FILE druntime, changelog/crt_externs.dd)
$(P
Add D header file $(REF_ALTTEXT `core.sys.darwin.crt_externs`, crt_externs, core, sys, darwin) for $(LINK2 https://opensource.apple.com/source/Libc/Libc-1244.30.3/include/crt_externs.h.auto.html, libc/crt_externs.h) on Darwin.
)
)

$(LI $(LNAME2 destroy_noinit,Added `initialize` template argument to `object.destroy()`.)
$(CHANGELOG_SOURCE_FILE druntime, changelog/destroy_noinit.dd)
$(P
`object.destroy()` now receives an `initialize` argument to specify whether to re-initialize the object after destruction.
)
)

$(LI $(LNAME2 string_view,Added `core.stdcpp.string_view`.)
$(CHANGELOG_SOURCE_FILE druntime, changelog/string_view.dd)
$(P
Added `core.stdcpp.string_view`, which links against C++ `std::string_view`
)
)


)

$(BUGSTITLE_TEXT_BODY Library changes,

$(LI $(LNAME2 pr6580,Add overload `std.random.unpredictableSeed!UIntType`)
$(CHANGELOG_SOURCE_FILE phobos, changelog/pr6580.dd)
$(P
$(REF unpredictableSeed, std,random) now has an overloaded version
`std.random.unpredictableSeed!UIntType` that can be used to produce
seeds of any unsigned type `UIntType`.
)

-------
import std.random : unpredictableSeed;

auto a = unpredictableSeed!uint;
static assert(is(typeof(a) == uint));

auto b = unpredictableSeed!ulong;
static assert(is(typeof(b) == ulong));

// The old syntax still works.
uint c = unpredictableSeed;
-------

$(P
Additionally the implementation quality of `unpredictableSeed` has been
improved, speeding it up and eliminating an obvious pattern in the high
bit. (Bear in mind that `unpredictableSeed` is still not
cryptographically secure.)
)
)


)

$(BUGSTITLE_TEXT_BODY Dub changes,

$(LI $(LNAME2 addcommand,Add Command)
$(CHANGELOG_SOURCE_FILE dub, changelog/addcommand.dd)
$(P
The `add` command adds a dependency to the dub.json/dub.sdl recipe file.
)

$(P
Running `dub add vibe-d` queries the latest version for vibe-d from the
registry, then rewrites your recipe file with the new dependency added.
)

$(P
dub.json:
)
------
  "dependencies": {
      "vibe-d": "~>X.Y.Z"
  }
------

$(P
dub.sdl:
)
------
dependency "vibe-d" version="~>X.Y.Z"
------

$(P
It is also possible to add multiple packages at once and explicitly add a
simple $(LINK2 https://code.dlang.org/package-format?lang=json#version-specs,version specification)
for some of them.
)

$(P
For example the command `dub add vibe-d='~>0.8.2' mir-algorithm=3.1.21` would
add the given 2 dependencies to the recipe file without querying the registry.
)

$(P
Packages with and without version-specifier can be mixed in a single invocation.
)

$(P
The can also be used to overwrite existing dependencies of the same name with
different version specifications.
)
)

$(LI $(LNAME2 dubEnvVar,dub now supports `$DUB` variable)
$(CHANGELOG_SOURCE_FILE dub, changelog/dubEnvVar.dd)
$(P
With this release, one can call dub from build commands in the following way:
)
------
    // dub.sdl:
    preBuildCommands "$DUB run --single somebuildscript.d"
-----
$(P
This is useful if dub is not in the `$PATH`, or if several versions of dub are installed.
)

$(P
`$DUB` is also accessible as environment variable in the build commands processes.
)

$(P
`$DUB` points to the running executable, unless it is used as a library.
In such case, `$DUB` will resolve to the first dub executable found in `$PATH`.
)
)

$(LI $(LNAME2 pre-post-run-commands,Pre/Post run commands added)
$(CHANGELOG_SOURCE_FILE dub, changelog/pre-post-run-commands.dd)
$(P
DUB now supports commands preRunCommands which are executed before the target run
and postRunCommands which are executed after the target run.
Environment variable DUB_TARGET_EXIT_STATUS contains the target executable call status
and is available in postRunCommands.
)
)

$(LI $(LNAME2 shebang-without-d-extension,Shebang without .d extension)
$(CHANGELOG_SOURCE_FILE dub, changelog/shebang-without-d-extension.dd)
$(P
Dub single-file packages e.g. `app.d` can now be called without .d extension.
In addition to `dub app.d --param` you can call `dub app --param`.
)

$(P
Also files without .d extension are supported now as single-file packages.
)
)

$(LI $(LNAME2 sortJson,Sort JSON)
$(CHANGELOG_SOURCE_FILE dub, changelog/sortJson.dd)
$(P
JSON files are now sorted before being written to dub.json. This is to prevent the order of the JSON properties from changing when dub.json is updated.
)
)

$(LI $(LNAME2 version-identifier-filter,Added experimental feature to improve build cache efficiency)
$(CHANGELOG_SOURCE_FILE dub, changelog/version-identifier-filter.dd)
$(P
Using version identifiers to configure certain features can often lead to
unnecessary rebuilds of dependencies that don't use those version
identifiers. In order to improve the build cache efficiency, dub gained a new
experimental `--filter-versions` switch.
)

$(P
When `--filter-versions` is passed to any build, test, or generate command, dub
will grep for all the version identifiers packages actually use and only apply
those during building. This allows for example to reuse a cached build for a
library between two applications using different version identifiers when the
library isn't using any of those itself.
)

$(P
The following regular expressions used to grep for version identifiers.
)
---
enum verRE = ctRegex!`(?:^|\s)version\s*\(\s*([^\s]*?)\s*\)`;
enum debVerRE = ctRegex!`(?:^|\s)debug\s*\(\s*([^\s]*?)\s*\)`;
---

$(P
For packages that use version identifiers in mixins or auto-generated sources,
the list of applicable version identifiers can be specified explicitly in the
package file.
)

$(P
dub.json:
)
---
"-versionFilters": ["Have_vibe_d"]
"-versionFilters-posix": ["UseUnixSockets", "UseMMap"]
"-debugVersionFilters": ["ValidateRequests"]
---
$(P
dub.sdl:
)
---
x:versionFilters "Have_vibe_d"
x:versionFilters "UseUnixSockets" "UseMMap" platform="posix"
x:debugVersionFilters "ValidateRequests"
---

$(P
Note that the inferred version identifiers are cached and grepping is generally
very fast, so explicitly specifying version identifiers should only be used if
necessary.
)

$(P
Also note that specifying either of versionFilters or debugVersionFilters will
disable inference for both of them.
)

$(P
The reservered version identifier none can be used for packages that don't use
any version identifiers or debug version identifiers at all.
)

$(P
dub.json:
)
----
"-versionFilters": ["none"]
----
$(P
dub.sdl:
)
----
x:debugVersionFilters "none"
----
)


)

$(CHANGELOG_SEP_TEXT_BUGZILLA)

$(BUGSTITLE_BUGZILLA DMD Compiler regressions,

$(LI $(BUGZILLA 15206): [REG2.077] ICE on optimized build, tym = x1d Internal error: backend\cgxmm.c 547)
$(LI $(BUGZILLA 16284): [REG2.067] CTFE internal error: bad compare)
$(LI $(BUGZILLA 18938): Dmd segfault when compiling this dub package in test release)
$(LI $(BUGZILLA 19103): Can imports symbols in module to a struct with mixin.)
$(LI $(BUGZILLA 19202): deprecated eponymous template prints no warning)
$(LI $(BUGZILLA 19227): S.init is S.init failing for struct with float member)
$(LI $(BUGZILLA 19389): Multiple assignment does not work for struct members)
$(LI $(BUGZILLA 19409): static if $(LPAREN)__traits$(LPAREN)compiles, __traits$(LPAREN)identifier, ...$(RPAREN)$(RPAREN)$(RPAREN) evaluates to false even though the expression alone evaluates to true)
$(LI $(BUGZILLA 19447): [REG2.066] fixed size slice assignment in ctfe loses connection with array)
$(LI $(BUGZILLA 19473): DMD Segfault on circular struct reference)
$(LI $(BUGZILLA 19491): ICE $(LPAREN)segfault$(RPAREN) when initializing scope variable with shared type)
$(LI $(BUGZILLA 19510): [2.084 REG] random and spurious error about a missing NOLOGO.d file)
)
$(BUGSTITLE_BUGZILLA DMD Compiler bugs,

$(LI $(BUGZILLA 5973): alias this is not considered with superclass lookup)
$(LI $(BUGZILLA 6777): alias this disables casting for classes)
$(LI $(BUGZILLA 9274): is + alias this = wrong code)
$(LI $(BUGZILLA 10692): Deprecation isn't checked using alias this)
$(LI $(BUGZILLA 11499): is-expression misbehaving with 'alias this')
$(LI $(BUGZILLA 13392): class + alias this + cast$(LPAREN)void*$(RPAREN) == overzealous cast)
$(LI $(BUGZILLA 13953): AA .remove pseudo-method doesn't work via alias this)
$(LI $(BUGZILLA 14632): Diagnostic improvement for invalid cast with alias this)
$(LI $(BUGZILLA 15876): various cases of SEGFAULT when formatting parser errors)
$(LI $(BUGZILLA 16082): Can't access alias this member with same name as module)
$(LI $(BUGZILLA 16086): Imported function name shadows alias this member)
$(LI $(BUGZILLA 16479): Missing substitution while mangling C++ template parameter for functions)
$(LI $(BUGZILLA 16633): Case where an alias this is tried before the object itself)
$(LI $(BUGZILLA 16976): Implicit conversion from ulong to int in foreach_reverse)
$(LI $(BUGZILLA 18010): Undefined reference to _d_arraycopy when copying arrays in -betterC)
$(LI $(BUGZILLA 18456): crt_constructor/crt_destructor segfaults if -lib)
$(LI $(BUGZILLA 18572): AliasSeq default arguments are broken)
$(LI $(BUGZILLA 18979): Template constructor bypasses private)
$(LI $(BUGZILLA 19014): Compiler imports symbols that aren't actually imported.)
$(LI $(BUGZILLA 19086): Bad stack trace for exceptions)
$(LI $(BUGZILLA 19307): Variables moved to a closure show nonsense in debugger)
$(LI $(BUGZILLA 19318): Variables captured from outer functions not visible in debugger)
$(LI $(BUGZILLA 19319): No line number when std.math is missing for x ^^ y)
$(LI $(BUGZILLA 19336): [ICE] segfault on invalid code)
$(LI $(BUGZILLA 19376): Do not generate object file from .di file passed on command line)
$(LI $(BUGZILLA 19381): capture pointer in nested function should not be called "this")
$(LI $(BUGZILLA 19415): return non-copyable struct fails if member function has return attribute)
$(LI $(BUGZILLA 19464): typeof immutable fields order dependent)
$(LI $(BUGZILLA 19497): the program crash using dmd with -O, it works fine without optimizations.)
$(LI $(BUGZILLA 19520): assert$(LPAREN)TypeExp is TypeExp$(RPAREN): compiles with empty structs)
)
$(BUGSTITLE_BUGZILLA DMD Compiler enhancements,

$(LI $(BUGZILLA 1870): Reproduce offending lines in error messages for string mixins)
$(LI $(BUGZILLA 7804): Cannot alias __traits directly)
$(LI $(BUGZILLA 12790): Compiler should keep mixin file around for debugging purposes)
$(LI $(BUGZILLA 16165): Show expected number of function arguments on mismatch)
$(LI $(BUGZILLA 19246): Binary literal `0b_` allowed)
$(LI $(BUGZILLA 19278): extern$(LPAREN)C++, "name"$(RPAREN) doesn't accept expressions)
$(LI $(BUGZILLA 19439): Make __traits$(LPAREN)getAliasThis$(RPAREN) return empty tuple for non-aggregate types)
)
$(BUGSTITLE_BUGZILLA Phobos regressions,

$(LI $(BUGZILLA 13300): pure function 'std.array.Appender!$(LPAREN)T[]$(RPAREN).Appender.ensureAddable' cannot call impure function 'test.T.__fieldPostBlit')
$(LI $(BUGZILLA 18824): [REG 2.080] Tuple's opBinaryRight takes precedence over appending a tuple to an array of tuples)
$(LI $(BUGZILLA 19133): core.exception.rangeerror@std/file.d$(LPAREN)3812$(RPAREN):)
$(LI $(BUGZILLA 19213): goto skips declaration of variable in std.algorithm.iteration.joiner)
)
$(BUGSTITLE_BUGZILLA Phobos bugs,

$(LI $(BUGZILLA 4957): std.concurrency does not allow to pass Tid in struct fields)
$(LI $(BUGZILLA 18327): std.random.XorshiftEngine is parameterized by UIntType but only works with uint)
$(LI $(BUGZILLA 18680): std.random.LinearCongruentialEngine has opEquals but no toHash)
$(LI $(BUGZILLA 18755): std.typecons.Rebindable breaks @safe-ty)
$(LI $(BUGZILLA 18778): std.format: Positional arguments do not work as expected with nesting)
$(LI $(BUGZILLA 18796): std.algorithm.substitute asserts on empty range)
$(LI $(BUGZILLA 19331): std.regex.internal.ir.SmallFixedArray.toHash is ignored because it's non-const)
$(LI $(BUGZILLA 19338): std.bitmanip.BitArray.count gives segfault for empy BitArray)
$(LI $(BUGZILLA 19366): Qualify opCast$(LPAREN)bool$(RPAREN) as const for findSplit, findSplitBefore and findSplitAfter)
$(LI $(BUGZILLA 19367): std.net.curl does not understand HTTP/2 status lines)
$(LI $(BUGZILLA 19456): ParameterIdentifierTuple incorrect for abstract methods with unnamed parameters)
)
$(BUGSTITLE_BUGZILLA Phobos enhancements,

$(LI $(BUGZILLA 5502): More handy ways to create associative arrays)
$(LI $(BUGZILLA 9702): std.string.replace for single chars too?)
$(LI $(BUGZILLA 10930): std.array.replace cannot simple replace an element in array)
$(LI $(BUGZILLA 18595): std.random: add unpredictableSeedOf!UIntType for non-uint unpredictableSeed)
$(LI $(BUGZILLA 19197): Replace instances of typeid$(LPAREN)T$(RPAREN).getHash$(LPAREN)..$(RPAREN) with hashOf)
$(LI $(BUGZILLA 19238): no-arg splitter should work on ranges of characters)
$(LI $(BUGZILLA 19308): Optimize std.string.stripLeft)
$(LI $(BUGZILLA 19364): Decrease template bloat for string functions)
$(LI $(BUGZILLA 19396): [betterC] ScopeBuffer can't be used in betterC with inline)
$(LI $(BUGZILLA 19403): Make std.string.stripLeft on char array @nogc nothrow)
$(LI $(BUGZILLA 19404): Optimize std.string.stripRight)
$(LI $(BUGZILLA 19405): Speed up backwards UTF-8 decoding in stripRight & make nogc nothrow for strings)
$(LI $(BUGZILLA 19429): indexOf$(LPAREN)"a", "b"$(RPAREN) should be nothrow/@nogc)
$(LI $(BUGZILLA 19466): functionLinkage documentation omits some values)
)
$(BUGSTITLE_BUGZILLA Druntime regressions,

$(LI $(BUGZILLA 19498): undefined identifier rt_loadLibraryW)
)
$(BUGSTITLE_BUGZILLA Druntime bugs,

$(LI $(BUGZILLA 8872): Missing extended window styles $(LPAREN)WS_EX_... enumeration$(RPAREN) in windows header)
$(LI $(BUGZILLA 11168): core.stdc.time.asctime$(LPAREN)$(RPAREN) is incorrectly marked as @trusted)
$(LI $(BUGZILLA 11174): Both AF_PACKET and SO_BINDTODEVICE undefined)
$(LI $(BUGZILLA 11294): Object destruction with alias this)
$(LI $(BUGZILLA 19087): `final switch` cannot be used in -betterC)
$(LI $(BUGZILLA 19090): core.internal.hash.bytesHash unit test uses incorrect test vector on BigEndian machines)
$(LI $(BUGZILLA 19204): hashOf doesn't accept SIMD vectors)
$(LI $(BUGZILLA 19332): hashOf fails to compile for const struct that has non-const toHash & has all fields bitwise-hashable)
$(LI $(BUGZILLA 19401): Fix bug in core.internal.traits.hasElaborateDestructor & hasElaborateCopyConstructor for struct with static array alias & for nested structs/unions)
$(LI $(BUGZILLA 19433): Don't consume --DRT-* options if rt_cmdline_enabled is false)
)
$(BUGSTITLE_BUGZILLA Druntime enhancements,

$(LI $(BUGZILLA 19214): Support object.destruct$(LPAREN)$(RPAREN) for efficient $(LPAREN)and correct!$(RPAREN) destruction)
$(LI $(BUGZILLA 19398): Document meaning of core.atomic.MemoryOrder)
$(LI $(BUGZILLA 19414): object.__cmp$(LPAREN)T[]$(RPAREN) on big-endian architectures can use memcmp for unsigned integers of any size)
$(LI $(BUGZILLA 19416): Make core.exception.onOutOfMemoryError work in betterC)
$(LI $(BUGZILLA 19421): Make pureMalloc, etc. usable in BetterC)
$(LI $(BUGZILLA 19423): In core.stdc.errno directly link __errno on OpenBSD & NetBSD)
$(LI $(BUGZILLA 19424): Add Haiku support to core.stdc.errno)
$(LI $(BUGZILLA 19468): Improve cyclic dependency error message)
)
$(BUGSTITLE_BUGZILLA dlang.org bugs,

$(LI $(BUGZILLA 19374): TypeVector undefined in grammar)
)
$(BUGSTITLE_BUGZILLA dlang.org enhancements,

$(LI $(BUGZILLA 19321): Unions "may not" have fields with destructors)
)
$(BUGSTITLE_BUGZILLA Installer bugs,

$(LI $(BUGZILLA 19434): "Invalid signature" when using install.sh with no ~/.gnupg)
)
)
$(D_CONTRIBUTORS_HEADER 53)
$(D_CONTRIBUTORS
    $(D_CONTRIBUTOR aG0aep6G)
    $(D_CONTRIBUTOR Andrei Alexandrescu)
    $(D_CONTRIBUTOR Andu033)
    $(D_CONTRIBUTOR ARaspiK)
    $(D_CONTRIBUTOR Arun Chandrasekaran)
    $(D_CONTRIBUTOR Basile Burg)
    $(D_CONTRIBUTOR BBasile)
    $(D_CONTRIBUTOR Chris)
    $(D_CONTRIBUTOR David Gileadi)
    $(D_CONTRIBUTOR Diederik de Groot)
    $(D_CONTRIBUTOR dukc)
    $(D_CONTRIBUTOR Eduard Staniloiu)
    $(D_CONTRIBUTOR H. S. Teoh)
    $(D_CONTRIBUTOR HANATANI Takuma)
    $(D_CONTRIBUTOR Iain Buclaw)
    $(D_CONTRIBUTOR Jacob Carlborg)
    $(D_CONTRIBUTOR jmh530)
    $(D_CONTRIBUTOR Joakim Noah)
    $(D_CONTRIBUTOR Johan Engelen)
    $(D_CONTRIBUTOR Johannes Pfau)
    $(D_CONTRIBUTOR jsatellite)
    $(D_CONTRIBUTOR kinke)
    $(D_CONTRIBUTOR Laurent Tréguier)
    $(D_CONTRIBUTOR look-at-me)
    $(D_CONTRIBUTOR Manu Evans)
    $(D_CONTRIBUTOR Martin Nowak)
    $(D_CONTRIBUTOR Mathias Lang)
    $(D_CONTRIBUTOR Mathis Beer)
    $(D_CONTRIBUTOR Mike Franklin)
    $(D_CONTRIBUTOR Mike Parker)
    $(D_CONTRIBUTOR Nathan Sashihara)
    $(D_CONTRIBUTOR Nicholas Lindsay Wilson)
    $(D_CONTRIBUTOR Nicholas Wilson)
    $(D_CONTRIBUTOR Nick Treleaven)
    $(D_CONTRIBUTOR Oleksandr Palamar)
    $(D_CONTRIBUTOR Paul Backus)
    $(D_CONTRIBUTOR Per Nordlöw)
    $(D_CONTRIBUTOR Petar Kirov)
    $(D_CONTRIBUTOR Pharap)
    $(D_CONTRIBUTOR Rainer Schuetze)
    $(D_CONTRIBUTOR Razvan Nitu)
    $(D_CONTRIBUTOR Richard Palme)
    $(D_CONTRIBUTOR Robert burner Schadek)
    $(D_CONTRIBUTOR Roman Chistokhodov)
    $(D_CONTRIBUTOR rracariu)
    $(D_CONTRIBUTOR Sebastian Wilzbach)
    $(D_CONTRIBUTOR Simen Kjærås)
    $(D_CONTRIBUTOR Stanislav Blinov)
    $(D_CONTRIBUTOR Steven Schveighoffer)
    $(D_CONTRIBUTOR Thomas Mader)
    $(D_CONTRIBUTOR Vladimir Panteleev)
    $(D_CONTRIBUTOR Walter Bright)
    $(D_CONTRIBUTOR wolframw)
)
$(D_CONTRIBUTORS_FOOTER)
$(CHANGELOG_NAV_INJECT)

Macros:
    VER=2.084.0
    TITLE=Change Log: $(VER)
