Conditional nothrow/safe/nogc/etc?
Is there any way to specify that a generic function is conditionally nothrow (or other function decorators), based on whether the template instantiation is nothrow? I'm looking for something akin to C++'s noexcept(noexcept()), e.g.: template void foo() noexcept(noexcept(T())) {} I don't see anything about it on the functions grammar page (https://dlang.org/spec/function.html). I do see something to do with nothrow_ on the std.traits page, but I'm not sure how to use it to achieve this or whether that is the right approach. My actual use case is a non-generic method opAssign inside of a generic struct.
Re: Conditional nothrow/safe/nogc/etc?
On Sat, Jan 30, 2016 at 05:37:07AM +, Matt Elkins via Digitalmars-d-learn wrote: > On Saturday, 30 January 2016 at 05:25:49 UTC, Rikki Cattermole wrote: > >On 30/01/16 6:17 PM, Matt Elkins wrote: > >>[...] > > > >templated functions have attribute inference. Meaning if it can be > >nothrow it will be. > >Regarding your real use case, again struct if templated so it should > >be inferred. > > Convenient! Thanks! A common idiom that we use is to write an attributed unittest to verify that the function itself is @safe/etc.. This way, if instantiated with safe/etc. types, the template will also be safe/etc., but if instantiated with an unsafe type, it will correspondingly be unsafe (instead of failing to compile if you wrote @safe on the template). The unittest ensures that you do not accidentally introduce un-@safe code into the template and cause *all* instantiations to become un-@safe. auto mySafeCode(T)(T t) { ... } @safe unittest { auto x = mySafeCode(safeValue); } T -- Why are you blatanly misspelling "blatant"? -- Branden Robinson
Re: Conditional nothrow/safe/nogc/etc?
On Saturday, 30 January 2016 at 05:25:49 UTC, Rikki Cattermole wrote: On 30/01/16 6:17 PM, Matt Elkins wrote: [...] templated functions have attribute inference. Meaning if it can be nothrow it will be. Regarding your real use case, again struct if templated so it should be inferred. Convenient! Thanks!
Re: Conditional nothrow/safe/nogc/etc?
On 30/01/16 6:17 PM, Matt Elkins wrote: Is there any way to specify that a generic function is conditionally nothrow (or other function decorators), based on whether the template instantiation is nothrow? I'm looking for something akin to C++'s noexcept(noexcept()), e.g.: template void foo() noexcept(noexcept(T())) {} I don't see anything about it on the functions grammar page (https://dlang.org/spec/function.html). I do see something to do with nothrow_ on the std.traits page, but I'm not sure how to use it to achieve this or whether that is the right approach. My actual use case is a non-generic method opAssign inside of a generic struct. templated functions have attribute inference. Meaning if it can be nothrow it will be. Regarding your real use case, again struct if templated so it should be inferred.
Re: Conditional nothrow/safe/nogc/etc?
On Saturday, 30 January 2016 at 05:57:34 UTC, H. S. Teoh wrote: A common idiom that we use is to write an attributed unittest to verify that the function itself is @safe/etc.. This way, if instantiated with safe/etc. types, the template will also be safe/etc., but if instantiated with an unsafe type, it will correspondingly be unsafe (instead of failing to compile if you wrote @safe on the template). The unittest ensures that you do not accidentally introduce un-@safe code into the template and cause *all* instantiations to become un-@safe. auto mySafeCode(T)(T t) { ... } @safe unittest { auto x = mySafeCode(safeValue); } T Seems sound. Thanks!