[Bug 72] New: Wrong code generated (segmentation fault) when class (in one file) inherits from class (in another file) with interface
gdc-bugzilla at gdcproject.org
gdc-bugzilla at gdcproject.org
Sat Jul 27 08:57:20 PDT 2013
http://bugzilla.gdcproject.org/show_bug.cgi?id=72
Bug #: 72
Summary: Wrong code generated (segmentation fault) when class
(in one file) inherits from class (in another file)
with interface
Classification: Unclassified
Product: GDC
Version: 4.7.x
Platform: All
OS/Version: All
Status: NEW
Severity: normal
Priority: Normal
Component: gdc
AssignedTo: ibuclaw at gdcproject.org
ReportedBy: power at pobox.sk
Reduced example:
----------------
File screen3d.d:
----------------
module screen3d;
public interface ScreenI {
public void initSDL();
public void clear();
}
public class Screen3D: ScreenI {
public:
static int width = 640;
static int height = 480;
public void initSDL() {
resized(width, height); // segfault here
}
public void resized(int width, int height) {
this.width = width;
this.height = height;
}
public void clear() {
}
}
----------------
File main.d:
----------------
module main;
private import screen3d;
public class Screen: Screen3D {
public override void resized(int width, int height) {
super.resized(width, height);
}
public override void clear() {
}
}
private:
Screen screen1;
public int main(string[] args) {
screen1 = new Screen;
ScreenI screen2 = screen1;
screen2.initSDL();
return 0;
}
----------------
When the example is compiled as two sepparate files, it segfaults.
When the example is merged into one file, it works.
In disassembly the difference between working and segfaulting version is
following:
In working version, the method initSDL in the interface of the class Screen is
a reference to a thunk function which subtracts 8 (in 32-bit code) from first
parameter and then calls the initSDL method in class Screen3D.
In segfaulting version, the method initSDL in the interface of the class Screen
is a reference to the initSDL method in class Screen3D.
I tested it on GDC crosscompiler for ARM linux (running on x64 linux) - gcc
version 4.7.3 with gdc commit e63f8a7a5657684c0f2c3d2fd1a9c33eec0208c0 (last
commit in gdc-4.7 branch before merging D 2.063).
I also tried GCC-4.8-MinGW-GDC-.7z and
gcc-4.6.1-tdm-1-gdc-9841510e8ba6-20120109.7z (both from
https://bitbucket.org/goshawk/gdc/downloads) - I didn't manage to create an
executable, but the assembly/disassembly shows the same wrong code.
I tried the latest DMD (2.063.2) and it generates correct code.
--
Configure bugmail: http://bugzilla.gdcproject.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are watching all bug changes.
More information about the D.gnu
mailing list