hide-ifdef-mode stores the list of current defines incorrectly when function hide-ifdef-set-define-alist is used. Steps to reproduce: 1. Start up with emacs -q. 2. Create a new buffer named test.c with the following contents: #include int main(void) { #ifdef DEFINE1 printf("Define 1"); #endif #ifdef DEFINE2 printf("Define 2"); #endif #ifdef DEFINE 3 printf("Define 3"); #endif return 0; } 3. Hide some ifdefs as follows: M-x c-mode M-x hide-ifdef-mode C-c @ d DEFINE2 C-c @ d DEFINE3 C-c @ h - Result: DEFINE1 block is hidden, DEFINE2 and DEFINE3 blocks are shown. 4. Store and reload the defines as follows: C-c @ D test-defines C-c @ U test-defines - Result: DEFINE1 and DEFINE2 blocks are hidden, DEFINE3 block is shown - Expected: DEFINE1 block is hidden, DEFINE2 and DEFINE3 blocks are shown as before. 5. Examine the stored alist: M-x eval-expression hide-ifdef-define-alist - Result: ((test-defines (DEFINE3 . 1) (DEFINE3 . 1))) - Expected: ((test-defines (DEFINE3 . 1) (DEFINE2 . 1))) Suggested fix: I believe there is a bug in function hif-compress-define-list. (defun hif-compress-define-list (env) "Compress the define list ENV into a list of defined symbols only." (let ((new-defs nil)) (dolist (def env new-defs) -> (if (hif-lookup (car def)) (push (car env) new-defs))))) Here, I think that (push (car env) new-defs) should have been (push (car def) new-defs) In GNU Emacs 24.1.1 (i386-mingw-nt6.1.7601) of 2012-06-10 on MARVIN Windowing system distributor `Microsoft Corp.', version 6.1.7601 Configured using: `configure --with-gcc (4.6) --cflags -ID:/devel/emacs/libs/libXpm-3.5.8/include -ID:/devel/emacs/libs/libXpm-3.5.8/src -ID:/devel/emacs/libs/libpng-dev_1.4.3-1/include -ID:/devel/emacs/libs/zlib-dev_1.2.5-2/include -ID:/devel/emacs/libs/giflib-4.1.4-1/include -ID:/devel/emacs/libs/jpeg-6b-4/include -ID:/devel/emacs/libs/tiff-3.8.2-1/include -ID:/devel/emacs/libs/gnutls-3.0.9/include' Important settings: value of $LC_ALL: nil value of $LC_COLLATE: nil value of $LC_CTYPE: nil value of $LC_MESSAGES: nil value of $LC_MONETARY: nil value of $LC_NUMERIC: nil value of $LC_TIME: nil value of $LANG: ENG value of $XMODIFIERS: nil locale-coding-system: cp1252 default enable-multibyte-characters: t Major mode: C/l Minor modes in effect: hide-ifdef-mode: t tooltip-mode: t mouse-wheel-mode: t tool-bar-mode: t menu-bar-mode: t file-name-shadow-mode: t global-font-lock-mode: t font-lock-mode: t blink-cursor-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t line-number-mode: t transient-mark-mode: t abbrev-mode: t Load-path shadows: None found. Features: (shadow sort gnus-util mail-extr emacsbug message format-spec rfc822 mml mml-sec mm-decode mm-bodies mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader sendmail rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mail-utils help-fns kmacro help-mode view hideif cc-mode cc-fonts easymenu cc-guess cc-menus cc-cmds cc-styles cc-align cc-engine cc-vars cc-defs regexp-opt time-date tooltip ediff-hook vc-hooks lisp-float-type mwheel dos-w32 disp-table ls-lisp w32-win w32-vars tool-bar dnd fontset image fringe lisp-mode register page menu-bar rfn-eshadow timer select scroll-bar mouse jit-lock font-lock syntax facemenu font-core frame cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese case-table epa-hook jka-cmpr-hook help simple abbrev minibuffer loaddefs button faces cus-face files text-properties overlay sha1 md5 base64 format env code-pages mule custom widget hashtable-print-readable backquote make-network-process multi-tty emacs)