summaryrefslogtreecommitdiffstats
path: root/tests/ui/consts/const-extern-fn
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/consts/const-extern-fn')
-rw-r--r--tests/ui/consts/const-extern-fn/const-extern-fn-call-extern-fn.rs23
-rw-r--r--tests/ui/consts/const-extern-fn/const-extern-fn-call-extern-fn.stderr19
-rw-r--r--tests/ui/consts/const-extern-fn/const-extern-fn-min-const-fn.rs11
-rw-r--r--tests/ui/consts/const-extern-fn/const-extern-fn-min-const-fn.stderr21
-rw-r--r--tests/ui/consts/const-extern-fn/const-extern-fn-requires-unsafe.mir.stderr19
-rw-r--r--tests/ui/consts/const-extern-fn/const-extern-fn-requires-unsafe.rs14
-rw-r--r--tests/ui/consts/const-extern-fn/const-extern-fn-requires-unsafe.thir.stderr11
-rw-r--r--tests/ui/consts/const-extern-fn/const-extern-fn.rs35
-rw-r--r--tests/ui/consts/const-extern-fn/feature-gate-const_extern_fn.rs13
-rw-r--r--tests/ui/consts/const-extern-fn/feature-gate-const_extern_fn.stderr21
-rw-r--r--tests/ui/consts/const-extern-fn/issue-68062-const-extern-fns-dont-need-fn-specifier-2.rs7
-rw-r--r--tests/ui/consts/const-extern-fn/issue-68062-const-extern-fns-dont-need-fn-specifier-2.stderr8
-rw-r--r--tests/ui/consts/const-extern-fn/issue-68062-const-extern-fns-dont-need-fn-specifier.rs7
-rw-r--r--tests/ui/consts/const-extern-fn/issue-68062-const-extern-fns-dont-need-fn-specifier.stderr8
14 files changed, 217 insertions, 0 deletions
diff --git a/tests/ui/consts/const-extern-fn/const-extern-fn-call-extern-fn.rs b/tests/ui/consts/const-extern-fn/const-extern-fn-call-extern-fn.rs
new file mode 100644
index 000000000..eccda49db
--- /dev/null
+++ b/tests/ui/consts/const-extern-fn/const-extern-fn-call-extern-fn.rs
@@ -0,0 +1,23 @@
+#![feature(const_extern_fn)]
+
+extern "C" {
+ fn regular_in_block();
+}
+
+const extern "C" fn bar() {
+ unsafe {
+ regular_in_block();
+ //~^ ERROR: cannot call non-const fn
+ }
+}
+
+extern "C" fn regular() {}
+
+const extern "C" fn foo() {
+ unsafe {
+ regular();
+ //~^ ERROR: cannot call non-const fn
+ }
+}
+
+fn main() {}
diff --git a/tests/ui/consts/const-extern-fn/const-extern-fn-call-extern-fn.stderr b/tests/ui/consts/const-extern-fn/const-extern-fn-call-extern-fn.stderr
new file mode 100644
index 000000000..5acf22e4b
--- /dev/null
+++ b/tests/ui/consts/const-extern-fn/const-extern-fn-call-extern-fn.stderr
@@ -0,0 +1,19 @@
+error[E0015]: cannot call non-const fn `regular_in_block` in constant functions
+ --> $DIR/const-extern-fn-call-extern-fn.rs:9:9
+ |
+LL | regular_in_block();
+ | ^^^^^^^^^^^^^^^^^^
+ |
+ = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
+
+error[E0015]: cannot call non-const fn `regular` in constant functions
+ --> $DIR/const-extern-fn-call-extern-fn.rs:18:9
+ |
+LL | regular();
+ | ^^^^^^^^^
+ |
+ = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0015`.
diff --git a/tests/ui/consts/const-extern-fn/const-extern-fn-min-const-fn.rs b/tests/ui/consts/const-extern-fn/const-extern-fn-min-const-fn.rs
new file mode 100644
index 000000000..c7078e46f
--- /dev/null
+++ b/tests/ui/consts/const-extern-fn/const-extern-fn-min-const-fn.rs
@@ -0,0 +1,11 @@
+#![feature(const_extern_fn)]
+
+const extern "C" fn unsize(x: &[u8; 3]) -> &[u8] { x }
+const unsafe extern "C" fn closure() -> fn() { || {} }
+const unsafe extern "C" fn use_float() { 1.0 + 1.0; }
+//~^ ERROR floating point arithmetic
+const extern "C" fn ptr_cast(val: *const u8) { val as usize; }
+//~^ ERROR pointers cannot be cast to integers
+
+
+fn main() {}
diff --git a/tests/ui/consts/const-extern-fn/const-extern-fn-min-const-fn.stderr b/tests/ui/consts/const-extern-fn/const-extern-fn-min-const-fn.stderr
new file mode 100644
index 000000000..4bab466fb
--- /dev/null
+++ b/tests/ui/consts/const-extern-fn/const-extern-fn-min-const-fn.stderr
@@ -0,0 +1,21 @@
+error[E0658]: floating point arithmetic is not allowed in constant functions
+ --> $DIR/const-extern-fn-min-const-fn.rs:5:42
+ |
+LL | const unsafe extern "C" fn use_float() { 1.0 + 1.0; }
+ | ^^^^^^^^^
+ |
+ = note: see issue #57241 <https://github.com/rust-lang/rust/issues/57241> for more information
+ = help: add `#![feature(const_fn_floating_point_arithmetic)]` to the crate attributes to enable
+
+error: pointers cannot be cast to integers during const eval
+ --> $DIR/const-extern-fn-min-const-fn.rs:7:48
+ |
+LL | const extern "C" fn ptr_cast(val: *const u8) { val as usize; }
+ | ^^^^^^^^^^^^
+ |
+ = note: at compile-time, pointers do not have an integer value
+ = note: avoiding this restriction via `transmute`, `union`, or raw pointers leads to compile-time undefined behavior
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0658`.
diff --git a/tests/ui/consts/const-extern-fn/const-extern-fn-requires-unsafe.mir.stderr b/tests/ui/consts/const-extern-fn/const-extern-fn-requires-unsafe.mir.stderr
new file mode 100644
index 000000000..34ec8aadb
--- /dev/null
+++ b/tests/ui/consts/const-extern-fn/const-extern-fn-requires-unsafe.mir.stderr
@@ -0,0 +1,19 @@
+error[E0133]: call to unsafe function is unsafe and requires unsafe function or block
+ --> $DIR/const-extern-fn-requires-unsafe.rs:12:5
+ |
+LL | foo();
+ | ^^^^^ call to unsafe function
+ |
+ = note: consult the function's documentation for information on how to avoid undefined behavior
+
+error[E0133]: call to unsafe function is unsafe and requires unsafe function or block
+ --> $DIR/const-extern-fn-requires-unsafe.rs:9:17
+ |
+LL | let a: [u8; foo()];
+ | ^^^^^ call to unsafe function
+ |
+ = note: consult the function's documentation for information on how to avoid undefined behavior
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0133`.
diff --git a/tests/ui/consts/const-extern-fn/const-extern-fn-requires-unsafe.rs b/tests/ui/consts/const-extern-fn/const-extern-fn-requires-unsafe.rs
new file mode 100644
index 000000000..afe645ae8
--- /dev/null
+++ b/tests/ui/consts/const-extern-fn/const-extern-fn-requires-unsafe.rs
@@ -0,0 +1,14 @@
+// revisions: mir thir
+// [thir]compile-flags: -Z thir-unsafeck
+
+#![feature(const_extern_fn)]
+
+const unsafe extern "C" fn foo() -> usize { 5 }
+
+fn main() {
+ let a: [u8; foo()];
+ //[mir]~^ call to unsafe function is unsafe and requires unsafe function or block
+ //[thir]~^^ call to unsafe function `foo` is unsafe and requires unsafe function or block
+ foo();
+ //[mir]~^ ERROR call to unsafe function is unsafe and requires unsafe function or block
+}
diff --git a/tests/ui/consts/const-extern-fn/const-extern-fn-requires-unsafe.thir.stderr b/tests/ui/consts/const-extern-fn/const-extern-fn-requires-unsafe.thir.stderr
new file mode 100644
index 000000000..b313f0653
--- /dev/null
+++ b/tests/ui/consts/const-extern-fn/const-extern-fn-requires-unsafe.thir.stderr
@@ -0,0 +1,11 @@
+error[E0133]: call to unsafe function `foo` is unsafe and requires unsafe function or block
+ --> $DIR/const-extern-fn-requires-unsafe.rs:9:17
+ |
+LL | let a: [u8; foo()];
+ | ^^^^^ call to unsafe function
+ |
+ = note: consult the function's documentation for information on how to avoid undefined behavior
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0133`.
diff --git a/tests/ui/consts/const-extern-fn/const-extern-fn.rs b/tests/ui/consts/const-extern-fn/const-extern-fn.rs
new file mode 100644
index 000000000..2ce2eafd5
--- /dev/null
+++ b/tests/ui/consts/const-extern-fn/const-extern-fn.rs
@@ -0,0 +1,35 @@
+// run-pass
+#![feature(const_extern_fn)]
+
+const extern "C" fn foo1(val: u8) -> u8 {
+ val + 1
+}
+
+const extern "C" fn foo2(val: u8) -> u8 {
+ val + 1
+}
+
+const unsafe extern "C" fn bar1(val: bool) -> bool {
+ !val
+}
+
+const unsafe extern "C" fn bar2(val: bool) -> bool {
+ !val
+}
+
+
+fn main() {
+ let a: [u8; foo1(25) as usize] = [0; 26];
+ let b: [u8; foo2(25) as usize] = [0; 26];
+ assert_eq!(a, b);
+
+ let bar1_res = unsafe { bar1(false) };
+ let bar2_res = unsafe { bar2(false) };
+ assert!(bar1_res);
+ assert_eq!(bar1_res, bar2_res);
+
+ let _foo1_cast: extern "C" fn(u8) -> u8 = foo1;
+ let _foo2_cast: extern "C" fn(u8) -> u8 = foo2;
+ let _bar1_cast: unsafe extern "C" fn(bool) -> bool = bar1;
+ let _bar2_cast: unsafe extern "C" fn(bool) -> bool = bar2;
+}
diff --git a/tests/ui/consts/const-extern-fn/feature-gate-const_extern_fn.rs b/tests/ui/consts/const-extern-fn/feature-gate-const_extern_fn.rs
new file mode 100644
index 000000000..f7bed91b0
--- /dev/null
+++ b/tests/ui/consts/const-extern-fn/feature-gate-const_extern_fn.rs
@@ -0,0 +1,13 @@
+// Check that `const extern fn` and `const unsafe extern fn` are feature-gated
+// for certain ABIs.
+
+const extern fn foo1() {}
+const extern "C" fn foo2() {}
+const extern "Rust" fn foo3() {}
+const extern "cdecl" fn foo4() {} //~ ERROR `cdecl` as a `const fn` ABI is unstable
+const unsafe extern fn bar1() {}
+const unsafe extern "C" fn bar2() {}
+const unsafe extern "Rust" fn bar3() {}
+const unsafe extern "cdecl" fn bar4() {} //~ ERROR `cdecl` as a `const fn` ABI is unstable
+
+fn main() {}
diff --git a/tests/ui/consts/const-extern-fn/feature-gate-const_extern_fn.stderr b/tests/ui/consts/const-extern-fn/feature-gate-const_extern_fn.stderr
new file mode 100644
index 000000000..f8c3107bd
--- /dev/null
+++ b/tests/ui/consts/const-extern-fn/feature-gate-const_extern_fn.stderr
@@ -0,0 +1,21 @@
+error[E0658]: `cdecl` as a `const fn` ABI is unstable
+ --> $DIR/feature-gate-const_extern_fn.rs:7:14
+ |
+LL | const extern "cdecl" fn foo4() {}
+ | ^^^^^^^
+ |
+ = note: see issue #64926 <https://github.com/rust-lang/rust/issues/64926> for more information
+ = help: add `#![feature(const_extern_fn)]` to the crate attributes to enable
+
+error[E0658]: `cdecl` as a `const fn` ABI is unstable
+ --> $DIR/feature-gate-const_extern_fn.rs:11:21
+ |
+LL | const unsafe extern "cdecl" fn bar4() {}
+ | ^^^^^^^
+ |
+ = note: see issue #64926 <https://github.com/rust-lang/rust/issues/64926> for more information
+ = help: add `#![feature(const_extern_fn)]` to the crate attributes to enable
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0658`.
diff --git a/tests/ui/consts/const-extern-fn/issue-68062-const-extern-fns-dont-need-fn-specifier-2.rs b/tests/ui/consts/const-extern-fn/issue-68062-const-extern-fns-dont-need-fn-specifier-2.rs
new file mode 100644
index 000000000..7ced24808
--- /dev/null
+++ b/tests/ui/consts/const-extern-fn/issue-68062-const-extern-fns-dont-need-fn-specifier-2.rs
@@ -0,0 +1,7 @@
+fn main() {}
+
+#[cfg(FALSE)]
+fn container() {
+ const unsafe WhereIsFerris Now() {}
+ //~^ ERROR expected one of `extern` or `fn`
+}
diff --git a/tests/ui/consts/const-extern-fn/issue-68062-const-extern-fns-dont-need-fn-specifier-2.stderr b/tests/ui/consts/const-extern-fn/issue-68062-const-extern-fns-dont-need-fn-specifier-2.stderr
new file mode 100644
index 000000000..5ec9e2a91
--- /dev/null
+++ b/tests/ui/consts/const-extern-fn/issue-68062-const-extern-fns-dont-need-fn-specifier-2.stderr
@@ -0,0 +1,8 @@
+error: expected one of `extern` or `fn`, found `WhereIsFerris`
+ --> $DIR/issue-68062-const-extern-fns-dont-need-fn-specifier-2.rs:5:18
+ |
+LL | const unsafe WhereIsFerris Now() {}
+ | ^^^^^^^^^^^^^ expected one of `extern` or `fn`
+
+error: aborting due to previous error
+
diff --git a/tests/ui/consts/const-extern-fn/issue-68062-const-extern-fns-dont-need-fn-specifier.rs b/tests/ui/consts/const-extern-fn/issue-68062-const-extern-fns-dont-need-fn-specifier.rs
new file mode 100644
index 000000000..6f575d055
--- /dev/null
+++ b/tests/ui/consts/const-extern-fn/issue-68062-const-extern-fns-dont-need-fn-specifier.rs
@@ -0,0 +1,7 @@
+fn main() {}
+
+#[cfg(FALSE)]
+fn container() {
+ const extern "Rust" PUT_ANYTHING_YOU_WANT_HERE bug() -> usize { 1 }
+ //~^ ERROR expected `fn`
+}
diff --git a/tests/ui/consts/const-extern-fn/issue-68062-const-extern-fns-dont-need-fn-specifier.stderr b/tests/ui/consts/const-extern-fn/issue-68062-const-extern-fns-dont-need-fn-specifier.stderr
new file mode 100644
index 000000000..ec415ec9d
--- /dev/null
+++ b/tests/ui/consts/const-extern-fn/issue-68062-const-extern-fns-dont-need-fn-specifier.stderr
@@ -0,0 +1,8 @@
+error: expected `fn`, found `PUT_ANYTHING_YOU_WANT_HERE`
+ --> $DIR/issue-68062-const-extern-fns-dont-need-fn-specifier.rs:5:25
+ |
+LL | const extern "Rust" PUT_ANYTHING_YOU_WANT_HERE bug() -> usize { 1 }
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `fn`
+
+error: aborting due to previous error
+