#1679 Bug with virtual methods and objects with dtors.

OTHER
open
nobody
Bug
none
Unknown
False
2013-02-11
2012-11-23
Anonymous
No

Mingw appears to have a bug involving multiple inheritance and virtual methods that return objects with dtors.

I have tried on 3 ditros - nuwen, tdm and the official mingw distro - and it happens on all g++ versions >= 4.7.0.

It does not appear to occur on Linux, although I've only been able to test with kubuntu12 and mint14, both of which have g++ 4.7.2 installed.

Anyway, see below code: The problem occurs when the 'interface method' LinkResolver is called by the markdown object. The correct method is invoked, but the 'this' pointer is messed up.

The trigger seems to be the String dtor. Remove this, or have the interface method return a simple type, and it works as expected.

#include <stdio.h>

struct String {
~String() { }
};

struct Object {
virtual ~Object() { }
};

struct LinkResolver {
virtual String ResolveLink() = 0;
};

struct Docs : public Object, public virtual LinkResolver {
Docs() {
printf(" Docs::Docs() this: %p\n", this);
}

virtual String ResolveLink() {
printf("Docs::ResolveLink() this: %p\n", this);
return String();
}
};

struct Markdown {
LinkResolver * _resolver;

Markdown(LinkResolver * resolver) : _resolver(resolver) { }

void Go() {
_resolver->ResolveLink();
}
};

int main() {
printf("GCC %d.%d.%d\n", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);

Docs d;

printf(" main() &d: %p\n", &d);

d.ResolveLink();

Markdown m(&d);

m.Go();
}

Discussion

  • Earnie Boyd

    Earnie Boyd - 2012-11-23

    Please report his to the GCC bug tracker. See http://gcc.gnu.org/bugs for information on how to do that.

     
  • Earnie Boyd

    Earnie Boyd - 2013-02-11
    • labels: gcc-4.7.0 --> gcc-4.7.0, gcc, g++
    • milestone: --> OTHER
    • type: --> Bug
    • resolution: --> none
    • category: --> Unknown
    • patch_attached: --> False
     

Get latest updates about Open Source Projects, Conferences and News.

Sign up for the SourceForge newsletter:





No, thanks