diff options
| author | Yong He <yonghe@outlook.com> | 2024-10-20 09:28:13 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-20 09:28:13 -0700 |
| commit | 307315a7305e76529837fd1cdb677f534d5f539b (patch) | |
| tree | ba39e96ba2e9b3d62d1213aab2f1cc54febe451a /source/slang/slang-check-expr.cpp | |
| parent | 9936178dd3efb026bfa142512a2bf061d7a75ab5 (diff) | |
Properly check switch case. (#5341)
Diffstat (limited to 'source/slang/slang-check-expr.cpp')
| -rw-r--r-- | source/slang/slang-check-expr.cpp | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/source/slang/slang-check-expr.cpp b/source/slang/slang-check-expr.cpp index ec4182059..41cbf689b 100644 --- a/source/slang/slang-check-expr.cpp +++ b/source/slang/slang-check-expr.cpp @@ -1979,17 +1979,23 @@ namespace Slang } } - if(auto castExpr = expr.as<TypeCastExpr>()) + SubstExpr<Expr> typeCastOperand; + if (auto typeCastExpr = expr.as<TypeCastExpr>()) + typeCastOperand = getArg(typeCastExpr, 0); + else if (auto builtinCastExpr = expr.as<BuiltinCastExpr>()) + typeCastOperand = getBaseExpr(builtinCastExpr); + + if (typeCastOperand) { auto substType = getType(m_astBuilder, expr); if (!substType) return nullptr; if (!isValidCompileTimeConstantType(substType)) return nullptr; - auto val = tryConstantFoldExpr(getArg(castExpr, 0), kind, circularityInfo); + auto val = tryConstantFoldExpr(typeCastOperand, kind, circularityInfo); if (val) { - if (!castExpr.getExpr()->type) + if (!expr.getExpr()->type) return nullptr; auto foldVal = as<IntVal>( TypeCastIntVal::tryFoldImpl(m_astBuilder, substType, val, getSink())); @@ -2105,6 +2111,8 @@ namespace Slang case IntegerConstantExpressionCoercionType::AnyInteger: if (isScalarIntegerType(inExpr->type)) expr = inExpr; + else if (isEnumType(inExpr->type)) + expr = inExpr; else expr = coerce(CoercionSite::General, m_astBuilder->getIntType(), inExpr); break; @@ -3491,6 +3499,12 @@ namespace Slang return sizeOfLikeExpr; } + Expr* SemanticsExprVisitor::visitBuiltinCastExpr(BuiltinCastExpr* expr) + { + // All builtin cast exprs should already be checked. + return expr; + } + Expr* SemanticsExprVisitor::visitTypeCastExpr(TypeCastExpr * expr) { if (expr->type) |
