File tree 4 files changed +57
-0
lines changed
4 files changed +57
-0
lines changed Original file line number Diff line number Diff line change @@ -2103,6 +2103,30 @@ impl LintPass for PrivateNoMangleFns {
2103
2103
}
2104
2104
}
2105
2105
2106
+ #[ derive( Copy ) ]
2107
+ pub struct UsingTupleStructs ;
2108
+
2109
+ declare_lint ! ( USING_TUPLE_STRUCTS , Allow ,
2110
+ "detects tuple-like structures" ) ;
2111
+
2112
+ impl LintPass for UsingTupleStructs {
2113
+ fn get_lints ( & self ) -> LintArray {
2114
+ lint_array ! ( USING_TUPLE_STRUCTS )
2115
+ }
2116
+
2117
+ fn check_item ( & mut self , cx : & Context , it : & ast:: Item ) {
2118
+ if it. vis == ast:: Visibility :: Public {
2119
+ if let ast:: ItemStruct ( ref def, _) = it. node {
2120
+ if def. is_tuple_like ( ) {
2121
+ cx. span_lint ( USING_TUPLE_STRUCTS , it. span ,
2122
+ "standard library should not use tuple-like structures; \
2123
+ it hampers backward compatibility")
2124
+ }
2125
+ }
2126
+ }
2127
+ }
2128
+ }
2129
+
2106
2130
/// Forbids using the `#[feature(...)]` attribute
2107
2131
#[ derive( Copy ) ]
2108
2132
pub struct UnstableFeatures ;
Original file line number Diff line number Diff line change @@ -214,6 +214,7 @@ impl LintStore {
214
214
Stability ,
215
215
UnconditionalRecursion ,
216
216
PrivateNoMangleFns ,
217
+ UsingTupleStructs ,
217
218
) ;
218
219
219
220
add_builtin_with_new ! ( sess,
Original file line number Diff line number Diff line change @@ -1596,6 +1596,12 @@ pub struct StructDef {
1596
1596
pub ctor_id : Option < NodeId > ,
1597
1597
}
1598
1598
1599
+ impl StructDef {
1600
+ pub fn is_tuple_like ( & self ) -> bool {
1601
+ self . fields . len ( ) > 0 && self . fields [ 0 ] . node . kind . is_unnamed ( )
1602
+ }
1603
+ }
1604
+
1599
1605
/*
1600
1606
FIXME (#3300): Should allow items to be anonymous. Right now
1601
1607
we just use dummy names for anon items.
Original file line number Diff line number Diff line change
1
+ // Copyright 2015 The Rust Project Developers. See the COPYRIGHT
2
+ // file at the top-level directory of this distribution and at
3
+ // http://rust-lang.org/COPYRIGHT.
4
+ //
5
+ // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6
+ // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7
+ // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8
+ // option. This file may not be copied, modified, or distributed
9
+ // except according to those terms.
10
+
11
+ #![ deny( using_tuple_structs) ]
12
+ #![ allow( dead_code) ]
13
+
14
+ // regular struct is okay
15
+ pub struct S { x : usize , y : usize }
16
+
17
+ // enum-like struct is okay, too
18
+ pub struct ES ;
19
+
20
+ // tuple-like struct is not
21
+ pub struct TS ( usize ) ; //~ ERROR standard library should not use tuple-like
22
+
23
+ // but non-public one is
24
+ struct TSPrivate ( usize ) ;
25
+
26
+ fn main ( ) { }
You can’t perform that action at this time.
0 commit comments