www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Weird "circular initialization of isInputRange" error

This piece of code (which I reduced with dustmite) gives me the 
following error when I try to compile it:

 $ rdmd -main parser.d parser.d(28): Error: circular 
 initialization of isInputRange
 parser.d(31): Error: template instance 
 std.meta.staticMap!(handler, ArrayReader*) error instantiating
 parser.d(36):        instantiated from here: 
 unpacker!(RefRange!(immutable(ubyte)[]))
 parser.d(40): Error: template instance 
 std.range.primitives.isInputRange!(ArrayReader*) error 
 instantiating
 /usr/include/dmd/phobos/std/meta.d(546):        instantiated 
 from here: F!(ArrayReader*)
 parser.d(43):        instantiated from here: staticMap!(toTD, 
 ArrayReader*)
 Failed: ["dmd", "-main", "-v", "-o-", "parser.d", "-I."]
I'm not really sure what's causing the error; I'm not declaring `isInputRange` in my code. Commenting out the definition of `TD` (the very last line) removes the error. Am I doing something wrong here, or is this a compiler bug? Tested with dmd v2.068.1 on Linux x64 Code: -----
 import std.range;
 import std.variant;
 import std.typetuple;
 
 ///
 template unpacker(Range)
 {
 	/// Element data types. See `unpack` for usage.
 	alias MsgPackData = Algebraic!(
 		ArrayReader*,
 	);
 
 	
 	/// Reader range for arrays.
 	struct ArrayReader {
 		MsgPackData _front;
 		void update() {
 			_front.drain;
 		}
 		
 		void popFront() {
 			update;
 		}
 	}
 	
 	void drain(MsgPackData d) {
 		static handler(T)(T t) {
 			static if(isInputRange!T)
 				data;
 		}
 		d.visit!(staticMap!(handler, MsgPackData.AllowedTypes));
 	}
 }
 
 
 alias TestUnpacker = unpacker!(RefRange!(immutable(ubyte)[]));
 alias D = TestUnpacker.MsgPackData;
 
 template toTD(T) {
 	static if(isInputRange!T)
 		alias toTD = This;
 }
 alias TD = Algebraic!(staticMap!(toTD, D.AllowedTypes)); // 
 test data type
Sep 16 2015