Commit graph

7497 commits

Author SHA1 Message Date
Manish Goregaokar
7e6829938c
Rollup merge of #48481 - Manishearth:dyn-paren, r=petrochenkov
Allow parentheses in `dyn (Trait)`

r? @eddyb @nikomatsakis
2018-02-24 15:52:16 -08:00
Manish Goregaokar
0957572109
Rollup merge of #48197 - bobtwinkles:two_phase_borrow_on_ops, r=nikomatsakis
Allow two-phase borrows of &mut self in ops

We need two-phase borrows of ops to be in the initial NLL release since without them lots of existing code will break. Fixes #48129.
CC @pnkfelix  and @nikomatsakis

r? @pnkfelix
2018-02-24 15:52:06 -08:00
Manish Goregaokar
182f8820c4 Rollup merge of #48061 - nikomatsakis:nll-do-not-run-mir-typeck-twice, r=eddyb
Fixes #47311.
r? @nrc
2018-02-24 12:48:03 -08:00
Manish Goregaokar
a1a1409647 Rollup merge of #48317 - ExpHP:unused-unsafe-is-no-fn, r=estebank
unused_unsafe: don't label irrelevant fns

Fixes #48131

Diagnostic bugfix to remove an errant note.  Stops the search for an enclosing unsafe scope at the first safe fn encountered.

```rust
pub unsafe fn outer() {
    fn inner() {
        unsafe { /* unnecessary */ }
    }

    inner()
}
```

**Before:**

```
warning: unnecessary `unsafe` block
 --> src/main.rs:3:9
  |
1 | pub unsafe fn outer() {
  | --------------------- because it's nested under this `unsafe` fn
2 |     fn inner() {
3 |         unsafe { /* unnecessary */ }
  |         ^^^^^^ unnecessary `unsafe` block
  |
  = note: #[warn(unused_unsafe)] on by default
```

**After:**

```
warning: unnecessary `unsafe` block
 --> src/main.rs:3:9
  |
3 |         unsafe { /* unnecessary */ }
  |         ^^^^^^ unnecessary `unsafe` block
  |
  = note: #[warn(unused_unsafe)] on by default
```
2018-02-24 12:48:01 -08:00
Manish Goregaokar
b52b33a386 Rollup merge of #48143 - nikomatsakis:termination_trait_in_tests, r=eddyb
Termination trait in tests

Support the `Termination` trait in unit tests (cc https://github.com/rust-lang/rust/issues/43301)

Also, a drive-by fix for #47075.

This is joint work with @bkchr.
2018-02-24 12:47:58 -08:00
Manish Goregaokar
a79e5e210e Rollup merge of #48084 - cramertj:impl-trait-errors, r=nikomatsakis
Error on nested impl Trait and path projections from impl Trait

cc #34511

r? @nikomatsakis
2018-02-24 12:47:58 -08:00
Manish Goregaokar
25ec810921
Rollup merge of #47987 - Zoxc:rm-recursion-checking, r=eddyb
Remove "static item recursion checking" in favor of relying on cycle checks in the query engine

Tests are changed to use the cycle check error message instead. Some duplicate tests are removed.

r? @eddyb
2018-02-24 08:55:36 -08:00
Manish Goregaokar
4c73f82614 Add test 2018-02-23 13:30:26 -08:00
Manish Goregaokar
9f36a35e61
Rollup merge of #48221 - rkruppe:improve-ctypes-lint, r=estebank
Overhaul improper_ctypes output

This snowballed into a rather big set of improvements to the diagnostics of the improper_ctypes lint. See commits for details, including effects of each change on the `compile-fail/improper-ctypes.rs` test (now a UI test), which is pretty gnarly and hopefully not representative of real code, but covers a lot of different error cases.

Fixes #42050
2018-02-23 10:24:52 -08:00
Niko Matsakis
2370b60529 update tests and reference files
The type checker invokes the borrow checker for closures it finds, so
removing the NLL type checker affects ordering of errors somewhat.
2018-02-23 10:40:57 -05:00
Niko Matsakis
068e3832cd update test -- we now give a slightly different error 2018-02-23 07:34:00 -05:00
Niko Matsakis
5f1e78f19a move Termination trait to std::process 2018-02-22 17:57:08 -05:00
Niko Matsakis
e446f706a8 put the "unit test" logic into libtest
Also make `std::termination` module public and rename feature.

The lib feature needs a different name from the language feature.
2018-02-22 17:56:24 -05:00
Guillaume Gomez
ad83b47802
Rollup merge of #48198 - csmoe:inform_type_annotations, r=estebank
inform user where to give a type annotation

should resolve #47777
previous pull request https://github.com/rust-lang/rust/pull/47982 was closed because of a mistaken rebase.
r? @estebank
2018-02-21 16:29:48 +01:00
Guillaume Gomez
af140ecdbc
Rollup merge of #48275 - matthiaskrgr:codespell, r=kennytm,varkor
fix more typos found by codespell.
2018-02-18 13:21:01 +01:00
Michael Lamparski
42df8c56cc unused_unsafe: don't label irrelevant fns 2018-02-17 22:31:14 -05:00
bors
e8f03b9438 Auto merge of #47544 - U007D:master, r=nikomatsakis
Relax termination_trait's error bound

As per [this conversation](https://github.com/withoutboats/failure/issues/130#issuecomment-358572413) with @withoutboats and @bkchr
2018-02-18 03:12:14 +00:00
Matthias Krüger
4452446292 fix more typos found by codespell. 2018-02-17 17:38:49 +01:00
moe
2cf683edc0
Merge branch 'master' into inform_type_annotations 2018-02-17 22:22:26 +08:00
bors
b85bd51c94 Auto merge of #47926 - mikhail-m1:subslice_pattern_array_drop2, r=nikomatsakis
add transform for uniform array move out

reworked second step for fix #34708
previous try #46686
r? @nikomatsakis
2018-02-17 08:44:41 +00:00
bors
efda9bae87 Auto merge of #45404 - giannicic:defaultimpl2, r=nikomatsakis
#37653 support `default impl` for specialization

this commit implements the second part of the `default impl` feature:

>  - a `default impl` need not include all items from the trait
>  - a `default impl` alone does not mean that a type implements the trait

The first point allows rustc to compile and run something like this:

```
trait Foo {
    fn foo_one(&self) -> &'static str;
    fn foo_two(&self) -> &'static str;
}

default impl<T> Foo for T {
    fn foo_one(&self) -> &'static str {
        "generic"
    }
}

struct MyStruct;

fn  main() {
    assert!(MyStruct.foo_one() == "generic");
}
```

but it shows a proper error if trying to call `MyStruct.foo_two()`

The second point allows a `default impl` to be considered as not implementing the `Trait` if it doesn't implement all the trait items.
The tests provided (in the compile-fail section) should cover all the possible trait resolutions.
Let me know if some tests is missed.

See [referenced ](https://github.com/rust-lang/rust/issues/37653) issue for further info

r? @nikomatsakis
2018-02-16 00:03:10 +00:00
Robin Kruppe
9b5f47ec48 [improper_ctypes] Overhaul primary label
- Always name the non-FFI-safe
- Explain *why* the type is not FFI-safe
- Stop vaguely gesturing at structs/enums/unions if the non-FFI-safe types occured in a field.

The last part is arguably a regression, but it's minor now that the non-FFI-safe type is actually named. Removing it avoids some code duplication.
2018-02-15 18:10:54 +01:00
Robin Kruppe
ae92dfac50 [improper_ctypes] Stop complaining about repr(usize) and repr(isize) enums
This dates back to at least #26583. At the time, usize and isize were considered ffi-unsafe to nudge people away from them, but this changed in the aforementioned PR, making it inconsistent to complain about it in enum discriminants. In fact, repr(usize) is probably the best way to interface with `enum Foo : size_t { ... }`.
2018-02-15 17:47:53 +01:00
Robin Kruppe
1f0e1a0439 Convert compile-fail/lint-ctypes.rs to ui test 2018-02-15 17:47:53 +01:00
Gianni Ciccarelli
220bb22e1b add Self: Trait<..> inside the param_env of a default impl 2018-02-15 15:31:05 +00:00
csmoe
20dcc72127 inform type annotations 2018-02-14 11:06:08 +08:00
Taylor Cramer
75f72c0de1 Make nested impl Trait a hard error 2018-02-13 17:34:26 -08:00
bobtwinkles
3118cbe41c Allow two-phase borrows of &mut self in ops
We need two-phase borrows of ops to be in the initial NLL release since without
them lots of existing code will break. Fixes #48129
2018-02-13 20:28:10 -05:00
Brad Gibson
7948afdc53 changed termination_trait's bound from Error to Debug; added compiletest header command and appropriate tests 2018-02-12 13:52:49 -08:00
bors
16362c737f Auto merge of #47843 - estebank:teach, r=nikomatsakis
Add `-Zteach` documentation

Add extra inline documentation to E0019, E0016, E0013, E0396, E0017,
E0018, E0010, E0022, E0030, E0029, E0033, E0026 and E0027.

Follow up to #47652.
2018-02-12 09:38:40 +00:00
bors
b8398d947d Auto merge of #47752 - mark-i-m:at-most-once-rep, r=nikomatsakis
Implement `?` macro repetition

See rust-lang/rfcs#2298 (with disposition merge)
2018-02-11 18:11:01 +00:00
bors
7f2baba121 Auto merge of #48092 - eddyb:discriminate-the-void, r=nikomatsakis
rustc_mir: insert a dummy access to places being matched on, when building MIR.

Fixes #47412 by adding a `_dummy = Discriminant(place)` before each `match place {...}`.

r? @nikomatsakis
2018-02-11 02:42:19 +00:00
kennytm
1e10ca0b03
Rollup merge of #48078 - alexcrichton:fix-required-const-and-proc-macro, r=eddyb
Disallow function pointers to #[rustc_args_required_const]

This commit disallows acquiring a function pointer to functions tagged as
`#[rustc_args_required_const]`. This is intended to be used as future-proofing
for the stdsimd crate to avoid taking a function pointer to any intrinsic which
has a hard requirement that one of the arguments is a constant value.

Note that the first commit here isn't related specifically to this feature, but was necessary to get this working in stdsimd!
2018-02-10 14:24:04 +08:00
John Kåre Alsaker
46a3f2fa18 Change error message for E0391 to "cyclic dependency detected" 2018-02-10 03:28:15 +01:00
John Kåre Alsaker
ae46434b79 Remove "static item recursion checking" in favor of relying on cycle checks in the query engine 2018-02-10 00:29:11 +01:00
Gianni Ciccarelli
2f22a929c6 add Self: Trait<..> inside the param_env of a default impl 2018-02-09 21:40:54 +00:00
Eduard-Mihai Burtescu
8af134e031 rustc_mir: insert a dummy access to places being matched on, when building MIR. 2018-02-09 23:25:10 +02:00
bors
3bcda48a30 Auto merge of #47802 - bobtwinkles:loop_false_edge, r=nikomatsakis
[NLL] Add false edges out of infinite loops

Resolves #46036 by adding a `cleanup` member to the `FalseEdges` terminator kind. There's also a small doc fix to one of the other comments in `into.rs` which I can pull out in to another PR if desired =)

This PR should pass CI but the test suite has been relatively unstable on my system so I'm not 100% sure.

r? @nikomatsakis
2018-02-09 13:04:17 +00:00
bors
afa8acce25 Auto merge of #47489 - pnkfelix:limit-2pb-issue-46747, r=nikomatsakis
NLL: Limit two-phase borrows to autoref-introduced borrows

This imposes a restriction on two-phase borrows so that it only applies to autoref-introduced borrows.

The goal is to ensure that our initial deployment of two-phase borrows is very conservative. We want it to still cover the `v.push(v.len());` example, but we do not want it to cover cases like `let imm = &v; let mu = &mut v; mu.push(imm.len());`

(Why do we want it to be conservative? Because when you are not conservative, then the results you get, at least with the current analysis, are tightly coupled to details of the MIR construction that we would rather remain invisible to the end user.)

Fix #46747

I decided, for this PR, to add a debug-flag `-Z two-phase-beyond-autoref`, to re-enable the more general approach. But my intention here is *not* that we would eventually turn on that debugflag by default; the main reason I added it was that I thought it was useful for writing tests to be able to write source that looks like desugared MIR.
2018-02-09 02:26:43 +00:00
Alex Crichton
7a20fc14ef Disallow function pointers to #[rustc_args_required_const]
This commit disallows acquiring a function pointer to functions tagged as
`#[rustc_args_required_const]`. This is intended to be used as future-proofing
for the stdsimd crate to avoid taking a function pointer to any intrinsic which
has a hard requirement that one of the arguments is a constant value.
2018-02-08 14:46:27 -08:00
Esteban Küber
51f0c0dc4c Move some E0XXX to ui 2018-02-08 09:09:09 -08:00
Mikhail Modin
31253d5557 add transform for uniform array move out 2018-02-08 14:27:55 +03:00
Felix S. Klock II
b55cd8cc7c Fleshed out the test a lot more. 2018-02-08 12:16:30 +01:00
Felix S. Klock II
81b93fa0b3 Test that autoref'ing beyond method receivers does not leak into two-phase borrows. 2018-02-08 12:16:30 +01:00
Felix S. Klock II
1855ab7424 Restrict two-phase borrows to solely borrows introduced via autoref.
Added `-Z two-phase-beyond-autoref` to bring back old behavior (mainly
to allow demonstration of desugared examples).

Updated tests to use aforementioned flag when necessary. (But in each
case where I added the flag, I made sure to also include a revision
without the flag so that one can readily see what the actual behavior
we expect is for the initial deployment of NLL.)
2018-02-08 12:16:30 +01:00
Gianni Ciccarelli
b20bfb1fc2 support default impl for specialization
not skipping any wfchecks on default impls
2018-02-07 18:31:39 +00:00
Gianni Ciccarelli
13e80af159 support default impl for specialization
a default impl should never be considered as implementing the
trait on its own -- regardless of whether it contains all items
or not
2018-02-07 18:31:39 +00:00
Gianni Ciccarelli
f5c55ff379 support default impl for specialization
a `default impl` need not include all items from the trait
    a `default impl` alone does not mean that a type implements the trait
2018-02-07 17:42:29 +00:00
Manish Goregaokar
e2b7458a97
Rollup merge of #48020 - RalfJung:type-alias-bounds, r=petrochenkov
Warn about more ignored bounds in type aliases

It seems that all bounds in type aliases are entirely ignored, not just type bounds. This extends the warning appropriately.

I assume this should be made a hard error with the next epoch? I can't see any reason to accept these programs. (And suddenly enforcing these type bounds would be a breaking change.)
2018-02-07 08:30:57 -08:00
Manish Goregaokar
993322e886
Rollup merge of #48018 - alexcrichton:require-const-arg, r=eddyb
rustc: Add `#[rustc_args_required_const]`

This commit adds a new unstable attribute to the compiler which requires that
arguments to a function are always provided as constants. The primary use case
for this is SIMD intrinsics where arguments are defined by vendors to be
constant and in LLVM they indeed must be constant as well.

For now this is mostly just a semantic guarantee in rustc that an argument is a
constant when invoked, phases like trans don't actually take advantage of it
yet. This means that we'll be able to use this in stdsimd but we won't be able
to remove the `constify_*` macros just yet. Hopefully soon though!
2018-02-07 08:30:56 -08:00