| ... | @@ -2219,3 +2219,125 @@ test "peer type resolution: pointer attributes are combined correctly" { | ... | @@ -2219,3 +2219,125 @@ test "peer type resolution: pointer attributes are combined correctly" { |
| 2219 | try expectEqualSlices(u8, std.mem.span(@volatileCast(r2)), "bar"); | 2219 | try expectEqualSlices(u8, std.mem.span(@volatileCast(r2)), "bar"); |
| 2220 | try expectEqualSlices(u8, std.mem.span(@volatileCast(r3)), "baz"); | 2220 | try expectEqualSlices(u8, std.mem.span(@volatileCast(r3)), "baz"); |
| 2221 | } | 2221 | } |
| | 2222 | |
| | 2223 | test "cast builtins can wrap result in optional" { |
| | 2224 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| | 2225 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| | 2226 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| | 2227 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| | 2228 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| | 2229 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO |
| | 2230 | |
| | 2231 | const S = struct { |
| | 2232 | const MyEnum = enum(u32) { _ }; |
| | 2233 | fn a() ?MyEnum { |
| | 2234 | return @enumFromInt(123); |
| | 2235 | } |
| | 2236 | fn b() ?u32 { |
| | 2237 | return @intFromFloat(42.50); |
| | 2238 | } |
| | 2239 | fn c() ?*const f32 { |
| | 2240 | const x: u32 = 1; |
| | 2241 | return @ptrCast(&x); |
| | 2242 | } |
| | 2243 | |
| | 2244 | fn doTheTest() !void { |
| | 2245 | const ra = a() orelse return error.ImpossibleError; |
| | 2246 | const rb = b() orelse return error.ImpossibleError; |
| | 2247 | const rc = c() orelse return error.ImpossibleError; |
| | 2248 | |
| | 2249 | comptime assert(@TypeOf(ra) == MyEnum); |
| | 2250 | comptime assert(@TypeOf(rb) == u32); |
| | 2251 | comptime assert(@TypeOf(rc) == *const f32); |
| | 2252 | |
| | 2253 | try expect(@intFromEnum(ra) == 123); |
| | 2254 | try expect(rb == 42); |
| | 2255 | try expect(@as(*const u32, @ptrCast(rc)).* == 1); |
| | 2256 | } |
| | 2257 | }; |
| | 2258 | |
| | 2259 | try S.doTheTest(); |
| | 2260 | try comptime S.doTheTest(); |
| | 2261 | } |
| | 2262 | |
| | 2263 | test "cast builtins can wrap result in error union" { |
| | 2264 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| | 2265 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| | 2266 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| | 2267 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| | 2268 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| | 2269 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO |
| | 2270 | |
| | 2271 | const S = struct { |
| | 2272 | const MyEnum = enum(u32) { _ }; |
| | 2273 | const E = error{ImpossibleError}; |
| | 2274 | fn a() E!MyEnum { |
| | 2275 | return @enumFromInt(123); |
| | 2276 | } |
| | 2277 | fn b() E!u32 { |
| | 2278 | return @intFromFloat(42.50); |
| | 2279 | } |
| | 2280 | fn c() E!*const f32 { |
| | 2281 | const x: u32 = 1; |
| | 2282 | return @ptrCast(&x); |
| | 2283 | } |
| | 2284 | |
| | 2285 | fn doTheTest() !void { |
| | 2286 | const ra = try a(); |
| | 2287 | const rb = try b(); |
| | 2288 | const rc = try c(); |
| | 2289 | |
| | 2290 | comptime assert(@TypeOf(ra) == MyEnum); |
| | 2291 | comptime assert(@TypeOf(rb) == u32); |
| | 2292 | comptime assert(@TypeOf(rc) == *const f32); |
| | 2293 | |
| | 2294 | try expect(@intFromEnum(ra) == 123); |
| | 2295 | try expect(rb == 42); |
| | 2296 | try expect(@as(*const u32, @ptrCast(rc)).* == 1); |
| | 2297 | } |
| | 2298 | }; |
| | 2299 | |
| | 2300 | try S.doTheTest(); |
| | 2301 | try comptime S.doTheTest(); |
| | 2302 | } |
| | 2303 | |
| | 2304 | test "cast builtins can wrap result in error union and optional" { |
| | 2305 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| | 2306 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| | 2307 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| | 2308 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| | 2309 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| | 2310 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO |
| | 2311 | |
| | 2312 | const S = struct { |
| | 2313 | const MyEnum = enum(u32) { _ }; |
| | 2314 | const E = error{ImpossibleError}; |
| | 2315 | fn a() E!?MyEnum { |
| | 2316 | return @enumFromInt(123); |
| | 2317 | } |
| | 2318 | fn b() E!?u32 { |
| | 2319 | return @intFromFloat(42.50); |
| | 2320 | } |
| | 2321 | fn c() E!?*const f32 { |
| | 2322 | const x: u32 = 1; |
| | 2323 | return @ptrCast(&x); |
| | 2324 | } |
| | 2325 | |
| | 2326 | fn doTheTest() !void { |
| | 2327 | const ra = try a() orelse return error.ImpossibleError; |
| | 2328 | const rb = try b() orelse return error.ImpossibleError; |
| | 2329 | const rc = try c() orelse return error.ImpossibleError; |
| | 2330 | |
| | 2331 | comptime assert(@TypeOf(ra) == MyEnum); |
| | 2332 | comptime assert(@TypeOf(rb) == u32); |
| | 2333 | comptime assert(@TypeOf(rc) == *const f32); |
| | 2334 | |
| | 2335 | try expect(@intFromEnum(ra) == 123); |
| | 2336 | try expect(rb == 42); |
| | 2337 | try expect(@as(*const u32, @ptrCast(rc)).* == 1); |
| | 2338 | } |
| | 2339 | }; |
| | 2340 | |
| | 2341 | try S.doTheTest(); |
| | 2342 | try comptime S.doTheTest(); |
| | 2343 | } |