Prohibit patterns in trait methods without bodies
This commit is contained in:
parent
a6b3b01b5f
commit
811a2b91de
@ -4023,9 +4023,9 @@ Methods that take either `self` or `Box<Self>` can optionally place them in a
|
||||
mutable variable by prefixing them with `mut` (similar to regular arguments):
|
||||
|
||||
```
|
||||
trait Changer {
|
||||
fn change(mut self) -> Self;
|
||||
fn modify(mut self: Box<Self>) -> Box<Self>;
|
||||
trait Changer: Sized {
|
||||
fn change(mut self) {}
|
||||
fn modify(mut self: Box<Self>) {}
|
||||
}
|
||||
```
|
||||
|
||||
|
@ -192,6 +192,12 @@
|
||||
"safe access to extern statics was erroneously allowed"
|
||||
}
|
||||
|
||||
declare_lint! {
|
||||
pub PATTERNS_IN_FNS_WITHOUT_BODY,
|
||||
Warn,
|
||||
"patterns in functions without body were erroneously allowed"
|
||||
}
|
||||
|
||||
/// Does nothing as a lint pass, but registers some `Lint`s
|
||||
/// which are used by other parts of the compiler.
|
||||
#[derive(Copy, Clone)]
|
||||
@ -228,7 +234,8 @@ fn get_lints(&self) -> LintArray {
|
||||
SUPER_OR_SELF_IN_GLOBAL_PATH,
|
||||
HR_LIFETIME_IN_ASSOC_TYPE,
|
||||
LIFETIME_UNDERSCORE,
|
||||
SAFE_EXTERN_STATICS
|
||||
SAFE_EXTERN_STATICS,
|
||||
PATTERNS_IN_FNS_WITHOUT_BODY
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -212,6 +212,10 @@ macro_rules! add_lint_group {
|
||||
id: LintId::of(SAFE_EXTERN_STATICS),
|
||||
reference: "issue 36247 <https://github.com/rust-lang/rust/issues/35112>",
|
||||
},
|
||||
FutureIncompatibleInfo {
|
||||
id: LintId::of(PATTERNS_IN_FNS_WITHOUT_BODY),
|
||||
reference: "issue #35203 <https://github.com/rust-lang/rust/issues/35203>",
|
||||
},
|
||||
]);
|
||||
|
||||
// Register renamed and removed lints
|
||||
|
@ -190,8 +190,16 @@ fn visit_item(&mut self, item: &Item) {
|
||||
}
|
||||
ItemKind::Trait(.., ref trait_items) => {
|
||||
for trait_item in trait_items {
|
||||
if let TraitItemKind::Method(ref sig, _) = trait_item.node {
|
||||
if let TraitItemKind::Method(ref sig, ref block) = trait_item.node {
|
||||
self.check_trait_fn_not_const(sig.constness);
|
||||
if block.is_none() {
|
||||
self.check_decl_no_pat(&sig.decl, |span, _| {
|
||||
self.session.add_lint(lint::builtin::PATTERNS_IN_FNS_WITHOUT_BODY,
|
||||
trait_item.id, span,
|
||||
"patterns aren't allowed in methods \
|
||||
without bodies".to_string());
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
23
src/test/compile-fail/no-patterns-in-args-2.rs
Normal file
23
src/test/compile-fail/no-patterns-in-args-2.rs
Normal file
@ -0,0 +1,23 @@
|
||||
// Copyright 2016 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.
|
||||
|
||||
#![deny(patterns_in_fns_without_body)]
|
||||
|
||||
trait Tr {
|
||||
fn f1(mut arg: u8); //~ ERROR patterns aren't allowed in methods without bodies
|
||||
//~^ WARN was previously accepted
|
||||
fn f2(&arg: u8); //~ ERROR patterns aren't allowed in methods without bodies
|
||||
//~^ WARN was previously accepted
|
||||
fn g1(arg: u8); // OK
|
||||
fn g2(_: u8); // OK
|
||||
fn g3(u8); // OK
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -264,8 +264,8 @@ trait TraitChangeModeSelfRefToMut {
|
||||
|
||||
|
||||
#[cfg(cfail1)]
|
||||
trait TraitChangeModeSelfOwnToMut {
|
||||
fn method(self);
|
||||
trait TraitChangeModeSelfOwnToMut: Sized {
|
||||
fn method(self) {}
|
||||
}
|
||||
|
||||
#[cfg(not(cfail1))]
|
||||
@ -273,8 +273,8 @@ trait TraitChangeModeSelfOwnToMut {
|
||||
#[rustc_clean(label="Hir", cfg="cfail3")]
|
||||
#[rustc_metadata_dirty(cfg="cfail2")]
|
||||
#[rustc_metadata_clean(cfg="cfail3")]
|
||||
trait TraitChangeModeSelfOwnToMut {
|
||||
fn method(mut self);
|
||||
trait TraitChangeModeSelfOwnToMut: Sized {
|
||||
fn method(mut self) {}
|
||||
}
|
||||
|
||||
|
||||
|
@ -14,7 +14,7 @@ struct X {
|
||||
}
|
||||
|
||||
trait Changer {
|
||||
fn change(mut self) -> Self;
|
||||
fn change(self) -> Self;
|
||||
}
|
||||
|
||||
impl Changer for X {
|
||||
|
@ -17,7 +17,7 @@ struct X {
|
||||
}
|
||||
|
||||
trait Changer {
|
||||
fn change(mut self: Box<Self>) -> Box<Self>;
|
||||
fn change(self: Box<Self>) -> Box<Self>;
|
||||
}
|
||||
|
||||
impl Changer for X {
|
||||
|
Loading…
Reference in New Issue
Block a user