Idea: Context sensitive attribute functions.
Dennis
dkorpel at gmail.com
Tue Jun 19 22:22:23 UTC 2018
On Tuesday, 19 June 2018 at 21:38:14 UTC, Jonathan M Davis wrote:
> Attribute inference is all about inferring the attributes of
> the templated function based on its implementation, not
> adjusting its implementation based on where it's used.
Indeed, I realised that the same template instantiation can't
possibly have both a @nogc and @gc version, so there has to be a
template parameter. You can automatically set one however:
```
void main() @nogc {
example();
}
void example(string callee = __FUNCTION__)() {
int a = 8;
static if (isNoGc!callee) {
printf("printf %d", a);
} else {
writefln("writeln %d", a);
}
}
bool isNoGc(string functionName)() {
import std.algorithm;
mixin(`return [__traits(getFunctionAttributes,
`~functionName~`)].canFind("@nogc");`);
}
```
This seems to work. I'm not sure how robust it is though. You
might need an extra `mixin("import "~functionName~";");` in
`isNoGc` when it's called from other modules (if that helps at
all).
More information about the Digitalmars-d
mailing list