Thread overview
[Issue 5184] New: throw ClassName.templatedStaticMethod(...) cannot be parsed
Nov 07, 2010
Kazuhiro Inaba
Apr 09, 2011
Kazuhiro Inaba
Dec 18, 2011
Kenji Hara
November 07, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=5184

           Summary: throw ClassName.templatedStaticMethod(...) cannot be
                    parsed
           Product: D
           Version: D1 & D2
          Platform: All
        OS/Version: Windows
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody@puremagic.com
        ReportedBy: kiki@kmonos.net


--- Comment #0 from Kazuhiro Inaba <kiki@kmonos.net> 2010-11-07 01:18:51 PST ---
The following code doesn't compile (in dmd 2.050 and 1.065), but I think it
should.

class Factory
{
    static Exception create(T)(T x)
    {
        return new Exception("whatever");
    }
}

void main()
{
    throw Factory.create(123);
}

Error message is the following:

> test.d(11): Error: type Factory is not an expression

Either one of the changes dissolves the compilation failure:

- Changing the method declaration into a non-template
    create(int x)
- Decomposing the throw statement as
    auto e = Factory.create(123); throw e;

The combination of throw+static+template seems causing a trouble.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
April 09, 2011
http://d.puremagic.com/issues/show_bug.cgi?id=5184



--- Comment #1 from Kazuhiro Inaba <kiki@kmonos.net> 2011-04-09 02:10:36 PDT ---
Created an attachment (id=941)
A patch to fix the issue

What was happening was:

1. Factory.create(123) is desugared into CommaExp: (Factory,
Factory.create(123)).
   This is done in CallExp::semantic when the method is static template method.
   I'm not at all sure but is this for keeping side-effects for some cases?

2. In e2ir.c TypeExp::toElem emits the compilation error; it tries to compile
   lhs and rhs into IR, but TypeExp cannot be compiled to IR.

The patch modifies the first point. If the expression is "TYPE . SOMETHING", the CommaExp insertion is disabled.

FYI, the problematic error is issued only inside ThrowStatement, because
in ThrowStatement::semantic, exp->optimize() is not called.
In, e.g., ReturnStatement::semantic optimizes away the TypeExp before toIR
convertion, so it won't cause any problem. (I don't know the reason why.)

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
December 18, 2011
http://d.puremagic.com/issues/show_bug.cgi?id=5184


Kenji Hara <k.hara.pg@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|                            |FIXED


--- Comment #2 from Kenji Hara <k.hara.pg@gmail.com> 2011-12-17 22:12:22 PST ---
https://github.com/D-Programming-Language/dmd/commit/5011154cdb4e9d48f4a866b18defb2b03f93a2b2

https://github.com/D-Programming-Language/dmd/commit/fdca0001179a43a188f3c003bf2b50757e250403

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