| ... | ... | @@ -308,7 +308,7 @@ pub const Block = struct { |
| 308 | 308 | prefix ++ "the function returns a comptime-only type '{}'", |
| 309 | 309 | .{rt.return_ty.fmt(sema.mod)}, |
| 310 | 310 | ); |
| 311 | | try sema.explainWhyTypeIsComptime(rt.block, rt.func_src, parent, src_loc, rt.return_ty); |
| 311 | try sema.explainWhyTypeIsComptime(parent, src_loc, rt.return_ty); |
| 312 | 312 | }, |
| 313 | 313 | } |
| 314 | 314 | } |
| ... | ... | @@ -4804,7 +4804,7 @@ fn zirValidateDeref(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErr |
| 4804 | 4804 | errdefer msg.destroy(sema.gpa); |
| 4805 | 4805 | |
| 4806 | 4806 | const src_decl = sema.mod.declPtr(block.src_decl); |
| 4807 | | try sema.explainWhyTypeIsComptime(block, src, msg, src.toSrcLoc(src_decl), elem_ty); |
| 4807 | try sema.explainWhyTypeIsComptime(msg, src.toSrcLoc(src_decl), elem_ty); |
| 4808 | 4808 | break :msg msg; |
| 4809 | 4809 | }; |
| 4810 | 4810 | return sema.failWithOwnedErrorMsg(msg); |
| ... | ... | @@ -5578,7 +5578,7 @@ fn analyzeBlockBody( |
| 5578 | 5578 | try sema.errNote(child_block, runtime_src, msg, "runtime control flow here", .{}); |
| 5579 | 5579 | |
| 5580 | 5580 | const child_src_decl = mod.declPtr(child_block.src_decl); |
| 5581 | | try sema.explainWhyTypeIsComptime(child_block, type_src, msg, type_src.toSrcLoc(child_src_decl), resolved_ty); |
| 5581 | try sema.explainWhyTypeIsComptime(msg, type_src.toSrcLoc(child_src_decl), resolved_ty); |
| 5582 | 5582 | |
| 5583 | 5583 | break :msg msg; |
| 5584 | 5584 | }; |
| ... | ... | @@ -9026,7 +9026,7 @@ fn funcCommon( |
| 9026 | 9026 | "function with comptime-only return type '{}' requires all parameters to be comptime", |
| 9027 | 9027 | .{return_type.fmt(sema.mod)}, |
| 9028 | 9028 | ); |
| 9029 | | try sema.explainWhyTypeIsComptime(block, ret_ty_src, msg, ret_ty_src.toSrcLoc(sema.owner_decl), return_type); |
| 9029 | try sema.explainWhyTypeIsComptime(msg, ret_ty_src.toSrcLoc(sema.owner_decl), return_type); |
| 9030 | 9030 | |
| 9031 | 9031 | const tags = sema.code.instructions.items(.tag); |
| 9032 | 9032 | const data = sema.code.instructions.items(.data); |
| ... | ... | @@ -9248,7 +9248,7 @@ fn analyzeParameter( |
| 9248 | 9248 | errdefer msg.destroy(sema.gpa); |
| 9249 | 9249 | |
| 9250 | 9250 | const src_decl = sema.mod.declPtr(block.src_decl); |
| 9251 | | try sema.explainWhyTypeIsComptime(block, param_src, msg, param_src.toSrcLoc(src_decl), param.ty); |
| 9251 | try sema.explainWhyTypeIsComptime(msg, param_src.toSrcLoc(src_decl), param.ty); |
| 9252 | 9252 | |
| 9253 | 9253 | try sema.addDeclaredHereNote(msg, param.ty); |
| 9254 | 9254 | break :msg msg; |
| ... | ... | @@ -22905,6 +22905,17 @@ fn zirBuiltinExtern( |
| 22905 | 22905 | if (!ty.isPtrAtRuntime()) { |
| 22906 | 22906 | return sema.fail(block, ty_src, "expected (optional) pointer", .{}); |
| 22907 | 22907 | } |
| 22908 | if (!try sema.validateExternType(ty.childType(), .other)) { |
| 22909 | const msg = msg: { |
| 22910 | const mod = sema.mod; |
| 22911 | const msg = try sema.errMsg(block, ty_src, "extern symbol cannot have type '{}'", .{ty.fmt(mod)}); |
| 22912 | errdefer msg.destroy(sema.gpa); |
| 22913 | const src_decl = sema.mod.declPtr(block.src_decl); |
| 22914 | try sema.explainWhyTypeIsNotExtern(msg, ty_src.toSrcLoc(src_decl), ty, .other); |
| 22915 | break :msg msg; |
| 22916 | }; |
| 22917 | return sema.failWithOwnedErrorMsg(msg); |
| 22918 | } |
| 22908 | 22919 | |
| 22909 | 22920 | const options = sema.resolveExternOptions(block, .unneeded, extra.rhs) catch |err| switch (err) { |
| 22910 | 22921 | error.NeededSourceLocation => { |
| ... | ... | @@ -23055,7 +23066,7 @@ fn validateVarType( |
| 23055 | 23066 | errdefer msg.destroy(sema.gpa); |
| 23056 | 23067 | |
| 23057 | 23068 | const src_decl = mod.declPtr(block.src_decl); |
| 23058 | | try sema.explainWhyTypeIsComptime(block, src, msg, src.toSrcLoc(src_decl), var_ty); |
| 23069 | try sema.explainWhyTypeIsComptime(msg, src.toSrcLoc(src_decl), var_ty); |
| 23059 | 23070 | if (var_ty.zigTypeTag() == .ComptimeInt or var_ty.zigTypeTag() == .ComptimeFloat) { |
| 23060 | 23071 | try sema.errNote(block, src, msg, "to modify this variable at runtime, it must be given an explicit fixed-size number type", .{}); |
| 23061 | 23072 | } |
| ... | ... | @@ -23124,8 +23135,6 @@ const TypeSet = std.HashMapUnmanaged(Type, void, Type.HashContext64, std.hash_ma |
| 23124 | 23135 | |
| 23125 | 23136 | fn explainWhyTypeIsComptime( |
| 23126 | 23137 | sema: *Sema, |
| 23127 | | block: *Block, |
| 23128 | | src: LazySrcLoc, |
| 23129 | 23138 | msg: *Module.ErrorMsg, |
| 23130 | 23139 | src_loc: Module.SrcLoc, |
| 23131 | 23140 | ty: Type, |
| ... | ... | @@ -23134,13 +23143,11 @@ fn explainWhyTypeIsComptime( |
| 23134 | 23143 | defer type_set.deinit(sema.gpa); |
| 23135 | 23144 | |
| 23136 | 23145 | try sema.resolveTypeFully(ty); |
| 23137 | | return sema.explainWhyTypeIsComptimeInner(block, src, msg, src_loc, ty, &type_set); |
| 23146 | return sema.explainWhyTypeIsComptimeInner(msg, src_loc, ty, &type_set); |
| 23138 | 23147 | } |
| 23139 | 23148 | |
| 23140 | 23149 | fn explainWhyTypeIsComptimeInner( |
| 23141 | 23150 | sema: *Sema, |
| 23142 | | block: *Block, |
| 23143 | | src: LazySrcLoc, |
| 23144 | 23151 | msg: *Module.ErrorMsg, |
| 23145 | 23152 | src_loc: Module.SrcLoc, |
| 23146 | 23153 | ty: Type, |
| ... | ... | @@ -23181,7 +23188,7 @@ fn explainWhyTypeIsComptimeInner( |
| 23181 | 23188 | }, |
| 23182 | 23189 | |
| 23183 | 23190 | .Array, .Vector => { |
| 23184 | | try sema.explainWhyTypeIsComptimeInner(block, src, msg, src_loc, ty.elemType(), type_set); |
| 23191 | try sema.explainWhyTypeIsComptimeInner(msg, src_loc, ty.elemType(), type_set); |
| 23185 | 23192 | }, |
| 23186 | 23193 | .Pointer => { |
| 23187 | 23194 | const elem_ty = ty.elemType2(); |
| ... | ... | @@ -23199,15 +23206,15 @@ fn explainWhyTypeIsComptimeInner( |
| 23199 | 23206 | } |
| 23200 | 23207 | return; |
| 23201 | 23208 | } |
| 23202 | | try sema.explainWhyTypeIsComptimeInner(block, src, msg, src_loc, ty.elemType(), type_set); |
| 23209 | try sema.explainWhyTypeIsComptimeInner(msg, src_loc, ty.elemType(), type_set); |
| 23203 | 23210 | }, |
| 23204 | 23211 | |
| 23205 | 23212 | .Optional => { |
| 23206 | 23213 | var buf: Type.Payload.ElemType = undefined; |
| 23207 | | try sema.explainWhyTypeIsComptimeInner(block, src, msg, src_loc, ty.optionalChild(&buf), type_set); |
| 23214 | try sema.explainWhyTypeIsComptimeInner(msg, src_loc, ty.optionalChild(&buf), type_set); |
| 23208 | 23215 | }, |
| 23209 | 23216 | .ErrorUnion => { |
| 23210 | | try sema.explainWhyTypeIsComptimeInner(block, src, msg, src_loc, ty.errorUnionPayload(), type_set); |
| 23217 | try sema.explainWhyTypeIsComptimeInner(msg, src_loc, ty.errorUnionPayload(), type_set); |
| 23211 | 23218 | }, |
| 23212 | 23219 | |
| 23213 | 23220 | .Struct => { |
| ... | ... | @@ -23223,7 +23230,7 @@ fn explainWhyTypeIsComptimeInner( |
| 23223 | 23230 | |
| 23224 | 23231 | if (try sema.typeRequiresComptime(field.ty)) { |
| 23225 | 23232 | try mod.errNoteNonLazy(field_src_loc, msg, "struct requires comptime because of this field", .{}); |
| 23226 | | try sema.explainWhyTypeIsComptimeInner(block, src, msg, field_src_loc, field.ty, type_set); |
| 23233 | try sema.explainWhyTypeIsComptimeInner(msg, field_src_loc, field.ty, type_set); |
| 23227 | 23234 | } |
| 23228 | 23235 | } |
| 23229 | 23236 | } |
| ... | ... | @@ -23243,7 +23250,7 @@ fn explainWhyTypeIsComptimeInner( |
| 23243 | 23250 | |
| 23244 | 23251 | if (try sema.typeRequiresComptime(field.ty)) { |
| 23245 | 23252 | try mod.errNoteNonLazy(field_src_loc, msg, "union requires comptime because of this field", .{}); |
| 23246 | | try sema.explainWhyTypeIsComptimeInner(block, src, msg, field_src_loc, field.ty, type_set); |
| 23253 | try sema.explainWhyTypeIsComptimeInner(msg, field_src_loc, field.ty, type_set); |
| 23247 | 23254 | } |
| 23248 | 23255 | } |
| 23249 | 23256 | } |
| ... | ... | @@ -23286,7 +23293,7 @@ fn validateExternType( |
| 23286 | 23293 | .Float, |
| 23287 | 23294 | .AnyFrame, |
| 23288 | 23295 | => return true, |
| 23289 | | .Pointer => return !ty.isSlice(), |
| 23296 | .Pointer => return !(ty.isSlice() or try sema.typeRequiresComptime(ty)), |
| 23290 | 23297 | .Int => switch (ty.intInfo(sema.mod.getTarget()).bits) { |
| 23291 | 23298 | 8, 16, 32, 64, 128 => return true, |
| 23292 | 23299 | else => return false, |
| ... | ... | @@ -23352,7 +23359,15 @@ fn explainWhyTypeIsNotExtern( |
| 23352 | 23359 | .Frame, |
| 23353 | 23360 | => return, |
| 23354 | 23361 | |
| 23355 | | .Pointer => try mod.errNoteNonLazy(src_loc, msg, "slices have no guaranteed in-memory representation", .{}), |
| 23362 | .Pointer => { |
| 23363 | if (ty.isSlice()) { |
| 23364 | try mod.errNoteNonLazy(src_loc, msg, "slices have no guaranteed in-memory representation", .{}); |
| 23365 | } else { |
| 23366 | const pointee_ty = ty.childType(); |
| 23367 | try mod.errNoteNonLazy(src_loc, msg, "pointer to comptime-only type '{}'", .{pointee_ty.fmt(sema.mod)}); |
| 23368 | try sema.explainWhyTypeIsComptime(msg, src_loc, pointee_ty); |
| 23369 | } |
| 23370 | }, |
| 23356 | 23371 | .Void => try mod.errNoteNonLazy(src_loc, msg, "'void' is a zero bit type; for C 'void' use 'anyopaque'", .{}), |
| 23357 | 23372 | .NoReturn => try mod.errNoteNonLazy(src_loc, msg, "'noreturn' is only allowed as a return type", .{}), |
| 23358 | 23373 | .Int => if (!std.math.isPowerOfTwo(ty.intInfo(sema.mod.getTarget()).bits)) { |
| ... | ... | @@ -25041,7 +25056,7 @@ fn validateRuntimeElemAccess( |
| 25041 | 25056 | errdefer msg.destroy(sema.gpa); |
| 25042 | 25057 | |
| 25043 | 25058 | const src_decl = sema.mod.declPtr(block.src_decl); |
| 25044 | | try sema.explainWhyTypeIsComptime(block, elem_index_src, msg, parent_src.toSrcLoc(src_decl), parent_ty); |
| 25059 | try sema.explainWhyTypeIsComptime(msg, parent_src.toSrcLoc(src_decl), parent_ty); |
| 25045 | 25060 | |
| 25046 | 25061 | break :msg msg; |
| 25047 | 25062 | }; |