4241 – duplicate union initialization error doesn't give a file location

D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 4241 - duplicate union initialization error doesn't give a file location
Summary: duplicate union initialization error doesn't give a file location
Status: RESOLVED FIXED
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D2
Hardware: All All
: P2 critical
Assignee: yebblies
URL:
Keywords: diagnostic, pull
Depends on:
Blocks:
Reported: 2010年05月27日 10:48 UTC by Trass3r
Modified: 2015年06月09日 05:10 UTC (History)
3 users (show)

See Also:


Attachments
Add an attachment (proposed patch, testcase, etc.)

Note You need to log in before you can comment on or make changes to this issue.
Description Trass3r 2010年05月27日 10:48:54 UTC
import std.typetuple;
/// repeat a type count times
template Repeat(T, int count)
{
	static if (!count)
		alias TypeTuple!() Repeat;
	else
		alias TypeTuple!(T, Repeat!(T, count-1)) Repeat;
}
struct Vector(T, int dim)
{
	static assert (dim >= 2 && dim <= 4);
	union
	{
// including these gives more errors of the same kind
//		T[dim] cell;			/// array access
//		Repeat!(T, dim) tuple;	/// for tuple access
		
		/// normal struct element access
		struct
		{
			static if (dim >= 1)	union { T x; T r; }
			static if (dim >= 2)	union { T y; T g; }
			static if (dim >= 3)	union { T z; T b; }
			static if (dim >= 4)	union { T w; T a; }
		}
	}
	// these constructors are workarounds for the "overlapping initialization for _tuple_field_0" problem
	static if (dim == 2)
	this(T ax, T ay)
	{
		x = ax;
		y = ay;
	}
	static if (dim == 3)
	this(T ax, T ay, T az)
	{
		x = ax;
		y = ay;
		z = az;
	}
	static if (dim == 4)
	this(T ax, T ay, T az, T aw)
	{
		x = ax;
		y = ay;
		z = az;
		w = aw;
	}
	static if (2 == dim) const static Vector zero = Vector(0, 0);
	static if (3 == dim) const static Vector zero = Vector(0, 0, 0);
	static if (4 == dim) const static Vector zero = Vector(0, 0, 0, 0);
}
alias Vector!(float, 2)	Vector2f; ///
alias Vector!(float, 3)	Vector3f; ///
alias Vector!(float, 4)	Vector4f; ///
yields:
Error: duplicate union initialization for r
Error: duplicate union initialization for g
Error: duplicate union initialization for r
Error: duplicate union initialization for g
Error: duplicate union initialization for b
Error: duplicate union initialization for r
Error: duplicate union initialization for g
Error: duplicate union initialization for b
Error: duplicate union initialization for a
It would be helpful to have a file location.
Unfortunately for some reason loc is null in StructLiteralExp::toDt(dt_t **pdt) where the error occurs.
Comment 1 Simen Kjaeraas 2010年09月30日 12:41:05 UTC
Reduced test case:
import std.typetuple;
struct bar( int n, T ) {
 static immutable bar b = bar( 0 );
	
 Tuple!( int ) fields;
	
 this( int arg ) {
 fields.field[0] = arg;
 }
}
alias bar!( 3, int ) b;
Comment 2 yebblies 2012年02月01日 05:03:26 UTC
https://github.com/D-Programming-Language/dmd/pull/677 
Comment 3 yebblies 2012年02月01日 05:05:11 UTC
https://github.com/D-Programming-Language/dmd/pull/677 
Comment 4 github-bugzilla 2012年02月19日 21:01:05 UTC
Commit pushed to master at https://github.com/D-Programming-Language/dmd
https://github.com/D-Programming-Language/dmd/commit/b9d64aa07448a43dda3f28d3bffc8059ec869e06
Merge pull request #677 from yebblies/issue4241
Issue 4241 - duplicate union initialization error doesn't give a file location
Comment 5 github-bugzilla 2012年02月19日 21:53:53 UTC
Commit pushed to dmd-1.x at https://github.com/D-Programming-Language/dmd
https://github.com/D-Programming-Language/dmd/commit/a933ce10cc15d2eb6b54a7d00b6f416d1ada6097
fix Issue 4241 - duplicate union initialization error doesn't give a file location


AltStyle によって変換されたページ (->オリジナル) /