On Thu, Sep 1, 2016 at 9:09 PM, David Nadlinger via Digitalmars-d-announce <digitalmars-d-announce@puremagic.com> wrote:
On Thursday, 1 September 2016 at 16:43:53 UTC, Rory McGuire wrote:
is that in one of the "semantic" passes the compiler has?

For reference, I've laid out the reasons why this proposal couldn't work to Stefan here: https://github.com/dlang/dmd/pull/6098#issuecomment-243375543

The real reason is not so much in the pass structure of the compiler as in the fact that CTFE by definition executes the same function body that is also emitted to the runtime binary.

 — David

okay thanks, I'll take a look at the link.

Question: if the function runs the same, why can't I catch the exception? From what Stefan said even if I could catch the exception static if still wouldn't compile different code.

bool _checkCTFE() {
try {
import std.uuid;
enum id = new UUID("8AB3060E-2cba-4f23-b74c-b52db3bdfb46");
return false;
} catch (Throwable t) {
return true;
}
}

The above still fails during CTFE, compiler just exists with:
enforceCTFE.d(20): Error: variable enforceCTFE._checkCTFE.id : Unable to initialize enum with class or pointer to struct. Use static const variable instead.


So why can't we even catch the Error during CTFE, that would at least help somewhat.

At the moment I just have a verbose logging mode with pragma(msg) for my CTFE stuff.