aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2018-03-09 19:01:22 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2018-03-09 19:01:22 +0100
commit060ad85254de126c82bdbfbf6af603701ccf503c (patch)
treebba1401709b780137f4b983f7472833883788a05 /gcc
parente0cd6bc00966de0a3a77b642f9507d9c83b398f1 (diff)
downloadgcc-060ad85254de126c82bdbfbf6af603701ccf503c.zip
gcc-060ad85254de126c82bdbfbf6af603701ccf503c.tar.gz
gcc-060ad85254de126c82bdbfbf6af603701ccf503c.tar.bz2
re PR c++/84724 (internal compiler error: in single_succ_edge, at basic-block.h:339 with a declaration of __builtin_trap)
PR c++/84724 * decl.c (duplicate_decls): Don't override __* prefixed builtins except for __[^b]*_chk, instead issue permerror and for -fpermissive also a note and return olddecl. * g++.dg/ext/pr84724.C: New test. From-SVN: r258391
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/decl.c27
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/ext/pr84724-1.C14
-rw-r--r--gcc/testsuite/g++.dg/ext/pr84724-2.C14
-rw-r--r--gcc/testsuite/g++.dg/ext/pr84724-3.C5
6 files changed, 72 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index eeaf71d..ae980fd 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2018-03-09 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/84724
+ * decl.c (duplicate_decls): Don't override __* prefixed builtins
+ except for __[^b]*_chk, instead issue permerror and for -fpermissive
+ also a note and return olddecl.
+
2018-03-09 Nathan Sidwell <nathan@acm.org>
PR c++/84733
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index b2e19a6..afd04ce 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -1566,6 +1566,33 @@ next_arg:;
|| compparms (TYPE_ARG_TYPES (TREE_TYPE (newdecl)),
TYPE_ARG_TYPES (TREE_TYPE (olddecl))))
{
+ /* Don't really override olddecl for __* prefixed builtins
+ except for __[^b]*_chk, the compiler might be using those
+ explicitly. */
+ if (DECL_BUILT_IN (olddecl))
+ {
+ tree id = DECL_NAME (olddecl);
+ const char *name = IDENTIFIER_POINTER (id);
+ size_t len;
+
+ if (name[0] == '_'
+ && name[1] == '_'
+ && (strncmp (name + 2, "builtin_",
+ strlen ("builtin_")) == 0
+ || (len = strlen (name)) <= strlen ("___chk")
+ || memcmp (name + len - strlen ("_chk"),
+ "_chk", strlen ("_chk") + 1) != 0))
+ {
+ if (permerror (DECL_SOURCE_LOCATION (newdecl),
+ "new declaration %q#D ambiguates built-in"
+ " declaration %q#D", newdecl, olddecl)
+ && flag_permissive)
+ inform (DECL_SOURCE_LOCATION (newdecl),
+ "ignoring the %q#D declaration", newdecl);
+ return olddecl;
+ }
+ }
+
/* A near match; override the builtin. */
if (TREE_PUBLIC (newdecl))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f9c6b6d..b03f7e6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-03-09 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/84724
+ * g++.dg/ext/pr84724.C: New test.
+
2018-03-09 Vladimir Makarov <vmakarov@redhat.com>
PR target/83712
diff --git a/gcc/testsuite/g++.dg/ext/pr84724-1.C b/gcc/testsuite/g++.dg/ext/pr84724-1.C
new file mode 100644
index 0000000..9f03a29
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/pr84724-1.C
@@ -0,0 +1,14 @@
+// PR c++/84724
+// { dg-do compile }
+// { dg-options "-O3 -fpermissive" }
+
+int __builtin_trap (); // { dg-warning "ambiguates built-in declaration" }
+ // { dg-message "ignoring the 'int __builtin_trap\\(\\)' declaration" "" { target *-*-* } .-1 }
+
+int
+foo ()
+{
+ int b;
+ int c (&b); // { dg-warning "invalid conversion from" }
+ return b %= b ? c : 0;
+}
diff --git a/gcc/testsuite/g++.dg/ext/pr84724-2.C b/gcc/testsuite/g++.dg/ext/pr84724-2.C
new file mode 100644
index 0000000..de69425
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/pr84724-2.C
@@ -0,0 +1,14 @@
+// PR c++/84724
+// { dg-do compile }
+// { dg-options "-O3 -fpermissive -w" }
+
+int __builtin_trap (); // { dg-bogus "ambiguates built-in declaration" }
+ // { dg-bogus "ignoring the 'int __builtin_trap\\(\\)' declaration" "" { target *-*-* } .-1 }
+
+int
+foo ()
+{
+ int b;
+ int c (&b); // { dg-bogus "invalid conversion from" }
+ return b %= b ? c : 0;
+}
diff --git a/gcc/testsuite/g++.dg/ext/pr84724-3.C b/gcc/testsuite/g++.dg/ext/pr84724-3.C
new file mode 100644
index 0000000..0cd8cce
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/pr84724-3.C
@@ -0,0 +1,5 @@
+// PR c++/84724
+// { dg-do compile }
+// { dg-options "" }
+
+int __builtin_trap (); // { dg-error "ambiguates built-in declaration" }