about summary refs log tree commit diff
path: root/src/librustc_parse/parser
diff options
context:
space:
mode:
authorDylan MacKenzie <ecstaticmorse@gmail.com>2020-01-20 01:20:45 -0800
committerDylan MacKenzie <ecstaticmorse@gmail.com>2020-01-20 01:28:10 -0800
commit0ac4ba0eed776599e2d9f2ef76f6ae94a4471a4e (patch)
treee2bcafc66d84cf59670c6726d1714a64598ef306 /src/librustc_parse/parser
parent3b1a9d35c8ee396d2c546603347b5dc65d619cdf (diff)
downloadrust-0ac4ba0eed776599e2d9f2ef76f6ae94a4471a4e.tar.gz
rust-0ac4ba0eed776599e2d9f2ef76f6ae94a4471a4e.zip
Parse `?const ?Trait`
Diffstat (limited to 'src/librustc_parse/parser')
-rw-r--r--src/librustc_parse/parser/ty.rs23
1 files changed, 5 insertions, 18 deletions
diff --git a/src/librustc_parse/parser/ty.rs b/src/librustc_parse/parser/ty.rs
index 9c9180778e5..efd8acc933a 100644
--- a/src/librustc_parse/parser/ty.rs
+++ b/src/librustc_parse/parser/ty.rs
@@ -27,17 +27,13 @@ struct BoundModifiers {
 }
 
 impl BoundModifiers {
-    fn to_trait_bound_modifier(&self) -> Result<TraitBoundModifier, &'static str> {
-        let modifier = match (self.maybe, self.maybe_const) {
+    fn to_trait_bound_modifier(&self) -> TraitBoundModifier {
+        match (self.maybe, self.maybe_const) {
             (None, None) => TraitBoundModifier::None,
             (Some(_), None) => TraitBoundModifier::Maybe,
             (None, Some(_)) => TraitBoundModifier::MaybeConst,
-            (Some(_), Some(_)) => {
-                return Err("`?const` and `?` are mutually exclusive");
-            }
-        };
-
-        Ok(modifier)
+            (Some(_), Some(_)) => TraitBoundModifier::MaybeConstMaybe,
+        }
     }
 }
 
@@ -563,16 +559,7 @@ impl<'a> Parser<'a> {
             self.expect(&token::CloseDelim(token::Paren))?;
         }
 
-        let modifier = match modifiers.to_trait_bound_modifier() {
-            Ok(m) => m,
-            Err(msg) => {
-                self.struct_span_err(lo.to(self.prev_span), msg).emit();
-
-                // Continue compilation as if the user had written `?Trait`.
-                TraitBoundModifier::Maybe
-            }
-        };
-
+        let modifier = modifiers.to_trait_bound_modifier();
         let poly_trait = PolyTraitRef::new(lifetime_defs, path, lo.to(self.prev_span));
         Ok(GenericBound::Trait(poly_trait, modifier))
     }