summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorJay Kwak <82421531+jkwak-work@users.noreply.github.com>2025-06-08 12:54:52 -0700
committerGitHub <noreply@github.com>2025-06-08 19:54:52 +0000
commitbfac247ff2489a1f7fb9766674a6ed25a48a493b (patch)
treefd11188b120d079962c32d3707d418295ce43225 /source
parent10a3b87db80ae87d6d01ef2af562a732055da1c2 (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')
-rw-r--r--source/slang/slang-check-expr.cpp16
-rw-r--r--source/slang/slang-diagnostic-defs.h8
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