* Interfacing enums with C @ 2014-08-17 19:02 Victor Porton 2014-08-17 19:39 ` Simon Wright 0 siblings, 1 reply; 7+ messages in thread From: Victor Porton @ 2014-08-17 19:02 UTC (permalink / raw) Let in C code are defined: typedef enum { A=1, B=2 } option_type; void f(option_type option); Let we also have type Option_Type is (A, B); for Option_Type'Size use Interfaces.C.unsigned'Size; for Option_Type use (A=>1, B=>2); X: Option_Type := A; Which of the following code is correct (accordingly RM)? -- First code declare procedure F (Option: Option_Type) with Import, Convention=>C, External_Name=>"f"; begin F(X); end; or -- Second code declare procedure F (Option: Interfaces.C.unsigned) with Import, Convention=>C, External_Name=>"f"; function Conv is new Ada.Unchecked_Conversion(Option_Type, Interfaces.C.unsigned); begin F(Conv(X)); end; I think both first and second Ada fragments are correct but am not sure. -- Victor Porton - http://portonvictor.org ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Interfacing enums with C 2014-08-17 19:02 Interfacing enums with C Victor Porton @ 2014-08-17 19:39 ` Simon Wright 2014-08-17 19:46 ` Victor Porton 0 siblings, 1 reply; 7+ messages in thread From: Simon Wright @ 2014-08-17 19:39 UTC (permalink / raw) Victor Porton <porton@narod.ru> writes: > type Option_Type is (A, B); > for Option_Type'Size use Interfaces.C.unsigned'Size; > for Option_Type use (A=>1, B=>2); What's wrong with type Option_Type is (A, B) with Convention => C; for Option_Type use (A => 1, B => 2); And your first interfacing convention is much better. IMO. ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Interfacing enums with C 2014-08-17 19:39 ` Simon Wright @ 2014-08-17 19:46 ` Victor Porton 2014-08-17 19:48 ` Victor Porton 2014-08-18 9:17 ` Simon Wright 0 siblings, 2 replies; 7+ messages in thread From: Victor Porton @ 2014-08-17 19:46 UTC (permalink / raw) Simon Wright wrote: > Victor Porton <porton@narod.ru> writes: > >> type Option_Type is (A, B); >> for Option_Type'Size use Interfaces.C.unsigned'Size; >> for Option_Type use (A=>1, B=>2); > > What's wrong with > > type Option_Type is (A, B) > with Convention => C; > for Option_Type use (A => 1, B => 2); http://www.ada-auth.org/standards/12rm/html/RM-B-1.html 14/3 - 18 does not say that enumeration types are eligible for convention C. So, in my opinion, RM does not require the following code to be compilable: type Option_Type is (A, B) with Convention => C; > And your first interfacing convention is much better. IMO. -- Victor Porton - http://portonvictor.org ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Interfacing enums with C 2014-08-17 19:46 ` Victor Porton @ 2014-08-17 19:48 ` Victor Porton 2014-08-17 22:48 ` Peter Chapin 2014-08-18 9:17 ` Simon Wright 1 sibling, 1 reply; 7+ messages in thread From: Victor Porton @ 2014-08-17 19:48 UTC (permalink / raw) Victor Porton wrote: > Simon Wright wrote: >> Victor Porton <porton@narod.ru> writes: >> >>> type Option_Type is (A, B); >>> for Option_Type'Size use Interfaces.C.unsigned'Size; >>> for Option_Type use (A=>1, B=>2); >> >> What's wrong with >> >> type Option_Type is (A, B) >> with Convention => C; >> for Option_Type use (A => 1, B => 2); > > http://www.ada-auth.org/standards/12rm/html/RM-B-1.html 14/3 - 18 > does not say that enumeration types are eligible for convention C. > > So, in my opinion, RM does not require the following code to be > compilable: > > type Option_Type is (A, B) > with Convention => C; > >> And your first interfacing convention is much better. IMO. BTW, I could propose enumeration type to be eligible for Convention C in the next version of Ada RM! -- Victor Porton - http://portonvictor.org ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Interfacing enums with C 2014-08-17 19:48 ` Victor Porton @ 2014-08-17 22:48 ` Peter Chapin 2014-08-18 9:19 ` Simon Wright 0 siblings, 1 reply; 7+ messages in thread From: Peter Chapin @ 2014-08-17 22:48 UTC (permalink / raw) On 2014-08-17 15:48, Victor Porton wrote: >> http://www.ada-auth.org/standards/12rm/html/RM-B-1.html 14/3 - 18 >> does not say that enumeration types are eligible for convention C. >> >> So, in my opinion, RM does not require the following code to be >> compilable: >> >> type Option_Type is (A, B) >> with Convention => C; >> >>> And your first interfacing convention is much better. IMO. > > BTW, I could propose enumeration type to be eligible for Convention C in the > next version of Ada RM! FWIW, GNAT does allow 'Convention => C' for enumeration types. So Simon's suggestion should work with GNAT if you are willing to make use of a GNAT extension. Peter ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Interfacing enums with C 2014-08-17 22:48 ` Peter Chapin @ 2014-08-18 9:19 ` Simon Wright 0 siblings, 0 replies; 7+ messages in thread From: Simon Wright @ 2014-08-18 9:19 UTC (permalink / raw) Peter Chapin <PChapin@vtc.vsc.edu> writes: > On 2014-08-17 15:48, Victor Porton wrote: > >>> http://www.ada-auth.org/standards/12rm/html/RM-B-1.html 14/3 - 18 >>> does not say that enumeration types are eligible for convention C. >>> >>> So, in my opinion, RM does not require the following code to be >>> compilable: >>> >>> type Option_Type is (A, B) >>> with Convention => C; >>> >>>> And your first interfacing convention is much better. IMO. >> >> BTW, I could propose enumeration type to be eligible for Convention C >> in the next version of Ada RM! > > FWIW, GNAT does allow 'Convention => C' for enumeration types. So > Simon's suggestion should work with GNAT if you are willing to make > use of a GNAT extension. Not sure it's precisely an _extension_ so much as a taking-up of an implementation permission. ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Interfacing enums with C 2014-08-17 19:46 ` Victor Porton 2014-08-17 19:48 ` Victor Porton @ 2014-08-18 9:17 ` Simon Wright 1 sibling, 0 replies; 7+ messages in thread From: Simon Wright @ 2014-08-18 9:17 UTC (permalink / raw) Victor Porton <porton@narod.ru> writes: > Simon Wright wrote: >> Victor Porton <porton@narod.ru> writes: >> >>> type Option_Type is (A, B); >>> for Option_Type'Size use Interfaces.C.unsigned'Size; >>> for Option_Type use (A=>1, B=>2); >> >> What's wrong with >> >> type Option_Type is (A, B) >> with Convention => C; >> for Option_Type use (A => 1, B => 2); > > http://www.ada-auth.org/standards/12rm/html/RM-B-1.html 14/3 - 18 > does not say that enumeration types are eligible for convention C. > > So, in my opinion, RM does not require the following code to be compilable: > > type Option_Type is (A, B) > with Convention => C; I don't believe that the ARM requires an implementation to support *any* language conventions other than Ada and Intrinsic. B.1 (20) says that an implementation can permit a type to be compatible with a convention. The GNAT RM chapter on interfacing to C[1] says "Ada enumeration types map to C enumeration types directly if pragma Convention C is specified, which causes them to have int length. Without pragma Convention C, Ada enumeration types map to 8, 16, or 32 bits (i.e. C types signed char, short, int, respectively) depending on the number of values passed. This is the only case in which pragma Convention C affects the representation of an Ada type." This snippet #include <stdio.h> typedef enum { A=1, B=2 } option_type; void f(option_type option) { printf("option: %d\n", (int)option); printf("sizeof option_type: %d\n", sizeof(option_type)); printf("sizeof option: %d\n", sizeof(option)); } void main() { f(A); } with GCC 4.9.0 on Mac OS X (x86_64) prints option: 1 sizeof option_type: 4 sizeof option: 4 so the *GCC* Ada compiler matches the *GCC* C compiler, rather as you might expect. The compiler writers aren't stupid. Apple's clang compiler produces 3 warnings for the snippet above, but produces the same results, so - for enums at least - appears to be compatible with GCC. But there is no guarantee whatsoever that GNAT would be compatible with any other C compiler. [1] https://gcc.gnu.org/onlinedocs/gnat_rm/Interfacing-to-C.html ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2014-08-18 9:19 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2014-08-17 19:02 Interfacing enums with C Victor Porton 2014-08-17 19:39 ` Simon Wright 2014-08-17 19:46 ` Victor Porton 2014-08-17 19:48 ` Victor Porton 2014-08-17 22:48 ` Peter Chapin 2014-08-18 9:19 ` Simon Wright 2014-08-18 9:17 ` Simon Wright
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox