www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - copying const struct

reply "Jack Applegame" <japplegame gmail.com> writes:
Why this doesn't compile?

http://dpaste.dzfl.pl/21ef5b04

class Foo {}

struct Bar1 {
	const(Foo[]) member;	
}

struct Bar2 {
	const Foo member;	
}

void main() {
	const Bar1 bar1;
	const Bar2 bar2;
	Bar1 b1 = bar1; // ok
	Bar2 b2 = bar2; // cannot implicitly convert expression (bar2) 
of type const(Bar2) to Bar2
}
Oct 14 2013
next sibling parent reply Benjamin Thaut <code benjamin-thaut.de> writes:
Am 14.10.2013 13:35, schrieb Jack Applegame:
 Why this doesn't compile?

 http://dpaste.dzfl.pl/21ef5b04

 class Foo {}

 struct Bar1 {
      const(Foo[]) member;
 }

 struct Bar2 {
      const Foo member;
 }

 void main() {
      const Bar1 bar1;
      const Bar2 bar2;
      Bar1 b1 = bar1; // ok
      Bar2 b2 = bar2; // cannot implicitly convert expression (bar2) of
 type const(Bar2) to Bar2
 }
Because in D const is transitive. That means if a reference is const the object it points to is also const. And everything that object points to is const, and so on. The line "Bar2 b2 = bar2;" would remove const from "member" which does not happen because const is not convertible to mutable implicitly. Kind Regards Benjamin Thaut
Oct 14 2013
parent reply "Jack Applegame" <japplegame gmail.com> writes:
On Monday, 14 October 2013 at 11:38:23 UTC, Benjamin Thaut wrote:
 The line "Bar2 b2 = bar2;" would remove const from "member"
Seems strange, because b2.member is const by declaration.
Oct 14 2013
parent reply "Dicebot" <public dicebot.lv> writes:
On Monday, 14 October 2013 at 11:45:30 UTC, Jack Applegame wrote:
 On Monday, 14 October 2013 at 11:38:23 UTC, Benjamin Thaut 
 wrote:
 The line "Bar2 b2 = bar2;" would remove const from "member"
Seems strange, because b2.member is const by declaration.
Strange indeed and smells like a bug. `auto bar = Bar2(bar2.member)` works so it should be assignable.
Oct 14 2013
parent reply Benjamin Thaut <code benjamin-thaut.de> writes:
Am 14.10.2013 13:54, schrieb Dicebot:
 On Monday, 14 October 2013 at 11:45:30 UTC, Jack Applegame wrote:
 On Monday, 14 October 2013 at 11:38:23 UTC, Benjamin Thaut wrote:
 The line "Bar2 b2 = bar2;" would remove const from "member"
Seems strange, because b2.member is const by declaration.
Strange indeed and smells like a bug. `auto bar = Bar2(bar2.member)` works so it should be assignable.
d.puremagic.com/issues/show_bug.cgi?id=9665
Oct 14 2013
parent reply "Maxim Fomin" <maxim maxim-fomin.ru> writes:
On Monday, 14 October 2013 at 13:56:58 UTC, Benjamin Thaut wrote:
 Am 14.10.2013 13:54, schrieb Dicebot:
 On Monday, 14 October 2013 at 11:45:30 UTC, Jack Applegame 
 wrote:
 On Monday, 14 October 2013 at 11:38:23 UTC, Benjamin Thaut 
 wrote:
 The line "Bar2 b2 = bar2;" would remove const from "member"
Seems strange, because b2.member is const by declaration.
Strange indeed and smells like a bug. `auto bar = Bar2(bar2.member)` works so it should be assignable.
d.puremagic.com/issues/show_bug.cgi?id=9665
I don't see how this is related to the topic.
Oct 14 2013
parent Benjamin Thaut <code benjamin-thaut.de> writes:
Am 14.10.2013 16:19, schrieb Maxim Fomin:
 On Monday, 14 October 2013 at 13:56:58 UTC, Benjamin Thaut wrote:
 Am 14.10.2013 13:54, schrieb Dicebot:
 On Monday, 14 October 2013 at 11:45:30 UTC, Jack Applegame wrote:
 On Monday, 14 October 2013 at 11:38:23 UTC, Benjamin Thaut wrote:
 The line "Bar2 b2 = bar2;" would remove const from "member"
Seems strange, because b2.member is const by declaration.
Strange indeed and smells like a bug. `auto bar = Bar2(bar2.member)` works so it should be assignable.
d.puremagic.com/issues/show_bug.cgi?id=9665
I don't see how this is related to the topic.
I thought maybe its related to this bug.
Oct 14 2013
prev sibling parent reply "Maxim Fomin" <maxim maxim-fomin.ru> writes:
On Monday, 14 October 2013 at 11:35:32 UTC, Jack Applegame wrote:
 Why this doesn't compile?

 http://dpaste.dzfl.pl/21ef5b04

 class Foo {}

 struct Bar1 {
 	const(Foo[]) member;	
 }

 struct Bar2 {
 	const Foo member;	
 }

 void main() {
 	const Bar1 bar1;
 	const Bar2 bar2;
 	Bar1 b1 = bar1; // ok
 	Bar2 b2 = bar2; // cannot implicitly convert expression (bar2) 
 of type const(Bar2) to Bar2
 }
This is compilable using git head.
Oct 14 2013
parent reply "Kenji Hara" <k.hara.pg gmail.com> writes:
On Monday, 14 October 2013 at 14:18:10 UTC, Maxim Fomin wrote:
 On Monday, 14 October 2013 at 11:35:32 UTC, Jack Applegame 
 wrote:
 Why this doesn't compile?

 http://dpaste.dzfl.pl/21ef5b04

 class Foo {}

 struct Bar1 {
 	const(Foo[]) member;	
 }

 struct Bar2 {
 	const Foo member;	
 }

 void main() {
 	const Bar1 bar1;
 	const Bar2 bar2;
 	Bar1 b1 = bar1; // ok
 	Bar2 b2 = bar2; // cannot implicitly convert expression 
 (bar2) of type const(Bar2) to Bar2
 }
This is compilable using git head.
Recently I found a small compiler bug. http://d.puremagic.com/issues/show_bug.cgi?id=11187 And, a week ago it is fixed. 2.064 beta1 contains the fix. Kenji Hara
Oct 14 2013
parent reply =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> writes:
On 10/14/2013 10:33 AM, Kenji Hara wrote:

 On Monday, 14 October 2013 at 14:18:10 UTC, Maxim Fomin wrote:
 This is compilable using git head.
When I read that line ...
 Kenji Hara
... I was thinking about that person. :) Thank you Kenji! Ali
Oct 14 2013
parent reply "Maxim Fomin" <maxim maxim-fomin.ru> writes:
On Monday, 14 October 2013 at 17:38:22 UTC, Ali Çehreli wrote:
 On 10/14/2013 10:33 AM, Kenji Hara wrote:

 On Monday, 14 October 2013 at 14:18:10 UTC, Maxim Fomin wrote:
 This is compilable using git head.
When I read that line ...
 Kenji Hara
... I was thinking about that person. :) Thank you Kenji! Ali
Right. Kenji is true D celebrity. Funniest thing happen in cases like this when he reports the bug himself and soon fixes it, later bug is hit by someone else but during reporting it is realized that bug is already fixed, pull is pushed to master and everyone salutes Kenji. What bothers me is that some (in fact, probably many) delicate language cases are silently fixed by Kenji without proper documentation so D language has some sparse and obsolete spec, even more obsolete book and sporadic patches - just couple of developers are aware about each of them. When someone hits corner language case - weird compiler behavior it is general unknown what should compiler do, whether current behavior is bug or a fix for some other previous bug about which you are unaware of. When different parts of language interact, problem becomes even more complicated.
Oct 14 2013
parent "Jack Applegame" <japplegame gmail.com> writes:
On Monday, 14 October 2013 at 18:36:00 UTC, Maxim Fomin wrote:
 Funniest thing happen in cases like this when he reports the 
 bug himself and soon fixes it, later bug is hit by someone else 
 but during reporting it is realized that bug is already fixed, 
 pull is pushed to master and everyone salutes Kenji.
Obviously Kenji has a time machine. With it, he discovers bugs in the future and fixes them in the present and sometimes even in the past.
Oct 14 2013