From 0f39fb7b001df7cdba56cd5c572d0737667acd2c Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 10 Feb 2021 19:52:37 +0100 Subject: [PATCH] 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. --- gcc/testsuite/g++.dg/ext/weak6.C | 8 ++++++++ gcc/varasm.c | 7 ++++++- 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/ext/weak6.C 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); -- 2.7.4