let (name, node, generics) = if self.eat_keyword(keywords::Type) {
let (generics, TyParam {ident, bounds, default, ..}) =
self.parse_trait_item_assoc_ty(vec![])?;
- self.expect(&token::Semi)?;
(ident, TraitItemKind::Type(bounds, default), generics)
} else if self.is_const_item() {
self.expect_keyword(keywords::Const)?;
} else {
None
};
+ self.expect(&token::Semi)?;
Ok((generics, TyParam {
attrs: preceding_attrs.into(),
use std::ops::Deref;
-trait PointerFamily {
+trait PointerFamily<U> {
type Pointer<T>: Deref<Target = T>;
+ type Pointer2<T>: Deref<Target = T> where T: Clone, U: Clone;
+}
+
+struct Foo;
+impl PointerFamily<u32> for Foo {
+ type Pointer<usize> = Box<usize>;
+ type Pointer2<u32> = Box<u32>;
}
fn main() {}
+++ /dev/null
-// Copyright 2017 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.
-
-#![feature(generic_associated_types)]
-
-trait Foo {
- type Bar<T=usize>;
- type X<T> where T = f64;
-}
-
-fn main() {}
+++ /dev/null
-error: equality constraints are not yet supported in where clauses (#20041)
- --> $DIR/generic_associated_types_equals.rs:15:21
- |
-15 | type X<T> where T = f64;
- | ^^^^^^^
-
-error[E0412]: cannot find type `T` in this scope
- --> $DIR/generic_associated_types_equals.rs:15:21
- |
-15 | type X<T> where T = f64;
- | ^ not found in this scope
-
-error: defaults for type parameters are only allowed in `struct`, `enum`, `type`, or `trait` definitions.
- --> $DIR/generic_associated_types_equals.rs:14:14
- |
-14 | type Bar<T=usize>;
- | ^
- |
- = note: #[deny(invalid_type_param_default)] on by default
- = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
- = note: for more information, see issue #36887 <https://github.com/rust-lang/rust/issues/36887>
-
-error: aborting due to 3 previous errors
-
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-// compile-flags: -Zparse-only
+// compile-flags: -Z parse-only
#![feature(generic_associated_types)]
impl<T> Baz for T where T: Foo {
+ //FIXME(sunjay): This should parse successfully
type Quux<'a> = <T as Foo>::Bar<'a, 'static>;
}
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-// compile-flags: -Zparse-only
+// compile-flags: -Z parse-only
#![feature(generic_associated_types)]
+use std::ops::Deref;
+
trait Foo {
type Bar<'a>;
type Bar<'a, 'b>;
type Bar<'a, 'b, T, U>;
type Bar<'a, 'b, T, U,>;
type Bar<'a, 'b, T: Debug, U,>;
+ type Bar<'a, 'b, T: Debug, U,>: Debug;
+ type Bar<'a, 'b, T: Debug, U,>: Deref<Target = T> + Into<U>;
+ type Bar<'a, 'b, T: Debug, U,> where T: Deref<Target = U>, U: Into<T>;
+ type Bar<'a, 'b, T: Debug, U,>: Deref<Target = T> + Into<U>
+ where T: Deref<Target = U>, U: Into<T>;
}
fn main() {}