[code] template ouch(alias members) { static if ( members.length == 0 ) { const bool ouch = true; } else { // If you want to compile successfully, just comment out this one line. enum foo = "sup."; // Commenting the true removes the "is not an expression" error. // Commenting out the recursion leaves only the // "is not evaluatable at compile time" error. // Reversing the order has the same effect as removing the true. // See what combinations YOU can come up with! ;) const bool ouch = true && ouch!(members[1..$]); } } static assert( ouch!(["a","b"]) ); void main() {} [/code] As the comments suggest, things can be altered slightly to change what error messages are produced. The error messages it produces in its virgin (and most verbose form) are as follows: [code] main.d(16): Error: ouch!(["b"]) is not an expression main.d(16): Error: cannot implicitly convert expression (!!ouch!(["b"])) of type void to const(bool) main.d(21): Error: template instance main.ouch!(["a","b"]) error instantiating main.d(21): Error: static assert (ouch!(["a","b"])) is not evaluatable at compile time [/code] I'm actually not sure if it's supposed to be possible to pass string[]'s as alias parameters (passing them as straight string[]'s seems forbidden), but either way there is /something/ wrong.
Mass migration of bugs marked as x86-64 to just x86. The platform run on isn't what's relevant, it's if the app is a 32 or 64 bit app.
*** This issue has been marked as a duplicate of issue 7363 ***