Commit cd68edf8 by Patrick Palka

c++: Respect current_constraint_diagnosis_depth in diagnose_compound_requirement

The previous patch tries to avoid changing our current default diagnostics.  But
for the sake of consistency we arguably should also respect
current_constraint_diagnosis_depth in diagnose_compound_requirement() like we do
in the other error-replaying diagnostic routines.  But doing so would be a
change to our default diagnostics behavior, so the change has been split out
into this separate patch for separate consideration.

gcc/cp/ChangeLog:

	* constraint.cc (diagnose_compound_requirement): When diagnosing a
	compound requirement, maybe replay the satisfaction failure, subject to
	the current diagnosis depth.

gcc/testsuite/ChangeLog:

	* g++.dg/concepts/diagnostic1.C: Pass -fconcepts-diagnostics-depth=2.
	* g++.dg/concepts/diagnostic5.C: Adjust expected diagnostics.
	* g++.dg/cpp2a/concepts-iconv1.C: Pass -fconcepts-diagnostics-depth=2.
	* g++.dg/cpp2a/concepts-requires5.C: Likewise.
parent 75defde9
2020-03-28 Patrick Palka <ppalka@redhat.com>
* constraint.cc (diagnose_compound_requirement): When diagnosing a
compound requirement, maybe replay the satisfaction failure, subject to
the current diagnosis depth.
* constraint.cc (finish_constraint_binary_op): Set the location of EXPR
as well as its range, because build_x_binary_op doesn't always do so.
(current_constraint_diagnosis_depth): New.
......
......@@ -3308,20 +3308,30 @@ diagnose_compound_requirement (tree req, tree args, tree in_decl)
if (!type_deducible_p (expr, type, placeholder, args, quiet))
{
tree orig_expr = TREE_OPERAND (req, 0);
inform (loc, "%qE does not satisfy return-type-requirement",
orig_expr);
/* Further explain the reason for the error. */
type_deducible_p (expr, type, placeholder, args, noisy);
if (diagnosing_failed_constraint::replay_errors_p ())
{
inform (loc,
"%qE does not satisfy return-type-requirement, "
"because", orig_expr);
/* Further explain the reason for the error. */
type_deducible_p (expr, type, placeholder, args, noisy);
}
else
inform (loc, "%qE does not satisfy return-type-requirement",
orig_expr);
}
}
else if (!expression_convertible_p (expr, type, quiet))
{
tree orig_expr = TREE_OPERAND (req, 0);
inform (loc, "cannot convert %qE to %qT", orig_expr, type);
/* Further explain the reason for the error. */
expression_convertible_p (expr, type, noisy);
if (diagnosing_failed_constraint::replay_errors_p ())
{
inform (loc, "cannot convert %qE to %qT because", orig_expr, type);
/* Further explain the reason for the error. */
expression_convertible_p (expr, type, noisy);
}
else
inform (loc, "cannot convert %qE to %qT", orig_expr, type);
}
}
}
......
2020-03-28 Patrick Palka <ppalka@redhat.com>
* g++.dg/concepts/diagnostic1.C: Pass -fconcepts-diagnostics-depth=2.
* g++.dg/concepts/diagnostic5.C: Adjust expected diagnostics.
* g++.dg/cpp2a/concepts-iconv1.C: Pass -fconcepts-diagnostics-depth=2.
* g++.dg/cpp2a/concepts-requires5.C: Likewise.
* g++.dg/concepts/diagnostic2.C: Expect "no operand" instead of
"neither operand".
* g++.dg/concepts/diagnostic5.C: New test.
......
// PR c++/67159
// { dg-do compile { target c++17_only } }
// { dg-options "-fconcepts" }
// { dg-additional-options "-fconcepts-diagnostics-depth=2" }
template <class T, class U>
concept bool SameAs = __is_same_as(T, U);
......
......@@ -4,8 +4,7 @@
template<typename T>
concept c1 = requires { typename T::blah; };
// { dg-message "satisfaction of .c1<T>. .with T = char." "" { target *-*-* } .-1 }
// { dg-message "satisfaction of .c1<char\\*>." "" { target *-*-* } .-2 }
// { dg-message ".typename T::blah. is invalid" "" { target *-*-* } .-3 }
// { dg-message ".typename T::blah. is invalid" "" { target *-*-* } .-2 }
template<typename T>
concept c2 = requires (T x) { *x; };
......@@ -27,8 +26,6 @@ template<typename T>
concept c5 = requires (T x) { { &x } -> c1; };
// { dg-message "satisfaction of .c5<T>. .with T = char." "" { target *-*-* } .-1 }
// { dg-message "in requirements with .char x." "" { target *-*-* } .-2 }
// { dg-message "does not satisfy return-type-requirement" "" { target *-*-* } .-3 }
// { dg-error "deduced expression type does not satisfy" "" { target *-*-* } .-4 }
template<typename T>
requires (c1<T> || c2<T>) || (c3<T> || c4<T>) || c5<T> // { dg-message "49: no operand" }
......
// PR c++/67240
// { dg-do compile { target c++2a } }
// { dg-additional-options "-fconcepts-diagnostics-depth=2" }
template <class T, class U> concept Same = __is_same_as(T,U);
......
// { dg-do compile { target c++2a } }
// { dg-additional-options -fconcepts-ts }
// { dg-additional-options "-fconcepts-ts -fconcepts-diagnostics-depth=2" }
// Test conversion requirements (not in C++20)
......
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