From 3ed80b37171a9cf1cf748b25fdd01dd37ce9a6ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johel=20Ernesto=20Guerrero=20Pe=C3=B1a?= Date: Tue, 30 May 2023 11:05:16 -0400 Subject: [PATCH 1/2] fix(parse): permit unbraced initializer after requires --- ...-clause-unbraced-function-initializer.cpp2 | 2 ++ ...s-clause-unbraced-function-initializer.cpp | 26 +++++++++++++++++++ ...-unbraced-function-initializer.cpp2.output | 2 ++ source/parse.h | 6 ++--- 4 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 regression-tests/pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp2 create mode 100644 regression-tests/test-results/pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp create mode 100644 regression-tests/test-results/pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp2.output diff --git a/regression-tests/pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp2 b/regression-tests/pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp2 new file mode 100644 index 000000000..242bee3f5 --- /dev/null +++ b/regression-tests/pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp2 @@ -0,0 +1,2 @@ +f: () requires std::regular = g(T()); +main: () = { } diff --git a/regression-tests/test-results/pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp b/regression-tests/test-results/pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp new file mode 100644 index 000000000..53b7a823d --- /dev/null +++ b/regression-tests/test-results/pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp @@ -0,0 +1,26 @@ + +#define CPP2_USE_MODULES Yes + +//=== Cpp2 type declarations ==================================================== + + +#include "cpp2util.h" + + + +//=== Cpp2 type definitions and function declarations =========================== + +#line 1 "pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp2" +template auto f() -> void; +auto main() -> int; + + +//=== Cpp2 function definitions ================================================= + +#line 1 "pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp2" +template auto f() -> void +requires (std::regular) +#line 1 "pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp2" + { g(T()); } +auto main() -> int {} + diff --git a/regression-tests/test-results/pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp2.output b/regression-tests/test-results/pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp2.output new file mode 100644 index 000000000..f849c57b6 --- /dev/null +++ b/regression-tests/test-results/pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp2.output @@ -0,0 +1,2 @@ +pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp2... ok (all Cpp2, passes safety checks) + diff --git a/source/parse.h b/source/parse.h index 4ff01cbb0..9c6644984 100644 --- a/source/parse.h +++ b/source/parse.h @@ -1988,7 +1988,7 @@ struct declaration_node std::vector> meta_functions; std::unique_ptr template_parameters; source_position requires_pos = {}; - std::unique_ptr requires_clause_expression; + std::unique_ptr requires_clause_expression; source_position equal_sign = {}; std::unique_ptr initializer; @@ -5865,7 +5865,7 @@ class parser //G meta-functions-list '@' id-expression //G //G requires-clause: - //G 'requires' expression + //G 'requires' logical-or-expression //G //G template-parameter-declaration-list //G '<' parameter-declaration-seq '>' @@ -6112,7 +6112,7 @@ class parser if (curr() == "requires") { n->requires_pos = curr().position(); next(); - auto e = expression(); + auto e = logical_or_expression(); if (!e) { error("'requires' must be followed by an expression"); return {}; From 1ce51c1b2b6e77b93400dabfb6dfe78dd9d1ba82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johel=20Ernesto=20Guerrero=20Pe=C3=B1a?= Date: Tue, 6 Jun 2023 11:40:08 -0400 Subject: [PATCH 2/2] test: add `test-results/gcc-13` --- regression-tests/test-results/gcc-13/gcc-version.output | 5 +++++ ...quires-clause-unbraced-function-initializer.cpp.execution | 0 ...-requires-clause-unbraced-function-initializer.cpp.output | 0 3 files changed, 5 insertions(+) create mode 100644 regression-tests/test-results/gcc-13/gcc-version.output create mode 100644 regression-tests/test-results/gcc-13/pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp.execution create mode 100644 regression-tests/test-results/gcc-13/pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp.output diff --git a/regression-tests/test-results/gcc-13/gcc-version.output b/regression-tests/test-results/gcc-13/gcc-version.output new file mode 100644 index 000000000..7bbac4c85 --- /dev/null +++ b/regression-tests/test-results/gcc-13/gcc-version.output @@ -0,0 +1,5 @@ +c++ (GCC) 13.1.1 20230429 +Copyright (C) 2023 Free Software Foundation, Inc. +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + diff --git a/regression-tests/test-results/gcc-13/pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp.execution b/regression-tests/test-results/gcc-13/pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp.execution new file mode 100644 index 000000000..e69de29bb diff --git a/regression-tests/test-results/gcc-13/pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp.output b/regression-tests/test-results/gcc-13/pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp.output new file mode 100644 index 000000000..e69de29bb