| //@ compile-flags: -Zunpretty=expanded -Zunstable-options |
| //@ edition:2024 |
| //@ check-pass |
| |
| #![feature(async_closure)] |
| #![feature(auto_traits)] |
| #![feature(box_patterns)] |
| #![feature(builtin_syntax)] |
| #![feature(concat_idents)] |
| #![feature(const_trait_impl)] |
| #![feature(core_pattern_type)] |
| #![feature(decl_macro)] |
| #![feature(deref_patterns)] |
| #![feature(explicit_tail_calls)] |
| #![feature(gen_blocks)] |
| #![feature(let_chains)] |
| #![feature(more_qualified_paths)] |
| #![feature(never_patterns)] |
| #![feature(never_type)] |
| #![feature(pattern_types)] |
| #![feature(prelude_import)] |
| #![feature(specialization)] |
| #![feature(trace_macros)] |
| #![feature(trait_alias)] |
| #![feature(try_blocks)] |
| #![feature(yeet_expr)] |
| #![allow(incomplete_features)] |
| |
| #[prelude_import] |
| use self::prelude::*; |
| |
| mod prelude { |
| pub use std::prelude::rust_2024::*; |
| |
| pub type T = _; |
| |
| pub trait Trait { |
| const CONST: (); |
| } |
| } |
| |
| mod attributes { |
| //! inner single-line doc comment |
| /*! |
| * inner multi-line doc comment |
| */ |
| #![doc = "inner doc attribute"] |
| #![allow(dead_code, unused_variables)] |
| #![no_std] |
| |
| /// outer single-line doc comment |
| /** |
| * outer multi-line doc comment |
| */ |
| #[doc = "outer doc attribute"] |
| #[doc = concat!("mac", "ro")] |
| #[allow()] |
| #[repr(C)] |
| struct Struct; |
| } |
| |
| mod expressions { |
| /// ExprKind::Array |
| fn expr_array() { |
| []; |
| [true]; |
| [true,]; |
| [true, true]; |
| ["long........................................................................"]; |
| ["long............................................................", true]; |
| } |
| |
| /// ExprKind::ConstBlock |
| fn expr_const_block() { |
| const {}; |
| const { 1 }; |
| const { struct S; }; |
| } |
| |
| /// ExprKind::Call |
| fn expr_call() { |
| let f; |
| f(); |
| f::<u8>(); |
| f::<1>(); |
| f::<'static, u8, 1>(); |
| f(true); |
| f(true,); |
| ()(); |
| } |
| |
| /// ExprKind::MethodCall |
| fn expr_method_call() { |
| let x; |
| x.f(); |
| x.f::<u8>(); |
| x.collect::<Vec<_>>(); |
| } |
| |
| /// ExprKind::Tup |
| fn expr_tup() { |
| (); |
| (true,); |
| (true, false); |
| (true, false,); |
| } |
| |
| /// ExprKind::Binary |
| fn expr_binary() { |
| let (a, b, c, d, x, y); |
| true || false; |
| true || false && false; |
| a < 1 && 2 < b && c > 3 && 4 > d; |
| a & b & !c; |
| a + b * c - d + -1 * -2 - -3; |
| x = !y; |
| } |
| |
| /// ExprKind::Unary |
| fn expr_unary() { |
| let expr; |
| *expr; |
| !expr; |
| -expr; |
| } |
| |
| /// ExprKind::Lit |
| fn expr_lit() { |
| 'x'; |
| 1_000_i8; |
| 1.00000000000000000000001; |
| } |
| |
| /// ExprKind::Cast |
| fn expr_cast() { |
| let expr; |
| expr as T; |
| expr as T<u8>; |
| } |
| |
| /// ExprKind::Type |
| fn expr_type() { |
| let expr; |
| builtin # type_ascribe(expr, T); |
| } |
| |
| /// ExprKind::Let |
| fn expr_let() { |
| let b; |
| if let Some(a) = b {} |
| if let _ = true && false {} |
| if let _ = (true && false) {} |
| } |
| |
| /// ExprKind::If |
| fn expr_if() { |
| if true {} |
| if !true {} |
| if let true = true {} else {} |
| if true {} else if false {} |
| if true {} else if false {} else {} |
| if true { return; } else if false { 0 } else { 0 } |
| } |
| |
| /// ExprKind::While |
| fn expr_while() { |
| while false {} |
| 'a: while false {} |
| while let true = true {} |
| } |
| |
| /// ExprKind::ForLoop |
| fn expr_for_loop() { |
| let x; |
| for _ in x {} |
| 'a: for _ in x {} |
| } |
| |
| /// ExprKind::Loop |
| fn expr_loop() { |
| loop {} |
| 'a: loop {} |
| } |
| |
| /// ExprKind::Match |
| fn expr_match() { |
| let value; |
| match value {} |
| match value { ok => 1 } |
| match value { |
| ok => 1, |
| err => 0, |
| } |
| } |
| |
| /// ExprKind::Closure |
| fn expr_closure() { |
| let value; |
| || {}; |
| |x| {}; |
| |x: u8| {}; |
| || (); |
| move || value; |
| async || value; |
| async move || value; |
| static || value; |
| static move || value; |
| (static async || value); |
| (static async move || value); |
| || -> u8 { value }; |
| 1 + || {}; |
| } |
| |
| /// ExprKind::Block |
| fn expr_block() { |
| {} |
| unsafe {} |
| 'a: {} |
| #[allow()] {} |
| { #![allow()] } |
| } |
| |
| /// ExprKind::Gen |
| fn expr_gen() { |
| async {}; |
| async move {}; |
| gen {}; |
| gen move {}; |
| async gen {}; |
| async gen move {}; |
| } |
| |
| /// ExprKind::Await |
| fn expr_await() { |
| let fut; |
| fut.await; |
| } |
| |
| /// ExprKind::TryBlock |
| fn expr_try_block() { |
| try {} |
| try { return; } |
| } |
| |
| /// ExprKind::Assign |
| fn expr_assign() { |
| let expr; |
| expr = true; |
| } |
| |
| /// ExprKind::AssignOp |
| fn expr_assign_op() { |
| let expr; |
| expr += true; |
| } |
| |
| /// ExprKind::Field |
| fn expr_field() { |
| let expr; |
| expr.field; |
| expr.0; |
| } |
| |
| /// ExprKind::Index |
| fn expr_index() { |
| let expr; |
| expr[true]; |
| } |
| |
| /// ExprKind::Range |
| fn expr_range() { |
| let (lo, hi); |
| ..; |
| ..hi; |
| lo..; |
| lo..hi; |
| lo .. hi; |
| ..=hi; |
| lo..=hi; |
| -2..=-1; |
| } |
| |
| /// ExprKind::Underscore |
| fn expr_underscore() { |
| _; |
| } |
| |
| /// ExprKind::Path |
| fn expr_path() { |
| let x; |
| crate::expressions::expr_path; |
| crate::expressions::expr_path::<'static>; |
| <T as Default>::default; |
| <T as ::core::default::Default>::default::<>; |
| x::(); |
| x::(T, T) -> T; |
| crate::() -> ()::expressions::() -> ()::expr_path; |
| core::()::marker::()::PhantomData; |
| } |
| |
| /// ExprKind::AddrOf |
| fn expr_addr_of() { |
| let expr; |
| &expr; |
| &mut expr; |
| &raw const expr; |
| &raw mut expr; |
| } |
| |
| /// ExprKind::Break |
| fn expr_break() { |
| 'a: { |
| break; |
| break 'a; |
| break true; |
| break 'a true; |
| } |
| } |
| |
| /// ExprKind::Continue |
| fn expr_continue() { |
| 'a: { |
| continue; |
| continue 'a; |
| } |
| } |
| |
| /// ExprKind::Ret |
| fn expr_ret() { |
| return; |
| return true; |
| } |
| |
| /// ExprKind::InlineAsm |
| fn expr_inline_asm() { |
| let x; |
| core::arch::asm!( |
| "mov {tmp}, {x}", |
| "shl {tmp}, 1", |
| "shl {x}, 2", |
| "add {x}, {tmp}", |
| x = inout(reg) x, |
| tmp = out(reg) _, |
| ); |
| } |
| |
| /// ExprKind::OffsetOf |
| fn expr_offset_of() { |
| core::mem::offset_of!(T, field); |
| } |
| |
| /// ExprKind::MacCall |
| fn expr_mac_call() { |
| stringify!(...); |
| stringify![...]; |
| stringify! { ... }; |
| } |
| |
| /// ExprKind::Struct |
| fn expr_struct() { |
| struct Struct {} |
| let (x, base); |
| Struct {}; |
| <Struct as ToOwned>::Owned {}; |
| Struct { .. }; |
| Struct { .. base }; |
| Struct { x }; |
| Struct { x, ..base }; |
| Struct { x: true }; |
| Struct { x: true, .. }; |
| Struct { x: true, ..base }; |
| Struct { 0: true, ..base }; |
| } |
| |
| /// ExprKind::Repeat |
| fn expr_repeat() { |
| [(); 0]; |
| } |
| |
| /// ExprKind::Paren |
| fn expr_paren() { |
| let expr; |
| (expr); |
| } |
| |
| /// ExprKind::Try |
| fn expr_try() { |
| let expr; |
| expr?; |
| } |
| |
| /// ExprKind::Yield |
| fn expr_yield() { |
| yield; |
| yield true; |
| } |
| |
| /// ExprKind::Yeet |
| fn expr_yeet() { |
| do yeet; |
| do yeet 0; |
| } |
| |
| /// ExprKind::Become |
| fn expr_become() { |
| become true; |
| } |
| |
| /// ExprKind::IncludedBytes |
| fn expr_include_bytes() { |
| include_bytes!("auxiliary/data.txt"); |
| } |
| |
| /// ExprKind::FormatArgs |
| fn expr_format_args() { |
| let expr; |
| format_args!(""); |
| format_args!("{}", expr); |
| } |
| } |
| |
| mod items { |
| /// ItemKind::ExternCrate |
| mod item_extern_crate { |
| extern crate core; |
| extern crate self as unpretty; |
| pub extern crate core as _; |
| } |
| |
| /// ItemKind::Use |
| mod item_use { |
| use crate::{expressions, items::item_use}; |
| pub use core::*; |
| } |
| |
| /// ItemKind::Static |
| mod item_static { |
| pub static A: () = {}; |
| static mut B: () = {}; |
| } |
| |
| /// ItemKind::Const |
| mod item_const { |
| pub const A: () = {}; |
| |
| trait TraitItems { |
| const B: (); |
| const C: () = {}; |
| } |
| } |
| |
| /// ItemKind::Fn |
| mod item_fn { |
| pub const unsafe extern "C" fn f() {} |
| pub async unsafe extern fn g() {} |
| fn h<'a, T>() where T: 'a {} |
| |
| trait TraitItems { |
| unsafe extern fn f(); |
| } |
| |
| impl TraitItems for _ { |
| default unsafe extern fn f() {} |
| } |
| } |
| |
| /// ItemKind::Mod |
| mod item_mod { |
| // ... |
| } |
| |
| /// ItemKind::ForeignMod |
| mod item_foreign_mod { |
| unsafe extern "C++" {} |
| unsafe extern {} |
| } |
| |
| /// ItemKind::GlobalAsm |
| mod item_global_asm { |
| core::arch::global_asm!(".globl my_asm_func"); |
| } |
| |
| /// ItemKind::TyAlias |
| mod item_ty_alias { |
| pub type Type<'a> where T: 'a, = T; |
| } |
| |
| /// ItemKind::Enum |
| mod item_enum { |
| pub enum Void {} |
| enum Empty { |
| Unit, |
| Tuple(), |
| Struct {}, |
| } |
| enum Generic<'a, T> |
| where |
| T: 'a, |
| { |
| Tuple(T), |
| Struct { t: T }, |
| } |
| } |
| |
| /// ItemKind::Struct |
| mod item_struct { |
| pub struct Unit; |
| struct Tuple(); |
| struct Newtype(Unit); |
| struct Struct {} |
| struct Generic<'a, T> |
| where |
| T: 'a, |
| { |
| t: T, |
| } |
| } |
| |
| /// ItemKind::Union |
| mod item_union { |
| union Generic<'a, T> |
| where |
| T: 'a, |
| { |
| t: T, |
| } |
| } |
| |
| /// ItemKind::Trait |
| mod item_trait { |
| pub unsafe auto trait Send {} |
| trait Trait<'a>: Sized |
| where |
| Self: 'a, |
| { |
| } |
| } |
| |
| /// ItemKind::TraitAlias |
| mod item_trait_alias { |
| pub trait Trait<T> = Sized where for<'a> T: 'a; |
| } |
| |
| /// ItemKind::Impl |
| mod item_impl { |
| impl () {} |
| impl<T> () {} |
| impl Default for () {} |
| impl<T> const Default for () {} |
| } |
| |
| /// ItemKind::MacCall |
| mod item_mac_call { |
| trace_macros!(false); |
| trace_macros![false]; |
| trace_macros! { false } |
| } |
| |
| /// ItemKind::MacroDef |
| mod item_macro_def { |
| macro_rules! mac { () => {...}; } |
| pub macro stringify() {} |
| } |
| |
| /// ItemKind::Delegation |
| mod item_delegation { |
| /*! FIXME: todo */ |
| } |
| |
| /// ItemKind::DelegationMac |
| mod item_delegation_mac { |
| /*! FIXME: todo */ |
| } |
| } |
| |
| mod patterns { |
| /// PatKind::Wild |
| fn pat_wild() { |
| let _; |
| } |
| |
| /// PatKind::Ident |
| fn pat_ident() { |
| let x; |
| let ref x; |
| let mut x; |
| let ref mut x; |
| let ref mut x @ _; |
| } |
| |
| /// PatKind::Struct |
| fn pat_struct() { |
| let T {}; |
| let T::<T> {}; |
| let T::<'static> {}; |
| let T { x }; |
| let T { x: _x }; |
| let T { .. }; |
| let T { x, .. }; |
| let T { x: _x, .. }; |
| let T { 0: _x, .. }; |
| let <T as ToOwned>::Owned {}; |
| } |
| |
| /// PatKind::TupleStruct |
| fn pat_tuple_struct() { |
| struct Tuple(); |
| let Tuple(); |
| let Tuple::<T>(); |
| let Tuple::<'static>(); |
| let Tuple(x); |
| let Tuple(..); |
| let Tuple(x, ..); |
| } |
| |
| /// PatKind::Or |
| fn pat_or() { |
| let (true | false); |
| let (| true); |
| let (|true| false); |
| } |
| |
| /// PatKind::Path |
| fn pat_path() { |
| let core::marker::PhantomData; |
| let core::marker::PhantomData::<T>; |
| let core::marker::PhantomData::<'static>; |
| let <T as Trait>::CONST; |
| } |
| |
| /// PatKind::Tuple |
| fn pat_tuple() { |
| let (); |
| let (true,); |
| let (true, false); |
| } |
| |
| /// PatKind::Box |
| fn pat_box() { |
| let box pat; |
| } |
| |
| /// PatKind::Deref |
| fn pat_deref() { |
| let deref!(pat); |
| } |
| |
| /// PatKind::Ref |
| fn pat_ref() { |
| let &pat; |
| let &mut pat; |
| } |
| |
| /// PatKind::Lit |
| fn pat_lit() { |
| let 1_000_i8; |
| let -""; |
| } |
| |
| /// PatKind::Range |
| fn pat_range() { |
| let ..1; |
| let 0..; |
| let 0..1; |
| let 0..=1; |
| let -2..=-1; |
| } |
| |
| /// PatKind::Slice |
| fn pat_slice() { |
| let []; |
| let [true]; |
| let [true,]; |
| let [true, false]; |
| } |
| |
| /// PatKind::Rest |
| fn pat_rest() { |
| let ..; |
| } |
| |
| /// PatKind::Never |
| fn pat_never() { |
| let !; |
| let Some(!); |
| } |
| |
| /// PatKind::Paren |
| fn pat_paren() { |
| let (pat); |
| } |
| |
| /// PatKind::MacCall |
| fn pat_mac_call() { |
| let stringify!(); |
| let stringify![]; |
| let stringify! {}; |
| } |
| } |
| |
| mod statements { |
| /// StmtKind::Let |
| fn stmt_let() { |
| let _; |
| let _ = true; |
| let _: T = true; |
| let _ = true else { return; }; |
| } |
| |
| /// StmtKind::Item |
| fn stmt_item() { |
| struct Struct {} |
| struct Unit; |
| } |
| |
| /// StmtKind::Expr |
| fn stmt_expr() { |
| () |
| } |
| |
| /// StmtKind::Semi |
| fn stmt_semi() { |
| 1 + 1; |
| } |
| |
| /// StmtKind::Empty |
| fn stmt_empty() { |
| ; |
| } |
| |
| /// StmtKind::MacCall |
| fn stmt_mac_call() { |
| stringify!(...); |
| stringify![...]; |
| stringify! { ... }; |
| } |
| } |
| |
| mod types { |
| /// TyKind::Slice |
| fn ty_slice() { |
| let _: [T]; |
| } |
| |
| /// TyKind::Array |
| fn ty_array() { |
| let _: [T; 0]; |
| } |
| |
| /// TyKind::Ptr |
| fn ty_ptr() { |
| let _: *const T; |
| let _: *mut T; |
| } |
| |
| /// TyKind::Ref |
| fn ty_ref() { |
| let _: &T; |
| let _: &mut T; |
| let _: &'static T; |
| let _: &'static mut [T]; |
| let _: &T<T<T<T<T>>>>; |
| let _: &T<T<T<T<T> > > >; |
| } |
| |
| /// TyKind::BareFn |
| fn ty_bare_fn() { |
| let _: fn(); |
| let _: fn() -> (); |
| let _: fn(T); |
| let _: fn(t: T); |
| let _: for<> fn(); |
| let _: for<'a> fn(); |
| } |
| |
| /// TyKind::Never |
| fn ty_never() { |
| let _: !; |
| } |
| |
| /// TyKind::Tup |
| fn ty_tup() { |
| let _: (); |
| let _: (T,); |
| let _: (T, T); |
| } |
| |
| /// TyKind::Path |
| fn ty_path() { |
| let _: T; |
| let _: T<'static>; |
| let _: T<T>; |
| let _: T::<T>; |
| let _: T() -> !; |
| let _: <T as ToOwned>::Owned; |
| } |
| |
| /// TyKind::TraitObject |
| fn ty_trait_object() { |
| let _: dyn Send; |
| let _: dyn Send + 'static; |
| let _: dyn 'static + Send; |
| let _: dyn for<'a> Send; |
| } |
| |
| /// TyKind::ImplTrait |
| const fn ty_impl_trait() { |
| let _: impl Send; |
| let _: impl Send + 'static; |
| let _: impl 'static + Send; |
| let _: impl ?Sized; |
| let _: impl ~const Clone; |
| let _: impl for<'a> Send; |
| } |
| |
| /// TyKind::Paren |
| fn ty_paren() { |
| let _: (T); |
| } |
| |
| /// TyKind::Typeof |
| fn ty_typeof() { |
| /*! unused for now */ |
| } |
| |
| /// TyKind::Infer |
| fn ty_infer() { |
| let _: _; |
| } |
| |
| /// TyKind::ImplicitSelf |
| fn ty_implicit_self() { |
| /*! there is no syntax for this */ |
| } |
| |
| /// TyKind::MacCall |
| fn ty_mac_call() { |
| let _: concat_idents!(T); |
| let _: concat_idents![T]; |
| let _: concat_idents! { T }; |
| } |
| |
| /// TyKind::CVarArgs |
| fn ty_c_var_args() { |
| /*! FIXME: todo */ |
| } |
| |
| /// TyKind::Pat |
| fn ty_pat() { |
| let _: core::pattern_type!(u32 is 1..); |
| } |
| } |
| |
| mod visibilities { |
| /// VisibilityKind::Public |
| mod visibility_public { |
| pub struct Pub; |
| } |
| |
| /// VisibilityKind::Restricted |
| mod visibility_restricted { |
| pub(crate) struct PubCrate; |
| pub(self) struct PubSelf; |
| pub(super) struct PubSuper; |
| pub(in crate) struct PubInCrate; |
| pub(in self) struct PubInSelf; |
| pub(in super) struct PubInSuper; |
| pub(in crate::visibilities) struct PubInCrateVisibilities; |
| pub(in self::super) struct PubInSelfSuper; |
| pub(in super::visibility_restricted) struct PubInSuperMod; |
| } |
| } |