提交 95f1866a 编写于 作者: V varkor

Make GenericBound explicit

上级 c5f16e0e
...@@ -1109,11 +1109,11 @@ fn lower_ty(&mut self, t: &Ty, itctx: ImplTraitContext) -> P<hir::Ty> { ...@@ -1109,11 +1109,11 @@ fn lower_ty(&mut self, t: &Ty, itctx: ImplTraitContext) -> P<hir::Ty> {
let bounds = bounds let bounds = bounds
.iter() .iter()
.filter_map(|bound| match *bound { .filter_map(|bound| match *bound {
Trait(ref ty, TraitBoundModifier::None) => { GenericBound::Trait(ref ty, TraitBoundModifier::None) => {
Some(self.lower_poly_trait_ref(ty, itctx)) Some(self.lower_poly_trait_ref(ty, itctx))
} }
Trait(_, TraitBoundModifier::Maybe) => None, GenericBound::Trait(_, TraitBoundModifier::Maybe) => None,
Outlives(ref lifetime) => { GenericBound::Outlives(ref lifetime) => {
if lifetime_bound.is_none() { if lifetime_bound.is_none() {
lifetime_bound = Some(self.lower_lifetime(lifetime)); lifetime_bound = Some(self.lower_lifetime(lifetime));
} }
......
...@@ -101,7 +101,7 @@ fn check_trait_fn_not_const(&self, constness: Spanned<Constness>) { ...@@ -101,7 +101,7 @@ fn check_trait_fn_not_const(&self, constness: Spanned<Constness>) {
fn no_questions_in_bounds(&self, bounds: &GenericBounds, where_: &str, is_trait: bool) { fn no_questions_in_bounds(&self, bounds: &GenericBounds, where_: &str, is_trait: bool) {
for bound in bounds { for bound in bounds {
if let Trait(ref poly, TraitBoundModifier::Maybe) = *bound { if let GenericBound::Trait(ref poly, TraitBoundModifier::Maybe) = *bound {
let mut err = self.err_handler().struct_span_err(poly.span, let mut err = self.err_handler().struct_span_err(poly.span,
&format!("`?Trait` is not permitted in {}", where_)); &format!("`?Trait` is not permitted in {}", where_));
if is_trait { if is_trait {
...@@ -190,7 +190,7 @@ fn visit_ty(&mut self, ty: &'a Ty) { ...@@ -190,7 +190,7 @@ fn visit_ty(&mut self, ty: &'a Ty) {
TyKind::TraitObject(ref bounds, ..) => { TyKind::TraitObject(ref bounds, ..) => {
let mut any_lifetime_bounds = false; let mut any_lifetime_bounds = false;
for bound in bounds { for bound in bounds {
if let Outlives(ref lifetime) = *bound { if let GenericBound::Outlives(ref lifetime) = *bound {
if any_lifetime_bounds { if any_lifetime_bounds {
span_err!(self.session, lifetime.ident.span, E0226, span_err!(self.session, lifetime.ident.span, E0226,
"only a single explicit lifetime bound is permitted"); "only a single explicit lifetime bound is permitted");
...@@ -203,7 +203,7 @@ fn visit_ty(&mut self, ty: &'a Ty) { ...@@ -203,7 +203,7 @@ fn visit_ty(&mut self, ty: &'a Ty) {
} }
TyKind::ImplTrait(ref bounds) => { TyKind::ImplTrait(ref bounds) => {
if !bounds.iter() if !bounds.iter()
.any(|b| if let Trait(..) = *b { true } else { false }) { .any(|b| if let GenericBound::Trait(..) = *b { true } else { false }) {
self.err_handler().span_err(ty.span, "at least one trait must be specified"); self.err_handler().span_err(ty.span, "at least one trait must be specified");
} }
} }
......
...@@ -761,10 +761,8 @@ fn process_trait( ...@@ -761,10 +761,8 @@ fn process_trait(
// super-traits // super-traits
for super_bound in trait_refs.iter() { for super_bound in trait_refs.iter() {
let trait_ref = match *super_bound { let trait_ref = match *super_bound {
ast::Trait(ref trait_ref, _) => trait_ref, ast::GenericBound::Trait(ref trait_ref, _) => trait_ref,
ast::Outlives(..) => { ast::GenericBound::Outlives(..) => continue,
continue;
}
}; };
let trait_ref = &trait_ref.trait_ref; let trait_ref = &trait_ref.trait_ref;
...@@ -1489,7 +1487,7 @@ fn visit_generics(&mut self, generics: &'l ast::Generics) { ...@@ -1489,7 +1487,7 @@ fn visit_generics(&mut self, generics: &'l ast::Generics) {
ast::GenericParamKind::Lifetime { .. } => {} ast::GenericParamKind::Lifetime { .. } => {}
ast::GenericParamKind::Type { ref default, .. } => { ast::GenericParamKind::Type { ref default, .. } => {
for bound in &param.bounds { for bound in &param.bounds {
if let ast::Trait(ref trait_ref, _) = *bound { if let ast::GenericBound::Trait(ref trait_ref, _) = *bound {
self.process_path(trait_ref.trait_ref.ref_id, &trait_ref.trait_ref.path) self.process_path(trait_ref.trait_ref.ref_id, &trait_ref.trait_ref.path)
} }
} }
......
...@@ -374,8 +374,8 @@ pub fn build_impl(cx: &DocContext, did: DefId, ret: &mut Vec<clean::Item>) { ...@@ -374,8 +374,8 @@ pub fn build_impl(cx: &DocContext, did: DefId, ret: &mut Vec<clean::Item>) {
let polarity = tcx.impl_polarity(did); let polarity = tcx.impl_polarity(did);
let trait_ = associated_trait.clean(cx).map(|bound| { let trait_ = associated_trait.clean(cx).map(|bound| {
match bound { match bound {
clean::TraitBound(polyt, _) => polyt.trait_, clean::GenericBound::TraitBound(polyt, _) => polyt.trait_,
clean::Outlives(..) => unreachable!(), clean::GenericBound::Outlives(..) => unreachable!(),
} }
}); });
if trait_.def_id() == tcx.lang_items().deref_trait() { if trait_.def_id() == tcx.lang_items().deref_trait() {
...@@ -387,9 +387,9 @@ pub fn build_impl(cx: &DocContext, did: DefId, ret: &mut Vec<clean::Item>) { ...@@ -387,9 +387,9 @@ pub fn build_impl(cx: &DocContext, did: DefId, ret: &mut Vec<clean::Item>) {
let provided = trait_.def_id().map(|did| { let provided = trait_.def_id().map(|did| {
tcx.provided_trait_methods(did) tcx.provided_trait_methods(did)
.into_iter() .into_iter()
.map(|meth| meth.name.to_string()) .map(|meth| meth.name.to_string())
.collect() .collect()
}).unwrap_or(FxHashSet()); }).unwrap_or(FxHashSet());
ret.push(clean::Item { ret.push(clean::Item {
......
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
pub use self::Type::*; pub use self::Type::*;
pub use self::Mutability::*; pub use self::Mutability::*;
pub use self::ItemEnum::*; pub use self::ItemEnum::*;
pub use self::GenericBound::*;
pub use self::SelfTy::*; pub use self::SelfTy::*;
pub use self::FunctionRetTy::*; pub use self::FunctionRetTy::*;
pub use self::Visibility::{Public, Inherited}; pub use self::Visibility::{Public, Inherited};
...@@ -1470,7 +1469,7 @@ fn maybe_sized(cx: &DocContext) -> GenericBound { ...@@ -1470,7 +1469,7 @@ fn maybe_sized(cx: &DocContext) -> GenericBound {
let path = external_path(cx, &cx.tcx.item_name(did).as_str(), let path = external_path(cx, &cx.tcx.item_name(did).as_str(),
Some(did), false, vec![], empty); Some(did), false, vec![], empty);
inline::record_extern_fqn(cx, did, TypeKind::Trait); inline::record_extern_fqn(cx, did, TypeKind::Trait);
TraitBound(PolyTrait { GenericBound::TraitBound(PolyTrait {
trait_: ResolvedPath { trait_: ResolvedPath {
path, path,
typarams: None, typarams: None,
...@@ -1510,8 +1509,10 @@ fn get_trait_type(&self) -> Option<Type> { ...@@ -1510,8 +1509,10 @@ fn get_trait_type(&self) -> Option<Type> {
impl Clean<GenericBound> for hir::GenericBound { impl Clean<GenericBound> for hir::GenericBound {
fn clean(&self, cx: &DocContext) -> GenericBound { fn clean(&self, cx: &DocContext) -> GenericBound {
match *self { match *self {
hir::GenericBound::Outlives(lt) => Outlives(lt.clean(cx)), hir::GenericBound::Outlives(lt) => GenericBound::Outlives(lt.clean(cx)),
hir::GenericBound::Trait(ref t, modifier) => TraitBound(t.clean(cx), modifier), hir::GenericBound::Trait(ref t, modifier) => {
GenericBound::TraitBound(t.clean(cx), modifier)
}
} }
} }
} }
...@@ -1599,7 +1600,7 @@ fn clean(&self, cx: &DocContext) -> GenericBound { ...@@ -1599,7 +1600,7 @@ fn clean(&self, cx: &DocContext) -> GenericBound {
} }
} }
TraitBound( GenericBound::TraitBound(
PolyTrait { PolyTrait {
trait_: ResolvedPath { trait_: ResolvedPath {
path, path,
...@@ -1623,9 +1624,8 @@ fn clean(&self, cx: &DocContext) -> GenericBound { ...@@ -1623,9 +1624,8 @@ fn clean(&self, cx: &DocContext) -> GenericBound {
impl<'tcx> Clean<Option<Vec<GenericBound>>> for Substs<'tcx> { impl<'tcx> Clean<Option<Vec<GenericBound>>> for Substs<'tcx> {
fn clean(&self, cx: &DocContext) -> Option<Vec<GenericBound>> { fn clean(&self, cx: &DocContext) -> Option<Vec<GenericBound>> {
let mut v = Vec::new(); let mut v = Vec::new();
v.extend(self.regions().filter_map(|r| r.clean(cx)) v.extend(self.regions().filter_map(|r| r.clean(cx)).map(GenericBound::Outlives));
.map(GenericBound::Outlives)); v.extend(self.types().map(|t| GenericBound::TraitBound(PolyTrait {
v.extend(self.types().map(|t| TraitBound(PolyTrait {
trait_: t.clean(cx), trait_: t.clean(cx),
generic_params: Vec::new(), generic_params: Vec::new(),
}, hir::TraitBoundModifier::None))); }, hir::TraitBoundModifier::None)));
...@@ -2978,10 +2978,11 @@ fn clean(&self, cx: &DocContext) -> Type { ...@@ -2978,10 +2978,11 @@ fn clean(&self, cx: &DocContext) -> Type {
match bounds[0].clean(cx).trait_ { match bounds[0].clean(cx).trait_ {
ResolvedPath { path, typarams: None, did, is_generic } => { ResolvedPath { path, typarams: None, did, is_generic } => {
let mut bounds: Vec<self::GenericBound> = bounds[1..].iter().map(|bound| { let mut bounds: Vec<self::GenericBound> = bounds[1..].iter().map(|bound| {
TraitBound(bound.clean(cx), hir::TraitBoundModifier::None) self::GenericBound::TraitBound(bound.clean(cx),
hir::TraitBoundModifier::None)
}).collect(); }).collect();
if !lifetime.is_elided() { if !lifetime.is_elided() {
bounds.push(self::Outlives(lifetime.clean(cx))); bounds.push(self::GenericBound::Outlives(lifetime.clean(cx)));
} }
ResolvedPath { path, typarams: Some(bounds), did, is_generic, } ResolvedPath { path, typarams: Some(bounds), did, is_generic, }
} }
...@@ -3086,7 +3087,7 @@ fn clean(&self, cx: &DocContext) -> Type { ...@@ -3086,7 +3087,7 @@ fn clean(&self, cx: &DocContext) -> Type {
let path = external_path(cx, &cx.tcx.item_name(did).as_str(), let path = external_path(cx, &cx.tcx.item_name(did).as_str(),
Some(did), false, vec![], empty); Some(did), false, vec![], empty);
inline::record_extern_fqn(cx, did, TypeKind::Trait); inline::record_extern_fqn(cx, did, TypeKind::Trait);
let bound = TraitBound(PolyTrait { let bound = GenericBound::TraitBound(PolyTrait {
trait_: ResolvedPath { trait_: ResolvedPath {
path, path,
typarams: None, typarams: None,
......
...@@ -83,8 +83,8 @@ pub fn where_clauses(cx: &DocContext, clauses: Vec<WP>) -> Vec<WP> { ...@@ -83,8 +83,8 @@ pub fn where_clauses(cx: &DocContext, clauses: Vec<WP>) -> Vec<WP> {
}; };
!bounds.iter_mut().any(|b| { !bounds.iter_mut().any(|b| {
let trait_ref = match *b { let trait_ref = match *b {
clean::TraitBound(ref mut tr, _) => tr, clean::GenericBound::TraitBound(ref mut tr, _) => tr,
clean::Outlives(..) => return false, clean::GenericBound::Outlives(..) => return false,
}; };
let (did, path) = match trait_ref.trait_ { let (did, path) = match trait_ref.trait_ {
clean::ResolvedPath { did, ref mut path, ..} => (did, path), clean::ResolvedPath { did, ref mut path, ..} => (did, path),
......
...@@ -270,10 +270,10 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { ...@@ -270,10 +270,10 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
impl fmt::Display for clean::GenericBound { impl fmt::Display for clean::GenericBound {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self { match *self {
clean::Outlives(ref lt) => { clean::GenericBound::Outlives(ref lt) => {
write!(f, "{}", *lt) write!(f, "{}", *lt)
} }
clean::TraitBound(ref ty, modifier) => { clean::GenericBound::TraitBound(ref ty, modifier) => {
let modifier_str = match modifier { let modifier_str = match modifier {
hir::TraitBoundModifier::None => "", hir::TraitBoundModifier::None => "",
hir::TraitBoundModifier::Maybe => "?", hir::TraitBoundModifier::Maybe => "?",
......
...@@ -10,7 +10,6 @@ ...@@ -10,7 +10,6 @@
// The Rust abstract syntax tree. // The Rust abstract syntax tree.
pub use self::GenericBound::*;
pub use self::UnsafeSource::*; pub use self::UnsafeSource::*;
pub use self::GenericArgs::*; pub use self::GenericArgs::*;
pub use symbol::{Ident, Symbol as Name}; pub use symbol::{Ident, Symbol as Name};
...@@ -290,8 +289,8 @@ pub enum GenericBound { ...@@ -290,8 +289,8 @@ pub enum GenericBound {
impl GenericBound { impl GenericBound {
pub fn span(&self) -> Span { pub fn span(&self) -> Span {
match self { match self {
&Trait(ref t, ..) => t.span, &GenericBound::Trait(ref t, ..) => t.span,
&Outlives(ref l) => l.ident.span, &GenericBound::Outlives(ref l) => l.ident.span,
} }
} }
} }
...@@ -930,8 +929,8 @@ pub fn returns(&self) -> bool { ...@@ -930,8 +929,8 @@ pub fn returns(&self) -> bool {
fn to_bound(&self) -> Option<GenericBound> { fn to_bound(&self) -> Option<GenericBound> {
match &self.node { match &self.node {
ExprKind::Path(None, path) => ExprKind::Path(None, path) =>
Some(Trait(PolyTraitRef::new(Vec::new(), path.clone(), self.span), Some(GenericBound::Trait(PolyTraitRef::new(Vec::new(), path.clone(), self.span),
TraitBoundModifier::None)), TraitBoundModifier::None)),
_ => None, _ => None,
} }
} }
......
...@@ -465,7 +465,8 @@ fn poly_trait_ref(&self, span: Span, path: ast::Path) -> ast::PolyTraitRef { ...@@ -465,7 +465,8 @@ fn poly_trait_ref(&self, span: Span, path: ast::Path) -> ast::PolyTraitRef {
} }
fn ty_param_bound(&self, path: ast::Path) -> ast::GenericBound { fn ty_param_bound(&self, path: ast::Path) -> ast::GenericBound {
ast::Trait(self.poly_trait_ref(path.span, path), ast::TraitBoundModifier::None) ast::GenericBound::Trait(self.poly_trait_ref(path.span, path),
ast::TraitBoundModifier::None)
} }
fn lifetime(&self, span: Span, ident: ast::Ident) -> ast::Lifetime { fn lifetime(&self, span: Span, ident: ast::Ident) -> ast::Lifetime {
......
...@@ -678,10 +678,12 @@ pub fn noop_fold_fn_decl<T: Folder>(decl: P<FnDecl>, fld: &mut T) -> P<FnDecl> { ...@@ -678,10 +678,12 @@ pub fn noop_fold_fn_decl<T: Folder>(decl: P<FnDecl>, fld: &mut T) -> P<FnDecl> {
pub fn noop_fold_param_bound<T>(pb: GenericBound, fld: &mut T) -> GenericBound where T: Folder { pub fn noop_fold_param_bound<T>(pb: GenericBound, fld: &mut T) -> GenericBound where T: Folder {
match pb { match pb {
Trait(ty, modifier) => { GenericBound::Trait(ty, modifier) => {
Trait(fld.fold_poly_trait_ref(ty), modifier) GenericBound::Trait(fld.fold_poly_trait_ref(ty), modifier)
}
GenericBound::Outlives(lifetime) => {
GenericBound::Outlives(noop_fold_lifetime(lifetime, fld))
} }
Outlives(lifetime) => Outlives(noop_fold_lifetime(lifetime, fld)),
} }
} }
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
use rustc_target::spec::abi::{self, Abi}; use rustc_target::spec::abi::{self, Abi};
use ast::{AngleBracketedArgs, ParenthesizedArgData, AttrStyle, BareFnTy}; use ast::{AngleBracketedArgs, ParenthesizedArgData, AttrStyle, BareFnTy};
use ast::{Outlives, Trait, TraitBoundModifier}; use ast::{GenericBound, TraitBoundModifier};
use ast::Unsafety; use ast::Unsafety;
use ast::{Mod, AnonConst, Arg, Arm, Attribute, BindingMode, TraitItemKind}; use ast::{Mod, AnonConst, Arg, Arm, Attribute, BindingMode, TraitItemKind};
use ast::Block; use ast::Block;
...@@ -1444,7 +1444,7 @@ fn parse_ty_common(&mut self, allow_plus: bool, allow_qpath_recovery: bool) ...@@ -1444,7 +1444,7 @@ fn parse_ty_common(&mut self, allow_plus: bool, allow_qpath_recovery: bool)
TyKind::TraitObject(ref bounds, TraitObjectSyntax::None) TyKind::TraitObject(ref bounds, TraitObjectSyntax::None)
if maybe_bounds && bounds.len() == 1 && !trailing_plus => { if maybe_bounds && bounds.len() == 1 && !trailing_plus => {
let path = match bounds[0] { let path = match bounds[0] {
Trait(ref pt, ..) => pt.trait_ref.path.clone(), GenericBound::Trait(ref pt, ..) => pt.trait_ref.path.clone(),
_ => self.bug("unexpected lifetime bound"), _ => self.bug("unexpected lifetime bound"),
}; };
self.parse_remaining_bounds(Vec::new(), path, lo, true)? self.parse_remaining_bounds(Vec::new(), path, lo, true)?
...@@ -1566,7 +1566,7 @@ fn parse_ty_common(&mut self, allow_plus: bool, allow_qpath_recovery: bool) ...@@ -1566,7 +1566,7 @@ fn parse_ty_common(&mut self, allow_plus: bool, allow_qpath_recovery: bool)
fn parse_remaining_bounds(&mut self, generic_params: Vec<GenericParam>, path: ast::Path, fn parse_remaining_bounds(&mut self, generic_params: Vec<GenericParam>, path: ast::Path,
lo: Span, parse_plus: bool) -> PResult<'a, TyKind> { lo: Span, parse_plus: bool) -> PResult<'a, TyKind> {
let poly_trait_ref = PolyTraitRef::new(generic_params, path, lo.to(self.prev_span)); let poly_trait_ref = PolyTraitRef::new(generic_params, path, lo.to(self.prev_span));
let mut bounds = vec![Trait(poly_trait_ref, TraitBoundModifier::None)]; let mut bounds = vec![GenericBound::Trait(poly_trait_ref, TraitBoundModifier::None)];
if parse_plus { if parse_plus {
self.eat_plus(); // `+`, or `+=` gets split and `+` is discarded self.eat_plus(); // `+`, or `+=` gets split and `+` is discarded
bounds.append(&mut self.parse_ty_param_bounds()?); bounds.append(&mut self.parse_ty_param_bounds()?);
...@@ -4752,7 +4752,7 @@ fn parse_ty_param_bounds_common(&mut self, allow_plus: bool) -> PResult<'a, Gene ...@@ -4752,7 +4752,7 @@ fn parse_ty_param_bounds_common(&mut self, allow_plus: bool) -> PResult<'a, Gene
self.span_err(question_span, self.span_err(question_span,
"`?` may only modify trait bounds, not lifetime bounds"); "`?` may only modify trait bounds, not lifetime bounds");
} }
bounds.push(Outlives(self.expect_lifetime())); bounds.push(GenericBound::Outlives(self.expect_lifetime()));
if has_parens { if has_parens {
self.expect(&token::CloseDelim(token::Paren))?; self.expect(&token::CloseDelim(token::Paren))?;
self.span_err(self.prev_span, self.span_err(self.prev_span,
...@@ -4770,7 +4770,7 @@ fn parse_ty_param_bounds_common(&mut self, allow_plus: bool) -> PResult<'a, Gene ...@@ -4770,7 +4770,7 @@ fn parse_ty_param_bounds_common(&mut self, allow_plus: bool) -> PResult<'a, Gene
} else { } else {
TraitBoundModifier::None TraitBoundModifier::None
}; };
bounds.push(Trait(poly_trait, modifier)); bounds.push(GenericBound::Trait(poly_trait, modifier));
} }
} else { } else {
break break
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
use rustc_target::spec::abi::{self, Abi}; use rustc_target::spec::abi::{self, Abi};
use ast::{self, BlockCheckMode, PatKind, RangeEnd, RangeSyntax}; use ast::{self, BlockCheckMode, PatKind, RangeEnd, RangeSyntax};
use ast::{SelfKind, Outlives, Trait, TraitBoundModifier}; use ast::{SelfKind, GenericBound, TraitBoundModifier};
use ast::{Attribute, MacDelimiter, GenericArg}; use ast::{Attribute, MacDelimiter, GenericArg};
use util::parser::{self, AssocOp, Fixity}; use util::parser::{self, AssocOp, Fixity};
use attr; use attr;
...@@ -1364,7 +1364,7 @@ pub fn print_item(&mut self, item: &ast::Item) -> io::Result<()> { ...@@ -1364,7 +1364,7 @@ pub fn print_item(&mut self, item: &ast::Item) -> io::Result<()> {
self.print_generic_params(&generics.params)?; self.print_generic_params(&generics.params)?;
let mut real_bounds = Vec::with_capacity(bounds.len()); let mut real_bounds = Vec::with_capacity(bounds.len());
for b in bounds.iter() { for b in bounds.iter() {
if let Trait(ref ptr, ast::TraitBoundModifier::Maybe) = *b { if let GenericBound::Trait(ref ptr, ast::TraitBoundModifier::Maybe) = *b {
self.s.space()?; self.s.space()?;
self.word_space("for ?")?; self.word_space("for ?")?;
self.print_trait_ref(&ptr.trait_ref)?; self.print_trait_ref(&ptr.trait_ref)?;
...@@ -1390,7 +1390,7 @@ pub fn print_item(&mut self, item: &ast::Item) -> io::Result<()> { ...@@ -1390,7 +1390,7 @@ pub fn print_item(&mut self, item: &ast::Item) -> io::Result<()> {
let mut real_bounds = Vec::with_capacity(bounds.len()); let mut real_bounds = Vec::with_capacity(bounds.len());
// FIXME(durka) this seems to be some quite outdated syntax // FIXME(durka) this seems to be some quite outdated syntax
for b in bounds.iter() { for b in bounds.iter() {
if let Trait(ref ptr, ast::TraitBoundModifier::Maybe) = *b { if let GenericBound::Trait(ref ptr, ast::TraitBoundModifier::Maybe) = *b {
self.s.space()?; self.s.space()?;
self.word_space("for ?")?; self.word_space("for ?")?;
self.print_trait_ref(&ptr.trait_ref)?; self.print_trait_ref(&ptr.trait_ref)?;
...@@ -2826,13 +2826,13 @@ pub fn print_type_bounds(&mut self, ...@@ -2826,13 +2826,13 @@ pub fn print_type_bounds(&mut self,
} }
match bound { match bound {
Trait(tref, modifier) => { GenericBound::Trait(tref, modifier) => {
if modifier == &TraitBoundModifier::Maybe { if modifier == &TraitBoundModifier::Maybe {
self.s.word("?")?; self.s.word("?")?;
} }
self.print_poly_trait_ref(tref)?; self.print_poly_trait_ref(tref)?;
} }
Outlives(lt) => self.print_lifetime(*lt)?, GenericBound::Outlives(lt) => self.print_lifetime(*lt)?,
} }
} }
} }
......
...@@ -481,12 +481,8 @@ pub fn walk_global_asm<'a, V: Visitor<'a>>(_: &mut V, _: &'a GlobalAsm) { ...@@ -481,12 +481,8 @@ pub fn walk_global_asm<'a, V: Visitor<'a>>(_: &mut V, _: &'a GlobalAsm) {
pub fn walk_param_bound<'a, V: Visitor<'a>>(visitor: &mut V, bound: &'a GenericBound) { pub fn walk_param_bound<'a, V: Visitor<'a>>(visitor: &mut V, bound: &'a GenericBound) {
match *bound { match *bound {
Trait(ref typ, ref modifier) => { GenericBound::Trait(ref typ, ref modifier) => visitor.visit_poly_trait_ref(typ, modifier),
visitor.visit_poly_trait_ref(typ, modifier); GenericBound::Outlives(ref lifetime) => visitor.visit_lifetime(lifetime),
}
Outlives(ref lifetime) => {
visitor.visit_lifetime(lifetime);
}
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册