summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-check-expr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-check-expr.cpp')
-rw-r--r--source/slang/slang-check-expr.cpp20
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)