d/dmd: Merge upstream dmd 62ce36f37
authorIain Buclaw <ibuclaw@gdcproject.org>
Tue, 21 Apr 2020 06:50:12 +0000 (08:50 +0200)
committerIain Buclaw <ibuclaw@gdcproject.org>
Tue, 21 Apr 2020 06:58:08 +0000 (08:58 +0200)
Adjusts the hardcoded index of Error.bypassException.

Fixes: PR d/94623

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

gcc/d/dmd/MERGE
gcc/d/dmd/dinterpret.c

index cd3d48d..155286d 100644 (file)
@@ -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.
index 61f5cdb..e2d49b9 100644 (file)
@@ -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;
     }