Bug 3338 – template "is not an expression", "of type void", and "is not evaluatable at compile time" combo error.

Status
RESOLVED
Resolution
DUPLICATE
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
x86
OS
Linux
Creation time
2009-09-22T00:52:00Z
Last change time
2015-06-09T01:26:47Z
Assigned to
nobody
Creator
chadjoan

Comments

Comment #0 by chadjoan — 2009-09-22T00:52:54Z
[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.
Comment #1 by braddr — 2011-02-06T15:39:25Z
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.
Comment #2 by yebblies — 2012-02-03T23:42:04Z
*** This issue has been marked as a duplicate of issue 7363 ***