2014/02/28 23:06 Nordlöw <[email protected]>: > > 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?
Maybe: cast(void)dg(); Kenji Hara
