# HG changeset patch # User Bram Moolenaar # Date 1648408504 -7200 # Node ID 89c181c99e23c18ca55ec868365e43ca798ff8c7 # Parent 584f657538df43917320de851916296380879cb3 patch 8.2.4639: not sufficient parenthesis in preprocessor macros Commit: https://github.com/vim/vim/commit/9dac9b1751dd43c02470cc6a2aecaeea27abcc80 Author: kylo252 <59826753+kylo252@users.noreply.github.com> Date: Sun Mar 27 20:05:17 2022 +0100 patch 8.2.4639: not sufficient parenthesis in preprocessor macros Problem: Not sufficient parenthesis in preprocessor macros. Solution: Add more parenthesis. (closes https://github.com/vim/vim/issues/10031) diff --git a/src/globals.h b/src/globals.h --- a/src/globals.h +++ b/src/globals.h @@ -702,10 +702,10 @@ EXTERN win_T *lastwin; // last window EXTERN win_T *prevwin INIT(= NULL); // previous window #define ONE_WINDOW (firstwin == lastwin) #define W_NEXT(wp) ((wp)->w_next) -#define FOR_ALL_WINDOWS(wp) for (wp = firstwin; wp != NULL; wp = wp->w_next) +#define FOR_ALL_WINDOWS(wp) for ((wp) = firstwin; (wp) != NULL; (wp) = (wp)->w_next) #define FOR_ALL_FRAMES(frp, first_frame) \ - for (frp = first_frame; frp != NULL; frp = frp->fr_next) -#define FOR_ALL_TABPAGES(tp) for (tp = first_tabpage; tp != NULL; tp = tp->tp_next) + for ((frp) = first_frame; (frp) != NULL; (frp) = (frp)->fr_next) +#define FOR_ALL_TABPAGES(tp) for ((tp) = first_tabpage; (tp) != NULL; (tp) = (tp)->tp_next) #define FOR_ALL_WINDOWS_IN_TAB(tp, wp) \ for ((wp) = ((tp) == NULL || (tp) == curtab) \ ? firstwin : (tp)->tp_firstwin; (wp); (wp) = (wp)->w_next) @@ -778,7 +778,7 @@ EXTERN buf_T *curbuf INIT(= NULL); // cu // Iterate through all the signs placed in a buffer #define FOR_ALL_SIGNS_IN_BUF(buf, sign) \ - for (sign = buf->b_signlist; sign != NULL; sign = sign->se_next) + for ((sign) = (buf)->b_signlist; (sign) != NULL; (sign) = (sign)->se_next) // Flag that is set when switching off 'swapfile'. It means that all blocks // are to be loaded into memory. Shouldn't be global... @@ -1000,7 +1000,7 @@ EXTERN JMP_BUF x_jump_env; #define DBCS_CHT 950 // taiwan #define DBCS_CHTU 9950 // euc-tw #define DBCS_2BYTE 1 // 2byte- -#define DBCS_DEBUG -1 +#define DBCS_DEBUG (-1) EXTERN int enc_dbcs INIT(= 0); // One of DBCS_xxx values if // DBCS encoding diff --git a/src/gui.h b/src/gui.h --- a/src/gui.h +++ b/src/gui.h @@ -100,7 +100,7 @@ #endif // Indices for arrays of scrollbars -#define SBAR_NONE -1 +#define SBAR_NONE (-1) #define SBAR_LEFT 0 #define SBAR_RIGHT 1 #define SBAR_BOTTOM 2 @@ -198,10 +198,10 @@ typedef struct GuiScrollbar typedef long guicolor_T; // handle for a GUI color; for X11 this should // be "Pixel", but that's an unsigned and we // need a signed value -#define INVALCOLOR (guicolor_T)-11111 // number for invalid color; on 32 bit +#define INVALCOLOR ((guicolor_T)-11111) // number for invalid color; on 32 bit // displays there is a tiny chance this is an // actual color -#define CTERMCOLOR (guicolor_T)-11110 // only used for cterm.bg_rgb and +#define CTERMCOLOR ((guicolor_T)-11110) // only used for cterm.bg_rgb and // cterm.fg_rgb: use cterm color #ifdef FEAT_GUI_GTK diff --git a/src/if_py_both.h b/src/if_py_both.h --- a/src/if_py_both.h +++ b/src/if_py_both.h @@ -30,9 +30,9 @@ static const char *vim_special_path = "_ #define PyErr_FORMAT2(exc, str, arg1, arg2) PyErr_Format(exc, _(str), arg1,arg2) #define PyErr_VIM_FORMAT(str, arg) PyErr_FORMAT(VimError, str, arg) -#define Py_TYPE_NAME(obj) (obj->ob_type->tp_name == NULL \ +#define Py_TYPE_NAME(obj) ((obj)->ob_type->tp_name == NULL \ ? "(NULL)" \ - : obj->ob_type->tp_name) + : (obj)->ob_type->tp_name) #define RAISE_NO_EMPTY_KEYS PyErr_SET_STRING(PyExc_ValueError, \ N_("empty keys are not allowed")) @@ -6686,7 +6686,7 @@ init_structs(void) } #define PYTYPE_READY(type) \ - if (PyType_Ready(&type)) \ + if (PyType_Ready(&(type))) \ return -1; static int diff --git a/src/macros.h b/src/macros.h --- a/src/macros.h +++ b/src/macros.h @@ -232,11 +232,11 @@ // Advance multi-byte pointer, do not skip over composing chars. #define MB_CPTR_ADV(p) p += enc_utf8 ? utf_ptr2len(p) : (*mb_ptr2len)(p) // Backup multi-byte pointer. Only use with "p" > "s" ! -#define MB_PTR_BACK(s, p) p -= has_mbyte ? ((*mb_head_off)(s, p - 1) + 1) : 1 +#define MB_PTR_BACK(s, p) p -= has_mbyte ? ((*mb_head_off)(s, (p) - 1) + 1) : 1 // get length of multi-byte char, not including composing chars #define MB_CPTR2LEN(p) (enc_utf8 ? utf_ptr2len(p) : (*mb_ptr2len)(p)) -#define MB_COPY_CHAR(f, t) do { if (has_mbyte) mb_copy_char(&f, &t); else *t++ = *f++; } while (0) +#define MB_COPY_CHAR(f, t) do { if (has_mbyte) mb_copy_char(&(f), &(t)); else *(t)++ = *(f)++; } while (0) #define MB_CHARLEN(p) (has_mbyte ? mb_charlen(p) : (int)STRLEN(p)) #define MB_CHAR2LEN(c) (has_mbyte ? mb_char2len(c) : 1) #define PTR2CHAR(p) (has_mbyte ? mb_ptr2char(p) : (int)*(p)) @@ -313,7 +313,7 @@ * HI2DI() converts a hashitem pointer to a dictitem pointer. */ #define DI2HIKEY(di) ((di)->di_key) -#define HIKEY2DI(p) ((dictitem_T *)(p - offsetof(dictitem_T, di_key))) +#define HIKEY2DI(p) ((dictitem_T *)((p) - offsetof(dictitem_T, di_key))) #define HI2DI(hi) HIKEY2DI((hi)->hi_key) /* @@ -376,9 +376,9 @@ #define CHECK_LIST_MATERIALIZE(l) if ((l)->lv_first == &range_list_item) range_list_materialize(l) // Inlined version of ga_grow() with optimized condition that it fails. -#define GA_GROW_FAILS(gap, n) unlikely((((gap)->ga_maxlen - (gap)->ga_len < n) ? ga_grow_inner((gap), (n)) : OK) == FAIL) +#define GA_GROW_FAILS(gap, n) unlikely((((gap)->ga_maxlen - (gap)->ga_len < (n)) ? ga_grow_inner((gap), (n)) : OK) == FAIL) // Inlined version of ga_grow() with optimized condition that it succeeds. -#define GA_GROW_OK(gap, n) likely((((gap)->ga_maxlen - (gap)->ga_len < n) ? ga_grow_inner((gap), (n)) : OK) == OK) +#define GA_GROW_OK(gap, n) likely((((gap)->ga_maxlen - (gap)->ga_len < (n)) ? ga_grow_inner((gap), (n)) : OK) == OK) #ifndef MIN # define MIN(a, b) ((a) < (b) ? (a) : (b)) diff --git a/src/option.h b/src/option.h --- a/src/option.h +++ b/src/option.h @@ -131,7 +131,7 @@ typedef enum { #endif // end-of-line style -#define EOL_UNKNOWN -1 // not defined yet +#define EOL_UNKNOWN (-1) // not defined yet #define EOL_UNIX 0 // NL #define EOL_DOS 1 // CR NL #define EOL_MAC 2 // CR @@ -1328,6 +1328,6 @@ enum }; // Value for b_p_ul indicating the global value must be used. -#define NO_LOCAL_UNDOLEVEL -123456 +#define NO_LOCAL_UNDOLEVEL (-123456) #endif // _OPTION_H_ diff --git a/src/regexp.h b/src/regexp.h --- a/src/regexp.h +++ b/src/regexp.h @@ -31,7 +31,7 @@ * In the NFA engine: how many states are allowed */ #define NFA_MAX_STATES 100000 -#define NFA_TOO_EXPENSIVE -1 +#define NFA_TOO_EXPENSIVE (-1) // Which regexp engine to use? Needed for vim_regcomp(). // Must match with 'regexpengine'. diff --git a/src/spell.h b/src/spell.h --- a/src/spell.h +++ b/src/spell.h @@ -211,9 +211,9 @@ typedef struct salitem_S // Values for SP_*ERROR are negative, positive values are used by // read_cnt_string(). -#define SP_TRUNCERROR -1 // spell file truncated error -#define SP_FORMERROR -2 // format error in spell file -#define SP_OTHERERROR -3 // other error while reading spell file +#define SP_TRUNCERROR (-1) // spell file truncated error +#define SP_FORMERROR (-2) // format error in spell file +#define SP_OTHERERROR (-3) // other error while reading spell file /* * Structure used in "b_langp", filled from 'spelllang'. diff --git a/src/structs.h b/src/structs.h --- a/src/structs.h +++ b/src/structs.h @@ -2830,7 +2830,7 @@ struct file_buffer // flags for use of ":lmap" and IM control long b_p_iminsert; // input mode for insert long b_p_imsearch; // input mode for search -#define B_IMODE_USE_INSERT -1 // Use b_p_iminsert value for search +#define B_IMODE_USE_INSERT (-1) // Use b_p_iminsert value for search #define B_IMODE_NONE 0 // Input via none #define B_IMODE_LMAP 1 // Input via langmap #define B_IMODE_IM 2 // Input via input method @@ -3698,7 +3698,7 @@ struct window_S winopt_T w_onebuf_opt; winopt_T w_allbuf_opt; // transform a pointer to a "onebuf" option into a "allbuf" option -#define GLOBAL_WO(p) ((char *)p + sizeof(winopt_T)) +#define GLOBAL_WO(p) ((char *)(p) + sizeof(winopt_T)) // A few options have local flags for P_INSECURE. #ifdef FEAT_STL_OPT @@ -4462,7 +4462,7 @@ typedef struct { #define FIO_ENCRYPTED 0x1000 // encrypt written bytes #define FIO_NOCONVERT 0x2000 // skip encoding conversion #define FIO_UCSBOM 0x4000 // check for BOM at start of file -#define FIO_ALL -1 // allow all formats +#define FIO_ALL (-1) // allow all formats // When converting, a read() or write() may leave some bytes to be converted // for the next call. The value is guessed... diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4639, +/**/ 4638, /**/ 4637, diff --git a/src/vim.h b/src/vim.h --- a/src/vim.h +++ b/src/vim.h @@ -864,9 +864,9 @@ extern int (*dyn_libintl_wputenv)(const #define FINDFILE_DIR 1 // only directories #define FINDFILE_BOTH 2 // files and directories -#define W_ENDCOL(wp) (wp->w_wincol + wp->w_width) +#define W_ENDCOL(wp) ((wp)->w_wincol + (wp)->w_width) #ifdef FEAT_MENU -# define W_WINROW(wp) (wp->w_winrow + wp->w_winbar_height) +# define W_WINROW(wp) ((wp)->w_winrow + (wp)->w_winbar_height) #else # define W_WINROW(wp) (wp->w_winrow) #endif @@ -887,7 +887,7 @@ extern int (*dyn_libintl_wputenv)(const # define SST_MAX_ENTRIES 1000 // maximal size for state stack array # define SST_FIX_STATES 7 // size of sst_stack[]. # define SST_DIST 16 // normal distance between entries -# define SST_INVALID (synstate_T *)-1 // invalid syn_state pointer +# define SST_INVALID ((synstate_T *)-1) // invalid syn_state pointer # define HL_CONTAINED 0x01 // not used on toplevel # define HL_TRANSP 0x02 // has no highlighting @@ -949,7 +949,7 @@ extern int (*dyn_libintl_wputenv)(const #define GETFILE_ERROR 1 // normal error #define GETFILE_NOT_WRITTEN 2 // "not written" error #define GETFILE_SAME_FILE 0 // success, same file -#define GETFILE_OPEN_OTHER -1 // success, opened another file +#define GETFILE_OPEN_OTHER (-1) // success, opened another file #define GETFILE_UNUSED 8 #define GETFILE_SUCCESS(x) ((x) <= 0) @@ -971,9 +971,9 @@ extern int (*dyn_libintl_wputenv)(const // Values for "noremap" argument of ins_typebuf(). Also used for // map->m_noremap and menu->noremap[]. #define REMAP_YES 0 // allow remapping -#define REMAP_NONE -1 // no remapping -#define REMAP_SCRIPT -2 // remap script-local mappings only -#define REMAP_SKIP -3 // no remapping for first char +#define REMAP_NONE (-1) // no remapping +#define REMAP_SCRIPT (-2) // remap script-local mappings only +#define REMAP_SKIP (-3) // no remapping for first char // Values for mch_call_shell() second argument #define SHELL_FILTER 1 // filtering text @@ -1069,7 +1069,7 @@ extern int (*dyn_libintl_wputenv)(const // for lnum argument in do_ecmd() #define ECMD_LASTL (linenr_T)0 // use last position in loaded file -#define ECMD_LAST (linenr_T)-1 // use last position in all files +#define ECMD_LAST ((linenr_T)-1) // use last position in all files #define ECMD_ONE (linenr_T)1 // use first line // flags for do_cmdline() @@ -1265,13 +1265,13 @@ extern int (*dyn_libintl_wputenv)(const #define MAX_SWAP_PAGE_SIZE 50000 // Special values for current_sctx.sc_sid. -#define SID_MODELINE -1 // when using a modeline -#define SID_CMDARG -2 // for "--cmd" argument -#define SID_CARG -3 // for "-c" argument -#define SID_ENV -4 // for sourcing environment variable -#define SID_ERROR -5 // option was reset because of an error -#define SID_NONE -6 // don't set scriptID -#define SID_WINLAYOUT -7 // changing window size +#define SID_MODELINE (-1) // when using a modeline +#define SID_CMDARG (-2) // for "--cmd" argument +#define SID_CARG (-3) // for "-c" argument +#define SID_ENV (-4) // for sourcing environment variable +#define SID_ERROR (-5) // option was reset because of an error +#define SID_NONE (-6) // don't set scriptID +#define SID_WINLAYOUT (-7) // changing window size /* * Events for autocommands. @@ -1723,7 +1723,7 @@ void *vim_memset(void *, int, size_t); // Prefer using emsgf(), because perror() may send the output to the wrong // destination and mess up the screen. #ifdef HAVE_STRERROR -# define PERROR(msg) (void)semsg("%s: %s", (char *)msg, strerror(errno)) +# define PERROR(msg) (void)semsg("%s: %s", (char *)(msg), strerror(errno)) #else # define PERROR(msg) do_perror(msg) #endif @@ -1921,7 +1921,7 @@ typedef int sock_T; (((unsigned)((code) & 0xC0) >> 6) + 1) #define SET_NUM_MOUSE_CLICKS(code, num) \ - (code) = ((code) & 0x3f) | ((((num) - 1) & 3) << 6) + ((code) = ((code) & 0x3f) | ((((num) - 1) & 3) << 6)) // Added to mouse column for GUI when 'mousefocus' wants to give focus to a // window by simulating a click on its status line. We could use up to 128 * @@ -2515,8 +2515,8 @@ typedef enum { #endif // values for vim_handle_signal() that are not a signal -#define SIGNAL_BLOCK -1 -#define SIGNAL_UNBLOCK -2 +#define SIGNAL_BLOCK (-1) +#define SIGNAL_UNBLOCK (-2) #if !defined(UNIX) && !defined(VMS) # define vim_handle_signal(x) 0 #endif @@ -2528,8 +2528,8 @@ typedef enum { // behavior for bad character, "++bad=" argument #define BAD_REPLACE '?' // replace it with '?' (default) -#define BAD_KEEP -1 // leave it -#define BAD_DROP -2 // erase it +#define BAD_KEEP (-1) // leave it +#define BAD_DROP (-2) // erase it // last argument for do_source() #define DOSO_NONE 0 @@ -2552,11 +2552,11 @@ typedef enum { // direction for nv_mousescroll() and ins_mousescroll() #define MSCR_DOWN 0 // DOWN must be FALSE #define MSCR_UP 1 -#define MSCR_LEFT -1 -#define MSCR_RIGHT -2 +#define MSCR_LEFT (-1) +#define MSCR_RIGHT (-2) -#define KEYLEN_PART_KEY -1 // keylen value for incomplete key-code -#define KEYLEN_PART_MAP -2 // keylen value for incomplete mapping +#define KEYLEN_PART_KEY (-1) // keylen value for incomplete key-code +#define KEYLEN_PART_MAP (-2) // keylen value for incomplete mapping #define KEYLEN_REMOVED 9999 // keylen value for removed sequence // Return values from win32_fileinfo(). @@ -2716,8 +2716,8 @@ typedef enum { #if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H) # define ELAPSED_TIMEVAL -# define ELAPSED_INIT(v) gettimeofday(&v, NULL) -# define ELAPSED_FUNC(v) elapsed(&v) +# define ELAPSED_INIT(v) gettimeofday(&(v), NULL) +# define ELAPSED_FUNC(v) elapsed(&(v)) typedef struct timeval elapsed_T; long elapsed(struct timeval *start_tv); #elif defined(MSWIN) @@ -2734,8 +2734,8 @@ long elapsed(DWORD start_tick); #endif // Replacement for nchar used by nv_replace(). -#define REPLACE_CR_NCHAR -1 -#define REPLACE_NL_NCHAR -2 +#define REPLACE_CR_NCHAR (-1) +#define REPLACE_NL_NCHAR (-2) // flags for term_start() #define TERM_START_NOJOB 1 diff --git a/src/vim9.h b/src/vim9.h --- a/src/vim9.h +++ b/src/vim9.h @@ -515,10 +515,10 @@ struct dfunc_S { extern garray_T def_functions; // Used for "lnum" when a range is to be taken from the stack. -#define LNUM_VARIABLE_RANGE -999 +#define LNUM_VARIABLE_RANGE (-999) // Used for "lnum" when a range is to be taken from the stack and "!" is used. -#define LNUM_VARIABLE_RANGE_ABOVE -888 +#define LNUM_VARIABLE_RANGE_ABOVE (-888) // Keep in sync with get_compile_type() #ifdef FEAT_PROFILE @@ -530,7 +530,7 @@ extern garray_T def_functions; : (dfunc)->df_instr)) #else # define INSTRUCTIONS(dfunc) \ - (debug_break_level > 0 || may_break_in_function(dfunc->df_ufunc) \ + (debug_break_level > 0 || may_break_in_function((dfunc)->df_ufunc) \ ? (dfunc)->df_instr_debug \ : (dfunc)->df_instr) #endif