1 #[doc = include_str!("panic.md")] 2 #[macro_export] 3 #[rustc_builtin_macro(core_panic)] 4 #[allow_internal_unstable(edition_panic)] 5 #[stable(feature = "core", since = "1.6.0")] 6 #[rustc_diagnostic_item = "core_panic_macro"] 7 macro_rules! panic { 8 // Expands to either `$crate::panic::panic_2015` or `$crate::panic::panic_2021` 9 // depending on the edition of the caller. 10 ($($arg:tt)*) => { 11 /* compiler built-in */ 12 }; 13 } 14 15 /// Asserts that two expressions are equal to each other (using [`PartialEq`]). 16 /// 17 /// On panic, this macro will print the values of the expressions with their 18 /// debug representations. 19 /// 20 /// Like [`assert!`], this macro has a second form, where a custom 21 /// panic message can be provided. 22 /// 23 /// # Examples 24 /// 25 /// ``` 26 /// let a = 3; 27 /// let b = 1 + 2; 28 /// assert_eq!(a, b); 29 /// 30 /// assert_eq!(a, b, "we are testing addition with {} and {}", a, b); 31 /// ``` 32 #[macro_export] 33 #[stable(feature = "rust1", since = "1.0.0")] 34 #[cfg_attr(not(test), rustc_diagnostic_item = "assert_eq_macro")] 35 #[allow_internal_unstable(core_panic)] 36 macro_rules! assert_eq { 37 ($left:expr, $right:expr $(,)?) => { 38 match (&$left, &$right) { 39 (left_val, right_val) => { 40 if !(*left_val == *right_val) { 41 let kind = $crate::panicking::AssertKind::Eq; 42 // The reborrows below are intentional. Without them, the stack slot for the 43 // borrow is initialized even before the values are compared, leading to a 44 // noticeable slow down. 45 $crate::panicking::assert_failed(kind, &*left_val, &*right_val, $crate::option::Option::None); 46 } 47 } 48 } 49 }; 50 ($left:expr, $right:expr, $($arg:tt)+) => { 51 match (&$left, &$right) { 52 (left_val, right_val) => { 53 if !(*left_val == *right_val) { 54 let kind = $crate::panicking::AssertKind::Eq; 55 // The reborrows below are intentional. Without them, the stack slot for the 56 // borrow is initialized even before the values are compared, leading to a 57 // noticeable slow down. 58 $crate::panicking::assert_failed(kind, &*left_val, &*right_val, $crate::option::Option::Some($crate::format_args!($($arg)+))); 59 } 60 } 61 } 62 }; 63 } 64 65 /// Asserts that two expressions are not equal to each other (using [`PartialEq`]). 66 /// 67 /// On panic, this macro will print the values of the expressions with their 68 /// debug representations. 69 /// 70 /// Like [`assert!`], this macro has a second form, where a custom 71 /// panic message can be provided. 72 /// 73 /// # Examples 74 /// 75 /// ``` 76 /// let a = 3; 77 /// let b = 2; 78 /// assert_ne!(a, b); 79 /// 80 /// assert_ne!(a, b, "we are testing that the values are not equal"); 81 /// ``` 82 #[macro_export] 83 #[stable(feature = "assert_ne", since = "1.13.0")] 84 #[cfg_attr(not(test), rustc_diagnostic_item = "assert_ne_macro")] 85 #[allow_internal_unstable(core_panic)] 86 macro_rules! assert_ne { 87 ($left:expr, $right:expr $(,)?) => { 88 match (&$left, &$right) { 89 (left_val, right_val) => { 90 if *left_val == *right_val { 91 let kind = $crate::panicking::AssertKind::Ne; 92 // The reborrows below are intentional. Without them, the stack slot for the 93 // borrow is initialized even before the values are compared, leading to a 94 // noticeable slow down. 95 $crate::panicking::assert_failed(kind, &*left_val, &*right_val, $crate::option::Option::None); 96 } 97 } 98 } 99 }; 100 ($left:expr, $right:expr, $($arg:tt)+) => { 101 match (&($left), &($right)) { 102 (left_val, right_val) => { 103 if *left_val == *right_val { 104 let kind = $crate::panicking::AssertKind::Ne; 105 // The reborrows below are intentional. Without them, the stack slot for the 106 // borrow is initialized even before the values are compared, leading to a 107 // noticeable slow down. 108 $crate::panicking::assert_failed(kind, &*left_val, &*right_val, $crate::option::Option::Some($crate::format_args!($($arg)+))); 109 } 110 } 111 } 112 }; 113 } 114 115 /// Asserts that an expression matches any of the given patterns. 116 /// 117 /// Like in a `match` expression, the pattern can be optionally followed by `if` 118 /// and a guard expression that has access to names bound by the pattern. 119 /// 120 /// On panic, this macro will print the value of the expression with its 121 /// debug representation. 122 /// 123 /// Like [`assert!`], this macro has a second form, where a custom 124 /// panic message can be provided. 125 /// 126 /// # Examples 127 /// 128 /// ``` 129 /// #![feature(assert_matches)] 130 /// 131 /// use std::assert_matches::assert_matches; 132 /// 133 /// let a = 1u32.checked_add(2); 134 /// let b = 1u32.checked_sub(2); 135 /// assert_matches!(a, Some(_)); 136 /// assert_matches!(b, None); 137 /// 138 /// let c = Ok("abc".to_string()); 139 /// assert_matches!(c, Ok(x) | Err(x) if x.len() < 100); 140 /// ``` 141 #[unstable(feature = "assert_matches", issue = "82775")] 142 #[allow_internal_unstable(core_panic)] 143 #[rustc_macro_transparency = "semitransparent"] 144 pub macro assert_matches { 145 ($left:expr, $(|)? $( $pattern:pat_param )|+ $( if $guard: expr )? $(,)?) => { 146 match $left { 147 $( $pattern )|+ $( if $guard )? => {} 148 ref left_val => { 149 $crate::panicking::assert_matches_failed( 150 left_val, 151 $crate::stringify!($($pattern)|+ $(if $guard)?), 152 $crate::option::Option::None 153 ); 154 } 155 } 156 }, 157 ($left:expr, $(|)? $( $pattern:pat_param )|+ $( if $guard: expr )?, $($arg:tt)+) => { 158 match $left { 159 $( $pattern )|+ $( if $guard )? => {} 160 ref left_val => { 161 $crate::panicking::assert_matches_failed( 162 left_val, 163 $crate::stringify!($($pattern)|+ $(if $guard)?), 164 $crate::option::Option::Some($crate::format_args!($($arg)+)) 165 ); 166 } 167 } 168 }, 169 } 170 171 /// Asserts that a boolean expression is `true` at runtime. 172 /// 173 /// This will invoke the [`panic!`] macro if the provided expression cannot be 174 /// evaluated to `true` at runtime. 175 /// 176 /// Like [`assert!`], this macro also has a second version, where a custom panic 177 /// message can be provided. 178 /// 179 /// # Uses 180 /// 181 /// Unlike [`assert!`], `debug_assert!` statements are only enabled in non 182 /// optimized builds by default. An optimized build will not execute 183 /// `debug_assert!` statements unless `-C debug-assertions` is passed to the 184 /// compiler. This makes `debug_assert!` useful for checks that are too 185 /// expensive to be present in a release build but may be helpful during 186 /// development. The result of expanding `debug_assert!` is always type checked. 187 /// 188 /// An unchecked assertion allows a program in an inconsistent state to keep 189 /// running, which might have unexpected consequences but does not introduce 190 /// unsafety as long as this only happens in safe code. The performance cost 191 /// of assertions, however, is not measurable in general. Replacing [`assert!`] 192 /// with `debug_assert!` is thus only encouraged after thorough profiling, and 193 /// more importantly, only in safe code! 194 /// 195 /// # Examples 196 /// 197 /// ``` 198 /// // the panic message for these assertions is the stringified value of the 199 /// // expression given. 200 /// debug_assert!(true); 201 /// 202 /// fn some_expensive_computation() -> bool { true } // a very simple function 203 /// debug_assert!(some_expensive_computation()); 204 /// 205 /// // assert with a custom message 206 /// let x = true; 207 /// debug_assert!(x, "x wasn't true!"); 208 /// 209 /// let a = 3; let b = 27; 210 /// debug_assert!(a + b == 30, "a = {}, b = {}", a, b); 211 /// ``` 212 #[macro_export] 213 #[stable(feature = "rust1", since = "1.0.0")] 214 #[rustc_diagnostic_item = "debug_assert_macro"] 215 #[allow_internal_unstable(edition_panic)] 216 macro_rules! debug_assert { 217 ($($arg:tt)*) => { 218 if $crate::cfg!(debug_assertions) { 219 $crate::assert!($($arg)*); 220 } 221 }; 222 } 223 224 /// Asserts that two expressions are equal to each other. 225 /// 226 /// On panic, this macro will print the values of the expressions with their 227 /// debug representations. 228 /// 229 /// Unlike [`assert_eq!`], `debug_assert_eq!` statements are only enabled in non 230 /// optimized builds by default. An optimized build will not execute 231 /// `debug_assert_eq!` statements unless `-C debug-assertions` is passed to the 232 /// compiler. This makes `debug_assert_eq!` useful for checks that are too 233 /// expensive to be present in a release build but may be helpful during 234 /// development. The result of expanding `debug_assert_eq!` is always type checked. 235 /// 236 /// # Examples 237 /// 238 /// ``` 239 /// let a = 3; 240 /// let b = 1 + 2; 241 /// debug_assert_eq!(a, b); 242 /// ``` 243 #[macro_export] 244 #[stable(feature = "rust1", since = "1.0.0")] 245 #[cfg_attr(not(test), rustc_diagnostic_item = "debug_assert_eq_macro")] 246 macro_rules! debug_assert_eq { 247 ($($arg:tt)*) => { 248 if $crate::cfg!(debug_assertions) { 249 $crate::assert_eq!($($arg)*); 250 } 251 }; 252 } 253 254 /// Asserts that two expressions are not equal to each other. 255 /// 256 /// On panic, this macro will print the values of the expressions with their 257 /// debug representations. 258 /// 259 /// Unlike [`assert_ne!`], `debug_assert_ne!` statements are only enabled in non 260 /// optimized builds by default. An optimized build will not execute 261 /// `debug_assert_ne!` statements unless `-C debug-assertions` is passed to the 262 /// compiler. This makes `debug_assert_ne!` useful for checks that are too 263 /// expensive to be present in a release build but may be helpful during 264 /// development. The result of expanding `debug_assert_ne!` is always type checked. 265 /// 266 /// # Examples 267 /// 268 /// ``` 269 /// let a = 3; 270 /// let b = 2; 271 /// debug_assert_ne!(a, b); 272 /// ``` 273 #[macro_export] 274 #[stable(feature = "assert_ne", since = "1.13.0")] 275 #[cfg_attr(not(test), rustc_diagnostic_item = "debug_assert_ne_macro")] 276 macro_rules! debug_assert_ne { 277 ($($arg:tt)*) => { 278 if $crate::cfg!(debug_assertions) { 279 $crate::assert_ne!($($arg)*); 280 } 281 }; 282 } 283 284 /// Asserts that an expression matches any of the given patterns. 285 /// 286 /// Like in a `match` expression, the pattern can be optionally followed by `if` 287 /// and a guard expression that has access to names bound by the pattern. 288 /// 289 /// On panic, this macro will print the value of the expression with its 290 /// debug representation. 291 /// 292 /// Unlike [`assert_matches!`], `debug_assert_matches!` statements are only 293 /// enabled in non optimized builds by default. An optimized build will not 294 /// execute `debug_assert_matches!` statements unless `-C debug-assertions` is 295 /// passed to the compiler. This makes `debug_assert_matches!` useful for 296 /// checks that are too expensive to be present in a release build but may be 297 /// helpful during development. The result of expanding `debug_assert_matches!` 298 /// is always type checked. 299 /// 300 /// # Examples 301 /// 302 /// ``` 303 /// #![feature(assert_matches)] 304 /// 305 /// use std::assert_matches::debug_assert_matches; 306 /// 307 /// let a = 1u32.checked_add(2); 308 /// let b = 1u32.checked_sub(2); 309 /// debug_assert_matches!(a, Some(_)); 310 /// debug_assert_matches!(b, None); 311 /// 312 /// let c = Ok("abc".to_string()); 313 /// debug_assert_matches!(c, Ok(x) | Err(x) if x.len() < 100); 314 /// ``` 315 #[macro_export] 316 #[unstable(feature = "assert_matches", issue = "82775")] 317 #[allow_internal_unstable(assert_matches)] 318 #[rustc_macro_transparency = "semitransparent"] 319 pub macro debug_assert_matches($($arg:tt)*) { 320 if $crate::cfg!(debug_assertions) { 321 $crate::assert_matches::assert_matches!($($arg)*); 322 } 323 } 324 325 /// Returns whether the given expression matches any of the given patterns. 326 /// 327 /// Like in a `match` expression, the pattern can be optionally followed by `if` 328 /// and a guard expression that has access to names bound by the pattern. 329 /// 330 /// # Examples 331 /// 332 /// ``` 333 /// let foo = 'f'; 334 /// assert!(matches!(foo, 'A'..='Z' | 'a'..='z')); 335 /// 336 /// let bar = Some(4); 337 /// assert!(matches!(bar, Some(x) if x > 2)); 338 /// ``` 339 #[macro_export] 340 #[stable(feature = "matches_macro", since = "1.42.0")] 341 #[cfg_attr(not(test), rustc_diagnostic_item = "matches_macro")] 342 macro_rules! matches { 343 ($expression:expr, $pattern:pat $(if $guard:expr)? $(,)?) => { 344 match $expression { 345 $pattern $(if $guard)? => true, 346 _ => false 347 } 348 }; 349 } 350 351 /// Unwraps a result or propagates its error. 352 /// 353 /// The [`?` operator][propagating-errors] was added to replace `try!` 354 /// and should be used instead. Furthermore, `try` is a reserved word 355 /// in Rust 2018, so if you must use it, you will need to use the 356 /// [raw-identifier syntax][ris]: `r#try`. 357 /// 358 /// [propagating-errors]: https://doc.rust-lang.org/book/ch09-02-recoverable-errors-with-result.html#a-shortcut-for-propagating-errors-the--operator 359 /// [ris]: https://doc.rust-lang.org/nightly/rust-by-example/compatibility/raw_identifiers.html 360 /// 361 /// `try!` matches the given [`Result`]. In case of the `Ok` variant, the 362 /// expression has the value of the wrapped value. 363 /// 364 /// In case of the `Err` variant, it retrieves the inner error. `try!` then 365 /// performs conversion using `From`. This provides automatic conversion 366 /// between specialized errors and more general ones. The resulting 367 /// error is then immediately returned. 368 /// 369 /// Because of the early return, `try!` can only be used in functions that 370 /// return [`Result`]. 371 /// 372 /// # Examples 373 /// 374 /// ``` 375 /// use std::io; 376 /// use std::fs::File; 377 /// use std::io::prelude::*; 378 /// 379 /// enum MyError { 380 /// FileWriteError 381 /// } 382 /// 383 /// impl From<io::Error> for MyError { 384 /// fn from(e: io::Error) -> MyError { 385 /// MyError::FileWriteError 386 /// } 387 /// } 388 /// 389 /// // The preferred method of quick returning Errors 390 /// fn write_to_file_question() -> Result<(), MyError> { 391 /// let mut file = File::create("my_best_friends.txt")?; 392 /// file.write_all(b"This is a list of my best friends.")?; 393 /// Ok(()) 394 /// } 395 /// 396 /// // The previous method of quick returning Errors 397 /// fn write_to_file_using_try() -> Result<(), MyError> { 398 /// let mut file = r#try!(File::create("my_best_friends.txt")); 399 /// r#try!(file.write_all(b"This is a list of my best friends.")); 400 /// Ok(()) 401 /// } 402 /// 403 /// // This is equivalent to: 404 /// fn write_to_file_using_match() -> Result<(), MyError> { 405 /// let mut file = r#try!(File::create("my_best_friends.txt")); 406 /// match file.write_all(b"This is a list of my best friends.") { 407 /// Ok(v) => v, 408 /// Err(e) => return Err(From::from(e)), 409 /// } 410 /// Ok(()) 411 /// } 412 /// ``` 413 #[macro_export] 414 #[stable(feature = "rust1", since = "1.0.0")] 415 #[deprecated(since = "1.39.0", note = "use the `?` operator instead")] 416 #[doc(alias = "?")] 417 macro_rules! r#try { 418 ($expr:expr $(,)?) => { 419 match $expr { 420 $crate::result::Result::Ok(val) => val, 421 $crate::result::Result::Err(err) => { 422 return $crate::result::Result::Err($crate::convert::From::from(err)); 423 } 424 } 425 }; 426 } 427 428 /// Writes formatted data into a buffer. 429 /// 430 /// This macro accepts a 'writer', a format string, and a list of arguments. Arguments will be 431 /// formatted according to the specified format string and the result will be passed to the writer. 432 /// The writer may be any value with a `write_fmt` method; generally this comes from an 433 /// implementation of either the [`fmt::Write`] or the [`io::Write`] trait. The macro 434 /// returns whatever the `write_fmt` method returns; commonly a [`fmt::Result`], or an 435 /// [`io::Result`]. 436 /// 437 /// See [`std::fmt`] for more information on the format string syntax. 438 /// 439 /// [`std::fmt`]: ../std/fmt/index.html 440 /// [`fmt::Write`]: crate::fmt::Write 441 /// [`io::Write`]: ../std/io/trait.Write.html 442 /// [`fmt::Result`]: crate::fmt::Result 443 /// [`io::Result`]: ../std/io/type.Result.html 444 /// 445 /// # Examples 446 /// 447 /// ``` 448 /// use std::io::Write; 449 /// 450 /// fn main() -> std::io::Result<()> { 451 /// let mut w = Vec::new(); 452 /// write!(&mut w, "test")?; 453 /// write!(&mut w, "formatted {}", "arguments")?; 454 /// 455 /// assert_eq!(w, b"testformatted arguments"); 456 /// Ok(()) 457 /// } 458 /// ``` 459 /// 460 /// A module can import both `std::fmt::Write` and `std::io::Write` and call `write!` on objects 461 /// implementing either, as objects do not typically implement both. However, the module must 462 /// avoid conflict between the trait names, such as by importing them as `_` or otherwise renaming 463 /// them: 464 /// 465 /// ``` 466 /// use std::fmt::Write as _; 467 /// use std::io::Write as _; 468 /// 469 /// fn main() -> Result<(), Box<dyn std::error::Error>> { 470 /// let mut s = String::new(); 471 /// let mut v = Vec::new(); 472 /// 473 /// write!(&mut s, "{} {}", "abc", 123)?; // uses fmt::Write::write_fmt 474 /// write!(&mut v, "s = {:?}", s)?; // uses io::Write::write_fmt 475 /// assert_eq!(v, b"s = \"abc 123\""); 476 /// Ok(()) 477 /// } 478 /// ``` 479 /// 480 /// If you also need the trait names themselves, such as to implement one or both on your types, 481 /// import the containing module and then name them with a prefix: 482 /// 483 /// ``` 484 /// # #![allow(unused_imports)] 485 /// use std::fmt::{self, Write as _}; 486 /// use std::io::{self, Write as _}; 487 /// 488 /// struct Example; 489 /// 490 /// impl fmt::Write for Example { 491 /// fn write_str(&mut self, _s: &str) -> core::fmt::Result { 492 /// unimplemented!(); 493 /// } 494 /// } 495 /// ``` 496 /// 497 /// Note: This macro can be used in `no_std` setups as well. 498 /// In a `no_std` setup you are responsible for the implementation details of the components. 499 /// 500 /// ```no_run 501 /// use core::fmt::Write; 502 /// 503 /// struct Example; 504 /// 505 /// impl Write for Example { 506 /// fn write_str(&mut self, _s: &str) -> core::fmt::Result { 507 /// unimplemented!(); 508 /// } 509 /// } 510 /// 511 /// let mut m = Example{}; 512 /// write!(&mut m, "Hello World").expect("Not written"); 513 /// ``` 514 #[macro_export] 515 #[stable(feature = "rust1", since = "1.0.0")] 516 #[cfg_attr(not(test), rustc_diagnostic_item = "write_macro")] 517 macro_rules! write { 518 ($dst:expr, $($arg:tt)*) => { 519 $dst.write_fmt($crate::format_args!($($arg)*)) 520 }; 521 } 522 523 /// Write formatted data into a buffer, with a newline appended. 524 /// 525 /// On all platforms, the newline is the LINE FEED character (`\n`/`U+000A`) alone 526 /// (no additional CARRIAGE RETURN (`\r`/`U+000D`). 527 /// 528 /// For more information, see [`write!`]. For information on the format string syntax, see 529 /// [`std::fmt`]. 530 /// 531 /// [`std::fmt`]: ../std/fmt/index.html 532 /// 533 /// # Examples 534 /// 535 /// ``` 536 /// use std::io::{Write, Result}; 537 /// 538 /// fn main() -> Result<()> { 539 /// let mut w = Vec::new(); 540 /// writeln!(&mut w)?; 541 /// writeln!(&mut w, "test")?; 542 /// writeln!(&mut w, "formatted {}", "arguments")?; 543 /// 544 /// assert_eq!(&w[..], "\ntest\nformatted arguments\n".as_bytes()); 545 /// Ok(()) 546 /// } 547 /// ``` 548 #[macro_export] 549 #[stable(feature = "rust1", since = "1.0.0")] 550 #[cfg_attr(not(test), rustc_diagnostic_item = "writeln_macro")] 551 #[allow_internal_unstable(format_args_nl)] 552 macro_rules! writeln { 553 ($dst:expr $(,)?) => { 554 $crate::write!($dst, "\n") 555 }; 556 ($dst:expr, $($arg:tt)*) => { 557 $dst.write_fmt($crate::format_args_nl!($($arg)*)) 558 }; 559 } 560 561 /// Indicates unreachable code. 562 /// 563 /// This is useful any time that the compiler can't determine that some code is unreachable. For 564 /// example: 565 /// 566 /// * Match arms with guard conditions. 567 /// * Loops that dynamically terminate. 568 /// * Iterators that dynamically terminate. 569 /// 570 /// If the determination that the code is unreachable proves incorrect, the 571 /// program immediately terminates with a [`panic!`]. 572 /// 573 /// The unsafe counterpart of this macro is the [`unreachable_unchecked`] function, which 574 /// will cause undefined behavior if the code is reached. 575 /// 576 /// [`unreachable_unchecked`]: crate::hint::unreachable_unchecked 577 /// 578 /// # Panics 579 /// 580 /// This will always [`panic!`] because `unreachable!` is just a shorthand for `panic!` with a 581 /// fixed, specific message. 582 /// 583 /// Like `panic!`, this macro has a second form for displaying custom values. 584 /// 585 /// # Examples 586 /// 587 /// Match arms: 588 /// 589 /// ``` 590 /// # #[allow(dead_code)] 591 /// fn foo(x: Option<i32>) { 592 /// match x { 593 /// Some(n) if n >= 0 => println!("Some(Non-negative)"), 594 /// Some(n) if n < 0 => println!("Some(Negative)"), 595 /// Some(_) => unreachable!(), // compile error if commented out 596 /// None => println!("None") 597 /// } 598 /// } 599 /// ``` 600 /// 601 /// Iterators: 602 /// 603 /// ``` 604 /// # #[allow(dead_code)] 605 /// fn divide_by_three(x: u32) -> u32 { // one of the poorest implementations of x/3 606 /// for i in 0.. { 607 /// if 3*i < i { panic!("u32 overflow"); } 608 /// if x < 3*i { return i-1; } 609 /// } 610 /// unreachable!("The loop should always return"); 611 /// } 612 /// ``` 613 #[macro_export] 614 #[rustc_builtin_macro(unreachable)] 615 #[allow_internal_unstable(edition_panic)] 616 #[stable(feature = "rust1", since = "1.0.0")] 617 #[cfg_attr(not(test), rustc_diagnostic_item = "unreachable_macro")] 618 macro_rules! unreachable { 619 // Expands to either `$crate::panic::unreachable_2015` or `$crate::panic::unreachable_2021` 620 // depending on the edition of the caller. 621 ($($arg:tt)*) => { 622 /* compiler built-in */ 623 }; 624 } 625 626 /// Indicates unimplemented code by panicking with a message of "not implemented". 627 /// 628 /// This allows your code to type-check, which is useful if you are prototyping or 629 /// implementing a trait that requires multiple methods which you don't plan to use all of. 630 /// 631 /// The difference between `unimplemented!` and [`todo!`] is that while `todo!` 632 /// conveys an intent of implementing the functionality later and the message is "not yet 633 /// implemented", `unimplemented!` makes no such claims. Its message is "not implemented". 634 /// Also some IDEs will mark `todo!`s. 635 /// 636 /// # Panics 637 /// 638 /// This will always [`panic!`] because `unimplemented!` is just a shorthand for `panic!` with a 639 /// fixed, specific message. 640 /// 641 /// Like `panic!`, this macro has a second form for displaying custom values. 642 /// 643 /// [`todo!`]: crate::todo 644 /// 645 /// # Examples 646 /// 647 /// Say we have a trait `Foo`: 648 /// 649 /// ``` 650 /// trait Foo { 651 /// fn bar(&self) -> u8; 652 /// fn baz(&self); 653 /// fn qux(&self) -> Result<u64, ()>; 654 /// } 655 /// ``` 656 /// 657 /// We want to implement `Foo` for 'MyStruct', but for some reason it only makes sense 658 /// to implement the `bar()` function. `baz()` and `qux()` will still need to be defined 659 /// in our implementation of `Foo`, but we can use `unimplemented!` in their definitions 660 /// to allow our code to compile. 661 /// 662 /// We still want to have our program stop running if the unimplemented methods are 663 /// reached. 664 /// 665 /// ``` 666 /// # trait Foo { 667 /// # fn bar(&self) -> u8; 668 /// # fn baz(&self); 669 /// # fn qux(&self) -> Result<u64, ()>; 670 /// # } 671 /// struct MyStruct; 672 /// 673 /// impl Foo for MyStruct { 674 /// fn bar(&self) -> u8 { 675 /// 1 + 1 676 /// } 677 /// 678 /// fn baz(&self) { 679 /// // It makes no sense to `baz` a `MyStruct`, so we have no logic here 680 /// // at all. 681 /// // This will display "thread 'main' panicked at 'not implemented'". 682 /// unimplemented!(); 683 /// } 684 /// 685 /// fn qux(&self) -> Result<u64, ()> { 686 /// // We have some logic here, 687 /// // We can add a message to unimplemented! to display our omission. 688 /// // This will display: 689 /// // "thread 'main' panicked at 'not implemented: MyStruct isn't quxable'". 690 /// unimplemented!("MyStruct isn't quxable"); 691 /// } 692 /// } 693 /// 694 /// fn main() { 695 /// let s = MyStruct; 696 /// s.bar(); 697 /// } 698 /// ``` 699 #[macro_export] 700 #[stable(feature = "rust1", since = "1.0.0")] 701 #[cfg_attr(not(test), rustc_diagnostic_item = "unimplemented_macro")] 702 #[allow_internal_unstable(core_panic)] 703 macro_rules! unimplemented { 704 () => { 705 $crate::panicking::panic("not implemented") 706 }; 707 ($($arg:tt)+) => { 708 $crate::panic!("not implemented: {}", $crate::format_args!($($arg)+)) 709 }; 710 } 711 712 /// Indicates unfinished code. 713 /// 714 /// This can be useful if you are prototyping and just 715 /// want a placeholder to let your code pass type analysis. 716 /// 717 /// The difference between [`unimplemented!`] and `todo!` is that while `todo!` conveys 718 /// an intent of implementing the functionality later and the message is "not yet 719 /// implemented", `unimplemented!` makes no such claims. Its message is "not implemented". 720 /// Also some IDEs will mark `todo!`s. 721 /// 722 /// # Panics 723 /// 724 /// This will always [`panic!`]. 725 /// 726 /// # Examples 727 /// 728 /// Here's an example of some in-progress code. We have a trait `Foo`: 729 /// 730 /// ``` 731 /// trait Foo { 732 /// fn bar(&self); 733 /// fn baz(&self); 734 /// } 735 /// ``` 736 /// 737 /// We want to implement `Foo` on one of our types, but we also want to work on 738 /// just `bar()` first. In order for our code to compile, we need to implement 739 /// `baz()`, so we can use `todo!`: 740 /// 741 /// ``` 742 /// # trait Foo { 743 /// # fn bar(&self); 744 /// # fn baz(&self); 745 /// # } 746 /// struct MyStruct; 747 /// 748 /// impl Foo for MyStruct { 749 /// fn bar(&self) { 750 /// // implementation goes here 751 /// } 752 /// 753 /// fn baz(&self) { 754 /// // let's not worry about implementing baz() for now 755 /// todo!(); 756 /// } 757 /// } 758 /// 759 /// fn main() { 760 /// let s = MyStruct; 761 /// s.bar(); 762 /// 763 /// // we aren't even using baz(), so this is fine. 764 /// } 765 /// ``` 766 #[macro_export] 767 #[stable(feature = "todo_macro", since = "1.40.0")] 768 #[cfg_attr(not(test), rustc_diagnostic_item = "todo_macro")] 769 #[allow_internal_unstable(core_panic)] 770 macro_rules! todo { 771 () => { 772 $crate::panicking::panic("not yet implemented") 773 }; 774 ($($arg:tt)+) => { 775 $crate::panic!("not yet implemented: {}", $crate::format_args!($($arg)+)) 776 }; 777 } 778 779 /// Definitions of built-in macros. 780 /// 781 /// Most of the macro properties (stability, visibility, etc.) are taken from the source code here, 782 /// with exception of expansion functions transforming macro inputs into outputs, 783 /// those functions are provided by the compiler. 784 pub(crate) mod builtin { 785 786 /// Causes compilation to fail with the given error message when encountered. 787 /// 788 /// This macro should be used when a crate uses a conditional compilation strategy to provide 789 /// better error messages for erroneous conditions. It's the compiler-level form of [`panic!`], 790 /// but emits an error during *compilation* rather than at *runtime*. 791 /// 792 /// # Examples 793 /// 794 /// Two such examples are macros and `#[cfg]` environments. 795 /// 796 /// Emit a better compiler error if a macro is passed invalid values. Without the final branch, 797 /// the compiler would still emit an error, but the error's message would not mention the two 798 /// valid values. 799 /// 800 /// ```compile_fail 801 /// macro_rules! give_me_foo_or_bar { 802 /// (foo) => {}; 803 /// (bar) => {}; 804 /// ($x:ident) => { 805 /// compile_error!("This macro only accepts `foo` or `bar`"); 806 /// } 807 /// } 808 /// 809 /// give_me_foo_or_bar!(neither); 810 /// // ^ will fail at compile time with message "This macro only accepts `foo` or `bar`" 811 /// ``` 812 /// 813 /// Emit a compiler error if one of a number of features isn't available. 814 /// 815 /// ```compile_fail 816 /// #[cfg(not(any(feature = "foo", feature = "bar")))] 817 /// compile_error!("Either feature \"foo\" or \"bar\" must be enabled for this crate."); 818 /// ``` 819 #[stable(feature = "compile_error_macro", since = "1.20.0")] 820 #[rustc_builtin_macro] 821 #[macro_export] 822 macro_rules! compile_error { 823 ($msg:expr $(,)?) => {{ /* compiler built-in */ }}; 824 } 825 826 /// Constructs parameters for the other string-formatting macros. 827 /// 828 /// This macro functions by taking a formatting string literal containing 829 /// `{}` for each additional argument passed. `format_args!` prepares the 830 /// additional parameters to ensure the output can be interpreted as a string 831 /// and canonicalizes the arguments into a single type. Any value that implements 832 /// the [`Display`] trait can be passed to `format_args!`, as can any 833 /// [`Debug`] implementation be passed to a `{:?}` within the formatting string. 834 /// 835 /// This macro produces a value of type [`fmt::Arguments`]. This value can be 836 /// passed to the macros within [`std::fmt`] for performing useful redirection. 837 /// All other formatting macros ([`format!`], [`write!`], [`println!`], etc) are 838 /// proxied through this one. `format_args!`, unlike its derived macros, avoids 839 /// heap allocations. 840 /// 841 /// You can use the [`fmt::Arguments`] value that `format_args!` returns 842 /// in `Debug` and `Display` contexts as seen below. The example also shows 843 /// that `Debug` and `Display` format to the same thing: the interpolated 844 /// format string in `format_args!`. 845 /// 846 /// ```rust 847 /// let debug = format!("{:?}", format_args!("{} foo {:?}", 1, 2)); 848 /// let display = format!("{}", format_args!("{} foo {:?}", 1, 2)); 849 /// assert_eq!("1 foo 2", display); 850 /// assert_eq!(display, debug); 851 /// ``` 852 /// 853 /// For more information, see the documentation in [`std::fmt`]. 854 /// 855 /// [`Display`]: crate::fmt::Display 856 /// [`Debug`]: crate::fmt::Debug 857 /// [`fmt::Arguments`]: crate::fmt::Arguments 858 /// [`std::fmt`]: ../std/fmt/index.html 859 /// [`format!`]: ../std/macro.format.html 860 /// [`println!`]: ../std/macro.println.html 861 /// 862 /// # Examples 863 /// 864 /// ``` 865 /// use std::fmt; 866 /// 867 /// let s = fmt::format(format_args!("hello {}", "world")); 868 /// assert_eq!(s, format!("hello {}", "world")); 869 /// ``` 870 #[stable(feature = "rust1", since = "1.0.0")] 871 #[cfg_attr(not(test), rustc_diagnostic_item = "format_args_macro")] 872 #[allow_internal_unsafe] 873 #[allow_internal_unstable(fmt_internals)] 874 #[rustc_builtin_macro] 875 #[macro_export] 876 macro_rules! format_args { 877 ($fmt:expr) => {{ /* compiler built-in */ }}; 878 ($fmt:expr, $($args:tt)*) => {{ /* compiler built-in */ }}; 879 } 880 881 /// Same as [`format_args`], but can be used in some const contexts. 882 /// 883 /// This macro is used by the panic macros for the `const_panic` feature. 884 /// 885 /// This macro will be removed once `format_args` is allowed in const contexts. 886 #[unstable(feature = "const_format_args", issue = "none")] 887 #[allow_internal_unstable(fmt_internals, const_fmt_arguments_new)] 888 #[rustc_builtin_macro] 889 #[macro_export] 890 macro_rules! const_format_args { 891 ($fmt:expr) => {{ /* compiler built-in */ }}; 892 ($fmt:expr, $($args:tt)*) => {{ /* compiler built-in */ }}; 893 } 894 895 /// Same as [`format_args`], but adds a newline in the end. 896 #[unstable( 897 feature = "format_args_nl", 898 issue = "none", 899 reason = "`format_args_nl` is only for internal \ 900 language use and is subject to change" 901 )] 902 #[allow_internal_unstable(fmt_internals)] 903 #[rustc_builtin_macro] 904 #[macro_export] 905 macro_rules! format_args_nl { 906 ($fmt:expr) => {{ /* compiler built-in */ }}; 907 ($fmt:expr, $($args:tt)*) => {{ /* compiler built-in */ }}; 908 } 909 910 /// Inspects an environment variable at compile time. 911 /// 912 /// This macro will expand to the value of the named environment variable at 913 /// compile time, yielding an expression of type `&'static str`. Use 914 /// [`std::env::var`] instead if you want to read the value at runtime. 915 /// 916 /// [`std::env::var`]: ../std/env/fn.var.html 917 /// 918 /// If the environment variable is not defined, then a compilation error 919 /// will be emitted. To not emit a compile error, use the [`option_env!`] 920 /// macro instead. 921 /// 922 /// # Examples 923 /// 924 /// ``` 925 /// let path: &'static str = env!("PATH"); 926 /// println!("the $PATH variable at the time of compiling was: {path}"); 927 /// ``` 928 /// 929 /// You can customize the error message by passing a string as the second 930 /// parameter: 931 /// 932 /// ```compile_fail 933 /// let doc: &'static str = env!("documentation", "what's that?!"); 934 /// ``` 935 /// 936 /// If the `documentation` environment variable is not defined, you'll get 937 /// the following error: 938 /// 939 /// ```text 940 /// error: what's that?! 941 /// ``` 942 #[stable(feature = "rust1", since = "1.0.0")] 943 #[rustc_builtin_macro] 944 #[macro_export] 945 macro_rules! env { 946 ($name:expr $(,)?) => {{ /* compiler built-in */ }}; 947 ($name:expr, $error_msg:expr $(,)?) => {{ /* compiler built-in */ }}; 948 } 949 950 /// Optionally inspects an environment variable at compile time. 951 /// 952 /// If the named environment variable is present at compile time, this will 953 /// expand into an expression of type `Option<&'static str>` whose value is 954 /// `Some` of the value of the environment variable. If the environment 955 /// variable is not present, then this will expand to `None`. See 956 /// [`Option<T>`][Option] for more information on this type. Use 957 /// [`std::env::var`] instead if you want to read the value at runtime. 958 /// 959 /// [`std::env::var`]: ../std/env/fn.var.html 960 /// 961 /// A compile time error is never emitted when using this macro regardless 962 /// of whether the environment variable is present or not. 963 /// To emit a compile error if the environment variable is not present, 964 /// use the [`env!`] macro instead. 965 /// 966 /// # Examples 967 /// 968 /// ``` 969 /// let key: Option<&'static str> = option_env!("SECRET_KEY"); 970 /// println!("the secret key might be: {key:?}"); 971 /// ``` 972 #[stable(feature = "rust1", since = "1.0.0")] 973 #[rustc_builtin_macro] 974 #[macro_export] 975 macro_rules! option_env { 976 ($name:expr $(,)?) => {{ /* compiler built-in */ }}; 977 } 978 979 /// Concatenates identifiers into one identifier. 980 /// 981 /// This macro takes any number of comma-separated identifiers, and 982 /// concatenates them all into one, yielding an expression which is a new 983 /// identifier. Note that hygiene makes it such that this macro cannot 984 /// capture local variables. Also, as a general rule, macros are only 985 /// allowed in item, statement or expression position. That means while 986 /// you may use this macro for referring to existing variables, functions or 987 /// modules etc, you cannot define a new one with it. 988 /// 989 /// # Examples 990 /// 991 /// ``` 992 /// #![feature(concat_idents)] 993 /// 994 /// # fn main() { 995 /// fn foobar() -> u32 { 23 } 996 /// 997 /// let f = concat_idents!(foo, bar); 998 /// println!("{}", f()); 999 /// 1000 /// // fn concat_idents!(new, fun, name) { } // not usable in this way! 1001 /// # } 1002 /// ``` 1003 #[unstable( 1004 feature = "concat_idents", 1005 issue = "29599", 1006 reason = "`concat_idents` is not stable enough for use and is subject to change" 1007 )] 1008 #[rustc_builtin_macro] 1009 #[macro_export] 1010 macro_rules! concat_idents { 1011 ($($e:ident),+ $(,)?) => {{ /* compiler built-in */ }}; 1012 } 1013 1014 /// Concatenates literals into a byte slice. 1015 /// 1016 /// This macro takes any number of comma-separated literals, and concatenates them all into 1017 /// one, yielding an expression of type `&[u8; _]`, which represents all of the literals 1018 /// concatenated left-to-right. The literals passed can be any combination of: 1019 /// 1020 /// - byte literals (`b'r'`) 1021 /// - byte strings (`b"Rust"`) 1022 /// - arrays of bytes/numbers (`[b'A', 66, b'C']`) 1023 /// 1024 /// # Examples 1025 /// 1026 /// ``` 1027 /// #![feature(concat_bytes)] 1028 /// 1029 /// # fn main() { 1030 /// let s: &[u8; 6] = concat_bytes!(b'A', b"BC", [68, b'E', 70]); 1031 /// assert_eq!(s, b"ABCDEF"); 1032 /// # } 1033 /// ``` 1034 #[unstable(feature = "concat_bytes", issue = "87555")] 1035 #[rustc_builtin_macro] 1036 #[macro_export] 1037 macro_rules! concat_bytes { 1038 ($($e:literal),+ $(,)?) => {{ /* compiler built-in */ }}; 1039 } 1040 1041 /// Concatenates literals into a static string slice. 1042 /// 1043 /// This macro takes any number of comma-separated literals, yielding an 1044 /// expression of type `&'static str` which represents all of the literals 1045 /// concatenated left-to-right. 1046 /// 1047 /// Integer and floating point literals are stringified in order to be 1048 /// concatenated. 1049 /// 1050 /// # Examples 1051 /// 1052 /// ``` 1053 /// let s = concat!("test", 10, 'b', true); 1054 /// assert_eq!(s, "test10btrue"); 1055 /// ``` 1056 #[stable(feature = "rust1", since = "1.0.0")] 1057 #[rustc_builtin_macro] 1058 #[macro_export] 1059 macro_rules! concat { 1060 ($($e:expr),* $(,)?) => {{ /* compiler built-in */ }}; 1061 } 1062 1063 /// Expands to the line number on which it was invoked. 1064 /// 1065 /// With [`column!`] and [`file!`], these macros provide debugging information for 1066 /// developers about the location within the source. 1067 /// 1068 /// The expanded expression has type `u32` and is 1-based, so the first line 1069 /// in each file evaluates to 1, the second to 2, etc. This is consistent 1070 /// with error messages by common compilers or popular editors. 1071 /// The returned line is *not necessarily* the line of the `line!` invocation itself, 1072 /// but rather the first macro invocation leading up to the invocation 1073 /// of the `line!` macro. 1074 /// 1075 /// # Examples 1076 /// 1077 /// ``` 1078 /// let current_line = line!(); 1079 /// println!("defined on line: {current_line}"); 1080 /// ``` 1081 #[stable(feature = "rust1", since = "1.0.0")] 1082 #[rustc_builtin_macro] 1083 #[macro_export] 1084 macro_rules! line { 1085 () => { 1086 /* compiler built-in */ 1087 }; 1088 } 1089 1090 /// Expands to the column number at which it was invoked. 1091 /// 1092 /// With [`line!`] and [`file!`], these macros provide debugging information for 1093 /// developers about the location within the source. 1094 /// 1095 /// The expanded expression has type `u32` and is 1-based, so the first column 1096 /// in each line evaluates to 1, the second to 2, etc. This is consistent 1097 /// with error messages by common compilers or popular editors. 1098 /// The returned column is *not necessarily* the line of the `column!` invocation itself, 1099 /// but rather the first macro invocation leading up to the invocation 1100 /// of the `column!` macro. 1101 /// 1102 /// # Examples 1103 /// 1104 /// ``` 1105 /// let current_col = column!(); 1106 /// println!("defined on column: {current_col}"); 1107 /// ``` 1108 /// 1109 /// `column!` counts Unicode code points, not bytes or graphemes. As a result, the first two 1110 /// invocations return the same value, but the third does not. 1111 /// 1112 /// ``` 1113 /// let a = ("foobar", column!()).1; 1114 /// let b = ("人之初性本善", column!()).1; 1115 /// let c = ("f̅o̅o̅b̅a̅r̅", column!()).1; // Uses combining overline (U+0305) 1116 /// 1117 /// assert_eq!(a, b); 1118 /// assert_ne!(b, c); 1119 /// ``` 1120 #[stable(feature = "rust1", since = "1.0.0")] 1121 #[rustc_builtin_macro] 1122 #[macro_export] 1123 macro_rules! column { 1124 () => { 1125 /* compiler built-in */ 1126 }; 1127 } 1128 1129 /// Expands to the file name in which it was invoked. 1130 /// 1131 /// With [`line!`] and [`column!`], these macros provide debugging information for 1132 /// developers about the location within the source. 1133 /// 1134 /// The expanded expression has type `&'static str`, and the returned file 1135 /// is not the invocation of the `file!` macro itself, but rather the 1136 /// first macro invocation leading up to the invocation of the `file!` 1137 /// macro. 1138 /// 1139 /// # Examples 1140 /// 1141 /// ``` 1142 /// let this_file = file!(); 1143 /// println!("defined in file: {this_file}"); 1144 /// ``` 1145 #[stable(feature = "rust1", since = "1.0.0")] 1146 #[rustc_builtin_macro] 1147 #[macro_export] 1148 macro_rules! file { 1149 () => { 1150 /* compiler built-in */ 1151 }; 1152 } 1153 1154 /// Stringifies its arguments. 1155 /// 1156 /// This macro will yield an expression of type `&'static str` which is the 1157 /// stringification of all the tokens passed to the macro. No restrictions 1158 /// are placed on the syntax of the macro invocation itself. 1159 /// 1160 /// Note that the expanded results of the input tokens may change in the 1161 /// future. You should be careful if you rely on the output. 1162 /// 1163 /// # Examples 1164 /// 1165 /// ``` 1166 /// let one_plus_one = stringify!(1 + 1); 1167 /// assert_eq!(one_plus_one, "1 + 1"); 1168 /// ``` 1169 #[stable(feature = "rust1", since = "1.0.0")] 1170 #[rustc_builtin_macro] 1171 #[macro_export] 1172 macro_rules! stringify { 1173 ($($t:tt)*) => { 1174 /* compiler built-in */ 1175 }; 1176 } 1177 1178 /// Includes a UTF-8 encoded file as a string. 1179 /// 1180 /// The file is located relative to the current file (similarly to how 1181 /// modules are found). The provided path is interpreted in a platform-specific 1182 /// way at compile time. So, for instance, an invocation with a Windows path 1183 /// containing backslashes `\` would not compile correctly on Unix. 1184 /// 1185 /// This macro will yield an expression of type `&'static str` which is the 1186 /// contents of the file. 1187 /// 1188 /// # Examples 1189 /// 1190 /// Assume there are two files in the same directory with the following 1191 /// contents: 1192 /// 1193 /// File 'spanish.in': 1194 /// 1195 /// ```text 1196 /// adiós 1197 /// ``` 1198 /// 1199 /// File 'main.rs': 1200 /// 1201 /// ```ignore (cannot-doctest-external-file-dependency) 1202 /// fn main() { 1203 /// let my_str = include_str!("spanish.in"); 1204 /// assert_eq!(my_str, "adiós\n"); 1205 /// print!("{my_str}"); 1206 /// } 1207 /// ``` 1208 /// 1209 /// Compiling 'main.rs' and running the resulting binary will print "adiós". 1210 #[stable(feature = "rust1", since = "1.0.0")] 1211 #[rustc_builtin_macro] 1212 #[macro_export] 1213 #[cfg_attr(not(test), rustc_diagnostic_item = "include_str_macro")] 1214 macro_rules! include_str { 1215 ($file:expr $(,)?) => {{ /* compiler built-in */ }}; 1216 } 1217 1218 /// Includes a file as a reference to a byte array. 1219 /// 1220 /// The file is located relative to the current file (similarly to how 1221 /// modules are found). The provided path is interpreted in a platform-specific 1222 /// way at compile time. So, for instance, an invocation with a Windows path 1223 /// containing backslashes `\` would not compile correctly on Unix. 1224 /// 1225 /// This macro will yield an expression of type `&'static [u8; N]` which is 1226 /// the contents of the file. 1227 /// 1228 /// # Examples 1229 /// 1230 /// Assume there are two files in the same directory with the following 1231 /// contents: 1232 /// 1233 /// File 'spanish.in': 1234 /// 1235 /// ```text 1236 /// adiós 1237 /// ``` 1238 /// 1239 /// File 'main.rs': 1240 /// 1241 /// ```ignore (cannot-doctest-external-file-dependency) 1242 /// fn main() { 1243 /// let bytes = include_bytes!("spanish.in"); 1244 /// assert_eq!(bytes, b"adi\xc3\xb3s\n"); 1245 /// print!("{}", String::from_utf8_lossy(bytes)); 1246 /// } 1247 /// ``` 1248 /// 1249 /// Compiling 'main.rs' and running the resulting binary will print "adiós". 1250 #[stable(feature = "rust1", since = "1.0.0")] 1251 #[rustc_builtin_macro] 1252 #[macro_export] 1253 #[cfg_attr(not(test), rustc_diagnostic_item = "include_bytes_macro")] 1254 macro_rules! include_bytes { 1255 ($file:expr $(,)?) => {{ /* compiler built-in */ }}; 1256 } 1257 1258 /// Expands to a string that represents the current module path. 1259 /// 1260 /// The current module path can be thought of as the hierarchy of modules 1261 /// leading back up to the crate root. The first component of the path 1262 /// returned is the name of the crate currently being compiled. 1263 /// 1264 /// # Examples 1265 /// 1266 /// ``` 1267 /// mod test { 1268 /// pub fn foo() { 1269 /// assert!(module_path!().ends_with("test")); 1270 /// } 1271 /// } 1272 /// 1273 /// test::foo(); 1274 /// ``` 1275 #[stable(feature = "rust1", since = "1.0.0")] 1276 #[rustc_builtin_macro] 1277 #[macro_export] 1278 macro_rules! module_path { 1279 () => { 1280 /* compiler built-in */ 1281 }; 1282 } 1283 1284 /// Evaluates boolean combinations of configuration flags at compile-time. 1285 /// 1286 /// In addition to the `#[cfg]` attribute, this macro is provided to allow 1287 /// boolean expression evaluation of configuration flags. This frequently 1288 /// leads to less duplicated code. 1289 /// 1290 /// The syntax given to this macro is the same syntax as the [`cfg`] 1291 /// attribute. 1292 /// 1293 /// `cfg!`, unlike `#[cfg]`, does not remove any code and only evaluates to true or false. For 1294 /// example, all blocks in an if/else expression need to be valid when `cfg!` is used for 1295 /// the condition, regardless of what `cfg!` is evaluating. 1296 /// 1297 /// [`cfg`]: ../reference/conditional-compilation.html#the-cfg-attribute 1298 /// 1299 /// # Examples 1300 /// 1301 /// ``` 1302 /// let my_directory = if cfg!(windows) { 1303 /// "windows-specific-directory" 1304 /// } else { 1305 /// "unix-directory" 1306 /// }; 1307 /// ``` 1308 #[stable(feature = "rust1", since = "1.0.0")] 1309 #[rustc_builtin_macro] 1310 #[macro_export] 1311 macro_rules! cfg { 1312 ($($cfg:tt)*) => { 1313 /* compiler built-in */ 1314 }; 1315 } 1316 1317 /// Parses a file as an expression or an item according to the context. 1318 /// 1319 /// **Warning**: For multi-file Rust projects, the `include!` macro is probably not what you 1320 /// are looking for. Usually, multi-file Rust projects use 1321 /// [modules](https://doc.rust-lang.org/reference/items/modules.html). Multi-file projects and 1322 /// modules are explained in the Rust-by-Example book 1323 /// [here](https://doc.rust-lang.org/rust-by-example/mod/split.html) and the module system is 1324 /// explained in the Rust Book 1325 /// [here](https://doc.rust-lang.org/book/ch07-02-defining-modules-to-control-scope-and-privacy.html). 1326 /// 1327 /// The included file is placed in the surrounding code 1328 /// [unhygienically](https://doc.rust-lang.org/reference/macros-by-example.html#hygiene). If 1329 /// the included file is parsed as an expression and variables or functions share names across 1330 /// both files, it could result in variables or functions being different from what the 1331 /// included file expected. 1332 /// 1333 /// The included file is located relative to the current file (similarly to how modules are 1334 /// found). The provided path is interpreted in a platform-specific way at compile time. So, 1335 /// for instance, an invocation with a Windows path containing backslashes `\` would not 1336 /// compile correctly on Unix. 1337 /// 1338 /// # Uses 1339 /// 1340 /// The `include!` macro is primarily used for two purposes. It is used to include 1341 /// documentation that is written in a separate file and it is used to include [build artifacts 1342 /// usually as a result from the `build.rs` 1343 /// script](https://doc.rust-lang.org/cargo/reference/build-scripts.html#outputs-of-the-build-script). 1344 /// 1345 /// When using the `include` macro to include stretches of documentation, remember that the 1346 /// included file still needs to be a valid rust syntax. It is also possible to 1347 /// use the [`include_str`] macro as `#![doc = include_str!("...")]` (at the module level) or 1348 /// `#[doc = include_str!("...")]` (at the item level) to include documentation from a plain 1349 /// text or markdown file. 1350 /// 1351 /// # Examples 1352 /// 1353 /// Assume there are two files in the same directory with the following contents: 1354 /// 1355 /// File 'monkeys.in': 1356 /// 1357 /// ```ignore (only-for-syntax-highlight) 1358 /// ['', '', ''] 1359 /// .iter() 1360 /// .cycle() 1361 /// .take(6) 1362 /// .collect::<String>() 1363 /// ``` 1364 /// 1365 /// File 'main.rs': 1366 /// 1367 /// ```ignore (cannot-doctest-external-file-dependency) 1368 /// fn main() { 1369 /// let my_string = include!("monkeys.in"); 1370 /// assert_eq!("", my_string); 1371 /// println!("{my_string}"); 1372 /// } 1373 /// ``` 1374 /// 1375 /// Compiling 'main.rs' and running the resulting binary will print 1376 /// "". 1377 #[stable(feature = "rust1", since = "1.0.0")] 1378 #[rustc_builtin_macro] 1379 #[macro_export] 1380 macro_rules! include { 1381 ($file:expr $(,)?) => {{ /* compiler built-in */ }}; 1382 } 1383 1384 /// Asserts that a boolean expression is `true` at runtime. 1385 /// 1386 /// This will invoke the [`panic!`] macro if the provided expression cannot be 1387 /// evaluated to `true` at runtime. 1388 /// 1389 /// # Uses 1390 /// 1391 /// Assertions are always checked in both debug and release builds, and cannot 1392 /// be disabled. See [`debug_assert!`] for assertions that are not enabled in 1393 /// release builds by default. 1394 /// 1395 /// Unsafe code may rely on `assert!` to enforce run-time invariants that, if 1396 /// violated could lead to unsafety. 1397 /// 1398 /// Other use-cases of `assert!` include testing and enforcing run-time 1399 /// invariants in safe code (whose violation cannot result in unsafety). 1400 /// 1401 /// # Custom Messages 1402 /// 1403 /// This macro has a second form, where a custom panic message can 1404 /// be provided with or without arguments for formatting. See [`std::fmt`] 1405 /// for syntax for this form. Expressions used as format arguments will only 1406 /// be evaluated if the assertion fails. 1407 /// 1408 /// [`std::fmt`]: ../std/fmt/index.html 1409 /// 1410 /// # Examples 1411 /// 1412 /// ``` 1413 /// // the panic message for these assertions is the stringified value of the 1414 /// // expression given. 1415 /// assert!(true); 1416 /// 1417 /// fn some_computation() -> bool { true } // a very simple function 1418 /// 1419 /// assert!(some_computation()); 1420 /// 1421 /// // assert with a custom message 1422 /// let x = true; 1423 /// assert!(x, "x wasn't true!"); 1424 /// 1425 /// let a = 3; let b = 27; 1426 /// assert!(a + b == 30, "a = {}, b = {}", a, b); 1427 /// ``` 1428 #[stable(feature = "rust1", since = "1.0.0")] 1429 #[rustc_builtin_macro] 1430 #[macro_export] 1431 #[rustc_diagnostic_item = "assert_macro"] 1432 #[allow_internal_unstable(core_panic, edition_panic, generic_assert_internals)] 1433 macro_rules! assert { 1434 ($cond:expr $(,)?) => {{ /* compiler built-in */ }}; 1435 ($cond:expr, $($arg:tt)+) => {{ /* compiler built-in */ }}; 1436 } 1437 1438 /// Prints passed tokens into the standard output. 1439 #[unstable( 1440 feature = "log_syntax", 1441 issue = "29598", 1442 reason = "`log_syntax!` is not stable enough for use and is subject to change" 1443 )] 1444 #[rustc_builtin_macro] 1445 #[macro_export] 1446 macro_rules! log_syntax { 1447 ($($arg:tt)*) => { 1448 /* compiler built-in */ 1449 }; 1450 } 1451 1452 /// Enables or disables tracing functionality used for debugging other macros. 1453 #[unstable( 1454 feature = "trace_macros", 1455 issue = "29598", 1456 reason = "`trace_macros` is not stable enough for use and is subject to change" 1457 )] 1458 #[rustc_builtin_macro] 1459 #[macro_export] 1460 macro_rules! trace_macros { 1461 (true) => {{ /* compiler built-in */ }}; 1462 (false) => {{ /* compiler built-in */ }}; 1463 } 1464 1465 /// Attribute macro used to apply derive macros. 1466 /// 1467 /// See [the reference] for more info. 1468 /// 1469 /// [the reference]: ../../../reference/attributes/derive.html 1470 #[stable(feature = "rust1", since = "1.0.0")] 1471 #[rustc_builtin_macro] 1472 pub macro derive($item:item) { 1473 /* compiler built-in */ 1474 } 1475 1476 /// Attribute macro used to apply derive macros for implementing traits 1477 /// in a const context. 1478 /// 1479 /// See [the reference] for more info. 1480 /// 1481 /// [the reference]: ../../../reference/attributes/derive.html 1482 #[unstable(feature = "derive_const", issue = "none")] 1483 #[rustc_builtin_macro] 1484 pub macro derive_const($item:item) { 1485 /* compiler built-in */ 1486 } 1487 1488 /// Attribute macro applied to a function to turn it into a unit test. 1489 /// 1490 /// See [the reference] for more info. 1491 /// 1492 /// [the reference]: ../../../reference/attributes/testing.html#the-test-attribute 1493 #[stable(feature = "rust1", since = "1.0.0")] 1494 #[allow_internal_unstable(test, rustc_attrs)] 1495 #[rustc_builtin_macro] 1496 pub macro test($item:item) { 1497 /* compiler built-in */ 1498 } 1499 1500 /// Attribute macro applied to a function to turn it into a benchmark test. 1501 #[unstable( 1502 feature = "test", 1503 issue = "50297", 1504 soft, 1505 reason = "`bench` is a part of custom test frameworks which are unstable" 1506 )] 1507 #[allow_internal_unstable(test, rustc_attrs)] 1508 #[rustc_builtin_macro] 1509 pub macro bench($item:item) { 1510 /* compiler built-in */ 1511 } 1512 1513 /// An implementation detail of the `#[test]` and `#[bench]` macros. 1514 #[unstable( 1515 feature = "custom_test_frameworks", 1516 issue = "50297", 1517 reason = "custom test frameworks are an unstable feature" 1518 )] 1519 #[allow_internal_unstable(test, rustc_attrs)] 1520 #[rustc_builtin_macro] 1521 pub macro test_case($item:item) { 1522 /* compiler built-in */ 1523 } 1524 1525 /// Attribute macro applied to a static to register it as a global allocator. 1526 /// 1527 /// See also [`std::alloc::GlobalAlloc`](../../../std/alloc/trait.GlobalAlloc.html). 1528 #[stable(feature = "global_allocator", since = "1.28.0")] 1529 #[allow_internal_unstable(rustc_attrs)] 1530 #[rustc_builtin_macro] 1531 pub macro global_allocator($item:item) { 1532 /* compiler built-in */ 1533 } 1534 1535 /// Attribute macro applied to a function to register it as a handler for allocation failure. 1536 /// 1537 /// See also [`std::alloc::handle_alloc_error`](../../../std/alloc/fn.handle_alloc_error.html). 1538 #[unstable(feature = "alloc_error_handler", issue = "51540")] 1539 #[allow_internal_unstable(rustc_attrs)] 1540 #[rustc_builtin_macro] 1541 pub macro alloc_error_handler($item:item) { 1542 /* compiler built-in */ 1543 } 1544 1545 /// Keeps the item it's applied to if the passed path is accessible, and removes it otherwise. 1546 #[unstable( 1547 feature = "cfg_accessible", 1548 issue = "64797", 1549 reason = "`cfg_accessible` is not fully implemented" 1550 )] 1551 #[rustc_builtin_macro] 1552 pub macro cfg_accessible($item:item) { 1553 /* compiler built-in */ 1554 } 1555 1556 /// Expands all `#[cfg]` and `#[cfg_attr]` attributes in the code fragment it's applied to. 1557 #[unstable( 1558 feature = "cfg_eval", 1559 issue = "82679", 1560 reason = "`cfg_eval` is a recently implemented feature" 1561 )] 1562 #[rustc_builtin_macro] 1563 pub macro cfg_eval($($tt:tt)*) { 1564 /* compiler built-in */ 1565 } 1566 1567 /// Unstable placeholder for type ascription. 1568 #[rustc_builtin_macro] 1569 #[unstable( 1570 feature = "type_ascription", 1571 issue = "23416", 1572 reason = "placeholder syntax for type ascription" 1573 )] 1574 pub macro type_ascribe($expr:expr, $ty:ty) { 1575 /* compiler built-in */ 1576 } 1577 1578 /// Unstable implementation detail of the `rustc` compiler, do not use. 1579 #[rustc_builtin_macro] 1580 #[stable(feature = "rust1", since = "1.0.0")] 1581 #[allow_internal_unstable(core_intrinsics, libstd_sys_internals, rt)] 1582 #[deprecated(since = "1.52.0", note = "rustc-serialize is deprecated and no longer supported")] 1583 #[doc(hidden)] // While technically stable, using it is unstable, and deprecated. Hide it. 1584 pub macro RustcDecodable($item:item) { 1585 /* compiler built-in */ 1586 } 1587 1588 /// Unstable implementation detail of the `rustc` compiler, do not use. 1589 #[rustc_builtin_macro] 1590 #[stable(feature = "rust1", since = "1.0.0")] 1591 #[allow_internal_unstable(core_intrinsics, rt)] 1592 #[deprecated(since = "1.52.0", note = "rustc-serialize is deprecated and no longer supported")] 1593 #[doc(hidden)] // While technically stable, using it is unstable, and deprecated. Hide it. 1594 pub macro RustcEncodable($item:item) { 1595 /* compiler built-in */ 1596 } 1597 } 1598