@@ -8840,9 +8840,9 @@ template getSymbolsByUDA(alias symbol, alias attribute)
8840
8840
static assert (is (getSymbolsByUDA! (X, X) == AliasSeq! ()));
8841
8841
}
8842
8842
8843
- // https://issues.dlang.org/show_bug.cgi?id=23776
8844
8843
@safe pure nothrow @nogc unittest
8845
8844
{
8845
+ // https://issues.dlang.org/show_bug.cgi?id=23776
8846
8846
struct T
8847
8847
{
8848
8848
struct Tag {}
@@ -8862,6 +8862,18 @@ template getSymbolsByUDA(alias symbol, alias attribute)
8862
8862
}
8863
8863
alias xcomponents = getSymbolsByUDA! (X, X.Tag);
8864
8864
static assert (xcomponents.length > 0 );
8865
+
8866
+ // https://issues.dlang.org/show_bug.cgi?id=23977
8867
+ struct S (string str)
8868
+ {
8869
+ alias strstr = str;
8870
+
8871
+ int i;
8872
+ }
8873
+
8874
+ static struct A {}
8875
+
8876
+ assert ((getSymbolsByUDA! (S! (" a" ), A)).length == 0 );
8865
8877
}
8866
8878
8867
8879
// getSymbolsByUDA produces wrong result if one of the symbols having the UDA is a function
@@ -8919,7 +8931,10 @@ private template getSymbolsByUDAImpl(alias symbol, alias attribute, names...)
8919
8931
8920
8932
// Filtering not compiled members such as alias of basic types.
8921
8933
static if (isAliasSeq! member ||
8922
- (isType! member && ! isAggregateType! member && ! is (member == enum )))
8934
+ // exclude basic types and derived types
8935
+ (isType! member && ! isAggregateType! member && ! is (member == enum )) ||
8936
+ // exclude aliases to expressions such as string literals
8937
+ __traits (compiles , { auto ex = member; }))
8923
8938
{
8924
8939
alias getSymbolsByUDAImpl = tail;
8925
8940
}
0 commit comments