mirror of
https://github.com/rust-lang/rust.git
synced 2024-10-31 22:41:50 +00:00
libsyntax: Make deriving also respect where bounds.
This commit is contained in:
parent
f07526a999
commit
ac7dc03a52
@ -388,7 +388,7 @@ impl<'a> TraitDef<'a> {
|
||||
methods: Vec<P<ast::Method>>) -> P<ast::Item> {
|
||||
let trait_path = self.path.to_path(cx, self.span, type_ident, generics);
|
||||
|
||||
let Generics { mut lifetimes, ty_params, where_clause: _ } =
|
||||
let Generics { mut lifetimes, ty_params, mut where_clause } =
|
||||
self.generics.to_generics(cx, self.span, type_ident, generics);
|
||||
let mut ty_params = ty_params.into_vec();
|
||||
|
||||
@ -420,13 +420,33 @@ impl<'a> TraitDef<'a> {
|
||||
ty_param.unbound.clone(),
|
||||
None)
|
||||
}));
|
||||
|
||||
// and similarly for where clauses
|
||||
where_clause.predicates.extend(generics.where_clause.predicates.iter().map(|clause| {
|
||||
match *clause {
|
||||
ast::WherePredicate::BoundPredicate(ref wb) => {
|
||||
ast::WherePredicate::BoundPredicate(ast::WhereBoundPredicate {
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
span: self.span,
|
||||
ident: wb.ident,
|
||||
bounds: OwnedSlice::from_vec(wb.bounds.iter().map(|b| b.clone()).collect())
|
||||
})
|
||||
}
|
||||
ast::WherePredicate::EqPredicate(ref we) => {
|
||||
ast::WherePredicate::EqPredicate(ast::WhereEqPredicate {
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
span: self.span,
|
||||
path: we.path.clone(),
|
||||
ty: we.ty.clone()
|
||||
})
|
||||
}
|
||||
}
|
||||
}));
|
||||
|
||||
let trait_generics = Generics {
|
||||
lifetimes: lifetimes,
|
||||
ty_params: OwnedSlice::from_vec(ty_params),
|
||||
where_clause: ast::WhereClause {
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
predicates: Vec::new(),
|
||||
},
|
||||
where_clause: where_clause
|
||||
};
|
||||
|
||||
// Create the reference to the trait.
|
||||
|
29
src/test/run-pass/issue-19358.rs
Normal file
29
src/test/run-pass/issue-19358.rs
Normal file
@ -0,0 +1,29 @@
|
||||
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
trait Trait {}
|
||||
|
||||
#[deriving(Show)]
|
||||
struct Foo<T: Trait> {
|
||||
foo: T,
|
||||
}
|
||||
|
||||
#[deriving(Show)]
|
||||
struct Bar<T> where T: Trait {
|
||||
bar: T,
|
||||
}
|
||||
|
||||
impl Trait for int {}
|
||||
|
||||
fn main() {
|
||||
let a = Foo { foo: 12i };
|
||||
let b = Bar { bar: 12i };
|
||||
println!("{} {}", a, b);
|
||||
}
|
Loading…
Reference in New Issue
Block a user