[Bug c++/57699] New: Disable empty parameter list misinterpretation in libstdc++ headers when !defined(NO_IMPLICIT_EXTERN_C)
redi at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Mon Jun 24 12:12:00 GMT 2013
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57699
Bug ID: 57699
Summary: Disable empty parameter list misinterpretation in
libstdc++ headers when !defined(NO_IMPLICIT_EXTERN_C)
Product: gcc
Version: 4.9.0
Status: UNCONFIRMED
Severity: enhancement
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: redi at gcc dot gnu.org
In cp/parser.c the function cp_parser_parameter_declaration_clause has:
else if (token->type == CPP_CLOSE_PAREN)
/* There are no parameters. */
{
#ifndef NO_IMPLICIT_EXTERN_C
if (in_system_header && current_class_type == NULL
&& current_lang_name == lang_name_c)
return NULL_TREE;
else
#endif
return void_list_node;
}
This means that on "implicit extern C" systems (ones not known to have C++
compatible libc headers) we interpret void(*)() as void(*)(...)
This might be necessary to properly handle libc headers on those systems, but
should not be enabled for libstdc++ headers (or more generally, any headers
actually written in C++) because when we write void(*)() in C++ we damn well
mean what we wrote, we shouldn't have to say void(*)(void)
This has caused problems more than once in libstdc++, where correct C++ code in
an explicit extern "C" block is misinterpreted by the front end, because
libstdc++ headers are system headers (due to the #pragma we use) and we
sometimes have to declare functions in extern "C" blocks. The problems are not
found immediately because they only happen on less-tested targets such as AIX
and eCos:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57691
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50982#c40
It would be nice to have some way to mark libstdc++ headers to prevent the code
above returning NULL_TREE.
More information about the Gcc-bugs
mailing list