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/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 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 {};