diff options
author | Jakub Jelinek <jakub@redhat.com> | 2018-03-13 21:32:54 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2018-03-13 21:32:54 +0100 |
commit | 949aab190a4ff95d4ba71f55e8b77a2aae61457f (patch) | |
tree | aaefa77979ee497fff804571c13117c3c433a5f5 | |
parent | 515f874faf45628b1b86da81964f2049f7406326 (diff) | |
download | gcc-949aab190a4ff95d4ba71f55e8b77a2aae61457f.zip gcc-949aab190a4ff95d4ba71f55e8b77a2aae61457f.tar.gz gcc-949aab190a4ff95d4ba71f55e8b77a2aae61457f.tar.bz2 |
re PR c++/84843 (C++ ICE on builtin redefinition since r258391)
PR c++/84843
* decl.c (duplicate_decls): For redefinition of built-in, use error
and return error_mark_node. For redeclaration, return error_mark_node
rather than olddecl if !flag_permissive.
* g++.dg/ext/pr84843-1.C: New test.
* g++.dg/ext/pr84843-2.C: New test.
From-SVN: r258503
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/decl.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/pr84843-1.C | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/pr84843-2.C | 9 |
5 files changed, 39 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index da81495..09dc2b1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2018-03-13 Jakub Jelinek <jakub@redhat.com> + + PR c++/84843 + * decl.c (duplicate_decls): For redefinition of built-in, use error + and return error_mark_node. For redeclaration, return error_mark_node + rather than olddecl if !flag_permissive. + 2018-03-13 Jason Merrill <jason@redhat.com> PR c++/82565 - ICE with concepts and generic lambda. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index afd04ce..ff6dd66 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -1583,13 +1583,20 @@ next_arg:; || memcmp (name + len - strlen ("_chk"), "_chk", strlen ("_chk") + 1) != 0)) { + if (DECL_INITIAL (newdecl)) + { + error_at (DECL_SOURCE_LOCATION (newdecl), + "definition of %q#D ambiguates built-in " + "declaration %q#D", newdecl, olddecl); + return error_mark_node; + } 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; + return flag_permissive ? olddecl : error_mark_node; } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c518ebe..a06dc24 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-03-13 Jakub Jelinek <jakub@redhat.com> + + PR c++/84843 + * g++.dg/ext/pr84843-1.C: New test. + * g++.dg/ext/pr84843-2.C: New test. + 2018-03-13 David Pagan <dave.pagan@oracle.com> PR c/46921 diff --git a/gcc/testsuite/g++.dg/ext/pr84843-1.C b/gcc/testsuite/g++.dg/ext/pr84843-1.C new file mode 100644 index 0000000..050d3e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pr84843-1.C @@ -0,0 +1,9 @@ +// PR c++/84843 +// { dg-do compile } +// { dg-options "-fpermissive" } + +extern "C" int +__atomic_compare_exchange (int x, int y) // { dg-error "ambiguates built-in declaration" } +{ + return x + y; +} diff --git a/gcc/testsuite/g++.dg/ext/pr84843-2.C b/gcc/testsuite/g++.dg/ext/pr84843-2.C new file mode 100644 index 0000000..adf92fa --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pr84843-2.C @@ -0,0 +1,9 @@ +// PR c++/84843 +// { dg-do compile } +// { dg-options "" } + +extern "C" int +__atomic_compare_exchange (int x, int y) // { dg-error "ambiguates built-in declaration" } +{ + return x + y; +} |