From dc0db358abe19481e475e10c32149b53370f1a1c Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Thu, 30 May 2024 05:57:31 +0200 Subject: Merging upstream version 1.72.1+dfsg1. Signed-off-by: Daniel Baumann --- .../ui/enum-discriminant/discriminant-ill-typed.rs | 114 +++++++++++++++++++++ .../discriminant-ill-typed.stderr | 91 ++++++++++++++++ .../enum-discriminant/discriminant-overflow-2.rs | 80 +++++++++++++++ .../discriminant-overflow-2.stderr | 67 ++++++++++++ .../ui/enum-discriminant/discriminant-overflow.rs | 99 ++++++++++++++++++ .../enum-discriminant/discriminant-overflow.stderr | 67 ++++++++++++ tests/ui/enum-discriminant/issue-50689.rs | 9 ++ 7 files changed, 527 insertions(+) create mode 100644 tests/ui/enum-discriminant/discriminant-ill-typed.rs create mode 100644 tests/ui/enum-discriminant/discriminant-ill-typed.stderr create mode 100644 tests/ui/enum-discriminant/discriminant-overflow-2.rs create mode 100644 tests/ui/enum-discriminant/discriminant-overflow-2.stderr create mode 100644 tests/ui/enum-discriminant/discriminant-overflow.rs create mode 100644 tests/ui/enum-discriminant/discriminant-overflow.stderr create mode 100644 tests/ui/enum-discriminant/issue-50689.rs (limited to 'tests/ui/enum-discriminant') 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); +} -- cgit v1.2.3