Auto merge of #50390 - hdhoang:46205_deny_by_default, r=nikomatsakis
lint: deny incoherent_fundamental_impls by default Warn the ecosystem of the pending intent-to-disallow in #49799. There are 4 ICEs on my machine, look unrelated (having happened before in https://github.com/rust-lang/rust/issues/49146#issuecomment-384473523) ```rust thread 'main' panicked at 'assertion failed: position <= slice.len()', libserialize/leb128.rs:97:1 ``` ``` [run-pass] run-pass/allocator/xcrate-use2.rs [run-pass] run-pass/issue-12133-3.rs [run-pass] run-pass/issue-32518.rs [run-pass] run-pass/trait-default-method-xc-2.rs ``` r? @nikomatsakis
This commit is contained in:
commit
295d98069f
@ -239,3 +239,44 @@ error: invalid `crate_type` value
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
```
|
||||
|
||||
## incoherent-fundamental-impls
|
||||
|
||||
This lint detects potentially-conflicting impls that were erroneously allowed. Some
|
||||
example code that triggers this lint:
|
||||
|
||||
```rust,ignore
|
||||
pub trait Trait1<X> {
|
||||
type Output;
|
||||
}
|
||||
|
||||
pub trait Trait2<X> {}
|
||||
|
||||
pub struct A;
|
||||
|
||||
impl<X, T> Trait1<X> for T where T: Trait2<X> {
|
||||
type Output = ();
|
||||
}
|
||||
|
||||
impl<X> Trait1<Box<X>> for A {
|
||||
type Output = i32;
|
||||
}
|
||||
```
|
||||
|
||||
This will produce:
|
||||
|
||||
```text
|
||||
error: conflicting implementations of trait `Trait1<std::boxed::Box<_>>` for type `A`: (E0119)
|
||||
--> src/main.rs:13:1
|
||||
|
|
||||
9 | impl<X, T> Trait1<X> for T where T: Trait2<X> {
|
||||
| --------------------------------------------- first implementation here
|
||||
...
|
||||
13 | impl<X> Trait1<Box<X>> for A {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `A`
|
||||
|
|
||||
= note: #[deny(incoherent_fundamental_impls)] on by default
|
||||
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||
= note: for more information, see issue #46205 <https://github.com/rust-lang/rust/issues/46205>
|
||||
= note: downstream crates may implement trait `Trait2<std::boxed::Box<_>>` for type `A`
|
||||
```
|
||||
|
@ -117,47 +117,6 @@ warning: found struct without foreign-function-safe representation annotation in
|
||||
|
|
||||
```
|
||||
|
||||
## incoherent-fundamental-impls
|
||||
|
||||
This lint detects potentially-conflicting impls that were erroneously allowed. Some
|
||||
example code that triggers this lint:
|
||||
|
||||
```rust
|
||||
pub trait Trait1<X> {
|
||||
type Output;
|
||||
}
|
||||
|
||||
pub trait Trait2<X> {}
|
||||
|
||||
pub struct A;
|
||||
|
||||
impl<X, T> Trait1<X> for T where T: Trait2<X> {
|
||||
type Output = ();
|
||||
}
|
||||
|
||||
impl<X> Trait1<Box<X>> for A {
|
||||
type Output = i32;
|
||||
}
|
||||
```
|
||||
|
||||
This will produce:
|
||||
|
||||
```text
|
||||
warning: conflicting implementations of trait `Trait1<std::boxed::Box<_>>` for type `A`: (E0119)
|
||||
--> src/main.rs:13:1
|
||||
|
|
||||
9 | impl<X, T> Trait1<X> for T where T: Trait2<X> {
|
||||
| --------------------------------------------- first implementation here
|
||||
...
|
||||
13 | impl<X> Trait1<Box<X>> for A {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `A`
|
||||
|
|
||||
= note: #[warn(incoherent_fundamental_impls)] on by default
|
||||
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||
= note: for more information, see issue #46205 <https://github.com/rust-lang/rust/issues/46205>
|
||||
= note: downstream crates may implement trait `Trait2<std::boxed::Box<_>>` for type `A`
|
||||
```
|
||||
|
||||
## late-bound-lifetime-arguments
|
||||
|
||||
This lint detects detects generic lifetime arguments in path segments with
|
||||
|
@ -208,7 +208,7 @@ declare_lint! {
|
||||
|
||||
declare_lint! {
|
||||
pub INCOHERENT_FUNDAMENTAL_IMPLS,
|
||||
Warn,
|
||||
Deny,
|
||||
"potentially-conflicting impls were erroneously allowed"
|
||||
}
|
||||
|
||||
|
@ -8,8 +8,6 @@
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![deny(incoherent_fundamental_impls)]
|
||||
|
||||
pub trait Trait1<X> {
|
||||
type Output;
|
||||
}
|
||||
|
@ -1,36 +0,0 @@
|
||||
// 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.
|
||||
|
||||
// Check that the code for issue #43355 can run without an ICE, please remove
|
||||
// this test when it becomes an hard error.
|
||||
|
||||
pub trait Trait1<X> {
|
||||
type Output;
|
||||
}
|
||||
pub trait Trait2<X> {}
|
||||
|
||||
impl<X, T> Trait1<X> for T where T: Trait2<X> {
|
||||
type Output = ();
|
||||
}
|
||||
impl<X> Trait1<Box<X>> for A {
|
||||
type Output = i32;
|
||||
}
|
||||
|
||||
pub struct A;
|
||||
|
||||
fn f<X, T: Trait1<Box<X>>>() {
|
||||
println!("k: {}", ::std::mem::size_of::<<T as Trait1<Box<X>>>::Output>());
|
||||
}
|
||||
|
||||
pub fn g<X, T: Trait2<Box<X>>>() {
|
||||
f::<X, T>();
|
||||
}
|
||||
|
||||
fn main() {}
|
Loading…
x
Reference in New Issue
Block a user