}
}
+#[rustc_allocator_nounwind]
pub fn oom() -> ! {
extern {
#[lang = "oom"]
use rustc::ty::maps::Providers;
use rustc_data_structures::sync::Lrc;
use rustc_data_structures::fx::FxHashMap;
+use rustc_target::spec::PanicStrategy;
+use attributes;
use llvm::{self, Attribute, ValueRef};
use llvm::AttributePlace::Function;
use llvm_util;
Attribute::NoAlias.apply_llfn(
llvm::AttributePlace::ReturnValue, llfn);
}
- if codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::UNWIND) {
- unwind(llfn, true);
- }
- if codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::RUSTC_ALLOCATOR_NOUNWIND) {
- unwind(llfn, false);
+
+ let can_unwind = if codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::UNWIND) {
+ Some(true)
+ } else if codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::RUSTC_ALLOCATOR_NOUNWIND) {
+ Some(false)
+
+ // Perhaps questionable, but we assume that anything defined
+ // *in Rust code* may unwind. Foreign items like `extern "C" {
+ // fn foo(); }` are assumed not to unwind **unless** they have
+ // a `#[unwind]` attribute.
+ } else if !cx.tcx.is_foreign_item(id) {
+ Some(true)
+ } else {
+ None
+ };
+
+ match can_unwind {
+ Some(false) => attributes::unwind(llfn, false),
+ Some(true) if cx.tcx.sess.panic_strategy() == PanicStrategy::Unwind => {
+ attributes::unwind(llfn, true);
+ }
+ Some(true) | None => {}
}
let features = llvm_target_features(cx.tcx.sess)
use rustc::ty::{self, TypeFoldable};
use rustc::ty::layout::LayoutOf;
use rustc::ty::subst::Substs;
-use rustc_target::spec::PanicStrategy;
/// Codegens a reference to a fn/method item, monomorphizing and
/// inlining as it goes.
let instance_def_id = instance.def_id();
- // Perhaps questionable, but we assume that anything defined
- // *in Rust code* may unwind. Foreign items like `extern "C" {
- // fn foo(); }` are assumed not to unwind **unless** they have
- // a `#[unwind]` attribute.
- if tcx.sess.panic_strategy() == PanicStrategy::Unwind {
- if !tcx.is_foreign_item(instance_def_id) {
- attributes::unwind(llfn, true);
- }
- }
-
// Apply an appropriate linkage/visibility value to our item that we
// just declared.
//
--- /dev/null
+// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// no-system-llvm
+// compile-flags: -O
+#![crate_type="lib"]
+
+#[no_mangle]
+pub fn get_len() -> usize {
+ // CHECK-LABEL: @get_len
+ // CHECK-NOT: call
+ // CHECK-NOT: invoke
+ [1, 2, 3].iter().collect::<Vec<_>>().len()
+}