|
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