| ... | @@ -20,6 +20,18 @@ pub fn addCases(cases: *tests.CompileErrorContext) void { | ... | @@ -20,6 +20,18 @@ pub fn addCases(cases: *tests.CompileErrorContext) void { |
| 20 | "tmp.zig:2:20: error: use of undefined value here causes undefined behavior", | 20 | "tmp.zig:2:20: error: use of undefined value here causes undefined behavior", |
| 21 | }); | 21 | }); |
| 22 | | 22 | |
| | 23 | cases.add("extern struct with non-extern-compatible integer tag type", |
| | 24 | \\pub const E = enum(u31) { A, B, C }; |
| | 25 | \\pub const S = extern struct { |
| | 26 | \\ e: E, |
| | 27 | \\}; |
| | 28 | \\export fn entry() void { |
| | 29 | \\ const s: S = undefined; |
| | 30 | \\} |
| | 31 | , &[_][]const u8{ |
| | 32 | "tmp.zig:3:5: error: extern structs cannot contain fields of type 'E'", |
| | 33 | }); |
| | 34 | |
| 23 | cases.add("@Type for exhaustive enum with non-integer tag type", | 35 | cases.add("@Type for exhaustive enum with non-integer tag type", |
| 24 | \\const TypeInfo = @import("builtin").TypeInfo; | 36 | \\const TypeInfo = @import("builtin").TypeInfo; |
| 25 | \\const Tag = @Type(.{ | 37 | \\const Tag = @Type(.{ |
| ... | @@ -38,6 +50,47 @@ pub fn addCases(cases: *tests.CompileErrorContext) void { | ... | @@ -38,6 +50,47 @@ pub fn addCases(cases: *tests.CompileErrorContext) void { |
| 38 | "tmp.zig:2:20: error: TypeInfo.Enum.tag_type must be an integer type, not 'bool'", | 50 | "tmp.zig:2:20: error: TypeInfo.Enum.tag_type must be an integer type, not 'bool'", |
| 39 | }); | 51 | }); |
| 40 | | 52 | |
| | 53 | cases.add("extern struct with extern-compatible but inferred integer tag type", |
| | 54 | \\pub const E = enum { |
| | 55 | \\@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"10",@"11",@"12", |
| | 56 | \\@"13",@"14",@"15",@"16",@"17",@"18",@"19",@"20",@"21",@"22",@"23", |
| | 57 | \\@"24",@"25",@"26",@"27",@"28",@"29",@"30",@"31",@"32",@"33",@"34", |
| | 58 | \\@"35",@"36",@"37",@"38",@"39",@"40",@"41",@"42",@"43",@"44",@"45", |
| | 59 | \\@"46",@"47",@"48",@"49",@"50",@"51",@"52",@"53",@"54",@"55",@"56", |
| | 60 | \\@"57",@"58",@"59",@"60",@"61",@"62",@"63",@"64",@"65",@"66",@"67", |
| | 61 | \\@"68",@"69",@"70",@"71",@"72",@"73",@"74",@"75",@"76",@"77",@"78", |
| | 62 | \\@"79",@"80",@"81",@"82",@"83",@"84",@"85",@"86",@"87",@"88",@"89", |
| | 63 | \\@"90",@"91",@"92",@"93",@"94",@"95",@"96",@"97",@"98",@"99",@"100", |
| | 64 | \\@"101",@"102",@"103",@"104",@"105",@"106",@"107",@"108",@"109", |
| | 65 | \\@"110",@"111",@"112",@"113",@"114",@"115",@"116",@"117",@"118", |
| | 66 | \\@"119",@"120",@"121",@"122",@"123",@"124",@"125",@"126",@"127", |
| | 67 | \\@"128",@"129",@"130",@"131",@"132",@"133",@"134",@"135",@"136", |
| | 68 | \\@"137",@"138",@"139",@"140",@"141",@"142",@"143",@"144",@"145", |
| | 69 | \\@"146",@"147",@"148",@"149",@"150",@"151",@"152",@"153",@"154", |
| | 70 | \\@"155",@"156",@"157",@"158",@"159",@"160",@"161",@"162",@"163", |
| | 71 | \\@"164",@"165",@"166",@"167",@"168",@"169",@"170",@"171",@"172", |
| | 72 | \\@"173",@"174",@"175",@"176",@"177",@"178",@"179",@"180",@"181", |
| | 73 | \\@"182",@"183",@"184",@"185",@"186",@"187",@"188",@"189",@"190", |
| | 74 | \\@"191",@"192",@"193",@"194",@"195",@"196",@"197",@"198",@"199", |
| | 75 | \\@"200",@"201",@"202",@"203",@"204",@"205",@"206",@"207",@"208", |
| | 76 | \\@"209",@"210",@"211",@"212",@"213",@"214",@"215",@"216",@"217", |
| | 77 | \\@"218",@"219",@"220",@"221",@"222",@"223",@"224",@"225",@"226", |
| | 78 | \\@"227",@"228",@"229",@"230",@"231",@"232",@"233",@"234",@"235", |
| | 79 | \\@"236",@"237",@"238",@"239",@"240",@"241",@"242",@"243",@"244", |
| | 80 | \\@"245",@"246",@"247",@"248",@"249",@"250",@"251",@"252",@"253", |
| | 81 | \\@"254",@"255" |
| | 82 | \\}; |
| | 83 | \\pub const S = extern struct { |
| | 84 | \\ e: E, |
| | 85 | \\}; |
| | 86 | \\export fn entry() void { |
| | 87 | \\ if (@TagType(E) != u8) @compileError("did not infer u8 tag type"); |
| | 88 | \\ const s: S = undefined; |
| | 89 | \\} |
| | 90 | , &[_][]const u8{ |
| | 91 | "tmp.zig:31:5: error: extern structs cannot contain fields of type 'E'", |
| | 92 | }); |
| | 93 | |
| 41 | cases.add("@Type for tagged union with extra enum field", | 94 | cases.add("@Type for tagged union with extra enum field", |
| 42 | \\const TypeInfo = @import("builtin").TypeInfo; | 95 | \\const TypeInfo = @import("builtin").TypeInfo; |
| 43 | \\const Tag = @Type(.{ | 96 | \\const Tag = @Type(.{ |