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 ***