Commit a7a8c433d0

LemonBoy <thatlemon@gmail.com>
2020-04-23 09:55:06
stage1: Prevent the creation of illegal ptr types
Closes #5140
1 parent 7634e67
Changed files (2)
src/ir.cpp
@@ -29079,6 +29079,12 @@ static IrInstGen *ir_analyze_instruction_ptr_type(IrAnalyze *ira, IrInstSrcPtrTy
     lazy_ptr_type->base.id = LazyValueIdPtrType;
 
     if (instruction->sentinel != nullptr) {
+        if (instruction->ptr_len != PtrLenUnknown) {
+            ir_add_error(ira, &instruction->base.base,
+                buf_sprintf("sentinels are only allowed on unknown-length pointers"));
+            return ira->codegen->invalid_inst_gen;
+        }
+
         lazy_ptr_type->sentinel = instruction->sentinel->child;
         if (ir_resolve_const(ira, lazy_ptr_type->sentinel, LazyOk) == nullptr)
             return ira->codegen->invalid_inst_gen;
test/compile_errors.zig
@@ -2,6 +2,14 @@ const tests = @import("tests.zig");
 const std = @import("std");
 
 pub fn addCases(cases: *tests.CompileErrorContext) void {
+    cases.add("invalid pointer syntax",
+        \\export fn foo() void {
+        \\    var guid: *:0 const u8 = undefined;
+        \\}
+    , &[_][]const u8{
+        "tmp.zig:2:15: error: sentinels are only allowed on unknown-length pointers",
+    });
+
     cases.add("declaration between fields",
         \\const S = struct {
         \\    const foo = 2;