[Issue 15002] [REG2.064] ICE interpret.c:331: virtual void CompiledCtfeFunction::onExpression(Expression*)::VarWalker::visit(ErrorExp*): Assertion `0' failed.

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Wed Sep 2 01:30:22 PDT 2015


https://issues.dlang.org/show_bug.cgi?id=15002

--- Comment #4 from Iain Buclaw <ibuclaw at gdcproject.org> ---
(In reply to Vladimir Panteleev from comment #3)
> (In reply to Iain Buclaw from comment #2)
> > Regression?  Regression from what?  Wrong-code to ICE?  Valid to ICE?  ICE
> > to another ICE?
> 
> From expected error message, to expected error message + ICE:
> 

It looks like CTFE still tries to have a go at interpreting the invalid code. 
All that change does is enforce that the front-end never passes to CTFE an
invalid state, so don't shoot the messenger!


Something like the following stops the invalid code from reaching CTFE:

diff --git a/src/init.d b/src/init.d
index dd9db91..1e53e22 100644
--- a/src/init.d
+++ b/src/init.d
@@ -822,15 +822,15 @@ public:
     Initializer semantic(Scope* sc, Type t, NeedInterpret needInterpret)
     {
         //printf("ExpInitializer::semantic(%s), type = %s\n", exp->toChars(),
t->toChars());
+        uint olderrors = global.errors;
         if (needInterpret)
             sc = sc.startCTFE();
         exp = exp.semantic(sc);
         exp = resolveProperties(sc, exp);
         if (needInterpret)
             sc = sc.endCTFE();
-        if (exp.op == TOKerror)
+        if (exp.op == TOKerror || olderrors != global.errors)
             return new ErrorInitializer();
-        uint olderrors = global.errors;
         if (needInterpret)
         {
             // If the result will be implicitly cast, move the cast into CTFE



Though the semantic passes should *really* do more in propagating ErrorExp up
rather than relying on checking 'global.errors' for checking for problems
during compilation.

--


More information about the Digitalmars-d-bugs mailing list