summaryrefslogtreecommitdiff
path: root/pkg/git/patch/0001-Avoid-casts-of-string-literal-to-integer-in-initiali.patch
blob: de7f1c0fff1488a339e98b029b05a1eb4b01310b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
From c5e1a197551f2e98c2c2f04e280ceefc05b4d491 Mon Sep 17 00:00:00 2001
From: Michael Forney <mforney@mforney.org>
Date: Fri, 21 Jun 2019 00:07:49 -0700
Subject: [PATCH] Avoid casts of string literal to integer in initializers

---
 builtin/am.c            |  2 +-
 builtin/blame.c         |  2 +-
 builtin/clone.c         |  4 ++--
 builtin/commit-tree.c   |  2 +-
 builtin/commit.c        | 10 +++++-----
 builtin/config.c        |  6 +++---
 builtin/describe.c      |  4 ++--
 builtin/fmt-merge-msg.c |  4 ++--
 builtin/gc.c            |  2 +-
 builtin/grep.c          |  4 ++--
 builtin/init-db.c       |  2 +-
 builtin/merge.c         |  6 +++---
 builtin/name-rev.c      |  2 +-
 builtin/rebase.c        | 18 +++++++++---------
 builtin/revert.c        |  2 +-
 builtin/show-branch.c   |  2 +-
 builtin/tag.c           |  4 ++--
 builtin/update-index.c  | 22 +++++++++++-----------
 builtin/write-tree.c    |  2 +-
 diff.c                  |  2 +-
 parse-options-cb.c      |  2 +-
 parse-options.c         | 30 +++++++++++++++---------------
 parse-options.h         | 31 +++++++++++++++++--------------
 ref-filter.h            |  2 +-
 24 files changed, 85 insertions(+), 82 deletions(-)

diff --git a/builtin/am.c b/builtin/am.c
index 8181c2aef3..399868a882 100644
--- a/builtin/am.c
+++ b/builtin/am.c
@@ -2240,7 +2240,7 @@ int cmd_am(int argc, const char **argv, const char *prefix)
 		OPT_RERERE_AUTOUPDATE(&state.allow_rerere_autoupdate),
 		{ OPTION_STRING, 'S', "gpg-sign", &state.sign_commit, N_("key-id"),
 		  N_("GPG-sign commits"),
-		  PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
+		  PARSE_OPT_OPTARG, NULL, { .strval = "" } },
 		OPT_HIDDEN_BOOL(0, "rebasing", &state.rebasing,
 			N_("(internal use for git-rebase)")),
 		OPT_END()
diff --git a/builtin/blame.c b/builtin/blame.c
index e946ba6cd9..acb221b75a 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -867,7 +867,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
 		 * and are only included here to get included in the "-h"
 		 * output:
 		 */
-		{ OPTION_LOWLEVEL_CALLBACK, 0, "indent-heuristic", NULL, NULL, N_("Use an experimental heuristic to improve diffs"), PARSE_OPT_NOARG, NULL, 0, parse_opt_unknown_cb },
+		{ OPTION_LOWLEVEL_CALLBACK, 0, "indent-heuristic", NULL, NULL, N_("Use an experimental heuristic to improve diffs"), PARSE_OPT_NOARG, NULL, { 0 }, parse_opt_unknown_cb },
 
 		OPT_BIT(0, "minimal", &xdl_opts, N_("Spend extra cycles to find better match"), XDF_NEED_MINIMAL),
 		OPT_STRING('S', NULL, &revs_file, N_("file"), N_("Use revisions from <file> instead of calling git-rev-list")),
diff --git a/builtin/clone.c b/builtin/clone.c
index c46ee29f0a..fcfd4d0465 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -79,7 +79,7 @@ static int recurse_submodules_cb(const struct option *opt,
 		string_list_append((struct string_list *)opt->value, arg);
 	else
 		string_list_append((struct string_list *)opt->value,
-				   (const char *)opt->defval);
+				   opt->def.strval);
 
 	return 0;
 }
@@ -104,7 +104,7 @@ static struct option builtin_clone_options[] = {
 	OPT_ALIAS(0, "recursive", "recurse-submodules"),
 	{ OPTION_CALLBACK, 0, "recurse-submodules", &option_recurse_submodules,
 	  N_("pathspec"), N_("initialize submodules in the clone"),
-	  PARSE_OPT_OPTARG, recurse_submodules_cb, (intptr_t)"." },
+	  PARSE_OPT_OPTARG, recurse_submodules_cb, { .strval = "." } },
 	OPT_INTEGER('j', "jobs", &max_jobs,
 		    N_("number of submodules cloned in parallel")),
 	OPT_STRING(0, "template", &option_template, N_("template-directory"),
diff --git a/builtin/commit-tree.c b/builtin/commit-tree.c
index b866d83951..13e7647f16 100644
--- a/builtin/commit-tree.c
+++ b/builtin/commit-tree.c
@@ -118,7 +118,7 @@ int cmd_commit_tree(int argc, const char **argv, const char *prefix)
 			N_("read commit log message from file"), PARSE_OPT_NONEG,
 			parse_file_arg_callback },
 		{ OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key-id"),
-			N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
+			N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, { .strval = "" } },
 		OPT_END()
 	};
 
diff --git a/builtin/commit.c b/builtin/commit.c
index e588bc6ad3..9370a6bef9 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -1354,14 +1354,14 @@ int cmd_status(int argc, const char **argv, const char *prefix)
 		{ OPTION_STRING, 'u', "untracked-files", &untracked_files_arg,
 		  N_("mode"),
 		  N_("show untracked files, optional modes: all, normal, no. (Default: all)"),
-		  PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
+		  PARSE_OPT_OPTARG, NULL, { .strval = "all" } },
 		{ OPTION_STRING, 0, "ignored", &ignored_arg,
 		  N_("mode"),
 		  N_("show ignored files, optional modes: traditional, matching, no. (Default: traditional)"),
-		  PARSE_OPT_OPTARG, NULL, (intptr_t)"traditional" },
+		  PARSE_OPT_OPTARG, NULL, { .strval = "traditional" } },
 		{ OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, N_("when"),
 		  N_("ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)"),
-		  PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
+		  PARSE_OPT_OPTARG, NULL, { .strval = "all" } },
 		OPT_COLUMN(0, "column", &s.colopts, N_("list untracked files in columns")),
 		OPT_BOOL(0, "no-renames", &no_renames, N_("do not detect renames")),
 		{ OPTION_CALLBACK, 'M', "find-renames", &rename_score_arg,
@@ -1509,7 +1509,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
 		OPT_CLEANUP(&cleanup_arg),
 		OPT_BOOL(0, "status", &include_status, N_("include status in commit message template")),
 		{ OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key-id"),
-		  N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
+		  N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, { .strval = "" } },
 		/* end commit message options */
 
 		OPT_GROUP(N_("Commit contents options")),
@@ -1534,7 +1534,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
 			 N_("terminate entries with NUL")),
 		OPT_BOOL(0, "amend", &amend, N_("amend previous commit")),
 		OPT_BOOL(0, "no-post-rewrite", &no_post_rewrite, N_("bypass post-rewrite hook")),
-		{ OPTION_STRING, 'u', "untracked-files", &untracked_files_arg, N_("mode"), N_("show untracked files, optional modes: all, normal, no. (Default: all)"), PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
+		{ OPTION_STRING, 'u', "untracked-files", &untracked_files_arg, N_("mode"), N_("show untracked files, optional modes: all, normal, no. (Default: all)"), PARSE_OPT_OPTARG, NULL, { .strval = "all" } },
 		/* end commit contents options */
 
 		OPT_HIDDEN_BOOL(0, "allow-empty", &allow_empty,
diff --git a/builtin/config.c b/builtin/config.c
index 98d65bc0ad..071853337b 100644
--- a/builtin/config.c
+++ b/builtin/config.c
@@ -67,7 +67,7 @@ static int show_origin;
 
 #define OPT_CALLBACK_VALUE(s, l, v, h, i) \
 	{ OPTION_CALLBACK, (s), (l), (v), NULL, (h), PARSE_OPT_NOARG | \
-	PARSE_OPT_NONEG, option_parse_type, (i) }
+	PARSE_OPT_NONEG, option_parse_type, { (i) } }
 
 static NORETURN void usage_builtin_config(void);
 
@@ -83,9 +83,9 @@ static int option_parse_type(const struct option *opt, const char *arg,
 
 	/*
 	 * To support '--<type>' style flags, begin with new_type equal to
-	 * opt->defval.
+	 * opt->def.intval.
 	 */
-	new_type = opt->defval;
+	new_type = opt->def.intval;
 	if (!new_type) {
 		if (!strcmp(arg, "bool"))
 			new_type = TYPE_BOOL;
diff --git a/builtin/describe.c b/builtin/describe.c
index b6df81d8d0..415fc0813c 100644
--- a/builtin/describe.c
+++ b/builtin/describe.c
@@ -553,10 +553,10 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
 			N_("show abbreviated commit object as fallback")),
 		{OPTION_STRING, 0, "dirty",  &dirty, N_("mark"),
 			N_("append <mark> on dirty working tree (default: \"-dirty\")"),
-			PARSE_OPT_OPTARG, NULL, (intptr_t) "-dirty"},
+			PARSE_OPT_OPTARG, NULL, {.strval = "-dirty"}},
 		{OPTION_STRING, 0, "broken",  &broken, N_("mark"),
 			N_("append <mark> on broken working tree (default: \"-broken\")"),
-			PARSE_OPT_OPTARG, NULL, (intptr_t) "-broken"},
+			PARSE_OPT_OPTARG, NULL, {.strval = "-broken"}},
 		OPT_END(),
 	};
 
diff --git a/builtin/fmt-merge-msg.c b/builtin/fmt-merge-msg.c
index a4615587fd..507d1841ab 100644
--- a/builtin/fmt-merge-msg.c
+++ b/builtin/fmt-merge-msg.c
@@ -670,11 +670,11 @@ int cmd_fmt_merge_msg(int argc, const char **argv, const char *prefix)
 	struct option options[] = {
 		{ OPTION_INTEGER, 0, "log", &shortlog_len, N_("n"),
 		  N_("populate log with at most <n> entries from shortlog"),
-		  PARSE_OPT_OPTARG, NULL, DEFAULT_MERGE_LOG_LEN },
+		  PARSE_OPT_OPTARG, NULL, { DEFAULT_MERGE_LOG_LEN } },
 		{ OPTION_INTEGER, 0, "summary", &shortlog_len, N_("n"),
 		  N_("alias for --log (deprecated)"),
 		  PARSE_OPT_OPTARG | PARSE_OPT_HIDDEN, NULL,
-		  DEFAULT_MERGE_LOG_LEN },
+		  { DEFAULT_MERGE_LOG_LEN } },
 		OPT_STRING('m', "message", &message, N_("text"),
 			N_("use <text> as start of message")),
 		OPT_FILENAME('F', "file", &inpath, N_("file to read from")),
diff --git a/builtin/gc.c b/builtin/gc.c
index fadb45489f..a8aa48360c 100644
--- a/builtin/gc.c
+++ b/builtin/gc.c
@@ -537,7 +537,7 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
 		OPT__QUIET(&quiet, N_("suppress progress reporting")),
 		{ OPTION_STRING, 0, "prune", &prune_expire, N_("date"),
 			N_("prune unreferenced objects"),
-			PARSE_OPT_OPTARG, NULL, (intptr_t)prune_expire },
+			PARSE_OPT_OPTARG, NULL, { .strval = prune_expire } },
 		OPT_BOOL(0, "aggressive", &aggressive, N_("be more thorough (increased runtime)")),
 		OPT_BOOL_F(0, "auto", &auto_gc, N_("enable auto-gc mode"),
 			   PARSE_OPT_NOCOMPLETE),
diff --git a/builtin/grep.c b/builtin/grep.c
index 50ce8d9461..1c6a56fcdc 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -839,7 +839,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
 			    N_("search in subdirectories (default)"), -1),
 		{ OPTION_INTEGER, 0, "max-depth", &opt.max_depth, N_("depth"),
 			N_("descend at most <depth> levels"), PARSE_OPT_NONEG,
-			NULL, 1 },
+			NULL, { 1 } },
 		OPT_GROUP(""),
 		OPT_SET_INT('E', "extended-regexp", &pattern_type_arg,
 			    N_("use extended POSIX regular expressions"),
@@ -923,7 +923,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
 		{ OPTION_STRING, 'O', "open-files-in-pager", &show_in_pager,
 			N_("pager"), N_("show matching files in the pager"),
 			PARSE_OPT_OPTARG | PARSE_OPT_NOCOMPLETE,
-			NULL, (intptr_t)default_pager },
+			NULL, { .strval = default_pager } },
 		OPT_BOOL_F(0, "ext-grep", &external_grep_allowed__ignored,
 			   N_("allow calling of grep(1) (ignored by this build)"),
 			   PARSE_OPT_NOCOMPLETE),
diff --git a/builtin/init-db.c b/builtin/init-db.c
index 944ec77fe1..8241581ef9 100644
--- a/builtin/init-db.c
+++ b/builtin/init-db.c
@@ -490,7 +490,7 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
 		{ OPTION_CALLBACK, 0, "shared", &init_shared_repository,
 			N_("permissions"),
 			N_("specify that the git repository is to be shared amongst several users"),
-			PARSE_OPT_OPTARG | PARSE_OPT_NONEG, shared_callback, 0},
+			PARSE_OPT_OPTARG | PARSE_OPT_NONEG, shared_callback, { 0 } },
 		OPT_BIT('q', "quiet", &flags, N_("be quiet"), INIT_DB_QUIET),
 		OPT_STRING(0, "separate-git-dir", &real_git_dir, N_("gitdir"),
 			   N_("separate git dir from working tree")),
diff --git a/builtin/merge.c b/builtin/merge.c
index 062e911441..5a05a63a56 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -248,7 +248,7 @@ static struct option builtin_merge_options[] = {
 	OPT_BOOL(0, "summary", &show_diffstat, N_("(synonym to --stat)")),
 	{ OPTION_INTEGER, 0, "log", &shortlog_len, N_("n"),
 	  N_("add (at most <n>) entries from shortlog to merge commit message"),
-	  PARSE_OPT_OPTARG, NULL, DEFAULT_MERGE_LOG_LEN },
+	  PARSE_OPT_OPTARG, NULL, { DEFAULT_MERGE_LOG_LEN } },
 	OPT_BOOL(0, "squash", &squash,
 		N_("create a single commit instead of doing a merge")),
 	OPT_BOOL(0, "commit", &option_commit,
@@ -272,7 +272,7 @@ static struct option builtin_merge_options[] = {
 		option_parse_message),
 	{ OPTION_LOWLEVEL_CALLBACK, 'F', "file", &merge_msg, N_("path"),
 		N_("read message from file"), PARSE_OPT_NONEG,
-		NULL, 0, option_read_message },
+		NULL, { 0 }, option_read_message },
 	OPT__VERBOSITY(&verbosity),
 	OPT_BOOL(0, "abort", &abort_current_merge,
 		N_("abort the current in-progress merge")),
@@ -284,7 +284,7 @@ static struct option builtin_merge_options[] = {
 		 N_("allow merging unrelated histories")),
 	OPT_SET_INT(0, "progress", &show_progress, N_("force progress reporting"), 1),
 	{ OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key-id"),
-	  N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
+	  N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, { .strval = "" } },
 	OPT_BOOL(0, "overwrite-ignore", &overwrite_ignore, N_("update ignored files (default)")),
 	OPT_BOOL(0, "signoff", &signoff, N_("add Signed-off-by:")),
 	OPT_BOOL(0, "no-verify", &no_verify, N_("bypass pre-merge-commit and commit-msg hooks")),
diff --git a/builtin/name-rev.c b/builtin/name-rev.c
index b0f0776947..ccf8885fbb 100644
--- a/builtin/name-rev.c
+++ b/builtin/name-rev.c
@@ -428,7 +428,7 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix)
 			/* A Hidden OPT_BOOL */
 			OPTION_SET_INT, 0, "peel-tag", &peel_tag, NULL,
 			N_("dereference tags in the input (internal use)"),
-			PARSE_OPT_NOARG | PARSE_OPT_HIDDEN, NULL, 1,
+			PARSE_OPT_NOARG | PARSE_OPT_HIDDEN, NULL, { 1 },
 		},
 		OPT_END(),
 	};
diff --git a/builtin/rebase.c b/builtin/rebase.c
index 4a20582e72..0a3ed94ebd 100644
--- a/builtin/rebase.c
+++ b/builtin/rebase.c
@@ -477,19 +477,19 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix)
 		OPT_CMDMODE(0, "add-exec-commands", &command,
 			N_("insert exec commands in todo list"), ACTION_ADD_EXEC),
 		{ OPTION_CALLBACK, 0, "onto", &opts.onto, N_("onto"), N_("onto"),
-		  PARSE_OPT_NONEG, parse_opt_commit, 0 },
+		  PARSE_OPT_NONEG, parse_opt_commit, { 0 } },
 		{ OPTION_CALLBACK, 0, "restrict-revision", &opts.restrict_revision,
 		  N_("restrict-revision"), N_("restrict revision"),
-		  PARSE_OPT_NONEG, parse_opt_commit, 0 },
+		  PARSE_OPT_NONEG, parse_opt_commit, { 0 } },
 		{ OPTION_CALLBACK, 0, "squash-onto", &squash_onto, N_("squash-onto"),
-		  N_("squash onto"), PARSE_OPT_NONEG, parse_opt_object_id, 0 },
+		  N_("squash onto"), PARSE_OPT_NONEG, parse_opt_object_id, { 0 } },
 		{ OPTION_CALLBACK, 0, "upstream", &opts.upstream, N_("upstream"),
 		  N_("the upstream commit"), PARSE_OPT_NONEG, parse_opt_commit,
-		  0 },
+		  { 0 } },
 		OPT_STRING(0, "head-name", &opts.head_name, N_("head-name"), N_("head name")),
 		{ OPTION_STRING, 'S', "gpg-sign", &opts.gpg_sign_opt, N_("key-id"),
 			N_("GPG-sign commits"),
-			PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
+			PARSE_OPT_OPTARG, NULL, { .strval = "" } },
 		OPT_STRING(0, "strategy", &opts.strategy, N_("strategy"),
 			   N_("rebase strategy")),
 		OPT_STRING(0, "strategy-opts", &opts.strategy_opts, N_("strategy-opts"),
@@ -1428,7 +1428,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 			REBASE_NO_QUIET | REBASE_VERBOSE | REBASE_DIFFSTAT),
 		{OPTION_NEGBIT, 'n', "no-stat", &options.flags, NULL,
 			N_("do not show diffstat of what changed upstream"),
-			PARSE_OPT_NOARG, NULL, REBASE_DIFFSTAT },
+			PARSE_OPT_NOARG, NULL, { REBASE_DIFFSTAT } },
 		OPT_BOOL(0, "signoff", &options.signoff,
 			 N_("add a Signed-off-by: line to each commit")),
 		OPT_PASSTHRU_ARGV(0, "ignore-whitespace", &options.git_am_opts,
@@ -1482,7 +1482,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 			    "squash!/fixup! under -i")),
 		{ OPTION_STRING, 'S', "gpg-sign", &gpg_sign, N_("key-id"),
 			N_("GPG-sign commits"),
-			PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
+			PARSE_OPT_OPTARG, NULL, { .strval = "" } },
 		OPT_BOOL(0, "autostash", &options.autostash,
 			 N_("automatically stash/stash pop before and after")),
 		OPT_STRING_LIST('x', "exec", &exec, N_("exec"),
@@ -1491,10 +1491,10 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 		OPT_BOOL(0, "allow-empty-message",
 			 &options.allow_empty_message,
 			 N_("allow rebasing commits with empty messages")),
-		{OPTION_STRING, 'r', "rebase-merges", &rebase_merges,
+		{ OPTION_STRING, 'r', "rebase-merges", &rebase_merges,
 			N_("mode"),
 			N_("try to rebase merges instead of skipping them"),
-			PARSE_OPT_OPTARG, NULL, (intptr_t)""},
+			PARSE_OPT_OPTARG, NULL, { .strval = "" } },
 		OPT_BOOL(0, "fork-point", &fork_point,
 			 N_("use 'merge-base --fork-point' to refine upstream")),
 		OPT_STRING('s', "strategy", &options.strategy,
diff --git a/builtin/revert.c b/builtin/revert.c
index f61cc5d82c..692f76a0b0 100644
--- a/builtin/revert.c
+++ b/builtin/revert.c
@@ -115,7 +115,7 @@ static int run_sequencer(int argc, const char **argv, struct replay_opts *opts)
 		OPT_CALLBACK('X', "strategy-option", &opts, N_("option"),
 			N_("option for merge strategy"), option_parse_x),
 		{ OPTION_STRING, 'S', "gpg-sign", &opts->gpg_sign, N_("key-id"),
-		  N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
+		  N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, { .strval = "" } },
 		OPT_END()
 	};
 	struct option *options = base_options;
diff --git a/builtin/show-branch.c b/builtin/show-branch.c
index 35d7f51c23..b11f5754c4 100644
--- a/builtin/show-branch.c
+++ b/builtin/show-branch.c
@@ -649,7 +649,7 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
 			    N_("color '*!+-' corresponding to the branch")),
 		{ OPTION_INTEGER, 0, "more", &extra, N_("n"),
 			    N_("show <n> more commits after the common ancestor"),
-			    PARSE_OPT_OPTARG, NULL, (intptr_t)1 },
+			    PARSE_OPT_OPTARG, NULL, { 1 } },
 		OPT_SET_INT(0, "list", &extra, N_("synonym to more=-1"), -1),
 		OPT_BOOL(0, "no-name", &no_name, N_("suppress naming strings")),
 		OPT_BOOL(0, "current", &with_current_branch,
diff --git a/builtin/tag.c b/builtin/tag.c
index e0a4c25382..2d6aa2354f 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -402,7 +402,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
 		OPT_CMDMODE('l', "list", &cmdmode, N_("list tag names"), 'l'),
 		{ OPTION_INTEGER, 'n', NULL, &filter.lines, N_("n"),
 				N_("print <n> lines of each tag message"),
-				PARSE_OPT_OPTARG, NULL, 1 },
+				PARSE_OPT_OPTARG, NULL, { 1 } },
 		OPT_CMDMODE('d', "delete", &cmdmode, N_("delete tags"), 'd'),
 		OPT_CMDMODE('v', "verify", &cmdmode, N_("verify tags"), 'v'),
 
@@ -432,7 +432,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
 		{
 			OPTION_CALLBACK, 0, "points-at", &filter.points_at, N_("object"),
 			N_("print only tags of the object"), PARSE_OPT_LASTARG_DEFAULT,
-			parse_opt_object_name, (intptr_t) "HEAD"
+			parse_opt_object_name, { .strval = "HEAD" },
 		},
 		OPT_STRING(  0 , "format", &format.format, N_("format"),
 			   N_("format to use for the output")),
diff --git a/builtin/update-index.c b/builtin/update-index.c
index 49302d98c5..de3a676636 100644
--- a/builtin/update-index.c
+++ b/builtin/update-index.c
@@ -996,7 +996,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
 			N_("add the specified entry to the index"),
 			PARSE_OPT_NOARG | /* disallow --cacheinfo=<mode> form */
 			PARSE_OPT_NONEG | PARSE_OPT_LITERAL_ARGHELP,
-			NULL, 0,
+			NULL, {0},
 			cacheinfo_callback},
 		{OPTION_CALLBACK, 0, "chmod", &set_executable_bit, "(+|-)x",
 			N_("override the executable bit of the listed files"),
@@ -1004,16 +1004,16 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
 			chmod_callback},
 		{OPTION_SET_INT, 0, "assume-unchanged", &mark_valid_only, NULL,
 			N_("mark files as \"not changing\""),
-			PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, MARK_FLAG},
+			PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, {MARK_FLAG}},
 		{OPTION_SET_INT, 0, "no-assume-unchanged", &mark_valid_only, NULL,
 			N_("clear assumed-unchanged bit"),
-			PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, UNMARK_FLAG},
+			PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, {UNMARK_FLAG}},
 		{OPTION_SET_INT, 0, "skip-worktree", &mark_skip_worktree_only, NULL,
 			N_("mark files as \"index-only\""),
-			PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, MARK_FLAG},
+			PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, {MARK_FLAG}},
 		{OPTION_SET_INT, 0, "no-skip-worktree", &mark_skip_worktree_only, NULL,
 			N_("clear skip-worktree bit"),
-			PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, UNMARK_FLAG},
+			PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, {UNMARK_FLAG}},
 		OPT_SET_INT(0, "info-only", &info_only,
 			N_("add to index only; do not add content to object database"), 1),
 		OPT_SET_INT(0, "force-remove", &force_remove,
@@ -1023,19 +1023,19 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
 		{OPTION_LOWLEVEL_CALLBACK, 0, "stdin", &read_from_stdin, NULL,
 			N_("read list of paths to be updated from standard input"),
 			PARSE_OPT_NONEG | PARSE_OPT_NOARG,
-			NULL, 0, stdin_callback},
+			NULL, {0}, stdin_callback},
 		{OPTION_LOWLEVEL_CALLBACK, 0, "index-info", &nul_term_line, NULL,
 			N_("add entries from standard input to the index"),
 			PARSE_OPT_NONEG | PARSE_OPT_NOARG,
-			NULL, 0, stdin_cacheinfo_callback},
+			NULL, {0}, stdin_cacheinfo_callback},
 		{OPTION_LOWLEVEL_CALLBACK, 0, "unresolve", &has_errors, NULL,
 			N_("repopulate stages #2 and #3 for the listed paths"),
 			PARSE_OPT_NONEG | PARSE_OPT_NOARG,
-			NULL, 0, unresolve_callback},
+			NULL, {0}, unresolve_callback},
 		{OPTION_LOWLEVEL_CALLBACK, 'g', "again", &has_errors, NULL,
 			N_("only update entries that differ from HEAD"),
 			PARSE_OPT_NONEG | PARSE_OPT_NOARG,
-			NULL, 0, reupdate_callback},
+			NULL, {0}, reupdate_callback},
 		OPT_BIT(0, "ignore-missing", &refresh_args.flags,
 			N_("ignore files missing from worktree"),
 			REFRESH_IGNORE_MISSING),
@@ -1061,10 +1061,10 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
 			N_("enable or disable file system monitor")),
 		{OPTION_SET_INT, 0, "fsmonitor-valid", &mark_fsmonitor_only, NULL,
 			N_("mark files as fsmonitor valid"),
-			PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, MARK_FLAG},
+			PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, {MARK_FLAG}},
 		{OPTION_SET_INT, 0, "no-fsmonitor-valid", &mark_fsmonitor_only, NULL,
 			N_("clear fsmonitor valid bit"),
-			PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, UNMARK_FLAG},
+			PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, {UNMARK_FLAG}},
 		OPT_END()
 	};
 
diff --git a/builtin/write-tree.c b/builtin/write-tree.c
index 45d61707e7..eba6c68cd6 100644
--- a/builtin/write-tree.c
+++ b/builtin/write-tree.c
@@ -30,7 +30,7 @@ int cmd_write_tree(int argc, const char **argv, const char *cmd_prefix)
 		{ OPTION_BIT, 0, "ignore-cache-tree", &flags, NULL,
 		  N_("only useful for debugging"),
 		  PARSE_OPT_HIDDEN | PARSE_OPT_NOARG, NULL,
-		  WRITE_TREE_IGNORE_CACHE_TREE },
+		  { WRITE_TREE_IGNORE_CACHE_TREE } },
 		OPT_END()
 	};
 
diff --git a/diff.c b/diff.c
index afe4400a60..73f2be9e0b 100644
--- a/diff.c
+++ b/diff.c
@@ -5523,7 +5523,7 @@ static void prep_parse_options(struct diff_options *options)
 			       PARSE_OPT_NONEG, diff_opt_diff_filter),
 		{ OPTION_CALLBACK, 0, "output", options, N_("<file>"),
 		  N_("Output to a specific file"),
-		  PARSE_OPT_NONEG, NULL, 0, diff_opt_output },
+		  PARSE_OPT_NONEG, NULL, { 0 }, diff_opt_output },
 
 		OPT_END()
 	};
diff --git a/parse-options-cb.c b/parse-options-cb.c
index 1240a8514e..e5af6dcb64 100644
--- a/parse-options-cb.c
+++ b/parse-options-cb.c
@@ -48,7 +48,7 @@ int parse_opt_color_flag_cb(const struct option *opt, const char *arg,
 	int value;
 
 	if (!arg)
-		arg = unset ? "never" : (const char *)opt->defval;
+		arg = unset ? "never" : opt->def.strval;
 	value = git_config_colorbool(NULL, arg);
 	if (value < 0)
 		return error(_("option `%s' expects \"always\", \"auto\", or \"never\""),
diff --git a/parse-options.c b/parse-options.c
index b42f54d48b..f58dd9ae51 100644
--- a/parse-options.c
+++ b/parse-options.c
@@ -30,7 +30,7 @@ static enum parse_opt_result get_arg(struct parse_opt_ctx_t *p,
 		*arg = p->opt;
 		p->opt = NULL;
 	} else if (p->argc == 1 && (opt->flags & PARSE_OPT_LASTARG_DEFAULT)) {
-		*arg = (const char *)opt->defval;
+		*arg = opt->def.strval;
 	} else if (p->argc > 1) {
 		p->argc--;
 		*arg = *++p->argv;
@@ -63,7 +63,7 @@ static enum parse_opt_result opt_command_mode_error(
 		if (that == opt ||
 		    that->type != OPTION_CMDMODE ||
 		    that->value != opt->value ||
-		    that->defval != *(int *)opt->value)
+		    that->def.intval != *(int *)opt->value)
 			continue;
 
 		if (that->long_name)
@@ -101,23 +101,23 @@ static enum parse_opt_result get_value(struct parse_opt_ctx_t *p,
 
 	case OPTION_BIT:
 		if (unset)
-			*(int *)opt->value &= ~opt->defval;
+			*(int *)opt->value &= ~opt->def.intval;
 		else
-			*(int *)opt->value |= opt->defval;
+			*(int *)opt->value |= opt->def.intval;
 		return 0;
 
 	case OPTION_NEGBIT:
 		if (unset)
-			*(int *)opt->value |= opt->defval;
+			*(int *)opt->value |= opt->def.intval;
 		else
-			*(int *)opt->value &= ~opt->defval;
+			*(int *)opt->value &= ~opt->def.intval;
 		return 0;
 
 	case OPTION_BITOP:
 		if (unset)
 			BUG("BITOP can't have unset form");
 		*(int *)opt->value &= ~opt->extra;
-		*(int *)opt->value |= opt->defval;
+		*(int *)opt->value |= opt->def.intval;
 		return 0;
 
 	case OPTION_COUNTUP:
@@ -127,7 +127,7 @@ static enum parse_opt_result get_value(struct parse_opt_ctx_t *p,
 		return 0;
 
 	case OPTION_SET_INT:
-		*(int *)opt->value = unset ? 0 : opt->defval;
+		*(int *)opt->value = unset ? 0 : opt->def.intval;
 		return 0;
 
 	case OPTION_CMDMODE:
@@ -135,16 +135,16 @@ static enum parse_opt_result get_value(struct parse_opt_ctx_t *p,
 		 * Giving the same mode option twice, although is unnecessary,
 		 * is not a grave error, so let it pass.
 		 */
-		if (*(int *)opt->value && *(int *)opt->value != opt->defval)
+		if (*(int *)opt->value && *(int *)opt->value != opt->def.intval)
 			return opt_command_mode_error(opt, all_opts, flags);
-		*(int *)opt->value = opt->defval;
+		*(int *)opt->value = opt->def.intval;
 		return 0;
 
 	case OPTION_STRING:
 		if (unset)
 			*(const char **)opt->value = NULL;
 		else if (opt->flags & PARSE_OPT_OPTARG && !p->opt)
-			*(const char **)opt->value = (const char *)opt->defval;
+			*(const char **)opt->value = opt->def.strval;
 		else
 			return get_arg(p, opt, flags, (const char **)opt->value);
 		return 0;
@@ -154,7 +154,7 @@ static enum parse_opt_result get_value(struct parse_opt_ctx_t *p,
 		if (unset)
 			*(const char **)opt->value = NULL;
 		else if (opt->flags & PARSE_OPT_OPTARG && !p->opt)
-			*(const char **)opt->value = (const char *)opt->defval;
+			*(const char **)opt->value = opt->def.strval;
 		else
 			err = get_arg(p, opt, flags, (const char **)opt->value);
 
@@ -190,7 +190,7 @@ static enum parse_opt_result get_value(struct parse_opt_ctx_t *p,
 			return 0;
 		}
 		if (opt->flags & PARSE_OPT_OPTARG && !p->opt) {
-			*(int *)opt->value = opt->defval;
+			*(int *)opt->value = opt->def.intval;
 			return 0;
 		}
 		if (get_arg(p, opt, flags, &arg))
@@ -210,7 +210,7 @@ static enum parse_opt_result get_value(struct parse_opt_ctx_t *p,
 			return 0;
 		}
 		if (opt->flags & PARSE_OPT_OPTARG && !p->opt) {
-			*(unsigned long *)opt->value = opt->defval;
+			*(unsigned long *)opt->value = opt->def.intval;
 			return 0;
 		}
 		if (get_arg(p, opt, flags, &arg))
@@ -321,7 +321,7 @@ static enum parse_opt_result parse_long_opt(
 			if (*rest)
 				continue;
 			if (options->value)
-				*(int *)options->value = options->defval;
+				*(int *)options->value = options->def.intval;
 			p->out[p->cpidx++] = arg - 2;
 			return PARSE_OPT_DONE;
 		}
diff --git a/parse-options.h b/parse-options.h
index 38a33a087e..3120470fbd 100644
--- a/parse-options.h
+++ b/parse-options.h
@@ -113,7 +113,7 @@ typedef enum parse_opt_result parse_opt_ll_cb(struct parse_opt_ctx_t *ctx,
  * `callback`::
  *   pointer to the callback to use for OPTION_CALLBACK
  *
- * `defval`::
+ * `def`::
  *   default value to fill (*->value) with for PARSE_OPT_OPTARG.
  *   OPTION_{BIT,SET_INT} store the {mask,integer} to put in the value when met.
  *   CALLBACKS can use it like they want.
@@ -132,17 +132,20 @@ struct option {
 
 	int flags;
 	parse_opt_cb *callback;
-	intptr_t defval;
+	union {
+		intptr_t intval;
+		const char *strval;
+	} def;
 	parse_opt_ll_cb *ll_callback;
 	intptr_t extra;
 };
 
 #define OPT_BIT_F(s, l, v, h, b, f) { OPTION_BIT, (s), (l), (v), NULL, (h), \
-				      PARSE_OPT_NOARG|(f), NULL, (b) }
+				      PARSE_OPT_NOARG|(f), NULL, { (b) } }
 #define OPT_COUNTUP_F(s, l, v, h, f) { OPTION_COUNTUP, (s), (l), (v), NULL, \
 				       (h), PARSE_OPT_NOARG|(f) }
 #define OPT_SET_INT_F(s, l, v, h, i, f) { OPTION_SET_INT, (s), (l), (v), NULL, \
-					  (h), PARSE_OPT_NOARG | (f), NULL, (i) }
+					  (h), PARSE_OPT_NOARG | (f), NULL, { (i) } }
 #define OPT_BOOL_F(s, l, v, h, f)   OPT_SET_INT_F(s, l, v, h, 1, f)
 #define OPT_CALLBACK_F(s, l, v, a, h, f, cb)			\
 	{ OPTION_CALLBACK, (s), (l), (v), (a), (h), (f), (cb) }
@@ -151,21 +154,21 @@ struct option {
 
 #define OPT_END()                   { OPTION_END }
 #define OPT_ARGUMENT(l, v, h)       { OPTION_ARGUMENT, 0, (l), (v), NULL, \
-				      (h), PARSE_OPT_NOARG, NULL, 1 }
+				      (h), PARSE_OPT_NOARG, NULL, { 1 } }
 #define OPT_GROUP(h)                { OPTION_GROUP, 0, NULL, NULL, NULL, (h) }
 #define OPT_BIT(s, l, v, h, b)      OPT_BIT_F(s, l, v, h, b, 0)
 #define OPT_BITOP(s, l, v, h, set, clear) { OPTION_BITOP, (s), (l), (v), NULL, (h), \
 					    PARSE_OPT_NOARG|PARSE_OPT_NONEG, NULL, \
-					    (set), NULL, (clear) }
+					    { (set) }, NULL, (clear) }
 #define OPT_NEGBIT(s, l, v, h, b)   { OPTION_NEGBIT, (s), (l), (v), NULL, \
-				      (h), PARSE_OPT_NOARG, NULL, (b) }
+				      (h), PARSE_OPT_NOARG, NULL, { (b) } }
 #define OPT_COUNTUP(s, l, v, h)     OPT_COUNTUP_F(s, l, v, h, 0)
 #define OPT_SET_INT(s, l, v, h, i)  OPT_SET_INT_F(s, l, v, h, i, 0)
 #define OPT_BOOL(s, l, v, h)        OPT_BOOL_F(s, l, v, h, 0)
 #define OPT_HIDDEN_BOOL(s, l, v, h) { OPTION_SET_INT, (s), (l), (v), NULL, \
-				      (h), PARSE_OPT_NOARG | PARSE_OPT_HIDDEN, NULL, 1}
+				      (h), PARSE_OPT_NOARG | PARSE_OPT_HIDDEN, NULL, { 1 } }
 #define OPT_CMDMODE(s, l, v, h, i)  { OPTION_CMDMODE, (s), (l), (v), NULL, \
-				      (h), PARSE_OPT_NOARG|PARSE_OPT_NONEG, NULL, (i) }
+				      (h), PARSE_OPT_NOARG|PARSE_OPT_NONEG, NULL, { (i) } }
 #define OPT_INTEGER(s, l, v, h)     OPT_INTEGER_F(s, l, v, h, 0)
 #define OPT_MAGNITUDE(s, l, v, h)   { OPTION_MAGNITUDE, (s), (l), (v), \
 				      N_("n"), (h), PARSE_OPT_NONEG }
@@ -186,7 +189,7 @@ struct option {
 				       N_("file"), (h) }
 #define OPT_COLOR_FLAG(s, l, v, h) \
 	{ OPTION_CALLBACK, (s), (l), (v), N_("when"), (h), PARSE_OPT_OPTARG, \
-		parse_opt_color_flag_cb, (intptr_t)"always" }
+		parse_opt_color_flag_cb, { .strval = "always" } }
 
 #define OPT_NOOP_NOARG(s, l) \
 	{ OPTION_CALLBACK, (s), (l), NULL, NULL, \
@@ -303,15 +306,15 @@ int parse_opt_passthru_argv(const struct option *, const char *, int);
 #define OPT__QUIET(var, h)    OPT_COUNTUP('q', "quiet",   (var), (h))
 #define OPT__VERBOSITY(var) \
 	{ OPTION_CALLBACK, 'v', "verbose", (var), NULL, N_("be more verbose"), \
-	  PARSE_OPT_NOARG, &parse_opt_verbosity_cb, 0 }, \
+	  PARSE_OPT_NOARG, &parse_opt_verbosity_cb, { 0 } }, \
 	{ OPTION_CALLBACK, 'q', "quiet", (var), NULL, N_("be more quiet"), \
-	  PARSE_OPT_NOARG, &parse_opt_verbosity_cb, 0 }
+	  PARSE_OPT_NOARG, &parse_opt_verbosity_cb, { 0 } }
 #define OPT__DRY_RUN(var, h)  OPT_BOOL('n', "dry-run", (var), (h))
 #define OPT__FORCE(var, h, f) OPT_COUNTUP_F('f', "force",   (var), (h), (f))
 #define OPT__ABBREV(var)  \
 	{ OPTION_CALLBACK, 0, "abbrev", (var), N_("n"),	\
 	  N_("use <n> digits to display SHA-1s"),	\
-	  PARSE_OPT_OPTARG, &parse_opt_abbrev_cb, 0 }
+	  PARSE_OPT_OPTARG, &parse_opt_abbrev_cb, { 0 } }
 #define OPT__COLOR(var, h) \
 	OPT_COLOR_FLAG(0, "color", (var), (h))
 #define OPT_COLUMN(s, l, v, h) \
@@ -323,7 +326,7 @@ int parse_opt_passthru_argv(const struct option *, const char *, int);
 #define _OPT_CONTAINS_OR_WITH(name, variable, help, flag) \
 	{ OPTION_CALLBACK, 0, name, (variable), N_("commit"), (help), \
 	  PARSE_OPT_LASTARG_DEFAULT | flag, \
-	  parse_opt_commits, (intptr_t) "HEAD" \
+	  parse_opt_commits, { .strval = "HEAD" } \
 	}
 #define OPT_CONTAINS(v, h) _OPT_CONTAINS_OR_WITH("contains", v, h, PARSE_OPT_NONEG)
 #define OPT_NO_CONTAINS(v, h) _OPT_CONTAINS_OR_WITH("no-contains", v, h, PARSE_OPT_NONEG)
diff --git a/ref-filter.h b/ref-filter.h
index f1dcff4c6e..5807c8f9c8 100644
--- a/ref-filter.h
+++ b/ref-filter.h
@@ -91,7 +91,7 @@ struct ref_format {
 #define _OPT_MERGED_NO_MERGED(option, filter, h) \
 	{ OPTION_CALLBACK, 0, option, (filter), N_("commit"), (h), \
 	  PARSE_OPT_LASTARG_DEFAULT | PARSE_OPT_NONEG, \
-	  parse_opt_merge_filter, (intptr_t) "HEAD" \
+	  parse_opt_merge_filter, { .strval = "HEAD" } \
 	}
 #define OPT_MERGED(f, h) _OPT_MERGED_NO_MERGED("merged", f, h)
 #define OPT_NO_MERGED(f, h) _OPT_MERGED_NO_MERGED("no-merged", f, h)
-- 
2.23.0