opDispatch + alias this intervene compilation?

Namespace rswhite4 at googlemail.com
Mon Dec 2 07:25:11 PST 2013


Consider this code:
----
struct VecN(T, const uint Dim) {
	/**
	 * Stores the vector values.
	 */
	T[Dim] values = 0;
	
	/// Alias
	alias values this;
	
	/**
	 * CTor
	 */
	this(float[Dim] values) {
		this.values = values;
	}
	
	/**
	 * opDispatch for x, y, z, w, u, v components
	 */
	@property
	T opDispatch(string str)() const pure nothrow {
		//writeln(str); // [1]
		static if (str[0] == 'x')
			return this.values[0];
		else static if (str[0] == 'y')
			return this.values[1];
		else static if (str[0] == 'z')
			return this.values[2];
		else static if (str[0] == 'w')
			return this.values[3];
		else static if (str[0] == 'u')
			return this.values[4];
		else static if (str[0] == 'v')
			return this.values[5];
		else
			return 0;
	}
}

alias vec2f = VecN!(float, 2);

void main() {
	vec2f[] arr;
	arr ~= vec2f([1, 2]);
	arr ~= vec2f([3, 4]);
	
	import std.stdio;
	writefln("ptr = %x", arr.ptr);
	
}
----

It will fail with:
----
object.Exception@/opt/compilers/dmd2/include/std/format.d(2245): 
Incorrect format specifier for range: %x
----

But if you comment out [1] it works as expected.

I'm sure it is a bug, but I've no idea how to name it.


More information about the Digitalmars-d-learn mailing list