The polymorphic C front-end (i.e. macros) can be bypassed by talking a
pointer to the underlying function [1].  This is the desired behavior for
backward compatibility.  I agree that this could be surprising to users and
it must be clearly documented.

In the case where the user is not bypassing the C polymorphic front-end and
the compiler does not support _Generic, we can either detect or prevent
silent truncation using one of the approaches that I posted.

 ~Jim.

[1] The C preprocessor only invokes a function-like macro if the macro name
is followed by (.  So, &MPI_Send takes the pointer of the function even
though there is a function-like macro with the same name.

On Thu, Aug 8, 2019 at 6:51 AM HOLMES Daniel <d.hol...@epcc.ed.ac.uk> wrote:

> Hi Jim,
>
> Are we sure the function pointer “worked" in your example? It silently
> truncated the large value, because the function pointer bypasses the
> redirection macro.
>
> Cheers,
> Dan.
> —
> Dr Daniel Holmes PhD
> Architect (HPC Research)
> d.hol...@epcc.ed.ac.uk
> Phone: +44 (0) 131 651 3465
> Mobile: +44 (0) 7940 524 088
> Address: Room 2.09, Bayes Centre, 47 Potterrow, Central Area, Edinburgh,
> EH8 9BT
> —
> The University of Edinburgh is a charitable body, registered in Scotland,
> with registration number SC005336.
> —
>
> On 7 Aug 2019, at 22:00, Jim Dinan via mpi-forum <
> mpi-forum@lists.mpi-forum.org> wrote:
>
> Even simpler than this, we could just forward all calls to the MPI_Count
> interface (see below).  The int count argument should type convert to
> MPI_Count without issue.  Note that it still needs to be a function-like
> macro so that function pointers work.
>
> Don't give up yet!  :D
>
>  ~Jim.
>
> #include <stdio.h>
>
>
> typedef int MPI_Datatype;
> typedef int MPI_Comm;
>
> int MPI_Send(const void* buf, int count, MPI_Datatype datatype, int dest,
>              int tag, MPI_Comm comm)
> {
>     printf("MPI_Send(count = %d)\n", count);
>     return 0;
> }
>
> int MPI_Send_x(const void* buf, long long count, MPI_Datatype datatype,
> int dest,
>                int tag, MPI_Comm comm)
> {
>     printf("MPI_Send_x(count = %lld)\n", count);
>     return 0;
> }
>
> #define MPI_Send(buf, count, datatype, dest, tag, comm) MPI_Send_x(buf,
> count, datatype, dest, tag, comm)
>
> int main(int argc, char *argv[]) {
>     /* 8589934592LL == 2^33 */
>     long long i = 8589934592LL + 11;
>     int ret;
>     int (*snd_ptr)(const void*, int, MPI_Datatype, int, int, MPI_Comm) =
> &MPI_Send;
>     ret = MPI_Send(NULL, i, 0, 0, 0, 0);
>     ret = MPI_Send(NULL, 5, 0, 0, 0, 0);
>     ret = (*snd_ptr)(NULL, i, 0, 0, 0, 0);
>     ret = (*snd_ptr)(NULL, 5, 0, 0, 0, 0);
>     return 0;
>
> }
>
> MPI_Send_x(count = 8589934603)
> MPI_Send_x(count = 5)
> MPI_Send(count = 11)
>
> MPI_Send(count = 5)
> _______________________________________________
> mpi-forum mailing list
> mpi-forum@lists.mpi-forum.org
> https://lists.mpi-forum.org/mailman/listinfo/mpi-forum
>
>
>
_______________________________________________
mpi-forum mailing list
mpi-forum@lists.mpi-forum.org
https://lists.mpi-forum.org/mailman/listinfo/mpi-forum

Reply via email to