1
Fork 0

Rollup merge of #68586 - Centril:repr-deny, r=pnkfelix

Make conflicting_repr_hints a deny-by-default c-future-compat lint

Closes https://github.com/rust-lang/rust/issues/68428.
cc https://github.com/rust-lang/rust/issues/68585.

r? @petrochenkov @pnkfelix
This commit is contained in:
Yuki Okushi 2020-01-29 18:56:26 +09:00 committed by GitHub
commit 8f1857a822
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 59 additions and 20 deletions

View file

@ -14,7 +14,7 @@ use rustc_hir::def_id::DefId;
use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor}; use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor};
use rustc_hir::DUMMY_HIR_ID; use rustc_hir::DUMMY_HIR_ID;
use rustc_hir::{self, HirId, Item, ItemKind, TraitItem, TraitItemKind}; use rustc_hir::{self, HirId, Item, ItemKind, TraitItem, TraitItemKind};
use rustc_session::lint::builtin::UNUSED_ATTRIBUTES; use rustc_session::lint::builtin::{CONFLICTING_REPR_HINTS, UNUSED_ATTRIBUTES};
use rustc_span::symbol::sym; use rustc_span::symbol::sym;
use rustc_span::Span; use rustc_span::Span;
use syntax::ast::Attribute; use syntax::ast::Attribute;
@ -196,7 +196,7 @@ impl CheckAttrVisitor<'tcx> {
self.tcx.codegen_fn_attrs(self.tcx.hir().local_def_id(hir_id)); self.tcx.codegen_fn_attrs(self.tcx.hir().local_def_id(hir_id));
} }
self.check_repr(attrs, span, target, item); self.check_repr(attrs, span, target, item, hir_id);
self.check_used(attrs, target); self.check_used(attrs, target);
} }
@ -357,6 +357,7 @@ impl CheckAttrVisitor<'tcx> {
span: &Span, span: &Span,
target: Target, target: Target,
item: Option<&Item<'_>>, item: Option<&Item<'_>>,
hir_id: HirId,
) { ) {
// Extract the names of all repr hints, e.g., [foo, bar, align] for: // Extract the names of all repr hints, e.g., [foo, bar, align] for:
// ``` // ```
@ -446,13 +447,15 @@ impl CheckAttrVisitor<'tcx> {
|| (is_simd && is_c) || (is_simd && is_c)
|| (int_reprs == 1 && is_c && item.map_or(false, |item| is_c_like_enum(item))) || (int_reprs == 1 && is_c && item.map_or(false, |item| is_c_like_enum(item)))
{ {
struct_span_err!( self.tcx
self.tcx.sess, .struct_span_lint_hir(
hint_spans.collect::<Vec<Span>>(), CONFLICTING_REPR_HINTS,
E0566, hir_id,
"conflicting representation hints", hint_spans.collect::<Vec<Span>>(),
) "conflicting representation hints",
.emit(); )
.code(rustc_errors::error_code!(E0566))
.emit();
} }
} }

View file

@ -18,6 +18,16 @@ declare_lint! {
}; };
} }
declare_lint! {
pub CONFLICTING_REPR_HINTS,
Deny,
"conflicts between `#[repr(..)]` hints that were previously accepted and used in practice",
@future_incompatible = FutureIncompatibleInfo {
reference: "issue #68585 <https://github.com/rust-lang/rust/issues/68585>",
edition: None,
};
}
declare_lint! { declare_lint! {
pub META_VARIABLE_MISUSE, pub META_VARIABLE_MISUSE,
Allow, Allow,
@ -520,6 +530,7 @@ declare_lint_pass! {
MACRO_USE_EXTERN_CRATE, MACRO_USE_EXTERN_CRATE,
MACRO_EXPANDED_MACRO_EXPORTS_ACCESSED_BY_ABSOLUTE_PATHS, MACRO_EXPANDED_MACRO_EXPORTS_ACCESSED_BY_ABSOLUTE_PATHS,
ILL_FORMED_ATTRIBUTE_INPUT, ILL_FORMED_ATTRIBUTE_INPUT,
CONFLICTING_REPR_HINTS,
META_VARIABLE_MISUSE, META_VARIABLE_MISUSE,
DEPRECATED_IN_FUTURE, DEPRECATED_IN_FUTURE,
AMBIGUOUS_ASSOCIATED_ITEMS, AMBIGUOUS_ASSOCIATED_ITEMS,

View file

@ -11,11 +11,13 @@ enum B {
} }
#[repr(C, u64)] //~ ERROR conflicting representation hints #[repr(C, u64)] //~ ERROR conflicting representation hints
//~^ WARN this was previously accepted
enum C { enum C {
C, C,
} }
#[repr(u32, u64)] //~ ERROR conflicting representation hints #[repr(u32, u64)] //~ ERROR conflicting representation hints
//~^ WARN this was previously accepted
enum D { enum D {
D, D,
} }

View file

@ -3,45 +3,52 @@ error[E0566]: conflicting representation hints
| |
LL | #[repr(C, u64)] LL | #[repr(C, u64)]
| ^ ^^^ | ^ ^^^
|
= note: `#[deny(conflicting_repr_hints)]` 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 #68585 <https://github.com/rust-lang/rust/issues/68585>
error[E0566]: conflicting representation hints error[E0566]: conflicting representation hints
--> $DIR/conflicting-repr-hints.rs:18:8 --> $DIR/conflicting-repr-hints.rs:19:8
| |
LL | #[repr(u32, u64)] LL | #[repr(u32, u64)]
| ^^^ ^^^ | ^^^ ^^^
|
= 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 #68585 <https://github.com/rust-lang/rust/issues/68585>
error[E0587]: type has conflicting packed and align representation hints error[E0587]: type has conflicting packed and align representation hints
--> $DIR/conflicting-repr-hints.rs:27:1 --> $DIR/conflicting-repr-hints.rs:29:1
| |
LL | struct F(i32); LL | struct F(i32);
| ^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^
error[E0587]: type has conflicting packed and align representation hints error[E0587]: type has conflicting packed and align representation hints
--> $DIR/conflicting-repr-hints.rs:31:1 --> $DIR/conflicting-repr-hints.rs:33:1
| |
LL | struct G(i32); LL | struct G(i32);
| ^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^
error[E0587]: type has conflicting packed and align representation hints error[E0587]: type has conflicting packed and align representation hints
--> $DIR/conflicting-repr-hints.rs:35:1 --> $DIR/conflicting-repr-hints.rs:37:1
| |
LL | struct H(i32); LL | struct H(i32);
| ^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^
error[E0634]: type has conflicting packed representation hints error[E0634]: type has conflicting packed representation hints
--> $DIR/conflicting-repr-hints.rs:38:1 --> $DIR/conflicting-repr-hints.rs:40:1
| |
LL | struct I(i32); LL | struct I(i32);
| ^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^
error[E0634]: type has conflicting packed representation hints error[E0634]: type has conflicting packed representation hints
--> $DIR/conflicting-repr-hints.rs:42:1 --> $DIR/conflicting-repr-hints.rs:44:1
| |
LL | struct J(i32); LL | struct J(i32);
| ^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^
error[E0587]: type has conflicting packed and align representation hints error[E0587]: type has conflicting packed and align representation hints
--> $DIR/conflicting-repr-hints.rs:48:1 --> $DIR/conflicting-repr-hints.rs:50:1
| |
LL | / union X { LL | / union X {
LL | | LL | |
@ -50,7 +57,7 @@ LL | | }
| |_^ | |_^
error[E0587]: type has conflicting packed and align representation hints error[E0587]: type has conflicting packed and align representation hints
--> $DIR/conflicting-repr-hints.rs:55:1 --> $DIR/conflicting-repr-hints.rs:57:1
| |
LL | / union Y { LL | / union Y {
LL | | LL | |
@ -59,7 +66,7 @@ LL | | }
| |_^ | |_^
error[E0587]: type has conflicting packed and align representation hints error[E0587]: type has conflicting packed and align representation hints
--> $DIR/conflicting-repr-hints.rs:62:1 --> $DIR/conflicting-repr-hints.rs:64:1
| |
LL | / union Z { LL | / union Z {
LL | | LL | |

View file

@ -2,6 +2,7 @@
struct Foo(u64, u64); struct Foo(u64, u64);
#[repr(C)] //~ ERROR conflicting representation hints #[repr(C)] //~ ERROR conflicting representation hints
//~^ WARN this was previously accepted
#[repr(simd)] //~ error: SIMD types are experimental #[repr(simd)] //~ error: SIMD types are experimental
struct Bar(u64, u64); struct Bar(u64, u64);

View file

@ -8,7 +8,7 @@ LL | #[repr(simd)]
= help: add `#![feature(repr_simd)]` to the crate attributes to enable = help: add `#![feature(repr_simd)]` to the crate attributes to enable
error[E0658]: SIMD types are experimental and possibly buggy error[E0658]: SIMD types are experimental and possibly buggy
--> $DIR/feature-gate-repr-simd.rs:5:1 --> $DIR/feature-gate-repr-simd.rs:6:1
| |
LL | #[repr(simd)] LL | #[repr(simd)]
| ^^^^^^^^^^^^^ | ^^^^^^^^^^^^^
@ -21,8 +21,13 @@ error[E0566]: conflicting representation hints
| |
LL | #[repr(C)] LL | #[repr(C)]
| ^ | ^
LL |
LL | #[repr(simd)] LL | #[repr(simd)]
| ^^^^ | ^^^^
|
= note: `#[deny(conflicting_repr_hints)]` 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 #68585 <https://github.com/rust-lang/rust/issues/68585>
error: aborting due to 3 previous errors error: aborting due to 3 previous errors

View file

@ -1,10 +1,12 @@
#[repr(C, u8)] //~ ERROR conflicting representation hints #[repr(C, u8)] //~ ERROR conflicting representation hints
//~^ WARN this was previously accepted
enum Foo { enum Foo {
A, A,
B, B,
} }
#[repr(C)] //~ ERROR conflicting representation hints #[repr(C)] //~ ERROR conflicting representation hints
//~^ WARN this was previously accepted
#[repr(u8)] #[repr(u8)]
enum Bar { enum Bar {
A, A,

View file

@ -3,14 +3,22 @@ error[E0566]: conflicting representation hints
| |
LL | #[repr(C, u8)] LL | #[repr(C, u8)]
| ^ ^^ | ^ ^^
|
= note: `#[deny(conflicting_repr_hints)]` 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 #68585 <https://github.com/rust-lang/rust/issues/68585>
error[E0566]: conflicting representation hints error[E0566]: conflicting representation hints
--> $DIR/issue-47094.rs:7:8 --> $DIR/issue-47094.rs:8:8
| |
LL | #[repr(C)] LL | #[repr(C)]
| ^ | ^
LL |
LL | #[repr(u8)] LL | #[repr(u8)]
| ^^ | ^^
|
= 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 #68585 <https://github.com/rust-lang/rust/issues/68585>
error: aborting due to 2 previous errors error: aborting due to 2 previous errors