diff options
author | Marek Polacek <polacek@redhat.com> | 2020-05-04 18:34:38 -0400 |
---|---|---|
committer | Marek Polacek <polacek@redhat.com> | 2020-05-06 18:52:44 -0400 |
commit | 1e89178889741c9c4d6a61e5a01c40a8a182fa68 (patch) | |
tree | 9156964427f53a09d923d8450c3bb5e6c373ff4e /gcc/cp | |
parent | 0af711e1914ab6d88538f1fcf0146757b5608b1d (diff) |
c++: ICE in value_dependent_expression_p in C++98 mode [PR94938]
Here we ICE with -std=c++98 since the newly added call to uses_template_parms
(r10-6357): we hit
26530 gcc_assert (cxx_dialect >= cxx11
26531 || INTEGRAL_OR_ENUMERATION_TYPE_P (type));
and TYPE is a record type. The problem is that the argument to
value_dependent_expression_p does not satisfy potential_constant_expression
which it must, as the comment explains. I thought about fixing this in
uses_template_parms -- only call v_d_e_p if p_c_e is true, but in this
case we want to also suppress the warnings if we don't have a constant
expression. I couldn't simply check TREE_CONSTANT as in
compute_array_index_type_loc, because then we'd stop warning in the new
Wtype-limits3.C test.
Fixed by using type_dependent_expression_p_push instead. This means
that we won't suppress the warnings for value-dependent expressions that
aren't type-dependent, e.g. sizeof (T). This only seems to make a
difference for -Wdiv-by-zero, now tested in Wdiv-by-zero-3.C, where I
think it's reasonable to warn. It could make -Wtautological-compare
warn more, but that warning doesn't trigger when it gets constant arguments.
Wtype-limits4.C is a test reduced from poly-int.h and it tests a scenario
that was missing in our testsuite.
This patch also moves the warning_sentinels after the RECURs -- we mean
to use them for build_x_binary_op purposes only.
PR c++/94938
* pt.c (tsubst_copy_and_build): Call type_dependent_expression_p_push
instead of uses_template_parms. Move the warning_sentinels after the
RECURs.
* g++.dg/warn/Wdiv-by-zero-3.C: New test.
* g++.dg/warn/Wtype-limits4.C: New test.
* g++.dg/warn/template-2.C: New test.
* g++.old-deja/g++.pt/crash10.C: Add dg-warning.
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/pt.c | 8 |
2 files changed, 12 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a3bec1c02c4..0798f0fc503 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2020-05-06 Marek Polacek <polacek@redhat.com> + + PR c++/94938 + * pt.c (tsubst_copy_and_build): Call type_dependent_expression_p_push + instead of uses_template_parms. Move the warning_sentinels after the + RECURs. + 2020-05-06 Jakub Jelinek <jakub@redhat.com> PR c++/94951 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 2ed6d0e7457..c6091127225 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -19424,14 +19424,16 @@ tsubst_copy_and_build (tree t, { /* If T was type-dependent, suppress warnings that depend on the range of the types involved. */ - bool was_dep = uses_template_parms (t); + bool was_dep = type_dependent_expression_p_push (t); + + tree op0 = RECUR (TREE_OPERAND (t, 0)); + tree op1 = RECUR (TREE_OPERAND (t, 1)); + warning_sentinel s1(warn_type_limits, was_dep); warning_sentinel s2(warn_div_by_zero, was_dep); warning_sentinel s3(warn_logical_op, was_dep); warning_sentinel s4(warn_tautological_compare, was_dep); - tree op0 = RECUR (TREE_OPERAND (t, 0)); - tree op1 = RECUR (TREE_OPERAND (t, 1)); tree r = build_x_binary_op (input_location, TREE_CODE (t), op0, |