Hmmmmm, it really doesn't make too much sense to get that warning, but
I can reproduce that when I compile with gcc 13 (and newer)...and
seems like a known issue [1][2]...
However I don't really like that approach, could you change the
argument type of get_riscv_ext_info to `const char *` to suppress that
warning instead?
```diff
diff --git a/gcc/common/config/riscv/riscv-common.cc
b/gcc/common/config/riscv/riscv-common.cc
index 53ca03910b3..a3105c851d6 100644
--- a/gcc/common/config/riscv/riscv-common.cc
+++ b/gcc/common/config/riscv/riscv-common.cc
@@ -214,8 +214,8 @@ static const std::unordered_map<std::string,
riscv_ext_info_t> riscv_ext_infos
#undef DEFINE_RISCV_EXT
};
-static const riscv_ext_info_t &
-get_riscv_ext_info (const std::string &ext)
+static inline const riscv_ext_info_t &
+get_riscv_ext_info (const char *ext)
{
auto itr = riscv_ext_infos.find (ext);
if (itr == riscv_ext_infos.end ())
```
[1]
https://stackoverflow.com/questions/78759847/gcc-14-possibly-dangling-reference-to-a-temporary-warning-or-not-depending-on
[2] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107532
On Thu, May 15, 2025 at 7:56 PM Dongyan Chen
<[email protected]> wrote:
>
> During the GCC compilation, some warnings about temporary object dangling
> references emerged. They appeared in these code lines in riscv-common.cc:
> const riscv_ext_info_t &implied_ext_info, const riscv_ext_info_t &ext_info =
> get_riscv_ext_info (ext) and auto &ext_info = get_riscv_ext_info (search_ext).
> The issue arose because the local variable types were not used in a
> standardized way, causing their references to dangle once the function ended.
> To fix this, the patch converts the const char* type to std::string via
> forced type conversion, thereby eliminating the warnings.
>
> gcc/ChangeLog:
>
> * common/config/riscv/riscv-common.cc
> (riscv_ext_info_t::apply_implied_ext): Type conversion.
> (riscv_subset_list::handle_implied_ext): Ditto.
> (riscv_minimal_hwprobe_feature_bits): Ditto.
>
> ---
> gcc/common/config/riscv/riscv-common.cc | 9 ++++++---
> 1 file changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/gcc/common/config/riscv/riscv-common.cc
> b/gcc/common/config/riscv/riscv-common.cc
> index 53ca03910b38..c2e35dfe54d2 100644
> --- a/gcc/common/config/riscv/riscv-common.cc
> +++ b/gcc/common/config/riscv/riscv-common.cc
> @@ -245,8 +245,9 @@ riscv_ext_info_t::apply_implied_ext (riscv_subset_list
> *subset_list) const
> subset_list->add (implied_info.implied_ext, true);
>
> /* Recursively add implied extension by implied_info->implied_ext. */
> + std::string implied_ext_str = implied_info.implied_ext;
> const riscv_ext_info_t &implied_ext_info
> - = get_riscv_ext_info (implied_info.implied_ext);
> + = get_riscv_ext_info (implied_ext_str);
> implied_ext_info.apply_implied_ext (subset_list);
> }
> return any_change;
> @@ -1089,7 +1090,8 @@ riscv_subset_list::parse_single_std_ext (const char *p,
> bool exact_single_p)
> void
> riscv_subset_list::handle_implied_ext (const char *ext)
> {
> - const riscv_ext_info_t &ext_info = get_riscv_ext_info (ext);
> + std::string ext_str = ext;
> + const riscv_ext_info_t &ext_info = get_riscv_ext_info (ext_str);
> ext_info.apply_implied_ext (this);
>
> /* For RISC-V ISA version 2.2 or earlier version, zicsr and zifence is
> @@ -1642,7 +1644,8 @@ riscv_minimal_hwprobe_feature_bits (const char *isa,
> search_q.pop ();
>
> /* Iterate through the implied extension table. */
> - auto &ext_info = get_riscv_ext_info (search_ext);
> + std::string search_ext_str = search_ext;
> + auto &ext_info = get_riscv_ext_info (search_ext_str);
> for (const auto &implied_ext : ext_info.implied_exts ())
> {
> /* When the search extension matches the implied extension and
> --
> 2.43.0
>