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(); +}