c++: Add warning about missing 'requires'
authorJason Merrill <jason@redhat.com>
Fri, 27 Aug 2021 21:28:28 +0000 (17:28 -0400)
committerJason Merrill <jason@redhat.com>
Mon, 30 Aug 2021 20:48:28 +0000 (16:48 -0400)
commite18e56c76be35e6a799e07a01c24e0fff3eb1978
tree766fbe1a70cbdf41dd9b401101eda0e8451d02c6
parent9213ff13247739d6d335064a6b568278a872a991
c++: Add warning about missing 'requires'

I noticed that concepts-lambda14.C had two useless requires-expressions:

  static_assert(requires { C<T>; });

always succeeds, because C<T> is always a valid expression for any type,
regardless of whether C is satisfied for a particular type.  Presumably the
user means

  static_assert(requires { requires C<T>; });

to make the C<T> a nested-requirement.  Of course,

  static_assert(C<T>);

is much simpler and means the same thing; this is more relevant in the
middle of a longer requires-expression, such as the bug this warning found
in cmcstl2:

  template<class I>
  META_CONCEPT input_iterator =
  input_or_output_iterator<I> &&
  readable<I> &&
  requires(I& i, const I& ci) {
  typename iterator_category_t<I>;
  derived_from<iterator_category_t<I>, input_iterator_tag>;
  i++;
  };

where 'requires' is missing before 'derived_from'.

gcc/ChangeLog:

* doc/invoke.texi: Document -Wmissing-requires.

gcc/c-family/ChangeLog:

* c.opt: Add -Wmissing-requires.

gcc/cp/ChangeLog:

* parser.c (cp_parser_simple_requirement): Warn about missing
requires.

gcc/testsuite/ChangeLog:

* g++.dg/cpp2a/concepts-lambda14.C: Add expected warnings.
gcc/c-family/c.opt
gcc/cp/parser.c
gcc/doc/invoke.texi
gcc/testsuite/g++.dg/cpp2a/concepts-lambda14.C