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
This commit is contained in:
parent
e0cd6bc009
commit
060ad85254
6 changed files with 72 additions and 0 deletions
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
|
|
14
gcc/testsuite/g++.dg/ext/pr84724-1.C
Normal file
14
gcc/testsuite/g++.dg/ext/pr84724-1.C
Normal file
|
@ -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;
|
||||
}
|
14
gcc/testsuite/g++.dg/ext/pr84724-2.C
Normal file
14
gcc/testsuite/g++.dg/ext/pr84724-2.C
Normal file
|
@ -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;
|
||||
}
|
5
gcc/testsuite/g++.dg/ext/pr84724-3.C
Normal file
5
gcc/testsuite/g++.dg/ext/pr84724-3.C
Normal file
|
@ -0,0 +1,5 @@
|
|||
// PR c++/84724
|
||||
// { dg-do compile }
|
||||
// { dg-options "" }
|
||||
|
||||
int __builtin_trap (); // { dg-error "ambiguates built-in declaration" }
|
Loading…
Add table
Reference in a new issue