diff options
author | Patrick Palka <ppalka@redhat.com> | 2020-03-28 08:56:33 -0400 |
---|---|---|
committer | Patrick Palka <ppalka@redhat.com> | 2020-03-28 08:56:33 -0400 |
commit | cd68edf894d6b72e5bc37ac205deef9d237ab70b (patch) | |
tree | 1ba70ce7194fddbe4c30a12da104d061ffe4c661 /gcc | |
parent | 75defde9fb56157d5f0279720d48866925b71b19 (diff) | |
download | gcc-cd68edf894d6b72e5bc37ac205deef9d237ab70b.zip gcc-cd68edf894d6b72e5bc37ac205deef9d237ab70b.tar.gz gcc-cd68edf894d6b72e5bc37ac205deef9d237ab70b.tar.bz2 |
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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/constraint.cc | 28 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/concepts/diagnostic1.C | 1 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/concepts/diagnostic5.C | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/concepts-iconv1.C | 1 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/concepts-requires5.C | 2 |
7 files changed, 32 insertions, 14 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a65ed14..be67685 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 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. diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc index 76c5203..571c7cb 100644 --- a/gcc/cp/constraint.cc +++ b/gcc/cp/constraint.cc @@ -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); } } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f60813f..e2e00f4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 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. diff --git a/gcc/testsuite/g++.dg/concepts/diagnostic1.C b/gcc/testsuite/g++.dg/concepts/diagnostic1.C index 7da08db..c6589e2 100644 --- a/gcc/testsuite/g++.dg/concepts/diagnostic1.C +++ b/gcc/testsuite/g++.dg/concepts/diagnostic1.C @@ -1,6 +1,7 @@ // 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); diff --git a/gcc/testsuite/g++.dg/concepts/diagnostic5.C b/gcc/testsuite/g++.dg/concepts/diagnostic5.C index 2641dc1..0d890d6 100644 --- a/gcc/testsuite/g++.dg/concepts/diagnostic5.C +++ b/gcc/testsuite/g++.dg/concepts/diagnostic5.C @@ -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" } diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-iconv1.C b/gcc/testsuite/g++.dg/cpp2a/concepts-iconv1.C index 4d521c3..4e2d13f 100644 --- a/gcc/testsuite/g++.dg/cpp2a/concepts-iconv1.C +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-iconv1.C @@ -1,5 +1,6 @@ // 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); diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-requires5.C b/gcc/testsuite/g++.dg/cpp2a/concepts-requires5.C index 133d29e..2f912b1 100644 --- a/gcc/testsuite/g++.dg/cpp2a/concepts-requires5.C +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-requires5.C @@ -1,5 +1,5 @@ // { 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) |