From 6e1f9ad1f1b442d397bc120ed6916c4ddef2f4ae Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Wed, 11 Jan 2012 19:27:08 -0800 Subject: [PATCH] rustc: Don't allow empty link_name when nolink attribute is present Closes #1326 --- src/comp/metadata/creader.rs | 21 ++++++++++++--------- src/libstd/freebsd_os.rs | 1 - src/libstd/linux_os.rs | 1 - src/libstd/macos_os.rs | 1 - src/libstd/win32_os.rs | 1 - src/test/compile-fail/empty-linkname2.rs | 7 +++++++ 6 files changed, 19 insertions(+), 13 deletions(-) create mode 100644 src/test/compile-fail/empty-linkname2.rs diff --git a/src/comp/metadata/creader.rs b/src/comp/metadata/creader.rs index 8c6204d11051..de7fe882aa13 100644 --- a/src/comp/metadata/creader.rs +++ b/src/comp/metadata/creader.rs @@ -57,17 +57,20 @@ fn visit_item(e: env, i: @ast::item) { } let cstore = e.sess.get_cstore(); - let native_name = i.ident; + let native_name = + alt attr::get_meta_item_value_str_by_name(i.attrs, "link_name") { + some(nn) { + if nn == "" { + e.sess.span_fatal( + i.span, + "empty #[link_name] not allowed; use #[nolink]."); + } + nn + } + none. { i.ident } + }; let already_added = false; if vec::len(attr::find_attrs_by_name(i.attrs, "nolink")) == 0u { - alt attr::get_meta_item_value_str_by_name(i.attrs, "link_name") { - some(nn) { native_name = nn; } - none. { } - } - if native_name == "" { - e.sess.span_fatal(i.span, - "empty #[link_name] not allowed; use #[nolink]."); - } already_added = !cstore::add_used_library(cstore, native_name); } let link_args = attr::find_attrs_by_name(i.attrs, "link_args"); diff --git a/src/libstd/freebsd_os.rs b/src/libstd/freebsd_os.rs index 4fecf418213e..596db37bea9a 100644 --- a/src/libstd/freebsd_os.rs +++ b/src/libstd/freebsd_os.rs @@ -24,7 +24,6 @@ export fsync_fd; // FIXME Somehow merge stuff duplicated here and macosx_os.rs. Made difficult // by https://github.com/graydon/rust/issues#issue/268 -#[link_name = ""] // FIXME remove after #[nolink] is snapshotted #[nolink] #[abi = "cdecl"] native mod libc { diff --git a/src/libstd/linux_os.rs b/src/libstd/linux_os.rs index 7e7f0407f771..965d8f1eaff8 100644 --- a/src/libstd/linux_os.rs +++ b/src/libstd/linux_os.rs @@ -24,7 +24,6 @@ export fsync_fd; // FIXME Somehow merge stuff duplicated here and macosx_os.rs. Made difficult // by https://github.com/graydon/rust/issues#issue/268 -#[link_name = ""] // FIXME remove after #[nolink] is snapshotted #[nolink] #[abi = "cdecl"] native mod libc { diff --git a/src/libstd/macos_os.rs b/src/libstd/macos_os.rs index 35c7b19bb3d5..9cca6fe77e18 100644 --- a/src/libstd/macos_os.rs +++ b/src/libstd/macos_os.rs @@ -18,7 +18,6 @@ export fsync_fd; // FIXME Refactor into unix_os module or some such. Doesn't // seem to work right now. -#[link_name = ""] // FIXME: Remove after snapshotting #[nolink] #[abi = "cdecl"] native mod libc { diff --git a/src/libstd/win32_os.rs b/src/libstd/win32_os.rs index 0996a87737a8..ff45648cdba6 100644 --- a/src/libstd/win32_os.rs +++ b/src/libstd/win32_os.rs @@ -2,7 +2,6 @@ import core::option; import core::ctypes::*; #[abi = "cdecl"] -#[link_name = ""] // FIXME remove after #[nolink] is snapshotted #[nolink] native mod libc { fn read(fd: fd_t, buf: *u8, count: size_t) -> ssize_t; diff --git a/src/test/compile-fail/empty-linkname2.rs b/src/test/compile-fail/empty-linkname2.rs new file mode 100644 index 000000000000..567208f7897e --- /dev/null +++ b/src/test/compile-fail/empty-linkname2.rs @@ -0,0 +1,7 @@ +// error-pattern:empty #[link_name] not allowed; use #[nolink]. +// Issue #1326 + +#[link_name = ""] +#[nolink] +native mod foo { +}