www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 4841] New: An array()/map inlining problem

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

           Summary: An array()/map inlining problem
           Product: D
           Version: D2
          Platform: x86
        OS/Version: Windows
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody puremagic.com
        ReportedBy: bearophile_hugs eml.cc


--- Comment #0 from bearophile_hugs eml.cc 2010-09-08 04:08:00 PDT ---
This is a D2 program:


import std.algorithm: map;
import std.array: array;
void main() {
    int c;
    array(map!((x){return c;})([1]));
}


It works if you compile it with dmd 2.048 with:
dmd test.d

But if use inlining:
dmd -inline test.d
It doesn't compile and dmd returns:
test.d(5): Error: function D main is a nested function and cannot be accessed
from array

I think this is a compiler bug because inlining should not affect the
compilability of a program.

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


Don <clugdbug yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |clugdbug yahoo.com.au
            Summary|An array()/map inlining     |-inline wrecks delegate
                   |problem                     |literals as alias
                   |                            |parameters (An array()/map
                   |                            |inlining problem)


--- Comment #1 from Don <clugdbug yahoo.com.au> 2010-09-10 00:02:24 PDT ---
Original title: "An array()/map inlining problem"
Here's a simpler case that gives the same error message, only with -inline:

---
struct Struct4841(alias pred)
{
    this(int k) { }
}

void bug4841a() {
      Struct4841!(   (t) { any_old_garbage;} )(  1 );   
}

void bug4841b() {
   bug4841a();
}
---
This is a problem with delegates and alias templates. It's not a regression.
There also seems to be an accepts-invalid bug in this. You can put any old
garbage inside the alias, which seems odd. And you cannot declare a variable of
type Struct4841!(   (t) { any_old_garbage;} ) --- it's rejected at the parsing
stage.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Sep 10 2010
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=4841


Trass3r <mrmocool gmx.de> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |mrmocool gmx.de


--- Comment #2 from Trass3r <mrmocool gmx.de> 2012-01-16 12:41:31 PST ---
I think the following test case also belongs to this issue:

R1 find(alias pred = "a == b", R1, R2)(R1 haystack, R2 needle)
{
        return simpleMindedFind!pred(haystack, needle);
}
R1 simpleMindedFind(alias pred, R1, R2)(R1 haystack, R2 needle)
{
    bool haystackTooShort()
    {
            return true;
    }

    return haystack;
}

sizediff_t indexOf(Char1, Char2)(const(Char1)[] s, const(Char2)sub)
{
    const(Char1)[] balance = find!({})(s, sub);
    return -1;
}

string extStr;
void main()
{
    extStr.indexOf("bla");
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jan 16 2012
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=4841


David Simcha <dsimcha yahoo.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |dsimcha yahoo.com


--- Comment #3 from David Simcha <dsimcha yahoo.com> 2012-01-24 13:41:43 PST ---
*** Issue 4724 has been marked as a duplicate of this issue. ***

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jan 24 2012
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=4841


Don <clugdbug yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Target Milestone|---                         |2.059
            Summary|-inline wrecks delegate     |-inline wrecks nested
                   |literals as alias           |struct with alias template
                   |parameters (An array()/map  |parameter (An array()/map
                   |inlining problem)           |inlining problem)


--- Comment #4 from Don <clugdbug yahoo.com.au> 2012-01-27 00:35:53 PST ---
Further reduced shows neither constructor nor delegate is required.

struct Struct4841(alias pred)
{
    void unused_func();
}

void bug4841a() {
   int w;
   Struct4841!(  w ) m;   
}

void bug4841b() {
   bug4841a();
}

----------------
The unused function is required only because it makes Struct4841 into a nested
struct.
I think it is because moving a templated nested struct changes its type - the
enclosing function is part of the mangled name, or something like that. It
can't trivially be moved around.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jan 27 2012
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=4841



--- Comment #5 from github-bugzilla puremagic.com 2012-02-05 12:34:31 PST ---
Commit pushed to master at https://github.com/D-Programming-Language/dmd

https://github.com/D-Programming-Language/dmd/commit/7766bbd9857ab5ad5b1d5ff0444cb7088823a793
fix Issue 4841 - -inline wrecks nested struct with alias template parameter (An
array()/map inlining problem)

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


Walter Bright <bugzilla digitalmars.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
                 CC|                            |bugzilla digitalmars.com
         Resolution|                            |FIXED


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


David Simcha <dsimcha yahoo.com> changed:

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


--- Comment #6 from David Simcha <dsimcha yahoo.com> 2012-02-05 21:07:57 PST ---
I just tested the fix that was merged recently.  It only fixes some cases such
as Don's and Tass3r's.  Bearophile's case is still broken, as is the case I
reported in Bug 4724.

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



--- Comment #7 from Walter Bright <bugzilla digitalmars.com> 2012-02-05
22:08:20 PST ---
I believe this is the same as bug 5939.

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



--- Comment #8 from Don <clugdbug yahoo.com.au> 2012-02-06 10:00:46 PST ---
(In reply to comment #7)
 I believe this is the same as bug 5939.
I don't think bug 5939 involves -inline, but this one definitely does. Unless there are plans to make compiler changes are to fix bug 5939, the inliner shouldn't be making this transformation. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Feb 06 2012
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=4841



--- Comment #9 from bearophile_hugs eml.cc 2012-02-21 14:18:15 PST ---
See also Issue 7559

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Feb 21 2012
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=4841


Jonathan M Davis <jmdavisProg gmx.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jmdavisProg gmx.com


--- Comment #10 from Jonathan M Davis <jmdavisProg gmx.com> 2013-02-16 15:54:35
PST ---
Another example of this would be:

import std.string;

void main()
{
    auto str = new char[](5);
    assert(sformat(str, "%s", 42) == "42");
}

If you compile with -inline, it fails to compile with the latest master, giving

/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/string.d(2593): Error:
function std.string.sformat!(char, int).sformat is a nested function and cannot
be accessed from std.range.put!(Sink, const(char)).put
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/string.d(2593): Error:
function std.string.sformat!(char, int).sformat is a nested function and cannot
be accessed from std.range.put!(Sink, const(char)).put
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/string.d(2596): Error:
function std.string.sformat!(char, int).sformat is a nested function and cannot
be accessed from std.range.put!(Sink, const(char)).put
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/string.d(2596): Error:
function std.string.sformat!(char, int).sformat is a nested function and cannot
be accessed from std.range.put!(Sink, const(char)).put
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/string.d(2596): Error:
function std.string.sformat!(char, int).sformat is a nested function and cannot
be accessed from std.range.put!(Sink, const(char)).put
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/string.d(2597): Error:
function std.string.sformat!(char, int).sformat is a nested function and cannot
be accessed from std.range.put!(Sink, const(char)).put
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/string.d(2593): Error:
function std.string.sformat!(char, int).sformat is a nested function and cannot
be accessed from std.range.put!(Sink, char).put
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/string.d(2593): Error:
function std.string.sformat!(char, int).sformat is a nested function and cannot
be accessed from std.range.put!(Sink, char).put
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/string.d(2596): Error:
function std.string.sformat!(char, int).sformat is a nested function and cannot
be accessed from std.range.put!(Sink, char).put
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/string.d(2596): Error:
function std.string.sformat!(char, int).sformat is a nested function and cannot
be accessed from std.range.put!(Sink, char).put
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/string.d(2596): Error:
function std.string.sformat!(char, int).sformat is a nested function and cannot
be accessed from std.range.put!(Sink, char).put
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/string.d(2597): Error:
function std.string.sformat!(char, int).sformat is a nested function and cannot
be accessed from std.range.put!(Sink, char).put
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/string.d(2601): Error:
function std.string.sformat!(char, int).sformat is a nested function and cannot
be accessed from std.range.put!(Sink, char[]).put
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/string.d(2601): Error:
function std.string.sformat!(char, int).sformat is a nested function and cannot
be accessed from std.range.put!(Sink, char[]).put
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/string.d(2604): Error:
function std.string.sformat!(char, int).sformat is a nested function and cannot
be accessed from std.range.put!(Sink, char[]).put
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/string.d(2604): Error:
function std.string.sformat!(char, int).sformat is a nested function and cannot
be accessed from std.range.put!(Sink, char[]).put
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/string.d(2604): Error:
function std.string.sformat!(char, int).sformat is a nested function and cannot
be accessed from std.range.put!(Sink, char[]).put
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/string.d(2605): Error:
function std.string.sformat!(char, int).sformat is a nested function and cannot
be accessed from std.range.put!(Sink, char[]).put
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/string.d(2601): Error:
function std.string.sformat!(char, int).sformat is a nested function and cannot
be accessed from std.range.put!(Sink, const(char)[]).put
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/string.d(2601): Error:
function std.string.sformat!(char, int).sformat is a nested function and cannot
be accessed from std.range.put!(Sink, const(char)[]).put
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/string.d(2604): Error:
function std.string.sformat!(char, int).sformat is a nested function and cannot
be accessed from std.range.put!(Sink, const(char)[]).put

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Feb 16 2013
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=4841



--- Comment #11 from bearophile_hugs eml.cc 2013-03-01 04:42:22 PST ---
import std.array: array;
import std.algorithm: map;
void main() {
    int[] foo;
    auto r1 = map!(i => foo[0])([0]);
    auto r2 = array(r1);
}


Gives (dmd 2.063 alpha):

temp.d(5): Error: function D main is a nested function and cannot be accessed
from std.array.array!(MapResult!(__lambda2, int[])).array

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


Denis Shelomovskij <verylonglogin.reg gmail.com> changed:

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


--- Comment #12 from Denis Shelomovskij <verylonglogin.reg gmail.com>
2013-06-10 16:40:53 MSD ---
*** Issue 9187 has been marked as a duplicate of this issue. ***

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jun 10 2013
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=4841


Denis Shelomovskij <verylonglogin.reg gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |html exc.eu


--- Comment #13 from Denis Shelomovskij <verylonglogin.reg gmail.com>
2013-06-10 16:43:09 MSD ---
*** Issue 9996 has been marked as a duplicate of this issue. ***

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jun 10 2013
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=4841


Denis Shelomovskij <verylonglogin.reg gmail.com> changed:

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


--- Comment #14 from Denis Shelomovskij <verylonglogin.reg gmail.com>
2013-06-10 16:46:21 MSD ---
*** Issue 7129 has been marked as a duplicate of this issue. ***

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jun 10 2013
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=4841


Denis Shelomovskij <verylonglogin.reg gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |verylonglogin.reg gmail.com


--- Comment #15 from Denis Shelomovskij <verylonglogin.reg gmail.com>
2013-06-10 16:47:35 MSD ---
Currently failing tests:

1. From Description
---
import std.algorithm: map;
import std.array: array;

void main()
{
    int c;
    map!(x => c)([1]).array();
}
---

2. From Comment 10
---
import std.string;

void main()
{
    assert(new char[5].sformat("%s", 42) == "42");
}
---

3. From Issue 7129 Comment 4
---
auto fun()
{
    int i;
    struct Result
    {
        this(int u) {}

        auto bar() { i = 42; }
    }
    return Result();
}

void main()
{
    auto t = fun();
    t.bar();
}
---

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jun 10 2013
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=4841



--- Comment #16 from Denis Shelomovskij <verylonglogin.reg gmail.com>
2013-06-10 16:54:37 MSD ---
As mixing -inline/non-inline modules may result in a wrong code because of
Issue 9193 one can use "-inline" only for toy D projects.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jun 10 2013
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=4841


Denis Shelomovskij <verylonglogin.reg gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Platform|x86                         |All
   Target Milestone|2.059                       |---
         OS/Version|Windows                     |All


-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jun 10 2013
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=4841



--- Comment #17 from bearophile_hugs eml.cc 2013-06-10 15:13:45 PDT ---
(In reply to comment #16)
 As mixing -inline/non-inline modules may result in a wrong code because of
 Issue 9193 one can use "-inline" only for toy D projects.
If you believe that to be true, then I think you should raise the Importance of this issue to Major. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Jun 10 2013
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=4841


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

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |pull


--- Comment #18 from Kenji Hara <k.hara.pg gmail.com> 2013-07-09 20:27:33 PDT
---
https://github.com/D-Programming-Language/dmd/pull/2329

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jul 09 2013
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=4841



--- Comment #19 from github-bugzilla puremagic.com 2013-07-11 23:49:29 PDT ---
Commits pushed to master at https://github.com/D-Programming-Language/dmd

https://github.com/D-Programming-Language/dmd/commit/1fbbe5966e372abb20e70c4ac69ecfaeaa6db952
fix Issue 4841 - -inline wrecks certain nested structs causing error "*** is a
nested function and cannot be accessed from ***"

https://github.com/D-Programming-Language/dmd/commit/c19b8a43f45da1347302d3b49a3d1b0b53997003
Merge pull request #2329 from 9rnsr/fix4841

Issue 4841 - -inline wrecks certain nested structs causing error "*** is a
nested function and cannot be accessed from ***"

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jul 11 2013
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=4841


Walter Bright <bugzilla digitalmars.com> changed:

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


-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jul 11 2013
prev sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=4841


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

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |code benjamin-thaut.de


--- Comment #20 from Kenji Hara <k.hara.pg gmail.com> 2013-10-10 04:59:50 PDT
---
*** Issue 11210 has been marked as a duplicate of this issue. ***

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