summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--source/slang/slang-check-expr.cpp15
-rw-r--r--tests/bugs/gh-5372.slang45
-rw-r--r--tests/diagnostics/attribute-error.slang6
3 files changed, 63 insertions, 3 deletions
diff --git a/source/slang/slang-check-expr.cpp b/source/slang/slang-check-expr.cpp
index 076e310c0..8c170698b 100644
--- a/source/slang/slang-check-expr.cpp
+++ b/source/slang/slang-check-expr.cpp
@@ -2068,7 +2068,20 @@ IntVal* SemanticsVisitor::tryConstantFoldExpr(
return nullptr;
if (!isValidCompileTimeConstantType(substType))
return nullptr;
- auto val = tryConstantFoldExpr(typeCastOperand, kind, circularityInfo);
+
+ IntVal* val = tryConstantFoldExpr(typeCastOperand, kind, circularityInfo);
+ if (!val)
+ {
+ if (auto floatLitExpr = typeCastOperand.as<FloatingPointLiteralExpr>())
+ {
+ // When explicitly casting from float type to integer type, let's fold it as
+ // an integer value.
+ const IntegerLiteralValue value =
+ IntegerLiteralValue(floatLitExpr.getExpr()->value);
+ val = m_astBuilder->getIntVal(substType, value);
+ }
+ }
+
if (val)
{
if (!expr.getExpr()->type)
diff --git a/tests/bugs/gh-5372.slang b/tests/bugs/gh-5372.slang
new file mode 100644
index 000000000..1cd778ab3
--- /dev/null
+++ b/tests/bugs/gh-5372.slang
@@ -0,0 +1,45 @@
+//TEST:SIMPLE(filecheck=SPV): -allow-glsl -target spirv-asm -entry vertexMain -stage vertex
+
+// This test is to make sure the constant-folding works for the switch-case label.
+// The shader code is from VK-CTS but modified,
+// dEQP-VK.glsl.switch.const_expr_in_label_dynamic_fragment
+
+layout(location = 0) in highp vec4 a_position;
+layout(location = 1) in highp vec4 a_coords;
+
+layout(location = 0) out mediump vec4 v_color;
+layout (std140, set=0, binding=0) uniform buffer0 { highp int ui_two; };
+
+void vertexMain(void)
+{
+ gl_Position = a_position;
+ highp vec4 coords = a_coords;
+ mediump vec3 res = vec3(0.0);
+
+ const int t = 2;
+ switch (ui_two)
+ {
+ //SPV-NOT:([[# @LINE+1]]): error
+ case int(0.0):
+ res = coords.xyz;
+ break;
+
+ //SPV-NOT:([[# @LINE+1]]): error
+ case 2-1:
+ res = coords.wzy;
+ break;
+
+ //SPV-NOT:([[# @LINE+1]]): error
+ case 3&(1<<1):
+ res = coords.yzw;
+ break;
+
+ //SPV-NOT:([[# @LINE+1]]): error
+ case t+1:
+ res = coords.zyx;
+ break;
+ }
+
+ v_color = vec4(res, 1.0);
+}
+
diff --git a/tests/diagnostics/attribute-error.slang b/tests/diagnostics/attribute-error.slang
index 9cc24437a..d3f202e26 100644
--- a/tests/diagnostics/attribute-error.slang
+++ b/tests/diagnostics/attribute-error.slang
@@ -2,7 +2,7 @@
// Tests reflection of user defined attributes.
-//DIAGNOSTIC_TEST:REFLECTION:-stage compute -entry main -target hlsl
+//TEST:SIMPLE(filecheck=REFLECTION):-stage compute -entry main -target hlsl
[__AttributeUsage(_AttributeTargets.Struct)]
struct MyStructAttribute
@@ -16,9 +16,11 @@ struct DefaultValueAttribute
int iParam;
};
+//REFLECTION:([[# @LINE+1]]): error 30019: expected an expression of type 'float', got 'String'
[MyStruct(0, "stringVal")] // attribute arg type mismatch
struct A
{
+ //REFLECTION:([[# @LINE+1]]): error 31002: attribute 'MyStruct' is not valid here
[MyStruct(0, 10.0)] // attribute does not apply to this construct
float x;
[DefaultValue(2.0)] // attribute arg type mismatch
@@ -31,4 +33,4 @@ ParameterBlock<A> param;
void main(
uint3 dispatchThreadID : SV_DispatchThreadID)
{
-} \ No newline at end of file
+}