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> --- 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
From 30b1cea7e42b1af4856fea286ec4db9ef22a3fb6 Mon Sep 17 00:00:00 2001 From: Ben Wu <soggysocks...@gmail.com> Date: Mon, 18 Aug 2025 17:00:17 -0700 Subject: [PATCH v3] c++: Fix ICE on mangling invalid compound requirement [PR120618] 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> --- 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