| ... | @@ -22986,9 +22986,19 @@ fn validateVarType( | ... | @@ -22986,9 +22986,19 @@ fn validateVarType( |
| 22986 | var_ty: Type, | 22986 | var_ty: Type, |
| 22987 | is_extern: bool, | 22987 | is_extern: bool, |
| 22988 | ) CompileError!void { | 22988 | ) CompileError!void { |
| 22989 | if (try sema.validateRunTimeType(var_ty, is_extern)) return; | | |
| 22990 | | | |
| 22991 | const mod = sema.mod; | 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 | const msg = msg: { | 23003 | const msg = msg: { |
| 22994 | const msg = try sema.errMsg(block, src, "variable of type '{}' must be const or comptime", .{var_ty.fmt(mod)}); | 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,10 +23305,10 @@ fn explainWhyTypeIsNotExtern( |
| 23295 | .Pointer => try mod.errNoteNonLazy(src_loc, msg, "slices have no guaranteed in-memory representation", .{}), | 23305 | .Pointer => try mod.errNoteNonLazy(src_loc, msg, "slices have no guaranteed in-memory representation", .{}), |
| 23296 | .Void => try mod.errNoteNonLazy(src_loc, msg, "'void' is a zero bit type; for C 'void' use 'anyopaque'", .{}), | 23306 | .Void => try mod.errNoteNonLazy(src_loc, msg, "'void' is a zero bit type; for C 'void' use 'anyopaque'", .{}), |
| 23297 | .NoReturn => try mod.errNoteNonLazy(src_loc, msg, "'noreturn' is only allowed as a return type", .{}), | 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) { | 23308 | .Int => if (!std.math.isPowerOfTwo(ty.intInfo(sema.mod.getTarget()).bits)) { |
| 23299 | try mod.errNoteNonLazy(src_loc, msg, "only integers with less than 128 bits are extern compatible", .{}); | | |
| 23300 | } else { | | |
| 23301 | try mod.errNoteNonLazy(src_loc, msg, "only integers with power of two bits are extern compatible", .{}); | 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 | .Fn => { | 23313 | .Fn => { |
| 23304 | if (position != .other) { | 23314 | if (position != .other) { |