aboutsummaryrefslogtreecommitdiffstats
path: root/src/lread.c
diff options
context:
space:
mode:
authorPhilipp Stephani2015-06-30 22:38:35 +0200
committerPhilipp Stephani2017-05-01 20:39:10 +0200
commitc2bbdc3316487e34eba1470dd059c0c290431e00 (patch)
treebed5315e69d89c99c62be4a78e8f26d799643f70 /src/lread.c
parentb72e36047c9a5d46b02e12252e0fc640b6839903 (diff)
downloademacs-c2bbdc3316487e34eba1470dd059c0c290431e00.tar.gz
emacs-c2bbdc3316487e34eba1470dd059c0c290431e00.zip
Warn about missing backslashes during load
* src/lread.c (load_warn_unescaped_character_literals, Fload, read1) (syms_of_lread): Warn if unescaped character literals are found (Bug#20152). * lisp/emacs-lisp/bytecomp.el (byte-compile-from-buffer): Check for unescaped character literals during byte compilation. * test/src/lread-tests.el (lread-tests--unescaped-char-literals): New unit test. (lread-tests--with-temp-file, lread-tests--last-message): Helper functions for unit test. * test/lisp/emacs-lisp/bytecomp-tests.el (bytecomp-tests--unescaped-char-literals): New unit test. * test/lisp/emacs-lisp/bytecomp-tests.el (bytecomp-tests--with-temp-file): Helper macro for unit test.
Diffstat (limited to 'src/lread.c')
-rw-r--r--src/lread.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/lread.c b/src/lread.c
index 3b2e123dd39..6467043b1da 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -955,6 +955,21 @@ load_warn_old_style_backquotes (Lisp_Object file)
955 } 955 }
956} 956}
957 957
958static void
959load_warn_unescaped_character_literals (Lisp_Object file)
960{
961 if (NILP (Vlread_unescaped_character_literals)) return;
962 CHECK_CONS (Vlread_unescaped_character_literals);
963 AUTO_STRING (format,
964 "Loading `%s': unescaped character literals %s detected!");
965 AUTO_STRING (separator, ", ");
966 CALLN (Fmessage,
967 format, file,
968 Fmapconcat (Qstring,
969 Fsort (Vlread_unescaped_character_literals, Qlss),
970 separator));
971}
972
958DEFUN ("get-load-suffixes", Fget_load_suffixes, Sget_load_suffixes, 0, 0, 0, 973DEFUN ("get-load-suffixes", Fget_load_suffixes, Sget_load_suffixes, 0, 0, 0,
959 doc: /* Return the suffixes that `load' should try if a suffix is \ 974 doc: /* Return the suffixes that `load' should try if a suffix is \
960required. 975required.
@@ -1202,6 +1217,11 @@ Return t if the file exists and loads successfully. */)
1202 specbind (Qold_style_backquotes, Qnil); 1217 specbind (Qold_style_backquotes, Qnil);
1203 record_unwind_protect (load_warn_old_style_backquotes, file); 1218 record_unwind_protect (load_warn_old_style_backquotes, file);
1204 1219
1220 /* Check for the presence of unescaped character literals and warn
1221 about them. */
1222 specbind (Qlread_unescaped_character_literals, Qnil);
1223 record_unwind_protect (load_warn_unescaped_character_literals, file);
1224
1205 int is_elc; 1225 int is_elc;
1206 if ((is_elc = suffix_p (found, ".elc")) != 0 1226 if ((is_elc = suffix_p (found, ".elc")) != 0
1207 /* version = 1 means the file is empty, in which case we can 1227 /* version = 1 means the file is empty, in which case we can
@@ -3092,6 +3112,16 @@ read1 (Lisp_Object readcharfun, int *pch, bool first_in_list)
3092 if (c == ' ' || c == '\t') 3112 if (c == ' ' || c == '\t')
3093 return make_number (c); 3113 return make_number (c);
3094 3114
3115 if (c == '(' || c == ')' || c == '[' || c == ']'
3116 || c == '"' || c == ';')
3117 {
3118 CHECK_LIST (Vlread_unescaped_character_literals);
3119 Lisp_Object char_obj = make_natnum (c);
3120 if (NILP (Fmemq (char_obj, Vlread_unescaped_character_literals)))
3121 Vlread_unescaped_character_literals =
3122 Fcons (char_obj, Vlread_unescaped_character_literals);
3123 }
3124
3095 if (c == '\\') 3125 if (c == '\\')
3096 c = read_escape (readcharfun, 0); 3126 c = read_escape (readcharfun, 0);
3097 modifiers = c & CHAR_MODIFIER_MASK; 3127 modifiers = c & CHAR_MODIFIER_MASK;
@@ -4815,6 +4845,16 @@ variables, this must be set in the first line of a file. */);
4815 Vold_style_backquotes = Qnil; 4845 Vold_style_backquotes = Qnil;
4816 DEFSYM (Qold_style_backquotes, "old-style-backquotes"); 4846 DEFSYM (Qold_style_backquotes, "old-style-backquotes");
4817 4847
4848 DEFVAR_LISP ("lread--unescaped-character-literals",
4849 Vlread_unescaped_character_literals,
4850 doc: /* List of deprecated unescaped character literals encountered by `read'.
4851For internal use only. */);
4852 Vlread_unescaped_character_literals = Qnil;
4853 DEFSYM (Qlread_unescaped_character_literals,
4854 "lread--unescaped-character-literals");
4855
4856 DEFSYM (Qlss, "<");
4857
4818 DEFVAR_BOOL ("load-prefer-newer", load_prefer_newer, 4858 DEFVAR_BOOL ("load-prefer-newer", load_prefer_newer,
4819 doc: /* Non-nil means `load' prefers the newest version of a file. 4859 doc: /* Non-nil means `load' prefers the newest version of a file.
4820This applies when a filename suffix is not explicitly specified and 4860This applies when a filename suffix is not explicitly specified and