summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-check-expr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-check-expr.cpp')
-rw-r--r--source/slang/slang-check-expr.cpp36
1 files changed, 24 insertions, 12 deletions
diff --git a/source/slang/slang-check-expr.cpp b/source/slang/slang-check-expr.cpp
index c7bfdd3a6..11b001c2c 100644
--- a/source/slang/slang-check-expr.cpp
+++ b/source/slang/slang-check-expr.cpp
@@ -1303,7 +1303,18 @@ namespace Slang
Type* elementType)
{
auto baseExpr = subscriptExpr->baseExpression;
- auto indexExpr = subscriptExpr->indexExpression;
+ if (subscriptExpr->indexExprs.getCount() < 1)
+ {
+ getSink()->diagnose(subscriptExpr, Diagnostics::notEnoughArguments, subscriptExpr->indexExprs.getCount(), 1);
+ return CreateErrorExpr(subscriptExpr);
+ }
+ else if (subscriptExpr->indexExprs.getCount() > 1)
+ {
+ getSink()->diagnose(subscriptExpr, Diagnostics::tooManyArguments, subscriptExpr->indexExprs.getCount(), 1);
+ return CreateErrorExpr(subscriptExpr);
+ }
+
+ auto indexExpr = subscriptExpr->indexExprs[0];
if (!indexExpr->type->equals(m_astBuilder->getIntType()) &&
!indexExpr->type->equals(m_astBuilder->getUIntType()))
@@ -1325,20 +1336,18 @@ namespace Slang
auto baseExpr = subscriptExpr->baseExpression;
baseExpr = CheckExpr(baseExpr);
- Expr* indexExpr = subscriptExpr->indexExpression;
- if (indexExpr)
+ for (auto& arg : subscriptExpr->indexExprs)
{
- indexExpr = CheckTerm(indexExpr);
+ arg = CheckTerm(arg);
}
- subscriptExpr->baseExpression = baseExpr;
- subscriptExpr->indexExpression = indexExpr;
-
// If anything went wrong in the base expression,
// then just move along...
if (IsErrorExpr(baseExpr))
return CreateErrorExpr(subscriptExpr);
+ subscriptExpr->baseExpression = baseExpr;
+
// Otherwise, we need to look at the type of the base expression,
// to figure out how subscripting should work.
auto baseType = baseExpr->type.Ptr();
@@ -1348,9 +1357,13 @@ namespace Slang
// which should be interpreted as resolving to an array type.
IntVal* elementCount = nullptr;
- if (indexExpr)
+ if (subscriptExpr->indexExprs.getCount() == 1)
{
- elementCount = CheckIntegerConstantExpression(indexExpr, IntegerConstantExpressionCoercionType::AnyInteger, nullptr);
+ elementCount = CheckIntegerConstantExpression(subscriptExpr->indexExprs[0], IntegerConstantExpressionCoercionType::AnyInteger, nullptr);
+ }
+ else if (subscriptExpr->indexExprs.getCount() != 0)
+ {
+ getSink()->diagnose(subscriptExpr, Diagnostics::multiDimensionalArrayNotSupported);
}
auto elementType = CoerceToUsableType(TypeExp(baseExpr, baseTypeType->type));
@@ -1420,9 +1433,8 @@ namespace Slang
InvokeExpr* subscriptCallExpr = m_astBuilder->create<InvokeExpr>();
subscriptCallExpr->loc = subscriptExpr->loc;
subscriptCallExpr->functionExpr = subscriptFuncExpr;
-
- // TODO(tfoley): This path can support multiple arguments easily
- subscriptCallExpr->arguments.add(subscriptExpr->indexExpression);
+ subscriptCallExpr->arguments.addRange(subscriptExpr->indexExprs);
+ subscriptCallExpr->argumentDelimeterLocs.addRange(subscriptExpr->argumentDelimeterLocs);
return CheckInvokeExprWithCheckedOperands(subscriptCallExpr);
}