PGIncompatible prototype declaration for function lio_listio

Hi,

I can not compile a file where I manually include the lio_listio prototype, even though its the same as the one from the aio.h header:

$ pgcc -V

pgcc 18.10-1 64-bit target on x86-64 Linux -tp haswell 
PGI Compilers and Tools
Copyright (c) 2018, NVIDIA CORPORATION.  All rights reserved.
$ $ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.4.0-2ubuntu1~18.04~ppa1' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 7.4.0 (Ubuntu 7.4.0-2ubuntu1~18.04~ppa1) 

$ cat >test-aio.c <<EOF
#include <aio.h>
EOF
$ pgcc -c test-aio.c
$ pgcc -E test-aio.c >test-aio.i
$ cat >>test-aio.c <<EOF
extern int lio_listio ( int __mode ,
		       struct aiocb \* const __list [ restrict ] ,
		       int __nent , struct sigevent \* __restrict __sig )
   ;
EOF
$ pgcc -c test-aio.c
PGC-S-0137-Incompatible prototype declaration for function lio_listio (test-aio.c: 5)
PGC/x86-64 Linux 18.10-1: compilation completed with severe errors

What am I doing wrong here?

Thanks.

Bert

Hi Bert,

Interesting. It looks like the use of “restrict” within the square brackets is somehow causing the compiler to see these as two different prototypes. If I remove the “restrict” from both the aio.h and your second definition, then it compiles fine.

I added a problem report (TPR#26692) and sent it to our engineers for further review.

Note that there’s a good chance that we wont fix this. The reason is that we’re moving towards using our C++ compiler, in C compatible mode (pgc++ --c), as our main C compiler on Linux. Compiling with “pgc++ --c” will compile the code as is. Granted, you’ll see is as being fixed since the old C only compiler will no longer be used.

% cat test-aio.c
#include <aio.h>
extern int lio_listio ( int __mode ,
                       struct aiocb * const __list [ restrict ] ,
                       int __nent , struct sigevent * __restrict __sig )
   ;
% pgcc -c test-aio.c
PGC-S-0137-Incompatible prototype declaration for function lio_listio (test-aio.c: 5)
% pgc++ --c -c test-aio.c
%

As a work-around, can you try using “pgc++ --c” instead?

-Mat

Dear Mat,

haven’t tried “pgc++ --c” on the package itself, but I find it rather hard to communicate this to the users of the package, that they should use ‘pgc++ --c’ instead of ‘pgcc’. You know, they don’t read documentation and I also can’t inject a meaningful hint when this error is issued. Thus I don’t see a need to follow this rout at all.

Thanks.

Bert[/quote]

Ok. 19.1’s pgcc will be equivalent to “pgc++ --c” so you wont need to reconfigure anything in your package.

For 18.10 though, this would be the work around.

-Mat

Dear Mat,

thanks for the heads-up.

Best,

This should work with pgcc in 20.1, or for earlier version try pgcc18