https://gcc.gnu.org/g:258d5c062719725310421d0b4f0d03110e3e88a2

commit r14-11216-g258d5c062719725310421d0b4f0d03110e3e88a2
Author: Iain Buclaw <ibuc...@gdcproject.org>
Date:   Thu Jan 16 17:20:06 2025 +0100

    d: Fix ICE in dmd.expressionsem.resolveLoc
    
    This was fixed in upstream, and merged in r15-6559-g332cf038fda109.
    Backport the individual fix from the upstream merge for releases/gcc-14.
    
            PR d/116373
    
    gcc/d/ChangeLog:
    
            * dmd/expressionsem.d (resolveLoc): Check for null pointer before
            resolving bounds of slice.
    
    gcc/testsuite/ChangeLog:
    
            * gdc.dg/pr116373.d: New test.
    
    (cherry picked from commit c7dab40d7569c51ac4e62ceea05c7c049da426bb)

Diff:
---
 gcc/d/dmd/expressionsem.d       | 6 ++++--
 gcc/testsuite/gdc.dg/pr116373.d | 8 ++++++++
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/gcc/d/dmd/expressionsem.d b/gcc/d/dmd/expressionsem.d
index 7ae7f400d166..a6425d311439 100644
--- a/gcc/d/dmd/expressionsem.d
+++ b/gcc/d/dmd/expressionsem.d
@@ -15331,8 +15331,10 @@ Expression resolveLoc(Expression exp, const ref Loc 
loc, Scope* sc)
     Expression visitSlice(SliceExp exp)
     {
         exp.e1 = exp.e1.resolveLoc(loc, sc);
-        exp.lwr = exp.lwr.resolveLoc(loc, sc);
-        exp.upr = exp.upr.resolveLoc(loc, sc);
+        if (exp.lwr)
+            exp.lwr = exp.lwr.resolveLoc(loc, sc);
+        if (exp.upr)
+            exp.upr = exp.upr.resolveLoc(loc, sc);
 
         return exp;
     }
diff --git a/gcc/testsuite/gdc.dg/pr116373.d b/gcc/testsuite/gdc.dg/pr116373.d
new file mode 100644
index 000000000000..b58863bacf29
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/pr116373.d
@@ -0,0 +1,8 @@
+// { dg-do compile }
+int[] x;
+
+void foo (int[] y = x[]) {}
+
+void main () {
+    foo();
+}

Reply via email to