[Bug c++/29117] New: Copy constructor is called with "this == &rhs"

oschmidt at gmx dot net gcc-bugzilla@gcc.gnu.org
Sun Sep 17 16:04:00 GMT 2006


/*

Hi,

in the following program the copy constructor of class C is called with
the constructor argument having the same address as the to be constructed
object.

Best regards,
Oliver Schmidt


$ for i in g++-3.3 g++-3.4 g++-4.0; do echo "================"; $i --version;
$i -Wall t3.cpp; a.out ; echo; done

================
g++-3.3 (GCC) 3.3.5 (Debian 1:3.3.5-13)
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

1) getValue() -> 100,    getValue() -> 101
2) getValue() -> 200,    getValue() -> 201
3) getValue() -> 300,    XXX getValue() -> 201
4) getValue() -> 400,    getValue() -> 400

================
g++-3.4 (GCC) 3.4.4 20050314 (prerelease) (Debian 3.4.3-13)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

1) getValue() -> 100,    getValue() -> 101
2) getValue() -> 200,    getValue() -> 201
3) getValue() -> 300,    XXX getValue() -> 201
4) getValue() -> 400,    XXX getValue() -> 201

================
g++-4.0 (GCC) 4.0.4 20060507 (prerelease) (Debian 4.0.3-3)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

1) getValue() -> 100,    getValue() -> 101
2) getValue() -> 200,    getValue() -> 201
3) getValue() -> 300,    XXX getValue() -> 201
4) getValue() -> 400,    XXX getValue() -> 201

*/
///////////////////////////////////////////////////////////////////////////////

#include <stdio.h>

class C
{
public:
    C() : v(counter++)
    {}

    C(const C& rhs) {
        v = rhs.v;
        if (this == &rhs) {
            printf("XXX ");
        }
    }

    int getValue() {
        return v;
    }
    void setValue(int v) {
        this->v = v;
    }
    static void setCounter(int i) {
        counter = i;
    }
private:
    int v;
    static int counter;
};

int C::counter = 100;

class D
{
public:
    int getValue() {
        return c.getValue();
    }
private:
    C c;
};

void f1()
{
    D d1;
    printf("1) getValue() -> %d,    ", d1.getValue());
    {
        D d1;
        printf("getValue() -> %d\n", d1.getValue());
    }
}

void f2()
{
    D d2;
    printf("2) getValue() -> %d,    ", d2.getValue());
    {
        D d2;
        d2 = d2;
        printf("getValue() -> %d\n", d2.getValue());
    }
}

void f3()
{
    D d3;
    printf("3) getValue() -> %d,    ", d3.getValue());
    {
        D d3 = d3;
        printf("getValue() -> %d\n", d3.getValue());
    }
}

void f4()
{
    D d4;
    printf("4) getValue() -> %d,    ", d4.getValue());
    {
        D d4(d4);
        printf("getValue() -> %d\n", d4.getValue());
    }
}

int main(int argc, char **argv)
{
    C::setCounter(100); f1();
    C::setCounter(200); f2();
    C::setCounter(300); f3();
    C::setCounter(400); f4();
    return 0;
}

///////////////////////////////////////////////////////////////////////////////


-- 
           Summary: Copy constructor is called with "this == &rhs"
           Product: gcc
           Version: 4.0.4
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: oschmidt at gmx dot net


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29117



More information about the Gcc-bugs mailing list