From 978b62e554ffb4b34844c72d259ce71fcbd87591 Mon Sep 17 00:00:00 2001
From: Jakub Jelinek <jakub@redhat.com>
Date: Tue, 18 May 2021 10:10:17 +0200
Subject: [PATCH] function: Set dummy DECL_ASSEMBLER_NAME in
 push_dummy_function [PR100580]

Last year I've added cgraph_node::get_create calls for the dummy
functions used for -fdump-passes, so that it interacts well with pass
disabling/enabling which is cgraph uid based.
Unfortunately, as the following testcase shows, when assembler hash
is present, that wants to compute DECL_ASSEMBLER_NAME and the C++ FE
is unprepared to handle it on the dummy functions which don't have
DECL_NAME etc.
The following patch fixes it by setting up a dummy DECL_ASSEMBLER_NAME
on these, so that the FEs don't need to compute it.

2021-05-18  Jakub Jelinek  <jakub@redhat.com>

	PR c++/100580
	* function.c (push_dummy_function): Set DECL_ARTIFICIAL and
	DECL_ASSEMBLER_NAME on the fn_decl.

	* g++.dg/other/pr100580.C: New test.
---
 gcc/function.c                        | 3 +++
 gcc/testsuite/g++.dg/other/pr100580.C | 8 ++++++++
 2 files changed, 11 insertions(+)
 create mode 100644 gcc/testsuite/g++.dg/other/pr100580.C

diff --git a/gcc/function.c b/gcc/function.c
index a3ed3987b952..fc7b147b5f1b 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -4930,6 +4930,9 @@ push_dummy_function (bool with_decl)
       fn_result_decl = build_decl (UNKNOWN_LOCATION, RESULT_DECL,
 					 NULL_TREE, void_type_node);
       DECL_RESULT (fn_decl) = fn_result_decl;
+      DECL_ARTIFICIAL (fn_decl) = 1;
+      tree fn_name = get_identifier (" ");
+      SET_DECL_ASSEMBLER_NAME (fn_decl, fn_name);
     }
   else
     fn_decl = NULL_TREE;
diff --git a/gcc/testsuite/g++.dg/other/pr100580.C b/gcc/testsuite/g++.dg/other/pr100580.C
new file mode 100644
index 000000000000..d6cc0a6dc616
--- /dev/null
+++ b/gcc/testsuite/g++.dg/other/pr100580.C
@@ -0,0 +1,8 @@
+// PR c++/100580
+// { dg-do compile }
+// { dg-require-weak "" }
+// { dg-options "-fdump-passes" }
+// { dg-prune-output ".*" }
+
+int foo;
+static __typeof(foo) bar __attribute__((__weakref__("foo")));
-- 
GitLab