digitalmars.D.bugs - [Issue 19278] New: extern(C++, "name") doesn't accept expressions
- d-bugmail puremagic.com (55/55) Sep 30 2018 https://issues.dlang.org/show_bug.cgi?id=19278
https://issues.dlang.org/show_bug.cgi?id=19278 Issue ID: 19278 Summary: extern(C++, "name") doesn't accept expressions Product: D Version: D2 Hardware: x86 OS: Windows Status: NEW Severity: enhancement Priority: P1 Component: dmd Assignee: nobody puremagic.com Reporter: turkeyman gmail.com Consider: ``` version (A) enum NS = "something"; else enum NS = "something_else"; extern(C++, NS): //... ``` In this example, the parser sees an identifier and assumes that to be the name for the namespace, rather than check if it's an expression that evaluates to a string. I think it should attempt to evaluate the expression as a string. It could be argued that may be ambiguous, but this isn't: ``` string GetNs() { version (A) { return "A"; } else { return "B"; } } extern(C++, GetNs()): ``` There's also this: ``` alias NS = AliasSeq!("A", "B"); extern(C++, NS): ``` That is, do want `extern(C++, "A", "B")` in this case, but again, it looks like an identifier to the parser. Various work-around constructions don't work: ``` version (A) extern(C++, "A"): else extern(C++, "B"): void f(); // <- f is not in any namespace, the externs are scoped inside the version cases ``` ``` mixin(`extern(C++, "NS"):`); void f(); // <- f is not namespaced; it seems the mixin statement has some sort of scope which the extern doesn't escape ``` One of the goals of the string namespace was that you could synthesise the name, so it really just needs to work with expressions. --
Sep 30 2018