Should an 'extern(C++, "ns"):' override previous ones in the same scope?

Jonathan M Davis newsgroup.d at
Sat Sep 7 17:22:07 UTC 2019

On Saturday, September 7, 2019 9:15:44 AM MDT Max Samukha via Digitalmars-d-
learn wrote:
> extern(C++, "ns1"):
> extern(C++, "ns2"): // Not in nested scope. Should it supersede?
> void foo();
> pragma(msg, foo.mangleof); // _ZN3ns13ns23fooEv instead of
> expected _ZN3ns23fooEv
> Is that by design?

If you have


then @system overrides @safe. And you can't have a C++ symbol that lives in
multiple namespaces. So, I would consider it a bug if your example doesn't
put foo in the namespace ns2, overriding ns1. IMHO, overriding is the only
behavior that makes sense, and anything else would be inconsistent with how
other, incompatible attributes are applied. Certainly, treating

extern(C++, "ns1"):
extern(C++, "ns2"):

as equivalent to

extern(C++, "ns1::ns2"):

makes no sense whatsoever IMHO. IIRC, this version of extern(C++) didn't go
through the DIP process and was simply added via a PR. So, it wouldn't
surprise me if the person who implemented it didn't even think about the

extern(C++, "ns1"):
extern(C++, "ns2"):

case and didn't test for it properly.

- Jonathan M Davis

More information about the Digitalmars-d-learn mailing list