On Mon, Aug 05, 2024 at 12:00:04PM -0400, Jason Merrill wrote:
> On 8/2/24 2:12 PM, Marek Polacek wrote:
> > Bootstrapped/regtested on x86_64-pc-linux-gnu.  Comments?
> > 
> > -- >8 --
> > This patch removes vestigial Concepts TS code as discussed in
> > <https://gcc.gnu.org/pipermail/gcc-patches/2024-July/657937.html>.
> > 
> > In particular, it removes code related to function/variable concepts.
> > That includes variable_concept_p and function_concept_p, which then
> > cascades into removing DECL_DECLARED_CONCEPT_P etc.  So I think we
> > no longer need to say "standard concept" since there are no non-standard
> > ones anymore.
> > 
> > I've added two new errors saying that "variable/function concepts are
> > no longer supported".
> > 
> > gcc/cp/ChangeLog:
> > 
> >     * constexpr.cc (cxx_eval_constant_expression): Don't call
> >     unpack_concept_check.  Add a concept_check_p assert.  Remove
> >     function_concept_p code.
> >     * constraint.cc (check_constraint_atom): Remove function concepts code.
> >     (unpack_concept_check): Remove.
> >     (get_concept_check_template): Remove Concepts TS code.
> >     (resolve_function_concept_overload): Remove.
> >     (resolve_function_concept_check): Remove.
> >     (resolve_concept_check): Remove Concepts TS code.
> >     (get_returned_expression): Remove.
> >     (get_variable_initializer): Remove.
> >     (get_concept_definition): Remove Concepts TS code.
> >     (normalize_concept_check): Likewise.
> >     (build_function_check): Remove.
> >     (build_variable_check): Remove.
> >     (build_standard_check): Use concept_definition_p instead of
> >     standard_concept_p.
> >     (build_concept_check): Remove variable_concept_p/function_concept_p
> >     code.
> >     (build_concept_id): Simplify.
> >     (build_type_constraint): Likewise.
> >     (placeholder_extract_concept_and_args): Likewise.
> >     (satisfy_nondeclaration_constraints): Likewise.
> >     (check_function_concept): Remove.
> >     (get_constraint_error_location): Remove Concepts TS code.
> >     * cp-tree.h (DECL_DECLARED_CONCEPT_P): Remove.
> >     (check_function_concept): Remove.
> >     (unpack_concept_check): Remove.
> >     (standard_concept_p): Remove.
> >     (variable_concept_p): Remove.
> >     (function_concept_p): Remove.
> >     (concept_definition_p): Simplify.
> >     (concept_check_p): Don't check for CALL_EXPR.
> >     * decl.cc (check_concept_refinement): Remove.
> >     (duplicate_decls): Remove check_concept_refinement code.
> >     (is_concept_var): Remove.
> >     (cp_finish_decl): Remove is_concept_var.
> >     (check_concept_fn): Remove.
> >     (grokfndecl): Give an error about function concepts not being supported
> >     anymore.  Remove unused code.
> >     (grokvardecl): Give an error about variable concepts not being
> >     supported anymore.
> >     (finish_function): Remove DECL_DECLARED_CONCEPT_P code.
> >     * decl2.cc (min_vis_expr_r): Use concept_definition_p instead of
> >     standard_concept_p.
> >     (maybe_instantiate_decl): Remove DECL_DECLARED_CONCEPT_P check.
> >     (mark_used): Likewise.
> >     * error.cc (dump_simple_decl): Use concept_definition_p instead of
> >     standard_concept_p.
> >     (dump_function_decl): Remove DECL_DECLARED_CONCEPT_P code.
> >     (print_concept_check_info): Don't call unpack_concept_check.
> >     * mangle.cc (write_type_constraint): Likewise.
> >     * parser.cc (cp_parser_nested_name_specifier_opt): Remove
> >     function_concept_p code.  Only check concept_definition_p, not
> >     variable_concept_p/standard_concept_p.
> >     (add_debug_begin_stmt): Remove DECL_DECLARED_CONCEPT_P code.
> >     (cp_parser_template_declaration_after_parameters): Remove a stale
> >     comment.
> >     * pt.cc (check_explicit_specialization): Remove
> >     DECL_DECLARED_CONCEPT_P code.
> >     (process_partial_specialization): Remove variable_concept_p code.
> >     (lookup_template_variable): Likewise.
> >     (tsubst_expr) <case CALL_EXPR>: Remove Concepts TS code and simplify.
> >     (do_decl_instantiation): Remove DECL_DECLARED_CONCEPT_P code.
> >     (instantiate_decl): Likewise.
> >     (placeholder_type_constraint_dependent_p): Don't call
> >     unpack_concept_check.  Add a concept_check_p assert.
> >     (convert_generic_types_to_packs): Likewise.
> >     * semantics.cc (finish_call_expr): Remove Concepts TS code and simplify.
> > 
> > gcc/testsuite/ChangeLog:
> > 
> >     * g++.dg/concepts/decl-diagnose.C: Adjust dg-error.
> >     * g++.dg/concepts/fn-concept2.C: Likewise.
> >     * g++.dg/concepts/pr71128.C: Likewise.
> >     * g++.dg/concepts/var-concept6.C: Likewise.
> >     * g++.dg/cpp2a/concepts.C: Likewise.
> > ---
> >   gcc/cp/constexpr.cc                           |  13 +-
> >   gcc/cp/constraint.cc                          | 346 +-----------------
> >   gcc/cp/cp-tree.h                              |  71 +---
> >   gcc/cp/decl.cc                                | 118 +-----
> >   gcc/cp/decl2.cc                               |   4 +-
> >   gcc/cp/error.cc                               |  10 +-
> >   gcc/cp/mangle.cc                              |   4 +-
> >   gcc/cp/parser.cc                              |  16 +-
> >   gcc/cp/pt.cc                                  |  60 +--
> >   gcc/cp/semantics.cc                           |  17 +-
> >   gcc/testsuite/g++.dg/concepts/decl-diagnose.C |   8 +-
> >   gcc/testsuite/g++.dg/concepts/fn-concept2.C   |   4 +-
> >   gcc/testsuite/g++.dg/concepts/pr71128.C       |   8 +-
> >   gcc/testsuite/g++.dg/concepts/var-concept6.C  |   2 +-
> >   gcc/testsuite/g++.dg/cpp2a/concepts.C         |   4 +-
> >   15 files changed, 65 insertions(+), 620 deletions(-)
> > 
> > diff --git a/gcc/cp/constexpr.cc b/gcc/cp/constexpr.cc
> > index 8277b3b79ba..b079be1b3d5 100644
> > --- a/gcc/cp/constexpr.cc
> > +++ b/gcc/cp/constexpr.cc
> > @@ -8508,20 +8508,11 @@ cxx_eval_constant_expression (const constexpr_ctx 
> > *ctx, tree t,
> >         {
> >           /* We can evaluate template-id that refers to a concept only if
> >        the template arguments are non-dependent.  */
> > -   tree id = unpack_concept_check (t);
> > -   tree tmpl = TREE_OPERAND (id, 0);
> > +   gcc_assert (concept_check_p (t));
> > +   tree tmpl = TREE_OPERAND (t, 0);
> >     if (!concept_definition_p (tmpl))
> >       internal_error ("unexpected template-id %qE", t);
> 
> It seems unnecessary to have both the assert and the internal_error here;
> I'd drop the internal_error.

Done.

> > -/* The normal form of an atom depends on the expression.  The normal
> > -   form of a function call to a function concept is a check constraint
> > -   for that concept.  The normal form of a reference to a variable
> > -   concept is a check constraint for that concept.  Otherwise, the
> > -   constraint is a predicate constraint.  */
> > +/* The normal form of an atom is a predicate constraint.  */
> 
> I think the term "predicate constraint" is also obsolete; it's now "atomic
> constraint".

Aha.  Done.

> > @@ -3952,8 +3950,8 @@ print_concept_check_info (diagnostic_context 
> > *context, tree expr, tree map, tree
> >   {
> >     gcc_assert (concept_check_p (expr));
> > -  tree id = unpack_concept_check (expr);
> > -  tree tmpl = TREE_OPERAND (id, 0);
> > +  tree tmpl = TREE_OPERAND (expr, 0);
> > +  // ??? Can this go now that fn/var concepts have been removed?
> 
> I would definitely expect so, did you try?

Yeah, it can go.
 
> I think we also want to adjust the 'concept bool' handling in
> cp_parser_decl_specifier_seq:
> 
> >           /* Warn for concept as a decl-specifier. We'll rewrite these
> > as
> > concept declarations later.  */
> >           {
> >             cp_token *next = cp_lexer_peek_token (parser->lexer);
> >             if (next->keyword == RID_BOOL)
> > =>            permerror (next->location, "the %<bool%> keyword is not "
> >                          "allowed in a C++20 concept definition");
> >             else
> >               error_at (token->location, "C++20 concept definition syntax "
> >                         "is %<concept <name> = <expr>%>");
> >           }
> 
> After the permerror let's skip the 'bool' token and continue trying to parse
> a concept declaration.  I think that should allow us to remove more of the
> code in grokfndecl/grokvardecl?

If by skip you mean cp_lexer_consume_token, then that results in worse
diagnostics for e.g.

  concept bool f3();

where it adds the extra "with no type" error:

t.C:3:9: error: the 'bool' keyword is not allowed in a C++20 concept definition 
[-fpermissive]
    3 | concept bool f3();
      |         ^~~~
t.C:3:14: error: ISO C++ forbids declaration of 'f3' with no type [-fpermissive]
    3 | concept bool f3();
      |              ^~
t.C:3:14: error: function concepts are no longer supported

Besides, I don't see what more I could remove in grokfndecl/grokvardecl.
Except this tiny bit, now added:

@@ -11307,7 +11307,7 @@ grokvardecl (tree type,
   // Handle explicit specializations and instantiations of variable templates.
   if (orig_declarator)
     decl = check_explicit_specialization (orig_declarator, decl,
-                     template_count, conceptp * 8);
+                     template_count, 0);

   return decl != error_mark_node ? decl : NULL_TREE;
 }


Marek

Reply via email to