// PERMUTE_ARGS: // Prefer immutable(char)[] to all others int foo( char[] a) { return 11; } int foo( const char[] a) { return 12; } int foo(immutable char[] a) { return 13; } int foo( wchar[] a) { return 21; } int foo( const wchar[] a) { return 22; } int foo(immutable wchar[] a) { return 23; } int foo( dchar[] a) { return 31; } int foo( const dchar[] a) { return 32; } int foo(immutable dchar[] a) { return 33; } // Prefer const conversion over polysemous conversion int bar( char[] a) { return 11; } int bar( const char[] a) { return 12; } // bar(immutable char[] a); int bar( wchar[] a) { return 21; } int bar( const wchar[] a) { return 22; } // bar(immutable wchar[] a); int bar( dchar[] a) { return 31; } int bar( const dchar[] a) { return 32; } // bar(immutable dchar[] a); // No conversion to mutable int baz( char[] a) { return 11; } // baz( const char[] a); // baz(immutable char[] a); int baz( wchar[] a) { return 21; } // baz( const wchar[] a); // baz(immutable wchar[] a); int baz( dchar[] a) { return 31; } // baz( const dchar[] a); // baz(immutable dchar[] a); int main() { auto strn = "a"; auto strc = "a"c; auto strw = "a"w; auto strd = "a"d; assert(foo("a" ) == 13); assert(foo(strn) == 13); assert(foo("a"c) == 13); assert(foo(strc) == 13); assert(foo("a"w) == 23); assert(foo(strw) == 23); assert(foo("a"d) == 33); assert(foo(strd) == 33); assert(bar("a" ) == 12); assert(bar(strn) == 12); assert(bar("a"c) == 12); assert(bar(strc) == 12); assert(bar("a"w) == 22); assert(bar(strw) == 22); assert(bar("a"d) == 32); assert(bar(strd) == 32); static assert(!__traits(compiles, baz("a" ) )); static assert(!__traits(compiles, baz(strn) )); static assert(!__traits(compiles, baz("a"c) )); static assert(!__traits(compiles, baz(strc) )); static assert(!__traits(compiles, baz("a"w) )); static assert(!__traits(compiles, baz(strw) )); static assert(!__traits(compiles, baz("a"d) )); static assert(!__traits(compiles, baz(strd) )); return 0; }