rust/tests/ui/coverage-attr/allowed-positions.rs

117 lines
2.7 KiB
Rust

//! 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 ();
}