Обсуждение: Issue with mkdtemp() in port.h

Поиск
Список
Период
Сортировка

Issue with mkdtemp() in port.h

От
Caleb Welton
Дата:
A little while back some users started complaining that the contrib module I develop (MADlib) was failing to build with the following error:

------
/usr/include/postgresql/9.2/server/port.h:480:32: error: declaration of 'char* mkdtemp(char*)' has a different exception specifier
/usr/include/stdlib.h:663:14: error: from previous declaration 'char* mkdtemp(char*) throw ()'
------

After some research I've tracked this down to the following commit from ~4 months ago: 

------
------


Which added a definition of mkdtemp into port.h that conflicts with the definition in the system header files.

The following is a simple program that demonstrates the issue:

------
bash$ cat /tmp/foo.cpp
#include "postgres.h"
int main() { return 0; }

bash$ gcc -o foo foo.cpp -I`pg_config --includedir-server` -pedantic
In file included from /usr/pgsql-9.2/include/server/c.h:860,
                 from /usr/pgsql-9.2/include/server/postgres.h:47,
                 from foo.cpp:1:
/usr/pgsql-9.2/include/server/port.h:479: error: declaration of ‘char* mkdtemp(char*)’ throws different exceptions
/usr/include/stdlib.h:663: error: from previous declaration ‘char* mkdtemp(char*) throw ()’
------

Reproducible on ubuntu 14.04, centos6, and likely others.

Regards,
  Caleb



Re: Issue with mkdtemp() in port.h

От
Tom Lane
Дата:
Caleb Welton <cwelton@pivotal.io> writes:
> A little while back some users started complaining that the contrib module
> I develop (MADlib) was failing to build with the following error:
> /usr/include/postgresql/9.2/server/port.h:480:32: error: declaration of
> 'char* mkdtemp(char*)' has a different exception specifier
> /usr/include/stdlib.h:663:14: error: from previous declaration 'char*
> mkdtemp(char*) throw ()'
> After some research I've tracked this down to the following commit from ~4
> months ago:
> https://github.com/postgres/postgres/commit/a919937f112eb2f548d5f9bd1b3a7298375e6380

Hm.  Looks like the extern that added should have been protected by    #ifndef HAVE_MKDTEMP
similarly to the other cases where we conditionally provide a substitute
function.
        regards, tom lane