d: Fix a couple of ICEs found in the dmd front-end (PR97842)
authorIain Buclaw <ibuclaw@gdcproject.org>
Tue, 17 Nov 2020 09:48:41 +0000 (10:48 +0100)
committerIain Buclaw <ibuclaw@gdcproject.org>
Wed, 18 Nov 2020 09:22:06 +0000 (10:22 +0100)
- Segmentation fault on incomplete static if.
- Segmentation fault resolving typeof() expression when gagging is on.

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

gcc/d/ChangeLog:

PR d/97842
* dmd/MERGE: Merge upstream dmd b6a779e49

gcc/d/dmd/MERGE
gcc/d/dmd/cond.c
gcc/d/dmd/mtype.c
gcc/testsuite/gdc.test/fail_compilation/fail18970.d [new file with mode: 0644]
gcc/testsuite/gdc.test/fail_compilation/imports/test21164a.d [new file with mode: 0644]
gcc/testsuite/gdc.test/fail_compilation/imports/test21164b.d [new file with mode: 0644]
gcc/testsuite/gdc.test/fail_compilation/imports/test21164c.d [new file with mode: 0644]
gcc/testsuite/gdc.test/fail_compilation/imports/test21164d.d [new file with mode: 0644]
gcc/testsuite/gdc.test/fail_compilation/test21164.d [new file with mode: 0644]

index e2a0bab2e4a28acba270fb11c06d1cc46806c039..b00cb8262a732f8aab618af466d85cc0160d0c7d 100644 (file)
@@ -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.
index beda133ffdb64c9f5afff181912e9b59220ef922..9f76e83238e0cf46ce9a98c6d6fd9271d160f9f8 100644 (file)
@@ -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();
 
index bc66be028c1d84cef36bfaa4c1d0ad85647e050a..6f0195af30500511d28c61f1ff825d51051cf8b2 100644 (file)
@@ -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 (file)
index 0000000..846a578
--- /dev/null
@@ -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 (file)
index 0000000..e5fcd43
--- /dev/null
@@ -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 (file)
index 0000000..ece5476
--- /dev/null
@@ -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 (file)
index 0000000..21a252f
--- /dev/null
@@ -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 (file)
index 0000000..08f83ea
--- /dev/null
@@ -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 (file)
index 0000000..f42c4bc
--- /dev/null
@@ -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)
+{
+}