Commit 46cf683b by Iain Buclaw

d/dmd: Merge upstream dmd 62ce36f37

Adjusts the hardcoded index of Error.bypassException.

Fixes: PR d/94623

Reviewed-on: https://github.com/dlang/dmd/pull/11052
parent 8e841bd4
ba99ee345694da61eca7b555517d540ff3dc0a56
62ce36f3737de691217c21f0173f411734eb1d43
The first line of this file holds the git revision number of the last
merge done from the dlang/dmd repository.
......@@ -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;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment