Test case: ------------------------------ @system void f6359() {} pure void bug6359()() { static if (__traits(compiles, f6359())) { // <-- this won't compile static assert(0); } } void g6359() pure nothrow @safe { bug6359(); } ------------------------------ x.d(9): Error: safe function 'g6359' cannot call system function 'bug6359' ------------------------------ The stuff inside `__traits(compiles, )` won't affect the purity/safety of the program. Therefore, in the inference, the failed semantic to the @system function `f6359` should not make `bug6359()` not able to be @safe. The same happens if the annotation of `bug6359` is changed to @safe, which now it is no longer inferable as pure. nothrow is not affected.
https://github.com/D-Programming-Language/dmd/pull/3625
Commits pushed to master at https://github.com/D-Programming-Language/dmd https://github.com/D-Programming-Language/dmd/commit/94c11fd9ed43d81d853e94c6af4c782b7c0d195a fix Issue 6359 - Pure/@safe-inference should not be affected by __traits(compiles) https://github.com/D-Programming-Language/dmd/commit/e051d119243a56b2bff11e8c47d3a634631d58ad Merge pull request #3625 from 9rnsr/fix6359 Issue 6359 - Pure/@safe-inference should not be affected by __traits(compiles)