d: Fix infinite loop regression in CTFE
An infinite loop was introduced by a previous refactoring in the semantic pass for DeclarationExp nodes. Ensure the loop properly terminates and add tests cases. gcc/d/ChangeLog: * dmd/MERGE: Merge upstream dmd 956e73d64e. gcc/testsuite/ChangeLog: * gdc.test/fail_compilation/test21247.d: New test. * gdc.test/fail_compilation/test21247b.d: New test. Reviewed-on: https://github.com/dlang/dmd/pull/21248
This commit is contained in:
parent
a4f81e168e
commit
0eae20c899
4 changed files with 38 additions and 4 deletions
|
@ -1,4 +1,4 @@
|
|||
1b34fea4788136b54ec77c6ed9678754d109fc79
|
||||
956e73d64e532a68213970316c2590c572ec03f3
|
||||
|
||||
The first line of this file holds the git revision number of the last
|
||||
merge done from the dlang/dmd repository.
|
||||
|
|
|
@ -6978,10 +6978,10 @@ private extern (C++) final class ExpressionSemanticVisitor : Visitor
|
|||
while (1)
|
||||
{
|
||||
AttribDeclaration ad = s.isAttribDeclaration();
|
||||
if (!ad)
|
||||
break;
|
||||
if (ad.decl && ad.decl.length == 1)
|
||||
if (ad && ad.decl && ad.decl.length == 1)
|
||||
s = (*ad.decl)[0];
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
//printf("inserting '%s' %p into sc = %p\n", s.toChars(), s, sc);
|
||||
|
|
20
gcc/testsuite/gdc.test/fail_compilation/test21247.d
Normal file
20
gcc/testsuite/gdc.test/fail_compilation/test21247.d
Normal file
|
@ -0,0 +1,20 @@
|
|||
/*
|
||||
TEST_OUTPUT:
|
||||
---
|
||||
fail_compilation/test21247.d(13): Error: anonymous union can only be a part of an aggregate, not function `hang_dmd`
|
||||
fail_compilation/test21247.d(17): Error: undefined identifier `u`
|
||||
fail_compilation/test21247.d(18): Error: undefined identifier `b`
|
||||
fail_compilation/test21247.d(20): called from here: `hang_dmd(0u)`
|
||||
---
|
||||
*/
|
||||
// https://github.com/dlang/dmd/issues/21247
|
||||
ubyte[4] hang_dmd(uint a)
|
||||
{
|
||||
union {
|
||||
uint u = void;
|
||||
ubyte[4] b;
|
||||
}
|
||||
u = a;
|
||||
return b;
|
||||
}
|
||||
enum T = hang_dmd(0);
|
14
gcc/testsuite/gdc.test/fail_compilation/test21247b.d
Normal file
14
gcc/testsuite/gdc.test/fail_compilation/test21247b.d
Normal file
|
@ -0,0 +1,14 @@
|
|||
/*
|
||||
TEST_OUTPUT:
|
||||
---
|
||||
fail_compilation/test21247b.d(10): Error: anonymous union can only be a part of an aggregate, not function `test21247`
|
||||
---
|
||||
*/
|
||||
// https://github.com/dlang/dmd/issues/21247
|
||||
void test21247()
|
||||
{
|
||||
union {
|
||||
uint u = void;
|
||||
ubyte[4] b;
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue