about summary refs log tree commit diff
path: root/tests/ui/link-native-libs
diff options
context:
space:
mode:
authorZalathar <Zalathar@users.noreply.github.com>2024-12-07 12:35:30 +1100
committerZalathar <Zalathar@users.noreply.github.com>2024-12-07 13:18:05 +1100
commit0a48b96859d3d66138082ffad6a1057b54cd55c7 (patch)
tree288a97704a5b6b9089eb13eb887868943285f91d /tests/ui/link-native-libs
parentf884f18151d63ac9ce7e573cadb165ecbe8d7f9b (diff)
downloadrust-0a48b96859d3d66138082ffad6a1057b54cd55c7.tar.gz
rust-0a48b96859d3d66138082ffad6a1057b54cd55c7.zip
Move more tests into `tests/ui/link-native-libs`
Diffstat (limited to 'tests/ui/link-native-libs')
-rw-r--r--tests/ui/link-native-libs/auxiliary/link-cfg-works-transitive-dylib.rs4
-rw-r--r--tests/ui/link-native-libs/auxiliary/link-cfg-works-transitive-rlib.rs7
-rw-r--r--tests/ui/link-native-libs/issue-109144.rs4
-rw-r--r--tests/ui/link-native-libs/issue-109144.stderr9
-rw-r--r--tests/ui/link-native-libs/issue-43925.rs4
-rw-r--r--tests/ui/link-native-libs/issue-43925.stderr8
-rw-r--r--tests/ui/link-native-libs/issue-43926.rs4
-rw-r--r--tests/ui/link-native-libs/issue-43926.stderr8
-rw-r--r--tests/ui/link-native-libs/issue-70093/issue-70093-link-directives.rs10
-rw-r--r--tests/ui/link-native-libs/issue-70093/issue-70093.rs10
-rw-r--r--tests/ui/link-native-libs/kind-framework.rs7
-rw-r--r--tests/ui/link-native-libs/kind-framework.stderr9
-rw-r--r--tests/ui/link-native-libs/link-attr-validation-early.rs8
-rw-r--r--tests/ui/link-native-libs/link-attr-validation-early.stderr21
-rw-r--r--tests/ui/link-native-libs/link-attr-validation-late.rs39
-rw-r--r--tests/ui/link-native-libs/link-attr-validation-late.stderr147
-rw-r--r--tests/ui/link-native-libs/link-cfg-works.rs13
-rw-r--r--tests/ui/link-native-libs/uikit-framework.rs25
18 files changed, 337 insertions, 0 deletions
diff --git a/tests/ui/link-native-libs/auxiliary/link-cfg-works-transitive-dylib.rs b/tests/ui/link-native-libs/auxiliary/link-cfg-works-transitive-dylib.rs
new file mode 100644
index 00000000000..0d927117d81
--- /dev/null
+++ b/tests/ui/link-native-libs/auxiliary/link-cfg-works-transitive-dylib.rs
@@ -0,0 +1,4 @@
+#![feature(link_cfg)]
+
+#[link(name = "foo", cfg(foo))]
+extern "C" {}
diff --git a/tests/ui/link-native-libs/auxiliary/link-cfg-works-transitive-rlib.rs b/tests/ui/link-native-libs/auxiliary/link-cfg-works-transitive-rlib.rs
new file mode 100644
index 00000000000..49a46b202e4
--- /dev/null
+++ b/tests/ui/link-native-libs/auxiliary/link-cfg-works-transitive-rlib.rs
@@ -0,0 +1,7 @@
+//@ no-prefer-dynamic
+
+#![feature(link_cfg)]
+#![crate_type = "rlib"]
+
+#[link(name = "foo", cfg(foo))]
+extern "C" {}
diff --git a/tests/ui/link-native-libs/issue-109144.rs b/tests/ui/link-native-libs/issue-109144.rs
new file mode 100644
index 00000000000..2f740e55389
--- /dev/null
+++ b/tests/ui/link-native-libs/issue-109144.rs
@@ -0,0 +1,4 @@
+#![crate_type = "lib"]
+#[link(kind = "static", modifiers = "+whole-archive,+bundle")]
+//~^ ERROR `#[link]` attribute requires a `name = "string"` argument
+extern  {}
diff --git a/tests/ui/link-native-libs/issue-109144.stderr b/tests/ui/link-native-libs/issue-109144.stderr
new file mode 100644
index 00000000000..0748d94189c
--- /dev/null
+++ b/tests/ui/link-native-libs/issue-109144.stderr
@@ -0,0 +1,9 @@
+error[E0459]: `#[link]` attribute requires a `name = "string"` argument
+  --> $DIR/issue-109144.rs:2:1
+   |
+LL | #[link(kind = "static", modifiers = "+whole-archive,+bundle")]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `name` argument
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0459`.
diff --git a/tests/ui/link-native-libs/issue-43925.rs b/tests/ui/link-native-libs/issue-43925.rs
new file mode 100644
index 00000000000..1a210887154
--- /dev/null
+++ b/tests/ui/link-native-libs/issue-43925.rs
@@ -0,0 +1,4 @@
+#[link(name = "foo", cfg("rlib"))] //~ ERROR link cfg must have a single predicate argument
+extern "C" {}
+
+fn main() {}
diff --git a/tests/ui/link-native-libs/issue-43925.stderr b/tests/ui/link-native-libs/issue-43925.stderr
new file mode 100644
index 00000000000..7cc347c6163
--- /dev/null
+++ b/tests/ui/link-native-libs/issue-43925.stderr
@@ -0,0 +1,8 @@
+error: link cfg must have a single predicate argument
+  --> $DIR/issue-43925.rs:1:22
+   |
+LL | #[link(name = "foo", cfg("rlib"))]
+   |                      ^^^^^^^^^^^
+
+error: aborting due to 1 previous error
+
diff --git a/tests/ui/link-native-libs/issue-43926.rs b/tests/ui/link-native-libs/issue-43926.rs
new file mode 100644
index 00000000000..6d3003552dc
--- /dev/null
+++ b/tests/ui/link-native-libs/issue-43926.rs
@@ -0,0 +1,4 @@
+#[link(name = "foo", cfg())] //~ ERROR link cfg must have a single predicate argument
+extern "C" {}
+
+fn main() {}
diff --git a/tests/ui/link-native-libs/issue-43926.stderr b/tests/ui/link-native-libs/issue-43926.stderr
new file mode 100644
index 00000000000..7c5c50a38a9
--- /dev/null
+++ b/tests/ui/link-native-libs/issue-43926.stderr
@@ -0,0 +1,8 @@
+error: link cfg must have a single predicate argument
+  --> $DIR/issue-43926.rs:1:22
+   |
+LL | #[link(name = "foo", cfg())]
+   |                      ^^^^^
+
+error: aborting due to 1 previous error
+
diff --git a/tests/ui/link-native-libs/issue-70093/issue-70093-link-directives.rs b/tests/ui/link-native-libs/issue-70093/issue-70093-link-directives.rs
new file mode 100644
index 00000000000..9c60affbccd
--- /dev/null
+++ b/tests/ui/link-native-libs/issue-70093/issue-70093-link-directives.rs
@@ -0,0 +1,10 @@
+//@ run-pass
+//@ compile-flags: -Zlink-directives=no
+//@ ignore-windows - this will probably only work on unixish systems
+//@ ignore-fuchsia - missing __libc_start_main for some reason (#84733)
+//@ ignore-cross-compile - default-linker-libraries=yes doesn't play well with cross compiling
+
+#[link(name = "some-random-non-existent-library", kind = "static")]
+extern "C" {}
+
+fn main() {}
diff --git a/tests/ui/link-native-libs/issue-70093/issue-70093.rs b/tests/ui/link-native-libs/issue-70093/issue-70093.rs
new file mode 100644
index 00000000000..86974239338
--- /dev/null
+++ b/tests/ui/link-native-libs/issue-70093/issue-70093.rs
@@ -0,0 +1,10 @@
+//@ run-pass
+//@ compile-flags: -Zlink-native-libraries=no -Cdefault-linker-libraries=yes
+//@ ignore-windows - this will probably only work on unixish systems
+//@ ignore-fuchsia - missing __libc_start_main for some reason (#84733)
+//@ ignore-cross-compile - default-linker-libraries=yes doesn't play well with cross compiling
+
+#[link(name = "some-random-non-existent-library", kind = "static")]
+extern "C" {}
+
+fn main() {}
diff --git a/tests/ui/link-native-libs/kind-framework.rs b/tests/ui/link-native-libs/kind-framework.rs
new file mode 100644
index 00000000000..c2f90809e03
--- /dev/null
+++ b/tests/ui/link-native-libs/kind-framework.rs
@@ -0,0 +1,7 @@
+//@ ignore-apple this is supposed to succeed on Apple platforms (though it won't necessarily link)
+
+#[link(name = "foo", kind = "framework")]
+extern "C" {}
+//~^^ ERROR: link kind `framework` is only supported on Apple targets
+
+fn main() {}
diff --git a/tests/ui/link-native-libs/kind-framework.stderr b/tests/ui/link-native-libs/kind-framework.stderr
new file mode 100644
index 00000000000..93dacd68e29
--- /dev/null
+++ b/tests/ui/link-native-libs/kind-framework.stderr
@@ -0,0 +1,9 @@
+error[E0455]: link kind `framework` is only supported on Apple targets
+  --> $DIR/kind-framework.rs:3:29
+   |
+LL | #[link(name = "foo", kind = "framework")]
+   |                             ^^^^^^^^^^^
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0455`.
diff --git a/tests/ui/link-native-libs/link-attr-validation-early.rs b/tests/ui/link-native-libs/link-attr-validation-early.rs
new file mode 100644
index 00000000000..b9a835fb5e9
--- /dev/null
+++ b/tests/ui/link-native-libs/link-attr-validation-early.rs
@@ -0,0 +1,8 @@
+// Top-level ill-formed
+#[link] //~ ERROR attribute must be of the form
+        //~| WARN this was previously accepted
+#[link = "foo"] //~ ERROR attribute must be of the form
+                //~| WARN this was previously accepted
+extern "C" {}
+
+fn main() {}
diff --git a/tests/ui/link-native-libs/link-attr-validation-early.stderr b/tests/ui/link-native-libs/link-attr-validation-early.stderr
new file mode 100644
index 00000000000..24ad9d825f8
--- /dev/null
+++ b/tests/ui/link-native-libs/link-attr-validation-early.stderr
@@ -0,0 +1,21 @@
+error: attribute must be of the form `#[link(name = "...", /*opt*/ kind = "dylib|static|...", /*opt*/ wasm_import_module = "...", /*opt*/ import_name_type = "decorated|noprefix|undecorated")]`
+  --> $DIR/link-attr-validation-early.rs:2:1
+   |
+LL | #[link]
+   | ^^^^^^^
+   |
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #57571 <https://github.com/rust-lang/rust/issues/57571>
+   = note: `#[deny(ill_formed_attribute_input)]` on by default
+
+error: attribute must be of the form `#[link(name = "...", /*opt*/ kind = "dylib|static|...", /*opt*/ wasm_import_module = "...", /*opt*/ import_name_type = "decorated|noprefix|undecorated")]`
+  --> $DIR/link-attr-validation-early.rs:4:1
+   |
+LL | #[link = "foo"]
+   | ^^^^^^^^^^^^^^^
+   |
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #57571 <https://github.com/rust-lang/rust/issues/57571>
+
+error: aborting due to 2 previous errors
+
diff --git a/tests/ui/link-native-libs/link-attr-validation-late.rs b/tests/ui/link-native-libs/link-attr-validation-late.rs
new file mode 100644
index 00000000000..34f720dd2d3
--- /dev/null
+++ b/tests/ui/link-native-libs/link-attr-validation-late.rs
@@ -0,0 +1,39 @@
+#![feature(link_cfg)]
+
+// Top-level ill-formed
+#[link(name = "...", "literal")] //~ ERROR unexpected `#[link]` argument
+#[link(name = "...", unknown)] //~ ERROR unexpected `#[link]` argument
+extern "C" {}
+
+// Duplicate arguments
+#[link(name = "foo", name = "bar")] //~ ERROR multiple `name` arguments
+#[link(name = "...", kind = "dylib", kind = "bar")] //~ ERROR multiple `kind` arguments
+#[link(name = "...", modifiers = "+verbatim", modifiers = "bar")] //~ ERROR multiple `modifiers` arguments
+#[link(name = "...", cfg(FALSE), cfg(FALSE))] //~ ERROR multiple `cfg` arguments
+#[link(wasm_import_module = "foo", wasm_import_module = "bar")] //~ ERROR multiple `wasm_import_module` arguments
+extern "C" {}
+
+// Ill-formed arguments
+#[link(name)] //~ ERROR link name must be of the form `name = "string"`
+              //~| ERROR `#[link]` attribute requires a `name = "string"` argument
+#[link(name())] //~ ERROR link name must be of the form `name = "string"`
+              //~| ERROR `#[link]` attribute requires a `name = "string"` argument
+#[link(name = "...", kind)] //~ ERROR link kind must be of the form `kind = "string"`
+#[link(name = "...", kind())] //~ ERROR link kind must be of the form `kind = "string"`
+#[link(name = "...", modifiers)] //~ ERROR link modifiers must be of the form `modifiers = "string"`
+#[link(name = "...", modifiers())] //~ ERROR link modifiers must be of the form `modifiers = "string"`
+#[link(name = "...", cfg)] //~ ERROR link cfg must be of the form `cfg(/* predicate */)`
+#[link(name = "...", cfg = "literal")] //~ ERROR link cfg must be of the form `cfg(/* predicate */)`
+#[link(name = "...", cfg("literal"))] //~ ERROR link cfg must have a single predicate argument
+#[link(name = "...", wasm_import_module)] //~ ERROR wasm import module must be of the form `wasm_import_module = "string"`
+#[link(name = "...", wasm_import_module())] //~ ERROR wasm import module must be of the form `wasm_import_module = "string"`
+extern "C" {}
+
+// Basic modifier validation
+#[link(name = "...", modifiers = "")] //~ ERROR invalid linking modifier syntax, expected '+' or '-' prefix
+#[link(name = "...", modifiers = "no-plus-minus")] //~ ERROR invalid linking modifier syntax, expected '+' or '-' prefix
+#[link(name = "...", modifiers = "+unknown")] //~ ERROR unknown linking modifier `unknown`
+#[link(name = "...", modifiers = "+verbatim,+verbatim")] //~ ERROR multiple `verbatim` modifiers
+extern "C" {}
+
+fn main() {}
diff --git a/tests/ui/link-native-libs/link-attr-validation-late.stderr b/tests/ui/link-native-libs/link-attr-validation-late.stderr
new file mode 100644
index 00000000000..1ad5fbaf7de
--- /dev/null
+++ b/tests/ui/link-native-libs/link-attr-validation-late.stderr
@@ -0,0 +1,147 @@
+error: unexpected `#[link]` argument, expected one of: name, kind, modifiers, cfg, wasm_import_module, import_name_type
+  --> $DIR/link-attr-validation-late.rs:4:22
+   |
+LL | #[link(name = "...", "literal")]
+   |                      ^^^^^^^^^
+
+error: unexpected `#[link]` argument, expected one of: name, kind, modifiers, cfg, wasm_import_module, import_name_type
+  --> $DIR/link-attr-validation-late.rs:5:22
+   |
+LL | #[link(name = "...", unknown)]
+   |                      ^^^^^^^
+
+error: multiple `name` arguments in a single `#[link]` attribute
+  --> $DIR/link-attr-validation-late.rs:9:22
+   |
+LL | #[link(name = "foo", name = "bar")]
+   |                      ^^^^^^^^^^^^
+
+error: multiple `kind` arguments in a single `#[link]` attribute
+  --> $DIR/link-attr-validation-late.rs:10:38
+   |
+LL | #[link(name = "...", kind = "dylib", kind = "bar")]
+   |                                      ^^^^^^^^^^^^
+
+error: multiple `modifiers` arguments in a single `#[link]` attribute
+  --> $DIR/link-attr-validation-late.rs:11:47
+   |
+LL | #[link(name = "...", modifiers = "+verbatim", modifiers = "bar")]
+   |                                               ^^^^^^^^^^^^^^^^^
+
+error: multiple `cfg` arguments in a single `#[link]` attribute
+  --> $DIR/link-attr-validation-late.rs:12:34
+   |
+LL | #[link(name = "...", cfg(FALSE), cfg(FALSE))]
+   |                                  ^^^^^^^^^^
+
+error: multiple `wasm_import_module` arguments in a single `#[link]` attribute
+  --> $DIR/link-attr-validation-late.rs:13:36
+   |
+LL | #[link(wasm_import_module = "foo", wasm_import_module = "bar")]
+   |                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: link name must be of the form `name = "string"`
+  --> $DIR/link-attr-validation-late.rs:17:8
+   |
+LL | #[link(name)]
+   |        ^^^^
+
+error[E0459]: `#[link]` attribute requires a `name = "string"` argument
+  --> $DIR/link-attr-validation-late.rs:17:1
+   |
+LL | #[link(name)]
+   | ^^^^^^^^^^^^^ missing `name` argument
+
+error: link name must be of the form `name = "string"`
+  --> $DIR/link-attr-validation-late.rs:19:8
+   |
+LL | #[link(name())]
+   |        ^^^^^^
+
+error[E0459]: `#[link]` attribute requires a `name = "string"` argument
+  --> $DIR/link-attr-validation-late.rs:19:1
+   |
+LL | #[link(name())]
+   | ^^^^^^^^^^^^^^^ missing `name` argument
+
+error: link kind must be of the form `kind = "string"`
+  --> $DIR/link-attr-validation-late.rs:21:22
+   |
+LL | #[link(name = "...", kind)]
+   |                      ^^^^
+
+error: link kind must be of the form `kind = "string"`
+  --> $DIR/link-attr-validation-late.rs:22:22
+   |
+LL | #[link(name = "...", kind())]
+   |                      ^^^^^^
+
+error: link modifiers must be of the form `modifiers = "string"`
+  --> $DIR/link-attr-validation-late.rs:23:22
+   |
+LL | #[link(name = "...", modifiers)]
+   |                      ^^^^^^^^^
+
+error: link modifiers must be of the form `modifiers = "string"`
+  --> $DIR/link-attr-validation-late.rs:24:22
+   |
+LL | #[link(name = "...", modifiers())]
+   |                      ^^^^^^^^^^^
+
+error: link cfg must be of the form `cfg(/* predicate */)`
+  --> $DIR/link-attr-validation-late.rs:25:22
+   |
+LL | #[link(name = "...", cfg)]
+   |                      ^^^
+
+error: link cfg must be of the form `cfg(/* predicate */)`
+  --> $DIR/link-attr-validation-late.rs:26:22
+   |
+LL | #[link(name = "...", cfg = "literal")]
+   |                      ^^^^^^^^^^^^^^^
+
+error: link cfg must have a single predicate argument
+  --> $DIR/link-attr-validation-late.rs:27:22
+   |
+LL | #[link(name = "...", cfg("literal"))]
+   |                      ^^^^^^^^^^^^^^
+
+error: wasm import module must be of the form `wasm_import_module = "string"`
+  --> $DIR/link-attr-validation-late.rs:28:22
+   |
+LL | #[link(name = "...", wasm_import_module)]
+   |                      ^^^^^^^^^^^^^^^^^^
+
+error: wasm import module must be of the form `wasm_import_module = "string"`
+  --> $DIR/link-attr-validation-late.rs:29:22
+   |
+LL | #[link(name = "...", wasm_import_module())]
+   |                      ^^^^^^^^^^^^^^^^^^^^
+
+error: invalid linking modifier syntax, expected '+' or '-' prefix before one of: bundle, verbatim, whole-archive, as-needed
+  --> $DIR/link-attr-validation-late.rs:33:34
+   |
+LL | #[link(name = "...", modifiers = "")]
+   |                                  ^^
+
+error: invalid linking modifier syntax, expected '+' or '-' prefix before one of: bundle, verbatim, whole-archive, as-needed
+  --> $DIR/link-attr-validation-late.rs:34:34
+   |
+LL | #[link(name = "...", modifiers = "no-plus-minus")]
+   |                                  ^^^^^^^^^^^^^^^
+
+error: unknown linking modifier `unknown`, expected one of: bundle, verbatim, whole-archive, as-needed
+  --> $DIR/link-attr-validation-late.rs:35:34
+   |
+LL | #[link(name = "...", modifiers = "+unknown")]
+   |                                  ^^^^^^^^^^
+
+error: multiple `verbatim` modifiers in a single `modifiers` argument
+  --> $DIR/link-attr-validation-late.rs:36:34
+   |
+LL | #[link(name = "...", modifiers = "+verbatim,+verbatim")]
+   |                                  ^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to 24 previous errors
+
+For more information about this error, try `rustc --explain E0459`.
diff --git a/tests/ui/link-native-libs/link-cfg-works.rs b/tests/ui/link-native-libs/link-cfg-works.rs
new file mode 100644
index 00000000000..7b936bc43b1
--- /dev/null
+++ b/tests/ui/link-native-libs/link-cfg-works.rs
@@ -0,0 +1,13 @@
+//@ run-pass
+//@ aux-build:link-cfg-works-transitive-rlib.rs
+//@ aux-build:link-cfg-works-transitive-dylib.rs
+
+#![feature(link_cfg)]
+
+extern crate link_cfg_works_transitive_dylib;
+extern crate link_cfg_works_transitive_rlib;
+
+#[link(name = "foo", cfg(foo))]
+extern "C" {}
+
+fn main() {}
diff --git a/tests/ui/link-native-libs/uikit-framework.rs b/tests/ui/link-native-libs/uikit-framework.rs
new file mode 100644
index 00000000000..fca0332384a
--- /dev/null
+++ b/tests/ui/link-native-libs/uikit-framework.rs
@@ -0,0 +1,25 @@
+//! Check that linking to UIKit on platforms where that is available works.
+//@ revisions: ios tvos watchos visionos
+//@ [ios]only-ios
+//@ [tvos]only-tvos
+//@ [watchos]only-watchos
+//@ [visionos]only-visionos
+//@ build-pass
+
+use std::ffi::{c_char, c_int, c_void};
+
+#[link(name = "UIKit", kind = "framework")]
+extern "C" {
+    pub fn UIApplicationMain(
+        argc: c_int,
+        argv: *const c_char,
+        principalClassName: *const c_void,
+        delegateClassName: *const c_void,
+    ) -> c_int;
+}
+
+pub fn main() {
+    unsafe {
+        UIApplicationMain(0, core::ptr::null(), core::ptr::null(), core::ptr::null());
+    }
+}