diff options
author | Andrew Sutton <asutton@lock3software.com> | 2019-11-27 15:16:37 +0000 |
---|---|---|
committer | Andrew Sutton <asutton@gcc.gnu.org> | 2019-11-27 15:16:37 +0000 |
commit | 50e0c6e429e7cc664f6fcea59db22826f005ca19 (patch) | |
tree | 64d5c8552df1714eea45f75ccb12ffbf7b2cb181 /gcc/testsuite | |
parent | 72479e324313e8a68a534527f79e741f9a7df6fa (diff) | |
download | gcc-50e0c6e429e7cc664f6fcea59db22826f005ca19.zip gcc-50e0c6e429e7cc664f6fcea59db22826f005ca19.tar.gz gcc-50e0c6e429e7cc664f6fcea59db22826f005ca19.tar.bz2 |
re PR c++/92439 ([concepts] trunk crashes on constraint satisfaction failure)
2019-11-27 Andrew Sutton <asutton@lock3software.com>
PR c++/92439
Improve quality of diagnostics for subexpressions that need parens.
gcc/cp/
* parser.c (cp_parser_requires_clause_opt): Add a flag to indicate
when parsing a requires-clause before lambda parameters, and...
(cp_parser_lambda_declarator_opt): ... use that here ...
(cp_parser_type_parameter): ... and here ...
(cp_parser_late_return_type_opt): ... and here ...
(cp_parser_explicit_template_declaration): ... and here.
(cp_parser_diagnose_ungrouped_constraint_plain): Adjust the message
because this can apply to subexpressions that are not immediately
after a requires-clause.
(cp_parser_diagnose_ungrouped_constraint_rich): Likewise.
(primary_constraint_error): New.
(cp_parser_constraint_requires_parens): New.
(cp_parser_unary_constraint_requires_parens): New.
(cp_parser_constraint_primary_expression): Check for unary expressions
before parsing the primary expression. Also check for binary and
postfix operators after a successful parse of the primary expression.
Force a re-parse if the result would form a lower-precedence string.
(cp_parser_constraint_logical_and_expression): Propagate lambda flag;
move checks for ill-formed constraints into the constraint primary
expression.
(cp_parser_constraint_logical_or_expression): Likewise.
(cp_parser_requires_clause_expression): Propagate lambda flag.
gcc/testsuite/
* g++.dg/cpp2a/concepts-requires20.C: New.
From-SVN: r278774
Diffstat (limited to 'gcc/testsuite')
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/concepts-requires20.C | 65 |
2 files changed, 71 insertions, 1 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8605b0b..9b22c91 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,4 +1,9 @@ -2019-11-18 Andrew Sutton <asutton@lock3software.com> +2019-11-27 Andrew Sutton <asutton@lock3software.com> + + PR c++/92439 + * g++.dg/cpp2a/concepts-requires20.C: New. + +2019-11-27 Andrew Sutton <asutton@lock3software.com> PR c++/88395 * g++.dg/cpp2a/concepts-pr88395.C: New. diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-requires20.C b/gcc/testsuite/g++.dg/cpp2a/concepts-requires20.C new file mode 100644 index 0000000..089db2b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-requires20.C @@ -0,0 +1,65 @@ +// { dg-do compile { target c++2a } } + +template<typename ...> +constexpr bool r () { return true; } + +template<typename ... Ts> + requires r<Ts...>() // { dg-error "enclose" } +void f() { } + +template<typename T, T N> + requires ++N // { dg-error "enclose" } +void f() { } + +template<typename T, T N> + requires N++ // { dg-error "enclose" } +void f() { } + +template<typename T, T N> + requires N == 0 // { dg-error "enclose" } +void f() { } + +template<typename T, T N> + requires N ? true : false // { dg-error "enclose" } +void f() { } + +template<typename T, T N> + requires N = 0 // { dg-error "enclose" } +void f() { } + +template<typename T, T N> + requires N + 1 // { dg-error "enclose" } +void f() { } + +template<typename T, T N> + requires N - 1 // { dg-error "enclose" } +void f() { } + +template<typename T, T N> + requires N.x // { dg-error "enclose" } +void f() { } + +template<typename T, T N> + requires N->x && true // { dg-error "enclose" } +void f() { } + +template<typename T, T N> + requires N && N +void f() { } + +template<typename T, T N> + requires N || N +void f() { } + +template<typename T, T N> + requires N || !N // { dg-error "enclose" } +void f() { } + +template<typename T, T N> + requires N[0] // { dg-error "enclose" } +void f() { } + +template<typename T, T N> + requires static_cast<bool>(N) // { dg-error "enclose" } +void f() { } + |