On Thursday, 2 August 2018 at 04:59:52 UTC, Walter Bright wrote:
On 8/1/2018 7:09 PM, Rubn wrote:
On Wednesday, 1 August 2018 at 23:04:01 UTC, Walter Bright wrote:
An example of silent hijacking:

   extern (C++, "ab") void foo(long); // original code
   ... lots of code ...
   extern (C++, "cd") void foo(int); // added later by intern, should have been                                      // placed in another module
   ... a thousand lines later ...
   foo(0); // OOPS! now calling cd.foo() rather than ab.foo(), D sux

You might say "nobody would ever write code like that." But that's like the C folks saying real C programmers won't write:

You can do that today, just remove the "extern(C++, ...)" part and you have the same issue. Why should C++ with namespaces be safer than just regular D ? I don't understand, if it is such a huge gigantic problem why didn't you do anything to solve this problem in regards to D then ?

The difference is those names are supposedly in different namespaces, given that the code is converted from C++:

    namespace ab { void foo(long); }
    ... lots of code ...
    namespace cd { void foo(int); }

where the foo()'s do not conflict with each other, and a user would reasonably expect that same behavior when translated to D.


If you *want* them in the same scope in D, you can do that with alias.

You can say the same thing in D. If you have "module ab" and "module cd", if you put the function in the wrong file, you will face this same bug. It's not a hypothetical, it's the current implementation in D, yet no one has complained or filed a bug report about it.

The bug is caused by the implicit conversion from int to long. That is not, nor should it be, the purpose of C++ namespaces in D to fix.

Reply via email to