Skip to content

Commit 1570f7e

Browse files
committed
Add mutable_argv, closes #592
See discussion in #592 comment thread
1 parent bf29741 commit 1570f7e

13 files changed

+38
-23
lines changed

include/cpp2util.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@
205205
#include <string>
206206
#include <string_view>
207207
#include <vector>
208+
#include <span>
208209
#include <iostream>
209210
#include <variant>
210211
#include <any>
@@ -1490,16 +1491,17 @@ inline auto to_string(std::tuple<Ts...> const& t) -> std::string
14901491
//
14911492
struct args_t : std::vector<std::string_view>
14921493
{
1493-
args_t(int c, char const* const* v) : vector{static_cast<size_t>(c)}, argc{c}, argv{v} {}
1494+
args_t(int c, char** v) : vector{static_cast<size_t>(c)}, argc{c}, argv{v}, mutable_argv{v} {}
14941495

1495-
int argc = 0;
1496-
char const* const* argv = nullptr;
1496+
int argc = 0;
1497+
char const* const* argv = nullptr;
1498+
char** mutable_argv = nullptr;
14971499
};
14981500

1499-
inline auto make_args(int argc, char const* const* argv) -> args_t
1501+
inline auto make_args(int argc, char** argv) -> args_t
15001502
{
15011503
auto ret = args_t{argc, argv};
1502-
std::copy(argv, argv + argc, ret.data());
1504+
std::ranges::copy( std::span(argv, argc), ret.data() );
15031505
return ret;
15041506
}
15051507

regression-tests/pure2-main-args.cpp2

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,6 @@
11
main: (args) =
2-
std::cout << "args.argc is (args.argc)$, and args.argv[0] is (args.argv[0])$\n";
2+
std::cout
3+
<< "args.argc is (args.argc)$\n"
4+
<< "args.argv[0] is (args.argv[0])$\n"
5+
<< "args.mutable_argv[0] is (args.mutable_argv[0])$\n"
6+
;
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1-
args.argc is 1, and args.argv[0] is ./test.exe
1+
args.argc is 1
2+
args.argv[0] is ./test.exe
3+
args.mutable_argv[0] is ./test.exe
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1-
args.argc is 1, and args.argv[0] is ./test.exe
1+
args.argc is 1
2+
args.argv[0] is ./test.exe
3+
args.mutable_argv[0] is ./test.exe

regression-tests/test-results/mixed-fixed-type-aliases.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ auto test(auto const& x) -> void;
2121

2222

2323
#line 15 "mixed-fixed-type-aliases.cpp2"
24-
[[nodiscard]] auto main(int const argc_, char const* const* const argv_) -> int;
24+
[[nodiscard]] auto main(int const argc_, char** argv_) -> int;
2525

2626

2727
//=== Cpp2 function definitions =================================================
@@ -35,7 +35,7 @@ auto test(auto const& x) -> void{
3535
<< "\n";
3636
}
3737

38-
[[nodiscard]] auto main(int const argc_, char const* const* const argv_) -> int{
38+
[[nodiscard]] auto main(int const argc_, char** argv_) -> int{
3939
auto args = cpp2::make_args(argc_, argv_);
4040
#line 16 "mixed-fixed-type-aliases.cpp2"
4141
my::u16 y {42};
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1-
args.argc is 1, and args.argv[0] is test.exe
1+
args.argc is 1
2+
args.argv[0] is test.exe
3+
args.mutable_argv[0] is test.exe

regression-tests/test-results/pure2-bugfix-for-discard-precedence.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class quantity {
2626
#line 5 "pure2-bugfix-for-discard-precedence.cpp2"
2727
};
2828

29-
auto main(int const argc_, char const* const* const argv_) -> int;
29+
auto main(int const argc_, char** argv_) -> int;
3030

3131

3232
//=== Cpp2 function definitions =================================================
@@ -46,7 +46,7 @@ auto main(int const argc_, char const* const* const argv_) -> int;
4646
[[nodiscard]] auto quantity::operator+(quantity const& that) -> quantity { return quantity(number + that.number); }
4747

4848
#line 7 "pure2-bugfix-for-discard-precedence.cpp2"
49-
auto main(int const argc_, char const* const* const argv_) -> int{
49+
auto main(int const argc_, char** argv_) -> int{
5050
auto args = cpp2::make_args(argc_, argv_);
5151
#line 8 "pure2-bugfix-for-discard-precedence.cpp2"
5252
quantity x {1729};

regression-tests/test-results/pure2-initialization-safety-with-else-if.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@
1111
//=== Cpp2 type definitions and function declarations ===========================
1212

1313
#line 1 "pure2-initialization-safety-with-else-if.cpp2"
14-
auto main(int const argc_, char const* const* const argv_) -> int;
14+
auto main(int const argc_, char** argv_) -> int;
1515

1616

1717
//=== Cpp2 function definitions =================================================
1818

1919
#line 1 "pure2-initialization-safety-with-else-if.cpp2"
20-
auto main(int const argc_, char const* const* const argv_) -> int{
20+
auto main(int const argc_, char** argv_) -> int{
2121
auto args = cpp2::make_args(argc_, argv_);
2222
#line 2 "pure2-initialization-safety-with-else-if.cpp2"
2323
cpp2::deferred_init<int*> p;

regression-tests/test-results/pure2-main-args.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,17 @@
1111
//=== Cpp2 type definitions and function declarations ===========================
1212

1313
#line 1 "pure2-main-args.cpp2"
14-
auto main(int const argc_, char const* const* const argv_) -> int;
14+
auto main(int const argc_, char** argv_) -> int;
1515

1616

1717
//=== Cpp2 function definitions =================================================
1818

1919
#line 1 "pure2-main-args.cpp2"
20-
auto main(int const argc_, char const* const* const argv_) -> int {
20+
auto main(int const argc_, char** argv_) -> int {
2121
auto args = cpp2::make_args(argc_, argv_);
2222
#line 2 "pure2-main-args.cpp2"
23-
std::cout << "args.argc is " + cpp2::to_string(args.argc) + ", and args.argv[0] is " + cpp2::to_string(cpp2::assert_in_bounds(args.argv, 0)) + "\n"; }
23+
std::cout
24+
<< "args.argc is " + cpp2::to_string(args.argc) + "\n"
25+
<< "args.argv[0] is " + cpp2::to_string(cpp2::assert_in_bounds(args.argv, 0)) + "\n"
26+
<< "args.mutable_argv[0] is " + cpp2::to_string(cpp2::assert_in_bounds(args.mutable_argv, 0)) + "\n"; }
2427

regression-tests/test-results/pure2-statement-scope-parameters.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@
1212

1313

1414
#line 2 "pure2-statement-scope-parameters.cpp2"
15-
auto main(int const argc_, char const* const* const argv_) -> int;
15+
auto main(int const argc_, char** argv_) -> int;
1616

1717

1818
//=== Cpp2 function definitions =================================================
1919

2020

2121
#line 2 "pure2-statement-scope-parameters.cpp2"
22-
auto main(int const argc_, char const* const* const argv_) -> int{
22+
auto main(int const argc_, char** argv_) -> int{
2323
auto args = cpp2::make_args(argc_, argv_);
2424
#line 3 "pure2-statement-scope-parameters.cpp2"
2525
auto local_int {42};

regression-tests/test-results/version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
cppfront compiler v0.2.1 Build 8812:1816
2+
cppfront compiler v0.2.1 Build 8814:1300
33
Copyright(c) Herb Sutter All rights reserved
44

55
SPDX-License-Identifier: CC-BY-NC-ND-4.0

source/build.info

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
"8812:1816"
1+
"8814:1300"

source/cppfront.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4260,7 +4260,7 @@ class cppfront
42604260
)
42614261
{
42624262
printer.print_cpp2(
4263-
"(int const argc_, char const* const* const argv_)",
4263+
"(int const argc_, char** argv_)",
42644264
n.parameters->position()
42654265
);
42664266
current_functions.back().prolog.statements.push_back(

0 commit comments

Comments
 (0)