Pushed, thanks!
On 8/18/25 11:32 PM, Ben Wu wrote:
Looks like I mispelled "Merrill". Here is the corrected patch.
-Ben
On Mon, Aug 18, 2025 at 7:31 PM Ben Wu <soggysocks...@gmail.com
<mailto:soggysocks...@gmail.com>> wrote:
Sorry about that, I'm not sure why the formatting issues are there.
Gmail seems to remove tabs from the patch as well. I attached the
revised patch in case this patch still has some formatting problems like
the indentation for error_at.
I have adjusted the testcases to use dg-prune-output and
bootstrapped and
tested on x86_64-linux-gnu.
Thanks,
-Ben
This testcase caused an ICE when mangling the invalid type-constraint in
write_requirement since write_type_constraint expects a
TEMPLATE_TYPE_PARM.
Setting the trailing return type to NULL_TREE when a
return-type-requirement is found in place of a type-constraint
prevents the
failed assertion in write_requirement. It also allows the invalid
constraint to be satisfied in some contexts to prevent redundant errors,
e.g. in concepts-requires5.C.
Bootstrapped and tested on x86_64-linux-gnu.
Could someone help review and commit?
Thanks.
PR c++/120618
gcc/cp/ChangeLog:
* parser.cc (cp_parser_compound_requirement): Set type to
NULL_TREE for invalid type-constraint.
gcc/testsuite/ChangeLog:
* g++.dg/cpp2a/concepts-requires5.C: Don't require
redundant diagnostic in static assertion.
* g++.dg/concepts/pr120618.C: New test.
Suggested-by: Jason Merril <ja...@redhat.com <mailto:ja...@redhat.com>>
---
gcc/cp/parser.cc | 9 ++++++---
gcc/testsuite/g++.dg/concepts/pr120618.C | 13 +++++++++++++
gcc/testsuite/g++.dg/cpp2a/concepts-requires5.C | 2 +-
3 files changed, 20 insertions(+), 4 deletions(-)
create mode 100644 gcc/testsuite/g++.dg/concepts/pr120618.C
diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index d66b658b748..40223bedcc1 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -33403,9 +33403,12 @@ cp_parser_compound_requirement (cp_parser
*parser)
}
}
else
- /* P1452R2 removed the trailing-return-type option. */
- error_at (type_loc,
- "return-type-requirement is not a type-constraint");
+ {
+ /* P1452R2 removed the trailing-return-type option. */
+ error_at (type_loc,
+ "return-type-requirement is not a type-constraint");
+ type = NULL_TREE;
+ }
}
location_t loc = make_location (expr_token->location,
diff --git a/gcc/testsuite/g++.dg/concepts/pr120618.C b/gcc/
testsuite/g++.dg/concepts/pr120618.C
new file mode 100644
index 00000000000..85d2532a9d6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/concepts/pr120618.C
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++17 } }
+// { dg-options "-fconcepts" }
+
+class B{};
+
+template <typename T>
+requires (!requires(T t) { { t } -> bool; }) // { dg-error "return-
type-requirement is not a type-constraint" }
+void foo(T t) {}
+
+int main() {
+ B b;
+ foo(b); // { dg-prune-output "no matching function" }
+}
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-requires5.C b/gcc/
testsuite/g++.dg/cpp2a/concepts-requires5.C
index 524eadbf5dd..3c5a9135c18 100644
--- a/gcc/testsuite/g++.dg/cpp2a/concepts-requires5.C
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts-requires5.C
@@ -41,5 +41,5 @@ class D : /*private*/ B { };
void driver_2()
{
static_assert(ConvertibleTo<D, B>()); // { dg-error "cannot call" }
- static_assert(ConvertibleTo<D, B>); // { dg-error "static
assertion failed" }
+ static_assert(ConvertibleTo<D, B>); // { dg-prune-output "static
assertion failed" }
}
--
2.43.0