On Wednesday, January 17, 2018 07:30:30 Nicholas Wilson via Digitalmars-d- learn wrote: > On Wednesday, 17 January 2018 at 02:37:07 UTC, Steven > > Schveighoffer wrote: > > On 1/11/18 11:25 PM, Nicholas Wilson wrote: > >> Is there a way to make __gshared part of an alias? > > > > No, __gshared is a storage class, not a type constructor, so it > > has no meaning as part of a type: > > > > __gshared int x; > > int y; > > > > static assert(is(typeof(x) == typeof(y))); > > > >> as in > >> > >> enum AddrSpace : uint > >> { > >> > >> Private = 0, > >> Global = 1, > >> Shared = 2, > >> Constant = 3, > >> Generic = 4, > >> > >> } > >> > >> struct Variable(AddrSpace as, T) > >> { > >> > >> T val; > >> alias val this; > >> > >> } > >> alias Global(T) = __gshared Variable!(AddrSpace.Global, T); > > > > dmd famously doesn't complain about attributes that do nothing, > > as in this case. > > > > -Steve > > I kluged this into place in LDC > https://github.com/ldc-developers/ldc/pull/2509/commits/7cf6f417f95a5bffa4 > b18f2d8b132ca8f0e900d3#diff-33d7d08455db33f1182e3936fd2ba3f9R896
I don't know what you're doing, and maybe __gshared is the appropriate solution for what you're trying to do, but in general, if you're not trying to bind to a C global variable, you should be using shared, and using __gshared is risking bugs precisely because it is not considered part of the type and does not prevent you from using it a thread-local context. The compiler will treat it as thread-local, risking subtle bugs that shared would catch. - Jonathan M Davis