www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 2454] New: tupleof(member) is incorrectly evaluated inside foreach over members-tuple

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

           Summary: tupleof(member) is incorrectly evaluated inside foreach
                    over members-tuple
           Product: D
           Version: 2.020
          Platform: PC
        OS/Version: Windows
            Status: NEW
          Severity: major
          Priority: P2
         Component: DMD
        AssignedTo: bugzilla digitalmars.com
        ReportedBy: 2korden gmail.com


struct B
{
    float i;
    double j;
    int k;

    void test()
    {
        foreach (m; this.tupleof) {
            writefln(typeof(m).stringof);
        }
    }
}

void main()
{
    B b;
    b.test();
}


-- 
Nov 14 2008
next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2454


shro8822 vandals.uidaho.edu changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |shro8822 vandals.uidaho.edu





If a struct has a member that is a struct, I would expect that this would work.
As for non struct members, the logical thing to do would be to make that work
anyway to avoid corner cases.

Or are you saying the result of the tupleof is not what it should be?


-- 
Nov 14 2008
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2454






My bad, I forgot attaching the expected and actual result. Here they are:

Expected output:
float
double
int

Actual output:
float
float
float

The tuple is ok, but foreach body "instantiated" incorrectly.


-- 
Nov 14 2008
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2454


2korden gmail.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
            Summary|tupleof(member) is          |typeof(object) is
                   |incorrectly evaluated inside|incorrectly evaluated
                   |foreach over members-tuple  |





I believe this is relevant:

import std.stdio;

void foo(T)(T t)
{
    assert(is(typeof(t) == T));
    writeln(T.stringof);
    writefln(typeof(t).stringof);
}

struct A
{
    int i;

    void test()
    {
        foreach (m; this.tupleof) {
            foo(m); // line 17
        }
    }
}

void main()
{
    foo(new A());
}

Expected output:
A*
A*

Actual output:
A*
int

Looks like result of typeof(t) is evaluated just once at compile time and then
reused at every template instantiation. Commenting line 17 hides the issue.


-- 
Nov 14 2008
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2454






What version? 

version: 1026  // what codepad.org uses
float
double
int


-- 
Nov 14 2008
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2454






 Version: 2.020
--
Nov 14 2008
prev sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2454


Don <clugdbug yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
                 CC|                            |clugdbug yahoo.com.au
         Resolution|                            |FIXED



Fixed DMD2.023 (failed in 2.022).

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