aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Antipov2015-01-13 06:39:45 +0300
committerDmitry Antipov2015-01-13 06:39:45 +0300
commitad9c4a4091df19064a7f7f53bfdb687931e141f6 (patch)
tree203ded274a9f90bff594e91c1c261ff843807e8e
parent329b902141c68190a2d8a5d6fd9312b6a816471c (diff)
downloademacs-ad9c4a4091df19064a7f7f53bfdb687931e141f6.tar.gz
emacs-ad9c4a4091df19064a7f7f53bfdb687931e141f6.zip
Support const and noreturn DEFUN attributes.
* lib-src/make-docfile.c (struct global): New field 'flags'. (DEFUN_noreturn, DEFUN_const): New enum bitfields. (add_global): Now return pointer to global. (write_globals): Add _Noreturn and ATTRIBUTE_CONST attributes if requested by global's flags. (stream_match): New function. (scan_c_stream): Recognize 'attributes:' of DEFUN. * src/callint.c (Finteractive): * src/character.c (Fcharacterp, Fmax_char): * src.data.c (Feq, Fnull, Fconsp, Fatom, Flistp, Fnlistp, Fsymbolp) (Fstringp, Fchar_or_string_p, Fintegerp, Fnatnump, Fnumberp) (Ffloatp, Fbyteorder): * src/decompress.c (Fzlib_available_p): * src/fns.c (Fidentity): * src/frame.c (Fframe_windows_min_size): * src/gnutls.c (Fgnutls_error_p, Fgnutls_available_p): * src/window.c (Fwindow__sanitize_window_sizes): * src/xdisp.c (Ftool_bar_height): * src/xfaces.c (Fface_attribute_relative_p): Add const attribute. * src/emacs.c (Fkill_emacs): * src/eval.c (Fthrow): * src/keyboard.c (Ftop_level, Fexit_recursive_edit) (Fabor_recursive_edit): Add noreturn attribute.
-rw-r--r--lib-src/ChangeLog11
-rw-r--r--lib-src/make-docfile.c123
-rw-r--r--src/ChangeLog20
-rw-r--r--src/callint.c3
-rw-r--r--src/character.c6
-rw-r--r--src/data.c42
-rw-r--r--src/decompress.c3
-rw-r--r--src/emacs.c3
-rw-r--r--src/eval.c3
-rw-r--r--src/fns.c3
-rw-r--r--src/frame.c3
-rw-r--r--src/gnutls.c6
-rw-r--r--src/keyboard.c9
-rw-r--r--src/window.c3
-rw-r--r--src/xdisp.c3
-rw-r--r--src/xfaces.c3
16 files changed, 175 insertions, 69 deletions
diff --git a/lib-src/ChangeLog b/lib-src/ChangeLog
index 740359605fd..969aac80124 100644
--- a/lib-src/ChangeLog
+++ b/lib-src/ChangeLog
@@ -1,3 +1,14 @@
12015-01-13 Dmitry Antipov <dmantipov@yandex.ru>
2
3 Support DEFUN attributes.
4 * make-docfile.c (struct global): New field 'flags'.
5 (DEFUN_noreturn, DEFUN_const): New enum bitfields.
6 (add_global): Now return pointer to global.
7 (write_globals): Add _Noreturn and ATTRIBUTE_CONST attributes
8 if requested by global's flags.
9 (stream_match): New function.
10 (scan_c_stream): Recognize 'attributes:' of DEFUN.
11
12015-01-10 Paul Eggert <eggert@cs.ucla.edu> 122015-01-10 Paul Eggert <eggert@cs.ucla.edu>
2 13
3 Port to 32-bit --with-wide-int 14 Port to 32-bit --with-wide-int
diff --git a/lib-src/make-docfile.c b/lib-src/make-docfile.c
index bc5420ea939..79d421a0a8e 100644
--- a/lib-src/make-docfile.c
+++ b/lib-src/make-docfile.c
@@ -562,6 +562,7 @@ struct global
562{ 562{
563 enum global_type type; 563 enum global_type type;
564 char *name; 564 char *name;
565 int flags;
565 union 566 union
566 { 567 {
567 int value; 568 int value;
@@ -569,13 +570,16 @@ struct global
569 } v; 570 } v;
570}; 571};
571 572
573/* Bit values for FLAGS field from the above. Applied for DEFUNs only. */
574enum { DEFUN_noreturn = 1, DEFUN_const = 2 };
575
572/* All the variable names we saw while scanning C sources in `-g' 576/* All the variable names we saw while scanning C sources in `-g'
573 mode. */ 577 mode. */
574int num_globals; 578int num_globals;
575int num_globals_allocated; 579int num_globals_allocated;
576struct global *globals; 580struct global *globals;
577 581
578static void 582static struct global *
579add_global (enum global_type type, char *name, int value, char const *svalue) 583add_global (enum global_type type, char *name, int value, char const *svalue)
580{ 584{
581 /* Ignore the one non-symbol that can occur. */ 585 /* Ignore the one non-symbol that can occur. */
@@ -601,7 +605,10 @@ add_global (enum global_type type, char *name, int value, char const *svalue)
601 globals[num_globals - 1].v.svalue = svalue; 605 globals[num_globals - 1].v.svalue = svalue;
602 else 606 else
603 globals[num_globals - 1].v.value = value; 607 globals[num_globals - 1].v.value = value;
608 globals[num_globals - 1].flags = 0;
609 return globals + num_globals - 1;
604 } 610 }
611 return NULL;
605} 612}
606 613
607static int 614static int
@@ -708,13 +715,7 @@ write_globals (void)
708 globals[i].name, globals[i].name, globals[i].name); 715 globals[i].name, globals[i].name, globals[i].name);
709 else 716 else
710 { 717 {
711 /* It would be nice to have a cleaner way to deal with these 718 if (globals[i].flags & DEFUN_noreturn)
712 special hacks. */
713 if (strcmp (globals[i].name, "Fthrow") == 0
714 || strcmp (globals[i].name, "Ftop_level") == 0
715 || strcmp (globals[i].name, "Fkill_emacs") == 0
716 || strcmp (globals[i].name, "Fexit_recursive_edit") == 0
717 || strcmp (globals[i].name, "Fabort_recursive_edit") == 0)
718 fputs ("_Noreturn ", stdout); 719 fputs ("_Noreturn ", stdout);
719 720
720 printf ("EXFUN (%s, ", globals[i].name); 721 printf ("EXFUN (%s, ", globals[i].name);
@@ -726,36 +727,7 @@ write_globals (void)
726 printf ("%d", globals[i].v.value); 727 printf ("%d", globals[i].v.value);
727 putchar (')'); 728 putchar (')');
728 729
729 /* It would be nice to have a cleaner way to deal with these 730 if (globals[i].flags & DEFUN_const)
730 special hacks, too. */
731 if (strcmp (globals[i].name, "Fatom") == 0
732 || strcmp (globals[i].name, "Fbyteorder") == 0
733 || strcmp (globals[i].name, "Fcharacterp") == 0
734 || strcmp (globals[i].name, "Fchar_or_string_p") == 0
735 || strcmp (globals[i].name, "Fconsp") == 0
736 || strcmp (globals[i].name, "Feq") == 0
737 || strcmp (globals[i].name, "Fface_attribute_relative_p") == 0
738 || strcmp (globals[i].name, "Fframe_windows_min_size") == 0
739 || strcmp (globals[i].name, "Fgnutls_errorp") == 0
740 || strcmp (globals[i].name, "Fidentity") == 0
741 || strcmp (globals[i].name, "Fintegerp") == 0
742 || strcmp (globals[i].name, "Finteractive") == 0
743 || strcmp (globals[i].name, "Ffloatp") == 0
744 || strcmp (globals[i].name, "Flistp") == 0
745 || strcmp (globals[i].name, "Fmax_char") == 0
746 || strcmp (globals[i].name, "Fnatnump") == 0
747 || strcmp (globals[i].name, "Fnlistp") == 0
748 || strcmp (globals[i].name, "Fnull") == 0
749 || strcmp (globals[i].name, "Fnumberp") == 0
750 || strcmp (globals[i].name, "Fstringp") == 0
751 || strcmp (globals[i].name, "Fsymbolp") == 0
752 || strcmp (globals[i].name, "Ftool_bar_height") == 0
753 || strcmp (globals[i].name, "Fwindow__sanitize_window_sizes") == 0
754#ifndef WINDOWSNT
755 || strcmp (globals[i].name, "Fgnutls_available_p") == 0
756 || strcmp (globals[i].name, "Fzlib_available_p") == 0
757#endif
758 || 0)
759 fputs (" ATTRIBUTE_CONST", stdout); 731 fputs (" ATTRIBUTE_CONST", stdout);
760 732
761 puts (";"); 733 puts (";");
@@ -817,6 +789,23 @@ scan_c_file (char *filename, const char *mode)
817 return scan_c_stream (infile); 789 return scan_c_stream (infile);
818} 790}
819 791
792/* Return 1 if next input from INFILE is equal to P, -1 if EOF,
793 0 if input doesn't match. */
794
795static int
796stream_match (FILE *infile, const char *p)
797{
798 for (; *p; p++)
799 {
800 int c = getc (infile);
801 if (c == EOF)
802 return -1;
803 if (c != *p)
804 return 0;
805 }
806 return 1;
807}
808
820static int 809static int
821scan_c_stream (FILE *infile) 810scan_c_stream (FILE *infile)
822{ 811{
@@ -1033,7 +1022,63 @@ scan_c_stream (FILE *infile)
1033 1022
1034 if (generate_globals) 1023 if (generate_globals)
1035 { 1024 {
1036 add_global (FUNCTION, name, maxargs, 0); 1025 struct global *g = add_global (FUNCTION, name, maxargs, 0);
1026
1027 /* The following code tries to recognize function attributes
1028 specified after the docstring, e.g.:
1029
1030 DEFUN ("foo", Ffoo, Sfoo, X, Y, Z,
1031 doc: /\* doc *\/
1032 attributes: attribute1 attribute2 ...)
1033 (Lisp_Object arg...)
1034
1035 Now only 'noreturn' and 'const' attributes are used. */
1036
1037 /* Advance to the end of docstring. */
1038 c = getc (infile);
1039 if (c == EOF)
1040 goto eof;
1041 int d = getc (infile);
1042 if (d == EOF)
1043 goto eof;
1044 while (1)
1045 {
1046 if (c == '*' && d == '/')
1047 break;
1048 c = d, d = getc (infile);
1049 if (d == EOF)
1050 goto eof;
1051 }
1052 /* Skip spaces, if any. */
1053 do
1054 {
1055 c = getc (infile);
1056 if (c == EOF)
1057 goto eof;
1058 }
1059 while (c == ' ' || c == '\n' || c == '\r' || c == '\t');
1060 /* Check for 'attributes:' token. */
1061 if (c == 'a' && stream_match (infile, "ttributes:"))
1062 {
1063 char *p = input_buffer;
1064 /* Collect attributes up to ')'. */
1065 while (1)
1066 {
1067 c = getc (infile);
1068 if (c == EOF)
1069 goto eof;
1070 if (c == ')')
1071 break;
1072 if (p - input_buffer > sizeof (input_buffer))
1073 abort ();
1074 *p++ = c;
1075 }
1076 *p = 0;
1077 if (strstr (input_buffer, "noreturn"))
1078 g->flags |= DEFUN_noreturn;
1079 if (strstr (input_buffer, "const"))
1080 g->flags |= DEFUN_const;
1081 }
1037 continue; 1082 continue;
1038 } 1083 }
1039 1084
diff --git a/src/ChangeLog b/src/ChangeLog
index 252dfd33620..792407e15e6 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,23 @@
12015-01-13 Dmitry Antipov <dmantipov@yandex.ru>
2
3 Add DEFUN attributes.
4 * callint.c (Finteractive):
5 * character.c (Fcharacterp, Fmax_char):
6 * data.c (Feq, Fnull, Fconsp, Fatom, Flistp, Fnlistp, Fsymbolp)
7 (Fstringp, Fchar_or_string_p, Fintegerp, Fnatnump, Fnumberp)
8 (Ffloatp, Fbyteorder):
9 * decompress.c (Fzlib_available_p):
10 * fns.c (Fidentity):
11 * frame.c (Fframe_windows_min_size):
12 * gnutls.c (Fgnutls_error_p, Fgnutls_available_p):
13 * window.c (Fwindow__sanitize_window_sizes):
14 * xdisp.c (Ftool_bar_height):
15 * xfaces.c (Fface_attribute_relative_p): Add const attribute.
16 * emacs.c (Fkill_emacs):
17 * eval.c (Fthrow):
18 * keyboard.c (Ftop_level, Fexit_recursive_edit)
19 (Fabor_recursive_edit): Add noreturn attribute.
20
12015-01-12 Paul Eggert <eggert@cs.ucla.edu> 212015-01-12 Paul Eggert <eggert@cs.ucla.edu>
2 22
3 Port to 32-bit MingGW --with-wide-int 23 Port to 32-bit MingGW --with-wide-int
diff --git a/src/callint.c b/src/callint.c
index 25955039ac7..dd238b976aa 100644
--- a/src/callint.c
+++ b/src/callint.c
@@ -101,7 +101,8 @@ If the string begins with `^' and `shift-select-mode' is non-nil,
101 Emacs first calls the function `handle-shift-selection'. 101 Emacs first calls the function `handle-shift-selection'.
102You may use `@', `*', and `^' together. They are processed in the 102You may use `@', `*', and `^' together. They are processed in the
103 order that they appear, before reading any arguments. 103 order that they appear, before reading any arguments.
104usage: (interactive &optional ARGS) */) 104usage: (interactive &optional ARGS) */
105 attributes: const)
105 (Lisp_Object args) 106 (Lisp_Object args)
106{ 107{
107 return Qnil; 108 return Qnil;
diff --git a/src/character.c b/src/character.c
index 4a5c7ec3156..39d32c9d41a 100644
--- a/src/character.c
+++ b/src/character.c
@@ -232,14 +232,16 @@ DEFUN ("characterp", Fcharacterp, Scharacterp, 1, 2, 0,
232In Emacs Lisp, characters are represented by character codes, which 232In Emacs Lisp, characters are represented by character codes, which
233are non-negative integers. The function `max-char' returns the 233are non-negative integers. The function `max-char' returns the
234maximum character code. 234maximum character code.
235usage: (characterp OBJECT) */) 235usage: (characterp OBJECT) */
236 attributes: const)
236 (Lisp_Object object, Lisp_Object ignore) 237 (Lisp_Object object, Lisp_Object ignore)
237{ 238{
238 return (CHARACTERP (object) ? Qt : Qnil); 239 return (CHARACTERP (object) ? Qt : Qnil);
239} 240}
240 241
241DEFUN ("max-char", Fmax_char, Smax_char, 0, 0, 0, 242DEFUN ("max-char", Fmax_char, Smax_char, 0, 0, 0,
242 doc: /* Return the character of the maximum code. */) 243 doc: /* Return the character of the maximum code. */
244 attributes: const)
243 (void) 245 (void)
244{ 246{
245 return make_number (MAX_CHAR); 247 return make_number (MAX_CHAR);
diff --git a/src/data.c b/src/data.c
index 820c3ce8407..0389eb49b06 100644
--- a/src/data.c
+++ b/src/data.c
@@ -176,7 +176,8 @@ args_out_of_range_3 (Lisp_Object a1, Lisp_Object a2, Lisp_Object a3)
176/* Data type predicates. */ 176/* Data type predicates. */
177 177
178DEFUN ("eq", Feq, Seq, 2, 2, 0, 178DEFUN ("eq", Feq, Seq, 2, 2, 0,
179 doc: /* Return t if the two args are the same Lisp object. */) 179 doc: /* Return t if the two args are the same Lisp object. */
180 attributes: const)
180 (Lisp_Object obj1, Lisp_Object obj2) 181 (Lisp_Object obj1, Lisp_Object obj2)
181{ 182{
182 if (EQ (obj1, obj2)) 183 if (EQ (obj1, obj2))
@@ -185,7 +186,8 @@ DEFUN ("eq", Feq, Seq, 2, 2, 0,
185} 186}
186 187
187DEFUN ("null", Fnull, Snull, 1, 1, 0, 188DEFUN ("null", Fnull, Snull, 1, 1, 0,
188 doc: /* Return t if OBJECT is nil. */) 189 doc: /* Return t if OBJECT is nil. */
190 attributes: const)
189 (Lisp_Object object) 191 (Lisp_Object object)
190{ 192{
191 if (NILP (object)) 193 if (NILP (object))
@@ -263,7 +265,8 @@ for example, (type-of 1) returns `integer'. */)
263} 265}
264 266
265DEFUN ("consp", Fconsp, Sconsp, 1, 1, 0, 267DEFUN ("consp", Fconsp, Sconsp, 1, 1, 0,
266 doc: /* Return t if OBJECT is a cons cell. */) 268 doc: /* Return t if OBJECT is a cons cell. */
269 attributes: const)
267 (Lisp_Object object) 270 (Lisp_Object object)
268{ 271{
269 if (CONSP (object)) 272 if (CONSP (object))
@@ -272,7 +275,8 @@ DEFUN ("consp", Fconsp, Sconsp, 1, 1, 0,
272} 275}
273 276
274DEFUN ("atom", Fatom, Satom, 1, 1, 0, 277DEFUN ("atom", Fatom, Satom, 1, 1, 0,
275 doc: /* Return t if OBJECT is not a cons cell. This includes nil. */) 278 doc: /* Return t if OBJECT is not a cons cell. This includes nil. */
279 attributes: const)
276 (Lisp_Object object) 280 (Lisp_Object object)
277{ 281{
278 if (CONSP (object)) 282 if (CONSP (object))
@@ -282,7 +286,8 @@ DEFUN ("atom", Fatom, Satom, 1, 1, 0,
282 286
283DEFUN ("listp", Flistp, Slistp, 1, 1, 0, 287DEFUN ("listp", Flistp, Slistp, 1, 1, 0,
284 doc: /* Return t if OBJECT is a list, that is, a cons cell or nil. 288 doc: /* Return t if OBJECT is a list, that is, a cons cell or nil.
285Otherwise, return nil. */) 289Otherwise, return nil. */
290 attributes: const)
286 (Lisp_Object object) 291 (Lisp_Object object)
287{ 292{
288 if (CONSP (object) || NILP (object)) 293 if (CONSP (object) || NILP (object))
@@ -291,7 +296,8 @@ Otherwise, return nil. */)
291} 296}
292 297
293DEFUN ("nlistp", Fnlistp, Snlistp, 1, 1, 0, 298DEFUN ("nlistp", Fnlistp, Snlistp, 1, 1, 0,
294 doc: /* Return t if OBJECT is not a list. Lists include nil. */) 299 doc: /* Return t if OBJECT is not a list. Lists include nil. */
300 attributes: const)
295 (Lisp_Object object) 301 (Lisp_Object object)
296{ 302{
297 if (CONSP (object) || NILP (object)) 303 if (CONSP (object) || NILP (object))
@@ -300,7 +306,8 @@ DEFUN ("nlistp", Fnlistp, Snlistp, 1, 1, 0,
300} 306}
301 307
302DEFUN ("symbolp", Fsymbolp, Ssymbolp, 1, 1, 0, 308DEFUN ("symbolp", Fsymbolp, Ssymbolp, 1, 1, 0,
303 doc: /* Return t if OBJECT is a symbol. */) 309 doc: /* Return t if OBJECT is a symbol. */
310 attributes: const)
304 (Lisp_Object object) 311 (Lisp_Object object)
305{ 312{
306 if (SYMBOLP (object)) 313 if (SYMBOLP (object))
@@ -333,7 +340,8 @@ DEFUN ("vectorp", Fvectorp, Svectorp, 1, 1, 0,
333} 340}
334 341
335DEFUN ("stringp", Fstringp, Sstringp, 1, 1, 0, 342DEFUN ("stringp", Fstringp, Sstringp, 1, 1, 0,
336 doc: /* Return t if OBJECT is a string. */) 343 doc: /* Return t if OBJECT is a string. */
344 attributes: const)
337 (Lisp_Object object) 345 (Lisp_Object object)
338{ 346{
339 if (STRINGP (object)) 347 if (STRINGP (object))
@@ -436,7 +444,8 @@ DEFUN ("byte-code-function-p", Fbyte_code_function_p, Sbyte_code_function_p,
436} 444}
437 445
438DEFUN ("char-or-string-p", Fchar_or_string_p, Schar_or_string_p, 1, 1, 0, 446DEFUN ("char-or-string-p", Fchar_or_string_p, Schar_or_string_p, 1, 1, 0,
439 doc: /* Return t if OBJECT is a character or a string. */) 447 doc: /* Return t if OBJECT is a character or a string. */
448 attributes: const)
440 (register Lisp_Object object) 449 (register Lisp_Object object)
441{ 450{
442 if (CHARACTERP (object) || STRINGP (object)) 451 if (CHARACTERP (object) || STRINGP (object))
@@ -445,7 +454,8 @@ DEFUN ("char-or-string-p", Fchar_or_string_p, Schar_or_string_p, 1, 1, 0,
445} 454}
446 455
447DEFUN ("integerp", Fintegerp, Sintegerp, 1, 1, 0, 456DEFUN ("integerp", Fintegerp, Sintegerp, 1, 1, 0,
448 doc: /* Return t if OBJECT is an integer. */) 457 doc: /* Return t if OBJECT is an integer. */
458 attributes: const)
449 (Lisp_Object object) 459 (Lisp_Object object)
450{ 460{
451 if (INTEGERP (object)) 461 if (INTEGERP (object))
@@ -463,7 +473,8 @@ DEFUN ("integer-or-marker-p", Finteger_or_marker_p, Sinteger_or_marker_p, 1, 1,
463} 473}
464 474
465DEFUN ("natnump", Fnatnump, Snatnump, 1, 1, 0, 475DEFUN ("natnump", Fnatnump, Snatnump, 1, 1, 0,
466 doc: /* Return t if OBJECT is a nonnegative integer. */) 476 doc: /* Return t if OBJECT is a nonnegative integer. */
477 attributes: const)
467 (Lisp_Object object) 478 (Lisp_Object object)
468{ 479{
469 if (NATNUMP (object)) 480 if (NATNUMP (object))
@@ -472,7 +483,8 @@ DEFUN ("natnump", Fnatnump, Snatnump, 1, 1, 0,
472} 483}
473 484
474DEFUN ("numberp", Fnumberp, Snumberp, 1, 1, 0, 485DEFUN ("numberp", Fnumberp, Snumberp, 1, 1, 0,
475 doc: /* Return t if OBJECT is a number (floating point or integer). */) 486 doc: /* Return t if OBJECT is a number (floating point or integer). */
487 attributes: const)
476 (Lisp_Object object) 488 (Lisp_Object object)
477{ 489{
478 if (NUMBERP (object)) 490 if (NUMBERP (object))
@@ -492,7 +504,8 @@ DEFUN ("number-or-marker-p", Fnumber_or_marker_p,
492} 504}
493 505
494DEFUN ("floatp", Ffloatp, Sfloatp, 1, 1, 0, 506DEFUN ("floatp", Ffloatp, Sfloatp, 1, 1, 0,
495 doc: /* Return t if OBJECT is a floating point number. */) 507 doc: /* Return t if OBJECT is a floating point number. */
508 attributes: const)
496 (Lisp_Object object) 509 (Lisp_Object object)
497{ 510{
498 if (FLOATP (object)) 511 if (FLOATP (object))
@@ -2954,7 +2967,8 @@ DEFUN ("lognot", Flognot, Slognot, 1, 1, 0,
2954DEFUN ("byteorder", Fbyteorder, Sbyteorder, 0, 0, 0, 2967DEFUN ("byteorder", Fbyteorder, Sbyteorder, 0, 0, 0,
2955 doc: /* Return the byteorder for the machine. 2968 doc: /* Return the byteorder for the machine.
2956Returns 66 (ASCII uppercase B) for big endian machines or 108 (ASCII 2969Returns 66 (ASCII uppercase B) for big endian machines or 108 (ASCII
2957lowercase l) for small endian machines. */) 2970lowercase l) for small endian machines. */
2971 attributes: const)
2958 (void) 2972 (void)
2959{ 2973{
2960 unsigned i = 0x04030201; 2974 unsigned i = 0x04030201;
diff --git a/src/decompress.c b/src/decompress.c
index b14f0a2cd79..b78dacee207 100644
--- a/src/decompress.c
+++ b/src/decompress.c
@@ -88,7 +88,8 @@ unwind_decompress (void *ddata)
88} 88}
89 89
90DEFUN ("zlib-available-p", Fzlib_available_p, Szlib_available_p, 0, 0, 0, 90DEFUN ("zlib-available-p", Fzlib_available_p, Szlib_available_p, 0, 0, 0,
91 doc: /* Return t if zlib decompression is available in this instance of Emacs. */) 91 doc: /* Return t if zlib decompression is available in this instance of Emacs. */
92 attributes: const)
92 (void) 93 (void)
93{ 94{
94#ifdef WINDOWSNT 95#ifdef WINDOWSNT
diff --git a/src/emacs.c b/src/emacs.c
index d09c3c36c8a..ca1a8b26d81 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -1892,7 +1892,8 @@ or SIGHUP, and upon SIGINT in batch mode.
1892 1892
1893The value of `kill-emacs-hook', if not void, 1893The value of `kill-emacs-hook', if not void,
1894is a list of functions (of no args), 1894is a list of functions (of no args),
1895all of which are called before Emacs is actually killed. */) 1895all of which are called before Emacs is actually killed. */
1896 attributes: noreturn)
1896 (Lisp_Object arg) 1897 (Lisp_Object arg)
1897{ 1898{
1898 struct gcpro gcpro1; 1899 struct gcpro gcpro1;
diff --git a/src/eval.c b/src/eval.c
index 7e4b016b236..5cadb1bc2de 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -1162,7 +1162,8 @@ unwind_to_catch (struct handler *catch, Lisp_Object value)
1162 1162
1163DEFUN ("throw", Fthrow, Sthrow, 2, 2, 0, 1163DEFUN ("throw", Fthrow, Sthrow, 2, 2, 0,
1164 doc: /* Throw to the catch for TAG and return VALUE from it. 1164 doc: /* Throw to the catch for TAG and return VALUE from it.
1165Both TAG and VALUE are evalled. */) 1165Both TAG and VALUE are evalled. */
1166 attributes: noreturn)
1166 (register Lisp_Object tag, Lisp_Object value) 1167 (register Lisp_Object tag, Lisp_Object value)
1167{ 1168{
1168 struct handler *c; 1169 struct handler *c;
diff --git a/src/fns.c b/src/fns.c
index 7739663b775..91cd5132546 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -46,7 +46,8 @@ static void sort_vector_copy (Lisp_Object, ptrdiff_t,
46static bool internal_equal (Lisp_Object, Lisp_Object, int, bool, Lisp_Object); 46static bool internal_equal (Lisp_Object, Lisp_Object, int, bool, Lisp_Object);
47 47
48DEFUN ("identity", Fidentity, Sidentity, 1, 1, 0, 48DEFUN ("identity", Fidentity, Sidentity, 1, 1, 0,
49 doc: /* Return the argument unchanged. */) 49 doc: /* Return the argument unchanged. */
50 attributes: const)
50 (Lisp_Object arg) 51 (Lisp_Object arg)
51{ 52{
52 return arg; 53 return arg;
diff --git a/src/frame.c b/src/frame.c
index 0eb51bd786c..f138db9cecc 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -270,7 +270,8 @@ predicates which report frame's specific UI-related capabilities. */)
270/* Placeholder used by temacs -nw before window.el is loaded. */ 270/* Placeholder used by temacs -nw before window.el is loaded. */
271DEFUN ("frame-windows-min-size", Fframe_windows_min_size, 271DEFUN ("frame-windows-min-size", Fframe_windows_min_size,
272 Sframe_windows_min_size, 4, 4, 0, 272 Sframe_windows_min_size, 4, 4, 0,
273 doc: /* */) 273 doc: /* */
274 attributes: const)
274 (Lisp_Object frame, Lisp_Object horizontal, 275 (Lisp_Object frame, Lisp_Object horizontal,
275 Lisp_Object ignore, Lisp_Object pixelwise) 276 Lisp_Object ignore, Lisp_Object pixelwise)
276{ 277{
diff --git a/src/gnutls.c b/src/gnutls.c
index 75fe6149a55..5e6c6353b45 100644
--- a/src/gnutls.c
+++ b/src/gnutls.c
@@ -695,7 +695,8 @@ See also `gnutls-boot'. */)
695DEFUN ("gnutls-errorp", Fgnutls_errorp, Sgnutls_errorp, 1, 1, 0, 695DEFUN ("gnutls-errorp", Fgnutls_errorp, Sgnutls_errorp, 1, 1, 0,
696 doc: /* Return t if ERROR indicates a GnuTLS problem. 696 doc: /* Return t if ERROR indicates a GnuTLS problem.
697ERROR is an integer or a symbol with an integer `gnutls-code' property. 697ERROR is an integer or a symbol with an integer `gnutls-code' property.
698usage: (gnutls-errorp ERROR) */) 698usage: (gnutls-errorp ERROR) */
699 attributes: const)
699 (Lisp_Object err) 700 (Lisp_Object err)
700{ 701{
701 if (EQ (err, Qt)) return Qnil; 702 if (EQ (err, Qt)) return Qnil;
@@ -1603,7 +1604,8 @@ This function may also return `gnutls-e-again', or
1603#endif /* HAVE_GNUTLS */ 1604#endif /* HAVE_GNUTLS */
1604 1605
1605DEFUN ("gnutls-available-p", Fgnutls_available_p, Sgnutls_available_p, 0, 0, 0, 1606DEFUN ("gnutls-available-p", Fgnutls_available_p, Sgnutls_available_p, 0, 0, 0,
1606 doc: /* Return t if GnuTLS is available in this instance of Emacs. */) 1607 doc: /* Return t if GnuTLS is available in this instance of Emacs. */
1608 attributes: const)
1607 (void) 1609 (void)
1608{ 1610{
1609#ifdef HAVE_GNUTLS 1611#ifdef HAVE_GNUTLS
diff --git a/src/keyboard.c b/src/keyboard.c
index 9d6eb07a181..0fe2ffc53f3 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -1163,7 +1163,8 @@ top_level_1 (Lisp_Object ignore)
1163 1163
1164DEFUN ("top-level", Ftop_level, Stop_level, 0, 0, "", 1164DEFUN ("top-level", Ftop_level, Stop_level, 0, 0, "",
1165 doc: /* Exit all recursive editing levels. 1165 doc: /* Exit all recursive editing levels.
1166This also exits all active minibuffers. */) 1166This also exits all active minibuffers. */
1167 attributes: noreturn)
1167 (void) 1168 (void)
1168{ 1169{
1169#ifdef HAVE_WINDOW_SYSTEM 1170#ifdef HAVE_WINDOW_SYSTEM
@@ -1186,7 +1187,8 @@ user_error (const char *msg)
1186 1187
1187/* _Noreturn will be added to prototype by make-docfile. */ 1188/* _Noreturn will be added to prototype by make-docfile. */
1188DEFUN ("exit-recursive-edit", Fexit_recursive_edit, Sexit_recursive_edit, 0, 0, "", 1189DEFUN ("exit-recursive-edit", Fexit_recursive_edit, Sexit_recursive_edit, 0, 0, "",
1189 doc: /* Exit from the innermost recursive edit or minibuffer. */) 1190 doc: /* Exit from the innermost recursive edit or minibuffer. */
1191 attributes: noreturn)
1190 (void) 1192 (void)
1191{ 1193{
1192 if (command_loop_level > 0 || minibuf_level > 0) 1194 if (command_loop_level > 0 || minibuf_level > 0)
@@ -1197,7 +1199,8 @@ DEFUN ("exit-recursive-edit", Fexit_recursive_edit, Sexit_recursive_edit, 0, 0,
1197 1199
1198/* _Noreturn will be added to prototype by make-docfile. */ 1200/* _Noreturn will be added to prototype by make-docfile. */
1199DEFUN ("abort-recursive-edit", Fabort_recursive_edit, Sabort_recursive_edit, 0, 0, "", 1201DEFUN ("abort-recursive-edit", Fabort_recursive_edit, Sabort_recursive_edit, 0, 0, "",
1200 doc: /* Abort the command that requested this recursive edit or minibuffer input. */) 1202 doc: /* Abort the command that requested this recursive edit or minibuffer input. */
1203 attributes: noreturn)
1201 (void) 1204 (void)
1202{ 1205{
1203 if (command_loop_level > 0 || minibuf_level > 0) 1206 if (command_loop_level > 0 || minibuf_level > 0)
diff --git a/src/window.c b/src/window.c
index 5ae95f27d64..e5ddef5fa40 100644
--- a/src/window.c
+++ b/src/window.c
@@ -3000,7 +3000,8 @@ resize_root_window (Lisp_Object window, Lisp_Object delta, Lisp_Object horizonta
3000/* Placeholder used by temacs -nw before window.el is loaded. */ 3000/* Placeholder used by temacs -nw before window.el is loaded. */
3001DEFUN ("window--sanitize-window-sizes", Fwindow__sanitize_window_sizes, 3001DEFUN ("window--sanitize-window-sizes", Fwindow__sanitize_window_sizes,
3002 Swindow__sanitize_window_sizes, 2, 2, 0, 3002 Swindow__sanitize_window_sizes, 2, 2, 0,
3003 doc: /* */) 3003 doc: /* */
3004 attributes: const)
3004 (Lisp_Object frame, Lisp_Object horizontal) 3005 (Lisp_Object frame, Lisp_Object horizontal)
3005{ 3006{
3006 return Qnil; 3007 return Qnil;
diff --git a/src/xdisp.c b/src/xdisp.c
index f006f8e0b94..041a022a370 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -12276,7 +12276,8 @@ DEFUN ("tool-bar-height", Ftool_bar_height, Stool_bar_height,
12276 0, 2, 0, 12276 0, 2, 0,
12277 doc: /* Return the number of lines occupied by the tool bar of FRAME. 12277 doc: /* Return the number of lines occupied by the tool bar of FRAME.
12278If FRAME is nil or omitted, use the selected frame. Optional argument 12278If FRAME is nil or omitted, use the selected frame. Optional argument
12279PIXELWISE non-nil means return the height of the tool bar in pixels. */) 12279PIXELWISE non-nil means return the height of the tool bar in pixels. */
12280 attributes: const)
12280 (Lisp_Object frame, Lisp_Object pixelwise) 12281 (Lisp_Object frame, Lisp_Object pixelwise)
12281{ 12282{
12282 int height = 0; 12283 int height = 0;
diff --git a/src/xfaces.c b/src/xfaces.c
index 6ecd857d685..85af770c6a2 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -3546,7 +3546,8 @@ with the value VALUE is relative.
3546A relative value is one that doesn't entirely override whatever is 3546A relative value is one that doesn't entirely override whatever is
3547inherited from another face. For most possible attributes, 3547inherited from another face. For most possible attributes,
3548the only relative value that users see is `unspecified'. 3548the only relative value that users see is `unspecified'.
3549However, for :height, floating point values are also relative. */) 3549However, for :height, floating point values are also relative. */
3550 attributes: const)
3550 (Lisp_Object attribute, Lisp_Object value) 3551 (Lisp_Object attribute, Lisp_Object value)
3551{ 3552{
3552 if (EQ (value, Qunspecified) || (EQ (value, QCignore_defface))) 3553 if (EQ (value, Qunspecified) || (EQ (value, QCignore_defface)))