aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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);