On Friday, 4 January 2019 at 14:36:16 UTC, Mike Parker wrote:
v is a run-time value, not available at compile time.

Sorry about that, looks like if I edit the text in the run.dlang.io editor, the link also gets updated. I was using "void opAssign(T)(T v)" in the initial example, but it seems that I got the idea.

So even if I'd write opAssign or @property as a template function, I won't be able to get their arguments at compile time because every template takes different set of arguments: for compile time and for run time.

And due to the fact that D is calling opAssign as obj.opAssign(arg) and not as obj.opAssign!(arg)(arg), this is not possible to get the runtime arguments.

On Saturday, 5 January 2019 at 01:38:43 UTC, Jonathan M Davis wrote:
I suggest that you read

https://wiki.dlang.org/User:Quickfur/Compile-time_vs._compile-time

IIRC, it's still a work in progress, but it should give you a much clearer idea of how CTFE fits into things.

Many thanks for this article! Now I understand it much better.

So it seems that the only "true way" is to use the struct invariant feature, but this will work only at run time.

It turned out that I just want some compile-time mechanism (static analyzer?) that will validate (solve) all reachable constraints in the program.

Then I'd like to reformulate the question: is there any tools or compiler features that are capable of validating asserts at compile time?

Thanks!

Reply via email to