Skip to content

Commit 4e74956

Browse files
committed
fix #21630: enum and alias ignored on runtime foreach loop variables
1 parent e33c664 commit 4e74956

File tree

3 files changed

+29
-1
lines changed

3 files changed

+29
-1
lines changed

compiler/src/dmd/expressionsem.d

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17760,7 +17760,7 @@ void lowerNonArrayAggregate(StaticForeach sfe, Scope* sc)
1776017760
foreach (params; pparams)
1776117761
{
1776217762
auto p = sfe.aggrfe ? (*sfe.aggrfe.parameters)[i] : sfe.rangefe.param;
17763-
params.push(new Parameter(aloc, p.storageClass, p.type, p.ident, null, null));
17763+
params.push(new Parameter(aloc, p.storageClass & ~STC.manifest & ~STC.alias_, p.type, p.ident, null, null));
1776417764
}
1776517765
}
1776617766
Expression[2] res;

compiler/src/dmd/statementsem.d

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1461,6 +1461,16 @@ Statement statementSemanticVisit(Statement s, Scope* sc)
14611461
*/
14621462

14631463
//printf("ForeachRangeStatement::semantic() %p\n", fs);
1464+
1465+
if (fs.param.storageClass & STC.manifest)
1466+
{
1467+
error(fs.loc, "cannot declare `enum` loop variables for non-unrolled foreach");
1468+
}
1469+
if (fs.param.storageClass & STC.alias_)
1470+
{
1471+
error(fs.loc, "cannot declare `alias` loop variables for non-unrolled foreach");
1472+
}
1473+
14641474
auto loc = fs.loc;
14651475
fs.lwr = fs.lwr.expressionSemantic(sc);
14661476
fs.lwr = resolveProperties(sc, fs.lwr);
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/+
2+
TEST_OUTPUT:
3+
---
4+
fail_compilation/issue21630.d(14): Error: cannot declare `enum` loop variables for non-unrolled foreach
5+
fail_compilation/issue21630.d(15): Error: cannot declare `alias` loop variables for non-unrolled foreach
6+
fail_compilation/issue21630.d(16): Error: cannot declare `enum` loop variables for non-unrolled foreach
7+
fail_compilation/issue21630.d(17): Error: cannot declare `alias` loop variables for non-unrolled foreach
8+
---
9+
+/
10+
11+
void main()
12+
{
13+
enum a = [1, 2, 3];
14+
foreach(enum i; a) { } // error
15+
foreach(alias i; a) { } // error
16+
foreach(enum i; 0 .. 3) { } // error
17+
foreach(alias i; 0 .. 3) { } // error
18+
}

0 commit comments

Comments
 (0)