]> gcc.gnu.org Git - gcc.git/blob - gcc/c-common.c
(check_format_info): Make warning nicer for mismatch of int vs long, etc.
[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 (TYPE_MAIN_VARIANT (TREE_TYPE (cur_param))
692 != unsigned_type_node))
693 {
694 sprintf (message,
695 "field width is not type int (arg %d)",
696 arg_num);
697 warning (message);
698 }
699 }
700 }
701 else
702 {
703 while (isdigit (*format_chars))
704 {
705 wide = TRUE;
706 ++format_chars;
707 }
708 }
709 if (*format_chars == '.')
710 {
711 precise = TRUE;
712 ++format_chars;
713 if (*format_chars != '*' && !isdigit (*format_chars))
714 warning ("`.' not followed by `*' or digit in format");
715 /* "...a...precision...may be indicated by an asterisk.
716 In this case, an int argument supplies the...precision." */
717 if (*format_chars == '*')
718 {
719 if (info->first_arg_num != 0)
720 {
721 ++format_chars;
722 if (params == 0)
723 {
724 warning (tfaff);
725 return;
726 }
727 cur_param = TREE_VALUE (params);
728 params = TREE_CHAIN (params);
729 ++arg_num;
730 if (TYPE_MAIN_VARIANT (TREE_TYPE (cur_param))
731 != integer_type_node)
732 {
733 sprintf (message,
734 "field width is not type int (arg %d)",
735 arg_num);
736 warning (message);
737 }
738 }
739 }
740 else
741 {
742 while (isdigit (*format_chars))
743 ++format_chars;
744 }
745 }
746 }
747 if (*format_chars == 'h' || *format_chars == 'l' || *format_chars == 'L')
748 length_char = *format_chars++;
749 else
750 length_char = 0;
751 if (suppressed && length_char != 0)
752 {
753 sprintf (message,
754 "use of `*' and `%c' together in format",
755 length_char);
756 warning (message);
757 }
758 format_char = *format_chars;
759 if (format_char == 0)
760 {
761 warning ("conversion lacks type at end of format");
762 continue;
763 }
764 format_chars++;
765 fci = info->is_scan ? scan_char_table : print_char_table;
766 while (fci->format_chars != 0
767 && index (fci->format_chars, format_char) == 0)
768 ++fci;
769 if (fci->format_chars == 0)
770 {
771 if (format_char >= 040 && format_char < 0177)
772 sprintf (message,
773 "unknown conversion type character `%c' in format",
774 format_char);
775 else
776 sprintf (message,
777 "unknown conversion type character 0x%x in format",
778 format_char);
779 warning (message);
780 continue;
781 }
782 if (wide && index (fci->flag_chars, 'w') == 0)
783 {
784 sprintf (message, "width used with `%c' format",
785 format_char);
786 warning (message);
787 }
788 if (precise && index (fci->flag_chars, 'p') == 0)
789 {
790 sprintf (message, "precision used with `%c' format",
791 format_char);
792 warning (message);
793 }
794 if (info->is_scan && format_char == '[')
795 {
796 /* Skip over scan set, in case it happens to have '%' in it. */
797 if (*format_chars == '^')
798 ++format_chars;
799 /* Find closing bracket; if one is hit immediately, then
800 it's part of the scan set rather than a terminator. */
801 if (*format_chars == ']')
802 ++format_chars;
803 while (*format_chars && *format_chars != ']')
804 ++format_chars;
805 if (*format_chars != ']')
806 /* The end of the format string was reached. */
807 warning ("no closing `]' for `%%[' format");
808 }
809 if (suppressed)
810 {
811 if (index (fci->flag_chars, '*') == 0)
812 {
813 sprintf (message,
814 "suppression of `%c' conversion in format",
815 format_char);
816 warning (message);
817 }
818 continue;
819 }
820 for (i = 0; flag_chars[i] != 0; ++i)
821 {
822 if (index (fci->flag_chars, flag_chars[i]) == 0)
823 {
824 sprintf (message, "flag `%c' used with type `%c'",
825 flag_chars[i], format_char);
826 warning (message);
827 }
828 }
829 if (precise && index (flag_chars, '0') != 0
830 && (format_char == 'd' || format_char == 'i'
831 || format_char == 'o' || format_char == 'u'
832 || format_char == 'x' || format_char == 'x'))
833 {
834 sprintf (message,
835 "precision and `0' flag not both allowed with `%c' format",
836 format_char);
837 warning (message);
838 }
839 switch (length_char)
840 {
841 default: wanted_type = fci->nolen ? *(fci->nolen) : 0; break;
842 case 'h': wanted_type = fci->hlen ? *(fci->hlen) : 0; break;
843 case 'l': wanted_type = fci->llen ? *(fci->llen) : 0; break;
844 case 'L': wanted_type = fci->bigllen ? *(fci->bigllen) : 0; break;
845 }
846 if (wanted_type == 0)
847 {
848 sprintf (message,
849 "use of `%c' length character with `%c' type character",
850 length_char, format_char);
851 warning (message);
852 }
853
854 /*
855 ** XXX -- should kvetch about stuff such as
856 ** {
857 ** const int i;
858 **
859 ** scanf ("%d", &i);
860 ** }
861 */
862
863 /* Finally. . .check type of argument against desired type! */
864 if (info->first_arg_num == 0)
865 continue;
866 if (params == 0)
867 {
868 warning (tfaff);
869 return;
870 }
871 cur_param = TREE_VALUE (params);
872 params = TREE_CHAIN (params);
873 ++arg_num;
874 cur_type = TREE_TYPE (cur_param);
875
876 /* Check the types of any additional pointer arguments
877 that precede the "real" argument. */
878 for (i = 0; i < fci->pointer_count; ++i)
879 {
880 if (TREE_CODE (cur_type) == POINTER_TYPE)
881 {
882 cur_type = TREE_TYPE (cur_type);
883 continue;
884 }
885 sprintf (message,
886 "format argument is not a %s (arg %d)",
887 ((fci->pointer_count == 1) ? "pointer" : "pointer to a pointer"),
888 arg_num);
889 warning (message);
890 break;
891 }
892
893 /* Check the type of the "real" argument, if there's a type we want. */
894 if (i == fci->pointer_count && wanted_type != 0
895 && wanted_type != TYPE_MAIN_VARIANT (cur_type)
896 /* If we want `void *', allow any pointer type.
897 (Anything else would already have got a warning.) */
898 && ! (wanted_type == void_type_node
899 && fci->pointer_count > 0)
900 /* Don't warn about differences merely in signedness. */
901 && !(TREE_CODE (wanted_type) == INTEGER_TYPE
902 && TREE_CODE (cur_type) == INTEGER_TYPE
903 && (TREE_UNSIGNED (wanted_type)
904 ? wanted_type == unsigned_type (cur_type)
905 : wanted_type == signed_type (cur_type)))
906 /* Likewise, "signed char", "unsigned char" and "char" are
907 equivalent but the above test won't consider them equivalent. */
908 && ! (wanted_type == char_type_node
909 && (cur_type == signed_char_type_node
910 || cur_type == unsigned_char_type_node)))
911 {
912 register char *this;
913 register char *that;
914
915 this = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (wanted_type)));
916 that = 0;
917 if (TREE_CODE (cur_type) != ERROR_MARK
918 && TYPE_NAME (cur_type) != 0
919 && TREE_CODE (cur_type) != INTEGER_TYPE
920 && !(TREE_CODE (cur_type) == POINTER_TYPE
921 && TREE_CODE (TREE_TYPE (cur_type)) == INTEGER_TYPE))
922 {
923 if (TREE_CODE (TYPE_NAME (cur_type)) == TYPE_DECL
924 && DECL_NAME (TYPE_NAME (cur_type)) != 0)
925 that = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (cur_type)));
926 else
927 that = IDENTIFIER_POINTER (TYPE_NAME (cur_type));
928 }
929
930 /* A nameless type can't possibly match what the format wants.
931 So there will be a warning for it.
932 Make up a string to describe vaguely what it is. */
933 if (that == 0)
934 {
935 if (TREE_CODE (cur_type) == POINTER_TYPE)
936 that = "pointer";
937 else
938 that = "different type";
939 }
940
941 /* Make the warning better in case of mismatch of int vs long. */
942 if (TREE_CODE (cur_type) == INTEGER_TYPE
943 && TREE_CODE (wanted_type) == INTEGER_TYPE
944 && TYPE_PRECISION (cur_type) == TYPE_PRECISION (wanted_type)
945 && TYPE_NAME (cur_type) != 0
946 && TREE_CODE (TYPE_NAME (cur_type)) == TYPE_DECL)
947 that = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (cur_type)));
948
949 if (strcmp (this, that) != 0)
950 {
951 sprintf (message, "%s format, %s arg (arg %d)",
952 this, that, arg_num);
953 warning (message);
954 }
955 }
956 }
957 }
958 \f
959 /* Print a warning if a constant expression had overflow in folding.
960 Invoke this function on every expression that the language
961 requires to be a constant expression.
962 Note the ANSI C standard says it is erroneous for a
963 constant expression to overflow. */
964
965 void
966 constant_expression_warning (value)
967 tree value;
968 {
969 if (TREE_CODE (value) == INTEGER_CST && TREE_CONSTANT_OVERFLOW (value))
970 if (pedantic)
971 pedwarn ("overflow in constant expression");
972 }
973
974 /* Print a warning if an expression had overflow in folding.
975 Invoke this function on every expression that
976 (1) appears in the source code, and
977 (2) might be a constant expression that overflowed, and
978 (3) is not already checked by convert_and_check;
979 however, do not invoke this function on operands of explicit casts. */
980
981 void
982 overflow_warning (value)
983 tree value;
984 {
985 if (TREE_CODE (value) == INTEGER_CST && TREE_OVERFLOW (value))
986 {
987 TREE_OVERFLOW (value) = 0;
988 warning ("integer overflow in expression");
989 }
990 }
991
992 /* Print a warning if a large constant is truncated to unsigned,
993 or if -Wconversion is used and a constant < 0 is converted to unsigned.
994 Invoke this function on every expression that might be implicitly
995 converted to an unsigned type. */
996
997 void
998 unsigned_conversion_warning (result, operand)
999 tree result, operand;
1000 {
1001 if (TREE_CODE (operand) == INTEGER_CST
1002 && TREE_CODE (TREE_TYPE (result)) == INTEGER_TYPE
1003 && TREE_UNSIGNED (TREE_TYPE (result))
1004 && !int_fits_type_p (operand, TREE_TYPE (result)))
1005 {
1006 if (!int_fits_type_p (operand, signed_type (TREE_TYPE (result))))
1007 /* This detects cases like converting -129 or 256 to unsigned char. */
1008 warning ("large integer implicitly truncated to unsigned type");
1009 else if (warn_conversion)
1010 warning ("negative integer implicitly converted to unsigned type");
1011 }
1012 }
1013
1014 /* Convert EXPR to TYPE, warning about conversion problems with constants.
1015 Invoke this function on every expression that is converted implicitly,
1016 i.e. because of language rules and not because of an explicit cast. */
1017
1018 tree
1019 convert_and_check (type, expr)
1020 tree type, expr;
1021 {
1022 tree t = convert (type, expr);
1023 if (TREE_CODE (t) == INTEGER_CST)
1024 {
1025 if (TREE_OVERFLOW (t))
1026 {
1027 TREE_OVERFLOW (t) = 0;
1028
1029 /* No warning for converting 0x80000000 to int. */
1030 if (!(TREE_UNSIGNED (type) < TREE_UNSIGNED (TREE_TYPE (expr))
1031 && TREE_CODE (TREE_TYPE (expr)) == INTEGER_TYPE
1032 && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (expr))))
1033 /* If EXPR fits in the unsigned version of TYPE,
1034 don't warn unless pedantic. */
1035 if (pedantic
1036 || TREE_UNSIGNED (type)
1037 || ! int_fits_type_p (expr, unsigned_type (type)))
1038 warning ("overflow in implicit constant conversion");
1039 }
1040 else
1041 unsigned_conversion_warning (t, expr);
1042 }
1043 return t;
1044 }
1045 \f
1046 void
1047 c_expand_expr_stmt (expr)
1048 tree expr;
1049 {
1050 /* Do default conversion if safe and possibly important,
1051 in case within ({...}). */
1052 if ((TREE_CODE (TREE_TYPE (expr)) == ARRAY_TYPE && lvalue_p (expr))
1053 || TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE)
1054 expr = default_conversion (expr);
1055
1056 if (TREE_TYPE (expr) != error_mark_node
1057 && TYPE_SIZE (TREE_TYPE (expr)) == 0
1058 && TREE_CODE (TREE_TYPE (expr)) != ARRAY_TYPE)
1059 error ("expression statement has incomplete type");
1060
1061 expand_expr_stmt (expr);
1062 }
1063 \f
1064 /* Validate the expression after `case' and apply default promotions. */
1065
1066 tree
1067 check_case_value (value)
1068 tree value;
1069 {
1070 if (value == NULL_TREE)
1071 return value;
1072
1073 /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */
1074 STRIP_TYPE_NOPS (value);
1075
1076 if (TREE_CODE (value) != INTEGER_CST
1077 && value != error_mark_node)
1078 {
1079 error ("case label does not reduce to an integer constant");
1080 value = error_mark_node;
1081 }
1082 else
1083 /* Promote char or short to int. */
1084 value = default_conversion (value);
1085
1086 constant_expression_warning (value);
1087
1088 return value;
1089 }
1090 \f
1091 /* Return an integer type with BITS bits of precision,
1092 that is unsigned if UNSIGNEDP is nonzero, otherwise signed. */
1093
1094 tree
1095 type_for_size (bits, unsignedp)
1096 unsigned bits;
1097 int unsignedp;
1098 {
1099 if (bits == TYPE_PRECISION (signed_char_type_node))
1100 return unsignedp ? unsigned_char_type_node : signed_char_type_node;
1101
1102 if (bits == TYPE_PRECISION (short_integer_type_node))
1103 return unsignedp ? short_unsigned_type_node : short_integer_type_node;
1104
1105 if (bits == TYPE_PRECISION (integer_type_node))
1106 return unsignedp ? unsigned_type_node : integer_type_node;
1107
1108 if (bits == TYPE_PRECISION (long_integer_type_node))
1109 return unsignedp ? long_unsigned_type_node : long_integer_type_node;
1110
1111 if (bits == TYPE_PRECISION (long_long_integer_type_node))
1112 return (unsignedp ? long_long_unsigned_type_node
1113 : long_long_integer_type_node);
1114
1115 if (bits <= TYPE_PRECISION (intQI_type_node))
1116 return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
1117
1118 if (bits <= TYPE_PRECISION (intHI_type_node))
1119 return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
1120
1121 if (bits <= TYPE_PRECISION (intSI_type_node))
1122 return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
1123
1124 if (bits <= TYPE_PRECISION (intDI_type_node))
1125 return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
1126
1127 return 0;
1128 }
1129
1130 /* Return a data type that has machine mode MODE.
1131 If the mode is an integer,
1132 then UNSIGNEDP selects between signed and unsigned types. */
1133
1134 tree
1135 type_for_mode (mode, unsignedp)
1136 enum machine_mode mode;
1137 int unsignedp;
1138 {
1139 if (mode == TYPE_MODE (signed_char_type_node))
1140 return unsignedp ? unsigned_char_type_node : signed_char_type_node;
1141
1142 if (mode == TYPE_MODE (short_integer_type_node))
1143 return unsignedp ? short_unsigned_type_node : short_integer_type_node;
1144
1145 if (mode == TYPE_MODE (integer_type_node))
1146 return unsignedp ? unsigned_type_node : integer_type_node;
1147
1148 if (mode == TYPE_MODE (long_integer_type_node))
1149 return unsignedp ? long_unsigned_type_node : long_integer_type_node;
1150
1151 if (mode == TYPE_MODE (long_long_integer_type_node))
1152 return unsignedp ? long_long_unsigned_type_node : long_long_integer_type_node;
1153
1154 if (mode == TYPE_MODE (intQI_type_node))
1155 return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
1156
1157 if (mode == TYPE_MODE (intHI_type_node))
1158 return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
1159
1160 if (mode == TYPE_MODE (intSI_type_node))
1161 return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
1162
1163 if (mode == TYPE_MODE (intDI_type_node))
1164 return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
1165
1166 if (mode == TYPE_MODE (float_type_node))
1167 return float_type_node;
1168
1169 if (mode == TYPE_MODE (double_type_node))
1170 return double_type_node;
1171
1172 if (mode == TYPE_MODE (long_double_type_node))
1173 return long_double_type_node;
1174
1175 if (mode == TYPE_MODE (build_pointer_type (char_type_node)))
1176 return build_pointer_type (char_type_node);
1177
1178 if (mode == TYPE_MODE (build_pointer_type (integer_type_node)))
1179 return build_pointer_type (integer_type_node);
1180
1181 return 0;
1182 }
1183 \f
1184 /* Print an error message for invalid operands to arith operation CODE.
1185 NOP_EXPR is used as a special case (see truthvalue_conversion). */
1186
1187 void
1188 binary_op_error (code)
1189 enum tree_code code;
1190 {
1191 register char *opname;
1192 switch (code)
1193 {
1194 case NOP_EXPR:
1195 error ("invalid truth-value expression");
1196 return;
1197
1198 case PLUS_EXPR:
1199 opname = "+"; break;
1200 case MINUS_EXPR:
1201 opname = "-"; break;
1202 case MULT_EXPR:
1203 opname = "*"; break;
1204 case MAX_EXPR:
1205 opname = "max"; break;
1206 case MIN_EXPR:
1207 opname = "min"; break;
1208 case EQ_EXPR:
1209 opname = "=="; break;
1210 case NE_EXPR:
1211 opname = "!="; break;
1212 case LE_EXPR:
1213 opname = "<="; break;
1214 case GE_EXPR:
1215 opname = ">="; break;
1216 case LT_EXPR:
1217 opname = "<"; break;
1218 case GT_EXPR:
1219 opname = ">"; break;
1220 case LSHIFT_EXPR:
1221 opname = "<<"; break;
1222 case RSHIFT_EXPR:
1223 opname = ">>"; break;
1224 case TRUNC_MOD_EXPR:
1225 case FLOOR_MOD_EXPR:
1226 opname = "%"; break;
1227 case TRUNC_DIV_EXPR:
1228 case FLOOR_DIV_EXPR:
1229 opname = "/"; break;
1230 case BIT_AND_EXPR:
1231 opname = "&"; break;
1232 case BIT_IOR_EXPR:
1233 opname = "|"; break;
1234 case TRUTH_ANDIF_EXPR:
1235 opname = "&&"; break;
1236 case TRUTH_ORIF_EXPR:
1237 opname = "||"; break;
1238 case BIT_XOR_EXPR:
1239 opname = "^"; break;
1240 case LROTATE_EXPR:
1241 case RROTATE_EXPR:
1242 opname = "rotate"; break;
1243 }
1244 error ("invalid operands to binary %s", opname);
1245 }
1246 \f
1247 /* Subroutine of build_binary_op, used for comparison operations.
1248 See if the operands have both been converted from subword integer types
1249 and, if so, perhaps change them both back to their original type.
1250 This function is also responsible for converting the two operands
1251 to the proper common type for comparison.
1252
1253 The arguments of this function are all pointers to local variables
1254 of build_binary_op: OP0_PTR is &OP0, OP1_PTR is &OP1,
1255 RESTYPE_PTR is &RESULT_TYPE and RESCODE_PTR is &RESULTCODE.
1256
1257 If this function returns nonzero, it means that the comparison has
1258 a constant value. What this function returns is an expression for
1259 that value. */
1260
1261 tree
1262 shorten_compare (op0_ptr, op1_ptr, restype_ptr, rescode_ptr)
1263 tree *op0_ptr, *op1_ptr;
1264 tree *restype_ptr;
1265 enum tree_code *rescode_ptr;
1266 {
1267 register tree type;
1268 tree op0 = *op0_ptr;
1269 tree op1 = *op1_ptr;
1270 int unsignedp0, unsignedp1;
1271 int real1, real2;
1272 tree primop0, primop1;
1273 enum tree_code code = *rescode_ptr;
1274
1275 /* Throw away any conversions to wider types
1276 already present in the operands. */
1277
1278 primop0 = get_narrower (op0, &unsignedp0);
1279 primop1 = get_narrower (op1, &unsignedp1);
1280
1281 /* Handle the case that OP0 does not *contain* a conversion
1282 but it *requires* conversion to FINAL_TYPE. */
1283
1284 if (op0 == primop0 && TREE_TYPE (op0) != *restype_ptr)
1285 unsignedp0 = TREE_UNSIGNED (TREE_TYPE (op0));
1286 if (op1 == primop1 && TREE_TYPE (op1) != *restype_ptr)
1287 unsignedp1 = TREE_UNSIGNED (TREE_TYPE (op1));
1288
1289 /* If one of the operands must be floated, we cannot optimize. */
1290 real1 = TREE_CODE (TREE_TYPE (primop0)) == REAL_TYPE;
1291 real2 = TREE_CODE (TREE_TYPE (primop1)) == REAL_TYPE;
1292
1293 /* If first arg is constant, swap the args (changing operation
1294 so value is preserved), for canonicalization. */
1295
1296 if (TREE_CONSTANT (primop0))
1297 {
1298 register tree tem = primop0;
1299 register int temi = unsignedp0;
1300 primop0 = primop1;
1301 primop1 = tem;
1302 tem = op0;
1303 op0 = op1;
1304 op1 = tem;
1305 *op0_ptr = op0;
1306 *op1_ptr = op1;
1307 unsignedp0 = unsignedp1;
1308 unsignedp1 = temi;
1309 temi = real1;
1310 real1 = real2;
1311 real2 = temi;
1312
1313 switch (code)
1314 {
1315 case LT_EXPR:
1316 code = GT_EXPR;
1317 break;
1318 case GT_EXPR:
1319 code = LT_EXPR;
1320 break;
1321 case LE_EXPR:
1322 code = GE_EXPR;
1323 break;
1324 case GE_EXPR:
1325 code = LE_EXPR;
1326 break;
1327 }
1328 *rescode_ptr = code;
1329 }
1330
1331 /* If comparing an integer against a constant more bits wide,
1332 maybe we can deduce a value of 1 or 0 independent of the data.
1333 Or else truncate the constant now
1334 rather than extend the variable at run time.
1335
1336 This is only interesting if the constant is the wider arg.
1337 Also, it is not safe if the constant is unsigned and the
1338 variable arg is signed, since in this case the variable
1339 would be sign-extended and then regarded as unsigned.
1340 Our technique fails in this case because the lowest/highest
1341 possible unsigned results don't follow naturally from the
1342 lowest/highest possible values of the variable operand.
1343 For just EQ_EXPR and NE_EXPR there is another technique that
1344 could be used: see if the constant can be faithfully represented
1345 in the other operand's type, by truncating it and reextending it
1346 and see if that preserves the constant's value. */
1347
1348 if (!real1 && !real2
1349 && TREE_CODE (primop1) == INTEGER_CST
1350 && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr))
1351 {
1352 int min_gt, max_gt, min_lt, max_lt;
1353 tree maxval, minval;
1354 /* 1 if comparison is nominally unsigned. */
1355 int unsignedp = TREE_UNSIGNED (*restype_ptr);
1356 tree val;
1357
1358 type = signed_or_unsigned_type (unsignedp0, TREE_TYPE (primop0));
1359
1360 maxval = TYPE_MAX_VALUE (type);
1361 minval = TYPE_MIN_VALUE (type);
1362
1363 if (unsignedp && !unsignedp0)
1364 *restype_ptr = signed_type (*restype_ptr);
1365
1366 if (TREE_TYPE (primop1) != *restype_ptr)
1367 primop1 = convert (*restype_ptr, primop1);
1368 if (type != *restype_ptr)
1369 {
1370 minval = convert (*restype_ptr, minval);
1371 maxval = convert (*restype_ptr, maxval);
1372 }
1373
1374 if (unsignedp && unsignedp0)
1375 {
1376 min_gt = INT_CST_LT_UNSIGNED (primop1, minval);
1377 max_gt = INT_CST_LT_UNSIGNED (primop1, maxval);
1378 min_lt = INT_CST_LT_UNSIGNED (minval, primop1);
1379 max_lt = INT_CST_LT_UNSIGNED (maxval, primop1);
1380 }
1381 else
1382 {
1383 min_gt = INT_CST_LT (primop1, minval);
1384 max_gt = INT_CST_LT (primop1, maxval);
1385 min_lt = INT_CST_LT (minval, primop1);
1386 max_lt = INT_CST_LT (maxval, primop1);
1387 }
1388
1389 val = 0;
1390 /* This used to be a switch, but Genix compiler can't handle that. */
1391 if (code == NE_EXPR)
1392 {
1393 if (max_lt || min_gt)
1394 val = integer_one_node;
1395 }
1396 else if (code == EQ_EXPR)
1397 {
1398 if (max_lt || min_gt)
1399 val = integer_zero_node;
1400 }
1401 else if (code == LT_EXPR)
1402 {
1403 if (max_lt)
1404 val = integer_one_node;
1405 if (!min_lt)
1406 val = integer_zero_node;
1407 }
1408 else if (code == GT_EXPR)
1409 {
1410 if (min_gt)
1411 val = integer_one_node;
1412 if (!max_gt)
1413 val = integer_zero_node;
1414 }
1415 else if (code == LE_EXPR)
1416 {
1417 if (!max_gt)
1418 val = integer_one_node;
1419 if (min_gt)
1420 val = integer_zero_node;
1421 }
1422 else if (code == GE_EXPR)
1423 {
1424 if (!min_lt)
1425 val = integer_one_node;
1426 if (max_lt)
1427 val = integer_zero_node;
1428 }
1429
1430 /* If primop0 was sign-extended and unsigned comparison specd,
1431 we did a signed comparison above using the signed type bounds.
1432 But the comparison we output must be unsigned.
1433
1434 Also, for inequalities, VAL is no good; but if the signed
1435 comparison had *any* fixed result, it follows that the
1436 unsigned comparison just tests the sign in reverse
1437 (positive values are LE, negative ones GE).
1438 So we can generate an unsigned comparison
1439 against an extreme value of the signed type. */
1440
1441 if (unsignedp && !unsignedp0)
1442 {
1443 if (val != 0)
1444 switch (code)
1445 {
1446 case LT_EXPR:
1447 case GE_EXPR:
1448 primop1 = TYPE_MIN_VALUE (type);
1449 val = 0;
1450 break;
1451
1452 case LE_EXPR:
1453 case GT_EXPR:
1454 primop1 = TYPE_MAX_VALUE (type);
1455 val = 0;
1456 break;
1457 }
1458 type = unsigned_type (type);
1459 }
1460
1461 if (!max_gt && !unsignedp0 && TREE_CODE (primop1) != INTEGER_CST)
1462 {
1463 /* This is the case of (char)x >?< 0x80, which people used to use
1464 expecting old C compilers to change the 0x80 into -0x80. */
1465 if (val == integer_zero_node)
1466 warning ("comparison is always 0 due to limited range of data type");
1467 if (val == integer_one_node)
1468 warning ("comparison is always 1 due to limited range of data type");
1469 }
1470
1471 if (!min_lt && unsignedp0 && TREE_CODE (primop1) != INTEGER_CST)
1472 {
1473 /* This is the case of (unsigned char)x >?< -1 or < 0. */
1474 if (val == integer_zero_node)
1475 warning ("comparison is always 0 due to limited range of data type");
1476 if (val == integer_one_node)
1477 warning ("comparison is always 1 due to limited range of data type");
1478 }
1479
1480 if (val != 0)
1481 {
1482 /* Don't forget to evaluate PRIMOP0 if it has side effects. */
1483 if (TREE_SIDE_EFFECTS (primop0))
1484 return build (COMPOUND_EXPR, TREE_TYPE (val), primop0, val);
1485 return val;
1486 }
1487
1488 /* Value is not predetermined, but do the comparison
1489 in the type of the operand that is not constant.
1490 TYPE is already properly set. */
1491 }
1492 else if (real1 && real2
1493 && (TYPE_PRECISION (TREE_TYPE (primop0))
1494 == TYPE_PRECISION (TREE_TYPE (primop1))))
1495 type = TREE_TYPE (primop0);
1496
1497 /* If args' natural types are both narrower than nominal type
1498 and both extend in the same manner, compare them
1499 in the type of the wider arg.
1500 Otherwise must actually extend both to the nominal
1501 common type lest different ways of extending
1502 alter the result.
1503 (eg, (short)-1 == (unsigned short)-1 should be 0.) */
1504
1505 else if (unsignedp0 == unsignedp1 && real1 == real2
1506 && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr)
1507 && TYPE_PRECISION (TREE_TYPE (primop1)) < TYPE_PRECISION (*restype_ptr))
1508 {
1509 type = common_type (TREE_TYPE (primop0), TREE_TYPE (primop1));
1510 type = signed_or_unsigned_type (unsignedp0
1511 || TREE_UNSIGNED (*restype_ptr),
1512 type);
1513 /* Make sure shorter operand is extended the right way
1514 to match the longer operand. */
1515 primop0 = convert (signed_or_unsigned_type (unsignedp0, TREE_TYPE (primop0)),
1516 primop0);
1517 primop1 = convert (signed_or_unsigned_type (unsignedp1, TREE_TYPE (primop1)),
1518 primop1);
1519 }
1520 else
1521 {
1522 /* Here we must do the comparison on the nominal type
1523 using the args exactly as we received them. */
1524 type = *restype_ptr;
1525 primop0 = op0;
1526 primop1 = op1;
1527
1528 if (!real1 && !real2 && integer_zerop (primop1)
1529 && TREE_UNSIGNED (TREE_TYPE (primop0)))
1530 {
1531 tree value = 0;
1532 switch (code)
1533 {
1534 case GE_EXPR:
1535 if (extra_warnings)
1536 warning ("unsigned value >= 0 is always 1");
1537 value = integer_one_node;
1538 break;
1539
1540 case LT_EXPR:
1541 if (extra_warnings)
1542 warning ("unsigned value < 0 is always 0");
1543 value = integer_zero_node;
1544 }
1545
1546 if (value != 0)
1547 {
1548 /* Don't forget to evaluate PRIMOP0 if it has side effects. */
1549 if (TREE_SIDE_EFFECTS (primop0))
1550 return build (COMPOUND_EXPR, TREE_TYPE (value),
1551 primop0, value);
1552 return value;
1553 }
1554 }
1555 }
1556
1557 *op0_ptr = convert (type, primop0);
1558 *op1_ptr = convert (type, primop1);
1559
1560 *restype_ptr = integer_type_node;
1561
1562 return 0;
1563 }
1564 \f
1565 /* Prepare expr to be an argument of a TRUTH_NOT_EXPR,
1566 or validate its data type for an `if' or `while' statement or ?..: exp.
1567
1568 This preparation consists of taking the ordinary
1569 representation of an expression expr and producing a valid tree
1570 boolean expression describing whether expr is nonzero. We could
1571 simply always do build_binary_op (NE_EXPR, expr, integer_zero_node, 1),
1572 but we optimize comparisons, &&, ||, and !.
1573
1574 The resulting type should always be `integer_type_node'. */
1575
1576 tree
1577 truthvalue_conversion (expr)
1578 tree expr;
1579 {
1580 register enum tree_code code;
1581
1582 if (TREE_CODE (expr) == ERROR_MARK)
1583 return expr;
1584
1585 #if 0 /* This appears to be wrong for C++. */
1586 /* These really should return error_mark_node after 2.4 is stable.
1587 But not all callers handle ERROR_MARK properly. */
1588 switch (TREE_CODE (TREE_TYPE (expr)))
1589 {
1590 case RECORD_TYPE:
1591 error ("struct type value used where scalar is required");
1592 return integer_zero_node;
1593
1594 case UNION_TYPE:
1595 error ("union type value used where scalar is required");
1596 return integer_zero_node;
1597
1598 case ARRAY_TYPE:
1599 error ("array type value used where scalar is required");
1600 return integer_zero_node;
1601
1602 default:
1603 break;
1604 }
1605 #endif /* 0 */
1606
1607 switch (TREE_CODE (expr))
1608 {
1609 /* It is simpler and generates better code to have only TRUTH_*_EXPR
1610 or comparison expressions as truth values at this level. */
1611 #if 0
1612 case COMPONENT_REF:
1613 /* A one-bit unsigned bit-field is already acceptable. */
1614 if (1 == TREE_INT_CST_LOW (DECL_SIZE (TREE_OPERAND (expr, 1)))
1615 && TREE_UNSIGNED (TREE_OPERAND (expr, 1)))
1616 return expr;
1617 break;
1618 #endif
1619
1620 case EQ_EXPR:
1621 /* It is simpler and generates better code to have only TRUTH_*_EXPR
1622 or comparison expressions as truth values at this level. */
1623 #if 0
1624 if (integer_zerop (TREE_OPERAND (expr, 1)))
1625 return build_unary_op (TRUTH_NOT_EXPR, TREE_OPERAND (expr, 0), 0);
1626 #endif
1627 case NE_EXPR: case LE_EXPR: case GE_EXPR: case LT_EXPR: case GT_EXPR:
1628 case TRUTH_ANDIF_EXPR:
1629 case TRUTH_ORIF_EXPR:
1630 case TRUTH_AND_EXPR:
1631 case TRUTH_OR_EXPR:
1632 case TRUTH_XOR_EXPR:
1633 case ERROR_MARK:
1634 return expr;
1635
1636 case INTEGER_CST:
1637 return integer_zerop (expr) ? integer_zero_node : integer_one_node;
1638
1639 case REAL_CST:
1640 return real_zerop (expr) ? integer_zero_node : integer_one_node;
1641
1642 case ADDR_EXPR:
1643 if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 0)))
1644 return build (COMPOUND_EXPR, integer_type_node,
1645 TREE_OPERAND (expr, 0), integer_one_node);
1646 else
1647 return integer_one_node;
1648
1649 case COMPLEX_EXPR:
1650 return build_binary_op ((TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1))
1651 ? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR),
1652 truthvalue_conversion (TREE_OPERAND (expr, 0)),
1653 truthvalue_conversion (TREE_OPERAND (expr, 1)),
1654 0);
1655
1656 case NEGATE_EXPR:
1657 case ABS_EXPR:
1658 case FLOAT_EXPR:
1659 case FFS_EXPR:
1660 /* These don't change whether an object is non-zero or zero. */
1661 return truthvalue_conversion (TREE_OPERAND (expr, 0));
1662
1663 case LROTATE_EXPR:
1664 case RROTATE_EXPR:
1665 /* These don't change whether an object is zero or non-zero, but
1666 we can't ignore them if their second arg has side-effects. */
1667 if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1)))
1668 return build (COMPOUND_EXPR, integer_type_node, TREE_OPERAND (expr, 1),
1669 truthvalue_conversion (TREE_OPERAND (expr, 0)));
1670 else
1671 return truthvalue_conversion (TREE_OPERAND (expr, 0));
1672
1673 case COND_EXPR:
1674 /* Distribute the conversion into the arms of a COND_EXPR. */
1675 return fold (build (COND_EXPR, integer_type_node, TREE_OPERAND (expr, 0),
1676 truthvalue_conversion (TREE_OPERAND (expr, 1)),
1677 truthvalue_conversion (TREE_OPERAND (expr, 2))));
1678
1679 case CONVERT_EXPR:
1680 /* Don't cancel the effect of a CONVERT_EXPR from a REFERENCE_TYPE,
1681 since that affects how `default_conversion' will behave. */
1682 if (TREE_CODE (TREE_TYPE (expr)) == REFERENCE_TYPE
1683 || TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == REFERENCE_TYPE)
1684 break;
1685 /* fall through... */
1686 case NOP_EXPR:
1687 /* If this is widening the argument, we can ignore it. */
1688 if (TYPE_PRECISION (TREE_TYPE (expr))
1689 >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (expr, 0))))
1690 return truthvalue_conversion (TREE_OPERAND (expr, 0));
1691 break;
1692
1693 case MINUS_EXPR:
1694 /* With IEEE arithmetic, x - x may not equal 0, so we can't optimize
1695 this case. */
1696 if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
1697 && TREE_CODE (TREE_TYPE (expr)) == REAL_TYPE)
1698 break;
1699 /* fall through... */
1700 case BIT_XOR_EXPR:
1701 /* This and MINUS_EXPR can be changed into a comparison of the
1702 two objects. */
1703 if (TREE_TYPE (TREE_OPERAND (expr, 0))
1704 == TREE_TYPE (TREE_OPERAND (expr, 1)))
1705 return build_binary_op (NE_EXPR, TREE_OPERAND (expr, 0),
1706 TREE_OPERAND (expr, 1), 1);
1707 return build_binary_op (NE_EXPR, TREE_OPERAND (expr, 0),
1708 fold (build1 (NOP_EXPR,
1709 TREE_TYPE (TREE_OPERAND (expr, 0)),
1710 TREE_OPERAND (expr, 1))), 1);
1711
1712 case MODIFY_EXPR:
1713 if (warn_parentheses && C_EXP_ORIGINAL_CODE (expr) == MODIFY_EXPR)
1714 warning ("suggest parentheses around assignment used as truth value");
1715 break;
1716 }
1717
1718 if (TREE_CODE (TREE_TYPE (expr)) == COMPLEX_TYPE)
1719 return (build_binary_op
1720 ((TREE_SIDE_EFFECTS (expr)
1721 ? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR),
1722 truthvalue_conversion (build_unary_op (REALPART_EXPR, expr, 0)),
1723 truthvalue_conversion (build_unary_op (IMAGPART_EXPR, expr, 0)),
1724 0));
1725
1726 return build_binary_op (NE_EXPR, expr, integer_zero_node, 1);
1727 }
1728 \f
1729 /* Read the rest of a #-directive from input stream FINPUT.
1730 In normal use, the directive name and the white space after it
1731 have already been read, so they won't be included in the result.
1732 We allow for the fact that the directive line may contain
1733 a newline embedded within a character or string literal which forms
1734 a part of the directive.
1735
1736 The value is a string in a reusable buffer. It remains valid
1737 only until the next time this function is called. */
1738
1739 char *
1740 get_directive_line (finput)
1741 register FILE *finput;
1742 {
1743 static char *directive_buffer = NULL;
1744 static unsigned buffer_length = 0;
1745 register char *p;
1746 register char *buffer_limit;
1747 register int looking_for = 0;
1748 register int char_escaped = 0;
1749
1750 if (buffer_length == 0)
1751 {
1752 directive_buffer = (char *)xmalloc (128);
1753 buffer_length = 128;
1754 }
1755
1756 buffer_limit = &directive_buffer[buffer_length];
1757
1758 for (p = directive_buffer; ; )
1759 {
1760 int c;
1761
1762 /* Make buffer bigger if it is full. */
1763 if (p >= buffer_limit)
1764 {
1765 register unsigned bytes_used = (p - directive_buffer);
1766
1767 buffer_length *= 2;
1768 directive_buffer
1769 = (char *)xrealloc (directive_buffer, buffer_length);
1770 p = &directive_buffer[bytes_used];
1771 buffer_limit = &directive_buffer[buffer_length];
1772 }
1773
1774 c = getc (finput);
1775
1776 /* Discard initial whitespace. */
1777 if ((c == ' ' || c == '\t') && p == directive_buffer)
1778 continue;
1779
1780 /* Detect the end of the directive. */
1781 if (c == '\n' && looking_for == 0)
1782 {
1783 ungetc (c, finput);
1784 c = '\0';
1785 }
1786
1787 *p++ = c;
1788
1789 if (c == 0)
1790 return directive_buffer;
1791
1792 /* Handle string and character constant syntax. */
1793 if (looking_for)
1794 {
1795 if (looking_for == c && !char_escaped)
1796 looking_for = 0; /* Found terminator... stop looking. */
1797 }
1798 else
1799 if (c == '\'' || c == '"')
1800 looking_for = c; /* Don't stop buffering until we see another
1801 another one of these (or an EOF). */
1802
1803 /* Handle backslash. */
1804 char_escaped = (c == '\\' && ! char_escaped);
1805 }
1806 }
1807 \f
1808 /* Make a variant type in the proper way for C/C++, propagating qualifiers
1809 down to the element type of an array. */
1810
1811 tree
1812 c_build_type_variant (type, constp, volatilep)
1813 tree type;
1814 int constp, volatilep;
1815 {
1816 if (TREE_CODE (type) == ARRAY_TYPE)
1817 {
1818 tree real_main_variant = TYPE_MAIN_VARIANT (type);
1819
1820 push_obstacks (TYPE_OBSTACK (type), TYPE_OBSTACK (type));
1821 type = build_array_type (c_build_type_variant (TREE_TYPE (type),
1822 constp, volatilep),
1823 TYPE_DOMAIN (type));
1824 TYPE_MAIN_VARIANT (type) = real_main_variant;
1825 pop_obstacks ();
1826 }
1827 return build_type_variant (type, constp, volatilep);
1828 }
This page took 0.146203 seconds and 6 git commands to generate.