http://d.puremagic.com/issues/show_bug.cgi?id=6681
--- Comment #13 from yebblies <yebbl...@gmail.com> 2012-03-13 23:32:59 EST --- Thanks for doing this. I think my branch was still letting you return partially uninitialized arrays/structs from ctfe. I also think the following should work: union U { int a, b; } int func() { U u; u.a = 3; assert(u.b == 3); return 1; } static assert(func()); But I don't know how to implement it. (it might not be worth it) Umm, test cases. (some pass, some fail, some pulled out of other test cases in dmd/phobos.) The last one should fail, I doubt it's useful leave a variable partially initialized. /* version(none) { struct S { this(int a, int b) { this.a = b; this.b = a; } union { ulong g; struct { int a; int b; } } } static immutable S s = S(1, 0); extern(C) int printf(const char *, ...); void main() { S s = .s; printf("%d %d %d\n", s.g, s.a, s.b); } } version(none) { union in6_addr { private union _in6_u_t { ubyte[16] u6_addr8; ushort[8] u6_addr16; uint[4] u6_addr32; } _in6_u_t in6_u; ubyte[16] s6_addr8; ushort[8] s6_addr16; uint[4] s6_addr32; alias s6_addr8 s6_addr; } const in6_addr IN6ADDR_ANY = { s6_addr8: [0] }; } version(none) { struct Zadok { char [4] s = void; } int quop() { Zadok pong; pong.s = ['z','x','f', 'g']; return 1; } static assert(quop()==1); static assert(quop()==1); // check for clobbering } //version = testc; version(testc) { union U { int a; int b; } int testxx() { U u; u.a = 7; u.b = 4; assert(u.a == 7); assert(u.b == 4); return 1; } static assert(testxx()); } //version = testb; version(testb) { void fillWithZero(T)(T[] arr) { foreach(ref x; arr) x = 7; } T[4] f(T)() { T[4] stackSpace = void; T[4] x = stackSpace; int y = x[0]; //int z = y + y; fillWithZero(stackSpace[]); return stackSpace; } static assert(f!int() == [7,7,7,7]); } //version = testa; version(testa) { interface SomeInterface { int daz(); float bar(char); int baz(); } interface SomeOtherInterface { int xxx(); } class TheBase : SomeInterface, SomeOtherInterface { int q = 88; int rad = 61; int a = 14; int somebaseclassfunc() { return 28;} int daz() { return 0; } int baz() { return 0; } int xxx() { return 762; } int foo() { return q; } float bar(char c) { return 3.6; } } class SomeClass : TheBase, SomeInterface { int gab = 9; int fab; int a = 17; int b = 23; int foo() { return gab + a; } float bar(char c) { return 2.6; } int something() { return 0; } int daz() { return 0; } int baz() { return 0; } } class Unrelated : TheBase { this(int x) { a = x; } } auto classtest1(int n) { SomeClass c = new SomeClass; assert(c.a == 17); assert(c.q == 88); TheBase d = c; assert(d.a == 14); assert(d.q == 88); if (n==7) { // bad cast -- should fail Unrelated u = cast(Unrelated)d; assert(u is null); } SomeClass e = cast(SomeClass)d; d.q = 35; assert(c.q == 35); assert(c.foo() == 9 + 17); ++c.a; assert(c.foo() == 9 + 18); assert(d.foo() == 9 + 18); d = new TheBase; SomeInterface fc = c; SomeOtherInterface ot = c; assert(fc.bar('x') == 2.6); assert(ot.xxx() == 762); fc = d; ot = d; assert(fc.bar('x') == 3.6); assert(ot.xxx() == 762); Unrelated u2 = new Unrelated(7); assert(u2.a == 7); return 6; } static assert(classtest1(1)); static assert(classtest1(2)); static assert(classtest1(7)); // bug 7154 } //version = testd; version(testd) { struct XY { union { int x, y; } } struct AHolder { XY aa; void a(XY x) { aa = x; } } struct AB { AHolder aHolder; XY b; void a(XY x) { aHolder.a(x); } } struct Main { AB ab; void setB() { ab.b = XY(); } void f() { ab.a(XY.init); setB(); } } } //version = teste; version(teste) { union U { int a; long b; } long test() { U u; u.a = 3; u.b = 8; return u.a + u.b; } static assert(test() == 11); } //version = testf; version(testf) { int[5] test() { int[5] var = void; var[0] = 6; var[2] = 6; var[4] = 6; return var; } pragma(msg, test()); } */ -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------