I think this is correct code because foo and bar can't change the contents of arr and x in any way: void foo(const ref int y) {} void bar(const ref int[5] a1) {} void spam(const ref int[] a2) {} void baz(const ref int[int] aa) {} void main() { immutable int x; foo(x); // Error? immutable int[5] arr1; bar(arr1); // Error? immutable int[] arr2; spam(arr2); // Error? immutable int[int] aa; baz(aa); // Error? } But DMD 2.055 gives errors: test.d(7): Error: constant 0 is not an lvalue test.d(9): Error: cast(const(int[5u]))arr1 is not an lvalue test.d(11): Error: cast(const(int[]))arr2 is not an lvalue test.d(13): Error: cast(const(int[int]))aa is not an lvalue See also a thread on this topic in D.learn: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D.learn&article_id=29609
Only the first one gives an error now. Happening because the const-folder is overly aggressive. https://github.com/D-Programming-Language/dmd/pull/1496
*** Issue 7225 has been marked as a duplicate of this issue. ***
Commits pushed to master at https://github.com/D-Programming-Language/dmd https://github.com/D-Programming-Language/dmd/commit/704240e0d391cbf76f45d4d5e8e2a87454494e11 Fix Issue 6708 - immutable ref implicit cast to const ref https://github.com/D-Programming-Language/dmd/commit/685d943a3af777621476239e200d895c6d375490 Merge pull request #1496 from yebblies/issue6708 Fix Issue 6708 - immutable ref implicit cast to const ref