diff --git a/posix.mak b/posix.mak index b2a57f680d4..6f8b22083d2 100644 --- a/posix.mak +++ b/posix.mak @@ -210,7 +210,7 @@ EXTRA_MODULES_INTERNAL := $(addprefix \ gammafunction errorfunction) $(addprefix std/internal/, \ cstring processinit unicode_tables scopebuffer\ unicode_comp unicode_decomp unicode_grapheme unicode_norm) \ - $(addprefix std/internal/test/, dummyrange) \ + $(addprefix std/internal/test/, dummyrange uda) \ $(addprefix std/experimental/ndslice/, internal) \ $(addprefix std/algorithm/, internal) diff --git a/std/internal/test/uda.d b/std/internal/test/uda.d index 88e3a1b5ae9..27970582d7b 100644 --- a/std/internal/test/uda.d +++ b/std/internal/test/uda.d @@ -14,3 +14,13 @@ struct HasPrivateMembers @Attr private int c; private int d; } + +// If getSymbolsByUDA is mixed into the same scope it also returns private members +unittest +{ + import std.traits : getSymbolsByUDA, hasUDA; + mixin getSymbolsByUDA!(HasPrivateMembers, Attr) symbols; + static assert(symbols.getSymbolsByUDA.length == 2); + static assert(hasUDA!(symbols.getSymbolsByUDA[0], Attr)); + static assert(hasUDA!(symbols.getSymbolsByUDA[1], Attr)); +} diff --git a/std/traits.d b/std/traits.d index 7c29681c501..ef8b1468ea4 100644 --- a/std/traits.d +++ b/std/traits.d @@ -6801,11 +6801,17 @@ unittest // #15335: getSymbolsByUDA fails if type has private members unittest { - // HasPrivateMembers has, well, private members, one of which has a UDA. + // HasPrivateMembers has private members, but only the ones visible from std.traits are returned import std.internal.test.uda; - static assert(getSymbolsByUDA!(HasPrivateMembers, Attr).length == 2); + // whether allMembers returns private members, see dmd fix for Issue 15907 + static if (__traits(allMembers, HasPrivateMembers).length == 2) + static assert(getSymbolsByUDA!(HasPrivateMembers, Attr).length == 1); + else + { + static assert(getSymbolsByUDA!(HasPrivateMembers, Attr).length == 2); + static assert(hasUDA!(getSymbolsByUDA!(HasPrivateMembers, Attr)[1], Attr)); + } static assert(hasUDA!(getSymbolsByUDA!(HasPrivateMembers, Attr)[0], Attr)); - static assert(hasUDA!(getSymbolsByUDA!(HasPrivateMembers, Attr)[1], Attr)); } /** diff --git a/win32.mak b/win32.mak index 1cdb211fa91..e3e1879b092 100644 --- a/win32.mak +++ b/win32.mak @@ -238,7 +238,7 @@ SRC_STD_C_FREEBSD= std\c\freebsd\socket.d SRC_STD_INTERNAL= std\internal\cstring.d std\internal\processinit.d \ std\internal\unicode_tables.d std\internal\unicode_comp.d std\internal\unicode_decomp.d \ std\internal\unicode_grapheme.d std\internal\unicode_norm.d std\internal\scopebuffer.d \ - std\internal\test\dummyrange.d + std\internal\test\dummyrange.d std\internal\test\uda.d SRC_STD_INTERNAL_DIGEST= std\internal\digest\sha_SSSE3.d