| ... | ... | @@ -2219,3 +2219,125 @@ test "peer type resolution: pointer attributes are combined correctly" { |
| 2219 | 2219 | try expectEqualSlices(u8, std.mem.span(@volatileCast(r2)), "bar"); |
| 2220 | 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 | } |