@@ -241,7 +241,7 @@ impl CStr {
241241 /// ```
242242 ///
243243 /// ```
244- /// #![feature(const_cstr_methods )]
244+ /// #![feature(const_cstr_from_ptr )]
245245 ///
246246 /// use std::ffi::{c_char, CStr};
247247 ///
@@ -256,7 +256,7 @@ impl CStr {
256256 #[ inline]
257257 #[ must_use]
258258 #[ stable( feature = "rust1" , since = "1.0.0" ) ]
259- #[ rustc_const_unstable( feature = "const_cstr_methods " , issue = "101719" ) ]
259+ #[ rustc_const_unstable( feature = "const_cstr_from_ptr " , issue = "101719" ) ]
260260 pub const unsafe fn from_ptr < ' a > ( ptr : * const c_char ) -> & ' a CStr {
261261 // SAFETY: The caller has provided a pointer that points to a valid C
262262 // string with a NUL terminator of size less than `isize::MAX`, whose
@@ -377,7 +377,7 @@ impl CStr {
377377 /// assert!(cstr.is_err());
378378 /// ```
379379 #[ stable( feature = "cstr_from_bytes" , since = "1.10.0" ) ]
380- #[ rustc_const_unstable ( feature = "const_cstr_methods" , issue = "101719 " ) ]
380+ #[ rustc_const_stable ( feature = "const_cstr_methods" , since = "CURRENT_RUSTC_VERSION " ) ]
381381 pub const fn from_bytes_with_nul ( bytes : & [ u8 ] ) -> Result < & Self , FromBytesWithNulError > {
382382 let nul_pos = memchr:: memchr ( 0 , bytes) ;
383383 match nul_pos {
@@ -561,10 +561,12 @@ impl CStr {
561561 #[ must_use = "this returns the result of the operation, \
562562 without modifying the original"]
563563 #[ stable( feature = "rust1" , since = "1.0.0" ) ]
564- pub fn to_bytes ( & self ) -> & [ u8 ] {
564+ #[ rustc_const_stable( feature = "const_cstr_methods" , since = "CURRENT_RUSTC_VERSION" ) ]
565+ pub const fn to_bytes ( & self ) -> & [ u8 ] {
565566 let bytes = self . to_bytes_with_nul ( ) ;
567+ // FIXME(const-hack) replace with range index
566568 // SAFETY: to_bytes_with_nul returns slice with length at least 1
567- unsafe { bytes. get_unchecked ( .. bytes. len ( ) - 1 ) }
569+ unsafe { slice :: from_raw_parts ( bytes. as_ptr ( ) , bytes. len ( ) - 1 ) }
568570 }
569571
570572 /// Converts this C string to a byte slice containing the trailing 0 byte.
@@ -588,7 +590,7 @@ impl CStr {
588590 #[ must_use = "this returns the result of the operation, \
589591 without modifying the original"]
590592 #[ stable( feature = "rust1" , since = "1.0.0" ) ]
591- #[ rustc_const_unstable ( feature = "const_cstr_methods" , issue = "101719 " ) ]
593+ #[ rustc_const_stable ( feature = "const_cstr_methods" , since = "CURRENT_RUSTC_VERSION " ) ]
592594 pub const fn to_bytes_with_nul ( & self ) -> & [ u8 ] {
593595 // SAFETY: Transmuting a slice of `c_char`s to a slice of `u8`s
594596 // is safe on all supported targets.
@@ -612,7 +614,8 @@ impl CStr {
612614 /// assert_eq!(cstr.to_str(), Ok("foo"));
613615 /// ```
614616 #[ stable( feature = "cstr_to_str" , since = "1.4.0" ) ]
615- pub fn to_str ( & self ) -> Result < & str , str:: Utf8Error > {
617+ #[ rustc_const_stable( feature = "const_cstr_methods" , since = "CURRENT_RUSTC_VERSION" ) ]
618+ pub const fn to_str ( & self ) -> Result < & str , str:: Utf8Error > {
616619 // N.B., when `CStr` is changed to perform the length check in `.to_bytes()`
617620 // instead of in `from_ptr()`, it may be worth considering if this should
618621 // be rewritten to do the UTF-8 check inline with the length calculation
0 commit comments