| ... | ... | @@ -22986,9 +22986,19 @@ fn validateVarType( |
| 22986 | 22986 | var_ty: Type, |
| 22987 | 22987 | is_extern: bool, |
| 22988 | 22988 | ) CompileError!void { |
| 22989 | | if (try sema.validateRunTimeType(var_ty, is_extern)) return; |
| 22990 | | |
| 22991 | 22989 | const mod = sema.mod; |
| 22990 | if (is_extern and !try sema.validateExternType(var_ty, .other)) { |
| 22991 | const msg = msg: { |
| 22992 | const msg = try sema.errMsg(block, src, "extern variable cannot have type '{}'", .{var_ty.fmt(mod)}); |
| 22993 | errdefer msg.destroy(sema.gpa); |
| 22994 | const src_decl = mod.declPtr(block.src_decl); |
| 22995 | try sema.explainWhyTypeIsNotExtern(msg, src.toSrcLoc(src_decl), var_ty, .other); |
| 22996 | break :msg msg; |
| 22997 | }; |
| 22998 | return sema.failWithOwnedErrorMsg(msg); |
| 22999 | } |
| 23000 | |
| 23001 | if (try sema.validateRunTimeType(var_ty, is_extern)) return; |
| 22992 | 23002 | |
| 22993 | 23003 | const msg = msg: { |
| 22994 | 23004 | const msg = try sema.errMsg(block, src, "variable of type '{}' must be const or comptime", .{var_ty.fmt(mod)}); |
| ... | ... | @@ -23295,10 +23305,10 @@ fn explainWhyTypeIsNotExtern( |
| 23295 | 23305 | .Pointer => try mod.errNoteNonLazy(src_loc, msg, "slices have no guaranteed in-memory representation", .{}), |
| 23296 | 23306 | .Void => try mod.errNoteNonLazy(src_loc, msg, "'void' is a zero bit type; for C 'void' use 'anyopaque'", .{}), |
| 23297 | 23307 | .NoReturn => try mod.errNoteNonLazy(src_loc, msg, "'noreturn' is only allowed as a return type", .{}), |
| 23298 | | .Int => if (ty.intInfo(sema.mod.getTarget()).bits > 128) { |
| 23299 | | try mod.errNoteNonLazy(src_loc, msg, "only integers with less than 128 bits are extern compatible", .{}); |
| 23300 | | } else { |
| 23308 | .Int => if (!std.math.isPowerOfTwo(ty.intInfo(sema.mod.getTarget()).bits)) { |
| 23301 | 23309 | try mod.errNoteNonLazy(src_loc, msg, "only integers with power of two bits are extern compatible", .{}); |
| 23310 | } else { |
| 23311 | try mod.errNoteNonLazy(src_loc, msg, "only integers with 8, 16, 32, 64 and 128 bits are extern compatible", .{}); |
| 23302 | 23312 | }, |
| 23303 | 23313 | .Fn => { |
| 23304 | 23314 | if (position != .other) { |