Bug 24858 – maxIndex but not minIndex sometimes returns the index as an array with a single element

Status
NEW
Severity
normal
Priority
P1
Component
phobos
Product
D
Version
D2
Platform
x86_64
OS
Linux
Creation time
2024-11-13T19:28:18Z
Last change time
2024-12-01T16:43:13Z
Assigned to
No Owner
Creator
pabuond
Moved to GitHub: phobos#10567 →

Comments

Comment #0 by pabuond — 2024-11-13T19:28:18Z
`maxIndex` returns an array with a single element when run on an array modified by UFCS (e.g. for absolute value). `minIndex` doesn't, so I guess this is a bug. Tested with dmd v2.109.1 ``` import std.math: fabs; import std.algorithm: minIndex, maxIndex; double[] u = [-9, 3, 2, 8, 4]; writeln(u.maxIndex); // => 3, OK writeln(u.map!fabs.minIndex); // => 2, OK writeln(u.map!fabs.maxIndex); // => [0] ??? Expected: 0 ``` Thanks!
Comment #1 by nick — 2024-11-15T11:42:33Z
Are you sure? With 2.109.0 the last line does give `0`.
Comment #2 by kdevel — 2024-11-15T12:48:44Z
WORKSFORME compilable version (mi.d): ``` import std.stdio : writeln; import std.algorithm : map; import std.math: fabs; import std.algorithm: minIndex, maxIndex; unittest { double[] u = [-9, 3, 2, 8, 4]; writeln(u.maxIndex); // => 3, OK writeln(u.map!fabs.minIndex); // => 2, OK writeln(u.map!fabs.maxIndex); // => [0] ??? Expected: 0 } ``` $ dmd --version DMD64 D Compiler v2.109.1 Copyright (C) 1999-2024 by The D Language Foundation, All Rights Reserved written by Walter Bright $ dmd -unittest -main -run mi.d 3 2 0 1 modules passed unittests (also works under dmd 2.098, GDC 12.1, GDC 11.3)
Comment #3 by pabuond — 2024-11-15T13:27:18Z
Aw, my bad - I was doing some tests, but in combination with mir.ndslice and it turns out it's due to a clash with mir.ndslice's maxIndex/minIndex that I didn't realise I was importing too. So not a bug in std.algorithm :) sorry for the false alarm! Not too sure exactly what creates the issue, some import combinations work, but one doesn't. (Of course, it's bad to import homonyms into the namespace - the compiler seemed to deal with it, so I thought it was fine, but obviously it creates some issues. There doesn't seem to be a way to use UFCS with full module names, is there?) ``` import std.stdio: writeln; import std.math: fabs; /* OK */ // import std.algorithm: maxIndex, minIndex, map; /* OK */ // import std.algorithm: maxIndex, minIndex; // import mir.ndslice: map; /* OK */ // import std.algorithm: maxIndex, minIndex, map; // import mir.ndslice: maxIndex, minIndex; /* Not OK */ import std.algorithm: maxIndex, minIndex; import mir.ndslice: maxIndex, minIndex, map; void main() { double[] u = [-9, 3, 2, 8, 4]; writeln(u.maxIndex); // => 3, OK writeln(u.minIndex); // => 0, OK writeln(u.map!fabs.minIndex); // => [2] ??? writeln(u.map!fabs.maxIndex); // => [0] ??? } ```
Comment #4 by robert.schadek — 2024-12-01T16:43:13Z
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/phobos/issues/10567 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB