diff options
author | Dodji Seketeli <dodji@redhat.com> | 2009-10-26 14:40:16 +0000 |
---|---|---|
committer | Dodji Seketeli <dodji@gcc.gnu.org> | 2009-10-26 15:40:16 +0100 |
commit | a0ff8620961065711c1edb1cb7bf4c86c8408d99 (patch) | |
tree | 42b95bdcca80aad4970085d2f4e91ef0cdb1a73d | |
parent | 842809179e1d2fbf0a2af44e6e3f445770613bc6 (diff) | |
download | gcc-a0ff8620961065711c1edb1cb7bf4c86c8408d99.zip gcc-a0ff8620961065711c1edb1cb7bf4c86c8408d99.tar.gz gcc-a0ff8620961065711c1edb1cb7bf4c86c8408d99.tar.bz2 |
re PR c++/41020 (Can't declare an extern "C" friend of a builtin function)
Fix PR c++/41020
gcc/cp/ChangeLog:
PR c++/41020
* decl.c (decls_match): Use DECL_IS_BUILTIN instead of
DECL_BUILT_IN.
gcc/testsuite/ChangeLog:
PR c++/41020
* g++.dg/lookup/extern-c-redecl2.C: New test.
* g++.dg/lookup/extern-c-redecl3.C: Likewise.
* g++.dg/lookup/extern-c-redecl4.C: Likewise.
* g++.dg/lookup/extern-c-redecl5.C: Likewise.
From-SVN: r153552
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lookup/extern-c-redecl2.C | 21 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lookup/extern-c-redecl3.C | 22 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lookup/extern-c-redecl4.C | 19 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lookup/extern-c-redecl5.C | 18 |
7 files changed, 95 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3ce735b..467f078 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2009-10-26 Dodji Seketeli <dodji@redhat.com> + + PR c++/41020 + * decl.c (decls_match): Use DECL_IS_BUILTIN instead of + DECL_BUILT_IN. + 2009-10-23 Dodji Seketeli <dodji@redhat.com> PR c++/40808 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 5eb389f..c772ca5 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -935,7 +935,7 @@ decls_match (tree newdecl, tree olddecl) #ifdef NO_IMPLICIT_EXTERN_C /* A new declaration doesn't match a built-in one unless it is also extern "C". */ - if (DECL_BUILT_IN (olddecl) + if (DECL_IS_BUILTIN (olddecl) && DECL_EXTERN_C_P (olddecl) && !DECL_EXTERN_C_P (newdecl)) return 0; #endif diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0b33f98..e6e9250 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2009-10-26 Dodji Seketeli <dodji@redhat.com> + + PR c++/41020 + * g++.dg/lookup/extern-c-redecl2.C: New test. + * g++.dg/lookup/extern-c-redecl3.C: Likewise. + * g++.dg/lookup/extern-c-redecl4.C: Likewise. + * g++.dg/lookup/extern-c-redecl5.C: Likewise. + 2009-10-26 Michael Matz <matz@suse.de> PR tree-optimization/41783 diff --git a/gcc/testsuite/g++.dg/lookup/extern-c-redecl2.C b/gcc/testsuite/g++.dg/lookup/extern-c-redecl2.C new file mode 100644 index 0000000..055148f --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/extern-c-redecl2.C @@ -0,0 +1,21 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/41020 +// { dg-do compile } + +extern "C" +{ + int fork (void); +} + +class frok +{ + int this_errno; + friend int fork (void); +}; + +extern "C" int +fork (void) +{ + frok grouped; + return grouped.this_errno; +} diff --git a/gcc/testsuite/g++.dg/lookup/extern-c-redecl3.C b/gcc/testsuite/g++.dg/lookup/extern-c-redecl3.C new file mode 100644 index 0000000..00ff4a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/extern-c-redecl3.C @@ -0,0 +1,22 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/41020 +// { dg-do compile } +// { dg-final { scan-assembler-not "call\[\t \]+_Z4forkv" } } +// { dg-final { scan-assembler "call\[\t \]+fork" } } + +extern "C" int fork (void); + +void +foo () +{ + extern int fork (void); + fork (); +} + +extern "C" +int +fork (void) +{ + return 0; +} + diff --git a/gcc/testsuite/g++.dg/lookup/extern-c-redecl4.C b/gcc/testsuite/g++.dg/lookup/extern-c-redecl4.C new file mode 100644 index 0000000..9dfa54d --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/extern-c-redecl4.C @@ -0,0 +1,19 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/41020 + +// Avoid the "-ansi -pedantic" option +// { dg-options "" } +// { dg-do compile } +// { dg-final { scan-assembler "call\[\t \]+_Z4forkv" } } + +class frok +{ + int this_errno; + friend int fork (void); +}; + +void +foo () +{ + fork (); +} diff --git a/gcc/testsuite/g++.dg/lookup/extern-c-redecl5.C b/gcc/testsuite/g++.dg/lookup/extern-c-redecl5.C new file mode 100644 index 0000000..031059f --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/extern-c-redecl5.C @@ -0,0 +1,18 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/41020 +// { dg-do compile } + + +class frok +{ + int this_errno; + friend int fork (void); // { dg-error "previous declaration .*?C++. linkage" } +}; + +extern "C" int +fork (void) // { dg-error "conflicts with new declaration .*?C. linkage" }} +{ + frok grouped; + return grouped.this_errno; +} + |