@@ -964,15 +964,18 @@ fn trans_intrinsic_type<'tcx>(
964
964
}
965
965
IntrinsicType :: Matrix => {
966
966
let span = span_for_spirv_type_adt ( cx, ty) . unwrap ( ) ;
967
- let ( element , count ) =
968
- trans_glam_like_struct ( cx, span, ty, args, "`#[spirv(matrix)]`" ) ?;
967
+ let err_attr_name = "`#[spirv(matrix)]`" ;
968
+ let ( element , count ) = trans_glam_like_struct ( cx, span, ty, args, err_attr_name ) ?;
969
969
match cx. lookup_type ( element) {
970
970
SpirvType :: Vector { .. } => ( ) ,
971
971
ty => {
972
972
return Err ( cx
973
973
. tcx
974
974
. dcx ( )
975
- . struct_span_err ( span, "`#[spirv(matrix)]` type fields must all be vectors" )
975
+ . struct_span_err (
976
+ span,
977
+ format ! ( "{err_attr_name} type fields must all be vectors" ) ,
978
+ )
976
979
. with_note ( format ! ( "field type is {}" , ty. debug( element, cx) ) )
977
980
. emit ( ) ) ;
978
981
}
@@ -981,8 +984,8 @@ fn trans_intrinsic_type<'tcx>(
981
984
}
982
985
IntrinsicType :: Vector => {
983
986
let span = span_for_spirv_type_adt ( cx, ty) . unwrap ( ) ;
984
- let ( element , count ) =
985
- trans_glam_like_struct ( cx, span, ty, args, "`#[spirv(vector)]`" ) ?;
987
+ let err_attr_name = "`#[spirv(vector)]`" ;
988
+ let ( element , count ) = trans_glam_like_struct ( cx, span, ty, args, err_attr_name ) ?;
986
989
match cx. lookup_type ( element) {
987
990
SpirvType :: Bool | SpirvType :: Float { .. } | SpirvType :: Integer { .. } => ( ) ,
988
991
ty => {
@@ -991,7 +994,9 @@ fn trans_intrinsic_type<'tcx>(
991
994
. dcx ( )
992
995
. struct_span_err (
993
996
span,
994
- "`#[spirv(vector)]` type fields must all be floats, integers or bools" ,
997
+ format ! (
998
+ "{err_attr_name} type fields must all be floats, integers or bools"
999
+ ) ,
995
1000
)
996
1001
. with_note ( format ! ( "field type is {}" , ty. debug( element, cx) ) )
997
1002
. emit ( ) ) ;
@@ -1039,18 +1044,16 @@ fn trans_glam_like_struct<'tcx>(
1039
1044
let element_word = element. spirv_type ( span, cx) ;
1040
1045
let count = u32:: try_from ( count)
1041
1046
. ok ( )
1042
- . filter ( |count| * count >= 2 )
1047
+ . filter ( |count| 2 <= * count && * count <= 4 )
1043
1048
. ok_or_else ( || {
1044
- tcx. dcx ( ) . span_err (
1045
- span,
1046
- format ! ( "{err_attr_name} must have at least 2 members" ) ,
1047
- )
1049
+ tcx. dcx ( )
1050
+ . span_err ( span, format ! ( "{err_attr_name} must have 2, 3 or 4 members" ) )
1048
1051
} ) ?;
1049
1052
1050
1053
Ok ( ( element_word, count) )
1051
1054
} else {
1052
1055
Err ( tcx
1053
1056
. dcx ( )
1054
- . span_err ( span, "#[spirv(vector)] type must be a struct") )
1057
+ . span_err ( span, format ! ( "{err_attr_name} type must be a struct") ) )
1055
1058
}
1056
1059
}
0 commit comments