diff --git a/src/librustc_trans/trans/attributes.rs b/src/librustc_trans/trans/attributes.rs index a1f4ed5c20d3..c77cb4914481 100644 --- a/src/librustc_trans/trans/attributes.rs +++ b/src/librustc_trans/trans/attributes.rs @@ -59,7 +59,6 @@ pub fn emit_uwtable(val: ValueRef, emit: bool) { /// Tell LLVM whether the function can or cannot unwind. #[inline] -#[allow(dead_code)] // possibly useful function pub fn unwind(val: ValueRef, can_unwind: bool) { if can_unwind { unsafe { @@ -118,6 +117,8 @@ pub fn from_fn_attrs(ccx: &CrateContext, attrs: &[hir::Attribute], llfn: ValueRe } } else if attr.check_name("allocator") { llvm::Attribute::NoAlias.apply_llfn(llvm::ReturnIndex as c_uint, llfn); + } else if attr.check_name("unwind") { + unwind(llfn, true); } } } diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 47f248563030..abc041029505 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -188,6 +188,9 @@ const KNOWN_FEATURES: &'static [(&'static str, &'static str, Option, Status // allow `extern "platform-intrinsic" { ... }` ("platform_intrinsics", "1.4.0", Some(27731), Active), + + // allow `#[unwind]` + ("unwind_attributes", "1.4.0", None, Active), ]; // (changing above list without updating src/doc/reference.md makes @cmr sad) @@ -316,6 +319,7 @@ pub const KNOWN_ATTRIBUTES: &'static [(&'static str, AttributeType, AttributeGat ("unsafe_no_drop_flag", Whitelisted, Gated("unsafe_no_drop_flag", "unsafe_no_drop_flag has unstable semantics \ and may be removed in the future")), + ("unwind", Whitelisted, Gated("unwind_attributes", "#[unwind] is experimental")), // used in resolve ("prelude_import", Whitelisted, Gated("prelude_import",