aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2021-02-10 19:52:37 +0100
committerJakub Jelinek <jakub@redhat.com>2021-02-10 19:52:37 +0100
commit0f39fb7b001df7cdba56cd5c572d0737667acd2c (patch)
tree719196d8ef46d0a5f89607a0580b07b51a0de05e
parent20482cfcc1d3b71e0aec57b5b48685bf0b5402ca (diff)
downloadgcc-0f39fb7b001df7cdba56cd5c572d0737667acd2c.zip
gcc-0f39fb7b001df7cdba56cd5c572d0737667acd2c.tar.gz
gcc-0f39fb7b001df7cdba56cd5c572d0737667acd2c.tar.bz2
varasm: Fix ICE with -fsyntax-only [PR99035]
My FE change from 2 years ago uses TREE_ASM_WRITTEN in -fsyntax-only mode more aggressively to avoid "expanding" functions multiple times. With -fsyntax-only nothing is really expanded, so I think it is acceptable to adjust the assert and allow declare_weak at any time, with -fsyntax-only we know it is during parsing only anyway. 2021-02-10 Jakub Jelinek <jakub@redhat.com> PR c++/99035 * varasm.c (declare_weak): For -fsyntax-only, allow even TREE_ASM_WRITTEN function decls. * g++.dg/ext/weak6.C: New test.
-rw-r--r--gcc/testsuite/g++.dg/ext/weak6.C8
-rw-r--r--gcc/varasm.c7
2 files changed, 14 insertions, 1 deletions
diff --git a/gcc/testsuite/g++.dg/ext/weak6.C b/gcc/testsuite/g++.dg/ext/weak6.C
new file mode 100644
index 0000000..e9a70ee
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/weak6.C
@@ -0,0 +1,8 @@
+// PR c++/99035
+// { dg-do compile }
+// { dg-require-weak "" }
+// { dg-options "-fsyntax-only" }
+
+extern void * foo (void);
+void * foo (void) { return (void *)foo; }
+#pragma weak foo
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 21be03a..29478ab 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -5927,7 +5927,12 @@ merge_weak (tree newdecl, tree olddecl)
void
declare_weak (tree decl)
{
- gcc_assert (TREE_CODE (decl) != FUNCTION_DECL || !TREE_ASM_WRITTEN (decl));
+ /* With -fsyntax-only, TREE_ASM_WRITTEN might be set on certain function
+ decls earlier than normally, but as with -fsyntax-only nothing is really
+ emitted, there is no harm in marking it weak later. */
+ gcc_assert (TREE_CODE (decl) != FUNCTION_DECL
+ || !TREE_ASM_WRITTEN (decl)
+ || flag_syntax_only);
if (! TREE_PUBLIC (decl))
{
error ("weak declaration of %q+D must be public", decl);