func visitIndex(instr *ssa.Index, infer *TypeInfer, ctx *Context) { elem, array, index := instr, instr.X, instr.Index // Array. if aType, ok := array.Type().Underlying().(*types.Array); ok { aInst, ok := ctx.F.locals[array] if !ok { aInst, ok = ctx.F.Prog.globals[array] if !ok { infer.Logger.Fatalf("index: %s: array %+v", ErrUnknownValue, array) return } } elems, ok := ctx.F.arrays[aInst] if !ok { elems, ok = ctx.F.Prog.arrays[aInst] if !ok { infer.Logger.Fatalf("index: %s: not an array %+v", ErrUnknownValue, aInst) return } } infer.Logger.Print(ctx.F.Sprintf(ValSymbol+"%s = %s"+FieldSymbol+"[%s] of type %s", instr.Name(), aInst, index, aType.String())) if elems[index] != nil { infer.Logger.Print(ctx.F.Sprintf(SubSymbol+"accessed as %s", elems[index])) } else { elems[index] = &Value{elem, ctx.F.InstanceID(), ctx.L.Index} infer.Logger.Printf(ctx.F.Sprintf(SubSymbol+"elem uninitialised, set to %s", elem.Name())) } initNestedRefVar(infer, ctx, elems[index], false) ctx.F.locals[elem] = elems[index] return } }