This repository was archived by the owner on May 28, 2025. It is now read-only.
File tree Expand file tree Collapse file tree 5 files changed +27
-0
lines changed
compiler/rustc_passes/src Expand file tree Collapse file tree 5 files changed +27
-0
lines changed Original file line number Diff line number Diff line change @@ -192,6 +192,28 @@ impl<'tcx> Visitor<'tcx> for CheckConstVisitor<'tcx> {
192192 }
193193
194194 fn visit_item ( & mut self , item : & ' tcx hir:: Item < ' tcx > ) {
195+ let tcx = self . tcx ;
196+ if let hir:: ItemKind :: Impl ( hir:: Impl {
197+ constness : hir:: Constness :: Const ,
198+ of_trait : Some ( trait_ref) ,
199+ ..
200+ } ) = item. kind
201+ {
202+ let def_id = trait_ref. trait_def_id ( ) . unwrap ( ) ;
203+ let source_map = tcx. sess . source_map ( ) ;
204+ if !tcx. has_attr ( def_id, sym:: const_trait) {
205+ tcx. sess
206+ . struct_span_err (
207+ source_map. guess_head_span ( item. span ) ,
208+ "const `impl`s must be for traits marked with `#[const_trait]`" ,
209+ )
210+ . span_note (
211+ source_map. guess_head_span ( tcx. def_span ( def_id) ) ,
212+ "this trait must be annotated with `#[const_trait]`" ,
213+ )
214+ . emit ( ) ;
215+ }
216+ }
195217 intravisit:: walk_item ( self , item) ;
196218 }
197219
Original file line number Diff line number Diff line change @@ -368,6 +368,7 @@ pub trait Into<T>: Sized {
368368 all( _Self = "&str" , T = "std::string::String" ) ,
369369 note = "to coerce a `{T}` into a `{Self}`, use `&*` as a prefix" ,
370370) ) ]
371+ #[ const_trait]
371372pub trait From < T > : Sized {
372373 /// Converts to this type from the input type.
373374 #[ lang = "from" ]
Original file line number Diff line number Diff line change 9999/// ```
100100#[ cfg_attr( not( test) , rustc_diagnostic_item = "Default" ) ]
101101#[ stable( feature = "rust1" , since = "1.0.0" ) ]
102+ #[ const_trait]
102103pub trait Default : Sized {
103104 /// Returns the "default value" for a type.
104105 ///
Original file line number Diff line number Diff line change 5555#[ doc( alias = "]" ) ]
5656#[ doc( alias = "[" ) ]
5757#[ doc( alias = "[]" ) ]
58+ #[ const_trait]
5859pub trait Index < Idx : ?Sized > {
5960 /// The returned type after indexing.
6061 #[ stable( feature = "rust1" , since = "1.0.0" ) ]
@@ -163,6 +164,7 @@ see chapter in The Book <https://doc.rust-lang.org/book/ch08-02-strings.html#ind
163164#[ doc( alias = "[" ) ]
164165#[ doc( alias = "]" ) ]
165166#[ doc( alias = "[]" ) ]
167+ #[ const_trait]
166168pub trait IndexMut < Idx : ?Sized > : Index < Idx > {
167169 /// Performs the mutable indexing (`container[index]`) operation.
168170 ///
Original file line number Diff line number Diff line change @@ -158,6 +158,7 @@ mod private_slice_index {
158158 message = "the type `{T}` cannot be indexed by `{Self}`" ,
159159 label = "slice indices are of type `usize` or ranges of `usize`"
160160) ]
161+ #[ const_trait]
161162pub unsafe trait SliceIndex < T : ?Sized > : private_slice_index:: Sealed {
162163 /// The output type returned by methods.
163164 #[ stable( feature = "slice_get_slice" , since = "1.28.0" ) ]
You can’t perform that action at this time.
0 commit comments