Add previously omitted associated const tests.

This commit is contained in:
Sean Patrick Santos 2015-03-22 04:38:42 -06:00
parent 3d9b5d0424
commit 7f78887547
6 changed files with 167 additions and 7 deletions

View file

@ -8,14 +8,17 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
trait Foo {
fn bar(&self);
use std::marker::MarkerTrait;
trait Foo: MarkerTrait {
const BAR: u32;
}
impl Foo for u32 {
//~^ ERROR not all trait items implemented, missing: `bar`
type bar = u64;
//~^ ERROR item `bar` is an associated type, which doesn't match its trait `Foo`
struct SignedBar;
impl Foo for SignedBar {
const BAR: i32 = -1;
//~^ ERROR E0326
}
fn main () {}
fn main() {}

View file

@ -0,0 +1,21 @@
// Copyright 2015 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.
#![deny(non_upper_case_globals)]
#![allow(dead_code)]
struct Foo;
impl Foo {
const not_upper: bool = true;
}
//~^^ ERROR associated constant `not_upper` should have an upper case name such as `NOT_UPPER`
fn main() {}

View file

@ -0,0 +1,43 @@
// Copyright 2015 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 Foo {
fn bar(&self);
const MY_CONST: u32;
}
pub struct FooConstForMethod;
impl Foo for FooConstForMethod {
//~^ ERROR E0046
const bar: u64 = 1;
//~^ ERROR E0323
const MY_CONST: u32 = 1;
}
pub struct FooMethodForConst;
impl Foo for FooMethodForConst {
//~^ ERROR E0046
fn bar(&self) {}
fn MY_CONST() {}
//~^ ERROR E0324
}
pub struct FooTypeForMethod;
impl Foo for FooTypeForMethod {
//~^ ERROR E0046
type bar = u64;
//~^ ERROR E0325
const MY_CONST: u32 = 1;
}
fn main () {}

View file

@ -0,0 +1,23 @@
// Copyright 2015 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.
#![deny(dead_code)]
const GLOBAL_BAR: u32 = 1;
struct Foo;
impl Foo {
const BAR: u32 = GLOBAL_BAR;
}
fn main() {
let _: u32 = Foo::BAR;
}

View file

@ -0,0 +1,35 @@
// Copyright 2015 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.
use std::marker::MarkerTrait;
struct MyType;
impl MyType {
const IMPL_IS_INHERENT: bool = true;
}
trait MyTrait: MarkerTrait {
const IMPL_IS_INHERENT: bool;
const IMPL_IS_ON_TRAIT: bool;
}
impl MyTrait for MyType {
const IMPL_IS_INHERENT: bool = false;
const IMPL_IS_ON_TRAIT: bool = true;
}
fn main() {
// Check that the inherent impl is used before the trait, but that the trait
// can still be accessed.
assert!(<MyType>::IMPL_IS_INHERENT);
assert!(!<MyType as MyTrait>::IMPL_IS_INHERENT);
assert!(<MyType>::IMPL_IS_ON_TRAIT);
}

View file

@ -0,0 +1,35 @@
// Copyright 2015 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.
use std::marker::MarkerTrait;
// The main purpose of this test is to ensure that different impls of the same
// trait can refer to each other without setting off the static recursion check
// (as long as there's no actual recursion).
trait Foo: MarkerTrait {
const BAR: u32;
}
struct IsFoo1;
impl Foo for IsFoo1 {
const BAR: u32 = 1;
}
struct IsFoo2;
impl Foo for IsFoo2 {
const BAR: u32 = <IsFoo1 as Foo>::BAR;
}
fn main() {
assert_eq!(<IsFoo1>::BAR, <IsFoo2 as Foo>::BAR);
}