@@ -8910,9 +8910,9 @@ template getSymbolsByUDA(alias symbol, alias attribute)
8910
8910
static assert (is (getSymbolsByUDA! (X, X) == AliasSeq! ()));
8911
8911
}
8912
8912
8913
- // https://issues.dlang.org/show_bug.cgi?id=23776
8914
8913
@safe pure nothrow @nogc unittest
8915
8914
{
8915
+ // https://issues.dlang.org/show_bug.cgi?id=23776
8916
8916
struct T
8917
8917
{
8918
8918
struct Tag {}
@@ -8932,6 +8932,18 @@ template getSymbolsByUDA(alias symbol, alias attribute)
8932
8932
}
8933
8933
alias xcomponents = getSymbolsByUDA! (X, X.Tag);
8934
8934
static assert (xcomponents.length > 0 );
8935
+
8936
+ // https://issues.dlang.org/show_bug.cgi?id=23977
8937
+ struct S (string str)
8938
+ {
8939
+ alias strstr = str;
8940
+
8941
+ int i;
8942
+ }
8943
+
8944
+ static struct A {}
8945
+
8946
+ assert ((getSymbolsByUDA! (S! (" a" ), A)).length == 0 );
8935
8947
}
8936
8948
8937
8949
// getSymbolsByUDA produces wrong result if one of the symbols having the UDA is a function
@@ -8991,7 +9003,10 @@ private template getSymbolsByUDAImpl(alias symbol, alias attribute, names...)
8991
9003
8992
9004
// Filtering not compiled members such as alias of basic types.
8993
9005
static if (isAliasSeq! member ||
8994
- (isType! member && ! isAggregateType! member && ! is (member == enum )))
9006
+ // exclude basic types and derived types
9007
+ (isType! member && ! isAggregateType! member && ! is (member == enum )) ||
9008
+ // exclude aliases to expressions such as string literals
9009
+ __traits (compiles , { auto ex = member; }))
8995
9010
{
8996
9011
alias getSymbolsByUDAImpl = tail;
8997
9012
}
0 commit comments