diff mbox series

[committed] d/dmd: Merge upstream dmd 62ce36f37 (PR94623)

Message ID 20200421070844.12932-1-ibuclaw@gdcproject.org
State New
Headers show
Series [committed] d/dmd: Merge upstream dmd 62ce36f37 (PR94623) | expand

Commit Message

Iain Buclaw April 21, 2020, 7:08 a.m. UTC
Hi,

This patch merges the D front-end implementation with dmd upstream
62ce36f37.  Adjusts the hardcoded index of Error.bypassException.

Bootstrapped and regression tested on x86_64-linux-gnu, and committed to
mainline.

Regards
Iain

---
 gcc/d/dmd/MERGE        |  2 +-
 gcc/d/dmd/dinterpret.c | 19 +++++++++++++------
 2 files changed, 14 insertions(+), 7 deletions(-)
diff mbox series

Patch

diff --git a/gcc/d/dmd/MERGE b/gcc/d/dmd/MERGE
index cd3d48ded8e..155286dd765 100644
--- a/gcc/d/dmd/MERGE
+++ b/gcc/d/dmd/MERGE
@@ -1,4 +1,4 @@ 
-ba99ee345694da61eca7b555517d540ff3dc0a56
+62ce36f3737de691217c21f0173f411734eb1d43
 
 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/dinterpret.c b/gcc/d/dmd/dinterpret.c
index 61f5cdb0730..e2d49b9e8f1 100644
--- a/gcc/d/dmd/dinterpret.c
+++ b/gcc/d/dmd/dinterpret.c
@@ -1652,21 +1652,28 @@  public:
     {
         // Little sanity check to make sure it's really a Throwable
         ClassReferenceExp *boss = oldest->thrown;
-        assert((*boss->value->elements)[4]->type->ty == Tclass);    // Throwable.next
+        const int next = 4;                         // index of Throwable.next
+        assert((*boss->value->elements)[next]->type->ty == Tclass); // Throwable.next
         ClassReferenceExp *collateral = newest->thrown;
         if ( isAnErrorException(collateral->originalClass()) &&
             !isAnErrorException(boss->originalClass()))
         {
+            /* Find the index of the Error.bypassException field
+             */
+            int bypass = next + 1;
+            if ((*collateral->value->elements)[bypass]->type->ty == Tuns32)
+                bypass += 1;  // skip over _refcount field
+            assert((*collateral->value->elements)[bypass]->type->ty == Tclass);
+
             // The new exception bypass the existing chain
-            assert((*collateral->value->elements)[5]->type->ty == Tclass);
-            (*collateral->value->elements)[5] = boss;
+            (*collateral->value->elements)[bypass] = boss;
             return newest;
         }
-        while ((*boss->value->elements)[4]->op == TOKclassreference)
+        while ((*boss->value->elements)[next]->op == TOKclassreference)
         {
-            boss = (ClassReferenceExp *)(*boss->value->elements)[4];
+            boss = (ClassReferenceExp *)(*boss->value->elements)[next];
         }
-        (*boss->value->elements)[4] = collateral;
+        (*boss->value->elements)[next] = collateral;
         return oldest;
     }