Issue with algorithm.fold - dmd hangs

Borax Man rotflol2 at hotmail.com
Fri Apr 4 23:35:14 UTC 2025


Sorry if this is an actual bug with DMD.  I suspect it might be, but I'm
not sure whether the fault is DMD or my code.

Short story, I wrote a program for work to do calculations for my team
in D, and use Windows 64bit DMD to compile.  I upgraded to the latest
DMD, and its hangs on compile.  I tried under Linux, and same issue.

Verison is

DMD64 D Compiler v2.111.0
Copyright (C) 1999-2025 by The D Language Foundation, All Rights Reserved written by Walter Bright

When I compile using dmd with the "-v" switch, these are the last
messages.

import    core.internal.string	(/usr/include/dmd/druntime/import/core/internal/string.d)
semantic3 foldtest
import    std.utf	(/usr/include/dmd/phobos/std/utf.d)
import    std.algorithm.internal	(/usr/include/dmd/phobos/std/algorithm/internal.d)

It hangs at the last line, just stays there consuming CPU cycles.

I've extracted a minimal failing copy.  The line which calls "fold" to
sum the values causes it to hang.  This compiles fine with GDC and LDC2,
and worked with DMD version before 2.100 (I didn't try anything between
2.100 and 2.111.0)

Is my code wrong, or have I stumbled on a bug?

Code below

==================================================

import std.algorithm;
import std.range;
import std.stdio;

final class DataClass {
private:
	int x;

	this()
	{}
	this(in int _x)
	{
		x=_x;
	}
	
	auto ref opOpAssign(string op : "+")(in DataClass other)
	{
		x += other.x;
		return this;
	}

	void printx()
	{
		writeln(x);
	}
	
	auto opBinary(string op : "+")(in DataClass other)
	{
		DataClass newr = new DataClass();
		newr.x = x + other.x;
		return newr;
	}
}

int main()
{
	DataClass[] dataclassarray;
	DataClass result = new DataClass();
	DataClass d1 = new DataClass(3);
	DataClass d2 = new DataClass(4);
	DataClass d3= new DataClass(10);
	DataClass d4 = new DataClass(12);
	DataClass res2 = new DataClass(10);
	dataclassarray~=d1;
	dataclassarray~=d2;
	dataclassarray~=d3;
	dataclassarray~=d4;
	res2 += d1; // This works
	res2.printx();
	res2 = d1 + d2; // This works
	res2.printx();
	result = dataclassarray.fold!((a,b) => a + b);  // This causes dmd to hang.
	result.printx();
	return 0;
}


More information about the Digitalmars-d mailing list