aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/doc/dev_style.txt27
-rw-r--r--src/nvim/CMakeLists.txt2
-rw-r--r--src/nvim/api/autocmd.c2
-rw-r--r--src/nvim/api/options.c6
-rw-r--r--src/nvim/api/private/converter.c3
-rw-r--r--src/nvim/api/private/helpers.c10
-rw-r--r--src/nvim/api/win_config.c2
-rw-r--r--src/nvim/channel.c6
-rw-r--r--src/nvim/drawscreen.c3
-rw-r--r--src/nvim/eval.c5
-rw-r--r--src/nvim/eval/funcs.c3
-rw-r--r--src/nvim/event/process.c6
-rw-r--r--src/nvim/macros.h8
-rw-r--r--src/nvim/msgpack_rpc/unpacker.c3
-rw-r--r--src/nvim/option.c9
-rw-r--r--src/nvim/tui/tui.c2
16 files changed, 48 insertions, 49 deletions
diff --git a/runtime/doc/dev_style.txt b/runtime/doc/dev_style.txt
index 79e758a11e..0bc27ced15 100644
--- a/runtime/doc/dev_style.txt
+++ b/runtime/doc/dev_style.txt
@@ -859,6 +859,33 @@ execute, simply use `abort()`: >c
abort();
}
+Switch statements that are conditional on an enumerated value should not have
+a `default` case if it is exhaustive. Explicit case labels are preferred over
+`default`, even if it leads to multiple case labels for the same code. For
+example, instead of: >c
+
+ case A:
+ ...
+ case B:
+ ...
+ case C:
+ ...
+ default:
+ ...
+
+You should use: >c
+
+ case A:
+ ...
+ case B:
+ ...
+ case C:
+ ...
+ case D:
+ case E:
+ case F:
+ ...
+
Return Values ~
Do not needlessly surround the `return` expression with parentheses.
diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt
index 48f388714a..127d9cf5af 100644
--- a/src/nvim/CMakeLists.txt
+++ b/src/nvim/CMakeLists.txt
@@ -90,7 +90,7 @@ if(MSVC)
target_compile_options(main_lib INTERFACE -W3)
# Disable warnings that give too many false positives.
- target_compile_options(main_lib INTERFACE -wd4311 -wd4146 -wd4003)
+ target_compile_options(main_lib INTERFACE -wd4311 -wd4146 -wd4003 -wd4715)
target_compile_definitions(main_lib INTERFACE _CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_DEPRECATE)
target_sources(main_lib INTERFACE ${CMAKE_CURRENT_LIST_DIR}/os/nvim.manifest)
diff --git a/src/nvim/api/autocmd.c b/src/nvim/api/autocmd.c
index d19f44798b..d0efb58cb6 100644
--- a/src/nvim/api/autocmd.c
+++ b/src/nvim/api/autocmd.c
@@ -294,7 +294,7 @@ Array nvim_get_autocmds(Dict(get_autocmds) *opts, Error *err)
case kCallbackPartial:
PUT(autocmd_info, "callback", CSTR_AS_OBJ(callback_to_string(cb)));
break;
- default:
+ case kCallbackNone:
abort();
}
} else {
diff --git a/src/nvim/api/options.c b/src/nvim/api/options.c
index 5a75d10043..867d1d5e5c 100644
--- a/src/nvim/api/options.c
+++ b/src/nvim/api/options.c
@@ -146,16 +146,14 @@ static Object optval_as_object(OptVal o)
return BOOLEAN_OBJ(o.data.boolean);
case kNone:
return NIL;
- default:
- abort();
}
+ UNREACHABLE;
case kOptValTypeNumber:
return INTEGER_OBJ(o.data.number);
case kOptValTypeString:
return STRING_OBJ(o.data.string);
- default:
- abort();
}
+ UNREACHABLE;
}
/// Consume an API Object and convert it to an OptVal.
diff --git a/src/nvim/api/private/converter.c b/src/nvim/api/private/converter.c
index dc6928f4b9..10152cb3c8 100644
--- a/src/nvim/api/private/converter.c
+++ b/src/nvim/api/private/converter.c
@@ -363,9 +363,6 @@ bool object_to_vim(Object obj, typval_T *tv, Error *err)
tv->vval.v_string = xstrdup(name);
break;
}
-
- default:
- abort();
}
return true;
diff --git a/src/nvim/api/private/helpers.c b/src/nvim/api/private/helpers.c
index 25e752bea8..eaee94786c 100644
--- a/src/nvim/api/private/helpers.c
+++ b/src/nvim/api/private/helpers.c
@@ -610,9 +610,6 @@ void api_free_object(Object value)
case kObjectTypeLuaRef:
api_free_luaref(value.data.luaref);
break;
-
- default:
- abort();
}
}
@@ -800,10 +797,8 @@ Object copy_object(Object obj, Arena *arena)
case kObjectTypeLuaRef:
return LUAREF_OBJ(api_new_luaref(obj.data.luaref));
-
- default:
- abort();
}
+ UNREACHABLE;
}
void api_set_error(Error *err, ErrorType errType, const char *format, ...)
@@ -884,9 +879,8 @@ char *api_typename(ObjectType t)
return "Window";
case kObjectTypeTabpage:
return "Tabpage";
- default:
- abort();
}
+ UNREACHABLE;
}
HlMessage parse_hl_msg(Array chunks, Error *err)
diff --git a/src/nvim/api/win_config.c b/src/nvim/api/win_config.c
index ca7086ab7f..2fd30bc5a5 100644
--- a/src/nvim/api/win_config.c
+++ b/src/nvim/api/win_config.c
@@ -279,8 +279,6 @@ Dictionary config_put_bordertext(Dictionary config, FloatConfig *fconfig,
field_name = "footer";
field_pos_name = "footer_pos";
break;
- default:
- abort();
}
Array bordertext = virt_text_to_array(vt, true);
diff --git a/src/nvim/channel.c b/src/nvim/channel.c
index 5c8e922f90..32a2f1021c 100644
--- a/src/nvim/channel.c
+++ b/src/nvim/channel.c
@@ -168,9 +168,6 @@ bool channel_close(uint64_t id, ChannelPart part, const char **error)
channel_decref(chan);
}
break;
-
- default:
- abort();
}
return true;
@@ -917,9 +914,6 @@ Dictionary channel_info(uint64_t id)
case kChannelStreamSocket:
stream_desc = "socket";
break;
-
- default:
- abort();
}
PUT(info, "stream", CSTR_TO_OBJ(stream_desc));
diff --git a/src/nvim/drawscreen.c b/src/nvim/drawscreen.c
index 98077364a0..ca70c1f4ef 100644
--- a/src/nvim/drawscreen.c
+++ b/src/nvim/drawscreen.c
@@ -738,9 +738,8 @@ int win_get_bordertext_col(int total_col, int text_width, AlignTextPos align)
return (total_col - text_width) / 2 + 1;
case kAlignRight:
return total_col - text_width + 1;
- default:
- abort();
}
+ UNREACHABLE;
}
static void win_redr_border(win_T *wp)
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index c9a29b9913..ee0860a8d1 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -6088,9 +6088,6 @@ bool callback_call(Callback *const callback, const int argcount_in, typval_T *co
case kCallbackNone:
return false;
break;
-
- default:
- abort();
}
funcexe_T funcexe = FUNCEXE_INIT;
@@ -6120,7 +6117,7 @@ bool set_ref_in_callback(Callback *callback, int copyID, ht_stack_T **ht_stack,
return set_ref_in_item(&tv, copyID, ht_stack, list_stack);
break;
- default:
+ case kCallbackLua:
abort();
}
return false;
diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c
index 782687e6b6..b9d124532e 100644
--- a/src/nvim/eval/funcs.c
+++ b/src/nvim/eval/funcs.c
@@ -4990,9 +4990,10 @@ static int msgpackparse_convert_item(const msgpack_object data, const msgpack_un
tv_list_append_owned_tv(ret_list, tv);
return OK;
}
- default:
+ case MSGPACK_UNPACK_EXTRA_BYTES:
abort();
}
+ UNREACHABLE;
}
static void msgpackparse_unpack_list(const list_T *const list, list_T *const ret_list)
diff --git a/src/nvim/event/process.c b/src/nvim/event/process.c
index 00ba1334b0..d612b503a7 100644
--- a/src/nvim/event/process.c
+++ b/src/nvim/event/process.c
@@ -78,8 +78,6 @@ int process_spawn(Process *proc, bool in, bool out, bool err)
case kProcessTypePty:
status = pty_process_spawn((PtyProcess *)proc);
break;
- default:
- abort();
}
if (status) {
@@ -239,8 +237,6 @@ void process_stop(Process *proc) FUNC_ATTR_NONNULL_ALL
process_close_streams(proc);
pty_process_close_master((PtyProcess *)proc);
break;
- default:
- abort();
}
// (Re)start timer to verify that stopped process(es) died.
@@ -340,8 +336,6 @@ static void process_close(Process *proc)
case kProcessTypePty:
pty_process_close((PtyProcess *)proc);
break;
- default:
- abort();
}
}
diff --git a/src/nvim/macros.h b/src/nvim/macros.h
index 5eaf97ff87..b4034fe4f7 100644
--- a/src/nvim/macros.h
+++ b/src/nvim/macros.h
@@ -154,6 +154,14 @@
# define FALLTHROUGH
#endif
+#if defined(__clang__) || defined(__GNUC__)
+# define UNREACHABLE __builtin_unreachable()
+#elif defined(_MSVC_VER)
+# define UNREACHABLE __assume(false)
+#else
+# define UNREACHABLE
+#endif
+
// -V:STRUCT_CAST:641
/// Change type of structure pointers: cast `struct a *` to `struct b *`
diff --git a/src/nvim/msgpack_rpc/unpacker.c b/src/nvim/msgpack_rpc/unpacker.c
index 37e32729cc..5a65e6c5df 100644
--- a/src/nvim/msgpack_rpc/unpacker.c
+++ b/src/nvim/msgpack_rpc/unpacker.c
@@ -173,9 +173,6 @@ static void api_parse_enter(mpack_parser_t *parser, mpack_node_t *node)
node->data[0].p = result;
break;
}
-
- default:
- abort();
}
}
diff --git a/src/nvim/option.c b/src/nvim/option.c
index 0700d0e87e..6a3079e0a6 100644
--- a/src/nvim/option.c
+++ b/src/nvim/option.c
@@ -3461,9 +3461,8 @@ OptVal optval_copy(OptVal o)
return o;
case kOptValTypeString:
return STRING_OPTVAL(copy_string(o.data.string, NULL));
- default:
- abort();
}
+ UNREACHABLE;
}
// Match type of OptVal with the type of the target option. Returns true if the types match and
@@ -3482,9 +3481,8 @@ static bool optval_match_type(OptVal o, int opt_idx)
return flags & P_NUM;
case kOptValTypeString:
return flags & P_STRING;
- default:
- abort();
}
+ UNREACHABLE;
}
// Return C-string representation of OptVal. Caller must free the returned C-string.
@@ -3505,9 +3503,8 @@ static char *optval_to_cstr(OptVal o)
snprintf(buf, o.data.string.size + 3, "\"%s\"", o.data.string.data);
return buf;
}
- default:
- abort();
}
+ UNREACHABLE;
}
// Get an allocated string containing a list of valid types for an option.
diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c
index 9b4d63e7c6..260bf55093 100644
--- a/src/nvim/tui/tui.c
+++ b/src/nvim/tui/tui.c
@@ -1135,8 +1135,6 @@ void tui_set_mode(TUIData *tui, ModeShape mode)
int shape;
switch (c.shape) {
- default:
- abort(); break;
case SHAPE_BLOCK:
shape = 1; break;
case SHAPE_HOR: