116 lines
3.5 KiB
Rust
116 lines
3.5 KiB
Rust
|
|
//! Tests where the `#[sanitize(..)]` attribute can and cannot be used.
|
||
|
|
|
||
|
|
#![feature(sanitize)]
|
||
|
|
#![feature(extern_types)]
|
||
|
|
#![feature(impl_trait_in_assoc_type)]
|
||
|
|
#![warn(unused_attributes)]
|
||
|
|
#![sanitize(address = "off", thread = "on")]
|
||
|
|
|
||
|
|
#[sanitize(address = "off", thread = "on")]
|
||
|
|
mod submod {}
|
||
|
|
|
||
|
|
#[sanitize(address = "off")]
|
||
|
|
static FOO: u32 = 0;
|
||
|
|
|
||
|
|
#[sanitize(thread = "off")] //~ ERROR sanitize attribute not allowed here
|
||
|
|
static BAR: u32 = 0;
|
||
|
|
|
||
|
|
#[sanitize(address = "off")] //~ ERROR sanitize attribute not allowed here
|
||
|
|
type MyTypeAlias = ();
|
||
|
|
|
||
|
|
#[sanitize(address = "off")] //~ ERROR sanitize attribute not allowed here
|
||
|
|
trait MyTrait {
|
||
|
|
#[sanitize(address = "off")] //~ ERROR sanitize attribute not allowed here
|
||
|
|
const TRAIT_ASSOC_CONST: u32;
|
||
|
|
|
||
|
|
#[sanitize(address = "off")] //~ ERROR sanitize attribute not allowed here
|
||
|
|
type TraitAssocType;
|
||
|
|
|
||
|
|
#[sanitize(address = "off")] //~ ERROR sanitize attribute not allowed here
|
||
|
|
fn trait_method(&self);
|
||
|
|
|
||
|
|
#[sanitize(address = "off", thread = "on")]
|
||
|
|
fn trait_method_with_default(&self) {}
|
||
|
|
|
||
|
|
#[sanitize(address = "off")] //~ ERROR sanitize attribute not allowed here
|
||
|
|
fn trait_assoc_fn();
|
||
|
|
}
|
||
|
|
|
||
|
|
#[sanitize(address = "off")]
|
||
|
|
impl MyTrait for () {
|
||
|
|
const TRAIT_ASSOC_CONST: u32 = 0;
|
||
|
|
|
||
|
|
#[sanitize(address = "off")] //~ ERROR sanitize attribute not allowed here
|
||
|
|
type TraitAssocType = Self;
|
||
|
|
|
||
|
|
#[sanitize(address = "off", thread = "on")]
|
||
|
|
fn trait_method(&self) {}
|
||
|
|
#[sanitize(address = "off", thread = "on")]
|
||
|
|
fn trait_method_with_default(&self) {}
|
||
|
|
#[sanitize(address = "off", thread = "on")]
|
||
|
|
fn trait_assoc_fn() {}
|
||
|
|
}
|
||
|
|
|
||
|
|
trait HasAssocType {
|
||
|
|
type T;
|
||
|
|
fn constrain_assoc_type() -> Self::T;
|
||
|
|
}
|
||
|
|
|
||
|
|
impl HasAssocType for () {
|
||
|
|
#[sanitize(address = "off")] //~ ERROR sanitize attribute not allowed here
|
||
|
|
type T = impl Copy;
|
||
|
|
fn constrain_assoc_type() -> Self::T {}
|
||
|
|
}
|
||
|
|
|
||
|
|
#[sanitize(address = "off")] //~ ERROR sanitize attribute not allowed here
|
||
|
|
struct MyStruct {
|
||
|
|
#[sanitize(address = "off")] //~ ERROR sanitize attribute not allowed here
|
||
|
|
field: u32,
|
||
|
|
}
|
||
|
|
|
||
|
|
#[sanitize(address = "off", thread = "on")]
|
||
|
|
impl MyStruct {
|
||
|
|
#[sanitize(address = "off", thread = "on")]
|
||
|
|
fn method(&self) {}
|
||
|
|
#[sanitize(address = "off", thread = "on")]
|
||
|
|
fn assoc_fn() {}
|
||
|
|
}
|
||
|
|
|
||
|
|
extern "C" {
|
||
|
|
#[sanitize(address = "off", thread = "on")] //~ ERROR sanitize attribute not allowed here
|
||
|
|
static X: u32;
|
||
|
|
|
||
|
|
#[sanitize(address = "off", thread = "on")] //~ ERROR sanitize attribute not allowed here
|
||
|
|
type T;
|
||
|
|
|
||
|
|
#[sanitize(address = "off", thread = "on")] //~ ERROR sanitize attribute not allowed here
|
||
|
|
fn foreign_fn();
|
||
|
|
}
|
||
|
|
|
||
|
|
#[sanitize(address = "off", thread = "on")]
|
||
|
|
fn main() {
|
||
|
|
#[sanitize(address = "off", thread = "on")] //~ ERROR sanitize attribute not allowed here
|
||
|
|
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.
|
||
|
|
#[sanitize(address = "off")] //~ ERROR sanitize attribute not allowed here
|
||
|
|
let _let_closure = || ();
|
||
|
|
|
||
|
|
// In situations where attributes can already be applied to expressions,
|
||
|
|
// the sanitize attribute is allowed on closure expressions.
|
||
|
|
let _closure_tail_expr = {
|
||
|
|
#[sanitize(address = "off", thread = "on")]
|
||
|
|
|| ()
|
||
|
|
};
|
||
|
|
|
||
|
|
match () {
|
||
|
|
#[sanitize(address = "off")] //~ ERROR sanitize attribute not allowed here
|
||
|
|
() => (),
|
||
|
|
}
|
||
|
|
|
||
|
|
#[sanitize(address = "off")] //~ ERROR sanitize attribute not allowed here
|
||
|
|
return ();
|
||
|
|
}
|