diff options
| author | Yong He <yonghe@outlook.com> | 2023-10-25 07:50:14 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-10-25 22:50:14 +0800 |
| commit | 5dc3c2f57963de93ad03724a01ea48b8585dc15a (patch) | |
| tree | 072748b952eb03da7950110ed3a8f87da9b5e72f /source/slang/slang-check-expr.cpp | |
| parent | f8bf75cf1ae0aeee155996a917c2925bc500f3e2 (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.cpp | 63 |
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, |
