@@ -127,6 +127,7 @@ pub fn compact(module: &mut crate::Module) {
127
127
if r#override. name . is_some ( ) {
128
128
log:: trace!( "tracing override {:?}" , r#override. name. as_ref( ) . unwrap( ) ) ;
129
129
module_tracer. overrides_used . insert ( handle) ;
130
+ module_tracer. types_used . insert ( r#override. ty ) ;
130
131
if let Some ( init) = r#override. init {
131
132
module_tracer. global_expressions_used . insert ( init) ;
132
133
}
@@ -171,15 +172,6 @@ pub fn compact(module: &mut crate::Module) {
171
172
} )
172
173
. collect ( ) ;
173
174
174
- // Overrides' initializers are taken care of already, because
175
- // expression tracing sees through overrides. But we still need to
176
- // note type usage.
177
- for ( handle, r#override) in module. overrides . iter ( ) {
178
- if module_tracer. overrides_used . contains ( handle) {
179
- module_tracer. types_used . insert ( r#override. ty ) ;
180
- }
181
- }
182
-
183
175
// Treat all named types as used.
184
176
for ( handle, ty) in module. types . iter ( ) {
185
177
log:: trace!( "tracing type {:?}, name {:?}" , handle, ty. name) ;
@@ -1006,3 +998,75 @@ fn unnamed_constant_type() {
1006
998
compact ( & mut module) ;
1007
999
assert ! ( validator. validate( & module) . is_ok( ) ) ;
1008
1000
}
1001
+
1002
+ #[ test]
1003
+ fn unnamed_override_type ( ) {
1004
+ let mut module = crate :: Module :: default ( ) ;
1005
+ let nowhere = crate :: Span :: default ( ) ;
1006
+
1007
+ // This type is used only by the unnamed override.
1008
+ let ty_u32 = module. types . insert (
1009
+ crate :: Type {
1010
+ name : None ,
1011
+ inner : crate :: TypeInner :: Scalar ( crate :: Scalar :: U32 ) ,
1012
+ } ,
1013
+ nowhere,
1014
+ ) ;
1015
+
1016
+ // This type is used by the named override.
1017
+ let ty_i32 = module. types . insert (
1018
+ crate :: Type {
1019
+ name : None ,
1020
+ inner : crate :: TypeInner :: Scalar ( crate :: Scalar :: I32 ) ,
1021
+ } ,
1022
+ nowhere,
1023
+ ) ;
1024
+
1025
+ let unnamed_init = module
1026
+ . global_expressions
1027
+ . append ( crate :: Expression :: Literal ( crate :: Literal :: U32 ( 0 ) ) , nowhere) ;
1028
+
1029
+ let unnamed_override = module. overrides . append (
1030
+ crate :: Override {
1031
+ name : None ,
1032
+ id : Some ( 42 ) ,
1033
+ ty : ty_u32,
1034
+ init : Some ( unnamed_init) ,
1035
+ } ,
1036
+ nowhere,
1037
+ ) ;
1038
+
1039
+ // The named override is initialized using a Splat expression, to
1040
+ // give the named override a type distinct from the unnamed
1041
+ // override's.
1042
+ let unnamed_override_expr = module
1043
+ . global_expressions
1044
+ . append ( crate :: Expression :: Override ( unnamed_override) , nowhere) ;
1045
+ let named_init = module. global_expressions . append (
1046
+ crate :: Expression :: As {
1047
+ expr : unnamed_override_expr,
1048
+ kind : crate :: ScalarKind :: Sint ,
1049
+ convert : None ,
1050
+ } ,
1051
+ nowhere,
1052
+ ) ;
1053
+
1054
+ let _named_override = module. overrides . append (
1055
+ crate :: Override {
1056
+ name : Some ( "totally_named" . to_string ( ) ) ,
1057
+ id : None ,
1058
+ ty : ty_i32,
1059
+ init : Some ( named_init) ,
1060
+ } ,
1061
+ nowhere,
1062
+ ) ;
1063
+
1064
+ let mut validator = super :: valid:: Validator :: new (
1065
+ super :: valid:: ValidationFlags :: all ( ) ,
1066
+ super :: valid:: Capabilities :: all ( ) ,
1067
+ ) ;
1068
+
1069
+ assert ! ( validator. validate( & module) . is_ok( ) ) ;
1070
+ compact ( & mut module) ;
1071
+ assert ! ( validator. validate( & module) . is_ok( ) ) ;
1072
+ }
0 commit comments