https://issues.dlang.org/show_bug.cgi?id=20138
--- Comment #6 from ag0aep6g <ag0ae...@gmail.com> --- (In reply to Manu from comment #4) > T fun(T)(shared(T) a) > { > return a; > } > shared const int[] x; > pragma(msg, typeof(fun(x))); > > > const(shared(int)[]) !!! > > `T` should be typeof(x) but with shared peeled away: const(int[]) It is typeof(x) but with shared peeled away (from the head of the type). typeof(x) is: shared(const(E[])) where E is shared(const(int)). Peel shared away from typeof(x): const(E[]). Expand E: const(shared(const(int))[]). Simplify: const(shared(int)[]). (In reply to Manu from comment #5) > In my example above, it's weird that `shared` surrounds `int`, but `const` > surrounds `int[]`... why are they applied at different levels? `shared` is in the signature, `const` isn't. If you change fun's parameter to `shared(const(T)) a`, the return type becomes `shared(const(int))[]` as expected. --