On 7 December 2017 at 17:45, Nicholas Wilson via Digitalmars-d < digitalmars-d@puremagic.com> wrote:
> On Friday, 8 December 2017 at 01:30:13 UTC, Manu wrote: > >> I tried this, and was surprised it didn't work: >> >> int ctfeOnly(int x) >> { >> static assert(__ctfe); >> return x + 1; >> } >> >> This would probably solve the problem in a satisfying way without an >> attribute? >> > > I think that's because __ctfe, despite being magic, is actually a regular > variable. > > While this looks not too inelegant for a user perspective, I dont know how > to handle this from a compiler perspective: filtering by attribute is as > easy as "does this function have a UDA ctfeonly? If so, don't code generate > it. Generating errors at codegen time is also trivial: when generating a > call check to see if the callee is @ctfeonly, if it is give an error message > > I don't know how to do that for a `static assert(__ctfe);`. That would > require changes and semantic analysis in the front end which I am much less > familiar with. > Oh, sorry, I forgot key detail! (parens) int ctfeOnly()(int x) ... (in my mind, it was a template function, which means it would instantiate for the ctfe call separately to regular calls(?))