www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Invariants broken with out cast!!!

reply Robert DaSilva <sp.unit.262+digitalmars gmail.com> writes:
An invariant(int) can be assigned to an invariant(int)*, this wasn't
possible in 2.007. Just compile the attach test case.
Dec 06 2007
next sibling parent Denton Cockburn <diboss hotmail.com> writes:
On Thu, 06 Dec 2007 20:43:12 -0800, Robert DaSilva wrote:

 An invariant(int) can be assigned to an invariant(int)*, this wasn't
 possible in 2.007. Just compile the attach test case. import std.stdio;
 
 void main()
 {
     invariant(int) a;
     invariant(int)* b = &a; // error in 2.007, ok in 2.008 writeln(*b);
     a = 1;
 //    *b = 2; // error
     writeln(*b);
 }
Even if it's broken, the behaviour seems logical to me. The types aren't different, so why would you need a cast? Just my 2 cents.
Dec 07 2007
prev sibling parent reply Denton Cockburn <diboss hotmail.com> writes:
On Thu, 06 Dec 2007 20:43:12 -0800, Robert DaSilva wrote:

 An invariant(int) can be assigned to an invariant(int)*, this wasn't
 possible in 2.007. Just compile the attach test case. import std.stdio;
 
 void main()
 {
     invariant(int) a;
     invariant(int)* b = &a; // error in 2.007, ok in 2.008 writeln(*b);
     a = 1;
 //    *b = 2; // error
     writeln(*b);
 }
Then again, I'd expect *b to be mutable if a is mutable. Someone care to explain what the correct behaviour should be and why?
Dec 07 2007
parent Denton Cockburn <diboss hotmail.com> writes:
On Fri, 07 Dec 2007 08:17:34 +0000, Denton Cockburn wrote:

 On Thu, 06 Dec 2007 20:43:12 -0800, Robert DaSilva wrote:
 
 An invariant(int) can be assigned to an invariant(int)*, this wasn't
 possible in 2.007. Just compile the attach test case. import std.stdio;
 
 void main()
 {
     invariant(int) a;
     invariant(int)* b = &a; // error in 2.007, ok in 2.008 writeln(*b);
     a = 1;
 //    *b = 2; // error
     writeln(*b);
 }
Then again, I'd expect *b to be mutable if a is mutable. Someone care to explain what the correct behaviour should be and why?
Nevermind, I think I got it. a is a mutable ref to an invariant int. b is a pointer to an invariant int thus: *b is an invariant int that cannot be reassigned
Dec 07 2007