Skip to content

Commit d344814

Browse files
committed
---
yaml --- r: 212916 b: refs/heads/master c: 4806210 h: refs/heads/master v: v3
1 parent eb282b2 commit d344814

File tree

13 files changed

+192
-74
lines changed

13 files changed

+192
-74
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: 1792ef6ae4f51a45b157c69c5e34e0b48770dd56
2+
refs/heads/master: 4806210db9148f008a317db5235bc0e5a5e3b48e
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: ba0e1cd8147d452c356aacb29fb87568ca26f111
55
refs/heads/try: 1864973ae17213c5a58c4dd3f9af6d1b6c7d2e05

trunk/src/doc/trpl/rust-inside-other-languages.md

Lines changed: 13 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,14 @@ threads = []
6666
5_000_000.times do
6767
count += 1
6868
end
69+
70+
count
6971
end
7072
end
7173

72-
threads.each { |t| t.join }
74+
threads.each do |t|
75+
puts "Thread finished with count=#{t.value}"
76+
end
7377
puts "done!"
7478
```
7579

@@ -103,50 +107,26 @@ use std::thread;
103107
fn process() {
104108
let handles: Vec<_> = (0..10).map(|_| {
105109
thread::spawn(|| {
106-
let mut _x = 0;
110+
let mut x = 0;
107111
for _ in (0..5_000_000) {
108-
_x += 1
112+
x += 1
109113
}
114+
x
110115
})
111116
}).collect();
112117

113118
for h in handles {
114-
h.join().ok().expect("Could not join a thread!");
119+
println!("Thread finished with count={}",
120+
h.join().map_err(|_| "Could not join a thread!").unwrap());
115121
}
122+
println!("done!");
116123
}
117124
```
118125

119126
Some of this should look familiar from previous examples. We spin up ten
120127
threads, collecting them into a `handles` vector. Inside of each thread, we
121-
loop five million times, and add one to `_x` each time. Why the underscore?
122-
Well, if we remove it and compile:
123-
124-
```bash
125-
$ cargo build
126-
Compiling embed v0.1.0 (file:///home/steve/src/embed)
127-
src/lib.rs:3:1: 16:2 warning: function is never used: `process`, #[warn(dead_code)] on by default
128-
src/lib.rs:3 fn process() {
129-
src/lib.rs:4 let handles: Vec<_> = (0..10).map(|_| {
130-
src/lib.rs:5 thread::spawn(|| {
131-
src/lib.rs:6 let mut x = 0;
132-
src/lib.rs:7 for _ in (0..5_000_000) {
133-
src/lib.rs:8 x += 1
134-
...
135-
src/lib.rs:6:17: 6:22 warning: variable `x` is assigned to, but never used, #[warn(unused_variables)] on by default
136-
src/lib.rs:6 let mut x = 0;
137-
^~~~~
138-
```
139-
140-
That first warning is because we are building a library. If we had a test
141-
for this function, the warning would go away. But for now, it’s never
142-
called.
143-
144-
The second is related to `x` versus `_x`. Because we never actually _do_
145-
anything with `x`, we get a warning about it. In our case, that’s perfectly
146-
okay, as we’re just trying to waste CPU cycles. Prefixing `x` with the
147-
underscore removes the warning.
148-
149-
Finally, we join on each thread.
128+
loop five million times, and add one to `x` each time. Finally, we join on
129+
each thread.
150130

151131
Right now, however, this is a Rust library, and it doesn’t expose anything
152132
that’s callable from C. If we tried to hook this up to another language right

trunk/src/doc/trpl/trait-objects.md

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,3 @@ let y = TraitObject {
300300
// y.method();
301301
(y.vtable.method)(y.data);
302302
```
303-
304-
If `b` or `y` were owning trait objects (`Box<Foo>`), there would be a
305-
`(b.vtable.destructor)(b.data)` (respectively `y`) call when they went out of
306-
scope.

trunk/src/libcore/str/mod.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -638,10 +638,10 @@ impl<'a, P: Pattern<'a>> SplitInternal<'a, P> {
638638

639639
generate_pattern_iterators! {
640640
forward:
641-
/// Created with the method `.split()`.
641+
#[doc="Created with the method `.split()`."]
642642
struct Split;
643643
reverse:
644-
/// Created with the method `.rsplit()`.
644+
#[doc="Created with the method `.rsplit()`."]
645645
struct RSplit;
646646
stability:
647647
#[stable(feature = "rust1", since = "1.0.0")]
@@ -652,10 +652,10 @@ generate_pattern_iterators! {
652652

653653
generate_pattern_iterators! {
654654
forward:
655-
/// Created with the method `.split_terminator()`.
655+
#[doc="Created with the method `.split_terminator()`."]
656656
struct SplitTerminator;
657657
reverse:
658-
/// Created with the method `.rsplit_terminator()`.
658+
#[doc="Created with the method `.rsplit_terminator()`."]
659659
struct RSplitTerminator;
660660
stability:
661661
#[stable(feature = "rust1", since = "1.0.0")]
@@ -698,10 +698,10 @@ impl<'a, P: Pattern<'a>> SplitNInternal<'a, P> {
698698

699699
generate_pattern_iterators! {
700700
forward:
701-
/// Created with the method `.splitn()`.
701+
#[doc="Created with the method `.splitn()`."]
702702
struct SplitN;
703703
reverse:
704-
/// Created with the method `.rsplitn()`.
704+
#[doc="Created with the method `.rsplitn()`."]
705705
struct RSplitN;
706706
stability:
707707
#[stable(feature = "rust1", since = "1.0.0")]
@@ -732,10 +732,10 @@ impl<'a, P: Pattern<'a>> MatchIndicesInternal<'a, P> {
732732

733733
generate_pattern_iterators! {
734734
forward:
735-
/// Created with the method `.match_indices()`.
735+
#[doc="Created with the method `.match_indices()`."]
736736
struct MatchIndices;
737737
reverse:
738-
/// Created with the method `.rmatch_indices()`.
738+
#[doc="Created with the method `.rmatch_indices()`."]
739739
struct RMatchIndices;
740740
stability:
741741
#[unstable(feature = "core",
@@ -773,10 +773,10 @@ impl<'a, P: Pattern<'a>> MatchesInternal<'a, P> {
773773

774774
generate_pattern_iterators! {
775775
forward:
776-
/// Created with the method `.matches()`.
776+
#[doc="Created with the method `.matches()`."]
777777
struct Matches;
778778
reverse:
779-
/// Created with the method `.rmatches()`.
779+
#[doc="Created with the method `.rmatches()`."]
780780
struct RMatches;
781781
stability:
782782
#[unstable(feature = "core", reason = "type got recently added")]

trunk/src/liblibc/lib.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,10 @@ pub use funcs::bsd43::*;
146146
#[link(name = "m")]
147147
extern {}
148148

149-
#[cfg(all(target_env = "musl", not(test)))]
149+
// When compiling rust with musl, statically include libc.a in liblibc.rlib.
150+
// A cargo build of the libc crate will therefore automatically pick up the
151+
// libc.a symbols because liblibc is transitively linked to by the stdlib.
152+
#[cfg(all(target_env = "musl", not(feature = "cargo-build"), not(test)))]
150153
#[link(name = "c", kind = "static")]
151154
extern {}
152155

trunk/src/librustc/middle/traits/project.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,15 +389,19 @@ fn opt_normalize_projection_type<'a,'b,'tcx>(
389389
}
390390
}
391391
Ok(ProjectedTy::NoProgress(projected_ty)) => {
392+
debug!("normalize_projection_type: projected_ty={} no progress",
393+
projected_ty.repr(selcx.tcx()));
392394
Some(Normalized {
393395
value: projected_ty,
394396
obligations: vec!()
395397
})
396398
}
397399
Err(ProjectionTyError::TooManyCandidates) => {
400+
debug!("normalize_projection_type: too many candidates");
398401
None
399402
}
400403
Err(ProjectionTyError::TraitSelectionError(_)) => {
404+
debug!("normalize_projection_type: ERROR");
401405
// if we got an error processing the `T as Trait` part,
402406
// just return `ty::err` but add the obligation `T :
403407
// Trait`, which when processed will cause the error to be

trunk/src/librustc_back/sha2.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,7 @@ pub struct Sha256 {
482482

483483
impl Sha256 {
484484
/// Construct a new instance of a SHA-256 digest.
485+
/// Do not – under any circumstances – use this where timing attacks might be possible!
485486
pub fn new() -> Sha256 {
486487
Sha256 {
487488
engine: Engine256::new(&H256)

trunk/src/librustc_typeck/check/method/probe.rs

Lines changed: 46 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,12 @@ struct Candidate<'tcx> {
5959
}
6060

6161
enum CandidateKind<'tcx> {
62-
InherentImplCandidate(/* Impl */ ast::DefId, subst::Substs<'tcx>),
62+
InherentImplCandidate(/* Impl */ ast::DefId, subst::Substs<'tcx>,
63+
/* Normalize obligations */ Vec<traits::PredicateObligation<'tcx>>),
6364
ObjectCandidate(/* Trait */ ast::DefId, /* method_num */ usize, /* vtable index */ usize),
6465
ExtensionImplCandidate(/* Impl */ ast::DefId, ty::TraitRef<'tcx>,
65-
subst::Substs<'tcx>, ItemIndex),
66+
subst::Substs<'tcx>, ItemIndex,
67+
/* Normalize obligations */ Vec<traits::PredicateObligation<'tcx>>),
6668
ClosureCandidate(/* Trait */ ast::DefId, ItemIndex),
6769
WhereClauseCandidate(ty::PolyTraitRef<'tcx>, ItemIndex),
6870
ProjectionCandidate(ast::DefId, ItemIndex),
@@ -398,16 +400,24 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
398400
}
399401

400402
let (impl_ty, impl_substs) = self.impl_ty_and_substs(impl_def_id);
401-
let impl_ty = self.fcx.instantiate_type_scheme(self.span, &impl_substs, &impl_ty);
403+
let impl_ty = impl_ty.subst(self.tcx(), &impl_substs);
402404

403405
// Determine the receiver type that the method itself expects.
404-
let xform_self_ty =
405-
self.xform_self_ty(&item, impl_ty, &impl_substs);
406+
let xform_self_ty = self.xform_self_ty(&item, impl_ty, &impl_substs);
407+
408+
// We can't use normalize_associated_types_in as it will pollute the
409+
// fcx's fulfillment context after this probe is over.
410+
let cause = traits::ObligationCause::misc(self.span, self.fcx.body_id);
411+
let mut selcx = &mut traits::SelectionContext::new(self.fcx.infcx(), self.fcx);
412+
let traits::Normalized { value: xform_self_ty, obligations } =
413+
traits::normalize(selcx, cause, &xform_self_ty);
414+
debug!("assemble_inherent_impl_probe: xform_self_ty = {:?}",
415+
xform_self_ty.repr(self.tcx()));
406416

407417
self.inherent_candidates.push(Candidate {
408418
xform_self_ty: xform_self_ty,
409419
item: item,
410-
kind: InherentImplCandidate(impl_def_id, impl_substs)
420+
kind: InherentImplCandidate(impl_def_id, impl_substs, obligations)
411421
});
412422
}
413423

@@ -653,12 +663,24 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
653663
impl_trait_ref.self_ty(),
654664
impl_trait_ref.substs);
655665

666+
// Normalize the receiver. We can't use normalize_associated_types_in
667+
// as it will pollute the fcx's fulfillment context after this probe
668+
// is over.
669+
let cause = traits::ObligationCause::misc(self.span, self.fcx.body_id);
670+
let mut selcx = &mut traits::SelectionContext::new(self.fcx.infcx(), self.fcx);
671+
let traits::Normalized { value: xform_self_ty, obligations } =
672+
traits::normalize(selcx, cause, &xform_self_ty);
673+
656674
debug!("xform_self_ty={}", xform_self_ty.repr(self.tcx()));
657675

658676
self.extension_candidates.push(Candidate {
659677
xform_self_ty: xform_self_ty,
660678
item: item.clone(),
661-
kind: ExtensionImplCandidate(impl_def_id, impl_trait_ref, impl_substs, item_index)
679+
kind: ExtensionImplCandidate(impl_def_id,
680+
impl_trait_ref,
681+
impl_substs,
682+
item_index,
683+
obligations)
662684
});
663685
});
664686
}
@@ -1026,8 +1048,8 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
10261048
// match as well (or at least may match, sometimes we
10271049
// don't have enough information to fully evaluate).
10281050
match probe.kind {
1029-
InherentImplCandidate(impl_def_id, ref substs) |
1030-
ExtensionImplCandidate(impl_def_id, _, ref substs, _) => {
1051+
InherentImplCandidate(impl_def_id, ref substs, ref ref_obligations) |
1052+
ExtensionImplCandidate(impl_def_id, _, ref substs, _, ref ref_obligations) => {
10311053
let selcx = &mut traits::SelectionContext::new(self.infcx(), self.fcx);
10321054
let cause = traits::ObligationCause::misc(self.span, self.fcx.body_id);
10331055

@@ -1046,8 +1068,10 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
10461068
debug!("impl_obligations={}", obligations.repr(self.tcx()));
10471069

10481070
// Evaluate those obligations to see if they might possibly hold.
1049-
obligations.iter().all(|o| selcx.evaluate_obligation(o)) &&
1050-
norm_obligations.iter().all(|o| selcx.evaluate_obligation(o))
1071+
obligations.iter()
1072+
.chain(norm_obligations.iter()).chain(ref_obligations.iter())
1073+
.all(|o| selcx.evaluate_obligation(o))
1074+
10511075
}
10521076

10531077
ProjectionCandidate(..) |
@@ -1281,13 +1305,13 @@ impl<'tcx> Candidate<'tcx> {
12811305
Pick {
12821306
item: self.item.clone(),
12831307
kind: match self.kind {
1284-
InherentImplCandidate(def_id, _) => {
1308+
InherentImplCandidate(def_id, _, _) => {
12851309
InherentImplPick(def_id)
12861310
}
12871311
ObjectCandidate(def_id, item_num, real_index) => {
12881312
ObjectPick(def_id, item_num, real_index)
12891313
}
1290-
ExtensionImplCandidate(def_id, _, _, index) => {
1314+
ExtensionImplCandidate(def_id, _, _, index, _) => {
12911315
ExtensionImplPick(def_id, index)
12921316
}
12931317
ClosureCandidate(trait_def_id, index) => {
@@ -1315,9 +1339,9 @@ impl<'tcx> Candidate<'tcx> {
13151339

13161340
fn to_source(&self) -> CandidateSource {
13171341
match self.kind {
1318-
InherentImplCandidate(def_id, _) => ImplSource(def_id),
1342+
InherentImplCandidate(def_id, _, _) => ImplSource(def_id),
13191343
ObjectCandidate(def_id, _, _) => TraitSource(def_id),
1320-
ExtensionImplCandidate(def_id, _, _, _) => ImplSource(def_id),
1344+
ExtensionImplCandidate(def_id, _, _, _, _) => ImplSource(def_id),
13211345
ClosureCandidate(trait_def_id, _) => TraitSource(trait_def_id),
13221346
WhereClauseCandidate(ref trait_ref, _) => TraitSource(trait_ref.def_id()),
13231347
ProjectionCandidate(trait_def_id, _) => TraitSource(trait_def_id),
@@ -1335,7 +1359,7 @@ impl<'tcx> Candidate<'tcx> {
13351359
ClosureCandidate(trait_def_id, item_num) => {
13361360
Some((trait_def_id, item_num))
13371361
}
1338-
ExtensionImplCandidate(_, ref trait_ref, _, item_num) => {
1362+
ExtensionImplCandidate(_, ref trait_ref, _, item_num, _) => {
13391363
Some((trait_ref.def_id, item_num))
13401364
}
13411365
WhereClauseCandidate(ref trait_ref, item_num) => {
@@ -1359,13 +1383,14 @@ impl<'tcx> Repr<'tcx> for Candidate<'tcx> {
13591383
impl<'tcx> Repr<'tcx> for CandidateKind<'tcx> {
13601384
fn repr(&self, tcx: &ty::ctxt<'tcx>) -> String {
13611385
match *self {
1362-
InherentImplCandidate(ref a, ref b) =>
1363-
format!("InherentImplCandidate({},{})", a.repr(tcx), b.repr(tcx)),
1386+
InherentImplCandidate(ref a, ref b, ref c) =>
1387+
format!("InherentImplCandidate({},{},{})", a.repr(tcx), b.repr(tcx),
1388+
c.repr(tcx)),
13641389
ObjectCandidate(a, b, c) =>
13651390
format!("ObjectCandidate({},{},{})", a.repr(tcx), b, c),
1366-
ExtensionImplCandidate(ref a, ref b, ref c, ref d) =>
1367-
format!("ExtensionImplCandidate({},{},{},{})", a.repr(tcx), b.repr(tcx),
1368-
c.repr(tcx), d),
1391+
ExtensionImplCandidate(ref a, ref b, ref c, ref d, ref e) =>
1392+
format!("ExtensionImplCandidate({},{},{},{},{})", a.repr(tcx), b.repr(tcx),
1393+
c.repr(tcx), d, e.repr(tcx)),
13691394
ClosureCandidate(ref a, ref b) =>
13701395
format!("ClosureCandidate({},{})", a.repr(tcx), b),
13711396
WhereClauseCandidate(ref a, ref b) =>

trunk/src/librustc_typeck/constrained_type_params.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,21 @@ pub enum Parameter {
1919
Region(ty::EarlyBoundRegion),
2020
}
2121

22+
/// Returns the list of parameters that are constrained by the type `ty`
23+
/// - i.e. the value of each parameter in the list is uniquely determined
24+
/// by `ty` (see RFC 447).
2225
pub fn parameters_for_type<'tcx>(ty: Ty<'tcx>) -> Vec<Parameter> {
23-
ty.walk()
24-
.flat_map(|ty| parameters_for_type_shallow(ty))
25-
.collect()
26+
let mut result = vec![];
27+
ty::maybe_walk_ty(ty, |t| {
28+
if let ty::TyProjection(..) = t.sty {
29+
false // projections are not injective.
30+
} else {
31+
result.append(&mut parameters_for_type_shallow(t));
32+
// non-projection type constructors are injective.
33+
true
34+
}
35+
});
36+
result
2637
}
2738

2839
pub fn parameters_for_trait_ref<'tcx>(trait_ref: &ty::TraitRef<'tcx>) -> Vec<Parameter> {

trunk/src/librustdoc/html/render.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -456,13 +456,15 @@ fn build_index(krate: &clean::Crate, cache: &mut Cache) -> io::Result<String> {
456456
let did = ast_util::local_def(pid);
457457
match paths.get(&did) {
458458
Some(&(ref fqp, _)) => {
459+
// Needed to determine `self` type.
460+
let parent_basename = Some(fqp[fqp.len() - 1].clone());
459461
search_index.push(IndexItem {
460462
ty: shortty(item),
461463
name: item.name.clone().unwrap(),
462464
path: fqp[..fqp.len() - 1].connect("::"),
463465
desc: shorter(item.doc_value()),
464466
parent: Some(did),
465-
search_type: None,
467+
search_type: get_index_search_type(&item, parent_basename),
466468
});
467469
},
468470
None => {}

0 commit comments

Comments
 (0)