summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/slang/slang-check-constraint.cpp4
-rw-r--r--source/slang/slang-mangle.cpp18
-rw-r--r--tests/language-feature/constants/generic-const-cast.slang26
3 files changed, 48 insertions, 0 deletions
diff --git a/source/slang/slang-check-constraint.cpp b/source/slang/slang-check-constraint.cpp
index 42d01a996..f0df78c43 100644
--- a/source/slang/slang-check-constraint.cpp
+++ b/source/slang/slang-check-constraint.cpp
@@ -540,8 +540,12 @@ namespace Slang
// Check if both are integer values in general
if (auto fstInt = as<IntVal>(fst))
{
+ if (auto tc = as<TypeCastIntVal>(fstInt))
+ fstInt = as<IntVal>(tc->base);
if (auto sndInt = as<IntVal>(snd))
{
+ if (auto tc = as<TypeCastIntVal>(sndInt))
+ sndInt = as<IntVal>(tc->base);
auto fstParam = as<GenericParamIntVal>(fstInt);
auto sndParam = as<GenericParamIntVal>(sndInt);
diff --git a/source/slang/slang-mangle.cpp b/source/slang/slang-mangle.cpp
index ef9bf4938..3b0d12da8 100644
--- a/source/slang/slang-mangle.cpp
+++ b/source/slang/slang-mangle.cpp
@@ -326,6 +326,24 @@ namespace Slang
else if (const auto polynomialIntVal = dynamicCast<PolynomialIntVal>(val))
{
emitRaw(context, "KX");
+ emit(context, (UInt)polynomialIntVal->constantTerm);
+ emit(context, (UInt)polynomialIntVal->terms.getCount());
+ for (auto term : polynomialIntVal->terms)
+ {
+ emit(context, (UInt)term->constFactor);
+ emit(context, (UInt)term->paramFactors.getCount());
+ for (auto factor : term->paramFactors)
+ {
+ emitVal(context, factor->param);
+ emit(context, (UInt)factor->power);
+ }
+ }
+ }
+ else if (const auto typecastIntVal = dynamicCast<TypeCastIntVal>(val))
+ {
+ emitRaw(context, "KK");
+ emitVal(context, typecastIntVal->type);
+ emitVal(context, typecastIntVal->base);
}
else
{
diff --git a/tests/language-feature/constants/generic-const-cast.slang b/tests/language-feature/constants/generic-const-cast.slang
new file mode 100644
index 000000000..eb4601872
--- /dev/null
+++ b/tests/language-feature/constants/generic-const-cast.slang
@@ -0,0 +1,26 @@
+//TEST:SIMPLE(filecheck=CHECK): -entry computeMain -profile cs_5_0 -target hlsl
+
+//TEST_INPUT:ubuffer(data=[0], stride=4):out,name=outputBuffer
+RWStructuredBuffer<int> outputBuffer;
+
+struct G<let m : uint>
+{
+ static const int r = m + 1;
+}
+
+// CHECK: int f_0()
+// CHECK: return int(3)
+
+int f<let n : int>(G<n> v)
+{
+ return v.r;
+}
+static const int c = (int8_t)255;
+
+[numthreads(1, 1, 1)]
+void computeMain(int3 dispatchThreadID : SV_DispatchThreadID)
+{
+ G<2> g;
+ int tid = dispatchThreadID.x;
+ outputBuffer[tid] = f(g);
+}