public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] d: Fix a couple of ICEs found in the dmd front-end (PR97842)
@ 2020-11-18  9:25 Iain Buclaw
  0 siblings, 0 replies; only message in thread
From: Iain Buclaw @ 2020-11-18  9:25 UTC (permalink / raw)
  To: gcc-patches

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 --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)
+{
+}
-- 
2.27.0


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2020-11-18  9:25 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-18  9:25 [PATCH] d: Fix a couple of ICEs found in the dmd front-end (PR97842) Iain Buclaw

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).