summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormpolacek <mpolacek@138bc75d-0d04-0410-961f-82ee72b054a4>2015-08-25 20:28:59 +0000
committermpolacek <mpolacek@138bc75d-0d04-0410-961f-82ee72b054a4>2015-08-25 20:28:59 +0000
commit9e6bcade584171839b8e1d11babd2c49fd1611cb (patch)
tree06eefc14c8475e442a71d5919bce7072a7d7e3b2
parent39ba392ee7454657526c4e9d4adcb1c225b8ffed (diff)
downloadgcc-9e6bcade584171839b8e1d11babd2c49fd1611cb.tar.gz
PR middle-end/67330
* varasm.c (declare_weak): Return after giving an error. * c-common.c (handle_weak_attribute): Don't check whether the visibility can be changed here. * gcc.dg/weak/weak-18.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@227190 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/c-family/ChangeLog6
-rw-r--r--gcc/c-family/c-common.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/weak/weak-18.c9
-rw-r--r--gcc/varasm.c5
6 files changed, 30 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c79fb4870f7..fd4ade37af3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2015-08-25 Marek Polacek <polacek@redhat.com>
+
+ PR middle-end/67330
+ * varasm.c (declare_weak): Return after giving an error.
+
2015-08-25 David Malcolm <dmalcolm@redhat.com>
* gcc-main.c (main): Add params to driver ctor.
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index 2a5758aac59..8b4009e85fd 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,3 +1,9 @@
+2015-08-25 Marek Polacek <polacek@redhat.com>
+
+ PR middle-end/67330
+ * c-common.c (handle_weak_attribute): Don't check whether the
+ visibility can be changed here.
+
2015-08-22 Manuel López-Ibáñez <manu@gcc.gnu.org>
* c-lex.c (c_lex_with_flags): Use explicit locations.
diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
index ff502e56dbb..7691035c7f8 100644
--- a/gcc/c-family/c-common.c
+++ b/gcc/c-family/c-common.c
@@ -8328,12 +8328,7 @@ handle_weak_attribute (tree *node, tree name,
return NULL_TREE;
}
else if (VAR_OR_FUNCTION_DECL_P (*node))
- {
- struct symtab_node *n = symtab_node::get (*node);
- if (n && n->refuse_visibility_changes)
- error ("%+D declared weak after being used", *node);
- declare_weak (*node);
- }
+ declare_weak (*node);
else
warning (OPT_Wattributes, "%qE attribute ignored", name);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7deb14776ca..e8365be37f0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-08-25 Marek Polacek <polacek@redhat.com>
+
+ PR middle-end/67330
+ * gcc.dg/weak/weak-18.c: New test.
+
2015-08-25 David Malcolm <dmalcolm@redhat.com>
* jit.dg/test-error-pr63969-missing-driver.c: Add call to
diff --git a/gcc/testsuite/gcc.dg/weak/weak-18.c b/gcc/testsuite/gcc.dg/weak/weak-18.c
new file mode 100644
index 00000000000..ebeb4d5ba8a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/weak/weak-18.c
@@ -0,0 +1,9 @@
+/* PR middle-end/67330 */
+/* { dg-do compile } */
+/* { dg-require-weak "" } */
+
+void
+f (void)
+{
+ __attribute__ ((weak)) int a; /* { dg-error "weak declaration of .a. must be public" } */
+}
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 7fa2e7be8e4..d9290a17cbb 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -5403,7 +5403,10 @@ declare_weak (tree decl)
{
gcc_assert (TREE_CODE (decl) != FUNCTION_DECL || !TREE_ASM_WRITTEN (decl));
if (! TREE_PUBLIC (decl))
- error ("weak declaration of %q+D must be public", decl);
+ {
+ error ("weak declaration of %q+D must be public", decl);
+ return;
+ }
else if (!TARGET_SUPPORTS_WEAK)
warning (0, "weak declaration of %q+D not supported", decl);