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 :)