Skip to content

Commit 5854794

Browse files
committed
---
yaml --- r: 273372 b: refs/heads/beta c: 015d3b7 h: refs/heads/master
1 parent fa36d0e commit 5854794

34 files changed

+691
-382
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ refs/tags/0.9: 36870b185fc5f5486636d4515f0e22677493f225
2323
refs/tags/0.10: ac33f2b15782272ae348dbd7b14b8257b2148b5a
2424
refs/tags/0.11.0: e1247cb1d0d681be034adb4b558b5a0c0d5720f9
2525
refs/tags/0.12.0: f0c419429ef30723ceaf6b42f9b5a2aeb5d2e2d1
26-
refs/heads/beta: afbbb74fecb3945336520d1930bd52bed9ed0819
26+
refs/heads/beta: 015d3b70929a31af48d056a8e05d113e362339e9
2727
refs/tags/1.0.0-alpha: e42bd6d93a1d3433c486200587f8f9e12590a4d7
2828
refs/heads/tmp: e06d2ad9fcd5027bcaac5b08fc9aa39a49d0ecd3
2929
refs/tags/1.0.0-alpha.2: 4c705f6bc559886632d3871b04f58aab093bfa2f

branches/beta/src/libcore/intrinsics.rs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,19 +53,35 @@ extern "rust-intrinsic" {
5353
// NB: These intrinsics take raw pointers because they mutate aliased
5454
// memory, which is not valid for either `&` or `&mut`.
5555

56+
#[cfg(stage0)]
5657
pub fn atomic_cxchg<T>(dst: *mut T, old: T, src: T) -> T;
58+
#[cfg(stage0)]
5759
pub fn atomic_cxchg_acq<T>(dst: *mut T, old: T, src: T) -> T;
60+
#[cfg(stage0)]
5861
pub fn atomic_cxchg_rel<T>(dst: *mut T, old: T, src: T) -> T;
62+
#[cfg(stage0)]
5963
pub fn atomic_cxchg_acqrel<T>(dst: *mut T, old: T, src: T) -> T;
64+
#[cfg(stage0)]
6065
pub fn atomic_cxchg_relaxed<T>(dst: *mut T, old: T, src: T) -> T;
66+
67+
#[cfg(not(stage0))]
68+
pub fn atomic_cxchg<T>(dst: *mut T, old: T, src: T) -> (T, bool);
69+
#[cfg(not(stage0))]
70+
pub fn atomic_cxchg_acq<T>(dst: *mut T, old: T, src: T) -> (T, bool);
71+
#[cfg(not(stage0))]
72+
pub fn atomic_cxchg_rel<T>(dst: *mut T, old: T, src: T) -> (T, bool);
73+
#[cfg(not(stage0))]
74+
pub fn atomic_cxchg_acqrel<T>(dst: *mut T, old: T, src: T) -> (T, bool);
75+
#[cfg(not(stage0))]
76+
pub fn atomic_cxchg_relaxed<T>(dst: *mut T, old: T, src: T) -> (T, bool);
6177
#[cfg(not(stage0))]
62-
pub fn atomic_cxchg_failrelaxed<T>(dst: *mut T, old: T, src: T) -> T;
78+
pub fn atomic_cxchg_failrelaxed<T>(dst: *mut T, old: T, src: T) -> (T, bool);
6379
#[cfg(not(stage0))]
64-
pub fn atomic_cxchg_failacq<T>(dst: *mut T, old: T, src: T) -> T;
80+
pub fn atomic_cxchg_failacq<T>(dst: *mut T, old: T, src: T) -> (T, bool);
6581
#[cfg(not(stage0))]
66-
pub fn atomic_cxchg_acq_failrelaxed<T>(dst: *mut T, old: T, src: T) -> T;
82+
pub fn atomic_cxchg_acq_failrelaxed<T>(dst: *mut T, old: T, src: T) -> (T, bool);
6783
#[cfg(not(stage0))]
68-
pub fn atomic_cxchg_acqrel_failrelaxed<T>(dst: *mut T, old: T, src: T) -> T;
84+
pub fn atomic_cxchg_acqrel_failrelaxed<T>(dst: *mut T, old: T, src: T) -> (T, bool);
6985

7086
#[cfg(not(stage0))]
7187
pub fn atomic_cxchgweak<T>(dst: *mut T, old: T, src: T) -> (T, bool);

branches/beta/src/libcore/sync/atomic.rs

Lines changed: 114 additions & 83 deletions
Large diffs are not rendered by default.

branches/beta/src/librustc/middle/infer/error_reporting.rs

Lines changed: 138 additions & 76 deletions
Large diffs are not rendered by default.

branches/beta/src/librustc/middle/infer/mod.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,7 @@ pub fn common_supertype<'a, 'tcx>(cx: &InferCtxt<'a, 'tcx>,
407407
match result {
408408
Ok(t) => t,
409409
Err(ref err) => {
410-
cx.report_and_explain_type_error(trace, err);
410+
cx.report_and_explain_type_error(trace, err).emit();
411411
cx.tcx.types.err
412412
}
413413
}
@@ -1396,7 +1396,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
13961396
found: actual
13971397
})
13981398
};
1399-
self.report_and_explain_type_error(trace, &err);
1399+
self.report_and_explain_type_error(trace, &err).emit();
14001400
}
14011401

14021402
pub fn report_conflicting_default_types(&self,
@@ -1411,11 +1411,13 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
14111411
})
14121412
};
14131413

1414-
self.report_and_explain_type_error(trace,
1414+
self.report_and_explain_type_error(
1415+
trace,
14151416
&TypeError::TyParamDefaultMismatch(ExpectedFound {
14161417
expected: expected,
14171418
found: actual
1418-
}));
1419+
}))
1420+
.emit();
14191421
}
14201422

14211423
pub fn replace_late_bound_regions_with_fresh_var<T>(

branches/beta/src/librustc/middle/infer/region_inference/mod.rs

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ pub use self::CombineMapType::*;
1717
pub use self::RegionResolutionError::*;
1818
pub use self::VarValue::*;
1919

20-
use super::{RegionVariableOrigin, SubregionOrigin, TypeTrace, MiscVariable};
20+
use super::{RegionVariableOrigin, SubregionOrigin, MiscVariable};
2121
use super::unify_key;
2222

2323
use rustc_data_structures::graph::{self, Direction, NodeIndex};
@@ -27,7 +27,6 @@ use middle::ty::{self, Ty, TyCtxt};
2727
use middle::ty::{BoundRegion, Region, RegionVid};
2828
use middle::ty::{ReEmpty, ReStatic, ReFree, ReEarlyBound};
2929
use middle::ty::{ReLateBound, ReScope, ReVar, ReSkolemized, BrFresh};
30-
use middle::ty::error::TypeError;
3130
use util::common::indenter;
3231
use util::nodemap::{FnvHashMap, FnvHashSet};
3332

@@ -152,11 +151,16 @@ pub enum RegionResolutionError<'tcx> {
152151
/// more specific errors message by suggesting to the user where they
153152
/// should put a lifetime. In those cases we process and put those errors
154153
/// into `ProcessedErrors` before we do any reporting.
155-
ProcessedErrors(Vec<RegionVariableOrigin>,
156-
Vec<(TypeTrace<'tcx>, TypeError<'tcx>)>,
154+
ProcessedErrors(Vec<ProcessedErrorOrigin<'tcx>>,
157155
Vec<SameRegions>),
158156
}
159157

158+
#[derive(Clone, Debug)]
159+
pub enum ProcessedErrorOrigin<'tcx> {
160+
ConcreteFailure(SubregionOrigin<'tcx>, Region, Region),
161+
VariableFailure(RegionVariableOrigin),
162+
}
163+
160164
/// SameRegions is used to group regions that we think are the same and would
161165
/// like to indicate so to the user.
162166
/// For example, the following function
@@ -530,16 +534,14 @@ impl<'a, 'tcx> RegionVarBindings<'a, 'tcx> {
530534
assert!(self.values_are_none());
531535

532536
debug!("RegionVarBindings: lub_regions({:?}, {:?})", a, b);
533-
match (a, b) {
534-
(ReStatic, _) | (_, ReStatic) => {
535-
ReStatic // nothing lives longer than static
536-
}
537-
538-
_ => {
539-
self.combine_vars(Lub, a, b, origin.clone(), |this, old_r, new_r| {
540-
this.make_subregion(origin.clone(), old_r, new_r)
541-
})
542-
}
537+
if a == ty::ReStatic || b == ty::ReStatic {
538+
ReStatic // nothing lives longer than static
539+
} else if a == b {
540+
a // LUB(a,a) = a
541+
} else {
542+
self.combine_vars(Lub, a, b, origin.clone(), |this, old_r, new_r| {
543+
this.make_subregion(origin.clone(), old_r, new_r)
544+
})
543545
}
544546
}
545547

@@ -550,8 +552,11 @@ impl<'a, 'tcx> RegionVarBindings<'a, 'tcx> {
550552
debug!("RegionVarBindings: glb_regions({:?}, {:?})", a, b);
551553
match (a, b) {
552554
(ReStatic, r) | (r, ReStatic) => {
553-
// static lives longer than everything else
554-
r
555+
r // static lives longer than everything else
556+
}
557+
558+
_ if a == b => {
559+
a // GLB(a,a) = a
555560
}
556561

557562
_ => {

branches/beta/src/librustc_trans/trans/intrinsic.rs

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -725,6 +725,7 @@ pub fn trans_intrinsic_call<'a, 'blk, 'tcx>(mut bcx: Block<'blk, 'tcx>,
725725
(_, name) if name.starts_with("atomic_") => {
726726
let split: Vec<&str> = name.split('_').collect();
727727

728+
let is_cxchg = split[1] == "cxchg" || split[1] == "cxchgweak";
728729
let (order, failorder) = match split.len() {
729730
2 => (llvm::SequentiallyConsistent, llvm::SequentiallyConsistent),
730731
3 => match split[2] {
@@ -733,39 +734,34 @@ pub fn trans_intrinsic_call<'a, 'blk, 'tcx>(mut bcx: Block<'blk, 'tcx>,
733734
"acq" => (llvm::Acquire, llvm::Acquire),
734735
"rel" => (llvm::Release, llvm::Monotonic),
735736
"acqrel" => (llvm::AcquireRelease, llvm::Acquire),
736-
"failrelaxed" if split[1] == "cxchg" || split[1] == "cxchgweak" =>
737+
"failrelaxed" if is_cxchg =>
737738
(llvm::SequentiallyConsistent, llvm::Monotonic),
738-
"failacq" if split[1] == "cxchg" || split[1] == "cxchgweak" =>
739+
"failacq" if is_cxchg =>
739740
(llvm::SequentiallyConsistent, llvm::Acquire),
740741
_ => ccx.sess().fatal("unknown ordering in atomic intrinsic")
741742
},
742743
4 => match (split[2], split[3]) {
743-
("acq", "failrelaxed") if split[1] == "cxchg" || split[1] == "cxchgweak" =>
744+
("acq", "failrelaxed") if is_cxchg =>
744745
(llvm::Acquire, llvm::Monotonic),
745-
("acqrel", "failrelaxed") if split[1] == "cxchg" || split[1] == "cxchgweak" =>
746+
("acqrel", "failrelaxed") if is_cxchg =>
746747
(llvm::AcquireRelease, llvm::Monotonic),
747748
_ => ccx.sess().fatal("unknown ordering in atomic intrinsic")
748749
},
749750
_ => ccx.sess().fatal("Atomic intrinsic not in correct format"),
750751
};
751752

752753
match split[1] {
753-
"cxchg" => {
754+
"cxchg" | "cxchgweak" => {
754755
let cmp = from_immediate(bcx, llargs[1]);
755756
let src = from_immediate(bcx, llargs[2]);
756757
let ptr = PointerCast(bcx, llargs[0], val_ty(src).ptr_to());
757-
let res = AtomicCmpXchg(bcx, ptr, cmp, src, order, failorder, llvm::False);
758-
ExtractValue(bcx, res, 0)
759-
}
760-
761-
"cxchgweak" => {
762-
let cmp = from_immediate(bcx, llargs[1]);
763-
let src = from_immediate(bcx, llargs[2]);
764-
let ptr = PointerCast(bcx, llargs[0], val_ty(src).ptr_to());
765-
let val = AtomicCmpXchg(bcx, ptr, cmp, src, order, failorder, llvm::True);
758+
let weak = if split[1] == "cxchgweak" { llvm::True } else { llvm::False };
759+
let val = AtomicCmpXchg(bcx, ptr, cmp, src, order, failorder, weak);
766760
let result = ExtractValue(bcx, val, 0);
767761
let success = ZExt(bcx, ExtractValue(bcx, val, 1), Type::bool(bcx.ccx()));
768-
Store(bcx, result, StructGEP(bcx, llresult, 0));
762+
Store(bcx,
763+
result,
764+
PointerCast(bcx, StructGEP(bcx, llresult, 0), val_ty(src).ptr_to()));
769765
Store(bcx, success, StructGEP(bcx, llresult, 1));
770766
C_nil(ccx)
771767
}
@@ -778,6 +774,7 @@ pub fn trans_intrinsic_call<'a, 'blk, 'tcx>(mut bcx: Block<'blk, 'tcx>,
778774
}
779775
to_immediate(bcx, AtomicLoad(bcx, ptr, order), tp_ty)
780776
}
777+
781778
"store" => {
782779
let val = from_immediate(bcx, llargs[1]);
783780
let ptr = PointerCast(bcx, llargs[0], val_ty(val).ptr_to());

0 commit comments

Comments
 (0)