]> gcc.gnu.org Git - gcc.git/blob - gcc/c-common.c
(check_format_info): Support X/Open formats like "%1$d".
[gcc.git] / gcc / c-common.c
1 /* Subroutines shared by all languages that are variants of C.
2 Copyright (C) 1992, 1993 Free Software Foundation, Inc.
3
4 This file is part of GNU CC.
5
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING. If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20 #include "config.h"
21 #include "tree.h"
22 #include "c-lex.h"
23 #include "c-tree.h"
24 #include "flags.h"
25 #include "obstack.h"
26 #include <stdio.h>
27 #include <ctype.h>
28
29 extern struct obstack permanent_obstack;
30
31 static void declare_hidden_char_array PROTO((char *, char *));
32
33 /* Make bindings for __FUNCTION__ and __PRETTY_FUNCTION__. */
34
35 void
36 declare_function_name ()
37 {
38 char *name, *printable_name;
39
40 if (current_function_decl == NULL)
41 {
42 name = "";
43 printable_name = "top level";
44 }
45 else
46 {
47 char *kind = "function";
48 if (TREE_CODE (TREE_TYPE (current_function_decl)) == METHOD_TYPE)
49 kind = "method";
50 /* Allow functions to be nameless (such as artificial ones). */
51 if (DECL_NAME (current_function_decl))
52 name = IDENTIFIER_POINTER (DECL_NAME (current_function_decl));
53 else
54 name = "";
55 printable_name = (*decl_printable_name) (current_function_decl, &kind);
56 }
57
58 declare_hidden_char_array ("__FUNCTION__", name);
59 declare_hidden_char_array ("__PRETTY_FUNCTION__", printable_name);
60 }
61
62 static void
63 declare_hidden_char_array (name, value)
64 char *name, *value;
65 {
66 tree decl, type, init;
67 int vlen;
68
69 /* If the default size of char arrays isn't big enough for the name,
70 make a bigger one. */
71 vlen = strlen (value) + 1;
72 type = char_array_type_node;
73 if (TREE_INT_CST_LOW (TYPE_MAX_VALUE (TREE_TYPE (type))) < vlen)
74 type = build_array_type (char_type_node,
75 build_index_type (build_int_2 (vlen, 0)));
76
77 push_obstacks_nochange ();
78 decl = build_decl (VAR_DECL, get_identifier (name), type);
79 TREE_STATIC (decl) = 1;
80 TREE_READONLY (decl) = 1;
81 TREE_ASM_WRITTEN (decl) = 1;
82 DECL_SOURCE_LINE (decl) = 0;
83 DECL_IN_SYSTEM_HEADER (decl) = 1;
84 DECL_IGNORED_P (decl) = 1;
85 init = build_string (vlen, value);
86 TREE_TYPE (init) = type;
87 DECL_INITIAL (decl) = init;
88 finish_decl (pushdecl (decl), init, NULL_TREE);
89 }
90
91 /* Given a chain of STRING_CST nodes,
92 concatenate them into one STRING_CST
93 and give it a suitable array-of-chars data type. */
94
95 tree
96 combine_strings (strings)
97 tree strings;
98 {
99 register tree value, t;
100 register int length = 1;
101 int wide_length = 0;
102 int wide_flag = 0;
103 int wchar_bytes = TYPE_PRECISION (wchar_type_node) / BITS_PER_UNIT;
104 int nchars;
105
106 if (TREE_CHAIN (strings))
107 {
108 /* More than one in the chain, so concatenate. */
109 register char *p, *q;
110
111 /* Don't include the \0 at the end of each substring,
112 except for the last one.
113 Count wide strings and ordinary strings separately. */
114 for (t = strings; t; t = TREE_CHAIN (t))
115 {
116 if (TREE_TYPE (t) == wchar_array_type_node)
117 {
118 wide_length += (TREE_STRING_LENGTH (t) - wchar_bytes);
119 wide_flag = 1;
120 }
121 else
122 length += (TREE_STRING_LENGTH (t) - 1);
123 }
124
125 /* If anything is wide, the non-wides will be converted,
126 which makes them take more space. */
127 if (wide_flag)
128 length = length * wchar_bytes + wide_length;
129
130 p = savealloc (length);
131
132 /* Copy the individual strings into the new combined string.
133 If the combined string is wide, convert the chars to ints
134 for any individual strings that are not wide. */
135
136 q = p;
137 for (t = strings; t; t = TREE_CHAIN (t))
138 {
139 int len = (TREE_STRING_LENGTH (t)
140 - ((TREE_TYPE (t) == wchar_array_type_node)
141 ? wchar_bytes : 1));
142 if ((TREE_TYPE (t) == wchar_array_type_node) == wide_flag)
143 {
144 bcopy (TREE_STRING_POINTER (t), q, len);
145 q += len;
146 }
147 else
148 {
149 int i;
150 for (i = 0; i < len; i++)
151 ((int *) q)[i] = TREE_STRING_POINTER (t)[i];
152 q += len * wchar_bytes;
153 }
154 }
155 if (wide_flag)
156 {
157 int i;
158 for (i = 0; i < wchar_bytes; i++)
159 *q++ = 0;
160 }
161 else
162 *q = 0;
163
164 value = make_node (STRING_CST);
165 TREE_STRING_POINTER (value) = p;
166 TREE_STRING_LENGTH (value) = length;
167 TREE_CONSTANT (value) = 1;
168 }
169 else
170 {
171 value = strings;
172 length = TREE_STRING_LENGTH (value);
173 if (TREE_TYPE (value) == wchar_array_type_node)
174 wide_flag = 1;
175 }
176
177 /* Compute the number of elements, for the array type. */
178 nchars = wide_flag ? length / wchar_bytes : length;
179
180 /* Create the array type for the string constant.
181 -Wwrite-strings says make the string constant an array of const char
182 so that copying it to a non-const pointer will get a warning. */
183 if (warn_write_strings
184 && (! flag_traditional && ! flag_writable_strings))
185 {
186 tree elements
187 = build_type_variant (wide_flag ? wchar_type_node : char_type_node,
188 1, 0);
189 TREE_TYPE (value)
190 = build_array_type (elements,
191 build_index_type (build_int_2 (nchars - 1, 0)));
192 }
193 else
194 TREE_TYPE (value)
195 = build_array_type (wide_flag ? wchar_type_node : char_type_node,
196 build_index_type (build_int_2 (nchars - 1, 0)));
197 TREE_CONSTANT (value) = 1;
198 TREE_STATIC (value) = 1;
199 return value;
200 }
201 \f
202 /* Process the attributes listed in ATTRIBUTES
203 and install them in DECL. */
204
205 void
206 decl_attributes (decl, attributes)
207 tree decl, attributes;
208 {
209 tree a;
210 for (a = attributes; a; a = TREE_CHAIN (a))
211 if (TREE_VALUE (a) == get_identifier ("packed"))
212 {
213 if (TREE_CODE (decl) == FIELD_DECL)
214 DECL_PACKED (decl) = 1;
215 /* We can't set DECL_PACKED for a VAR_DECL, because the bit is
216 used for DECL_REGISTER. It wouldn't mean anything anyway. */
217 }
218 else if (TREE_VALUE (a) == get_identifier ("noreturn")
219 || TREE_VALUE (a) == get_identifier ("volatile"))
220 {
221 if (TREE_CODE (decl) == FUNCTION_DECL)
222 TREE_THIS_VOLATILE (decl) = 1;
223 }
224 else if (TREE_VALUE (a) == get_identifier ("const"))
225 {
226 if (TREE_CODE (decl) == FUNCTION_DECL)
227 TREE_READONLY (decl) = 1;
228 }
229 else if (TREE_VALUE (a) != 0
230 && TREE_CODE (TREE_VALUE (a)) == TREE_LIST
231 && TREE_PURPOSE (TREE_VALUE (a)) == get_identifier ("mode"))
232 {
233 int i;
234 char *specified_name
235 = IDENTIFIER_POINTER (TREE_VALUE (TREE_VALUE (a)));
236
237 /* Give this decl a type with the specified mode. */
238 for (i = 0; i < NUM_MACHINE_MODES; i++)
239 if (!strcmp (specified_name, GET_MODE_NAME (i)))
240 {
241 tree type
242 = type_for_mode (i, TREE_UNSIGNED (TREE_TYPE (decl)));
243 if (type != 0)
244 {
245 TREE_TYPE (decl) = type;
246 DECL_SIZE (decl) = 0;
247 layout_decl (decl, 0);
248 }
249 else
250 error ("no data type for mode `%s'", specified_name);
251 break;
252 }
253 if (i == NUM_MACHINE_MODES)
254 error ("unknown machine mode `%s'", specified_name);
255 }
256 else if (TREE_VALUE (a) != 0
257 && TREE_CODE (TREE_VALUE (a)) == TREE_LIST
258 && TREE_PURPOSE (TREE_VALUE (a)) == get_identifier ("aligned"))
259 {
260 int align = TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (a)))
261 * BITS_PER_UNIT;
262
263 if (exact_log2 (align) == -1)
264 error_with_decl (decl,
265 "requested alignment of `%s' is not a power of 2");
266 else if (TREE_CODE (decl) != VAR_DECL
267 && TREE_CODE (decl) != FIELD_DECL)
268 error_with_decl (decl,
269 "alignment specified for `%s'");
270 else
271 DECL_ALIGN (decl) = align;
272 }
273 else if (TREE_VALUE (a) != 0
274 && TREE_CODE (TREE_VALUE (a)) == TREE_LIST
275 && TREE_PURPOSE (TREE_VALUE (a)) == get_identifier ("format"))
276 {
277 tree list = TREE_VALUE (TREE_VALUE (a));
278 tree format_type = TREE_PURPOSE (list);
279 int format_num = TREE_INT_CST_LOW (TREE_PURPOSE (TREE_VALUE (list)));
280 int first_arg_num = TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (list)));
281 int is_scan;
282 tree argument;
283 int arg_num;
284
285 if (TREE_CODE (decl) != FUNCTION_DECL)
286 {
287 error_with_decl (decl,
288 "argument format specified for non-function `%s'");
289 return;
290 }
291
292 if (format_type == get_identifier ("printf"))
293 is_scan = 0;
294 else if (format_type == get_identifier ("scanf"))
295 is_scan = 1;
296 else
297 {
298 error_with_decl (decl, "unrecognized format specifier for `%s'");
299 return;
300 }
301
302 if (first_arg_num != 0 && first_arg_num <= format_num)
303 {
304 error_with_decl (decl,
305 "format string arg follows the args to be formatted, for `%s'");
306 return;
307 }
308
309 /* Verify that the format_num argument is actually a string, in case
310 the format attribute is in error. */
311 argument = TYPE_ARG_TYPES (TREE_TYPE (decl));
312 for (arg_num = 1; ; ++arg_num)
313 {
314 if (argument == 0 || arg_num == format_num)
315 break;
316 argument = TREE_CHAIN (argument);
317 }
318 if (! argument
319 || TREE_CODE (TREE_VALUE (argument)) != POINTER_TYPE
320 || (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_VALUE (argument)))
321 != char_type_node))
322 {
323 error_with_decl (decl,
324 "format string arg not a string type, for `%s'");
325 return;
326 }
327 if (first_arg_num != 0)
328 {
329 /* Verify that first_arg_num points to the last arg, the ... */
330 while (argument)
331 arg_num++, argument = TREE_CHAIN (argument);
332 if (arg_num != first_arg_num)
333 {
334 error_with_decl (decl,
335 "args to be formatted is not ..., for `%s'");
336 return;
337 }
338 }
339
340 record_function_format (DECL_NAME (decl), DECL_ASSEMBLER_NAME (decl),
341 is_scan, format_num, first_arg_num);
342 }
343 }
344 \f
345 /* Check a printf/fprintf/sprintf/scanf/fscanf/sscanf format against
346 a parameter list. */
347
348 #define T_I &integer_type_node
349 #define T_L &long_integer_type_node
350 #define T_S &short_integer_type_node
351 #define T_UI &unsigned_type_node
352 #define T_UL &long_unsigned_type_node
353 #define T_US &short_unsigned_type_node
354 #define T_F &float_type_node
355 #define T_D &double_type_node
356 #define T_LD &long_double_type_node
357 #define T_C &char_type_node
358 #define T_V &void_type_node
359 #define T_W &wchar_type_node
360
361 typedef struct {
362 char *format_chars;
363 int pointer_count;
364 /* Type of argument if no length modifier is used. */
365 tree *nolen;
366 /* Type of argument if length modifier for shortening is used.
367 If NULL, then this modifier is not allowed. */
368 tree *hlen;
369 /* Type of argument if length modifier `l' is used.
370 If NULL, then this modifier is not allowed. */
371 tree *llen;
372 /* Type of argument if length modifier `L' is used.
373 If NULL, then this modifier is not allowed. */
374 tree *bigllen;
375 /* List of other modifier characters allowed with these options. */
376 char *flag_chars;
377 } format_char_info;
378
379 static format_char_info print_char_table[] = {
380 { "di", 0, T_I, T_I, T_L, NULL, "-wp0 +" },
381 { "oxX", 0, T_UI, T_UI, T_UL, NULL, "-wp0#" },
382 { "u", 0, T_UI, T_UI, T_UL, NULL, "-wp0" },
383 { "feEgG", 0, T_D, NULL, NULL, T_LD, "-wp0 +#" },
384 { "c", 0, T_I, NULL, T_W, NULL, "-w" },
385 { "C", 0, T_W, NULL, NULL, NULL, "-w" },
386 { "s", 1, T_C, NULL, T_W, NULL, "-wp" },
387 { "S", 1, T_W, NULL, NULL, NULL, "-wp" },
388 { "p", 1, T_V, NULL, NULL, NULL, "-w" },
389 { "n", 1, T_I, T_S, T_L, NULL, "" },
390 { NULL }
391 };
392
393 static format_char_info scan_char_table[] = {
394 { "di", 1, T_I, T_S, T_L, NULL, "*" },
395 { "ouxX", 1, T_UI, T_US, T_UL, NULL, "*" },
396 { "efgEG", 1, T_F, NULL, T_D, T_LD, "*" },
397 { "sc", 1, T_C, NULL, T_W, NULL, "*" },
398 { "[", 1, T_C, NULL, NULL, NULL, "*" },
399 { "C", 1, T_W, NULL, NULL, NULL, "*" },
400 { "S", 1, T_W, NULL, NULL, NULL, "*" },
401 { "p", 2, T_V, NULL, NULL, NULL, "*" },
402 { "n", 1, T_I, T_S, T_L, NULL, "" },
403 { NULL }
404 };
405
406 typedef struct function_format_info {
407 struct function_format_info *next; /* next structure on the list */
408 tree name; /* identifier such as "printf" */
409 tree assembler_name; /* optional mangled identifier (for C++) */
410 int is_scan; /* TRUE if *scanf */
411 int format_num; /* number of format argument */
412 int first_arg_num; /* number of first arg (zero for varargs) */
413 } function_format_info;
414
415 static function_format_info *function_format_list = NULL;
416
417 static void check_format_info PROTO((function_format_info *, tree));
418
419 /* Initialize the table of functions to perform format checking on.
420 The ANSI functions are always checked (whether <stdio.h> is
421 included or not), since it is common to call printf without
422 including <stdio.h>. There shouldn't be a problem with this,
423 since ANSI reserves these function names whether you include the
424 header file or not. In any case, the checking is harmless. */
425
426 void
427 init_function_format_info ()
428 {
429 record_function_format (get_identifier ("printf"), NULL_TREE, 0, 1, 2);
430 record_function_format (get_identifier ("fprintf"), NULL_TREE, 0, 2, 3);
431 record_function_format (get_identifier ("sprintf"), NULL_TREE, 0, 2, 3);
432 record_function_format (get_identifier ("scanf"), NULL_TREE, 1, 1, 2);
433 record_function_format (get_identifier ("fscanf"), NULL_TREE, 1, 2, 3);
434 record_function_format (get_identifier ("sscanf"), NULL_TREE, 1, 2, 3);
435 record_function_format (get_identifier ("vprintf"), NULL_TREE, 0, 1, 0);
436 record_function_format (get_identifier ("vfprintf"), NULL_TREE, 0, 2, 0);
437 record_function_format (get_identifier ("vsprintf"), NULL_TREE, 0, 2, 0);
438 }
439
440 /* Record information for argument format checking. FUNCTION_IDENT is
441 the identifier node for the name of the function to check (its decl
442 need not exist yet). IS_SCAN is true for scanf-type format checking;
443 false indicates printf-style format checking. FORMAT_NUM is the number
444 of the argument which is the format control string (starting from 1).
445 FIRST_ARG_NUM is the number of the first actual argument to check
446 against teh format string, or zero if no checking is not be done
447 (e.g. for varargs such as vfprintf). */
448
449 void
450 record_function_format (name, assembler_name, is_scan,
451 format_num, first_arg_num)
452 tree name;
453 tree assembler_name;
454 int is_scan;
455 int format_num;
456 int first_arg_num;
457 {
458 function_format_info *info;
459
460 /* Re-use existing structure if it's there. */
461
462 for (info = function_format_list; info; info = info->next)
463 {
464 if (info->name == name && info->assembler_name == assembler_name)
465 break;
466 }
467 if (! info)
468 {
469 info = (function_format_info *) xmalloc (sizeof (function_format_info));
470 info->next = function_format_list;
471 function_format_list = info;
472
473 info->name = name;
474 info->assembler_name = assembler_name;
475 }
476
477 info->is_scan = is_scan;
478 info->format_num = format_num;
479 info->first_arg_num = first_arg_num;
480 }
481
482 static char tfaff[] = "too few arguments for format";
483 \f
484 /* Check the argument list of a call to printf, scanf, etc.
485 NAME is the function identifier.
486 ASSEMBLER_NAME is the function's assembler identifier.
487 (Either NAME or ASSEMBLER_NAME, but not both, may be NULL_TREE.)
488 PARAMS is the list of argument values. */
489
490 void
491 check_function_format (name, assembler_name, params)
492 tree name;
493 tree assembler_name;
494 tree params;
495 {
496 function_format_info *info;
497
498 /* See if this function is a format function. */
499 for (info = function_format_list; info; info = info->next)
500 {
501 if (info->assembler_name
502 ? (info->assembler_name == assembler_name)
503 : (info->name == name))
504 {
505 /* Yup; check it. */
506 check_format_info (info, params);
507 break;
508 }
509 }
510 }
511
512 /* Check the argument list of a call to printf, scanf, etc.
513 INFO points to the function_format_info structure.
514 PARAMS is the list of argument values. */
515
516 static void
517 check_format_info (info, params)
518 function_format_info *info;
519 tree params;
520 {
521 int i;
522 int arg_num;
523 int suppressed, wide, precise;
524 int length_char;
525 int format_char;
526 int format_length;
527 tree format_tree;
528 tree cur_param;
529 tree cur_type;
530 tree wanted_type;
531 tree first_fillin_param;
532 char *format_chars;
533 format_char_info *fci;
534 static char message[132];
535 char flag_chars[8];
536 int has_operand_number = 0;
537
538 /* Skip to format argument. If the argument isn't available, there's
539 no work for us to do; prototype checking will catch the problem. */
540 for (arg_num = 1; ; ++arg_num)
541 {
542 if (params == 0)
543 return;
544 if (arg_num == info->format_num)
545 break;
546 params = TREE_CHAIN (params);
547 }
548 format_tree = TREE_VALUE (params);
549 params = TREE_CHAIN (params);
550 if (format_tree == 0)
551 return;
552 /* We can only check the format if it's a string constant. */
553 while (TREE_CODE (format_tree) == NOP_EXPR)
554 format_tree = TREE_OPERAND (format_tree, 0); /* strip coercion */
555 if (format_tree == null_pointer_node)
556 {
557 warning ("null format string");
558 return;
559 }
560 if (TREE_CODE (format_tree) != ADDR_EXPR)
561 return;
562 format_tree = TREE_OPERAND (format_tree, 0);
563 if (TREE_CODE (format_tree) != STRING_CST)
564 return;
565 format_chars = TREE_STRING_POINTER (format_tree);
566 format_length = TREE_STRING_LENGTH (format_tree);
567 if (format_length <= 1)
568 warning ("zero-length format string");
569 if (format_chars[--format_length] != 0)
570 {
571 warning ("unterminated format string");
572 return;
573 }
574 /* Skip to first argument to check. */
575 while (arg_num + 1 < info->first_arg_num)
576 {
577 if (params == 0)
578 return;
579 params = TREE_CHAIN (params);
580 ++arg_num;
581 }
582
583 first_fillin_param = params;
584 while (1)
585 {
586 if (*format_chars == 0)
587 {
588 if (format_chars - TREE_STRING_POINTER (format_tree) != format_length)
589 warning ("embedded `\\0' in format");
590 if (info->first_arg_num != 0 && params != 0 && ! has_operand_number)
591 warning ("too many arguments for format");
592 return;
593 }
594 if (*format_chars++ != '%')
595 continue;
596 if (*format_chars == 0)
597 {
598 warning ("spurious trailing `%%' in format");
599 continue;
600 }
601 if (*format_chars == '%')
602 {
603 ++format_chars;
604 continue;
605 }
606 flag_chars[0] = 0;
607 suppressed = wide = precise = FALSE;
608 if (info->is_scan)
609 {
610 suppressed = *format_chars == '*';
611 if (suppressed)
612 ++format_chars;
613 while (isdigit (*format_chars))
614 ++format_chars;
615 }
616 else
617 {
618 /* See if we have a number followed by a dollar sign. If we do,
619 it is an operand number, so set PARAMS to that operand. */
620 if (*format_chars >= '0' && *format_chars <= '9')
621 {
622 char *p = format_chars;
623
624 while (*p >= '0' && *p++ <= '9')
625 ;
626
627 if (*p == '$')
628 {
629 int opnum = atoi (format_chars);
630
631 params = first_fillin_param;
632 format_chars = p + 1;
633 has_operand_number = 1;
634
635 for (i = 1; i < opnum && params != 0; i++)
636 params = TREE_CHAIN (params);
637
638 if (opnum == 0 || params == 0)
639 {
640 warning ("operand number out of range in format");
641 return;
642 }
643 }
644 }
645
646 while (*format_chars != 0 && index (" +#0-", *format_chars) != 0)
647 {
648 if (index (flag_chars, *format_chars) != 0)
649 {
650 sprintf (message, "repeated `%c' flag in format",
651 *format_chars);
652 warning (message);
653 }
654 i = strlen (flag_chars);
655 flag_chars[i++] = *format_chars++;
656 flag_chars[i] = 0;
657 }
658 /* "If the space and + flags both appear,
659 the space flag will be ignored." */
660 if (index (flag_chars, ' ') != 0
661 && index (flag_chars, '+') != 0)
662 warning ("use of both ` ' and `+' flags in format");
663 /* "If the 0 and - flags both appear,
664 the 0 flag will be ignored." */
665 if (index (flag_chars, '0') != 0
666 && index (flag_chars, '-') != 0)
667 warning ("use of both `0' and `-' flags in format");
668 if (*format_chars == '*')
669 {
670 wide = TRUE;
671 /* "...a field width...may be indicated by an asterisk.
672 In this case, an int argument supplies the field width..." */
673 ++format_chars;
674 if (params == 0)
675 {
676 warning (tfaff);
677 return;
678 }
679 if (info->first_arg_num != 0)
680 {
681 cur_param = TREE_VALUE (params);
682 params = TREE_CHAIN (params);
683 ++arg_num;
684 /* size_t is generally not valid here.
685 It will work on most machines, because size_t and int
686 have the same mode. But might as well warn anyway,
687 since it will fail on other machines. */
688 if (TYPE_MAIN_VARIANT (TREE_TYPE (cur_param))
689 != integer_type_node)
690 {
691 sprintf (message,
692 "field width is not type int (arg %d)",
693 arg_num);
694 warning (message);
695 }
696 }
697 }
698 else
699 {
700 while (isdigit (*format_chars))
701 {
702 wide = TRUE;
703 ++format_chars;
704 }
705 }
706 if (*format_chars == '.')
707 {
708 precise = TRUE;
709 ++format_chars;
710 if (*format_chars != '*' && !isdigit (*format_chars))
711 warning ("`.' not followed by `*' or digit in format");
712 /* "...a...precision...may be indicated by an asterisk.
713 In this case, an int argument supplies the...precision." */
714 if (*format_chars == '*')
715 {
716 if (info->first_arg_num != 0)
717 {
718 ++format_chars;
719 if (params == 0)
720 {
721 warning (tfaff);
722 return;
723 }
724 cur_param = TREE_VALUE (params);
725 params = TREE_CHAIN (params);
726 ++arg_num;
727 if (TYPE_MAIN_VARIANT (TREE_TYPE (cur_param))
728 != integer_type_node)
729 {
730 sprintf (message,
731 "field width is not type int (arg %d)",
732 arg_num);
733 warning (message);
734 }
735 }
736 }
737 else
738 {
739 while (isdigit (*format_chars))
740 ++format_chars;
741 }
742 }
743 }
744 if (*format_chars == 'h' || *format_chars == 'l' || *format_chars == 'L')
745 length_char = *format_chars++;
746 else
747 length_char = 0;
748 if (suppressed && length_char != 0)
749 {
750 sprintf (message,
751 "use of `*' and `%c' together in format",
752 length_char);
753 warning (message);
754 }
755 format_char = *format_chars;
756 if (format_char == 0)
757 {
758 warning ("conversion lacks type at end of format");
759 continue;
760 }
761 format_chars++;
762 fci = info->is_scan ? scan_char_table : print_char_table;
763 while (fci->format_chars != 0
764 && index (fci->format_chars, format_char) == 0)
765 ++fci;
766 if (fci->format_chars == 0)
767 {
768 if (format_char >= 040 && format_char < 0177)
769 sprintf (message,
770 "unknown conversion type character `%c' in format",
771 format_char);
772 else
773 sprintf (message,
774 "unknown conversion type character 0x%x in format",
775 format_char);
776 warning (message);
777 continue;
778 }
779 if (wide && index (fci->flag_chars, 'w') == 0)
780 {
781 sprintf (message, "width used with `%c' format",
782 format_char);
783 warning (message);
784 }
785 if (precise && index (fci->flag_chars, 'p') == 0)
786 {
787 sprintf (message, "precision used with `%c' format",
788 format_char);
789 warning (message);
790 }
791 if (info->is_scan && format_char == '[')
792 {
793 /* Skip over scan set, in case it happens to have '%' in it. */
794 if (*format_chars == '^')
795 ++format_chars;
796 /* Find closing bracket; if one is hit immediately, then
797 it's part of the scan set rather than a terminator. */
798 if (*format_chars == ']')
799 ++format_chars;
800 while (*format_chars && *format_chars != ']')
801 ++format_chars;
802 if (*format_chars != ']')
803 /* The end of the format string was reached. */
804 warning ("no closing `]' for `%%[' format");
805 }
806 if (suppressed)
807 {
808 if (index (fci->flag_chars, '*') == 0)
809 {
810 sprintf (message,
811 "suppression of `%c' conversion in format",
812 format_char);
813 warning (message);
814 }
815 continue;
816 }
817 for (i = 0; flag_chars[i] != 0; ++i)
818 {
819 if (index (fci->flag_chars, flag_chars[i]) == 0)
820 {
821 sprintf (message, "flag `%c' used with type `%c'",
822 flag_chars[i], format_char);
823 warning (message);
824 }
825 }
826 if (precise && index (flag_chars, '0') != 0
827 && (format_char == 'd' || format_char == 'i'
828 || format_char == 'o' || format_char == 'u'
829 || format_char == 'x' || format_char == 'x'))
830 {
831 sprintf (message,
832 "precision and `0' flag not both allowed with `%c' format",
833 format_char);
834 warning (message);
835 }
836 switch (length_char)
837 {
838 default: wanted_type = fci->nolen ? *(fci->nolen) : 0; break;
839 case 'h': wanted_type = fci->hlen ? *(fci->hlen) : 0; break;
840 case 'l': wanted_type = fci->llen ? *(fci->llen) : 0; break;
841 case 'L': wanted_type = fci->bigllen ? *(fci->bigllen) : 0; break;
842 }
843 if (wanted_type == 0)
844 {
845 sprintf (message,
846 "use of `%c' length character with `%c' type character",
847 length_char, format_char);
848 warning (message);
849 }
850
851 /*
852 ** XXX -- should kvetch about stuff such as
853 ** {
854 ** const int i;
855 **
856 ** scanf ("%d", &i);
857 ** }
858 */
859
860 /* Finally. . .check type of argument against desired type! */
861 if (info->first_arg_num == 0)
862 continue;
863 if (params == 0)
864 {
865 warning (tfaff);
866 return;
867 }
868 cur_param = TREE_VALUE (params);
869 params = TREE_CHAIN (params);
870 ++arg_num;
871 cur_type = TREE_TYPE (cur_param);
872
873 /* Check the types of any additional pointer arguments
874 that precede the "real" argument. */
875 for (i = 0; i < fci->pointer_count; ++i)
876 {
877 if (TREE_CODE (cur_type) == POINTER_TYPE)
878 {
879 cur_type = TREE_TYPE (cur_type);
880 continue;
881 }
882 sprintf (message,
883 "format argument is not a %s (arg %d)",
884 ((fci->pointer_count == 1) ? "pointer" : "pointer to a pointer"),
885 arg_num);
886 warning (message);
887 break;
888 }
889
890 /* Check the type of the "real" argument, if there's a type we want. */
891 if (i == fci->pointer_count && wanted_type != 0
892 && wanted_type != TYPE_MAIN_VARIANT (cur_type)
893 /* If we want `void *', allow any pointer type.
894 (Anything else would already have got a warning.) */
895 && ! (wanted_type == void_type_node
896 && fci->pointer_count > 0)
897 /* Don't warn about differences merely in signedness. */
898 && !(TREE_CODE (wanted_type) == INTEGER_TYPE
899 && TREE_CODE (cur_type) == INTEGER_TYPE
900 && (TREE_UNSIGNED (wanted_type)
901 ? wanted_type == unsigned_type (cur_type)
902 : wanted_type == signed_type (cur_type))))
903 {
904 register char *this;
905 register char *that;
906
907 this = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (wanted_type)));
908 that = 0;
909 if (TREE_CODE (cur_type) != ERROR_MARK
910 && TYPE_NAME (cur_type) != 0
911 && TREE_CODE (cur_type) != INTEGER_TYPE
912 && !(TREE_CODE (cur_type) == POINTER_TYPE
913 && TREE_CODE (TREE_TYPE (cur_type)) == INTEGER_TYPE))
914 {
915 if (TREE_CODE (TYPE_NAME (cur_type)) == TYPE_DECL
916 && DECL_NAME (TYPE_NAME (cur_type)) != 0)
917 that = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (cur_type)));
918 else
919 that = IDENTIFIER_POINTER (TYPE_NAME (cur_type));
920 }
921
922 /* A nameless type can't possibly match what the format wants.
923 So there will be a warning for it.
924 Make up a string to describe vaguely what it is. */
925 if (that == 0)
926 {
927 if (TREE_CODE (cur_type) == POINTER_TYPE)
928 that = "pointer";
929 else
930 that = "different type";
931 }
932
933 if (strcmp (this, that) != 0)
934 {
935 sprintf (message, "%s format, %s arg (arg %d)",
936 this, that, arg_num);
937 warning (message);
938 }
939 }
940 }
941 }
942 \f
943 /* Print a warning if a constant expression had overflow in folding.
944 Invoke this function on every expression that the language
945 requires to be a constant expression.
946 Note the ANSI C standard says it is erroneous for a
947 constant expression to overflow. */
948
949 void
950 constant_expression_warning (value)
951 tree value;
952 {
953 if (TREE_CODE (value) == INTEGER_CST && TREE_CONSTANT_OVERFLOW (value))
954 if (pedantic)
955 pedwarn ("overflow in constant expression");
956 }
957
958 /* Print a warning if an expression had overflow in folding.
959 Invoke this function on every expression that
960 (1) appears in the source code, and
961 (2) might be a constant expression that overflowed, and
962 (3) is not already checked by convert_and_check;
963 however, do not invoke this function on operands of explicit casts. */
964
965 void
966 overflow_warning (value)
967 tree value;
968 {
969 if (TREE_CODE (value) == INTEGER_CST && TREE_OVERFLOW (value))
970 {
971 TREE_OVERFLOW (value) = 0;
972 warning ("integer overflow in expression");
973 }
974 }
975
976 /* Print a warning if a large constant is truncated to unsigned,
977 or if -Wconversion is used and a constant < 0 is converted to unsigned.
978 Invoke this function on every expression that might be implicitly
979 converted to an unsigned type. */
980
981 void
982 unsigned_conversion_warning (result, operand)
983 tree result, operand;
984 {
985 if (TREE_CODE (operand) == INTEGER_CST
986 && TREE_CODE (TREE_TYPE (result)) == INTEGER_TYPE
987 && TREE_UNSIGNED (TREE_TYPE (result))
988 && !int_fits_type_p (operand, TREE_TYPE (result)))
989 {
990 if (!int_fits_type_p (operand, signed_type (TREE_TYPE (result))))
991 /* This detects cases like converting -129 or 256 to unsigned char. */
992 warning ("large integer implicitly truncated to unsigned type");
993 else if (warn_conversion)
994 warning ("negative integer implicitly converted to unsigned type");
995 }
996 }
997
998 /* Convert EXPR to TYPE, warning about conversion problems with constants.
999 Invoke this function on every expression that is converted implicitly,
1000 i.e. because of language rules and not because of an explicit cast. */
1001
1002 tree
1003 convert_and_check (type, expr)
1004 tree type, expr;
1005 {
1006 tree t = convert (type, expr);
1007 if (TREE_CODE (t) == INTEGER_CST)
1008 {
1009 if (TREE_OVERFLOW (t))
1010 {
1011 TREE_OVERFLOW (t) = 0;
1012
1013 /* No warning for converting 0x80000000 to int. */
1014 if (!(TREE_UNSIGNED (type) < TREE_UNSIGNED (TREE_TYPE (expr))
1015 && TREE_CODE (TREE_TYPE (expr)) == INTEGER_TYPE
1016 && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (expr))))
1017 warning ("overflow in implicit constant conversion");
1018 }
1019 else
1020 unsigned_conversion_warning (t, expr);
1021 }
1022 return t;
1023 }
1024 \f
1025 void
1026 c_expand_expr_stmt (expr)
1027 tree expr;
1028 {
1029 /* Do default conversion if safe and possibly important,
1030 in case within ({...}). */
1031 if ((TREE_CODE (TREE_TYPE (expr)) == ARRAY_TYPE && lvalue_p (expr))
1032 || TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE)
1033 expr = default_conversion (expr);
1034
1035 if (TREE_TYPE (expr) != error_mark_node
1036 && TYPE_SIZE (TREE_TYPE (expr)) == 0
1037 && TREE_CODE (TREE_TYPE (expr)) != ARRAY_TYPE)
1038 error ("expression statement has incomplete type");
1039
1040 expand_expr_stmt (expr);
1041 }
1042 \f
1043 /* Validate the expression after `case' and apply default promotions. */
1044
1045 tree
1046 check_case_value (value)
1047 tree value;
1048 {
1049 if (value == NULL_TREE)
1050 return value;
1051
1052 /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */
1053 STRIP_TYPE_NOPS (value);
1054
1055 if (TREE_CODE (value) != INTEGER_CST
1056 && value != error_mark_node)
1057 {
1058 error ("case label does not reduce to an integer constant");
1059 value = error_mark_node;
1060 }
1061 else
1062 /* Promote char or short to int. */
1063 value = default_conversion (value);
1064
1065 constant_expression_warning (value);
1066
1067 return value;
1068 }
1069 \f
1070 /* Return an integer type with BITS bits of precision,
1071 that is unsigned if UNSIGNEDP is nonzero, otherwise signed. */
1072
1073 tree
1074 type_for_size (bits, unsignedp)
1075 unsigned bits;
1076 int unsignedp;
1077 {
1078 if (bits == TYPE_PRECISION (signed_char_type_node))
1079 return unsignedp ? unsigned_char_type_node : signed_char_type_node;
1080
1081 if (bits == TYPE_PRECISION (short_integer_type_node))
1082 return unsignedp ? short_unsigned_type_node : short_integer_type_node;
1083
1084 if (bits == TYPE_PRECISION (integer_type_node))
1085 return unsignedp ? unsigned_type_node : integer_type_node;
1086
1087 if (bits == TYPE_PRECISION (long_integer_type_node))
1088 return unsignedp ? long_unsigned_type_node : long_integer_type_node;
1089
1090 if (bits == TYPE_PRECISION (long_long_integer_type_node))
1091 return (unsignedp ? long_long_unsigned_type_node
1092 : long_long_integer_type_node);
1093
1094 if (bits <= TYPE_PRECISION (intQI_type_node))
1095 return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
1096
1097 if (bits <= TYPE_PRECISION (intHI_type_node))
1098 return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
1099
1100 if (bits <= TYPE_PRECISION (intSI_type_node))
1101 return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
1102
1103 if (bits <= TYPE_PRECISION (intDI_type_node))
1104 return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
1105
1106 return 0;
1107 }
1108
1109 /* Return a data type that has machine mode MODE.
1110 If the mode is an integer,
1111 then UNSIGNEDP selects between signed and unsigned types. */
1112
1113 tree
1114 type_for_mode (mode, unsignedp)
1115 enum machine_mode mode;
1116 int unsignedp;
1117 {
1118 if (mode == TYPE_MODE (signed_char_type_node))
1119 return unsignedp ? unsigned_char_type_node : signed_char_type_node;
1120
1121 if (mode == TYPE_MODE (short_integer_type_node))
1122 return unsignedp ? short_unsigned_type_node : short_integer_type_node;
1123
1124 if (mode == TYPE_MODE (integer_type_node))
1125 return unsignedp ? unsigned_type_node : integer_type_node;
1126
1127 if (mode == TYPE_MODE (long_integer_type_node))
1128 return unsignedp ? long_unsigned_type_node : long_integer_type_node;
1129
1130 if (mode == TYPE_MODE (long_long_integer_type_node))
1131 return unsignedp ? long_long_unsigned_type_node : long_long_integer_type_node;
1132
1133 if (mode == TYPE_MODE (intQI_type_node))
1134 return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
1135
1136 if (mode == TYPE_MODE (intHI_type_node))
1137 return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
1138
1139 if (mode == TYPE_MODE (intSI_type_node))
1140 return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
1141
1142 if (mode == TYPE_MODE (intDI_type_node))
1143 return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
1144
1145 if (mode == TYPE_MODE (float_type_node))
1146 return float_type_node;
1147
1148 if (mode == TYPE_MODE (double_type_node))
1149 return double_type_node;
1150
1151 if (mode == TYPE_MODE (long_double_type_node))
1152 return long_double_type_node;
1153
1154 if (mode == TYPE_MODE (build_pointer_type (char_type_node)))
1155 return build_pointer_type (char_type_node);
1156
1157 if (mode == TYPE_MODE (build_pointer_type (integer_type_node)))
1158 return build_pointer_type (integer_type_node);
1159
1160 return 0;
1161 }
1162 \f
1163 /* Print an error message for invalid operands to arith operation CODE.
1164 NOP_EXPR is used as a special case (see truthvalue_conversion). */
1165
1166 void
1167 binary_op_error (code)
1168 enum tree_code code;
1169 {
1170 register char *opname;
1171 switch (code)
1172 {
1173 case NOP_EXPR:
1174 error ("invalid truth-value expression");
1175 return;
1176
1177 case PLUS_EXPR:
1178 opname = "+"; break;
1179 case MINUS_EXPR:
1180 opname = "-"; break;
1181 case MULT_EXPR:
1182 opname = "*"; break;
1183 case MAX_EXPR:
1184 opname = "max"; break;
1185 case MIN_EXPR:
1186 opname = "min"; break;
1187 case EQ_EXPR:
1188 opname = "=="; break;
1189 case NE_EXPR:
1190 opname = "!="; break;
1191 case LE_EXPR:
1192 opname = "<="; break;
1193 case GE_EXPR:
1194 opname = ">="; break;
1195 case LT_EXPR:
1196 opname = "<"; break;
1197 case GT_EXPR:
1198 opname = ">"; break;
1199 case LSHIFT_EXPR:
1200 opname = "<<"; break;
1201 case RSHIFT_EXPR:
1202 opname = ">>"; break;
1203 case TRUNC_MOD_EXPR:
1204 case FLOOR_MOD_EXPR:
1205 opname = "%"; break;
1206 case TRUNC_DIV_EXPR:
1207 case FLOOR_DIV_EXPR:
1208 opname = "/"; break;
1209 case BIT_AND_EXPR:
1210 opname = "&"; break;
1211 case BIT_IOR_EXPR:
1212 opname = "|"; break;
1213 case TRUTH_ANDIF_EXPR:
1214 opname = "&&"; break;
1215 case TRUTH_ORIF_EXPR:
1216 opname = "||"; break;
1217 case BIT_XOR_EXPR:
1218 opname = "^"; break;
1219 case LROTATE_EXPR:
1220 case RROTATE_EXPR:
1221 opname = "rotate"; break;
1222 }
1223 error ("invalid operands to binary %s", opname);
1224 }
1225 \f
1226 /* Subroutine of build_binary_op, used for comparison operations.
1227 See if the operands have both been converted from subword integer types
1228 and, if so, perhaps change them both back to their original type.
1229
1230 The arguments of this function are all pointers to local variables
1231 of build_binary_op: OP0_PTR is &OP0, OP1_PTR is &OP1,
1232 RESTYPE_PTR is &RESULT_TYPE and RESCODE_PTR is &RESULTCODE.
1233
1234 If this function returns nonzero, it means that the comparison has
1235 a constant value. What this function returns is an expression for
1236 that value. */
1237
1238 tree
1239 shorten_compare (op0_ptr, op1_ptr, restype_ptr, rescode_ptr)
1240 tree *op0_ptr, *op1_ptr;
1241 tree *restype_ptr;
1242 enum tree_code *rescode_ptr;
1243 {
1244 register tree type;
1245 tree op0 = *op0_ptr;
1246 tree op1 = *op1_ptr;
1247 int unsignedp0, unsignedp1;
1248 int real1, real2;
1249 tree primop0, primop1;
1250 enum tree_code code = *rescode_ptr;
1251
1252 /* Throw away any conversions to wider types
1253 already present in the operands. */
1254
1255 primop0 = get_narrower (op0, &unsignedp0);
1256 primop1 = get_narrower (op1, &unsignedp1);
1257
1258 /* Handle the case that OP0 does not *contain* a conversion
1259 but it *requires* conversion to FINAL_TYPE. */
1260
1261 if (op0 == primop0 && TREE_TYPE (op0) != *restype_ptr)
1262 unsignedp0 = TREE_UNSIGNED (TREE_TYPE (op0));
1263 if (op1 == primop1 && TREE_TYPE (op1) != *restype_ptr)
1264 unsignedp1 = TREE_UNSIGNED (TREE_TYPE (op1));
1265
1266 /* If one of the operands must be floated, we cannot optimize. */
1267 real1 = TREE_CODE (TREE_TYPE (primop0)) == REAL_TYPE;
1268 real2 = TREE_CODE (TREE_TYPE (primop1)) == REAL_TYPE;
1269
1270 /* If first arg is constant, swap the args (changing operation
1271 so value is preserved), for canonicalization. */
1272
1273 if (TREE_CONSTANT (primop0))
1274 {
1275 register tree tem = primop0;
1276 register int temi = unsignedp0;
1277 primop0 = primop1;
1278 primop1 = tem;
1279 tem = op0;
1280 op0 = op1;
1281 op1 = tem;
1282 *op0_ptr = op0;
1283 *op1_ptr = op1;
1284 unsignedp0 = unsignedp1;
1285 unsignedp1 = temi;
1286 temi = real1;
1287 real1 = real2;
1288 real2 = temi;
1289
1290 switch (code)
1291 {
1292 case LT_EXPR:
1293 code = GT_EXPR;
1294 break;
1295 case GT_EXPR:
1296 code = LT_EXPR;
1297 break;
1298 case LE_EXPR:
1299 code = GE_EXPR;
1300 break;
1301 case GE_EXPR:
1302 code = LE_EXPR;
1303 break;
1304 }
1305 *rescode_ptr = code;
1306 }
1307
1308 /* If comparing an integer against a constant more bits wide,
1309 maybe we can deduce a value of 1 or 0 independent of the data.
1310 Or else truncate the constant now
1311 rather than extend the variable at run time.
1312
1313 This is only interesting if the constant is the wider arg.
1314 Also, it is not safe if the constant is unsigned and the
1315 variable arg is signed, since in this case the variable
1316 would be sign-extended and then regarded as unsigned.
1317 Our technique fails in this case because the lowest/highest
1318 possible unsigned results don't follow naturally from the
1319 lowest/highest possible values of the variable operand.
1320 For just EQ_EXPR and NE_EXPR there is another technique that
1321 could be used: see if the constant can be faithfully represented
1322 in the other operand's type, by truncating it and reextending it
1323 and see if that preserves the constant's value. */
1324
1325 if (!real1 && !real2
1326 && TREE_CODE (primop1) == INTEGER_CST
1327 && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr))
1328 {
1329 int min_gt, max_gt, min_lt, max_lt;
1330 tree maxval, minval;
1331 /* 1 if comparison is nominally unsigned. */
1332 int unsignedp = TREE_UNSIGNED (*restype_ptr);
1333 tree val;
1334
1335 type = signed_or_unsigned_type (unsignedp0, TREE_TYPE (primop0));
1336
1337 maxval = TYPE_MAX_VALUE (type);
1338 minval = TYPE_MIN_VALUE (type);
1339
1340 if (unsignedp && !unsignedp0)
1341 *restype_ptr = signed_type (*restype_ptr);
1342
1343 if (TREE_TYPE (primop1) != *restype_ptr)
1344 primop1 = convert (*restype_ptr, primop1);
1345 if (type != *restype_ptr)
1346 {
1347 minval = convert (*restype_ptr, minval);
1348 maxval = convert (*restype_ptr, maxval);
1349 }
1350
1351 if (unsignedp && unsignedp0)
1352 {
1353 min_gt = INT_CST_LT_UNSIGNED (primop1, minval);
1354 max_gt = INT_CST_LT_UNSIGNED (primop1, maxval);
1355 min_lt = INT_CST_LT_UNSIGNED (minval, primop1);
1356 max_lt = INT_CST_LT_UNSIGNED (maxval, primop1);
1357 }
1358 else
1359 {
1360 min_gt = INT_CST_LT (primop1, minval);
1361 max_gt = INT_CST_LT (primop1, maxval);
1362 min_lt = INT_CST_LT (minval, primop1);
1363 max_lt = INT_CST_LT (maxval, primop1);
1364 }
1365
1366 val = 0;
1367 /* This used to be a switch, but Genix compiler can't handle that. */
1368 if (code == NE_EXPR)
1369 {
1370 if (max_lt || min_gt)
1371 val = integer_one_node;
1372 }
1373 else if (code == EQ_EXPR)
1374 {
1375 if (max_lt || min_gt)
1376 val = integer_zero_node;
1377 }
1378 else if (code == LT_EXPR)
1379 {
1380 if (max_lt)
1381 val = integer_one_node;
1382 if (!min_lt)
1383 val = integer_zero_node;
1384 }
1385 else if (code == GT_EXPR)
1386 {
1387 if (min_gt)
1388 val = integer_one_node;
1389 if (!max_gt)
1390 val = integer_zero_node;
1391 }
1392 else if (code == LE_EXPR)
1393 {
1394 if (!max_gt)
1395 val = integer_one_node;
1396 if (min_gt)
1397 val = integer_zero_node;
1398 }
1399 else if (code == GE_EXPR)
1400 {
1401 if (!min_lt)
1402 val = integer_one_node;
1403 if (max_lt)
1404 val = integer_zero_node;
1405 }
1406
1407 /* If primop0 was sign-extended and unsigned comparison specd,
1408 we did a signed comparison above using the signed type bounds.
1409 But the comparison we output must be unsigned.
1410
1411 Also, for inequalities, VAL is no good; but if the signed
1412 comparison had *any* fixed result, it follows that the
1413 unsigned comparison just tests the sign in reverse
1414 (positive values are LE, negative ones GE).
1415 So we can generate an unsigned comparison
1416 against an extreme value of the signed type. */
1417
1418 if (unsignedp && !unsignedp0)
1419 {
1420 if (val != 0)
1421 switch (code)
1422 {
1423 case LT_EXPR:
1424 case GE_EXPR:
1425 primop1 = TYPE_MIN_VALUE (type);
1426 val = 0;
1427 break;
1428
1429 case LE_EXPR:
1430 case GT_EXPR:
1431 primop1 = TYPE_MAX_VALUE (type);
1432 val = 0;
1433 break;
1434 }
1435 type = unsigned_type (type);
1436 }
1437
1438 if (!max_gt && !unsignedp0)
1439 {
1440 /* This is the case of (char)x >?< 0x80, which people used to use
1441 expecting old C compilers to change the 0x80 into -0x80. */
1442 if (val == integer_zero_node)
1443 warning ("comparison is always 0 due to limited range of data type");
1444 if (val == integer_one_node)
1445 warning ("comparison is always 1 due to limited range of data type");
1446 }
1447
1448 if (!min_lt && unsignedp0)
1449 {
1450 /* This is the case of (unsigned char)x >?< -1 or < 0. */
1451 if (val == integer_zero_node)
1452 warning ("comparison is always 0 due to limited range of data type");
1453 if (val == integer_one_node)
1454 warning ("comparison is always 1 due to limited range of data type");
1455 }
1456
1457 if (val != 0)
1458 {
1459 /* Don't forget to evaluate PRIMOP0 if it has side effects. */
1460 if (TREE_SIDE_EFFECTS (primop0))
1461 return build (COMPOUND_EXPR, TREE_TYPE (val), primop0, val);
1462 return val;
1463 }
1464
1465 /* Value is not predetermined, but do the comparison
1466 in the type of the operand that is not constant.
1467 TYPE is already properly set. */
1468 }
1469 else if (real1 && real2
1470 && (TYPE_PRECISION (TREE_TYPE (primop0))
1471 == TYPE_PRECISION (TREE_TYPE (primop1))))
1472 type = TREE_TYPE (primop0);
1473
1474 /* If args' natural types are both narrower than nominal type
1475 and both extend in the same manner, compare them
1476 in the type of the wider arg.
1477 Otherwise must actually extend both to the nominal
1478 common type lest different ways of extending
1479 alter the result.
1480 (eg, (short)-1 == (unsigned short)-1 should be 0.) */
1481
1482 else if (unsignedp0 == unsignedp1 && real1 == real2
1483 && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr)
1484 && TYPE_PRECISION (TREE_TYPE (primop1)) < TYPE_PRECISION (*restype_ptr))
1485 {
1486 type = common_type (TREE_TYPE (primop0), TREE_TYPE (primop1));
1487 type = signed_or_unsigned_type (unsignedp0
1488 || TREE_UNSIGNED (*restype_ptr),
1489 type);
1490 /* Make sure shorter operand is extended the right way
1491 to match the longer operand. */
1492 primop0 = convert (signed_or_unsigned_type (unsignedp0, TREE_TYPE (primop0)),
1493 primop0);
1494 primop1 = convert (signed_or_unsigned_type (unsignedp1, TREE_TYPE (primop1)),
1495 primop1);
1496 }
1497 else
1498 {
1499 /* Here we must do the comparison on the nominal type
1500 using the args exactly as we received them. */
1501 type = *restype_ptr;
1502 primop0 = op0;
1503 primop1 = op1;
1504
1505 if (!real1 && !real2 && integer_zerop (primop1)
1506 && TREE_UNSIGNED (TREE_TYPE (primop0)))
1507 {
1508 tree value = 0;
1509 switch (code)
1510 {
1511 case GE_EXPR:
1512 if (extra_warnings)
1513 warning ("unsigned value >= 0 is always 1");
1514 value = integer_one_node;
1515 break;
1516
1517 case LT_EXPR:
1518 if (extra_warnings)
1519 warning ("unsigned value < 0 is always 0");
1520 value = integer_zero_node;
1521 }
1522
1523 if (value != 0)
1524 {
1525 /* Don't forget to evaluate PRIMOP0 if it has side effects. */
1526 if (TREE_SIDE_EFFECTS (primop0))
1527 return build (COMPOUND_EXPR, TREE_TYPE (value),
1528 primop0, value);
1529 return value;
1530 }
1531 }
1532 }
1533
1534 *op0_ptr = convert (type, primop0);
1535 *op1_ptr = convert (type, primop1);
1536
1537 *restype_ptr = integer_type_node;
1538
1539 return 0;
1540 }
1541 \f
1542 /* Prepare expr to be an argument of a TRUTH_NOT_EXPR,
1543 or validate its data type for an `if' or `while' statement or ?..: exp.
1544
1545 This preparation consists of taking the ordinary
1546 representation of an expression expr and producing a valid tree
1547 boolean expression describing whether expr is nonzero. We could
1548 simply always do build_binary_op (NE_EXPR, expr, integer_zero_node, 1),
1549 but we optimize comparisons, &&, ||, and !.
1550
1551 The resulting type should always be `integer_type_node'. */
1552
1553 tree
1554 truthvalue_conversion (expr)
1555 tree expr;
1556 {
1557 register enum tree_code code;
1558
1559 if (TREE_CODE (expr) == ERROR_MARK)
1560 return expr;
1561
1562 #if 0 /* This appears to be wrong for C++. */
1563 /* These really should return error_mark_node after 2.4 is stable.
1564 But not all callers handle ERROR_MARK properly. */
1565 switch (TREE_CODE (TREE_TYPE (expr)))
1566 {
1567 case RECORD_TYPE:
1568 error ("struct type value used where scalar is required");
1569 return integer_zero_node;
1570
1571 case UNION_TYPE:
1572 error ("union type value used where scalar is required");
1573 return integer_zero_node;
1574
1575 case ARRAY_TYPE:
1576 error ("array type value used where scalar is required");
1577 return integer_zero_node;
1578
1579 default:
1580 break;
1581 }
1582 #endif /* 0 */
1583
1584 switch (TREE_CODE (expr))
1585 {
1586 /* It is simpler and generates better code to have only TRUTH_*_EXPR
1587 or comparison expressions as truth values at this level. */
1588 #if 0
1589 case COMPONENT_REF:
1590 /* A one-bit unsigned bit-field is already acceptable. */
1591 if (1 == TREE_INT_CST_LOW (DECL_SIZE (TREE_OPERAND (expr, 1)))
1592 && TREE_UNSIGNED (TREE_OPERAND (expr, 1)))
1593 return expr;
1594 break;
1595 #endif
1596
1597 case EQ_EXPR:
1598 /* It is simpler and generates better code to have only TRUTH_*_EXPR
1599 or comparison expressions as truth values at this level. */
1600 #if 0
1601 if (integer_zerop (TREE_OPERAND (expr, 1)))
1602 return build_unary_op (TRUTH_NOT_EXPR, TREE_OPERAND (expr, 0), 0);
1603 #endif
1604 case NE_EXPR: case LE_EXPR: case GE_EXPR: case LT_EXPR: case GT_EXPR:
1605 case TRUTH_ANDIF_EXPR:
1606 case TRUTH_ORIF_EXPR:
1607 case TRUTH_AND_EXPR:
1608 case TRUTH_OR_EXPR:
1609 case TRUTH_XOR_EXPR:
1610 case ERROR_MARK:
1611 return expr;
1612
1613 case INTEGER_CST:
1614 return integer_zerop (expr) ? integer_zero_node : integer_one_node;
1615
1616 case REAL_CST:
1617 return real_zerop (expr) ? integer_zero_node : integer_one_node;
1618
1619 case ADDR_EXPR:
1620 if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 0)))
1621 return build (COMPOUND_EXPR, integer_type_node,
1622 TREE_OPERAND (expr, 0), integer_one_node);
1623 else
1624 return integer_one_node;
1625
1626 case COMPLEX_EXPR:
1627 return build_binary_op ((TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1))
1628 ? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR),
1629 truthvalue_conversion (TREE_OPERAND (expr, 0)),
1630 truthvalue_conversion (TREE_OPERAND (expr, 1)),
1631 0);
1632
1633 case NEGATE_EXPR:
1634 case ABS_EXPR:
1635 case FLOAT_EXPR:
1636 case FFS_EXPR:
1637 /* These don't change whether an object is non-zero or zero. */
1638 return truthvalue_conversion (TREE_OPERAND (expr, 0));
1639
1640 case LROTATE_EXPR:
1641 case RROTATE_EXPR:
1642 /* These don't change whether an object is zero or non-zero, but
1643 we can't ignore them if their second arg has side-effects. */
1644 if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1)))
1645 return build (COMPOUND_EXPR, integer_type_node, TREE_OPERAND (expr, 1),
1646 truthvalue_conversion (TREE_OPERAND (expr, 0)));
1647 else
1648 return truthvalue_conversion (TREE_OPERAND (expr, 0));
1649
1650 case COND_EXPR:
1651 /* Distribute the conversion into the arms of a COND_EXPR. */
1652 return fold (build (COND_EXPR, integer_type_node, TREE_OPERAND (expr, 0),
1653 truthvalue_conversion (TREE_OPERAND (expr, 1)),
1654 truthvalue_conversion (TREE_OPERAND (expr, 2))));
1655
1656 case CONVERT_EXPR:
1657 /* Don't cancel the effect of a CONVERT_EXPR from a REFERENCE_TYPE,
1658 since that affects how `default_conversion' will behave. */
1659 if (TREE_CODE (TREE_TYPE (expr)) == REFERENCE_TYPE
1660 || TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == REFERENCE_TYPE)
1661 break;
1662 /* fall through... */
1663 case NOP_EXPR:
1664 /* If this is widening the argument, we can ignore it. */
1665 if (TYPE_PRECISION (TREE_TYPE (expr))
1666 >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (expr, 0))))
1667 return truthvalue_conversion (TREE_OPERAND (expr, 0));
1668 break;
1669
1670 case MINUS_EXPR:
1671 /* With IEEE arithmetic, x - x may not equal 0, so we can't optimize
1672 this case. */
1673 if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
1674 && TREE_CODE (TREE_TYPE (expr)) == REAL_TYPE)
1675 break;
1676 /* fall through... */
1677 case BIT_XOR_EXPR:
1678 /* This and MINUS_EXPR can be changed into a comparison of the
1679 two objects. */
1680 if (TREE_TYPE (TREE_OPERAND (expr, 0))
1681 == TREE_TYPE (TREE_OPERAND (expr, 1)))
1682 return build_binary_op (NE_EXPR, TREE_OPERAND (expr, 0),
1683 TREE_OPERAND (expr, 1), 1);
1684 return build_binary_op (NE_EXPR, TREE_OPERAND (expr, 0),
1685 fold (build1 (NOP_EXPR,
1686 TREE_TYPE (TREE_OPERAND (expr, 0)),
1687 TREE_OPERAND (expr, 1))), 1);
1688
1689 case MODIFY_EXPR:
1690 if (warn_parentheses && C_EXP_ORIGINAL_CODE (expr) == MODIFY_EXPR)
1691 warning ("suggest parentheses around assignment used as truth value");
1692 break;
1693 }
1694
1695 if (TREE_CODE (TREE_TYPE (expr)) == COMPLEX_TYPE)
1696 return (build_binary_op
1697 ((TREE_SIDE_EFFECTS (expr)
1698 ? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR),
1699 truthvalue_conversion (build_unary_op (REALPART_EXPR, expr, 0)),
1700 truthvalue_conversion (build_unary_op (IMAGPART_EXPR, expr, 0)),
1701 0));
1702
1703 return build_binary_op (NE_EXPR, expr, integer_zero_node, 1);
1704 }
1705 \f
1706 /* Read the rest of a #-directive from input stream FINPUT.
1707 In normal use, the directive name and the white space after it
1708 have already been read, so they won't be included in the result.
1709 We allow for the fact that the directive line may contain
1710 a newline embedded within a character or string literal which forms
1711 a part of the directive.
1712
1713 The value is a string in a reusable buffer. It remains valid
1714 only until the next time this function is called. */
1715
1716 char *
1717 get_directive_line (finput)
1718 register FILE *finput;
1719 {
1720 static char *directive_buffer = NULL;
1721 static unsigned buffer_length = 0;
1722 register char *p;
1723 register char *buffer_limit;
1724 register int looking_for = 0;
1725 register int char_escaped = 0;
1726
1727 if (buffer_length == 0)
1728 {
1729 directive_buffer = (char *)xmalloc (128);
1730 buffer_length = 128;
1731 }
1732
1733 buffer_limit = &directive_buffer[buffer_length];
1734
1735 for (p = directive_buffer; ; )
1736 {
1737 int c;
1738
1739 /* Make buffer bigger if it is full. */
1740 if (p >= buffer_limit)
1741 {
1742 register unsigned bytes_used = (p - directive_buffer);
1743
1744 buffer_length *= 2;
1745 directive_buffer
1746 = (char *)xrealloc (directive_buffer, buffer_length);
1747 p = &directive_buffer[bytes_used];
1748 buffer_limit = &directive_buffer[buffer_length];
1749 }
1750
1751 c = getc (finput);
1752
1753 /* Discard initial whitespace. */
1754 if ((c == ' ' || c == '\t') && p == directive_buffer)
1755 continue;
1756
1757 /* Detect the end of the directive. */
1758 if (c == '\n' && looking_for == 0)
1759 {
1760 ungetc (c, finput);
1761 c = '\0';
1762 }
1763
1764 *p++ = c;
1765
1766 if (c == 0)
1767 return directive_buffer;
1768
1769 /* Handle string and character constant syntax. */
1770 if (looking_for)
1771 {
1772 if (looking_for == c && !char_escaped)
1773 looking_for = 0; /* Found terminator... stop looking. */
1774 }
1775 else
1776 if (c == '\'' || c == '"')
1777 looking_for = c; /* Don't stop buffering until we see another
1778 another one of these (or an EOF). */
1779
1780 /* Handle backslash. */
1781 char_escaped = (c == '\\' && ! char_escaped);
1782 }
1783 }
1784 \f
1785 /* Make a variant type in the proper way for C/C++, propagating qualifiers
1786 down to the element type of an array. */
1787
1788 tree
1789 c_build_type_variant (type, constp, volatilep)
1790 tree type;
1791 int constp, volatilep;
1792 {
1793 if (TREE_CODE (type) == ARRAY_TYPE)
1794 {
1795 tree real_main_variant = TYPE_MAIN_VARIANT (type);
1796
1797 push_obstacks (TYPE_OBSTACK (type), TYPE_OBSTACK (type));
1798 type = build_array_type (c_build_type_variant (TREE_TYPE (type),
1799 constp, volatilep),
1800 TYPE_DOMAIN (type));
1801 TYPE_MAIN_VARIANT (type) = real_main_variant;
1802 pop_obstacks ();
1803 }
1804 return build_type_variant (type, constp, volatilep);
1805 }
This page took 0.197753 seconds and 6 git commands to generate.