From 1dd5f7757b9a7a053ed856353248a17687c3b21a Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Mon, 10 Dec 2012 17:22:10 -0800 Subject: [PATCH] Adjust the die macro to only accept ~str and to work in statement position --- src/libsyntax/ext/expand.rs | 10 +++++++--- src/test/compile-fail/die-not-unique.rs | 5 +++++ src/test/run-pass/die-macro.rs | 9 +++++++++ 3 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 src/test/compile-fail/die-not-unique.rs create mode 100644 src/test/run-pass/die-macro.rs diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs index 1890ec36bddd1..f7df2c7b8de2d 100644 --- a/src/libsyntax/ext/expand.rs +++ b/src/libsyntax/ext/expand.rs @@ -379,7 +379,11 @@ fn core_macros() -> ~str { macro_rules! die( ($msg: expr) => ( { - do core::str::as_buf($msg) |msg_buf, _msg_len| { + // ensure that the argument is an owned string + let msgptr: &~str = &{$msg}; + // rt_fail_ returns ! so we need to constrain the type + // parameter on as_buf by assigning to something + let _: () = do core::str::as_buf(*msgptr) |msg_buf, _msg_len| { do core::str::as_buf(file!()) |file_buf, _file_len| { unsafe { let msg_buf = core::cast::transmute(msg_buf); @@ -388,11 +392,11 @@ fn core_macros() -> ~str { core::rt::rt_fail_(msg_buf, file_buf, line) } } - } + }; } ); () => ( - die!(\"explicit failure\") + die!(~\"explicit failure\") ) ) }"; diff --git a/src/test/compile-fail/die-not-unique.rs b/src/test/compile-fail/die-not-unique.rs new file mode 100644 index 0000000000000..bbda5332c7700 --- /dev/null +++ b/src/test/compile-fail/die-not-unique.rs @@ -0,0 +1,5 @@ +// error-pattern:mismatched types + +fn main() { + die!("test"); +} diff --git a/src/test/run-pass/die-macro.rs b/src/test/run-pass/die-macro.rs new file mode 100644 index 0000000000000..713b8246e306b --- /dev/null +++ b/src/test/run-pass/die-macro.rs @@ -0,0 +1,9 @@ +// Just testing that die!() type checks in statement position + +fn f() { + die!(); +} + +fn main() { + +}