summaryrefslogtreecommitdiff
path: root/source/slang/slang-check-expr.cpp
diff options
context:
space:
mode:
authorJulius Ikkala <julius.ikkala@gmail.com>2025-05-22 22:10:42 +0300
committerGitHub <noreply@github.com>2025-05-22 22:10:42 +0300
commitce238dd878038bf857968931773cc9b10f3b225d (patch)
tree2e29a5191fff5eb85a5a7895fd68b7b285bcb198 /source/slang/slang-check-expr.cpp
parent27c6e9b01f7386263bde90e16812be46327015c2 (diff)
Make sizeof(T) & alignof(T) of generic types work as compile-time constants (#7213)
* Make sizeof(generic) work as compile-time constant * format code --------- Co-authored-by: slangbot <186143334+slangbot@users.noreply.github.com>
Diffstat (limited to 'source/slang/slang-check-expr.cpp')
-rw-r--r--source/slang/slang-check-expr.cpp34
1 files changed, 16 insertions, 18 deletions
diff --git a/source/slang/slang-check-expr.cpp b/source/slang/slang-check-expr.cpp
index ad36a7e4a..db507c060 100644
--- a/source/slang/slang-check-expr.cpp
+++ b/source/slang/slang-check-expr.cpp
@@ -2060,13 +2060,25 @@ IntVal* SemanticsVisitor::tryConstantFoldExpr(
}
}
- if (auto countOfExpr = expr.as<CountOfExpr>())
+ if (auto sizeOfLikeExpr = expr.as<SizeOfLikeExpr>())
{
- auto type =
- as<Type>(countOfExpr.getExpr()->sizedType->substitute(m_astBuilder, expr.getSubsts()));
- if (type)
+ auto type = as<Type>(
+ sizeOfLikeExpr.getExpr()->sizedType->substitute(m_astBuilder, expr.getSubsts()));
+
+ if (auto sizeOfExpr = expr.as<SizeOfExpr>())
+ {
+ return as<IntVal>(SizeOfIntVal::tryFold(m_astBuilder, expr.getExpr()->type.type, type));
+ }
+ else if (auto alignOfExpr = expr.as<AlignOfExpr>())
+ {
+ return as<IntVal>(
+ AlignOfIntVal::tryFold(m_astBuilder, expr.getExpr()->type.type, type));
+ }
+ else if (auto countOfExpr = expr.as<CountOfExpr>())
+ {
return as<IntVal>(
CountOfIntVal::tryFold(m_astBuilder, expr.getExpr()->type.type, type));
+ }
}
// it is possible that we are referring to a generic value param
@@ -2159,20 +2171,6 @@ IntVal* SemanticsVisitor::tryConstantFoldExpr(
if (val)
return val;
}
- else if (auto sizeOfLikeExpr = as<SizeOfLikeExpr>(expr.getExpr()))
- {
- ASTNaturalLayoutContext context(getASTBuilder(), nullptr);
- const auto size = context.calcSize(sizeOfLikeExpr->sizedType);
- if (!size)
- {
- return nullptr;
- }
-
- auto value = as<AlignOfExpr>(sizeOfLikeExpr) ? size.alignment : size.size;
-
- // We can return as an IntVal
- return getASTBuilder()->getIntVal(expr.getExpr()->type, value);
- }
else if (auto indexExpr = expr.as<IndexExpr>())
{
return tryFoldIndexExpr(indexExpr.getExpr(), kind, circularityInfo);