Hi,

Thomas Schwinge wrote:
So, first item: what do we do with the untyped 'gomp_malloc' etc.?
'libgomp/libgomp.h':
     extern void *gomp_malloc (size_t) __attribute__((malloc));
...
In other words, we'll need some kind of type casting at each call site:
I could already in the C implementation make that:

     plock = (gomp_mutex_t *) gomp_malloc (sizeof (gomp_mutex_t));
..., or (preferably?):
     plock = (typeof (plock)) gomp_malloc (sizeof (gomp_mutex_t));

well, while 'typeof' is C23, 'decltype' is C++11 while __typeof__ works
as compiler extension with both GCC's C and C++ compiler.

An alternative to the explicit cast would be what we do inside GCC itself,
namely to use a macro:

libiberty.h:#define XCNEW(T)            ((T *) xcalloc (1, sizeof (T)))
libiberty.h:#define XCNEWVEC(T, N)              ((T *) xcalloc ((N), sizeof 
(T)))
libiberty.h:#define XCNEWVAR(T, S)              ((T *) xcalloc (1, (S)))

which could be used as is – or with T on the RHS replaced by
__typeof__(T) which then works with both type names and variable names.

Such changes could go in already now, in the C code.  However, I assume
that we'd eventually like this to be proper C++:

     plock = static_cast<decltype(plock)>(gomp_malloc (sizeof (gomp_mutex_t)));

I think one can discuss whether '(T)' is also proper C++ or only 
'static_cast<T>'.

(the static_case one makes it longer and hence less readable but is more
explicit and C++-ize.)

* * *

In the external header files ('omp.h', 'openacc.h', etc.), I guess we'll
just continue to use C-style casts for C/C++ compatibility, or some:

     #ifdef __cplusplus
     # define STATIC_CAST(T, x) static_cast<T>(x)
     #else
     # define STATIC_CAST(T, x) ((T) (x))
     #endif

Why do you need to touch the external files at all? Those should already
be working with both C and C++? (BTW: There is some C++ only code in omp.h
as std::allocator replacement.)

And for casts, you don't even get something better by using static_cast
via a macro. - I see the argument of using it with explicitly written
code but here?

And when later moving to static_cast<...>(...) as cleanup, you need to
touch all call sides already you might need to adjust indentation anyway.

* * *

For a step-wise conversion, I think either using a macro version, similar
to libiberty.h or using the C-style cast makes sense.

And later, we can still decide whether doing style changes, but I think
this cast is not really the most important change for clarity, type safety
or similar reasons.

Tobias

Reply via email to