Test cases: pragma(msg, (shared(immutable(int))).stringof); pragma(msg, (shared(immutable(int[]))).stringof); Prints: shared(int) shared(immutable(int)[]) Expected: immutable(int) immutable(int[]) In the first case, immutability is lost altogether; in the second case, immutability is lost on the outermost type.
Actually, never mind the "expected" comment here. I don't know what to expect. :) It is probably better to keep the shared qualifier as well, not collapsing the types at all.
I think the collapsing might be required. I was going to report this separately but it looks like a facet of your bug. import std.stdio; synchronized class foo { File file; this(string infile) { file.open(infile); } } ~/dmd2/linux/bin64/dmd -c junk.d junk.d(5): Error: function std.stdio.File.open (string name, in const(char[]) stdioOpenmode = "rb") is not callable using argument types (string) shared /home/jlquinn/dmd2/linux/bin64/../../src/phobos/std/stdio.d(292): Error: destructor std.stdio.File.~this () is not callable using argument types () The compiler (dmd 2.055) doesn't realize that shared(string) is equivalent to string.
*** This issue has been marked as a duplicate of issue 6922 ***