diff options
author | Jakub Jelinek <jakub@redhat.com> | 2021-02-10 19:52:37 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2021-02-10 19:52:37 +0100 |
commit | 0f39fb7b001df7cdba56cd5c572d0737667acd2c (patch) | |
tree | 719196d8ef46d0a5f89607a0580b07b51a0de05e | |
parent | 20482cfcc1d3b71e0aec57b5b48685bf0b5402ca (diff) | |
download | gcc-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.C | 8 | ||||
-rw-r--r-- | gcc/varasm.c | 7 |
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); |