@@ -21,11 +21,26 @@ use rustc_span::Span;
21
21
22
22
use lazy_static:: lazy_static;
23
23
24
+ pub enum LangItemGroup {
25
+ Op ,
26
+ }
27
+
28
+ const NUM_GROUPS : usize = 1 ;
29
+
30
+ macro_rules! expand_group {
31
+ ( ) => {
32
+ None
33
+ } ;
34
+ ( $group: expr) => {
35
+ Some ( $group)
36
+ } ;
37
+ }
38
+
24
39
// The actual lang items defined come at the end of this file in one handy table.
25
40
// So you probably just want to nip down to the end.
26
41
macro_rules! language_item_table {
27
42
(
28
- $( $variant: ident, $name: expr, $method: ident, $target: expr; ) *
43
+ $( $variant: ident $ ( $group : expr ) ? , $name: expr, $method: ident, $target: expr; ) *
29
44
) => {
30
45
31
46
enum_from_u32! {
@@ -45,6 +60,13 @@ macro_rules! language_item_table {
45
60
$( $variant => $name, ) *
46
61
}
47
62
}
63
+
64
+ pub fn group( self ) -> Option <LangItemGroup > {
65
+ use LangItemGroup :: * ;
66
+ match self {
67
+ $( $variant => expand_group!( $( $group) * ) , ) *
68
+ }
69
+ }
48
70
}
49
71
50
72
#[ derive( HashStable_Generic ) ]
@@ -54,6 +76,9 @@ macro_rules! language_item_table {
54
76
pub items: Vec <Option <DefId >>,
55
77
/// Lang items that were not found during collection.
56
78
pub missing: Vec <LangItem >,
79
+ /// Mapping from `LangItemGroup` discriminants to all
80
+ /// `DefId`s of lang items in that group.
81
+ pub groups: [ Vec <DefId >; NUM_GROUPS ] ,
57
82
}
58
83
59
84
impl LanguageItems {
@@ -64,6 +89,7 @@ macro_rules! language_item_table {
64
89
Self {
65
90
items: vec![ $( init_none( $variant) ) ,* ] ,
66
91
missing: Vec :: new( ) ,
92
+ groups: [ vec![ ] ; NUM_GROUPS ] ,
67
93
}
68
94
}
69
95
@@ -79,6 +105,10 @@ macro_rules! language_item_table {
79
105
self . items[ it as usize ] . ok_or_else( || format!( "requires `{}` lang_item" , it. name( ) ) )
80
106
}
81
107
108
+ pub fn group( & self , group: LangItemGroup ) -> & [ DefId ] {
109
+ self . groups[ group as usize ] . as_ref( )
110
+ }
111
+
82
112
$(
83
113
/// Returns the corresponding `DefId` for the lang item
84
114
#[ doc = $name]
@@ -171,30 +201,30 @@ language_item_table! {
171
201
CoerceUnsizedTraitLangItem , "coerce_unsized" , coerce_unsized_trait, Target :: Trait ;
172
202
DispatchFromDynTraitLangItem , "dispatch_from_dyn" , dispatch_from_dyn_trait, Target :: Trait ;
173
203
174
- AddTraitLangItem , "add" , add_trait, Target :: Trait ;
175
- SubTraitLangItem , "sub" , sub_trait, Target :: Trait ;
176
- MulTraitLangItem , "mul" , mul_trait, Target :: Trait ;
177
- DivTraitLangItem , "div" , div_trait, Target :: Trait ;
178
- RemTraitLangItem , "rem" , rem_trait, Target :: Trait ;
179
- NegTraitLangItem , "neg" , neg_trait, Target :: Trait ;
180
- NotTraitLangItem , "not" , not_trait, Target :: Trait ;
181
- BitXorTraitLangItem , "bitxor" , bitxor_trait, Target :: Trait ;
182
- BitAndTraitLangItem , "bitand" , bitand_trait, Target :: Trait ;
183
- BitOrTraitLangItem , "bitor" , bitor_trait, Target :: Trait ;
184
- ShlTraitLangItem , "shl" , shl_trait, Target :: Trait ;
185
- ShrTraitLangItem , "shr" , shr_trait, Target :: Trait ;
186
- AddAssignTraitLangItem , "add_assign" , add_assign_trait, Target :: Trait ;
187
- SubAssignTraitLangItem , "sub_assign" , sub_assign_trait, Target :: Trait ;
188
- MulAssignTraitLangItem , "mul_assign" , mul_assign_trait, Target :: Trait ;
189
- DivAssignTraitLangItem , "div_assign" , div_assign_trait, Target :: Trait ;
190
- RemAssignTraitLangItem , "rem_assign" , rem_assign_trait, Target :: Trait ;
191
- BitXorAssignTraitLangItem , "bitxor_assign" , bitxor_assign_trait, Target :: Trait ;
192
- BitAndAssignTraitLangItem , "bitand_assign" , bitand_assign_trait, Target :: Trait ;
193
- BitOrAssignTraitLangItem , "bitor_assign" , bitor_assign_trait, Target :: Trait ;
194
- ShlAssignTraitLangItem , "shl_assign" , shl_assign_trait, Target :: Trait ;
195
- ShrAssignTraitLangItem , "shr_assign" , shr_assign_trait, Target :: Trait ;
196
- IndexTraitLangItem , "index" , index_trait, Target :: Trait ;
197
- IndexMutTraitLangItem , "index_mut" , index_mut_trait, Target :: Trait ;
204
+ AddTraitLangItem ( Op ) , "add" , add_trait, Target :: Trait ;
205
+ SubTraitLangItem ( Op ) , "sub" , sub_trait, Target :: Trait ;
206
+ MulTraitLangItem ( Op ) , "mul" , mul_trait, Target :: Trait ;
207
+ DivTraitLangItem ( Op ) , "div" , div_trait, Target :: Trait ;
208
+ RemTraitLangItem ( Op ) , "rem" , rem_trait, Target :: Trait ;
209
+ NegTraitLangItem ( Op ) , "neg" , neg_trait, Target :: Trait ;
210
+ NotTraitLangItem ( Op ) , "not" , not_trait, Target :: Trait ;
211
+ BitXorTraitLangItem ( Op ) , "bitxor" , bitxor_trait, Target :: Trait ;
212
+ BitAndTraitLangItem ( Op ) , "bitand" , bitand_trait, Target :: Trait ;
213
+ BitOrTraitLangItem ( Op ) , "bitor" , bitor_trait, Target :: Trait ;
214
+ ShlTraitLangItem ( Op ) , "shl" , shl_trait, Target :: Trait ;
215
+ ShrTraitLangItem ( Op ) , "shr" , shr_trait, Target :: Trait ;
216
+ AddAssignTraitLangItem ( Op ) , "add_assign" , add_assign_trait, Target :: Trait ;
217
+ SubAssignTraitLangItem ( Op ) , "sub_assign" , sub_assign_trait, Target :: Trait ;
218
+ MulAssignTraitLangItem ( Op ) , "mul_assign" , mul_assign_trait, Target :: Trait ;
219
+ DivAssignTraitLangItem ( Op ) , "div_assign" , div_assign_trait, Target :: Trait ;
220
+ RemAssignTraitLangItem ( Op ) , "rem_assign" , rem_assign_trait, Target :: Trait ;
221
+ BitXorAssignTraitLangItem ( Op ) , "bitxor_assign" , bitxor_assign_trait, Target :: Trait ;
222
+ BitAndAssignTraitLangItem ( Op ) , "bitand_assign" , bitand_assign_trait, Target :: Trait ;
223
+ BitOrAssignTraitLangItem ( Op ) , "bitor_assign" , bitor_assign_trait, Target :: Trait ;
224
+ ShlAssignTraitLangItem ( Op ) , "shl_assign" , shl_assign_trait, Target :: Trait ;
225
+ ShrAssignTraitLangItem ( Op ) , "shr_assign" , shr_assign_trait, Target :: Trait ;
226
+ IndexTraitLangItem ( Op ) , "index" , index_trait, Target :: Trait ;
227
+ IndexMutTraitLangItem ( Op ) , "index_mut" , index_mut_trait, Target :: Trait ;
198
228
199
229
UnsafeCellTypeLangItem , "unsafe_cell" , unsafe_cell_type, Target :: Struct ;
200
230
VaListTypeLangItem , "va_list" , va_list, Target :: Struct ;
0 commit comments