Enforce that ? and for<...> are not combined
This commit is contained in:
parent
32c8bfdb11
commit
898ed2ffa6
@ -53,6 +53,9 @@ parse_bare_cr = {$double_quotes ->
|
|||||||
|
|
||||||
parse_bare_cr_in_raw_string = bare CR not allowed in raw string
|
parse_bare_cr_in_raw_string = bare CR not allowed in raw string
|
||||||
|
|
||||||
|
parse_binder_and_polarity = `for<...>` binder not allowed with `{$polarity}` trait polarity modifier
|
||||||
|
.label = there is not a well-defined meaning for a higher-ranked `{$polarity}` trait
|
||||||
|
|
||||||
parse_binder_before_modifiers = `for<...>` binder should be placed before trait bound modifiers
|
parse_binder_before_modifiers = `for<...>` binder should be placed before trait bound modifiers
|
||||||
.label = place the `for<...>` binder before any modifiers
|
.label = place the `for<...>` binder before any modifiers
|
||||||
|
|
||||||
|
@ -3050,3 +3050,13 @@ pub struct BinderBeforeModifiers {
|
|||||||
#[label]
|
#[label]
|
||||||
pub modifiers_span: Span,
|
pub modifiers_span: Span,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(parse_binder_and_polarity)]
|
||||||
|
pub struct BinderAndPolarity {
|
||||||
|
#[primary_span]
|
||||||
|
pub polarity_span: Span,
|
||||||
|
#[label]
|
||||||
|
pub binder_span: Span,
|
||||||
|
pub polarity: &'static str,
|
||||||
|
}
|
||||||
|
@ -994,6 +994,19 @@ fn parse_generic_ty_bound(
|
|||||||
let modifiers = self.parse_trait_bound_modifiers()?;
|
let modifiers = self.parse_trait_bound_modifiers()?;
|
||||||
let modifiers_span = modifiers_lo.to(self.prev_token.span);
|
let modifiers_span = modifiers_lo.to(self.prev_token.span);
|
||||||
|
|
||||||
|
if let Some(binder_span) = binder_span {
|
||||||
|
match modifiers.polarity {
|
||||||
|
BoundPolarity::Negative(polarity_span) | BoundPolarity::Maybe(polarity_span) => {
|
||||||
|
self.dcx().emit_err(errors::BinderAndPolarity {
|
||||||
|
binder_span,
|
||||||
|
polarity_span,
|
||||||
|
polarity: modifiers.polarity.as_str(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
BoundPolarity::Positive => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Recover erroneous lifetime bound with modifiers or binder.
|
// Recover erroneous lifetime bound with modifiers or binder.
|
||||||
// e.g. `T: for<'a> 'a` or `T: ~const 'a`.
|
// e.g. `T: for<'a> 'a` or `T: ~const 'a`.
|
||||||
if self.token.is_lifetime() {
|
if self.token.is_lifetime() {
|
||||||
|
@ -5,7 +5,7 @@ struct S<
|
|||||||
T: Tr + 'a, // OK
|
T: Tr + 'a, // OK
|
||||||
T: 'a, // OK
|
T: 'a, // OK
|
||||||
T:, // OK
|
T:, // OK
|
||||||
T: for<'a> ?Trait, // OK
|
T: for<'a> ?Trait, //~ ERROR `for<...>` binder not allowed with `?` trait polarity modifier
|
||||||
T: Tr +, // OK
|
T: Tr +, // OK
|
||||||
T: ?'a, //~ ERROR `?` may only modify trait bounds, not lifetime bounds
|
T: ?'a, //~ ERROR `?` may only modify trait bounds, not lifetime bounds
|
||||||
|
|
||||||
|
@ -1,3 +1,11 @@
|
|||||||
|
error: `for<...>` binder not allowed with `?` trait polarity modifier
|
||||||
|
--> $DIR/bounds-type.rs:8:16
|
||||||
|
|
|
||||||
|
LL | T: for<'a> ?Trait,
|
||||||
|
| ---- ^
|
||||||
|
| |
|
||||||
|
| there is not a well-defined meaning for a higher-ranked `?` trait
|
||||||
|
|
||||||
error: `?` may only modify trait bounds, not lifetime bounds
|
error: `?` may only modify trait bounds, not lifetime bounds
|
||||||
--> $DIR/bounds-type.rs:10:8
|
--> $DIR/bounds-type.rs:10:8
|
||||||
|
|
|
|
||||||
@ -16,5 +24,5 @@ error: `const` may only modify trait bounds, not lifetime bounds
|
|||||||
LL | T: const 'a,
|
LL | T: const 'a,
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
|
@ -4,6 +4,6 @@
|
|||||||
#![feature(const_trait_impl)]
|
#![feature(const_trait_impl)]
|
||||||
|
|
||||||
struct S<
|
struct S<
|
||||||
T: for<'a> ~const ?Tr<'a> + 'static + ~const std::ops::Add,
|
T: for<'a> ~const Tr<'a> + 'static + ~const std::ops::Add,
|
||||||
T: for<'a: 'b> ~const ?m::Trait<'a>,
|
T: for<'a: 'b> ~const m::Trait<'a>,
|
||||||
>;
|
>;
|
||||||
|
Loading…
Reference in New Issue
Block a user