comp.lang.ada
 help / color / mirror / Atom feed
From: Niklas Holsti <niklas.holsti@tidorum.invalid>
Subject: Re: Linking Ada to C++ Overloaded Functions and Methods
Date: Sat, 7 Apr 2018 22:05:22 +0300
Date: 2018-04-07T22:05:22+03:00	[thread overview]
Message-ID: <fisj3hF8nk6U1@mid.individual.net> (raw)
In-Reply-To: <c157fac7-28a4-4233-a825-f02ccd3adcd8@googlegroups.com>

On 18-04-07 21:35 , Ron Wills wrote:
> I know that both Ada and C++ can overload functions and methods. The problem I'm having is when I'm trying to link Ada to overload C++ functions. I know I could use different Ada names, but if it's possible to keep the same names in Ada it would save a lot of re-coding.
>
> An example is from the FLTK library. The "draw_box" method from the Fl_Widget class is overloaded and I get the following from g++ -fdump-ada-spec.
>
> procedure draw_box (this : access constant Fl_Widget'Class);
> pragma Import (CPP, draw_box, "_ZNK9Fl_Widget8draw_boxEv");
>
> procedure draw_box
>   (this : access constant Fl_Widget'Class;
>    t : Fl_Enumerations_H.Fl_Boxtype;
>    c : Fl_Enumerations_H.Fl_Color);  -- /usr/include/Fl/Fl_Widget.H:181
> pragma Import (CPP, draw_box, "_ZNK9Fl_Widget8draw_boxE10Fl_Boxtypej");
>
> The C++ name mangling works to uniquely identify the C++ methods, but the compiler is choking on the Ada names as already being declared.
>
> fl_fl_widget_h.ads:171:07: entity "draw_box" was previously imported
> fl_fl_widget_h.ads:171:07: (pragma "Import" applies to all previous entities)
> fl_fl_widget_h.ads:171:07: import not allowed for "draw_box" declared at line 164
> fl_fl_widget_h.ads:181:07: entity "draw_box" was previously imported
> fl_fl_widget_h.ads:181:07: (pragma "Import" applies to all previous entities)
> fl_fl_widget_h.ads:181:07: import not allowed for "draw_box" declared at line 167
>
> Is there a way to use overloaded Ada names with C++ or do I need to find a unique Ada name for every C++ overload method?
>

I would try to change the pragma Imports into aspects, something like this:

procedure draw_box (....)
with Import,
      Convention => CPP,
      Link_Name => "_ZNK9Fl_Widget8draw_boxE10Fl_Boxtypej";

Aspects are syntactically tied to the subprogram declaration in which 
they occur, so overloaded subprograms with the same identifier can be 
given different aspect values, unlike for pragma Import.

Note that I'm not fully sure if you should use the Link_Name aspect or 
the External_Name aspect. The C++ identifiers given in the pragma 
Imports are External_Name values, but I think they are also Link_Name 
values.

-- 
Niklas Holsti
Tidorum Ltd
niklas holsti tidorum fi
       .      @       .


  parent reply	other threads:[~2018-04-07 19:05 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-07 18:35 Linking Ada to C++ Overloaded Functions and Methods Ron Wills
2018-04-07 19:01 ` Dan'l Miller
2018-04-07 19:05 ` Niklas Holsti [this message]
2018-04-07 20:07   ` Ron Wills
2018-04-07 20:25     ` Jere
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox