This program source is modified (additional print statements) from:
http://gcc.gnu.org/onlinedocs/gcc-3.4.2/gnat_ugn_unw/A-Simple-Example.html#A-Simple-Example
An example of interoperating C++ and Ada code. The results seem to
indicate that the calls between the two languages are working OK, but
that the parameter passing isn't. I guess that indicates something in the ABI,
perhaps?
The final value in A::method2 should be 3030, and the intermediate
values in the Ada calls are wrong.
$ gcc -v
Reading specs from /opt/lib/gcc/i686-pc-linux-gnu/3.4.2/specs
Configured with: ./configure --prefix=/opt --enable-languages=ada,c,c++
Thread model: posix
gcc version 3.4.2
$ uname -a
Linux ezekiel 2.4.20-8 #1 Thu Mar 13 17:54:28 EST 2003 i686 i686 i386 GNU/Linux
$ cat /etc/issue
Red Hat Linux release 9 (Shrike)
Kernel \r on an \m
$./cpp_main
in A::A, a_value = 1010
=== in A::method2, a_value was = 1010
in Ada_Method2, O_Value = 134582632
in Ada_Method2, A_Value =-1073749612
in A::method1, a_value = 2020
in Ada_Method2, O_Value = 134582632
in Ada_Method2, A_Value =-1073749612
in Ada_Method2, O_Value = 134582632
in Ada_Method2, A_Value = 3030
=== in A::method2, a_value = 2020
$ cat compile
#! /bin/csh
# compilation script to evidence the bug
gnatmake -c simple_cpp_interface
c++ -c cpp_main.C
c++ -c ex7.C
gnatbind -n simple_cpp_interface
gnatlink simple_cpp_interface -o cpp_main --LINK=c++ -lstdc++ ex7.o cpp_main.o
$ cat *.C *.h *.ad?
// cpp_main.C start
#include "ex7.h"
#include <stdio.h>
extern "C" {
void adainit (void);
void adafinal (void);
void method1 (A *t);
}
void method1 (A *t)
{
t->method1 ();
}
int main ()
{
A obj;
adainit ();
obj.method2 (3030);
adafinal ();
}
// cpp_main.C end
//ex7.C start
#include "ex7.h"
#include <stdio.h>
extern "C" { void ada_method2 (A *t, int v);}
void A::method1 (void)
{
a_value = 2020;
printf ("in A::method1, a_value = %d \n",a_value);
}
void A::method2 (int v)
{
printf ("=== in A::method2, a_value was = %d \n",a_value);
ada_method2 (this, v);
printf ("=== in A::method2, a_value = %d \n",a_value);
}
A::A(void)
{
a_value = 1010;
printf ("in A::A, a_value = %d \n",a_value);
}
//ex7.C end
// ex7.h start
class Origin {
public:
int o_value;
};
class A : public Origin {
public:
void method1 (void);
virtual void method2 (int v);
A();
int a_value;
};
// ex7.h end
-- simple_cpp_interface.adb start
with Ada.Text_Io; use Ada.Text_Io;
package body Simple_Cpp_Interface is
procedure Ada_Method2 (This : in out A; V : Integer) is
begin
Ada.Text_Io.Put_Line ("in Ada_Method2, O_Value =" & Integer'Image
(This.O_Value));
Ada.Text_Io.Put_Line ("in Ada_Method2, A_Value =" & Integer'Image
(This.A_Value));
Method1 (This);
Ada.Text_Io.Put_Line ("in Ada_Method2, O_Value =" & Integer'Image
(This.O_Value));
Ada.Text_Io.Put_Line ("in Ada_Method2, A_Value =" & Integer'Image
(This.A_Value));
This.A_Value := V;
Ada.Text_Io.Put_Line ("in Ada_Method2, O_Value =" & Integer'Image
(This.O_Value));
Ada.Text_Io.Put_Line ("in Ada_Method2, A_Value =" & Integer'Image
(This.A_Value));
end Ada_Method2;
end Simple_Cpp_Interface;
-- simple_cpp_interface.adb end
-- simple_cpp_interface.ads start
package Simple_Cpp_Interface is
type A is limited
record
O_Value : Integer;
A_Value : Integer;
end record;
pragma Convention (CPP, A);
procedure Method1 (This : in out A);
pragma Import (C, Method1);
procedure Ada_Method2 (This : in out A; V : Integer);
pragma Export (C, Ada_Method2);
end Simple_Cpp_Interface;
-- simple_cpp_interface.ads end
--
Summary: [Ada] - C++ interoperability sample program fails,
3.4.2, Linux 2.4.20-8, Red Hat 9.0
Product: gcc
Version: 3.4.2
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: ada
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: karl at grebyn dot com
CC: gcc-bugs at gcc dot gnu dot org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18085