summaryrefslogtreecommitdiffstats
path: root/tests/incremental/auxiliary/issue-54059.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/incremental/auxiliary/issue-54059.rs')
-rw-r--r--tests/incremental/auxiliary/issue-54059.rs50
1 files changed, 50 insertions, 0 deletions
diff --git a/tests/incremental/auxiliary/issue-54059.rs b/tests/incremental/auxiliary/issue-54059.rs
new file mode 100644
index 000000000..fa2814a77
--- /dev/null
+++ b/tests/incremental/auxiliary/issue-54059.rs
@@ -0,0 +1,50 @@
+// force-host
+// no-prefer-dynamic
+
+// check that having extern "C" functions in a proc macro doesn't crash.
+
+#![crate_type="proc-macro"]
+#![allow(non_snake_case)]
+
+extern crate proc_macro;
+
+macro_rules! proc_macro_tokenstream {
+ () => {
+ ::proc_macro::TokenStream
+ };
+}
+
+macro_rules! proc_macro_expr_impl {
+ ($(
+ $( #[$attr:meta] )*
+ pub fn $func:ident($input:ident: &str) -> String $body:block
+ )+) => {
+ $(
+ // Parses an input that looks like:
+ //
+ // ```
+ // #[allow(unused)]
+ // enum ProcMacroHack {
+ // Input = (stringify!(ARGS), 0).1,
+ // }
+ // ```
+ $( #[$attr] )*
+ #[proc_macro_derive($func)]
+ pub fn $func(input: proc_macro_tokenstream!()) -> proc_macro_tokenstream!() {
+ unsafe { rust_dbg_extern_identity_u64(0); }
+ panic!()
+ }
+ )+
+ };
+}
+
+proc_macro_expr_impl! {
+ pub fn base2_impl(input: &str) -> String {
+ panic!()
+ }
+}
+
+#[link(name="rust_test_helpers")]
+extern "C" {
+ pub fn rust_dbg_extern_identity_u64(v: u64) -> u64;
+}