about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorlcnr <rust@lcnr.de>2021-04-18 15:14:17 +0200
committerlcnr <rust@lcnr.de>2021-04-21 15:25:58 +0200
commit312b4fdfd281a5ebd740acaf88cc82c47225be23 (patch)
treeb49da697d05a3f9001fad492de4e340328d85fe7 /src
parent7cb1dcd48802378929032ad9363c296891443d76 (diff)
downloadrust-312b4fdfd281a5ebd740acaf88cc82c47225be23.tar.gz
rust-312b4fdfd281a5ebd740acaf88cc82c47225be23.zip
improve wf check for const param defaults
Diffstat (limited to 'src')
-rw-r--r--src/test/ui/const-generics/defaults/complex-generic-default-expr.min.stderr4
-rw-r--r--src/test/ui/const-generics/defaults/complex-generic-default-expr.rs8
-rw-r--r--src/test/ui/const-generics/defaults/const-param-as-default-value.rs14
-rw-r--r--src/test/ui/const-generics/defaults/const-param-in-ty-defaults.rs18
-rw-r--r--src/test/ui/const-generics/defaults/default-param-wf-concrete.rs5
-rw-r--r--src/test/ui/const-generics/defaults/default-param-wf-concrete.stderr9
-rw-r--r--src/test/ui/const-generics/defaults/pretty-printing-ast.rs1
7 files changed, 54 insertions, 5 deletions
diff --git a/src/test/ui/const-generics/defaults/complex-generic-default-expr.min.stderr b/src/test/ui/const-generics/defaults/complex-generic-default-expr.min.stderr
index d50a0a61d49..7d51e9aa0f3 100644
--- a/src/test/ui/const-generics/defaults/complex-generic-default-expr.min.stderr
+++ b/src/test/ui/const-generics/defaults/complex-generic-default-expr.min.stderr
@@ -1,5 +1,5 @@
 error: generic parameters may not be used in const operations
-  --> $DIR/complex-generic-default-expr.rs:6:47
+  --> $DIR/complex-generic-default-expr.rs:10:47
    |
 LL | struct Foo<const N: usize, const M: usize = { N + 1 }>;
    |                                               ^ cannot perform const operation using `N`
@@ -8,7 +8,7 @@ LL | struct Foo<const N: usize, const M: usize = { N + 1 }>;
    = help: use `#![feature(const_generics)]` and `#![feature(const_evaluatable_checked)]` to allow generic const expressions
 
 error: generic parameters may not be used in const operations
-  --> $DIR/complex-generic-default-expr.rs:9:62
+  --> $DIR/complex-generic-default-expr.rs:13:62
    |
 LL | struct Bar<T, const TYPE_SIZE: usize = { std::mem::size_of::<T>() }>(T);
    |                                                              ^ cannot perform const operation using `T`
diff --git a/src/test/ui/const-generics/defaults/complex-generic-default-expr.rs b/src/test/ui/const-generics/defaults/complex-generic-default-expr.rs
index 1c25fda8d30..a1c04b5e7c3 100644
--- a/src/test/ui/const-generics/defaults/complex-generic-default-expr.rs
+++ b/src/test/ui/const-generics/defaults/complex-generic-default-expr.rs
@@ -1,4 +1,8 @@
-// revisions: full min
+// revisions: min
+// FIXME(const_generics): add the `full` revision,
+// currently causes an ICE as we don't supply substs to
+// anon consts in the parameter listing, as that would
+// cause that anon const to reference itself.
 #![cfg_attr(full, feature(const_generics))]
 #![feature(const_generics_defaults)]
 #![allow(incomplete_features)]
@@ -8,6 +12,6 @@ struct Foo<const N: usize, const M: usize = { N + 1 }>;
 
 struct Bar<T, const TYPE_SIZE: usize = { std::mem::size_of::<T>() }>(T);
 //[min]~^ ERROR generic parameters may not be used in const operations
-//[full]~^^ ERROR the size for values of type `T` cannot be known at compilation time 
+//[full]~^^ ERROR the size for values of type `T` cannot be known at compilation time
 
 fn main() {}
diff --git a/src/test/ui/const-generics/defaults/const-param-as-default-value.rs b/src/test/ui/const-generics/defaults/const-param-as-default-value.rs
new file mode 100644
index 00000000000..d9cab34327e
--- /dev/null
+++ b/src/test/ui/const-generics/defaults/const-param-as-default-value.rs
@@ -0,0 +1,14 @@
+// run-pass
+#![feature(const_generics_defaults)]
+#![allow(incomplete_features)]
+struct Foo<const N: usize, const M: usize = N>([u8; N], [u8; M]);
+
+fn foo<const N: usize>() -> Foo<N> {
+    let x = [0; N];
+    Foo(x, x)
+}
+
+fn main() {
+    let val = foo::<13>();
+    assert_eq!(val.0, val.1);
+}
diff --git a/src/test/ui/const-generics/defaults/const-param-in-ty-defaults.rs b/src/test/ui/const-generics/defaults/const-param-in-ty-defaults.rs
new file mode 100644
index 00000000000..e3d78fe2ee0
--- /dev/null
+++ b/src/test/ui/const-generics/defaults/const-param-in-ty-defaults.rs
@@ -0,0 +1,18 @@
+// run-pass
+#![feature(const_generics_defaults)]
+#![allow(incomplete_features)]
+// FIXME(const_generics_defaults): while we can allow this,
+// we probably won't easily allow this with more complex const operations.
+//
+// So we have to make a conscious decision here when stabilizing a relaxed parameter ordering.
+struct Foo<const N: usize, T = [u8; N]>(T);
+
+impl<const N: usize> Foo<N> {
+    fn new() -> Self {
+        Foo([0; N])
+    }
+}
+
+fn main() {
+    assert_eq!(Foo::new().0, [0; 10]);
+}
diff --git a/src/test/ui/const-generics/defaults/default-param-wf-concrete.rs b/src/test/ui/const-generics/defaults/default-param-wf-concrete.rs
new file mode 100644
index 00000000000..4bb56c6a1c0
--- /dev/null
+++ b/src/test/ui/const-generics/defaults/default-param-wf-concrete.rs
@@ -0,0 +1,5 @@
+#![feature(const_generics_defaults)]
+#![allow(incomplete_features)]
+struct Foo<const N: u8 = { 255 + 1 }>;
+//~^ ERROR evaluation of constant value failed
+fn main() {}
diff --git a/src/test/ui/const-generics/defaults/default-param-wf-concrete.stderr b/src/test/ui/const-generics/defaults/default-param-wf-concrete.stderr
new file mode 100644
index 00000000000..8464ea98bf6
--- /dev/null
+++ b/src/test/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:3:28
+   |
+LL | struct Foo<const N: u8 = { 255 + 1 }>;
+   |                            ^^^^^^^ 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/src/test/ui/const-generics/defaults/pretty-printing-ast.rs b/src/test/ui/const-generics/defaults/pretty-printing-ast.rs
index 12a92a10476..7a57950dfc9 100644
--- a/src/test/ui/const-generics/defaults/pretty-printing-ast.rs
+++ b/src/test/ui/const-generics/defaults/pretty-printing-ast.rs
@@ -11,4 +11,3 @@ trait Foo<const KIND: bool = true> {}
 fn foo<const SIZE: usize = 5>() {}
 
 struct Range<const FROM: usize = 0, const LEN: usize = 0, const TO: usize = FROM>;
-