From 64d98f8ee037282c35007b64c2649055c56af1db Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 17 Apr 2024 14:19:03 +0200 Subject: Merging upstream version 1.68.2+dfsg1. Signed-off-by: Daniel Baumann --- .../defaults/auxiliary/const_defaulty.rs | 11 ++++ .../auxiliary/trait_object_lt_defaults_lib.rs | 1 + .../complex-generic-default-expr.min.stderr | 20 +++++++ .../defaults/complex-generic-default-expr.rs | 12 ++++ .../const-generics/defaults/complex-unord-param.rs | 17 ++++++ tests/ui/const-generics/defaults/const-default.rs | 24 ++++++++ .../defaults/const-param-as-default-value.rs | 21 +++++++ .../defaults/const-param-in-ty-defaults.rs | 12 ++++ .../const-generics/defaults/default-annotation.rs | 17 ++++++ .../default-const-param-cannot-reference-self.rs | 14 +++++ ...efault-const-param-cannot-reference-self.stderr | 21 +++++++ .../ui/const-generics/defaults/default-on-impl.rs | 6 ++ .../const-generics/defaults/default-on-impl.stderr | 8 +++ .../defaults/default-param-wf-concrete.rs | 3 + .../defaults/default-param-wf-concrete.stderr | 9 +++ tests/ui/const-generics/defaults/doesnt_infer.rs | 13 +++++ .../ui/const-generics/defaults/doesnt_infer.stderr | 14 +++++ tests/ui/const-generics/defaults/external.rs | 24 ++++++++ .../ui/const-generics/defaults/forward-declared.rs | 13 +++++ .../defaults/forward-declared.stderr | 27 +++++++++ .../defaults/generic-expr-default-concrete.rs | 14 +++++ .../defaults/generic-expr-default-concrete.stderr | 12 ++++ .../generic-expr-default-mismatched-types.rs | 16 +++++ .../generic-expr-default-mismatched-types.stderr | 12 ++++ .../defaults/generic-expr-default.rs | 24 ++++++++ .../defaults/generic-expr-default.stderr | 18 ++++++ .../const-generics/defaults/intermixed-lifetime.rs | 9 +++ .../defaults/intermixed-lifetime.stderr | 14 +++++ tests/ui/const-generics/defaults/mismatch.rs | 22 +++++++ tests/ui/const-generics/defaults/mismatch.stderr | 58 ++++++++++++++++++ .../defaults/mismatched_ty_const_in_trait_impl.rs | 41 +++++++++++++ .../mismatched_ty_const_in_trait_impl.stderr | 68 ++++++++++++++++++++++ .../param-order-err-pretty-prints-default.rs | 4 ++ .../param-order-err-pretty-prints-default.stderr | 8 +++ .../const-generics/defaults/pretty-printing-ast.rs | 11 ++++ .../defaults/pretty-printing-ast.stdout | 18 ++++++ .../const-generics/defaults/repr-c-issue-82792.rs | 11 ++++ tests/ui/const-generics/defaults/rp_impl_trait.rs | 29 +++++++++ .../const-generics/defaults/rp_impl_trait_fail.rs | 30 ++++++++++ .../defaults/rp_impl_trait_fail.stderr | 36 ++++++++++++ .../ui/const-generics/defaults/self-referential.rs | 4 ++ .../defaults/self-referential.stderr | 11 ++++ .../ui/const-generics/defaults/simple-defaults.rs | 13 +++++ .../defaults/trait_object_lt_defaults.rs | 24 ++++++++ tests/ui/const-generics/defaults/trait_objects.rs | 43 ++++++++++++++ .../const-generics/defaults/trait_objects_fail.rs | 30 ++++++++++ .../defaults/trait_objects_fail.stderr | 21 +++++++ .../defaults/type-default-const-param-name.rs | 14 +++++ tests/ui/const-generics/defaults/wfness.rs | 23 ++++++++ tests/ui/const-generics/defaults/wfness.stderr | 34 +++++++++++ tests/ui/const-generics/defaults/wrong-order.rs | 9 +++ .../ui/const-generics/defaults/wrong-order.stderr | 14 +++++ 52 files changed, 982 insertions(+) create mode 100644 tests/ui/const-generics/defaults/auxiliary/const_defaulty.rs create mode 100644 tests/ui/const-generics/defaults/auxiliary/trait_object_lt_defaults_lib.rs create mode 100644 tests/ui/const-generics/defaults/complex-generic-default-expr.min.stderr create mode 100644 tests/ui/const-generics/defaults/complex-generic-default-expr.rs create mode 100644 tests/ui/const-generics/defaults/complex-unord-param.rs create mode 100644 tests/ui/const-generics/defaults/const-default.rs create mode 100644 tests/ui/const-generics/defaults/const-param-as-default-value.rs create mode 100644 tests/ui/const-generics/defaults/const-param-in-ty-defaults.rs create mode 100644 tests/ui/const-generics/defaults/default-annotation.rs create mode 100644 tests/ui/const-generics/defaults/default-const-param-cannot-reference-self.rs create mode 100644 tests/ui/const-generics/defaults/default-const-param-cannot-reference-self.stderr create mode 100644 tests/ui/const-generics/defaults/default-on-impl.rs create mode 100644 tests/ui/const-generics/defaults/default-on-impl.stderr create mode 100644 tests/ui/const-generics/defaults/default-param-wf-concrete.rs create mode 100644 tests/ui/const-generics/defaults/default-param-wf-concrete.stderr create mode 100644 tests/ui/const-generics/defaults/doesnt_infer.rs create mode 100644 tests/ui/const-generics/defaults/doesnt_infer.stderr create mode 100644 tests/ui/const-generics/defaults/external.rs create mode 100644 tests/ui/const-generics/defaults/forward-declared.rs create mode 100644 tests/ui/const-generics/defaults/forward-declared.stderr create mode 100644 tests/ui/const-generics/defaults/generic-expr-default-concrete.rs create mode 100644 tests/ui/const-generics/defaults/generic-expr-default-concrete.stderr create mode 100644 tests/ui/const-generics/defaults/generic-expr-default-mismatched-types.rs create mode 100644 tests/ui/const-generics/defaults/generic-expr-default-mismatched-types.stderr create mode 100644 tests/ui/const-generics/defaults/generic-expr-default.rs create mode 100644 tests/ui/const-generics/defaults/generic-expr-default.stderr create mode 100644 tests/ui/const-generics/defaults/intermixed-lifetime.rs create mode 100644 tests/ui/const-generics/defaults/intermixed-lifetime.stderr create mode 100644 tests/ui/const-generics/defaults/mismatch.rs create mode 100644 tests/ui/const-generics/defaults/mismatch.stderr create mode 100644 tests/ui/const-generics/defaults/mismatched_ty_const_in_trait_impl.rs create mode 100644 tests/ui/const-generics/defaults/mismatched_ty_const_in_trait_impl.stderr create mode 100644 tests/ui/const-generics/defaults/param-order-err-pretty-prints-default.rs create mode 100644 tests/ui/const-generics/defaults/param-order-err-pretty-prints-default.stderr create mode 100644 tests/ui/const-generics/defaults/pretty-printing-ast.rs create mode 100644 tests/ui/const-generics/defaults/pretty-printing-ast.stdout create mode 100644 tests/ui/const-generics/defaults/repr-c-issue-82792.rs create mode 100644 tests/ui/const-generics/defaults/rp_impl_trait.rs create mode 100644 tests/ui/const-generics/defaults/rp_impl_trait_fail.rs create mode 100644 tests/ui/const-generics/defaults/rp_impl_trait_fail.stderr create mode 100644 tests/ui/const-generics/defaults/self-referential.rs create mode 100644 tests/ui/const-generics/defaults/self-referential.stderr create mode 100644 tests/ui/const-generics/defaults/simple-defaults.rs create mode 100644 tests/ui/const-generics/defaults/trait_object_lt_defaults.rs create mode 100644 tests/ui/const-generics/defaults/trait_objects.rs create mode 100644 tests/ui/const-generics/defaults/trait_objects_fail.rs create mode 100644 tests/ui/const-generics/defaults/trait_objects_fail.stderr create mode 100644 tests/ui/const-generics/defaults/type-default-const-param-name.rs create mode 100644 tests/ui/const-generics/defaults/wfness.rs create mode 100644 tests/ui/const-generics/defaults/wfness.stderr create mode 100644 tests/ui/const-generics/defaults/wrong-order.rs create mode 100644 tests/ui/const-generics/defaults/wrong-order.stderr (limited to 'tests/ui/const-generics/defaults') diff --git a/tests/ui/const-generics/defaults/auxiliary/const_defaulty.rs b/tests/ui/const-generics/defaults/auxiliary/const_defaulty.rs new file mode 100644 index 000000000..eed982534 --- /dev/null +++ b/tests/ui/const-generics/defaults/auxiliary/const_defaulty.rs @@ -0,0 +1,11 @@ +pub struct Defaulted; +impl Defaulted { + pub fn new() -> Self { + Defaulted + } +} +impl Defaulted { + pub fn value(&self) -> usize { + N + } +} diff --git a/tests/ui/const-generics/defaults/auxiliary/trait_object_lt_defaults_lib.rs b/tests/ui/const-generics/defaults/auxiliary/trait_object_lt_defaults_lib.rs new file mode 100644 index 000000000..26a2c47ff --- /dev/null +++ b/tests/ui/const-generics/defaults/auxiliary/trait_object_lt_defaults_lib.rs @@ -0,0 +1 @@ +pub struct Foo<'a, const N: usize, T: 'a + ?Sized>(pub &'a T, [(); N]); diff --git a/tests/ui/const-generics/defaults/complex-generic-default-expr.min.stderr b/tests/ui/const-generics/defaults/complex-generic-default-expr.min.stderr new file mode 100644 index 000000000..b836cfeae --- /dev/null +++ b/tests/ui/const-generics/defaults/complex-generic-default-expr.min.stderr @@ -0,0 +1,20 @@ +error: generic parameters may not be used in const operations + --> $DIR/complex-generic-default-expr.rs:6:47 + | +LL | struct Foo; + | ^ cannot perform const operation using `N` + | + = help: const parameters may only be used as standalone arguments, i.e. `N` + = help: use `#![feature(generic_const_exprs)]` to allow generic const expressions + +error: generic parameters may not be used in const operations + --> $DIR/complex-generic-default-expr.rs:9:62 + | +LL | struct Bar() }>(T); + | ^ cannot perform const operation using `T` + | + = note: type parameters may not be used in const expressions + = help: use `#![feature(generic_const_exprs)]` to allow generic const expressions + +error: aborting due to 2 previous errors + diff --git a/tests/ui/const-generics/defaults/complex-generic-default-expr.rs b/tests/ui/const-generics/defaults/complex-generic-default-expr.rs new file mode 100644 index 000000000..7f50d4c9f --- /dev/null +++ b/tests/ui/const-generics/defaults/complex-generic-default-expr.rs @@ -0,0 +1,12 @@ +// revisions: full min +//[full] check-pass +#![cfg_attr(full, feature(generic_const_exprs))] +#![cfg_attr(full, allow(incomplete_features))] + +struct Foo; +//[min]~^ ERROR generic parameters may not be used in const operations + +struct Bar() }>(T); +//[min]~^ ERROR generic parameters may not be used in const operations + +fn main() {} diff --git a/tests/ui/const-generics/defaults/complex-unord-param.rs b/tests/ui/const-generics/defaults/complex-unord-param.rs new file mode 100644 index 000000000..aebc5975a --- /dev/null +++ b/tests/ui/const-generics/defaults/complex-unord-param.rs @@ -0,0 +1,17 @@ +// run-pass +// Checks a complicated usage of unordered params +#![allow(dead_code)] + +struct NestedArrays<'a, const N: usize, A: 'a, const M: usize, T:'a =u32> { + args: &'a [&'a [T; M]; N], + specifier: A, +} + +fn main() { + let array = [1, 2, 3]; + let nest = [&array]; + let _ = NestedArrays { + args: &nest, + specifier: true, + }; +} diff --git a/tests/ui/const-generics/defaults/const-default.rs b/tests/ui/const-generics/defaults/const-default.rs new file mode 100644 index 000000000..65cb0eb14 --- /dev/null +++ b/tests/ui/const-generics/defaults/const-default.rs @@ -0,0 +1,24 @@ +// run-pass +pub struct ConstDefault; + +impl ConstDefault { + fn foo(self) -> usize { + N + } +} + +impl ConstDefault { + fn new() -> Self { + ConstDefault + } + + fn bar(self) {} +} + +pub fn main() { + let s = ConstDefault::new(); + assert_eq!(s.foo(), 3); + + let w = ConstDefault::<3>; + w.bar(); +} diff --git a/tests/ui/const-generics/defaults/const-param-as-default-value.rs b/tests/ui/const-generics/defaults/const-param-as-default-value.rs new file mode 100644 index 000000000..c1c955d87 --- /dev/null +++ b/tests/ui/const-generics/defaults/const-param-as-default-value.rs @@ -0,0 +1,21 @@ +// run-pass +struct Foo([u8; N], [u8; M]); + +fn foo() -> Foo { + let x = [0; N]; + Foo(x, x) +} + +// To check that we actually apply the correct substs for const param defaults. +fn concrete_foo() -> Foo<13> { + Foo(Default::default(), Default::default()) +} + + +fn main() { + let val = foo::<13>(); + assert_eq!(val.0, val.1); + + let val = concrete_foo(); + assert_eq!(val.0, val.1); +} diff --git a/tests/ui/const-generics/defaults/const-param-in-ty-defaults.rs b/tests/ui/const-generics/defaults/const-param-in-ty-defaults.rs new file mode 100644 index 000000000..5f0cafe2e --- /dev/null +++ b/tests/ui/const-generics/defaults/const-param-in-ty-defaults.rs @@ -0,0 +1,12 @@ +// run-pass +struct Foo(T); + +impl Foo { + fn new() -> Self { + Foo([0; N]) + } +} + +fn main() { + assert_eq!(Foo::new().0, [0; 10]); +} diff --git a/tests/ui/const-generics/defaults/default-annotation.rs b/tests/ui/const-generics/defaults/default-annotation.rs new file mode 100644 index 000000000..7a9f5732f --- /dev/null +++ b/tests/ui/const-generics/defaults/default-annotation.rs @@ -0,0 +1,17 @@ +// run-pass +#![feature(staged_api)] +#![allow(incomplete_features)] +// FIXME(const_generics_defaults): It seems like we aren't testing the right thing here, +// I would assume that we want the attributes to apply to the const parameter defaults +// themselves. +#![stable(feature = "const_default_test", since="none")] + +#[unstable(feature = "const_default_stable", issue="none")] +pub struct ConstDefaultUnstable; + +#[stable(feature = "const_default_unstable", since="none")] +pub struct ConstDefaultStable; + +fn main() {} diff --git a/tests/ui/const-generics/defaults/default-const-param-cannot-reference-self.rs b/tests/ui/const-generics/defaults/default-const-param-cannot-reference-self.rs new file mode 100644 index 000000000..45275e609 --- /dev/null +++ b/tests/ui/const-generics/defaults/default-const-param-cannot-reference-self.rs @@ -0,0 +1,14 @@ +struct Struct; +//~^ ERROR generic parameters cannot use `Self` in their defaults [E0735] + +enum Enum { } +//~^ ERROR generic parameters cannot use `Self` in their defaults [E0735] + +union Union { not_empty: () } +//~^ ERROR generic parameters cannot use `Self` in their defaults [E0735] + +fn main() { + let _: Struct; + let _: Enum; + let _: Union; +} diff --git a/tests/ui/const-generics/defaults/default-const-param-cannot-reference-self.stderr b/tests/ui/const-generics/defaults/default-const-param-cannot-reference-self.stderr new file mode 100644 index 000000000..72d7001fd --- /dev/null +++ b/tests/ui/const-generics/defaults/default-const-param-cannot-reference-self.stderr @@ -0,0 +1,21 @@ +error[E0735]: generic parameters cannot use `Self` in their defaults + --> $DIR/default-const-param-cannot-reference-self.rs:1:34 + | +LL | struct Struct; + | ^^^^ `Self` in generic parameter default + +error[E0735]: generic parameters cannot use `Self` in their defaults + --> $DIR/default-const-param-cannot-reference-self.rs:4:30 + | +LL | enum Enum { } + | ^^^^ `Self` in generic parameter default + +error[E0735]: generic parameters cannot use `Self` in their defaults + --> $DIR/default-const-param-cannot-reference-self.rs:7:32 + | +LL | union Union { not_empty: () } + | ^^^^ `Self` in generic parameter default + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0735`. diff --git a/tests/ui/const-generics/defaults/default-on-impl.rs b/tests/ui/const-generics/defaults/default-on-impl.rs new file mode 100644 index 000000000..9ce46aa09 --- /dev/null +++ b/tests/ui/const-generics/defaults/default-on-impl.rs @@ -0,0 +1,6 @@ +struct Foo; + +impl Foo {} +//~^ ERROR defaults for const parameters are only allowed + +fn main() {} diff --git a/tests/ui/const-generics/defaults/default-on-impl.stderr b/tests/ui/const-generics/defaults/default-on-impl.stderr new file mode 100644 index 000000000..4b2b05742 --- /dev/null +++ b/tests/ui/const-generics/defaults/default-on-impl.stderr @@ -0,0 +1,8 @@ +error: defaults for const parameters are only allowed in `struct`, `enum`, `type`, or `trait` definitions + --> $DIR/default-on-impl.rs:3:6 + | +LL | impl Foo {} + | ^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + diff --git a/tests/ui/const-generics/defaults/default-param-wf-concrete.rs b/tests/ui/const-generics/defaults/default-param-wf-concrete.rs new file mode 100644 index 000000000..41a52c7eb --- /dev/null +++ b/tests/ui/const-generics/defaults/default-param-wf-concrete.rs @@ -0,0 +1,3 @@ +struct Foo; +//~^ ERROR evaluation of constant value failed +fn main() {} diff --git a/tests/ui/const-generics/defaults/default-param-wf-concrete.stderr b/tests/ui/const-generics/defaults/default-param-wf-concrete.stderr new file mode 100644 index 000000000..e8ebddade --- /dev/null +++ b/tests/ui/const-generics/defaults/default-param-wf-concrete.stderr @@ -0,0 +1,9 @@ +error[E0080]: evaluation of constant value failed + --> $DIR/default-param-wf-concrete.rs:1:28 + | +LL | struct Foo; + | ^^^^^^^ attempt to compute `u8::MAX + 1_u8`, which would overflow + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0080`. diff --git a/tests/ui/const-generics/defaults/doesnt_infer.rs b/tests/ui/const-generics/defaults/doesnt_infer.rs new file mode 100644 index 000000000..9c59e672d --- /dev/null +++ b/tests/ui/const-generics/defaults/doesnt_infer.rs @@ -0,0 +1,13 @@ +// test that defaulted const params are not used to help type inference + +struct Foo; + +impl Foo { + fn foo() -> Self { loop {} } +} + +fn main() { + let foo = Foo::<1>::foo(); + let foo = Foo::foo(); + //~^ error: type annotations needed for `Foo` +} diff --git a/tests/ui/const-generics/defaults/doesnt_infer.stderr b/tests/ui/const-generics/defaults/doesnt_infer.stderr new file mode 100644 index 000000000..227b2f402 --- /dev/null +++ b/tests/ui/const-generics/defaults/doesnt_infer.stderr @@ -0,0 +1,14 @@ +error[E0282]: type annotations needed for `Foo` + --> $DIR/doesnt_infer.rs:11:9 + | +LL | let foo = Foo::foo(); + | ^^^ + | +help: consider giving `foo` an explicit type, where the the value of const parameter `N` is specified + | +LL | let foo: Foo = Foo::foo(); + | ++++++++ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0282`. diff --git a/tests/ui/const-generics/defaults/external.rs b/tests/ui/const-generics/defaults/external.rs new file mode 100644 index 000000000..25ec523cb --- /dev/null +++ b/tests/ui/const-generics/defaults/external.rs @@ -0,0 +1,24 @@ +// aux-build:const_defaulty.rs +// check-pass +extern crate const_defaulty; +use const_defaulty::Defaulted; + +struct Local; +impl Local { + fn new() -> Self { + Local + } +} +implLocal { + fn value(&self) -> usize { + N + } +} + +fn main() { + let v = Defaulted::new(); + assert_eq!(v.value(), 3); + + let l = Local::new(); + assert_eq!(l.value(), 4); +} diff --git a/tests/ui/const-generics/defaults/forward-declared.rs b/tests/ui/const-generics/defaults/forward-declared.rs new file mode 100644 index 000000000..ede3d873b --- /dev/null +++ b/tests/ui/const-generics/defaults/forward-declared.rs @@ -0,0 +1,13 @@ +struct Foo; +//~^ ERROR generic parameters with a default cannot use forward declared identifiers + +enum Bar {} +//~^ ERROR generic parameters with a default cannot use forward declared identifiers + +struct Foo2; +//~^ ERROR generic parameters with a default cannot use forward declared identifiers + +enum Bar2 {} +//~^ ERROR generic parameters with a default cannot use forward declared identifiers + +fn main() {} diff --git a/tests/ui/const-generics/defaults/forward-declared.stderr b/tests/ui/const-generics/defaults/forward-declared.stderr new file mode 100644 index 000000000..4856c7a1f --- /dev/null +++ b/tests/ui/const-generics/defaults/forward-declared.stderr @@ -0,0 +1,27 @@ +error[E0128]: generic parameters with a default cannot use forward declared identifiers + --> $DIR/forward-declared.rs:1:29 + | +LL | struct Foo; + | ^ defaulted generic parameters cannot be forward declared + +error[E0128]: generic parameters with a default cannot use forward declared identifiers + --> $DIR/forward-declared.rs:4:27 + | +LL | enum Bar {} + | ^ defaulted generic parameters cannot be forward declared + +error[E0128]: generic parameters with a default cannot use forward declared identifiers + --> $DIR/forward-declared.rs:7:30 + | +LL | struct Foo2; + | ^ defaulted generic parameters cannot be forward declared + +error[E0128]: generic parameters with a default cannot use forward declared identifiers + --> $DIR/forward-declared.rs:10:28 + | +LL | enum Bar2 {} + | ^ defaulted generic parameters cannot be forward declared + +error: aborting due to 4 previous errors + +For more information about this error, try `rustc --explain E0128`. diff --git a/tests/ui/const-generics/defaults/generic-expr-default-concrete.rs b/tests/ui/const-generics/defaults/generic-expr-default-concrete.rs new file mode 100644 index 000000000..f082bd8d2 --- /dev/null +++ b/tests/ui/const-generics/defaults/generic-expr-default-concrete.rs @@ -0,0 +1,14 @@ +#![feature(generic_const_exprs)] +#![allow(incomplete_features)] + +struct Foo; +fn no_constraining() -> Foo<10> { + Foo::<10, 11> +} + +pub fn different_than_default() -> Foo<10> { + Foo::<10, 12> + //~^ error: mismatched types +} + +fn main() {} diff --git a/tests/ui/const-generics/defaults/generic-expr-default-concrete.stderr b/tests/ui/const-generics/defaults/generic-expr-default-concrete.stderr new file mode 100644 index 000000000..61b355118 --- /dev/null +++ b/tests/ui/const-generics/defaults/generic-expr-default-concrete.stderr @@ -0,0 +1,12 @@ +error[E0308]: mismatched types + --> $DIR/generic-expr-default-concrete.rs:10:5 + | +LL | Foo::<10, 12> + | ^^^^^^^^^^^^^ expected `11`, found `12` + | + = note: expected constant `11` + found constant `12` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0308`. diff --git a/tests/ui/const-generics/defaults/generic-expr-default-mismatched-types.rs b/tests/ui/const-generics/defaults/generic-expr-default-mismatched-types.rs new file mode 100644 index 000000000..777865d1c --- /dev/null +++ b/tests/ui/const-generics/defaults/generic-expr-default-mismatched-types.rs @@ -0,0 +1,16 @@ +#![feature(generic_const_exprs)] +#![allow(incomplete_features)] + +struct Foo; +fn should_unify() -> Foo where [(); { N + 1 }]: { + Foo:: +} +pub fn shouldnt_unify() -> Foo +where + [(); { N + 1 }]:, + [(); { N + 2 }]:, { + Foo:: + //~^ error: mismatched types +} + +fn main() {} diff --git a/tests/ui/const-generics/defaults/generic-expr-default-mismatched-types.stderr b/tests/ui/const-generics/defaults/generic-expr-default-mismatched-types.stderr new file mode 100644 index 000000000..e83f89a60 --- /dev/null +++ b/tests/ui/const-generics/defaults/generic-expr-default-mismatched-types.stderr @@ -0,0 +1,12 @@ +error[E0308]: mismatched types + --> $DIR/generic-expr-default-mismatched-types.rs:12:5 + | +LL | Foo:: + | ^^^^^^^^^^^^^^^^^^^ expected `{ N + 1 }`, found `{ N + 2 }` + | + = note: expected constant `{ N + 1 }` + found constant `{ N + 2 }` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0308`. diff --git a/tests/ui/const-generics/defaults/generic-expr-default.rs b/tests/ui/const-generics/defaults/generic-expr-default.rs new file mode 100644 index 000000000..8fe43feb7 --- /dev/null +++ b/tests/ui/const-generics/defaults/generic-expr-default.rs @@ -0,0 +1,24 @@ +#![feature(generic_const_exprs)] +#![allow(incomplete_features)] + +pub struct Foo; +pub fn needs_evaluatable_bound() -> Foo { + //~^ error: unconstrained generic constant + loop {} +} +pub fn has_evaluatable_bound() -> Foo where [(); N1 + 1]: { + loop {} +} + +type FooAlias = [(); NP]; +fn needs_evaluatable_bound_alias() -> FooAlias +{ + //~^^ error: unconstrained generic constant + todo!() +} +fn has_evaluatable_bound_alias() -> FooAlias +where [(); N + 1]: { + todo!() +} + +fn main() {} diff --git a/tests/ui/const-generics/defaults/generic-expr-default.stderr b/tests/ui/const-generics/defaults/generic-expr-default.stderr new file mode 100644 index 000000000..ada1498d1 --- /dev/null +++ b/tests/ui/const-generics/defaults/generic-expr-default.stderr @@ -0,0 +1,18 @@ +error: unconstrained generic constant + --> $DIR/generic-expr-default.rs:5:54 + | +LL | pub fn needs_evaluatable_bound() -> Foo { + | ^^^^^^^ + | + = help: try adding a `where` bound using this expression: `where [(); { N + 1 }]:` + +error: unconstrained generic constant + --> $DIR/generic-expr-default.rs:14:58 + | +LL | fn needs_evaluatable_bound_alias() -> FooAlias + | ^^^^^^^^^^^ + | + = help: try adding a `where` bound using this expression: `where [(); { N + 1 }]:` + +error: aborting due to 2 previous errors + diff --git a/tests/ui/const-generics/defaults/intermixed-lifetime.rs b/tests/ui/const-generics/defaults/intermixed-lifetime.rs new file mode 100644 index 000000000..beaf7fc60 --- /dev/null +++ b/tests/ui/const-generics/defaults/intermixed-lifetime.rs @@ -0,0 +1,9 @@ +// Checks that lifetimes cannot be interspersed between consts and types. + +struct Foo(&'a (), T); +//~^ ERROR lifetime parameters must be declared prior to type and const parameters + +struct Bar(&'a (), T); +//~^ ERROR lifetime parameters must be declared prior to type and const parameters + +fn main() {} diff --git a/tests/ui/const-generics/defaults/intermixed-lifetime.stderr b/tests/ui/const-generics/defaults/intermixed-lifetime.stderr new file mode 100644 index 000000000..5cff61dd9 --- /dev/null +++ b/tests/ui/const-generics/defaults/intermixed-lifetime.stderr @@ -0,0 +1,14 @@ +error: lifetime parameters must be declared prior to type and const parameters + --> $DIR/intermixed-lifetime.rs:3:28 + | +LL | struct Foo(&'a (), T); + | -----------------^^---------- help: reorder the parameters: lifetimes, then consts and types: `<'a, const N: usize, T = u32>` + +error: lifetime parameters must be declared prior to type and const parameters + --> $DIR/intermixed-lifetime.rs:6:37 + | +LL | struct Bar(&'a (), T); + | --------------------------^^- help: reorder the parameters: lifetimes, then consts and types: `<'a, const N: usize, T = u32>` + +error: aborting due to 2 previous errors + diff --git a/tests/ui/const-generics/defaults/mismatch.rs b/tests/ui/const-generics/defaults/mismatch.rs new file mode 100644 index 000000000..ec131505e --- /dev/null +++ b/tests/ui/const-generics/defaults/mismatch.rs @@ -0,0 +1,22 @@ +pub struct Example; +pub struct Example2(T); +pub struct Example3(T); +pub struct Example4; + +fn main() { + let e: Example<13> = (); + //~^ Error: mismatched types + //~| expected struct `Example` + let e: Example2 = (); + //~^ Error: mismatched types + //~| expected struct `Example2` + let e: Example3<13, u32> = (); + //~^ Error: mismatched types + //~| expected struct `Example3` + let e: Example3<7> = (); + //~^ Error: mismatched types + //~| expected struct `Example3<7>` + let e: Example4<7> = (); + //~^ Error: mismatched types + //~| expected struct `Example4<7>` +} diff --git a/tests/ui/const-generics/defaults/mismatch.stderr b/tests/ui/const-generics/defaults/mismatch.stderr new file mode 100644 index 000000000..52c54aace --- /dev/null +++ b/tests/ui/const-generics/defaults/mismatch.stderr @@ -0,0 +1,58 @@ +error[E0308]: mismatched types + --> $DIR/mismatch.rs:7:26 + | +LL | let e: Example<13> = (); + | ----------- ^^ expected struct `Example`, found `()` + | | + | expected due to this + | + = note: expected struct `Example` + found unit type `()` + +error[E0308]: mismatched types + --> $DIR/mismatch.rs:10:32 + | +LL | let e: Example2 = (); + | ----------------- ^^ expected struct `Example2`, found `()` + | | + | expected due to this + | + = note: expected struct `Example2` + found unit type `()` + +error[E0308]: mismatched types + --> $DIR/mismatch.rs:13:32 + | +LL | let e: Example3<13, u32> = (); + | ----------------- ^^ expected struct `Example3`, found `()` + | | + | expected due to this + | + = note: expected struct `Example3` + found unit type `()` + +error[E0308]: mismatched types + --> $DIR/mismatch.rs:16:26 + | +LL | let e: Example3<7> = (); + | ----------- ^^ expected struct `Example3`, found `()` + | | + | expected due to this + | + = note: expected struct `Example3<7>` + found unit type `()` + +error[E0308]: mismatched types + --> $DIR/mismatch.rs:19:26 + | +LL | let e: Example4<7> = (); + | ----------- ^^ expected struct `Example4`, found `()` + | | + | expected due to this + | + = note: expected struct `Example4<7>` + found unit type `()` + +error: aborting due to 5 previous errors + +For more information about this error, try `rustc --explain E0308`. diff --git a/tests/ui/const-generics/defaults/mismatched_ty_const_in_trait_impl.rs b/tests/ui/const-generics/defaults/mismatched_ty_const_in_trait_impl.rs new file mode 100644 index 000000000..5c9323261 --- /dev/null +++ b/tests/ui/const-generics/defaults/mismatched_ty_const_in_trait_impl.rs @@ -0,0 +1,41 @@ +trait Trait { + fn foo() {} +} +impl Trait for () { + fn foo() {} + //~^ error: method `foo` has an incompatible generic parameter for trait +} + +trait Other { + fn bar() {} +} +impl Other for () { + fn bar() {} + //~^ error: method `bar` has an incompatible generic parameter for trait +} + +trait Uwu { + fn baz() {} +} +impl Uwu for () { + fn baz() {} + //~^ error: method `baz` has an incompatible generic parameter for trait +} + +trait Aaaaaa { + fn bbbb() {} +} +impl Aaaaaa for () { + fn bbbb() {} + //~^ error: method `bbbb` has an incompatible generic parameter for trait +} + +trait Names { + fn abcd() {} +} +impl Names for () { + fn abcd() {} + //~^ error: method `abcd` has an incompatible generic parameter for trait +} + +fn main() {} diff --git a/tests/ui/const-generics/defaults/mismatched_ty_const_in_trait_impl.stderr b/tests/ui/const-generics/defaults/mismatched_ty_const_in_trait_impl.stderr new file mode 100644 index 000000000..3455f2c8e --- /dev/null +++ b/tests/ui/const-generics/defaults/mismatched_ty_const_in_trait_impl.stderr @@ -0,0 +1,68 @@ +error[E0053]: method `foo` has an incompatible generic parameter for trait `Trait` + --> $DIR/mismatched_ty_const_in_trait_impl.rs:5:12 + | +LL | trait Trait { + | ----- +LL | fn foo() {} + | - expected type parameter +LL | } +LL | impl Trait for () { + | ----------------- +LL | fn foo() {} + | ^^^^^^^^^^^^ found const parameter of type `u64` + +error[E0053]: method `bar` has an incompatible generic parameter for trait `Other` + --> $DIR/mismatched_ty_const_in_trait_impl.rs:13:12 + | +LL | trait Other { + | ----- +LL | fn bar() {} + | ----------- expected const parameter of type `u8` +LL | } +LL | impl Other for () { + | ----------------- +LL | fn bar() {} + | ^ found type parameter + +error[E0053]: method `baz` has an incompatible generic parameter for trait `Uwu` + --> $DIR/mismatched_ty_const_in_trait_impl.rs:21:12 + | +LL | trait Uwu { + | --- +LL | fn baz() {} + | ------------ expected const parameter of type `u32` +LL | } +LL | impl Uwu for () { + | --------------- +LL | fn baz() {} + | ^^^^^^^^^^^^ found const parameter of type `i32` + +error[E0053]: method `bbbb` has an incompatible generic parameter for trait `Aaaaaa` + --> $DIR/mismatched_ty_const_in_trait_impl.rs:29:13 + | +LL | trait Aaaaaa { + | ------ +LL | fn bbbb() {} + | ------------ expected const parameter of type `u32` +LL | } +LL | impl Aaaaaa for () { + | ------------------ +LL | fn bbbb() {} + | ^ found type parameter + +error[E0053]: method `abcd` has an incompatible generic parameter for trait `Names` + --> $DIR/mismatched_ty_const_in_trait_impl.rs:37:13 + | +LL | trait Names { + | ----- +LL | fn abcd() {} + | - expected type parameter +LL | } +LL | impl Names for () { + | ----------------- +LL | fn abcd() {} + | ^^^^^^^^^^^^ found const parameter of type `u32` + +error: aborting due to 5 previous errors + +For more information about this error, try `rustc --explain E0053`. diff --git a/tests/ui/const-generics/defaults/param-order-err-pretty-prints-default.rs b/tests/ui/const-generics/defaults/param-order-err-pretty-prints-default.rs new file mode 100644 index 000000000..f928fc9e7 --- /dev/null +++ b/tests/ui/const-generics/defaults/param-order-err-pretty-prints-default.rs @@ -0,0 +1,4 @@ +struct Foo(&'a u32); +//~^ ERROR lifetime parameters must be declared prior to type and const parameters + +fn main() {} diff --git a/tests/ui/const-generics/defaults/param-order-err-pretty-prints-default.stderr b/tests/ui/const-generics/defaults/param-order-err-pretty-prints-default.stderr new file mode 100644 index 000000000..ba08b4646 --- /dev/null +++ b/tests/ui/const-generics/defaults/param-order-err-pretty-prints-default.stderr @@ -0,0 +1,8 @@ +error: lifetime parameters must be declared prior to type and const parameters + --> $DIR/param-order-err-pretty-prints-default.rs:1:33 + | +LL | struct Foo(&'a u32); + | ----------------------^^- help: reorder the parameters: lifetimes, then consts and types: `<'a, const M: usize = 10>` + +error: aborting due to previous error + diff --git a/tests/ui/const-generics/defaults/pretty-printing-ast.rs b/tests/ui/const-generics/defaults/pretty-printing-ast.rs new file mode 100644 index 000000000..e202d4e86 --- /dev/null +++ b/tests/ui/const-generics/defaults/pretty-printing-ast.rs @@ -0,0 +1,11 @@ +// Test the AST pretty printer correctly handles default values for const generics +// check-pass +// compile-flags: -Z unpretty=expanded + +#![crate_type = "lib"] + +trait Foo {} + +fn foo() {} + +struct Range; diff --git a/tests/ui/const-generics/defaults/pretty-printing-ast.stdout b/tests/ui/const-generics/defaults/pretty-printing-ast.stdout new file mode 100644 index 000000000..121138605 --- /dev/null +++ b/tests/ui/const-generics/defaults/pretty-printing-ast.stdout @@ -0,0 +1,18 @@ +#![feature(prelude_import)] +#![no_std] +// Test the AST pretty printer correctly handles default values for const generics +// check-pass +// compile-flags: -Z unpretty=expanded + +#![crate_type = "lib"] +#[prelude_import] +use ::std::prelude::rust_2015::*; +#[macro_use] +extern crate std; + +trait Foo {} + +fn foo() {} + +struct Range; diff --git a/tests/ui/const-generics/defaults/repr-c-issue-82792.rs b/tests/ui/const-generics/defaults/repr-c-issue-82792.rs new file mode 100644 index 000000000..118da2723 --- /dev/null +++ b/tests/ui/const-generics/defaults/repr-c-issue-82792.rs @@ -0,0 +1,11 @@ +// Regression test for #82792. + +// run-pass + +#[repr(C)] +pub struct Loaf { + head: [T; N], + slice: [T], +} + +fn main() {} diff --git a/tests/ui/const-generics/defaults/rp_impl_trait.rs b/tests/ui/const-generics/defaults/rp_impl_trait.rs new file mode 100644 index 000000000..dde8eea45 --- /dev/null +++ b/tests/ui/const-generics/defaults/rp_impl_trait.rs @@ -0,0 +1,29 @@ +// run-pass +struct Uwu; + +trait Trait {} +impl Trait for Uwu {} + +fn rawr() -> impl Trait { + Uwu:: +} + +trait Traitor { } + +impl Traitor for u32 {} +impl Traitor<1, 1> for u64 {} + +fn uwu() -> impl Traitor { + 1_u32 +} + +fn owo() -> impl Traitor { + 1_u64 +} + +fn main() { + rawr::<3>(); + rawr::<7>(); + uwu::<{ u8::MAX }>(); + owo(); +} diff --git a/tests/ui/const-generics/defaults/rp_impl_trait_fail.rs b/tests/ui/const-generics/defaults/rp_impl_trait_fail.rs new file mode 100644 index 000000000..80013e7b4 --- /dev/null +++ b/tests/ui/const-generics/defaults/rp_impl_trait_fail.rs @@ -0,0 +1,30 @@ +struct Uwu; + +trait Trait {} +impl Trait for Uwu {} + +fn rawr() -> impl Trait { + //~^ error: the trait bound `Uwu<10, 12>: Trait` is not satisfied + Uwu::<10, 12> +} + +trait Traitor {} + +impl Traitor for u32 {} +impl Traitor<1, 2> for u64 {} + +fn uwu() -> impl Traitor { + //~^ error: the trait bound `u32: Traitor` is not satisfied + 1_u32 +} + +fn owo() -> impl Traitor { + //~^ error: the trait bound `u64: Traitor` is not satisfied + 1_u64 +} + +fn main() { + rawr(); + uwu(); + owo(); +} diff --git a/tests/ui/const-generics/defaults/rp_impl_trait_fail.stderr b/tests/ui/const-generics/defaults/rp_impl_trait_fail.stderr new file mode 100644 index 000000000..a46bd5352 --- /dev/null +++ b/tests/ui/const-generics/defaults/rp_impl_trait_fail.stderr @@ -0,0 +1,36 @@ +error[E0277]: the trait bound `Uwu<10, 12>: Trait` is not satisfied + --> $DIR/rp_impl_trait_fail.rs:6:14 + | +LL | fn rawr() -> impl Trait { + | ^^^^^^^^^^ the trait `Trait` is not implemented for `Uwu<10, 12>` +LL | +LL | Uwu::<10, 12> + | ------------- return type was inferred to be `Uwu<10, 12>` here + | + = help: the trait `Trait` is implemented for `Uwu` + +error[E0277]: the trait bound `u32: Traitor` is not satisfied + --> $DIR/rp_impl_trait_fail.rs:16:26 + | +LL | fn uwu() -> impl Traitor { + | ^^^^^^^^^^^^^^^ the trait `Traitor` is not implemented for `u32` +LL | +LL | 1_u32 + | ----- return type was inferred to be `u32` here + | + = help: the trait `Traitor` is implemented for `u32` + +error[E0277]: the trait bound `u64: Traitor` is not satisfied + --> $DIR/rp_impl_trait_fail.rs:21:13 + | +LL | fn owo() -> impl Traitor { + | ^^^^^^^^^^^^ the trait `Traitor` is not implemented for `u64` +LL | +LL | 1_u64 + | ----- return type was inferred to be `u64` here + | + = help: the trait `Traitor<1, 2>` is implemented for `u64` + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0277`. diff --git a/tests/ui/const-generics/defaults/self-referential.rs b/tests/ui/const-generics/defaults/self-referential.rs new file mode 100644 index 000000000..14a870dc3 --- /dev/null +++ b/tests/ui/const-generics/defaults/self-referential.rs @@ -0,0 +1,4 @@ +trait Foo {} +//~^ ERROR the name `M` is already used for a generic parameter in this item's generic parameters +impl Foo<2> for () {} +fn main() {} diff --git a/tests/ui/const-generics/defaults/self-referential.stderr b/tests/ui/const-generics/defaults/self-referential.stderr new file mode 100644 index 000000000..170c1f7f7 --- /dev/null +++ b/tests/ui/const-generics/defaults/self-referential.stderr @@ -0,0 +1,11 @@ +error[E0403]: the name `M` is already used for a generic parameter in this item's generic parameters + --> $DIR/self-referential.rs:1:30 + | +LL | trait Foo {} + | - ^ already used + | | + | first use of `M` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0403`. diff --git a/tests/ui/const-generics/defaults/simple-defaults.rs b/tests/ui/const-generics/defaults/simple-defaults.rs new file mode 100644 index 000000000..6a782d223 --- /dev/null +++ b/tests/ui/const-generics/defaults/simple-defaults.rs @@ -0,0 +1,13 @@ +// run-pass +// Checks that type param defaults are allowed after const params. +#![allow(dead_code)] + +struct FixedOutput<'a, const N: usize, T=u32> { + out: &'a [T; N], +} + +trait FixedOutputter { + fn out(&self) -> FixedOutput<'_, 10>; +} + +fn main() {} diff --git a/tests/ui/const-generics/defaults/trait_object_lt_defaults.rs b/tests/ui/const-generics/defaults/trait_object_lt_defaults.rs new file mode 100644 index 000000000..a1828727e --- /dev/null +++ b/tests/ui/const-generics/defaults/trait_object_lt_defaults.rs @@ -0,0 +1,24 @@ +// aux-build:trait_object_lt_defaults_lib.rs +// run-pass +#![allow(dead_code)] +extern crate trait_object_lt_defaults_lib; + +// Tests that `A<'a, 3, dyn Test>` is short for `A<'a, 3, dyn Test + 'a>` +// and `Foo<'a, 3, dyn Test>` is short for `Foo<'a, 3, dyn Test + 'a>` +// Test is in `const-generics/defaults` because it relies on param ordering + +trait Test {} + +struct A<'a, const N: usize, T: ?Sized + 'a>(&'a T, [(); N]); +fn blah<'a>(mut a: A<'a, 3, dyn Test>, arg: &'a (dyn Test + 'a)) { + a.0 = arg; +} + +fn other_blah<'a>( + mut a: trait_object_lt_defaults_lib::Foo<'a, 3, dyn Test>, + arg: &'a (dyn Test + 'a), +) { + a.0 = arg; +} + +fn main() {} diff --git a/tests/ui/const-generics/defaults/trait_objects.rs b/tests/ui/const-generics/defaults/trait_objects.rs new file mode 100644 index 000000000..750e40313 --- /dev/null +++ b/tests/ui/const-generics/defaults/trait_objects.rs @@ -0,0 +1,43 @@ +// run-pass +trait Trait { + fn uwu(&self) -> u8 { + N + } +} + +impl Trait for u32 {} + +impl Trait<12> for u64 { + fn uwu(&self) -> u8 { + *self as u8 + } +} + +fn foo(arg: &dyn Trait) -> u8 { + arg.uwu() +} + +trait Traitor { + fn owo(&self) -> u8 { + M + } +} + +impl Traitor<2> for bool { } +impl Traitor for u8 { + fn owo(&self) -> u8 { + *self + } +} + +fn bar(arg: &dyn Traitor) -> u8 { + arg.owo() +} + +fn main() { + assert_eq!(foo(&10_u32), 12); + assert_eq!(foo(&3_u64), 3); + + assert_eq!(bar(&true), 2); + assert_eq!(bar(&1_u8), 1); +} diff --git a/tests/ui/const-generics/defaults/trait_objects_fail.rs b/tests/ui/const-generics/defaults/trait_objects_fail.rs new file mode 100644 index 000000000..6ab803f99 --- /dev/null +++ b/tests/ui/const-generics/defaults/trait_objects_fail.rs @@ -0,0 +1,30 @@ +trait Trait { + fn uwu(&self) -> u8 { + N + } +} + +impl Trait<2> for u32 {} + +fn foo(arg: &dyn Trait) -> u8 { + arg.uwu() +} + +trait Traitor { + fn owo(&self) -> u8 { + M + } +} + +impl Traitor<2, 3> for bool {} + +fn bar(arg: &dyn Traitor) -> u8 { + arg.owo() +} + +fn main() { + foo(&10_u32); + //~^ error: the trait bound `u32: Trait` is not satisfied + bar(&true); + //~^ error: the trait bound `bool: Traitor<_>` is not satisfied +} diff --git a/tests/ui/const-generics/defaults/trait_objects_fail.stderr b/tests/ui/const-generics/defaults/trait_objects_fail.stderr new file mode 100644 index 000000000..0e8334d03 --- /dev/null +++ b/tests/ui/const-generics/defaults/trait_objects_fail.stderr @@ -0,0 +1,21 @@ +error[E0277]: the trait bound `u32: Trait` is not satisfied + --> $DIR/trait_objects_fail.rs:26:9 + | +LL | foo(&10_u32); + | ^^^^^^^ the trait `Trait` is not implemented for `u32` + | + = help: the trait `Trait<2>` is implemented for `u32` + = note: required for the cast from `u32` to the object type `dyn Trait` + +error[E0277]: the trait bound `bool: Traitor<_>` is not satisfied + --> $DIR/trait_objects_fail.rs:28:9 + | +LL | bar(&true); + | ^^^^^ the trait `Traitor<_>` is not implemented for `bool` + | + = help: the trait `Traitor<2, 3>` is implemented for `bool` + = note: required for the cast from `bool` to the object type `dyn Traitor<_>` + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0277`. diff --git a/tests/ui/const-generics/defaults/type-default-const-param-name.rs b/tests/ui/const-generics/defaults/type-default-const-param-name.rs new file mode 100644 index 000000000..405664ded --- /dev/null +++ b/tests/ui/const-generics/defaults/type-default-const-param-name.rs @@ -0,0 +1,14 @@ +// check-pass +struct N; + +struct Foo(T); + +impl Foo { + fn new() -> Self { + Foo(N) + } +} + +fn main() { + let Foo::<1, N>(N) = Foo::new(); +} diff --git a/tests/ui/const-generics/defaults/wfness.rs b/tests/ui/const-generics/defaults/wfness.rs new file mode 100644 index 000000000..a93f67081 --- /dev/null +++ b/tests/ui/const-generics/defaults/wfness.rs @@ -0,0 +1,23 @@ +struct Ooopsies; +//~^ error: evaluation of constant value failed + +trait Trait {} +impl Trait<3> for () {} +struct WhereClause +where + (): Trait; +//~^ error: the trait bound `(): Trait<2>` is not satisfied + +trait Traitor {} +struct WhereClauseTooGeneric(T) +where + (): Traitor; + +// no error on struct def +struct DependentDefaultWfness>(T); +fn foo() -> DependentDefaultWfness { + //~^ error: the trait bound `(): Trait<1>` is not satisfied + loop {} +} + +fn main() {} diff --git a/tests/ui/const-generics/defaults/wfness.stderr b/tests/ui/const-generics/defaults/wfness.stderr new file mode 100644 index 000000000..25038f830 --- /dev/null +++ b/tests/ui/const-generics/defaults/wfness.stderr @@ -0,0 +1,34 @@ +error[E0080]: evaluation of constant value failed + --> $DIR/wfness.rs:1:33 + | +LL | struct Ooopsies; + | ^^^^^^^^^^^ attempt to compute `u8::MAX + 1_u8`, which would overflow + +error[E0277]: the trait bound `(): Trait<2>` is not satisfied + --> $DIR/wfness.rs:8:9 + | +LL | (): Trait; + | ^^^^^^^^ the trait `Trait<2>` is not implemented for `()` + | + = help: the trait `Trait<3>` is implemented for `()` + +error[E0277]: the trait bound `(): Trait<1>` is not satisfied + --> $DIR/wfness.rs:18:13 + | +LL | fn foo() -> DependentDefaultWfness { + | ^^^^^^^^^^^^^^^^^^^^^^ the trait `Trait<1>` is not implemented for `()` + | + = help: the trait `Trait<3>` is implemented for `()` +note: required by a bound in `WhereClause` + --> $DIR/wfness.rs:8:9 + | +LL | struct WhereClause + | ----------- required by a bound in this +LL | where +LL | (): Trait; + | ^^^^^^^^ required by this bound in `WhereClause` + +error: aborting due to 3 previous errors + +Some errors have detailed explanations: E0080, E0277. +For more information about an error, try `rustc --explain E0080`. diff --git a/tests/ui/const-generics/defaults/wrong-order.rs b/tests/ui/const-generics/defaults/wrong-order.rs new file mode 100644 index 000000000..d53d56f41 --- /dev/null +++ b/tests/ui/const-generics/defaults/wrong-order.rs @@ -0,0 +1,9 @@ +struct A { + //~^ ERROR generic parameters with a default must be trailing + arg: T, +} + +struct Foo(T); +//~^ error: generic parameters with a default must be trailing + +fn main() {} diff --git a/tests/ui/const-generics/defaults/wrong-order.stderr b/tests/ui/const-generics/defaults/wrong-order.stderr new file mode 100644 index 000000000..4d2628d03 --- /dev/null +++ b/tests/ui/const-generics/defaults/wrong-order.stderr @@ -0,0 +1,14 @@ +error: generic parameters with a default must be trailing + --> $DIR/wrong-order.rs:1:10 + | +LL | struct A { + | ^ + +error: generic parameters with a default must be trailing + --> $DIR/wrong-order.rs:6:18 + | +LL | struct Foo(T); + | ^ + +error: aborting due to 2 previous errors + -- cgit v1.2.3