bug#21466: [PATCH] Avoid defining (temporarily) vars and functions
Alan Mackenzie <[email protected]> Sat, 26 Mar 2022 14:45:40 +0000
| Newsgroups | gmane.emacs.cc-mode.general |
|---|---|
| Message-ID | <Yj8nFNRKwUdx830s__28369.8712171585$1648305998$gmane$org@ACM> |
Hello again, Lars. On Wed, Mar 23, 2022 at 21:13:35 +0100, Lars Ingebrigtsen wrote: > Alan Mackenzie <[email protected]> writes: > > So, I don't object on principle to the principle of the patch, just > > there are these little irritations about it, and it will need me to > > study it more closely to check nothing subtle would get lost (I doubt it > > would). > The patch no longer applied to Emacs 29, so I've respun it. [ .... ] > However, it leads to a number of warnings when compiling, so either my > respin is faulty, or something's changed to make it not work any more? Maybe it didn't work properly back in 2015, I didn't actually get around to trying it out, then. > In c-fontify-recorded-types-and-refs: > progmodes/cc-fonts.el:491:8: Warning: function `c-fontify-recorded-types-and-refs' defined multiple times in this file > ELC progmodes/cc-styles.elc > In c-font-lock-declarators: > progmodes/cc-fonts.el:1063:8: Warning: function `c-font-lock-declarators' defined multiple times in this file > progmodes/cc-fonts.el:2300:35: Warning: reference to free variable `c-preprocessor-face-name' > progmodes/cc-fonts.el:2300:35: Warning: reference to free variable `c-preprocessor-face-name' > progmodes/cc-fonts.el:2496:37: Warning: reference to free variable `c-preprocessor-face-name' > progmodes/cc-fonts.el:2496:37: Warning: reference to free variable `c-preprocessor-face-name' > progmodes/cc-fonts.el:2501:37: Warning: reference to free variable `c-reference-face-name' > In c-font-lock-objc-method: > progmodes/cc-fonts.el:2527:8: Warning: function `c-font-lock-objc-method' defined multiple times in this file > progmodes/cc-fonts.el:2602:38: Warning: reference to free variable `c-preprocessor-face-name' > progmodes/cc-fonts.el:2602:38: Warning: reference to free variable `c-preprocessor-face-name' > progmodes/cc-fonts.el:2650:38: Warning: reference to free variable `c-reference-face-name' > progmodes/cc-fonts.el:2678:37: Warning: reference to free variable `c-preprocessor-face-name' > progmodes/cc-fonts.el:2678:37: Warning: reference to free variable `c-preprocessor-face-name' > progmodes/cc-fonts.el:2683:37: Warning: reference to free variable `c-reference-face-name' > progmodes/cc-fonts.el:2711:38: Warning: reference to free variable `c-preprocessor-face-name' > progmodes/cc-fonts.el:2711:38: Warning: reference to free variable `c-preprocessor-face-name' > progmodes/cc-fonts.el:2716:38: Warning: reference to free variable `c-reference-face-name' The patch is essentially replacing cc-bytecomp-defvar by (defvar foo), and cc-bytecomp-defun by (declare-function 'foo nil). These are only approximately similar. cc-bytecomp-def{var,fun} are like C's extern. They say "this variable/function will be defined somewhere else". By contrast, (defvar foo) doesn't really do anything (?except marking any possible foo as a special variable). (declare-function 'foo nil) says "This function HAS ALREADY been defined somewhere else (and don't you dare redefine it!)." These explain the "free variable" warnings for the variables and the "defined multiple times" warnings for the functions. To sort out this bug properly, we really need Lisp functions equivalent to C's extern. (defvar foo) and (declare-function 'foo nil) currently don't fill this need. -- Alan Mackenzie (Nuremberg, Germany).