| ... | ... | @@ -2200,39 +2200,77 @@ test "peer type resolution: pointer attributes are combined correctly" { |
| 2200 | 2200 | var buf_a align(4) = "foo".*; |
| 2201 | 2201 | var buf_b align(4) = "bar".*; |
| 2202 | 2202 | var buf_c align(4) = "baz".*; |
| 2203 | var buf_d align(4) = "qux".*; |
| 2203 | 2204 | |
| 2204 | 2205 | const a: [*:0]align(4) const u8 = &buf_a; |
| 2205 | 2206 | const b: *align(2) volatile [3:0]u8 = &buf_b; |
| 2206 | 2207 | const c: [*:0]align(4) u8 = &buf_c; |
| 2207 | | |
| 2208 | | comptime assert(@TypeOf(a, b, c) == [*:0]align(2) const volatile u8); |
| 2209 | | comptime assert(@TypeOf(a, c, b) == [*:0]align(2) const volatile u8); |
| 2210 | | comptime assert(@TypeOf(b, a, c) == [*:0]align(2) const volatile u8); |
| 2211 | | comptime assert(@TypeOf(b, c, a) == [*:0]align(2) const volatile u8); |
| 2212 | | comptime assert(@TypeOf(c, a, b) == [*:0]align(2) const volatile u8); |
| 2213 | | comptime assert(@TypeOf(c, b, a) == [*:0]align(2) const volatile u8); |
| 2208 | const d: [*:0]allowzero align(4) u8 = &buf_d; |
| 2209 | |
| 2210 | comptime assert(@TypeOf(a, b, c, d) == [*:0]allowzero align(2) const volatile u8); |
| 2211 | comptime assert(@TypeOf(a, b, d, c) == [*:0]allowzero align(2) const volatile u8); |
| 2212 | comptime assert(@TypeOf(a, c, b, d) == [*:0]allowzero align(2) const volatile u8); |
| 2213 | comptime assert(@TypeOf(a, c, d, b) == [*:0]allowzero align(2) const volatile u8); |
| 2214 | comptime assert(@TypeOf(a, d, b, c) == [*:0]allowzero align(2) const volatile u8); |
| 2215 | comptime assert(@TypeOf(a, d, c, b) == [*:0]allowzero align(2) const volatile u8); |
| 2216 | |
| 2217 | comptime assert(@TypeOf(b, a, c, d) == [*:0]allowzero align(2) const volatile u8); |
| 2218 | comptime assert(@TypeOf(b, a, d, c) == [*:0]allowzero align(2) const volatile u8); |
| 2219 | comptime assert(@TypeOf(b, c, a, d) == [*:0]allowzero align(2) const volatile u8); |
| 2220 | comptime assert(@TypeOf(b, c, d, a) == [*:0]allowzero align(2) const volatile u8); |
| 2221 | comptime assert(@TypeOf(b, d, c, a) == [*:0]allowzero align(2) const volatile u8); |
| 2222 | comptime assert(@TypeOf(b, d, a, c) == [*:0]allowzero align(2) const volatile u8); |
| 2223 | |
| 2224 | comptime assert(@TypeOf(c, a, b, d) == [*:0]allowzero align(2) const volatile u8); |
| 2225 | comptime assert(@TypeOf(c, a, d, b) == [*:0]allowzero align(2) const volatile u8); |
| 2226 | comptime assert(@TypeOf(c, b, a, d) == [*:0]allowzero align(2) const volatile u8); |
| 2227 | comptime assert(@TypeOf(c, b, d, a) == [*:0]allowzero align(2) const volatile u8); |
| 2228 | comptime assert(@TypeOf(c, d, b, a) == [*:0]allowzero align(2) const volatile u8); |
| 2229 | comptime assert(@TypeOf(c, d, a, b) == [*:0]allowzero align(2) const volatile u8); |
| 2230 | |
| 2231 | comptime assert(@TypeOf(d, a, b, c) == [*:0]allowzero align(2) const volatile u8); |
| 2232 | comptime assert(@TypeOf(d, a, c, b) == [*:0]allowzero align(2) const volatile u8); |
| 2233 | comptime assert(@TypeOf(d, b, a, c) == [*:0]allowzero align(2) const volatile u8); |
| 2234 | comptime assert(@TypeOf(d, b, c, a) == [*:0]allowzero align(2) const volatile u8); |
| 2235 | comptime assert(@TypeOf(d, c, b, a) == [*:0]allowzero align(2) const volatile u8); |
| 2236 | comptime assert(@TypeOf(d, c, a, b) == [*:0]allowzero align(2) const volatile u8); |
| 2214 | 2237 | |
| 2215 | 2238 | var x: u8 = 0; |
| 2216 | 2239 | _ = &x; |
| 2217 | 2240 | const r1 = switch (x) { |
| 2218 | 2241 | 0 => a, |
| 2219 | 2242 | 1 => b, |
| 2220 | | else => c, |
| 2243 | 2 => c, |
| 2244 | else => d, |
| 2221 | 2245 | }; |
| 2222 | 2246 | const r2 = switch (x) { |
| 2223 | 2247 | 0 => b, |
| 2224 | 2248 | 1 => a, |
| 2225 | | else => c, |
| 2249 | 2 => c, |
| 2250 | else => d, |
| 2226 | 2251 | }; |
| 2227 | 2252 | const r3 = switch (x) { |
| 2228 | 2253 | 0 => c, |
| 2229 | 2254 | 1 => a, |
| 2230 | | else => b, |
| 2255 | 2 => b, |
| 2256 | else => d, |
| 2257 | }; |
| 2258 | const r4 = switch (x) { |
| 2259 | 0 => d, |
| 2260 | 1 => a, |
| 2261 | 2 => b, |
| 2262 | else => c, |
| 2231 | 2263 | }; |
| 2232 | 2264 | |
| 2233 | | try expectEqualSlices(u8, std.mem.span(@volatileCast(r1)), "foo"); |
| 2234 | | try expectEqualSlices(u8, std.mem.span(@volatileCast(r2)), "bar"); |
| 2235 | | try expectEqualSlices(u8, std.mem.span(@volatileCast(r3)), "baz"); |
| 2265 | const NonAllowZero = comptime blk: { |
| 2266 | var ti = @typeInfo(@TypeOf(r1, r2, r3, r4)); |
| 2267 | ti.pointer.is_allowzero = false; |
| 2268 | break :blk @Type(ti); |
| 2269 | }; |
| 2270 | try expectEqualSlices(u8, std.mem.span(@volatileCast(@as(NonAllowZero, @ptrCast(r1)))), "foo"); |
| 2271 | try expectEqualSlices(u8, std.mem.span(@volatileCast(@as(NonAllowZero, @ptrCast(r2)))), "bar"); |
| 2272 | try expectEqualSlices(u8, std.mem.span(@volatileCast(@as(NonAllowZero, @ptrCast(r3)))), "baz"); |
| 2273 | try expectEqualSlices(u8, std.mem.span(@volatileCast(@as(NonAllowZero, @ptrCast(r4)))), "qux"); |
| 2236 | 2274 | } |
| 2237 | 2275 | |
| 2238 | 2276 | test "peer type resolution: arrays of compatible types" { |