expr.c (do_compare_and_jump): If op0 was replaced by promoted integer constant, use type of op1 for comparison.

* expr.c (do_compare_and_jump): If op0 was replaced by promoted
	integer constant, use type of op1 for comparison.

	* g++.old-deja/g++.other/inline17.C: New test.

From-SVN: r37605
This commit is contained in:
Jakub Jelinek 2000-11-21 07:55:42 +01:00 committed by Jakub Jelinek
parent cd9c4fee8e
commit 6b16805ede
4 changed files with 44 additions and 0 deletions

View File

@ -1,3 +1,8 @@
2000-11-21 Jakub Jelinek <jakub@redhat.com>
* expr.c (do_compare_and_jump): If op0 was replaced by promoted
integer constant, use type of op1 for comparison.
2000-11-20 Stan Shebs <shebs@apple.com>
* config/rs6000/xm-darwin.h: New file, Darwin host definitions.

View File

@ -10054,8 +10054,21 @@ do_compare_and_jump (exp, signed_code, unsigned_code, if_false_label,
return;
op1 = expand_expr_unaligned (TREE_OPERAND (exp, 1), &align1);
if (TREE_CODE (TREE_OPERAND (exp, 1)) == ERROR_MARK)
return;
type = TREE_TYPE (TREE_OPERAND (exp, 0));
mode = TYPE_MODE (type);
if (TREE_CODE (TREE_OPERAND (exp, 0)) == INTEGER_CST
&& (TREE_CODE (TREE_OPERAND (exp, 1)) != INTEGER_CST
|| (GET_MODE_BITSIZE (mode)
> GET_MODE_BITSIZE (TREE_TYPE (TREE_OPERAND (exp, 1))))))
{
/* op0 might have been replaced by promoted constant, in which
case the type of second argument should be used. */
type = TREE_TYPE (TREE_OPERAND (exp, 1));
mode = TYPE_MODE (type);
}
unsignedp = TREE_UNSIGNED (type);
code = unsignedp ? unsigned_code : signed_code;

View File

@ -1,3 +1,7 @@
2000-11-21 Jakub Jelinek <jakub@redhat.com>
* g++.old-deja/g++.other/inline17.C: New test.
2000-11-20 Donald Lindsay <dlindsay@redhat.com>
* gcc.dg/20000614-2.c: Bug fix. This test expected an unitialized

View File

@ -0,0 +1,22 @@
// Build don't link:
// Origin: Jakub Jelinek <jakub@redhat.com>
// Special g++ Options: -O3
struct foo
{
char a;
foo ();
void bar ();
void baz (char c);
};
void foo::baz (char c)
{
if (c != a)
a = c;
}
void foo::bar ()
{
baz (1);
}