commit a7a8c433d0153bf8d71d17f2cf54027ba8eff805 (tree)
parent 7634e67ba503fdbdf75daff48a13f9d35e331cd4
Author: LemonBoy <thatlemon@gmail.com>
Date: Thu, 23 Apr 2020 09:55:06 +0200
stage1: Prevent the creation of illegal ptr types
Closes #5140
Diffstat:
2 files changed, 14 insertions(+), 0 deletions(-)
diff --git a/src/ir.cpp b/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;
diff --git a/test/compile_errors.zig b/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;