From: Philipp Gesang <[email protected]>
gcc/testsuite/ChangeLog:
* rust/compile/func-qualifier-order.rs: New test file
* rust/compile/func-qualifier-default.rs: New test file
Signed-off-by: Philipp Gesang <[email protected]>
---
.../rust/compile/func-qualifier-default.rs | 18 +++++++++
.../rust/compile/func-qualifier-order.rs | 39 +++++++++++++++++++
2 files changed, 57 insertions(+)
create mode 100644 gcc/testsuite/rust/compile/func-qualifier-default.rs
create mode 100644 gcc/testsuite/rust/compile/func-qualifier-order.rs
diff --git a/gcc/testsuite/rust/compile/func-qualifier-default.rs
b/gcc/testsuite/rust/compile/func-qualifier-default.rs
new file mode 100644
index 00000000000..e2e600c4ba3
--- /dev/null
+++ b/gcc/testsuite/rust/compile/func-qualifier-default.rs
@@ -0,0 +1,18 @@
+#![feature(specialization)]
+#![feature(no_core)]
+#![no_core]
+
+trait Trait {
+ fn unqualified_fn();
+ unsafe fn unsafe_fn();
+}
+
+impl<T> Trait for T {
+ default fn unqualified_fn() {}
+
+ // `default` precedes all other qualifiers
+ unsafe default fn unsafe_fn() {}
+ // { dg-error "expecting .fn. but .identifier. found" "" { target *-*-* }
.-1 }
+ // { dg-error "expecting ... but .fn. found" "" { target *-*-* } .-2 }
+ // { dg-error "failed to parse trait impl item in trait impl" "" { target
*-*-* } .-3 }
+}
diff --git a/gcc/testsuite/rust/compile/func-qualifier-order.rs
b/gcc/testsuite/rust/compile/func-qualifier-order.rs
new file mode 100644
index 00000000000..f26bc27678b
--- /dev/null
+++ b/gcc/testsuite/rust/compile/func-qualifier-order.rs
@@ -0,0 +1,39 @@
+// { dg-additional-options "-frust-edition=2018" }
+#![allow(unused)]
+#![allow(incomplete_features)]
+
+#![feature(no_core)]
+#![no_core]
+
+mod valid {
+ pub fn unqualified_fn() {}
+
+ const fn const_fn() {}
+
+ pub async fn async_fn() {}
+
+ pub unsafe fn unsafe_fn() {}
+
+ async unsafe fn async_unsafe_fn() {}
+
+ unsafe extern "C" fn unsafe_extern_fn() {}
+
+ async unsafe extern "C" fn async_unsafe_extern_fn() {}
+
+ const unsafe extern "C" fn const_unsafe_extern_fn() {}
+
+ /*
+ // `safe` is not implemented yet
+ unsafe extern "C" {
+ safe fn const_safe_extern_fn();
+ }
+ */
+}
+
+mod invalid {
+ // `async` precedes `unsafe`
+ unsafe async fn async_unsafe_fn() {}
+ // { dg-error "unexpected token .async. in some sort of unsafe production"
"" { target *-*-* } .-1 }
+ // { dg-error "failed to parse item in module" "" { target *-*-* } .-2 }
+}
+
--
2.50.1