|
15 | 15 | // padding and overall computed sizes can be quite different. |
16 | 16 |
|
17 | 17 | #![feature(start)] |
| 18 | +#![feature(rustc_attrs)] |
18 | 19 | #![allow(dead_code)] |
19 | 20 |
|
20 | 21 | use std::num::NonZeroU32; |
21 | 22 |
|
22 | 23 | pub enum MyOption<T> { None, Some(T) } |
23 | 24 |
|
| 25 | +#[rustc_layout_scalar_valid_range_start(0)] |
| 26 | +#[rustc_layout_scalar_valid_range_end(0xFF_FF_FF_FE)] |
| 27 | +pub struct MyNotNegativeOne { |
| 28 | + _i: i32, |
| 29 | +} |
| 30 | + |
24 | 31 | impl<T> Default for MyOption<T> { |
25 | 32 | fn default() -> Self { MyOption::None } |
26 | 33 | } |
@@ -77,17 +84,18 @@ fn start(_: isize, _: *const *const u8) -> isize { |
77 | 84 | let _a: MyOption<bool> = Default::default(); |
78 | 85 | let _b: MyOption<char> = Default::default(); |
79 | 86 | let _c: MyOption<std::cmp::Ordering> = Default::default(); |
80 | | - let _b: MyOption<MyOption<u8>> = Default::default(); |
| 87 | + let _d: MyOption<MyOption<u8>> = Default::default(); |
81 | 88 | let _e: Enum4<(), char, (), ()> = Enum4::One(()); |
82 | 89 | let _f: Enum4<(), (), bool, ()> = Enum4::One(()); |
83 | 90 | let _g: Enum4<(), (), (), MyOption<u8>> = Enum4::One(()); |
| 91 | + let _h: MyOption<MyNotNegativeOne> = Default::default(); |
84 | 92 |
|
85 | 93 | // Unions do not currently participate in niche filling. |
86 | | - let _h: MyOption<Union2<NonZeroU32, u32>> = Default::default(); |
| 94 | + let _i: MyOption<Union2<NonZeroU32, u32>> = Default::default(); |
87 | 95 |
|
88 | 96 | // ...even when theoretically possible. |
89 | | - let _i: MyOption<Union1<NonZeroU32>> = Default::default(); |
90 | | - let _j: MyOption<Union2<NonZeroU32, NonZeroU32>> = Default::default(); |
| 97 | + let _j: MyOption<Union1<NonZeroU32>> = Default::default(); |
| 98 | + let _k: MyOption<Union2<NonZeroU32, NonZeroU32>> = Default::default(); |
91 | 99 |
|
92 | 100 | 0 |
93 | 101 | } |
0 commit comments