1
Fork 0

auto merge of #20285 : FlaPer87/rust/oibit-send-and-friends, r=nikomatsakis

This commit introduces the syntax for negative implementations of traits
as shown below:

`impl !Trait for Type {}`

cc #13231
Part of RFC rust-lang/rfcs#127

r? @nikomatsakis
This commit is contained in:
bors 2015-01-05 04:20:46 +00:00
commit ed22606c83
35 changed files with 215 additions and 39 deletions

View file

@ -4801,6 +4801,13 @@ impl<'a> Parser<'a> {
// allow this to be parsed as a trait.
let could_be_trait = self.token != token::OpenDelim(token::Paren);
let neg_span = self.span;
let polarity = if self.eat(&token::Not) {
ast::ImplPolarity::Negative
} else {
ast::ImplPolarity::Positive
};
// Parse the trait.
let mut ty = self.parse_ty_sum();
@ -4823,6 +4830,14 @@ impl<'a> Parser<'a> {
ty = self.parse_ty_sum();
opt_trait_ref
} else {
match polarity {
ast::ImplPolarity::Negative => {
// This is a negated type implementation
// `impl !MyType {}`, which is not allowed.
self.span_err(neg_span, "inherent implementation can't be negated");
},
_ => {}
}
None
};
@ -4832,7 +4847,7 @@ impl<'a> Parser<'a> {
let ident = ast_util::impl_pretty_name(&opt_trait, &*ty);
(ident,
ItemImpl(unsafety, generics, opt_trait, ty, impl_items),
ItemImpl(unsafety, polarity, generics, opt_trait, ty, impl_items),
Some(attrs))
}