@@ -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: path; ) *
43+ $( $variant: ident $ ( $group : expr ) ? , $name: expr, $method: ident, $target: path; ) *
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,7 @@ 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+ pub groups: Vec <Vec <DefId >>
5780 }
5881
5982 impl LanguageItems {
@@ -64,6 +87,7 @@ macro_rules! language_item_table {
6487 Self {
6588 items: vec![ $( init_none( $variant) ) ,* ] ,
6689 missing: Vec :: new( ) ,
90+ groups: vec![ vec![ ] ; NUM_GROUPS ] ,
6791 }
6892 }
6993
@@ -79,6 +103,10 @@ macro_rules! language_item_table {
79103 self . items[ it as usize ] . ok_or_else( || format!( "requires `{}` lang_item" , it. name( ) ) )
80104 }
81105
106+ pub fn group( & self , group: LangItemGroup ) -> & [ DefId ] {
107+ self . groups[ group as usize ] . as_ref( )
108+ }
109+
82110 $(
83111 /// Returns the corresponding `DefId` for the lang item
84112 #[ doc = $name]
@@ -171,30 +199,30 @@ language_item_table! {
171199 CoerceUnsizedTraitLangItem , "coerce_unsized" , coerce_unsized_trait, Target :: Trait ;
172200 DispatchFromDynTraitLangItem , "dispatch_from_dyn" , dispatch_from_dyn_trait, Target :: Trait ;
173201
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 ;
198226
199227 UnsafeCellTypeLangItem , "unsafe_cell" , unsafe_cell_type, Target :: Struct ;
200228 VaListTypeLangItem , "va_list" , va_list, Target :: Struct ;
0 commit comments