diff options
| -rw-r--r-- | source/slang/core.meta.slang | 22 | ||||
| -rw-r--r-- | tests/language-feature/generics/generic-vector-cast.slang | 17 |
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 |
