www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 5708] New: Error in std.typecons when -release, -inline, and -noboundscheck are all enabled

reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5708

           Summary: Error in std.typecons when -release, -inline, and
                    -noboundscheck are all enabled
           Product: D
           Version: unspecified
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: major
          Priority: P2
         Component: DMD
        AssignedTo: nobody puremagic.com
        ReportedBy: jmdavisProg gmx.com



PST ---
From Tom on D.Learn (and I've confirmed it on Linux with both -m32 and -m64):

Minimal test case:

import std.stdio;
import std.conv;

int main(string[] args) {
        int[string] t;
        writeln(text(t));
        return 0;
}

Tried:

dmd -O -release -inline -noboundscheck -c -Isrc src\main.d -> ERROR
dmd    -release -inline -noboundscheck -c -Isrc src\main.d -> ERROR
dmd -O          -inline -noboundscheck -c -Isrc src\main.d -> OK
dmd -O -release         -noboundscheck -c -Isrc src\main.d -> OK
dmd -O -release -inline                -c -Isrc src\main.d -> OK

Where ERROR is:

E:\d\dmd2\windows\bin\..\..\src\phobos\std\typecons.d(364): expression 
expected, not 'EOF'
E:\d\dmd2\windows\bin\..\..\src\phobos\std\typecons.d(364): found 'EOF' 
when expecting ']'
E:\d\dmd2\windows\bin\..\..\src\phobos\std\typecons.d(364): found 'EOF' 
when expecting ')' following template argument list
E:\d\dmd2\windows\bin\..\..\src\phobos\std\typecons.d(364): found 'EOF' 
when expecting ']'
E:\d\dmd2\windows\bin\..\..\src\phobos\std\typecons.d(364): found 'EOF' 
when expecting ')' following template argument list
E:\d\dmd2\windows\bin\..\..\src\phobos\std\typecons.d(364): found 'EOF' 
when expecting ']'
E:\d\dmd2\windows\bin\..\..\src\phobos\std\typecons.d(364): found 'EOF' 
when expecting ')' following template argument list
E:\d\dmd2\windows\bin\..\..\src\phobos\std\typecons.d(364): found 'EOF' 
when expecting ']'
E:\d\dmd2\windows\bin\..\..\src\phobos\std\typecons.d(364): found 'EOF' 
when expecting ')' following template argument list
E:\d\dmd2\windows\bin\..\..\src\phobos\std\typecons.d(364): found 'EOF' 
when expecting ']'
E:\d\dmd2\windows\bin\..\..\src\phobos\std\typecons.d(364): found 'EOF' 
when expecting ')' following template argument list
E:\d\dmd2\windows\bin\..\..\src\phobos\std\typecons.d(364): found 'EOF' 
when expecting ']'
E:\d\dmd2\windows\bin\..\..\src\phobos\std\typecons.d(364): found 'EOF' 
when expecting ')' following template argument list
E:\d\dmd2\windows\bin\..\..\src\phobos\std\typecons.d(364): found 'EOF' 
when expecting ']'
E:\d\dmd2\windows\bin\..\..\src\phobos\std\typecons.d(364): found 'EOF' 
when expecting ')' following template argument list
E:\d\dmd2\windows\bin\..\..\src\phobos\std\typecons.d(364): found 'EOF' 
when expecting ']'
E:\d\dmd2\windows\bin\..\..\src\phobos\std\typecons.d(364): found 'EOF' 
when expecting ')' following template argument list
E:\d\dmd2\windows\bin\..\..\src\phobos\std\typecons.d(364): found 'EOF' 
when expecting ']'
E:\d\dmd2\windows\bin\..\..\src\phobos\std\typecons.d(364): found 'EOF' 
when expecting ')' following template argument list
E:\d\dmd2\windows\bin\..\..\src\phobos\std\typecons.d(364): found 'EOF' 
when expecting ']'
E:\d\dmd2\windows\bin\..\..\src\phobos\std\typecons.d(364): found 'EOF' 
when expecting ')' following template argument list

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Mar 05 2011
next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5708


bearophile_hugs eml.cc changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |bearophile_hugs eml.cc



Problem confirmed on Windows, DMD 2.052, compiled with:
-inline -release -noboundscheck

A bit reduced code:


import std.conv: to;
void main() {
    int[string] aa;
    to!string(aa);
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Mar 05 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5708




More reduction:

import std.conv: to;
void main() {
    int[int] aa;
    foreach (v; aa)
        to!string("");
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Mar 05 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5708




PST ---
Well, given the error, it involves creating a tuple, which none of the code
here is doing directly, so in theory, it should be possible to reduce it to
code which creates a tuple, but I don't know how you'd do that in this case. I
assume that v in the foreach loop is a tuple of the key and value, and that's
probably where the problem is, but I don't use associative arrays all that
often, and when I do, I rarely iterate over them, so I'm not sure. Regardless,
if you're really trying to reuduce it, in theory, you should be able to reduce
it down to the creation of a tuple with a particular set of types.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Mar 05 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5708





 I assume that v in the foreach loop is a tuple of the key and value,
It's just a value, so it's an int. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Mar 05 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5708


kennytm gmail.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |kennytm gmail.com



It has nothing to do with the AA. Also, -inline alone is actually enough to
trigger this bug. This seems to be a problem in string pooling in compile time.


import std.conv;
import std.typecons;

void ik(T,U)(T t, U u) {
    Tuple!(T,U) x;
}
pragma(msg, ik!(string,string));

void main() {
    () { to!string("lit"); } ();
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Mar 06 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5708




Further removing the Tuple:



import std.conv;

void ik(T)(T) {
    enum a = to!string("foo") ~ to!string("bar");
    static assert(a == "foobar");
}
alias ik!int ik2;

void main() {
    cast(void) () { to!string("lit"); };
}

As of 2.052 it asserts:

~/Downloads:911$ dmd -inline y.d
y.d(5): Error: static assert  ("foofoo" == "foobar") is false
y.d(7):        instantiated from here: ik!(int)

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Mar 06 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5708




Further removing all Phobos dependency:



string b(string s) { return s; }
string a(string s) { return b(s); }

void ik(T)(T) {
    enum p = a("foo");
    enum q = a("bar");
    static assert(q == "bar");
}
alias ik!int ik2;

void main() {
    cast(void) () { a("lit"); };
}



Currently asserts:

y.d(7): Error: static assert  ("foo" == "bar") is false
y.d(9):        instantiated from here: ik!(int)

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Mar 06 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5708


Don <clugdbug yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |clugdbug yahoo.com.au
            Summary|Error in std.typecons when  |Incorrect string constant
                   |-release, -inline, and      |folding with -inline
                   |-noboundscheck are all      |
                   |enabled                     |
           Severity|major                       |critical


-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Mar 15 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5708


Nick Sabalausky <cbkbbejeap mailinator.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |cbkbbejeap mailinator.com



03:33:16 PDT ---
Don's still-in-progress CTFE overhaul seems to fix this:
https://github.com/donc/dmd/tree/ctfemem

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Apr 08 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5708


Don <clugdbug yahoo.com.au> changed:

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




 Don's still-in-progress CTFE overhaul seems to fix this:
 https://github.com/donc/dmd/tree/ctfemem
Yes, it fixes almost all CTFE bugs involving arrays. Fixed. D1: https://github.com/D-Programming-Language/dmd/commit/ef2a0f1da10331c4de102ca3e029ea1c1c1a46bf D2: https://github.com/D-Programming-Language/dmd/commit/0219a5f0dcc88076759a4c472582954d0fb804b0 -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Apr 08 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5708


Jimmy Cao <jcao219 gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jcao219 gmail.com



It doesn't seem like this is fixed in dmd 2.053, but it should be according to
the changelog.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 29 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5708





 It doesn't seem like this is fixed in dmd 2.053, but it should be according to
 the changelog.
Can you describe what's failing? The test in comment 7 works for me. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
May 29 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5708




The test in comment 7 asserts for me.
I'm using dmd 2.053 on Windows.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 29 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5708




It doesn't work on Fedora 15 either.

I'm using dmd 2.053 directly from the zip file on the digitalmars site (for
both Fedora 15 and Windows).

Don, is your dmd built from source?  Maybe there's a difference between mine
and yours.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 29 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5708


Don <clugdbug yahoo.com.au> changed:

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



I think there was something wrong with that test case, it wasn't instantiating
the template. Here's a reduced test case:

string b(string s) { return s; }
string a(string s) { return b(s); }

void bug5708() {
    void m() { a("lit"); }
    static assert(a("foo") == "foo");
    static assert(a("bar") == "bar");
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 30 2011
prev sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5708


Don <clugdbug yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|REOPENED                    |RESOLVED
         Resolution|                            |FIXED
            Summary|Incorrect string constant   |[CTFE] Incorrect string
                   |folding with -inline        |constant folding with
                   |                            |-inline



It was accidentally fixed in this commit:
6072 - [CTFE] Regression(git master): Cannot declare variable inside an 'if'
condition

which actually fixed the treatment of comma expressions in CTFE.

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

I'm adding this to the test suite so it stays fixed.

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