Change Log
Compiler Changes
- Warning: Change in helper function generation might cause link error.
- The new -profile=gc switch enables profiling memory allocation.
- unittest blocks no longer parsed unless -unittest is specified.
- Compiler generated inclusive destructor and postblit functions for UDTs are now accessible as .__xdtor and .__xpostblit, see dmd#4650.
Language Changes
Library Changes
- Many phobos functions were rangified.
- std.typetuple was renamed to std.meta but a backwards compatible forwarding module will remain.
- TypeTuple was renamed to AliasSeq but a backwards compatible alias will remain.
- hexString was added to replace core language hex strings.
- hasUDA was added to help check for the existence of user-defined attributes on symbols.
- GC API calls can now be profiled separately.
- The runtime implementations of synchronized and synchronized (obj) were rewritten to fix a race condition during mutex initialization, see druntime#1274.
- The handwritten object.di header was replaced by directly using the object.d source file, see druntime#1222 for more details.
- The AA implementation now uses open addressing.
- Merging code coverage reports was fixed, see Bugzilla 14464 and dmd_coverSetMerge.
- executeShell now ignores the SHELL environment variable and always uses sh, see Bugzilla 14282.
- byLine was improved to use getdelim where available and is now up to 3x faster, see Bugzilla 11810.
- The newly added ordered and strictlyOrdered can be used to test whether a few given values are ordered.
- RefCounted uses the new return attribute to enable escape checking for it's payload.
List of all bug fixes and enhancements in D 2.068.
Compiler Changes
- Warning: Change in helper function generation might cause link error.
In order to fix Issue 14828 compiler helper functions for array bounds checking and assert are now generated only once when a module is compiled, not everytime they are used. This may lead to link errors when using a module without compiling and linking against it.
If you encounter link errors like
undefined reference to '_D5mylib5mymod7__arrayZ'
undefined reference to '_D5mylib5mymod8__assertFiZv'
undefined reference to '_D5mylib5mymod15__unittest_failFiZv'
then you're not compiling and/or not linking the module mylib.mymod. - The new -profile=gc switch enables profiling memory allocation.
When compiling with -profile=gc dmd will instrument GC allocations to be traced by the runtime. The runtime accumulates the traces and writes a report to the file profilegc.log upon program termination.
Example:
bytes allocated, type, function, file:line 171 immutable(char)[] example.concat example.d:4 24 closure D main example.d:18 16 example.Klass D main example.d:20
Note: GC allocations using the core.memory interface are not profiled.
- unittest blocks no longer parsed unless -unittest is specified:
When the unittest code is not necessary, it will be merely analyzed as the tokens enclosed with paired braces, to speed up compilation speed.
unittest { auto r = test(); assert(r); } // If you don't specify -unittest, no AST generated for the unittest block. unittest { the contents is just ignored. } // Since 2.067: this had caused parsing error. // From 2.068: no error happens, because it's equivalent with: enum unittest_code = q{ the contents is just ignored. };
Language Changes
- Many phobos functions were rangified.
Many phobos functions that allocated GC memory were changed to support ranges or were complemented by an alternative supporting ranges. Using ranges often eliminates GC allocations.
setExtension("foo.jpg", ".png"); // allocates a new string withExtension("foo.jpg", ".png"); // returns a range without allocating
- pragma(inline) was added:
A new pragma was added for more fine-grained control of inlining. It must be used together with the -inline switch.
pragma(inline, true) // errors if function isn't inlined int double(int val) { return 2 * val; }
pragma(inline, false) // never inline int double(int val) { return 2 * val; }
Read the documentation for more details.
- Attributes for auto return function are now inferred.
Just like templated functions, functions with an auto return type must always have a function body. The compiler was changed to take advantage of this fact and now also infers attributes for them.
auto foo()() {} // template function auto bar() {} // non-template function without return type void baz() {} // non-template function with return type static assert(is(typeof(&foo!()) == void function() pure nothrow @nogc @safe)); static assert(is(typeof(&bar) == void function() pure nothrow @nogc @safe)); static assert(is(typeof(&baz) == void function()));
- Indexed type tuples can now be followed by dot identifiers.
A parsing limitation was lifted and it's now possible to use an indexed type tuple followed by dot identifiers as typename.
alias TypeTuple(T...) = T; struct S { alias T = int; alias U = TypeTuple!(long, string); } alias Types = Tuple!(S, S); Types[0].T a; // Types[0] == S, then typeof(a) == S.T == int Types[0].U[1] b; // Types[0].U == S.U, then typeof(b) == S.U[1] == string
- Support template parameter deduction from function default arguments:
When performing IFTI templated types can now be deduced from a parameter's default argument. This avoids a redundant and error prone declaration of the default type.
void previously(T=int)(T t = 0) { } // it was necessary to also specify a default type void now(T)(T t = 0) { } // the default type can be deduced from the default argument as int void main() { previously(); now(); }
- Invalid reinterpret casts can be detected in the frontend.
Invalid reinterpret casts are now detected in the compiler frontend instead of the backend. This allows to check for possible reinterpret casts during compile time and improves the error messages for invalid casts.
pragma(msg, is(typeof({ void* x; auto y = cast(void delegate())x; }))); // Since 2.067: it prints 'true' // From 2.068: it prints 'false' void test() { void* x; auto y = cast(void delegate())x; } // Since 2.067: it had reported internal compiler error "Error: e2ir: cannot cast ..." // From 2.068: it reports proper frontend error.
Library Changes
- GC API calls can now be profiled separately.
The GC option --DRT-gcopt=profile has been enhanced to accept an additional level 2 that allows profiling API calls grouped by most common operations.
As this instrumentation has an impact on the GC performance even if unused, you have to recompile the GC module with -debug=PROFILE_API, e.g.
dmd test.d -O -inline -debug=PROFILE_API -Ipath-to-druntime/src path-to-druntime/src/gc/gc.d ./test --DRT-gcopt=profile:2
The profiling summary will then look like this:malloc: 9768628 calls, 531 ms realloc: 0 calls, 0 ms free: 0 calls, 0 ms extend: 1100 calls, 0 ms other: 826 calls, 0 ms lock time: 160 ms GC API: 692 ms GC summary: 12 MB, 52 GC 331 ms, Pauses 227 ms < 4 ms API 692 ms
The malloc function includes time for GC collections. Lock time (GC synchronization) is measured separately and not included in the other times.
- The AA implementation now uses open addressing.
The runtime implementation for associative arrays was rewritten and now uses open addressing with quadratic probing and triangular numbers. This is much more cache friendly than the old separate chaining implementation and can result in ~25% faster lookups for big AAs. Also see druntime#1229.
Note: As the allocation pattern changed (the table is bigger, nodes are smaller) you might see a small drop in performance because the GC manages big allocations less efficiently.
List of all bug fixes and enhancements in D 2.068:
DMD Compiler regressions
- Bugzilla 9279: [REG2.055/2.063] Static array return value implicitly converted to immutable dynamic array
- Bugzilla 12984: [REG2.068a] ICE on forward reference of derived class from other instantiated class
- Bugzilla 13816: [REG2.066.0] The compiler crashes with recursive tuple expansion
- Bugzilla 14207: [REG2.065] [CTFE] ICE on unsupported reinterpret cast in compile time
- Bugzilla 14351: [REG2.063] inout base class constructor can't be called
- Bugzilla 14390: [REG2.068a] ICE or bad "has forward references" error with circular class structure
- Bugzilla 14406: [REG2.068a] GIT HEAD ignores forward reference and generates wrong code
- Bugzilla 14430: [REG2.060] Null parameter is detected as non-null.
- Bugzilla 14468: [Reg 2.068.0-devel] overload mismatch for template instance with typesafe variadic parameter
- Bugzilla 14481: [REG2.066] ICE with forward reference of manifest constant on template arguments
- Bugzilla 14520: [REG2.067.0] string/alias template overload
- Bugzilla 14528: [REG2.058a] can't pass protected member to template by alias
- Bugzilla 14546: "ClockType.uptime is not supported by MonoTimeImpl on this system"
- Bugzilla 14549: isVirtualMethod does not work well with Github DMD
- Bugzilla 14552: [REG2.066] SIGSEGV with compile construction nested class in predicate
- Bugzilla 14556: [REG2.067] can't instantiate struct that has constructor and static array of enum
- Bugzilla 14560: [REG2.058] Strange -inline behavior
- Bugzilla 14568: [REG2.067] gaggederrors ICE
- Bugzilla 14571: [REG2.064] Large static arrays seem to lock up DMD
- Bugzilla 14572: cannot build dmd from source anymore: 'g++ -m64: No such file or directory'
- Bugzilla 14573: [REG2.067] Extreme memory usage when synchronized( object ) is used
- Bugzilla 14587: [REG2.064] generated 64 bit code for switch jump tables is wrong
- Bugzilla 14594: [REG2.068a] DDoc for template functions and structs has disappeared
- Bugzilla 14606: [REG2.067.0] Bad code with -inline and structs
- Bugzilla 14609: [REG2.068a] Github HEAD: DMD assertion failure for valid code
- Bugzilla 14610: [REG2.067] 'null this' assertion missing in 2.067
- Bugzilla 14634: dmd crashes without any input
- Bugzilla 14642: [REG2.066] ICE in ctfeInterpret
- Bugzilla 14666: [REG2.061] Bogus forward reference error
- Bugzilla 14672: [REG2.067.0] Internal error: e2ir.c 4620 when copying array of derived class to an array of base class
- Bugzilla 14805: [REG2.064] Unreasonably slow "new Struct[large]"
- Bugzilla 14806: [REG2.063] alias this doesn't force elaborate equality, but is followed during it
- Bugzilla 14814: ld: GOT load reloc does not point to a movq instruction
- Bugzilla 14828: [REG2.067] duplicate symbol __ModuleInfoZ depending on ordering of files passed to dmd
- Bugzilla 14829: [REG2.066.0] wrong code with -O -inline
- Bugzilla 14834: [REG 2.068-b2] dirEntries with mask stopped working with "-inline -debug"
- Bugzilla 14836: [REG2.068a] Multiple variadic template argument trick broken
- Bugzilla 14838: [REG 2.066] Wrong attribute inference for auto-generated class destructor with static array of non-POD type
- Bugzilla 14844: [REG2.068a] __traits(allMembers) must not visit yet not instantiated template members
- Bugzilla 14851: [REG2.068.0-b2] Cannot assign array operation result to static array variable
- Bugzilla 14853: [REG2.066] DMD segfaults with the cast from mutable struct new to shared
- Bugzilla 14890: [REG 2.068.0-rc1] Can not construct a RedBlackTree of Tuples
DMD Compiler bugs
- Bugzilla 1759: Closures and With Statements
- Bugzilla 2803: template + default argument = doesn't work
- Bugzilla 3869: Unreasonable error without line number: "recursive template expansion"
- Bugzilla 5770: Template constructor bypass access check
- Bugzilla 6613: Can't use empty tuple as default value for variadic template function parameter
- Bugzilla 6766: Forward reference error for default struct/class arguments
- Bugzilla 8217: static nested class can reference outer scope by template instantiation
- Bugzilla 8234: symbols used in CTFE affect the function literal type
- Bugzilla 9023: CTFE: cannot use ~= on an empty AA.
- Bugzilla 10158: 'offsetof' property of nested struct does not work properly
- Bugzilla 10282: Refused assignment of vector op result to const array
- Bugzilla 10492: Illegal Instruction for mixin template with scope declarations
- Bugzilla 10972: aggregate postblit doesn't clean up in case of failure
- Bugzilla 11166: Forward reference error when alias of template instance is private
- Bugzilla 12036: Wrong code with auto-returning function as mixin alias param
- Bugzilla 12152: Cannot forward reference subclass member in superclass
- Bugzilla 12406: Broken delegate closure
- Bugzilla 12603: [CTFE] goto does not correctly call dtors
- Bugzilla 12799: Forward reference to nested enum with struct.sizeof
- Bugzilla 12971: Missing REX prefix for 8 bit register access
- Bugzilla 13270: ddoc can't find parameters of ditto'd function overloads
- Bugzilla 13920: DMD crash when trying to set a delegate from __traits(getOverloads)
- Bugzilla 13985: Wrong code when using "super" to call final interface method
- Bugzilla 14097: root/async.c: use after free
- Bugzilla 14185: [ICE] [mtype.c] compiler segfault in in Type::aliasthisOf
- Bugzilla 14243: mixin template scope inconsistency?
- Bugzilla 14249: Loose error check for incorrect template mixin
- Bugzilla 14264: Destructor not called when struct is returned from a parenthesis-less function call
- Bugzilla 14268: Win64: debug info for associative arrays have no type information
- Bugzilla 14281: duplicate .debug_info entries for arrays, delegates and aa's
- Bugzilla 14290: is-expression accepts instantiation of already instantiated template
- Bugzilla 14320: Improve diagnostic message for "undefined identifier" error
- Bugzilla 14321: Unnecessary destructor call with and AA's
- Bugzilla 14325: [CTFE] Comparison of AAs makes wrong result
- Bugzilla 14330: Wrong DWARF type of dynamic array variable
- Bugzilla 14343: Postfix increment doesn't work on structs with immutable member
- Bugzilla 14348: typeof(x).ident is not accepted as a symbol
- Bugzilla 14352: Two goto cases in one case branch does not work correctly
- Bugzilla 14357: Match on specType does not check the conflict with already deduced template arguments
- Bugzilla 14371: [CTFE] Binary assignment expression makes wrong result in compile-time
- Bugzilla 14388: ICE with idup-ed struct literal in template argument
- Bugzilla 14398: Segfault when nested struct in static array accesses context
- Bugzilla 14407: No protection and attributes check for class/struct allocator in NewExp
- Bugzilla 14409: false positive "Error: one path skips constructor"
- Bugzilla 14416: .sizeof yields 1 for uninstantiated struct templates
- Bugzilla 14425: Indirect template instantiation within is expression causes missing linker symbols
- Bugzilla 14446: ICE on invalid import
- Bugzilla 14510: Bad tail call optimization with static arrays
- Bugzilla 14596: Error: e2ir: cannot cast malloc(42u) of type void* to type char[]
- Bugzilla 14617: PTHREAD_MUTEX_INITIALIZER does not work on OSX
- Bugzilla 14629: Type system breaking and wrong code bugs in casting reference types to typeof(null)
- Bugzilla 14649: ICE on invalid array operation with string literals
- Bugzilla 14656: "auto" of "auto ref" spills over to other function
DMD Compiler enhancements
- Bugzilla 9914: Do attribute inference for auto functions
- Bugzilla 11003: Improve .di generation
- Bugzilla 14465: CTFE exception stacktrace shows location of Exception constructor
- Bugzilla 14547: Ddoc should prefer new Variable Template syntax
Phobos regressions
- Bugzilla 14712: GIT HEAD : std.net.curl regressions
- Bugzilla 14748: Removing std.stdio import causes 2x increase in "Hello, world" program binary filesize
- Bugzilla 14765: [Reg2.068.0] Rangified functions no longer accept types that implicitly cast to string
- Bugzilla 14842: [REG 2.068-b2] approxEqual does not work with integers
- Bugzilla 14881: [REG] posix.mak omits package.d files when building zip file
Phobos bugs
- Bugzilla 12702: [FixIncluded] std.container.RedBlackTree's in operator is not const
- Bugzilla 13534: std.variant can violate memory safety
- Bugzilla 14282: executeShell should use sh and ignore the SHELL env variable
- Bugzilla 14373: std.range.refRange doesn't work on mere input ranges
- Bugzilla 14408: std.process: Can't start interactive process from Windows GUI application
- Bugzilla 14422: std.process: Pipes do not append to files on Win64
- Bugzilla 14469: file.readText on Win64 doesn't work for files > 4GB.
- Bugzilla 14526: GetOptException DDOC needs cleanup
- Bugzilla 14544: isForwardRange failed to recognise valid forward range
- Bugzilla 14575: compile error with std.range.refRange when front/back isn't implicitly convertible from const to mutable
- Bugzilla 14585: destructor called on garbage in std.variant
Phobos enhancements
- Bugzilla 14194: nothrow emplace for classes needed
- Bugzilla 14288: std.windows.registry should use std.windows.syserror
- Bugzilla 14289: WindowsException should not attempt to parse code 0
- Bugzilla 14368: stdio.rawRead underperforms stdio
- Bugzilla 14432: move construction for RefCounted
- Bugzilla 14457: Algebraic does not allow assignment from subset type
- Bugzilla 14535: std.net.curl.CurlException should include status line
- Bugzilla 14548: std.stdio.File should have sync() method (fsync/FlushFileBuffers wrapper)
- Bugzilla 14586: can't get an immutable value from a const std.variant.Variant
Druntime regressions
- Bugzilla 14626: [REG2.066] byValue doesn't work with inout AA
- Bugzilla 14746: [REG2.068a] Behavior change with struct destructor and alias this
- Bugzilla 14863: CLOCK_BOOTTIME should be optional to support <2.6.39 kernels
Druntime bugs
- Bugzilla 6607: critical_.d and critical.c use double check locking the wrong way
- Bugzilla 12289: incorrect core.stdc.stdio.fpos_t alias
- Bugzilla 14350: Unit test failures are not displayed in Windows GUI programs
- Bugzilla 14401: typeid(shared X).init is empty for class types
- Bugzilla 14423: struct destructors not finalized for AA values
- Bugzilla 14464: coverage merge doesn't work
- Bugzilla 14476: core.thread unit tests failing on FreeBSD 9+
- Bugzilla 14511: Profiler does not work with multithreaded programs
- Bugzilla 14565: dmd -profile produces garbled output for long-running CPU-intensive processes
Druntime enhancements
- Bugzilla 12891: add atomicFetchAdd and atomicFetchSub to core.atomic
- Bugzilla 14385: AA should use open addressing hash
dlang.org bugs
- Bugzilla 12803: __traits(getFunctionAttributes) is not documented
- Bugzilla 13527: ddoc website documentation does not match the current built-in symbols
- Bugzilla 14079: Variable templates' documentation not generated.
- Bugzilla 14080: No mention of documented unittests on ddoc's page
- Bugzilla 14326: syntax highlighting of dpl-docs no longer works
- Bugzilla 14418: D-style Variadic Function example does not compile
Tools bugs
- Bugzilla 13758: RDMD renames directory if -ofNAME is the name of a directory
- Bugzilla 14259: rdmd: --build-only / -of / -od incompatible with --dry-run
Installer bugs
- Bugzilla 14801: OS X installer not compatible with OS X 10.11
- Bugzilla 14864: windows uninstall during installation pops up spurious warning
List of all bug fixes and enhancements in D 2.067.1:
DMD Compiler regressions
- Bugzilla 14344: [REG2.067] Wrong opBinary call in construction
- Bugzilla 14376: [REG2.064] false positive "Error: one path skips field"
- Bugzilla 14395: [REG2.067] Typesafe variadic function call collapsed if being used for default value
- Bugzilla 14424: [REG2.066] dmd crashes with __traits(getUnitTests)
- Bugzilla 14440: [REG2.067] [CTFE] Wrong values set in a matrix constructor
- Bugzilla 14443: [REG2.067.0] Incorrect double freeing of reference counted struct
- Bugzilla 14463: [REG2.067] DMD crashes compiling module level immutable struct that takes an array in ctor
DMD Compiler bugs
- Bugzilla 14375: static assert leads to __traits(allMembers) retuning an extra empty entry
Phobos regressions
- Bugzilla 14396: [REG2.066] compile error std.conv.parse!int with input range
Druntime regressions
- Bugzilla 14467: arr.capacity sometimes erroneously returns 0
Website bugs
- Bugzilla 14329: [2.067] offline doc - menu broken due to missing jquery-1.7.2.min.js
Language Changes
- Destructors for structs allocated on the heap are now invoked.
- asm statements can now be used in pure, nothrow, @nogc, or @trusted code.
- package protection attribute can be optionally bound to specified package
- Sealed references were added (DIP25)
- The with statement now observes temporary object lifetime
Library Changes
- The garbage collector got faster.
- volatileLoad and volatileStore intrinsics were added.
- Experimental: The garbage collector can now be configured.
- byKeyValue was added.
- initOnce was added to perform thread-safe lazy initialization.
List of all bug fixes and enhancements in D 2.067.
Language Changes
- Destructors for structs allocated on the heap are now invoked.
Previously, when a struct allocated on the heap was freed, the destructor was not invoked. This is no longer the case, and these destructors will now be invoked before the memory is freed by the GC.
- asm statements can now be used in pure, nothrow, @nogc, or @trusted code.
By adding the appropriate attributes to an asm statement you can tell the compiler how that asm code behaves, thus allowing asm statements to be used in pure, nothrow, @nogc, or @safe functions.
asm pure nothrow @nogc @trusted { // the compiler does not check the attributes ret; }
- package protection attribute can be optionally bound to specified package
New optional syntax was added for package protection attribute:
module aaa.bbb.ccc.ddd; // accessible from any module with aaa.bbb in qualified path package(aaa.bbb) void foo() {} // old style, means same as package(aaa.bbb.ccc) package void bar() {}
- Sealed references were added (DIP25)
In @safe functions it is now required to use return ref to return a reference to a parameter or a field of it.
@safe: ref int fun(ref int a) { return a; } // ERROR ref int gun(return ref int a) { return a; } // FINE ref T hun(T)(ref T a) { return a; } // FINE, templates use deduction
See DIP25 for more details.
- The with statement now observes temporary object lifetime
A longstanding bug of the with statement was fixed which prevented the idiomatic use of RAII values.
with (File("output.log", "w")) { writeln("Content"); } // File is automatically closed
Library Changes
- This release comes with various GC optimizations that make many applications faster.
A new GC growth policy was implemented that helps to reduce the number of collections by keeping a collection threshold at 2x the size of the used memory. After each collection the used memory and the threshold are recomputed. This allows for an exponential growth of the GC heap, e.g. during program startup, but limits the heap size relative to the actual used memory. The factor 2x is configurable by setting heapSizeFactor.
The heap traversal during the marking phase is now done using tail recursion with a separate compact state stack. This allows to mark very deep heaps (lists) much faster because the previous recursion limit of 50 is eliminated.
You can see a list of all improvements here.
- volatileLoad and volatileStore intrinsics were added.
Calls to volatileLoad and volatileStore are recognized by the compiler and guaranteed to not be removed or reordered in the same thread.
void example(uint* address, uint value) { import core.bitop; // store value volatileStore(address, value); // wait until value takes affect while (volatileLoad(address) != value) { } }
Note: These intrinsics are currently in core.bitop, but will be moved to core.volatile when volatile is no longer a keyword.
- Experimental: The garbage collector can now be configured through the command line,
the environment or by options embedded into the executable.
By default, GC options can only be passed on the command line of the program to run, e.g.
app "--DRT-gcopt=profile:1 minPoolSize:16" arguments to app
Available GC options are:
- disable:0|1 - start disabled
- profile:0|1 - enable profiling with summary when terminating program
- initReserve:N - initial memory to reserve in MB
- minPoolSize:N - initial and minimum pool size in MB
- maxPoolSize:N - maximum pool size in MB
- incPoolSize:N - pool size increment MB
- heapSizeFactor:N - targeted heap size to used memory ratio
In addition, --DRT-gcopt=help will show the list of options and their current settings.
Command line options starting with "--DRT-" are filtered out before calling main, so the program will not see them. They are still available via rt_args().
Configuration via the command line can be disabled by declaring a variable for the linker to pick up before using it's default from the runtime:
extern(C) __gshared bool rt_cmdline_enabled = false;
Likewise, declare a boolean rt_envvars_enabled to enable configuration via the environment variable "DRT_GCOPT:
extern(C) __gshared bool rt_envvars_enabled = true;
Setting default configuration properties in the executable can be done by specifying an array of options named rt_options:
extern(C) __gshared string[] rt_options = [ "gcopt=initReserve:100 profile:1" ];
Evaluation order of options is rt_options, then environment variables, then command line arguments, i.e. if command line arguments are not disabled, they can override options specified through the environment or embedded in the executable.
- byKeyValue was added.
Built-in associative arrays now have a .byKeyValue method that returns a forward range iterating over key/value pairs.
void main() { auto aa = ["a": 1]; foreach (pair; aa.byKeyValue) { assert(pair.key == "a"); assert(pair.value == 1); } }
- enumerate was added.
enumerate enables iteration of ranges with an index variable:
void main() { import std.stdio : stdin, stdout; import std.range : enumerate; foreach (lineNum, line; stdin.byLine().enumerate(1)) stdout.writefln("line #%s: %s", lineNum, line); }
- handle was added.
handle enables exception handling in range compositions:
import std.algorithm : equal; import std.range : retro; import std.utf : UTFException; auto str = "hello\xFFworld"; // 0xFF is an invalid UTF-8 code unit auto handled = str.handle!(UTFException, RangePrimitive.access, (e, r) => ' '); // Replace invalid code points with spaces assert(handled.equal("hello world")); // `front` is handled, assert(handled.retro.equal("dlrow olleh")); // as well as `back`
- An experimental logging system was added.
import std.experimental.logger; void main() { log("message logging in D"); }
List of all bug fixes and enhancements in D 2.067:
DMD Compiler regressions
- Bugzilla 4890: GC.collect() deadlocks multithreaded program.
- Bugzilla 12381: [REG2.065] [ICE] An internal error in e2ir.c while casting array ops
- Bugzilla 12422: [REG2.055] Templated nested function is inferred as pure even if it calls impure functions
- Bugzilla 12912: Lambda function is incorrectly inferred as impure if it uses member field or function
- Bugzilla 13009: [REG2.064] inout overload conflicts with non-inout when used via alias this
- Bugzilla 13311: [REG2.065] ICE, CtorDeclaration::semantic(Scope*): Assertion `tf && tf->ty == Tfunction' failed
- Bugzilla 13479: [REG2.067a] Templates not emitted when instantiated in mixins mixed in functions
- Bugzilla 13497: [REG2.065] [ICE e2ir 1911] Array op compiler error
- Bugzilla 13498: Return type is not checked in function template
- Bugzilla 13502: [REG2.065] Stray '(' warning not emitted for documentation of enum templates
- Bugzilla 13503: [REG2.065] Bad code with -inline, varargs and auto return
- Bugzilla 13514: Druntime no longer builds with -g
- Bugzilla 13515: [REG2.064] "Range violation" when writing to array of AAs from static this
- Bugzilla 13550: [REG2.067a] Inner functions take outer function attributes erroneously
- Bugzilla 13564: [REG2.065] nested struct destructor trying to access members of a global class fail to compile
- Bugzilla 13601: [REG2.064] static if (__ctfe) should emit error
- Bugzilla 13640: [REG2.066] can break immutability with inout
- Bugzilla 13644: [REG2.066] ICE with foreach over array of Tuples
- Bugzilla 13673: ICE(backend/cod2.d 5114)
- Bugzilla 13675: enum type used with template causes compiler to segfault
- Bugzilla 13694: Typesafe variadic function template overload fails to match to any template
- Bugzilla 13714: [REG2.066.1] Assertion failure: '0' on line 2022 in file 'mtype.c'
- Bugzilla 13729: [REG2.067a] One not detected case of not purity
- Bugzilla 13760: [REG2.067a] Cannot deduce function for object.get
- Bugzilla 13775: [REG2.067a] Broken explicit casting of dynamic array slices of known size to static array of different type
- Bugzilla 13776: [REG2.067a] Incorrect "recursive alias declaration" error with __traits(compiles, ...)
- Bugzilla 13807: [REG2.067a] inout(T)[] no longer matches string[]
- Bugzilla 13827: [REG2.067a] Internal Compiler Error: null field
- Bugzilla 13840: [REG2.067a] nothrow attribute affects inside of try-catch block when using foreach with opApply
- Bugzilla 13864: [REG2.066] tuple expand causes range violation
- Bugzilla 13873: 2.066.1 Compiling with -debug -inline generates huge files
- Bugzilla 13886: [REG2.066] global.gaggedErrors ICE
- Bugzilla 13921: ICE with template instantiation error
- Bugzilla 13934: Cannot pass 'this' to function by reference
- Bugzilla 13937: C++ mangling for template negative parameter not correct for dmc
- Bugzilla 13942: [REG2.066] Bad template error message
- Bugzilla 13950: [REG2.062] zero-length tuple does not work on function default argument
- Bugzilla 13952: [REG2.067a] change in struct ctor lowering triggers codegen bug
- Bugzilla 13966: [REG2.067a] dmd: expression.c:3761: size_t StringExp::length(int): Assertion `encSize == 1 || encSize == 2 || encSize == 4' failed.
- Bugzilla 13968: [REG2.067a] constructing and returing union causes segfault
- Bugzilla 13969: [REG2.063] [ICE] (backend\cgcod.c 2309) with cycle(iota(a,b,s))
- Bugzilla 13992: [REG2.067a] CTFE produces strange error with += operator on integer type
- Bugzilla 13998: Wrong code with -O -inline, loops, and taking address of double
- Bugzilla 13999: [REG2.067a] Associative array literal with static array keys must now have matching key lengths
- Bugzilla 14038: [REG2.067a] Non-mutable AA initialization segfaults in runtime
- Bugzilla 14039: [REG2.067a] function is incorrectly inferred as 'pure'
- Bugzilla 14044: dmd generates spurious functions in object file created from empty module
- Bugzilla 14049: [REG2.064] Wrong purity inference for nested lambda
- Bugzilla 14057: [REG2.066] opSlice not working correctly with AliasThis
- Bugzilla 14061: Refused array concat at compile-time
- Bugzilla 14074: [REG2.067a] non-separate compilation fails, but separate compilation works
- Bugzilla 14075: [REG2.067a] Segfault with ambiguous overloading functions without body
- Bugzilla 14089: [REG2.064] Assigning to AA has no value when overriding opAssign
- Bugzilla 14090: [REG2.067a] Incorrect "recursive alias declaration"
- Bugzilla 14093: [REG2.065] __traits(compiles, cast(Object)(tuple)) is true even if it doesn't compile.
- Bugzilla 14104: aa with pointer key type doesn't find existing value
- Bugzilla 14106: sort is @safe in release mode, @system in debug mode
- Bugzilla 14109: [REG2.066.1] Property-like function call does not work on template value parameter
- Bugzilla 14126: GITHEAD - GC seemingly corrupting memory
- Bugzilla 14130: [REG2.067a] ICE following error in template parameter default value
- Bugzilla 14144: [REG2.067a] opAssign seems broken
- Bugzilla 14146: [REG2.067a] ICE with non-empty default constructor in struct
- Bugzilla 14155: [REG2.066] A defect in DIP29: the return value of some pure functions cannot be unique pointer
- Bugzilla 14160: [REG2.066] mutable global data access is wrongly accepted in pure function
- Bugzilla 14166: [REG2.066] Excess CTFE running for the temporary variable in module level expression
- Bugzilla 14169: Template symbol visibility regression
- Bugzilla 14173: [REG2.064] Omitting return type with override hides an error
- Bugzilla 14177: [REG2.066.1] ICE(statement.c) recursive aliases
- Bugzilla 14198: [REG2.067a] Link failure with Variant
- Bugzilla 14199: [REG2.067a] Dwarf Error: mangled line number section
- Bugzilla 14218: [REG2.067a] casting null to integer type causes error message
- Bugzilla 14220: Bad codegen for optimized std.conv.text in combination with concatenation
- Bugzilla 14232: redundant attribute 'const'
- Bugzilla 14235: [REG2.066] full-qualified template instantiation misses its error location
- Bugzilla 14262: [REG] [2.067-b3] Can't use class this as ref argument
- Bugzilla 14267: [REG2.067beta2] ICE when determining if a function can be inlined
- Bugzilla 14283: [2.067-b4]: Spurious "this is not an lvalue" deprecation message for "auto ref" arguments
- Bugzilla 14285: [REG2.063] alias this to nothing is accepted
- Bugzilla 14299: [REG2.067.0-rc1] "ref" parameter in CTFE handled incorrectly for recursive calls
- Bugzilla 14301: [2.067-rc1] Private symbols of module conflicts with public from another
- Bugzilla 14304: [REG2.067a] ICE with static immutable variable CTFE
- Bugzilla 14317: [REG2.066] ICE (cgcod.c 1767) when compiing with -profile -O -inline
DMD Compiler bugs
- Bugzilla 1625: CTFE: cannot evaluate function when return type includes a union
- Bugzilla 1829: Inline assembler cannot get label addresses
- Bugzilla 2644: Unresolved template reference
- Bugzilla 2834: Struct Destructors are not called by the GC, but called on explicit delete.
- Bugzilla 3022: scope x = new Foo; does not allocate on stack if Foo has allocator
- Bugzilla 3918: Parameter use before its use in an AndAnd expression with reals treats NaN as false
- Bugzilla 4062: can call method without this pointer inside is()
- Bugzilla 4103: opAssign signature rules not enforced on templated opAssign
- Bugzilla 4149: refs displayed as pointers in gdb
- Bugzilla 4181: GDB prints wrong value of TLS variables
- Bugzilla 5314: Wrong error message: struct within immutable member and postblit function
- Bugzilla 5908: Optimizer generates wrong value with divide-by-zero.
- Bugzilla 6423: Garbage is returned from void main()
- Bugzilla 6565: out 2D fixed-sized array
- Bugzilla 6574: Erroneous recursive call in template instantiation
- Bugzilla 6810: Strange tuple used as a type error
- Bugzilla 7104: linker error on void main(){ typeof(new class{}) c; c = new typeof(c); }
- Bugzilla 7151: [CTFE] cannot compare classes with ==
- Bugzilla 7465: Duplicate error message for bad template mixin
- Bugzilla 7874: [CTFE] internal error: unsupported assignment (x OP= y) = z
- Bugzilla 7942: Appending different string types corrupts memory
- Bugzilla 8246: tuple fields pollute the linker namespace
- Bugzilla 8425: Missing line number and module name that can't use core.simd
- Bugzilla 9047: Expression requiring std.math fails with function-local import
- Bugzilla 9148: 'pure' is broken
- Bugzilla 9537: auto ref returns a reference its own stack
- Bugzilla 9554: Inconsistent stringof and mangleof result for module/package identifier
- Bugzilla 9581: Exceptions are too slow
- Bugzilla 9620: Error messages of failed pure enforcement
- Bugzilla 9685: Context pointer of struct isn't copied when a closure is passed by alias
- Bugzilla 9728: Ddoc anchors non-unique across overloads
- Bugzilla 9906: filter of static opCall
- Bugzilla 10307: Bad error message for not supported array operation
- Bugzilla 10311: gdb prints wrong value for variable updated from closure
- Bugzilla 10528: Private constant (enum) properties not private
- Bugzilla 10855: Missing dmd.conf for FreeBSD in DMD 2.063.2 release
- Bugzilla 10915: std.typecons.Nullable throws in writeln() if it's null
- Bugzilla 10920: template instantiation order dependent link failure problem
- Bugzilla 11042: Inconsistent "static condition" behaviors
- Bugzilla 11260: Assertion `type->ty != Tstruct || ((TypeStruct *)type)->sym == this' failed
- Bugzilla 11355: Copy through alias this with @disabled this(this)
- Bugzilla 11467: [CTFE] Overlapping array copy is allowed in CT
- Bugzilla 11746: invalid enum forward reference pattern not detected
- Bugzilla 11888: Incorrect behaviour taking slice from return value
- Bugzilla 11902: DMD debuginfo doesn't seem to write classes correctly
- Bugzilla 11915: Inconsistent overload resolution behaviour between ref and out
- Bugzilla 11916: [IFTI] Disabled by constraint overload with out with IFTI breaks overload resolution
- Bugzilla 12092: Wrong TLS access in PIC code (X86_32)
- Bugzilla 12130: Segmentation fault if HOME environment variable does not exist
- Bugzilla 12163: pdb debugging (win64): stepping loops points to incorrect lines
- Bugzilla 12447: variadic template functions hijack all eponymous enum and alias template overloads
- Bugzilla 12495: CTFE slice cast can cause allocation
- Bugzilla 12500: ICE in codegen when multiplying an incremented size_t by a double
- Bugzilla 12502: Some static array casts incorrectly rejected in safe code
- Bugzilla 12531: forward reference with nested struct
- Bugzilla 12579: DMD rejects valid function literal
- Bugzilla 12636: extern(C++) class that implements D interface segfaults
- Bugzilla 12741: DMD accepts functions with contracts and no body
- Bugzilla 12776: Wrong type for __vector(int[4]).init
- Bugzilla 12780: Multiplying integer array by scalar double fails
- Bugzilla 12827: [ICE] Segfault on immutable field self-initialization
- Bugzilla 12871: inner function returning pointer to outer context local rejected
- Bugzilla 12908: [AA] foreach by keys and values over associative array in pure function allow impure function calls
- Bugzilla 12979: Nothrow violation error is hidden by inline assembler
- Bugzilla 12983: overload not recognized depending on order of declaration
- Bugzilla 13028: [ICE] CTFE internal error: cannot evaluate at compile time
- Bugzilla 13064: Redundant auto storage class is allowed for functions
- Bugzilla 13095: Sometimes struct destructor is called if constructor throws
- Bugzilla 13120: Body of foreach over string with transcoding ignores function attributes
- Bugzilla 13200: Assertion `protName' failed
- Bugzilla 13236: Invalid recursive struct field error not gagged in 'is'-expression
- Bugzilla 13280: this.sizeof rejected as static array length in some cases
- Bugzilla 13289: wchar and dchar C++ mangling is incorrect
- Bugzilla 13295: [CTFE] Modifications of const user type disappear
- Bugzilla 13297: [CTFE] Modifications of user type pointer member passed by ref in function disappear
- Bugzilla 13320: Redundant error messages for missing operation on struct instance
- Bugzilla 13336: auto ref return deduced to be ref despite return value coercion
- Bugzilla 13337: Invalid extern C++ namespace resolution
- Bugzilla 13356: [ICE] (dmd 2.066: statement.c:754) with recursive Algebraic
- Bugzilla 13361: Empty UDA accepted
- Bugzilla 13382: [e2ir] compare string to int - leads to ICE in e2ir.c 1902
- Bugzilla 13385: ICE with new package(names) protection
- Bugzilla 13403: [ICE][2.067Alpha] Internal error: backend\type.c 332 with new package protection extension.
- Bugzilla 13434: [ICE] indexing array with empty tuple causes dmd segfault
- Bugzilla 13437: [e2ir] ICE in e2ir.c 4616
- Bugzilla 13459: segfault in two auto opSlices()
- Bugzilla 13465: Segfault by eager semantic2 running in template instantiation
- Bugzilla 13468: Wrong code when comparing class reference with typeof(null)
- Bugzilla 13481: bug with inferring attributes from built-in properties
- Bugzilla 13484: Template type deduction from delegate parameter fails
- Bugzilla 13485: FP wrong-code with -O
- Bugzilla 13490: Can't append to array of structs with alias this as lvalue ternary opoerator result
- Bugzilla 13505: No line number with void array in class
- Bugzilla 13508: array vararg function safety not inferred
- Bugzilla 13521: [D1] -di disables declaration shadowing message
- Bugzilla 13528: Internal Compiler Error: CTFE DotType:
- Bugzilla 13530: [REG 2.066] D Inline Assembler in nothrow function hides errors
- Bugzilla 13539: Disallow optional template parameters with C-style syntax
- Bugzilla 13563: ICE with opIndexAssign op-overloading and ModuleScopeOperator
- Bugzilla 13574: incorrect code for assignment to dollar in slice expression
- Bugzilla 13583: Inconsistent naming of template arguments in debug symbols
- Bugzilla 13586: Destructors not run when argument list evaluation throws
- Bugzilla 13599: [D1] backend/cod1.c ICE with -inline
- Bugzilla 13600: ICE in dwarf.c line 1949 with -g enabled and lazy void parameter
- Bugzilla 13612: Wrong 'this' variable accessed in recursive ctfe member function
- Bugzilla 13613: Pragma msg affects data structure layout
- Bugzilla 13630: Senseless error with foreach over variadic list
- Bugzilla 13645: Incorrect ddoc generation for deprecated module
- Bugzilla 13661: static array init does not call destructors
- Bugzilla 13666: Undefined Symbols for __gshared data symbols in templates
- Bugzilla 13668: [ICE] unable to compile __traits(allMembers...)
- Bugzilla 13669: [CTFE] Destructor call on static array variable is not yet supported in CTFE
- Bugzilla 13679: foreach_reverse is allowed for AAs
- Bugzilla 13701: [REG2.061] Associative array values ignore immutability
- Bugzilla 13707: msvc32 C++ struct return ABI not followed for structs with constructors
- Bugzilla 13739: in CTFE making an array over an array copies the data
- Bugzilla 13740: CTFE fails ref foreach over range
- Bugzilla 13747: Linux CMSG_NXTHDR is private, since alias doesn't change protection level
- Bugzilla 13757: [CTFE] extern(C) alias declaration does not work in CTFE
- Bugzilla 13779: gdb can't find frame base when using ld.gold
- Bugzilla 13783: Function overload with rvalue inout parameter not selected when enum parameter implicitly converted to its base type
- Bugzilla 13784: Wrong code with modulo operation and optimisations enabled
- Bugzilla 13787: Error without line number when slicing function pointer
- Bugzilla 13788: dmd segfault, pragma(mangle) and a mixin
- Bugzilla 13795: DMD ICE segfault compiling druntime
- Bugzilla 13831: DMD crash on newing struct with overlapped fields in CTFE
- Bugzilla 13832: delegates that return ref do not output correctly to .di file
- Bugzilla 13835: ICE in interpret.c:736 - Issue with static variables.
- Bugzilla 13841: infinite loop in compiler on simd arithmetic
- Bugzilla 13843: Issue when passing a delegate as an class alias template parameter
- Bugzilla 13847: CTFE internal error: dottype
- Bugzilla 13858: Wrong warning about unreachable code with break/goto case
- Bugzilla 13860: template required forward reference for typeof(member)
- Bugzilla 13861: compiler segfault with nested struct, cannot access frame
- Bugzilla 13874: Invalid FunctionTypeOf segfault the compiler
- Bugzilla 13879: Default inizialization of function pointers array
- Bugzilla 13884: No error line number with std.array.array of range of type tuples
- Bugzilla 13899: Unwanted warning for pure opApply
- Bugzilla 13902: Compiler allows escaping the address of part of a local
- Bugzilla 13907: Surrogate pairs in wchar string literal will cause incorrect length match
- Bugzilla 13910: Internal error: e2ir.c 1926
- Bugzilla 13932: c++ mangling for template negative int parameter
- Bugzilla 13938: IASM shouldn't be able to access TLS variables
- Bugzilla 13939: IASM shouldn't access global symbol with PIC code
- Bugzilla 13947: Padding in empty structs is compared
- Bugzilla 13955: 64 bit C ABI not followed for passing structs with mixed floating types
- Bugzilla 13956: 64 bit C ABI not followed for passing empty structs
- Bugzilla 13959: ICE in e2ir when casting struct to pointer
- Bugzilla 13977: Front-end optimizer bug in AndAndExp
- Bugzilla 13978: Front-end optimizer bug in OrOrExp
- Bugzilla 13982: D1: wrong template instantiation is not rejected
- Bugzilla 13987: Invalid struct segfaults
- Bugzilla 14009: iasm parser accepts incorrect AsmExp
- Bugzilla 14010: Support mangleof property for opaque enum and struct type
- Bugzilla 14016: Nested inherited class doesn't know the type of its outer object
- Bugzilla 14022: [CTFE] postblits/destructors not called on static array field assignment
- Bugzilla 14023: [CTFE] postblits/destructors not called on static array index assignment
- Bugzilla 14024: [CTFE] unstable postblit/destructor call order on static array assignment
- Bugzilla 14028: [CTFE] Possible reinterpret cast to a pointer to static array
- Bugzilla 14050: dmd -v lists imports from failed __traits(compiles) blocks
- Bugzilla 14055: CTFE internal error with uninitialized array: Assertion failure: '0' on line 318 in file 'interpret.c'
- Bugzilla 14083: Remained unresolved forward reference issue with template classes
- Bugzilla 14096: ICE in toir.c: 187
- Bugzilla 14116: Assertion failure: 'p->isPkgMod == PKGmodule' on line 143 in file 'import.c'
- Bugzilla 14132: [ICE] error on arrays
- Bugzilla 14141: pure member function returning qualified member result is implicitly convertible to unqualified
- Bugzilla 14154: [e2ir] Error in e2ir at casting to struct
- Bugzilla 14163: No line number for error with disabled class constructor
- Bugzilla 14165: Link failure on class declaration with @disable this();
- Bugzilla 14174: Weird IFTI deduction failure
- Bugzilla 14179: Posix x86_64 varargs prolog clobbers RDX
- Bugzilla 14195: Ice when mangling templated function parameter extern(C++) function
- Bugzilla 14200: C++ mangling issue with expanded tuples
- Bugzilla 14201: fatal error LNK1235: corrupt or invalid COFF symbol table
- Bugzilla 14210: invalid merging of template instances
- Bugzilla 14229: RAII ordering is wrong
- Bugzilla 14272: DMD segfault on invalid circular enum initialization
- Bugzilla 14275: Qualified package protection for aggregate member doesn't work
- Bugzilla 14276: DWARF debug info for SIMD broken
- Bugzilla 14306: Wrong codegen with -inline for generic lambdas
- Bugzilla 14311: Win32 COFF: bad symbols/relocation entries for global data accesses
- Bugzilla 14313: [ld.gold] gdb: wrong value of shared variables
DMD Compiler enhancements
- Bugzilla 1317: Document suggested means of overlapping array copy
- Bugzilla 2498: make foreach work for any callable symbol
- Bugzilla 2529: 'package' access qualifier should allow access to sub-packages
- Bugzilla 3449: const and immutable struct members do not behave according to spec
- Bugzilla 4567: dmd should print the dmd.conf location with usage statement
- Bugzilla 9089: Very restrictive Tuple constructor
- Bugzilla 9915: Typeid .name inconsistent between templated classes and structs
- Bugzilla 10165: No syntax to create thread-local shared variables
- Bugzilla 11530: need gdb test suite
- Bugzilla 12888: Include template constraints in JSON output
- Bugzilla 12985: Better error message for not supported array operation
- Bugzilla 13019: Different color for "Warning:"
- Bugzilla 13350: is(typeof(fun)) causes link error when template fun calls undefined reference
- Bugzilla 13388: accept '@' before 'nothrow' and 'pure'
- Bugzilla 13510: When adding "New issue" there should be no choice among DStress, puremagic, and D. Just leave D.
- Bugzilla 13609: better error message for missing '}'
- Bugzilla 13704: Confusing error message when passing the same file on the command line twice
- Bugzilla 13756: [AA] Allow ref const index on foreach AA iteration
- Bugzilla 13802: Improve pretty-print result for the const(string) type
- Bugzilla 13803: Improve pretty-print result for the wstring an dstring types
- Bugzilla 13839: Use new style for alias declarations in di files
- Bugzilla 13944: Built-in stringof and mangleof properties are unnecessarily fixed to the type 'string'
- Bugzilla 13976: Value range propagation to disable some slice bound tests
- Bugzilla 14105: strideImpl fails for 0xFF
- Bugzilla 14123: cannot compare typeid(object.Object) at compile time
- Bugzilla 14156: buffer overflow in LibELF
- Bugzilla 14211: Compiler should devirtualize calls to members of final class
- Bugzilla 14338: Implement DIP25 Sealed References
Phobos regressions
- Bugzilla 13241: [REG2.067a] writeln no longer flushes stdout
- Bugzilla 13257: [REG2.067a] Deprecation message when using std.getopt with string[] parameter
- Bugzilla 13300: pure function 'std.array.Appender!(T[]).Appender.ensureAddable' cannot call impure function 'test.T.__fieldPostBlit'
- Bugzilla 13304: std.algorithm.reduce: "Unable to deduce an acceptable seed type" with float[]
- Bugzilla 13367: Buffer overflow when setting PATH
- Bugzilla 13375: Linking failure when importing both std.regex and std.algorithm
- Bugzilla 13390: [REG2.066] std.range.cycle ctor fails when empty input passed
- Bugzilla 13393: [REG2.067a] std.algorithm.joiner Assertion failure in popFront() when using with cartesianProduct
- Bugzilla 13621: inout issue with std.container.Array opSlice
- Bugzilla 13716: Phobos std.file fails to build
- Bugzilla 13717: split no longer defined by std.string
- Bugzilla 13766: std.container, std.range, std.regex documentation is now broken
- Bugzilla 13774: Multiple definition of conv_50c_dc8 with three libraries and std.file import
- Bugzilla 13871: [REG2.067a] Segmentation fault from std/variant.d:609
- Bugzilla 14037: Problem with BigInt and std.functional.memoize
- Bugzilla 14041: Refused writeln of a fixed size array of chars
- Bugzilla 14042: std.conv.to of a immutable char pointer
- Bugzilla 14197: "replace" was moved from std.string without alias added
- Bugzilla 14212: frexp for const and immutable fails to compile
- Bugzilla 14213: Strange deprecated message in std.typecons.Proxy with using method
- Bugzilla 14230: [REG2.067b2] std.array.join misses the first element which is empty string
- Bugzilla 14233: [REG2.067b2] Can't build Algebraic!(This[]) anymore
- Bugzilla 14253: [REG2.067b3] std.traits.ParameterStorageClassTuple gives compiler errors when encountering 'return' functions
- Bugzilla 14300: [2.067-rc1] DList casting to base type is broken
Phobos bugs
- Bugzilla 649: concatenation hangs in threaded program
- Bugzilla 3141: osx syntax problem with touch
- Bugzilla 5036: Remove caching from ranges
- Bugzilla 5233: [patch] std.range.put accepts *any* element type when putting to an array.
- Bugzilla 5698: va_arg sets wrong length for (u)short[]
- Bugzilla 6256: [patch] std.algorithm.map does not support static arrays and has 'length' for narrow strings.
- Bugzilla 6339: stdin.byChunk throws with Windows pipes on command line
- Bugzilla 7223: Access violation when using rmdirRecurse on folder without modify permissions
- Bugzilla 7797: std.typelist should be deprecated
- Bugzilla 8578: std.demangle.demangle does not parse symbols that are type names
- Bugzilla 8708: Documentation for std.process.exec family is inaccurate
- Bugzilla 9507: std.range.transposed behaves poorly with jagged ranges of ranges
- Bugzilla 10104: std.algorithm.group of a const/immutable array
- Bugzilla 10125: readln!dchar misdecodes Unicode non-BMP
- Bugzilla 10139: std.stdio.writef and friends documentation is severely out of date
- Bugzilla 10460: std.algorithm: some of algorithms don't use 'auto ref' for front
- Bugzilla 11434: std.file.copy doesn't preserve file attributes (eg: executable mode etc)
- Bugzilla 11539: wrong "Orphan format specifier:" error message
- Bugzilla 11895: Add Strings Overview page to Phobos documentation
- Bugzilla 12114: buildNormalizedPath shouldn't normalize current path to empty string
- Bugzilla 12320: std.stdio.LockingTextReader populates .front in .empty
- Bugzilla 12589: std.random.randomCover fails for empty ranges
- Bugzilla 12631: std.string.isNumeric uses among without explicit braces when calling 'std.algorithm.among' when compiling with dmd -property flag
- Bugzilla 12733: parallelism.amap incorrect assignment without initialization
- Bugzilla 12913: Mistake concerning DLists
- Bugzilla 12915: RedBlackTree leaks memory
- Bugzilla 12969: std.json: Lack of opIndexAssign operator for JSONValue may become a source of runtime errors
- Bugzilla 13018: std.string.translate needs mutable translation table
- Bugzilla 13124: std.algorithm.until with not-boolean predicates too
- Bugzilla 13248: std.range.tee unit test prints to stdout
- Bugzilla 13315: std.getopt: implicit help option doesn't work without config.passThrough
- Bugzilla 13316: std.getopt: implicit help option breaks the next argument
- Bugzilla 13317: std.getopt: endOfOptions broken when it doesn't look like an option
- Bugzilla 13352: Algebraic does not support binary arithmetic when omitting small number types
- Bugzilla 13354: Algebraic.opIndex/opIndexAssign makes wrong assumptions on the index/value type
- Bugzilla 13391: BigInt division by ulong rejected
- Bugzilla 13418: uninitializedArray & core.simd.Vector return incorrect type
- Bugzilla 13425: DList.linearRemove on last element returns non-empty range
- Bugzilla 13441: joiner asserts with only(x) separator
- Bugzilla 13446: Can't use executeShell/escapeShellFileName to redirect to file whose name starts with &
- Bugzilla 13447: Do not escape process parameters unless necessary
- Bugzilla 13477: std.process should ignore unnamed service variables on Windows
- Bugzilla 13529: std.string.lastIndexOf matches wrong element
- Bugzilla 13535: byCodeUnit doesn't satisfy hasSlicing
- Bugzilla 13592: std.datetime fails its unittests on Windows 7 - no Belarus Standard Time?
- Bugzilla 13594: std.algorithm.nextPermutation should accept ranges of lvalues
- Bugzilla 13647: std.traits documentation needs linking correctly and has spurious category value
- Bugzilla 13649: uniform01 Assertion failure
- Bugzilla 13686: Reading unicode string with readf ("%s") produces a wrong string
- Bugzilla 13689: byCodeUnit fails to be a random access range
- Bugzilla 13746: formatValue of delegates with @nogc
- Bugzilla 13781: Tuple assign should be @nogc
- Bugzilla 13805: Nested struct initialization error
- Bugzilla 13877: Problem with map+join
- Bugzilla 13922: std.range.package.takeOne doesn't accept non-forward ranges
- Bugzilla 13931: Missing overflow checks in std.conv for negative numbers which start from the most negative number digits
- Bugzilla 13935: Problem with std.algorithm.cartesianProduct(map, map)
- Bugzilla 13963: BigInt modulo ulong is rejected
- Bugzilla 13990: std.algorithm.move incorrectly uses hasAliasing for class references
- Bugzilla 14012: std.socket: wrong SocketSet.max on Posix
- Bugzilla 14013: std.socket: off-by-one error when automatically resizing on POSIX
- Bugzilla 14025: unittests for memoize fail intermittently
- Bugzilla 14059: Formatted write with wrong formatting string
- Bugzilla 14065: std.json not tracking line:column properly
- Bugzilla 14082: RedBlackTree unittest fails with custom predicate less
- Bugzilla 14111: Broken DDOC for std.format
- Bugzilla 14124: BigInt %= int can return "-0"
- Bugzilla 14181: Wrong document for std.mathspecial.normalDistribution
- Bugzilla 14223: TimSort algorithm is incorrect
- Bugzilla 14231: findRoot fails with trivial bounds
- Bugzilla 14297: [2.067-rc1] Broken links in phobos/index.html
Phobos enhancements
- Bugzilla 2138: Allow more than 65535 files in Zip archives
- Bugzilla 2181: Constant-time std.gc.removeRange
- Bugzilla 4493: Add sorting capability to toJSON
- Bugzilla 4764: Lazy versions of std.string.split and std.string.splitlines
- Bugzilla 5190: std.stdio should have File.fdopen
- Bugzilla 5494: [patch,enh] Issues with std.stdarg
- Bugzilla 5550: std.range.enumerate()
- Bugzilla 6147: file scheme uri from file path and vice versa
- Bugzilla 6586: feqrel for const values too
- Bugzilla 6756: Idea about std.stdio.chunks and std.range.chunks
- Bugzilla 6989: Implement toString for std.concurrency.Tid
- Bugzilla 7775: std.range.chunks on const array of strings too
- Bugzilla 8371: Add a function to make a range from a sequence of elements
- Bugzilla 8851: std.string.join should allow 'char' as joiner
- Bugzilla 9959: Add functional pattern matching for object references
- Bugzilla 11363: std.process should offer a way to run a executable with a given working directory
- Bugzilla 11706: Add a TypedefType trait to extract the underlying type of a std.typecons.Typedef
- Bugzilla 12409: Add "each" function as found in Ruby and jQuery
- Bugzilla 13091: nothrow std.algorithm.cartesianProduct
- Bugzilla 13157: std.typecons.Unique: Support construction and conversion from compatible types
- Bugzilla 13319: tzDatabaseNameToWindowsTZName should return null on failure rather than throw
- Bugzilla 13380: Conflict with std.typecons.Identity and std.traits.Identity
- Bugzilla 13402: code cleanup: removing c-style array declarations in phobos
- Bugzilla 13419: code cleanup in std.uni: removing "comma expressions"
- Bugzilla 13445: std.process fails to create process with empty (non-null) working directory
- Bugzilla 13450: Add WindowsException and wenforce to std.exception
- Bugzilla 13483: std.range.tee should also accept a function name
- Bugzilla 13555: Categorize functions in std.math
- Bugzilla 13595: Extend std.algorithm.groupBy to support non-equivalence relations
- Bugzilla 13623: std.typecons.Proxy doesn't work inside classes
- Bugzilla 13662: @safe pure @nogc nothrow findRoot
- Bugzilla 13681: @safe empty writeln
- Bugzilla 13837: Named tuples with type inference
- Bugzilla 13908: @safe write of a (uint, uint) tuple
- Bugzilla 13909: A problem with immutable zip + assocArray
- Bugzilla 14110: std.file.read cannot read files open for writing
- Bugzilla 14183: Updates to groupBy
Druntime regressions
- Bugzilla 13748: benchmark druntime/benchmark/aabench/string.d fails
- Bugzilla 13809: dup no longer works with types with postblit and destructors
- Bugzilla 14134: Free of large array does not work
- Bugzilla 14192: Access Violation when assigning to shared AA
- Bugzilla 14225: [REG2.067a] GDB: error reading variable (string + dup)
- Bugzilla 14291: Druntime master no longer builds
Druntime bugs
- Bugzilla 5629: core.time unittest disabled
- Bugzilla 8960: DMD tester: Unable to set thread priority
- Bugzilla 13052: TypeInfo.getHash should return same hash for different floating point zeros.
- Bugzilla 13410: Performance problem with associative array byKey/byValue
- Bugzilla 13416: dead-lock in FreeBSD suspend handler
- Bugzilla 13722: onFinalizeError should not allocate
- Bugzilla 13723: onFinalizeError should not be called for Errors
- Bugzilla 13854: Appending to an interior slice of a large array results in unnecessary 16-byte offset
- Bugzilla 13878: Appending to an array block with modified flags loses flag info
- Bugzilla 14036: Do not throw FinalizeError on OutOfMemoryError or InvalidMemoryOperationError
- Bugzilla 14157: fabsf fabsl for CRuntime_Microsoft
- Bugzilla 14247: string within demangled symbol name should be made escape
- Bugzilla 14303: rt.util.container.array.Array unittest contains invalid code
Druntime enhancements
- Bugzilla 9119: [AA] Forward range addition to associative arrays.
- Bugzilla 11216: Make synchronized statement nothrow
- Bugzilla 13401: code cleanup: removing c-style array declarations in druntime
- Bugzilla 13559: missing 64-bit version of array short operations
- Bugzilla 13725: onInvalidMemoryOperationError et al should not be inlined
- Bugzilla 13755: core.sys.linux.stdio, std.stdio.File: fopencookie, fmemopen missing
- Bugzilla 14007: shmctl with IPC_STAT returns wrong number of attachments. shmid_ds is defined wrong.
Optlink bugs
- Bugzilla 4831: Optlink rejects paths with invalid characters based on HPFS filesystem instead of NTFS
Installer bugs
- Bugzilla 9392: Misleading text about required OS version
Website regressions
- Bugzilla 14258: SIGSEGV in dpldocs
- Bugzilla 14280: Links to command line tools have disappeared from navigation
Website bugs
- Bugzilla 8307: inconsistent treatment of auto functions
- Bugzilla 9118: typo in github tools repo
- Bugzilla 9535: incomplete documentation for std.range.recurrence and std.range.sequence
- Bugzilla 9691: Static void arrays are not documented
- Bugzilla 9970: Document the definition and difference between storage class and type constructor
- Bugzilla 10232: AndExpression grammar is not correct
- Bugzilla 10235: Grammar does not contain a rule for function declarations
- Bugzilla 10284: dlang.org/phobos/index.html needs redesign
- Bugzilla 10285: Enum grammar documentation is incorrect
- Bugzilla 12810: PrimaryExpression grammar does not allow type constructors
- Bugzilla 13093: D ABI change for guaranteed efficient return of fixed size array
- Bugzilla 13308: AsmPrimaryExp documentation is incorrect
- Bugzilla 13310: Old style multiple alias declaration not documented
- Bugzilla 13328: Missing link to contracts description from function specification page
- Bugzilla 13329: AutoDeclarationX grammar lists '=' token and template parameters in the wrong order
- Bugzilla 13436: posix.mak is broken for dlang.org repo
- Bugzilla 13448: Class specification misses template classes in base classes list
- Bugzilla 13451: Lambda syntax with explicit return type not documented
- Bugzilla 13467: A little better std.algorithm.canFind documentation
- Bugzilla 13523: Auto function declaration does not match any grammar rule
- Bugzilla 13525: Redundant SpecialKeyword grammar listd in DefaultInitializerExpression
- Bugzilla 13538: Divide old C style syntax from D style grammar rule
- Bugzilla 13547: "D is a fully garbage collected language"
- Bugzilla 13648: ddoc problem with std.random.uniform01
- Bugzilla 13664: Grammar does not allow @
UDAs - Bugzilla 13671: http://dlang.org/const3.html incorrectly calls type qualifiers "type constructors"
- Bugzilla 13696: Missing entry for unicode code point literals on the lexer page
- Bugzilla 13895: Declaration grammar is insufficient
- Bugzilla 13941: NewExpression grammar is insufficient
- Bugzilla 13979: ForeachType grammar does not allow 'ref' to appear after type constructors
- Bugzilla 13991: Invariant grammar does not document that parenthesis are optional
- Bugzilla 14002: Book link is broken
- Bugzilla 14031: Frame content going outside frame
- Bugzilla 14047: "this" missing from AsmPrimaryExp grammar
- Bugzilla 14081: Table in the document of std.bigint.BigInt.toString() duplicates.
- Bugzilla 14121: Wiki: "Create account" page completely broken!
- Bugzilla 14135: std.uuid.randomUUID breaks @safety
- Bugzilla 14153: std.format page displaying incorrectly
Website enhancements
- Bugzilla 4954: Clarify documentation of foreach with delegates.
- Bugzilla 6251: D spec should warn about using foreach_reverse on a delegate
- Bugzilla 9469: Keywords list could use linkage; more-humane documentation
- Bugzilla 10154: Betas should be posted on dlang.org
- Bugzilla 10164: std.string.column examples and documentation
- Bugzilla 13325: __vector not documented in language specification
- Bugzilla 14011: Canonical links help message should clarify that 'thread' is invalid
List of all bug fixes in D 2.066.1.
DMD Compiler regressions
- Bugzilla 11312: [REG2.063] Avoid auto-dereference for UFCS functions
- Bugzilla 11946: need 'this' to access member when passing field to template parameter
- Bugzilla 13294: [IFTI] IFTI fails or works incorrectly for function with const and mutable ref parameters of most types
- Bugzilla 13299: [dmd-2.066-rc2] - Property not found with typesafe variadic opDispatch
- Bugzilla 13303: Internal error: ..\ztc\cgcs.c 351 with rvalue Variant.get call
- Bugzilla 13311: [REG2.065] ICE, CtorDeclaration::semantic(Scope*): Assertion tf && tf->ty == Tfunction failed
- Bugzilla 13321: Wrong goto skips declaration error
- Bugzilla 13353: [REG2.066] [ICE] assertion with is() and templated interface
- Bugzilla 13374: Wrong template overload resolution when passing function to alias/string parameter
- Bugzilla 13378: Wrong failure of template value parameter deduction in IFTI
- Bugzilla 13379: Latest dmd fails with recursive template expansion in std.regex
- Bugzilla 13394: invariant fail to link since 2.066 when using separate compilation
- Bugzilla 13400: Linking problems with bigints and std.functional.memoize
- Bugzilla 13415: [REG2.066] '-inline' causes wrong enclosing scope pointer for nested function called from templated struct
- Bugzilla 13417: [REG2.066] segmentation fault when deduce template type
- Bugzilla 13424: [REG2.066] Initialization of delegate to do-nothing default causes segfault at runtime
- Bugzilla 13427: [REG2.066] cannot inline default argument alloca(...)
- Bugzilla 13472: [REG2.066] trying to insert a null into an array of object segfaults the compiler
- Bugzilla 13476: [REG2.065] Writing stubs for dynamically loaded functions no longer works. (circular reference)
- Bugzilla 13478: [REG2.066] Templates not emitted when also referenced in speculative contexts
- Bugzilla 13504: ICE(backend/cgelem.c 2418) with "-O -cov"
DMD Compiler bugs
- Bugzilla 13235: Wrong code on mutually recursive tuple type
- Bugzilla 13204: recursive alias declaration
- Bugzilla 13333: Incorrect error ungagging during the resolution of forward references
- Bugzilla 12503: Bad optimization with scope(success) and return statement
- Bugzilla 13383: wrong code with -O with ints, longs and bitwise operations
- Bugzilla 13413: dmd does not follow symlink when searching for dmd.conf
- Bugzilla 13323: UDA applied to import statement causes compilation to fail without error
DMD Compiler enhancements
- Bugzilla 12567: Modules can't be marked as deprecated
Phobos regressions
- Bugzilla 13618: removing deprecated std.metastrings module breaks code
Phobos bugs
- Bugzilla 13313: std.datetime fails unittests on Windows
Druntime regressions
- Bugzilla 13399: va_arg is nothrow yet may throw
Druntime bugs
- Bugzilla 13377: core/sys/posix/syslog.d is in druntime/src but not in druntime/src/import
- Bugzilla 13414: Static destructors not called correctly with dynamic loading
Installer regressions
- Bugzilla 13233: Windows installer: downloading external installers (Visual D/dmc) does not work
Compiler Changes
- -w now warns about an unused return value of a strongly pure nothrow function call.
- -noboundscheck has been deprecated in favor of boundscheck=[on|safeonly|off].
- -vgc was added to list GC allocation code positions in the code.
- -vcolumns was added to display column numbers in error messages.
- -color was added to make console output colored.
Language Changes
- @nogc attribute was added.
- extern (C++, namespace) was added.
- Operator overloading for multi-dimensional slicing was added.
- __traits(getFunctionAttributes) was added.
- Support template parameter deduction for arguments with a narrowing conversion.
- Read-Modify-Write operations on shared variables are now deprecated.
- Support uniform construction syntax for built-in scalar types.
Library Changes
Linker Changes
List of all bug fixes and enhancements in D 2.066.
Compiler Changes
- -w now warns about an unused return value of a strongly pure nothrow function call:
A discarded return value from a strongly pure nothrow function call now generates a warning.
int foo() pure nothrow { return 1; } void main() { foo(); // the result of foo() is unused }
With the -w switch, the compiler will complain:Warning: calling foo without side effects discards return value of type int, prepend a cast(void) if intentional
- -noboundscheck has been deprecated in favor of boundscheck=[on|safeonly|off]:
Confusion over what the -noboundscheck command line option did led to the creation of the new option -boundscheck=[on|safeonly|off] which aims to be more clear while enabling more flexibility than was present before.
-boundscheck=
- on: Bounds checks are enabled for all code. This is the default.
- safeonly: Bounds checks are enabled only in @safe code. This is the default for -release builds.
- off: Bounds checks are disabled completely (even in @safe code). This option should be used with caution and as a last resort to improve performance. Confirm turning off @safe bounds checks is worthwhile by benchmarking.
Use -boundscheck=off to replace instances of -noboundscheck.
Prior to this there was no way to enable bounds checking for -release builds nor any way of turning off non-@safe bounds checking without pulling in everything else -release does.
- -vgc was added to list GC allocation code positions in the code:
Prints all GC-allocation points. Analysis will follow the semantics of the new @nogc attribute.
- -vcolumns was added to display column numbers in error messages:
Diagnostic messages will print the character number from each line head.
int x = missing_name;
Without -vcolumns:test.d(1): Error: undefined identifier missing_name
With -vcolumns:test.d(1,9): Error: undefined identifier missing_name
- -color was added to make console output colored:
Errors, deprecation, and warning messages will be colored.
Language Changes
- @nogc attribute was added:
@nogc attribute disallows GC-heap allocation.
class C {} void foo() @nogc { auto c = new C(); // GC-allocation is disallowed }
- extern (C++, namespace) was added:
To represent a C++ namespace, extern (C++) now takes optional dot-chained identifiers.
extern (C++, a.b.c) int foo();
is equivalent with:namespace a { namespace b { namespace c { int foo(); } } }
- Operator overloading for multi-dimensional slicing was added:
Documentation is here.
Example code:
struct MyContainer(E) { E[][] payload; this(size_t w, size_t h) { payload = new E[][](h, w); } size_t opDollar(size_t dim)() { return payload[dim].length; } auto opSlice(size_t dim)(size_t lwr, size_t upr) { import std.typecons; return tuple(lwr, upr); } void opIndexAssign(A...)(E val, A indices) { assert(A.length == payload.length); foreach (dim, x; indices) { static if (is(typeof(x) : size_t)) { // this[..., x, ...] payload[dim][x] = val; } else { // this[..., x[0] .. x[1], ...] payload[dim][x[0] .. x[1]] = val; } } } } void main() { import std.stdio; auto c = MyContainer!int(4, 3); writefln("[%([%(%d%| %)]%|\n %)]", c.payload); // [[0 0 0 0] // [0 0 0 0] // [0 0 0 0]] c[1 .. 3, 2, 0 .. $] = 1; /* Rewritten as: c.opIndexAssign(c.opSlice!0(1, 3), 2, c.opSlice!2(0, c.opDollar!2())); */ writefln("[%([%(%d%| %)]%|\n %)]", c.payload); // [[0 1 1 0] // [0 0 1 0] // [1 1 1 1]] }
- __traits(getFunctionAttributes) was added:
This can take one argument, either a function symbol, function type, function pointer type, or delegate type. Examples:
void foo() pure nothrow @safe; static assert([__traits(getFunctionAttributes, foo)] == ["pure", "nothrow", "@safe"]); ref int bar(int) @property @trusted; static assert([__traits(getFunctionAttributes, typeof(&bar))] == ["@property", "ref", "@trusted"]);
- Support template parameter deduction for arguments with a narrowing conversion:
Implicit Function Template Instantiation will now consider a narrowing conversion of function arguments when deducing the template instance parameter types.
void foo(T)(T[] arr, T elem) { ... } void main() { short[] a; foo(a, 1); }
In 2.065 and earlier, calling foo(a, 1) was not allowed. From 2.066, T is deduced as short by considering a narrowing conversion of the second function argument 1 from int to short. - Read-Modify-Write operations on shared variables are now deprecated:
Examples:
shared int global; void main() { global++; // deprecated global *= 2; // deprecated }
Instead you should use atomicOp from core.atomic:shared int global; void main() { import core.atomic; atomicOp!"+="(global, 1); atomicOp!"*="(global, 2); }
- Support uniform construction syntax for built-in scalar types:
Examples:
short n1 = 1; auto n2 = short(1); // equivalent with n1, typeof(n2) is short auto p1 = new long(1); // typeof(p1) is long* auto p2 = new immutable double(3.14); // typeof(p2) is immutable(double)*
The constructor argument should be implicitly convertible to the constructed type.
auto n1 = short(32767); // OK auto n2 = short(32768); // Not allowed, out of bounds of signed short -32768 to 32767
Library Changes
- Duration.get and its wrappers have been deprecated in favor of the new Duration.split:
Duration.get and its wrappers, Duration.weeks, Duration.days, Duration.hours, and Duration.seconds, as well as Duration.fracSec (which served a similar purpose as Duration.get for the fractional second units) have proven to be too easily confused with Duration.total, causing subtle bugs. So, they have been deprecated. In their place, Duration.split has been added - and it's not only very useful, but it does a great job of showing off what D can do. Whereas Duration.get split out all of the units of a Duration and then returned only one of them, Duration.split splits out a Duration into the units that it's told to (which could be one unit or all of them) and returns all of them. It has two overloads, both which take template arguments that indicate which of the units are to be split out. The difference is in how the result is returned. As with most of the templates in core.time and std.datetime which take strings to represent units, Duration.split accepts "weeks", "days", "hours", "minutes", "seconds", "msecs", "usecs", "hnsecs", and "nsecs". The first overload returns the split out units as out parameters.
auto d = weeks(5) + days(4) + hours(17) + seconds(2) + hnsecs(12_007); short days; long seconds; int msecs; d.split!("days", "seconds", "msecs")(days, seconds, msecs); assert(days == 39); assert(seconds == 61_202); assert(msecs == 1);
The arguments can be any integral type (though no protection is given against integer overflow, so unless it's known that the values are going to be small, it's unwise to use a small integral type for any of the arguments). The second overload returns a struct with the unit names as its fields. Only the requested units are present as fields. All of the struct's fields are longs.auto d = weeks(5) + days(4) + hours(17) + seconds(2) + hnsecs(12_007); auto result = d.split!("days", "seconds", "msecs")(); assert(result.days == 39); assert(result.seconds == 61_202); assert(result.msecs == 1);
Or if no units are given to the second overload, then it will return a struct with all of the units save for nsecs (since nsecs would always be 0 when hnsecs is one of the units as Duration has hnsec precision).auto d = weeks(5) + days(4) + hours(17) + seconds(2) + hnsecs(12_007); auto result = d.split(); assert(result.weeks == 5); assert(result.days == 4); assert(result.hours == 17); assert(result.minutes == 0); assert(result.seconds == 2); assert(result.msecs == 1); assert(result.usecs == 200); assert(result.hnsecs == 7);
Calling Duration.get or its wrappers for each of the units would be equivalent to that example, only less efficient when more than one unit is requested, as the calculations would have to be done more than once. The exception is Duration.fracSec which would have given the total of the fractional seconds as the requested units rather than splitting them out.// Equivalent to previous example auto d = weeks(5) + days(4) + hours(17) + seconds(2) + hnsecs(12_007); assert(d.weeks == 5); assert(d.days == 4); assert(d.hours == 17); assert(d.minutes == 0); assert(d.seconds == 2); assert(d.fracSec.msecs == 1); assert(d.fracSec.usecs == 1200); assert(d.fracSec.hnsecs == 12_007);
It is hoped that Duration.split will be less confusing and thus result in fewer bugs, but it's definitely the case that it's more powerful. It's also a great example of D's metaprogramming capabilities given how it splits out only the requested units and even is able to return a struct with fields with the same names as the requested units. This on top of being able to handle a variety of integral types as arguments. And its implemenation isn't even very complicated. - Some built-in type properties have been replaced with library functions:
Built-in array properties dup and idup were replaced with (module-scoped) free functions in the object module, thanks to D's support of Uniform Function Call Syntax.
Built-in associative array properties rehash, dup, byKey, byValue, keys, values, and get were also replaced with free functions in the object module.
- Associative array keys now require equality rather than ordering:
Until 2.065, opCmp was used to customize the comparison of AA struct keys.
void main() { int[MyKey] aa; } struct MyKey { int x; int y; // want to be ignored for AA key comparison int opCmp(ref const MyKey rhs) const { if (this.x == rhs.x) return 0; // defined order was merely unused for AA keys. return this.x > rhs.x ? 1 : -1; } }
From 2.066, the AA implementation has been changed to use the equality operator (==) for the key comparison. So the MyKey struct should be modified to:struct MyKey { int x; int y; // want to be ignored for AA key comparison int opEquals(ref const MyKey rhs) const { return this.x == rhs.x; } }
List of all bug fixes and enhancements in D 2.066:
DMD Compiler regressions
- Bugzilla 5105: Member function template cannot be synchronized
- Bugzilla 9449: Static arrays of 128bit types segfault on initialization. Incorrect calling of memset128ii.
- Bugzilla 11777: [ICE] dmd memory corruption as Scope::pop frees fieldinit used also in enclosing
- Bugzilla 12174: Problems caused by enum predicate with std.algorithm.sum
- Bugzilla 12179: [ICE](e2ir.c 1861) with array operation
- Bugzilla 12242: conflict error with public imports
- Bugzilla 12243: [REG 2.065.0] "ICE: cannot append 'char' to 'string'" with -inline
- Bugzilla 12250: [REG 2.065.0][ICE](e2ir.c 2077) with inout T[] and array operation
- Bugzilla 12255: Regression: opCmp requirement for AAs breaks code
- Bugzilla 12262: [REG2.065] A specialized parameter alias a : B!A should not match to the non-eponymous instantiated variable
- Bugzilla 12264: [REG2.066a] A specialized alias parameter conflicts with the unspecialized one.
- Bugzilla 12266: Regression (2.065): Header generation produces uncompilable header
- Bugzilla 12296: [REG2.066a] const compatible AA pointer conversion is wrongly rejected in CTFE
- Bugzilla 12312: Regression (2.064): Diagnostic for void static arrays has gone bad
- Bugzilla 12316: GIT HEAD: AA.get broken for Object VAL types
- Bugzilla 12376: ICE with constarainted template instantiation with error gagging
- Bugzilla 12382: opDollar can't be used at CT
- Bugzilla 12390: [REG2.066a] "has no effect in expression" diagnostic regression
- Bugzilla 12396: Regression: major breakage from new import rules
- Bugzilla 12399: Static and selective import acts like a normal import
- Bugzilla 12400: Misleading/useless diagnostic on bad fully-qualified symbol name
- Bugzilla 12403: [AA] Associative array get function rejects some cases
- Bugzilla 12405: Named imports act like regular imports
- Bugzilla 12413: Infinite recursion of Package::search
- Bugzilla 12467: Regression (2.066 git-head): char[] is implicitly convertible to string
- Bugzilla 12485: [REG2.065] DMD crashes when recursive template expansion
- Bugzilla 12497: [REG2.064] ICE on string mixin with non-string operand
- Bugzilla 12501: Assertion global.gaggedErrors || global.errors failed.
- Bugzilla 12509: Compiler performance highly depends on declared array size - for struct with long static array of structs
- Bugzilla 12554: [ICE](struct.c line 898) with failed delegate purity
- Bugzilla 12574: [ICE](statement.c, line 713) with reduce with wrong tuple arity
- Bugzilla 12580: [REG2.066a] dup() won't accept void[]
- Bugzilla 12581: [ICE](statement.c, line 713) with invalid assignment + alias this
- Bugzilla 12585: Regression(2.064): Segfault on lazy/catch/opIndex
- Bugzilla 12591: [DMD|REG] std/typecons.d(440): Error: tuple has no effect in expression
- Bugzilla 12593: [REG2.065] AA cannot have struct as key
- Bugzilla 12619: Invalid warning for unused return value of debug memcpy
- Bugzilla 12649: "discards return value" warning will cause ICE on function pointer call
- Bugzilla 12650: Invalid codegen on taking lvalue of instance field initializ
- Bugzilla 12689: [CTFE] assigning via pointer from 'in' expression doesn't work
- Bugzilla 12703: GIT HEAD : final class rejects members initialization
- Bugzilla 12719: struct.c:705: virtual void StructDeclaration::semantic(Scope*): Assertion parent && parent == sc->parent failed.
- Bugzilla 12727: [REG2.066a] DMD hangs up on recursive alias declaration
- Bugzilla 12728: [REG2.066a] IFTI should consider instantiated types that has template parameters with default args
- Bugzilla 12760: Initializing an object that has "this(Args) inout" causes "discards return value" warning
- Bugzilla 12769: ICE returning array
- Bugzilla 12774: REG(2.066) ICE(optimize.c) Newing struct containing union causes segfault
- Bugzilla 12824: REG(2.066) ICE(statement.c) Segfault with label and static if
- Bugzilla 12860: REG 2.065: typeid(_error_) symbols leaked to backend
- Bugzilla 12864: can no longer use toLower in string switch case
- Bugzilla 12880: [REG2.066a] Wrong IFTI for string.init argument
- Bugzilla 12896: ld.gold complains about bad relocations when building libphobos2.so
- Bugzilla 12900: REG 2.065: Wrong code in IfStatement condition Expression
- Bugzilla 12904: Wrong-code for some slice to slice assignments when using opDollar
- Bugzilla 12906: [CTFE] Static array of structs causes postblit call
- Bugzilla 12910: [AA] rehash is incorrectly inferred as strongly pure for some associative arrays
- Bugzilla 12924: deprecated("foo"); and deprecated; should not compile
- Bugzilla 12956: [ICE] Assertion in expression.c:432
- Bugzilla 12981: Can't refer to 'outer' from mixin template
- Bugzilla 12989: Wrong x86_64 code for delegate return when compiled as lib (-lib)
- Bugzilla 13002: DMD 2.066 prep: 32-bit build fails on Ubuntu via create_dmd_release
- Bugzilla 13008: [REG2.066a] 'deprecated' is not allowed to refer another deprecated when it is a function declaration
- Bugzilla 13021: Constructing union with floating type and then accessing its field in one expression causes ICE
- Bugzilla 13024: [ICE](expression.c line 1172) with implicit supertype conversion of different enums in array literal
- Bugzilla 13025: Tools repository does not build on Ubuntu
- Bugzilla 13026: object.get cannot be called with [] as "defaultValue" argument
- Bugzilla 13027: Assertion ex->op == TOKblit || ex->op == TOKconstruct failed.
- Bugzilla 13030: DMD assertion fails at mtype.c:697 if delegate has an argument name
- Bugzilla 13034: [Reg] core.stdc.stdio - deprecation warning with dmd -inline
- Bugzilla 13053: Wrong warning on implicitly generated __xtoHash
- Bugzilla 13056: [2.066.0-b1] Regression: Error: template std.path.baseName cannot deduce function from argument types !()(DirEntry)
- Bugzilla 13071: [ICE] dmd 2.066.0-b1 assertion in nogc.c:73
- Bugzilla 13077: [dmd 2.066-b2] std.range.array with shared InputRangeObject
- Bugzilla 13081: ICE with alias this and opSlice
- Bugzilla 13087: Error: no property 'xyz' for type 'Vec!4'
- Bugzilla 13102: Cannot parse 184467440737095516153.6L
- Bugzilla 13113: cannot build druntime's gc.d with -debug=INVARIANT, bad @nogc inference?
- Bugzilla 13114: old opCmp requirement for AA keys should be detected for classes
- Bugzilla 13117: Executable size of hello world explodes from 472K to 2.7M
- Bugzilla 13127: Cannot deduce function with int[][] argument and "in" parameter
- Bugzilla 13132: ICE on interface AA key
- Bugzilla 13141: array cast from string[] to immutable(char[][]) is not supported at compile time
- Bugzilla 13152: [REG2.064.2] Compiler high cpu usage and never ends
- Bugzilla 13154: Incorrect init of static float array when sliced
- Bugzilla 13158: "void has no value" in std.variant.Algebraic (affects D:YAML)
- Bugzilla 13178: Duplicate symbol of compiler generated symbols
- Bugzilla 13179: AA key type TagIndex now requires equality rather than comparison
- Bugzilla 13180: [REG2.066a] AA get returns const(char[]) instead of string
- Bugzilla 13187: Function wrongly deduced as pure
- Bugzilla 13193: Extreme slowdown in compilation time of OpenSSL in Tango for optimized build
- Bugzilla 13201: Wrong "Warning: statement is not reachable" error with -w
- Bugzilla 13208: [ICE](e2ir.c 2077) with array operation
- Bugzilla 13218: [ICE] s2ir.c 142: Must fully qualify call to ParameterTypeTuple
- Bugzilla 13219: segmentation fault in FuncDeclaration::getLevel
- Bugzilla 13220: [ICE] 'global.gaggedErrors || global.errors' on line 750 in file 'statement.c'
- Bugzilla 13221: [ICE] '0' on line 318 in file 'interpret.c'
- Bugzilla 13223: Cannot deduce argument for array template parameters
- Bugzilla 13232: dmd compile times increased by 10-20%
- Bugzilla 13237: Wrong code with "-inline -O"
- Bugzilla 13245: segfault when instantiating template with non-compiling function literal
- Bugzilla 13252: ParameterDefaultValueTuple affects other instantiations
- Bugzilla 13259: [ICE] 'v.result' on line 191 in file 'todt.c'
- Bugzilla 13284: [dmd 2.066-rc2] Cannot match shared classes at receive
DMD Compiler bugs
- Bugzilla 648: DDoc: unable to document mixin statement
- Bugzilla 846: Error 42: Symbol Undefined "<mangle_of_class_template>__arrayZ"
- Bugzilla 1659: template alias parameters are chosen over all but exact matches.
- Bugzilla 2427: Function call in struct initializer fails to compile
- Bugzilla 2438: Cannot get types of delegate properties
- Bugzilla 2456: "cannot put catch statement inside finally block", missing line number
- Bugzilla 2711: -H produces bad headers files if function defintion is templated and have auto return value
- Bugzilla 2791: port.h and port.c are missing licenses
- Bugzilla 3032: No stack allocation for "scope c = new class Object {};"
- Bugzilla 3109: [meta] Template ordering
- Bugzilla 3490: DMD Never Inlines Functions that Could Throw
- Bugzilla 3672: [tdpl] read-modify-write (rmw) operators must be disabled for shared
- Bugzilla 4225: mangle.c:81: char* mangle(Declaration*): Assertion fd && fd->inferRetType failed.
- Bugzilla 4423: [tdpl] enums of struct types
- Bugzilla 4757: A forward reference error with return of inner defined struct
- Bugzilla 4791: Assigning a static array to itself should be allowed
- Bugzilla 5030: Operators don't work with AssociativeArray!(T1,T2)
- Bugzilla 5095: Error for typesafe variadic functions for structs
- Bugzilla 5498: wrong common type deduction for array of classes
- Bugzilla 5635: Code inside 'foreach' using opApply cannot modify variable out of its scope in a template function.
- Bugzilla 5810: Struct postincrement generates 'no effect' error if used on struct member
- Bugzilla 5835: TypeInfo_Array.getHash creates raw data hash instead using array element hash function
- Bugzilla 5854: Built-in array sort doesn't sort SysTime correctly
- Bugzilla 6140: Wrong ambiguity error with overloading
- Bugzilla 6359: Pure/@safe-inference should not be affected by __traits(compiles)
- Bugzilla 6430: Overloaded auto-return functions each with a nested aggregate of the same name are conflated
- Bugzilla 6677: static this attributes position
- Bugzilla 6889: "finally" mentioned in a compilation error, instead of "scope(exit)" or "scope(success)"
- Bugzilla 7019: implicit constructors are inconsistently allowed
- Bugzilla 7209: Stack overflow on explicitly typed enum circular dependency
- Bugzilla 7469: template mangling depends on instantiation order
- Bugzilla 7477: Enum structs without specified values
- Bugzilla 7870: Shared library support for Linux is missing
- Bugzilla 7887: [CTFE] can't assign to returned reference
- Bugzilla 8100: [ICE] with templated subclassing
- Bugzilla 8236: Wrong error message in creating struct from vector operation
- Bugzilla 8254: nested struct cannot access the types of the parent's fields
- Bugzilla 8269: The 'with statement' does not observe temporary object lifetime
- Bugzilla 8296: @disable this propagates through reference
- Bugzilla 8309: ICE in typeMerge on 'void main(){auto x = [()=>1.0, ()=>1];}'
- Bugzilla 8370: invalid deprecation error with -release -inline -noboundscheck
- Bugzilla 8373: IFTI fails on overloading of function vs non function template
- Bugzilla 8392: DMD sometime fail when using a non static function template within a function template
- Bugzilla 8499: ICE on undefined identifier
- Bugzilla 8596: Indeterministic assertion failure in rehash
- Bugzilla 8704: Invalid nested struct constructions should be detected
- Bugzilla 8738: Struct literal breaks assigment ordering
- Bugzilla 9245: [CTFE] postblit not called on static array initialization
- Bugzilla 9596: Ambiguous match is incorrectly hidden by additional lesser match
- Bugzilla 9708: inout breaks zero parameter IFTI
- Bugzilla 9931: Mac OS X ABI not followed when returning structs for extern (C)
- Bugzilla 10054: x86_64 valgrind reports unrecognised instruction (DMD 2.062)
- Bugzilla 10071: 'real' alignment wrong on several platforms
- Bugzilla 10112: Mangle, which defined by pragma(mangle) should not be mangled by backend.
- Bugzilla 10133: ICE for templated static conditional lambda
- Bugzilla 10169: duplicate error message: member is not accessible
- Bugzilla 10219: Implicit conversion between delegates returning a class and an interface
- Bugzilla 10366: Ddoc: Symbols in template classes don't get fully qualified anchors
- Bugzilla 10629: [ICE](dt.c 106) with void array
- Bugzilla 10658: Cannot merge template overload set by using alias declaration
- Bugzilla 10703: Front-end code removal "optimisation" with try/catch blocks produces wrong codegen
- Bugzilla 10908: Links in d.chm file are broken
- Bugzilla 10928: Fails to create closures that reference structs with dtor
- Bugzilla 10985: Compiler doesn't attempt to inline non-templated functions from libraries (even having the full source)
- Bugzilla 11066: Spurious warning 'statement is not reachable' with -profile
- Bugzilla 11177: parameterized enum can't be typed
- Bugzilla 11181: Missing compile-time error for wrong array literal
- Bugzilla 11201: ICE: (symbol.c) -inline stops compilation
- Bugzilla 11333: ICE: Cannot subtype 0-tuple with "alias this"
- Bugzilla 11421: Dynamic array of associative array literal type inference
- Bugzilla 11448: dup calls @system impure code from @safe pure function
- Bugzilla 11453: Compiling packages has a dependency on order of modules passed to the compiler.
- Bugzilla 11511: DDoc - C variadic parameters cannot be properly documented
- Bugzilla 11535: CTFE ICE on reassigning a static array initialized with block assignment
- Bugzilla 11542: scope(failure) messes up nothrow checking
- Bugzilla 11543: multiple definition of std.regex with shared library
- Bugzilla 11545: Aggregate function literal member should not have access to enclosing scope
- Bugzilla 11550: [ICE] Checking if std.conv.to compiles with an array of non-builtins results in an ICE in s2ir.c.
- Bugzilla 11622: Assertion failure in totym(), glue.c, line 1288
- Bugzilla 11672: default initialization of static array of structs with a single value fails
- Bugzilla 11677: user defined attributes must be first
- Bugzilla 11678: user defined attributes cannot appear as postfixes
- Bugzilla 11679: user defined attributes not allowed for local auto declarations
- Bugzilla 11680: user defined attributes for type inference
- Bugzilla 11735: pragma(msg, ...) fails to print wstring, dstring
- Bugzilla 11740: [64-bit] Struct with constructor incorrectly passed on stack to extern(C++) function
- Bugzilla 11752: Make issues.dlang.org work
- Bugzilla 11774: Lambda argument to templated function changes its signature forever
- Bugzilla 11783: Make std.datetime unittesting faster
- Bugzilla 11788: [x86] Valgrind unhandled instruction bytes: 0xC8 0x8 0x0 0x0
- Bugzilla 11832: std.datetime: ddoc warnings
- Bugzilla 11872: Support for overloaded template functions in with block
- Bugzilla 11885: ICE(s2ir.c 359) with continuing a labeled ByLine (range struct w/ dtor) loop
- Bugzilla 11889: std.container.Array.opIndex returns by value, resulting in perfect storm
- Bugzilla 11901: real win64
- Bugzilla 11906: Compiler assertion when comparing function pointers
- Bugzilla 12009: local import and "unable to resolve forward reference" error
- Bugzilla 12011: "Internal Compiler Error: Null field" on CTFE method call on .init
- Bugzilla 12042: "CTFE internal error: Dotvar assignment" with template method and "with"
- Bugzilla 12057: [ICE], backend/cg87.c 925
- Bugzilla 12063: No line number error on uninitialized enum member if base type is not incrementable
- Bugzilla 12077: Instantiated type does not match to the specialized alias parameter
- Bugzilla 12078: forward reference issue with is() and curiously recurring template pattern
- Bugzilla 12110: [CTFE] Error: CTFE internal error: Dotvar assignment
- Bugzilla 12138: Label statement creates an unexpected scope block
- Bugzilla 12143: Base class is forward referenced
- Bugzilla 12164: Function returning ptrdiff_t.min in 64-bit returning 0 when -O is set.
- Bugzilla 12212: Static array assignment makes slice implicitly
- Bugzilla 12231: ICE on the class declaration within lambda inside template constraint
- Bugzilla 12235: ICE on printing mangled name of forward reference lambda by pragma(msg)
- Bugzilla 12236: Inconsistent mangleof result
- Bugzilla 12237: Inconsistent behavior of the instantiating enclosing template function
- Bugzilla 12263: Specialized template parameter incorrectly fail to match to the same name template.
- Bugzilla 12278: __traits(classInstanceSize) returns wrong value if used before class is declared
- Bugzilla 12287: infinite loop on std.traits.moduleName on templated struct member
- Bugzilla 12292: Template specialization ": string" passes for static arrays of other types
- Bugzilla 12302: Assertion failure in expression.c (line 432) when using template isCallable
- Bugzilla 12306: Struct Enums cannot be read at compile time
- Bugzilla 12307: Contextfull error diagnostic about AA key type
- Bugzilla 12313: Unneeded stack temporaries created by tuple foreach
- Bugzilla 12334: Cannot access frame pointer of nested class from inside lambda
- Bugzilla 12350: Assigning __traits(getAttributes) to variable crashes DMD
- Bugzilla 12362: dmd hangs when attempting to use undefined enum
- Bugzilla 12378: Compiler accepts any syntactically-valid code inside double-nested map predicate
- Bugzilla 12392: No attribute inference if first template instantiation uses alias
- Bugzilla 12397: CTFE ICE CompiledCtfeFunction::walkAllVars with 2.065
- Bugzilla 12432: Diagnostic on argument count mismatch for ranges and opApply should improve
- Bugzilla 12436: Opaque struct parameter type should not be allowed
- Bugzilla 12460: Crash with goto and static if
- Bugzilla 12476: Assert error in interpret.c:3204
- Bugzilla 12480: static assert should print out the string representation of a value it can interpret
- Bugzilla 12498: ICE: while(string) causes compiler to crash during CTFE
- Bugzilla 12499: tuple/TypeTuple 1-Arg initialization fails during CTFE.
- Bugzilla 12503: Bad optimization with scope(success) and return statement
- Bugzilla 12506: Wrongly private lambda to define global immutable array
- Bugzilla 12508: Codegen bug for interface type covariant return with lambda type inference
- Bugzilla 12523: wrong foreach argument type with ref and inout
- Bugzilla 12524: wrong type with inout const arg and inout return
- Bugzilla 12528: [CTFE] cannot append elements from one inout array to another inout array
- Bugzilla 12534: ICE on using expression tuple as type tuple
- Bugzilla 12539: Compiler crash when looking up a nonexistent tuple element in an associative array
- Bugzilla 12542: No function attribute inference for recursive functions
- Bugzilla 12543: Class.sizeof requires the Class' definition
- Bugzilla 12555: Incorrect error ungagging for speculatively instantiated class
- Bugzilla 12571: __traits(parent) should work for typed manifest constant in initializer
- Bugzilla 12577: ice on compile time struct field access
- Bugzilla 12586: redundant error messages for tuple index exceeding
- Bugzilla 12602: [CTFE] Changes to an array slice wrapped in a struct do not propogate to the original
- Bugzilla 12604: No "mismatched array lengths" error with narrowing conversions
- Bugzilla 12622: Purity, @safe not checked for pointers to functions
- Bugzilla 12630: @nogc should recognize compile-time evaluation context
- Bugzilla 12640: Error inside a switch statement causes a spurious switch case fallthrough warning
- Bugzilla 12642: Avoid some heap allocation cases for fixed-size arrays
- Bugzilla 12651: TemplateArgsOf accepts nonsensical arguments
- Bugzilla 12660: Wrong non-@nogc function invariant error
- Bugzilla 12673: ICE with static assert and __traits(compiles) with non-existent symbol
- Bugzilla 12677: Assertion failure: 'isCtfeValueValid(newval)' on line 6579 in file 'interpret.c'
- Bugzilla 12678: Field constness missing in diagnostics for multiple field initialization error
- Bugzilla 12686: Struct invariant prevents NRVO
- Bugzilla 12688: Strange error if function call is in parentheses
- Bugzilla 12704: typeof function literal incorrectly infers attributes
- Bugzilla 12705: @system is missing when using getFunctionAttributes on a typeof(function)
- Bugzilla 12706: ddoc: __dollar should not appear in the documentation
- Bugzilla 12725: IFTI should consider instantiated types with dependent template parameters
- Bugzilla 12737: static constructor requires call of super constructor
- Bugzilla 12739: Foreach delegate to opApply does not have infered nothrow
- Bugzilla 12745: [Ddoc] Underscore is removed from numbers in document comments
- Bugzilla 12746: Wrong overload access within manually aliased eponymous function template
- Bugzilla 12749: Constructor-local function allows multiple mutation of immutable member
- Bugzilla 12756: Cannot build dmd on windows because of longdouble
- Bugzilla 12777: const/immutable member function violating its const-ness - confusing error message
- Bugzilla 12778: Aliasing opBinaryRight to opBinary works only in certain cases
- Bugzilla 12788: -di doesn't warn about implicit conversion from char[] to char*
- Bugzilla 12809: More strict nothrow check for try-finally statement
- Bugzilla 12820: DMD can inline calls to functions that use alloca, allocating the memory in the caller function instead.
- Bugzilla 12825: Invalid "duplicated union initialization" error with initialized field in extern(C++) class
- Bugzilla 12826: Win64: bad code for x ~= x;
- Bugzilla 12833: switch statement does not work properly when -inline used
- Bugzilla 12836: CTFE ICE CompiledCtfeFunction::walkAllVars
- Bugzilla 12838: Dmd show ICEs when using Tuple and wrong type
- Bugzilla 12841: ICE on taking function address
- Bugzilla 12849: pmovmskb instruction cannot store to 64-bit registers
- Bugzilla 12850: ICE when passing associative array to template
- Bugzilla 12851: ICE when passing const static array to template
- Bugzilla 12852: 64 bit wrong code generated
- Bugzilla 12855: Shadow register assignments for spilling can conflict
- Bugzilla 12873: Valgrind unhandled instruction bytes 0x48 0xDB (redundant REX_W prefix on x87 load)
- Bugzilla 12874: Wrong file name in range violation error
- Bugzilla 12876: Implicit cast of array slice to fixed-size array for templates too
- Bugzilla 12901: in/out contracts on struct constructor must require function body
- Bugzilla 12902: [ICE] Assertion failure '!ae->lengthVar' in 'expression.c' when using opDollar
- Bugzilla 12907: [ICE] Assertion failure '0' in 'mangle.c' when using auto return type with lambda with dereferanced function call
- Bugzilla 12909: [AA] Function is incorrectly inferred as strongly pure for associative array with key of non-mutable array or pointer as argument
- Bugzilla 12928: Bounds check dropped for array[length]
- Bugzilla 12933: [D1] ICE with default __FILE__ and __LINE__
- Bugzilla 12934: Strange newly implemented VRP behavior on foreach
- Bugzilla 12937: ICE with void static array initializing
- Bugzilla 12938: Error message mistake in out parameter with @disable this
- Bugzilla 12953: Wrong alignment number in error messages
- Bugzilla 12962: osver.mak should use isainfo on Solaris to determine model
- Bugzilla 12965: DMD sets ELFOSABI to ELFOSABI_LINUX on all systems
- Bugzilla 12968: DMD inline asm outputs wrong XCHG instruction
- Bugzilla 12970: Enclosing @system attribute is precedence than postfix @safe
- Bugzilla 13003: Lack of read-modify-write operation check on shared object field
- Bugzilla 13011: inout delegate parameter cannot receive exactly same type argument
- Bugzilla 13023: optimizer produces wrong code for comparision and division of ulong
- Bugzilla 13043: Redundant linking to TypeInfo in non-root module
- Bugzilla 13044: Assignment of structs with const members
- Bugzilla 13045: TypeInfo.getHash should return consistent result with object equality by default
- Bugzilla 13049: in template arguments the compiler fails to parse scope for function pointers arguments
- Bugzilla 13050: pragma mangle breaks homonym template aliasing
- Bugzilla 13082: Spurious error message with failed call to class ctor
- Bugzilla 13088: Compiler segfaults with trivial case code.
- Bugzilla 13089: Spurious 'is not nothrow' error on static array initialization
- Bugzilla 13109: -run and -lib dmd flags conflict
- Bugzilla 13116: Should not be able to return ref to 'this'
- Bugzilla 13131: [2.066-b3] dmd: glue.c:1492: unsigned int totym(Type*): Assertion 0 failed.
- Bugzilla 13135: IFTI fails on partially qualified argument in some cases
- Bugzilla 13142: Enums on different classes confuse the compiler
- Bugzilla 13161: Wrong offset of extern(C++) class member
- Bugzilla 13175: [D1] ICE on conflicting overloads in presense of default __FILE__/__LINE__
- Bugzilla 13182: extern(C++) classes cause crash when allocated on the stack with scope
- Bugzilla 13190: Optimizer breaks comparison with zero
- Bugzilla 13194: ICE when static class members initialized to void
- Bugzilla 13195: Delete calls destructor but doesn't free
- Bugzilla 13204: recursive alias declaration
- Bugzilla 13212: Trailing Windows line endings not stripped from .ddoc macros
- Bugzilla 13217: nothrow, template function and delegate: compilation error
- Bugzilla 13225: [ICE] Access violation on invalid mixin template instantiation
- Bugzilla 13226: Symbol is not accessible when using traits or mixin
- Bugzilla 13230: std.variant.Variant Uses Deprecated .min Property in opArithmetic When T is a Floating Point Type
- Bugzilla 13235: Wrong code on mutually recursive tuple type
- Bugzilla 13260: [D1] ICE accessing non-existent aggregate member
- Bugzilla 13273: ddoc can't handle \r in unittests and ESCAPES properly
- Bugzilla 13275: Wrong di header generation on if and foreach statements
DMD Compiler enhancements
- Bugzilla 1553: foreach_reverse is allowed for delegates
- Bugzilla 1673: Implement the isTemplate trait
- Bugzilla 1952: Support a unit test handler
- Bugzilla 2025: Inconsistent rules for instantiating templates with a tuple parameter
- Bugzilla 2548: Array ops that return value to a new array should work.
- Bugzilla 3882: Unused result of pure functions
- Bugzilla 5070: Heap-allocated closures listing
- Bugzilla 6798: Integrate overloadings for multidimentional indexing and slicing
- Bugzilla 7747: Diagnostic should be informative for an inferred return type in a recursive call
- Bugzilla 7961: Add support for C++ namespaces
- Bugzilla 8101: Display candidate function overloads when function call fails
- Bugzilla 9112: Uniform construction for built-in types
- Bugzilla 9570: Wrong foreach index implicit conversion error
- Bugzilla 9616: SortedRange should support all range kinds
- Bugzilla 10018: Value range propagation for immutable variables
- Bugzilla 11345: Optimize array literal to static array assignment to not allocate on GC heap
- Bugzilla 11620: dmd json output should output enum values
- Bugzilla 11819: Implement better diagnostics for unrecognized traits
- Bugzilla 12232: The result of pointer arithmetic on unique pointers should be a unique pointer
- Bugzilla 12273: 'dmd -color' flag to colorize error/warning messages
- Bugzilla 12280: Redundant "template instance ... error instantiating" messages
- Bugzilla 12290: IFTI should consider implicit conversions of the literal arguments
- Bugzilla 12310: [CTFE] Support heap allocation for built-in scalar types
- Bugzilla 12352: Consistently stop encoding return type of parent functions
- Bugzilla 12550: Deprecate -noboundscheck and replace with more useful -boundscheck= option
- Bugzilla 12598: Poor diagnostic with local import hijacking
- Bugzilla 12606: Mismatch of known array length during dynamic => static array assignment should emit better diagnostics
- Bugzilla 12641: D1: __FILE__ and __LINE__ default argument behaviour
- Bugzilla 12653: Add the getFunctionAttributes trait
- Bugzilla 12681: Rewrite rule prevents unique detection
- Bugzilla 12798: constant folding should optimize subsequent concatenations
- Bugzilla 12802: Allow optional 'StorageClasses' for new alias syntax
- Bugzilla 12821: Missed redundant storage class / protection errors.
- Bugzilla 12932: Support @nogc for immediately iterated array literal
- Bugzilla 12967: Prefix method 'this' qualifiers should be disallowed in DeclDefs scope
- Bugzilla 13001: Support VRP for ternary operator (CondExp)
- Bugzilla 13138: add peek/poke as compiler intrinsics
- Bugzilla 13277: The base class in the JSON output is always unqualified
- Bugzilla 13281: Print type suffix of real/complex literals in pragma(msg) and error diagnostic
Phobos regressions
- Bugzilla 12332: std.json API broken without notice
- Bugzilla 12375: Writeln of a char plus a fixed size array of chars
- Bugzilla 12394: Regression: std.regex unittests take agonizingly long to run - like hours on OSX
- Bugzilla 12428: Regression (2.066 git-head): toUpper is corrupting input data (modifying immutable strings)
- Bugzilla 12455: [uni][reg] Bad lowercase mapping for 'LATIN CAPITAL LETTER I WITH DOT ABOVE'
- Bugzilla 12494: Regression (2.064): to!string(enum) returns incorrect value
- Bugzilla 12505: Null pointers are pretty-printed even when hex output is requested
- Bugzilla 12713: [REG 2.066A] std.regex.regex crashes with SEGV, illegal instruction resp. assertion failure with certain bad input
- Bugzilla 12859: Read-modify-write operation for shared variable in Phobos
- Bugzilla 13076: [dmd 2.066-b2] DList clearing of empty list
- Bugzilla 13098: std.path functions no longer works with DirEntry
- Bugzilla 13181: install target broken
Phobos bugs
- Bugzilla 1452: std.cstream doc incorrect - imports of stream and stdio are not public
- Bugzilla 1726: std.stream FileMode documentation problems
- Bugzilla 3054: multithreading GC problem. And Stdio not multithreading safe
- Bugzilla 3363: std.stream.readf segfaults with immutable format strings
- Bugzilla 3484: std.socket.Address hierarchy not const-safe
- Bugzilla 4330: std.range.transposed() should be documented
- Bugzilla 4600: writeln() is not thread-safe
- Bugzilla 5177: std.socketstream's close() should call super.close()
- Bugzilla 5538: Immutable classes can't be passed as messages in std.concurrency
- Bugzilla 5870: Debug code in SortedRange assumes it can always print the range
- Bugzilla 6644: std.stdio write/writef(ln) are not @trusted
- Bugzilla 6791: std.algorithm.splitter random indexes utf strings
- Bugzilla 6998: std.container.Array destroys class instances
- Bugzilla 7246: Provide a simpler example for std.algorithm.remove
- Bugzilla 7289: Document how std.format handles structs, unions, and hashes.
- Bugzilla 7693: Getopt Ignores Trailing Characters on Enums
- Bugzilla 7767: Unstable sort - slow performance cases
- Bugzilla 7822: lseek cast(int)offset should be lseek cast(off_t)offset
- Bugzilla 7924: reduce does not work with immutable/const as map and filter do
- Bugzilla 8086: std.stdio is underdocumented
- Bugzilla 8590: Documentation for "any" and "all" in std.algorithm is incorrect
- Bugzilla 8721: std.algorithm.remove problem
- Bugzilla 8730: writeln stops on a nul character, even if passed a D string
- Bugzilla 8756: Add link to location of curl static library
- Bugzilla 8764: chunks.transposed causes infinite ranges.
- Bugzilla 8866: Splitter(R1, R2) CANNOT be bidirectional.
- Bugzilla 8905: DList.Range: Internal error, inconsistent state
- Bugzilla 8921: Enum arrays should be formatted properly
- Bugzilla 9015: std.container.DList.opOpAssign missing return
- Bugzilla 9016: swap() doesn't work with std.container.DList.front and back
- Bugzilla 9054: std.net.curl byLineAsync and byChunkAsync broken.
- Bugzilla 9556: Missing underscore in docs for std.string.isNumeric
- Bugzilla 9878: std.algorithm.cartesianProduct results order
- Bugzilla 9975: pointsTo asserts because of false pointer in union
- Bugzilla 10500: Problem with length property when using variant
- Bugzilla 10502: Can't get fullyQualifiedName of a templated struct
- Bugzilla 10693: cartesianProduct with over 7 ranges causes segfault at compile time
- Bugzilla 10779: cartesianProduct leads to heavy code bloat
- Bugzilla 10798: std.regex: ctRegex unicode set ops unimplemented
- Bugzilla 10911: std.net.curl.HTTP: should allow user code to indicate content type of POST data
- Bugzilla 10916: toHash on VariantN not being recognised
- Bugzilla 10931: etc.c.zlib should properly annotate const parameters
- Bugzilla 10948: BitArray.opEquals is invalid
- Bugzilla 11017: std.string/uni.toLower is very slow
- Bugzilla 11072: BitArray.opCmp is invalid on 64x
- Bugzilla 11175: Format should support IUnknown classes
- Bugzilla 11183: Win64: lrint yields bad results
- Bugzilla 11184: Win64: killing process with invalid handle terimates current process
- Bugzilla 11192: std.demangle doesn't demangle alias template arguments
- Bugzilla 11253: std.algorithm.count is not nothrow
- Bugzilla 11308: Don't use Voldemort types for std.process output
- Bugzilla 11364: Variant fails to compile with const(TypeInfo).
- Bugzilla 11608: Inadequate documentation for std.getopt.config.passThrough
- Bugzilla 11698: readf doesn't compile with bool
- Bugzilla 11705: std.typecons.Typedef is missing proper documentation
- Bugzilla 11778: format for null does not verify fmt flags.
- Bugzilla 11784: std.regex: bug in set intersection
- Bugzilla 11825: An impossible memcpy at CTFE with cartesianProduct.array
- Bugzilla 11834: std.net.curl: ddoc warnings
- Bugzilla 11978: std.algorithm canFind uses "value" where it means "needle"
- Bugzilla 12007: cartesianProduct doesn't work with ranges of immutables
- Bugzilla 12076: ctRegex range violation
- Bugzilla 12148: std.uuid.parseUUID should document that it changes lvalue input data
- Bugzilla 12157: Variant opEquals always returns false for classes.
- Bugzilla 12169: sum(int[]) should return a int
- Bugzilla 12183: using std.algorithm.sort makes valgrind abort
- Bugzilla 12245: BinaryHeap exhibits quadratic performance in debug mode
- Bugzilla 12297: std.typecons.Proxy does not properly forward IFTI calls
- Bugzilla 12309: The template fullyQualifiedName returns wrong result
- Bugzilla 12349: std.File.flush and error causes segfault after calling close
- Bugzilla 12356: std.traits.isTypeTuple and isExpressionTuple are poorly documented
- Bugzilla 12366: Range violation in compile-time regex
- Bugzilla 12419: assertion failure in std.utf
- Bugzilla 12434: std.algorithm.sum of immutable array too
- Bugzilla 12449: Undefined format in std.algorithm.max
- Bugzilla 12464: DMD/Phobos cannot auto-implement D variadic methods
- Bugzilla 12477: std.bitmanip should emit informative diagnostics
- Bugzilla 12557: std.numeric.gcd documentation reports Euler's algorithm, but it uses Euclid's algorithm
- Bugzilla 12568: std.functional.memoize with constant array argument too
- Bugzilla 12569: Better error message for std.algorithm.reduce used with two functions and a scalar seed
- Bugzilla 12582: Non-existant named capture groups cause runtime range violation or segmentation fault in regex
- Bugzilla 12600: Variant should support coercion to bool
- Bugzilla 12608: Dead assignment in UUIDParsingException
- Bugzilla 12609: Useless variable assignment in std.regex
- Bugzilla 12643: @nogc std.range.dropOne
- Bugzilla 12668: std.traits.functionAttributes should use the new getFunctionAttributes trait
- Bugzilla 12691: std.regex.bmatch bug in empty OR operator inside of ()*
- Bugzilla 12731: Infinite range slices are not themselves sliceable
- Bugzilla 12747: std.regex bug in the parser allows reference to open groups.
- Bugzilla 12771: opIndex on static arrays in a Variant is not implemented.
- Bugzilla 12781: process.d: "Executable file not found" is supposed to show executable name but fails
- Bugzilla 12796: std.string toLower/toUpper array conversion.
- Bugzilla 12806: Does std.traits.isArray include associative arrays?
- Bugzilla 12828: Fix SimpleTimeZone.utcOffset so that it has the correct return type
- Bugzilla 12846: Phobos git HEAD: std.datetime spewing out tons of deprecation messages
- Bugzilla 12853: std.encoding EncodingSchemeUtf16Native and EncodingSchemeUtf32Native decode() and SafeDecode() wrong stripping length
- Bugzilla 12875: [unittest] std.datetime fails: Not a valid tzdata file.
- Bugzilla 12898: std.process.browse expects URL to be encoded in CP_ACP on Windows instead of UTF-8
- Bugzilla 12921: Module std.getopt does not respect property syntax
- Bugzilla 12923: UTF exception in stride even though passes validate.
- Bugzilla 12996: SList: linearRemove cannot remove root node
- Bugzilla 13000: Casts should be removed to utilize features of inout
- Bugzilla 13068: std.typecons.Unique should disable postblit
- Bugzilla 13100: std.process.setCLOEXEC() throws on invalid file descriptor
- Bugzilla 13151: std.range.take template constraint ambiguity
- Bugzilla 13163: std.conv.parse misses overflow when it doesn't result in a smaller value
- Bugzilla 13171: std.algorithm.until(range, sentinel, OpenRight.no) doesn't propagate popping of sentinel to range
- Bugzilla 13214: array.opSlice one element falsy empty
- Bugzilla 13258: std.process file closing logic is incorrect
- Bugzilla 13263: phobos/posix.mak has incorrect dependencies
Phobos enhancements
- Bugzilla 3780: getopt improvements by Igor Lesik
- Bugzilla 4725: std.algorithm.sum()
- Bugzilla 4999: Add Kenji Hara's adaptTo() to Phobos
- Bugzilla 5175: Add a way to get parameter names to std.traits
- Bugzilla 5228: Add GetOptException (or similar) to std.getopt
- Bugzilla 5240: Faster std.random.uniform() for [0.0, 1.0) range
- Bugzilla 5316: std.getopt: Add character-separated elements support for arrays and associative arrays
- Bugzilla 5808: std.string.indexOf enhancement with start-at parameter
- Bugzilla 6793: Document that assumeUnique may not be necessary in some contexts
- Bugzilla 7146: enhance strip* (implementation provided)
- Bugzilla 8278: std.range.chunks for generic Forward Ranges?
- Bugzilla 8762: instanceOf trait for static conditionals
- Bugzilla 9819: Allow access to named tuple's names.
- Bugzilla 9942: Add a functional switch function
- Bugzilla 10162: Opposite of std.string.representation
- Bugzilla 11598: std.random.uniform could be faster for integrals
- Bugzilla 11876: std.getopt: Implement --help and --help=option automatic printout
- Bugzilla 12015: std.digest.sha256 too
- Bugzilla 12027: Range of true bits for std.bitmanip.BitArray
- Bugzilla 12173: Optional start value for std.algorithm.sum
- Bugzilla 12184: Provide formating options for std.uni.InversionList
- Bugzilla 12446: std.parallelism.amap prefer iteration to indexing
- Bugzilla 12448: "in" argument for std.string.toStringz
- Bugzilla 12479: replace "pointsTo" with "maybePointsTo" and "definitlyPointsTo"
- Bugzilla 12556: Add persistent byLine
- Bugzilla 12566: Give DList true reference semantics
- Bugzilla 12596: Implement Typedef ctor that can take itself as a parameter
- Bugzilla 12633: std.conv.to should support target fixed-sized arrays
- Bugzilla 12644: Some std.math functions are not yet @nogc
- Bugzilla 12656: Some functions in std.ascii can be @nogc
- Bugzilla 12671: std.complex abs and ^^ @nogc
- Bugzilla 12784: Add an "in" operator for std.json.JSONValue
- Bugzilla 12835: std.random.uniform with open lower bound cannot support smaller integral types or character types
- Bugzilla 12877: std.random.uniform cannot handle dchar variates
- Bugzilla 12886: std.datetime cannot parse HTTP date
- Bugzilla 12890: std.array index based replace
- Bugzilla 12957: std.algorithm.cartesianProduct is sometimes very slow to compile
- Bugzilla 13013: Failed unittests in std.json - does not parse doubles correctly
- Bugzilla 13022: std.complex lacks a function returning the squared modulus of a Complex
- Bugzilla 13042: std.net.curl.SMTP doesn't send emails with libcurl-7.34.0 or newer
- Bugzilla 13159: std.socket.getAddress allocates once per DNS lookup hit
Druntime regressions
- Bugzilla 12220: [REG2.066a] hash.get() does not accept proper parameters
- Bugzilla 12427: Regression (2.066 git-head): Building druntime fails with -debug=PRINTF
- Bugzilla 12710: Bad @nogc requirement for Windows callbacks
- Bugzilla 12738: core.sys.posix.signal sigaction_t handler type mismatch
- Bugzilla 12848: [REG2.061] crash in _d_run_main() on some unicode command line argument (Win32)
- Bugzilla 13078: [dmd 2.066-b2] AA rehash failed with shared
- Bugzilla 13084: ModuleInfo.opApply delegate expects immutable parameter
- Bugzilla 13111: GC.realloc returns invalid memory for large reallocation
- Bugzilla 13148: ModuleInfo fields are unnecessary changed to const
Druntime bugs
- Bugzilla 4323: std.demangle incorrectly handles template floating point numbers
- Bugzilla 5892: Lazy evaluation of stack trace when exception is thrown
- Bugzilla 7954: x86_64 Windows fibers do not save nonvolatile XMM registers
- Bugzilla 8607: __simd and pcmpeq should be @safe pure nothrow
- Bugzilla 9584: Exceptions in D are ludicrously slow (far worse than Java)
- Bugzilla 10380: [AA] Wrong code using associative array as key type in associative array
- Bugzilla 10897: btc, btr and bts shouldn't be safe
- Bugzilla 11011: core.time.Duration has example code which cannot compile
- Bugzilla 11037: [AA] AA's totally broken for struct keys with indirection
- Bugzilla 11519: fix timing issue in core.thread unittest
- Bugzilla 11761: aa.byKey and aa.byValue are not forward ranges
- Bugzilla 12800: Fibers are broken on Win64
- Bugzilla 12870: No x86_64 optimized implementation for float array ops
- Bugzilla 12958: core.checkedint.mulu is broken
- Bugzilla 12975: posix.mak should use isainfo on Solaris systems to determine model
- Bugzilla 13057: posix getopt variables in core/sys/posix/unistd.d should be marked __gshared
- Bugzilla 13073: Wrong uint/int array comparison
Druntime enhancements
- Bugzilla 8409: Proposal: implement arr.dup in library
- Bugzilla 12964: dev_t is incorrectly defined in runtime for Solaris systems
- Bugzilla 12976: ModuleInfo should be immutable on Solaris
- Bugzilla 12977: lf64 definitions aren't correct on Solaris
- Bugzilla 12978: struct sigaction is too small on 32-bit solaris
- Bugzilla 13037: SIGRTMIN and SIGRTMAX aren't correctly defined on Solaris
- Bugzilla 13144: Add fenv support for Solaris
- Bugzilla 13145: Need LC_ locale values for Solaris
- Bugzilla 13146: Add missing function definitions from stdlib.h on Solaris
Installer regressions
- Bugzilla 13004: /? option to cl.exe results in ICE
- Bugzilla 13047: cannot stat ./icons/16/dmd-source.png: No such file or directory
- Bugzilla 13210: libphobos2.so not being built
- Bugzilla 13233: Windows installer: downloading external installers (Visual D/dmc) does not work
Installer bugs
- Bugzilla 3319: DInstaller overwrites the %PATH% variable
- Bugzilla 5732: Windows installer creates incorrect target for Start menu link
- Bugzilla 13149: released libphobos2.a is build with PIC code
Website regressions
- Bugzilla 12813: Parser is confused between float and UFC syntax
Website bugs
- Bugzilla 1497: Add a link to the DWiki debuggers page
- Bugzilla 1574: DDoc documentation lacks macro examples
- Bugzilla 3093: Object.factory has incomplete documentation
- Bugzilla 4164: sieve Sample D Program -- need documentation for array representation
- Bugzilla 6017: std.algorithm.remove has a wrong link
- Bugzilla 7075: overloading opAssign for classes is poorly specified
- Bugzilla 7459: Document the workarounds for mutually-called nested functions.
- Bugzilla 8074: template-mixin example contradicts text
- Bugzilla 8798: Tuple curry example not really curry
- Bugzilla 9542: Broken link on std.range doc page
- Bugzilla 10033: Wrong example in chapter Vector Extensions
- Bugzilla 10231: Spec: Document typed alias parameter feature
- Bugzilla 10297: Memory safe D spec is out of date
- Bugzilla 10564: Errors on the Template page of the language specification
- Bugzilla 10764: bug reporting / better linking to issue tracker / include resolved in default search
- Bugzilla 10901: Win_64 Autotester KO'd
- Bugzilla 11104: Document exact behavior of structsasd initialization inside AA
- Bugzilla 11396: Function alias declaration not valid according to spec
- Bugzilla 11462: std.algorithm.multiSort is missing from the index
- Bugzilla 11638: Variadic function documentation, out-of-date example
- Bugzilla 11846: Missing pragma/(mangle) documentation
- Bugzilla 11867: Documentation for new package.d feature
- Bugzilla 11917: Stale Phobos documentation pages found on site root
- Bugzilla 11979: inout const is not documented
- Bugzilla 12005: DDoc example refers to a dead project, yet a more recent one exists that is not mentioned.
- Bugzilla 12241: Document change to static opCall in changelog
- Bugzilla 12293: forward is missing from std.algorithm's cheat-sheet
- Bugzilla 12459: Bugzilla logs users in only on https site, and does not redirect from http to https
- Bugzilla 12526: DDox possible issue with case sensitive file names
- Bugzilla 12535: The language introduction page is not linked from index
- Bugzilla 12538: ZeroBUGS links are broken
- Bugzilla 12607: Document that IUnknown classes must mark toString with extern(D) when overriding it
- Bugzilla 12623: Special lexing case not mentioned in language spec
- Bugzilla 12740: DMD accepts invalid version syntax
- Bugzilla 13012: Open bugs chart is missing from http://dlang.org/bugstats.php
Website enhancements
- Bugzilla 8103: Use case-insensitive sorting for Jump-to lists in the documentation
- Bugzilla 12783: Adding 'Third Party Libraries' link to the navigation sidebar
- Bugzilla 12858: Document opEquals usage in AAs
Language Changes
- Goto jumps now cannot skip variable declarations.
- All instantiated functions now infer their attributes.
- Add a new type qualifier inout const.
- Entire slicing operation of built-in tuple is now accepted.
- Packages and module names now have no type.
- Const and immutable fields with initializers are now deprecated.
- Deprecate unordered floating point comparisons.
- Deprecate .min property for floating-point types.
- CTFE can handle overlapped union fields.
- Add a new trait getAliasThis.
- Mixing struct constructors and static opCall is no longer allowed.
Library Changes
Linker Changes
List of all bug fixes and enhancements in D 2.065.
Compiler Changes
- Extensionless D source file names can now be run when using the -run switch:
On Posix systems it is frequently useful to have a shebang line at the start of an extensionless file, which marks the tool used to compile the script. It's now possible to use this technique with D, e.g. the following is a D source file with the file name "my-script":
#!rdmd void main() { }
Note: This does not allow an arbitrary extension, as D source files need to be proper D identifiers.
Note: This feature is not available on Windows, as Windows does not have extensionless executable files.
Note: When compiling, and in order to avoid the default behavior of generating an extensionless executable which would overwrite the source file, the compiler will generate "a.out" instead.
Language Changes
- Goto jumps now cannot skip variable declarations:
For a very long period, the following code had been allowed by mistake, but it is prohibited now:
import std.stdio; void main() { goto Label; // Error: goto skips declaration of variable v int v = 42; Label: writeln(v); }
- All instantiated functions now infer their attributes:
Regardless of how directly or indirectly a function is instantiated, its attributes will still be inferred:
struct S(T) { T square(T x) { T calc() { return x * x; } return calc(); } static double pi() { return 3.141592; } } void main() pure @safe nothrow { S!int s; // S!int.square and its nested function calc are instantiated functions, so // their attributes are inferred as pure and callable from main() assert(s.square(2) == 4); // ok // static member function attributes are also inferred now auto pi = typeof(s).pi(); }
- Add a new type qualifier inout const:
Until now, the common type of immutable(T) and inout(T) had been const(T). But that loses the inout information, which might then refuse some valid code. Now the type becomes inout(const(T)), which meaningfully propagates the appropriate type qualifier.
inout(const(int))[] foo(bool condition, inout(int)[] x, immutable(int)[] y) { static assert(is(typeof(condition ? x : y) == inout(const(int))[])); return condition ? x : y; } void main() { int[] marr = [1,2,3]; const(int)[] carr = [4,5,6]; immutable(int)[] iarr = [7,8,9]; // inout(const(int))[] can go back to const(int)[] or immutable(int)[]. static assert(is(typeof(foo(true, marr, iarr)) == const(int)[])); static assert(is(typeof(foo(true, carr, iarr)) == const(int)[])); static assert(is(typeof(foo(true, iarr, iarr)) == immutable(int)[])); }
- Entire slicing operation of built-in tuple is now accepted:
Bugzilla 8244: cannot slice a type tuple with '[]' in locations where a type is valid:
import std.typetuple; alias Types = TypeTuple!(int, double, string); // Was error in 2.064, but allowed from 2.065. alias Types2 = Types[]; static assert(is(Types == Types2));
- Packages and module names now have no type:
Bugzilla 9081: Modules shouldn't have a type
import std.stdio; // Both had printed 'void' in 2.064. // From 2.065, both will cause "has no type" error. pragma(msg, typeof(std)); pragma(msg, typeof(std.stdio));
By the change, an idiom that used to work is(typeof(package_or_module_name)) is changed to not work. Instead use: __traits(compiles, package_or_module_name).
- Const and immutable fields with initializers are now deprecated:
Eventually, they will be changed to occupy space in the object. Such fields should now be changed to enum or static. See also the release note in 2.063.
Related to that, void-initialized const or immutable fields will now occupy space in the object instance ahead of schedule:
struct S { const int[1000] x = void; this(int n) { // Was disallowed in 2.064. // From 2.065 x is a field of runtime object. x[] = n; } } // S.sizeof had been 1 in 2.064. // From 2.065, field s.x occupies space in the object. static assert(S.sizeof == int.sizeof * 1000); void main() { S s = S(3); foreach (e; s.x) { assert(e == 3); // OK } }
- Deprecate unordered floating point comparisons:
Bugzilla 10369: Deprecate unordered floating point comparisons
- Deprecate .min property for floating-point types:
Bugzilla 10439: Deprecate float.min, double.min, real.min
- CTFE can handle overlapped union fields:
Example code:
union U { size_t x; int* y; } bool test() { U u; assert(u.x == 0); // In here, reading u.y will cause CTFE error. u.y = [1,2,3].ptr; // Writing value to overlapped field u.y will make corresponding field u.x invalid. assert(u.y[0..3] == [1,2,3]); // u.y holds valid field and reading it is allowed // In here, reading u.x will cause CTFE error. u.x = 10; // Set value to u.x again. assert(u.x == 10); // OK // In here, reading u.y will cause CTFE error. return true; } static assert(test()); // run CTFE
Bit image reinterpretation by using two overlapped union fields is not allowed during CTFE.
- Add a new trait getAliasThis:
The new getAliasThis trait will return a tuple of field names which are marked as the subtypes of an aggregate type. For example:
struct S { string var; alias var this; } static assert(__traits(getAliasThis, S)[0] == "var");
Note: Multiple subtyping is not yet implemented in D, therefore this trait will always return a tuple of length 1.
- Mixing struct constructors and static opCall is no longer allowed:
This was not implemented correctly and caused ambiguities.
Example:
struct S { this(int i) {} static S opCall() // disallowed due to constructor { return S.init; } }
Note: static opCall can be used to simulate struct constructors with no arguments, but this is not recommended practice. Instead, the preferred solution is to use a factory function to create struct instances.
Library Changes
- Many functions in std.algorithm can now be used as predicates to other functions:
Functions such as any, all, canFind and equal are now templates, which allows them to be used as predicates to other templates, as well as allowing the user to alias an instantiation of any such templates. For an example of how this allows terser syntax in user-code, in the following example the programmer wants to check whether all the strings in a string array have at least one ASCII digit:
import std.algorithm : all; import std.ascii : isDigit; void main() { string[] inputs = ["foo1", "bar2"]; bool allContainDigit; foreach (input; inputs) { if (!any!isDigit(input)) // none of the characters are ASCII digits { allContainDigit = false; break; } } }
But it is now simpler to use the any template itself as a predicate. We can make it a predicate to another useful template, the all template:
import std.algorithm : any, all; import std.ascii : isDigit; void main() { string[] inputs = ["foo1", "bar2"]; bool allContainDigit = all!(any!isDigit)(inputs); }
In addition to allowing these functions to become predicates they can now also be aliased, which allow you to make your functions simpler to understand:
import std.algorithm : any, all; import std.ascii : isDigit; void main() { alias isAnyDigit = any!isDigit; // less visual noise and a self-describing function string[] inputs = ["foo1", "bar2"]; bool allContainDigit = all!isAnyDigit(inputs); // easier to understand alias doAllContainDigits = all!isAnyDigit; // or wrap the entire algorithm into one symbol! assert( doAllContainDigits(["1", "a 1", "b 2"])); // self-describing code assert(!doAllContainDigits(["c", "a 1", "b 2"])); }
You can of course combine all and any in a number of combinations. For example, if you want to reverse the test and instead check whether any of the strings in the string array contain all digits, the code might look like the following:
import std.algorithm : any, all; import std.ascii : isDigit; void main() { alias areAllDigits = all!isDigit; alias areAnyIntegrals = any!areAllDigits; assert( areAnyIntegrals(["123", "456"])); assert( areAnyIntegrals(["abc", "123"])); // "123" is a number assert(!areAnyIntegrals(["abc", "def123"])); // "def123" is not really a number }
If on the other hand you want to ensure that all strings in the string array contain all digits, the could might look like the following:
import std.algorithm : any, all; import std.ascii : isDigit; void main() { alias areAllDigits = all!isDigit; alias allStringsDigits = all!areAllDigits; assert( allStringsDigits(["123", "456"])); assert(!allStringsDigits(["abc", "123"])); // "123" is a number, but "abc" is not }
- Allow std.algorithm.all to be used without a predicate.
You no longer need to pass a predicate if you want to match all items in a range which implicitly convert to true:
import std.algorithm; void main() { auto arr1 = [true, true, true]; assert( all(arr1)); // all values are true auto arr2 = [false, true, true]; assert(!all(arr2)); // all values are not true auto arr3 = [1, 2, 3]; assert( all(arr3)); // all values convert to true auto arr4 = [0, 2, 3]; assert(!all(arr4)); // all values do not convert to true }
- Add std.uni.byGrapheme and std.uni.byCodePoint.
Complementary higher-order ranges which enable range operations on graphemes:
import std.array : array; import std.range : retro; import std.string : text; import std.uni : byCodePoint, byGrapheme; void main() { string s = "noe\u0308l"; // noël // reverse it and convert the result back to UTF-8 string reverse = s.byGrapheme() .array() // Note: byGrapheme will support bidirectionality in the future .retro() .byCodePoint() .text(); assert(reverse == "le\u0308on"); // lëon }
Note that byGrapheme will support bidirectionality in the future, obviating the need for array in the above example. - Add support for any number of arguments to std.range.only.
only can now be used with more than one argument:
import std.algorithm : joiner; import std.range : equal, only; void main() { assert(only("one", "two", "three").joiner(" ").equal("one two three")); }
Additionally, only() is now a way to get an empty range.
Linker Changes
- Added /LARGEADDRESSAWARE to the Win32 Optlink linker.
When using the default Optlink linker on win32 (for linking 32-bit object files and executables), the /LARGEADDRESSAWARE option tells the linker that the application can handle addresses larger than 2 gigabytes. This is equivalent to Visual C's linker option of the same name since this is an operating-system feature that is enabled by setting a specific flag in the executable.
List of all bug fixes and enhancements in D 2.065:
DMD Compiler regressions
- Bugzilla 7782: [ICE] With wrong import syntax
- Bugzilla 9107: Value Range Analysis with uint and byte
- Bugzilla 9639: Recursive template instanciation segfault dmd
- Bugzilla 11078: Diagnostic for wrong RHS in property assign of a property group should improve
- Bugzilla 11321: Can't link _D6object15__T7reserveTyaZ7reserveFNaNbNeKAyamZm
- Bugzilla 11441: DMD halts compilation at semantic3
- Bugzilla 11447: Closure provide bogus values
- Bugzilla 11472: REGRESSION(2.064): dmd segfaults on wrong code instead of giving error
- Bugzilla 11487: dmd segfaults on writefln in nested template
- Bugzilla 11504: [CTFE] JSONValue cannot make in CTFE
- Bugzilla 11505: Bad error message: "opAssign [...] is annotated with @disable"
- Bugzilla 11508: [REG 2.064] Wrong code with -O on x86_64 for char comparisons
- Bugzilla 11513: [REG 2.064] Assertion in module.c
- Bugzilla 11525: REG(2.065): Error: 'a[] *= a[]' each element is not a scalar, it is a Complex!double
- Bugzilla 11553: dmd segfault with recursive template
- Bugzilla 11554: is(T == enum); produces an error if T is an enum defined with no members
- Bugzilla 11563: Module dependency cycle causes unrelated template instantiations to fail
- Bugzilla 11566: ICE with invalid array op
- Bugzilla 11596: Internal error: backend/cgcs.c 351
- Bugzilla 11610: Compiler core dumps on FreeBSD, compiles forever on Linux
- Bugzilla 11614: Error: this for _expand_field_0 needs to be type Tuple not type Foo
- Bugzilla 11626: [ICE] (mtype.c line 9718) With missing in ref type
- Bugzilla 11659: false positive goto skips initialization of variable error (skipping enum initialization)
- Bugzilla 11718: [REG2.065a] Unintended mangled names conflict of nested template structs
- Bugzilla 11723: Too many "integer overflow" errors
- Bugzilla 11730: associative array with Nullable!SysTime values: Called get on null Nullable!SysTime.
- Bugzilla 11751: [REG2.065a] Hex float exponents should be decimal
- Bugzilla 11755: Operator <>= and !<>= with arrays make internal error in e2ir
- Bugzilla 11767: doubly mixed-in struct "failed semantic analysis"
- Bugzilla 11776: [ICE] Assertion failure: 'tf->next == NULL' on line 119 in file 'mangle.c'
- Bugzilla 11777: [ICE] dmd memory corruption as Scope::pop frees fieldinit used also in enclosing
- Bugzilla 11805: Removal of Bool has critically broken expression evaluation
- Bugzilla 11818: Ternary operator not allowed in a value parameter anymore
- Bugzilla 11822: -de switch causees ICE with auto return and other stuff
- Bugzilla 11824: A stack variable escaping problem in CTFE Phobos code
- Bugzilla 11844: ICE(template.c:6643) Assertion failed: (td->semanticRun != PASSinit)
- Bugzilla 11849: Recursive enum causes segfault
- Bugzilla 11850: [ICE] Problem with filter with signed-unsigned array comparison
- Bugzilla 11852: RDMD broken on the Github HEAD
- Bugzilla 11854: Git-head does not build with Visual Studio
- Bugzilla 11863: std.conv.to!string(int/uint, radix) returns incorrect string
- Bugzilla 11868: ICE(template.c) on passing inout const argument as TemplateTupleParameter
- Bugzilla 11896: [REG2.066a] isVirtualMethod related GitHub HEAD regression (works with 2.064)
- Bugzilla 11914: Missed tuple unpacking in foreach for cartesianProduct
- Bugzilla 11919: GitHub HEAD regression for getAttributes trait (DMD CORE DUMP)
- Bugzilla 11922: [REG2.065a] ICE on nonexistent identifier in templated auto method
- Bugzilla 11924: inout Variadic Template Parameters
- Bugzilla 11925: [2.065] [REGRESSION] ICE in CompoundStatement::semantic
- Bugzilla 11930: Github regression -- Alias this not considered in is(T unused: U) matching
- Bugzilla 11931: Linkers "Symbol Undefined" again with dmd HEAD when -g specified
- Bugzilla 11941: Errors when appending to aggregate member array in CTFE
- Bugzilla 11956: dmd doesn't lookup /etc/dmd.conf
- Bugzilla 11963: Regression(2.065) ICE(parse.c) Parser crash
- Bugzilla 11965: Regression(2.064) Segfault on garbage
- Bugzilla 11966: Regression 2.065.b1: inout(const(char))[] doesn't convert to inout(char)[]
- Bugzilla 11967: Regression(2.065) ICE(parse.c) Parser crash
- Bugzilla 11980: startaddress pragma broken (DMD 2.061 regression)
- Bugzilla 11993: [REG] typeof(this) in constraint of member function template should reflect method qualifier
- Bugzilla 12002: Internal error: toir.c 181
- Bugzilla 12008: alias this and "unable to resolve forward reference" error
- Bugzilla 12010: [REG DMD2.065-b1] Undefined template symbols for static library linked with debug symbols
- Bugzilla 12016: implicit immutable upcast becomes null in CTFE
- Bugzilla 12017: DDoc leaves out the majority of documentation
- Bugzilla 12023: Regression 2.065-b2: template mixin fails within template class
- Bugzilla 12037: Link-failure with std.numeric.CustomFloat
- Bugzilla 12044: Invalid code gen causes segfault
- Bugzilla 12047: Regression (2.065 git-head): UDAs are not checked
- Bugzilla 12070: Variant opCall not static
- Bugzilla 12079: Internal error: backend/cod4.c 358 for associative array access
- Bugzilla 12080: Internal error: backend/symbol.c 1035 for invariant
- Bugzilla 12089: std.utf.validate and inout(char[]) failts to compile
- Bugzilla 12144: [REG DMD2.064] Unresolved xopEquals when referenced by dynamic array constructor
- Bugzilla 12158: ICE with .init of nonexisting selective import
- Bugzilla 12160: UDA related regressions
DMD Compiler bugs
- Bugzilla 235: goto & scope: cannot goto forward into different try block level
- Bugzilla 275: Undefined identifier in instances of templates with forward mixins
- Bugzilla 602: Compiler allows a goto statement to skip an initalization
- Bugzilla 899: structure field .offsetof property inaccessible in the scope
- Bugzilla 900: changing import order causes type mismatch
- Bugzilla 918: (D1 only): Template order matter, version block change something with typedef, and another template bug.
- Bugzilla 1687: "extern (C++) interface" and vtbl
- Bugzilla 1748: Wrong stringof for templated classes
- Bugzilla 2481: mixing field into anonymous struct inside class generates field overlapping vtable
- Bugzilla 2806: enum member cannot be forward referenced
- Bugzilla 2885: Silent forward reference bug using ReturnType
- Bugzilla 3013: Duplicate error message on calling a function with a type
- Bugzilla 3107: [meta] Property syntax
- Bugzilla 3226: -fPIC flag doesn't seem to work
- Bugzilla 3279: (D1 only) Confusing error message when comparing types
- Bugzilla 3307: Template alias default parameters aren't resolved properly
- Bugzilla 3753: ICE(eh.c): Related to exception handling and alloca.
- Bugzilla 3817: Array op: wrong error message
- Bugzilla 3834: forward reference in templated class
- Bugzilla 3903: Traits compiles as true for an array sum with wrong syntax
- Bugzilla 3970: Problem with cast -1.0L ==> uint/ulong
- Bugzilla 3991: Void initializers in unions considered overlapping
- Bugzilla 4145: cross alias namespace can't be resolve
- Bugzilla 4162: pass by alias offset problems
- Bugzilla 4983: [ICE] Stack overflow while initializing struct member with address of one of its methods
- Bugzilla 5569: 64 bit Dwarf symbolic debug info not recognized by gdb
- Bugzilla 5878: Forward reference in returning superclass from template using is() expression (Breaks std.traits.BaseTypeTuple)
- Bugzilla 6010: -fPIC is broken on freebsd/64
- Bugzilla 6382: edge case with static foreach
- Bugzilla 6439: [CTFE] union fields are initialized independently
- Bugzilla 6764: IFTI fails on typesafe variadic function over static array with non IntegerLiteral length
- Bugzilla 6796: Several __error with wrong enum definition
- Bugzilla 7077: (D1 only) mixin statements can invade the enclosing scope
- Bugzilla 7175: Zero-length static array .ptr is always null
- Bugzilla 7472: Cast from class to basic type not rejected during semantic
- Bugzilla 7645: ICE(e2ir.c) nested classes
- Bugzilla 7744: Forward reference in string mixin
- Bugzilla 7966: First template instantiation inside with results in Error 42: Symbol Undefined
- Bugzilla 8019: (D1 only) can't convert [] to int[]
- Bugzilla 8117: Cannot initialize struct member without default constructor
- Bugzilla 8179: ICE(e2ir.c) with failed fixed size array cast
- Bugzilla 8200: DMD segfault: template aliasing result of map
- Bugzilla 8244: cannot slice a type tuple with '[]' in locations where a type is valid
- Bugzilla 8255: [CTFE] ICE when passing 'ref' literal
- Bugzilla 8313: stack overflow on recursive ifti evaluation
- Bugzilla 8365: Static fixed size array of enums initialization fails
- Bugzilla 8396: wrong order of evaluation for tuple expansion in function arguments
- Bugzilla 8492: can't infer type in static assert
- Bugzilla 8511: Segfault with forward-referenced enum
- Bugzilla 8525: optimizer loops infinitely
- Bugzilla 8543: simd literals need better CTFE support
- Bugzilla 8581: Internal error: backend/cod1.c 1677 on structs with bitfields (when compile with release or optimize parameter)
- Bugzilla 8648: No error line number with incomplete template
- Bugzilla 8658: Passing large structs to function b value causes stack corruption
- Bugzilla 8664: Compiler causes stack overflow with recursive typedef and option -g
- Bugzilla 8711: ICE with initializing function pointer with array
- Bugzilla 8722: foreach triggers a floating point exception with multidimensional array of a dimension equal to 0
- Bugzilla 8735: ICE: Assertion failure: 't' on line 100 in file 'aliasthis.c'
- Bugzilla 8739: DDoc outputs wrong parameter name in delegate parameter list
- Bugzilla 8825: Wrong line number of error message
- Bugzilla 8903: Bad code for enum array members
- Bugzilla 8997: template instances omit symbol that may be used in other modules
- Bugzilla 9008: Another forward referencing bug
- Bugzilla 9050: Too early instantiation of template structs
- Bugzilla 9081: Modules shouldn't have a type
- Bugzilla 9212: Associative array foreach iteration with immutable key
- Bugzilla 9256: A purity-related error message in case of member access
- Bugzilla 9271: Forwarding lambda predicate with type inference causes segfault
- Bugzilla 9296: LITTLE_ENDIAN and BIG_ENDIAN are always defined on Linux
- Bugzilla 9301: using XMM.PSHUFD results in an internal compiler error
- Bugzilla 9356: -inline with inout and append generates wrong code
- Bugzilla 9459: Front-end does not detect invalid array operations
- Bugzilla 9466: Compiler crash with code-coverage generation with large files
- Bugzilla 9504: typeof does not look up properties correctly on template argument
- Bugzilla 9562: Built-in runtime properties should become error with Type.prop
- Bugzilla 9572: Missed wrong implicit integral conversion
- Bugzilla 9577: Crash on static array of function literals
- Bugzilla 9644: Spell checker gives silly suggestions for 1-2 character symbols
- Bugzilla 9662: Implement RDMD test suite
- Bugzilla 9690: cannot access to @disable'd symbol from inner function of another @disable'd
- Bugzilla 9741: undefined identifier with User Defined Attribute
- Bugzilla 9765: Error message with __error with struct literal dotvar expression
- Bugzilla 9807: with statement does not work with alias this
- Bugzilla 9831: Error message with failed lambda inference
- Bugzilla 9861: Spurious 'is used as type' error with failed template instantiation
- Bugzilla 9912: Wrong codegen when using tuple over member variable in more than one method
- Bugzilla 10207: Alias and @attributes: Assertion failure: '!udas' on line 3132 in file 'parse.c'
- Bugzilla 10224: core.simd ICE cgcv.c line 2162 when compiling with -g
- Bugzilla 10251: CTFE: Allow returning pointers to global static variables of known value
- Bugzilla 10259: ICE on invalid compile-time class instantiation
- Bugzilla 10312: compiler assert failure with ctfe on simd vector type
- Bugzilla 10313: inout constructor + IFTI + has indirections arg doesn't work
- Bugzilla 10329: Attributes not inferred for indirectly templated methods
- Bugzilla 10391: Segfault compiling on Mac OS 10.8
- Bugzilla 10459: align(16) does not work on Win64 with seperate compilation
- Bugzilla 10483: ICE(expression.c) .init of struct with block initialized 2D static array
- Bugzilla 10598: Using not-imported type - AssertFail: 'global.errors' line 6040 'template.c'
- Bugzilla 10632: [ICE](glue.c line 1227) With inlining and tuples
- Bugzilla 10635: Error: cannot use array to initialize S
- Bugzilla 10643: Refused const array struct field initialized with void
- Bugzilla 10747: Win64: warning about non-existing vc100.pdb
- Bugzilla 10770: is(T BASE==enum) with tag enum T - AssertFail:'type' line 428 declaration.c
- Bugzilla 10805: wrong error message for wrong delimited string
- Bugzilla 10883: [ICE] Internal error: ../ztc/cod4.c 358 when compiling with -inline
- Bugzilla 10905: [ICE](ctfeexpr.c line 355) with ulong2 in structs
- Bugzilla 10922: Compiler segfaults when using __traits(parent, {})
- Bugzilla 10926: Wrong expression printed when ternary operator used as lvalue
- Bugzilla 10927: Power of complex number causes an internal error
- Bugzilla 10938: ICE on recursive instantiation in opDispatch
- Bugzilla 11019: fwd reference : legal in C++, CT error in D (unable to resolve forward reference in definition)
- Bugzilla 11034: ICE: Assertion failed: (!scope), function toObjFile, file toobj.c, line 366.
- Bugzilla 11155: Wrong SIMD code generated (unaligned movaps)
- Bugzilla 11193: [ICE] String template argument mixed with variadic template arguments causes ICE
- Bugzilla 11198: Error messages for declaring a 'version' inside main() and other functions are unclear
- Bugzilla 11215: inout lose enclosing shared on resolution
- Bugzilla 11224: Inlining stops NRVO
- Bugzilla 11247: Error: typeof(i).sizeof is used as a type
- Bugzilla 11286: Impure dtor makes "cannot call impure function" error, although it won't actually be called.
- Bugzilla 11288: dmd assertion when assigning to (static) opDispatch
- Bugzilla 11297: [ICE](glue.c line 868) with a string concat in global enum lambda
- Bugzilla 11314: inline ice with tuple assignment and if/else again
- Bugzilla 11317: glue.c:1218: virtual unsigned int Type::totym(): Assertion 0 failed.
- Bugzilla 11322: ICE with -inline cgcs.c 221
- Bugzilla 11332: ICE(dt.c) and missing error when interpreting an unimplemented builtin
- Bugzilla 11371: core.simd and ctfe
- Bugzilla 11375: [profile+nothrow] Semantic 'no throw' error with -profile switch
- Bugzilla 11376: ICE on __traits(compiles, ...) with invalid array-op
- Bugzilla 11383: Some array casts incorrectly rejected in safe code
- Bugzilla 11385: XXX is a nested function and cannot be accessed from XXX
- Bugzilla 11394: NRVO should work for object field initialization in constructor
- Bugzilla 11406: ld.gold breaks switch table jumps
- Bugzilla 11425: Broken shadowing variable diagnostic
- Bugzilla 11427: anonymous unions break structs in @safe code
- Bugzilla 11445: adding double[string] causes crash
- Bugzilla 11479: template members ignore private attribute in ddoc
- Bugzilla 11484: [e2ir] Error in e2ir at cast to/from static array
- Bugzilla 11485: [e2ir] Error in e2ir at numeric/bool to class/interface cast
- Bugzilla 11489: Improper implicit cast to immutable.
- Bugzilla 11497: lambda in "static if"/"assert" prevent inlining of function
- Bugzilla 11518: DMD segfault on multiple template match
- Bugzilla 11534: [CTFE] inout + returning a pointer into a member array
- Bugzilla 11540: [ICE] CTFE segfault with try-catch-finally and goto
- Bugzilla 11552: Missing label is not caught during semantic
- Bugzilla 11562: Goto into or out of finally block is not caught during semantic
- Bugzilla 11565: [Optimizer] Zeroes out the higher 32bits of register in ?: expression
- Bugzilla 11587: Cannot compare AAs at compile time
- Bugzilla 11618: Internal Compiler Error
- Bugzilla 11627: [CTFE] cannot cast dchar to char at compile time on AA assignment
- Bugzilla 11629: [CTFE] crash on AA.rehash
- Bugzilla 11635: RDMD eats the -op flag when it should just pass through
- Bugzilla 11653: No error when forgetting break with range cases.
- Bugzilla 11656: property offsetof does not work with __vector fields
- Bugzilla 11661: Meaningless error: "a struct is not a valid initializer for a void function()"
- Bugzilla 11664: A function with a local static variable is unusable in CTFE
- Bugzilla 11689: deprecated local function does not work
- Bugzilla 11696: C++ incorrect static member mangling
- Bugzilla 11722: Qualifier-only casts should not invoke opCast
- Bugzilla 11726: ICE with ufcs on undefined identifier and opDispatch
- Bugzilla 11727: Repeated error message with using forward referenced enum as variable
- Bugzilla 11735: pragma(msg, ...) fails to print wstring, dstring
- Bugzilla 11745: Unittests retrieved by __traits(getUnitTests) can not be invoked if private.
- Bugzilla 11748: [ICE] function call as alias parameter of template gives ICE
- Bugzilla 11749: switch case fallthrough error is enabled with -w, but cannot be made informational warning
- Bugzilla 11750: ICE with debug info and empty #line Filespec
- Bugzilla 11756: Irrelevant variable name printing in CTFE error message
- Bugzilla 11769: Wrong line number in "matches both" error message
- Bugzilla 11785: Order of method/function declarations has an effect on compilation result.
- Bugzilla 11790: ICE(interpret.c): passing creation of array with type string as size to CTFE
- Bugzilla 11793: [ICE] Compiler runs out of memory with trivial program: class with own class member instance
- Bugzilla 11800: alias this matching incorrectly changes lvalue-ness
- Bugzilla 11802: Wrong vtbl order for extern(C++) classes with overloaded functions on win32
- Bugzilla 11813: Improve IFTI error diagnostic
- Bugzilla 11814: Unnecessary error messages "does not match ..." on IFTI failure
- Bugzilla 11843: Template instantiated twice: failed semantic analysis
- Bugzilla 11875: static if template type deduction causes infinite recursion with recursive alias this
- Bugzilla 11926: Segmentation fault when using const in an enum
- Bugzilla 11944: ICE(expression.c) Assertion f failed.
- Bugzilla 11968: ICE(expression.c) Crash when deleting __FILE__
- Bugzilla 11969: ICE(statement.c) When mixing in a array literal containing errors
- Bugzilla 11974: ICE(cast.c) Segfault with invalid assignment
- Bugzilla 11982: ICE(func.c) With function literal with no body
- Bugzilla 12038: alias this and &this cause ICE
- Bugzilla 12040: Compiler segfault with circular reference in variable type
- Bugzilla 12051: Wrong code with ?: resulting in char on x86-64
- Bugzilla 12095: Wrong code with -O -inline
DMD Compiler enhancements
- Bugzilla 3597: Need single source for parser and documentation grammar.
- Bugzilla 5109: some advise
- Bugzilla 5746: Make std.range.iota strongly pure
- Bugzilla 6930: combined type of immutable(T) and inout(T) should be inout(const(T))
- Bugzilla 9477: String (and array) comparisons are needlessly very slow
- Bugzilla 10199: labels cannot be used without a statement
- Bugzilla 11284: add -allinst compiler switch
- Bugzilla 11365: Allow D source file names to have no extension (or an arbitrary extension) when -run is used
- Bugzilla 11417: rotate with immediate not recognized by optimizer
- Bugzilla 11510: Relax restriction for overlapped pointer field access in safe code/during CTFE
- Bugzilla 11533: Compiler should allow to being nested for static local template functions
- Bugzilla 11546: string import dependency failure
- Bugzilla 11711: Add __traits(getAliasThis)
- Bugzilla 11759: Poor error message trying to use lowercase L in literal suffix.
- Bugzilla 11840: Show all errors of undefined identifier used in a line
Phobos regressions
- Bugzilla 1832: reading/writing an archive causes data loss; std.zip horribly broken
- Bugzilla 11309: std.concurrency: OwnerTerminated message doesn't work
- Bugzilla 11512: Can't build Phobos docs with win32 makefile
- Bugzilla 11527: JSONValue cannot set values through named fields
- Bugzilla 11528: appender: crash with -inline -O
- Bugzilla 11576: std.algorithm.remove!(SwapStrategy.unstable) overruns array bounds
- Bugzilla 11583: bigint bug
- Bugzilla 11591: std.typecons.Tuple -s with classes fails at runtime as associative array keys
- Bugzilla 11603: std.algorithm.canFind does not work when needle is 1-byte zero
- Bugzilla 11671: ctRegex broken
- Bugzilla 11684: SIGSEGV with ld.bfd version 2.22
- Bugzilla 11692: can't set file attributes for std.zip.ArchiveMember
- Bugzilla 11764: [REG2.065a]std.getopt broken
- Bugzilla 11831: std.zip no longer allows setting madeVersion field in zip file
- Bugzilla 11838: Missing emplace import for std.range.zip?
- Bugzilla 11853: Tuples fail "isAssignable"
- Bugzilla 11973: std/datetime.d(14647): Deprecation: function std.algorithm.canFind!(not).canFind!(immutable(dchar)[]).canFind is deprecated - Please use any instead
- Bugzilla 12024: [REG DMD2.065-b2] template instantiation for swap(SysTime, SysTime) fails
- Bugzilla 12071: Algebraic won't take delegate returning structure
- Bugzilla 12098: libcurl bad argument on handle null
- Bugzilla 12135: [AA] Format tail after associative array value is treated as separator if explicit separator is empty
- Bugzilla 12168: [REG2.065a] Add ref to array() and object() of JSONValue getters to add new element
Phobos bugs
- Bugzilla 1804: Severe GC leaks with repetitive array allocations
- Bugzilla 2162: Access violation when threads run closures
- Bugzilla 4301: BigInt * const(BigInt) doesn't work well
- Bugzilla 4673: Bug in std.string (isNumeric)
- Bugzilla 4874: std.numeric.dotProduct doesn't work with bigints
- Bugzilla 5280: to!FP(Hex float string) doesn't work well
- Bugzilla 5762: getopt: short option parameter read incorrectly when bundling enabled
- Bugzilla 5977: String splitting with empty separator
- Bugzilla 6730: std.algorithm.splitter conflicts with std.array.splitter
- Bugzilla 7069: Variant Doesn't Handle Const or Immutable Contents
- Bugzilla 7689: splitter() on ivalid UTF-8 sequences
- Bugzilla 8013: splitter() and split() give different results
- Bugzilla 8203: Use of std.regex.match() generates "not enough preallocated memory" error
- Bugzilla 8291: dirEntry cannot handle root directories + unhandled exception causes crash
- Bugzilla 8298: dirEntries special linux file in Home dir
- Bugzilla 8877: std.encoding.transcode is extremely slow
- Bugzilla 9528: std.array.appender can't append elements with const members
- Bugzilla 9645: std.algorithm.splitter on string with char as separator performs badly in certain situations
- Bugzilla 9823: Delegate accepting element not accepted in std.range.put
- Bugzilla 10569: std.traits: EnumMembers, isExpressionTuple, isTypeTuple & Largest balks at large input
- Bugzilla 10571: formattedWrite error with delegate and string
- Bugzilla 10710: shared phobos library doesn't work on all linux distributions
- Bugzilla 10864: [REG 2.064][PERFORMANCE] new Safe appender is slower than "~="
- Bugzilla 11005: std.xml does not encode attributes
- Bugzilla 11110: Variant.convertsTo doesn't work like isImplicitlyConvertible
- Bugzilla 11112: Unable to execute shell commands in different threads
- Bugzilla 11148: Can't implicitly convert const(BigInt) or immutable(BigInt) to BigInt
- Bugzilla 11180: Launching a process from a Windows GUI process using std.process.spawnProcess always fails
- Bugzilla 11403: functions in std.algo can't be used as pred
- Bugzilla 11459: std.container.Array bool constraint ambiguity
- Bugzilla 11568: can't compile std.stdio.rawWrite with -m64 in Windows
- Bugzilla 11600: to!BigInt(string) accepts non-numeric input
- Bugzilla 11606: Cannot instantiate Tuple of non printable
- Bugzilla 11617: std.uni.normalize doesn't compile
- Bugzilla 11652: Support numerical ^^ complex operations in std.complex
- Bugzilla 11681: std.datetime.IntervalRange.opAssign with non-ref parameter is required
- Bugzilla 11691: can't join pathSplitter with dirSeparator
- Bugzilla 11713: std.string munch() does not properly handle UTF strings.
- Bugzilla 11738: partialShuffle actually shuffles the entire input
- Bugzilla 11771: Unicode set intersection with char is broken
- Bugzilla 11775: std.regex should check for valid repetition range in assert mode
- Bugzilla 11780: RangeError in format for incomplete format specifier
- Bugzilla 11808: std.uni.CodepointSet('А', 'Я'+1, 'а', 'я'+1) asserts
- Bugzilla 11839: std.regex capture group names should allow numbers to be in them
- Bugzilla 11879: missing default User-Agent in std.net.curl
- Bugzilla 11884: std.container.Array lacks a constructor from an input range
- Bugzilla 12069: ctRegex is 3x slower then R-T ?
Phobos enhancements
- Bugzilla 3868: It would be nice to have a function which read a file lazily using a range
- Bugzilla 4859: Another File.byChunk()
- Bugzilla 4909: Two suggestions for std.algorithm.schwartzSort()
- Bugzilla 5611: back() and front() with ref return + opSlice() in sort() constraint
- Bugzilla 6986: SortedRange[x..$] fails with unidentified __dollar
- Bugzilla 8167: BigInt(BigInt(1)) too
- Bugzilla 9061: BigInt | BigInt, BigInt & int
- Bugzilla 11770: std.regex.Captures should be convertible to bool
- Bugzilla 11789: No setAttributes to complement getAttributes
- Bugzilla 11798: std.algorithm.all with no predicate too
Druntime regressions
- Bugzilla 11478: shared library on osx: worked in 2.062, fails in 2.063.2, still fails in 2.064
Druntime bugs
- Bugzilla 3454: Inconsistent flag setting in GC.realloc()
- Bugzilla 4809: Stack trace when throwing exception misses location of the throw statement
- Bugzilla 7508: float4 values aren't stored on initialisation
- Bugzilla 8301: Access violation when a big array is allocated
- Bugzilla 10701: [GC] segfault in GC
- Bugzilla 11806: Freeze in GC.collect() in in-contracts when multithreading is used
Optlink regressions
- Bugzilla 11559: Optlink crash with more than 2048 modules generated and debug info
Optlink bugs
- Bugzilla 2837: OPTLINK and LARGEADDRESSAWARE
- Bugzilla 3956: linker removes underscore from all exported symbols of a module but the first
- Bugzilla 6673: Map file contains broken lines on every 16,384 bytes
- Bugzilla 7634: optlink creates bad debug info for a large number of modules
Installer bugs
- Bugzilla 10246: Windows installer still downloads from ftp.digitalmars.com
- Bugzilla 11799: Incompatible argument types in create_dmd_release
Installer enhancements
- Bugzilla 10153: Beta releases should all have unique names
Website regressions
- Bugzilla 11449: Jump lists of phobos are in wrong order
Website bugs
- Bugzilla 5388: SList.insertFront has complexity O(log(n))
- Bugzilla 9734: setIntersection accepts only 2 ranges, but documentation says otherwise
- Bugzilla 10205: 'deprecated' '(' assignExpression ')' grammar is not documented
- Bugzilla 10206: User-defined attributes not documented well in language specification
- Bugzilla 10250: Grammar does not allow invariants in struct declarations
- Bugzilla 10514: Constructor declaration grammar is incorrect
- Bugzilla 11398: Language spec does not allow new eponymous template syntax
- Bugzilla 11579: dlang.org repo can't be built without git
- Bugzilla 11762: std.regex macro is not displayed/expanded properly
Website enhancements
- Bugzilla 11676: Add a link to D Wiki Sidebar to take users back to DLang.org
- Bugzilla 12087: Add Readme to dlang.org repository that explains how to contribute
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
Language Changes
- Const and immutable fields with initializers are now warned about.
- Constructor qualifiers are taken into account when constructing objects.
- Struct members which require non-bitwise comparison are now properly compared.
- Array copy operations now always require using the slice syntax.
- Types no longer act as arguments in typeof expressions.
- The index variable in a foreach range is no longer implicitly a reference.
- Associative array entries are no longer default-initialized before assignment.
- The const attribute is no longer inherited in overriden methods.
- typeof(null) no longer implicitly converts to T[].
- The Template This Parameter now changes the member function qualifier.
- Array slices are now r-values.
- Accessing a non-static field without a this reference is only allowed in certain contexts.
- Arrays no longer implicitly convert to a pointer.
Language Enhancements
- Expressions which return unique objects can be implicitly casted to immutable.
- Static array of void can now be user-initialized.
- Aggregates can now contain multiple invariants.
- Methods of templated aggregates can now infer attributes.
- is expression no longer requires an identifier.
- Dynamic arrays of known size can be implicitly cast to static arrays in some contexts.
- Tuples can now be void-initialized.
- Tuples can now be compared for equality.
- Template constraints can now be put after the inheritance list.
- Fields with initializers can now be re-initialized in a const constructor.
- Added the isNested trait for discovery of aggregates and functions with context pointers.
- Templates can now be nested inside of functions.
- UFCS now works with scoped local imports.
- Added __FUNCTION__, __PRETTY_FUNCTION__ and __MODULE__.
- DDoc: Deprecated declarations are now wrapped in a DEPRECATED macro.
- Added documented unittest feature for verifiable code example generation.
Compiler Enhancements
Phobos Enhancements
List of all bug fixes and enhancements in D 2.063.
Language Changes
- Const and immutable fields with initializers are now warned about:
Eventually, they will be deprecated, and then will trigger an error. Such fields should now be changed to enum or static.
In a future release, a new behavior for them will be enabled:
Fields in an aggregate which are not static will always be addressable. This means they will occupy space in the object:
struct S { // used to be implicitly static in 2.062, now warns. In a future release it will become non-static. immutable int[] arr = [1, 2]; // ditto const int[] arr2 = [1, 2]; }
This means that code which accessed such declarations without the this reference will no longer compile. Additionally code which depended on the size of a structure with such fields will have to be fixed:
struct S { immutable int[] arr = [1, 2]; } void main() { auto x = S.arr; // becomes an error in a future release, 'arr' will require the 'this' reference. // S is size 1 in 2.062 and 2.063. In a future release this will change and the following static assert will pass. static assert(S.sizeof == size_t.sizeof + size_t.sizeof); // ptr + length for the array }
To make the field static again, simply use the static keyword. Alternatively make the field an enum to turn it into a manifest constant:
struct S { static immutable int[] arr = [1, 2]; enum arr2 = [1, 2]; }
Note however that manifest constants which are arrays are allocated on each usage, so you may prefer using static instead.
Rationale:
Making a field implicitly static based on whether it is const/immutable and has an initializer leads to confusion. The static keyword can be used to explicitly make any field static.
- Constructor qualifiers are taken into account when constructing objects:
A qualified constructor is now invoked when a const/immutable/shared aggregate object is instantiated, respectively:
import std.stdio; class C { this() { writeln("1"); } this() const { writeln("2"); } this() immutable { writeln("3"); } this() shared { writeln("4"); } } void main() { auto a = new C; // writes "1" auto b = new const C; // writes "2" auto c = new immutable C; // writes "3" auto d = new shared C; // writes "4" }
This has the consequence that aggregates which have only immutable or shared constructors can no longer be used to instantiate mutable objects:
class C { this() immutable { } this() shared { } } void main() { auto c1 = new C; // disallowed auto c2 = new immutable C; // ok auto c3 = new shared C; // ok }
On the other hand, aggregates which do not have shared or immutable constructors can no longer be used to construct shared or immutable objects, respectively:
class C { this() { } } void main() { auto c1 = new C; // ok auto c2 = new immutable C; // disallowed auto c3 = new shared C; // disallowed }
However, if an aggregate has a pure constructor it can be used to construct an object with any type constructor:
class C { this() pure { } } void main() { auto c1 = new C; // ok auto c2 = new immutable C; // ok auto c3 = new shared C; // ok }
- Struct members which require non-bitwise comparison are now properly compared.
In earlier releases some struct members such as arrays would be bitwise-compared in a comparison operation. This has now been changed to be a structural comparison instead:
struct S { char[] data; } void main () { auto s1 = S("foo".dup); auto s2 = S("foo".dup); assert(s1.data !is s2.data); // both are unique data assert(s1 == s2); // passes in 2.063 assert(s1.data == s2.data); // equivalent of above }
If an opEquals function is not present the compiler rewrites the expression s1 == s2 to s1.tupleof == s2.tupleof. Comparing .tupleof expressions is also a feature new to D in the 2.063 release.
- Array copy operations now always require using the slice syntax:
The right-hand-side of an array copy operation now requires using the slice syntax:
void main() { int[][2] x; int[] y; int[] z; x[] = z; // copies z (pointer + length) 2 times to x y[] = z; // copies each element of z into y (compiler emits warning) }
If the user intended to write such code they must use the slice syntax for both the source and target arrays:
void main() { int[][2] x; int[] y; int[] z; y[] = z[]; // copies each element of z into y (no warnings) }
Rationale:
The compiler will emit a warning to make the user aware that the copy operation is arbitrarily expensive.
- Types no longer act as arguments in typeof expressions:
A type can no longer be passed to a function as a value of that type:
T[] foo(T)(T t) { return null; } void main() { alias int Int; // used to work (only with an alias), now a compiler error alias typeof(foo(Int)) IntArray; }
If the user wants to pass an argument of a certain type, they can use the .init property:
T[] foo(T)(T t) { return null; } void main() { alias typeof(foo(int.init)) IntArray; // ok }
Rationale:
Treating types as expressions in special contexts only leads to confusion. Instead, the .init property can be used for such purposes.
- The index variable in a foreach range is no longer implicitly a reference:
The index variable in a foreach range is now by default a value type:
void main() { size_t count; foreach (n; 0 .. 10) { ++n; ++count; } assert(count == 10); // passes }
If the user wants to modify the index variable he must use the ref keyword:
void main() { size_t count; foreach (ref n; 0 .. 10) { ++n; ++count; } assert(count == 5); }
Rationale:
Making the index variable implicitly ref can introduce bugs that are hard to track down.
- Associative array entries are no longer default-initialized before assignment:
An associative array entry used to be default-initialized before assignment took place:
void main() { int[int] aa; aa[1] = aa[1] + 1; // no Error thrown in 2.062 assert(aa[1] == 1); // worked in 2.062 }
In 2.063, accessing an entry which does not exist will now throw a RangeError:
void main() { int[int] aa; aa[1] = aa[1] + 1; // RangeError thrown in 2.063 }
Rationale:
Default-initialization during assignment can be a source of bugs.
- The const attribute is no longer inherited in overriden methods.
Method overrides no longer inherit constness of the base method:
class A { void foo() const { } } class B : A { // used to work in 2.062, now an error override void foo() { } // note missing 'const' }
If the user wants to override a const method he has to mark the overriden method as const:
class A { void foo() const { } } class B : A { override void foo() const { } // ok }
The feature allows introducing new overloads based on the constness of the method:
class A { void foo() const { } } class B : A { // introduces new overload (not override!) void foo() { } // if the above overload is introduced the user must either: // a: re-introduce the const overload to prevent function hijacking alias super.foo foo; // without this you will get a compiler error // or b: provide a properly typed override: override void foo() const { } }
- typeof(null) no longer implicitly converts to T[]:
The following code used to be allowed:
void f(int[] function() del) { assert(!del()); // fails } typeof(null) g() { return null; } void main() { f(&g); f(() => null); }
However the implicit conversion would end up generating wrong code. To work around this, make sure the return type is typed properly, or use (T[]).init in the return expression of a lambda expression:
void f(int[] function() del) { assert(!del()); // passes } int[] g() { return null; } // fixed return type void main() { f(&g); // ok f(() => (int[]).init); // ok }
- The Template This Parameter now changes the member function qualifier:
The Template This Parameter can now be used to infer the qualifier of this to member functions:
struct S { void foo(this T)() { } } void main() { immutable S s; s.foo(); // makes S.foo immutable }
- Array slices are now r-values:
Array slices are no longer l-values. This means an address can no longer be taken of a slice, and slices cannot be passed by ref to functions:
void foo(ref int[] arr) { arr = new int[10]; } void main() { int[] arr; foo(arr); // ok assert(arr.length == 10); foo(arr[]); // disallowed in 2.063, the slice is an r-value auto ptr = &arr[1..2]; // disallowed in 2.063, cannot take address of r-value }
To work around this you can make your function take an r-value if it doesn't need to reassign and resize the slice, but only needs to read or modify its contents. Otherwise, to accept both l-values and r-values you can make your function take its argument by auto ref:
void take(int[] arr) { } void takeRef(ref int[] arr) { } void takeAutoRef(T)(auto ref T[] arr) { } void main() { int[] arr = [1, 2, 3, 4]; take(arr); // ok takeRef(arr); // ok takeAutoRef(arr); // ok int[] arr2 = arr[1 .. 2]; take(arr2); // ok, arr2 is a variable takeRef(arr2); // ditto takeAutoRef(arr2); // ditto take(arr[1 .. 2]); // ok takeRef(arr[1 .. 2]); // error, cannot pass r-value by reference takeAutoRef(arr[1 .. 2]); // ok }
Rationale:
Passing slices by reference had no observable effect when reassigning or resizing such a slice at the call site, therefore such slices should by default be r-values. For example, the following code used to be allowed but is now a compile-time error:
void reAssign(ref int[] arr) { arr = new int[2]; } void reSize(ref int[] arr) { arr.length = 10; } void main() { int[] arr = [1, 2, 3, 4]; reAssign(arr[0 .. 4]); // reassigning has no observable effect at the call site assert(arr == [1, 2, 3, 4]); reSize(arr[0 .. 4]); // resizing has no observable effect at the call site assert(arr.length == 4); }
- Accessing a non-static field without a this reference is only allowed in certain contexts:
Accessing non-static fields used to be allowed in many contexts, but is now limited to only a few:
- offsetof, init, and other built-in properties are allowed:
struct S { int field; } void main() { auto a = S.field.offsetof; // ok, statically known auto c = S.field.max; // ditto auto d = S.field; // disallowed, no `this` reference }
- When invoking static methods of a non-static field:
struct Foo { static struct Bar { static int get() { return 0; } } Bar bar; } void main() { static assert(Foo.bar.get() == 0); // ok, equivalent to `typeof(Foo.bar).get()` }
- When accessing static fields implicitly using an alias this expression:
struct Foo { static struct Bar { static int get() { return 0; } } Bar bar; alias bar this; } void main() { static assert(Foo.get() == 0); // ok, equivalent to 'typeof(Foo.bar).get()' }
- Arrays no longer implicitly convert to a pointer:
The implicit conversion of an array to a pointer was a deprecated feature:
void foo(int* p) { } void main() { int[] arr = [1, 2]; foo(arr); // ok if -d switch is used during compilation }
This feature has now been completely removed. The workaround is to either use the .ptr property, or explicitly pass the pointer to the first element:
void foo(int* p) { } void main() { int[] arr = [1, 2]; foo(arr); // compile error foo(arr.ptr); // ok foo(&arr[0]); // ok }
Language Enhancements
- Expressions which return unique objects can be implicitly casted to immutable:
Expressions such as new for objects and arrays, and dup for arrays, can now be inferred to be unique. This allows the compiler to implicitly convert such an expression to immutable:
class C { } void main() { immutable int[] arr1 = new int[](3); // ok immutable int[] arr2 = [1, 2, 3].dup; // ok in 2.063 immutable C[] arr3 = [new C, new C].dup; // ok in 2.063 }
- Static array of void can now be user-initialized.
A static array of void could not be initialized in user-code:
void main() { void[2] varr1; // error in 2.062 void[2] varr2 = (void[2]).init; // error in 2.062 void[2] varr3 = void; // ok in 2.062 }
In 2.063, an explicit initializer can be used:
void main() { void[2] varr1; // still an error in 2.063 void[2] varr2 = (void[2]).init; // ok in 2.063 void[2] varr3 = void; // ok in 2.063 }
The .init property effectively zero-initializes the array.
Rationale:
The restriction has been lifted to allow generic code to use .init without having to specialize for static void arrays.
- Aggregates can now contain multiple invariants:
If an aggregate type has multiple invariants, the invariants' bodies will be merged into a single invariant function and will be run in sequence. Note that the code in one invariant cannot reference code or data in another invariant:
struct S { int x; void foo() { } invariant() { int local; assert(x != 0); } invariant() { // local = 1; // invariant does not have access to the other invariant's body assert(x % 2 == 0); } } void main() { S s = S(2); s.foo(); // invoking public function triggers both invariants in sequence }
- Methods of templated aggregates can now infer attributes:
If a function with some attributes instantiates a templated aggregate, it's member functions will infer those attributes:
struct S(T) { T square(T x) { return x * x; } } void main() pure { S!int s; // S!int.square becomes pure and callable from main() assert(s.square(2) == 4); // ok }
- is expression no longer requires an identifier:
In some cases the is expression required an identifier even when you didn't have a use for it:
void main() { alias AA = string[int]; static if (is(AA _ == V[K], V, K)) { pragma(msg, _); // prints string[int] pragma(msg, K); // prints int pragma(msg, V); // prints string } }
The identifier is no longer required, so the above can be rewritten to:
void main() { alias AA = string[int]; static if (is(AA == V[K], V, K)) { pragma(msg, AA); // prints string[int] pragma(msg, K); // prints int pragma(msg, V); // prints string } }
- Dynamic arrays of known size can be implicitly cast to static arrays in some contexts:
In some contexts the compiler knows the size of a dynamic array or of a slice of an array. In such a case the compiler will allow an implicit conversion to a static array of the same size:
void foo(int[4] x) { } void main() { int[] arr = [1, 2, 3, 4, 5, 6, 7, 8]; foo(arr[0 .. 4]); // ok }
Another example, where a string is converted to a reference to a static array:
string str = "aaaabbbbccccdddd"; void foo(ref const(char)[16] buf) { assert(buf.ptr is str.ptr); } void main() { foo(str[0..16]); // ok }
Limitations:
- This feature does not yet work with complex expressions where it might be reasonable to assume the size of a slice:
void foo(int[4] x) { } void main() { int[] arr = [1, 2, 3, 4, 5, 6, 7, 8]; foreach (i; 0 .. 4) { foo(arr[i .. i + 4]); // not yet supported } }
- Tuples can now be void-initialized:
You can now void-initialize a tuple variable:
template Tuple(T...) { alias T Tuple; } void main() { Tuple!(int, int) tup1 = void; // ok }
Upon such initialization the values in the tuple are undetermined.
- Template constraints can now be put after the inheritance list:
Template constraints used to be allowed only before the inheritance list, leading to code where the inheritance list could be hard to spot:
class Foo(T1, T2) if (is(T1 == int) && is(T2 == string)) : Base { }
This restriction has been lifted, so you can now write:
class Foo(T1, T2) : Base if (is(T1 == int) && is(T2 == string)) { }
- Tuples can now be compared for equality:
Example:
struct Tuple(T...) { T field; alias field this; } void main() { auto tup1 = Tuple!(int, int)(1, 2); auto tup2 = Tuple!(int, int)(1, 2); auto tup3 = Tuple!(int, int)(1, 3); assert(tup1 == tup2); // works since 2.063 assert(tup1 != tup3); // works since 2.063 }
This also means you can now compare ParameterStorageClassTuple instances from std.traits:
import std.traits; void func1(ref int x, ref int y) { } void func2(ref float x, ref float y) { } void main() { alias Storages = ParameterStorageClassTuple; assert(Storages!func1 == Storages!func2); }
In addition to that, builtin .tupleof expressions can be used to easily compare fields of an aggregate:
struct S { char[] a, b; // Implements equality test against another instance of this type. bool opEquals(S rhs) { return this.tupleof == rhs.tupleof; } } void main() { S s1 = S("a".dup, "b".dup); S s2 = S("a".dup, "b".dup); assert(s1 == s2); }
This also allows you to implement a structural equality test against an instance of a different type:
struct S1 { char[] a, b; // Implements a structural equality test against any other type T bool opEquals(T)(T rhs) { return this.tupleof == rhs.tupleof; } } struct S2 { string x, y; } void main() { auto s1 = S1("123".dup, "456".dup); auto s2 = S2("123", "456"); assert(s1 == s2); }
Since tuples can be sliced you can use this feature to compare a subset of tuples:
struct S { int a, b, c, d, e; bool opEquals(S rhs) { // compares a, b, d, and e return this.tupleof[0..2] == rhs.tupleof[0..2] && this.tupleof[3..5] == rhs.tupleof[3..5]; } } void main() { S s1 = S(1, 2, 0, 3, 4); S s2 = S(1, 2, 1, 3, 4); assert(s1 == s2); }
- Fields with initializers can now be re-initialized in a const constructor:
You can now initialize a field in a const constructor even if such a field already has an initializer:
struct S { bool field = true; this(int v) const { field = false; // ok } }
- Added the isNested trait for discovery of aggregates and functions with context pointers:
The new isNested trait allows you to discover whether an aggregate or function contains a context pointer:
void main() { int x; struct S1 { void f() { x++; } } static struct S2 { } void f1() { x++; } static void f2() { } static assert(__traits(isNested, S1)); static assert(__traits(isNested, f1)); static assert(!__traits(isNested, S2)); static assert(!__traits(isNested, f2)); }
- Templates can now be nested inside of functions:
- UFCS now works with scoped local imports:
Functions that are made available through a local import are now picked up when using Uniform Function Call Syntax:
module foo; string concat(string arg1, string arg2) { return arg1 ~ arg2; }
module test; void main() { import foo; assert("foo".concat("bar") == "foobar"); // UFCS now works }
This feature also works for imports within aggregates. Note that local imports have a higher precedence than module-scoped imports.
- Added __FUNCTION__, __PRETTY_FUNCTION__ and __MODULE__:
A new set of special keywords were added. Together with __FILE__ and __LINE__ they form a complete feature set that is useful in debugging code:
module test; import std.stdio; void test(string file = __FILE__, size_t line = __LINE__, string mod = __MODULE__, string func = __FUNCTION__, string pretty = __PRETTY_FUNCTION__) { writefln("file: '%s', line: '%s', module: '%s',\nfunction: '%s', pretty function: '%s'", file, line, mod, func, pretty); } int main(string[] args) { test(); return 0; }
The above will output:
file: 'test.d', line: '13', module: 'test', function: 'test.main', pretty function: 'int test.main(string[] args)'
- DDoc: Deprecated declarations are now wrapped in a DEPRECATED macro:
module test; /// sum function deprecated int sum(int x, int y) { return x + y; }
By default the macro expands to its argument. It can be overriden by the user, for example:
macros.ddoc:
DEPRECATED=<del>$0</del>
The above ddoc file can then be used when the documentation is being generated:
$ dmd -D -o- test.d macros.ddoc
- Added documented unittest feature for verifiable code example generation:
Documented unittests which follow any symbol declarations are now used to generate example sections for the symbol when generating DDOC documentation. Example:
/// sum function int sum(int x, int y) { return x + y; } /// unittest { assert(sum(2, 2) == 4); }
The body of the unittest will be part of the documentation of the sum function. This allows the implementor of the function to keep their examples always up-to-date.
For more information, see the documentation page of documented unittests.
void test() { template ArrayOf(T) { alias ArrayOf = T[]; } static assert(is(ArrayOf!int == int[])); }
Allowing template's inside of functions will enable better encapsulation and avoid the pollution of module-scoped symbol names.
Compiler Enhancements
- Added -main switch which adds an empty main function:
The -main switch is primarily useful when unittesting libraries:
module test; int sum(int a, int b) { return a + b; } unittest { assert(sum(2, 2) == 4); }
The above library would need a main() function for the unittests to run, and -main can be used for this purpose:
$ dmd -unittest -main -run test.d
- Added -cov=percentage switch for minimal coverage tests.
The -cov switch now has an optional percentage setting which makes the executable emit an error when the coverage doesn't meet the specified requirement:
module test; void test1() { int x = 5; } void test2() { int x = 5; } void test3() { int x = 5; } void main() { test1(); test2(); }
Example of coverage testing:
$ dmd -cov=90 test.d $ test Error: test.d is 80% covered, less than required 90%
- Added ability to override the mangling of a symbol with a compiler pragma:
The new pragma(mangle, ...) directive allows you to set a custom mangling for any symbol:
pragma(mangle, "module") extern(C) void module_();
The above allows linking to a C function named "module", which ordinarily we wouldn't be able to link to directly since "module" is a reserved D keyword.
Phobos Changes
- std.typecons.scoped implementation changed, potentially breaking some user-code:
User-code which used the std.traits.ReturnType trait to retrieve the type of a scoped call will have to be changed to use the typeof operator instead:
class A { this() {} this(int) {} } class B { // ReturnType!(scoped!A) a; // disallowed in 2.063 typeof(scoped!A()) a; // rewritten, compiles in 2.063 this() { a = scoped!A(1); // would not compile in 2.062, but works with syntax used for 2.063 } }
The reason for this change is that the ReturnType trait would retrieve the wrong type when a class had multiple constructors, and this would cause initializing the field to fail.
Another benefit of the new implementation is that scoped can now be aliased for usability purposes:
class A { this(int) { } } void main() { alias scoped!A scopeA; auto a = scopeA(1); }
Phobos Enhancements
- std.process has been redesigned from the ground up and introduces a new API and functionality:
The new std.process module introduces functionality for invoking processes with custom pipe redirection, the ability to wait for processes to finish, and the ability to kill processes. The full list of features can be found in the std.process documentation.
- std.getopt can now set booleans to false:
Example code:
void main(string[] args) { bool flag = true; getopt(args, &flag); }
When invoked via --flag=false, it will set flag to false.
- Added ownerTid property in std.concurrency:
It is now easier to send a message from a child thread to its owner thread. Simply use the ownerTid property to get the owner thread's Tid identifier:
void fun() { string res = receiveOnly!string(); assert(res == "Main calling"); ownerTid.send("Child responding"); // new } void main() { auto child = spawn(&fun); child.send("Main calling"); string res = receiveOnly!string(); assert(res == "Child responding"); }
If the owner thread has exited, accessing ownerTid from any of its child threads will throw a TidMissingException.
List of all bug fixes and enhancements in D 2.063:
DMD Compiler regressions
- Bugzilla 9130: Wrong codegen for compile time constructed struct
- Bugzilla 9258: opAssign with base class triggers "identity assignment operator overload" error
- Bugzilla 9526: ICE when compiling project with unittests
- Bugzilla 9536: IFTI fails when calling a static member from const member
- Bugzilla 9538: Regression (2.062): Can't use typeid on .ptr of static array
- Bugzilla 9539: Wrong implicit conversion of array to pointer
- Bugzilla 9545: [REG 2.063a] ICE with member template instantiation
- Bugzilla 9552: DMD crashed when taking member delegate from __traits(getOverloads)
- Bugzilla 9566: Regression (2.062): Cannot use struct .init when it contains a static array initialized from a single element.
- Bugzilla 9568: [64bit] wrong code for scope(exit)
- Bugzilla 9633: compiles trait wrongly returns true even when object method call actually does not compile
- Bugzilla 9650: __traits(compiles) + mixin
- Bugzilla 9663: [REG2.063a] ICE caused by issue 7444 change.
- Bugzilla 9672: mixin within cyclic import causes undefined properties
- Bugzilla 9689: std.typecons.Proxy breaks with @disable this(this)
- Bugzilla 9694: A member struct that has mutable opEquals reports weird error message
- Bugzilla 9739: Regression (1.077 git-head): DMD not considering ctor with default args as default ctor
- Bugzilla 9759: compiler segfault in StructLiteral::implicitConvTo(Type*) on invalid code
- Bugzilla 9764: Ddoc: Ddoc file name is incorrectly emphasized
- Bugzilla 9775: Can no longer create a const Date in CTFE if the variable is explicitly typed
- Bugzilla 9806: assertion failure in struct.c:668
- Bugzilla 9834: incorrect detection of lambda locality.
- Bugzilla 9846: regression of forward references
- Bugzilla 9858: const alias this fails when opAssign is present
- Bugzilla 9865: Crash on bogus import / circular reference
- Bugzilla 9890: Alias This + Alias Fields
- Bugzilla 9903: Broken ddoc in std.typecons and etc.c.sqlite3
- Bugzilla 9919: Regression (2.062): Symbol lookup fails with public import and mixin
- Bugzilla 9952: regression(HEAD): Attribute inference for virtual functions breaks subclasses
- Bugzilla 9957: [2.061 -> 2.062] Taking pointer of enum float array gives some garbage
- Bugzilla 9974: immutable class constructor is broken
- Bugzilla 9984: inout qualifier is skipped for constructor arguments (template constructor only)
- Bugzilla 9987: Declaring struct ModuleInfo should be allowed
- Bugzilla 10002: 2.062 -> 2.063 calling "remove" is impure
- Bugzilla 10003: void* UFCS regression
- Bugzilla 10016: Incorrect error gagging using RefCounted
- Bugzilla 10040: struct-related ICE
- Bugzilla 10041: ufcs writeln of associative array
- Bugzilla 10043: ICE with __traits(compiles)
- Bugzilla 10044: Wrong di generation for IsExp with TemplateParameterList
- Bugzilla 10047: opDispatch instantiation failure should be gagged for UFCS
- Bugzilla 10049: Spurious "Label already defined" error inside a foreach over a range aggregate
- Bugzilla 10050: Regression (git-head): RDMD no longer emits error messages from DMD
- Bugzilla 10053: struct member with pure dtor forces declared dtor to be pure, too
- Bugzilla 10055: Incorrect attribute merging in dtor/postblit building
- Bugzilla 10056: Strange Error with templates and string.format
- Bugzilla 10067: [REG] Recursive template instantiation
- Bugzilla 10073: Default opEquals depends on class declaration order with DMD HEAD
- Bugzilla 10076: expression.c:4310: virtual Expression* TypeExp::semantic(Scope*): Assertion 0 failed.
- Bugzilla 10089: Strange function call error message with specified module
- Bugzilla 10091: [HEAD] Cannot cast struct member string enum to static ubyte array of same size
- Bugzilla 10096: Regression (git-head): __traits(allMembers) triggers out of bounds error
- Bugzilla 10101: static if conditional cannot be at global scope using mixin template
- Bugzilla 10106: [ICE] Ice in glue.c:1215 + 2 error messages without lines
- Bugzilla 10134: Mutual referencing templates error
- Bugzilla 10142: [REG2.063a] enum value semantic problem that declared in class member
- Bugzilla 10144: Using enum inside final class occurs weird errors
- Bugzilla 10148: regression 062=>063: unjustified 'safe function cannot call system function'
- Bugzilla 10151: final: before enum is now an error.
- Bugzilla 10160: No line number "cannot modify struct ... with immutable members"
- Bugzilla 10166: XXX is not a template
- Bugzilla 10178: Compiler segfault with zero-length tuple comparison
DMD Compiler bugs
- Bugzilla 1520: TypeInfo_Const.opEquals is incorrect
- Bugzilla 1804: Severe GC leaks with repetitive array allocations
- Bugzilla 2356: array literal as non static initializer generates horribly inefficient code.
- Bugzilla 3789: [TDPL] Structs members that require non-bitwise comparison not correctly compared
- Bugzilla 4094: ICE(expression.c): recursive struct templates with type inference
- Bugzilla 4247: Cannot create default-constructed struct on heap when constructor is defined
- Bugzilla 4414: ICE(cgcs.c) Taking item of static array returned by function
- Bugzilla 4436: Double bug regarding Tuple.init
- Bugzilla 4479: Module Foo is in multiple files Foo
- Bugzilla 4617: Alias this'ed symbols cannot be passed to templates
- Bugzilla 4814: rdmd: Doesn't rebuild when using -of and turning an -L linker option on or off
- Bugzilla 5450: no match for implicit super() call in constructor
- Bugzilla 5625: std.format unittest disabled
- Bugzilla 6070: CTFE UFCS forward reference error
- Bugzilla 6089: __gshared with not static 2D array
- Bugzilla 6153: Inserting to An Array!T inside an Array!(Array!T) causes a segfault.
- Bugzilla 6312: template instance cannot use argument from enclosing template
- Bugzilla 6431: [RDMD] Modifying a library doesn't trigger a rebuild
- Bugzilla 6535: RDMD outputs broken library files
- Bugzilla 6539: Incomprehensible error message with failed template instantiation
- Bugzilla 6545: [CTFE] Hard-coded array operations not yet supported
- Bugzilla 6578: Ignored const with struct with constructor
- Bugzilla 6795: ICE(cgcs.c): Incrementing an enum array item
- Bugzilla 6852: Cannot compare instances of ParameterStorageClassTuple
- Bugzilla 7068: copying array of pointers calls memset instead of memcpy with -d
- Bugzilla 7437: DMD enters infinite loop during overload resolution
- Bugzilla 7569: cannot void initialize tuple declarations
- Bugzilla 7572: f.fn!(void) is not an lvalue
- Bugzilla 7719: enum forward reference error when enum is in braces
- Bugzilla 7980: Stack overflow / recursive expansion with alias this
- Bugzilla 8041: __gshared/static problem
- Bugzilla 8081: pure nothrow unittest problem in generated 'header' file
- Bugzilla 8130: Memory corruption because without *.def file DMD compiles DLL with assumption _tls_index = 0
- Bugzilla 8213: Incorrect error message with pointer to ubyte[] and front
- Bugzilla 8238: templates can create ghost fields
- Bugzilla 8245: UFCS doesn't work for pointers
- Bugzilla 8294: complex breaks calling in 64 bit DMD
- Bugzilla 8347: Parser bug with const placed after ~this() in decl
- Bugzilla 8366: Overriding const member function in conjunction with mutable overload causes a strange error
- Bugzilla 8589: Incorrect conversion of function returning typeof(null) to function returning an array
- Bugzilla 8609: A forward reference error with static arrays
- Bugzilla 8668: public selective import makes functions conflict when otherwise they don't
- Bugzilla 8670: IFTI fails from aliases
- Bugzilla 8697: Invalid error message: Forward reference of interface
- Bugzilla 8698: Forward reference error with interfaces
- Bugzilla 8827: Cannot move contents of R12
- Bugzilla 8828: Long compilation time of a destroy() on a large fixed-sized matrix
- Bugzilla 8833: Odd error with expression tuples
- Bugzilla 8902: Unexpected "duplicate union initialization for X" error
- Bugzilla 8945: Can't call static struct initializer or constructor without qualifier for templated inner struct
- Bugzilla 8953: Parser rejects qualifier after destructor i.e. ~this() <qualifier> { }
- Bugzilla 8989: cfloat argument passing broken
- Bugzilla 8998: 'inout pure' returns immutable, which in reality is mutable
- Bugzilla 9091: Using __traits(getMember) on template argument fails inside member function
- Bugzilla 9144: synchronized CRITSECSIZE should be a target constant
- Bugzilla 9199: Module level qualified functions should be rejected
- Bugzilla 9209: ice(symbol.c) with const struct heap allocation
- Bugzilla 9231: overriding inout funcion with attribute inference reports weird error
- Bugzilla 9232: Parsing error on some templated methods calls
- Bugzilla 9241: 2.061: Property call error message disappeared
- Bugzilla 9280: Runtime range violation with named capture groups in regex
- Bugzilla 9311: shared library file extension incorrectly modified
- Bugzilla 9345: CTFE fails when using std.string.format with imported string enum
- Bugzilla 9346: nested struct calls disabled postblit
- Bugzilla 9386: struct destructor called erroneously
- Bugzilla 9393: Partial template specialization and template lambda does not work
- Bugzilla 9401: destructor and nothrow syntax
- Bugzilla 9413: Incorrect modification inside contracts is not detected correctly
- Bugzilla 9414: Incorrect modification inside contracts is not detected on virtual function
- Bugzilla 9415: delegate inference should make function literal impure
- Bugzilla 9417: "no size yet for forward reference" error with nested structure
- Bugzilla 9428: Wrong array concatenation
- Bugzilla 9441: struct constructor missed on auto/type-inferred variable definition
- Bugzilla 9445: interpret.c:151: Assertion v->ctfeAdrOnStack >= 0 && v->ctfeAdrOnStack < stackPointer() failed.
- Bugzilla 9451: Listing abstract functions in diagnostic should show full signature
- Bugzilla 9473: Unittest docs should each be in their own section
- Bugzilla 9474: Ddoc'd unittests should work correctly with interspersed version(none)
- Bugzilla 9475: Should retain source formatting in ddoc's unittests
- Bugzilla 9480: The template name in the JSON output contains template and function arguments
- Bugzilla 9494: compiler stack overflow on invalid associative array
- Bugzilla 9495: Win64 vararg issue when first argument is > 8 byte
- Bugzilla 9508: RDMD doesn't generate new dependency list when a file is changed.
- Bugzilla 9540: Compiler crash on delegate context frame assignment
- Bugzilla 9561: Many error messages from std.format
- Bugzilla 9590: UFCS does not work with void lazy expressions
- Bugzilla 9613: Parser bug when using .init with type constructor
- Bugzilla 9617: ulong.max is wrongly accepted by smaller signed parameter
- Bugzilla 9619: Failed struct field typeof in inner function
- Bugzilla 9622: Range violation in rdmd
- Bugzilla 9649: DMD doesn't parse valid PostfixExpression . NewExpression syntax.
- Bugzilla 9652: __traits(getAttributes) doesn't work with manifest constants
- Bugzilla 9654: Template function cannot take string by ref T[len]
- Bugzilla 9656: Built-in dup result should behave as like unique array, if it is possible.
- Bugzilla 9658: Setting pre-initialized field should be allowed in qualified constructor.
- Bugzilla 9677: Crash on setting length property of array VC 2012 64 bit
- Bugzilla 9679: Refused const/immutable assignment in conditional
- Bugzilla 9692: __traits(allMembers) fails on module without a package
- Bugzilla 9700: std.typecons.Proxy with invaliant and in-place operation causes Access Violation
- Bugzilla 9712: IFTI does not support deducing static array types from array literal arguments
- Bugzilla 9713: Ddoc: Empty description suppress automatic example generation
- Bugzilla 9714: Ddoc: Combination of -D and -unittest reveals hidden unittest function
- Bugzilla 9720: OSX wrong code with -O Illegal instruction
- Bugzilla 9722: optimizer kills GOT to EBX load
- Bugzilla 9729: interface thunk doesn't set EBX to GOT
- Bugzilla 9735: Casting delegates to void* should be illegal
- Bugzilla 9736: VS2010 project file does full rebuild every time
- Bugzilla 9743: IFTI and polymorphic string literal should support implicit conversion to static array type
- Bugzilla 9744: Poor error message taking address of thread-local variable at compile time
- Bugzilla 9747: IFTI argument deduction fails for committed string literals which are implicitly converted to a static array
- Bugzilla 9755: JSON output is missing the protection attribute for templates
- Bugzilla 9757: Ddoc: documented unittest after ditto should work
- Bugzilla 9758: Ddoc: empty ddoc comment and unittest block generates no Examples section
- Bugzilla 9768: No line number for wrong foreach type
- Bugzilla 9773: ref parameter with default value should not compile
- Bugzilla 9774: Error message with __error using == on tuple members
- Bugzilla 9777: Calling final interface method leads to wrong code
- Bugzilla 9781: -inline will cause backend ICE
- Bugzilla 9788: -profile doesn't work if exceptions are thrown in the running program
- Bugzilla 9790: Internal error when compiling a invalid variable in template (in expression.c and backend\evalu8.c)
- Bugzilla 9791: [ICE] (struct.c line 668) map with a missing tuple import
- Bugzilla 9818: Constant folding for static array does not work with initializing by element
- Bugzilla 9829: rdmd passes '--' to dmd
- Bugzilla 9837: IFTI should consider enum base type
- Bugzilla 9844: DMD (-m64) int long initialisation bug
- Bugzilla 9845: enum value should be able to contain forward references in global scope
- Bugzilla 9863: Incorrect generation of SAHF instruction on 64 bits
- Bugzilla 9873: Built-in tuple should support equality comparison
- Bugzilla 9874: Function call syntax disuniformity in template constraints
- Bugzilla 9880: Redundant template instance displaying in error message
- Bugzilla 9883: Error on using property as new dynamic array size
- Bugzilla 9885: IFTI should consider known tuple types.
- Bugzilla 9892: [ICE] forward reference in enum declaration members causes compiler segfault
- Bugzilla 9899: struct with pure/nothrow destructor cannot be used as a struct member in pure/nothrow functions
- Bugzilla 9901: string return from inner template function error
- Bugzilla 9907: Struct literal with destructor should match to non-ref overload
- Bugzilla 9910: Scalar op vector is broken.
- Bugzilla 9928: ice with void* and function literal
- Bugzilla 9936: Wrong opBinary/opBinaryRight rewrite.
- Bugzilla 9939: allMembers trait doesn't returns members of nested anonymous enum
- Bugzilla 9940: ICE applying getProtection to a functions obtained using getOverloads.
- Bugzilla 9946: A UFCS disallowed in dynamic array allocation
- Bugzilla 9961: Using UFCS properties suppress actual errors
- Bugzilla 9965: Wrong Assembly For DIL, SIL Registers
- Bugzilla 9971: eponymous function is not an lvalue
- Bugzilla 9985: Postblit isn't called on local struct return
- Bugzilla 9990: templates with function alias cause forward reference error
- Bugzilla 9993: const ctor should be preferred than mutable for const obj creation
- Bugzilla 9994: Built-in generated opAssign should call dtor on assignment
- Bugzilla 10004: tuple comparison with side-effect should work
- Bugzilla 10005: struct variable declaration and const-correctness
- Bugzilla 10011: Wrong JSON "init" property output for class reference initializers
- Bugzilla 10029: Update list of reserved version identifiers.
- Bugzilla 10058: Inconsistent mangling between C++ and extern(C++).
- Bugzilla 10059: export doesn't work for variable declarations
- Bugzilla 10063: inout+pure results in ability to produce immutable reference to mutable data
- Bugzilla 10066: Template opEquals sometimes obstructs struct compilation
- Bugzilla 10102: @disable incompletely implemented
- Bugzilla 10103: template mixin with property overloads
- Bugzilla 10105: ICE when converting string literal to static char array in enum initializer
- Bugzilla 10115: More @disabled holes
- Bugzilla 10171: Unexpected error "cannot infer type from overloaded function symbol"
- Bugzilla 10180: offsetof doesn't work through function call alias this
DMD Compiler enhancements
- Bugzilla 3449: const and invariant struct members do not behave according to spec
- Bugzilla 3502: Fix for dropped Mac OS X 10.5
- Bugzilla 3673: inheritance + if clause = no go
- Bugzilla 4528: Better error message for private abstract method
- Bugzilla 5140: Add __FUNCTION__, __PRETTY_FUNCTION__, and __MODULE__
- Bugzilla 6185: Include non-global functions when resolving UFCS
- Bugzilla 6453: Allow multiple invariant per struct/class
- Bugzilla 6809: IFTI should imply const where inout is present on args, but not on return type
- Bugzilla 7444: Require [] for array copies too
- Bugzilla 7511: attribute inference should work for template functions
- Bugzilla 8220: invalid function call not detected during semantic analysis
- Bugzilla 8669: TemplateThisParameter should change member function's qualifier
- Bugzilla 8819: void static array should have init built-in propert
- Bugzilla 8959: IsExpression should support syntax which has no Identifier in all cases
- Bugzilla 9033: Remove __thread from the language
- Bugzilla 9136: Add isNested trait
- Bugzilla 9155: Ddoc: code section should strip leading spaces
- Bugzilla 9170: CTFE: Allow reinterpret casts float <-> int
- Bugzilla 9185: Add note about where -op is useful
- Bugzilla 9574: Diagnostic for old use of 'alias this = that' should be informative
- Bugzilla 9627: Not good enough error messages in some cases when using UFCS
- Bugzilla 9635: Improved error message for failed access of array field properties from static method
- Bugzilla 9676: Ddoc: Wrap deprecated declarations in a (DEPRECATED) macro
- Bugzilla 9680: Include entry point location in "dmd -v -o-" output
- Bugzilla 9723: Implement -main switch to inject a default main() function
- Bugzilla 9726: Add minimum % coverage required for -cov testing
- Bugzilla 9727: Documented unittest comment should appear before Example section
- Bugzilla 9745: Allow non-thread local static variables to have their address taken in CTFE
- Bugzilla 9778: RDMD: Support passing resource files to DMD
- Bugzilla 9789: Ddoc for aliases should use new "alias x=y" syntax
- Bugzilla 9866: movsxd not supported
- Bugzilla 9920: [Optimizer] Use mul/imul for integer division by constant
- Bugzilla 9941: [CTFE] Allow to store "newed" classes and structs in the data segment
- Bugzilla 9943: Allow to return typeid from CTFE
- Bugzilla 9963: Absurdly Inefficient Codegen For Adding Boolean Predicates
- Bugzilla 9977: Function local templates should be allowed
- Bugzilla 10030: Support '-l:' switch when passing default library to ld
- Bugzilla 10077: add pragma(mangle, "...") to override symbol mangle.
- Bugzilla 10109: add -transition compiler switch to aid in dealing with breaking changes
- Bugzilla 10150: Prefix method 'this' qualifiers should be just ignored anytime
- Bugzilla 10179: Tuple assignment should not cause "has no effect" error even if the length is zero
Phobos regressions
- Bugzilla 9122: std.concurrency send() fails with multiple arrays
- Bugzilla 9742: std.math.floor returns 0 for any value x > -1 and x < 0
- Bugzilla 10122: Appender doesn't work with disabled default construction
Phobos bugs
- Bugzilla 3795: Problem with phobos std.variant
- Bugzilla 4729: std.algorithm: strange iota behaviour
- Bugzilla 4798: std.algorithm.map unusable for ranges with const elements
- Bugzilla 4955: struct dirent.d_type is not a mask
- Bugzilla 5032: std.file.rename acts differently on Windows and Linux when the target file already exists.
- Bugzilla 5201: std.string.indexOf and std.algorithm.indexOf return different things for narrow strings
- Bugzilla 5310: Variant == const(Variant) doesn't compile
- Bugzilla 5359: std.traits.isDelegate should work for types and expressions
- Bugzilla 5360: calling rdmd from different folder
- Bugzilla 5514: Erroneous documentation and lacking randomization for topN
- Bugzilla 5658: Undocumented fields in std.typecons.Tuple
- Bugzilla 5924: schwartzSort of Tuple!(char)[]
- Bugzilla 8321: std.range.put doesn't work with RefCounted output range
- Bugzilla 8613: std.typecons.Proxy cannot work with operator 'in'
- Bugzilla 8655: bitfields and Typedef don't mix
- Bugzilla 9164: Can't easily assign one Nullable to another
- Bugzilla 9431: Tuple creation problem with array of array
- Bugzilla 9456: decodeFront is inconsistent in whether it pops elements off of the range or not
- Bugzilla 9512: std.regex: Incorrect parsing of hex sequences composed from capital letters.
- Bugzilla 9553: SOCKET should be 64 bit wide on Win64
- Bugzilla 9583: std.getopt.getopt does not consume options terminator "--" from args list, as docs claim
- Bugzilla 9612: std.range.Cycle.opSlice tests on the bounds are missing
- Bugzilla 9624: fullyQualifiedName fails for functions
- Bugzilla 9648: Missing std.random import for std.algorithm.topN
- Bugzilla 9753: std.string.translate precondition asserts
- Bugzilla 9794: std.json cannot handle delete character
- Bugzilla 9804: std.math.FloatingPointControl corrupts floating point state
- Bugzilla 9812: std.conv.parse string fails on certain escape characters.
- Bugzilla 9836: std.array.popFront does not work with alias this.
- Bugzilla 9950: std.json should return empty string/array instead of null on empty input
- Bugzilla 9956: hasElaborateAssign trait does not work with static arrays
- Bugzilla 9979: Regex bug with \b and look-behind
- Bugzilla 10116: stdio.File.byLine repeats last line forever, readln(ref C[],R) returns bad data
- Bugzilla 10167: Wrong Document Comment on std.format.d(181)
- Bugzilla 10182: std.bitmanip unit test has pointless/unused foreach loop
Phobos enhancements
- Bugzilla 4787: std.algorithm.bisectRight()
- Bugzilla 4921: Synopsis code in std.variant documentation throws an assertion error
- Bugzilla 5013: std.typecons.Tuple should have constructor for static arrays
- Bugzilla 5106: makeIndex should return SortedRange
- Bugzilla 5226: indexOf() which takes a pred but no needle
- Bugzilla 5401: std.socket updates and boost license
- Bugzilla 5507: countUntil should take Ranges... instead of R2
- Bugzilla 6224: Add an ownerTid property in std.concurrency
- Bugzilla 6486: std.math.abs(BigInt)
- Bugzilla 7405: std.algorithm.schwartzSort.release
- Bugzilla 9260: getopt should allow setting booleans to false
- Bugzilla 9265: Nullable fixed-sized array wrapper
- Bugzilla 9625: assertNotThrown should print exception msg if no msg is provided
- Bugzilla 9802: Add std.traits.{isNested,hasNested}.
- Bugzilla 9814: Add std.traits.isNestedFunction
- Bugzilla 9839: std.traits.Select should be able to select symbols
- Bugzilla 9888: Allow passing a generator to std.random.uniform for enums
Druntime bugs
- Bugzilla 4307: spawn()'ed thread doesn't terminate
- Bugzilla 6024: Document that Windows 2000 SP4 is no longer supported
- Bugzilla 10057: [2.063 beta] Module info overwritten in shared phobos.
- Bugzilla 10081: Incorrect char array comparison
Optlink bugs
- Bugzilla 6144: Unexpected OPTLINK Termination at EIP=00428DA3
Installer bugs
- Bugzilla 9343: Problem installing dmd-2.061-0.fedora.x86_64.rpm on Fedora 18
Website bugs
- Bugzilla 4847: std.algorithm.topN documentation
- Bugzilla 9544: D logo image is broken on non-root-level pages
- Bugzilla 9609: Ddoc tags for std.string.icmp seem wrong
- Bugzilla 10036: missing core.atomic docs on dlang.org
Language Changes
- typeof() change:
- alias syntax change:
As a result of fixing Bugzilla 6408, the usage of typeof() and indexing may require changes to user code:
template ElementTypeOf(T) { alias typeof(T[0]) ElementTypeOf; } void main() { // worked in 2.061 due to a bug static assert(is(ElementTypeOf!(int[]) == int)); }
The expression in typeof(T[0]) used to be wrongly interpreted as the element type of T, however in v2.062 it is interpreted as a static array of element T with length 0. To work around this the user can either use a trait from the standard library, or use the .init property of a type for arbitrary expressions:
import std.range; template ElementTypeOf(T) { // use T.init alias typeof(T.init[0]) ElementTypeOf; } void main() { // use std.range.ElementType static assert(is(ElementType!(int[]) == int)); // use custom template after fixing its code static assert(is(ElementTypeOf!(int[]) == int)); }
The newly introduced "alias foo = int" syntax is not usable with subtyping. This is to prevent confusion from a possible future syntax which would enable aliasing of super constructors. For now, the existing alias syntax can be used:
struct S { int x; // alias this = x; // error alias x this; }
In the upcoming release (v2.063) a new syntax will be introduced:
struct S { int x; alias this : x; // new feature in upcoming 2.063 }
List of all bug fixes and enhancements:
DMD Compiler regressions
- Bugzilla 9174: regression(2.057) ice(cast.c) with ternary operator and alias this
- Bugzilla 9244: union containing pointers not allowed
- Bugzilla 9258: opAssign with base class triggers "identity assignment operator overload" error
- Bugzilla 9259: Passing an array of pointers to a typesafe vararg is broken
- Bugzilla 9263: statement is not reachable when statement is reachable
- Bugzilla 9266: Cannot define two Tuple objects.
- Bugzilla 9268: [ice-on-invalid] void assignment in fail44.d no longer caught in frontend
- Bugzilla 9273: DMD segfaults with templated ctors in implicit super call
- Bugzilla 9276: regression(2.061): Forward reference error
- Bugzilla 9278: ICE todt.c:692 when float containing struct is defined after use
- Bugzilla 9309: Regression (2.061): -O -release generates wrong code
- Bugzilla 9332: [REG][2.060 -> 02.061] struct constructor taking itself creates 'Warning: statement is not reachable'
- Bugzilla 9377: Link-failure regression cause by fixing issue 8504
- Bugzilla 9385: [Regression 2.057] null literal should be implicitly convertible to bool
- Bugzilla 9387: Compiler switch -O changes behavior of correct code
- Bugzilla 9399: ICE with nested function, template alias parameter, -inline, depending on order of source files
- Bugzilla 9404: Nullable is unusable with 2.061
- Bugzilla 9406: (Regression: 2.061) Stack overflow from a forward reference error
- Bugzilla 9409: [2.062-alpha] Regression with $ inside of expression tuples
- Bugzilla 9410: [Regression 2.061] Wrong selection for function overload
- Bugzilla 9416: [REG][2.060 -> 02.061] DMD eagerly instantiates template parameter-less opAssign
- Bugzilla 9420: [2.062alpha] Weird "(null)" output in error message
- Bugzilla 9435: regression(head): forward reference error
- Bugzilla 9436: enum cannot be forward referenced with cyclic imports and mixin
- Bugzilla 9496: [REG 2.061 -> 2.062 alpha] "this[1 .. $]" passes wrong "this" to "opDollar"
- Bugzilla 9514: "template instance … is not an alias"
- Bugzilla 9525: [CTFE] Cannot convert &S to const(S*) at compile time
DMD Compiler bugs
- Bugzilla 1369: Unable to find 'this' in __traits(getMember)
- Bugzilla 1730: Bogus error message calling a non-const struct method on a const struct reference
- Bugzilla 1841: Closure detection doesn't work when variable is used in a nested function
- Bugzilla 2452: Unimplemented method errors should show function overload
- Bugzilla 3321: debug flags
- Bugzilla 3466: Wrong JSON output for templated classes, structs, and interfaces
- Bugzilla 4178: destructor missing in JSON output
- Bugzilla 4269: Regression(2.031): invalid type accepted if evaluated while errors are gagged
- Bugzilla 4477: JSON output for function definitions includes insufficient type information
- Bugzilla 4478: JSON output omits import statements
- Bugzilla 4540: Better error message for wrong switch type
- Bugzilla 5168: String enums don't work with -g compiler switch
- Bugzilla 5461: Invalid declaration for auto functions in .di files generated by DMD -H
- Bugzilla 5933: Cannot retrieve the return type of an auto-return member function
- Bugzilla 5978: ICE(mtype.c) when calling __traits(parent) on the child of an anonymous function.
- Bugzilla 6057: Problem with defining enum in function
- Bugzilla 6319: debug's relaxed purity does not apply to nested scopes
- Bugzilla 6332: Auto-return function cannot be inferred as @safe
- Bugzilla 6408: string[].init gives a wrong type
- Bugzilla 6538: ICE(mangle.c) Invalid template constraints
- Bugzilla 6552: Wrong fallthrough warning for CaseRange
- Bugzilla 6652: foreach parameter with number range is always ref
- Bugzilla 6708: immutable ref implicit cast to const ref
- Bugzilla 6743: ICE(mars.c) attempting to compile an exe file
- Bugzilla 6833: Floating point literals lose fractional part in headers
- Bugzilla 6873: Multiple storage class is not allowed on template argument
- Bugzilla 6902: Different "pure nothrow int()" types
- Bugzilla 6905: ref acts as auto ref when return type is missing
- Bugzilla 6962: Wrong Code With Scope Exit and Array Parameter, only with -O
- Bugzilla 6963: pure/nothrow inference doesn't work for function pointers
- Bugzilla 7152: Can't assign null to default argument
- Bugzilla 7159: Forward reference when casting auto return method
- Bugzilla 7252: ICE(template.c): 'global.errors' on line 4893 in file 'template.c'
- Bugzilla 7408: traits compiles fails for built-in properties of template instances
- Bugzilla 7420: Duplicate "cannot be read at compile time" error messages
- Bugzilla 7585: functions in templates inferred as delegate
- Bugzilla 7740: unicodeProperties cannot be read at compile time for ctRegex
- Bugzilla 7950: Type tuples are incorrectly flattened in base type list of interface
- Bugzilla 8053: Recursive alias this causes infinite loop
- Bugzilla 8152: Linking C library causes Seg-fault
- Bugzilla 8153: Warning about toHash signature is incorrect on x86_64
- Bugzilla 8504: Template attribute inferrence doesn't work
- Bugzilla 8583: [64 bit] AA ushort[dchar] byValue range is corrupted on x86_64
- Bugzilla 8631: illegal overrides accepted
- Bugzilla 8717: private and protected restrict member usage in same module
- Bugzilla 8741: wrong code for struct member initialized using struct constructor
- Bugzilla 8742: Anonymous nested class derived from another nested class makes DMD crash
- Bugzilla 8763: struct initialization with empty variadic arguments tries to call constructor
- Bugzilla 8783: ref foreach update of const fixed size arrays in constructor
- Bugzilla 8787: Virtual not abstract methods in interfaces error message
- Bugzilla 8832: Segfault when accessing range returned by function that has delegate referencing local variables
- Bugzilla 8847: voldemort + inout confuses "is"
- Bugzilla 8892: Wrong diagnostic for static array assignment
- Bugzilla 8898: false positive dangling else warning
- Bugzilla 8913: Wrong code in IfStatement condition Expression
- Bugzilla 8922: __traits(parent, <imported package>) shows current module as a parent
- Bugzilla 8969: is(T == __parameters) is undocumented
- Bugzilla 8982: ICE(ctfeexpr.c) __parameters of an erroneous default parameter
- Bugzilla 9018: __traits(compiles, ...) is true on second check for same incompilable code
- Bugzilla 9083: mixin expression on template argument doesn't work
- Bugzilla 9113: ICE(interpret.c): CTFE assignment to member of struct in union
- Bugzilla 9178: UDA: getAttributes does not play well with tupleof
- Bugzilla 9191: Unhelpful error message on failing override
- Bugzilla 9195: Should not be able to index a pointer in safed
- Bugzilla 9198: Vararg functions don't respect IFTI rules
- Bugzilla 9200: Wrong SIMD code generated
- Bugzilla 9208: [ICE](func.c line 1205) with auto return in recursive function
- Bugzilla 9236: CTFE ice on switch + with(EnumType)
- Bugzilla 9250: Wrong line number for error involving length of a static array
- Bugzilla 9254: ICE on invalid foreach aggregate
- Bugzilla 9264: [64bit] Wrong code with conversion from int parameter to float
- Bugzilla 9284: DMD segfaults with templated ctors in constructor delegation
- Bugzilla 9291: [ICE][REG] throwing undefined identifier with nothrow crashes dmd
- Bugzilla 9293: enum struct with StructInitializer reports weird error
- Bugzilla 9304: Unary minus operator doesn't work correctly with SIMD types.
- Bugzilla 9305: Ugly Ddoc for default template lambda expressions
- Bugzilla 9312: with statement error message is wrong
- Bugzilla 9315: ICE (expression.c:4249, StructLiteralExp::getField) Tupleof of nested struct literal
- Bugzilla 9320: optimizer should do copy propagation on structs, too
- Bugzilla 9322: Internal error: ../ztc/cod1.c 3510 with SIMD on OSX 32
- Bugzilla 9330: Cannot run dmd test suite with MSYS
- Bugzilla 9338: Compiler segfaults if try to CTFE member function without valid 'this'
- Bugzilla 9348: "tmpl!arg" syntax followed by "!is" or "!in"
- Bugzilla 9350: std.algorithm.findAdjacent unreachable code warning with infinite ranges
- Bugzilla 9357: Floating-point literal should always be printed with a period in diagnostic errors
- Bugzilla 9358: Compiler creates duplicate switch cases after an error
- Bugzilla 9368: Final switch on typedef'ed enum is not properly checked
- Bugzilla 9369: DDoc hardcodes '&' -> '&' in code
- Bugzilla 9374: 'super' should be accessible inside template constraint
- Bugzilla 9398: Wrong diagnostic for ternary operator type mismatch
- Bugzilla 9418: Segmentation fault using only datetime and stdio.
- Bugzilla 9438: Strange RefCounted stack overflow
- Bugzilla 9442: typeid() doesn't work without this. for class fields
- Bugzilla 9453: ice(symbol.c) with slice on temporary
- Bugzilla 9458: ModExp generates invalid code against array operands
- Bugzilla 9461: Ability to break typesystem with inout
- Bugzilla 9479: _error_ in error message of type inference of a delegate literal
- Bugzilla 9484: Syntax error in JSON output
- Bugzilla 9510: core.bitop.bsr undefined
DMD Compiler enhancements
- Bugzilla 2630: ddoc should be able to document unittests
- Bugzilla 3404: JSON output should retain original alias names
- Bugzilla 4194: Attributes included in JSON output
- Bugzilla 5529: std.system.endian for pure functions?
- Bugzilla 5893: Allow simple aliases for operator overloading
- Bugzilla 6171: rdmd: cache dependency file to improve startup time [patch]
- Bugzilla 8105: Implement "in ref"
- Bugzilla 8128: unittest blocks should be allowed in interfaces
- Bugzilla 9389: ignore -Hd if -Hf is present
- Bugzilla 9463: make @safe "non-escapable"
Phobos regressions
- Bugzilla 9355: [security] SSL certificate signature verification disabled in std.net.curl
- Bugzilla 9444: Regression (2.059): shell doesn't throw on error.
- Bugzilla 9457: isSorted(string) doesn't work
- Bugzilla 9523: std.conv.to will no longer convert enums to themselves
Phobos bugs
- Bugzilla 5065: writefln("%f" of a Tuple prints a result
- Bugzilla 5265: std.array.back does not work correctly for wchar-based arrays
- Bugzilla 5726: boyerMooreFinder hangs when finding
- Bugzilla 5763: traits.d BaseClassesTuple function incorrectly handles Object class argument
- Bugzilla 5773: sort() and topN() fail on sliced/resized array of tuples
- Bugzilla 6066: std.container: BinaryHeap interface is broken.
- Bugzilla 6436: Refcounted initialization bug
- Bugzilla 6635: std.conv.emplace: enforcement is too weak
- Bugzilla 6668: Wrong "to" conversion stack trace
- Bugzilla 7142: Wrong formatted write of boolean values
- Bugzilla 7659: std.stdio.File.close() erases file.name
- Bugzilla 7819: std.file.setTimes throws error on folders
- Bugzilla 8078: receiveOnly should tell which type it expected and got on mismatch
- Bugzilla 8314: randomSample primes with constant
- Bugzilla 8326: std.string.format results in run-time exception
- Bugzilla 8367: std.range.chain's template constraint is inadequate
- Bugzilla 8368: std.algorithm.sort's template constraint is inadequate
- Bugzilla 8567: isDynamicArrray!S == true for S with alias this to array
- Bugzilla 8689: Variant opArithmetic does not attempt float conversion
- Bugzilla 8694: std.zlib.(Un)Compress can cause an _onInvalidMemoryOperationError
- Bugzilla 8837: BigInt needs better operator template constraints
- Bugzilla 8890: std.algorithm.commonPrefix does not handle unicode correctly
- Bugzilla 8920: iota should work with all integral types
- Bugzilla 9005: std.concurrency.spawn should allow void delegate(Args) shared for new Tid
- Bugzilla 9163: std.parallelism broken with extensive optimizations (gdc)
- Bugzilla 9211: regex lookahead, (?=(\d\d\d)+\b) failed
- Bugzilla 9288: Parameter(Identifier|DefaultValue)Tuple report pointless errors
- Bugzilla 9299: std.algorithm.minPos of const(int)[]
- Bugzilla 9317: ParameterStorageClassTuple reports errors for inout function
- Bugzilla 9336: Writeln is unable to print address of shared variable
Phobos enhancements
- Bugzilla 4287: opOpAssign!("~=") for std.array.Appender
- Bugzilla 4813: trait for getting at access modifiers
- Bugzilla 5666: std.array.replace compile error (string and immutable string)
- Bugzilla 6614: std.traits should have an isFinal template
- Bugzilla 7896: Sequence slicing
- Bugzilla 8143: Safe std.conv.to enum conversion
- Bugzilla 9337: There's no Duration.max
- Bugzilla 9339: std.random.uniform!Enum should return random enum member
Druntime bugs
- Bugzilla 4793: Runtime.loadLibrary cannot load dll using MBS paths.
- Bugzilla 5375: Detection of cyclic module imports provides error findings on console, instead of exception msg
- Bugzilla 8132: LPTSTR always aliases to LPSTR
- Bugzilla 9373: Add deprecation message to all empty deprecation statements
Website regressions
- Bugzilla 9467: Operator Overloading anchors are broken
- Bugzilla 9492: [2.052 beta] Stylesheet not found for off-line HTML docs
Website bugs
- Bugzilla 5513: Erroneous example in std.algorithm
- Bugzilla 7304: Online docs incorrect with regards to covariant arrays
- Bugzilla 7345: interfaceToC.html missing on left-hand side
- Bugzilla 8302: Documentation of dirEntries in std.file is incomplete
- Bugzilla 8574: [std.format] The flag ' ' works for floating numbers, not only for integers
- Bugzilla 8619: Tuples article uses writefln instead of writeln
- Bugzilla 9321: Dead link to HTML5 standard in language specification
- Bugzilla 9394: ABI for static arrays is outdated
- Bugzilla 9446: ".keys" missing from properties table at http://dlang.org/hash-map.html
- Bugzilla 9503: [grammar] template declaration/instance must take one or more arguments?
Website enhancements
- Bugzilla 9302: Document extern properly
- Version D 2.062
- Version D 2.061
- Version D 2.060
- Version D 2.059
- Version D 2.058
- Version D 2.057
- Version D 2.056
- Version D 2.055
- Version D 2.054
- Version D 2.053
- Version D 2.052
- Version D 2.051
- Version D 2.050
- Version D 2.049
- Version D 2.048
- Version D 2.047
- Version D 2.046
- Version D 2.045
- Version D 2.044
- Version D 2.043
- Version D 2.042
- Version D 2.041
- Version D 2.040
- Version D 2.039
- Version D 2.038
- Version D 2.037
- Version D 2.036
- Version D 2.035
- Version D 2.034
- Version D 2.033
- Version D 2.032
- Version D 2.031
- Version D 2.030
- Version D 2.029
- Version D 2.028
- Version D 2.027
- Version D 2.026
- Version D 2.025
- Version D 2.023
- Version D 2.022
- Version D 2.021
- Version D 2.020
- Version D 2.019
- Version D 2.018
- Version D 2.017
- Version D 2.016
- Version D 2.015
- Version D 2.014
- Version D 2.013
- Version D 2.012
- Version D 2.011
- Version D 2.010
- Version D 2.009
- Version D 2.008
- Version D 2.007
- Version D 2.006
- Version D 2.005
- Version D 2.004
- Version D 2.003
- Version D 2.002
- Version D 2.001
- Version D 2.000
- changelog for 1.0
- tech support
New/Changed Features
- DMD now shows deprecated features as warnings by default (a message is displayed but compilation is not halted anymore). There are also 2 new compiler flags: -de, to get the old default behaviour (using deprecated features is an error) and -dw, to explicitly enable the new default behaviour (just warn). This makes it possible to add -de in the configuration file to get the old default and still be able to override that default by using -dw when compiling. The -d flag stays the same (silently ignore deprecated features).
- Complete list of New/Changed Features
Bugs Fixed
New/Changed Features
- std.string: The current implementations of std.string.format and string.sformat are scheduled to be replaced in November 2012 with improved implementations which conform to writef. In some, rare cases, this will break code. Please see the documentation for std.string.format and std.string.sformat for details.
- std.bitmanip: Added peek, read, write, and append for converting ranges of bytes to and from integral types.
- std.container: Added DList, which is an implementation of a doubly-linked list.
- Added std.file.tempDir which returns the path to a directory where a program can put temporary files.
- std.process: Added escapeShellCommand, escapeShellFileName, and escapeWindowsArgument. Documented browse function.
- std.range: Added RefRange, which effectively makes it possible to pass a range by reference.
- std.traits: Added KeyType, ValueType, isScalarType, isBasicType, and SetFunctionAttributes templates.
- std.utf: Added overload of codeLength which operates on a string.
- std.traits: areAllSafe has been scheduled for deprecation. Please use allSatisfy(isSafe, ...) instead.
- clear has been renamed to destroy, and clear (as an alias to destroy) has been scheduled for deprpecation.
- Capitalized std.traits.pointerTarget to PointerTarget. Old one is scheduled for deprecation.
- std.algorithm.indexOf - which was scheduled for deprecation - has been deprecated (it was easily confused with std.string.indexOf). Please use countUntil instead.
- std.cpuid - which was scheduled for deprecation - has been deprecated. Please use core.cpuid instead.
- std.conv.ConvError and ConvOverflowException - which were scheduled for deprecation - have been deprecated. Please catch ConvException and ConvOverflowException instead.
- The overloads of std.conv.to which were scheduled for deprecation because formattedWrite replaced them have now been deprecated. Please use std.format.formattedWrite instead.
- The overload of std.exception.enforce which takes the file and line number as template arguments has been scheduled for deprecation (as it causes unnecessary template bloat). Please use the overload which takes them as function arguments instead. This will have no effect on any calls to enforce which do not explicitly pass the file or line number.
- std.format.FormatError - which was scheduled for deprecation - has been deprecated. Please catch FormatException instead.
- std.file.listDir has been deprecated. Please use std.file.dirEntries instead.
- std.range.replicate - which was scheduled for deprecation - has been deprecated. Please use repeat instead.
- std.range.SortedRange.canFind - which was scheduled for deprecation - has been deprecated. Please use SortedRange.contains instead.
- std.socket: timeval and linger - which were scheduled for deprecation - have been deprecated. Please use TimeVal and Linger.
- std.stdio.isStreamingDevice has been scheduled for deprecation. Please use isFileHandle instead.
- The deprecated std.typecons.defineEnum has been removed.
- UtfException - which was scheduled for deprecation - has been deprecated. Please use UTFException instead.
- The deprecated overloads of std.array.insert and std.array.replace have been removed. Please use insertInPlace and replaceInPlace instead.
- The deprecated toISOExtendedString and fromISOExtendedString functions in std.datetime have been removed. Please use toISOExtString and fromISOExtString instead.
- The deprecated std.file.getTimesPosix has been removed. Please use std.file.getTimes instead.
- The deprecated overloads of isFile, isDir, and isSymLink in std.file which took uint have been removed. Please use attrIsFile, attrIsDir, and attrIsSymlink instead.
- The deprecated std.file.DirEntry.timeStatusChanged has been removed. Please use std.file.DirEntry.attributes to get at that information if you need it.
- The deprecated std.contracts module has been removed. Please use std.exception instead.
- The deprecated std.arg, std.bind, and std.loader modules have been removed.
- Added TypeInfo.rtInfo property to get library defined runtime info.
- Added front end support for AVX 256 bit SIMD instructions.
- Default arguments and parameter identifiers (if any) are added to the tuple generated from IsExpression's __parameters case.
- Changed the way the align attribute works, to make it more usable and comprehensible. Default alignment has not changed.
- The align attribute now accepts arbitrary powers of two. This affects layout of static data, too. Such effects are dependent on limitations of the object file format - currently Win32 programs cannot align on larger than 16 byte boundaries.
- HTML input file support completely removed.
- Bugzilla 3150: cast from dynamic array to ulong is allowed
- Bugzilla 3866: anonymous delegate with default parameters cross-talks to another anonymous delegate
- Bugzilla 4174: Template interface functions not allowed, making operator overloads difficult
- Bugzilla 6652: 1. Warn modifying non ref variable if -w is specified.
- Bugzilla 7243: Compiler should call separate function when allocating a struct on the heap
- Bugzilla 7923: Please remove 'deprecated' from setAssertHandler()
- Bugzilla 8105: in ref
- Bugzilla 8127: dmd link library paths not given precedence over gcc defaults
- Bugzilla 8221: typeof(null) rejected as return type for covariant overrides
Druntime Bugs Fixed
- Bugzilla 6909: incorrect definition of the OVERLAPPED struct in core.sys.windows.windows ?
Library Bugs Fixed
- Bugzilla 2328: setTypeInfo in gc.d backwards.
- Bugzilla 2588: std.signals should not use 'length' stealth keyword in indexing
- Bugzilla 4405: all function - returns whether predicate is true for all elements in a range
- Bugzilla 4603: array(iota(1, 0)) error
- Bugzilla 4605: Wrong print of an int[string] aa
- Bugzilla 4629: BufferedFile.printf() wants char[] as first argument
- Bugzilla 4695: std.range.zip is broken
- Bugzilla 4744: std.conv: string->enum doesn't look for longer match
- Bugzilla 4822: Problem with std.stdio.File.writef("%c")
- Bugzilla 5011: std.container: SList linearRemove produces wrong results
- Bugzilla 5089: feqrel does not compile for floats
- Bugzilla 5260: std.math.feqrel() returns negative number
- Bugzilla 5346: instantiation of std.conv.toImpl and std.format.formatValue fails for unions
- Bugzilla 5354: formatValue: range templates introduce 3 bugs related to class & struct cases
- Bugzilla 5786: std.algorithm.sort does not work with std.container.Array: Range violation
- Bugzilla 5843: Unable to convert a struct with an alias-this to long/ulong to int, using std.conv.to!int.
- Bugzilla 5970: fix BigInt.toString
- Bugzilla 6027: bigint to!string conversion and its implications
- Bugzilla 6175: String corruption when passing static char arrays to std.conv
- Bugzilla 6191: removechars doesn't accept a const string
- Bugzilla 6197: std.traits.isImplicitlyConvertible returns some wrong results.
- Bugzilla 6222: A problem with iota() using size_t
- Bugzilla 6231: [patch] std.conv.to/std.format.: Structs with toString and isInputRange match multiple templates.
- Bugzilla 6273: Tuple [] operator in pure function
- Bugzilla 6379: std.container.SList fails to compile
- Bugzilla 6437: Refcounted calls dtor before ctor, never calls dtor for globals
- Bugzilla 6547: Call to std.algorithm.remove causes compile error
- Bugzilla 6580: scoped classes are aligned incorrectly
- Bugzilla 6597: to!SomeString should use std.format.formatValue
- Bugzilla 6642: SysTime should not be hasUnsharedAliasing
- Bugzilla 6892: Formatted write with specified length of enum member
- Bugzilla 6926: std.process.system return wrong exit code
- Bugzilla 7022: File.byLine doesn't release file handle
- Bugzilla 7138: Can't call array() on dirEntries
- Bugzilla 7317: writeln cannot handle alias this of array type
- Bugzilla 7326: write interprets enum with byte backing type as a character
- Bugzilla 7348: to!string(null) matches more than one template declaration
- Bugzilla 7356: Implement KeyType, ValueType for hashes in std.traits
- Bugzilla 7360: Predicate templates in std.traits should consider alias this
- Bugzilla 7515: The new std.string.translate is slow for ASCII text
- Bugzilla 7537: File.tmpfile requires administrator rights on Windows
- Bugzilla 7561: std.net.curl broken
- Bugzilla 7660: toImpl conflict in std.conv
- Bugzilla 7796: std.typecons.Unique is using writeln without importing std.stdio
- Bugzilla 7824: isInputRange fails to recognize inout(T)[]
- Bugzilla 7831: Unlisted @@@BUG in File.detach causes FILE* leaks when reopening
- Bugzilla 7878: A problem with purity and general templated algorithms
- Bugzilla 7898: [CTFE] std.algorithm:copy fails when used with two arrays
- Bugzilla 7909: to!(enum)(string) and to!(string)(enum) break when enum is integral
- Bugzilla 7919: Sample code works on GDC but fails with DMD
- Bugzilla 7936: std.random.randomSample always returns the same first value when passed a random number generator
- Bugzilla 7937: Range iota.Result should be const where possible
- Bugzilla 7944: std.range.iota.popFront() cycles when the range is empty
- Bugzilla 7948: std.range.zip broken with requireSameLength
- Bugzilla 7962: std.regex: Captures.length() returns incorrect value
- Bugzilla 7973: BigInt %= long/ulong gives wrong value
- Bugzilla 7975: Incorrect quotes escaping in std.format
- Bugzilla 7982: iota broken when start and end are unsigned and step is negative.
- Bugzilla 7993: BigInt divide-by-1 error
- Bugzilla 8003: Phobos uses deprecated std.path sep symbol
- Bugzilla 8011: BigInt ++ and -- do wrong thing on negative numbers
- Bugzilla 8015: std.typecons.Tuple does not support struct with alias method this
- Bugzilla 8022: BigInt division bug (2)
- Bugzilla 8026: Fix or disallow randomShuffle() on fixed-sized arrays
- Bugzilla 8031: If a class have some signals it's impossible for a derived class to have any signals
- Bugzilla 8037: hasElaborateDestructor is false for non-zero-length static array of structs with elaborate destructor
- Bugzilla 8039: scoped doesn't call any elaborate destructors for struct fields
- Bugzilla 8040: writeln(null) too
- Bugzilla 8055: [Regression 2.059] std.algorithm.move corrupts moved object field
- Bugzilla 8057: std.algorithm.move cannot use for nested struct
- Bugzilla 8080: 'alias this' causes toString to be shadowed by aliased object
- Bugzilla 8112: std.algorithm.fill must accept InputRange
- Bugzilla 8158: std.algorithm.min fails to compile with user-defined types
- Bugzilla 8164: BigInt from char[] too
- Bugzilla 8165: BigInt opAssign return value
- Bugzilla 8171: [Regression 2.060head] Broken std.algorithm.move for nested struct has no member
- Bugzilla 8186: Formatting class object has an alias this to int* field is broken.
- Bugzilla 8187: replaceFirst doesn't work for string[] haystack
- Bugzilla 8191: cstream.printf is completely unusable on x86_64
- Bugzilla 8195: Segfault when comparing a VariantN to a non-variant type which it holds
- Bugzilla 8203: Use of std.regex.match() generates "not enough preallocated memory" error
- Bugzilla 8214: blocking option for TaskPool.finish()
- Bugzilla 8233: std.array.array fails to compile with ranges of immutable elements which have a length property
- Bugzilla 8240: std.algorithm.joiner and empty inputRangeObject
- Bugzilla 8264: [std.conv.to] constructing conversion doesn't work with alias this
- Bugzilla 8310: writeln of Range of fixed size array
- Bugzilla 8323: std.string.chompPrefix does not handle differing string types properly
- Bugzilla 8362: std.traits.isSafe doesn't work with unsafe lamdba functions
- Bugzilla 8386: writeln stopped working with wstring
- Bugzilla 8398: enforceEx cannot be used with OutOfMemoryError
- Bugzilla 8450: std.traits.isSafe doesn't work with unsafe lamdba functions
DMD Bugs Fixed
- Bugzilla 1175: nested class inheritance
- Bugzilla 1780: Type tuple deduction failure for class templates
- Bugzilla 2472: Delegates are not lvalue.
- Bugzilla 2962: ICE(glue.c) or bad codegen passing variable as template value parameter
- Bugzilla 3290: accepts-invalid: non-const by-ref foreach over a const array is accepted
- Bugzilla 3574: post-condition in void main() is not evaluated if there is no return statement
- Bugzilla 3608: Allow isExpression and templates to capture template parameters and FQN of template
- Bugzilla 3703: static array assignment
- Bugzilla 3895: Appending a double[] to a float[] generates wrong code
- Bugzilla 4024: Last catch only accepts block statement
- Bugzilla 4155: return of NaN to temporary fails equality test
- Bugzilla 4288: Error on passing delegate to C linkage function
- Bugzilla 4364: ICE(class.c) compiling a struct def named 'Object' followed by a class definition
- Bugzilla 4510: [tdpl] ref with a wrong type specifier is accepted
- Bugzilla 4583: PIC code not working: EBX register set incorrectly
- Bugzilla 4785: auto return of a function with in contract
- Bugzilla 4884: Using template struct parameters in method definition fails with "parameter _param_0 is already defined"
- Bugzilla 4953: Regression(2.031): templates don't do implicit conversion properly
- Bugzilla 4967: member default initializers not working in static struct initializers
- Bugzilla 5039: Cannot use invariant() with auto methods
- Bugzilla 5082: delegate alias parameters are silently accepted inside structs. limits most of std.algorithm, etc.
- Bugzilla 5435: Static foreach over tuple ignores type annotation
- Bugzilla 5437: Problems with length of std.traits.EnumMembers
- Bugzilla 5473: Members of const-qualified classes are not const themselves.
- Bugzilla 5737: postblit not called for locals initialized from ref functions
- Bugzilla 5809: [64 bit] wrong code for *p==0, when widening conversion occurs
- Bugzilla 5896: const overload matching is succumb to template parameter one
- Bugzilla 6189: [64bit] optimizer: register content destroyed in function prolog
- Bugzilla 6199: [GSoC] Postblit not called when returning a reference to a by-value function
- Bugzilla 6470: postblits not called on arrays of structs
- Bugzilla 6475: template identifier is not a member of alias
- Bugzilla 6591: di header generation loses selective import symbols
- Bugzilla 6612: Associative arrays with associative array keys literals
- Bugzilla 6636: Destructors of static array elements are not called on function parameter
- Bugzilla 6637: Postblits of static array elements are not called on function argument
- Bugzilla 6758: std.c.stdarg problems with 8 or more integer arguments on x86_64
- Bugzilla 6891: template with uint value parameter causes several issues
- Bugzilla 7396: Indicate default alignment with 0.
- Bugzilla 7385: Bad error message missing line number on invalid array op that isn't special cased
- Bugzilla 7413: Vector literals don't work
- Bugzilla 7414: Vector literal assignment doesn't work in global scope
- Bugzilla 7418: Overloading doesn't work with aliases declared inside templates
- Bugzilla 7453: Can't return value from within opApply
- Bugzilla 7478: stack overflow compiling with -deps -release -inline -noboundscheck
- Bugzilla 7494: Selective import does not work inside a function
- Bugzilla 7506: Postblit does not called properly with inlining
- Bugzilla 7530: Postblit not called structs returned from an array index expr.
- Bugzilla 7560: Base class overloaded methods created by mixins can't be overriden
- Bugzilla 7581: Compiler uses wrong instructions to move complex value from ST to xmm registers
- Bugzilla 7585: functions in templates inferred as delegate
- Bugzilla 7750: while(true) loop with try/catch block causes segfault
- Bugzilla 7770: __dollar cannot be read at compile time
- Bugzilla 7784: ICE with self-referencing literals
- Bugzilla 7793: static assert( void_function() ) gives misleading error message
- Bugzilla 7807: Ambiguous virtual function error on const overloading with covariant return types
- Bugzilla 7851: Internal error: e2ir.c 688
- Bugzilla 7880: [CTFE] cast from void array allowed with different results than at runtime
- Bugzilla 7893: Spec completely wrong for D variadic arguments on 64 bits
- Bugzilla 7894: [CTFE] - goto within ForStatement restarts loop
- Bugzilla 7906: [ICE] enum declaration with invalid array literal crashes dmd
- Bugzilla 7907: [ICE] invalid expression on template argument crashes dmd
- Bugzilla 7911: Nested static if failing to execute
- Bugzilla 7922: alias this causes weird formatting issues for strings
- Bugzilla 7929: Broken semantic of StructInitializer with const
- Bugzilla 7931: Error message with _error_ with var[1,2]
- Bugzilla 7932: Corrupted argument inside out contract in x86_64
- Bugzilla 7933: Illegal interaction of templates
- Bugzilla 7941: Regression(2.059): Type check is ignored when manifest constant initializer is function literal
- Bugzilla 7943: UFCS does not work with alias this
- Bugzilla 7945: alias this doesn't work on function ref parameter
- Bugzilla 7949: [ICE] (cgcod.c) with SIMD array
- Bugzilla 7950: Type tuples are incorrectly flattened in base type list of interface
- Bugzilla 7951: DMD: Internal error: backend/cgxmm.c 567
- Bugzilla 7965: Invalid outer function scope pointer in some cases
- Bugzilla 7974: forward reference of mixin declaration
- Bugzilla 7983: ICE with getMember on a unittest member
- Bugzilla 7987: [CTFE] cannot compare arrays of slices
- Bugzilla 8002: Excess initial errors when passing template args to non-templated struct
- Bugzilla 8004: Direct call of function literal should consider default arguments
- Bugzilla 8005: Lambda with parameter type inference should consider default args
- Bugzilla 8016: Methods defined in external object files when template alias parameter is involved
- Bugzilla 8032: mixin template before virtual method with same method causes an error
- Bugzilla 8036: Zero-length static array of structs with elaborate destructor as struct or class field is rejected
- Bugzilla 8038: #line which is in a double template instantiation doesn't work
- Bugzilla 8060: xmmstore cannot allocate store for optimized operation that uses int and floats
- Bugzilla 8064: return reference semantics not obeyed on delegates?
- Bugzilla 8066: ICE on missing return statement if invariant is present
- Bugzilla 8069: incorrect ambiguous virtual function error
- Bugzilla 8073: Regression (git) Error: undefined identifier __result
- Bugzilla 8089: Importing package as module causes segfault
- Bugzilla 8091: Optimizer generates wrong code when reducing comparisons
- Bugzilla 8094: Static if matching using alias parameter in template fails
- Bugzilla 8095: [64 bit] Wrong code generation with spilled register, -m64 -O
- Bugzilla 8098: Inner class method can modify outer's members regardless of constancy
- Bugzilla 8099: Inner class's outer pointer matches constancy of inner, but can be set to object of arbitrary constancy
- Bugzilla 8182: with a lazy struct parameter, the struct's destructor is called on the generated delegate
- Bugzilla 8180: UFCS writeln doesn't work with Tuples
- Bugzilla 8113: alias this doesn't forward opCall
- Bugzilla 8123: alias declaration lookup is broken
- Bugzilla 8125: TypeInstance dedunction problem
- Bugzilla 8129: Cannot deduce template function when using partially specified type in function parameter
- Bugzilla 8147: Blah!R.init now requires parens - (Blah!R).init
- Bugzilla 8168: dmd crashes when asm statement with wrong opcode
- Bugzilla 8169: Method loses its compile-time evaluability when used through alias this
- Bugzilla 8185: Pure functions and pointers
- Bugzilla 8188: need this to access member when mixining in a function
- Bugzilla 8190: Externally defined struct error message
- Bugzilla 8194: "Function cannot access frame" even though all I requested was the type
- Bugzilla 8198: Nested lambda inference doesn't work
- Bugzilla 8199: stack is not aligned in finally block
- Bugzilla 8212: shared value data structures should implicitly cast to mutable
- Bugzilla 8216: CTFE should allow 'pointer is inside range' comparisons
- Bugzilla 8226: Global lambda assign to const/immutable
- Bugzilla 8237: Error message with _error_ when using failed type inference in template parameter
- Bugzilla 8241: cannot use template function literal as default alias argument
- Bugzilla 8242: cannot use template function literals at module scope
- Bugzilla 8249: Spurious error message with templates and alias this
- Bugzilla 8252: no UFCS for 0 literal
- Bugzilla 8276: [CTFE] ICE when reading variable from nested function
- Bugzilla 8283: ICE(cod1.c): returning struct with constructor as member of another struct
- Bugzilla 8315: Invalid nested-ref check in template constraint
- Bugzilla 8335: ref is ignored for static array of stucts with postblit argument
- Bugzilla 8390: Refused array operation mutable[] += const[]
- Bugzilla 8397: parameter types are not checked when assigning a function literal
- Bugzilla 8423: Wrong code for bool parameter in 5th integer register.
- Bugzilla 8429: [2.060 beta] 'version' rejected inside 'static if's
- Bugzilla 8434: [Regression 2.058] cannot implicitly convert expression (vs1.opCast()) of type const(Vector2D) to object.Object
- Bugzilla 8437: [2.060 beta] static struct no size yet for forward reference
- Bugzilla 8442: [2.060 beta] Empty array enum not treated as immutable
- Bugzilla 8453: Associative array keys refused as property by sort
- Bugzilla 8454: [ICE] (backend\cg87.c 3497) with cdouble and sqrt
New/Changed Features
- Add predefined Ddoc macro SRCFILENAME
- Changed lexer to support # as a token, preserving #line's original behavior
- added AES, PCLMULQDQ, RDRAND, AVX, VAES, VPCLMULQDQ, FMA, FP16C to core.cpuid
- Bugzilla 435: Constructors should be templatized
- Bugzilla 2367: Overloading error with string literals
- Bugzilla 3382: [tdpl] Implement uniform function call syntax
- Bugzilla 4536: Typetuples (T...) should have an .init member
- Bugzilla 5525: Eponymous templates should allow for overloaded eponymous members
- Bugzilla 7105: relax inout rules
- Bugzilla 7833: Changelog should clearly mention struct literal/opCmp/opEquals/toHash changes
- Strive to make toHash, toString, opEquals and opCmp functions pure, nothrow, const and @safe. Soon, this will become a requirement.
- The deprecated std.date, std.dateparse, and std.gregorian modules have been removed. Please use std.datetime instead.
- Several deprecated functions in std.file have been removed.
- The old functions in std.path which were scheduled for deprecation have now been deprecated. Please use the new ones which were introduced in 2.055. However, note that curdir and pardir do not have replacements, because they're "." and ".." respectively on all OSes so variables for them were seen as unnecessary. Also, one major change to note about the new std.path functions is that when operating on extensions, they expect "." to be part of the extension whereas the old ones did not (e.g. "file.txt".extension == ".txt" whereas "file.txt".getExt() == "txt").
- The version of std.exception.enforceEx which was scheduled for deprecation has been deprecated. Please use the version which takes exceptions which can be constructed with new E(msg, file, line) (rather than just new E(msg) as the old version did). That way, exceptions constructed with enforceEx will give the file and line number where enforceEx was called.
- Get rid of Win9x support.
- std.typecons: Added Proxy mixin template.
- std.format: Added documentation about compound format specifier.
Druntime Bugs Fixed
Library Bugs Fixed
- Bugzilla 4604: A stack overflow with writeln
- Bugzilla 5523: std.regex handles "\s" and "\W" (etc.) inside square brackets improperly
- Bugzilla 5652: Add \p and \P unicode properties to std.regex
- Bugzilla 5674: AssertError in std.regex
- Bugzilla 5964: std.stdio.readln can throw a UnicodeException
- Bugzilla 6217: [GSOC] result of std.algorithm.map is not movable
- Bugzilla 6403: Upgrade std.regex to Unicode UTS #18 Level 1 support
- Bugzilla 6892: Formatted write with specified length of enum member
- Bugzilla 7111: New regex engine cannot match beginning of empty string
- Bugzilla 7138: Can't call array() on dirEntries
- Bugzilla 7264: Can't iterate result from 4-arg dirEntries as string
- Bugzilla 7299: std.uni missing doc comments
- Bugzilla 7300: std.regex.ShiftOr!dchar.search is broken
- Bugzilla 7374: stdin.byLine() throws AssertError on empty input
- Bugzilla 7460: std.windows.registry reports a false exception message
- Bugzilla 7476: Write(ln) functions no longer accept retro range
- Bugzilla 7628: std.format formatValue incorrect overload
- Bugzilla 7674: regex replace requires escaped format
- Bugzilla 7679: std.regex.split and splitter don't work w/ ctRegex
- Bugzilla 7718: regex and ctRegex produce different results
DMD Bugs Fixed
- rdmd: --force now works with --eval
- rdmd: update --eval's import list
- Bugzilla 176: [module] message "module and package have the same name"
- Bugzilla 783: Cannot use an array w/ const or variable index as new[] size argument.
- Bugzilla 977: Expressions inside a struct or array initializer get wrong line number
- Bugzilla 3279: Confusing error message when comparing types
- Bugzilla 3354: invalid number of args accepted for 1/2 arg floating point instructions
- Bugzilla 3509: Cannot forward reference a template mixin's members in a compile-time context
- Bugzilla 3510: Cannot forward reference a templated type from within a template mixin
- Bugzilla 3559: DMD 1.048+ fails to take function pointer from overloaded member functions
- Bugzilla 3630: bad error location in "has no effect in expression" error
- Bugzilla 3682: Regression(2.038) is expression fails to match types
- Bugzilla 3812: Missing line number for implicit cast of variadic function to array
- Bugzilla 3822: Invalid optimization of alloca called with constant size
- Bugzilla 3927: array.length++; is an error, but ++array.length compiles
- Bugzilla 4241: duplicate union initialization error doesn't give a file location
- Bugzilla 4269: Regression(2.031): invalid type accepted if evaluated while errors are gagged
- Bugzilla 4507: use spellchecker when override function doesn't override anything
- Bugzilla 4820: Regression(1.058, 2.044) in DStress caused by changeset 452
- Bugzilla 4854: Regression(2.047, Mac 10.5 only) writefln Segmentation fault if no globals
- Bugzilla 4993: Temporary values and opIndexAssign
- Bugzilla 5181: Excess cast on in-place operation op= involving conversion
- Bugzilla 5412: import wtf2
- Bugzilla 5554: [qtd] Covariance detection failure
- Bugzilla 5590: Regression(2.036) ICE(e2ir.c): when using .values on enum which is associative array
- Bugzilla 5733: Calling opDispatch As Template Results in Compiler Infinite Loop
- Bugzilla 5879: Not all frontend errors use stderr
- Bugzilla 5889: Struct literal/construction should be rvalue (it binds to ref parameters)
- Bugzilla 6391: Line-less error when passing the '.im' of floating pointer value by reference
- Bugzilla 6438: [CTFE] wrong error "value used before set" when slicing =void array
- Bugzilla 6611: better error message for array post increment/decrement
- Bugzilla 6681: struct constructor call is converted to struct literal that breaks union initialization
- Bugzilla 6685: Allow using "with" with rvalues
- Bugzilla 6699: More cases of __error in error messages
- Bugzilla 6738: Can't call templatized property function from within a struct/class method
- Bugzilla 6785: Wrong error message from pragma(msg) of failed instantiation
- Bugzilla 6982: immutability isn't respected on associative array assignment
- Bugzilla 7038: Type mismatch with const struct
- Bugzilla 7110: opSlice() & opIndex functions works unstable as template arguments
- Bugzilla 7288: ICE(toir.c): with lambda return + auto
- Bugzilla 7353: NRVO not properly working with inferred return type
- Bugzilla 7380: Crash trying to use address of variable in struct constructor at module level
- Bugzilla 7399: Broken import statement in trySemantic() causes silent compiler error
- Bugzilla 7406: tuple foreach doesn't work with mixed tuples
- Bugzilla 7411: Deduce base type from vector types in templates
- Bugzilla 7439: Compound assignment causes segmentation fault
- Bugzilla 7452: Function using enforce() cannot be inferred as @safe because of anonymous function due to lazy argument
- Bugzilla 7462: Error message with _error_ in overridden function
- Bugzilla 7463: Duplicated error message with bad template value parameter
- Bugzilla 7473: [CTFE] Non-ref argument behaves as if it's a ref argument
- Bugzilla 7481: Compiler should 'soldier on' after template errors
- Bugzilla 7493: Initialization of void[][N]
- Bugzilla 7499: ICE(cast.c line 1495) with lambda array
- Bugzilla 7500: [ICE] (template.c line 5287) with immutable lambda function
- Bugzilla 7502: 2.056 regression: Assigning .init takes forever to compile for large structs
- Bugzilla 7504: Cannot assign an object of type 'typeof(null)' to an array
- Bugzilla 7518: std.array.empty doesn't work for shared arrays
- Bugzilla 7525: [2.058 regression] Broken return type inference for delegate returns
- Bugzilla 7527: [CTFE] Segfault when slicing a pointer at compile time
- Bugzilla 7536: ctfeAdrOnStack triggered
- Bugzilla 7544: ICE(interpret.c) Catching an exception with a null catch block
- Bugzilla 7545: ICE(cast.c) Merge integral types through alias this
- Bugzilla 7547: -deps output lists object as a top level module
- Bugzilla 7550: Missing AVX instruction VPMULDQ
- Bugzilla 7552: Cannot get and combine a part of overloaded functions
- Bugzilla 7554: Immutable function pointer arguments too
- Bugzilla 7557: Sea of errors after template failure
- Bugzilla 7562: DMD crashes by using TemplateThisParameter
- Bugzilla 7563: Class members with default template arguments have no type
- Bugzilla 7568: pragma(msg) segfaults with an aggregate including a class.
- Bugzilla 7578: ICE on indexing result of vararg opDispatch
- Bugzilla 7580: Identity assignment of Nullable crashes dmd
- Bugzilla 7582: Untyped nested delegate literals don't compile
- Bugzilla 7583: [CTFE] ICE with tuple and alias this
- Bugzilla 7589: __traits(compiles) does not work with a template that fails to compile
- Bugzilla 7592: Conversion from ireal to ifloat broken when using xmm
- Bugzilla 7595: Data being overwritten.
- Bugzilla 7608: __traits(allMembers) is broken
- Bugzilla 7618: delegate/function pointer call bypass parameter storage class
- Bugzilla 7621: Immutable type equivalence problem
- Bugzilla 7633: Missing CTFE error message
- Bugzilla 7639: Undefined enum AA key crashes compiler
- Bugzilla 7641: std.typecons.Proxy incorrectly allows implicit conversion to class
- Bugzilla 7643: Whole tuple slice isn't resolved as expected
- Bugzilla 7649: Bad lambda inference in default function argument
- Bugzilla 7650: Bad lambda inference in associative array literal
- Bugzilla 7667: ICE(interpret.c): 'ctfeStack.stackPointer() == 0'
- Bugzilla 7669: Broken inout deduction with static array type
- Bugzilla 7670: UFCS problem with @property and structs
- Bugzilla 7671: Broken inout deduction of shared(inout(T[n])) from immutable(int[3])
- Bugzilla 7672: Remove top const doesn't work for inout array type.
- Bugzilla 7681: Regression(2.059head):ICE:opCatAssign(delegate) to undefined identifier
- Bugzilla 7682: shared array type and "cast() is not an lvalue" error
- Bugzilla 7684: IFTI and shared overload doesn't work
- Bugzilla 7694: Internal error: e2ir.c 1251 when calling member function inside struct via alias param
- Bugzilla 7695: Regression(2.058): ICE(mtype.c) on associative array with keys of struct type with const members
- Bugzilla 7698: can't specialize parameterized template value
- Bugzilla 7699: Cannot get frame pointer to in contract when compiling with -inline
- Bugzilla 7702: opDispatch goes into infinite loop
- Bugzilla 7703: [UFCS] explicit template function instantiation as property
- Bugzilla 7705: lambda syntax doesn't allow some valid signatures
- Bugzilla 7713: lambda inference doesn't work on template function argument
- Bugzilla 7722: Refuse normal functions to be used as properties
- Bugzilla 7731: Assertion failure: 't' on line 7911 in file 'mtype.c'
- Bugzilla 7732: [CTFE] wrong code for a struct called AssociativeArray
- Bugzilla 7735: Functions with variadic void[][]... arguments corrupt passed data
- Bugzilla 7742: 'More initializers than fields' error with correct number of fields
- Bugzilla 7743: Parsing problem with nothrow delegate
- Bugzilla 7745: Regression (1.x git-415e48a) Methods defined in external object files when a pointer to it is taken
- Bugzilla 7751: [ICE] (Regression 2.059head) From auto and forward reference
- Bugzilla 7754: static this() in template is stripped during header gen
- Bugzilla 7755: regression(2.059head): ICE in glue.c
- Bugzilla 7757: Inout function with lazy inout parameter doesn't compile
- Bugzilla 7761: lambda expression doesn't parse attributes
- Bugzilla 7768: More readable template error messages
- Bugzilla 7769: relax inout rule doesn't work for template function
- Bugzilla 7722: Refuse normal functions to be used as properties
- Bugzilla 7773: UCFS syntax on built-in attributes too?
- Bugzilla 7781: [CTFE] Segmentation fault on 'mixin({return;}());
- Bugzilla 7782: [ICE] With wrong import syntax
- Bugzilla 7785: [CTFE] ICE when slicing pointer to variable
- Bugzilla 7786: dmd crashes with invalid module name
- Bugzilla 7789: [CTFE] null pointer exception on setting array length
- Bugzilla 7794: Sea of errors when calling regex() after compile error
- Bugzilla 7808: Nullable's alias this does not work with structs containing classes
- Bugzilla 7812: Segfault on invalid code during template match deduction with errors gagged
- Bugzilla 7814: Regression(2.059head) ICE(tocsym.c) using scope(failure) within foreach-range
- Bugzilla 7815: Mixin template forward reference (?) regression
- Bugzilla 7820: regression(DMD 2.059head) Wrong error on forward reference to 'front' with -property switch
- Bugzilla 7823: Can't use a struct initializer to initialize a nested enum used as a default function argument initializer
- Bugzilla 7826: [D2 Beta] Cannot use getHash in toHash without a warning
- Bugzilla 7843: Regression(2.059 beta): Informational warning fails to produce executable
- Bugzilla 7857: File#write formats enum as a boolean.
- Bugzilla 7858: __traits(getOverloads) returns incorrect symbol
- Bugzilla 7859: Crash on invalid alias template parameter type
- Bugzilla 7861: Segfault during __error propagation with self-referencing module
- Bugzilla 7862: Accepts-invalid template forward reference bug related to derivedMembers
- Bugzilla 7868: derivedMembers/static if regression
- Bugzilla 7869: Cannot format pointer of struct has toString member function
- Bugzilla 7871: RangeViolation with findSplitBefore
- Bugzilla 7873: [2.059 beta] IFTI with inout does not properly match template parameter if called from inout function for pointers
- Bugzilla 7886: derivedMembers infinite recursion
- Bugzilla 7888: derivedMembers forward reference error with nested imports
New/Changed Features
- Add new => lambda syntax.
- Allow 1.userproperty syntax. NOTE: 1.f is no longer a float literal, add a 0.
- Convert to -shared dmd switch instead of -dylib
- Better use of XMM registers in OS X 32 bit target.
- Add inline assembler support for AVX instructions (64 bit targets only).
- Use of base class protection is now deprecated.
- Added traits isVirtualMethod and getVirtualMethods.
- Struct/class invariants are now implicitly const.
- Major overhaul of std.regex module's implementation. Breaking change in std.regex.replace with delegate, use Captures!string instead of RegexMatch!string as delegate parameter.
- As typedef has been deprecated, overloads of std.conv.to which use typedef have now been deprecated.
- std.array.insert has been deprecated. Please use std.array.insertInPlace instead.
- The overload of std.array.replace which replaces in place has been deprecated. Please use std.array.replaceInPlace instead.
- The toISOExtendedString and fromISOExtendedString functions on SysTime, Date, TimeOfDay, and DateTime in std.datetime have been deprecated. Please use toISOExtString and fromISOExtString instead.
- std.file.getTimesPosix has been deprecated. Please use std.file.getTimes instead.
- The overloads for isDir, isFile, and isSymlink in std.file which take a uint have been deprecated. Please use attrIsDir, attrIsFile, and attrIsSymlink instead.
Druntime Bugs Fixed
Library Bugs Fixed
- Bugzilla 4295: IID_IUnknown symbol undefined in phobos.lib
- Bugzilla 7241: std.format can't read into array of dchar
DMD Bugs Fixed
- Bugzilla 516: Mutually calling constructors allowed
- Bugzilla 620: Can't use property syntax with a template function
- Bugzilla 664: is(func T == function) ignores variadic arguments
- Bugzilla 678: Compiler accepts, for a function T[] t(), t().ptr but not t.ptr
- Bugzilla 796: Asserting a null object reference throws AssertError Failure internal\invariant.d(14) or Access Violation
- Bugzilla 949: Wrong spec/compiler behaviour for Strings, Integers and Floats
- Bugzilla 955: Passing arguments into functions - in, out, inout, const, and contracts
- Bugzilla 1313: out/body disables escape analysis
- Bugzilla 1521: Ambiguous documentation
- Bugzilla 1563: dynamic cast is not always performed
- Bugzilla 1570: Wrong return for address operator
- Bugzilla 1918: __traits(getVirtualFunctions) returns final functions
- Bugzilla 1920: Class documentation incomplete
- Bugzilla 1943: Templates can't take function pointer parameters
- Bugzilla 2106: export class doesn't affect, what is exported
- Bugzilla 2351: enum with no members allowed
- Bugzilla 2382: spec is not clear on what is allowed as global/static initializers
- Bugzilla 2387: Static array terminology
- Bugzilla 2411: Reference Tuple Foreach
- Bugzilla 2417: [module] protected base member is not available via base handle in a derived class if it is defined in a separate module
- Bugzilla 2442: opApply does not allow inferring parameter types when overloaded on const
- Bugzilla 2443: opApply should allow delegates that are not ref if it makes no sense
- Bugzilla 2483: DMD allows assignment to a scope variable
- Bugzilla 2494: describe explicit casting of arrays
- Bugzilla 2495: const syntax for member functions needs better description
- Bugzilla 2497: delete and null relationship needs more details
- Bugzilla 2524: final override inconsistent when implementing interfaces
- Bugzilla 2639: Hex and octal string values not completely specified
- Bugzilla 2819: array.sort segfaults if array length >=0x8F_FFFF
- Bugzilla 2894: abstract classes sometimes allow non-abstract bodyless functions
- Bugzilla 2997: allMembers does not return interface members
- Bugzilla 3084: Formatting of lazy in parameters section
- Bugzilla 3092: Indexing a tuple produces a tuple containing the indexed element
- Bugzilla 3111: 'mangleof' can't be member of a struct not documented
- Bugzilla 3187: Nested foreach over opApply doesn't work
- Bugzilla 3204: Document global properties
- Bugzilla 3235: [tdpl] Function literals must be deduced as "function" or "delegate"
- Bugzilla 3265: .classinfo for Interface-typed reference does not return instance's ClassInfo
- Bugzilla 3492: Can't overload nested functions
- Bugzilla 3578: Impossible to run a struct invariant using assert(s)
- Bugzilla 3735: op=
- Bugzilla 3757: Overloading const function with overridden non-const function results in seg fault.
- Bugzilla 3777: size_t is undefined
- Bugzilla 3783: Text inconsistent with EscapeSequence rules
- Bugzilla 3787: clarification: assigment to 'this'
- Bugzilla 3791: Reference anonymous nested classes when describing new expressions
- Bugzilla 3800: "Foreach over Structs and Classes with Ranges" and "Invariant Struct" in D2 Spec
- Bugzilla 3838: PrimaryExpression rule doesn't permit module scope template instances
- Bugzilla 3886: Bad example of definition file for DLLs
- Bugzilla 3906: Undefined struct and union declarations are not documented
- Bugzilla 3908: @ attributes not part of function grammar
- Bugzilla 3954: DeclDef rule is missing TemplateMixinDeclaration
- Bugzilla 3988: Provide canonical example for operator overloading
- Bugzilla 4088: opEquals not called on interfaces
- Bugzilla 4180: D DWARF extensions conflict with DWARF-4
- Bugzilla 4251: Hole in the const system: immutable(T)[] implicitly casts to ref const(T)[]
- Bugzilla 4371: segfault(template.c) template tuple in is() expression
- Bugzilla 4413: typeof(this) doesn't work in method template signature
- Bugzilla 4421: Union propagates copy constructors and destructors over all members
- Bugzilla 4523: [tdpl] .remove method for Associative Arrays returns void in all cases
- Bugzilla 4539: Refuse assignment to string literal
- Bugzilla 4545: Alias to members possible without "this" instance
- Bugzilla 4550: D2 Language Docs: http://www.digitalmars.com/d/2.0/statement.html
- Bugzilla 4553: D2 Language Docs: http://www.digitalmars.com/d/2.0/struct.html
- Bugzilla 4647: [tdpl] Cannot explicitly call final interface method, ambiguous calls allowed
- Bugzilla 4651: Docs: Returned classes that have access to stack variables of its enclosing function
- Bugzilla 4675: [tdpl] Eponymous Template should hide internal names
- Bugzilla 4711: Incorrect handling of && operator with void operand
- Bugzilla 4841: -inline wrecks nested struct with alias template parameter (An array()/map inlining problem)
- Bugzilla 4887: Right-shifting by 32 is allowed and broken
- Bugzilla 4940: ICE(symbol.c): Accessing tuple-typed field of struct literal with user-defined constructor
- Bugzilla 4956: remove direct references to gcc from linux.mak
- Bugzilla 5023: Docs about order of execution of invariant and pre/post conditions
- Bugzilla 5111: Static function-level variables are not in the language spec.
- Bugzilla 5114: Too many error messages
- Bugzilla 5132: ~ unary operator silently different from C
- Bugzilla 5138: Special token sequence
- Bugzilla 5261: Uncompilable example for Windows
- Bugzilla 5299: Protected inheritance is semantically undefined.
- Bugzilla 5337: Documentation regarding interfacing with C does not account for TLS differences
- Bugzilla 5476: spec: attributes have an optional else clause
- Bugzilla 5493: Able to overwrite immutable data by passing through ref function parameter
- Bugzilla 5527: Bug in http://www.digitalmars.com/d/2.0/ctod.html#closures
- Bugzilla 5605: [tdpl] foreach with ranges doesn't support opSlice()
- Bugzilla 5648: dmd command line option list inconsistencies
- Bugzilla 5713: Broken final switch on ints
- Bugzilla 5715: Contradiction in spec: meaning of variable.init
- Bugzilla 5718: Can't demangle symbol defined inside unittest block
- Bugzilla 5796: ICE with pragma(msg, ...) after missing ';' in a template
- Bugzilla 5820: Documentation states string literals can implicitly convert to char*
- Bugzilla 5841: alias grammar is incorrect
- Bugzilla 6013: private ignored for aliases
- Bugzilla 6037: [CTFE] recursive ref parameters evaluated incorrectly
- Bugzilla 6091: [d-p-l.org] Description for "Modifier casting" is misleading
- Bugzilla 6165: Anonymous enums specification
- Bugzilla 6177: Regression(2.053): ICE backend/cgcs.c: struct with destructor in assoc. array or typesafe variadic functions
- Bugzilla 6205: Strongly-pure nothrow functions with ignored return value are entirely stripped even if it contains a failing 'assert'.
- Bugzilla 6208: Parameter storage classes are ignored in template function deducing.
- Bugzilla 6364: Static struct's destructor called on exit of function
- Bugzilla 6402: Note on @property in spec needs updating
- Bugzilla 6451: [64bit] ICE(expression.c:4434): SymbolExp::SymbolExp(Loc, TOK, int, Declaration*, int): Assertion 'var' failed
- Bugzilla 6473: Stack overflow with struct destructor as default parameter
- Bugzilla 6504: Regression(2.041): "str" ~ [arr] allows string literal to be modified
- Bugzilla 6701: template specialization resolution failure
- Bugzilla 6704: CommaExpression as an IfCondition
- Bugzilla 6714: [tdpl] Type inference for parameters of function and delegate literals
- Bugzilla 6780: Templated global property functions do not work
- Bugzilla 6839: documentation for opAssign incorrect
- Bugzilla 6933: Segfault(declaration.c) using struct with destructor in CTFE
- Bugzilla 6934: [CTFE] can't use $ in a slice of an array passed by ref
- Bugzilla 6939: wrong type qualifier combination
- Bugzilla 6940: immutable(int*)*/immutable(int)** and int** do not combine
- Bugzilla 6948: Possible bug in compiler or documentation regarding signature of opCmp()
- Bugzilla 6964: Error message with __error: static assert(undefined+1)
- Bugzilla 6968: Segmantation fault, if exclamation mark absent
- Bugzilla 6971: [lex.dd] Type of string literals are outdated
- Bugzilla 6984: CTFE generates a torrent of spurious errors, if there was a previous error
- Bugzilla 6985: [CTFE] Non-constant case expressions can't be interpreted
- Bugzilla 6987: The "Memory Management" documentation incorrectly claims arrays are passed by reference
- Bugzilla 6995: [CTFE] can't interpret static template method
- Bugzilla 7011: No line number error for vector power
- Bugzilla 7037: TemplateTypeParameterSpecialization works differently from IsExpression regarding alias this
- Bugzilla 7043: CTFE: ICE illegal reference value 0LU, only with -inline
- Bugzilla 7073: Parsing of class-returning varargs function inside module ctor fails
- Bugzilla 7108: ICE: TraitsExp::semantic(Scope*) 2.056 -> 2.057 regression - segfault
- Bugzilla 7120: Scope Delegates + Delegate Literals
- Bugzilla 7123: static assert(is(typeof(toDelegate(&main)))) is false
- Bugzilla 7124: Alias this type is not considered in template type deduction
- Bugzilla 7127: Const-related infinite recursion in DWARF generation
- Bugzilla 7133: [tdpl] There should be no empty statement
- Bugzilla 7136: alias this lookup should run before merging modifiers of both sides.
- Bugzilla 7143: [CTFE] cannot compare class references with "is"
- Bugzilla 7144: [CTFE] base class does not call overridden members
- Bugzilla 7154: [CTFE] failing downcast causes error
- Bugzilla 7158: [CTFE] ICE(interpret.c) calling a class member using a dotvar expression
- Bugzilla 7160: Regression(2.057): ICE(dsymbol.c:1052) ICE using __traits(derivedMembers)
- Bugzilla 7162: [CTFE] "bool || void" expression crashes dmd
- Bugzilla 7165: [CTFE] ice converting null pointer to bool with constant member function
- Bugzilla 7166: Internal error: ../ztc/cgxmm.c 60
- Bugzilla 7168: Regression(2.057) __traits(allMembers) returns wrong tuple
- Bugzilla 7170: [UFCS] array + specialized template member syntax causes ICE
- Bugzilla 7173: dmd: glue.c:1065: virtual unsigned int Type::totym(): Assertion 0 failed.
- Bugzilla 7178: Segfault with import of invalid template
- Bugzilla 7185: [CTFE] ICE on changing char array length
- Bugzilla 7187: Regression(head 12d62ca5): [CTFE] ICE on slicing
- Bugzilla 7188: "import phobos;" crashes DMD
- Bugzilla 7189: inline failed
- Bugzilla 7190: Tuple length incorrect
- Bugzilla 7193: Regression(2.058head): ICE: delete lambda expression crashes dmd
- Bugzilla 7194: [CTFE] Incorrect behaviour with pointers as local struct variable
- Bugzilla 7196: Unfair function address overload resolution
- Bugzilla 7197: enum string doesn't work with CTFE
- Bugzilla 7199: std.string.indexof cannot be compiled with -inline
- Bugzilla 7201: Lambda template assignment to variable
- Bugzilla 7207: Explicit cast should resolve lambda type
- Bugzilla 7212: Regression(Head): ICE with overload resolution and delegate/function inference
- Bugzilla 7216: [CTFE] Can't call struct member function using pointer field
- Bugzilla 7217: [CTFE] ICE on accessing struct array field
- Bugzilla 7218: Nested function with contract is rejected
- Bugzilla 7228: MOVDQ2Q instruction is emitted with swapped register indices
- Bugzilla 7231: Segfault using opDispatch with property notation
- Bugzilla 7232: Warning: statement is not reachable has no line number
- Bugzilla 7234: Segmentation fault when using stdio
- Bugzilla 7239: C style struct initialization doesn't work with aliases
- Bugzilla 7245: [CTFE] Address of ref foreach parameter changes to point after array
- Bugzilla 7248: [CTFE] Stack overflow on using struct filed pointer with address of array element
- Bugzilla 7261: ICE(glue.c): With taskPool.reduce
- Bugzilla 7266: [CTFE] Assign to ref param (that's taken from struct member) is noop
- Bugzilla 7277: [CTFE ICE] Assertion failure: 'thisval' on line 1690 in file 'interpret.c'
- Bugzilla 7278: Templated struct (instantiated with null) can't access its own members
- Bugzilla 7285: Implicit fixed-size array cast
- Bugzilla 7290: Heap allocation with scoped delegate literal
- Bugzilla 7294: [Regression] No warning when escaping local reference type variables
- Bugzilla 7295: Alias This + Pure + pointsTo = rejects-valid
- Bugzilla 7296: [2.058] Regression: Cannot swap RefCounted
- Bugzilla 7309: [2.058] Regression caused by new inlining code
- Bugzilla 7321: returning void considered unsafe by safety inference
- Bugzilla 7335: sometimes the OUT - block have undefined class members-acces
- Bugzilla 7351: Possible asm bug: bad type/size of operands 'xadd'
- Bugzilla 7359: Template function with typesafe variadic rejects more than one string arguments
- Bugzilla 7363: Eponymous Template doesn't hide internal names in some cases with static if
- Bugzilla 7365: [Regression after 2.057] AAs broken for Object keys and values with opEquals
- Bugzilla 7367: wrong char comparison result
- Bugzilla 7369: Inout constructor causes compiler to reject invariant
- Bugzilla 7373: (Regression git) Renamed imports conflict with other implicitly imported symbols
- Bugzilla 7375: Regression(2.057): Invalid downcast permitted with derived/aliased template classes
- Bugzilla 7377: Compiler segfault in: TemplateMixin::hasPointers()
- Bugzilla 7379: DMD segfaults on semantic3 phase when alias enum this
- Bugzilla 7383: Blank lines in code sections cause premature section termination
- Bugzilla 7384: Typo in volatile deprecation message
- Bugzilla 7394: ddmangle tool needs rebuilding
- Bugzilla 7416: 2.058 regression: fails to instantiate a constrained function template with a nested function
- Bugzilla 7419: [2.058/CTFE] Constructor of struct is overwritten inside a unittest with -inline
- Bugzilla 7422: Regression(master): ICE with template function and if statement
- Bugzilla 7424: Segfault when trying to call a templated property with different const-ancy.
- Bugzilla 7425: IFTI does not work with inout methods
- Bugzilla 7428: regression (DMD 2.058head) ICE on slightly convoluted setup including closures
- Bugzilla 7435: Regression(master):dmd crashes when 'scope(failure) debug ...' without -debug option.
- Bugzilla 7475: Regression(2.058 beta): Template member erroneously inaccessible
- Bugzilla 7498: function expected before (), not function
New/Changed Features
- Better use of XMM registers in 64 bit targets.
- The invariant keyword as a synonym for immutable is now deprecated - use immutable instead
- Add Mach-O 64 bit support for obj2asm and dumpobj
- classes, interfaces, and exceptions are supported in CTFE
- Bugzilla 3474: PATCH: Implement opDollar for struct and class indexing operations
- Bugzilla 6572: Deprecate typedef
- Major overhaul of std.regex module's implementation. Breaking change in std.regex.replace with delegate, use Captures!string instead of RegexMatch!string as delegate parameter.
- As typedef has been deprecated, overloads of std.conv.to which use typedef have now been deprecated.
- std.array.insert has been deprecated. Please use std.array.insertInPlace instead.
- The overload of std.array.replace which replaces in place has been deprecated. Please use std.array.replaceInPlace instead.
- The toISOExtendedString and fromISOExtendedString functions on SysTime, Date, TimeOfDay, and DateTime in std.datetime have been deprecated. Please use toISOExtString and fromISOExtString instead.
- std.file.getTimesPosix has been deprecated. Please use std.file.getTimes instead.
- The overloads for isDir, isFile, and isSymlink in std.file which take a uint have been deprecated. Please use attrIsDir, attrIsFile, and attrIsSymlink instead.
- Bugzilla 2550: implicit conversions don't apply to template value parameter specialization
- Bugzilla 3467: Non-int integral template parameters not correctly propagated
- Removed top const from dynamic array types and pointer types in IFTI.
Druntime Bugs Fixed
- Bugzilla 6909: incorrect definition of the OVERLAPPED struct in core.sys.windows.windows ?
Library Bugs Fixed
- Unlisted bug: std.conv: Fix to!float("-0")
- Unlisted bug: std.file broken on OS X x86_64 due to wrong stat64 declaration.
- Bugzilla 2936: std.regex.match() short string optimization
- Bugzilla 4765: std.math.modf always returns 0
- Bugzilla 5193: SList cannot have struct elements that have immutable members.
- Bugzilla 5620: Implicit conversion of RegexMatch to bool.
- Bugzilla 5712: [patch] std.regex.replace disallows w/dstring
- Bugzilla 6204: emplace() for classes accepts larger chunk but fails in array assignment
- Bugzilla 6887: Regression of getopt
- Bugzilla 6888: std.getopt.getopt: one-letter hash option causes range violation
- Bugzilla 6935: struct with @disable this cannot make range
- Bugzilla 6953: std.concurrency needs more documentation
- Bugzilla 6973: static assert(isOutputRange!(OutputRange!int, int)) is false
- Bugzilla 6976: GetLastError called as property
- Bugzilla 6977: getErrno called as property in std.stdio
- Bugzilla 6979: hasUnsharedAliasing cannot accept plural parameters
- Bugzilla 6990: std.string.splitlines deprecation doc missing a word
- Bugzilla 7000: missing import of std.stdio in std.regex?
- Bugzilla 7039: Posix 2.057 Makefile error breaking 64bit build
- Bugzilla 7040: Phobos must use "version/else version" blocks for proper documentation generation.
- Bugzilla 7045: AssertError in std.regex on line 1573
- Bugzilla 7055: to!float("INF2") == 2
DMD Bugs Fixed
- Bugzilla 2095: covariance w/o typechecks = bugs
- Bugzilla 2532: '=' does not give a boolean result
- Bugzilla 2778: alias this + IFTI doesn't work.
- Bugzilla 2856: static opIndex does not compile for a templated struct/class
- Bugzilla 3990: Deferencing a dynamic array as pointer
- Bugzilla 4047: [CTFE] class/struct heap allocation
- Bugzilla 4401: auto functions cannot be inner functions
- Bugzilla 4511: Contravariance problem
- Bugzilla 4583: PIC code not working: EBX register set incorrectly
- Bugzilla 5311: Pure is broken when accessing globals / static data through instance reference
- Bugzilla 5364: optimizer kills high dword of -1
- Bugzilla 5416: null should have a type of its own
- Bugzilla 5899: auto-return function cannot match 'null' with reference type.
- Bugzilla 6056: Type lookup problem in string mixins
- Bugzilla 6077: CTFE: Cannot append null array to null array.
- Bugzilla 6330: Cannot disable assignment to a struct.
- Bugzilla 6354: Optimizer bug on x86_64: Bitshift optimized out when foreach and scope(failure) are used
- Bugzilla 6416: [CTFE] Declaration static struct is not yet implemented in CTFE
- Bugzilla 6479: spurious alias this with struct and mixin template
- Bugzilla 6522: [CTFE] Problem with opAssign call in foreach(ref)
- Bugzilla 6603: [CTFE] Can't call through a manifest constant function pointer
- Bugzilla 6736: Regression(2.054): ICE (cgcod.c 1672) with alias this and certain structs
- Bugzilla 6763: Using TypeTuple with (const/in/ref etc.) changes it forever
- Bugzilla 6792: [CTFE] ICE with pointer cast of indexed array
- Bugzilla 6800: [CTFE] dangerous pointer casts should be rejected
- Bugzilla 6805: Can't use a type from opDispatch template
- Bugzilla 6816: [CTFE] nested function can't access this
- Bugzilla 6817: [CTFE] Error on interpreting inlined IfStatement
- Bugzilla 6832: Can't test objects wrapped with alias this
- Bugzilla 6836: map + UFCS = fail
- Bugzilla 6837: alias this + UFCS = fail
- Bugzilla 6851: [CTFE] Cannot deref pointer passed by argument
- Bugzilla 6859: Segfault when abstract method uses with contract.
- Bugzilla 6864: Const conversion should precedence over the shared one
- Bugzilla 6865: inout matching removes shared qualifier
- Bugzilla 6866: ICE(mtype.c): alias this and inout matching
- Bugzilla 6867: inout and nested foreach loops
- Bugzilla 6868: IsExp + incorrect static array type = error
- Bugzilla 6870: type qualifiers behave inconsistently in combination with typeof
- Bugzilla 6872: Breaking type parsing of shared(inout(int)[])
- Bugzilla 6877: [XMM] regression, clobbered float value
- Bugzilla 6879: The difference of between template matching and IsExp
- Bugzilla 6881: [XMM] ICE with painted float
- Bugzilla 6885: [CTFE] wrong code with dynamically allocated 2D array
- Bugzilla 6886: [CTFE] ICE(interpret.c) new array with initializer
- Bugzilla 6901: wrong error "override cannot be applied to variable" in CTFE forward reference
- Bugzilla 6902: Different "pure nothrow int()" types
- Bugzilla 6910: __traits(hasMember, "<name>") does not work, if template has alias param
- Bugzilla 6912: const(T)[] can be implicitly cast to inout(const(T)[])
- Bugzilla 6919: [CTFE] Cannot get effect to local variable through its pointer
- Bugzilla 6922: [TDPL] superimposing of const and immutable does not work correctly
- Bugzilla 6927: Better @property management by chained functions
- Bugzilla 6928: alias this, immutable and common type fail in presence of fields with indirections
- Bugzilla 6929: [ICE] typeMerge crashes in presence of ambiguous alias this conversions
- Bugzilla 6941: .stringof displays redundant storage classes
- Bugzilla 6972: [CTFE] ICE with ubyte/=uint
- Bugzilla 6994: Using explicit 'this' in template constraint causes an error
- Bugzilla 6997: 64bit optimizer bug
- Bugzilla 7004: Iterating tuple with index which explicitly typed as size_t causes an error
- Bugzilla 7026: 64 bit optimizer bug
- Bugzilla 7027: Struct member trySemantic() regression in DMD Git master
- Bugzilla 7028: Fails to save FPU regs when executing finally block
- Bugzilla 7072: [2.057 Beta] Assertion failure: '0' on line 145 in file 'mtype.c'
- Bugzilla 7093: aliased type sometimes isn't resolved
New/Changed Features
- add -gs compiler switch
- Bugzilla 3194: invariant should be checked at the beginning and end of protected functions
- Bugzilla 5399: Return the result of a nonvoid function in a void function
- Bugzilla 6752: Add separate option to control stack frame generation
- std.exception: enforce/enforceEx now can use in @safe pure function.
- Added optional KeepTerminator param to std.string.splitLines.
- Added std.string.outdent.
- std.utf: More @safe and pure.
- std.windows.registry now use *W functions in order to deal properly with Unicode.
Druntime Bugs Fixed
- Bugzilla 5967: Mangling of ArgClose for variadic function is swapped
- Bugzilla 6493: Source code for the doc of core.time points to std.datetime.
- Bugzilla 6466: core.demangle incorrect demangling of variables
Library Bugs Fixed
- Bugzilla 5522: std.range.zip fails on arrays of Object.
- Bugzilla 6009: std/container disabled on freebsd/64
- Bugzilla 6160: std.conv.to: Ignore _ to match the rest of D
- Bugzilla 6181: assert fails in datetime.d while runining Phobos unittest
- Bugzilla 6258: std.conv.to!real("-") fetches the front of an empty array.
- Bugzilla 6275: Const values in tuples
- Bugzilla 6288: std.conv.to removes const/immutable when converting a class
- Bugzilla 6609: std.conv.parse!Integer should consider sign when radix == 10
- Bugzilla 6634: std.path.globMatch throws wrong assertion
- Bugzilla 6640: More formatting consistency between string and range of char
- Bugzilla 6761: Strange behavior of RedBlackTree causing a dangling pointer
- Bugzilla 6819: BigInt ^^ fails for some big numbers (powers)
DMD Bugs Fixed
- Bugzilla 546: Error message for accessing a deprecated variable is doubled
- Bugzilla 1339: Invariant/const-ness is broken by built-in array properties sort and reverse
- Bugzilla 1891: Array-concatenation of T* and T*[] produces corrupted result
- Bugzilla 1993: Error calling vararg delegate with null
- Bugzilla 2315: DMD Stack Overflow on unwanted ctfe recursion
- Bugzilla 2553: Excess attribute propagation for interfaces
- Bugzilla 2361: delete is allowed on invariant references.
- Bugzilla 2737: Nonsensical Error Message on Unsafe .idup
- Bugzilla 2740: Template Mixins do not work as advertised
- Bugzilla 2953: tuple.length rejected as a tuple parameter in a static foreach
- Bugzilla 3069: Array literals do not implicitly cast to void[]
- Bugzilla 3133: Compiler does not check that static array casts are legal
- Bugzilla 3180: Covariance of delegates/function pointers
- Bugzilla 3550: array.dup violates const/invariant without a cast.
- Bugzilla 3659: Too much exegesis on opEquals
- Bugzilla 3748: inout does not work properly
- Bugzilla 4022: [CTFE] AA get
- Bugzilla 4197: ICE(glue.c): error in forward-referenced in/out contract
- Bugzilla 4206: type accepted as enum initializer
- Bugzilla 4237: Typedefs of the same name cause initializer conflict
- Bugzilla 4269: Regression(2.031): invalid type accepted if evaluated while errors are gagged
- Bugzilla 4284: empty string[] alias lacks .length in a template
- Bugzilla 5453: ICE(statement.c): invalid switch statement forward referenced by CTFE
- Bugzilla 5696: Templates typetuple iteration
- Bugzilla 5703: std.intrinsic. and core.bitop.bsf, bsr and bswap should be CTFE-able
- Bugzilla 5886: Template this parameter cannot be made implicit, when other parameters are explicitly given
- Bugzilla 5932: Internal error: s2ir.c 339
- Bugzilla 6062: segv in dmd/64 with assoc array literals
- Bugzilla 6073: Cannot pass __traits(parent, ...) as a template parameter if it is a module
- Bugzilla 6084: Impossible to instantiate local template with TypeTuple-foreach iterator variable.
- Bugzilla 6087: typeof(this) doesn't work outside member function
- Bugzilla 6139: Duplicate error message on compile-time out of bounds array index
- Bugzilla 6289: Make slices of const/immutable arrays mutable (but keep the elements const/immutable)
- Bugzilla 6296: ICE(glue.c): invalid template instantiated in is(typeof()).
- Bugzilla 6352: Regression(2.054) Implicit pure/nothrow/@safe messes up delegate arrays
- Bugzilla 6360: @property is doubled in di files when used with auto
- Bugzilla 6404: Cannot check ref-ness of auto ref parameter in template constraint
- Bugzilla 6488: DMD compiler bug
- Bugzilla 6518: break inside a static foreach inside a switch
- Bugzilla 6529: writeln(const array of enums) too
- Bugzilla 6584: ICE on large version number/debug level
- Bugzilla 6596: Error message with not extern(C) function
- Bugzilla 6599: Segfault: invalid expression in initializer
- Bugzilla 6630: Assigning null to class with nested alias this class is misinterpreted
- Bugzilla 6656: static alias this broken in 2.055
- Bugzilla 6661: Templates instantiated only through is(typeof()) shouldn't cause errors
- Bugzilla 6665: Regression(2.055) ICE(cg87.c): static double inside closure
- Bugzilla 6672: [CTFE] ICE on compile time std.algorithm.sort
- Bugzilla 6674: Regression(2.055) mixin and __traits(allMembers) generates incorrect result
- Bugzilla 6675: Regression(2.054) ICE(glue.c) template parameter deduction with errors gagged
- Bugzilla 6682: Template function that has lazy parameter is not inferred as pure
- Bugzilla 6690: Using lazy parameter should be inferred as @safe
- Bugzilla 6691: static constructor inside template cannot initialize immutable template members
- Bugzilla 6693: [CTFE] Cannot set value to nested AA
- Bugzilla 6695: typeof(this) does not take into account const/immutable attributes inside member functions
- Bugzilla 6698: Regression(2.053): segfault with naked asm in inner function
- Bugzilla 6700: Regression(2.053) using $ inside a slice of a tuple
- Bugzilla 6719: "Error: out of memory" in parsing
- Bugzilla 6721: [CTFE] Cannot get pointer to start of char[]
- Bugzilla 6727: [CTFE] ICE(interpret.c): assignment from string literal.dup.ptr
- Bugzilla 6733: Regression(2.054) ICE(cod2.c) pure nothrow func with side-effect parameters
- Bugzilla 6739: [CTFE] Cannot set a value to an outer AA of a nested AA
- Bugzilla 6746: static this() inside struct skipped upon static method call
- Bugzilla 6749: [CTFE] problem with array of structs
- Bugzilla 6751: [CTFE] ref argument of AA doesn't work
- Bugzilla 6753: Regression(2.055beta) "Reinterpret" cast of array to a tail const one doesn't work inside @trusted
- Bugzilla 6759: missing initialization in foreach with alias this
- Bugzilla 6765: [CTFE]: AA.length doesn't compile when AA is null
- Bugzilla 6769: [CTFE] AA.keys doesn't compile when -inline is used
- Bugzilla 6770: inout is allowed on fields
- Bugzilla 6773: inout variable should not be modifiable
- Bugzilla 6775: [CTFE] foreach over an AA fails to compile
- Bugzilla 6782: inout-correct range is not iterable using foreach with type deduction inside non-inout function
- Bugzilla 6813: Yet another "cannot get frame pointer" error
- Bugzilla 6822: New ubuntu linking rules prevent dmd from linking programs on Ubuntu 11.10
- Bugzilla 6825: Regression(2.055+): Address of templated method incorrectly taken
New/Changed Features
- Added dman
- Add support for Mac OS X 10.7 Lion
- Add protection to json output
- Add SSE4.1 and SSE4.2 assembly instructions
- Bugzilla 4375: Require explicit braces when 'else' is ambiguous
- std.algorithm.copy now specializes on arrays for 10-80x improved performance.
- std.path has been rewritten from scratch and has a completely new API.
- std.utf.toUTFz allows you to get a zero-terminated string of any character type and of any type of mutability.
- Added symlink and readLink to std.file for Posix systems.
- Values for GDC and LDC were added to std.compiler.Vendor.
- Added functions to std.bitswap for generically handling swapping endianness.
- Added std.parallelism.TaskPool.workerIndex.
- Added buffer recycling overload of std.parallelism.asyncBuf
- std.math.tgamma, lgamma, erf, and erfc are now deprecated. The equivalent functions in std.mathspecial should be used instead.
- The names of the values of std.mmfile.Mode, std.system.Endian, std.traits.FunctionAttributes, std.traits.ParameterStorageClass, and std.traits.Variadic were changed to match Phobos' naming conventions.
- std.range: Added indexed and chunks
- std.string.translate has been updated to work with unicode. As a result, its signature has been changed. The old version and std.string.maketrans have been scheduled for deprecation.
- std.string.tr has been updated so that it works with any string type.
- std.conv.parse works for associative array and static array
- std.format: Improvement of formatValue and unformatValue. They now works for associative array, consider element escaping, and treat range format spec more properly.
- std.complex: added sin(), cos(), sqrt()
- md5: 1.4X speedup
Druntime Bugs Fixed
- Bugzilla 5967: Mangling of ArgClose for variadic function is swapped
- Bugzilla 6493: Source code for the doc of core.time points to std.datetime.
- Bugzilla 6466: core.demangle incorrect demangling of variables
Library Bugs Fixed
- Unlisted bug: std.range.transversal should have length
- Bugzilla 3890: Bad writeln of a nested struct
- Bugzilla 4500: scoped moves class after calling the constructor
- Bugzilla 4977: cannot use nothrow or pure with Rebindable
- Bugzilla 5237: writefln doesn't respect Complex.toString
- Bugzilla 5645: std.range.drop()
- Bugzilla 5825: write is calling a deprecated function
- Bugzilla 6040: std.cpuid and core.cpuid return different values for some methods
- Bugzilla 6064: std.array.join is unnecssarily slow for strings
- Bugzilla 6194: [GSoC] Destructor gets called on object before it is copied when calling writeln()
- Bugzilla 6261: [2.054 beta regression] Regex cannot take a char[]
- Bugzilla 6301: Cannot 'zip'/'retro'/'stride' etc. a range having 'ulong' length.
- Bugzilla 6377: std.conv.to should check range when changing signedness
- Bugzilla 6424: std.traits.hasElaborateAssign is limited
- Bugzilla 6448: writef("%05d", BigInt) problem
- Bugzilla 6514: CTFE dot product
- Bugzilla 6587: std.parallelism's Task cannot handle immutable values
- Bugzilla 6606: RefCounted doesn't work with unions due to use of format
- Bugzilla 6608: Tuple field is not escaped
DMD Bugs Fixed
- Bugzilla 1471: Linker error on template function. Error 42: Symbol Undefined ...
- Bugzilla 1567: call to private super-constructor should not be allowed
- Bugzilla 1684: offsetof does not work, adding cast is workaround
- Bugzilla 1904: wrong protection lookup for private template functions
- Bugzilla 2156: [] and null should be accepted where a compile-time string is required
- Bugzilla 2234: __traits(allMembers) returns incorrect results for mixin and template alias members of an aggregate
- Bugzilla 2245: Bug with overloaded, mixin template functions in classes
- Bugzilla 2246: Regression(2.046, 1.061): Specialization of template to template containing int arguments fails
- Bugzilla 2540: super can not be using in alias statement
- Bugzilla 2634: Function literals are non-constant.
- Bugzilla 2355: is() doesn't resolve aliases before template matching
- Bugzilla 2579: Template function accepting a delegate with in argument doesn't compile
- Bugzilla 2774: Functions-as-properties makes it impossible to get the .mangleof a function
- Bugzilla 2777: alias this doesn't forward __dollar and slice op.
- Bugzilla 2781: alias this doesn't work with foreach
- Bugzilla 2787: Members found in an 'alias this' are not implicitly accessible in methods
- Bugzilla 2941: Wrong code for inline asm because CPU type is set too late
- Bugzilla 3268: can't compare pointer to functions when one is const
- Bugzilla 3273: Regression(2.031): struct invariant + dtor fails to compile (no line number)
- Bugzilla 3512: dchar iteration over string in CTFE fails
- Bugzilla 3661: ^^ not supported in array operations.
- Bugzilla 3797: Regression(2.038): Implicit conversion between incompatible function pointers
- Bugzilla 4021: [CTFE] AA rehash
- Bugzilla 4099: Inconsistent behaviour of ++/-- when mixing opUnary and 'alias this'.
- Bugzilla 4444: Cannot index built-in array with expression tuple
- Bugzilla 4460: Regression(2.036) ICE(e2ir.c) when compiling foreach over associative array literal
- Bugzilla 4682: [CTFE] Run-time Vs Compile-time of int.min % -1
- Bugzilla 4773: Rebindable should be castable to bool
- Bugzilla 4837: ICE(constfold.c) CTFE with >>>=
- Bugzilla 4984: Recursive template constraint results in dmd running out of memory
- Bugzilla 5046: Wrong type of implicit 'this' in struct/class templates
- Bugzilla 5081: Pure functions as initializers for immutable structures
- Bugzilla 5188: alias this and compare expression generates wrong code
- Bugzilla 5239: optimizer misreports an used before set error
- Bugzilla 5373: Regression (2.051) CTFE and std.string.replace() causes "Bad binary function q{a == b}..
- Bugzilla 5440: ICE(template.c): when struct AssociativeArray is missing from object.d
- Bugzilla 5585: bad debug line number info for return statements with enumerator expressions
- Bugzilla 5745: Missing error line number with lazy argument
- Bugzilla 5750: Allow pure functions to have lazy arguments
- Bugzilla 5777: Move semantics require full spec NRVO
- Bugzilla 5785: Lexing or Parsing issue with UFCS
- Bugzilla 5790: 'Error: variable result used before set' when -release -inline -O
- Bugzilla 5799: Address-of operator fails on nested conditional operator expression
- Bugzilla 5936: Regression(2.050): Segfault when forward-referencing pure auto-return member function with parameter.
- Bugzilla 5953: Too many trailing commas are accepted
- Bugzilla 6097: SSSE3 not working with MMX instructions
- Bugzilla 6215: LLVM-compiled DMD segfaults due to mem.c alignment issues
- Bugzilla 6220: Regression(2.053) static foreach over a string[] no longer produces directly usable strings
- Bugzilla 6228: Regression(2.053) ICE(e2ir.c) on {auto x = (*ptr) ^^ y} with const integer types
- Bugzilla 6230: Member functions can no longer be weakly pure
- Bugzilla 6250: [CTFE] Crash when swapping two pointers to arrays.
- Bugzilla 6265: Pure-inference failed when calling other pure functions
- Bugzilla 6270: XMMREGS not preserved on indirect function call
- Bugzilla 6276: [CTFE] Strange behavior of using ~= operator twice
- Bugzilla 6280: [CTFE] Cannot put 'in' expression of AA in an 'if' condition
- Bugzilla 6281: [CTFE] A null pointer '!is null' returns 'true'.
- Bugzilla 6282: [CTFE] ICE when dereferencing a pointer to reference type from 'in' of an AA
- Bugzilla 6283: [CTFE][Regression 2.054] Failed to assign to AA using a constness-changed array as key
- Bugzilla 6284: [Regression 2.054] 'pure' does not work with 'with' statement
- Bugzilla 6286: Regression(2.054): Static arrays can not be assigned from const(T)[N] to T[N]
- Bugzilla 6293: [Regression 2.054] The expression x.y makes the function impure when the 'x' part is not just a variable
- Bugzilla 6295: [Regression 2.054] Segfault in checkPurity() of template value parameter
- Bugzilla 6306: Regression(2.054): [CTFE] Strange behavior of indirect recursive call in CTFE
- Bugzilla 6308: Destruction of temporaries on exception causes unhandled access violation
- Bugzilla 6316: Regression(2.054): Class downcast is rejected in @safe code
- Bugzilla 6317: ICE on struct literal of nested struct
- Bugzilla 6331: [CTFE] Cannot evaluate SliceExp on if condition
- Bugzilla 6337: [CTFE] ICE when touching member variable of struct during CTFE
- Bugzilla 6344: [CTFE] Assertion Failure in interpret.c when create an empty slice from null pointer
- Bugzilla 6351: Regression(2.054) Segfault: Vararg delegate as template param
- Bugzilla 6355: Template constructor cannot initialize non-mutable field
- Bugzilla 6366: alias this doesn't work with foreach range.front
- Bugzilla 6369: alias this doesn't work with initializer
- Bugzilla 6374: [CTFE] Cannot subscript using pointer to array
- Bugzilla 6375: [CTFE] Segfault when using std.array.appender with an initial array
- Bugzilla 6386: [CTFE] ICE on pointer casting
- Bugzilla 6389: Segfault(dsymbol.c): deprecated @disable
- Bugzilla 6399: [CTFE] struct member array.length -= x doesn't work, while array[0..$-x] works
- Bugzilla 6404: Cannot check ref-ness of auto ref parameter in template constraint
- Bugzilla 6418: [CTFE] Cannot call a struct member function with name 'length'.
- Bugzilla 6420: [CTFE] ICE on dereference-assigning to a pointer casted from a literal
- Bugzilla 6429: Nested function error in reduce
- Bugzilla 6433: Meta-Bug AA type propagation
- Bugzilla 6434: opDispatch must be considered before alias this.
- Bugzilla 6491: Fully qualified values in default arguments of non-template functions are generated with an extra 'module' keyword
- Bugzilla 6499: [GSoC] Destructor not called on object returned by method.
- Bugzilla 6505: Wrong code for expression involving 8 floats, only with -O
- Bugzilla 6508: alias this doesn't work with AssignExp rhs
- Bugzilla 6510: [CTFE] "internal error: illegal stack value" when compiled with -inline
- Bugzilla 6511: [CTFE] Array op gives wrong result
- Bugzilla 6512: [CTFE] new T[][] doesn't work
- Bugzilla 6516: Regression(2.055 beta) [CTFE] ICE(constfold.c) involving new dchar[]
- Bugzilla 6517: [CTFE] ptr++ doesn't work but ++ptr does
- Bugzilla 6546: alias this + IdentityExpression doesn't work
- Bugzilla 6556: ICE for ImportStatement in DebugStatement
- Bugzilla 6558: [CTFE] UTF-decoding foreach gives wrong index (1-indexed)
- Bugzilla 6561: alias this + undefined symbol should cause error
- Bugzilla 6563: wrong code when using at least 8 XMM regs
- Bugzilla 6577: 'Cannot initialize member' error line number
- Bugzilla 6601: Regression(2.053): CTFE segfault taking address of function template
- Bugzilla 6602: Invalid template instantiations leaked by is(typeof())/__traits(compiles, )/Type::trySemantic
New/Changed Features
- Implement @safe
- Implement @property
- Automatic inference for @safe, pure, nothrow
- Allow labelled break and continue in CTFE
- Warn about switch case fallthrough
- Pointers are now supported in CTFE
- Heap-allocated structs are now supported in CTFE
- Added SSSE3 instructions to inline assembler
- Change from warning to deprecated: non-final switch statements must have a default statement
- Change from warning to deprecated: function is hidden by function
- Add warning about switch case fallthrough
- Add warning about calling pure nothrow functions and ignoring the result
- Allow associative arrays with key of type bool
- Added inference for purity and safety
- Change win32 dmd to not emit a map file unless asked for with -map
- Added -property switch
- Bugzilla 5823: @property call syntax restriction not implemented
- Added core.sys.posix.netdb
- For functions which have a version which takes a core.time.Duration and another version which takes an integral value, the version which takes an integral value is now scheduled for deprecation.
- std.array.insertInPlace supports inserting of multiple ranges/elements in one go
- Added std.array.uninitializedArray and std.array.minimallyInitializedArray
- Various functions in std.string were renamed to match Phobos' naming conventions and be properly camelcased. The old names are still there but have been scheduled for deprecation.
- Various functions in std.uni were renamed so that they don't have "Uni" in their name, since it was decided that it was not desirable to repeat a module's name in its functions' names. The old names are still there but have been scheduled for deprecation.
- std.ctype has been scheduled for deprecation. std.ascii has been added to replace it.
- Major performance improvements for std.algorithm.sort
- std.string.atoi has been removed; replace it with std.conv.to!int
- Switched to using posix.mak instead of various .mak files
Druntime Bugs Fixed
- Bugzilla 4323: std.demangle incorrectly handles template floating point numbers
- Bugzilla 5272: Postblit not called on copying due to array append
- Bugzilla 5956: Undocumented mangling of struct value
- Bugzilla 6135: Thread/GC interaction bug on OS X
Library Bugs Fixed
- Bugzilla 2108: regexp.d: The greedy dotstar isn't so greedy
- Bugzilla 3136: Incorrect and strange behavior of std.regexp.RegExp if using a pattern with optional prefix and suffix longer than 1 char
- Bugzilla 3457: rdmd fails silently in a particular setup where the compiler is not the expected
- Bugzilla 3479: writef/writefln: positional precision not working
- Bugzilla 3564: Rdmd failing to link external C libraries
- Bugzilla 3752: File.byLine fetches lines in a confusing manner
- Bugzilla 4367: std.regex: Captures is not a random access range
- Bugzilla 4574: std.regex: breaks with empy string regex
- Bugzilla 4608: std.string.chomp documentation mismatch implementation
- Bugzilla 5019: In std.regex, empty capture at end of string causes error
- Bugzilla 5059: String assignment in foreach loop breaks immutability
- Bugzilla 5458: scope for function parameters is not documented
- Bugzilla 5511: std.regex optional capture with no-match cause error
- Bugzilla 5598: rdmd does not fail on invalid filename
- Bugzilla 5673: Add lookahead and forgetful matching support std.regex
- Bugzilla 5705: Swapping identical struct with hasElaborateAssign causes "overlapping array copy" exception
- Bugzilla 5836: std.typetuple.staticIndexOf's example code missing %s in call to writefln
- Bugzilla 5857: std.regex (...){n,m} is bogus when (...) contains repetitions
- Bugzilla 5869: std.thread needs to be removed
- Bugzilla 6026: DLL example needs update due to missing core.dll_helper
- Bugzilla 6076: regression, std.regex: "c.*|d" matches "mm"
- Bugzilla 6101: Documentation for dead modules still distributed with DMD
- Bugzilla 6113: singletons in std.datetime are not created early enough
- Bugzilla 6193: Appender.clear() functionality or documentation
DMD Bugs Fixed
- Bugzilla 693: 'this' can't be used as an alias parameter for a mixin
- Bugzilla 1373: typeof(func).stringof fails when func has parameters.
- Bugzilla 1411: ref Tuple should transform to Tuple of ref's
- Bugzilla 1570: Wrong return for address operator
- Bugzilla 2180: filename error with #line
- Bugzilla 2521: Not possible to return immutable value by ref
- Temp destructors now called if exception is thrown
- Bugzilla 2625: Creating new struct with literal bypasses immutability of members if struct is in array
- Bugzilla 3147: Incorrect value range propagation for addition
- Bugzilla 3359: Cannot parse pure/const/immutable functions with inferred return type
- Bugzilla 3445: partial fix
- Bugzilla 3511: ref return property confused with property setter
- Bugzilla 3632: modify float is float to do a bitwise compare
- Bugzilla 3688: Can't have declaration with assignment to const/immutable inside if condition
- Bugzilla 3722: A method without an in contract should always succeed, even if overridden
- Bugzilla 3799: isStaticFunction trait evaluates to true for non-static nested functions
- Bugzilla 4031: Should be able to access const value-type globals from pure functions
- Bugzilla 4040: const/immutable on the right in auto return class methods
- Bugzilla 4063: [CTFE] key not found in AA gives bad error message
- Bugzilla 4065: [CTFE] AA "in" operator doesn't work
- Bugzilla 4107: Duplicate documentation for member function templates
- Bugzilla 4132: pointer arithmetic accepted in @safe functions
- Bugzilla 4170: Missing line number on compile-time array index
- Bugzilla 4258: "auto ref" doesn't work in one or more cases
- Bugzilla 4448: [CTFE] labeled break doesn't work in CTFE
- Bugzilla 4494: ICE(cod1.c) Array literal filled with results of void function
- Bugzilla 4633: typeof({return 1;}()) declaration fails if inside main
- Bugzilla 4661: Array Literal Incompatible Type Error Msg Should Include Line Number
- Bugzilla 4706: Overloading auto return w/ non-auto return = strange error msg
- Bugzilla 4745: Non-uniform handling of commas in static initialization of structs
- Bugzilla 4885: Uninitialize Pointers Allowed in @safe code
- Bugzilla 4910: [CTFE] Cannot evaluate a function that has failed at once
- Bugzilla 4963: ICE(type.c:320) for struct append where T.sizeof < 3
- Bugzilla 4969: nothrow check can't handle multiple catches
- Bugzilla 5088: Cannot cast const(int) to long in @safe function
- Bugzilla 5258: [CTFE] Stack overflow with struct by ref
- Bugzilla 5284: Array ops punch through const system
- Bugzilla 5327: Creating new struct with literal bypasses immutability of members of members of the struct
- Bugzilla 5396: [CTFE] Invalid code with nested functions in CTFE
- Bugzilla 5415: @Safe functions not working
- Bugzilla 5497: -- now produces error message instead of wrong code
- Bugzilla 5551: opUnary-opBinary conflict
- Bugzilla 5574: Struct destructor freaks out when an array of struct with single element is instantiated inside a class
- Bugzilla 5615: [CTFE] std.string.indexOf broken at compile time
- Bugzilla 5633: [CTFE] ICE(constfold.c): is expression with struct, struct pointer, array literal...
- Bugzilla 5657: Temporary object destruction
- Bugzilla 5659: Conditional operator, array literal, and std.traits.CommonType return a wrong common type
- Bugzilla 5676: [CTFE] segfault using tuple containing struct that has opAssign
- Bugzilla 5682: [CTFE] Silently wrong result possibly related to operator overloading and expression order
- Bugzilla 5693: Segfault with address of template struct opCall
- Bugzilla 5708: [CTFE] Incorrect string constant folding with -inline
- Bugzilla 5771: Template constructor and auto ref do not work
- Bugzilla 5819: DMD doesn't error/warn about illegal asm for 64bit mode
- Bugzilla 5845: Regression(2.041) [CTFE] "stack overflow" with recursive ref argument
- Bugzilla 5856: overloading on const doesn't work for operator overload
- Bugzilla 5859: Declaration inside if condition doesn't call destructor
- Bugzilla 5861: Wrong filename in error message when an invalid delegate in a template parameter is typeof()-ed
- Bugzilla 5885: wrong codegen for OPu32_d
- Bugzilla 5897: unrelated struct type casting should ignite construction
- Bugzilla 5936: Invalid code with nested functions in CTFE
- Bugzilla 5946: failing lookup 'this' from function in template
- Bugzilla 5954: [CTFE] enum structs with ctor
- Bugzilla 5959: Return by reference with nested function should be allowed
- Bugzilla 5962: Template function declaration with prefixed storage class and auto occurs conflict
- Bugzilla 5963: iasm does not accept 64bit integer literal
- Bugzilla 6001: [CTFE] ICE(interpret.c) mutating ref array
- Bugzilla 6015: [CTFE] Strange behavior of assignment appears in a situation
- Bugzilla 6049: [CTFE] Array literals of structs with invariant() are wrong
- Bugzilla 6052: [CTFE] Struct elements in an array are treated like reference type
- Bugzilla 6053: [CTFE] Two ICEs involving pointers (dereference and assign; pointer variable on stack)
- Bugzilla 6054: [CTFE] ICE when returning a returned compile-time associative array containing a key of an idup-ed array literal
- Bugzilla 6059: Incompatible types in array literal shows __error and error
- Bugzilla 6072: [CTFE] Regression(git master): Cannot declare variable inside an 'if' condition
- Bugzilla 6075: Cannot set value to associative array from a weakly-pure function when the value type has a (pure) opAssign
- Bugzilla 6077: [CTFE] Cannot append null array to null array.
- Bugzilla 6078: [CTFE] ICE on foreach over array struct member which is null
- Bugzilla 6079: [CTFE] Array index out of bound detection is off-by-one
- Bugzilla 6090: DDoc parenthesis escape issues.
- Bugzilla 6100: [CTFE] Regression: struct return values wrong if used in array initializer
- Bugzilla 6109: 'nothrow' does not check slice indices
- Bugzilla 6111: Escaping reference to local variable not detected
- Bugzilla 6119: Assertion failure: '0' on line 1118 in file 'glue.c'
- Bugzilla 6120: [CTFE] ICE on calling constructor of template struct with -inline in function/delegate literal.
- Bugzilla 6123: [CTFE] Cannot call a template member method inside delegate/function literal with -inline.
- Bugzilla 6137: [CTFE] Foreach on semantically wrong initialized array crashes the compiler
- Bugzilla 6145: Meaningless second error message for complex size of static array
- Bugzilla 6150: runnable/testsocket.d
- Bugzilla 6158: winsamp and dhry samples need an update
- Bugzilla 6161: iasm opcode family Jcc use absolute address instead of relative for functions
- Bugzilla 6164: [CTFE] Local arrays in a recursive local function behave funny
- Bugzilla 6198: [GSoC] ICE(e2ir.c) With circular import
- Bugzilla 6229: %= and /= no longer work on char type
- Bugzilla 6230: Member functions can no longer be weakly pure
- Bugzilla 6234: 64-bit array append generates inline code to copy new data, but does not call postblit
- Bugzilla 6241: test sdtor.d on osx not catching
- Bugzilla 6242: Disallow inoperant "in" contracts
- Bugzilla 6264: ICE on testing opSlice in static if
- Bugzilla 6267: Can't increment alias this'd struct from ref return
- Bugzilla 6279: Regression(2.054 beta): array-vararg with pointer type not working in safe code
New/Changed Features
- Added 64 bit tools to Linux
- Added FreeBSD support
- Renamed linux/bin to linux/bin32, added linux/bin64
- osx/lib32 renamed back to osx/lib
- Added some gc benchmark apps
- Move std.intrinsic to core.intrinsic
- Implemented exception chaining, as described in TDPL for Posix.
- Added parent to __traits for QtD support
- Allow impure code inside debug conditionals
- Added cmpxchg16b, 64 bit bswap and movq instructions to internal assembler
- Added bindings for libcurl: etc.c.curl
- Added std.net.isemail
- Added std.parallelism
- Added support for positional parameter intervals, e.g. %1:3$s prints the first three parameters using the 's' format specifier
- Added findSplit, findSplitBefore, findSplitAfter to std.algorithm; improved walkLength
- Improved online documentation for std.algorithm
- Added roundRobin, takeOne, and takeNone to std.range; improved stride
- Added unsigned to std.traits
- Removed std.iterator. Use either std.range.ElementType or std.range.ElementEncodingType depending on what you're trying to do.
- Bugzilla 2656: Remove octal literals
- Bugzilla 4097: Error: can only declare type aliases within static if conditionals
- Bugzilla 4360: Allow intrinsics in core.bitop to operate as intrinsics
- Bugzilla 4833: dmd -od doesn't make it to optlink's command line for map files
Druntime Bugs Fixed
- Bugzilla 5612: core.cpuid not implemented on 64
- Bugzilla 1001: print stack trace (in debug mode) when program die
- Bugzilla 5847: Threads started by core.thread should have same floating point state as main thread
Library Bugs Fixed
- Bugzilla 4644: assertExceptionThrown to assert that a particular exception was thrown
- Bugzilla 4944: Missing tzname even though we have tzset
- Bugzilla 5451: Three ideas for RedBlackTree
- Bugzilla 5474: unaryFun byRef is borked for custom parameter name
- Bugzilla 5485: TLS sections handled incorrectly in FreeBSD
- Bugzilla 5616: std.datetime: not cross-platform
- Bugzilla 5654: BigInt returns ZERO with strings of single digit number with leading zeros
- Bugzilla 5661: std.algorithm.move does not work on elaborate struct
- Bugzilla 5731: std.datetime.SysTime prints UTC offsets backwards
- Bugzilla 5761: std.datetime: Date.this(int day) conversion fails for Dec 30 of leap years
- Bugzilla 5780: [patch] std.traits.hasIndirections incorrectly handles static arrays
- Bugzilla 5781: std.datetime: On Windows, times off by one hour in some years due to DST rule changes
- Bugzilla 5794: std.datetime StopWatch (and perhaps benchmark) examples need a small fix
- Bugzilla 5928: Bigint modulo problem -- critical wrong-code bug
DMD Bugs Fixed
- Note: Although temporaries are destroyed now, they are not destroyed when exceptions are thrown. This is scheduled to be fixed.
- Bugzilla 2436: Unexpected OPTLINK termination EIP = 00425303 with /co
- Bugzilla 3372: optlink silently mistreats object files with more than 16384 symbols
- Bugzilla 4275: Unexpected optlink termination when 'export' attribute is missing
- Bugzilla 4808: UNEXPECTED OPTLINK TERMINATION AT EIP=0042787B
- Bugzilla 5670: Optlink 8.00.11 crash
- Bugzilla 937: C-style variadic functions broken
- Bugzilla 1330: Array slicing does not work the same way in CTFE as at runtime
- Bugzilla 1336: Inconsistent __traits usage
- Bugzilla 1389: Can't use mixin expressions when start of a statement.
- Bugzilla 1880: templates instantiated with non-constants should fail sooner
- Bugzilla 2257: Template value parameters behave like alias parameters
- Bugzilla 2414: enum is dynamically evaluated, yum
- Bugzilla 2526: non-const initializer to constant accepted inside template
- Bugzilla 2706: invalid template instantiation (and declaration?) is not rejected
- Bugzilla 2733: Unclear semantics of template value parameters
- Bugzilla 2841: char[] incorrectly accepted as a template value argument in D2
- Bugzilla 2850: bad codegen for struct static initializers
- Bugzilla 2990: TypeInfo.init() returns invalid array
- Bugzilla 3086: TypeInfo opEquals returns incorrect results
- Bugzilla 3214: Incorrect DWARF line number debugging information on Linux
- Bugzilla 3271: Struct initializers silently fail
- Bugzilla 3516: Destructor not called on temporaries
- Bugzilla 3792: Regression(1.053) "non-constant expression" for a template inside a struct using a struct initializer
- Bugzilla 3779: ["123"][0][$-1] causes __dollar unresolved in compile-time
- Bugzilla 3801: CTFE: this.arr[i] cannot be evaluated at compile time for structs
- Bugzilla 3835: ref foreach does not work in CTFE
- Bugzilla 4033: Error: base class is forward referenced
- Bugzilla 4050: [CTFE] array struct member slice update
- Bugzilla 4051: [CTFE] array struct member item update
- Bugzilla 4097: Error: can only declare type aliases within static if conditionals
- Bugzilla 4140: Error: non-constant expression "hello"[1u..__dollar]
- Bugzilla 4298: Constant array translated to unnecessary array literal creation
- Bugzilla 4322: "void initializer has no value" on struct/union members initialized to "void"
- Bugzilla 4329: Do not show error messages that refer to __error
- Bugzilla 4360: Allow intrinsics in core.bitop to operate as intrinsics
- Bugzilla 4437: copy construction bug with "return this;"
- Bugzilla 4499: calls to @disabled postblit are emitted
- Bugzilla 4543: Regression(1.054, 2.038) typedef causes circular definition and segfault
- Bugzilla 4750: fail_compilation/fail225.d causes dmd to segv
- Bugzilla 4815: CodeView: Global and Static symbols should have unmangled names
- Bugzilla 4817: CodeView: Enum members should have simple names
- Bugzilla 4833: dmd -od doesn't make it to optlink's command line for map files
- Bugzilla 4917: Symbol conflict error message refers to aliased symbol instead of the alias
- Bugzilla 5147: [CTFE] Return fixed-size matrix
- Bugzilla 5268: Outdated windows GUI sample in Samples folder
- Bugzilla 5362: checking $ in bracket is broken
- Bugzilla 5482: Crash with align(0)
- Bugzilla 5485: TLS sections handled incorrectly
- Bugzilla 5524: [CTFE] Trouble with typesafe variadic function
- Bugzilla 5647: [64-bit] Valgrind complains about illegal instruction
- Bugzilla 5649: std.conv.parse faulty for floating point with -O -m32
- Bugzilla 5657: Temporary object destruction
- Bugzilla 5664: Cannot compile static synchronized member function.
- Bugzilla 5694: va_arg doesn't work with idouble and ifloat
- Bugzilla 5671: CTFE string concat problem
- Bugzilla 5672: ICE(cod2.c): incorrect optimization of (long &1) == 1
- Bugzilla 5678: new enum struct re-allocated at compile time
- Bugzilla 5694: va_arg doesn't work with idouble and ifloat
- Bugzilla 5706: Incorrect opcode prefix generated for x86_64 inline assembly
- Bugzilla 5708: Incorrect string constant folding with -inline
- Bugzilla 5717: 1.067 regression: appending Unicode char to string broken
- Bugzilla 5722: Regression(2.052): Appending code-unit from multi-unit code-point at compile-time gives wrong result
- Bugzilla 5735: non-scalar types implicitly converted to boolean
- Bugzilla 5740: Unable to use this pointer in inline assembly
- Bugzilla 5741: Add the SYSCALL and SYSRET opcodes to the inline assembler
- Bugzilla 5798: Weakly pure function calls skipped inside a comma expression
- Bugzilla 5812: Added constant fold optimisations for ^^ expressions
- Bugzilla 5840: Cannot assign to an array member of struct in CTFE
- Bugzilla 5852: CTFE: wrong code for string[] ~= const(string)
- Bugzilla 5858: Import doesn't accept const string as argument
- Bugzilla 5865: __dollar cannot be read at compile time
- Bugzilla 5890: ICE and wrong scope problem for 2nd argument in static assert with DMD on git master
- Bugzilla 5916: DMD: bad message for incorrect operands error
- Bugzilla 5938: ICE ztc\symbol.c 1043
- Bugzilla 5940: Cannot create arrays of std.algorithm.map
- Bugzilla 5965: [2.053 beta] map rejects a predicate with anon-func and nested func
- Bugzilla 5966: [2.053 beta][CTFE] Stack overflow on trivial func
- Bugzilla 5972: CTFE: Can't assign to elements of arrays of slices
- Bugzilla 5975: [2.053 beta][CTFE] ICE: 'global.errors' on line 1416 in file 'constfold.c'
- Bugzilla 5976: "variable used before set" with foreach with ref + scope(failure) + structure method + -O -inline
- Bugzilla 5982: [2.053 beta] std.iterator gone, but no mention of the change
- Bugzilla 5987: mydll sample doesn't compile
- Clarify tuple index out of bounds error message
- Add 64 version of xchg and jmp to inline assembler. Fixed 64 bit LEA
- CTFE: Generate error messages for accessing null arrays
- Fix optimizer bug with to!float("123e2")
- Fix spelling of cmpxchgb8
New/Changed Features
- 64 bit support for Linux
- Implemented exception chaining, as described in TDPL. Currently Windows-only.
- std.random: Added Xorshift random generator
- Support HTML5 entities
- Added std.datetime for handling dates and times. std.date and std.gregorian are now scheduled for deprecation. Any functions in other modules of Phobos which used std.date.d_time have been changed to use std.datetime.SysTime or are scheduled for deprecation with new functions with the same functionality added which use SysTime (done in cases where switching existing functions to use SysTime would have broken code). New code should use std.datetime instead of std.date.
- Various functions in std.file were renamed to match Phobos' naming conventions (e.g. isFile instead of isfile). The old names are aliased and scheduled for deprecation.
Bugs Fixed
- Bugzilla 190: Cannot forward reference typedef/alias in default value for function parameter
- Bugzilla 1513: try/catch/finally misbehavior on windows
- Bugzilla 1899: AA of fixed-length arrays fails to initialize
- Bugzilla 1914: Array initialisation from const array yields memory trample
- Bugzilla 2581: DDoc doesn't work for functions with auto return type.
- Bugzilla 2810: Bogus forward reference error with auto function
- Bugzilla 2874: phobos docs issues
- Bugzilla 3198: wrong initializer for structs arrays
- Bugzilla 3334: std.demangle doesn't parse ref, pure, nothrow
- Bugzilla 3681: ICE(go.c): when function takes too long to optimize, only with -O.
- Bugzilla 3848: functions in std.file don't take symbolic links into account
- Bugzilla 4013: Inconsistent codeview debug info for classes derived from IUnknown
- Bugzilla 4069: Issue 4069 - std.xml.Document.pretty saves empty elements with spaces and line breaks
- Bugzilla 4245: Declaring conflicting symbols in single function scope allowed
- Bugzilla 4307: spawn()'ed thread doesn't terminate
- Bugzilla 4328: templated unittests fail to link when instantiated from other file if compiler order isn't correct
- Bugzilla 4379: ICE(blockopt.c): foreach over huge tuple, only with -O
- Bugzilla 4389: ICE(constfold.c, expression.c), or wrong code: string~=dchar in CTFE
- Bugzilla 4486: CodeView debug info should contain absolute path names
- Bugzilla 4598: std.xml check is too restrictive
- Bugzilla 4601: Spawned threads frequently don't terminate or let other threads ever run if you spawn more than one thread
- Bugzilla 4732: __traits(identifier) performs constant folding on symbols
- Bugzilla 4753: fail_compilation/fail116.d sends dmd into a loop, exhausting memory
- Bugzilla 4807: Examples for std.array insert and replace
- Bugzilla 4852: core.demangle cannot demangle functions with class/struct return types
- Bugzilla 4878: Ddoc: Default arguments can break Ddoc output
- Bugzilla 4913: Implicit opCast!bool in if statement doesn't work with declarator
- Bugzilla 4973: map file with spaces in file name passed without quotes to linker
- Bugzilla 5025: ICE(cast.c) shared struct literal
- Bugzilla 5090: ICE(todt.c) struct literal initializing zero length array
- Bugzilla 5105: Member function template cannot be synchronized
- Bugzilla 5197: Ddoc: access-attributed auto template function crashes dmd
- Bugzilla 5198: Appender much slower when appending ranges of elements than individual elements
- Bugzilla 5209: posix/sys/select.d: FD_ISSET function should return bool
- Bugzilla 5221: entity.c: Merge Walter's list with Thomas'
- Bugzilla 5242: self referencing template constraint crashes compiler
- Bugzilla 5244: PATCH: fix use of uninitialised variable in toObj.c
- Bugzilla 5246: PATCH(s): fix a couple more uninitialised variables
- Bugzilla 5248: CTFE Segfault when calling a function on an enum struct
- Bugzilla 5271: Not constant RAND_MAX
- Bugzilla 5320: gcstub/gc.d: SEGV because of missing returns
- Bugzilla 5349: ICE(toir.c): nested class in static member function
- Bugzilla 5365: Regression (2.051) implicit conversions via alias this are broken
- Bugzilla 5381: Regression (2.051) switch fails for wstring and dstring
- Bugzilla 5382: [regression 2.051] DLL multi-threading broken
- Bugzilla 5391: Crash with recursive alias declaration
- Bugzilla 5400: Add const to FD_ISSET
- Bugzilla 5439: 64bit struct alignment inconsistent with C ABI
- Bugzilla 5447: Should be illegal to throw a non-Throwable
- Bugzilla 5455: ICE(cgcod.c): Optimization (register allocation?) regression in DMD 1.065
- Bugzilla 5486: Missing define for running dmd as 64 bit
- Bugzilla 5488: Spawned threads hang in a way that suggests allocation or gc issue
- Bugzilla 5504: Regression(2.051): Template member functions of a shared class don't compile
- Bugzilla 5534: [64-bit] Inexplicable segfault in small code snippet, -O -release -m64 only
- Bugzilla 5536: Array append with dollar op on 64-bit
- Bugzilla 5545: [64-bit] DMD fails to postincrement ubytes.
- Bugzilla 5549: [64-bit] Internal error: backend/cgcod.c 1845
- Bugzilla 5552: std.datetime.d DosFileTimeToSysTime has a bug
- Bugzilla 5556: [64-bit] Wrong Implicit Conversion to Double
- Bugzilla 5557: [64-Bit] FP (alignment?) issues with Rvalues
- Bugzilla 5564: [64-bit] loading of wrong constant byte value
- Bugzilla 5565: [64-bit] Wrong Floating Point Results, Related to Mixing With size_t
- Bugzilla 5566: [64-bit] More erratic FP results with size_t
- Bugzilla 5579: Segfault on first call to GC after starting new thread
- Bugzilla 5580: [64-bit] String switch statements broken in 64-bit mode
- Bugzilla 5581: [64-bit] Wrong code with bitwise operations on bools
- Bugzilla 5592: Previous definition different: __arrayExpSliceMulSliceAddass_d
- Bugzilla 5595: Compiler crash on heavy std.algorithm use
New/Changed Features
- Added std.mathspecial, containing mathematical Special Functions
- std.base64: Replaced. Boost License, Performance improvement, Range support. Function signature changed from 'encode' to 'Base64.encode'
- std.math: D implementation of pow. Almost all std.math functions are now @safe pure nothrow. tgamma, lgamma, erf, erfc have been moved to std.mathspecial
- std.exception: Added pure and nothrow to assumeUnique
- std.utf: Removed UtfError class and toUTF* shortcut functions for validation. Added pure, nothrow, @safe and @trusted attributes. count function supports dchar
- Both druntime and phobos now build successfully with dmd -m64. Still somewhat behind dmd1, very little executes correctly still.
Bugs Fixed
- Bugzilla 603: Undocumented behaviour: case and default create a scope
- Bugzilla 632: Typedef/enum promotions spec ambiguous - ultimate base type or lowest common denominator?
- Bugzilla 679: Spec needs allowances for copying garbage collection
- Bugzilla 690: ABI not fully documented
- Bugzilla 1351: Discrepancies in the language specification
- Bugzilla 1466: Spec claims maximal munch technique always works: not for "1..3"
- Bugzilla 2080: ICE(mangle.c) alias corrupts type inference of static variables
- Bugzilla 2206: unnamed template mixin of class inside function or class has incorrect classinfo and mangleof
- Bugzilla 2385: spec says all structs are returned via hidden pointer on linux, but it uses registers
- Bugzilla 2392: Parsing ambiguity between function pointer declaration and function call
- Bugzilla 2406: Declarator2 definition error
- Bugzilla 2556: Property classinfo needs better documentation (RTTI, typeof, typeid, runtime type information)
- Bugzilla 2616: Undocumented behaviour: part-explicit, part-implicit instantiations of function templates are accepted
- Bugzilla 2651: class body declaration grammar incorrect
- Bugzilla 2652: DeclDef grammar is wrong
- Bugzilla 2734: Ambiguity in tokenizing: _._ as a float literal
- Bugzilla 2751: const/invariant/immutable static arrays: const(T)[N] and const(T[N]) are the same, but DMD treats them as different
- Bugzilla 2954: [tdpl] Appalling bug in associative arrays (D2 only)
- Bugzilla 2994: Incomplete "Predefined Versions" documentation
- Bugzilla 3020: No description is given why function may not be nothrow
- Bugzilla 3112: Specification on what operations call the GC is missing
- Bugzilla 3276: Recursion broken by alias template parameter
- Bugzilla 3554: Ddoc generates invalid output for documentation comments with non paired parentheses
- Bugzilla 3864: Dyn array allocations can be allowed in nothrow functions
- Bugzilla 4059: Incorrect C++ name mangling
- Bugzilla 4217: Function overloads are not distinguished when instantiating templates
- Bugzilla 4254: ICE(mtype.c): function with const inout parameter
- Bugzilla 4297: Nothrow functions cannot use constant dynamic array
- Bugzilla 4384: Cyclic dependency check for modules is broken
- Bugzilla 4434: ICE(mtype.c, 887) alias with const, shared, or immutable
- Bugzilla 4445: roundTo!ubyte(255.0) throws
- Bugzilla 4529: Segfault(typinf.c) involving typeid(typeof(functionName))
- Bugzilla 4638: Regression: new writeln does not recognize "wstring toString"
- Bugzilla 4728: Segfault(toctype.c) by protected/private constructor in an other module
- Bugzilla 4781: Segfault(mtype.c) with forward referenced typeof and .init
- Bugzilla 4864: ICE(statement.c) Crash on invalid 'if statement' body inside mixin
- Bugzilla 4901: std.algorithm.sort does not compile for interfaces.
- Bugzilla 4915: auto return type escapes function purity
- Bugzilla 5020: Forward implicit bool conversions to alias this
- Bugzilla 5053: Better error message for cyclic dependencies.
- Bugzilla 5054: Splitter example doesn't work
- Bugzilla 5094: No implicit conversion with "alias property this"
- Bugzilla 5107: Const-shared classes/structs not typed as shared
- Bugzilla 5110: Excess attribute propagation of structs and classes
- Bugzilla 5117: [CTFE] Member function call with rather complex this: side effects ignored
- Bugzilla 5120: ICE(mtype.c) void associative arrays
- Bugzilla 5131: Segfault(expression.c) opAssign and associative arrays (AA) are broken for types != this
- Bugzilla 5133: dmd fails to build rdmd (problem with startsWith)
- Bugzilla 5145: Regression(2.050, 1.065) override error with forward ref of superclass
- Bugzilla 5148: Incorrect C++ mangling of multiple const char* parameters
- Bugzilla 5154: Class Range does not work in writeln
- Bugzilla 5159: Segfault(interpret.c): calling a static function pointer variable in CTFE
- Bugzilla 5163: meaningless error message with front() applied to void[].
- Bugzilla 5164: Error without line number using "is (T...)"
- Bugzilla 5180: ICE(arrayop.c) in-place array operation on incompatible types
- Bugzilla 5182: ICE(expression.c): calling unittest from a function
- Bugzilla 5191: Combination of pure and nothrow result in a function that does nothing
- Bugzilla 5194: ddoc does not show modifiers on constructors such as pure or nothrow
- Bugzilla 5195: Forward references ignore const
- Bugzilla 5214: Compiler crash with array of empty {}
- Bugzilla 5218: Can't implicitly convert from "abc"w to wchar[3]
- Bugzilla 5220: Make std.conv.ConvError an Exception instead of an Error; deprecated ConvError and ConvOverflowError with ConvException and ConvOverflowException. Note that any code depending on the fact that these exceptions were Error gets broken.
- Bugzilla 5230: Regression(2.041, 1.057) ICE(tocsym.c) overriding a method that has an out contract
- Bugzilla 5238: PATCH: fix return of uninitialised var in interpret.c
- Bugzilla 5247: std.utf.stride() should not return 0xFF
- Bugzilla 5275: x86_64 related hidden function parameter mishandled
- Bugzilla 5293: std.math: Error: shift by -48 is outside the range 0..32
- Bugzilla 5294: -O optimization breaks for loop
- Bugzilla 5321: std.math: assumes X86 or X86_64 on FPU control word code
- Bugzilla 5322: std.math: version(Sparc) should be SPARC
- Bugzilla 5330: Druntime/Phobos: remove special treatment for GDC
- Bugzilla 5331: mach format problem
- Bugzilla 5340: isOutputRange!(Appender!string, int) must be false
- Bugzilla 5353: clear function is calling the destructor twice
New/Changed Features
- added talign() and argTypes() to TypeInfo
- Upgrade zlib support to zlib 1.2.5
- std.stdio: Added ByChunk. This struct is a InputRange like ByLine. File.byChunk returns ByChunk
- std.traits: Most higher-order ranges now work with const/immutable arrays and other ranges with a natural tail const, and ranges w/ const/immutable elements.
- Bugzilla 4888: Heavy reliance on Bug 3534 in Phobos range usage
- Bugzilla 4987: C function pointer syntax needs to be deprecated
- std.typecons: Several improvements to the Tuple struct template:
- Tuple members are now accessible with the syntax a[0], a[1] etc.
- Eliminated an internal union. See Bugzilla 4421 and Bugzilla 4846.
- Worked around Bugzilla 4424. Got opAssign back.
- Made Tuple.slice!(from, to) to preserve field names if any.
- Added isTuple!(T) template.
- std.algorithm: changed filter() such that filter is curryable
- std.algorithm: Added function balancedParens
- std.typecons: Deprecated defineEnum
- Added relaxed purity checking rules.
Bugs Fixed
- Unlisted bug: std.exception.pointsTo() calls postblit on subobjects.
- Unlisted bug: std.typetuple.staticMap!() doesn't work with empty/single tuples.
- Unlisted bug: std.traits: Interfaces should have indirections, aliasing, etc.
- Unlisted bug: std.socket: Race condition - gethostbyname and gethostbyaddr on Linux return static data. The call was synchronized, but using the data wasn't
- Unlisted bug: signed long comparisons under OS X
- Bugzilla 941: std.regexp fails to match when grouping certain sub-expressions
- Bugzilla 1482: std.file docs are insufficient
- Bugzilla 1635: DirEntry.isfile() and DirEntry.isdir() broken
- Bugzilla 1733: parse() function does not handle all build-in types
- Bugzilla 2073: Variant.coerce!() fails
- Bugzilla 2142: getopt() incorrectly processes bundled command-line options
- Bugzilla 2310: Inconsistent formatting of arrays in std.stdio.write() and std.conv.to!(string)()
- Bugzilla 2424: std.functional binaryRevertArgs : "revert" should be "reverse"
- Bugzilla 2451: Adding structs that use opAssign or postblit to an AA is broken
- Bugzilla 2655: Allow alternation patterns in std.path.fnmatch
- Bugzilla 2669: Variant does not have opApply or another iteration mechanism
- Bugzilla 2718: Inconsistent string parameters in Phobos functions
- Bugzilla 2838: std.file.rmdirRecurse fails
- Bugzilla 2930: Problems in std.range documentation
- Bugzilla 2943: Struct copying in presence of alias member this only copies alias this member
- Bugzilla 2965: std.date: timezone not initialized
- Bugzilla 3157: [patch] Pipes should be closed with pclose
- Bugzilla 3318: [PATCH]Rebindable.get is not accessible
- Bugzilla 3570: mkdirRecurse throws exception on trailing empty directory.
- Bugzilla 3602: ICE(tocsym.c) compiling a class, if its super class has preconditions
- Bugzilla 3665: Regression(1.051, 2.036) Assignment with array slicing does not work
- Bugzilla 4344: Sockets with multiple threads report missing/failed WSAStartup
- Bugzilla 4398: dmd always uses Windows name mangling for _d_throw
- Bugzilla 4439: The declaration of the in6addr_* in druntime is wrong.
- Bugzilla 4465: ICE(symbol.c): immutable type inference with ^^2
- Bugzilla 4524: Regression(2.026) Bus error with nested struct
- Bugzilla 4623: Non-integer type allowed as static array size
- Bugzilla 4634: typo in levenshteinDistanceAndPath documentation
- Bugzilla 4641: Associative arrays of structs with alias this broken.
- Bugzilla 4742: int % BigInt should work.
- Bugzilla 4775: No substitution on writef("%%%s", "hi").
- Bugzilla 4825: Regression(1.057, 2.040) "Error: non-constant expression" with -inline
- Bugzilla 4866: Static-to-dynamic converted manifest constant array gets non-converted type in static/constraint if
- Bugzilla 4869: auto return + inheritance + modules = compiler crashes(toctype.c)
- Bugzilla 4873: Assertion failure: '0' on line 1483 in file 'expression.c'
- Bugzilla 4882: std.traits hasUnsharedAliasing does not work for function type.
- Bugzilla 4897: CodeView: No locals or parameters are shown when debugging, because of missing function info
- Bugzilla 4890: GC.collect() deadlocks multithreaded program.
- Bugzilla 4925: [ICE] segfault with module-scope assert(0)
- Bugzilla 4926: ICE: PREC_zero assertion failure due to unset precedence
- Bugzilla 4938: Regression(2.047) dmd segfault when compiling
- Bugzilla 4941: Built-in tuple slice boundaries are not CTFE'd
- Bugzilla 4949: ICE on invalid static if using value of 'this'
- Bugzilla 4951: InternetAddress fails to resolve host when multithreading.
- Bugzilla 4959: std.conv.parse error "no digits seen" on string starting with zero.
- Bugzilla 4992: ICE(glue.c) or segfault: using int[new]
- Bugzilla 5003: regex(replace with delegate) sample doesn't work.
- Bugzilla 5026: ICE(expression.c) Incomplete mixin expression + char[] to char assignment
- Bugzilla 5049: std.algortihm.bringToFront() returns wrong value.
- Bugzilla 5052: take!(Take!R) should return Take!R, not Take!(Take!R).
- Bugzilla 5071: passing value by ref to a function with an inner dynamic closure results in a wrong code
New/Changed Features
- std.algorithm: reduce now works with non-range-based iteration, such as opApply.
- std.numeric: Added FFT.
- std.path: Changed sep, altsep etc. to manifest constants (enum).
- std.process: Added environment, an AA-like interface for environment variables.
- std.range: Iota, Stride, Transversal, FrontTransveral now support slicing where possible.
- std.range: Added support for moveFront() and assignable elements in several higher-order ranges.
- std.range: Added Lockstep, hasLvalueElements.
- std.range: Added virtual function-based wrappers (InputRangeObject, OutputRangeObject) for when a binary interface to a range is required.
- std.typecons: Added convenience functions for Rebindable.
- std.traits: Added isAssignable, isIterable, ForeachType, isSafe, isUnsafe, EnumMembers.
- std.traits: hasLocalAliasing, hasLocalObjects and hasLocalRawAliasing are now hasUnsharedAliasing, hasUnsharedObjects and hasUnsharedRawAliasing. Aliases to the old names are included for now for backwards compatibility.
- std.typetuple: Added anySatisfy.
- std.array: Modified Appender's interface to fix memory issues. Note that appending via ~= and using appender on the same array will not interleave anymore.
- Bugzilla 2477: Trailing comma in array literal sometimes accepted, sometimes not
Bugs Fixed
- Andrej Mitrovic updated the samples/d code
- Unlisted Bug: std.math.pow doesn't work on immutable numbers.
- Unlisted Bug: std.math.pow floating point overload expects both arguments to be exact same type.
- Unlisted Bug: std.path.join("", "foo") returns "/foo" instead of "foo" on Posix.
- Unlisted Bug: std.range.iota() random access primitives inconsistent after popFront on floating point version
- Unlisted Bug: std.algorithm.findAdjacent() [...]
- Bugzilla 190: Cannot forward reference typedef/alias in default value for function parameter
- Bugzilla 1715: Template specialization checks for equality rather than convertibility
- Bugzilla 1970: Templated interfaces not matched
- Bugzilla 2511: Covariant return type doesn't work with circular import
- Bugzilla 2716: Confusion of auto and scope as the class attribute
- Bugzilla 2903: Splitter should be bi-dir if the input range is bi-dir.
- Bugzilla 2951: std.random.dice() should be templated on proportions.
- Bugzilla 2958: std.getopt RangeError on missing arg
- Bugzilla 3046: Segfault with C++ static variable (Linux only)
- Bugzilla 3123: std.algorithm.zip fails on 'lazy' ranges
- Bugzilla 3294: forward reference to inferred return type of function call
- Bugzilla 3312: std.string.count should use const(char)[], not immutable.
- Bugzilla 3348: Documentation for many std.process functions has disappeared
- Bugzilla 3361: code in std.zlib concatenates void[] arrays
- Bugzilla 3418: link error with cast(ulong)(ulong*real)
- Bugzilla 3544: optlink termination 0041338f with recursive nested functions
- Bugzilla 3554: Ddoc generats invalid output for documentation comments with non paired paranthasis
- Bugzilla 3627: -of with a filename with a double extension confuses linker
- Bugzilla 3877: std.range.chain do not manage infinite ranges correctly
- Bugzilla 3894: std.range.Stride!R requires R.front() and R.back() to return by reference
- Bugzilla 3935: opBinary is instantiated with "="
- Bugzilla 3946: schwartzSort - SwapStrategy always unstable
- Bugzilla 3979: Order-of-compilation and forward reference errors
- Bugzilla 3996: Regression(2.041) ICE(glue.c) Passing struct as AA template parameter (Algebraic with struct)
- Bugzilla 4009: OPTLINK ruins the day yet again
- Bugzilla 4173: Regression(2.037) Explicitly instantiated templates still try to do IFTI in some cases
- Bugzilla 4177: __ctfe can't be used in pure functions
- Bugzilla 4278: allow inlining of super calls (undo limitations of bug3500's fix)
- Bugzilla 4291: Pure functions cannot access mixed in variables
- Bugzilla 4292: CommonType fails for singular alias value.
- Bugzilla 4302: Regression(2.046, 1.061): compiler errors using startsWith in CTFE
- Bugzilla 4345: std.range.take!string: "Nonsensical finite range with slicing but no length".
- Bugzilla 4346: More flexible std.array.array.
- Bugzilla 4363: Some phobos ranges are not forward ranges (but should be).
- Bugzilla 4381: Length attribute for std.typecons.Tuple.
- Bugzilla 4387: std.range.Cycle assumes lvalue elements.
- Bugzilla 4388: std.range.Radial assumes lvalue elements.
- Bugzilla 4402: std.range.Zip doesn't work w/ non-lvalue ranges.
- Bugzilla 4403: std.range.FrontTransversal assumes lvalue elements.
- Bugzilla 4404: std.range.Transversal assumes lvalue elements.
- Bugzilla 4408: Ambiguity when using std.algorithm.splitter with generic ranges.
- Bugzilla 4430: Regression(2.037) erroneous matching on specialized template function
- Bugzilla 4455: Taking the sqrt of an integer shouldn't require an explicit cast.
- Bugzilla 4464: std.range.take does not always return Take!R.
- Bugzilla 4518: to!string(enum w/invalid value) produces a somewhat unhelpful error
- Bugzilla 4564: ICE on undefined variable in foreach over 0 .. undef
- Bugzilla 4603: array(iota(1, 0)) error.
- Bugzilla 4643: Shared values are unwritable.
- Bugzilla 4645: to!string(const char*) in library causes Optlink to issue warning
- Bugzilla 4652: Compiler hangs on template with zero-length tuple and another argument
- Bugzilla 4655: Regression(1.063, 2.048) goto to a try block ICEs
- Bugzilla 4676: Overload resolution rejects valid code when mixing variadics, non-variadics
- Bugzilla 4681: Appender access violation
- Bugzilla 4691: Incorrect comparison of double and long
- Bugzilla 4700: to!float("0") fails
- Bugzilla 4721: compilation slow when compiling unittests on dcollections
- Bugzilla 4748: Shadowing declaration error in std.string.tolower
- Bugzilla 4751: Regression(1.062, 2.047) ICE(constfold.c) >> after error
- Bugzilla 4752: fail_compilation/fail345.d asserts in expression.c
- Bugzilla 4771: fail_compilation/fail274.d hits a halt in iasm.c
- Bugzilla 4789: std.algorithm.sort bug
- Bugzilla 4810: dotProduct problem with ints
- Bugzilla 4826: Regression(2.041) "cannot create associative array" and compiler crash
- Bugzilla 4828: ICE w/ non-boolean dot expression sth.template_instance in static if
- Bugzilla 4834: Implicit sharing via delegates in std.concurrency
New/Changed Features
- std.complex: New Complex.toString() syntax.
- std.string: icmp() now works with all built-in string types.
- Bugzilla 4077: Bugs caused by bitwise operator precedence
- Bugzilla 4080: Patch for building dynamic libraries on Mac OS X
Bugs Fixed
- Unlisted Bug: std.algorithm.filter not a forward range
- Unlisted Bug: std.algorithm.Uniq requires a bidirectional range
- Unlisted Bug: std.algorithm.Uniq missing a save() function
- Unlisted Bug: std.algorithm.Group missing a save() function
- Unlisted Bug: std.traits.isAssociativeArray reports true for structs w/ keys, values properties
- Unlisted Bug: gc_query returns 0 for attr when called on interior pointers
- D/112964: capacity can return a value < length
- Bugzilla 978: std.utf's toUTF* functions accept some invalid and reject some valid UTF
- Bugzilla 996: Error in doc on implicit conversion between pointer and array
- Bugzilla 1418: tupleof bug on nested classes
- Bugzilla 1678: ref with varargs generates invalid code
- Bugzilla 2275: std.utf.toUTF16z() should return const(wchar)*
- Bugzilla 2627: std.traits.hasAliasing reports true for static arrays
- Bugzilla 2872: Length, opIndex for Map
- Bugzilla 2931: Initialization struct with array from another struct
- Bugzilla 3202: std.math.pow cause dead loop
- Bugzilla 3326: $ in delegate literal causes Access Violation
- Bugzilla 3355: std.string.cmp works incorrectly for mixed-type and different-length strings
- Bugzilla 3386: to!bool(string) is not implemented
- Bugzilla 3436: std.functional.compose with only one function
- Bugzilla 3439: std.range.Sequence.opIndex not consistent after calling popFront().
- Bugzilla 3447: std.file uses unconventional file permissions
- Bugzilla 3528: FreeBSD patches for druntime.
- Bugzilla 3560: foreach over nested function generates wrong code
- Bugzilla 3569: DMD Stack Overflow with a struct member function inside a C-style struct initializer
- Bugzilla 3604: extern(C) callable function with array parameters broken
- Bugzilla 3679: Regression(2.031) template forward reference regression
- Bugzilla 3706: delegates of interfaces with multiple inheritance fail
- Bugzilla 3716: Regression (2.037) with multi dimensional array literals
- Bugzilla 3782: The POSIX sys/un.h header
- Bugzilla 3853: core.sys.posix.stdio.pclose is missing
- Bugzilla 3872: std.algorithm.filter could become bidirectional if its input range is bidir
- Bugzilla 3874: std.range.stride assumes a bidirectional input range
- Bugzilla 3917: opEquals for Ojbect could be more efficient
- Bugzilla 3937: os.path.dirname fails on absolute path
- Bugzilla 3961: Error with to!(somestruct)
- Bugzilla 3983: Regression(2.037): struct with == can't be member of struct with template opEquals
- Bugzilla 4109: (reopened) writeln doesn't work with empty static array
- Bugzilla 4171: std.random.uniform does not work for a range of characters
- Bugzilla 4191: [FreeBSD] real constants are rounded to double precision
- Bugzilla 4198: [FreeBSD] imprecision in decimal floating-point literals
- Bugzilla 4238: Segfault(statement.c): with(typeof(int))
- Bugzilla 4260: windows & basename
- Bugzilla 4267: forward reference error when 2-fold aliasing a template instance
- Bugzilla 4303: __traits(compiles) returns wrong result when used recursively
- Bugzilla 4305: Take, Chain on top of ranges w/o moveFront()
- Bugzilla 4307: spawn()'ed thread doesn't terminate
- Bugzilla 4314: Regression(1.062): Expression array1 && array2 doesn't compile
- Bugzilla 4327: std.container.Array.Range.~this() tries to call free(T[])
- Bugzilla 4339: Struct destructor + invariant + struct parameter = horrific error message
- Bugzilla 4356: Copy constructor not called under extremely mysterious circumstances
- Bugzilla 4362: std.range.repeat and cycle do not have a .save() method
- Bugzilla 4363: std.algorithm.Until is not a forward range
- Bugzilla 4369: Multiple bugs in GC minimize()
- Bugzilla 4370: POSIX monitor attribute not being used
- Bugzilla 4396: mkdir race prevents concurrent compiling with DMD using make -j
- Bugzilla 4400: D2 GC doesn't allocate with 16 bytes alignment
- Bugzilla 4406: Typo (bug) in std.concurrency
- Bugzilla 4412: Array capacity growth spikey and the ratio approaches 1.0
- Bugzilla 4443: Optimizer produces wrong code for || or && with struct arrays
- Bugzilla 4452: Incorrect result of BigInt ^^ long
- Bugzilla 4470: Problems with std.bigint mod and divide
- Bugzilla 4503: forward reference to aliased template instance
- Bugzilla 4506: Regression(2.034): -O flag breaks some recursive functions
- Bugzilla 4514: Regression: Cannot cast from X* to X
- Bugzilla 4516: Regression(2.040): forward declaration of enum not supported
- Bugzilla 4551: D2 Language Docs: http://www.digitalmars.com/d/2.0/arrays.html
- Bugzilla 4569: extern(c++) doesn't understand const types, produces bad mangled symbol
- Bugzilla 4570: ElementType!(void[]) shows error message
- Bugzilla 4578: Regression(2.047,1.062): ICE(cgcod.c): var+arr[]
- Bugzilla 4590: Spec incorrectly describes array appending and memory stomping
New/Changed Features
- Changed "op=" to just "op" for template argument to opOpAssign
- std.algorithm: Added save() to forward ranges; added split() using only one element as separator; added indexOf; fixed unlisted bug in startsWith and endsWith; added skipOver(); added canFind().
- std.array: Added implementation of save() for T[]s.
- std.concurrency: Eliminated spurious unittest stdout messages.
- std.container: Added.
- std.conv: Added file and line information to conversion errors; added brackets '[' and ']' around arrays and associative arrays as defaults; added emplace() for non-class types.
- std.file: Replaced exception upon out-of-memory error with assert(0).
- std.functional: toDelegate now accepts callable(function pointers, delegates and objects implement opCall)
- std.path: Made basename() generic in string type.
- std.range: Added the existence of the property save as a condition for isForwardRange; added save to the range defined within; replaced a couple of awkward front() implementations; defined module-level moveFront() and range member moveFront() where appropriate; added @property maxLength to Take; arranged things such that take() for slice-able ranges returns the same type as the slice; eliminated SListRange; defined iota() with one argument; moved BinaryHeap within.
- std.regex: Qualified indexOf with std.algorithm.
- std.regexp: Qualified indexOf with std.algorithm.
- std.stdio: Added an error message to enforce() in rawRead().
- std.string: Improved indexOf(), tolower(), splitter(), chomp().
- std.traits: Added templates to get compile-time information about functions.
- std.typecons: Added AutoImplement.
- std.utf: Eliminated decodeFront() and decodeBack() - they aren't needed since strings are bidirectional ranges.
- Bugzilla 2008: Poor optimization of functions with ref parameters
- Bugzilla 3793: Functions with static arrays as arguments are not inlined
- Bugzilla 4296: Reduce parasitic error messages
Bugs Fixed
- Bugzilla 1193: regression: "matches more than one template declaration" doesn't list the location of the conflicting templates
- Bugzilla 1894: scope(exit) is ignored except in compound statements
- Bugzilla 1941: missing line on inaccesable external private module member
- Bugzilla 2127: inliner turns struct "return *this" from by-value into by-ref
- Bugzilla 2276: Error message missing line number on array operation
- Bugzilla 2546: Array Ops silently fail when no slice symbol is used.
- Bugzilla 2738: Rebindable should work for interfaces.
- Bugzilla 2835: std.socket.TcpSocket doesn't actually connect
- Bugzilla 2881: x.stringof returns typeof(x).stringof when x is an enum
- Bugzilla 3064: Invalid array operation accepted, generates bad code
- Bugzilla 3088: std.xml.check() fails on xml comments
- Bugzilla 3139: compiler dies "Error: out of memory" with case range
- Bugzilla 3200: std.xml doesn't follow spec for Tag.text
- Bugzilla 3323: Segfault or ICE(e2ir.c) using struct with destructor almost anywhere
- Bugzilla 3398: Attributes inside a union screws data alignment
- Bugzilla 3465: isIdeographic can be wrong in std.xml
- Major improvements to CustomFloat, fixing Bugzilla 3520: std.numeric.CustomFloat horribly broken
- Bugzilla 3538: Default value of alias template parameter is instantiated only once.
- Bugzilla 3547: for option -od for relative path the path is added twice
- Bugzilla 3548: ICE occurs when an array is returned from a function is incorrectly used in an array op expression.
- Bugzilla 3604: extern(C) callable function with array parameters broken
- Bugzilla 3651: mangleof broken for enums
- Bugzilla 3653: Problem sorting array of Rebindable
- Bugzilla 3658: Crashing on vector operations (Mac only)
- Bugzilla 3662: Wrong compile error within struct constructor and C-style initializer
- Bugzilla 3667: Regression(D2 only): broken out(result) in contracts
- Bugzilla 3786: bug in std.string.removechars
- Bugzilla 3854: Error on static initialization of arrays with trailing comma.
- Bugzilla 3873: std.range.repeat should have popBack defined
- Bugzilla 3876: std.range.Take back/popBack methods don't work correctly
- Bugzilla 3880: std.regex functions with const/immutable Regex object
- Bugzilla 4003: The result changes only with the order of source files.
- Bugzilla 4045: [CTFE] increasing array length
- Bugzilla 4052: [CTFE] increment from array item
- Bugzilla 4056: Template instantiation with bare parameter not documented
- Bugzilla 4073: core.cpuid crashes
- Bugzilla 4078: [CTFE] Failed return of dynamic array item
- Bugzilla 4084: Ignored missing main() closing bracket
- Bugzilla 4109: writeln doesn't work with empty static array
- Bugzilla 4143: fix warnings in dmd build
- Bugzilla 4156: Segfault with array+=array
- Bugzilla 4169: building dmd with a modern gcc produces a buggy compiler
- Bugzilla 4175: linux.mak doesn't declare sufficient dependencies to support parallel builds
- Bugzilla 4188: std.file.remove throws Exception on success
- Bugzilla 4193: Regression 2.046, ICE(expression.c): initialising class member with const forward reference
- Bugzilla 4202: Changset 1517 doesn't compile
- Bugzilla 4207: std.cover.setDestDir does not work.
- Bugzilla 4208: druntime should not depend on Phobos
- Bugzilla 4212: DWARF: void arrays cause gdb errors
- Bugzilla 4213: Strange behaviour with static void[] arrays
- Bugzilla 4219: hasAliasing does not care about immutable
- Bugzilla 4220: I cannot apply @safe to intrinsic operation(eg: std.math.sqrt)
- Bugzilla 4228: std.array.replace contains 2 bugs
- Bugzilla 4230: version(unittest)
- Bugzilla 4231: Solitary opUnary Postincrement and Postdecrement user defined operators are broken.
- Bugzilla 4242: ICE(module.c): importing a module with same name as package
- Bugzilla 4249: std.regex fails to compile with debug=regex
- Bugzilla 4252: [CTFE] No array bounds checking in assignment to char[] array
- Bugzilla 4257: ICE(interpret.c): passing parameter into CTFE as ref parameter
- Bugzilla 4259: Header generation omits leading '@' for properties
- Bugzilla 4262: Header generation omits 'enum' for enum declarations
- Bugzilla 4263: Header generation omits '@system' attribute
- Bugzilla 4270: Missing line number in 'can only catch class objects' error message
- Bugzilla 4300: BigInt * int doesn't work well
New/Changed Features
- Add hints for missing import declarations.
- Speed up compilation.
- All length methods in Phobos are now a @property.
- Bugzilla 1001: print stack trace (in debug mode) when program die
Bugs Fixed
- Fix hanging problem on undefined identifiers.
- Bugzilla 461: Constant not understood to be constant when circular module dependency exists.
- Bugzilla 945: template forward reference with named nested struct only
- Bugzilla 1055: union forward reference "overlapping initialization" error
- Bugzilla 2085: CTFE fails if the function is forward referenced
- Bugzilla 2386: Array of forward referenced struct doesn't compile
- Bugzilla 3945: AssertExpression message should implicitly convert to const char[]
- Bugzilla 4015: forward reference in alias causes error
- Bugzilla 4016: const initializer cannot forward reference other const initializer
- Bugzilla 4042: Unable to instantiate a struct template.
- Bugzilla 4100: Break and continue to label should mention foreach
- Bugzilla 4116: object.di does not match object_.d
- Bugzilla 4146: Unavailable: core.sys.posix.sys.wait.waitid()
- Bugzilla 4184: associative array with certain key types results in corrupt values during iteration
New/Changed Features
- Improve spelling checking distance to 2.
- Now all unittests are run, even if some fail
- Many small improvements to error diagnostics and recovery
Bugs Fixed
- Bugzilla 1079: gdb: Dwarf Error: Cannot find DIE at 0xb705 referenced from DIE at 0x250
- Bugzilla 2437: ICE(tocsym.c, !needThis()) - default struct argument
- Bugzilla 2935: ICE(out.c) using struct with constructor as function default argument
- Bugzilla 2549: Segfault on array multiplication.
- Bugzilla 3066: Array operation without a slice as the lvalue accepted, bad codegen
- Bugzilla 3207: gdb: Push D patches upstream
- Bugzilla 3415: broken JSON output
- Bugzilla 3522: ICE(cg87.c): variable*array[].
- Bugzilla 3987: [gdb] Invalid DWARF output for function pointers
- Bugzilla 3974: ICE(init.c): Static array initializer with more elements than destination array
- Bugzilla 4036: Segfault with -inline and literal of struct containing union
- Bugzilla 4037: [gdb] Invalid DWARF output for wchar
- Bugzilla 4038: [gdb] Invalid DWARF output for function pointers with ref args
- Bugzilla 4067: [CTFE] Code inside try-catch blocks is silently ignored
- Bugzilla 4072: Stack overflow on recursive template expansion inside contract
- Bugzilla 4081: cannot compile the dmd on FreeBSD 8
- Bugzilla 4089: crash when creating JSON output for incomplete struct
- Bugzilla 4093: Segfault(interpret.c): with recursive struct templates
- Bugzilla 4105: Stack overflow involving alias template parameters and undefined identifier
- Bugzilla 4108: ICE(cod2.c): zero-length static array in function call
- Bugzilla 4118: std.conv.to!SomeStruct("hello") crashes compiler
- Bugzilla 4131: break does not work correctly with foreach and associative arrays
New/Changed Features
- .init property for static arrays is now an array literal
- Improved speed of associative arrays
- std.bigint has been completely replaced with a faster implementation. Multiplication is now 5 times faster, division is 300 times faster, and squaring is 10 times faster. For large numbers (~5000 words), the speedup is 5 times larger than this.
Bugs Fixed
- Fixed memory corruption problem with array appends
- Bugzilla 122: DDoc newline behaviour produces suboptimal results
- Bugzilla 1628: Ddoc produces invalid documentation for --- blocks
- Bugzilla 2609: No documentation generated for destructor
- Bugzilla 3808: Assertion Failure : Assertion failure: 'classinfo->structsize == CLASSINFO_SIZE' on line 870 in file 'toobj.c'
- Bugzilla 3884: Segfault: defining a typedef with an invalid object.d
- Bugzilla 3911: Associative array in CTFE crashes compiler
- Bugzilla 3958: mixin(non-static method) crashes compiler
- Bugzilla 3972: Regarding module with name different from its file name
- Bugzilla 3984: Segfault(interpret.c): CTFE using struct constructor on a local static variable
- Bugzilla 3986: Struct constructors bypass default initialization of member variables
- Bugzilla 4002: dmd.conf and binary path in dmd -v output
- Bugzilla 4004: DMD 2.042 CTFE regression with functions taking ref parameters
- Bugzilla 4005: std.c.stdlib.exit in CTFE and more
- Bugzilla 4011: Incorrect function overloading using mixins
- Bugzilla 4019: [CTFE] Adding an item to an empty AA
- Bugzilla 4020: [ICE][CTFE] struct postblit in CTFE
- Bugzilla 4023: std.math.hypot() returns infinity when either argument is zero
- Bugzilla 4027: Closures in CTFE generate wrong code
- Bugzilla 4029: CTFE: cannot invoke delegate returned from function
New/Changed Features
Bugs Fixed
- Add base class destruction to clear() in object.d
- Bugzilla 3842: ICE(expression.c) using pointer in CTFE
- Bugzilla 3885: No multithread support for Windows DLL
- Bugzilla 3899: CTFE: poor error message for use of uninitialized variable
- Bugzilla 3900: CTFE: Wrong return value for array.var assignment
- Bugzilla 3901: PATCH: Nested struct assignment for CTFE
- Bugzilla 3902: Definition of opCmp
- Bugzilla 3912: pure static nested functions are not recognized as pure
- Bugzilla 3914: Struct as argument that fits in register has member accessed wrong
- Bugzilla 3919: ICE(expression.c, 9944): * or / with typedef ireal
- Bugzilla 3920: Assertion failure: '0' on line 10018 in file 'expression.c'
- Bugzilla 3930: AAs horribly broken
New/Changed Features
- __traits allMembers and and derivedMembers now return a tuple of strings rather than an array of strings. Enclose __traits in [ ] to make array literal. This makes it possible for foreach statements to iterate at compile time over it.
- Interface member functions can now have contracts.
- Added new operator overloading regime.
- Warnings no longer halt the parsing/semantic passes, though they still return an error status and still do not generate output files. They also no longer count as errors when testing with "compiles" traits.
- Added -wi switch for Bugzilla 2567
- Mixin template definitions should be preceded with mixin
- Add !in operator.
- Associative array contents can now be compared for equality
- Use of length inside of [ ] is now deprecated, use $ instead
- Added toDelegate() to std.functional to convert function pointers to delegates.
- Implemented attributes for constructors.
- Implemented qualifiers for struct literals, like immutable(S)(1,2,3)
- Array equality can now be done with differing array element types.
- Add simple spell checking.
- Bugzilla 3378: [tdpl] ++x should be an lvalue
- string, wstring are now bidirectional (not random) ranges
- std.algorithm: defined move with one argument; levenshtein distance generalized to with all forward ranges; take now has swapped arguments
- std.array: empty for arrays is now a @property; front and back for a string and wstring automatically decodes the first/last character; popFront, popBack for string and wstring obey the UTF stride
- std.conv: changed the default array formatting from "[a, b, c]" to "a b c"
- std.range: swapped order of arguments in take
- std.stdio: added readln template
- std.variant: now works with statically-sized arrays and const data
- std.traits: added isNarrowString
- The default type for [1,2,3] is now int[] rather than int[3].
Bugs Fixed
- Bugzilla 2321: spec on inline asm can be misunderstood
- Bugzilla 2463: No line number in "statement is not reachable" warning
- Bugzilla 3029: Bug in array value mangling rule
- Bugzilla 3306: bad function/delegate literal generated into header files
- Bugzilla 3373: bad codeview debug info for long and ulong
- Posix only, Bugzilla 3420: [PATCH] Allow string import of files using subdirectories
- Bugzilla 3450: incorrect result for is (typeof({ ... }())) inside a struct
- Bugzilla 3453: Linking order affects proper execution (Mac OSX only)
- Bugzilla 3491: typeof((string[string]).init) == AssociativeArray!(string, string), doesn't implicitly convert to string[string].
- Bugzilla 3500: super behaves differently with -inline
- Bugzilla 3558: Optimizer bug results in false if condition being taken
- Bugzilla 3582: core.stdc.ctype functions are not pure
- Bugzilla 3619: Thread crash on exit
- Bugzilla 3637: Array append patch to prevent stomping and to enhance thread-local append performance
- Bugzilla 3644: Wrong UCHAR_MAX value in module core.stdc.limits
- Bugzilla 3670: Declarator grammar rule is broken
- Bugzilla 3689: Grammar does not allow const(int)
- Bugzilla 3692: ICE(mtype.c) with associative arrays when std.variant is imported
- Bugzilla 3695: __EOF__ token not documented
- Bugzilla 3697: StructTemplateDeclaration and others missing constraint in rule
- Bugzilla 3710: Typo in allMembers description?
- Bugzilla 3736: corrupted struct returned by function with optimizations (-O)
- Bugzilla 3737: SEG-V at expression.c:6255 from bad opDispatch
- Bugzilla 3763: std.stdio.readlnImpl absurdly inefficient and overflows stack
- Bugzilla 3768: reapeted quotes in ddoc.html
- Bugzilla 3769: Regression: Segfault(constfold.c) array literals and case statements
- Bugzilla 3775: Segfault(cast.c): casting no-parameter template function using property syntax
- Bugzilla 3776: Wrong CHAR_MIN value in module core.stdc.limits
- Bugzilla 3781: ICE(interpret.c): using no-argument C-style variadic function in CTFE
- Bugzilla 3803: compiler segfaults
- Bugzilla 3840: Jump to: section in the docs should be sorted
New/Changed Features
- Clarification: function returns are not lvalues
- Added shared static constructors/destructors, regular static constructors/destructors now deal with TLS
- Add -map command line switch
- Add @disable attribute
- Delegates and function pointers may be used in CTFE
- Delegate literals and function literals may be used in CTFE
- Lazy function parameters may now be used in CTFE
- Slicing of char[] arrays may now be used in CTFE
- added static/final function implementations to interfaces
- added getOverloads, identifier, and isStaticFunction traits.
- ModuleInfo changed from class to struct
- Bugzilla 3556: version(CTFE)
- Bugzilla 3728: getOverloads and identifier traits
Bugs Fixed
- Added TLS support for OSX
- Bugzilla 47: Internal error: cg87 3316
- Bugzilla 1298: CTFE: tuple foreach bugs
- Bugzilla 1790: CTFE: foreach(Tuple) won't compile if Tuple contains string
- Bugzilla 2101: CTFE: Please may I use mutable arrays at compile time?
- Bugzilla 2066: to!(string)(int) into CTFE-compatible
- Bugzilla 3488: Segfault(expression.c): enum declared with struct static initializer
- Bugzilla 3535: struct constructors don't work in CTFE
- Bugzilla 3552: ICE(mtype.c): declaring a variable called 'AssociativeArray' then using an AA.
- Partial fix for Bugzilla 3569, stops the stack overflow
- Bugzilla 3600: template instantiation with empty tuple
- Bugzilla 3660: Templates and shared functions don't mix
- Bugzilla 3668: foreach over typedef'd array crashes dmd
- Bugzilla 3671: x^^3 gives wrong result when x is a floating-point literal
- Bugzilla 3674: forward reference error with multiple overloads with same name
- Bugzilla 3675: Regression: Struct literals cannot be initialized with another struct literal
- Bugzilla 3687: Array operation "slice times scalar" tramples over memory
- Bugzilla 3719: forward references can cause out-of-memory error
- Bugzilla 3723: Regression: forward referenced enum
- Bugzilla 3724: bug in Expression::arraySyntaxCopy (null pointer dereference on struct->union->struct)
- Bugzilla 3726: Regression: ICE(mangle.c 81): struct forward reference with static this
- Bugzilla 3727: lots of "deffering SomeStructName" messages when compiling
- Bugzilla 3734: [patch] src/traits.c does not compile with gcc (Ubuntu 4.4.1-4ubuntu8) 4.4.1
- Bugzilla 3740: Regression: class with fwd reference of a nested struct breaks abstract
New/Changed Features
Bugs Fixed
- Bugzilla 3663: struct forward reference regresssion
- Bugzilla 3664: struct forward declaration causes enum to conflict with itself
New/Changed Features
- Added core.cpuid in Druntime
- Bugzilla 3514: opApply should be the first-choice foreach iteration method.
- Bugzilla 3577: Wrong precedence for opPow
- Added auto ref functions
- Added function template auto ref parameters
- Added isRef, isOut and isLazy to __traits
- Transporting return type from args to return type, see DIP2
Bugs Fixed
- Bugzilla 45: Internal error: cgcod 1594
- Bugzilla 46: Constant folding with long doubles
- Bugzilla 282: Bizarre circular import nested name invisibility issue
- Bugzilla 390: Cannot forward reference enum nested in struct
- Bugzilla 400: forward reference error; no propety X for type Y (struct within struct)
- Bugzilla 1160: enums can not be forward referenced
- Bugzilla 1564: Forward reference error for enum in circular import
- Bugzilla 2029: Typesafe variadic functions don't work in CTFE
- Bugzilla 2816: Sudden-death static assert is not very useful
- Bugzilla 3270: pure functions returning struct
- Bugzilla 3443: Thread.thread_needLock() should be nothrow
- Bugzilla 3455: Some Unicode characters not allowed in identifiers
- Bugzilla 3458: int fsync(int) commented out in core.sys.posix.unistd
- Bugzilla 3476: C-style initializer for structs must be disallowed for structs with a constructor
- Bugzilla 3575: CTFE: member structs not initialized correctly
- Bugzilla 3583: Unsigned right shift works the same as signed right shift.
- Bugzilla 3584: DeclDef rule is missing entries
- Bugzilla 3585: Duplicate clauses in EqualExpression and RelExpression rules
- Bugzilla 3587: Aggregate rule references undefined Tuple
- Bugzilla 3588: WithStatement rule references unspecified Symbol
- Bugzilla 3589: BaseClassList and InterfaceClasses rules are incorrect, missing ','
- Bugzilla 3590: FunctionParameterList rule is missing
- Bugzilla 3591: TemplateIdentifier rule is misspelled
- Bugzilla 3592: ClassTemplateDeclaration and FunctionTemplateDeclaration rules are unreferenced
- Bugzilla 3593: IntegerExpression rule unspecified
- Bugzilla 3594: AsmPrimaryExp rule references unspecified rules
- Bugzilla 3595: Several rules are missing ':' after rule name
- Bugzilla 3596: Need alias for using std.algorithm.remove
- Bugzilla 3601: Debug and Release builds of DMD produce different object files
- Bugzilla 3611: Enum forward referencing regression
- Bugzilla 3612: ExpressionList is undefined
- Bugzilla 3617: CTFE: wrong code for if(x) where x is int or smaller
- Bugzilla 3621: implicit conversion to const rules need tightening
- Bugzilla 3633: Optimizer causes access violation
- Bugzilla 3641: alias shared T U does not work
- Bugzilla 3645: manifest constant (enum) crashes dmd
- Bugzilla 3647: non-function opDispatch crashes dmd
New/Changed Features
- Conditional expressions ?: can now be modifiable lvalues.
- The type inferred from an ArrayLiteral is now a dynamic array, not a static one.
- Added support for op= for array.length
- Array and associative array types are now determined by using ?: across all the elements, not just using the first one.
- Array concatenation with elements now allows implicit conversion of the elements to the array element type.
- No more comma operators allowed between [ ].
- ClassInfo now merged into TypeInfo_Class.
- Bugzilla 3379: [tdpl] Parameter names not visible in the if clause of a template
- Bugzilla 3380: [tdpl] typeid(obj) should return the dynamic type of the object
- Removed -safe command line switch, added -noboundscheck command line switch.
- Bugzilla 3481: PATCH: opPow(), x ^^ y as a power operator
- Added opDispatch
- properties can only have 0 or 1 arguments
- properties cannot be overloaded with non-properties
- std.math: Added FloatControl, IeeeFlags for enabling floating-point exceptions.
- std.math: Inverse trig functions are now pure nothrow.
Bugs Fixed
- std.array: Fixed unlisted bug in array().
- Bugzilla 111: appending a dchar to a char[]
- Bugzilla 2664: OSX standard math functions are less accurate
- Bugzilla 2802: VariantN.opCmp!(T) fails when T != VariantN
- Bugzilla 2967: spec does not mention that inline asm is a valid "return" statement
- Bugzilla 2977: std.random.unpredictableSeed() should use thread ID somewhere
- Bugzilla 3115: >>> and >>>= generate wrong code
- Bugzilla 3171: % not implemented correctly for floats
- Bugzilla 3311: std.range.chain shouldn't have opIndexAssign if arguments aren't mutable
- Bugzilla 3375: [tdpl] Ternary operator doesn't yield an lvalue
- Bugzilla 3381: [tdpl] Incorrect assessment of overriding in triangular-shaped hierarchy
- Bugzilla 3388: [tdpl] contracts should allow throw expressions
- Bugzilla 3390: [tdpl] out(result) contract should not be able to rebind result
- Bugzilla 3407: [tdpl] Compiling with -safe -release must keep all bound checks
- Bugzilla 3433: [tdpl] Comparing structs for equality is not member-by-member
- Bugzilla 3469: ICE(func.c): Regression. Calling non-template function as a template, from another module
- Bugzilla 3478: "no effect in expression" error on return to void
- Bugzilla 3494: Segfault(mtype.c) using typeof(return) inside an auto function
- Bugzilla 3495: Segfault(typinf.c) instantiating D variadic function with too few arguments
- Bugzilla 3496: ICE(cgelem.c, optimizer bug) cast(void *)(x&1)== null.
- Bugzilla 3502: Fix for dropped Mac OS X 10.5
- Bugzilla 3521: Optimized code access popped register
- Bugzilla 3540: Another DWARF line number fix
- Bugzilla 3551: nested struct => dmd adds a hidden pointer
- Bugzilla 3553: ICE when a function argument defaults to __LINE__
New/Changed Features
- Static arrays are now passed by value to functions rather than by reference
- std.algorithm: Add hasLength requirement to topN; implemented topN for two non-adjacent ranges; added replaceTop function to BinaryHeap; changed BinaryHeap.top to return ref.
- std.ctype: Add pure to isalnum, isalpha, iscntrl, isdigit, islower, ispunct, isspace, isxdigit, isgraph, isprint, isascii, toupper.
- std.date: Implementation change and unittest for isLeapYear and daysInYear. Made both pure as well.
- std.encoding: Added function count().
- std.md5: Added explicit pass-by-ref for fixed-size buffers.
- std.numeric: Added gcd.
- std.random: Added static checks for the parameters of the linear congruential generator.
- std.range: Reinstated some unittests; fixed Cycle to work with the new fixed-size arrays.
- std.typecons: Added alias 'expand' for Tuple.field.
- std:utf: Added count function and changed the encode function to take fixed-size array by reference.
- Bugzilla 3446: Rename float.min to float.min_normal
Bugs Fixed
- std.range: Fixed unlisted bug in Transposed.
- Problem with complicated array op expressions
- Bugzilla 195: DDoc generates bad output when example contains "protected" attribute
- Bugzilla 424: Unexpected OPTLINK Termination at EIP=0044C37B (too many fixups)
- Bugzilla 1117: ddoc generates corrupted docs if code examples contain attributes with colons
- Bugzilla 1812: DDOC - Unicode identifiers are not correctly marked.
- Bugzilla 2694: alias pure nothrow XXX; is not pure nothrow!
- Bugzilla 2862: ICE(template.c) using type tuple as function argument
- Bugzilla 3035: cannot have const/invariant out parameter of type shared
- Bugzilla 3102: Incorrectly matching type as shared (two cases with is expressions)
- Bugzilla 3269: pure functions silently become nothrow
- Bugzilla 3292: ICE(todt.c) when using a named mixin with an initializer as template alias parameter
- Bugzilla 3349: typeid(shared(T)) generates wrong value
- Bugzilla 3367: Regression: struct initialization no longer supports ctor overloads
- Bugzilla 3397: Unintended function call to static opCall
- Bugzilla 3401: Compiler crash on invariant + method overload
- Bugzilla 3422: ICE(cgcod.c) Structs with default initializers bigger than register size cannot be default parameters
- Bugzilla 3423: Destructor and postblit don't get copied to the header file when using -H
- Bugzilla 3426: ICE(optimize.c): struct literal with cast, as function default parameter.
- Bugzilla 3429: Core dump on passing template literal to member function.
- Bugzilla 3432: ICE(e2ir.c): casting template expression
New/Changed Features
- Use -X to generate JSON files.
Bugs Fixed
- Fold in patch from Bugzilla 1170
- Bugzilla 1534: Can't mix in a case statement.
- Bugzilla 2423: Erroneous unreachable statement warning
- Bugzilla 2826: failed assignment gives wrong line number
- Bugzilla 3190: enum doesn't work as the increment in a for loop
- Bugzilla 3316: Functions nested in a pure templated function cannot reference its local variables
- Bugzilla 3352: RangeError in std.conv
- Bugzilla 3385: std.string.split requires a mutable array
- Bugzilla 3392: a cast of this to void in tango.core.Thread is not allowed
New/Changed Features
Bugs Fixed
- Bugzilla 258: Undefined identifier error for circular import
- Bugzilla 1140: ICE(cod1.c) casting last function parameter to 8 byte value
- Bugzilla 1592: dmd fail to resolve class symbol when i put files in a package
- Bugzilla 2687: ICE(statement.c): tuple foreach in an erroneous template.
- Bugzilla 2773: ICE(go.c) array assignment through a pointer, only with -O.
- Bugzilla 2829: ICE(expression.c) static array block-initialized in struct literal
- Bugzilla 3006: ICE(e2ir.c, tocsym.c) template module using array operation
- Bugzilla 3041: Array slices can be compared to their element type: bad codegen or ICE
- Bugzilla 3042: Segfault on incorrect override
- Bugzilla 3101: Stack overflow: declaring aggregate member twice with static if
- Bugzilla 3119: Segfault(expression.c) template function overloads with function with same name in other module
- Bugzilla 3174: ICE(mtype.c): Compiler crash or compiler error with auto returns and const / immutable / invarient / pure
- Bugzilla 3176: Compiler hangs on poorly formed mixin in variadic template
- Bugzilla 3261: compiler crash with mixin and forward reference
- Bugzilla 3286: Default parameter prevents to resolve inter-module circular dependency
- Bugzilla 3301: Undefined identifier error dependent on order of imports when a circular import is involved
- Bugzilla 3325: ICE(func.c) function literal with post-contract
- Bugzilla 3343: Crash by "auto main(){}"
- Bugzilla 3344: ICE(e2ir.c) returning an invalid function from main()
- Bugzilla 3357: ICE(cod1.c) using 'in' with a static char array as AA key
- Bugzilla 3366: Segfault(declaration.c) variadic template with unmatched constraint
- Bugzilla 3374: [tdpl] ICE(init.c): Associative array type not inferred
New/Changed Features
- Phobos is now using the Boost 1.0 license
- Compiler now detects some cases of illegal null dereferencing when compiled with -O
- The result type of the typeid(type) is now the most derived TypeInfo class, rather than the TypeInfo base class
- Bugzilla 2905: Faster +-*/ involving a floating-pointing literal
- Improved performance of int-to-string conversion
Bugs Fixed
- gdb stack trace should work now
- Bugzilla 302: in/out contract inheritance yet to be implemented
- Bugzilla 718: ICE(cgcod.c) with int /= cast(creal)
- Bugzilla 814: lazy argument + variadic arguments = segfault
- Bugzilla 1168: Passing a .stringof of an expression as a template value parameter results in the string of the type
- Bugzilla 1253: array initializers as expressions are not allowed in const arrays
- Bugzilla 1571: Segfault(class.c) const on function parameters not carried through to .di file
- Bugzilla 1731: forward reference of function type alias resets calling convention
- Bugzilla 2202: Error getting type of non-static member of a class
- Bugzilla 2469: ICE(cod1.c) arbitrary struct accepted as struct initializer
- Bugzilla 2697: Cast of float function return to ulong or uint gives bogus value
- Bugzilla 2702: Struct initialisation silently inserts deadly casts
- Bugzilla 2839: ICE(cgcs.c) with int /= imaginary
- Bugzilla 2970: std.path.join with version(Windows)
- Bugzilla 2998: ICE(expression.c) with floating point enum
- Bugzilla 3049: ICE(cod4.c) or segfault: Array operation on void[] array
- Bugzilla 3059: Nonsensical complex op= should be illegal
- Bugzilla 3132: std.string.split should be templated on mutable/const/immutable - closing again after the reopening on 2009-09-03 07:56:25 PDT
- Bugzilla 3160: ICE(cgcod.c 1511-D1) or bad code-D2 returning string from void main
- Bugzilla 3173: ICE(mtype.c) on wrong code (double to long to int conversion)
- Bugzilla 3288: conv.d: using to with const int or long fails to compile.
- Bugzilla 3300: std.string.toupper and tolower should be (const(char)[]), not string
- Bugzilla 3304: Segfault using 'is' with a pointer enum.
- Bugzilla 3305: Segfault(expression.c) with recursive struct template alias expressions
- Bugzilla 3333: std.conv.to!(string, const int) error: cannot modify const
- Bugzilla 3335: minor warning cleanups
- Bugzilla 3336: ICE(glue.c) declaring AA with tuple key, only with -g
- Bugzilla 3340: std.string.split(S1 s, S2 delim) still doesn't work for char[]
- Bugzilla 3353: storage class of a member function is propagated to default arguments
- (unlisted): std.algorithm: bug in reduce when passed const arguments
- (unlisted): std.stdio: fixed documentation example
- (unlisted): std.utf: fixed decodeFront and decodeBack
New/Changed Features
- Improved exception message for assert(0) in Windows -release builds
- Added support for:
a[i].var = e2
and:a[] = e
in CTFE. (thanks, Don!) - Member functions can now be used in CTFE
- Operator overloading can now be used in CTFE
- Nested functions can now be used in CTFE
- CTFE error messages now explain why the function could not be interpreted at compile time
- synchronized member functions now implicitly typed as shared.
- std.algorithm: added minPos
- std.format: added raw specifier for reading
- added File.byChunk
- std.algorithm: added more unittests and checks for user-based comparison passed to topN
- std.math: replaced std.c with core.stdc; improved approxEqual to work with ranges, not only numbers or arrays
- std.range: defined Take.popBack whenever sensible; improved iota to accept negative ranges and steps
Bugs Fixed
- Bugzilla 601: statement.html - Formatting/markup errors in BNF
- Bugzilla 1461: Local variable as template alias parameter breaks CTFE
- Bugzilla 1600: Functions taking only one array cannot be called with property syntax
- Bugzilla 1604: Non-final method on final struct is too restrictive (closed with "invalid" advise)
- Bugzilla 1605: break in switch with goto breaks in ctfe
- Bugzilla 1616: std/metastrings.d
- Bugzilla 1940: Phobos buildscripts do not work on x86_64
- Bugzilla 1948: CTFE fails when mutating a struct in an array
- Bugzilla 1950: CTFE doesn't work correctly for structs passed by ref
- Bugzilla 1969: ICE(cod1.c) using undefined operator with one const operand
- Bugzilla 1972: Foreach range statement breaks CTFE
- Bugzilla 2150: cannot get values from const variant
- Bugzilla 2277: array ops and const arrays incompatible
- Bugzilla 2398: writef("%x") for a pointer is always uppercase
- Bugzilla 2560: ICE(cod4.c) on invoking method that takes ref const struct parameter
- Bugzilla 2564: CTFE: the index in a tuple foreach is uninitialized (bogus error)
- Bugzilla 2569: static arrays in CTFE functions don't compile
- Bugzilla 2575: gdb can not show code
- Bugzilla 2587: std.process.shell doesn't work for win32
- Bugzilla 2604: DW_TAG_module and GDB
- Bugzilla 2665: ICE(cod4.c) on certain const struct function return types
- Bugzilla 2784: Interfaces should be able to require type definitions (closed with "invalid" advise)
- Bugzilla 2785: Interfaces should be able to require non-member functions (closed with "invalid" advise)
- Bugzilla 2786: Interfaces should be able to require constructors (closed with "invalid" advise)
- Bugzilla 2882: std.random.MersenneTwisterEngine without no seed
- Bugzilla 2925: Destructor not called
- Bugzilla 2937: postblit not called for foreach arg over array of structs
- Bugzilla 2940: null is null cannot be evaluated at compile time
- Bugzilla 2976: rename retreatN to retreat
- Bugzilla 2979: Xml tags with only attributes return as without attributes ElementParser.parse
- Bugzilla 2980: compiler error when writefln( uint )
- Bugzilla 2987: D2 phobos BigInt opMul doesn't work correctly
- Bugzilla 2988: Chain needs opIndexAssign.
- Bugzilla 2989: std.typetuple: add support for any static tuples
- Bugzilla 2992: (closed with "later" advise)
- Bugzilla 2996: std.typetuple: add support for any static tuples
- Bugzilla 3000: iota should work with floats
- Bugzilla 3017: doc errors in std.range (on behalf of Steven Schveighoffer)
- Bugzilla 3025: uniform(float,float) pops first, uniform(int,int) pops last
- Bugzilla 3037: Off-by-one error in Stride.length
- Bugzilla 3039: -vtls compiler flag not listed in man file
- Bugzilla 3058: [CTFE] Cannot return out of foreach range statement
- Bugzilla 3074: std.conv.to!(string)(int.min)
- Bugzilla 3077: 3077 crash exiting main() without result code
- Bugzilla 3087: std.range.retro.opIndex out of range
- Bugzilla 3098: std.algorithm.reduce example can not compile
- Bugzilla 3100: ICE(cast.c) struct with members is shared
- Bugzilla 3132: std.string.split should be templated on mutable/const/immutable
- Bugzilla 3148: syntax error using invariant
- Bugzilla 3153: win32.mak tries to copy phobos.lib, gcstub.obj to nonexistent folder lib
- Bugzilla 3162: can't fully use compile-time floats as template parameters
- Bugzilla 3165: What kind of integer division does D use?
- Bugzilla 3166: "positive" -> "non-negative" in modulo operator description
- Bugzilla 3169: Segfault(cast.c) dividing ulong by int
- Bugzilla 3170: Forward reference of nested class fails if outer class is not plain
- Bugzilla 3183: Spec of align attribute needs work
- Bugzilla 3184: std.algorithm.until should work like "find"
- Bugzilla 3185: osx is not a directory (complains cannot read std/c/osx/socket.d)
- Bugzilla 3186: corrections for http://www.digitalmars.com/d/2.0/dmd-osx.html
- Bugzilla 3189: std.conv.to : check for a custom to method in classes/structs
- Bugzilla 3192: asm in a anonymous delegate crash the compiler
- Bugzilla 3195: std.conv pureness (closed with "later" advise)
- Bugzilla 3196: Segfault(mtype.c) after almost any error involving a delegate literal
- Bugzilla 3197: Minor fixes and additions to std.traits
- Bugzilla 3199: sort(chain(...)) doesn't work in some cases
- Bugzilla 3205: CTFE: $ cannot be used in lvalues
- Bugzilla 3212: Error message says "mutable"; should say "immutable"
- Bugzilla 3217: std.functional.binaryFunImpl doesn't support UDT with string functions , therefore neither does many std.algorithm functions
- Bugzilla 3218: Performance of std.xml.encode must be improved
- Bugzilla 3219: Inaccurate std.conv.to!(numeric)(numeric) error messages
- Bugzilla 3224: std.random documentation bugs
- Bugzilla 3229: No return or assert(0) at end of function
- Bugzilla 3236: Postblit called but no matching destructor
- Bugzilla 3239: std.conv.roundTo does not accept const/immutable/shared
- Bugzilla 3240: std.numeric.findRoot only works with real
- Bugzilla 3242: splitter does not handle input range made of a unique separator correctly
- Bugzilla 3245: Easy bug fix available for disabled unit test code in std.encoding
- Bugzilla 3246: ICE(init.c) using indexed array initializer on local array
- Bugzilla 3249: sort and setIntersection on array of struct or class
- Bugzilla 3253: DMD crashes on function pointer struct member initialization with function literal
- Bugzilla 3255: final switch broken with -w switch
- Bugzilla 3257: Spec is unclear describing string switch case labels
- Bugzilla 3260: "Error: undefined identifier backend" when compiling 'write' with 'wchar'
- Bugzilla 3264: -O causes wrong "used before set" error when using enum.
- Bugzilla 3281: ICE(cod1.c) append returned struct to array
- Fixed bug processing spaces in dmd's directory
- Fixed assert failure on line 4823 in expression.c
- Fixed OSX compile error on samples/d/dhry.d
- std.format: fixed unlisted bug in documentation
- std.random: uniform does not work when passed immutable data
- std.range: fixed unlisted bug in Take.back
- unlisted: made entropy work on const/immutable arrays
New/Changed Features
- Renamed root directory \dmd to \dmd2
- Use of with symbols that shadow local symbols is no longer allowed
- Added final switch statements
- Added case range statements
- Implicit integral conversions that could result in loss of significant bits are no longer allowed.
- Warning on no return expr; is now an error.
- Bugzilla 3080: dmd should output compilation errors to stderr, not stdout
- Bugzilla 3122: [patch] Adding support for fast and reliable build tools to the frontend
- std.algorithm: Made std.algorithm.swap faster by having it use memcpy; added std.algorithm.group, std.algorithm.until, std.algorithm.nWayUnion, std.algorithm.largestPartialIntersectionWeighted; added additional constraints to std.algorithm.equal; changed signature of std.algorithm.topNIndex and std.algorithm.topNCopy to use an enum parameter instead of a confusing bool.
- std.array: added array function.
- std.conv: added Shin Fujishiro's code for printing and parsing enumerated values.
- std.ctype: made isupper and tolower pure.
- std.date: changed signature of benchmark to return ulong[] instead of uint[].
- std.demangle: changed it to use the snazzy switch statement with ranged labels.
- std.random: added randomSample
- std.string: deprecated std.string.find and std.string.find, replaced with std.string.indexOf; deprecated std.string.rfind and std.string.irfind, replaced with std.string.lastIndexOf; added flag CaseSensitive for indexOf and lastIndexOf; removed startsWith and endsWith because std.algorithm defines them; defined std.string.byDchar.
- std.traits: added isSomeChar, isPointer.
- std.typetuple: replaced indexOf with indexOfType, kept the old name as an alias that will be deprecated.
- std.utf: improved error messages.
Bugs Fixed
- Fix dmd crash on multicore Windows.
- Fixed unlisted bug in std.algorithm.startsWith
- Fixed unlisted bug in std.algorithm.topN
- Fixed unlisted bug in std.algorithm.topNIndex (empty index made it crash)
- Fixed unlisted bug in std.algorithm.setIntersection
- Fixed unlisted bug in std.range.retro: retro'izing a range twice must return the original range
- Bugzilla 106: template - mixin sequence
- Bugzilla 810: Cannot forward reference template
- Bugzilla 852: ICE(toir.c) using local class in non-static nested function in nested static function
- Bugzilla 1343: Various errors with static initialization of structs and arrays
- Bugzilla 1358: ICE(root.c) on Unicode codepoints greater than 0x7FFFFFFF
- Bugzilla 1524: ICE(constfold.c) on using "is" with strings in CTFE
- Bugzilla 1984: Assertion failure: 'e1->type' on line 1198 in file 'constfold.c'
- Bugzilla 2323: ICE(cgcs.c): taking address of a method of a temporary struct
- Bugzilla 2399: ICE(cgcod.c) on casting function to delegate
- Bugzilla 2429: std.stream.File incorrect flag parsing and sharing mode
- Bugzilla 2432: complex alias -> mtype.c:125: virtual Type* Type::syntaxCopy(): Assertion 0 failed.
- Bugzilla 2603: ICE(cgcs.c) on subtracting string literals
- Bugzilla 2843: ICE(constfold.c) with is-expression with invalid dot-expression in is-expression involving typeid
- Bugzilla 2865: RandomCover not random
- Bugzilla 2875: ICE(cgcod.c) setting delegate = &Struct.func
- Bugzilla 2884: ICE: Assert: 'template.c', line 3773, 'global.errors'
- Bugzilla 2888: [PATCH] speedup for float * 2.0
- Bugzilla 2900: Array appending slowed drastically since integration of druntime
- Bugzilla 2915: [Patch]: Optimize -a*-b into a*b
- Bugzilla 2923: -O generates bad code for ?:
- Bugzilla 2932: bad e_ehsize (36 != 52)
- Bugzilla 2952: Segfault on exit when using array ops with arrays of doubles larger than 8 elements
- Bugzilla 2974: Segfault(mtype.c) on auto function
- Bugzilla 2981: Bad code generation for structs containing invariants
- Bugzilla 2982: Assertion failure in function if() clause
- Bugzilla 3003: Need to implicitly add () on member template function calls
- Bugzilla 3014: ICE(template.c) instantiating template with tuple
- Bugzilla 3016: Errors in the documentation of std.math.acos
- Bugzilla 3026: Segfault with incomplete static array initializer
- Bugzilla 3044: Segfault(template.c) instantiating struct tuple constructor with zero arguments.
- Bugzilla 3071: nested func declaration parse problem
- Bugzilla 3078: NaN reported as equal to zero
- Bugzilla 3081: unaryFun can't be used to get element out of struct.
- Bugzilla 3095: wc example for D2 doesn't compile
- Bugzilla 3114: optlink failing on multicore machines
- Bugzilla 3117: dmd crash by *1
- Bugzilla 3121: recurrence does not generate the correct numbers
- Bugzilla 3128: Internal error: ..\ztc\cod4.c 2737
- Bugzilla 3130: Crashed with triple stars
New/Changed Features
- added -vtls compiler switch
- classic global storage now defaults to TLS (Thread Local Storage). This is a big change, see Migrating To Shared.
- std.algorithm: added minPos. Improvements to Splitter suggested by Brad Roberts. Splitter now is bidirectional. Also Splitter has one extra trailing element if it ends with a separator. Added variadic arguments for setUnion and setIntersection. Added functions setSymmetricDifference and largestPartialIntersection. Improved BinaryHeap's interface and implementation.
- std.array: Improvements to Appender. Now it works with string and other immutable-element arrays, and accepts ranges in put().
- std.format: added raw specifier for reading
- std.range: Added iota with two arguments. Added FrontTransversal and Transversal.
- std.stdio: added File.byChunk
- std.traits: Added isImplicitlyConvertible.
- std.tuple: Added Tuple.opComp.
- Folded in compiler changes by Unknown W. Brackets to support Solaris.
- added .typeinfo to ClassInfo Bugzilla 2836: Navigate from ClassInfo to TypeInfo
Bugs Fixed
- Fix instruction scheduler bug on Linux
- unlisted: made std.numeric.entropy work on const/immutable arrays
- Fixed several problems associated with thread local storage
- Bugzilla 642: error: mixin "static this" into where it cannot be
- Bugzilla 713: circular const definitions with module operator "." cause the compiler to segfault
- Bugzilla 752: Assertion failure: 'e->type->ty != Ttuple' on line 4518 in file 'mtype.c'
- Bugzilla 858: Forward reference to struct inside class crashes the compiler
- Bugzilla 884: Segfault in recursive template
- Bugzilla 934: Segfault taking mangleof a forward reference in a template.
- Bugzilla 1011: illegal import declaration causes compile time segfault
- Bugzilla 1054: regression: circular aliases cause segfaults
- Bugzilla 1061: "asm inc [;" segfaults compiler.
- Bugzilla 1305: Compiler hangs with templated opCmp returning templated class
- Bugzilla 1385: Stack Overflow with huge array literal.
- Bugzilla 1428: Segfault on template specialization with delegates and tuples
- Bugzilla 1791: Segmentation fault with anon class in anon class and non-constant variable init
- Bugzilla 1916: segfault on invalid string concat
- Bugzilla 1946: Compiler crashes on attempt to implicit cast const typedef to non-const.
- Bugzilla 2048: DMD crash on CTFE that involves assigning to member variables of void-initialized struct
- Bugzilla 2061: wrong vtable call with multiple interface inheritance
- Bugzilla 2215: Forward reference enum with base type within a struct causes Segmentation Fault in the compiler
- Bugzilla 2309: Crash on a template mixing in a variadic template with an undefined template identifier
- Bugzilla 2346: ICE when comparing typedef'd class
- Bugzilla 2580: Documented WinMain for D2 is wrong
- Bugzilla 2633: incorrect ModuleInfo declaration in object.di
- Bugzilla 2695: pure functions can invoke impure function pointers
- Bugzilla 2807: Marking a nested function as 'pure' may cause bad code generations silently accepted
- Bugzilla 2821: struct alignment inconsistent with C for { int, long }
- Bugzilla 2851: Segfault using C-style struct initializer with too few arguments
- Bugzilla 2865: RandomCover not random
- Bugzilla 2882: std.random.MersenneTwisterEngine without seed
- Bugzilla 2890: deadlock in std.stdio
- Bugzilla 2893: qualified types don't have an Unsigned counterpart
- Bugzilla 2906: writef problem with formatting floating point
- Bugzilla 2914: to!string(struct) is broken
- Bugzilla 2920: recursive templates blow compiler stack
- Bugzilla 2922: Egregiously bad hashing performance with strings
New/Changed Phobos
- std.algorithm
- Everything converted to ranges. Big disruption. Algorithms added.
- std.array
- Range primitives for arrays
- Appender template
- insert, replace functions
- std.bitmanip
- Bitfields of length 0 are defined to be always 0.
- The read functions for bitfields are const.
- std.contracts
- enforce accepts const(char)[] instead of string
- Added enforce overload that invokes a delegate on failure
- Added assumeSorted template
- Added structuralCast that implements, well, structural casting (incomplete).
- std.conv
- Rewrote conversions with constrained templates.
- Added text() function that transforms everything into text.
- std.date
- Added a benchmark function that allows for simple timing measurements.
- std.file
- read, write, append, rename, remove, getSize, getTimes, getAttributes, isfile, isdir, chdir, mkdir, mkdirRecurse, rmdir, listdir, copy, take filename(s) by "in char[]"
- Added function readText that reads and validates a text file
- Added function slurp that reads a file into an array of tuples.
Example:
auto a = slurp!(int, double)("filename", "%s, %s");
Each line in the file looks like e.g. "1, 2.3". slurp returns an array of Tuple!(int, double) with the parsed content.
- std.format
- Added vector parsing and printing with the specifier "%()". For example, writefln("[%(s; )]", [1, 2, 3][]) writes "[1; 2; 3]". This support is experimental and may be changed in the future.
- Added a formattedRead function (i.e., scanf that doesn't suck). The implementation is incomplete but common cases are supported.
- std.functional
- Improved error messages
- Added configurable parameter names for functions as strings
- Added Adjoin template
- std.getopt
- Added support for parameterless delegates
- std.math
- Intrinsics std.math.yl2x and yl2xp1 added. Improves performance of std.math.log() and similar functions (and they are now pure nothrow).
- std.mmfile
- Minor cosmetic changes
- std.numeric
- Added type CustomFloat that allows defining specialized floating-point numbers (e.g. 16-bit floats, positive floats etc.)
- Added FPTemporary as the best type to store temporary values.
- Templatized oppositeSigns
- Added Euclidean distance
- Added dotProduct
- Added cosineSimilarity
- Added normalize
- Added string kernel functions gapWeightedSimilarity, gapWeightedSimilarityNormalized, gapWeightedSimilarityIncremental.
- std.outbuffer
- Added a few missing overloads of write()
- std.path
- getDrive now works with all string types
- isabs accepts in char[]
- join accepts variadic in char[]
- fnmatch works with in char[]
- std.random
- Added RandomCover that covers a given range in a random manner
- Eliminated the old-fashioned random functions
- Defined a default random object that simplifies calls to the random functions
- Changed generators to obey the range interface. So now you can write:
Random r; foreach (n; take(100, uniform(0, 100))) { ... }
- std.range (new file)
- Range manipulation stuff.
- std.regex (new file)
- Regular expression library with wide char support, simplified interface, better speed etc.
- std.regexp
- Scheduled for deprecation. Use std.regex instead.
- std.stdio
- Major breaking changes: introduced the File struct. Now stdin, stdout, stderr are instances of the File struct.
- Due to bugs in the compiler, the copy constructor and destructor of File are commented out. Walter will look into fixing the issues soon. File should work fine, but you need to close it manually.
- A byRecord iteration mode makes it pretty easy to iterate structured text files.
- writef and writefln now require a string as their first argument.
- std.string
- strip, stripl, stripr, startsWith, endsWith now work with any string type
- std.typecons
- Added constructors, assignment operator, length, toString, and slice to Tuple.
- std.utf
- toUTF16z accepts in char[]
- std.variant
- Added support for Variants that contain vectors and hashes of themselves
- std.c.stdio
- Added fopen64 and friends
New/Changed Features
- Added template function literals
Bugs Fixed
- Bugzilla 675: %a format has an out-by-1 bug for denormals
- Bugzilla 2199: Segfault using array operation in function call
- Bugzilla 2203: typeof(class.template.foo) crashes compiler
- Bugzilla 2577: DMD crashes on foreach of undefined identifier
- Bugzilla 2808: 'nothrow' nested functions cannot be parsed
- Bugzilla 2812: sqrt(2.0) is about -2.7341e-53
New/Changed Features
Bugs Fixed
- Bugzilla 1586: DMD and GDC segfaults on incomplete code segment
- Bugzilla 2064: Segfault with mixin(for/foreach) with empty loop body
- Bugzilla 2812: sqrt(2.0) is about -2.7341e-53
- Bugzilla 2804: Impure nested functions should be legal inside pure functions
New/Changed Features
- Most functions in std.math are now pure nothrow. Improved speed of std.math.hypot.
- Added response files for Linux and OSX
- Added alias this
- Bugzilla 2746: Make float.init signalling NaN by default
- On Windows, if there are multiple source files on the command line they are now read with a background thread. This may speed up compilation.
- Folded in patches for LDC compatibility from Tomas Lindquist Olsen
- Removed etc.gamma from the library.
Bugs Fixed
- std.math.hypot is wrong for subnormal arguments
- Fix bug where / wasn't recognized as a path separator on Windows.
- Bugzilla 920: Fix one more out of date reference to 'auto' rather than 'scope'
- Bugzilla 1645: can override base class' const method with non-const method
- Bugzilla 2319: "Win32 Exception" not very useful
- Bugzilla 2336: link to nonexistent std_array.html
- Bugzilla 2570: Patch for some mistakes in Ddoc comments
- Bugzilla 2574: std.c.stdio doesn't compile: va_list not defined!
- Bugzilla 2591: custom allocator new argument should be size_t instead of uint
- Bugzilla 2595: template ctors crash compiler
- Bugzilla 2596: Variadic constructors don't compile
- Bugzilla 2626: template function not working against template struct instantiated with default arguments
- Bugzilla 2674: Copy postblit constructor this(this) not called for members
- Bugzilla 2689: seek behaves incorrectly on MAC OSX
- Bugzilla 2692: alignment of double on x86 linux is incorrect
- Bugzilla 2700: typeof tests stops compilation abruptly
- Bugzilla 2705: Response file size cannot exceed 64kb
- Bugzilla 2711: -H produces bad headers files if function defintion is templated and have auto return value
- Bugzilla 2722: ICE with variadic template parameters
- Bugzilla 2723: ICE with variadic template parameters, different case
- Bugzilla 2724: Persistent segfaults in templated code
- Bugzilla 2725: Pattern matching in static if not working with variadic arguments
- Bugzilla 2727: std.date Cyclic dependency
- Bugzilla 2728: Bogus Error message on const ref return
- Bugzilla 2729: hash_t undocumented and unnecessary
- Bugzilla 2730: Restriction on op= can be lifted
- Bugzilla 2731: Errors in associative array example
- Bugzilla 2739: _argptr is invalid for functions nested in class methods
- Bugzilla 2743: dumpobj gives "buss error" on Tiger
- Bugzilla 2744: wrong init tocbuffer of forstatement
- Bugzilla 2745: missing token tochars in lexer.c
- Bugzilla 2747: improper toCBuffer of funcexp
- Bugzilla 2750: Optimize slice copy with size known at compile time
- Bugzilla 2751: incorrect scope storage class vardeclaration tocbuffer
- Bugzilla 2752: std.xml does not encode CData correctly
- Bugzilla 2754: The error message regarding implicit conversion to shared doesn't mention shared in the message.
- Bugzilla 2755: ICE on invalid ref returns in linked objects: Assertion failure: 'type' on line 6566 in file 'expression.c'. No ICE or error if invalid code is local to the file.
- Bugzilla 2756: Bad code generation for pure nothrow math functions
- Bugzilla 2761: Unreachable statement warning in std.string
- Bugzilla 2763: std.mangle.demangle not translating 'ya'
- Bugzilla 2766: DMD hangs with 0%cpu
- Bugzilla 2767: DMD incorrectly mangles NTFS stream names
- Bugzilla 2772: lib can't open response file
New/Changed Features
- Escape string literals deprecated, see Bugzilla 2658
- Tripled speed of exp, expm1, and exp2. std.math is now less dependent on the C standard library.
- Added nested structs.
- Added buildable dmd source.
- Many changes to std.math for speed, accuracy, and Tango compatibility:
- Improved accuracy of exp, expm1, exp2, sinh, cosh, tanh on Mac OSX, and tripled speed on all platforms.
- Now using IEEE754-2008 camelCase names for isNaN, isFinite, isNormal, isSubnormal, isInfinity. Aliases for the old names have been retained.
- The non-functional nan(char[]) is replaced with NaN, getNaNpayload.
Bugs Fixed
- Bugzilla 1603: String literals bind to pointer types
- Bugzilla 1629: Link error: Previous Definition Different: blablah__initZ
- Bugzilla 1662: Falls back to libphobos if -debuglib isn't used when -g is
- Bugzilla 1681: cast(real) ulong.max == 0
- Bugzilla 2416: Slice of typedef'ed array should preserve the typedef'ed type
- Bugzilla 2597: auto return doesn't work for a variety of cases
- Bugzilla 2612: immutable not accepted wherever invariant is
- Bugzilla 2619: Locally-instantiated structs are not instantiated locally
- Bugzilla 2621: ref binds to rvalues of user-defined types
- Bugzilla 2622: ref returns not allowed in complex template
- Bugzilla 2623: Function type drops ref spec
- Bugzilla 2670: std.file.read() should read files of 0 length
- Bugzilla 2673: Static constructors sometimes do not run when compiling with -lib
- Bugzilla 2675: cannot foreach structs with copy constructor
- Bugzilla 2676: alias parameters not matched in concept if clause
- Bugzilla 2677: Alias type parameters not visible in concept-if clauses
- Bugzilla 2678: for loops are already assumed to terminate
- Bugzilla 2679: Spurious "warning - " messages and erratic behaviour with is(typeof({void function}()))
- Bugzilla 2684: Associative arrays have wrong opIndex signatures
- Bugzilla 2690: DMD aborts with MALLOC_CHECK_ set
New/Changed Features
- Added Mac OSX support.
- Separated bin and lib directories into windows, linux, and osx.
- No longer need to download dmc to use the windows version.
- Use version(OSX) for Mac OSX. Although version(darwin) is also supported for the time being, it is deprecated.
Bugs Fixed
- Bugzilla 2448: template return by reference causes seg fault
New/Changed Features
- Improved speed of long division.
- Optimizer now takes advantage of immutable and pure.
- Added predefined version D_Ddoc which is predefined when -D switch is thrown.
- the type of a string literal is now invariant(char)[] rather than invariant(char)[length_of_string]. It is still implicitly convertible to the latter. This is intended to reduce template instantiation bloat.
- Undid fix for Bugzilla 2500, as the fix was arguably worse than the bug.
Bugs Fixed
- Bugzilla 1078: Frontend uses of 'auto' where 'scope' should be used
- Bugzilla 2517: DDoc omits abstract on classes
- Bugzilla 2518: scope(success) not execuate and RAII variable destructor is not called
- Bugzilla 2519: Segfault when >> used in an invalid slice
- Bugzilla 2527: Alias Template Params Are Always Same Type As First Instantiation (according to typeof(x).stringof)
- Bugzilla 2531: DDoc not generated correctly for struct methods inside static if
- Bugzilla 2533: compiler falls with "assertion failed" message on wrong code
- Bugzilla 2534: dmd.conf is wrong
- Bugzilla 2537: compiler crashes on this code:
- Bugzilla 2541: cannot use aliased type for decl of foreach variable
- Bugzilla 2542: array casts behave differently at compile and runtime
New/Changed Features
- Changed IUnknown to use the extern(System) interface rather that extern(Windows).
- Pure functions now get semantically checked.
- Nothrow functions now get semantically checked.
- shared is now a type constructor.
Bugs Fixed
- Bugzilla 1518: Crash using 'scope', 'with' and undefined 'RegExp'
- Bugzilla 1649: Variant coercion fails with delegates
- Bugzilla 1685: Array index is evaluated twice
- Bugzilla 1933: Delimited string constants can cause segfault
- Bugzilla 1963: -H creates broken headers
- Bugzilla 2041: Spec implies relationship between interfaces and COM objects
- Bugzilla 2105: added patch
- Bugzilla 2441: header file generation translates enum to manifest
- Bugzilla 2468: result type of AndAndExp and OrOrExp deduced incorrectly
- Bugzilla 2489: import in struct causes assertion failure
- Bugzilla 2490: extern(C++) can not handle structs as return types
- Bugzilla 2491: druntime GC wrongly frees data pointed to by TLS.
- Bugzilla 2492: ICE building on Linux with -lib option
- Bugzilla 2499: Template alias default value cannot be template instantiation
- Bugzilla 2500: template struct methods are left unresolved if imported from multiple modules
- Bugzilla 2501: member function marked as final override ignores override requirements
- Bugzilla 2503: Error 42: Symbol Undefined _D3std7process6systemFAyaZi
- Bugzilla 2506: Can't initialize const member in ctor if it is accessed via this.member syntax
- Incorporated some of the patches from Bugzilla 1752
- extern __thread now works on Linux.
New/Changed Features
- Added -safe switch and module(system) Identifier; syntax.
- Added range support to foreach statement.
- scope parameter storage class means the parameter will not 'escape' the scope of the function invocation. Using this for delegate parameters will prevent some closure allocations by the calling function.
- The lazy storage class now implies scope so that lazy arguments won't trigger a heap allocated closure.
- The 'this' parameter to struct member functions is now a reference type, rather than a pointer. This breaks existing code.
- More changes to druntime:
from to OutOfMemoryException OutOfMemoryError SwitchException SwitchError HiddenFuncException HiddenFuncError ArrayBoundsException RangeError AssertException AssertError FinalizeException FinalizeError onArrayBoundsError onRangeError stdc.* core.stdc.* sys.* core.sys.* - Added core.runtime.loadLibrary() as an experimental feature for loading dynamic libraries (Win32 only at the moment).
- Added core.runtime.unloadLibrary() as an experimental feature for unloading dynamic libraries previously loaded by loadLibrary().
- core.thread.sleep() accepts a long integer specifying the sleep interval in 100 nanosecond intervals (the previous release notes said this was a float, IIRC).
- It is no longer necessary to link in druntime separately, it is inserted into libphobos2.a.
Bugs Fixed
- Bugzilla 313: Fully qualified names bypass private imports
- Bugzilla 920: SPEC: Auto classes referenced where scope should be used
- Bugzilla 929: Resizing array of associative arrays (uint[char[]][]) causes infinite loop / hang
- Bugzilla 1372: Compiler accepts pragma(msg,)
- Bugzilla 1610: Enum.stringof is int, not the name of the enum
- Bugzilla 1663: pragma(lib, "") don't work on linux
- Bugzilla 1797: Documentation comments - ///
- Bugzilla 2428: Accessing item in enum'd array produced compiler error
- Bugzilla 2429: std.stream.File incorrect flag parsing and sharing mode
- Bugzilla 2431: Internal error: ../ztc/cgcod.c 1031 when using -O
- Bugzilla 2470: Cannot build libraries from other libraries
- unittest functions now always use D linkage
New/Changed Features
- Improved performance of AAs by rebalancing trees when rehashing.
- immutable now is implemented.
- Bugzilla 2344: Two wrong lookups for array functions
- Bugzilla 2345: Return by reference should be allowed
- Posix is now a predefined identifier when compiling under Linux
- Based on Sean Kelly's hard work, Phobos has been split into
two libraries, druntime.lib and phobos.lib. This will enable
better integration with Tango.
The user source code changes are:
from to bit bool _d_OutOfMemory() onOutOfMemoryError() import std.asserterror; import core.exception; import std.hiddenfunc; import core.exception; import std.switcherr; import core.exception; import std.array; import core.exception; import std.outofmemory; import core.exception; import std.gc; import core.memory; import std.thread; import core.thread; SwitchError SwitchException AssertError AssertException HiddenFuncError HiddenFuncException ArrayBoundsError ArrayBoundsException std.gc.fullCollect() GC.collect() std.gc.*() memory.gc_*() _moduleUnitTests() import runtime; runModuleUnitTests() printf add import std.c.stdio; - The thread handle isn't exposed to the user. This can always be obtained using the appropriate OS calls from within the thread.
- There is no druntime equivalent for Thread.pause() and Thread.resume(). The closest is thread_suspendAll() and thread_resumeAll()--extern (C) calls meant for use by the GC.
- Thread.wait() is renamed to Thread.join().
- Sleep functionality is available as Thread.sleep(double), where the parameter represents the number of seconds to sleep (fractional values accepted, obviously).
Bugs Fixed
- Bugzilla 1229: Linker fills disk
- Bugzilla 2332: Initializing const or invariant hashes croaks
- Bugzilla 2333: Hash initializer does not work
- Bugzilla 2336: link to nonexistent std_array.html
- Bugzilla 2340: Template properties don't work
- Bugzilla 2341: Double destruction without intervening copy
- Bugzilla 2362: Confusing description of 'aliasing of invariant with mutable'?
- Bugzilla 2363: Spurious () required after function name when used with array in prefix form
- Bugzilla 2366: Const member function syntax is missing
- Bugzilla 2368: Calling a function with an address of another function, then calling a returned object is rejected
- Bugzilla 2373: freebsd select does not accept values > 999,999
- Bugzilla 2376: CTFE fails on array literal of array literals of chars
- Bugzilla 2380: static struct initializer accepted as non static initializer is not documented
- Bugzilla 2383: default arguments can implicitly access private global variables that are not visible at call site
- Bugzilla 2385: spec says all structs are returned via hidden pointer on linux, but it uses registers
- Bugzilla 2390: Missing warning on conversion from int to char
New/Changed Features
- Added struct constructors.
- Special member functions _ctor, _dtor, etc., now have two leading _ in order to not conflict with the user identifier space.
Bugs Fixed
- Bugzilla 1322: foreach bypasses invariant
- Bugzilla 1615: inout is allowed in foreach of string literal
- Bugzilla 1627: ICE with a method called _ctor
- Bugzilla 1633: Nonsensical "C style cast illegal" message with !is
- Bugzilla 1771: dmd fails to execute on linux
- Bugzilla 1773: excessively long integer literal
- Bugzilla 1785: Mixing in an incorrect array literal causes infinite loop.
- Bugzilla 2176: Assertion failure: 'sz == es2->sz' on line 1339 in file 'constfold.c' (concatenating strings of different types)
- Bugzilla 2183: Bad formatting in std.c.stdlib
- Bugzilla 2190: toHash documentation is deprecated [D2.0]
- Bugzilla 2232: DMD generates invalid code when an object file is compiled -inline
- Bugzilla 2241: DMD abort
- Bugzilla 2243: const bool = is(function literal), badly miscast
- Bugzilla 2262: -inline breaks -lib library
- Bugzilla 2286: movmskpd compiled incorrectly
- Bugzilla 2287: std.conv should accept structs defining toString
- Bugzilla 2289: Stack overflow on very large BigInt to string.
- Bugzilla 2308: CTFE crash on foreach over nonexistent variable
- Bugzilla 2311: Static destructors in templates are never run
- Bugzilla 2314: Crash on anonymous class variable instantiation
- Bugzilla 2316: std.file docs are out of date
- Bugzilla 2317: asm offsetof generates: Internal error: ../ztc/cod3.c 2651
New/Changed Features
- Now supports array operations.
Bugs Fixed
- Added hash to generated module names when building libs to reduce collisions
- Bugzilla 1622: parameters to TypeInfo_Struct.compare seem to be switched around.
- Bugzilla 1644: Template instantiation should automatically cast to const to make const-ness irrelevant when argument is const anyways
- Bugzilla 2216: bad code generation for static arrays of zero length static arrays
- Bugzilla 2223: Typo in error message
- Bugzilla 2231: missing bigint document
- Bugzilla 2242: linux system calls are canceled by GC
- Bugzilla 2247: bad header file generated for if (auto o = ...) {}
- Bugzilla 2248: .di should be a supported file extension
- Bugzilla 2250: Update of user32.lib and kernel32.lib
- Bugzilla 2254: Size of executable almost triples
- Bugzilla 2258: Docs -> Inline Assembler -> Operand Types -> qword missing
- Bugzilla 2259: Assertion failure: '0' on line 122 in file 'statement.c'
- Bugzilla 2266: opEquals documentation still says it returns int
- Bugzilla 2269: D BUG: cosine of complex
- Bugzilla 2272: synchronized attribute documentation
- Bugzilla 2273: Whitespace is not inserted after commas
New/Changed Features
Bugs Fixed
- Bugzilla 2207: overload resolution fails with deprecation
- Bugzilla 2208: Deprecated function declarations cannot use deprecated types
- Bugzilla 2209: Typo in doc for offsetof
- Bugzilla 2212: phobos itself should be able to be compiled with '-w' switch
- Bugzilla 2264: typo in documentation regarding atof.
New/Changed Features
- re-implemented internal.monitor in D. Rationalized internal.object
- Bugzilla 288: changed return type of opEquals from int to bool. This necessitates doing a grep for opEquals and changing all the return values.
- Added .__vptr and .__monitor properties for class objects for use in the internal runtime library.
- Made rdmd's source available through svn, see http://dsource.org/projects/phobos/browser/trunk/tools/rdmd.d
- Simplified std.algorithm by fusing together higher-order functions taking an alias and their counterparts taking a string
- Added module std.array containing array operations: insert, erase, and replace
- Changed the enforce's implementation to generate smaller code per call
- Changed std.functional.binaryFun to work with strings and function aliases alike
- In std.getopt, added optChar, assignChar, and endOfOptions, per popular demand :o|
- In std.math, replaced a bunch of consts with enums
- In std.numeric, added Don Clugston as author and operated minor documentation fixes
- Improved std.stdio.chunks to take an iteration tally in addition to the chunk
Bugs Fixed
- D.announce/12322: mixin regression
- Bugzilla 203: std.format.doFormat() pads width incorrectly on Unicode strings
- Bugzilla 211: Linking error with alias mixin params and anonymous methods
- Bugzilla 224: Incorrect warning "no return at end of function"
- Bugzilla 252: -w and switch returns = bogus "no return at end of function" warning
- Bugzilla 253: Invalid <dl> tag generated by Ddoc
- Bugzilla 294: DDoc: Function templates get double and incomplete documentation
- Bugzilla 398: No way to abort compilation in a doubly recursive mixin
- Bugzilla 423: dmd ignores empty commandline arguments
- Bugzilla 515: Spec incorrect in where .offsetof can be applied
- Bugzilla 520: Invariants allowed to call public functions
- Bugzilla 542: Function parameter of a deprecated type (other than a class) is not caught
- Bugzilla 543: Function return of a deprecated type is not caught
- Bugzilla 544: Variable declared of a deprecated type (other than a class) is not caught
- Bugzilla 545: Attempt to access a static built-in property of a deprecated struct, union, enum or typedef is not caught
- Bugzilla 547: Accessing a deprecated member variable through an explicit object reference is not caught
- Bugzilla 548: Accessing a value of a deprecated enum is not caught
- Bugzilla 566: Adding non-static members and functions to classes using a template doesn't error
- Bugzilla 570: Bogus recursive mixin error
- Bugzilla 571: class instance member template returns strange value
- Bugzilla 572: parse error when using template instantiation with typeof
- Bugzilla 581: Error message w/o line number in dot-instantiated template
- Bugzilla 617: IFTI doesn't use normal promotion rules for non-template parameters
- Bugzilla 870: contradictory error messages for templates
- Bugzilla 951: Missing line number: no constructor provided for a class derived from a class with no default constructor
- Bugzilla 1097: Missing line number: casting array to array of different element size
- Bugzilla 1158: Missing line number: invalid mixin outside function scope
- Bugzilla 1176: Error missing file and line number
- Bugzilla 1187: Segfault with syntax error in two-level mixin.
- Bugzilla 1194: fcmov* emmits incorrect code
- Bugzilla 1207: Documentation on destructors is confusing
- Bugzilla 1341: typeof(int) should probably be legal
- Bugzilla 1601: shr and shl error message is missing line numbers
- Bugzilla 1612: No file/line number for using an undefined label in inline assembly
- Bugzilla 1912: Error without line number (Tuple, invalid value argument)
- Bugzilla 1936: Error with no line number (array dimension overflow)
- Bugzilla 2076: asm: offset has wrong docs and error without line number
- Bugzilla 2161: Modify compiler to pass array TypeInfo to _adEq and _adCmp instead of element TypeInfo
- Bugzilla 2178: 3 errors without line number: typeof
- Bugzilla 2188: man-or-boy test fails with access violation
- Fixed bugs in std.file.rename and std.file.remove on Linux
- Fixed documentation in std.typecons
New/Changed Features
- Template alias arguments can now be literals.
- Function templates can now deduce the return type if they are declared with auto.
- Non-lvalues are no longer matched to ref and out parameters when overloading.
- Relaxed hidden hijacking detection when hidden function is disjoint from overloading with any other virtual function in the hierarchy.
- Added version identifier D_PIC when -fPIC switch is used.
- Added Constraints to templates.
Bugs Fixed
- Bugzilla 1383: Implicit Function Instantiation with typesafe-variadic of delegates doesn't work
- Bugzilla 1559: version statement makes code outside of it disappear
- Bugzilla 1675: "Identifier too long" error with OMF object files
- Bugzilla 1947: ICE (Assertion failure: '0' on statement.c:123) with null mixin
- Bugzilla 1963: -H creates broken headers
- Bugzilla 2098: Outdated docs
- Bugzilla 2099: Text and Sample Code Disagree (non-static local invariant declaration)
- Bugzilla 2112: the type of undefined variable incorrectly assumed to be int
- Bugzilla 2118: Inconsistent use of string vs invariant(char[]) in doc
- Bugzilla 2123: Anonymous class crashes
- Bugzilla 2129: foreach won't work with invariant limits
- Bugzilla 2132: CTFE: can't evaluate ~= at compile time, D2 only.
- Bugzilla 2133: anonymous enum without {} doesn't work as asm value
- Bugzilla 2136: typeof(super(...)) counted as a constructor call
- Bugzilla 2140: static if as final statement with no code causes containing code to be skipped
- Bugzilla 2143: Mixed-in identifier is not recognized by static if
- Bugzilla 2144: 'is' is defined to be the same as '==' for non-class and non-array types, but does not call opEquals
- Bugzilla 2145: Phobos buildsystem unable to build html
- Bugzilla 2146: Multiple execution of 'static this' defined in template
- Bugzilla 2149: Auto variables loose the keyword "auto" in di files generated with -H option.
New/Changed Features
- Added -man switch to browse manual.
- Added -lib switch to generate library files. Also causes multiple object files to be generated from one source module.
- When generating an executable file, only one object file is now generated containing all the modules that were compiled, rather than one object file per module.
- Rewrote the rdmd utility to properly track dependencies and command-line compiler options (currently only working under Linux).
- Changed the Phobos makefile linux.mak to take advantage of the new -lib feature. Improved full build speed by 3x.
- std.algorithm: Changed the map() function so that it deduces the return type. Also map can be now curried.
- std.contracts: Added file and line information to enforce. Added errnoEnforce that formats the error message according to errno. Added corresponding ErrnoException class.
- std.conv: Made std.to curryable. Changed std.to to throw exception when object-to-object cast fails. Eliminated some superfluous printfs.
- std.encoding: Added new functions encodedLength(dchar) and encode(dchar, ref E[])
- std.encoding: Got rid of types Utf8, Utf16, Utf32, Ascii, Latin1, Windows1252. Introduced types AsciiChar, AsciiString, Latin1Char, Latin1String, Windows1252Char, Windows1252String.
- std.encoding: For now commented out std.encoding.to.
- std.file: Changed Boolean function signatures (e.g. exists) to return bool instead of int. Got rid of some gotos. Added the readText, lastModified, mkdirRecurse, and rmdirRecurse functions.
- std.functional: Improved compose so it accepts an unbounded number of functions. Added the pipe function.
- std.getopt: Added new option stopOnFirstNonOption. Also automatically expand dubious option groups with embedded spaces in them (useful for shebang scripts)
- std.math: improved integral powers
- std.md5: Improved signature of sum so it takes multiple arrays. Added getDigestString.
- std.path: changed signatures of test functions from bool to int. Implemented rel2abs for Windows. Improved join so that it accepts multiple paths. Got rid of some gotos with the help of scope statements.
- std.process: added getenv and setenv. Improved system() so it returns the exit code correctly on Linux.
- std.random: added the dice function - a handy (possibly biased) dice.
- std.typecons: Finalized and documented the stupendous Rebindable template.
- std.utf: added the codeLength function. Got rid of some gotos.
Bugs Fixed
- std.format: Fixed unlisted bug in raw write for arrays
- std.getopt: Fixed unlisted bug in dealing with one-letter options with bundling disabled
- Bugzilla 2014: fopen fails on large files.
- Bugzilla 2031: Documentation: template value parameters
- Bugzilla 2032: Documentation for creating a class on the stack is unintuitive
- Bugzilla 2037: Article on hijacking is outdated
- Bugzilla 2038: Remove hello2.html from samples directory
- Bugzilla 2039: -ignore switch is missing from compiler docs
- Bugzilla 2054: Const system broken on struct assignment.
- Bugzilla 2055: (ICE) Compiler crash on struct initializer with too many elements
- Bugzilla 2056: Const system does not allow certain safe casts/conversions involving deep composite types
- Bugzilla 2058: Describe hidden value passed to class member functions
- Bugzilla 2063: std.xml access violation for nested, closed tags
- Bugzilla 2065: Return value of std.file.exists() is inverted.
- Bugzilla 2067: call from anonymous class makes access violation.
- Bugzilla 2071: spec doesn't mention pointer arithmetic with two pointer operands
- Bugzilla 2072: std.typecons documentation anomaly.
- Bugzilla 2074: Variant arithmetic operations fail. For now the fix is to comment out all right-hand side operators. Suggestions for a better fix are welcome.
- Bugzilla 2075: Spec does not specify how array literals are stored.
- Bugzilla 2084: operator ?: does not compute the tightest type
- Bugzilla 2086: Describe relationship between string and char[] more explicitly
- Bugzilla 2089: Issues with CTFE and tuple indexes
- Bugzilla 2090: Cannot alias a tuple member which is a template instance
- Bugzilla 2100: Assertion failure: '0' on line 4842 in file 'expression.c'
- Bugzilla 2109: asm {lea EAX, [0*0+EAX]; } rejected.
New/Changed Features
- Added -ignore switch to ignore unsupported pragmas.
- Unsupported pragmas now printed out with -v switch.
- Added opDot, which is experimental only.
- SwitchStatements can now accept runtime initialized const and invariant case statements.
- Changed __FILE__ and __LINE__ so they work as parameter default initializers.
- Incorporated Benjamin Shropshire's doc changes
- Hidden methods now get a compile time warning rather than a runtime one.
- Html source files are now deprecated.
- Added pure and nothrow function attributes, although their semantics are not implemented.
- Deprecated VolatileStatement; use SynchronizedStatement instead.
- Added __thread storage class for thread local storage. This is for testing purposes only to check out the machinery in the back end. The front end design of this will change.
- obj2asm and dumpobj now better handle special ELF fixup records.
- Added partial ordering rules to disambiguate function overloading.
- std.perf: Bill Baxter cleaned it up.
- std.xml.Document constructor now creates whole DOM tree.
- Added std.encoding.
Bugs Fixed
- D/69085: const/invariant bug?
- Bugzilla 1712: vtbl[0] for interface not set to corresponding Interface*
- Bugzilla 1723: __traits(getVirtualFunctions) on a non-function fails badly
- Bugzilla 1741: crash on associative array with static array as index type
- Bugzilla 1905: foreach docs inconsistency
- Bugzilla 1906: foreach cannot use index with large arrays
- Bugzilla 1925
- Bugzilla 1935: The std.recls samples in the DMD .zip are obsolete.
- Bugzilla 1967: getDirName does not seem to use altsep on windows
- Bugzilla 1978: Wrong vtable call
- Bugzilla 1991: Dmd hangs
- Bugzilla 2016: 'invariant' TypeSpecialization is missing
- Bugzilla 2019: Appending a one-element array literal doesn't work
New/Changed Features
- Added predefined version(unittest). See Bugzilla 458
- Removed std.math2
- Added compile time error for comparing class types against null.
- Added struct destructors and postblits.
- std.algorithm: Made some imports conditional for the Unittest version; fixed doc typo; made min and max always return the tightest type and work with mixes of signed and unsigned; changed enum value names to obey lowercase convention; changed OrderStrategy to SwapStrategy as it's not just for ordering (e.g. see eliminate).
- std.bitmanip: simplified code generated for bitfields and improved error message.
- std.format: ate dogfood: used bitfields internally.
- std.functional: fixed binaryfun to work with constant-size arrays; added compose.
- std.random: made unpredictableSeed return different numbers every call (except for rarely-encountered MT scenarios); added private variable name that will take experts millenia to figure out; changed the boundaries syntax from two separate characters '[', '(' to one string "[(" throughout.
- std.traits: added mostNegative, mostly to assuage for the unpardonable mistake of inheriting C++'s unpardonable mistake of defining "min" to mean very different things for floating-point types and integral types.
- std.typecons: added undocumented Rebindable in preparation for opImplicitCast.
- std.math:
- Support for different CPU IEEE 'real' formats: 64-bit, 80-bit and 128-bit (quadruple) reals, both BigEndian and LittleEndian; partial support for non-IEEE 'doubledouble' reals.
- Added implementation of nextafter Bugzilla 1722 and scalb for DMD-Windows.
- Added nextUp(), nextDown()
- Bugzilla 1881: feqrel nonsensical for non-real arguments.
- internal functions isPosZero(), isNegZero() removed in favour of the more generally useful isIdentical().
- asm versions of functions which were not implemented by DMD Windows: scalb, lrint.
- added creal expi(real y) which is useful for simultaneous calculation of sin + cos.
Bugs Fixed
- std.contracts: fixed unlisted bug in pointsTo.
- std.conv: fixed bug related to number-to-number conversion (T.min hits again).
- Fixed dwarf bug with DT_AT_upper_bound
- Bugzilla 756: IFTI for tuples only works if tuple parameter is last
- Bugzilla 1454: IFTI cant deduce parameter if alias argument used
- Bugzilla 1661: Not possible to specialize on template with integer parameter
- Bugzilla 1800: Compiler crash on enums nested in structs
- Bugzilla 1801: Const structs should be assignable to non-const variables unless they contain references
- Bugzilla 1806: "const" makes typesafe variadic arguments not work properly.
- Bugzilla 1809: template.c:2600
- Bugzilla 1810: MmFile anonymous mapping does not work under win32
- Bugzilla 1819: spurious warning about missing return statement after synchronized
- Bugzilla 1821: ICE when using __traits isSame on const/invariant variables
- Bugzilla 1823: Implicit conversion to const on associative array
- Bugzilla 1828: Several Thread Issues
- Bugzilla 1833: std.c.windows.windows should use enums for constants, or be more selective about use of extern(Windows)
- Bugzilla 1836: Inline assembler can't use enum values as parameters.
- Bugzilla 1837: Make dmd stop flooding the console: prints content of passed parameter file
- Bugzilla 1843: Bogus unreachable statement on forward referenced struct, lacks line number
- Bugzilla 1850: The compiler accepts lower case asm registers.
- Bugzilla 1851: missing opCall? when cast away const struct
- Bugzilla 1852: you get opCall missing when cast to a struct(diagnostic)
- Bugzilla 1853: opCmp documentation really needs some examples
- Bugzilla 1854: bug in new flow analysis (warnings on valid code)
- Bugzilla 1857: Runtime segfault while profileing - jump to invalid code address
- Bugzilla 1862: asm: [ESI+1*EAX] should be a legal addr mode
- Bugzilla 1865: Escape sequences are flawed.
- Bugzilla 1867: lazy adds spurious const qualifier
- Bugzilla 1871: DMD debug messages printed
- Bugzilla 1873: structs with at least one immutable member are completely immutable
- Bugzilla 1874: __traits(allMembers, T) fails to list methods which only have non-mutating overloads
- Bugzilla 1876: inside a non-static class method, should "&( f)" be same as "&(this.f)" ?
- Bugzilla 1877: Errors in the documentation of std.math.atan2
- Bugzilla 1882: Internal error: ..\ztc\cod1.c 2529
- Bugzilla 1883: templates instantiated as real gives incorrect values
- Bugzilla 1884: manifest constants for strings
- Bugzilla 1885: Syntax error for object identity test between invariant/mutable references
- Bugzilla 1887: compiler freeze on array of dyn. arrays with empty first initializer
New/Changed Features
- std.typecons: fixed code bloat issue; added Tuple.toString; added function tuple(); fixed unlisted bug in enumValuesImpl.
- std.process: added function shell().
- std.math: minor change in approxEqual.
- std.contracts: added functions pointsTo()
- std.numeric: minor unittest fixes.
- std.bitmanip: fixed code bloat issue, reintroduced FloatRep and DoubleRep.
- std.conv: minor simplification of implementation.
- std.regexp: added reference to ECMA standard in the documentation.
- std.getopt: changed return type from bool to void, error is signaled by use of exceptions.
- std.functional: added unaryFun, binaryFun, adjoin.
- std.string: updated documentation, changed code to compile with warnings enabled.
- std.traits: changed FieldTypeTuple; added RepresentationTypeTuple, hasAliasing; fixed bug 1826; added call to flush() from within write; fixed unlisted bug in lines().
- std.algorithm: added map, reduce, filter, inPlace, move, swap, overwriteAdjacent, find, findRange, findBoyerMoore, findAdjacent, findAmong, findAmongSorted, canFind, canFindAmong, canFindAmongSorted, count, equal, overlap, min, max, mismatch, EditOp, none, substitute, insert, remove, levenshteinDistance, levenshteinDistanceAndPath, copy, copyIf, iterSwap, swapRanges, reverse, rotate, SwapStrategy, Unstable, Semistable, Stable, eliminate, partition, nthElement, sort, schwartzSort, partialSort, isSorted, makeIndex, schwartzMakeIndex, lowerBound, upperBound, equalRange, canFindSorted.
- std.thread: fixed so it compiles with warnings enabled.
- std.file: made getSize() faster under Linux.
- std.random: fixed so it compiles with warnings enabled; improved function uniform so it deduces type generated from its arguments.
- std.format: added fixes to make formatting work with const data.
- std.path: minor documentation changes.
- Added std.xml
- Added std.complex
- Added std.iterator
- Added std.c.linux.tipc
- Added std.c.linux.termios
- Added nothrow keyword
- Re-enabled auto interfaces.
- Now allow static arrays to be lvalues.
- Now allows implicit casting of null to/from const/invariant.
- Now allows implicit casting of StructLiterals if each of its arguments can be implicitly cast.
- Now allows implicit casting of structs to/from const/invariant if each of its fields can be.
- Added pragma startaddress.
- .tupleof can now access private fields of a struct/class
- Enhancement Bugzilla 493: Partial IFTI does not work
Bugs Fixed
- Fixed D/66406 Remaining const niggles #1 - Custom POD types
- Fixed display of ddoc template parameters that were aliased
- Fixed bug in std.file.readln() for Windows in translated mode
- Bugzilla 1072: CTFE: crash on for loop with blank increment
- Bugzilla 1435: DDoc: Don't apply DDOC_PSYMBOL everywhere
- Bugzilla 1815: foreach with interval does not increment pointers correctly
- Bugzilla 1825: local instantiation and function nesting
- Bugzilla 1837: Make dmd stop flooding the console: prints content of passed parameter file
- Bugzilla 1842: Useless linker command line output during compilation on Linux
New/Changed Features
- opAssign can no longer be overloaded for class objects.
- WinMain and DllMain can now be in template mixins.
- Added pure keyword.
Bugs Fixed
- Bugzilla 1319: compiler crashes with functions that take const ref arguments
- Bugzilla 1697: Internal error: ..\ztc\cgcod.c 2322 with -O
- Bugzilla 1700: ICE attempting to modify member of const return struct
- Bugzilla 1707: '==' in TemplateParameterList in IsExpression causes segfault
- Bugzilla 1711: typeof with delegate literal not allowed as template parameter
- Bugzilla 1713: foreach index with tuples and templates fails
- Bugzilla 1718: obscure exit with error code 5
- Bugzilla 1719: Compiler crash or unstable code generation with scoped interface instances
- Bugzilla 1720: std.math.NotImplemented missing a space in message
- Bugzilla 1724: Internal error: toir.c 177
- Bugzilla 1725: std.stream.BufferedFile.create should use FileMode.OutNew
- Bugzilla 1757: there is an fault in phobos windows api interface
- Bugzilla 1762: Wrong name mangling for pointer args of free extern (C++) functions
- Bugzilla 1767: rejects-valid, diagnostic
- Bugzilla 1769: Typo on the page about exceptions
- Bugzilla 1773: excessively long integer literal
- Bugzilla 1779: Compiler crash when deducing more than 2 type args
- Bugzilla 1783: DMD 1.025 asserts on code with struct, template, and alias
- Bugzilla 1788: dmd segfaults without info
- D.announce/11066: Re: DMD 1.025 and 2.009 releases
New/Changed Features
- Redid const/invariant semantics again.
- Extended enums to allow declaration of manifest constants.
Bugs Fixed
- Bugzilla 1111: enum value referred to by another value of same enum is considered as enum's base type, not enum type
- Bugzilla 1694: Zip::ArchiveMember::name format bug
- Bugzilla 1702: ICE when identifier is undefined
- Bugzilla 1738: Error on struct without line number
- Bugzilla 1742: CTFE fails on some template functions
- Bugzilla 1743: interpret.c:1421 assertion failure on CTFE code
- Bugzilla 1744: CTFE: crash on assigning void-returning function to variable
- Bugzilla 1745: Internal error: ..\ztc\out.c 115
- Bugzilla 1749: std.socket not thread-safe due to strerror
- Bugzilla 1753: String corruption in recursive CTFE functions
- D/63456: Cannot overload on constancy of this
New/Changed Features
- std.string: Made munch more general and added function chompPrefix.
- std.variant: Added documentation for variantArray
- std.traits: Added CommonType template, fixed isStaticArray.
- std.bitarray: scheduled for deprecation
- std.bitmanip: new module with the content of std.bitarray plus the bitfields, FloatRep, and DoubleRep templates
- std.process: Made getpid visible in Linux builds
- std.math: Made nextafter visible for all floating types. Added approxEqual template.
- std.contracts: Added enforce signature taking an exception
- std.conv: Made conv_error a template parameterized on the types being converted.
- std.stdio: Cosmetic changes.
- std.system: Cosmetic changes.
- std.file: Fixed bug in function dirEntries.
- std.random: Major addition of engines and distributions.
- std.format: Added raw ('r') format specifier for writef*.
- std.path: Added rel2abs (Linux version only).
- std.algorithm: new module
- std.typecons: new module
- std.functional: new module
- std.numeric: new module
- Added const/invariant structs, classes and interfaces.
- Added const and invariant to IsExpressions.
- Added typeof(return) type specifier.
- Changed the way coverage analysis is done so it is independent of order dependencies among modules.
- Revamped const/invariant.
Bugs Fixed
- Bugzilla 70: valgrind: Conditional jump or move depends on uninitialised value(s) in elf_findstr
- Bugzilla 71: valgrind: Invalid read of size 4 in elf_renumbersyms
- Bugzilla 204: Error message on attempting to instantiate an abstract class needs to be improved
- Bugzilla 1508: dmd/linux template symbol issues
- Bugzilla 1651: .di file generated with -H switch does not translate function() arguments correctly
- Bugzilla 1655: Internal error: ..\ztc\cgcod.c 1817
- Bugzilla 1656: illegal declaration accepted
- Bugzilla 1664: (1.23).stringof generates bad code
- Bugzilla 1665: Internal error: ..\ztc\cod2.c 411
New/Changed Features
- Functors now supported by std.traits.ReturnType().
- Transitive const now leaves invariants intact in the tail.
- Added overloadable unary * operation as opStar().
- Full closure support added.
- Data items in static data segment >= 16 bytes in size are now paragraph aligned.
Bugs Fixed
- Variables of type void[0] can now be declared.
- Static multidimensional arrays can now be initialized with other matching static multidimensional arrays.
- Bugzilla 318: wait does not release thread resources on Linux
- Bugzilla 322: Spawning threads which allocate and free memory leads to pause error on collect
- Bugzilla 645: Race condition in std.thread.Thread.pauseAll
- Bugzilla 689: Clean up the spec printfs!
- Bugzilla 697: No const folding on asm db,dw, etc
- Bugzilla 706: incorrect type deduction for array literals in functions
- Bugzilla 708: inline assembler: "CVTPS2PI mm, xmm/m128" fails to compile
- Bugzilla 709: inline assembler: "CVTPD2PI mm, xmm/m128" fails to compile
- Bugzilla 718: Internal error: ../ztc/cgcod.c 562
- Bugzilla 723: bad mixin of class definitions at function level: func.c:535: virtual void FuncDeclaration::semantic3(Scope*): Assertion 0 failed
- Bugzilla 725: expression.c:6516: virtual Expression* MinAssignExp::semantic(Scope*): Assertion e2->type->isfloating() failed.
- Bugzilla 726: incorrect error line for "override" mixin
- Bugzilla 729: scope(...) statement in SwitchBody causes compiler to segfault
- Bugzilla 1258: Garbage collector loses memory upon array concatenation
- Bugzilla 1480: std.stream throws the new override warning all over the place
- Bugzilla 1483: Errors in threads not directed to stderr
- Bugzilla 1557: std.zlib allocates void[]s instead of ubyte[]s, causing leaks.
- Bugzilla 1580: concatenating invariant based strings should work
- Bugzilla 1593: ICE compiler crash empty return statement in function
- Bugzilla 1613: DMD hangs on syntax error
- Bugzilla 1618: Typo in std\system.d
New/Changed Features
- Transformed all of string, wstring, and dstring into invariant definitions. Tons of changes in function signatures and implementations rippled through the standard library. Initial experience with invariant strings seems to be highly encouraging.
- Implemented Overload Sets for functions and templates.
- Added the std.getopt module that makes standards-conforming command-line processing easy.
- Added the parse and assumeUnique to the std.conv module.
- Added the dirEntries function to the std.file module.
- Added the basename and dirname functions (which alias the less gainful names getBaseName and getDirectoryName to the std.path module.)
- Added optional terminator to readln; added the convenience functions fopen and popen; added functions lines and chunks; all to the std.stdio module.
- Added the munch function to the std.string module.
- Fixed isStaticArray; added BaseClassesTuple, TransitiveBaseTypeTuple, ImplicitConversionTargets, isIntegral, isFloatingPoint, isNumeric, isSomeString, isAssociativeArray, isDynamicArray, isArray; all to the std.traits module.
- Added the std.variant module.
- Incorporated many of the Tango GC structural differences (much more to go still).
- Added the std.contracts module.
- Breaking change: std.stdio.writef can now only accept a format as its first argument.
Bugs Fixed
- Bugzilla 1478: Avoid libc network api threadsafety issues
- Bugzilla 1491: Suppress SIGPIPE when sending to a dead socket
- Bugzilla 1562: Deduction of template alias parameter fails
- Bugzilla 1571: Const on function parameters not carried through to .di file
- Bugzilla 1575: Cannot do assignment of tuples
- Bugzilla 1579: write[ln] fails for obj.toString()
- Bugzilla 1580: Concatenating invariant based strings should work
New/Changed Features
- std.math.sin, cos, tan are now evaluated at compile time if the argument is a constant.
- Added Cristian Vlasceanu's idea for C++ interface for 'plugins'
- Overhaul phobos linux.mak and add documentation build logic
- Massive additions to std.conv
- Add writeln() and write() to std.stdio
Bugs Fixed
- Fix std.boxer boxing of Object's (unit test failure)
- Fix std.demangle to not show hidden parameters (this and delegate context pointers)
- Bugzilla 217: typeof not working properly in internal/object.d
- Bugzilla 218: Clean up old code for packed bit array support
- Bugzilla 223: Error message for unset constants doesn't specify error location
- Bugzilla 278: dmd.conf search path doesn't work
- Bugzilla 479: can't compare arrayliteral statically with string
- Bugzilla 549: A class derived from a deprecated class is not caught
- Bugzilla 550: Shifting by more bits than size of quantity is allowed
- Bugzilla 551: Modulo operator works with imaginary and complex operands
- Bugzilla 556: is (Type Identifier : TypeSpecialization) doesn't work as it should
- Bugzilla 668: Use of *.di files breaks the order of static module construction
- Bugzilla 1125: Segfault using tuple in asm code, when size not specified
- Bugzilla 1437: dmd crash: "Internal error: ..\ztc\cod4.c 357"
- Bugzilla 1456: Cannot use a constant with alias template parameters
- Bugzilla 1474: regression: const struct with an initializer not recognized as a valid alias template param
- Bugzilla 1488: Bad code generation when using tuple from asm
- Bugzilla 1510: ICE: Assertion failure: 'ad' on line 925 in file 'func.c'
- Bugzilla 1523: struct literals not work with typedef
- Bugzilla 1530: Aliasing problem in DMD front end code
- Bugzilla 1531: cannot access typedef'd class field
- Bugzilla 1537: Internal error: ..\ztc\cgcod.c 1521
New/Changed Features
- Added command line switches -defaultlib and -debuglib
- Bugzilla 1445: Add default library options to sc.ini / dmd.conf
- Changed result type of IsExpression from int to bool.
- Added isSame and compiles to __traits.
- Added optional TemplateParameterList to IsExpression.
- Added warning when override is omitted.
- Added std.hiddenfunc.
- Added trace_term() to object.d to fix Bugzilla 971: No profiling output is generated if the application terminates with exit
- Multiple module static constructors/destructors allowed.
- Added new syntax for string literals (delimited, heredoc, D tokens)
- Added __EOF__ token
Bugs Fixed
- Fixed D/56414
- Bugzilla 961: std.windows.registry stack corruption
- Bugzilla 1315: CTFE doesn't default initialise arrays of structs
- Bugzilla 1342: struct const not accepted as initializer for another struct
- Bugzilla 1363: Compile-time issue with structs in 'for'
- Bugzilla 1375: CTFE fails for null arrays
- Bugzilla 1378: A function call in an array literal causes compiler to crash
- Bugzilla 1384: Compiler segfaults when using struct variable like a function with no opCall member.
- Bugzilla 1388: multiple static constructors allowed in module
- Bugzilla 1414: compiler crashes with CTFE and structs
- Bugzilla 1421: Stack Overflow when using __traits(allMembers...)
- Bugzilla 1423: Registry: corrupted value
- Bugzilla 1436: std.date.getLocalTZA() returns wrong values when in DST under Windows
- Bugzilla 1446: Missing comma in Final Const and Invariant page title
- Bugzilla 1447: CTFE does not work for static member functions of a class
- Bugzilla 1448: UTF-8 output to console is seriously broken
- Bugzilla 1450: Registry: invalid UTF-8 sequence
- Bugzilla 1460: Compiler crash on valid code
- Bugzilla 1464: "static" foreach breaks CTFE
- Bugzilla 1468: A bug about stack overflow.
New/Changed Features
- Added 0x78 Codeview extension for type dchar.
- Moved next member from Object.Error to Object.Exception
- Added ForeachRangeStatement .
- Added extern (System)
- Added std.traits
- Bugzilla 345: updated std.uni.isUniAlpha to Unicode 5.0.0
Bugs Fixed
- Bugzilla 46: Included man files should be updated
- Bugzilla 268: Bug with SocketSet and classes
- Bugzilla 406: std.loader is broken on linux
- Bugzilla 561: Incorrect duplicate error message when trying to create instance of interface
- Bugzilla 588: lazy argument and nested symbol support to std.demangle
- Bugzilla 668: Use of *.di files breaks the order of static module construction
- Bugzilla 1110: std.format.doFormat + struct without toString() == crash
- Bugzilla 1300: Issues with struct in compile-time function
- Bugzilla 1306: extern (Windows) should work like extern (C) for variables
- Bugzilla 1318: scope + ref/out parameters are allowed, contrary to spec
- Bugzilla 1320: Attributes spec uses 1.0 const semantics in 2.0 section
- Bugzilla 1331: header file genaration generates a ":" instead of ";" at pragma
- Bugzilla 1332: Internal error: ../ztc/cod4.c 357
- Bugzilla 1333: -inline ICE: passing an array element to an inner class's constructor in a nested function, all in a class or struct
- Bugzilla 1336: Internal error when trying to construct a class declared within a unittest from a templated class.
New/Changed Features
- Renamed linux library from libphobos.a to libphobos2.a
Bugs Fixed
- Bugzilla 540: Nested template member function error - "function expected before ()"
- Bugzilla 559: Final has no effect on methods
- Bugzilla 627: Concatenation of strings to string arrays with ~ corrupts data
- Bugzilla 629: Misleading error message "Can only append to dynamic arrays"
- Bugzilla 639: Escaped tuple parameter ICEs dmd
- Bugzilla 641: Complex string operations in template argument ICEs dmd
- Bugzilla 657: version(): ignored
- Bugzilla 689: Clean up the spec printfs!
- Bugzilla 1103: metastrings.ToString fails for long > 0xFFFF_FFFF
- Bugzilla 1107: CodeView: wrong CV type for bool
- Bugzilla 1118: weird switch statement behaviour
- Bugzilla 1186: Bind needs a small fix
- Bugzilla 1199: Strange error messages when indexing empty arrays or strings at compile time
- Bugzilla 1200: DMD crash: some statements containing only a ConditionalStatement with a false condition
- Bugzilla 1203: Cannot create Anonclass in loop
- Bugzilla 1204: segfault using struct in CTFE
- Bugzilla 1206: Compiler hangs on this() after method in class that forward references struct
- Bugzilla 1207: Documentation on destructors is confusing
- Bugzilla 1211: mixin("__LINE__") gives incorrect value
- Bugzilla 1212: dmd generates bad line info
- Bugzilla 1216: Concatenation gives 'non-constant expression' outside CTFE
- Bugzilla 1217: Dollar ($) seen as non-constant expression in non-char[] array
- Bugzilla 1219: long.max.stringof gets corrupted
- Bugzilla 1224: Compilation does not stop on asserts during CTFE
- Bugzilla 1228: Class invariants should not be called before the object is fully constructed
- Bugzilla 1233: std.string.ifind(char[] s, char[] sub) fails on certain non ascii strings
- Bugzilla 1234: Occurrence is misspelled almost everywhere
- Bugzilla 1235: std.string.tolower() fails on certain utf8 characters
- Bugzilla 1236: Grammar for Floating Literals is incomplete
- Bugzilla 1239: ICE when empty tuple is passed to variadic template function
- Bugzilla 1242: DMD AV
- Bugzilla 1244: Type of array length is unspecified
- Bugzilla 1247: No time zone info for India
- Bugzilla 1285: Exception typedefs not distinguished by catch
- Bugzilla 1287: Iterating over an array of tuples causes "glue.c:710: virtual unsigned int Type::totym(): Assertion 0 failed."
- Bugzilla 1290: Two ICEs, both involving real, imaginary, ? : and +=.
- Bugzilla 1291: .stringof for a class type returned from a template doesn't work
- Bugzilla 1292: Template argument deduction doesn't work
- Bugzilla 1294: referencing fields in static arrays of structs passed as arguments generates invalid code
- Bugzilla 1295: Some minor errors in the lexer grammar
New/Changed Features
- Added D_Version2 predefined identifier to indicate this is a D version 2.0 compiler
- Added __VENDOR__ and __VERSION__.
- Now an error to use both const and invariant as storage classes for the same declaration
- The .init property for a variable is now based on its type, not its initializer.
Bugs Fixed
- std.compiler now is automatically updated.
- Fixed problem catting mutable to invariant arrays.
- Fixed CFTE bug with e++ and e--.
- Bugzilla 1254: Using a parameter initialized to void in a compile-time evaluated function doesn't work
- Bugzilla 1256: "with" statement with symbol
- Bugzilla 1259: Inline build triggers an illegal error msg "Error: S() is not an lvalue"
- Bugzilla 1260: Another tuple bug
- Bugzilla 1261: Regression from overzealous error message
- Bugzilla 1262: Local variable of struct type initialized by literal resets when compared to .init
- Bugzilla 1263: Template function overload fails when overloading on both template and non-template class
- Bugzilla 1268: Struct literals try to initialize static arrays of non-static structs incorrectly
- Bugzilla 1269: Compiler crash on assigning to an element of a void-initialized array in CTFE
- Bugzilla 1270: -inline produces an ICE
- Bugzilla 1272: problems with the new 1.0 section
- Bugzilla 1274: 2.0 beta link points to dmd.zip which is the 1.x chain
- Bugzilla 1275: ambiguity with 'in' meaning
- Bugzilla 1276: static assert message displayed with escaped characters
- Bugzilla 1277: "in final const scope" not considered redundant storage classes
- Bugzilla 1279: const/invariant functions don't accept const/invariant return types
- Bugzilla 1280: std.socket.Socket.send (void[],SocketFlags) should take a const(void)[] instead
- Bugzilla 1283: writefln: formatter applies to following variable
- Bugzilla 1286: crash on invariant struct member function referencing globals
New/Changed Features
- Added aliases string, wstring, and dstring for strings.
- Added .idup property for arrays to create invariant copies.
- Added const, invariant, and final.
- in parameter storage class now means final scope const.
- foreach value variables now default to final if not declared as inout.
- class and struct invariant declarations now must have a ().
Bugs Fixed
- Added missing \n to exception message going to stderr.
- Fixed default struct initialization for CTFE.
- Bugzilla 1226: ICE on a struct literal