aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2016-04-27 11:29:20 +0000
committerNick Clifton <nickc@gcc.gnu.org>2016-04-27 11:29:20 +0000
commit9ec5d66b5daec672f1194f1e15a31a7636915c87 (patch)
treec69639793f1984427b5b0b349f8a3377588e2da7
parent2e885a6f7ce629d6517c2bf8dc14824be8e93987 (diff)
downloadgcc-9ec5d66b5daec672f1194f1e15a31a7636915c87.zip
gcc-9ec5d66b5daec672f1194f1e15a31a7636915c87.tar.gz
gcc-9ec5d66b5daec672f1194f1e15a31a7636915c87.tar.bz2
re PR go/49889 (Calling a function whose name is obscured by a local variable does not produce an error)
PR middle-end/49889 gcc * varasm.c (merge_weak): Generate an error if an attempt is made to convert a non-weak static function into a weak, public function. testsuite * gcc.dg/pr49889.c: New test. From-SVN: r235484
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr49899.c3
-rw-r--r--gcc/varasm.c5
4 files changed, 19 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a12ae4e..ed251d2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2016-04-27 Nick Clifton <nickc@redhat.com>
+
+ PR middle-end/49889
+ * varasm.c (merge_weak): Generate an error if an attempt is made
+ to convert a non-weak static function into a weak, public function.
+
2016-04-27 Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org>
* params.def (MAX_PARTITION_SIZE): New param.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6fd6cfa..4752a4c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-04-27 Nick Clifton <nickc@redhat.com>
+
+ PR middle-end/49889
+ * gcc.dg/pr49889.c: New test.
+
2016-04-27 Bernd Schmidt <bschmidt@redhat.com>
* c-c++-common/memset-array.c: New test.
diff --git a/gcc/testsuite/gcc.dg/pr49899.c b/gcc/testsuite/gcc.dg/pr49899.c
new file mode 100644
index 0000000..b5b3259
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr49899.c
@@ -0,0 +1,3 @@
+static int foo (void) { return 0; } /* { dg-error "weak declaration of 'foo' being applied to a already existing, static definition" } */
+int foo (void) __attribute__((weak));
+
diff --git a/gcc/varasm.c b/gcc/varasm.c
index c7ed06e..4a7124e 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -5371,6 +5371,11 @@ merge_weak (tree newdecl, tree olddecl)
gcc_assert (!TREE_USED (olddecl)
|| !TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (olddecl)));
+ /* PR 49899: You cannot convert a static function into a weak, public function. */
+ if (! TREE_PUBLIC (olddecl) && TREE_PUBLIC (newdecl))
+ error ("weak declaration of %q+D being applied to a already "
+ "existing, static definition", newdecl);
+
if (TARGET_SUPPORTS_WEAK)
{
/* We put the NEWDECL on the weak_decls list at some point.