diff --git a/regression-tests/pure2-inout-passing-style-call.cpp2 b/regression-tests/pure2-inout-passing-style-call.cpp2 new file mode 100644 index 0000000000..811c0ab3dd --- /dev/null +++ b/regression-tests/pure2-inout-passing-style-call.cpp2 @@ -0,0 +1,8 @@ +f2: (inout x) -> _ = { + return x * 2; +} + +main: () -> int = { + x := 21; + std::cout << f2(inout x) << std::endl; +} diff --git a/regression-tests/test-results/apple-clang-14/pure2-inout-passing-style-call.cpp.execution b/regression-tests/test-results/apple-clang-14/pure2-inout-passing-style-call.cpp.execution new file mode 100644 index 0000000000..d81cc0710e --- /dev/null +++ b/regression-tests/test-results/apple-clang-14/pure2-inout-passing-style-call.cpp.execution @@ -0,0 +1 @@ +42 diff --git a/regression-tests/test-results/apple-clang-14/pure2-inout-passing-style-call.cpp.output b/regression-tests/test-results/apple-clang-14/pure2-inout-passing-style-call.cpp.output new file mode 100644 index 0000000000..e69de29bb2 diff --git a/regression-tests/test-results/clang-12/pure2-inout-passing-style-call.cpp.execution b/regression-tests/test-results/clang-12/pure2-inout-passing-style-call.cpp.execution new file mode 100644 index 0000000000..d81cc0710e --- /dev/null +++ b/regression-tests/test-results/clang-12/pure2-inout-passing-style-call.cpp.execution @@ -0,0 +1 @@ +42 diff --git a/regression-tests/test-results/clang-12/pure2-inout-passing-style-call.cpp.output b/regression-tests/test-results/clang-12/pure2-inout-passing-style-call.cpp.output new file mode 100644 index 0000000000..e69de29bb2 diff --git a/regression-tests/test-results/pure2-inout-passing-style-call.cpp b/regression-tests/test-results/pure2-inout-passing-style-call.cpp new file mode 100644 index 0000000000..2b07a4db44 --- /dev/null +++ b/regression-tests/test-results/pure2-inout-passing-style-call.cpp @@ -0,0 +1,23 @@ + +#define CPP2_USE_MODULES Yes + +#include "cpp2util.h" + + +#line 1 "pure2-inout-passing-style-call.cpp2" +[[nodiscard]] auto f2(auto& x) -> auto; +#line 5 "pure2-inout-passing-style-call.cpp2" +[[nodiscard]] auto main() -> int; + +//=== Cpp2 definitions ========================================================== + +#line 1 "pure2-inout-passing-style-call.cpp2" +[[nodiscard]] auto f2(auto& x) -> auto{ + return x * 2; +} + +[[nodiscard]] auto main() -> int{ + auto x {21}; + std::cout << f2( x) << std::endl; +} + diff --git a/regression-tests/test-results/pure2-inout-passing-style-call.cpp2 b/regression-tests/test-results/pure2-inout-passing-style-call.cpp2 new file mode 100644 index 0000000000..811c0ab3dd --- /dev/null +++ b/regression-tests/test-results/pure2-inout-passing-style-call.cpp2 @@ -0,0 +1,8 @@ +f2: (inout x) -> _ = { + return x * 2; +} + +main: () -> int = { + x := 21; + std::cout << f2(inout x) << std::endl; +} diff --git a/regression-tests/test-results/pure2-inout-passing-style-call.cpp2.output b/regression-tests/test-results/pure2-inout-passing-style-call.cpp2.output new file mode 100644 index 0000000000..2d4c3147dd --- /dev/null +++ b/regression-tests/test-results/pure2-inout-passing-style-call.cpp2.output @@ -0,0 +1,2 @@ +pure2-inout-passing-style-call.cpp2... ok (all Cpp2, passes safety checks) + diff --git a/source/cppfront.cpp b/source/cppfront.cpp index 63b3633e96..d51e230ab6 100644 --- a/source/cppfront.cpp +++ b/source/cppfront.cpp @@ -3280,6 +3280,7 @@ class cppfront x.pass == passing_style::out || x.pass == passing_style::move || x.pass == passing_style::forward + || x.pass == passing_style::inout ); if (x.pass == passing_style::out) { is_out = true; @@ -3290,6 +3291,10 @@ class cppfront printer.print_cpp2("std::move(", n.position()); offset = 6; // because we're replacing "move " (followed by at least one space) with "std::move(" } + else if (x.pass == passing_style::inout) { + is_out = true; + offset = -6; // because we're replacing "inout " (followed by at least one space) with nothing + } } if (is_out) { diff --git a/source/parse.h b/source/parse.h index 32b73c51b8..1756eefd5a 100644 --- a/source/parse.h +++ b/source/parse.h @@ -3156,6 +3156,7 @@ class parser dir == passing_style::out || dir == passing_style::move || dir == passing_style::forward + || dir == passing_style::inout ) && peek(1) && peek(1)->type() == lexeme::Identifier