From 7e65a71b5a7ad543f2edf5422ce5251a1430ddd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johel=20Ernesto=20Guerrero=20Pe=C3=B1a?= Date: Thu, 17 Aug 2023 18:43:53 -0400 Subject: [PATCH 1/2] fix(parse): add missing condition for "inside initializer" --- ...2-bugfix-for-non-local-initialization.cpp2 | 3 ++ ...for-non-local-initialization.cpp.execution | 0 ...ix-for-non-local-initialization.cpp.output | 0 ...e2-bugfix-for-non-local-initialization.cpp | 33 +++++++++++++++++++ ...x-for-non-local-initialization.cpp2.output | 2 ++ source/parse.h | 9 ++--- 6 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 regression-tests/pure2-bugfix-for-non-local-initialization.cpp2 create mode 100644 regression-tests/test-results/clang-18/pure2-bugfix-for-non-local-initialization.cpp.execution create mode 100644 regression-tests/test-results/clang-18/pure2-bugfix-for-non-local-initialization.cpp.output create mode 100644 regression-tests/test-results/pure2-bugfix-for-non-local-initialization.cpp create mode 100644 regression-tests/test-results/pure2-bugfix-for-non-local-initialization.cpp2.output diff --git a/regression-tests/pure2-bugfix-for-non-local-initialization.cpp2 b/regression-tests/pure2-bugfix-for-non-local-initialization.cpp2 new file mode 100644 index 0000000000..aa99ed5813 --- /dev/null +++ b/regression-tests/pure2-bugfix-for-non-local-initialization.cpp2 @@ -0,0 +1,3 @@ +pair: type = { } +g: (x: pair<:i32 = (0), :i32 = (0)>) = { } +main: () = { } diff --git a/regression-tests/test-results/clang-18/pure2-bugfix-for-non-local-initialization.cpp.execution b/regression-tests/test-results/clang-18/pure2-bugfix-for-non-local-initialization.cpp.execution new file mode 100644 index 0000000000..e69de29bb2 diff --git a/regression-tests/test-results/clang-18/pure2-bugfix-for-non-local-initialization.cpp.output b/regression-tests/test-results/clang-18/pure2-bugfix-for-non-local-initialization.cpp.output new file mode 100644 index 0000000000..e69de29bb2 diff --git a/regression-tests/test-results/pure2-bugfix-for-non-local-initialization.cpp b/regression-tests/test-results/pure2-bugfix-for-non-local-initialization.cpp new file mode 100644 index 0000000000..95a671fd35 --- /dev/null +++ b/regression-tests/test-results/pure2-bugfix-for-non-local-initialization.cpp @@ -0,0 +1,33 @@ + +#define CPP2_USE_MODULES Yes + +//=== Cpp2 type declarations ==================================================== + + +#include "cpp2util.h" + +#line 1 "pure2-bugfix-for-non-local-initialization.cpp2" +template class pair; + + +//=== Cpp2 type definitions and function declarations =========================== + +#line 1 "pure2-bugfix-for-non-local-initialization.cpp2" +template class pair { + public: pair() = default; + public: pair(pair const&) = delete; /* No 'that' constructor, suppress copy */ + public: auto operator=(pair const&) -> void = delete; + +#line 1 "pure2-bugfix-for-non-local-initialization.cpp2" +}; +auto g(cpp2::in> x) -> void; +auto main() -> int; + + +//=== Cpp2 function definitions ================================================= + + +#line 2 "pure2-bugfix-for-non-local-initialization.cpp2" +auto g(cpp2::in> x) -> void{} +auto main() -> int{} + diff --git a/regression-tests/test-results/pure2-bugfix-for-non-local-initialization.cpp2.output b/regression-tests/test-results/pure2-bugfix-for-non-local-initialization.cpp2.output new file mode 100644 index 0000000000..164558393a --- /dev/null +++ b/regression-tests/test-results/pure2-bugfix-for-non-local-initialization.cpp2.output @@ -0,0 +1,2 @@ +pure2-bugfix-for-non-local-initialization.cpp2... ok (all Cpp2, passes safety checks) + diff --git a/source/parse.h b/source/parse.h index c4779e5bd0..5c2ba6b88f 100644 --- a/source/parse.h +++ b/source/parse.h @@ -4161,6 +4161,7 @@ class parser curr().type() != lexeme::Semicolon && curr().type() != lexeme::RightParen && curr().type() != lexeme::RightBracket + && curr().type() != lexeme::Greater && curr().type() != lexeme::Comma ) { expr_list->inside_initializer = false; @@ -5031,20 +5032,20 @@ class parser } return expression(false); // false == disallow unparenthesized relational comparisons in template args }() - ) + ) { term.arg = std::move(e); } - + // Else try parsing it as a type id else if (auto i = type_id()) { term.arg = std::move(i); } - + else { break; } - + n->template_args.push_back( std::move(term) ); } // Use the lambda trick to jam in a "next" clause From ed5cd039b7cb95cd0d63ffd9109eae242ed26844 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johel=20Ernesto=20Guerrero=20Pe=C3=B1a?= Date: Thu, 17 Aug 2023 18:46:43 -0400 Subject: [PATCH 2/2] test: use the test case from #597 --- ...2-bugfix-for-non-local-initialization.cpp2 | 11 ++++++--- ...e2-bugfix-for-non-local-initialization.cpp | 23 +++++++++---------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/regression-tests/pure2-bugfix-for-non-local-initialization.cpp2 b/regression-tests/pure2-bugfix-for-non-local-initialization.cpp2 index aa99ed5813..67d6709d52 100644 --- a/regression-tests/pure2-bugfix-for-non-local-initialization.cpp2 +++ b/regression-tests/pure2-bugfix-for-non-local-initialization.cpp2 @@ -1,3 +1,8 @@ -pair: type = { } -g: (x: pair<:i32 = (0), :i32 = (0)>) = { } -main: () = { } +u: type == std::array; +t: @struct type = { + this: std::integral_constant; +} +main: () = { + [[assert Testing: t::value[0] == 17]] + [[assert Testing: t::value[1] == 29]] +} diff --git a/regression-tests/test-results/pure2-bugfix-for-non-local-initialization.cpp b/regression-tests/test-results/pure2-bugfix-for-non-local-initialization.cpp index 95a671fd35..8570dbddf9 100644 --- a/regression-tests/test-results/pure2-bugfix-for-non-local-initialization.cpp +++ b/regression-tests/test-results/pure2-bugfix-for-non-local-initialization.cpp @@ -6,28 +6,27 @@ #include "cpp2util.h" -#line 1 "pure2-bugfix-for-non-local-initialization.cpp2" -template class pair; +#line 2 "pure2-bugfix-for-non-local-initialization.cpp2" +class t; + //=== Cpp2 type definitions and function declarations =========================== #line 1 "pure2-bugfix-for-non-local-initialization.cpp2" -template class pair { - public: pair() = default; - public: pair(pair const&) = delete; /* No 'that' constructor, suppress copy */ - public: auto operator=(pair const&) -> void = delete; +using u = std::array; +class t: public std::integral_constant { -#line 1 "pure2-bugfix-for-non-local-initialization.cpp2" }; -auto g(cpp2::in> x) -> void; auto main() -> int; - + //=== Cpp2 function definitions ================================================= -#line 2 "pure2-bugfix-for-non-local-initialization.cpp2" -auto g(cpp2::in> x) -> void{} -auto main() -> int{} +#line 5 "pure2-bugfix-for-non-local-initialization.cpp2" +auto main() -> int{ + cpp2::Testing.expects(cpp2::assert_in_bounds(t::value, 0)==17, ""); + cpp2::Testing.expects(cpp2::assert_in_bounds(t::value, 1)==29, ""); +}