diff options
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) |
