From: Jakub Jelinek Date: Wed, 10 Feb 2021 18:52:37 +0000 (+0100) Subject: varasm: Fix ICE with -fsyntax-only [PR99035] X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0f39fb7b001df7cdba56cd5c572d0737667acd2c;p=gcc.git 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 PR c++/99035 * varasm.c (declare_weak): For -fsyntax-only, allow even TREE_ASM_WRITTEN function decls. * g++.dg/ext/weak6.C: New test. --- diff --git a/gcc/testsuite/g++.dg/ext/weak6.C b/gcc/testsuite/g++.dg/ext/weak6.C new file mode 100644 index 00000000000..e9a70ee0dad --- /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 21be03aeba2..29478ab0d8d 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);