Skip to content

Commit

Permalink
Fix Issue 23977 - [REG2.102] cannot use getSymbolsByUDA on template s…
Browse files Browse the repository at this point in the history
…truct with alias member
  • Loading branch information
RazvanN7 committed Apr 4, 2024
1 parent 92dc5a4 commit 6b2176e
Showing 1 changed file with 17 additions and 2 deletions.
19 changes: 17 additions & 2 deletions std/traits.d
Original file line number Diff line number Diff line change
Expand Up @@ -8910,9 +8910,9 @@ template getSymbolsByUDA(alias symbol, alias attribute)
static assert(is(getSymbolsByUDA!(X, X) == AliasSeq!()));
}

// https://issues.dlang.org/show_bug.cgi?id=23776
@safe pure nothrow @nogc unittest
{
// https://issues.dlang.org/show_bug.cgi?id=23776
struct T
{
struct Tag {}
Expand All @@ -8932,6 +8932,18 @@ template getSymbolsByUDA(alias symbol, alias attribute)
}
alias xcomponents = getSymbolsByUDA!(X, X.Tag);
static assert(xcomponents.length > 0);

// https://issues.dlang.org/show_bug.cgi?id=23977
struct S(string str)
{
alias strstr = str;

int i;
}

static struct A {}

assert((getSymbolsByUDA!(S!("a"), A)).length == 0);
}

// getSymbolsByUDA produces wrong result if one of the symbols having the UDA is a function
Expand Down Expand Up @@ -8991,7 +9003,10 @@ private template getSymbolsByUDAImpl(alias symbol, alias attribute, names...)

// Filtering not compiled members such as alias of basic types.
static if (isAliasSeq!member ||
(isType!member && !isAggregateType!member && !is(member == enum)))
// exclude basic types and derived types
(isType!member && !isAggregateType!member && !is(member == enum)) ||
// exclude aliases to expressions such as string literals
__traits(compiles, { auto ex = member; }))
{
alias getSymbolsByUDAImpl = tail;
}
Expand Down

0 comments on commit 6b2176e

Please sign in to comment.