File: allowed-positions.rs

package info (click to toggle)
rustc 1.85.0%2Bdfsg3-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental, sid, trixie
  • size: 893,396 kB
  • sloc: xml: 158,127; python: 35,830; javascript: 19,497; cpp: 19,002; sh: 17,245; ansic: 13,127; asm: 4,376; makefile: 1,051; perl: 29; lisp: 29; ruby: 19; sql: 11
file content (116 lines) | stat: -rw-r--r-- 2,754 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
//! Tests where the `#[coverage(..)]` attribute can and cannot be used.

//@ reference: attributes.coverage.allowed-positions

#![feature(coverage_attribute)]
#![feature(extern_types)]
#![feature(impl_trait_in_assoc_type)]
#![warn(unused_attributes)]
#![coverage(off)]

#[coverage(off)]
mod submod {}

#[coverage(off)] //~ ERROR coverage attribute not allowed here [E0788]
type MyTypeAlias = ();

#[coverage(off)] //~ ERROR [E0788]
trait MyTrait {
    #[coverage(off)] //~ ERROR [E0788]
    const TRAIT_ASSOC_CONST: u32;

    #[coverage(off)] //~ ERROR [E0788]
    type TraitAssocType;

    #[coverage(off)] //~ ERROR [E0788]
    fn trait_method(&self);

    #[coverage(off)]
    fn trait_method_with_default(&self) {}

    #[coverage(off)] //~ ERROR [E0788]
    fn trait_assoc_fn();
}

#[coverage(off)]
impl MyTrait for () {
    const TRAIT_ASSOC_CONST: u32 = 0;

    #[coverage(off)] //~ ERROR [E0788]
    type TraitAssocType = Self;

    #[coverage(off)]
    fn trait_method(&self) {}
    #[coverage(off)]
    fn trait_method_with_default(&self) {}
    #[coverage(off)]
    fn trait_assoc_fn() {}
}

trait HasAssocType {
    type T;
    fn constrain_assoc_type() -> Self::T;
}

impl HasAssocType for () {
    #[coverage(off)] //~ ERROR [E0788]
    type T = impl Copy;
    fn constrain_assoc_type() -> Self::T {}
}

#[coverage(off)] //~ ERROR [E0788]
struct MyStruct {
    #[coverage(off)] //~ ERROR [E0788]
    field: u32,
}

#[coverage(off)]
impl MyStruct {
    #[coverage(off)]
    fn method(&self) {}
    #[coverage(off)]
    fn assoc_fn() {}
}

extern "C" {
    #[coverage(off)] //~ ERROR [E0788]
    static X: u32;

    #[coverage(off)] //~ ERROR [E0788]
    type T;

    #[coverage(off)] //~ ERROR [E0788]
    fn foreign_fn();
}

#[coverage(off)]
fn main() {
    #[coverage(off)] //~ ERROR [E0788]
    let _ = ();

    // Currently not allowed on let statements, even if they bind to a closure.
    // It might be nice to support this as a special case someday, but trying
    // to define the precise boundaries of that special case might be tricky.
    #[coverage(off)] //~ ERROR [E0788]
    let _let_closure = || ();

    // In situations where attributes can already be applied to expressions,
    // the coverage attribute is allowed on closure expressions.
    let _closure_tail_expr = {
        #[coverage(off)]
        || ()
    };

    // Applying attributes to arbitrary expressions requires an unstable
    // feature, but if that feature were enabled then this would be allowed.
    let _closure_expr = #[coverage(off)] || ();
    //~^ ERROR attributes on expressions are experimental [E0658]

    match () {
        #[coverage(off)] //~ ERROR [E0788]
        () => (),
    }

    #[coverage(off)] //~ ERROR [E0788]
    return ();
}