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 Jun 29, 2023
1 parent 5a3ac67 commit 845370a
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 @@ -8840,9 +8840,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 @@ -8862,6 +8862,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 @@ -8919,7 +8931,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 845370a

Please sign in to comment.