diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc index 96845154a926f97735d6f268a7e985316585f923..35d1ea226233c2c6b4c550256fc1bcb78bae3cf9 100644 --- a/gcc/gimplify.cc +++ b/gcc/gimplify.cc @@ -1775,9 +1775,9 @@ gimple_add_init_for_auto_var (tree decl, else { - char *decl_name_anonymous = xasprintf ("D.%u", DECL_UID (decl)); + char decl_name_anonymous[3 + (HOST_BITS_PER_INT + 2) / 3]; + sprintf (decl_name_anonymous, "D.%u", DECL_UID (decl)); decl_name = build_string_literal (decl_name_anonymous); - free (decl_name_anonymous); } tree call = build_call_expr_internal_loc (loc, IFN_DEFERRED_INIT, diff --git a/gcc/testsuite/g++.dg/pr107411.C b/gcc/testsuite/g++.dg/pr107411.C new file mode 100644 index 0000000000000000000000000000000000000000..7eefecae4f3a05c2f6985c895bc38a0591cc0823 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr107411.C @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-Werror=uninitialized -ftrivial-auto-var-init=zero" } */ +int t(); +void f(int); + +void j() +{ + const int& e = t(); + f(e); +} diff --git a/gcc/tree-ssa-uninit.cc b/gcc/tree-ssa-uninit.cc index c555cf5cd50474040561613eee3ceaeba4d14e0b..9f720ae1f4fa35271ebe4773bd33440b3ee27d07 100644 --- a/gcc/tree-ssa-uninit.cc +++ b/gcc/tree-ssa-uninit.cc @@ -224,8 +224,6 @@ warn_uninit (opt_code opt, tree t, tree var, gimple *context, at alt_reloc = temp. */ tree lhs_var = NULL_TREE; - tree lhs_var_name = NULL_TREE; - const char *lhs_var_name_str = NULL; /* Get the variable name from the 3rd argument of call. */ tree var_name = gimple_call_arg (var_def_stmt, 2); @@ -239,11 +237,22 @@ warn_uninit (opt_code opt, tree t, tree var, gimple *context, else if (TREE_CODE (gimple_assign_lhs (context)) == SSA_NAME) lhs_var = SSA_NAME_VAR (gimple_assign_lhs (context)); } - if (lhs_var - && (lhs_var_name = DECL_NAME (lhs_var)) - && (lhs_var_name_str = IDENTIFIER_POINTER (lhs_var_name)) - && (strcmp (lhs_var_name_str, var_name_str) == 0)) - return; + if (lhs_var) + { + /* Get the name string for the LHS_VAR. + Refer to routine gimple_add_init_for_auto_var. */ + if (DECL_NAME (lhs_var) + && (strcmp (IDENTIFIER_POINTER (DECL_NAME (lhs_var)), + var_name_str) == 0)) + return; + else if (!DECL_NAME (lhs_var)) + { + char lhs_var_name_str_buf[3 + (HOST_BITS_PER_INT + 2) / 3]; + sprintf (lhs_var_name_str_buf, "D.%u", DECL_UID (lhs_var)); + if (strcmp (lhs_var_name_str_buf, var_name_str) == 0) + return; + } + } gcc_assert (var_name_str && var_def_stmt); } }