Bug 24480 – getSymbolsByUDA ignores template functions

Status
NEW
Severity
normal
Priority
P1
Component
phobos
Product
D
Version
D2
Platform
All
OS
Mac OS X
Creation time
2024-04-03T23:35:14Z
Last change time
2024-12-01T16:42:23Z
Assigned to
No Owner
Creator
johanengelen
Moved to GitHub: phobos#10546 →

Comments

Comment #0 by johanengelen — 2024-04-03T23:35:14Z
Testcase: ``` struct SomeUDA {} struct S { @SomeUDA S opBinary(string op: "-")(S rhs) const pure nothrow @nogc { return rhs; } S opBinary(string op: "*")(S dur) const pure nothrow @nogc { return dur; } } import std.traits; pragma(msg, getSymbolsByUDA!(S, SomeUDA)); ``` This prints "()", i.e. does not return the template function (https://d.godbolt.org/z/Th86qvMGM). Seems to be fixed by adding `true` on this line https://github.com/dlang/phobos/blob/77adcadf7961dbe1177aa79be381311404a81d46/std/traits.d#L9009 (similar to the `if` condition three lines above it). However, then this slightly modified testcase still fails: ``` struct S { S opBinary(string op: "-")(S rhs) const pure nothrow @nogc { return rhs; } @SomeUDA S opBinary(string op: "*")(S dur) const pure nothrow @nogc { return dur; } } ```
Comment #1 by issues.dlang — 2024-04-05T22:27:01Z
Yeah, __traits(getOverloads, ...) won't give you templated overloads unless you tell it to - and in the general case, it really isn't going to work well to get attributes from a templated function because of attribute inference. However, for UDAs, they should be there regardless.
Comment #2 by robert.schadek — 2024-12-01T16:42:23Z
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/phobos/issues/10546 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB