C++ PATCH for c++/69657 (abs not inlined)

Rainer Orth ro@CeBiTec.Uni-Bielefeld.DE
Tue Feb 9 20:29:00 GMT 2016


Jason Merrill <jason@redhat.com> writes:

> The issue in this bug was that due to changes in the libstdc++ headers, the
> built-in abs declaration was getting hidden by a using-declaration, so that
> then when the built-in got an explicit declaration, the original
> declaration wasn't there anymore and so the new declaration didn't get
> marked as built-in.
>
> Fixed by overloading an anticipated built-in rather than clobbering it when
> we see a using-declaration of the same name.
>
> Tested x86_64-pc-linux-gnu, applying to trunk.

This patch broke Solaris bootstrap (seen on i386-pc-solaris2.12):

/var/gcc/reghunt/trunk/gcc/c-family/c-lex.c: In function 'c_fileinfo* get_fileinfo(const char*)':
/var/gcc/reghunt/trunk/gcc/c-family/c-lex.c:102:62: error: overloaded function with no contextual type information
     file_info_tree = splay_tree_new ((splay_tree_compare_fn) strcmp,
                                                              ^~~~~~
/var/gcc/reghunt/trunk/gcc/c-family/c-lex.c:104:39: error: overloaded function with no contextual type information
          (splay_tree_delete_value_fn) free);
                                       ^~~~
make[3]: *** [c-family/c-lex.o] Error 1

Comparing c-lex.ii before and after the patch, I see that they differ
like this:

-# 508 "/var/gcc/reghunt/trunk/gcc/system.h"
+# 452 "/var/gcc/reghunt/trunk/gcc/system.h"
+extern void free (void *);
+# 496 "/var/gcc/reghunt/trunk/gcc/system.h"
+extern void *malloc (size_t);
+
+
+
+extern void *calloc (size_t, size_t);
+
+
+
+extern void *realloc (void *, size_t);
+
+
+
 }

and indeed auto-host.h changed:

--- /var/gcc/reghunt/of-no-cti/28675/gcc/auto-host.h    2016-02-09 19:53:23.6030
78417 +0100
+++ auto-host.h 2016-02-09 20:28:39.946901958 +0100
@@ -743 +743 @@
-#define HAVE_DECL_CALLOC 1
+#define HAVE_DECL_CALLOC 0
@@ -846 +846 @@
-#define HAVE_DECL_FREE 1
+#define HAVE_DECL_FREE 0
@@ -937 +937 @@
-#define HAVE_DECL_MALLOC 1
+#define HAVE_DECL_MALLOC 0
@@ -958 +958 @@
-#define HAVE_DECL_REALLOC 1
+#define HAVE_DECL_REALLOC 0

The calloc configure test now fails like this:

conftest.cpp: In function 'int main()':
conftest.cpp:150:28: error: overloaded function with no contextual type information
 char *(*pfn) = (char *(*)) calloc ;
                            ^~~~~~

The test boils down to

typedef unsigned int size_t;
namespace std {
extern void *calloc(size_t, size_t);
}
using std::calloc;
int
main ()
{
  char *(*pfn) = (char *(*)) calloc ;
  return 0;
}

	Rainer

-- 
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University



More information about the Gcc-patches mailing list