diff --git a/regression-tests/mixed-default-arguments.cpp2 b/regression-tests/mixed-default-arguments.cpp2 new file mode 100644 index 000000000..1b23283b7 --- /dev/null +++ b/regression-tests/mixed-default-arguments.cpp2 @@ -0,0 +1,14 @@ +auto cxx(int x, std::string y) -> void { + std::cout << x << " \"" << y << "\"" << "\n"; +} + +cxx2 : (x : int, y : std::string) = { + std::cout << "(x)$ \"(y)$\"\n"; +} + +main : () = { + cxx(1, "test"); + cxx((), ()); + cxx2(1, "test"); + cxx2((), ()); +} \ No newline at end of file diff --git a/regression-tests/test-results/apple-clang-14-c++2b/mixed-default-arguments.cpp.execution b/regression-tests/test-results/apple-clang-14-c++2b/mixed-default-arguments.cpp.execution new file mode 100644 index 000000000..e69de29bb diff --git a/regression-tests/test-results/apple-clang-14-c++2b/mixed-default-arguments.cpp.output b/regression-tests/test-results/apple-clang-14-c++2b/mixed-default-arguments.cpp.output new file mode 100644 index 000000000..e69de29bb diff --git a/regression-tests/test-results/apple-clang-15-c++2b/mixed-default-arguments.cpp.execution b/regression-tests/test-results/apple-clang-15-c++2b/mixed-default-arguments.cpp.execution new file mode 100644 index 000000000..e69de29bb diff --git a/regression-tests/test-results/apple-clang-15-c++2b/mixed-default-arguments.cpp.output b/regression-tests/test-results/apple-clang-15-c++2b/mixed-default-arguments.cpp.output new file mode 100644 index 000000000..e69de29bb diff --git a/regression-tests/test-results/clang-12-c++20/mixed-default-arguments.cpp.execution b/regression-tests/test-results/clang-12-c++20/mixed-default-arguments.cpp.execution new file mode 100644 index 000000000..98b5204b6 --- /dev/null +++ b/regression-tests/test-results/clang-12-c++20/mixed-default-arguments.cpp.execution @@ -0,0 +1,4 @@ +1 "test" +0 "" +1 "test" +0 "" diff --git a/regression-tests/test-results/clang-12-c++20/mixed-default-arguments.cpp.output b/regression-tests/test-results/clang-12-c++20/mixed-default-arguments.cpp.output new file mode 100644 index 000000000..e69de29bb diff --git a/regression-tests/test-results/clang-15-c++20-libcpp/mixed-default-arguments.cpp.execution b/regression-tests/test-results/clang-15-c++20-libcpp/mixed-default-arguments.cpp.execution new file mode 100644 index 000000000..e69de29bb diff --git a/regression-tests/test-results/clang-15-c++20-libcpp/mixed-default-arguments.cpp.output b/regression-tests/test-results/clang-15-c++20-libcpp/mixed-default-arguments.cpp.output new file mode 100644 index 000000000..e69de29bb diff --git a/regression-tests/test-results/clang-15-c++20/mixed-default-arguments.cpp.execution b/regression-tests/test-results/clang-15-c++20/mixed-default-arguments.cpp.execution new file mode 100644 index 000000000..e69de29bb diff --git a/regression-tests/test-results/clang-15-c++20/mixed-default-arguments.cpp.output b/regression-tests/test-results/clang-15-c++20/mixed-default-arguments.cpp.output new file mode 100644 index 000000000..e69de29bb diff --git a/regression-tests/test-results/clang-18-c++20/mixed-default-arguments.cpp.execution b/regression-tests/test-results/clang-18-c++20/mixed-default-arguments.cpp.execution new file mode 100644 index 000000000..e69de29bb diff --git a/regression-tests/test-results/clang-18-c++20/mixed-default-arguments.cpp.output b/regression-tests/test-results/clang-18-c++20/mixed-default-arguments.cpp.output new file mode 100644 index 000000000..e69de29bb diff --git a/regression-tests/test-results/gcc-10-c++20/mixed-default-arguments.cpp.execution b/regression-tests/test-results/gcc-10-c++20/mixed-default-arguments.cpp.execution new file mode 100644 index 000000000..98b5204b6 --- /dev/null +++ b/regression-tests/test-results/gcc-10-c++20/mixed-default-arguments.cpp.execution @@ -0,0 +1,4 @@ +1 "test" +0 "" +1 "test" +0 "" diff --git a/regression-tests/test-results/gcc-10-c++20/mixed-default-arguments.cpp.output b/regression-tests/test-results/gcc-10-c++20/mixed-default-arguments.cpp.output new file mode 100644 index 000000000..e69de29bb diff --git a/regression-tests/test-results/gcc-13-c++2b/mixed-default-arguments.cpp.execution b/regression-tests/test-results/gcc-13-c++2b/mixed-default-arguments.cpp.execution new file mode 100644 index 000000000..e69de29bb diff --git a/regression-tests/test-results/gcc-13-c++2b/mixed-default-arguments.cpp.output b/regression-tests/test-results/gcc-13-c++2b/mixed-default-arguments.cpp.output new file mode 100644 index 000000000..e69de29bb diff --git a/regression-tests/test-results/gcc-14-c++2b/gcc-version.output b/regression-tests/test-results/gcc-14-c++2b/gcc-version.output index 10159098f..27c06a7a1 100644 --- a/regression-tests/test-results/gcc-14-c++2b/gcc-version.output +++ b/regression-tests/test-results/gcc-14-c++2b/gcc-version.output @@ -1,4 +1,5 @@ -g++-14 (Ubuntu 14-20240412-0ubuntu1) 14.0.1 20240412 (experimental) [master r14-9935-g67e1433a94f] +g++ (GCC) 14.1.1 20240607 (Red Hat 14.1.1-5) Copyright (C) 2024 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-14-c++2b/mixed-default-arguments.cpp.execution b/regression-tests/test-results/gcc-14-c++2b/mixed-default-arguments.cpp.execution new file mode 100644 index 000000000..98b5204b6 --- /dev/null +++ b/regression-tests/test-results/gcc-14-c++2b/mixed-default-arguments.cpp.execution @@ -0,0 +1,4 @@ +1 "test" +0 "" +1 "test" +0 "" diff --git a/regression-tests/test-results/gcc-14-c++2b/mixed-default-arguments.cpp.output b/regression-tests/test-results/gcc-14-c++2b/mixed-default-arguments.cpp.output new file mode 100644 index 000000000..e69de29bb diff --git a/regression-tests/test-results/gcc-14-c++2b/run-tests-gcc-13.sh b/regression-tests/test-results/gcc-14-c++2b/run-tests-gcc-14.sh similarity index 78% rename from regression-tests/test-results/gcc-14-c++2b/run-tests-gcc-13.sh rename to regression-tests/test-results/gcc-14-c++2b/run-tests-gcc-14.sh index 95f3efcda..07eaef6ea 100644 --- a/regression-tests/test-results/gcc-14-c++2b/run-tests-gcc-13.sh +++ b/regression-tests/test-results/gcc-14-c++2b/run-tests-gcc-14.sh @@ -1,5 +1,5 @@ -# This is intended to be run in the /test-results/gcc-13 subdirectory -# in a Linux shell with gcc 13 installed +# This is intended to be run in the /test-results/gcc-14 subdirectory +# in a Linux shell with gcc 14 installed # cp ../*.cpp . rm -f *.output @@ -9,7 +9,7 @@ g++ --version > gcc-version.output 2>&1 for f in *.cpp do let count=count+1 - printf "[%s] Starting gcc 13 %s\n" "$count" "$f" + printf "[%s] Starting gcc 14 %s\n" "$count" "$f" g++ -I../../../include -std=c++2b -pthread -Wold-style-cast -Wunused-parameter -o test.exe $f > $f.output 2>&1 rm -f $f if test -f "test.exe"; then diff --git a/regression-tests/test-results/mixed-default-arguments.cpp b/regression-tests/test-results/mixed-default-arguments.cpp new file mode 100644 index 000000000..bdcb01ebd --- /dev/null +++ b/regression-tests/test-results/mixed-default-arguments.cpp @@ -0,0 +1,40 @@ + + +//=== Cpp2 type declarations ==================================================== + + +#include "cpp2util.h" + +#line 1 "mixed-default-arguments.cpp2" + + +//=== Cpp2 type definitions and function declarations =========================== + +#line 1 "mixed-default-arguments.cpp2" +auto cxx(int x, std::string y) -> void { + std::cout << x << " \"" << y << "\"" << "\n"; +} + +#line 5 "mixed-default-arguments.cpp2" +auto cxx2(cpp2::impl::in x, cpp2::impl::in y) -> void; + +#line 9 "mixed-default-arguments.cpp2" +auto main() -> int; + +//=== Cpp2 function definitions ================================================= + +#line 1 "mixed-default-arguments.cpp2" + +#line 5 "mixed-default-arguments.cpp2" +auto cxx2(cpp2::impl::in x, cpp2::impl::in y) -> void{ + std::cout << (cpp2::to_string(x) + " \"" + cpp2::to_string(y) + "\"\n"); +} + +#line 9 "mixed-default-arguments.cpp2" +auto main() -> int{ + cxx(1, "test"); + cxx({}, {}); + cxx2(1, "test"); + cxx2({}, {}); +} + diff --git a/regression-tests/test-results/mixed-default-arguments.cpp.out b/regression-tests/test-results/mixed-default-arguments.cpp.out new file mode 100644 index 000000000..e69de29bb diff --git a/regression-tests/test-results/mixed-default-arguments.cpp2.output b/regression-tests/test-results/mixed-default-arguments.cpp2.output new file mode 100644 index 000000000..094621735 --- /dev/null +++ b/regression-tests/test-results/mixed-default-arguments.cpp2.output @@ -0,0 +1,2 @@ +mixed-default-arguments.cpp2... ok (mixed Cpp1/Cpp2, Cpp2 code passes safety checks) + diff --git a/regression-tests/test-results/msvc-2022-c++20/mixed-default-arguments.cpp.output b/regression-tests/test-results/msvc-2022-c++20/mixed-default-arguments.cpp.output new file mode 100644 index 000000000..e69de29bb diff --git a/regression-tests/test-results/msvc-2022-c++latest/MSVC-version.output b/regression-tests/test-results/msvc-2022-c++latest/MSVC-version.output index ba2c3c80f..ca1298b64 100644 --- a/regression-tests/test-results/msvc-2022-c++latest/MSVC-version.output +++ b/regression-tests/test-results/msvc-2022-c++latest/MSVC-version.output @@ -1,3 +1,3 @@ -Microsoft (R) C/C++ Optimizing Compiler Version 19.39.33523 for x86 +Microsoft (R) C/C++ Optimizing Compiler Version 19.40.33811 for x64 Copyright (C) Microsoft Corporation. All rights reserved. diff --git a/regression-tests/test-results/msvc-2022-c++latest/mixed-default-arguments.cpp.execution b/regression-tests/test-results/msvc-2022-c++latest/mixed-default-arguments.cpp.execution new file mode 100644 index 000000000..98b5204b6 --- /dev/null +++ b/regression-tests/test-results/msvc-2022-c++latest/mixed-default-arguments.cpp.execution @@ -0,0 +1,4 @@ +1 "test" +0 "" +1 "test" +0 "" diff --git a/regression-tests/test-results/msvc-2022-c++latest/mixed-default-arguments.cpp.output b/regression-tests/test-results/msvc-2022-c++latest/mixed-default-arguments.cpp.output new file mode 100644 index 000000000..dc74a2a38 --- /dev/null +++ b/regression-tests/test-results/msvc-2022-c++latest/mixed-default-arguments.cpp.output @@ -0,0 +1 @@ +mixed-default-arguments.cpp diff --git a/source/parse.h b/source/parse.h index b8d404625..b82047300 100644 --- a/source/parse.h +++ b/source/parse.h @@ -661,6 +661,7 @@ struct expression_list_node token const* open_paren = {}; token const* close_paren = {}; bool inside_initializer = false; + bool default_initializer = false; struct term { passing_style pass = {}; @@ -5393,6 +5394,7 @@ class parser }; mutable std::vector function_body_extents; mutable bool is_function_body_extents_sorted = false; + bool is_inside_call_expr = false; public: auto is_within_function_body(source_position p) const @@ -5747,6 +5749,8 @@ class parser expr_list->inside_initializer = false; } n->expression_list_is_fold_expression = expr_list->is_fold_expression(); + expr_list->default_initializer = + is_inside_call_expr && std::empty(expr_list->expressions); n->expr = std::move(expr_list); return n; } @@ -5899,8 +5903,10 @@ class parser // Next should be an expression-list followed by a ')' // If not, then this wasn't a call expression so backtrack to // the '(' which will be part of the next grammar production - + is_inside_call_expr = true; term.expr_list = expression_list(term.op, lexeme::RightParen); + is_inside_call_expr = false; + if ( term.expr_list && curr().type() == lexeme::RightParen diff --git a/source/to_cpp1.h b/source/to_cpp1.h index 79289105b..63d3c15a0 100644 --- a/source/to_cpp1.h +++ b/source/to_cpp1.h @@ -3959,6 +3959,11 @@ class cppfront ) -> void { STACKINSTR + if (n.default_initializer) { + printer.print_cpp2("{}", n.position()); + return; + } + auto add_parens = should_add_expression_list_parens() && !n.inside_initializer