D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 3740 - Regression: class with fwd reference of a nested struct breaks abstract
Summary: Regression: class with fwd reference of a nested struct breaks abstract
Status: RESOLVED FIXED
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D1 (retired)
Hardware: x86 Windows
: P2 regression
Assignee: No Owner
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2010-01-25 01:44 UTC by changlon
Modified: 2014-04-18 09:12 UTC (History)
3 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description changlon 2010-01-25 01:44:19 UTC
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 Don 2010-01-25 03:18:16 UTC
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 Walter Bright 2010-01-27 11:37:08 UTC
Changeset 356
Comment 3 Leandro Lucarella 2010-01-27 13:51:49 UTC
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 Walter Bright 2010-01-30 22:43:23 UTC
fixed dmd 1.056 and 2.040