@@ -21,11 +21,26 @@ use rustc_span::Span;
2121
2222use lazy_static:: lazy_static;
2323
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+
2439// The actual lang items defined come at the end of this file in one handy table.
2540// So you probably just want to nip down to the end.
2641macro_rules! language_item_table {
2742 (
28- $( $variant: ident, $name: expr, $method: ident, $target: expr; ) *
43+ $( $variant: ident $ ( $group : expr ) ? , $name: expr, $method: ident, $target: expr; ) *
2944 ) => {
3045
3146 enum_from_u32! {
@@ -45,6 +60,13 @@ macro_rules! language_item_table {
4560 $( $variant => $name, ) *
4661 }
4762 }
63+
64+ pub fn group( self ) -> Option <LangItemGroup > {
65+ use LangItemGroup :: * ;
66+ match self {
67+ $( $variant => expand_group!( $( $group) * ) , ) *
68+ }
69+ }
4870 }
4971
5072 #[ derive( HashStable_Generic ) ]
@@ -54,6 +76,9 @@ macro_rules! language_item_table {
5476 pub items: Vec <Option <DefId >>,
5577 /// Lang items that were not found during collection.
5678 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 ] ,
5782 }
5883
5984 impl LanguageItems {
@@ -64,6 +89,7 @@ macro_rules! language_item_table {
6489 Self {
6590 items: vec![ $( init_none( $variant) ) ,* ] ,
6691 missing: Vec :: new( ) ,
92+ groups: [ vec![ ] ; NUM_GROUPS ] ,
6793 }
6894 }
6995
@@ -79,6 +105,10 @@ macro_rules! language_item_table {
79105 self . items[ it as usize ] . ok_or_else( || format!( "requires `{}` lang_item" , it. name( ) ) )
80106 }
81107
108+ pub fn group( & self , group: LangItemGroup ) -> & [ DefId ] {
109+ self . groups[ group as usize ] . as_ref( )
110+ }
111+
82112 $(
83113 /// Returns the corresponding `DefId` for the lang item
84114 #[ doc = $name]
@@ -171,30 +201,30 @@ language_item_table! {
171201 CoerceUnsizedTraitLangItem , "coerce_unsized" , coerce_unsized_trait, Target :: Trait ;
172202 DispatchFromDynTraitLangItem , "dispatch_from_dyn" , dispatch_from_dyn_trait, Target :: Trait ;
173203
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 ;
198228
199229 UnsafeCellTypeLangItem , "unsafe_cell" , unsafe_cell_type, Target :: Struct ;
200230 VaListTypeLangItem , "va_list" , va_list, Target :: Struct ;
0 commit comments