https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55035
Bernhard Reutner-Fischer <aldot at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Last reconfirmed|2014-07-27 00:00:00 |2015-4-9
CC| |aldot at gcc dot gnu.org
Known to fail|4.10.0 |5.0
--- Comment #4 from Bernhard Reutner-Fischer <aldot at gcc dot gnu.org> ---
Reconfirmed.
Nowadays (trunk@221914) also breaks all-gcc for nios2-linux-gnu.
Reminds me of bug #36550
Smallish testcase:
$ cat reload1.i ; echo EOF
/* PR target/55035 */
/* { dg-do compile } */
/* { dg-options "-O2 -W -Wall -Werror" } */
struct rtx_def;
typedef struct rtx_def *rtx;
enum rtx_code {
UNKNOWN,
INSN,
ASM_INPUT,
CLOBBER
};
struct rtx_def {
enum rtx_code code: 4;
};
class rtx_def;
class rtx_insn : public rtx_def {};
struct recog_data_d
{
rtx operand[30];
rtx *operand_loc[30];
rtx *dup_loc[1];
char dup_num[1];
char n_operands;
char n_dups;
};
extern struct recog_data_d recog_data;
extern int get_int(void);
void
elimination_costs_in_insn (rtx_insn *insn)
{
int icode = get_int ();
int i;
rtx orig_operand[30];
rtx orig_dup[30];
if (icode < 0)
{
if (((enum rtx_code) insn->code) == INSN)
__builtin_abort();
return;
}
for (i = 0; i < recog_data.n_dups; i++)
orig_dup[i] = *recog_data.dup_loc[i];
for (i = 0; i < recog_data.n_operands; i++)
{
orig_operand[i] = recog_data.operand[i];
if (orig_operand[i]->code == CLOBBER)
*recog_data.operand_loc[i] = 0;
}
for (i = 0; i < recog_data.n_dups; i++)
*recog_data.dup_loc[i]
= *recog_data.operand_loc[(int) recog_data.dup_num[i]];
for (i = 0; i < recog_data.n_dups; i++)
*recog_data.dup_loc[i] = orig_dup[i];
}
EOF
$ g++ -O2 -W -Wall -Werror -c reload1.i -o reload1.o
reload1.i: In function ‘void elimination_costs_in_insn(rtx_insn*)’:
reload1.i:53:41: error: ‘orig_dup[0]’ may be used uninitialized in this
function [-Werror=maybe-uninitialized]
*recog_data.dup_loc[i] = orig_dup[i];
^
cc1plus: all warnings being treated as errors