www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 10058] New: Inconsistent mangling between C++ and extern(C++).

reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=10058

           Summary: Inconsistent mangling between C++ and extern(C++).
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody puremagic.com
        ReportedBy: ibuclaw ubuntu.com



Noticed this when looking at bug 7024.

test.cc:
void foo1(void*) {}
void foo2(void (*)(void*)) {}
void foo3(void* (*)(void*)) {}
void foo4(void (*)(void*), void*) {}
void foo5(void* (*)(void*), void*) {}
void foo6(void (*)(void*), void*, void*) {}
void foo6(void* (*)(void*), void*, void*) {}


test.d:
extern(C++) void foo1(void*) {}
extern(C++) void foo2(void function(void*)) {}
extern(C++) void foo3(void* function(void*)) {}
extern(C++) void foo4(void function(void*), void*) {}
extern(C++) void foo5(void* function(void*), void*) {}
extern(C++) void foo6(void function(void*), void*, void*) {}
extern(C++) void foo6(void* function(void*), void*, void*) {}


g++ produces following mangling:
---
_Z4foo1Pv
_Z4foo2PFvPvE
_Z4foo3PFPvS_E
_Z4foo4PFvPvES_
_Z4foo5PFPvS_ES_
_Z4foo6PFvPvES_S_
_Z4foo6PFPvS_ES_S_
---

dmd produces following mangling:
---
_Z4foo1Pv
_Z4foo2PFvPvE
_Z4foo3PFPvS0_E
_Z4foo4PFvPvES0_
_Z4foo5PFPvS0_ES0_
_Z4foo6PFvPvES0_S0_
_Z4foo6PFPvS0_ES0_S0_
---


The code in cppmangle.c is:
---
/* Sequence is S_, S0_, .., S9_, SA_, ..., SZ_, S10_, ...
 */
buf->writeByte('S');
if (i)
    writeBase36(buf, i - 1);
---


So something is wrong with the logic before this point...

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 10 2013
next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=10058


Iain Buclaw <ibuclaw ubuntu.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |ibuclaw ubuntu.com



A better example:

test.cc:
void foo1(void* (*)(void*)) {}
void foo2(void* (*)(void*), void*) {}
void foo3(void* (*)(void*), void* (*)(void*)) {}
void foo4(void* (*)(void*), void*, void*) {}
void foo5(void* (*)(void*), void* (*)(void*), void*) {}
void foo6(void* (*)(void*), void* (*)(void*), void* (*)(void*)) {}

test.d:
extern(C++) void foo1(void* function(void*)) {}
extern(C++) void foo2(void* function(void*), void*) {}
extern(C++) void foo3(void* function(void*), void* function(void*)) {}
extern(C++) void foo4(void* function(void*), void*, void*) {}
extern(C++) void foo5(void* function(void*), void* function(void*), void*) {}
extern(C++) void foo6(void* function(void*), void* function(void*), void*
function(void*)) {}


testcc.o
---
_Z4foo1PFPvS_E
_Z4foo2PFPvS_ES_
_Z4foo3PFPvS_ES1_
_Z4foo4PFPvS_ES_S_
_Z4foo5PFPvS_ES1_S_
_Z4foo6PFPvS_ES1_S1_


testd.o
---
_Z4foo1PFPvS0_E
_Z4foo2PFPvS0_ES0_
_Z4foo3PFPvS0_ES1_
_Z4foo4PFPvS0_ES0_S0_
_Z4foo5PFPvS0_ES1_S0_
_Z4foo6PFPvS0_ES1_S1_

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 10 2013
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=10058




https://github.com/D-Programming-Language/dmd/pull/2007

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 10 2013
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=10058




Hmm... tested with patch (using gdc) there is still a discrepancy.

testcc.o
---
_Z4foo1PFPvS_E
_Z4foo2PFPvS_ES_
_Z4foo3PFPvS_ES1_
_Z4foo4PFPvS_ES_S_
_Z4foo5PFPvS_ES1_S_
_Z4foo6PFPvS_ES1_S1_


testd.o
---
_Z4foo1PFPvS_E
_Z4foo2PFPvS_ES_
_Z4foo3PFPvS_ES0_
_Z4foo4PFPvS_ES_S_
_Z4foo5PFPvS_ES0_S_
_Z4foo6PFPvS_ES0_S0_



Looks like the sequence goes:

S_, S1_, .., S9_, SA_, ..., SZ_, S10_, ...


Will need to check this to make sure...

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 10 2013
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=10058




That is, if I can find a way to trigger it. =)

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 10 2013
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=10058




With current pull:

test.cc:
void foo1(void* (*)(void*)) {}
void foo2(void* (*)(void*), void* (*)(void*)) {}
void foo3(void* (*)(void*), void* (*)(const void*)) {}
void foo4(void* (*)(void*), void* (*)(const void*), const void* (*)(void*)) {}


test.d:
extern(C++) void foo1(void* function(void*)) {}
extern(C++) void foo2(void* function(void*), void* function(void*)) {}
extern(C++) void foo3(void* function(void*), void* function(const (void)*)) {}
extern(C++) void foo4(void* function(void*), void* function(const (void)*),
const(void)* function(void*)) {}


testcc.o
---
_Z4foo1PFPvS_E
_Z4foo2PFPvS_ES1_
_Z4foo3PFPvS_EPFS_PKvE
_Z4foo4PFPvS_EPFS_PKvEPFS3_S_E


testd.o
---
_Z4foo1PFPvS_E
_Z4foo2PFPvS_ES1_
_Z4foo3PFPvS_EPFS_PKvE
_Z4foo4PFPvS_EPFS_PKvEPFS3_S_E



Looks good so far.  Can anyone think of any other ways to break it?

Regards
Iain

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 10 2013
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=10058




Commits pushed to master at https://github.com/D-Programming-Language/dmd

https://github.com/D-Programming-Language/dmd/commit/2e5d2ded0522abca587091b2ce7e84102decee58
Fix Issue 10058.

https://github.com/D-Programming-Language/dmd/commit/60dee0bde7db72c84a99b18a911ad14e5bf88db9


Fix Issue 10058 - Inconsistent mangling between C++ and extern(C++).

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 14 2013
prev sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=10058


yebblies <yebblies gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
                 CC|                            |yebblies gmail.com
         Resolution|                            |FIXED


-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 15 2013