]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
d: Fix infinite loop regression in CTFE
authorIain Buclaw <ibuclaw@gdcproject.org>
Thu, 17 Apr 2025 06:21:40 +0000 (08:21 +0200)
committerIain Buclaw <ibuclaw@gdcproject.org>
Thu, 17 Apr 2025 06:59:36 +0000 (08:59 +0200)
An infinite loop was introduced by a previous refactoring in the
semantic pass for DeclarationExp nodes. Ensure the loop properly
terminates and add tests cases.

gcc/d/ChangeLog:

* dmd/MERGE: Merge upstream dmd 956e73d64e.

gcc/testsuite/ChangeLog:

* gdc.test/fail_compilation/test21247.d: New test.
* gdc.test/fail_compilation/test21247b.d: New test.

Reviewed-on: https://github.com/dlang/dmd/pull/21248

gcc/d/dmd/MERGE
gcc/d/dmd/expressionsem.d
gcc/testsuite/gdc.test/fail_compilation/test21247.d [new file with mode: 0644]
gcc/testsuite/gdc.test/fail_compilation/test21247b.d [new file with mode: 0644]

index ee5eb853284bd05a2748ab119239a04e0384d7dc..58d19b4e951df74f48f5c4dfc988d400da22c64f 100644 (file)
@@ -1,4 +1,4 @@
-1b34fea4788136b54ec77c6ed9678754d109fc79
+956e73d64e532a68213970316c2590c572ec03f3
 
 The first line of this file holds the git revision number of the last
 merge done from the dlang/dmd repository.
index 19111e31baa086b276722f1ecb4177a181d83583..b02f6ea64102c3de93bfa23b0e3ed91e6a6c5dbb 100644 (file)
@@ -6978,10 +6978,10 @@ private extern (C++) final class ExpressionSemanticVisitor : Visitor
         while (1)
         {
             AttribDeclaration ad = s.isAttribDeclaration();
-            if (!ad)
-                break;
-            if (ad.decl && ad.decl.length == 1)
+            if (ad && ad.decl && ad.decl.length == 1)
                 s = (*ad.decl)[0];
+            else
+                break;
         }
 
         //printf("inserting '%s' %p into sc = %p\n", s.toChars(), s, sc);
diff --git a/gcc/testsuite/gdc.test/fail_compilation/test21247.d b/gcc/testsuite/gdc.test/fail_compilation/test21247.d
new file mode 100644 (file)
index 0000000..c3e4105
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+TEST_OUTPUT:
+---
+fail_compilation/test21247.d(13): Error: anonymous union can only be a part of an aggregate, not function `hang_dmd`
+fail_compilation/test21247.d(17): Error: undefined identifier `u`
+fail_compilation/test21247.d(18): Error: undefined identifier `b`
+fail_compilation/test21247.d(20):        called from here: `hang_dmd(0u)`
+---
+ */
+// https://github.com/dlang/dmd/issues/21247
+ubyte[4] hang_dmd(uint a)
+{
+    union {
+        uint u = void;
+        ubyte[4] b;
+    }
+    u = a;
+    return b;
+}
+enum T = hang_dmd(0);
diff --git a/gcc/testsuite/gdc.test/fail_compilation/test21247b.d b/gcc/testsuite/gdc.test/fail_compilation/test21247b.d
new file mode 100644 (file)
index 0000000..ecd4603
--- /dev/null
@@ -0,0 +1,14 @@
+/*
+TEST_OUTPUT:
+---
+fail_compilation/test21247b.d(10): Error: anonymous union can only be a part of an aggregate, not function `test21247`
+---
+ */
+// https://github.com/dlang/dmd/issues/21247
+void test21247()
+{
+    union {
+        uint u = void;
+        ubyte[4] b;
+    }
+}