www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 1148] New: Problems returning structs from functions

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

           Summary: Problems returning structs from functions
           Product: D
           Version: 1.010
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: major
          Priority: P2
         Component: DMD
        AssignedTo: bugzilla digitalmars.com
        ReportedBy: mtwatkin mtu.edu


This issue may be related to issue 997, but it appears to be somewhat different
to me.

The code at the bottom of this error report is expected to print:
Returning <1.000000, 0.000000, 0.000000>
Returned: <1.000000, 0.000000, 0.000000>

However, the actual result is
Returning <1.000000, 0.000000, 0.000000>
Returned: <0.000000, 0.000000, 0.000000>

if "Vector b = Vector(); return b;" is changed to "return Vector();" in foobar,
the code appears to work properly. Depending on the parameters passed to the
function, the result changes. For example, if bar is declared "private void
bar(uint x, uint y)", and is called from foo with "bar(2, 3)", then it will
print:
Returning <1.000000, 0.000000, 0.000000>
Returned: <0.000000, 1.000000, 0.000000>

If the contents of bar are moved into foo, and the call to bar is removed, the
code appears to work properly. if the contents of bar are changed to

Vector c = foobar();
Vector();
writef("Returned: %s\n", c);

then the printed result is nondeterministic. Here is a sample output:
Returning <1.000000, 0.000000, 0.000000>
Returned: <-1.697432, 0.000000, 0.000000>

I am compiling the following code with "dmd -v -debug -g -op -L-lphobos
src/main.d" on Ubuntu Linux 6.10

contents of src/main.d
--------------------------------------------------------------------

import std.stdio;
import std.string;

struct Vector
{
        float x, y, z;

        public static Vector opCall(float x = 0, float y = 0, float z = 0)
        {
                Vector v;

                v.x = x;
                v.y = y;
                v.z = z;

                return v;
        }

        public char[] toString()
        {
                return format("<%f, %f, %f>", x, y, z);
        }
}

class Foo
{
        private Vector v;

        public this()
        {
                v = Vector(1, 0, 0);
        }

        public void foo()
        {
                bar();
        }

        private void bar()
        {
                writef("Returned: %s\n", foobar());
        }

        public Vector foobar()
        {
                writef("Returning %s\n", v);

                return v;
                Vector b = Vector();
                return b;
        }
}

void main(char [][] args)
{       
        Foo f = new Foo();
        f.foo();
}


-- 
Apr 15 2007
parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=1148


bugzilla digitalmars.com changed:

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





Fixed DMD 1.013


-- 
Apr 20 2007