digitalmars.D.bugs - [Issue 7014] New: Better union initialization syntax
- d-bugmail puremagic.com (43/43) Nov 25 2011 http://d.puremagic.com/issues/show_bug.cgi?id=7014
- d-bugmail puremagic.com (14/20) Nov 26 2011 http://d.puremagic.com/issues/show_bug.cgi?id=7014
- d-bugmail puremagic.com (30/30) Sep 30 2013 http://d.puremagic.com/issues/show_bug.cgi?id=7014
http://d.puremagic.com/issues/show_bug.cgi?id=7014 Summary: Better union initialization syntax Product: D Version: D2 Platform: All OS/Version: All Status: NEW Severity: enhancement Priority: P2 Component: DMD AssignedTo: nobody puremagic.com ReportedBy: bearophile_hugs eml.cc After using several unions for a while in D, I think the syntax to initialize fields of unions is not handy enough. An idea from GNU-C: import std.stdio; union Foo { int i; double d; }; void main() { int x; double y; Foo u = void; auto u1 = cast(Foo)x; writeln(typeof(u1).stringof); auto u2 = cast(Foo)y; // Error: e2ir: cannot cast y of type double to type Foo writeln(typeof(u2).stringof); } See: http://gcc.gnu.org/onlinedocs/gcc/Cast-to-Union.html#Cast-to-Union But I don't like that GNU-C idea, a problem with cast() is that it's not precise enough, if there are two fields like this, what is a good way to assign 's' or 'u' using a cast()? union Foo { int s; uint u; }; So I'd like a more explicit syntax. A solution using named arguments seems good: union Foo { int s; uint u; }; void bar(Foo f) {} void main() { bar(Foo(u:5)); } -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Nov 25 2011
http://d.puremagic.com/issues/show_bug.cgi?id=7014 timon.gehr gmx.ch changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |timon.gehr gmx.chBut I don't like that GNU-C idea, a problem with cast() is that it's not precise enough, if there are two fields like this, what is a good way to assign 's' or 'u' using a cast()? union Foo { int s; uint u; };cast(Foo)cast(uint)exp cast(Foo)cast(int)exp You understand that both are assigned, regardless of which one you choose and ergo it is never a problem? -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Nov 26 2011
http://d.puremagic.com/issues/show_bug.cgi?id=7014 Denis Shelomovskij <verylonglogin.reg gmail.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |verylonglogin.reg gmail.com 18:30:34 MSD --- Another option may be to extend "static initialization" syntax: --- struct S { int i; double d; } union U { int i; double d; } void f(T)(T){} void main() { S s = { d: 5 }; // OK U u = { d: 5 }; // NG because of Issue 7727 // Original suggestion: f(S( d: 5 )); // yes, let's not separate structs and unions f(U( d: 5 )); // Another option: f(cast(S) { d: 5 }); f(cast(U) { d: 5 }); } --- I'd like to require a `cast` even if the argument type is known. And about original suggestion: Having naming arguments in D (not only in this case) looks like a good idea allowing one another coding style. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Sep 30 2013