@@ -142,49 +142,50 @@ mod compat {
142
142
143
143
let mut errors = Vec :: new ( ) ;
144
144
145
- let mut expected_bgl_entries = expected_bgl. entries . iter ( ) ;
146
- let mut assigned_bgl_entries = assigned_bgl. entries . iter ( ) ;
147
- let zipped = crate :: utils:: ZipWithProperAdvance :: new (
148
- & mut expected_bgl_entries,
149
- & mut assigned_bgl_entries,
150
- ) ;
151
-
152
- for ( ( & binding, expected_entry) , ( _, assigned_entry) ) in zipped {
153
- if assigned_entry. visibility != expected_entry. visibility {
154
- errors. push ( EntryError :: Visibility {
155
- binding,
156
- expected : expected_entry. visibility ,
157
- assigned : assigned_entry. visibility ,
158
- } ) ;
159
- }
160
- if assigned_entry. ty != expected_entry. ty {
161
- errors. push ( EntryError :: Type {
162
- binding,
163
- expected : expected_entry. ty ,
164
- assigned : assigned_entry. ty ,
165
- } ) ;
166
- }
167
- if assigned_entry. count != expected_entry. count {
168
- errors. push ( EntryError :: Count {
169
- binding,
170
- expected : expected_entry. count ,
171
- assigned : assigned_entry. count ,
172
- } ) ;
145
+ for ( & binding, expected_entry) in expected_bgl. entries . iter ( ) {
146
+ if let Some ( assigned_entry) = assigned_bgl. entries . get ( binding) {
147
+ if assigned_entry. visibility != expected_entry. visibility {
148
+ errors. push ( EntryError :: Visibility {
149
+ binding,
150
+ expected : expected_entry. visibility ,
151
+ assigned : assigned_entry. visibility ,
152
+ } ) ;
153
+ }
154
+ if assigned_entry. ty != expected_entry. ty {
155
+ errors. push ( EntryError :: Type {
156
+ binding,
157
+ expected : expected_entry. ty ,
158
+ assigned : assigned_entry. ty ,
159
+ } ) ;
160
+ }
161
+ if assigned_entry. count != expected_entry. count {
162
+ errors. push ( EntryError :: Count {
163
+ binding,
164
+ expected : expected_entry. count ,
165
+ assigned : assigned_entry. count ,
166
+ } ) ;
167
+ }
168
+ } else {
169
+ errors. push ( EntryError :: ExtraExpected { binding } ) ;
173
170
}
174
171
}
175
172
176
- for ( & binding, _) in expected_bgl_entries {
177
- errors. push ( EntryError :: ExtraExpected { binding } ) ;
173
+ for ( & binding, _) in assigned_bgl. entries . iter ( ) {
174
+ if !expected_bgl. entries . contains_key ( binding) {
175
+ errors. push ( EntryError :: ExtraAssigned { binding } ) ;
176
+ }
178
177
}
179
178
180
- for ( & binding , _ ) in assigned_bgl_entries {
181
- errors . push ( EntryError :: ExtraAssigned { binding } ) ;
182
- }
179
+ # [ derive ( Clone , Debug , Error ) ]
180
+ # [ error ( "Unknown reason" ) ]
181
+ struct Unknown ( ) ;
183
182
184
183
Err ( Error :: Incompatible {
185
184
expected_bgl : expected_bgl. error_ident ( ) ,
186
185
assigned_bgl : assigned_bgl. error_ident ( ) ,
187
- inner : MultiError :: new ( errors. drain ( ..) ) . unwrap ( ) ,
186
+ inner : MultiError :: new ( errors. drain ( ..) ) . unwrap_or_else ( || {
187
+ MultiError :: new ( core:: iter:: once ( Unknown ( ) ) ) . unwrap ( )
188
+ } ) ,
188
189
} )
189
190
}
190
191
} else {
0 commit comments