Commit fa74a4bc by Marek Polacek Committed by Marek Polacek

re PR c/68062 (ICE when comparing vectors)

	PR c/68062
	* c-typeck.c (build_binary_op) [EQ_EXPR, GE_EXPR]: Promote operand
	to unsigned, if needed.  Add -Wsign-compare warning.

	* typeck.c (cp_build_binary_op): Promote operand to unsigned, if
	needed.  Add -Wsign-compare warning.

	* c-c++-common/vector-compare-4.c: New test.

From-SVN: r232894
parent 0afff540
2016-01-27 Marek Polacek <polacek@redhat.com>
PR c/68062
* c-typeck.c (build_binary_op) [EQ_EXPR, GE_EXPR]: Promote operand
to unsigned, if needed. Add -Wsign-compare warning.
2016-01-26 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/69483
......
......@@ -11048,6 +11048,20 @@ build_binary_op (location_t location, enum tree_code code,
return error_mark_node;
}
/* It's not precisely specified how the usual arithmetic
conversions apply to the vector types. Here, we use
the unsigned type if one of the operands is signed and
the other one is unsigned. */
if (TYPE_UNSIGNED (type0) != TYPE_UNSIGNED (type1))
{
if (!TYPE_UNSIGNED (type0))
op0 = build1 (VIEW_CONVERT_EXPR, type1, op0);
else
op1 = build1 (VIEW_CONVERT_EXPR, type0, op1);
warning_at (location, OPT_Wsign_compare, "comparison between "
"types %qT and %qT", type0, type1);
}
/* Always construct signed integer vector type. */
intt = c_common_type_for_size (GET_MODE_BITSIZE
(TYPE_MODE (TREE_TYPE (type0))), 0);
......@@ -11201,6 +11215,20 @@ build_binary_op (location_t location, enum tree_code code,
return error_mark_node;
}
/* It's not precisely specified how the usual arithmetic
conversions apply to the vector types. Here, we use
the unsigned type if one of the operands is signed and
the other one is unsigned. */
if (TYPE_UNSIGNED (type0) != TYPE_UNSIGNED (type1))
{
if (!TYPE_UNSIGNED (type0))
op0 = build1 (VIEW_CONVERT_EXPR, type1, op0);
else
op1 = build1 (VIEW_CONVERT_EXPR, type0, op1);
warning_at (location, OPT_Wsign_compare, "comparison between "
"types %qT and %qT", type0, type1);
}
/* Always construct signed integer vector type. */
intt = c_common_type_for_size (GET_MODE_BITSIZE
(TYPE_MODE (TREE_TYPE (type0))), 0);
......
2016-01-27 Marek Polacek <polacek@redhat.com>
PR c/68062
* typeck.c (cp_build_binary_op): Promote operand to unsigned, if
needed. Add -Wsign-compare warning.
2016-01-27 Ryan Burn <contact@rnburn.com>
PR cilkplus/69267
......
......@@ -4823,6 +4823,20 @@ cp_build_binary_op (location_t location,
return error_mark_node;
}
/* It's not precisely specified how the usual arithmetic
conversions apply to the vector types. Here, we use
the unsigned type if one of the operands is signed and
the other one is unsigned. */
if (TYPE_UNSIGNED (type0) != TYPE_UNSIGNED (type1))
{
if (!TYPE_UNSIGNED (type0))
op0 = build1 (VIEW_CONVERT_EXPR, type1, op0);
else
op1 = build1 (VIEW_CONVERT_EXPR, type0, op1);
warning_at (location, OPT_Wsign_compare, "comparison between "
"types %qT and %qT", type0, type1);
}
/* Always construct signed integer vector type. */
intt = c_common_type_for_size (GET_MODE_BITSIZE
(TYPE_MODE (TREE_TYPE (type0))), 0);
......
2016-01-27 Marek Polacek <polacek@redhat.com>
PR c/68062
* c-c++-common/vector-compare-4.c: New test.
2016-01-27 David Malcolm <dmalcolm@redhat.com>
PR preprocessor/69126
......
/* PR c/68062 */
/* { dg-do compile } */
/* { dg-options "-Wsign-compare" } */
typedef signed char __attribute__ ((vector_size (4))) v4qi;
typedef unsigned char __attribute__ ((vector_size (4))) uv4qi;
typedef signed int __attribute__ ((vector_size (4 * __SIZEOF_INT__))) v4si;
typedef unsigned int __attribute__ ((vector_size (4 * __SIZEOF_INT__))) uv4si;
v4qi
fn1 (void)
{
v4qi a = { 1, 2, 3, 4 };
uv4qi b = { 4, 3, 2, 1 };
v4qi v = { 0, 0, 0, 0 };
v += (a == b); /* { dg-warning "comparison between types" } */
v += (a != b); /* { dg-warning "comparison between types" } */
v += (a >= b); /* { dg-warning "comparison between types" } */
v += (a <= b); /* { dg-warning "comparison between types" } */
v += (a > b); /* { dg-warning "comparison between types" } */
v += (a < b); /* { dg-warning "comparison between types" } */
return v;
}
v4si
fn2 (void)
{
v4si a = { 1, 2, 3, 4 };
uv4si b = { 4, 3, 2, 1 };
v4si v = { 0, 0, 0, 0 };
v += (a == b); /* { dg-warning "comparison between types" } */
v += (a != b); /* { dg-warning "comparison between types" } */
v += (a >= b); /* { dg-warning "comparison between types" } */
v += (a <= b); /* { dg-warning "comparison between types" } */
v += (a > b); /* { dg-warning "comparison between types" } */
v += (a < b); /* { dg-warning "comparison between types" } */
return v;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment