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 <nickhuan...@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