diff options
| author | Julius Ikkala <julius.ikkala@gmail.com> | 2025-05-22 22:10:42 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-05-22 22:10:42 +0300 |
| commit | ce238dd878038bf857968931773cc9b10f3b225d (patch) | |
| tree | 2e29a5191fff5eb85a5a7895fd68b7b285bcb198 /source/slang/slang-check-expr.cpp | |
| parent | 27c6e9b01f7386263bde90e16812be46327015c2 (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.cpp | 34 |
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); |
