fix(ir): vector lane store resolves lane element type [F0.5]
Writing a Vector lane (`v.x = …`, `.y/.z/.w` + colour aliases) panicked with "unresolved type reached LLVM emission". The store path had no vector branch: a `.field_access` target on a Vector fell through to struct-field lookup, matched nothing, left `field_ty = .unresolved`, and built a `ptrTo(.unresolved)` that tripped the LLVM emission guard. The read path resolved the lane fine — the two had diverged (issue-0083 two-resolver class). Extract a shared `Lowering.vectorLaneIndex` resolver and route BOTH paths through it. The read path (`lowerFieldAccessOnType`) delegates to it, dropping its silent `else 0` fallback. A new vector branch in `lowerAssignment` GEPs a typed pointer to the lane (`structGepTyped`) and stores via `storeOrCompound` (plain + compound). `emitStructGep` now addresses a vector base type with a `[0, lane]` GEP. A non-lane field now reports field-not-found on both paths instead of silent-lane-0 / panic. Regression: examples/1506-vectors-lane-store.sx (panicked pre-fix, now reads back written values) + a vectorLaneIndex unit test. Resolves issue 0086; spec documents element assignment.
This commit is contained in:
@@ -1264,7 +1264,18 @@ pub const Ops = struct {
|
||||
else
|
||||
self.e.resolveGepStructType(fa.base, instruction);
|
||||
const st_kind = c.LLVMGetTypeKind(struct_llvm_ty);
|
||||
if (st_kind == c.LLVMStructTypeKind or st_kind == c.LLVMArrayTypeKind) {
|
||||
if (st_kind == c.LLVMVectorTypeKind or st_kind == c.LLVMScalableVectorTypeKind) {
|
||||
// Vector lane address: GEP [0, lane] into the in-memory vector,
|
||||
// yielding a pointer to the lane element for a scalar store
|
||||
// (vector lane assignment — issue 0086). Mirrors how the read
|
||||
// path extracts a lane; here we address it for a store.
|
||||
var indices = [_]c.LLVMValueRef{
|
||||
c.LLVMConstInt(self.e.cached_i64, 0, 0),
|
||||
c.LLVMConstInt(self.e.cached_i64, @intCast(fa.field_index), 0),
|
||||
};
|
||||
const result = c.LLVMBuildGEP2(self.e.builder, struct_llvm_ty, base_ptr, &indices, 2, "vgep");
|
||||
self.e.mapRef(result);
|
||||
} else if (st_kind == c.LLVMStructTypeKind or st_kind == c.LLVMArrayTypeKind) {
|
||||
const result = c.LLVMBuildStructGEP2(self.e.builder, struct_llvm_ty, base_ptr, @intCast(fa.field_index), "gep");
|
||||
self.e.mapRef(result);
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user