diff options
| author | Jay Kwak <82421531+jkwak-work@users.noreply.github.com> | 2025-06-08 12:54:52 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-06-08 19:54:52 +0000 |
| commit | bfac247ff2489a1f7fb9766674a6ed25a48a493b (patch) | |
| tree | fd11188b120d079962c32d3707d418295ce43225 /source/slang | |
| parent | 10a3b87db80ae87d6d01ef2af562a732055da1c2 (diff) | |
Fix interface types as RHS of is/as operators (#7234)
Added error checking to reject interface types as the right-hand side
of is and as operators. Enhanced semantic analysis with new diagnostic
30301 and comprehensive test coverage.
Diffstat (limited to 'source/slang')
| -rw-r--r-- | source/slang/slang-check-expr.cpp | 16 | ||||
| -rw-r--r-- | source/slang/slang-diagnostic-defs.h | 8 |
2 files changed, 24 insertions, 0 deletions
diff --git a/source/slang/slang-check-expr.cpp b/source/slang/slang-check-expr.cpp index 66c2f9796..f4c8cd847 100644 --- a/source/slang/slang-check-expr.cpp +++ b/source/slang/slang-check-expr.cpp @@ -4065,6 +4065,13 @@ Expr* SemanticsExprVisitor::visitIsTypeExpr(IsTypeExpr* expr) expr->type = m_astBuilder->getBoolType(); expr->value = originalVal; + // Check if the right-hand side type is an interface type + if (isInterfaceType(expr->typeExpr.type)) + { + getSink()->diagnose(expr, Diagnostics::isAsOperatorCannotUseInterfaceAsRHS); + return expr; + } + auto valueType = expr->value->type.type; if (auto typeType = as<TypeType>(valueType)) valueType = typeType->getType(); @@ -4103,6 +4110,15 @@ Expr* SemanticsExprVisitor::visitAsTypeExpr(AsTypeExpr* expr) TypeExp typeExpr; typeExpr.exp = expr->typeExpr; typeExpr = CheckProperType(typeExpr); + + // Check if the right-hand side type is an interface type + if (isInterfaceType(typeExpr.type)) + { + getSink()->diagnose(expr, Diagnostics::isAsOperatorCannotUseInterfaceAsRHS); + expr->type = m_astBuilder->getErrorType(); + return expr; + } + expr->value = CheckTerm(expr->value); auto optType = m_astBuilder->getOptionalType(typeExpr.type); expr->type = optType; diff --git a/source/slang/slang-diagnostic-defs.h b/source/slang/slang-diagnostic-defs.h index bef32e20e..f4741ab04 100644 --- a/source/slang/slang-diagnostic-defs.h +++ b/source/slang/slang-diagnostic-defs.h @@ -842,7 +842,15 @@ DIAGNOSTIC( isOperatorValueMustBeInterfaceType, "'is'/'as' operator requires an interface-typed expression.") +DIAGNOSTIC( + 30301, + Error, + isAsOperatorCannotUseInterfaceAsRHS, + "'is' and 'as' operators do not support interface types as the right-hand side. Use a concrete " + "type instead.") + DIAGNOSTIC(33070, Error, expectedFunction, "expected a function, got '$0'") + DIAGNOSTIC(33071, Error, expectedAStringLiteral, "expected a string literal") // `dyn` and `some` errors |
