[PATCH] c++: Comment out announce_function to prevent ICE [PR102426]

qingzhe huang nickhuang99@gmail.com
Fri Oct 8 04:31:01 GMT 2021


This "announce_function" is not a purely readonly
function. Instead it calls tsubst which modifies
global variable "current_function_decl". If it is
placed at parser code directory level, recursion
might happen and set/reset variable might interleave
and can cause ICE. No test case is provided because
this segment fault only occurs when compiler option
"-quiet" is not set which is usually set by driver.
That is why usual testcases cannot expose this issue.
Even though this issue usually doesn't affect endusers,
however, it is a headache for development.

gcc/cp/ChangeLog:
	PR c++/102426
	* decl.c (start_preparsed_function): Comment
	out announce_function.
	(emit_coro_helper): Comment out
	announce_function.

gcc/ChangeLog:
	PR c++/102426
	* toplev.c (get_src_pwd): Add comment
	to note announce_function usage.

Signed-off-by: qingzhe huang <nickhuang99@gmail.com>
---
 gcc/cp/decl.c | 4 ----
 gcc/toplev.c  | 5 ++++-
 2 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 2d30c790b93..94d3a2c1cba 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -16904,9 +16904,6 @@ start_preparsed_function (tree decl1, tree attrs, int flags)
      where store_parm_decls will find them.  */
   tree current_function_parms = DECL_ARGUMENTS (decl1);
 
-  /* Let the user know we're compiling this function.  */
-  announce_function (decl1);
-
   gcc_assert (DECL_INITIAL (decl1));
 
   /* This function may already have been parsed, in which case just
@@ -17472,7 +17469,6 @@ emit_coro_helper (tree helper)
   current_function_decl = helper;
   begin_scope (sk_function_parms, NULL);
   store_parm_decls (DECL_ARGUMENTS (helper));
-  announce_function (helper);
   allocate_struct_function (helper, false);
   cfun->language = ggc_cleared_alloc<language_function> ();
   poplevel (1, 0, 1);
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 1bb1794be96..4a3ca1aef4a 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -221,7 +221,10 @@ get_src_pwd (void)
 }
 
 /* Called when the start of a function definition is parsed,
-   this function prints on stderr the name of the function.  */
+   this function prints on stderr the name of the function.
+   NOTE: Do not use this function at directory gcc/cp level
+   or below because it might recurse and interleave with
+   function frame parsing which can cause crash. */
 void
 announce_function (tree decl)
 {
-- 
2.17.1



More information about the Gcc-patches mailing list