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


Reply via email to