https://gcc.gnu.org/g:639376154eaffe683f4027c95a08c5d30922b12d

commit r15-9318-g639376154eaffe683f4027c95a08c5d30922b12d
Author: Iain Buclaw <ibuc...@gdcproject.org>
Date:   Tue Apr 8 16:36:15 2025 +0200

    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

Diff:
---
 gcc/d/dmd/MERGE                               |  2 +-
 gcc/d/dmd/expressionsem.d                     | 30 +++++++++++++++------------
 gcc/testsuite/gdc.test/compilable/test21153.d |  8 +++++++
 3 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/gcc/d/dmd/MERGE b/gcc/d/dmd/MERGE
index bd297b612c4e..a05a50eefb8d 100644
--- a/gcc/d/dmd/MERGE
+++ b/gcc/d/dmd/MERGE
@@ -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.
diff --git a/gcc/d/dmd/expressionsem.d b/gcc/d/dmd/expressionsem.d
index b0278cbaca1b..19111e31baa0 100644
--- a/gcc/d/dmd/expressionsem.d
+++ b/gcc/d/dmd/expressionsem.d
@@ -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;
     }
 }
 
diff --git a/gcc/testsuite/gdc.test/compilable/test21153.d 
b/gcc/testsuite/gdc.test/compilable/test21153.d
new file mode 100644
index 000000000000..cd92a31240be
--- /dev/null
+++ b/gcc/testsuite/gdc.test/compilable/test21153.d
@@ -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];
+}

Reply via email to