@@ -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: path; ) *
43
+ $( $variant: ident $ ( $group : expr ) ? , $name: expr, $method: ident, $target: path; ) *
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,7 @@ 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
+ pub groups: Vec <Vec <DefId >>
57
80
}
58
81
59
82
impl LanguageItems {
@@ -64,6 +87,7 @@ macro_rules! language_item_table {
64
87
Self {
65
88
items: vec![ $( init_none( $variant) ) ,* ] ,
66
89
missing: Vec :: new( ) ,
90
+ groups: vec![ vec![ ] ; NUM_GROUPS ] ,
67
91
}
68
92
}
69
93
@@ -79,6 +103,10 @@ macro_rules! language_item_table {
79
103
self . items[ it as usize ] . ok_or_else( || format!( "requires `{}` lang_item" , it. name( ) ) )
80
104
}
81
105
106
+ pub fn group( & self , group: LangItemGroup ) -> & [ DefId ] {
107
+ self . groups[ group as usize ] . as_ref( )
108
+ }
109
+
82
110
$(
83
111
/// Returns the corresponding `DefId` for the lang item
84
112
#[ doc = $name]
@@ -171,30 +199,30 @@ language_item_table! {
171
199
CoerceUnsizedTraitLangItem , "coerce_unsized" , coerce_unsized_trait, Target :: Trait ;
172
200
DispatchFromDynTraitLangItem , "dispatch_from_dyn" , dispatch_from_dyn_trait, Target :: Trait ;
173
201
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 ;
202
+ AddTraitLangItem ( Op ) , "add" , add_trait, Target :: Trait ;
203
+ SubTraitLangItem ( Op ) , "sub" , sub_trait, Target :: Trait ;
204
+ MulTraitLangItem ( Op ) , "mul" , mul_trait, Target :: Trait ;
205
+ DivTraitLangItem ( Op ) , "div" , div_trait, Target :: Trait ;
206
+ RemTraitLangItem ( Op ) , "rem" , rem_trait, Target :: Trait ;
207
+ NegTraitLangItem ( Op ) , "neg" , neg_trait, Target :: Trait ;
208
+ NotTraitLangItem ( Op ) , "not" , not_trait, Target :: Trait ;
209
+ BitXorTraitLangItem ( Op ) , "bitxor" , bitxor_trait, Target :: Trait ;
210
+ BitAndTraitLangItem ( Op ) , "bitand" , bitand_trait, Target :: Trait ;
211
+ BitOrTraitLangItem ( Op ) , "bitor" , bitor_trait, Target :: Trait ;
212
+ ShlTraitLangItem ( Op ) , "shl" , shl_trait, Target :: Trait ;
213
+ ShrTraitLangItem ( Op ) , "shr" , shr_trait, Target :: Trait ;
214
+ AddAssignTraitLangItem ( Op ) , "add_assign" , add_assign_trait, Target :: Trait ;
215
+ SubAssignTraitLangItem ( Op ) , "sub_assign" , sub_assign_trait, Target :: Trait ;
216
+ MulAssignTraitLangItem ( Op ) , "mul_assign" , mul_assign_trait, Target :: Trait ;
217
+ DivAssignTraitLangItem ( Op ) , "div_assign" , div_assign_trait, Target :: Trait ;
218
+ RemAssignTraitLangItem ( Op ) , "rem_assign" , rem_assign_trait, Target :: Trait ;
219
+ BitXorAssignTraitLangItem ( Op ) , "bitxor_assign" , bitxor_assign_trait, Target :: Trait ;
220
+ BitAndAssignTraitLangItem ( Op ) , "bitand_assign" , bitand_assign_trait, Target :: Trait ;
221
+ BitOrAssignTraitLangItem ( Op ) , "bitor_assign" , bitor_assign_trait, Target :: Trait ;
222
+ ShlAssignTraitLangItem ( Op ) , "shl_assign" , shl_assign_trait, Target :: Trait ;
223
+ ShrAssignTraitLangItem ( Op ) , "shr_assign" , shr_assign_trait, Target :: Trait ;
224
+ IndexTraitLangItem ( Op ) , "index" , index_trait, Target :: Trait ;
225
+ IndexMutTraitLangItem ( Op ) , "index_mut" , index_mut_trait, Target :: Trait ;
198
226
199
227
UnsafeCellTypeLangItem , "unsafe_cell" , unsafe_cell_type, Target :: Struct ;
200
228
VaListTypeLangItem , "va_list" , va_list, Target :: Struct ;
0 commit comments