diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2023-08-10 12:02:57 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-08-10 12:02:57 -0700 |
| commit | b820d5df79e714b3a3ad3c09480abdafff058de8 (patch) | |
| tree | b6fcf4066de92f3ab01a56166719757aef2e0a83 /src/Sema.zig | |
| parent | 275e926cf851144ef6a4c64963e47f3b955870cc (diff) | |
| parent | c4848694d20c19b78657ee46f18028737290c829 (diff) | |
| download | zig-b820d5df79e714b3a3ad3c09480abdafff058de8.tar.gz zig-b820d5df79e714b3a3ad3c09480abdafff058de8.zip | |
Merge pull request #16747 from jacobly0/llvm-wo-libllvm
llvm: enable the backend even when not linked to llvm
Diffstat (limited to 'src/Sema.zig')
| -rw-r--r-- | src/Sema.zig | 78 |
1 files changed, 11 insertions, 67 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index e89207cc00..0494b2a09c 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -5068,7 +5068,7 @@ fn zirValidateDeref(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErr if (val.isUndef(mod)) { return sema.fail(block, src, "cannot dereference undefined value", .{}); } - } else if (!(try sema.validateRunTimeType(elem_ty, false))) { + } else if (try sema.typeRequiresComptime(elem_ty)) { const msg = msg: { const msg = try sema.errMsg( block, @@ -5826,8 +5826,7 @@ fn analyzeBlockBody( // TODO add note "missing else causes void value" const type_src = src; // TODO: better source location - const valid_rt = try sema.validateRunTimeType(resolved_ty, false); - if (!valid_rt) { + if (try sema.typeRequiresComptime(resolved_ty)) { const msg = msg: { const msg = try sema.errMsg(child_block, type_src, "value with comptime-only type '{}' depends on runtime control flow", .{resolved_ty.fmt(mod)}); errdefer msg.destroy(sema.gpa); @@ -24684,7 +24683,8 @@ fn validateVarType( return sema.failWithOwnedErrorMsg(msg); } - if (try sema.validateRunTimeType(var_ty, is_extern)) return; + if (is_extern and var_ty.zigTypeTag(mod) == .Opaque) return; + if (!try sema.typeRequiresComptime(var_ty)) return; const msg = msg: { const msg = try sema.errMsg(block, src, "variable of type '{}' must be const or comptime", .{var_ty.fmt(mod)}); @@ -24701,61 +24701,6 @@ fn validateVarType( return sema.failWithOwnedErrorMsg(msg); } -fn validateRunTimeType( - sema: *Sema, - var_ty: Type, - is_extern: bool, -) CompileError!bool { - const mod = sema.mod; - var ty = var_ty; - while (true) switch (ty.zigTypeTag(mod)) { - .Bool, - .Int, - .Float, - .ErrorSet, - .Frame, - .AnyFrame, - .Void, - => return true, - - .Enum => return !(try sema.typeRequiresComptime(ty)), - - .ComptimeFloat, - .ComptimeInt, - .EnumLiteral, - .NoReturn, - .Type, - .Undefined, - .Null, - .Fn, - => return false, - - .Pointer => { - const elem_ty = ty.childType(mod); - switch (elem_ty.zigTypeTag(mod)) { - .Opaque => return true, - .Fn => return elem_ty.isFnOrHasRuntimeBits(mod), - else => ty = elem_ty, - } - }, - .Opaque => return is_extern, - - .Optional => { - const child_ty = ty.optionalChild(mod); - return sema.validateRunTimeType(child_ty, is_extern); - }, - .Array, .Vector => ty = ty.childType(mod), - - .ErrorUnion => ty = ty.errorUnionPayload(mod), - - .Struct, .Union => { - const resolved_ty = try sema.resolveTypeFields(ty); - const needs_comptime = try sema.typeRequiresComptime(resolved_ty); - return !needs_comptime; - }, - }; -} - const TypeSet = std.AutoHashMapUnmanaged(InternPool.Index, void); fn explainWhyTypeIsComptime( @@ -26754,8 +26699,7 @@ fn validateRuntimeElemAccess( parent_src: LazySrcLoc, ) CompileError!void { const mod = sema.mod; - const valid_rt = try sema.validateRunTimeType(elem_ty, false); - if (!valid_rt) { + if (try sema.typeRequiresComptime(elem_ty)) { const msg = msg: { const msg = try sema.errMsg( block, @@ -36235,10 +36179,10 @@ pub fn typeRequiresComptime(sema: *Sema, ty: Type) CompileError!bool { .int_type => return false, .ptr_type => |ptr_type| { const child_ty = ptr_type.child.toType(); - if (child_ty.zigTypeTag(mod) == .Fn) { - return mod.typeToFunc(child_ty).?.is_generic; - } else { - return sema.typeRequiresComptime(child_ty); + switch (child_ty.zigTypeTag(mod)) { + .Fn => return mod.typeToFunc(child_ty).?.is_generic, + .Opaque => return false, + else => return sema.typeRequiresComptime(child_ty), } }, .anyframe_type => |child| { @@ -36275,7 +36219,6 @@ pub fn typeRequiresComptime(sema: *Sema, ty: Type) CompileError!bool { .c_longlong, .c_ulonglong, .c_longdouble, - .anyopaque, .bool, .void, .anyerror, @@ -36294,6 +36237,7 @@ pub fn typeRequiresComptime(sema: *Sema, ty: Type) CompileError!bool { .adhoc_inferred_error_set, => false, + .anyopaque, .type, .comptime_int, .comptime_float, @@ -36361,7 +36305,7 @@ pub fn typeRequiresComptime(sema: *Sema, ty: Type) CompileError!bool { } }, - .opaque_type => false, + .opaque_type => true, .enum_type => |enum_type| try sema.typeRequiresComptime(enum_type.tag_ty.toType()), // values, not types |
