d: Fix infinite loop in isAliasThisTuple

This reverts a change in the upstream D implementation of the compiler,
as the refactoring introduced a regression.

gcc/d/ChangeLog:

	* dmd/MERGE: Merge upstream dmd 51816cd01d.

Reviewed-on: https://github.com/dlang/dmd/pull/21155
This commit is contained in:
Iain Buclaw 2025-04-08 16:36:15 +02:00
parent 1b5b02be57
commit 639376154e
3 changed files with 26 additions and 14 deletions

View file

@ -1,4 +1,4 @@
ed17b3e95dc3fc3264a4c91843da824f5541f3e1
51816cd01deee5cc1d7d2c6e1e24788ec655b73e
The first line of this file holds the git revision number of the last
merge done from the dlang/dmd repository.

View file

@ -641,21 +641,25 @@ TupleDeclaration isAliasThisTuple(Expression e)
Type t = e.type.toBasetype();
while (true)
{
Dsymbol s = t.toDsymbol(null);
if (!s)
return null;
auto ad = s.isAggregateDeclaration();
if (!ad)
return null;
s = ad.aliasthis ? ad.aliasthis.sym : null;
if (s && s.isVarDeclaration())
if (Dsymbol s = t.toDsymbol(null))
{
TupleDeclaration td = s.isVarDeclaration().toAlias().isTupleDeclaration();
if (td && td.isexp)
return td;
if (auto ad = s.isAggregateDeclaration())
{
s = ad.aliasthis ? ad.aliasthis.sym : null;
if (s && s.isVarDeclaration())
{
TupleDeclaration td = s.isVarDeclaration().toAlias().isTupleDeclaration();
if (td && td.isexp)
return td;
}
if (Type att = t.aliasthisOf())
{
t = att;
continue;
}
}
}
if (Type att = t.aliasthisOf())
t = att;
return null;
}
}

View file

@ -0,0 +1,8 @@
// https://github.com/dlang/dmd/issues/21153
alias AliasSeq(TList...) = TList;
class DataClass;
void reduce(DataClass[] r)
{
alias Args = AliasSeq!(DataClass);
Args result = r[0];
}