summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/slang/core.meta.slang22
-rw-r--r--tests/language-feature/generics/generic-vector-cast.slang17
2 files changed, 39 insertions, 0 deletions
diff --git a/source/slang/core.meta.slang b/source/slang/core.meta.slang
index 478487250..249a084b1 100644
--- a/source/slang/core.meta.slang
+++ b/source/slang/core.meta.slang
@@ -1642,6 +1642,17 @@ extension vector<T,N> : IInteger
[__unsafeForceInlineEarly] __init(int v) { this = vector<T,N>(T(v)); }
[OverloadRank(-1)]
[__unsafeForceInlineEarly] __init(int64_t v) { this = vector<T,N>(T(v)); }
+
+ [OverloadRank(-1)]
+ __implicit_conversion($(kConversionCost_Default))
+ __intrinsic_op($(kIROp_CastFloatToInt))
+ __generic<U:__BuiltinFloatingPointType>
+ __init(vector<U, N> other);
+
+ [OverloadRank(-1)]
+ __intrinsic_op($(kIROp_IntCast))
+ __generic<U:__BuiltinIntegerType>
+ __init(vector<U, N> other);
}
__generic<T:__BuiltinFloatingPointType, let N : int>
@@ -1660,6 +1671,17 @@ extension vector<T,N> : IFloat
[__unsafeForceInlineEarly] float toFloat() { return __realCast<float>(this[0]); }
[OverloadRank(-1)]
+ __implicit_conversion($(kConversionCost_Default))
+ __intrinsic_op($(kIROp_FloatCast))
+ __generic<U:__BuiltinFloatingPointType>
+ __init(vector<U, N> other);
+
+ [OverloadRank(-1)]
+ __intrinsic_op($(kIROp_CastIntToFloat))
+ __generic<U:__BuiltinIntegerType>
+ __init(vector<U, N> other);
+
+ [OverloadRank(-1)]
[__unsafeForceInlineEarly] __init(int v) { this = vector<T,N>(T(v)); }
[OverloadRank(-1)]
[__unsafeForceInlineEarly] __init(float v) { this = vector<T,N>(T(v)); }
diff --git a/tests/language-feature/generics/generic-vector-cast.slang b/tests/language-feature/generics/generic-vector-cast.slang
new file mode 100644
index 000000000..716416bf5
--- /dev/null
+++ b/tests/language-feature/generics/generic-vector-cast.slang
@@ -0,0 +1,17 @@
+//TEST:SIMPLE(filecheck=CHECK): -target spirv
+
+// CHECK: OpEntryPoint
+
+struct SomeStruct<Real : __BuiltinFloatingPointType> {
+ vector<Real, 3> color;
+ __init() {
+ vector<float, 3> _color = vector<float, 3>(0);
+ color = _color; // error 30019: expected an expression of type 'vector<Real,3>', got 'vector<float,3>'
+ color = vector<Real, 3>(_color); // also does not work
+ }
+}
+
+[numthreads(1, 1, 1)]
+void computeMain() {
+ SomeStruct<float> s;
+} \ No newline at end of file