From fb48817ade1ad4b9b41315038518d8d84ff8e57c Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Fri, 21 Oct 2011 12:14:01 -0700 Subject: [PATCH] work around bug when calling c-stack-cdecl fns from outside crate In the main test, I call the wrapper instead of the native fn, as intended. I also added an xfail-test that exercises the broken code path. Will file a bug. Description of the broken code path: The code path is that when we look up the external identifier we go through trans_external_path() -> type_of_ty_param_kinds_and_ty() -> type_of_fn_from_ty() -> type_of_fn(), and type_of_fn() adds a lot of external parameters. Problem is, I guess, that we don't pass the native ABI (or even the fact that it's a native function!), just the types and kinds of the parameters. --- src/test/run-pass/invoke-external-native.rs | 11 +++++++++++ src/test/stdtest/sys.rs | 4 +++- 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 src/test/run-pass/invoke-external-native.rs diff --git a/src/test/run-pass/invoke-external-native.rs b/src/test/run-pass/invoke-external-native.rs new file mode 100644 index 00000000000..6234685419b --- /dev/null +++ b/src/test/run-pass/invoke-external-native.rs @@ -0,0 +1,11 @@ +// xfail-test + +import std::sys; + +// The purpose of this test is to check that we can +// successfully (and safely) invoke external, c-stack-cdecl +// functions from outside the crate. + +fn main() { + let foo = sys::rustrt::last_os_error(); +} \ No newline at end of file diff --git a/src/test/stdtest/sys.rs b/src/test/stdtest/sys.rs index 547adba7bf5..6f766e9ee6b 100644 --- a/src/test/stdtest/sys.rs +++ b/src/test/stdtest/sys.rs @@ -1,4 +1,6 @@ import std::sys; #[test] -fn last_os_error() unsafe { log sys::rustrt::last_os_error(); } +fn last_os_error() { + log sys::last_os_error(); +}