#![feature(prelude_import)]
#![no_std]
//@ check-pass
//@ force-host
//@ no-prefer-dynamic
//@ compile-flags: -Z unpretty=expanded
//@ needs-unwind compiling proc macros with panic=abort causes a warning
//@ edition: 2015
//
// This file is not actually used as a proc-macro - instead,
// it's just used to show the output of the `quote!` macro

#![feature(proc_macro_quote)]
#![crate_type = "proc-macro"]
extern crate std;
#[prelude_import]
use ::std::prelude::rust_2015::*;

extern crate proc_macro;

fn main() {
    {
        let mut ts = crate::TokenStream::new();
        crate::ToTokens::to_tokens(&crate::TokenTree::Ident(crate::Ident::new("let",
                        crate::Span::recover_proc_macro_span(0))), &mut ts);
        crate::ToTokens::to_tokens(&crate::TokenTree::Ident(crate::Ident::new("hello",
                        crate::Span::recover_proc_macro_span(1))), &mut ts);
        crate::ToTokens::to_tokens(&crate::TokenTree::Punct(crate::Punct::new('=',
                        crate::Spacing::Alone)), &mut ts);
        crate::ToTokens::to_tokens(&crate::TokenTree::Literal({
                        let mut iter =
                            "\"world\"".parse::<crate::TokenStream>().unwrap().into_iter();
                        if let (Some(crate::TokenTree::Literal(mut lit)), None) =
                                (iter.next(), iter.next()) {
                            lit.set_span(crate::Span::recover_proc_macro_span(2));
                            lit
                        } else {
                            ::core::panicking::panic("internal error: entered unreachable code")
                        }
                    }), &mut ts);
        crate::ToTokens::to_tokens(&crate::TokenTree::Punct(crate::Punct::new(';',
                        crate::Spacing::Alone)), &mut ts);
        crate::ToTokens::to_tokens(&crate::TokenTree::Ident(crate::Ident::new("let",
                        crate::Span::recover_proc_macro_span(3))), &mut ts);
        crate::ToTokens::to_tokens(&crate::TokenTree::Ident(crate::Ident::new_raw("raw_ident",
                        crate::Span::recover_proc_macro_span(4))), &mut ts);
        crate::ToTokens::to_tokens(&crate::TokenTree::Punct(crate::Punct::new('=',
                        crate::Spacing::Alone)), &mut ts);
        crate::ToTokens::to_tokens(&crate::TokenTree::Literal({
                        let mut iter =
                            "r#\"raw\"literal\"#".parse::<crate::TokenStream>().unwrap().into_iter();
                        if let (Some(crate::TokenTree::Literal(mut lit)), None) =
                                (iter.next(), iter.next()) {
                            lit.set_span(crate::Span::recover_proc_macro_span(5));
                            lit
                        } else {
                            ::core::panicking::panic("internal error: entered unreachable code")
                        }
                    }), &mut ts);
        crate::ToTokens::to_tokens(&crate::TokenTree::Punct(crate::Punct::new(';',
                        crate::Spacing::Alone)), &mut ts);
        ts
    }
}
const _: () =
    {
        extern crate proc_macro;
        #[rustc_proc_macro_decls]
        #[used]
        #[allow(deprecated)]
        static _DECLS: &[proc_macro::bridge::client::ProcMacro] = &[];
    };
