July 07, 2005
Hello all.

> module core;
> 
> class MyClass
> {
> 	template foo(T)
> 	{
> 		T[] foo()
> 		{
> 			T[] tt;
> 			return tt;
> 		}
> 	}
> }
> 
> class Container
> {
> 	this()
> 	{
> 		_element = new MyClass();
> 	}
> 
> 	MyClass element()
> 	{
> 		return _element;
> 	}
> 	
> 	private MyClass _element;
> }
> 
> int main(char[][] args)
> {
> 	Container container = new Container();
> 	MyClass myclass = new MyClass();
> 	
> 	assert( container.element.foo!(MyClass).length == 0 ); // (*)
> 	assert( myclass.foo!(MyClass).length == 0 || myclass.foo!(MyClass)[0] is myclass ); // (**)
> 
> 	return 0;
> }

Compilation gives:

D:\proj\dtest>dmd -unittest -debug core.d
core.d(38): template foo!(MyClass) is not a member of container.element
no property 'length' for type 'int'
core.d(39): undefined identifier myclass dotexp template instance foo!(MyClass ).length
core.d(39): void has no value
core.d(39): incompatible types for ((myclass dotexp template instance foo!(MyClass ).length) == (0)): 'void' and 'int'

+ compiler crash.

Commenting line (*) leads to successful compilation, link and run

Commenting second condition in line (**) (that after || ) prevents compiler crash.

Replacing line (*) with
# MyClass e = container.element;
# assert( e.foo!(MyClass).length == 0 );
leads to successful compilation, link and run.


-- 
Victor (aka nail) Nakoryakov
nail-mail<at>mail<dot>ru

Krasnoznamensk, Moscow, Russia
August 28, 2005
Victor Nakoryakov schrieb:
> Hello all.
> 
>> module core;
>>
>> class MyClass
>> {
>>     template foo(T)
>>     {
>>         T[] foo()
>>         {
>>             T[] tt;
>>             return tt;
>>         }
>>     }
>> }
>>
>> class Container
>> {
>>     this()
>>     {
>>         _element = new MyClass();
>>     }
>>
>>     MyClass element()
>>     {
>>         return _element;
>>     }
>> 
>>     private MyClass _element;
>> }
>>
>> int main(char[][] args)
>> {
>>     Container container = new Container();
>>     MyClass myclass = new MyClass();
>> 
>>     assert( container.element.foo!(MyClass).length == 0 ); // (*)
>>     assert( myclass.foo!(MyClass).length == 0 ||
>> myclass.foo!(MyClass)[0] is myclass ); // (**)
>>
>>     return 0;
>> }
> 
> 
> Compilation gives:
> 
> D:\proj\dtest>dmd -unittest -debug core.d
> core.d(38): template foo!(MyClass) is not a member of container.element
> no property 'length' for type 'int'
> core.d(39): undefined identifier myclass dotexp template instance
> foo!(MyClass ).length
> core.d(39): void has no value
> core.d(39): incompatible types for ((myclass dotexp template instance
> foo!(MyClass ).length) == (0)): 'void' and 'int'
> 
> + compiler crash.
> 
> Commenting line (*) leads to successful compilation, link and run
> 
> Commenting second condition in line (**) (that after || ) prevents
> compiler crash.
> 
> Replacing line (*) with
> # MyClass e = container.element;
> # assert( e.foo!(MyClass).length == 0 );
> leads to successful compilation, link and run.
> 
> 

gdb / dmd-0.l29:
#0  0x0809b6d8 in ArrayExp::semantic(Scope*) ()
#1  0x0809820a in BinExp::semantic(Scope*) ()
#2  0x080982cd in BinExp::semanticp(Scope*) ()
#3  0x0809eb8c in IdentityExp::semantic(Scope*) ()
#4  0x0809e34b in OrOrExp::semantic(Scope*) ()
#5  0x08098108 in UnaExp::semantic(Scope*) ()
#6  0x08098512 in AssertExp::semantic(Scope*) ()
#7  0x080d4572 in ExpStatement::semantic(Scope*) ()
#8  0x080d4983 in CompoundStatement::semantic(Scope*) ()
#9  0x080a0dbf in FuncDeclaration::semantic3(Scope*) ()
#10 0x080bc5e8 in Module::semantic3() ()
#11 0x080ba8f3 in main ()
#12 0x400f2c57 in __libc_start_main () from /lib/i686/libc.so.6

Added to DStress as http://dstress.kuehne.cn/run/b/bug_expression_4275_A.d http://dstress.kuehne.cn/run/b/bug_expression_4275_B.d

Thomas