diff options
| author | Tim Foley <tfoleyNV@users.noreply.github.com> | 2017-07-18 15:22:20 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-07-18 15:22:20 -0700 |
| commit | a01014567cccc2582547ed10870352629ffd6484 (patch) | |
| tree | 30e1bf209e232d7f8d6723959db68b2c0cb015dd /source/slang/check.cpp | |
| parent | 3d313d963f29f6ca6a8d12bd5c403a70c49aca2a (diff) | |
| parent | 2476c035ec15d3ee22239ebd1fe10e6e8c1e01e3 (diff) | |
Merge pull request #120 from tfoleyNV/compile-time-loop
Add a compile-time loop construct to Slang
Diffstat (limited to 'source/slang/check.cpp')
| -rw-r--r-- | source/slang/check.cpp | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/source/slang/check.cpp b/source/slang/check.cpp index 1c1c6d5d3..26d28d495 100644 --- a/source/slang/check.cpp +++ b/source/slang/check.cpp @@ -1735,6 +1735,48 @@ namespace Slang PopOuterStmt(stmt); } + + RefPtr<ExpressionSyntaxNode> checkExpressionAndExpectIntegerConstant(RefPtr<ExpressionSyntaxNode> expr, RefPtr<IntVal>* outIntVal) + { + expr = CheckExpr(expr); + auto intVal = CheckIntegerConstantExpression(expr); + if (outIntVal) + *outIntVal = intVal; + return expr; + } + + void visitCompileTimeForStmt(CompileTimeForStmt* stmt) + { + PushOuterStmt(stmt); + + stmt->varDecl->Type.type = ExpressionType::GetInt(); + addModifier(stmt->varDecl, new ConstModifier()); + + RefPtr<IntVal> rangeBeginVal; + RefPtr<IntVal> rangeEndVal; + + if (stmt->rangeBeginExpr) + { + stmt->rangeBeginExpr = checkExpressionAndExpectIntegerConstant(stmt->rangeBeginExpr, &rangeBeginVal); + } + else + { + RefPtr<ConstantIntVal> rangeBeginConst = new ConstantIntVal(); + rangeBeginConst->value = 0; + rangeBeginVal = rangeBeginConst; + } + + stmt->rangeEndExpr = checkExpressionAndExpectIntegerConstant(stmt->rangeEndExpr, &rangeEndVal); + + stmt->rangeBeginVal = rangeBeginVal; + stmt->rangeEndVal = rangeEndVal; + + checkStmt(stmt->body); + + + PopOuterStmt(stmt); + } + void visitSwitchStmt(SwitchStmt* stmt) { PushOuterStmt(stmt); |
