diff mbox series

d: Fix a couple of ICEs found in the dmd front-end (PR97842)

Message ID 20201118092535.3907639-1-ibuclaw@gdcproject.org
State New
Headers show
Series d: Fix a couple of ICEs found in the dmd front-end (PR97842) | expand

Commit Message

Iain Buclaw Nov. 18, 2020, 9:25 a.m. UTC
Hi,

This patch merges the D front-end implementation with upstream dmd
b6a779e49, fixing two segmentation faults. One when encountering an
incomplete static if, and another when resolving typeof() expressions
whilst gagging is on.

Bootstrapped and regression tested on x86_64-linux-gnu, committed to
mainline, and backported to the release/gcc-10 branch.

Regards
Iain.

---
gcc/d/ChangeLog:

	PR d/97842
	* dmd/MERGE: Merge upstream dmd b6a779e49
---
 gcc/d/dmd/MERGE                               |  2 +-
 gcc/d/dmd/cond.c                              |  4 ++
 gcc/d/dmd/mtype.c                             |  6 +++
 .../gdc.test/fail_compilation/fail18970.d     | 37 +++++++++++++++++++
 .../fail_compilation/imports/test21164a.d     |  9 +++++
 .../fail_compilation/imports/test21164b.d     |  4 ++
 .../fail_compilation/imports/test21164c.d     | 10 +++++
 .../fail_compilation/imports/test21164d.d     |  9 +++++
 .../gdc.test/fail_compilation/test21164.d     | 13 +++++++
 9 files changed, 93 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gdc.test/fail_compilation/fail18970.d
 create mode 100644 gcc/testsuite/gdc.test/fail_compilation/imports/test21164a.d
 create mode 100644 gcc/testsuite/gdc.test/fail_compilation/imports/test21164b.d
 create mode 100644 gcc/testsuite/gdc.test/fail_compilation/imports/test21164c.d
 create mode 100644 gcc/testsuite/gdc.test/fail_compilation/imports/test21164d.d
 create mode 100644 gcc/testsuite/gdc.test/fail_compilation/test21164.d
diff mbox series

Patch

diff --git a/gcc/d/dmd/MERGE b/gcc/d/dmd/MERGE
index e2a0bab2e4a..b00cb8262a7 100644
--- a/gcc/d/dmd/MERGE
+++ b/gcc/d/dmd/MERGE
@@ -1,4 +1,4 @@ 
-95044d8e45a4320f07d9c75b4eb30e55688a8195
+b6a779e49a3bba8be6272e6730e14cbb6293ef77
 
 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/cond.c b/gcc/d/dmd/cond.c
index beda133ffdb..9f76e83238e 100644
--- a/gcc/d/dmd/cond.c
+++ b/gcc/d/dmd/cond.c
@@ -705,6 +705,10 @@  int StaticIfCondition::include(Scope *sc)
         sc = sc->push(sc->scopesym);
 
         bool errors = false;
+
+        if (!exp)
+            goto Lerror;
+
         bool result = evalStaticCondition(sc, exp, exp, errors);
         sc->pop();
 
diff --git a/gcc/d/dmd/mtype.c b/gcc/d/dmd/mtype.c
index bc66be028c1..6f0195af305 100644
--- a/gcc/d/dmd/mtype.c
+++ b/gcc/d/dmd/mtype.c
@@ -7418,6 +7418,12 @@  void TypeTypeof::resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol
 
     //printf("TypeTypeof::resolve(sc = %p, idents = '%s')\n", sc, toChars());
     //static int nest; if (++nest == 50) *(char*)0=0;
+    if (sc == NULL)
+    {
+        *pt = Type::terror;
+        error(loc, "Invalid scope.");
+        return;
+    }
     if (inuse)
     {
         inuse = 2;
diff --git a/gcc/testsuite/gdc.test/fail_compilation/fail18970.d b/gcc/testsuite/gdc.test/fail_compilation/fail18970.d
new file mode 100644
index 00000000000..846a5782d7d
--- /dev/null
+++ b/gcc/testsuite/gdc.test/fail_compilation/fail18970.d
@@ -0,0 +1,37 @@ 
+/*
+TEST_OUTPUT:
+---
+fail_compilation/fail18970.d(22): Error: no property `y` for type `fail18970.S`
+fail_compilation/fail18970.d(29): Error: no property `yyy` for type `fail18970.S2`
+---
+*/
+
+// https://issues.dlang.org/show_bug.cgi?id=18970
+
+struct S
+{
+    auto opDispatch(string name)(int)
+    {
+        alias T = typeof(x);
+        static assert(!is(T.U));
+        return 0;
+    }
+}
+void f()
+{
+    S().y(1);
+}
+
+struct S2
+{
+    this(int)
+    {
+        this.yyy;
+    }
+
+    auto opDispatch(string name)()
+    {
+        alias T = typeof(x);
+        static if(is(T.U)) {}
+    }
+}
diff --git a/gcc/testsuite/gdc.test/fail_compilation/imports/test21164a.d b/gcc/testsuite/gdc.test/fail_compilation/imports/test21164a.d
new file mode 100644
index 00000000000..e5fcd43595e
--- /dev/null
+++ b/gcc/testsuite/gdc.test/fail_compilation/imports/test21164a.d
@@ -0,0 +1,9 @@ 
+struct D(E)
+{
+    void G()    {
+        import imports.test21164d;
+        I;
+    }
+
+}
+
diff --git a/gcc/testsuite/gdc.test/fail_compilation/imports/test21164b.d b/gcc/testsuite/gdc.test/fail_compilation/imports/test21164b.d
new file mode 100644
index 00000000000..ece5476654e
--- /dev/null
+++ b/gcc/testsuite/gdc.test/fail_compilation/imports/test21164b.d
@@ -0,0 +1,4 @@ 
+import imports.test21164c;
+enum N = O();
+alias Q = R!(N, S);
+
diff --git a/gcc/testsuite/gdc.test/fail_compilation/imports/test21164c.d b/gcc/testsuite/gdc.test/fail_compilation/imports/test21164c.d
new file mode 100644
index 00000000000..21a252f5036
--- /dev/null
+++ b/gcc/testsuite/gdc.test/fail_compilation/imports/test21164c.d
@@ -0,0 +1,10 @@ 
+enum S = 1;
+
+struct O
+{
+}
+
+struct R(O U, int W)
+{
+}
+
diff --git a/gcc/testsuite/gdc.test/fail_compilation/imports/test21164d.d b/gcc/testsuite/gdc.test/fail_compilation/imports/test21164d.d
new file mode 100644
index 00000000000..08f83ea91f7
--- /dev/null
+++ b/gcc/testsuite/gdc.test/fail_compilation/imports/test21164d.d
@@ -0,0 +1,9 @@ 
+auto AB()
+{
+static if}
+
+auto I()
+{
+AB;
+}
+
diff --git a/gcc/testsuite/gdc.test/fail_compilation/test21164.d b/gcc/testsuite/gdc.test/fail_compilation/test21164.d
new file mode 100644
index 00000000000..f42c4bc9d15
--- /dev/null
+++ b/gcc/testsuite/gdc.test/fail_compilation/test21164.d
@@ -0,0 +1,13 @@ 
+/*
+TEST_OUTPUT:
+---
+fail_compilation/imports/test21164d.d(3): Error: (expression) expected following `static if`
+fail_compilation/imports/test21164d.d(3): Error: found `}` instead of statement
+fail_compilation/test21164.d(11): Error: template instance `test21164a.D!(R!(O(), 1))` error instantiating
+---
+*/
+import imports.test21164a;
+import imports.test21164b;
+auto GB(D!Q)
+{
+}