summaryrefslogtreecommitdiffstats
path: root/tests/ui/enum-discriminant
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:57:31 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:57:31 +0000
commitdc0db358abe19481e475e10c32149b53370f1a1c (patch)
treeab8ce99c4b255ce46f99ef402c27916055b899ee /tests/ui/enum-discriminant
parentReleasing progress-linux version 1.71.1+dfsg1-2~progress7.99u1. (diff)
downloadrustc-dc0db358abe19481e475e10c32149b53370f1a1c.tar.xz
rustc-dc0db358abe19481e475e10c32149b53370f1a1c.zip
Merging upstream version 1.72.1+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/ui/enum-discriminant')
-rw-r--r--tests/ui/enum-discriminant/discriminant-ill-typed.rs114
-rw-r--r--tests/ui/enum-discriminant/discriminant-ill-typed.stderr91
-rw-r--r--tests/ui/enum-discriminant/discriminant-overflow-2.rs80
-rw-r--r--tests/ui/enum-discriminant/discriminant-overflow-2.stderr67
-rw-r--r--tests/ui/enum-discriminant/discriminant-overflow.rs99
-rw-r--r--tests/ui/enum-discriminant/discriminant-overflow.stderr67
-rw-r--r--tests/ui/enum-discriminant/issue-50689.rs9
7 files changed, 527 insertions, 0 deletions
diff --git a/tests/ui/enum-discriminant/discriminant-ill-typed.rs b/tests/ui/enum-discriminant/discriminant-ill-typed.rs
new file mode 100644
index 000000000..3cf0ea0e6
--- /dev/null
+++ b/tests/ui/enum-discriminant/discriminant-ill-typed.rs
@@ -0,0 +1,114 @@
+// When explicit discriminant value has
+// a type that does not match the representation
+// type, rustc should fail gracefully.
+
+// See also run-pass/discrim-explicit-23030.rs where the input types
+// are correct.
+
+#![allow(dead_code, unused_variables, unused_imports)]
+
+fn f_i8() {
+ #[repr(i8)]
+ enum A {
+ Ok = i8::MAX - 1,
+ Ok2,
+ OhNo = 0_u8,
+ //~^ ERROR mismatched types
+ //~| expected `i8`, found `u8`
+ }
+
+ let x = A::Ok;
+}
+
+fn f_u8() {
+ #[repr(u8)]
+ enum A {
+ Ok = u8::MAX - 1,
+ Ok2,
+ OhNo = 0_i8,
+ //~^ ERROR mismatched types
+ //~| expected `u8`, found `i8`
+ }
+
+ let x = A::Ok;
+}
+
+fn f_i16() {
+ #[repr(i16)]
+ enum A {
+ Ok = i16::MAX - 1,
+ Ok2,
+ OhNo = 0_u16,
+ //~^ ERROR mismatched types
+ //~| expected `i16`, found `u16`
+ }
+
+ let x = A::Ok;
+}
+
+fn f_u16() {
+ #[repr(u16)]
+ enum A {
+ Ok = u16::MAX - 1,
+ Ok2,
+ OhNo = 0_i16,
+ //~^ ERROR mismatched types
+ //~| expected `u16`, found `i16`
+ }
+
+ let x = A::Ok;
+}
+
+fn f_i32() {
+ #[repr(i32)]
+ enum A {
+ Ok = i32::MAX - 1,
+ Ok2,
+ OhNo = 0_u32,
+ //~^ ERROR mismatched types
+ //~| expected `i32`, found `u32`
+ }
+
+ let x = A::Ok;
+}
+
+fn f_u32() {
+ #[repr(u32)]
+ enum A {
+ Ok = u32::MAX - 1,
+ Ok2,
+ OhNo = 0_i32,
+ //~^ ERROR mismatched types
+ //~| expected `u32`, found `i32`
+ }
+
+ let x = A::Ok;
+}
+
+fn f_i64() {
+ #[repr(i64)]
+ enum A {
+ Ok = i64::MAX - 1,
+ Ok2,
+ OhNo = 0_u64,
+ //~^ ERROR mismatched types
+ //~| expected `i64`, found `u64`
+ }
+
+ let x = A::Ok;
+}
+
+fn f_u64() {
+ #[repr(u64)]
+ enum A {
+ Ok = u64::MAX - 1,
+ Ok2,
+ OhNo = 0_i64,
+ //~^ ERROR mismatched types
+ //~| expected `u64`, found `i64`
+ }
+
+ let x = A::Ok;
+}
+
+fn main() { }
diff --git a/tests/ui/enum-discriminant/discriminant-ill-typed.stderr b/tests/ui/enum-discriminant/discriminant-ill-typed.stderr
new file mode 100644
index 000000000..275714528
--- /dev/null
+++ b/tests/ui/enum-discriminant/discriminant-ill-typed.stderr
@@ -0,0 +1,91 @@
+error[E0308]: mismatched types
+ --> $DIR/discriminant-ill-typed.rs:15:16
+ |
+LL | OhNo = 0_u8,
+ | ^^^^ expected `i8`, found `u8`
+ |
+help: change the type of the numeric literal from `u8` to `i8`
+ |
+LL | OhNo = 0_i8,
+ | ~~
+
+error[E0308]: mismatched types
+ --> $DIR/discriminant-ill-typed.rs:28:16
+ |
+LL | OhNo = 0_i8,
+ | ^^^^ expected `u8`, found `i8`
+ |
+help: change the type of the numeric literal from `i8` to `u8`
+ |
+LL | OhNo = 0_u8,
+ | ~~
+
+error[E0308]: mismatched types
+ --> $DIR/discriminant-ill-typed.rs:41:16
+ |
+LL | OhNo = 0_u16,
+ | ^^^^^ expected `i16`, found `u16`
+ |
+help: change the type of the numeric literal from `u16` to `i16`
+ |
+LL | OhNo = 0_i16,
+ | ~~~
+
+error[E0308]: mismatched types
+ --> $DIR/discriminant-ill-typed.rs:54:16
+ |
+LL | OhNo = 0_i16,
+ | ^^^^^ expected `u16`, found `i16`
+ |
+help: change the type of the numeric literal from `i16` to `u16`
+ |
+LL | OhNo = 0_u16,
+ | ~~~
+
+error[E0308]: mismatched types
+ --> $DIR/discriminant-ill-typed.rs:67:16
+ |
+LL | OhNo = 0_u32,
+ | ^^^^^ expected `i32`, found `u32`
+ |
+help: change the type of the numeric literal from `u32` to `i32`
+ |
+LL | OhNo = 0_i32,
+ | ~~~
+
+error[E0308]: mismatched types
+ --> $DIR/discriminant-ill-typed.rs:80:16
+ |
+LL | OhNo = 0_i32,
+ | ^^^^^ expected `u32`, found `i32`
+ |
+help: change the type of the numeric literal from `i32` to `u32`
+ |
+LL | OhNo = 0_u32,
+ | ~~~
+
+error[E0308]: mismatched types
+ --> $DIR/discriminant-ill-typed.rs:93:16
+ |
+LL | OhNo = 0_u64,
+ | ^^^^^ expected `i64`, found `u64`
+ |
+help: change the type of the numeric literal from `u64` to `i64`
+ |
+LL | OhNo = 0_i64,
+ | ~~~
+
+error[E0308]: mismatched types
+ --> $DIR/discriminant-ill-typed.rs:106:16
+ |
+LL | OhNo = 0_i64,
+ | ^^^^^ expected `u64`, found `i64`
+ |
+help: change the type of the numeric literal from `i64` to `u64`
+ |
+LL | OhNo = 0_u64,
+ | ~~~
+
+error: aborting due to 8 previous errors
+
+For more information about this error, try `rustc --explain E0308`.
diff --git a/tests/ui/enum-discriminant/discriminant-overflow-2.rs b/tests/ui/enum-discriminant/discriminant-overflow-2.rs
new file mode 100644
index 000000000..ca24317c5
--- /dev/null
+++ b/tests/ui/enum-discriminant/discriminant-overflow-2.rs
@@ -0,0 +1,80 @@
+// Issue 23030: Detect overflowing discriminant
+//
+// Check that we detect the overflow even if enum is not used.
+
+// See also run-pass/discrim-explicit-23030.rs where the suggested
+// workaround is tested.
+
+fn f_i8() {
+ #[repr(i8)]
+ enum A {
+ Ok = i8::MAX - 1,
+ Ok2,
+ OhNo, //~ ERROR enum discriminant overflowed [E0370]
+ }
+}
+
+fn f_u8() {
+ #[repr(u8)]
+ enum A {
+ Ok = u8::MAX - 1,
+ Ok2,
+ OhNo, //~ ERROR enum discriminant overflowed [E0370]
+ }
+}
+
+fn f_i16() {
+ #[repr(i16)]
+ enum A {
+ Ok = i16::MAX - 1,
+ Ok2,
+ OhNo, //~ ERROR enum discriminant overflowed [E0370]
+ }
+}
+
+fn f_u16() {
+ #[repr(u16)]
+ enum A {
+ Ok = u16::MAX - 1,
+ Ok2,
+ OhNo, //~ ERROR enum discriminant overflowed [E0370]
+ }
+}
+
+fn f_i32() {
+ #[repr(i32)]
+ enum A {
+ Ok = i32::MAX - 1,
+ Ok2,
+ OhNo, //~ ERROR enum discriminant overflowed [E0370]
+ }
+}
+
+fn f_u32() {
+ #[repr(u32)]
+ enum A {
+ Ok = u32::MAX - 1,
+ Ok2,
+ OhNo, //~ ERROR enum discriminant overflowed [E0370]
+ }
+}
+
+fn f_i64() {
+ #[repr(i64)]
+ enum A {
+ Ok = i64::MAX - 1,
+ Ok2,
+ OhNo, //~ ERROR enum discriminant overflowed [E0370]
+ }
+}
+
+fn f_u64() {
+ #[repr(u64)]
+ enum A {
+ Ok = u64::MAX - 1,
+ Ok2,
+ OhNo, //~ ERROR enum discriminant overflowed [E0370]
+ }
+}
+
+fn main() { }
diff --git a/tests/ui/enum-discriminant/discriminant-overflow-2.stderr b/tests/ui/enum-discriminant/discriminant-overflow-2.stderr
new file mode 100644
index 000000000..5f7387c59
--- /dev/null
+++ b/tests/ui/enum-discriminant/discriminant-overflow-2.stderr
@@ -0,0 +1,67 @@
+error[E0370]: enum discriminant overflowed
+ --> $DIR/discriminant-overflow-2.rs:13:9
+ |
+LL | OhNo,
+ | ^^^^ overflowed on value after 127
+ |
+ = note: explicitly set `OhNo = -128` if that is desired outcome
+
+error[E0370]: enum discriminant overflowed
+ --> $DIR/discriminant-overflow-2.rs:22:9
+ |
+LL | OhNo,
+ | ^^^^ overflowed on value after 255
+ |
+ = note: explicitly set `OhNo = 0` if that is desired outcome
+
+error[E0370]: enum discriminant overflowed
+ --> $DIR/discriminant-overflow-2.rs:31:9
+ |
+LL | OhNo,
+ | ^^^^ overflowed on value after 32767
+ |
+ = note: explicitly set `OhNo = -32768` if that is desired outcome
+
+error[E0370]: enum discriminant overflowed
+ --> $DIR/discriminant-overflow-2.rs:40:9
+ |
+LL | OhNo,
+ | ^^^^ overflowed on value after 65535
+ |
+ = note: explicitly set `OhNo = 0` if that is desired outcome
+
+error[E0370]: enum discriminant overflowed
+ --> $DIR/discriminant-overflow-2.rs:49:9
+ |
+LL | OhNo,
+ | ^^^^ overflowed on value after 2147483647
+ |
+ = note: explicitly set `OhNo = -2147483648` if that is desired outcome
+
+error[E0370]: enum discriminant overflowed
+ --> $DIR/discriminant-overflow-2.rs:58:9
+ |
+LL | OhNo,
+ | ^^^^ overflowed on value after 4294967295
+ |
+ = note: explicitly set `OhNo = 0` if that is desired outcome
+
+error[E0370]: enum discriminant overflowed
+ --> $DIR/discriminant-overflow-2.rs:67:9
+ |
+LL | OhNo,
+ | ^^^^ overflowed on value after 9223372036854775807
+ |
+ = note: explicitly set `OhNo = -9223372036854775808` if that is desired outcome
+
+error[E0370]: enum discriminant overflowed
+ --> $DIR/discriminant-overflow-2.rs:76:9
+ |
+LL | OhNo,
+ | ^^^^ overflowed on value after 18446744073709551615
+ |
+ = note: explicitly set `OhNo = 0` if that is desired outcome
+
+error: aborting due to 8 previous errors
+
+For more information about this error, try `rustc --explain E0370`.
diff --git a/tests/ui/enum-discriminant/discriminant-overflow.rs b/tests/ui/enum-discriminant/discriminant-overflow.rs
new file mode 100644
index 000000000..774ced93c
--- /dev/null
+++ b/tests/ui/enum-discriminant/discriminant-overflow.rs
@@ -0,0 +1,99 @@
+// Issue 23030: Detect overflowing discriminant
+
+// See also run-pass/discrim-explicit-23030.rs where the suggested
+// workaround is tested.
+
+fn f_i8() {
+ #[repr(i8)]
+ enum A {
+ Ok = i8::MAX - 1,
+ Ok2,
+ OhNo, //~ ERROR enum discriminant overflowed [E0370]
+ }
+
+ let x = A::Ok;
+}
+
+fn f_u8() {
+ #[repr(u8)]
+ enum A {
+ Ok = u8::MAX - 1,
+ Ok2,
+ OhNo, //~ ERROR enum discriminant overflowed [E0370]
+ }
+
+ let x = A::Ok;
+}
+
+fn f_i16() {
+ #[repr(i16)]
+ enum A {
+ Ok = i16::MAX - 1,
+ Ok2,
+ OhNo, //~ ERROR enum discriminant overflowed [E0370]
+ }
+
+ let x = A::Ok;
+}
+
+fn f_u16() {
+ #[repr(u16)]
+ enum A {
+ Ok = u16::MAX - 1,
+ Ok2,
+ OhNo, //~ ERROR enum discriminant overflowed [E0370]
+ //~| overflowed on value after 65535
+ }
+
+ let x = A::Ok;
+}
+
+fn f_i32() {
+ #[repr(i32)]
+ enum A {
+ Ok = i32::MAX - 1,
+ Ok2,
+ OhNo, //~ ERROR enum discriminant overflowed [E0370]
+ //~| overflowed on value after 2147483647
+ }
+
+ let x = A::Ok;
+}
+
+fn f_u32() {
+ #[repr(u32)]
+ enum A {
+ Ok = u32::MAX - 1,
+ Ok2,
+ OhNo, //~ ERROR enum discriminant overflowed [E0370]
+ //~| overflowed on value after 4294967295
+ }
+
+ let x = A::Ok;
+}
+
+fn f_i64() {
+ #[repr(i64)]
+ enum A {
+ Ok = i64::MAX - 1,
+ Ok2,
+ OhNo, //~ ERROR enum discriminant overflowed [E0370]
+ //~| overflowed on value after 9223372036854775807
+ }
+
+ let x = A::Ok;
+}
+
+fn f_u64() {
+ #[repr(u64)]
+ enum A {
+ Ok = u64::MAX - 1,
+ Ok2,
+ OhNo, //~ ERROR enum discriminant overflowed [E0370]
+ //~| overflowed on value after 18446744073709551615
+ }
+
+ let x = A::Ok;
+}
+
+fn main() { }
diff --git a/tests/ui/enum-discriminant/discriminant-overflow.stderr b/tests/ui/enum-discriminant/discriminant-overflow.stderr
new file mode 100644
index 000000000..2ecc1839f
--- /dev/null
+++ b/tests/ui/enum-discriminant/discriminant-overflow.stderr
@@ -0,0 +1,67 @@
+error[E0370]: enum discriminant overflowed
+ --> $DIR/discriminant-overflow.rs:11:9
+ |
+LL | OhNo,
+ | ^^^^ overflowed on value after 127
+ |
+ = note: explicitly set `OhNo = -128` if that is desired outcome
+
+error[E0370]: enum discriminant overflowed
+ --> $DIR/discriminant-overflow.rs:22:9
+ |
+LL | OhNo,
+ | ^^^^ overflowed on value after 255
+ |
+ = note: explicitly set `OhNo = 0` if that is desired outcome
+
+error[E0370]: enum discriminant overflowed
+ --> $DIR/discriminant-overflow.rs:33:9
+ |
+LL | OhNo,
+ | ^^^^ overflowed on value after 32767
+ |
+ = note: explicitly set `OhNo = -32768` if that is desired outcome
+
+error[E0370]: enum discriminant overflowed
+ --> $DIR/discriminant-overflow.rs:44:9
+ |
+LL | OhNo,
+ | ^^^^ overflowed on value after 65535
+ |
+ = note: explicitly set `OhNo = 0` if that is desired outcome
+
+error[E0370]: enum discriminant overflowed
+ --> $DIR/discriminant-overflow.rs:56:9
+ |
+LL | OhNo,
+ | ^^^^ overflowed on value after 2147483647
+ |
+ = note: explicitly set `OhNo = -2147483648` if that is desired outcome
+
+error[E0370]: enum discriminant overflowed
+ --> $DIR/discriminant-overflow.rs:68:9
+ |
+LL | OhNo,
+ | ^^^^ overflowed on value after 4294967295
+ |
+ = note: explicitly set `OhNo = 0` if that is desired outcome
+
+error[E0370]: enum discriminant overflowed
+ --> $DIR/discriminant-overflow.rs:80:9
+ |
+LL | OhNo,
+ | ^^^^ overflowed on value after 9223372036854775807
+ |
+ = note: explicitly set `OhNo = -9223372036854775808` if that is desired outcome
+
+error[E0370]: enum discriminant overflowed
+ --> $DIR/discriminant-overflow.rs:92:9
+ |
+LL | OhNo,
+ | ^^^^ overflowed on value after 18446744073709551615
+ |
+ = note: explicitly set `OhNo = 0` if that is desired outcome
+
+error: aborting due to 8 previous errors
+
+For more information about this error, try `rustc --explain E0370`.
diff --git a/tests/ui/enum-discriminant/issue-50689.rs b/tests/ui/enum-discriminant/issue-50689.rs
new file mode 100644
index 000000000..b49f29500
--- /dev/null
+++ b/tests/ui/enum-discriminant/issue-50689.rs
@@ -0,0 +1,9 @@
+// run-pass
+#![allow(unused_variables)]
+enum Foo {
+ Bar = (|x: i32| { }, 42).1,
+}
+
+fn main() {
+ assert_eq!(Foo::Bar as usize, 42);
+}