about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/test/codegen/ffi-const.rs12
-rw-r--r--src/test/codegen/ffi-pure.rs12
-rw-r--r--src/test/ui/feature-gates/feature-gate-ffi_const.rs6
-rw-r--r--src/test/ui/feature-gates/feature-gate-ffi_const.stderr12
-rw-r--r--src/test/ui/feature-gates/feature-gate-ffi_pure.rs6
-rw-r--r--src/test/ui/feature-gates/feature-gate-ffi_pure.stderr12
-rw-r--r--src/test/ui/ffi_const.rs5
-rw-r--r--src/test/ui/ffi_const.stderr8
-rw-r--r--src/test/ui/ffi_const2.rs11
-rw-r--r--src/test/ui/ffi_const2.stderr8
-rw-r--r--src/test/ui/ffi_pure.rs5
-rw-r--r--src/test/ui/ffi_pure.stderr8
12 files changed, 105 insertions, 0 deletions
diff --git a/src/test/codegen/ffi-const.rs b/src/test/codegen/ffi-const.rs
new file mode 100644
index 00000000000..440d022a12c
--- /dev/null
+++ b/src/test/codegen/ffi-const.rs
@@ -0,0 +1,12 @@
+// compile-flags: -C no-prepopulate-passes
+#![crate_type = "lib"]
+#![feature(ffi_const)]
+
+pub fn bar() { unsafe { foo() } }
+
+extern {
+    // CHECK-LABEL: declare void @foo()
+    // CHECK-SAME: [[ATTRS:#[0-9]+]]
+    // CHECK-DAG: attributes [[ATTRS]] = { {{.*}}readnone{{.*}} }
+    #[ffi_const] pub fn foo();
+}
diff --git a/src/test/codegen/ffi-pure.rs b/src/test/codegen/ffi-pure.rs
new file mode 100644
index 00000000000..f0ebc1caa09
--- /dev/null
+++ b/src/test/codegen/ffi-pure.rs
@@ -0,0 +1,12 @@
+// compile-flags: -C no-prepopulate-passes
+#![crate_type = "lib"]
+#![feature(ffi_pure)]
+
+pub fn bar() { unsafe { foo() } }
+
+extern {
+    // CHECK-LABEL: declare void @foo()
+    // CHECK-SAME: [[ATTRS:#[0-9]+]]
+    // CHECK-DAG: attributes [[ATTRS]] = { {{.*}}readonly{{.*}} }
+    #[ffi_pure] pub fn foo();
+}
diff --git a/src/test/ui/feature-gates/feature-gate-ffi_const.rs b/src/test/ui/feature-gates/feature-gate-ffi_const.rs
new file mode 100644
index 00000000000..27323b1b602
--- /dev/null
+++ b/src/test/ui/feature-gates/feature-gate-ffi_const.rs
@@ -0,0 +1,6 @@
+#![crate_type = "lib"]
+
+extern {
+    #[ffi_const] //~ ERROR the `#[ffi_const]` attribute is an experimental feature
+    pub fn foo();
+}
diff --git a/src/test/ui/feature-gates/feature-gate-ffi_const.stderr b/src/test/ui/feature-gates/feature-gate-ffi_const.stderr
new file mode 100644
index 00000000000..bed6a2ce488
--- /dev/null
+++ b/src/test/ui/feature-gates/feature-gate-ffi_const.stderr
@@ -0,0 +1,12 @@
+error[E0658]: the `#[ffi_const]` attribute is an experimental feature
+  --> $DIR/feature-gate-ffi_const.rs:4:5
+   |
+LL |     #[ffi_const]
+   |     ^^^^^^^^^^^^
+   |
+   = note: see issue #58328 <https://github.com/rust-lang/rust/issues/58328> for more information
+   = help: add `#![feature(ffi_const)]` to the crate attributes to enable
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0658`.
diff --git a/src/test/ui/feature-gates/feature-gate-ffi_pure.rs b/src/test/ui/feature-gates/feature-gate-ffi_pure.rs
new file mode 100644
index 00000000000..e24a686853c
--- /dev/null
+++ b/src/test/ui/feature-gates/feature-gate-ffi_pure.rs
@@ -0,0 +1,6 @@
+#![crate_type = "lib"]
+
+extern {
+    #[ffi_pure] //~ ERROR the `#[ffi_pure]` attribute is an experimental feature
+    pub fn foo();
+}
diff --git a/src/test/ui/feature-gates/feature-gate-ffi_pure.stderr b/src/test/ui/feature-gates/feature-gate-ffi_pure.stderr
new file mode 100644
index 00000000000..2b0308fd661
--- /dev/null
+++ b/src/test/ui/feature-gates/feature-gate-ffi_pure.stderr
@@ -0,0 +1,12 @@
+error[E0658]: the `#[ffi_pure]` attribute is an experimental feature
+  --> $DIR/feature-gate-ffi_pure.rs:4:5
+   |
+LL |     #[ffi_pure]
+   |     ^^^^^^^^^^^
+   |
+   = note: see issue #58329 <https://github.com/rust-lang/rust/issues/58329> for more information
+   = help: add `#![feature(ffi_pure)]` to the crate attributes to enable
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0658`.
diff --git a/src/test/ui/ffi_const.rs b/src/test/ui/ffi_const.rs
new file mode 100644
index 00000000000..7aeb5a49a1b
--- /dev/null
+++ b/src/test/ui/ffi_const.rs
@@ -0,0 +1,5 @@
+#![feature(ffi_const)]
+#![crate_type = "lib"]
+
+#[ffi_const] //~ ERROR `#[ffi_const]` may only be used on foreign functions
+pub fn foo() {}
diff --git a/src/test/ui/ffi_const.stderr b/src/test/ui/ffi_const.stderr
new file mode 100644
index 00000000000..623551cc07b
--- /dev/null
+++ b/src/test/ui/ffi_const.stderr
@@ -0,0 +1,8 @@
+error[E0756]: `#[ffi_const]` may only be used on foreign functions
+  --> $DIR/ffi_const.rs:4:1
+   |
+LL | #[ffi_const]
+   | ^^^^^^^^^^^^
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/ffi_const2.rs b/src/test/ui/ffi_const2.rs
new file mode 100644
index 00000000000..4bd9637f083
--- /dev/null
+++ b/src/test/ui/ffi_const2.rs
@@ -0,0 +1,11 @@
+#![feature(ffi_const, ffi_pure)]
+
+extern {
+    #[ffi_pure] //~ ERROR `#[ffi_const]` function cannot be `#[ffi_pure]`
+    #[ffi_const]
+    pub fn baz();
+}
+
+fn main() {
+    unsafe { baz() };
+}
diff --git a/src/test/ui/ffi_const2.stderr b/src/test/ui/ffi_const2.stderr
new file mode 100644
index 00000000000..0b401942c47
--- /dev/null
+++ b/src/test/ui/ffi_const2.stderr
@@ -0,0 +1,8 @@
+error[E0757]: `#[ffi_const]` function cannot be `#[ffi_pure]`
+  --> $DIR/ffi_const2.rs:4:5
+   |
+LL |     #[ffi_pure]
+   |     ^^^^^^^^^^^
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/ffi_pure.rs b/src/test/ui/ffi_pure.rs
new file mode 100644
index 00000000000..c37d34c8784
--- /dev/null
+++ b/src/test/ui/ffi_pure.rs
@@ -0,0 +1,5 @@
+#![feature(ffi_pure)]
+#![crate_type = "lib"]
+
+#[ffi_pure] //~ ERROR `#[ffi_pure]` may only be used on foreign functions
+pub fn foo() {}
diff --git a/src/test/ui/ffi_pure.stderr b/src/test/ui/ffi_pure.stderr
new file mode 100644
index 00000000000..3a849c0bca7
--- /dev/null
+++ b/src/test/ui/ffi_pure.stderr
@@ -0,0 +1,8 @@
+error[E0755]: `#[ffi_pure]` may only be used on foreign functions
+  --> $DIR/ffi_pure.rs:4:1
+   |
+LL | #[ffi_pure]
+   | ^^^^^^^^^^^
+
+error: aborting due to previous error
+