Commit Graph

4397 Commits

Author SHA1 Message Date
bors
1b46b007d7 auto merge of #17784 : bkoropoff/rust/issue-17780, r=pcwalton
This fixes a soundness problem where `Fn` unboxed closures can mutate free variables in the environment.
The following presently builds:

```rust
#![feature(unboxed_closures, overloaded_calls)]

fn main() {
    let mut x = 0u;
    let _f = |&:| x = 42;
}
```

However, this is equivalent to writing the following, which borrowck rightly rejects:

```rust
struct F<'a> {
    x: &'a mut uint
}

impl<'a> Fn<(),()> for F<'a> {
    #[rust_call_abi_hack]
    fn call(&self, _: ()) {
        *self.x = 42; // error: cannot assign to data in a `&` reference
    }
}

fn main() {
    let mut x = 0u;
    let _f = F { x: &mut x };
}
```

This problem is unique to unboxed closures; boxed closures cannot be invoked through an immutable reference and are not subject to it.

This change marks upvars of `Fn` unboxed closures as freely aliasable in mem_categorization, which causes borrowck to reject attempts to mutate or mutably borrow them.

@zwarich pointed out that even with this change, there are remaining soundness issues related to regionck (issue #17403).  This region issue affects boxed closures as well.

Closes issue #17780
2014-10-09 07:12:30 +00:00
bors
d569dfe37e auto merge of #17871 : michaelwoerister/rust/lldb-versioning, r=alexcrichton
Apart from making the build system determine the LLDB version, this PR also fixes an issue with enums in LLDB pretty printers. In order for GDB's pretty printers to know for sure if a field of some value is an enum discriminant, I had rustc mark discriminant fields with the `artificial` DWARF tag. This worked out nicely for GDB but it turns out that one can't access artificial fields from LLDB. So I changed the debuginfo representation so that enum discriminants are marked by the special field name `RUST$ENUM$DISR` instead, which works in both cases.

The PR does not activate the LLDB test suite yet.
2014-10-09 03:07:27 +00:00
Michael Woerister
98a0f9166c debuginfo: Don't mark struct fields as artificial.
LLDB doesn't allow for reading 'artifical' fields (fields that are generated by the compiler). So do not mark, slice fields, enum discriminants, and GcBox value fields as artificial.
2014-10-08 11:52:06 +02:00
John Gallagher
7091fe3972 Remove use of final and override (now reserved) 2014-10-07 22:18:12 -04:00
Nick Cameron
3b0550c3a9 Rename slicing methods 2014-10-07 15:49:53 +13:00
Nick Cameron
59976942ea Use slice syntax instead of slice_to, etc. 2014-10-07 15:49:53 +13:00
bors
7c8fc95aca auto merge of #17803 : bkoropoff/rust/issue-17021, r=alexcrichton
This closes issue #17021.
2014-10-06 09:27:19 +00:00
bors
0e2f0acf22 auto merge of #17781 : P1start/rust/bitflags-lints, r=alexcrichton
Closes #17773.
2014-10-06 07:37:19 +00:00
P1start
e3ca987f74 Rename the file permission statics in std::io to be uppercase
For example, this renames `GroupRWX` to `GROUP_RWX`, and deprecates the old
name. Code using these statics should be updated accordingly.
2014-10-06 16:43:34 +13:00
bors
f50b56c62b auto merge of #17414 : jakub-/rust/issue-17405, r=alexcrichton
Fixes #17405.
Fixes #17518.
Fixes #17800.
2014-10-06 02:52:22 +00:00
Jakub Wieczorek
b9896cbf6e Fix handling of struct variants in a couple of places
Fixes #17405.
Fixes #17518.
Fixes #17800.
2014-10-05 22:32:47 +02:00
Brian Koropoff
24d7669099 Handle emitting debug info for unboxed closures
This fixes an ICE.  Closes issue #17021
2014-10-05 12:19:22 -07:00
bors
f56c1c91f3 auto merge of #17762 : bkoropoff/rust/issue-17734, r=alexcrichton
Closes issue #17734

r? @nick29581
2014-10-05 19:17:07 +00:00
bors
c586490715 auto merge of #17785 : P1start/rust/diagnostics, r=alexcrichton
Closes #17765.
Closes #15524.
Closes #14772.
2014-10-05 10:57:04 +00:00
Brian Koropoff
f74b1c4ee2 Categorize upvars in Fn unboxed closures as freely aliasable
This causes borrowck to correctly reject mutation or mutable borrows
of upvars in `Fn` unboxed closures since the closure environment is
aliasable.

This also tracks the responsible closure in the aliasability
information returned and uses it to give a helpful diagnostic.

Closes issue #17780
2014-10-05 00:24:10 -07:00
Brian Koropoff
ea3ab731a3 Track kind of closure in upvar categorization
Keep track of the kind of closure responsible for an upvar
2014-10-05 00:23:33 -07:00
bors
5660db2508 auto merge of #16970 : kmcallister/rust/llvm-unreachable, r=thestinger
I'm not sure how to add an automated test for this.
2014-10-05 07:17:09 +00:00
bors
3b8c528d08 auto merge of #17776 : luqmana/rust/ul, r=alexcrichton
Update our LLVM snapshot to master (as of ~ Wed Oct 1 18:49:58 2014 +0000). 

Since my patches have landed upstream this fixes #13429 and #7298.
2014-10-05 04:57:11 +00:00
Keegan McAllister
401aeaf6d3 Add intrinsics::unreachable 2014-10-04 20:09:09 -07:00
P1start
a29df44f51 Tweak ‘discriminant value already exists’ error message
Closes #15524.
2014-10-05 14:16:32 +13:00
P1start
88baca7486 Rename vector patterns to array patterns
Closes #17765.
2014-10-05 12:08:37 +13:00
bors
07aeac8ac8 auto merge of #17761 : bkoropoff/rust/issue-17758, r=alexcrichton
This fixes an ICE and closes issue #17758
2014-10-04 21:57:08 +00:00
bors
e434aa1cf7 auto merge of #17760 : bkoropoff/rust/issue-17737, r=eddyb
This is a quick fix.  In the long term, the `TyVisitor` interface should be expanded to better represent closure types.

Closes issue #17737
2014-10-04 17:47:06 +00:00
Luqman Aden
4b22178d32 Update LLVM. 2014-10-04 13:28:57 -04:00
Björn Steinbrink
2d93a0406b Register new snapshots 2014-10-04 15:44:50 +02:00
Brian Koropoff
1f7a8bcb4b Correctly generate drop glue for Box<str>
This fixes an ICE.  Closes issue #17734
2014-10-03 23:00:20 -07:00
Brian Koropoff
4c166abbbb Handle provided trait methods when giving inference error suggestions
This fixes an ICE.  Closes issue #17758
2014-10-03 22:36:54 -07:00
Brian Koropoff
8e455ea07c Fix type visitor glue for unboxed closures
This is a quick fix that prevents an ICE by mimicing the visitor
glue for boxed closures and bare functions.  Ideally, the `TyVisitor`
interface will be improved in the future to allow representing
more information about unboxed closures such as Fn/FnMut/FnOnce
status, capture mode, and captured free variable types and offsets.

Closes issue #17737
2014-10-03 19:40:19 -07:00
bors
136ab3c6b1 auto merge of #17731 : bkoropoff/rust/unboxed-by-ref, r=pcwalton
This began as an attempt to fix an ICE in borrowck (issue #17655), but the rabbit hole went pretty deep.  I ended up plumbing support for capture-by-reference unboxed closures all the way into trans.

Closes issue #17655.
2014-10-04 00:17:04 +00:00
P1start
073a1abff2 Report trait/impl sig inconsistency before method/body inconsistency
Closes #15657.
2014-10-03 20:39:56 +13:00
P1start
94bcd3539c Set the non_uppercase_statics lint to warn by default 2014-10-03 20:39:56 +13:00
Brian Koropoff
c4c19fe960 Correctly trans capture-by-ref unboxed closures
Store references to the freevars instead of copies when constructing
the environment and insert an additional load when reading them from
the environment.
2014-10-02 21:08:45 -07:00
Brian Koropoff
72dc0f5f82 Return correct types for capture-by-ref unboxed closure upvars
Treat upvars of capture-by-reference unboxed closures as references
with appropriate regions and mutability.
2014-10-02 21:08:45 -07:00
Brian Koropoff
931f59f214 Fix categorization of upvars of capture-by-reference unboxed closures
In particular, this causes mutation of an upvar to correctly mark
it as mutable during adjustment.  This makes borrowck correctly
flag conflicting borrows, etc.

We still seem to generate incorrect code in trans which copies the upvar
by value into the closure.  This remains to be fixed.
2014-10-02 21:08:45 -07:00
Brian Koropoff
4e5666eace Fix missing entries in upvar borrows map for capture-by-ref unboxed closures
This prevents a later ICE in borrowck.

Closes issue #17655
2014-10-02 21:08:08 -07:00
Alex Crichton
7ae802f57b rollup merge of #17666 : eddyb/take-garbage-out
Conflicts:
	src/libcollections/lib.rs
	src/libcore/lib.rs
	src/librustdoc/lib.rs
	src/librustrt/lib.rs
	src/libserialize/lib.rs
	src/libstd/lib.rs
	src/test/run-pass/issue-8898.rs
2014-10-02 14:53:18 -07:00
Alex Crichton
9998052e21 rollup merge of #17722 : jakub-/issue-17169 2014-10-02 14:51:10 -07:00
Alex Crichton
51820b610e rollup merge of #17646 : bkoropoff/cast-ice 2014-10-02 14:50:08 -07:00
Jakub Wieczorek
f2973f63a3 Fix cross-crate tuple structs in statics
Fixes #17169.
Fixes #17649.
2014-10-02 21:31:06 +02:00
Aaron Turon
d2ea0315e0 Revert "Use slice syntax instead of slice_to, etc."
This reverts commit 40b9f5ded5.
2014-10-02 11:48:07 -07:00
Aaron Turon
c0c6c89589 Revert "Remove the _ suffix from slice methods."
This reverts commit df2f1fa768.
2014-10-02 11:47:58 -07:00
Eduard Burtescu
aa0b350c97 docs: remove mentions of Gc. 2014-10-02 16:59:31 +03:00
Eduard Burtescu
8a91d33ee7 rustc: remove support for Gc. 2014-10-02 16:59:31 +03:00
Eduard Burtescu
d1a57e479c syntax: ast: remove TyBox and UnBox. 2014-10-02 16:36:01 +03:00
bors
b419e9e739 auto merge of #17663 : eddyb/rust/method-origin-subst, r=nikomatsakis
Fixes #17662.
2014-10-02 13:22:21 +00:00
bors
84a4a07bbd auto merge of #17434 : P1start/rust/borrowck-messages, r=nikomatsakis
This was originally part of #17215.

Closes #15506.
Closes #15630.
Closes #17263.

This also partially implements #15838.
2014-10-02 11:32:25 +00:00
P1start
02c6ebde7e Change the use of moved value error to be more accurate
Previously it output `partially moved` to eagerly. This updates it to be more
accurate and output `collaterally moved` for use of values that were invalidated
by moves out of different fields in the same struct.

Closes #15630.
2014-10-02 15:51:05 +13:00
Nick Cameron
df2f1fa768 Remove the _ suffix from slice methods.
Deprecates slicing methods from ImmutableSlice/MutableSlice in favour of slicing syntax or the methods in Slice/SliceMut.

Closes #17273.
2014-10-02 13:19:45 +13:00
Nick Cameron
40b9f5ded5 Use slice syntax instead of slice_to, etc. 2014-10-02 13:19:45 +13:00
P1start
35ff2def5d Clarify some borrowck errors
Closes #17263.
2014-10-02 11:21:59 +13:00