On Tuesday, 22 August 2017 at 16:27:05 UTC, Jonathan M Davis
wrote:
Well, templates aren't the only case where we have attribute
inference anymore (e.g. auto return functions have it), and I'm
pretty sure that there have been several requests for fixing
issues regards to local declarations so that they have
inference (in particular, I think that there have been
complaints about marking a function as pure having issues with
internal declarations then not being treated as pure even
though they could be). And for better or worse, the trend has
been towards adding inference in cases where it's guaranteed
that the code will always be available and will be available to
any code using that code - and in the case of a declaration
inside of a function like that, it's guaranted that anything
referencing it is going to have access to the code. So, it
doesn't surprise me at all if attribute inference has been
added to local declarations like this. If you want to guarantee
that no inference is happening, then you'll probably have to
declare it directly in the module where it can't be infered due
to the fact that a .di file could redeclare it without any
function bodies.
- Jonathan M Davis
Yeah, this happens with @safe main also (below), but not for more
regular local blocks. Anyway, I found it very confusing as that's
not how I assumed @safe applied to unittests or main worked.
@safe void main()
{
struct Foo {
int foo(int i, string s) @safe { return 0; }
double foo2(string s) @safe { return 0; }
}
printMemberTypes!(Foo);
}