Bug 3740 – Regression: class with fwd reference of a nested struct breaks abstract

Status
RESOLVED
Resolution
FIXED
Severity
regression
Priority
P2
Component
dmd
Product
D
Version
D1 (retired)
Platform
x86
OS
Windows
Creation time
2010-01-25T01:44:00Z
Last change time
2014-04-18T09:12:08Z
Assigned to
nobody
Creator
changlon

Comments

Comment #0 by changlon — 2010-01-25T01:44:19Z
build tango error since svn r342 to r354 , test on (window 32 & ububtu i386 9.4 & freebsd i386 7.2) i can't reduced this issue. --------------------------- dmd -release -O -I.. -I../tango/core -I../tango/core/vendor -c ../tango/io/selector/SelectSelector.d -ofio-selector-SelectSelector.obj ..\tango\io\selector\SelectSelector.d(515): Error: class tango.io.selector.SelectSelector.SelectSelectionSet interface function ISelectionSet.length isn't implemented ..\tango\io\selector\SelectSelector.d(515): Error: class tango.io.selector.SelectSelector.SelectSelectionSet interface function ISelectionSet.opApply isn't implemented dmd -release -O -I.. -I../tango/core -I../tango/core/vendor -c ../tango/net/device/Berkeley.d -ofnet-device-Berkeley.obj ..\tango\net\device\Berkeley.d(596): Error: cannot create instance of abstract class IPv4Address ..\tango\net\device\Berkeley.d(596): Error: function toString is abstract ..\tango\net\device\Berkeley.d(596): Error: function name is abstract ..\tango\net\device\Berkeley.d(596): Error: function nameLen is abstract ..\tango\net\device\Berkeley.d(596): Error: function addressFamily is abstract dmd -release -O -I.. -I../tango/core -I../tango/core/vendor -c ../tango/net/device/Multicast.d -ofnet-device-Multicast.obj ..\tango\net\device\Multicast.d(99): Error: cannot create instance of abstract class InternetAddress ..\tango\net\device\Multicast.d(99): Error: function toString is abstract ..\tango\net\device\Multicast.d(99): Error: function name is abstract ..\tango\net\device\Multicast.d(99): Error: function nameLen is abstract ..\tango\net\device\Multicast.d(99): Error: function addressFamily is abstract dmd -release -O -I.. -I../tango/core -I../tango/core/vendor -c ../tango/net/device/Socket.d -ofnet-device-Socket.obj ..\tango\net\device\Socket.d(138): Error: cannot create instance of abstract class IPv4Address ..\tango\net\device\Socket.d(138): Error: function toString is abstract ..\tango\net\device\Socket.d(138): Error: function name is abstract ..\tango\net\device\Socket.d(138): Error: function nameLen is abstract ..\tango\net\device\Socket.d(138): Error: function addressFamily is abstract ..\tango\net\device\Socket.d(535): Error: cannot create instance of abstract class IPv4Address ..\tango\net\device\Socket.d(535): Error: function toString is abstract ..\tango\net\device\Socket.d(535): Error: function name is abstract ..\tango\net\device\Socket.d(535): Error: function nameLen is abstract ..\tango\net\device\Socket.d(535): Error: function addressFamily is abstract dmd -release -O -I.. -I../tango/core -I../tango/core/vendor -c ../tango/net/device/SSLSocket.d -ofnet-device-SSLSocket.obj ..\tango\net\device\SSLSocket.d(360): Error: cannot create instance of abstract class IPv4Address ..\tango\net\device\SSLSocket.d(360): Error: function toString is abstract ..\tango\net\device\SSLSocket.d(360): Error: function name is abstract ..\tango\net\device\SSLSocket.d(360): Error: function nameLen is abstract ..\tango\net\device\SSLSocket.d(360): Error: function addressFamily is abstract dmd -release -O -I.. -I../tango/core -I../tango/core/vendor -c ../tango/net/ftp/FtpClient.d -ofnet-ftp-FtpClient.obj ..\tango\net\ftp\FtpClient.d(481): Error: cannot create instance of abstract class IPv4Address ..\tango\net\ftp\FtpClient.d(481): Error: function toString is abstract ..\tango\net\ftp\FtpClient.d(481): Error: function name is abstract ..\tango\net\ftp\FtpClient.d(481): Error: function nameLen is abstract ..\tango\net\ftp\FtpClient.d(481): Error: function addressFamily is abstract ..\tango\net\ftp\FtpClient.d(489): Error: cannot create instance of abstract class IPv4Address ..\tango\net\ftp\FtpClient.d(489): Error: function toString is abstract ..\tango\net\ftp\FtpClient.d(489): Error: function name is abstract ..\tango\net\ftp\FtpClient.d(489): Error: function nameLen is abstract ..\tango\net\ftp\FtpClient.d(489): Error: function addressFamily is abstract ..\tango\net\ftp\FtpClient.d(491): Error: cannot create instance of abstract class IPv4Address ..\tango\net\ftp\FtpClient.d(491): Error: function toString is abstract ..\tango\net\ftp\FtpClient.d(491): Error: function name is abstract ..\tango\net\ftp\FtpClient.d(491): Error: function nameLen is abstract ..\tango\net\ftp\FtpClient.d(491): Error: function addressFamily is abstract dmd -release -O -I.. -I../tango/core -I../tango/core/vendor -c ../tango/net/http/HttpClient.d -ofnet-http-HttpClient.obj ..\tango\net\http\HttpClient.d(150): Error: cannot create instance of abstract class Uri ..\tango\net\http\HttpClient.d(150): Error: function toString is abstract ..\tango\net\http\HttpClient.d(150): Error: function defaultPort is abstract ..\tango\net\http\HttpClient.d(150): Error: function scheme is abstract ..\tango\net\http\HttpClient.d(150): Error: function host is abstract ..\tango\net\http\HttpClient.d(150): Error: function port is abstract ..\tango\net\http\HttpClient.d(150): Error: function validPort is abstract ..\tango\net\http\HttpClient.d(150): Error: function userinfo is abstract ..\tango\net\http\HttpClient.d(150): Error: function path is abstract ..\tango\net\http\HttpClient.d(150): Error: function query is abstract ..\tango\net\http\HttpClient.d(150): Error: function fragment is abstract ..\tango\net\http\HttpClient.d(150): Error: function isGeneric is abstract ..\tango\net\http\HttpClient.d(180): Error: cannot create instance of abstract class InternetAddress ..\tango\net\http\HttpClient.d(180): Error: function toString is abstract ..\tango\net\http\HttpClient.d(180): Error: function name is abstract ..\tango\net\http\HttpClient.d(180): Error: function nameLen is abstract ..\tango\net\http\HttpClient.d(180): Error: function addressFamily is abstract ..\tango\net\http\HttpClient.d(491): Error: function tango.net.http.HttpParams.HttpParams.produce (uint delegate(void[]),char[]) does not match parameter types (int delegate(void[] p)) ..\tango\net\http\HttpClient.d(491): Error: cannot implicitly convert expression (__dgliteral1) of type int delegate(void[] p) to uint delegate(void[]) ..\tango\net\http\HttpClient.d(509): Error: cannot implicitly convert expression (__dgliteral2) of type int delegate(OutputBuffer o) to void delegate(OutputBuffer) dmd -release -O -I.. -I../tango/core -I../tango/core/vendor -c ../tango/net/http/HttpGet.d -ofnet-http-HttpGet.obj ..\tango\net\http\HttpGet.d(48): Error: cannot create instance of abstract class Uri ..\tango\net\http\HttpGet.d(48): Error: function toString is abstract ..\tango\net\http\HttpGet.d(48): Error: function defaultPort is abstract ..\tango\net\http\HttpGet.d(48): Error: function scheme is abstract ..\tango\net\http\HttpGet.d(48): Error: function host is abstract ..\tango\net\http\HttpGet.d(48): Error: function port is abstract ..\tango\net\http\HttpGet.d(48): Error: function validPort is abstract ..\tango\net\http\HttpGet.d(48): Error: function userinfo is abstract ..\tango\net\http\HttpGet.d(48): Error: function path is abstract ..\tango\net\http\HttpGet.d(48): Error: function query is abstract ..\tango\net\http\HttpGet.d(48): Error: function fragment is abstract ..\tango\net\http\HttpGet.d(48): Error: function isGeneric is abstract dmd -release -O -I.. -I../tango/core -I../tango/core/vendor -c ../tango/net/http/HttpPost.d -ofnet-http-HttpPost.obj ..\tango\net\http\HttpPost.d(49): Error: cannot create instance of abstract class Uri ..\tango\net\http\HttpPost.d(49): Error: function toString is abstract ..\tango\net\http\HttpPost.d(49): Error: function defaultPort is abstract ..\tango\net\http\HttpPost.d(49): Error: function scheme is abstract ..\tango\net\http\HttpPost.d(49): Error: function host is abstract ..\tango\net\http\HttpPost.d(49): Error: function port is abstract ..\tango\net\http\HttpPost.d(49): Error: function validPort is abstract ..\tango\net\http\HttpPost.d(49): Error: function userinfo is abstract ..\tango\net\http\HttpPost.d(49): Error: function path is abstract ..\tango\net\http\HttpPost.d(49): Error: function query is abstract ..\tango\net\http\HttpPost.d(49): Error: function fragment is abstract ..\tango\net\http\HttpPost.d(49): Error: function isGeneric is abstract ..\tango\net\http\HttpPost.d(117): Error: function tango.net.http.HttpPost.HttpPost.write () does not match parameter types (int delegate(OutputBuffer b)) ..\tango\net\http\HttpPost.d(117): Error: cannot implicitly convert expression (__dgliteral1) of type int delegate(OutputBuffer b) to void[] ..\tango\net\http\HttpPost.d(117): Error: expected 2 function arguments, not 1 dmd -release -O -I.. -I../tango/core -I../tango/core/vendor -c ../tango/net/util/MemCache.d -ofnet-util-MemCache.obj ..\tango\net\util\MemCache.d(409): Error: cannot create instance of abstract class InternetAddress ..\tango\net\util\MemCache.d(409): Error: function toString is abstract ..\tango\net\util\MemCache.d(409): Error: function name is abstract ..\tango\net\util\MemCache.d(409): Error: function nameLen is abstract ..\tango\net\util\MemCache.d(409): Error: function addressFamily is abstract
Comment #1 by clugdbug — 2010-01-25T03:18:16Z
Reduced test case. If a class contains a forward reference of a nested struct, it stays abstract. ----------------- abstract class Address { abstract int nameLen(); } class Class3740 : Address { FwdStruct z; struct FwdStruct { } int nameLen() { return 0; } } void cantdo () { Class3740 xxx = new Class3740; }
Comment #2 by bugzilla — 2010-01-27T11:37:08Z
Changeset 356
Comment #3 by leandro.lucarella — 2010-01-27T13:51:49Z
Thanks for the fix, but, speaking about the patch, is it a good idea to shadow an object attribute with a local variable like this? Index: /trunk/src/func.c =================================================================== --- /trunk/src/func.c (revision 354) +++ /trunk/src/func.c (revision 356) @@ -131,8 +131,19 @@ return; } + + parent = sc->parent; + Dsymbol *parent = toParent(); + I think it could be a little error prone, maybe it's a good idea to change the local variable name :)
Comment #4 by bugzilla — 2010-01-30T22:43:23Z
fixed dmd 1.056 and 2.040