Checking the Return Type of a Template Alias Parameter in assertCTFEable

"Nordlöw" per.nordlow at gmail.com
Fri Feb 28 06:02:34 PST 2014


I have a solution to Issue 388 at

https://github.com/nordlow/dmd/commits/master

that works nicely for my projects.

This patch however generates a handful of warnings in Phobos 
unittests.

All of these are IMO fixable except for one which I don't know 
how to fix namely the definition of assertCTFEable in exception.d

I need to change this to explicitly capture the return value of 
the template alias argument dg when this is non-void. My try so 
far was to change

version(unittest) package
@property void assertCTFEable(alias dg)()
{
     static assert({ dg(); return true; }());
     dg();
}

to

version(unittest) package
@property void assertCTFEable(alias dg)()
{
     static assert
         ({
             static if (is(typeof(db()) == void)) {
                 dg();
             } else {
                 auto x = dg();
             }
             return true;
         }());
     static if (is(typeof(db()) == void)) {
         dg();
     } else {
         auto x = dg();
     }
}

gives the following error when in Phobos make unittest:

std/exception.d(1392): Error: variable 
std.exception.assertCTFEable!(function ()
{
S[] r = array(repeat((S __ctmp1582 = 0;
  , __ctmp1582).this(1), 2LU));
assert(equal(r, [(S __ctmp1591 = 0;
  , __ctmp1591).this(1), (S __ctmp1592 = 0;
  , __ctmp1592).this(1)]));
}
).assertCTFEable.__lambda1.x type void is inferred from 
initializer (*function ()
{
S[] r = array(repeat((S __ctmp1582 = 0;
  , __ctmp1582).this(1), 2LU));
assert(equal(r, [(S __ctmp1591 = 0;
  , __ctmp1591).this(1), (S __ctmp1592 = 0;
  , __ctmp1592).this(1)]));
}
)(), and variables cannot be of type void
std/exception.d(1392): Error: expression (*function ()
{
S[] r = array(repeat((S __ctmp1582 = 0;
  , __ctmp1582).this(1), 2LU));
assert(equal(r, [(S __ctmp1591 = 0;
  , __ctmp1591).this(1), (S __ctmp1592 = 0;
  , __ctmp1592).this(1)]));
}
)() is void and has no value

How can I in a general way check if dg evaluates to void or not?


More information about the Digitalmars-d mailing list