summaryrefslogtreecommitdiff
path: root/source/slang/slang-check-expr.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-10-25 07:50:14 -0700
committerGitHub <noreply@github.com>2023-10-25 22:50:14 +0800
commit5dc3c2f57963de93ad03724a01ea48b8585dc15a (patch)
tree072748b952eb03da7950110ed3a8f87da9b5e72f /source/slang/slang-check-expr.cpp
parentf8bf75cf1ae0aeee155996a917c2925bc500f3e2 (diff)
Add `IArray`. (#3281)
* Initial support for generic interfaces. * Cleanup. * Add generic syntax for interfaces. * Add `IArray`. * Fix. * Fix. * Fix. --------- Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-check-expr.cpp')
-rw-r--r--source/slang/slang-check-expr.cpp63
1 files changed, 24 insertions, 39 deletions
diff --git a/source/slang/slang-check-expr.cpp b/source/slang/slang-check-expr.cpp
index 22bc2cae8..b76fe0003 100644
--- a/source/slang/slang-check-expr.cpp
+++ b/source/slang/slang-check-expr.cpp
@@ -1752,8 +1752,7 @@ namespace Slang
Expr* SemanticsExprVisitor::visitIndexExpr(IndexExpr* subscriptExpr)
{
- auto baseExpr = subscriptExpr->baseExpression;
- baseExpr = CheckExpr(baseExpr);
+ auto baseExpr = checkBaseForMemberExpr(subscriptExpr->baseExpression);
for (auto& arg : subscriptExpr->indexExprs)
{
@@ -1822,47 +1821,34 @@ namespace Slang
// Default behavior is to look at all available `__subscript`
// declarations on the type and try to call one of them.
- {
- Name* name = getName("operator[]");
- LookupResult lookupResult = lookUpMember(
- m_astBuilder,
- this,
- name,
- baseType,
- LookupMask::Default,
- LookupOptions::NoDeref);
- if (!lookupResult.isValid())
- {
- goto fail;
- }
+ auto operatorName = getName("operator[]");
- // Now that we know there is at least one subscript member,
- // we will construct a reference to it and try to call it.
- //
- // Note: the expression may be an `OverloadedExpr`, in which
- // case the attempt to call it will trigger overload
- // resolution.
- Expr* subscriptFuncExpr = createLookupResultExpr(
- name,
- lookupResult,
- subscriptExpr->baseExpression,
- subscriptExpr->loc,
- subscriptExpr);
-
- InvokeExpr* subscriptCallExpr = m_astBuilder->create<InvokeExpr>();
- subscriptCallExpr->loc = subscriptExpr->loc;
- subscriptCallExpr->functionExpr = subscriptFuncExpr;
- subscriptCallExpr->arguments.addRange(subscriptExpr->indexExprs);
- subscriptCallExpr->argumentDelimeterLocs.addRange(subscriptExpr->argumentDelimeterLocs);
-
- return CheckInvokeExprWithCheckedOperands(subscriptCallExpr);
- }
-
- fail:
+ LookupResult lookupResult = lookUpMember(
+ m_astBuilder,
+ this,
+ operatorName,
+ baseType,
+ LookupMask::Default,
+ LookupOptions::NoDeref);
+ if (!lookupResult.isValid())
{
getSink()->diagnose(subscriptExpr, Diagnostics::subscriptNonArray, baseType);
return CreateErrorExpr(subscriptExpr);
}
+ auto subscriptFuncExpr = createLookupResultExpr(
+ operatorName,
+ lookupResult,
+ subscriptExpr->baseExpression,
+ subscriptExpr->loc,
+ subscriptExpr);
+
+ InvokeExpr* subscriptCallExpr = m_astBuilder->create<InvokeExpr>();
+ subscriptCallExpr->loc = subscriptExpr->loc;
+ subscriptCallExpr->functionExpr = subscriptFuncExpr;
+ subscriptCallExpr->arguments.addRange(subscriptExpr->indexExprs);
+ subscriptCallExpr->argumentDelimeterLocs.addRange(subscriptExpr->argumentDelimeterLocs);
+
+ return CheckInvokeExprWithCheckedOperands(subscriptCallExpr);
}
Expr* SemanticsExprVisitor::visitParenExpr(ParenExpr* expr)
@@ -2306,7 +2292,6 @@ namespace Slang
expr->type = GetTypeForDeclRef(expr->declRef, expr->loc);
return expr;
}
-
expr->type = QualType(m_astBuilder->getErrorType());
auto lookupResult = lookUp(
m_astBuilder,