]> git.lizzy.rs Git - rust.git/commitdiff
Add tests for `#[ffi_const]` and `#[ffi_pure]` function attributes
authorMatthias Schiffer <mschiffer@universe-factory.net>
Mon, 13 Apr 2020 22:21:19 +0000 (00:21 +0200)
committerMatthias Schiffer <mschiffer@universe-factory.net>
Tue, 19 May 2020 23:16:11 +0000 (01:16 +0200)
Based on the work of gnzlbg <gonzalobg88@gmail.com>.

12 files changed:
src/test/codegen/ffi-const.rs [new file with mode: 0644]
src/test/codegen/ffi-pure.rs [new file with mode: 0644]
src/test/ui/feature-gates/feature-gate-ffi_const.rs [new file with mode: 0644]
src/test/ui/feature-gates/feature-gate-ffi_const.stderr [new file with mode: 0644]
src/test/ui/feature-gates/feature-gate-ffi_pure.rs [new file with mode: 0644]
src/test/ui/feature-gates/feature-gate-ffi_pure.stderr [new file with mode: 0644]
src/test/ui/ffi_const.rs [new file with mode: 0644]
src/test/ui/ffi_const.stderr [new file with mode: 0644]
src/test/ui/ffi_const2.rs [new file with mode: 0644]
src/test/ui/ffi_const2.stderr [new file with mode: 0644]
src/test/ui/ffi_pure.rs [new file with mode: 0644]
src/test/ui/ffi_pure.stderr [new file with mode: 0644]

diff --git a/src/test/codegen/ffi-const.rs b/src/test/codegen/ffi-const.rs
new file mode 100644 (file)
index 0000000..440d022
--- /dev/null
@@ -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 (file)
index 0000000..f0ebc1c
--- /dev/null
@@ -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 (file)
index 0000000..27323b1
--- /dev/null
@@ -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 (file)
index 0000000..bed6a2c
--- /dev/null
@@ -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 (file)
index 0000000..e24a686
--- /dev/null
@@ -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 (file)
index 0000000..2b0308f
--- /dev/null
@@ -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 (file)
index 0000000..7aeb5a4
--- /dev/null
@@ -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 (file)
index 0000000..623551c
--- /dev/null
@@ -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 (file)
index 0000000..4bd9637
--- /dev/null
@@ -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 (file)
index 0000000..0b40194
--- /dev/null
@@ -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 (file)
index 0000000..c37d34c
--- /dev/null
@@ -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 (file)
index 0000000..3a849c0
--- /dev/null
@@ -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
+