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..67d6709d52 --- /dev/null +++ b/regression-tests/pure2-bugfix-for-non-local-initialization.cpp2 @@ -0,0 +1,8 @@ +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/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..8570dbddf9 --- /dev/null +++ b/regression-tests/test-results/pure2-bugfix-for-non-local-initialization.cpp @@ -0,0 +1,32 @@ + +#define CPP2_USE_MODULES Yes + +//=== Cpp2 type declarations ==================================================== + + +#include "cpp2util.h" + + +#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" +using u = std::array; +class t: public std::integral_constant { + +}; +auto main() -> int; + + +//=== Cpp2 function definitions ================================================= + + +#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, ""); +} + 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