re PR c++/56895 (ICE: unexpected expression of kind arrow_expr)
PR c++/56895 * typeck.c (cp_build_binary_op): Call fold_non_dependent_expr_sfinae first before calling maybe_constant_value for warn_for_div_by_zero or invalid shift count warning purposes. * g++.dg/template/arrow3.C: New test. From-SVN: r197660
This commit is contained in:
parent
13aac201ba
commit
f7e8cd25dd
4 changed files with 61 additions and 4 deletions
|
@ -1,3 +1,10 @@
|
|||
2013-04-10 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/56895
|
||||
* typeck.c (cp_build_binary_op): Call fold_non_dependent_expr_sfinae
|
||||
first before calling maybe_constant_value for warn_for_div_by_zero
|
||||
or invalid shift count warning purposes.
|
||||
|
||||
2013-04-09 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/25466
|
||||
|
|
|
@ -4047,8 +4047,9 @@ cp_build_binary_op (location_t location,
|
|||
|| code1 == COMPLEX_TYPE || code1 == VECTOR_TYPE))
|
||||
{
|
||||
enum tree_code tcode0 = code0, tcode1 = code1;
|
||||
tree cop1 = fold_non_dependent_expr_sfinae (op1, tf_none);
|
||||
|
||||
warn_for_div_by_zero (location, maybe_constant_value (op1));
|
||||
warn_for_div_by_zero (location, maybe_constant_value (cop1));
|
||||
|
||||
if (tcode0 == COMPLEX_TYPE || tcode0 == VECTOR_TYPE)
|
||||
tcode0 = TREE_CODE (TREE_TYPE (TREE_TYPE (op0)));
|
||||
|
@ -4084,7 +4085,11 @@ cp_build_binary_op (location_t location,
|
|||
|
||||
case TRUNC_MOD_EXPR:
|
||||
case FLOOR_MOD_EXPR:
|
||||
warn_for_div_by_zero (location, maybe_constant_value (op1));
|
||||
{
|
||||
tree cop1 = fold_non_dependent_expr_sfinae (op1, tf_none);
|
||||
|
||||
warn_for_div_by_zero (location, maybe_constant_value (cop1));
|
||||
}
|
||||
|
||||
if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE
|
||||
&& TREE_CODE (TREE_TYPE (type0)) == INTEGER_TYPE
|
||||
|
@ -4132,7 +4137,8 @@ cp_build_binary_op (location_t location,
|
|||
}
|
||||
else if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
|
||||
{
|
||||
tree const_op1 = maybe_constant_value (op1);
|
||||
tree const_op1 = fold_non_dependent_expr_sfinae (op1, tf_none);
|
||||
const_op1 = maybe_constant_value (const_op1);
|
||||
if (TREE_CODE (const_op1) != INTEGER_CST)
|
||||
const_op1 = op1;
|
||||
result_type = type0;
|
||||
|
@ -4178,7 +4184,8 @@ cp_build_binary_op (location_t location,
|
|||
}
|
||||
else if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
|
||||
{
|
||||
tree const_op1 = maybe_constant_value (op1);
|
||||
tree const_op1 = fold_non_dependent_expr_sfinae (op1, tf_none);
|
||||
const_op1 = maybe_constant_value (const_op1);
|
||||
if (TREE_CODE (const_op1) != INTEGER_CST)
|
||||
const_op1 = op1;
|
||||
result_type = type0;
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2013-04-10 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/56895
|
||||
* g++.dg/template/arrow3.C: New test.
|
||||
|
||||
2013-04-09 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
|
||||
|
||||
* gcc.target/arm/minmax_minus.c: New test.
|
||||
|
|
38
gcc/testsuite/g++.dg/template/arrow3.C
Normal file
38
gcc/testsuite/g++.dg/template/arrow3.C
Normal file
|
@ -0,0 +1,38 @@
|
|||
// PR c++/56895
|
||||
// { dg-do compile }
|
||||
|
||||
extern struct A { bool foo (); A bar (); } *a;
|
||||
|
||||
template <int>
|
||||
int
|
||||
baz1 ()
|
||||
{
|
||||
return 2 << (a->bar().foo() ? 1 : 0);
|
||||
}
|
||||
|
||||
template <int>
|
||||
int
|
||||
baz2 ()
|
||||
{
|
||||
return 2 >> (a->bar().foo() ? 1 : 0);
|
||||
}
|
||||
|
||||
template <int>
|
||||
int
|
||||
baz3 ()
|
||||
{
|
||||
return 10 / (a->bar().foo() ? 1 : 2);
|
||||
}
|
||||
|
||||
template <int>
|
||||
int
|
||||
baz4 ()
|
||||
{
|
||||
return 10 % (a->bar().foo() ? 1 : 0);
|
||||
}
|
||||
|
||||
int
|
||||
test ()
|
||||
{
|
||||
return baz1<0> () + baz2<0> () + baz3<0> () + baz4<0> ();
|
||||
}
|
Loading…
Add table
Reference in a new issue