stage2: fix astgen of decl ref, add test for global consts

This commit is contained in:
Vexu 2020-08-19 14:25:47 +03:00 committed by Andrew Kelley
parent 338a495648
commit ab8a9a6605
4 changed files with 42 additions and 9 deletions

View File

@ -1223,9 +1223,10 @@ fn identifier(mod: *Module, scope: *Scope, rl: ResultLoc, ident: *ast.Node.OneTo
}
if (mod.lookupDeclName(scope, ident_name)) |decl| {
// TODO handle lvalues
const result = try addZIRInst(mod, scope, src, zir.Inst.DeclValInModule, .{ .decl = decl }, .{});
return rlWrap(mod, scope, rl, result);
if (rl == .lvalue or rl == .ref)
return result;
return rlWrap(mod, scope, rl, try addZIRUnOp(mod, scope, src, .deref, result));
}
return mod.failNode(scope, &ident.base, "use of undeclared identifier '{}'", .{ident_name});
@ -1258,7 +1259,8 @@ fn multilineStrLiteral(mod: *Module, scope: *Scope, node: *ast.Node.MultilineStr
// line lengths and new lines
var len = lines.len - 1;
for (lines) |line| {
len += tree.tokenSlice(line).len - 2;
// 2 for the '//' + 1 for '\n'
len += tree.tokenSlice(line).len - 3;
}
const bytes = try scope.arena().alloc(u8, len);
@ -1268,9 +1270,9 @@ fn multilineStrLiteral(mod: *Module, scope: *Scope, node: *ast.Node.MultilineStr
bytes[i] = '\n';
i += 1;
}
const slice = tree.tokenSlice(line)[2..];
mem.copy(u8, bytes[i..], slice);
i += slice.len;
const slice = tree.tokenSlice(line);
mem.copy(u8, bytes[i..], slice[2..slice.len - 1]);
i += slice.len - 3;
}
return addZIRInst(mod, scope, src, zir.Inst.Str, .{ .bytes = bytes }, .{});

View File

@ -457,7 +457,8 @@ pub const Type = extern union {
try param_type.format("", .{}, out_stream);
}
try out_stream.writeAll(") ");
try payload.return_type.format("", .{}, out_stream);
ty = payload.return_type;
continue;
},
.array_u8 => {

View File

@ -581,8 +581,7 @@ fn analyzeInstDeclVal(mod: *Module, scope: *Scope, inst: *zir.Inst.DeclVal) Inne
fn analyzeInstDeclValInModule(mod: *Module, scope: *Scope, inst: *zir.Inst.DeclValInModule) InnerError!*Inst {
const decl = inst.positionals.decl;
const ptr = try mod.analyzeDeclRef(scope, inst.base.src, decl);
return mod.analyzeDeref(scope, inst.base.src, ptr, inst.base.src);
return mod.analyzeDeclRef(scope, inst.base.src, decl);
}
fn analyzeInstCall(mod: *Module, scope: *Scope, inst: *zir.Inst.Call) InnerError!*Inst {

View File

@ -617,6 +617,37 @@ pub fn addCases(ctx: *TestContext) !void {
,
"",
);
case.addCompareOutput(
\\export fn _start() noreturn {
\\ add(aa, bb);
\\
\\ exit();
\\}
\\
\\const aa = 'ぁ';
\\const bb = '\x03';
\\
\\fn add(a: u32, b: u32) void {
\\ assert(a + b == 12356);
\\}
\\
\\pub fn assert(ok: bool) void {
\\ if (!ok) unreachable; // assertion failure
\\}
\\
\\fn exit() noreturn {
\\ asm volatile ("syscall"
\\ :
\\ : [number] "{rax}" (231),
\\ [arg1] "{rdi}" (0)
\\ : "rcx", "r11", "memory"
\\ );
\\ unreachable;
\\}
,
"",
);
}
{