[Issue 3737] SEG-V at expression.c:6255 from bad opDispatch

d-bugmail at puremagic.com d-bugmail at puremagic.com
Tue Jan 26 00:06:32 PST 2010


http://d.puremagic.com/issues/show_bug.cgi?id=3737


Don <clugdbug at yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |patch
            Summary|SEG-V at expression.c:6255  |SEG-V at expression.c:6255
                   |from bad code               |from bad opDispatch


--- Comment #6 from Don <clugdbug at yahoo.com.au> 2010-01-26 00:06:30 PST ---
Cause: If global.errors && !global.gag, TemplateInstance::semantic doesn't set
'inst'. So this is a possible patch (not recommended) inside template.c:

    {
    if (!global.gag)
    {
        /* Trying to soldier on rarely generates useful messages
         * at this point.
         */
        fatal();
    }
+    inst = this; // error recovery
    return;
    }
===
But, on the other hand, most other functions in expression.c only run
ti->semantic() if there are global.errors.

So this patch to expression.c line 6252 may be better:

Expression *DotTemplateInstanceExp::semantic(Scope *sc)
{
#if LOGSEMANTIC
    printf("DotTemplateInstanceExp::semantic('%s')\n", toChars());
#endif
    Expression *eleft;
    Expression *e = new DotIdExp(loc, e1, ti->name);
L1:
    e = e->semantic(sc);

    if (e->op == TOKdottd)
    {
+    if (global.errors) return new ErrorExp();
    DotTemplateExp *dte = (DotTemplateExp *)e;
    TemplateDeclaration *td = dte->td;

The same problem occurs in mtype.c, line 6613, 7101, inside ::dotExp(), for
structs and classes, and they should probably have the same fix.
(they shouldn't be running ti->semantic() if there are global errors).

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list