Skip to content

Commit e446ca3

Browse files
committed
Default initialize function argument
1 parent 130f149 commit e446ca3

26 files changed

+59
-1
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
auto cxx(int x, std::string y) -> void {}
2+
3+
cxx2 : (x : int, y : std::string) = {}
4+
5+
main : () = {
6+
cxx(1, "test");
7+
cxx((), ());
8+
cxx2(1, "test");
9+
cxx2((), ());
10+
}

regression-tests/test-results/apple-clang-14-c++2b/mixed-default-arguments.cpp.execution

Whitespace-only changes.

regression-tests/test-results/apple-clang-14-c++2b/mixed-default-arguments.cpp.output

Whitespace-only changes.

regression-tests/test-results/apple-clang-15-c++2b/mixed-default-arguments.cpp.execution

Whitespace-only changes.

regression-tests/test-results/apple-clang-15-c++2b/mixed-default-arguments.cpp.output

Whitespace-only changes.

regression-tests/test-results/clang-12-c++20/mixed-default-arguments.cpp.execution

Whitespace-only changes.

regression-tests/test-results/clang-12-c++20/mixed-default-arguments.cpp.output

Whitespace-only changes.

regression-tests/test-results/clang-15-c++20-libcpp/mixed-default-arguments.cpp.execution

Whitespace-only changes.

regression-tests/test-results/clang-15-c++20-libcpp/mixed-default-arguments.cpp.output

Whitespace-only changes.

regression-tests/test-results/clang-15-c++20/mixed-default-arguments.cpp.execution

Whitespace-only changes.

regression-tests/test-results/clang-15-c++20/mixed-default-arguments.cpp.output

Whitespace-only changes.

regression-tests/test-results/clang-18-c++20/mixed-default-arguments.cpp.execution

Whitespace-only changes.

regression-tests/test-results/clang-18-c++20/mixed-default-arguments.cpp.output

Whitespace-only changes.

regression-tests/test-results/gcc-10-c++20/mixed-default-arguments.cpp.execution

Whitespace-only changes.

regression-tests/test-results/gcc-10-c++20/mixed-default-arguments.cpp.output

Whitespace-only changes.

regression-tests/test-results/gcc-13-c++2b/mixed-default-arguments.cpp.execution

Whitespace-only changes.

regression-tests/test-results/gcc-13-c++2b/mixed-default-arguments.cpp.output

Whitespace-only changes.

regression-tests/test-results/gcc-14-c++2b/mixed-default-arguments.cpp.execution

Whitespace-only changes.

regression-tests/test-results/gcc-14-c++2b/mixed-default-arguments.cpp.output

Whitespace-only changes.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
2+
3+
//=== Cpp2 type declarations ====================================================
4+
5+
6+
#include "cpp2util.h"
7+
8+
#line 1 "mixed-default-arguments.cpp2"
9+
10+
11+
//=== Cpp2 type definitions and function declarations ===========================
12+
13+
#line 1 "mixed-default-arguments.cpp2"
14+
auto cxx(int x, std::string y) -> void {}
15+
16+
#line 3 "mixed-default-arguments.cpp2"
17+
auto cxx2(cpp2::impl::in<int> x, cpp2::impl::in<std::string> y) -> void;
18+
19+
auto main() -> int;
20+
21+
//=== Cpp2 function definitions =================================================
22+
23+
#line 1 "mixed-default-arguments.cpp2"
24+
25+
#line 3 "mixed-default-arguments.cpp2"
26+
auto cxx2(cpp2::impl::in<int> x, cpp2::impl::in<std::string> y) -> void{}
27+
28+
#line 5 "mixed-default-arguments.cpp2"
29+
auto main() -> int{
30+
cxx(1, "test");
31+
cxx({}, {});
32+
cxx2(1, "test");
33+
cxx2({}, {});
34+
}
35+

regression-tests/test-results/mixed-default-arguments.cpp.out

Whitespace-only changes.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
mixed-default-arguments.cpp2... ok (mixed Cpp1/Cpp2, Cpp2 code passes safety checks)
2+

regression-tests/test-results/msvc-2022-c++20/mixed-default-arguments.cpp.output

Whitespace-only changes.

regression-tests/test-results/msvc-2022-c++latest/mixed-default-arguments.cpp.output

Whitespace-only changes.

source/parse.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,7 @@ struct expression_list_node
661661
token const* open_paren = {};
662662
token const* close_paren = {};
663663
bool inside_initializer = false;
664+
bool default_initializer = false;
664665

665666
struct term {
666667
passing_style pass = {};
@@ -5393,6 +5394,7 @@ class parser
53935394
};
53945395
mutable std::vector<function_body_extent> function_body_extents;
53955396
mutable bool is_function_body_extents_sorted = false;
5397+
bool is_inside_call_expr = false;
53965398

53975399
public:
53985400
auto is_within_function_body(source_position p) const
@@ -5747,6 +5749,8 @@ class parser
57475749
expr_list->inside_initializer = false;
57485750
}
57495751
n->expression_list_is_fold_expression = expr_list->is_fold_expression();
5752+
expr_list->default_initializer =
5753+
is_inside_call_expr && std::empty(expr_list->expressions);
57505754
n->expr = std::move(expr_list);
57515755
return n;
57525756
}
@@ -5899,8 +5903,10 @@ class parser
58995903
// Next should be an expression-list followed by a ')'
59005904
// If not, then this wasn't a call expression so backtrack to
59015905
// the '(' which will be part of the next grammar production
5902-
5906+
is_inside_call_expr = true;
59035907
term.expr_list = expression_list(term.op, lexeme::RightParen);
5908+
is_inside_call_expr = false;
5909+
59045910
if (
59055911
term.expr_list
59065912
&& curr().type() == lexeme::RightParen

source/to_cpp1.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3959,6 +3959,11 @@ class cppfront
39593959
)
39603960
-> void
39613961
{ STACKINSTR
3962+
if (n.default_initializer) {
3963+
printer.print_cpp2("{}", n.position());
3964+
return;
3965+
}
3966+
39623967
auto add_parens =
39633968
should_add_expression_list_parens()
39643969
&& !n.inside_initializer

0 commit comments

Comments
 (0)