tree.c revision 1.336 1 /* $NetBSD: tree.c,v 1.336 2021/08/15 14:26:39 rillig Exp $ */
2
3 /*
4 * Copyright (c) 1994, 1995 Jochen Pohl
5 * All Rights Reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed by Jochen Pohl for
18 * The NetBSD Project.
19 * 4. The name of the author may not be used to endorse or promote products
20 * derived from this software without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34 #if HAVE_NBTOOL_CONFIG_H
35 #include "nbtool_config.h"
36 #endif
37
38 #include <sys/cdefs.h>
39 #if defined(__RCSID) && !defined(lint)
40 __RCSID("$NetBSD: tree.c,v 1.336 2021/08/15 14:26:39 rillig Exp $");
41 #endif
42
43 #include <float.h>
44 #include <limits.h>
45 #include <math.h>
46 #include <signal.h>
47 #include <stdlib.h>
48 #include <string.h>
49
50 #include "lint1.h"
51 #include "cgram.h"
52
53 static tnode_t *build_integer_constant(tspec_t, int64_t);
54 static void check_pointer_comparison(op_t,
55 const tnode_t *, const tnode_t *);
56 static bool check_assign_types_compatible(op_t, int,
57 const tnode_t *, const tnode_t *);
58 static void check_bad_enum_operation(op_t,
59 const tnode_t *, const tnode_t *);
60 static void check_enum_type_mismatch(op_t, int,
61 const tnode_t *, const tnode_t *);
62 static void check_enum_int_mismatch(op_t, int,
63 const tnode_t *, const tnode_t *);
64 static tnode_t *new_tnode(op_t, type_t *, tnode_t *, tnode_t *);
65 static void balance(op_t, tnode_t **, tnode_t **);
66 static void warn_incompatible_types(op_t, const type_t *, tspec_t,
67 const type_t *, tspec_t);
68 static void warn_incompatible_pointers(const mod_t *,
69 const type_t *, const type_t *);
70 static bool has_constant_member(const type_t *);
71 static void check_prototype_conversion(int, tspec_t, tspec_t, type_t *,
72 tnode_t *);
73 static void check_integer_conversion(op_t, int, tspec_t, tspec_t, type_t *,
74 tnode_t *);
75 static void check_pointer_integer_conversion(op_t, tspec_t, type_t *,
76 tnode_t *);
77 static void check_pointer_conversion(tnode_t *, type_t *);
78 static tnode_t *build_struct_access(op_t, tnode_t *, tnode_t *);
79 static tnode_t *build_prepost_incdec(op_t, tnode_t *);
80 static tnode_t *build_real_imag(op_t, tnode_t *);
81 static tnode_t *build_address(tnode_t *, bool);
82 static tnode_t *build_plus_minus(op_t, tnode_t *, tnode_t *);
83 static tnode_t *build_bit_shift(op_t, tnode_t *, tnode_t *);
84 static tnode_t *build_colon(tnode_t *, tnode_t *);
85 static tnode_t *build_assignment(op_t, tnode_t *, tnode_t *);
86 static tnode_t *plength(type_t *);
87 static tnode_t *fold(tnode_t *);
88 static tnode_t *fold_test(tnode_t *);
89 static tnode_t *fold_float(tnode_t *);
90 static tnode_t *check_function_arguments(type_t *, tnode_t *);
91 static tnode_t *check_prototype_argument(int, type_t *, tnode_t *);
92 static void check_null_effect(const tnode_t *);
93 static void check_array_index(tnode_t *, bool);
94 static void check_integer_comparison(op_t, tnode_t *, tnode_t *);
95 static void check_precedence_confusion(tnode_t *);
96
97 extern sig_atomic_t fpe;
98
99 static const char *
100 op_name(op_t op)
101 {
102 return modtab[op].m_name;
103 }
104
105 /* Build 'pointer to tp', 'array of tp' or 'function returning tp'. */
106 type_t *
107 derive_type(type_t *tp, tspec_t t)
108 {
109 type_t *tp2;
110
111 tp2 = getblk(sizeof(*tp2));
112 tp2->t_tspec = t;
113 tp2->t_subt = tp;
114 return tp2;
115 }
116
117 /*
118 * Build 'pointer to tp', 'array of tp' or 'function returning tp'. The
119 * memory is freed at the end of the current expression.
120 */
121 type_t *
122 expr_derive_type(type_t *tp, tspec_t t)
123 {
124 type_t *tp2;
125
126 tp2 = expr_zalloc(sizeof(*tp2));
127 tp2->t_tspec = t;
128 tp2->t_subt = tp;
129 return tp2;
130 }
131
132 /*
133 * Create a node for a constant.
134 */
135 tnode_t *
136 build_constant(type_t *tp, val_t *v)
137 {
138 tnode_t *n;
139
140 n = expr_zalloc_tnode();
141 n->tn_op = CON;
142 n->tn_type = tp;
143 n->tn_val = expr_zalloc(sizeof(*n->tn_val));
144 n->tn_val->v_tspec = tp->t_tspec;
145 n->tn_val->v_unsigned_since_c90 = v->v_unsigned_since_c90;
146 n->tn_val->v_u = v->v_u;
147 free(v);
148 return n;
149 }
150
151 static tnode_t *
152 build_integer_constant(tspec_t t, int64_t q)
153 {
154 tnode_t *n;
155
156 n = expr_zalloc_tnode();
157 n->tn_op = CON;
158 n->tn_type = gettyp(t);
159 n->tn_val = expr_zalloc(sizeof(*n->tn_val));
160 n->tn_val->v_tspec = t;
161 n->tn_val->v_quad = q;
162 return n;
163 }
164
165 static void
166 fallback_symbol(sym_t *sym)
167 {
168
169 if (fallback_symbol_strict_bool(sym))
170 return;
171
172 if (block_level > 0 && (strcmp(sym->s_name, "__FUNCTION__") == 0 ||
173 strcmp(sym->s_name, "__PRETTY_FUNCTION__") == 0)) {
174 /* __FUNCTION__/__PRETTY_FUNCTION__ is a GCC extension */
175 gnuism(316);
176 sym->s_type = derive_type(gettyp(CHAR), PTR);
177 sym->s_type->t_const = true;
178 return;
179 }
180
181 if (block_level > 0 && strcmp(sym->s_name, "__func__") == 0) {
182 if (!Sflag)
183 /* __func__ is a C9X feature */
184 warning(317);
185 sym->s_type = derive_type(gettyp(CHAR), PTR);
186 sym->s_type->t_const = true;
187 return;
188 }
189
190 /* '%s' undefined */
191 error(99, sym->s_name);
192 }
193
194 /* https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html */
195 static bool
196 is_gcc_builtin(const char *name)
197 {
198 return strncmp(name, "__atomic_", 9) == 0 ||
199 strncmp(name, "__builtin_", 10) == 0;
200 }
201
202 /*
203 * Create a node for a name (symbol table entry).
204 * follow_token is the token which follows the name.
205 */
206 tnode_t *
207 build_name(sym_t *sym, int follow_token)
208 {
209 tnode_t *n;
210
211 if (sym->s_scl == NOSCL) {
212 sym->s_scl = EXTERN;
213 sym->s_def = DECL;
214 if (follow_token == T_LPAREN) {
215 if (gflag && is_gcc_builtin(sym->s_name)) {
216 /*
217 * Do not warn about these, just assume that
218 * they are regular functions compatible with
219 * non-prototype calling conventions.
220 */
221 } else if (Sflag) {
222 /* function '%s' implicitly declared to ... */
223 warning(215, sym->s_name);
224 } else if (sflag) {
225 /* function '%s' implicitly declared to ... */
226 warning(215, sym->s_name);
227 }
228 /*
229 * XXX if tflag is set the symbol should be
230 * exported to level 0
231 */
232 sym->s_type = derive_type(sym->s_type, FUNC);
233 } else {
234 fallback_symbol(sym);
235 }
236 }
237
238 lint_assert(sym->s_kind == FVFT || sym->s_kind == FMEMBER);
239
240 n = expr_zalloc_tnode();
241 n->tn_type = sym->s_type;
242 if (sym->s_scl != CTCONST) {
243 n->tn_op = NAME;
244 n->tn_sym = sym;
245 if (sym->s_kind == FVFT && sym->s_type->t_tspec != FUNC)
246 n->tn_lvalue = true;
247 } else {
248 n->tn_op = CON;
249 n->tn_val = expr_zalloc(sizeof(*n->tn_val));
250 *n->tn_val = sym->s_value;
251 }
252
253 return n;
254 }
255
256 tnode_t *
257 build_string(strg_t *strg)
258 {
259 size_t len;
260 tnode_t *n;
261
262 len = strg->st_len;
263
264 n = expr_zalloc_tnode();
265
266 n->tn_op = STRING;
267 n->tn_type = expr_derive_type(gettyp(strg->st_tspec), ARRAY);
268 n->tn_type->t_dim = len + 1;
269 n->tn_lvalue = true;
270
271 n->tn_string = expr_zalloc(sizeof(*n->tn_string));
272 n->tn_string->st_tspec = strg->st_tspec;
273 n->tn_string->st_len = len;
274
275 if (strg->st_tspec == CHAR) {
276 n->tn_string->st_cp = expr_zalloc(len + 1);
277 (void)memcpy(n->tn_string->st_cp, strg->st_cp, len + 1);
278 free(strg->st_cp);
279 } else {
280 size_t size = (len + 1) * sizeof(*n->tn_string->st_wcp);
281 n->tn_string->st_wcp = expr_zalloc(size);
282 (void)memcpy(n->tn_string->st_wcp, strg->st_wcp, size);
283 free(strg->st_wcp);
284 }
285 free(strg);
286
287 return n;
288 }
289
290 /*
291 * Returns a symbol which has the same name as the msym argument and is a
292 * member of the struct or union specified by the tn argument.
293 */
294 sym_t *
295 struct_or_union_member(tnode_t *tn, op_t op, sym_t *msym)
296 {
297 struct_or_union *str;
298 type_t *tp;
299 sym_t *sym, *csym;
300 bool eq;
301 tspec_t t;
302
303 /*
304 * Remove the member if it was unknown until now, which means
305 * that no defined struct or union has a member with the same name.
306 */
307 if (msym->s_scl == NOSCL) {
308 /* type '%s' does not have member '%s' */
309 error(101, type_name(tn->tn_type), msym->s_name);
310 rmsym(msym);
311 msym->s_kind = FMEMBER;
312 msym->s_scl = MOS;
313 msym->s_styp = expr_zalloc(sizeof(*msym->s_styp));
314 msym->s_styp->sou_tag = expr_zalloc(
315 sizeof(*msym->s_styp->sou_tag));
316 msym->s_styp->sou_tag->s_name = unnamed;
317 msym->s_value.v_tspec = INT;
318 return msym;
319 }
320
321 /* Set str to the tag of which msym is expected to be a member. */
322 str = NULL;
323 t = (tp = tn->tn_type)->t_tspec;
324 if (op == POINT) {
325 if (t == STRUCT || t == UNION)
326 str = tp->t_str;
327 } else if (op == ARROW && t == PTR) {
328 t = (tp = tp->t_subt)->t_tspec;
329 if (t == STRUCT || t == UNION)
330 str = tp->t_str;
331 }
332
333 /*
334 * If this struct/union has a member with the name of msym, return it.
335 */
336 if (str != NULL) {
337 for (sym = msym; sym != NULL; sym = sym->s_link) {
338 if (sym->s_scl != MOS && sym->s_scl != MOU)
339 continue;
340 if (sym->s_styp != str)
341 continue;
342 if (strcmp(sym->s_name, msym->s_name) != 0)
343 continue;
344 return sym;
345 }
346 }
347
348 /*
349 * Set eq to false if there are struct/union members with the same
350 * name and different types and/or offsets.
351 */
352 eq = true;
353 for (csym = msym; csym != NULL; csym = csym->s_link) {
354 if (csym->s_scl != MOS && csym->s_scl != MOU)
355 continue;
356 if (strcmp(msym->s_name, csym->s_name) != 0)
357 continue;
358 for (sym = csym->s_link ; sym != NULL; sym = sym->s_link) {
359 bool w;
360
361 if (sym->s_scl != MOS && sym->s_scl != MOU)
362 continue;
363 if (strcmp(csym->s_name, sym->s_name) != 0)
364 continue;
365 if (csym->s_value.v_quad != sym->s_value.v_quad) {
366 eq = false;
367 break;
368 }
369 w = false;
370 eq = eqtype(csym->s_type, sym->s_type,
371 false, false, &w) && !w;
372 if (!eq)
373 break;
374 if (csym->s_bitfield != sym->s_bitfield) {
375 eq = false;
376 break;
377 }
378 if (csym->s_bitfield) {
379 type_t *tp1, *tp2;
380
381 tp1 = csym->s_type;
382 tp2 = sym->s_type;
383 if (tp1->t_flen != tp2->t_flen) {
384 eq = false;
385 break;
386 }
387 if (tp1->t_foffs != tp2->t_foffs) {
388 eq = false;
389 break;
390 }
391 }
392 }
393 if (!eq)
394 break;
395 }
396
397 /*
398 * Now handle the case in which the left operand refers really
399 * to a struct/union, but the right operand is not member of it.
400 */
401 if (str != NULL) {
402 if (eq && tflag) {
403 /* illegal member use: %s */
404 warning(102, msym->s_name);
405 } else {
406 /* illegal member use: %s */
407 error(102, msym->s_name);
408 }
409 return msym;
410 }
411
412 /*
413 * Now the left operand of ARROW does not point to a struct/union
414 * or the left operand of POINT is no struct/union.
415 */
416 if (eq) {
417 if (op == POINT) {
418 if (tflag) {
419 /* left operand of '.' must be struct ... */
420 warning(103, type_name(tn->tn_type));
421 } else {
422 /* left operand of '.' must be struct ... */
423 error(103, type_name(tn->tn_type));
424 }
425 } else {
426 if (tflag && tn->tn_type->t_tspec == PTR) {
427 /* left operand of '->' must be pointer ... */
428 warning(104, type_name(tn->tn_type));
429 } else {
430 /* left operand of '->' must be pointer ... */
431 error(104, type_name(tn->tn_type));
432 }
433 }
434 } else {
435 if (tflag) {
436 /* non-unique member requires struct/union %s */
437 error(105, op == POINT ? "object" : "pointer");
438 } else {
439 /* unacceptable operand of '%s' */
440 error(111, op_name(op));
441 }
442 }
443
444 return msym;
445 }
446
447 tnode_t *
448 build_generic_selection(const tnode_t *expr,
449 struct generic_association *sel)
450 {
451 tnode_t *default_result = NULL;
452
453 for (; sel != NULL; sel = sel->ga_prev)
454 if (expr != NULL &&
455 eqtype(sel->ga_arg, expr->tn_type, false, false, NULL))
456 return sel->ga_result;
457 else if (sel->ga_arg == NULL)
458 default_result = sel->ga_result;
459 return default_result;
460 }
461
462 /*
463 * Create a tree node. Called for most operands except function calls,
464 * sizeof and casts.
465 *
466 * op operator
467 * ln left operand
468 * rn if not NULL, right operand
469 */
470 tnode_t *
471 build_binary(tnode_t *ln, op_t op, tnode_t *rn)
472 {
473 const mod_t *mp;
474 tnode_t *ntn;
475 type_t *rettp;
476
477 mp = &modtab[op];
478
479 /* If there was an error in one of the operands, return. */
480 if (ln == NULL || (mp->m_binary && rn == NULL))
481 return NULL;
482
483 /*
484 * Apply class conversions to the left operand, but only if its
485 * value is needed or it is compared with null.
486 */
487 if (mp->m_left_value_context || mp->m_left_test_context)
488 ln = cconv(ln);
489 /*
490 * The right operand is almost always in a test or value context,
491 * except if it is a struct or union member.
492 */
493 if (mp->m_binary && op != ARROW && op != POINT)
494 rn = cconv(rn);
495
496 /*
497 * Print some warnings for comparisons of unsigned values with
498 * constants lower than or equal to null. This must be done
499 * before promote() because otherwise unsigned char and unsigned
500 * short would be promoted to int. Also types are tested to be
501 * CHAR, which would also become int.
502 */
503 if (mp->m_comparison)
504 check_integer_comparison(op, ln, rn);
505
506 /*
507 * Promote the left operand if it is in a test or value context
508 */
509 if (mp->m_left_value_context || mp->m_left_test_context)
510 ln = promote(op, false, ln);
511 /*
512 * Promote the right operand, but only if it is no struct or
513 * union member, or if it is not to be assigned to the left operand
514 */
515 if (mp->m_binary && op != ARROW && op != POINT &&
516 op != ASSIGN && op != RETURN && op != INIT) {
517 rn = promote(op, false, rn);
518 }
519
520 /*
521 * If the result of the operation is different for signed or
522 * unsigned operands and one of the operands is signed only in
523 * ANSI C, print a warning.
524 */
525 if (mp->m_warn_if_left_unsigned_in_c90 &&
526 ln->tn_op == CON && ln->tn_val->v_unsigned_since_c90) {
527 /* ANSI C treats constant as unsigned, op %s */
528 warning(218, mp->m_name);
529 ln->tn_val->v_unsigned_since_c90 = false;
530 }
531 if (mp->m_warn_if_right_unsigned_in_c90 &&
532 rn->tn_op == CON && rn->tn_val->v_unsigned_since_c90) {
533 /* ANSI C treats constant as unsigned, op %s */
534 warning(218, mp->m_name);
535 rn->tn_val->v_unsigned_since_c90 = false;
536 }
537
538 /* Make sure both operands are of the same type */
539 if (mp->m_balance_operands || (tflag && (op == SHL || op == SHR)))
540 balance(op, &ln, &rn);
541
542 /*
543 * Check types for compatibility with the operation and mutual
544 * compatibility. Return if there are serious problems.
545 */
546 if (!typeok(op, 0, ln, rn))
547 return NULL;
548
549 /* And now create the node. */
550 switch (op) {
551 case POINT:
552 case ARROW:
553 ntn = build_struct_access(op, ln, rn);
554 break;
555 case INCAFT:
556 case DECAFT:
557 case INCBEF:
558 case DECBEF:
559 ntn = build_prepost_incdec(op, ln);
560 break;
561 case ADDR:
562 ntn = build_address(ln, false);
563 break;
564 case INDIR:
565 ntn = new_tnode(INDIR, ln->tn_type->t_subt, ln, NULL);
566 break;
567 case PLUS:
568 case MINUS:
569 ntn = build_plus_minus(op, ln, rn);
570 break;
571 case SHL:
572 case SHR:
573 ntn = build_bit_shift(op, ln, rn);
574 break;
575 case COLON:
576 ntn = build_colon(ln, rn);
577 break;
578 case ASSIGN:
579 case MULASS:
580 case DIVASS:
581 case MODASS:
582 case ADDASS:
583 case SUBASS:
584 case SHLASS:
585 case SHRASS:
586 case ANDASS:
587 case XORASS:
588 case ORASS:
589 case RETURN:
590 case INIT:
591 ntn = build_assignment(op, ln, rn);
592 break;
593 case COMMA:
594 case QUEST:
595 ntn = new_tnode(op, rn->tn_type, ln, rn);
596 break;
597 case REAL:
598 case IMAG:
599 ntn = build_real_imag(op, ln);
600 break;
601 default:
602 rettp = mp->m_returns_bool
603 ? gettyp(Tflag ? BOOL : INT) : ln->tn_type;
604 lint_assert(mp->m_binary || rn == NULL);
605 ntn = new_tnode(op, rettp, ln, rn);
606 break;
607 }
608
609 /* Return if an error occurred. */
610 if (ntn == NULL)
611 return NULL;
612
613 /* Print a warning if precedence confusion is possible */
614 if (mp->m_possible_precedence_confusion)
615 check_precedence_confusion(ntn);
616
617 /*
618 * Print a warning if one of the operands is in a context where
619 * it is compared with null and if this operand is a constant.
620 */
621 if (mp->m_left_test_context) {
622 if (ln->tn_op == CON ||
623 ((mp->m_binary && op != QUEST) && rn->tn_op == CON)) {
624 if (hflag && !constcond_flag &&
625 !ln->tn_system_dependent)
626 /* constant in conditional context */
627 warning(161);
628 }
629 }
630
631 /* Fold if the operator requires it */
632 if (mp->m_fold_constant_operands) {
633 if (ln->tn_op == CON && (!mp->m_binary || rn->tn_op == CON)) {
634 if (mp->m_left_test_context) {
635 ntn = fold_test(ntn);
636 } else if (is_floating(ntn->tn_type->t_tspec)) {
637 ntn = fold_float(ntn);
638 } else {
639 ntn = fold(ntn);
640 }
641 } else if (op == QUEST && ln->tn_op == CON) {
642 ntn = ln->tn_val->v_quad != 0
643 ? rn->tn_left : rn->tn_right;
644 }
645 }
646
647 return ntn;
648 }
649
650 tnode_t *
651 build_unary(op_t op, tnode_t *tn)
652 {
653 return build_binary(tn, op, NULL);
654 }
655
656 tnode_t *
657 build_member_access(tnode_t *ln, op_t op, sbuf_t *member)
658 {
659 sym_t *msym;
660
661 if (ln == NULL)
662 return NULL;
663
664 if (op == ARROW) {
665 /* must do this before struct_or_union_member is called */
666 ln = cconv(ln);
667 }
668 msym = struct_or_union_member(ln, op, getsym(member));
669 return build_binary(ln, op, build_name(msym, 0));
670 }
671
672 /*
673 * Perform class conversions.
674 *
675 * Arrays of type T are converted into pointers to type T.
676 * Functions are converted to pointers to functions.
677 * Lvalues are converted to rvalues.
678 *
679 * C99 6.3 "Conversions"
680 * C99 6.3.2 "Other operands"
681 * C99 6.3.2.1 "Lvalues, arrays, and function designators"
682 */
683 tnode_t *
684 cconv(tnode_t *tn)
685 {
686 type_t *tp;
687
688 /*
689 * Array-lvalue (array of type T) is converted into rvalue
690 * (pointer to type T)
691 */
692 if (tn->tn_type->t_tspec == ARRAY) {
693 if (!tn->tn_lvalue) {
694 /* XXX print correct operator */
695 /* %soperand of '%s' must be lvalue */
696 gnuism(114, "", op_name(ADDR));
697 }
698 tn = new_tnode(ADDR,
699 expr_derive_type(tn->tn_type->t_subt, PTR), tn, NULL);
700 }
701
702 /*
703 * Expression of type function (function with return value of type T)
704 * in rvalue-expression (pointer to function with return value
705 * of type T)
706 */
707 if (tn->tn_type->t_tspec == FUNC)
708 tn = build_address(tn, true);
709
710 /* lvalue to rvalue */
711 if (tn->tn_lvalue) {
712 tp = expr_dup_type(tn->tn_type);
713 /* C99 6.3.2.1p2 sentence 2 says to remove the qualifiers. */
714 tp->t_const = tp->t_volatile = false;
715 tn = new_tnode(LOAD, tp, tn, NULL);
716 }
717
718 return tn;
719 }
720
721 const tnode_t *
722 before_conversion(const tnode_t *tn)
723 {
724 while (tn->tn_op == CVT && !tn->tn_cast)
725 tn = tn->tn_left;
726 return tn;
727 }
728
729 static bool
730 is_null_pointer(const tnode_t *tn)
731 {
732 tspec_t t = tn->tn_type->t_tspec;
733
734 return ((t == PTR && tn->tn_type->t_subt->t_tspec == VOID) ||
735 is_integer(t))
736 && (tn->tn_op == CON && tn->tn_val->v_quad == 0);
737 }
738
739 static bool
740 typeok_incdec(op_t op, const tnode_t *tn, const type_t *tp)
741 {
742 /* operand has scalar type (checked in typeok) */
743 if (!tn->tn_lvalue) {
744 if (tn->tn_op == CVT && tn->tn_cast &&
745 tn->tn_left->tn_op == LOAD) {
746 /* a cast does not yield an lvalue */
747 error(163);
748 }
749 /* %soperand of '%s' must be lvalue */
750 error(114, "", op_name(op));
751 return false;
752 } else if (tp->t_const) {
753 if (!tflag)
754 /* %soperand of '%s' must be modifiable lvalue */
755 warning(115, "", op_name(op));
756 }
757 return true;
758 }
759
760 static bool
761 typeok_address(const mod_t *mp,
762 const tnode_t *tn, const type_t *tp, tspec_t t)
763 {
764 if (t == ARRAY || t == FUNC) {
765 /* ok, a warning comes later (in build_address()) */
766 } else if (!tn->tn_lvalue) {
767 if (tn->tn_op == CVT && tn->tn_cast &&
768 tn->tn_left->tn_op == LOAD) {
769 /* a cast does not yield an lvalue */
770 error(163);
771 }
772 /* %soperand of '%s' must be lvalue */
773 error(114, "", mp->m_name);
774 return false;
775 } else if (is_scalar(t)) {
776 if (tp->t_bitfield) {
777 /* cannot take address of bit-field */
778 error(112);
779 return false;
780 }
781 } else if (t != STRUCT && t != UNION) {
782 /* unacceptable operand of '%s' */
783 error(111, mp->m_name);
784 return false;
785 }
786 if (tn->tn_op == NAME && tn->tn_sym->s_reg) {
787 /* cannot take address of register %s */
788 error(113, tn->tn_sym->s_name);
789 return false;
790 }
791 return true;
792 }
793
794 static bool
795 typeok_star(tspec_t t)
796 {
797 /* until now there were no type checks for this operator */
798 if (t != PTR) {
799 /* cannot dereference non-pointer type */
800 error(96);
801 return false;
802 }
803 return true;
804 }
805
806 static bool
807 typeok_plus(op_t op,
808 const type_t *ltp, tspec_t lt,
809 const type_t *rtp, tspec_t rt)
810 {
811 /* operands have scalar types (checked above) */
812 if ((lt == PTR && !is_integer(rt)) || (rt == PTR && !is_integer(lt))) {
813 warn_incompatible_types(op, ltp, lt, rtp, rt);
814 return false;
815 }
816 return true;
817 }
818
819 static bool
820 typeok_minus(op_t op,
821 const type_t *ltp, tspec_t lt,
822 const type_t *rtp, tspec_t rt)
823 {
824 /* operands have scalar types (checked above) */
825 if (lt == PTR && (!is_integer(rt) && rt != PTR)) {
826 warn_incompatible_types(op, ltp, lt, rtp, rt);
827 return false;
828 } else if (rt == PTR && lt != PTR) {
829 warn_incompatible_types(op, ltp, lt, rtp, rt);
830 return false;
831 }
832 if (lt == PTR && rt == PTR) {
833 if (!eqtype(ltp->t_subt, rtp->t_subt, true, false, NULL)) {
834 /* illegal pointer subtraction */
835 error(116);
836 }
837 }
838 return true;
839 }
840
841 static void
842 typeok_shr(const mod_t *mp,
843 const tnode_t *ln, tspec_t lt,
844 const tnode_t *rn, tspec_t rt)
845 {
846 tspec_t olt, ort;
847
848 olt = before_conversion(ln)->tn_type->t_tspec;
849 ort = before_conversion(rn)->tn_type->t_tspec;
850
851 /* operands have integer types (checked above) */
852 if (pflag && !is_uinteger(olt)) {
853 /*
854 * The left operand is signed. This means that
855 * the operation is (possibly) nonportable.
856 */
857 if (ln->tn_op != CON) {
858 /* bitwise '%s' on signed value possibly nonportable */
859 warning(117, mp->m_name);
860 } else if (ln->tn_val->v_quad < 0) {
861 /* bitwise '%s' on signed value nonportable */
862 warning(120, mp->m_name);
863 }
864 } else if (!tflag && !sflag && !is_uinteger(olt) && is_uinteger(ort)) {
865 /*
866 * The left operand would become unsigned in
867 * traditional C.
868 */
869 if (hflag && !Sflag &&
870 (ln->tn_op != CON || ln->tn_val->v_quad < 0)) {
871 /* semantics of '%s' change in ANSI C; use ... */
872 warning(118, mp->m_name);
873 }
874 } else if (!tflag && !sflag && !is_uinteger(olt) && !is_uinteger(ort) &&
875 portable_size_in_bits(lt) < portable_size_in_bits(rt)) {
876 /*
877 * In traditional C the left operand would be extended,
878 * possibly with 1, and then shifted.
879 */
880 if (hflag && !Sflag &&
881 (ln->tn_op != CON || ln->tn_val->v_quad < 0)) {
882 /* semantics of '%s' change in ANSI C; use ... */
883 warning(118, mp->m_name);
884 }
885 }
886 }
887
888 static void
889 typeok_shl(const mod_t *mp, tspec_t lt, tspec_t rt)
890 {
891 /*
892 * C90 does not perform balancing for shift operations,
893 * but traditional C does. If the width of the right operand
894 * is greater than the width of the left operand, then in
895 * traditional C the left operand would be extended to the
896 * width of the right operand. For SHL this may result in
897 * different results.
898 */
899 if (portable_size_in_bits(lt) < portable_size_in_bits(rt)) {
900 /*
901 * XXX If both operands are constant, make sure
902 * that there is really a difference between
903 * ANSI C and traditional C.
904 */
905 if (hflag && !Sflag)
906 /* semantics of '%s' change in ANSI C; use ... */
907 warning(118, mp->m_name);
908 }
909 }
910
911 static void
912 typeok_shift(tspec_t lt, const tnode_t *rn, tspec_t rt)
913 {
914 if (rn->tn_op != CON)
915 return;
916
917 if (!is_uinteger(rt) && rn->tn_val->v_quad < 0) {
918 /* negative shift */
919 warning(121);
920 } else if ((uint64_t)rn->tn_val->v_quad ==
921 (uint64_t)size_in_bits(lt)) {
922 /* shift equal to size of object */
923 warning(267);
924 } else if ((uint64_t)rn->tn_val->v_quad > (uint64_t)size_in_bits(lt)) {
925 /* shift amount %llu is greater than bit-size %llu of '%s' */
926 warning(122, (unsigned long long)rn->tn_val->v_quad,
927 (unsigned long long)size_in_bits(lt),
928 tspec_name(lt));
929 }
930 }
931
932 static bool
933 is_typeok_eq(const tnode_t *ln, tspec_t lt, const tnode_t *rn, tspec_t rt)
934 {
935 if (lt == PTR && is_null_pointer(rn))
936 return true;
937 if (rt == PTR && is_null_pointer(ln))
938 return true;
939 return false;
940 }
941
942 static bool
943 typeok_ordered_comparison(op_t op,
944 const tnode_t *ln, const type_t *ltp, tspec_t lt,
945 const tnode_t *rn, const type_t *rtp, tspec_t rt)
946 {
947 if (lt == PTR && rt == PTR) {
948 check_pointer_comparison(op, ln, rn);
949 return true;
950 }
951
952 if (lt != PTR && rt != PTR)
953 return true;
954
955 if (!is_integer(lt) && !is_integer(rt)) {
956 warn_incompatible_types(op, ltp, lt, rtp, rt);
957 return false;
958 }
959
960 const char *lx = lt == PTR ? "pointer" : "integer";
961 const char *rx = rt == PTR ? "pointer" : "integer";
962 /* illegal combination of %s (%s) and %s (%s), op %s */
963 warning(123, lx, type_name(ltp), rx, type_name(rtp), op_name(op));
964 return true;
965 }
966
967 static bool
968 typeok_quest(tspec_t lt, const tnode_t **rn)
969 {
970 if (!is_scalar(lt)) {
971 /* first operand must have scalar type, op ? : */
972 error(170);
973 return false;
974 }
975 while ((*rn)->tn_op == CVT)
976 *rn = (*rn)->tn_left;
977 lint_assert((*rn)->tn_op == COLON);
978 return true;
979 }
980
981 static void
982 typeok_colon_pointer(const mod_t *mp, const type_t *ltp, const type_t *rtp)
983 {
984 type_t *lstp = ltp->t_subt;
985 type_t *rstp = rtp->t_subt;
986 tspec_t lst = lstp->t_tspec;
987 tspec_t rst = rstp->t_tspec;
988
989 if ((lst == VOID && rst == FUNC) || (lst == FUNC && rst == VOID)) {
990 /* (void *)0 handled above */
991 if (sflag)
992 /* ANSI C forbids conv. of %s to %s, op %s */
993 warning(305, "function pointer", "'void *'",
994 mp->m_name);
995 return;
996 }
997
998 if (eqptrtype(lstp, rstp, true))
999 return;
1000 if (!eqtype(lstp, rstp, true, false, NULL))
1001 warn_incompatible_pointers(mp, ltp, rtp);
1002 }
1003
1004 static bool
1005 typeok_colon(const mod_t *mp,
1006 const tnode_t *ln, const type_t *ltp, tspec_t lt,
1007 const tnode_t *rn, const type_t *rtp, tspec_t rt)
1008 {
1009
1010 if (is_arithmetic(lt) && is_arithmetic(rt))
1011 return true;
1012 if (lt == BOOL && rt == BOOL)
1013 return true;
1014
1015 if (lt == STRUCT && rt == STRUCT && ltp->t_str == rtp->t_str)
1016 return true;
1017 if (lt == UNION && rt == UNION && ltp->t_str == rtp->t_str)
1018 return true;
1019
1020 if (lt == PTR && is_null_pointer(rn))
1021 return true;
1022 if (rt == PTR && is_null_pointer(ln))
1023 return true;
1024
1025 if ((lt == PTR && is_integer(rt)) || (is_integer(lt) && rt == PTR)) {
1026 const char *lx = lt == PTR ? "pointer" : "integer";
1027 const char *rx = rt == PTR ? "pointer" : "integer";
1028 /* illegal combination of %s (%s) and %s (%s), op %s */
1029 warning(123, lx, type_name(ltp),
1030 rx, type_name(rtp), mp->m_name);
1031 return true;
1032 }
1033
1034 if (lt == VOID || rt == VOID) {
1035 if (lt != VOID || rt != VOID)
1036 /* incompatible types '%s' and '%s' in conditional */
1037 warning(126, type_name(ltp), type_name(rtp));
1038 return true;
1039 }
1040
1041 if (lt == PTR && rt == PTR) {
1042 typeok_colon_pointer(mp, ltp, rtp);
1043 return true;
1044 }
1045
1046 /* incompatible types '%s' and '%s' in conditional */
1047 error(126, type_name(ltp), type_name(rtp));
1048 return false;
1049 }
1050
1051 static bool
1052 typeok_assign(op_t op, const tnode_t *ln, const type_t *ltp, tspec_t lt)
1053 {
1054 if (op == RETURN || op == INIT || op == FARG)
1055 return true;
1056
1057 if (!ln->tn_lvalue) {
1058 if (ln->tn_op == CVT && ln->tn_cast &&
1059 ln->tn_left->tn_op == LOAD) {
1060 /* a cast does not yield an lvalue */
1061 error(163);
1062 }
1063 /* %soperand of '%s' must be lvalue */
1064 error(114, "left ", op_name(op));
1065 return false;
1066 } else if (ltp->t_const || ((lt == STRUCT || lt == UNION) &&
1067 has_constant_member(ltp))) {
1068 if (!tflag)
1069 /* %soperand of '%s' must be modifiable lvalue */
1070 warning(115, "left ", op_name(op));
1071 }
1072 return true;
1073 }
1074
1075 /* Check the types using the information from modtab[]. */
1076 static bool
1077 typeok_scalar(op_t op, const mod_t *mp,
1078 const type_t *ltp, tspec_t lt,
1079 const type_t *rtp, tspec_t rt)
1080 {
1081 if (mp->m_takes_bool && lt == BOOL && rt == BOOL)
1082 return true;
1083 if (mp->m_requires_integer) {
1084 if (!is_integer(lt) || (mp->m_binary && !is_integer(rt))) {
1085 warn_incompatible_types(op, ltp, lt, rtp, rt);
1086 return false;
1087 }
1088 } else if (mp->m_requires_integer_or_complex) {
1089 if ((!is_integer(lt) && !is_complex(lt)) ||
1090 (mp->m_binary && (!is_integer(rt) && !is_complex(rt)))) {
1091 warn_incompatible_types(op, ltp, lt, rtp, rt);
1092 return false;
1093 }
1094 } else if (mp->m_requires_scalar) {
1095 if (!is_scalar(lt) || (mp->m_binary && !is_scalar(rt))) {
1096 warn_incompatible_types(op, ltp, lt, rtp, rt);
1097 return false;
1098 }
1099 } else if (mp->m_requires_arith) {
1100 if (!is_arithmetic(lt) ||
1101 (mp->m_binary && !is_arithmetic(rt))) {
1102 warn_incompatible_types(op, ltp, lt, rtp, rt);
1103 return false;
1104 }
1105 }
1106 return true;
1107 }
1108
1109 /* Check the types for specific operators and type combinations. */
1110 static bool
1111 typeok_op(op_t op, const mod_t *mp, int arg,
1112 const tnode_t *ln, const type_t *ltp, tspec_t lt,
1113 const tnode_t *rn, const type_t *rtp, tspec_t rt)
1114 {
1115 switch (op) {
1116 case POINT:
1117 /*
1118 * Most errors required by ANSI C are reported in
1119 * struct_or_union_member().
1120 * Here we only must check for totally wrong things.
1121 */
1122 if (lt == FUNC || lt == VOID || ltp->t_bitfield ||
1123 ((lt != STRUCT && lt != UNION) && !ln->tn_lvalue)) {
1124 /* Without tflag we got already an error */
1125 if (tflag)
1126 /* unacceptable operand of '%s' */
1127 error(111, mp->m_name);
1128 return false;
1129 }
1130 /* Now we have an object we can create a pointer to */
1131 break;
1132 case ARROW:
1133 if (lt != PTR && !(tflag && is_integer(lt))) {
1134 /* Without tflag we got already an error */
1135 if (tflag)
1136 /* unacceptable operand of '%s' */
1137 error(111, mp->m_name);
1138 return false;
1139 }
1140 break;
1141 case INCAFT:
1142 case DECAFT:
1143 case INCBEF:
1144 case DECBEF:
1145 if (!typeok_incdec(op, ln, ltp))
1146 return false;
1147 break;
1148 case ADDR:
1149 if (!typeok_address(mp, ln, ltp, lt))
1150 return false;
1151 break;
1152 case INDIR:
1153 if (!typeok_star(lt))
1154 return false;
1155 break;
1156 case PLUS:
1157 if (!typeok_plus(op, ltp, lt, rtp, rt))
1158 return false;
1159 break;
1160 case MINUS:
1161 if (!typeok_minus(op, ltp, lt, rtp, rt))
1162 return false;
1163 break;
1164 case SHR:
1165 typeok_shr(mp, ln, lt, rn, rt);
1166 goto shift;
1167 case SHL:
1168 typeok_shl(mp, lt, rt);
1169 shift:
1170 typeok_shift(lt, rn, rt);
1171 break;
1172 case EQ:
1173 case NE:
1174 /*
1175 * Accept some things which are allowed with EQ and NE,
1176 * but not with ordered comparisons.
1177 */
1178 if (is_typeok_eq(ln, lt, rn, rt))
1179 break;
1180 /* FALLTHROUGH */
1181 case LT:
1182 case GT:
1183 case LE:
1184 case GE:
1185 if (!typeok_ordered_comparison(op, ln, ltp, lt, rn, rtp, rt))
1186 return false;
1187 break;
1188 case QUEST:
1189 if (!typeok_quest(lt, &rn))
1190 return false;
1191 break;
1192 case COLON:
1193 if (!typeok_colon(mp, ln, ltp, lt, rn, rtp, rt))
1194 return false;
1195 break;
1196 case ASSIGN:
1197 case INIT:
1198 case FARG:
1199 case RETURN:
1200 if (!check_assign_types_compatible(op, arg, ln, rn))
1201 return false;
1202 goto assign;
1203 case MULASS:
1204 case DIVASS:
1205 case MODASS:
1206 goto assign;
1207 case ADDASS:
1208 case SUBASS:
1209 /* operands have scalar types (checked above) */
1210 if ((lt == PTR && !is_integer(rt)) || rt == PTR) {
1211 warn_incompatible_types(op, ltp, lt, rtp, rt);
1212 return false;
1213 }
1214 goto assign;
1215 case SHLASS:
1216 goto assign;
1217 case SHRASS:
1218 if (pflag && !is_uinteger(lt) && !(tflag && is_uinteger(rt))) {
1219 /* bitwise '%s' on signed value possibly nonportable */
1220 warning(117, mp->m_name);
1221 }
1222 goto assign;
1223 case ANDASS:
1224 case XORASS:
1225 case ORASS:
1226 goto assign;
1227 assign:
1228 if (!typeok_assign(op, ln, ltp, lt))
1229 return false;
1230 break;
1231 case COMMA:
1232 if (!modtab[ln->tn_op].m_has_side_effect)
1233 check_null_effect(ln);
1234 break;
1235 /* LINTED206: (enumeration values not handled in switch) */
1236 case CON:
1237 case CASE:
1238 case PUSH:
1239 case LOAD:
1240 case ICALL:
1241 case CVT:
1242 case CALL:
1243 case FSEL:
1244 case STRING:
1245 case NAME:
1246 case LOGOR:
1247 case LOGAND:
1248 case BITOR:
1249 case BITXOR:
1250 case BITAND:
1251 case MOD:
1252 case DIV:
1253 case MULT:
1254 case UMINUS:
1255 case UPLUS:
1256 case DEC:
1257 case INC:
1258 case COMPL:
1259 case NOT:
1260 case NOOP:
1261 case REAL:
1262 case IMAG:
1263 break;
1264 }
1265 return true;
1266 }
1267
1268 static void
1269 typeok_enum(op_t op, const mod_t *mp, int arg,
1270 const tnode_t *ln, const type_t *ltp,
1271 const tnode_t *rn, const type_t *rtp)
1272 {
1273 if (mp->m_bad_on_enum &&
1274 (ltp->t_is_enum || (mp->m_binary && rtp->t_is_enum))) {
1275 check_bad_enum_operation(op, ln, rn);
1276 } else if (mp->m_valid_on_enum &&
1277 (ltp->t_is_enum && rtp != NULL && rtp->t_is_enum)) {
1278 check_enum_type_mismatch(op, arg, ln, rn);
1279 } else if (mp->m_valid_on_enum &&
1280 (ltp->t_is_enum || (rtp != NULL && rtp->t_is_enum))) {
1281 check_enum_int_mismatch(op, arg, ln, rn);
1282 }
1283 }
1284
1285 /* Perform most type checks. Return whether the types are ok. */
1286 bool
1287 typeok(op_t op, int arg, const tnode_t *ln, const tnode_t *rn)
1288 {
1289 const mod_t *mp;
1290 tspec_t lt, rt;
1291 type_t *ltp, *rtp;
1292
1293 mp = &modtab[op];
1294
1295 lint_assert((ltp = ln->tn_type) != NULL);
1296 lt = ltp->t_tspec;
1297
1298 if (mp->m_binary) {
1299 lint_assert((rtp = rn->tn_type) != NULL);
1300 rt = rtp->t_tspec;
1301 } else {
1302 rtp = NULL;
1303 rt = NOTSPEC;
1304 }
1305
1306 if (Tflag && !typeok_scalar_strict_bool(op, mp, arg, ln, rn))
1307 return false;
1308 if (!typeok_scalar(op, mp, ltp, lt, rtp, rt))
1309 return false;
1310
1311 if (!typeok_op(op, mp, arg, ln, ltp, lt, rn, rtp, rt))
1312 return false;
1313
1314 typeok_enum(op, mp, arg, ln, ltp, rn, rtp);
1315 return true;
1316 }
1317
1318 static void
1319 check_pointer_comparison(op_t op, const tnode_t *ln, const tnode_t *rn)
1320 {
1321 type_t *ltp, *rtp;
1322 tspec_t lst, rst;
1323 const char *lsts, *rsts;
1324
1325 lst = (ltp = ln->tn_type)->t_subt->t_tspec;
1326 rst = (rtp = rn->tn_type)->t_subt->t_tspec;
1327
1328 if (lst == VOID || rst == VOID) {
1329 if (sflag && (lst == FUNC || rst == FUNC)) {
1330 /* (void *)0 already handled in typeok() */
1331 *(lst == FUNC ? &lsts : &rsts) = "function pointer";
1332 *(lst == VOID ? &lsts : &rsts) = "'void *'";
1333 /* ANSI C forbids comparison of %s with %s */
1334 warning(274, lsts, rsts);
1335 }
1336 return;
1337 }
1338
1339 if (!eqtype(ltp->t_subt, rtp->t_subt, true, false, NULL)) {
1340 warn_incompatible_pointers(&modtab[op], ltp, rtp);
1341 return;
1342 }
1343
1344 if (lst == FUNC && rst == FUNC) {
1345 if (sflag && op != EQ && op != NE)
1346 /* ANSI C forbids ordered comparisons of ... */
1347 warning(125);
1348 }
1349 }
1350
1351 static bool
1352 is_direct_function_call(const tnode_t *tn, const char **out_name)
1353 {
1354
1355 if (!(tn->tn_op == CALL &&
1356 tn->tn_left->tn_op == ADDR &&
1357 tn->tn_left->tn_left->tn_op == NAME))
1358 return false;
1359
1360 *out_name = tn->tn_left->tn_left->tn_sym->s_name;
1361 return true;
1362 }
1363
1364 static bool
1365 is_unconst_function(const char *name)
1366 {
1367
1368 return strcmp(name, "memchr") == 0 ||
1369 strcmp(name, "strchr") == 0 ||
1370 strcmp(name, "strpbrk") == 0 ||
1371 strcmp(name, "strrchr") == 0 ||
1372 strcmp(name, "strstr") == 0;
1373 }
1374
1375 static bool
1376 is_const_char_pointer(const tnode_t *tn)
1377 {
1378 const type_t *tp;
1379
1380 /*
1381 * For traditional reasons, C99 6.4.5p5 defines that string literals
1382 * have type 'char[]'. They are often implicitly converted to
1383 * 'char *', for example when they are passed as function arguments.
1384 *
1385 * C99 6.4.5p6 further defines that modifying a string that is
1386 * constructed from a string literal invokes undefined behavior.
1387 *
1388 * Out of these reasons, string literals are treated as 'effectively
1389 * const' here.
1390 */
1391 if (tn->tn_op == CVT &&
1392 tn->tn_left->tn_op == ADDR &&
1393 tn->tn_left->tn_left->tn_op == STRING)
1394 return true;
1395
1396 tp = before_conversion(tn)->tn_type;
1397 return tp->t_tspec == PTR &&
1398 tp->t_subt->t_tspec == CHAR &&
1399 tp->t_subt->t_const;
1400 }
1401
1402 static bool
1403 is_first_arg_const(const tnode_t *tn)
1404 {
1405 const tnode_t *an;
1406
1407 an = tn->tn_right;
1408 if (an == NULL)
1409 return false;
1410
1411 while (an->tn_right != NULL)
1412 an = an->tn_right;
1413 return is_const_char_pointer(an->tn_left);
1414 }
1415
1416 static void
1417 check_unconst_function(const type_t *lstp,
1418 const tnode_t *rn, const type_t *rstp)
1419 {
1420 const char *function_name;
1421
1422 if (lstp->t_tspec == CHAR && !lstp->t_const &&
1423 is_direct_function_call(rn, &function_name) &&
1424 is_unconst_function(function_name) &&
1425 is_first_arg_const(rn)) {
1426 /* call to '%s' effectively discards 'const' from argument */
1427 warning(346, function_name);
1428 }
1429 }
1430
1431 /*
1432 * Checks type compatibility for ASSIGN, INIT, FARG and RETURN
1433 * and prints warnings/errors if necessary.
1434 * If the types are (almost) compatible, 1 is returned, otherwise 0.
1435 */
1436 static bool
1437 check_assign_types_compatible(op_t op, int arg,
1438 const tnode_t *ln, const tnode_t *rn)
1439 {
1440 tspec_t lt, rt, lst = NOTSPEC, rst = NOTSPEC;
1441 type_t *ltp, *rtp, *lstp = NULL, *rstp = NULL;
1442 const mod_t *mp;
1443 const char *lts, *rts;
1444
1445 if ((lt = (ltp = ln->tn_type)->t_tspec) == PTR)
1446 lst = (lstp = ltp->t_subt)->t_tspec;
1447 if ((rt = (rtp = rn->tn_type)->t_tspec) == PTR)
1448 rst = (rstp = rtp->t_subt)->t_tspec;
1449 mp = &modtab[op];
1450
1451 if (lt == BOOL && is_scalar(rt)) /* C99 6.3.1.2 */
1452 return true;
1453
1454 if (is_arithmetic(lt) && (is_arithmetic(rt) || rt == BOOL))
1455 return true;
1456
1457 if ((lt == STRUCT || lt == UNION) && (rt == STRUCT || rt == UNION))
1458 /* both are struct or union */
1459 return ltp->t_str == rtp->t_str;
1460
1461 /* a null pointer may be assigned to any pointer */
1462 if (lt == PTR && is_null_pointer(rn))
1463 return true;
1464
1465 if (lt == PTR && rt == PTR && (lst == VOID || rst == VOID)) {
1466 /* two pointers, at least one pointer to void */
1467 if (sflag && (lst == FUNC || rst == FUNC)) {
1468 /* comb. of ptr to func and ptr to void */
1469 *(lst == FUNC ? <s : &rts) = "function pointer";
1470 *(lst == VOID ? <s : &rts) = "'void *'";
1471 switch (op) {
1472 case INIT:
1473 case RETURN:
1474 /* ANSI C forbids conversion of %s to %s */
1475 warning(303, rts, lts);
1476 break;
1477 case FARG:
1478 /* ANSI C forbids conv. of %s to %s, arg #%d */
1479 warning(304, rts, lts, arg);
1480 break;
1481 default:
1482 /* ANSI C forbids conv. of %s to %s, op %s */
1483 warning(305, rts, lts, mp->m_name);
1484 break;
1485 }
1486 }
1487 }
1488
1489 if (lt == PTR && rt == PTR && (lst == VOID || rst == VOID ||
1490 eqtype(lstp, rstp, true, false, NULL))) {
1491 /* compatible pointer types (qualifiers ignored) */
1492 if (!tflag &&
1493 ((!lstp->t_const && rstp->t_const) ||
1494 (!lstp->t_volatile && rstp->t_volatile))) {
1495 /* left side has not all qualifiers of right */
1496 switch (op) {
1497 case INIT:
1498 case RETURN:
1499 /* incompatible pointer types (%s != %s) */
1500 warning(182, type_name(lstp), type_name(rstp));
1501 break;
1502 case FARG:
1503 /* converting '%s' to incompatible '%s' ... */
1504 warning(153,
1505 type_name(rtp), type_name(ltp), arg);
1506 break;
1507 default:
1508 /* operands have incompatible pointer type... */
1509 warning(128, mp->m_name,
1510 type_name(lstp), type_name(rstp));
1511 break;
1512 }
1513 }
1514
1515 if (!tflag)
1516 check_unconst_function(lstp, rn, rstp);
1517
1518 return true;
1519 }
1520
1521 if ((lt == PTR && is_integer(rt)) || (is_integer(lt) && rt == PTR)) {
1522 const char *lx = lt == PTR ? "pointer" : "integer";
1523 const char *rx = rt == PTR ? "pointer" : "integer";
1524
1525 switch (op) {
1526 case INIT:
1527 case RETURN:
1528 /* illegal combination of %s (%s) and %s (%s) */
1529 warning(183, lx, type_name(ltp), rx, type_name(rtp));
1530 break;
1531 case FARG:
1532 /* illegal comb. of %s (%s) and %s (%s), arg #%d */
1533 warning(154,
1534 lx, type_name(ltp), rx, type_name(rtp), arg);
1535 break;
1536 default:
1537 /* illegal combination of %s (%s) and %s (%s), op %s */
1538 warning(123,
1539 lx, type_name(ltp), rx, type_name(rtp), mp->m_name);
1540 break;
1541 }
1542 return true;
1543 }
1544
1545 if (lt == PTR && rt == PTR) {
1546 switch (op) {
1547 case RETURN:
1548 warn_incompatible_pointers(NULL, ltp, rtp);
1549 break;
1550 case FARG:
1551 /* converting '%s' to incompatible '%s' for ... */
1552 warning(153, type_name(rtp), type_name(ltp), arg);
1553 break;
1554 default:
1555 warn_incompatible_pointers(mp, ltp, rtp);
1556 break;
1557 }
1558 return true;
1559 }
1560
1561 switch (op) {
1562 case INIT:
1563 /* cannot initialize '%s' from '%s' */
1564 error(185, type_name(ltp), type_name(rtp));
1565 break;
1566 case RETURN:
1567 /* return value type mismatch (%s) and (%s) */
1568 error(211, type_name(ltp), type_name(rtp));
1569 break;
1570 case FARG:
1571 /* passing '%s' to incompatible '%s', arg #%d */
1572 warning(155, type_name(rtp), type_name(ltp), arg);
1573 break;
1574 default:
1575 warn_incompatible_types(op, ltp, lt, rtp, rt);
1576 break;
1577 }
1578
1579 return false;
1580 }
1581
1582 /* Prints a warning if a strange operator is used on an enum type. */
1583 static void
1584 check_bad_enum_operation(op_t op, const tnode_t *ln, const tnode_t *rn)
1585 {
1586
1587 if (!eflag)
1588 return;
1589
1590 if (!(ln->tn_type->t_is_enum ||
1591 (modtab[op].m_binary && rn->tn_type->t_is_enum))) {
1592 return;
1593 }
1594
1595 /*
1596 * Enum as offset to a pointer is an exception (otherwise enums
1597 * could not be used as array indices).
1598 */
1599 if (op == PLUS &&
1600 ((ln->tn_type->t_is_enum && rn->tn_type->t_tspec == PTR) ||
1601 (rn->tn_type->t_is_enum && ln->tn_type->t_tspec == PTR))) {
1602 return;
1603 }
1604
1605 /* dubious operation on enum, op %s */
1606 warning(241, op_name(op));
1607
1608 }
1609
1610 /*
1611 * Prints a warning if an operator is applied to two different enum types.
1612 */
1613 static void
1614 check_enum_type_mismatch(op_t op, int arg, const tnode_t *ln, const tnode_t *rn)
1615 {
1616 const mod_t *mp;
1617
1618 mp = &modtab[op];
1619
1620 if (ln->tn_type->t_enum != rn->tn_type->t_enum) {
1621 switch (op) {
1622 case INIT:
1623 /* enum type mismatch between '%s' and '%s' in ... */
1624 warning(210,
1625 type_name(ln->tn_type), type_name(rn->tn_type));
1626 break;
1627 case FARG:
1628 /* enum type mismatch, arg #%d (%s != %s) */
1629 warning(156, arg,
1630 type_name(ln->tn_type), type_name(rn->tn_type));
1631 break;
1632 case RETURN:
1633 /* return value type mismatch (%s) and (%s) */
1634 warning(211,
1635 type_name(ln->tn_type), type_name(rn->tn_type));
1636 break;
1637 default:
1638 /* enum type mismatch: '%s' '%s' '%s' */
1639 warning(130, type_name(ln->tn_type), mp->m_name,
1640 type_name(rn->tn_type));
1641 break;
1642 }
1643 } else if (Pflag && mp->m_comparison && op != EQ && op != NE) {
1644 if (eflag)
1645 /* dubious comparison of enums, op %s */
1646 warning(243, mp->m_name);
1647 }
1648 }
1649
1650 /* Prints a warning if the operands mix between enum and integer. */
1651 static void
1652 check_enum_int_mismatch(op_t op, int arg, const tnode_t *ln, const tnode_t *rn)
1653 {
1654
1655 if (!eflag)
1656 return;
1657
1658 switch (op) {
1659 case INIT:
1660 /*
1661 * Initialization with 0 is allowed. Otherwise, all implicit
1662 * initializations would need to be warned upon as well.
1663 */
1664 if (!rn->tn_type->t_is_enum && rn->tn_op == CON &&
1665 is_integer(rn->tn_type->t_tspec) &&
1666 rn->tn_val->v_quad == 0) {
1667 return;
1668 }
1669 /* initialization of '%s' with '%s' */
1670 warning(277, type_name(ln->tn_type), type_name(rn->tn_type));
1671 break;
1672 case FARG:
1673 /* combination of '%s' and '%s', arg #%d */
1674 warning(278,
1675 type_name(ln->tn_type), type_name(rn->tn_type), arg);
1676 break;
1677 case RETURN:
1678 /* combination of '%s' and '%s' in return */
1679 warning(279, type_name(ln->tn_type), type_name(rn->tn_type));
1680 break;
1681 default:
1682 /* combination of '%s' and '%s', op %s */
1683 warning(242, type_name(ln->tn_type), type_name(rn->tn_type),
1684 op_name(op));
1685 break;
1686 }
1687 }
1688
1689 /*
1690 * Build and initialize a new node.
1691 */
1692 static tnode_t *
1693 new_tnode(op_t op, type_t *type, tnode_t *ln, tnode_t *rn)
1694 {
1695 tnode_t *ntn;
1696 tspec_t t;
1697 #if 0 /* not yet */
1698 size_t l;
1699 uint64_t rnum;
1700 #endif
1701
1702 ntn = expr_zalloc_tnode();
1703
1704 ntn->tn_op = op;
1705 ntn->tn_type = type;
1706 ntn->tn_relaxed = ln->tn_relaxed || (rn != NULL && rn->tn_relaxed);
1707 ntn->tn_left = ln;
1708 ntn->tn_right = rn;
1709
1710 switch (op) {
1711 #if 0 /* not yet */
1712 case SHR:
1713 if (rn->tn_op != CON)
1714 break;
1715 rnum = rn->tn_val->v_quad;
1716 l = type_size_in_bits(ln->tn_type) / CHAR_SIZE;
1717 t = ln->tn_type->t_tspec;
1718 switch (l) {
1719 case 8:
1720 if (rnum >= 56)
1721 t = UCHAR;
1722 else if (rnum >= 48)
1723 t = USHORT;
1724 else if (rnum >= 32)
1725 t = UINT;
1726 break;
1727 case 4:
1728 if (rnum >= 24)
1729 t = UCHAR;
1730 else if (rnum >= 16)
1731 t = USHORT;
1732 break;
1733 case 2:
1734 if (rnum >= 8)
1735 t = UCHAR;
1736 break;
1737 default:
1738 break;
1739 }
1740 if (t != ln->tn_type->t_tspec)
1741 ntn->tn_type->t_tspec = t;
1742 break;
1743 #endif
1744 case INDIR:
1745 case FSEL:
1746 lint_assert(ln->tn_type->t_tspec == PTR);
1747 t = ln->tn_type->t_subt->t_tspec;
1748 if (t != FUNC && t != VOID)
1749 ntn->tn_lvalue = true;
1750 break;
1751 default:
1752 break;
1753 }
1754
1755 return ntn;
1756 }
1757
1758 /*
1759 * Performs the "integer promotions" (C99 6.3.1.1p2), which convert small
1760 * integer types to either int or unsigned int.
1761 *
1762 * If tflag is set or the operand is a function argument with no type
1763 * information (no prototype or variable # of args), converts float to double.
1764 */
1765 tnode_t *
1766 promote(op_t op, bool farg, tnode_t *tn)
1767 {
1768 tspec_t t;
1769 type_t *ntp;
1770 u_int len;
1771
1772 t = tn->tn_type->t_tspec;
1773
1774 if (!is_arithmetic(t))
1775 return tn;
1776
1777 if (!tflag) {
1778 /*
1779 * C99 6.3.1.1p2 requires for types with lower rank than int
1780 * that "If an int can represent all the values of the
1781 * original type, the value is converted to an int; otherwise
1782 * it is converted to an unsigned int", and that "All other
1783 * types are unchanged by the integer promotions".
1784 */
1785 if (tn->tn_type->t_bitfield) {
1786 len = tn->tn_type->t_flen;
1787 if (len < size_in_bits(INT)) {
1788 t = INT;
1789 } else if (len == size_in_bits(INT)) {
1790 t = is_uinteger(t) ? UINT : INT;
1791 }
1792 } else if (t == CHAR || t == UCHAR || t == SCHAR) {
1793 t = (size_in_bits(CHAR) < size_in_bits(INT)
1794 || t != UCHAR) ? INT : UINT;
1795 } else if (t == SHORT || t == USHORT) {
1796 t = (size_in_bits(SHORT) < size_in_bits(INT)
1797 || t == SHORT) ? INT : UINT;
1798 } else if (t == ENUM) {
1799 t = INT;
1800 } else if (farg && t == FLOAT) {
1801 t = DOUBLE;
1802 }
1803 } else {
1804 /*
1805 * In traditional C, keep unsigned and promote FLOAT
1806 * to DOUBLE.
1807 */
1808 if (t == UCHAR || t == USHORT) {
1809 t = UINT;
1810 } else if (t == CHAR || t == SCHAR || t == SHORT) {
1811 t = INT;
1812 } else if (t == FLOAT) {
1813 t = DOUBLE;
1814 } else if (t == ENUM) {
1815 t = INT;
1816 }
1817 }
1818
1819 if (t != tn->tn_type->t_tspec) {
1820 ntp = expr_dup_type(tn->tn_type);
1821 ntp->t_tspec = t;
1822 /*
1823 * Keep t_is_enum even though t_tspec gets converted from
1824 * ENUM to INT, so we are later able to check compatibility
1825 * of enum types.
1826 */
1827 tn = convert(op, 0, ntp, tn);
1828 }
1829
1830 return tn;
1831 }
1832
1833 /*
1834 * Apply the "usual arithmetic conversions" (C99 6.3.1.8).
1835 *
1836 * This gives both operands the same type.
1837 * This is done in different ways for traditional C and C90.
1838 */
1839 static void
1840 balance(op_t op, tnode_t **lnp, tnode_t **rnp)
1841 {
1842 tspec_t lt, rt, t;
1843 int i;
1844 bool u;
1845 type_t *ntp;
1846 static const tspec_t tl[] = {
1847 LDOUBLE, DOUBLE, FLOAT,
1848 #ifdef INT128_SIZE
1849 UINT128, INT128,
1850 #endif
1851 UQUAD, QUAD,
1852 ULONG, LONG,
1853 UINT, INT,
1854 };
1855
1856 lt = (*lnp)->tn_type->t_tspec;
1857 rt = (*rnp)->tn_type->t_tspec;
1858
1859 if (!is_arithmetic(lt) || !is_arithmetic(rt))
1860 return;
1861
1862 if (!tflag) {
1863 if (lt == rt) {
1864 t = lt;
1865 } else if (lt == LCOMPLEX || rt == LCOMPLEX) {
1866 t = LCOMPLEX;
1867 } else if (lt == DCOMPLEX || rt == DCOMPLEX) {
1868 t = DCOMPLEX;
1869 } else if (lt == FCOMPLEX || rt == FCOMPLEX) {
1870 t = FCOMPLEX;
1871 } else if (lt == LDOUBLE || rt == LDOUBLE) {
1872 t = LDOUBLE;
1873 } else if (lt == DOUBLE || rt == DOUBLE) {
1874 t = DOUBLE;
1875 } else if (lt == FLOAT || rt == FLOAT) {
1876 t = FLOAT;
1877 } else {
1878 /*
1879 * If type A has more bits than type B it should
1880 * be able to hold all possible values of type B.
1881 */
1882 if (size_in_bits(lt) > size_in_bits(rt)) {
1883 t = lt;
1884 } else if (size_in_bits(lt) < size_in_bits(rt)) {
1885 t = rt;
1886 } else {
1887 for (i = 3; tl[i] != INT; i++) {
1888 if (tl[i] == lt || tl[i] == rt)
1889 break;
1890 }
1891 if ((is_uinteger(lt) || is_uinteger(rt)) &&
1892 !is_uinteger(tl[i])) {
1893 i--;
1894 }
1895 t = tl[i];
1896 }
1897 }
1898 } else {
1899 /* Keep unsigned in traditional C */
1900 u = is_uinteger(lt) || is_uinteger(rt);
1901 for (i = 0; tl[i] != INT; i++) {
1902 if (lt == tl[i] || rt == tl[i])
1903 break;
1904 }
1905 t = tl[i];
1906 if (u && is_integer(t) && !is_uinteger(t))
1907 t = unsigned_type(t);
1908 }
1909
1910 if (t != lt) {
1911 ntp = expr_dup_type((*lnp)->tn_type);
1912 ntp->t_tspec = t;
1913 *lnp = convert(op, 0, ntp, *lnp);
1914 }
1915 if (t != rt) {
1916 ntp = expr_dup_type((*rnp)->tn_type);
1917 ntp->t_tspec = t;
1918 *rnp = convert(op, 0, ntp, *rnp);
1919 }
1920 }
1921
1922 /*
1923 * Insert a conversion operator, which converts the type of the node
1924 * to another given type.
1925 * If op is FARG, arg is the number of the argument (used for warnings).
1926 */
1927 tnode_t *
1928 convert(op_t op, int arg, type_t *tp, tnode_t *tn)
1929 {
1930 tnode_t *ntn;
1931 tspec_t nt, ot;
1932
1933 nt = tp->t_tspec;
1934 ot = tn->tn_type->t_tspec;
1935
1936 if (!tflag && !sflag && op == FARG)
1937 check_prototype_conversion(arg, nt, ot, tp, tn);
1938 if (is_integer(nt) && is_integer(ot)) {
1939 check_integer_conversion(op, arg, nt, ot, tp, tn);
1940 } else if (nt == PTR && is_null_pointer(tn)) {
1941 /* a null pointer may be assigned to any pointer. */
1942 } else if (is_integer(nt) && nt != BOOL && ot == PTR) {
1943 check_pointer_integer_conversion(op, nt, tp, tn);
1944 } else if (nt == PTR && ot == PTR && op == CVT) {
1945 check_pointer_conversion(tn, tp);
1946 }
1947
1948 ntn = expr_zalloc_tnode();
1949 ntn->tn_op = CVT;
1950 ntn->tn_type = tp;
1951 ntn->tn_cast = op == CVT;
1952 ntn->tn_relaxed |= tn->tn_relaxed;
1953 ntn->tn_right = NULL;
1954 if (tn->tn_op != CON || nt == VOID) {
1955 ntn->tn_left = tn;
1956 } else {
1957 ntn->tn_op = CON;
1958 ntn->tn_val = expr_zalloc(sizeof(*ntn->tn_val));
1959 convert_constant(op, arg, ntn->tn_type, ntn->tn_val,
1960 tn->tn_val);
1961 }
1962
1963 return ntn;
1964 }
1965
1966 /*
1967 * Print a warning if a prototype causes a type conversion that is
1968 * different from what would happen to the same argument in the
1969 * absence of a prototype.
1970 *
1971 * Errors/warnings about illegal type combinations are already printed
1972 * in check_assign_types_compatible().
1973 */
1974 static void
1975 check_prototype_conversion(int arg, tspec_t nt, tspec_t ot, type_t *tp,
1976 tnode_t *tn)
1977 {
1978 tnode_t *ptn;
1979
1980 if (!is_arithmetic(nt) || !is_arithmetic(ot))
1981 return;
1982
1983 /*
1984 * If the type of the formal parameter is char/short, a warning
1985 * would be useless, because functions declared the old style
1986 * can't expect char/short arguments.
1987 */
1988 /* XXX: what about SCHAR? */
1989 if (nt == CHAR || nt == UCHAR || nt == SHORT || nt == USHORT)
1990 return;
1991
1992 /* get default promotion */
1993 ptn = promote(NOOP, true, tn);
1994 ot = ptn->tn_type->t_tspec;
1995
1996 /* return if types are the same with and without prototype */
1997 if (nt == ot || (nt == ENUM && ot == INT))
1998 return;
1999
2000 if (is_floating(nt) != is_floating(ot) ||
2001 portable_size_in_bits(nt) != portable_size_in_bits(ot)) {
2002 /* representation and/or width change */
2003 if (!is_integer(ot) ||
2004 portable_size_in_bits(ot) > portable_size_in_bits(INT)) {
2005 /* argument #%d is converted from '%s' to '%s' ... */
2006 warning(259,
2007 arg, type_name(tn->tn_type), type_name(tp));
2008 }
2009 } else if (hflag) {
2010 /*
2011 * they differ in sign or base type (char, short, int,
2012 * long, long long, float, double, long double)
2013 *
2014 * if they differ only in sign and the argument is a constant
2015 * and the msb of the argument is not set, print no warning
2016 */
2017 if (ptn->tn_op == CON && is_integer(nt) &&
2018 signed_type(nt) == signed_type(ot) &&
2019 msb(ptn->tn_val->v_quad, ot, -1) == 0) {
2020 /* ok */
2021 } else {
2022 /* argument #%d is converted from '%s' to '%s' ... */
2023 warning(259,
2024 arg, type_name(tn->tn_type), type_name(tp));
2025 }
2026 }
2027 }
2028
2029 /*
2030 * Print warnings for conversions of integer types which may cause problems.
2031 */
2032 static void
2033 check_integer_conversion(op_t op, int arg, tspec_t nt, tspec_t ot, type_t *tp,
2034 tnode_t *tn)
2035 {
2036
2037 if (tn->tn_op == CON)
2038 return;
2039
2040 if (op == CVT)
2041 return;
2042
2043 if (Sflag && nt == BOOL)
2044 return; /* See C99 6.3.1.2 */
2045
2046 if (Pflag && portable_size_in_bits(nt) > portable_size_in_bits(ot) &&
2047 is_uinteger(nt) != is_uinteger(ot)) {
2048 if (aflag > 0 && pflag) {
2049 if (op == FARG) {
2050 /* conversion to '%s' may sign-extend ... */
2051 warning(297, type_name(tp), arg);
2052 } else {
2053 /* conversion to '%s' may sign-extend ... */
2054 warning(131, type_name(tp));
2055 }
2056 }
2057 }
2058
2059 if (Pflag && portable_size_in_bits(nt) > portable_size_in_bits(ot)) {
2060 switch (tn->tn_op) {
2061 case PLUS:
2062 case MINUS:
2063 case MULT:
2064 case SHL:
2065 /* suggest cast from '%s' to '%s' on op %s to ... */
2066 warning(324, type_name(gettyp(ot)), type_name(tp),
2067 op_name(tn->tn_op));
2068 break;
2069 default:
2070 break;
2071 }
2072 }
2073
2074 if (portable_size_in_bits(nt) < portable_size_in_bits(ot) &&
2075 (ot == LONG || ot == ULONG || ot == QUAD || ot == UQUAD ||
2076 aflag > 1)) {
2077 /* conversion from '%s' may lose accuracy */
2078 if (aflag > 0) {
2079 if (op == FARG) {
2080 /* conv. from '%s' to '%s' may lose ... */
2081 warning(298,
2082 type_name(tn->tn_type), type_name(tp), arg);
2083 } else {
2084 /* conv. from '%s' to '%s' may lose accuracy */
2085 warning(132,
2086 type_name(tn->tn_type), type_name(tp));
2087 }
2088 }
2089 }
2090 }
2091
2092 /*
2093 * Print warnings for dubious conversions of pointer to integer.
2094 */
2095 static void
2096 check_pointer_integer_conversion(op_t op, tspec_t nt, type_t *tp, tnode_t *tn)
2097 {
2098
2099 if (tn->tn_op == CON)
2100 return;
2101 if (op != CVT)
2102 return; /* We got already an error. */
2103 if (portable_size_in_bits(nt) >= portable_size_in_bits(PTR))
2104 return;
2105
2106 if (pflag && size_in_bits(nt) >= size_in_bits(PTR)) {
2107 /* conversion of pointer to '%s' may lose bits */
2108 warning(134, type_name(tp));
2109 } else {
2110 /* conversion of pointer to '%s' loses bits */
2111 warning(133, type_name(tp));
2112 }
2113 }
2114
2115 static bool
2116 should_warn_about_pointer_cast(const type_t *nstp, tspec_t nst,
2117 const type_t *ostp, tspec_t ost)
2118 {
2119 /*
2120 * Casting a pointer to 'struct S' to a pointer to another struct that
2121 * has 'struct S' as its first member is ok, see msg_247.c, 'struct
2122 * counter'.
2123 */
2124 if (nst == STRUCT && ost == STRUCT &&
2125 nstp->t_str->sou_first_member != NULL &&
2126 nstp->t_str->sou_first_member->s_type == ostp)
2127 return false;
2128
2129 if (is_incomplete(nstp) || is_incomplete(ostp))
2130 return false;
2131
2132 if ((nst == STRUCT || nst == UNION) && nstp->t_str != ostp->t_str)
2133 return true;
2134
2135 if (nst == CHAR || nst == UCHAR)
2136 return false; /* for the sake of traditional C code */
2137 if (ost == CHAR || ost == UCHAR)
2138 return false; /* for the sake of traditional C code */
2139
2140 return portable_size_in_bits(nst) != portable_size_in_bits(ost);
2141 }
2142
2143 /*
2144 * Warn about questionable pointer conversions.
2145 */
2146 static void
2147 check_pointer_conversion(tnode_t *tn, type_t *ntp)
2148 {
2149 const type_t *nstp, *otp, *ostp;
2150 tspec_t nst, ost;
2151 const char *nts, *ots;
2152
2153 nstp = ntp->t_subt;
2154 otp = tn->tn_type;
2155 ostp = otp->t_subt;
2156 nst = nstp->t_tspec;
2157 ost = ostp->t_tspec;
2158
2159 if (nst == VOID || ost == VOID) {
2160 if (sflag && (nst == FUNC || ost == FUNC)) {
2161 /* null pointers are already handled in convert() */
2162 *(nst == FUNC ? &nts : &ots) = "function pointer";
2163 *(nst == VOID ? &nts : &ots) = "'void *'";
2164 /* ANSI C forbids conversion of %s to %s */
2165 warning(303, ots, nts);
2166 }
2167 return;
2168 } else if (nst == FUNC && ost == FUNC) {
2169 return;
2170 } else if (nst == FUNC || ost == FUNC) {
2171 /* converting '%s' to '%s' is questionable */
2172 warning(229, type_name(otp), type_name(ntp));
2173 return;
2174 }
2175
2176 if (hflag && alignment_in_bits(nstp) > alignment_in_bits(ostp) &&
2177 ost != CHAR && ost != UCHAR &&
2178 !is_incomplete(ostp)) {
2179 /* converting '%s' to '%s' may cause alignment problem */
2180 warning(135, type_name(otp), type_name(ntp));
2181 }
2182
2183 if (cflag && should_warn_about_pointer_cast(nstp, nst, ostp, ost)) {
2184 /* pointer cast from '%s' to '%s' may be troublesome */
2185 warning(247, type_name(otp), type_name(ntp));
2186 }
2187 }
2188
2189 static void
2190 convert_constant_floating(op_t op, int arg, tspec_t ot, const type_t *tp,
2191 tspec_t nt, val_t *v, val_t *nv)
2192 {
2193 ldbl_t max = 0.0, min = 0.0;
2194
2195 switch (nt) {
2196 case CHAR:
2197 max = TARG_CHAR_MAX; min = TARG_CHAR_MIN; break;
2198 case UCHAR:
2199 max = TARG_UCHAR_MAX; min = 0; break;
2200 case SCHAR:
2201 max = TARG_SCHAR_MAX; min = TARG_SCHAR_MIN; break;
2202 case SHORT:
2203 max = TARG_SHRT_MAX; min = TARG_SHRT_MIN; break;
2204 case USHORT:
2205 max = TARG_USHRT_MAX; min = 0; break;
2206 case ENUM:
2207 case INT:
2208 max = TARG_INT_MAX; min = TARG_INT_MIN; break;
2209 case UINT:
2210 max = (u_int)TARG_UINT_MAX;min = 0; break;
2211 case LONG:
2212 max = TARG_LONG_MAX; min = TARG_LONG_MIN; break;
2213 case ULONG:
2214 max = (u_long)TARG_ULONG_MAX; min = 0; break;
2215 case QUAD:
2216 max = QUAD_MAX; min = QUAD_MIN; break;
2217 case UQUAD:
2218 max = (uint64_t)UQUAD_MAX; min = 0; break;
2219 case FLOAT:
2220 case FCOMPLEX:
2221 max = FLT_MAX; min = -FLT_MAX; break;
2222 case DOUBLE:
2223 case DCOMPLEX:
2224 max = DBL_MAX; min = -DBL_MAX; break;
2225 case PTR:
2226 /* Got already an error because of float --> ptr */
2227 case LDOUBLE:
2228 case LCOMPLEX:
2229 max = LDBL_MAX; min = -LDBL_MAX; break;
2230 default:
2231 lint_assert(/*CONSTCOND*/false);
2232 }
2233 if (v->v_ldbl > max || v->v_ldbl < min) {
2234 lint_assert(nt != LDOUBLE);
2235 if (op == FARG) {
2236 /* conv. of '%s' to '%s' is out of range, ... */
2237 warning(295,
2238 type_name(gettyp(ot)), type_name(tp), arg);
2239 } else {
2240 /* conversion of '%s' to '%s' is out of range */
2241 warning(119,
2242 type_name(gettyp(ot)), type_name(tp));
2243 }
2244 v->v_ldbl = v->v_ldbl > 0 ? max : min;
2245 }
2246 if (nt == FLOAT) {
2247 nv->v_ldbl = (float)v->v_ldbl;
2248 } else if (nt == DOUBLE) {
2249 nv->v_ldbl = (double)v->v_ldbl;
2250 } else if (nt == LDOUBLE) {
2251 nv->v_ldbl = v->v_ldbl;
2252 } else {
2253 nv->v_quad = (nt == PTR || is_uinteger(nt)) ?
2254 (int64_t)v->v_ldbl : (int64_t)v->v_ldbl;
2255 }
2256 }
2257
2258 static bool
2259 convert_constant_to_floating(tspec_t nt, val_t *nv,
2260 tspec_t ot, const val_t *v)
2261 {
2262 if (nt == FLOAT) {
2263 nv->v_ldbl = (ot == PTR || is_uinteger(ot)) ?
2264 (float)(uint64_t)v->v_quad : (float)v->v_quad;
2265 } else if (nt == DOUBLE) {
2266 nv->v_ldbl = (ot == PTR || is_uinteger(ot)) ?
2267 (double)(uint64_t)v->v_quad : (double)v->v_quad;
2268 } else if (nt == LDOUBLE) {
2269 nv->v_ldbl = (ot == PTR || is_uinteger(ot)) ?
2270 (ldbl_t)(uint64_t)v->v_quad : (ldbl_t)v->v_quad;
2271 } else
2272 return false;
2273 return true;
2274 }
2275
2276 /*
2277 * Print a warning if bits which were set are lost due to the conversion.
2278 * This can happen with operator ORASS only.
2279 */
2280 static void
2281 convert_constant_check_range_bitor(size_t nsz, size_t osz, const val_t *v,
2282 uint64_t xmask, op_t op)
2283 {
2284 if (nsz < osz && (v->v_quad & xmask) != 0) {
2285 /* constant truncated by conv., op %s */
2286 warning(306, op_name(op));
2287 }
2288 }
2289
2290 /*
2291 * Print a warning if additional bits are not all 1
2292 * and the most significant bit of the old value is 1,
2293 * or if at least one (but not all) removed bit was 0.
2294 */
2295 static void
2296 convert_constant_check_range_bitand(size_t nsz, size_t osz,
2297 uint64_t xmask, const val_t *nv,
2298 tspec_t ot, const val_t *v,
2299 const type_t *tp, op_t op)
2300 {
2301 if (nsz > osz &&
2302 (nv->v_quad & bit(osz - 1)) != 0 &&
2303 (nv->v_quad & xmask) != xmask) {
2304 /* extra bits set to 0 in conversion of '%s' to '%s', ... */
2305 warning(309, type_name(gettyp(ot)),
2306 type_name(tp), op_name(op));
2307 } else if (nsz < osz &&
2308 (v->v_quad & xmask) != xmask &&
2309 (v->v_quad & xmask) != 0) {
2310 /* constant truncated by conversion, op %s */
2311 warning(306, op_name(op));
2312 }
2313 }
2314
2315 static void
2316 convert_constant_check_range_signed(op_t op, int arg)
2317 {
2318 if (op == ASSIGN) {
2319 /* assignment of negative constant to unsigned type */
2320 warning(164);
2321 } else if (op == INIT) {
2322 /* initialization of unsigned with negative constant */
2323 warning(221);
2324 } else if (op == FARG) {
2325 /* conversion of negative constant to unsigned type, ... */
2326 warning(296, arg);
2327 } else if (modtab[op].m_comparison) {
2328 /* handled by check_integer_comparison() */
2329 } else {
2330 /* conversion of negative constant to unsigned type */
2331 warning(222);
2332 }
2333 }
2334
2335 /*
2336 * Loss of significant bit(s). All truncated bits
2337 * of unsigned types or all truncated bits plus the
2338 * msb of the target for signed types are considered
2339 * to be significant bits. Loss of significant bits
2340 * means that at least one of the bits was set in an
2341 * unsigned type or that at least one but not all of
2342 * the bits was set in a signed type.
2343 * Loss of significant bits means that it is not
2344 * possible, also not with necessary casts, to convert
2345 * back to the original type. A example for a
2346 * necessary cast is:
2347 * char c; int i; c = 128;
2348 * i = c; ** yields -128 **
2349 * i = (unsigned char)c; ** yields 128 **
2350 */
2351 static void
2352 convert_constant_check_range_truncated(op_t op, int arg, const type_t *tp,
2353 tspec_t ot)
2354 {
2355 if (op == ASSIGN && tp->t_bitfield) {
2356 /* precision lost in bit-field assignment */
2357 warning(166);
2358 } else if (op == ASSIGN) {
2359 /* constant truncated by assignment */
2360 warning(165);
2361 } else if (op == INIT && tp->t_bitfield) {
2362 /* bit-field initializer does not fit */
2363 warning(180);
2364 } else if (op == INIT) {
2365 /* initializer does not fit */
2366 warning(178);
2367 } else if (op == CASE) {
2368 /* case label affected by conversion */
2369 warning(196);
2370 } else if (op == FARG) {
2371 /* conversion of '%s' to '%s' is out of range, arg #%d */
2372 warning(295,
2373 type_name(gettyp(ot)), type_name(tp), arg);
2374 } else {
2375 /* conversion of '%s' to '%s' is out of range */
2376 warning(119,
2377 type_name(gettyp(ot)), type_name(tp));
2378 }
2379 }
2380
2381 static void
2382 convert_constant_check_range_loss(op_t op, int arg, const type_t *tp,
2383 tspec_t ot)
2384 {
2385 if (op == ASSIGN && tp->t_bitfield) {
2386 /* precision lost in bit-field assignment */
2387 warning(166);
2388 } else if (op == INIT && tp->t_bitfield) {
2389 /* bit-field initializer out of range */
2390 warning(11);
2391 } else if (op == CASE) {
2392 /* case label affected by conversion */
2393 warning(196);
2394 } else if (op == FARG) {
2395 /* conversion of '%s' to '%s' is out of range, arg #%d */
2396 warning(295,
2397 type_name(gettyp(ot)), type_name(tp), arg);
2398 } else {
2399 /* conversion of '%s' to '%s' is out of range */
2400 warning(119,
2401 type_name(gettyp(ot)), type_name(tp));
2402 }
2403 }
2404
2405 static void
2406 convert_constant_check_range(tspec_t ot, const type_t *tp, tspec_t nt,
2407 op_t op, int arg, const val_t *v, val_t *nv)
2408 {
2409 int osz, nsz;
2410 int64_t xmask, xmsk1;
2411
2412 osz = size_in_bits(ot);
2413 nsz = tp->t_bitfield ? tp->t_flen : size_in_bits(nt);
2414 xmask = value_bits(nsz) ^ value_bits(osz);
2415 xmsk1 = value_bits(nsz) ^ value_bits(osz - 1);
2416 /*
2417 * For bitwise operations we are not interested in the
2418 * value, but in the bits itself.
2419 */
2420 if (op == ORASS || op == BITOR || op == BITXOR) {
2421 convert_constant_check_range_bitor(nsz, osz, v, xmask, op);
2422 } else if (op == ANDASS || op == BITAND) {
2423 convert_constant_check_range_bitand(nsz, osz, xmask, nv, ot,
2424 v, tp, op);
2425 } else if ((nt != PTR && is_uinteger(nt)) &&
2426 (ot != PTR && !is_uinteger(ot)) &&
2427 v->v_quad < 0) {
2428 convert_constant_check_range_signed(op, arg);
2429 } else if (nv->v_quad != v->v_quad && nsz <= osz &&
2430 (v->v_quad & xmask) != 0 &&
2431 (is_uinteger(ot) || (v->v_quad & xmsk1) != xmsk1)) {
2432 convert_constant_check_range_truncated(op, arg, tp, ot);
2433 } else if (nv->v_quad != v->v_quad) {
2434 convert_constant_check_range_loss(op, arg, tp, ot);
2435 }
2436 }
2437
2438 /*
2439 * Converts a typed constant to a constant of another type.
2440 *
2441 * op operator which requires conversion
2442 * arg if op is FARG, # of argument
2443 * tp type in which to convert the constant
2444 * nv new constant
2445 * v old constant
2446 */
2447 void
2448 convert_constant(op_t op, int arg, const type_t *tp, val_t *nv, val_t *v)
2449 {
2450 tspec_t ot, nt;
2451 int sz;
2452 bool range_check;
2453
2454 /*
2455 * TODO: make 'v' const; the name of this function does not suggest
2456 * that it modifies 'v'.
2457 */
2458 ot = v->v_tspec;
2459 nt = nv->v_tspec = tp->t_tspec;
2460 range_check = false;
2461
2462 if (nt == BOOL) { /* C99 6.3.1.2 */
2463 nv->v_unsigned_since_c90 = false;
2464 nv->v_quad = is_nonzero_val(v) ? 1 : 0;
2465 return;
2466 }
2467
2468 if (ot == FLOAT || ot == DOUBLE || ot == LDOUBLE) {
2469 convert_constant_floating(op, arg, ot, tp, nt, v, nv);
2470 } else if (!convert_constant_to_floating(nt, nv, ot, v)) {
2471 range_check = true; /* Check for lost precision. */
2472 nv->v_quad = v->v_quad;
2473 }
2474
2475 if ((v->v_unsigned_since_c90 && is_floating(nt)) ||
2476 (v->v_unsigned_since_c90 && (is_integer(nt) && !is_uinteger(nt) &&
2477 portable_size_in_bits(nt) >
2478 portable_size_in_bits(ot)))) {
2479 /* ANSI C treats constant as unsigned */
2480 warning(157);
2481 v->v_unsigned_since_c90 = false;
2482 }
2483
2484 if (is_integer(nt)) {
2485 sz = tp->t_bitfield ? tp->t_flen : size_in_bits(nt);
2486 nv->v_quad = convert_integer(nv->v_quad, nt, sz);
2487 }
2488
2489 if (range_check && op != CVT)
2490 convert_constant_check_range(ot, tp, nt, op, arg, v, nv);
2491 }
2492
2493 /*
2494 * Called if incompatible types were detected.
2495 * Prints a appropriate warning.
2496 */
2497 static void
2498 warn_incompatible_types(op_t op,
2499 const type_t *ltp, tspec_t lt,
2500 const type_t *rtp, tspec_t rt)
2501 {
2502 const mod_t *mp;
2503
2504 mp = &modtab[op];
2505
2506 if (lt == VOID || (mp->m_binary && rt == VOID)) {
2507 /* void type illegal in expression */
2508 error(109);
2509 } else if (op == ASSIGN) {
2510 if ((lt == STRUCT || lt == UNION) &&
2511 (rt == STRUCT || rt == UNION)) {
2512 /* assignment of different structures (%s != %s) */
2513 error(240, tspec_name(lt), tspec_name(rt));
2514 } else {
2515 /* cannot assign to '%s' from '%s' */
2516 error(171, type_name(ltp), type_name(rtp));
2517 }
2518 } else if (mp->m_binary) {
2519 /* operands of '%s' have incompatible types (%s != %s) */
2520 error(107, mp->m_name, tspec_name(lt), tspec_name(rt));
2521 } else {
2522 lint_assert(rt == NOTSPEC);
2523 /* operand of '%s' has invalid type (%s) */
2524 error(108, mp->m_name, tspec_name(lt));
2525 }
2526 }
2527
2528 /*
2529 * Called if incompatible pointer types are detected.
2530 * Print an appropriate warning.
2531 */
2532 static void
2533 warn_incompatible_pointers(const mod_t *mp,
2534 const type_t *ltp, const type_t *rtp)
2535 {
2536 tspec_t lt, rt;
2537
2538 lint_assert(ltp->t_tspec == PTR);
2539 lint_assert(rtp->t_tspec == PTR);
2540
2541 lt = ltp->t_subt->t_tspec;
2542 rt = rtp->t_subt->t_tspec;
2543
2544 if ((lt == STRUCT || lt == UNION) && (rt == STRUCT || rt == UNION)) {
2545 if (mp == NULL) {
2546 /* illegal structure pointer combination */
2547 warning(244);
2548 } else {
2549 /* incompatible structure pointers: '%s' '%s' '%s' */
2550 warning(245, type_name(ltp), mp->m_name, type_name(rtp));
2551 }
2552 } else {
2553 if (mp == NULL) {
2554 /* illegal combination of '%s' and '%s' */
2555 warning(184, type_name(ltp), type_name(rtp));
2556 } else {
2557 /* illegal combination of '%s' and '%s', op '%s' */
2558 warning(124,
2559 type_name(ltp), type_name(rtp), mp->m_name);
2560 }
2561 }
2562 }
2563
2564 /* Return a type based on tp1, with added qualifiers from tp2. */
2565 static type_t *
2566 merge_qualifiers(type_t *tp1, const type_t *tp2)
2567 {
2568 type_t *ntp, *nstp;
2569
2570 lint_assert(tp1->t_tspec == PTR);
2571 lint_assert(tp2->t_tspec == PTR);
2572
2573 bool c1 = tp1->t_subt->t_const;
2574 bool c2 = tp2->t_subt->t_const;
2575 bool v1 = tp1->t_subt->t_volatile;
2576 bool v2 = tp2->t_subt->t_volatile;
2577
2578 if (c1 == (c1 | c2) && v1 == (v1 | v2))
2579 return tp1;
2580
2581 nstp = expr_dup_type(tp1->t_subt);
2582 nstp->t_const |= c2;
2583 nstp->t_volatile |= v2;
2584
2585 ntp = expr_dup_type(tp1);
2586 ntp->t_subt = nstp;
2587 return ntp;
2588 }
2589
2590 /*
2591 * Returns true if the given structure or union has a constant member
2592 * (maybe recursively).
2593 */
2594 static bool
2595 has_constant_member(const type_t *tp)
2596 {
2597 sym_t *m;
2598
2599 lint_assert(is_struct_or_union(tp->t_tspec));
2600
2601 for (m = tp->t_str->sou_first_member; m != NULL; m = m->s_next) {
2602 const type_t *mtp = m->s_type;
2603 if (mtp->t_const)
2604 return true;
2605 if (is_struct_or_union(mtp->t_tspec) &&
2606 has_constant_member(mtp))
2607 return true;
2608 }
2609 return false;
2610 }
2611
2612 /*
2613 * Create a new node for one of the operators POINT and ARROW.
2614 */
2615 static tnode_t *
2616 build_struct_access(op_t op, tnode_t *ln, tnode_t *rn)
2617 {
2618 tnode_t *ntn, *ctn;
2619 bool nolval;
2620
2621 lint_assert(rn->tn_op == NAME);
2622 lint_assert(rn->tn_sym->s_value.v_tspec == INT);
2623 lint_assert(rn->tn_sym->s_scl == MOS || rn->tn_sym->s_scl == MOU);
2624
2625 /*
2626 * Remember if the left operand is an lvalue (structure members
2627 * are lvalues if and only if the structure itself is an lvalue).
2628 */
2629 nolval = op == POINT && !ln->tn_lvalue;
2630
2631 if (op == POINT) {
2632 ln = build_address(ln, true);
2633 } else if (ln->tn_type->t_tspec != PTR) {
2634 lint_assert(tflag);
2635 lint_assert(is_integer(ln->tn_type->t_tspec));
2636 ln = convert(NOOP, 0, expr_derive_type(gettyp(VOID), PTR), ln);
2637 }
2638
2639 ctn = build_integer_constant(PTRDIFF_TSPEC,
2640 rn->tn_sym->s_value.v_quad / CHAR_SIZE);
2641
2642 ntn = new_tnode(PLUS, expr_derive_type(rn->tn_type, PTR), ln, ctn);
2643 if (ln->tn_op == CON)
2644 ntn = fold(ntn);
2645
2646 if (rn->tn_type->t_bitfield) {
2647 ntn = new_tnode(FSEL, ntn->tn_type->t_subt, ntn, NULL);
2648 } else {
2649 ntn = new_tnode(INDIR, ntn->tn_type->t_subt, ntn, NULL);
2650 }
2651
2652 if (nolval)
2653 ntn->tn_lvalue = false;
2654
2655 return ntn;
2656 }
2657
2658 /*
2659 * Create a node for INCAFT, INCBEF, DECAFT and DECBEF.
2660 */
2661 static tnode_t *
2662 build_prepost_incdec(op_t op, tnode_t *ln)
2663 {
2664 tnode_t *cn, *ntn;
2665
2666 lint_assert(ln != NULL);
2667
2668 if (ln->tn_type->t_tspec == PTR) {
2669 cn = plength(ln->tn_type);
2670 } else {
2671 cn = build_integer_constant(INT, (int64_t)1);
2672 }
2673 ntn = new_tnode(op, ln->tn_type, ln, cn);
2674
2675 return ntn;
2676 }
2677
2678 /*
2679 * Create a node for REAL, IMAG
2680 */
2681 static tnode_t *
2682 build_real_imag(op_t op, tnode_t *ln)
2683 {
2684 tnode_t *cn, *ntn;
2685
2686 lint_assert(ln != NULL);
2687
2688 if (ln->tn_op == NAME) {
2689 /*
2690 * This may be too much, but it avoids wrong warnings.
2691 * See d_c99_complex_split.c.
2692 */
2693 mark_as_used(ln->tn_sym, false, false);
2694 mark_as_set(ln->tn_sym);
2695 }
2696
2697 switch (ln->tn_type->t_tspec) {
2698 case LCOMPLEX:
2699 /* XXX: integer and LDOUBLE don't match. */
2700 cn = build_integer_constant(LDOUBLE, (int64_t)1);
2701 break;
2702 case DCOMPLEX:
2703 /* XXX: integer and DOUBLE don't match. */
2704 cn = build_integer_constant(DOUBLE, (int64_t)1);
2705 break;
2706 case FCOMPLEX:
2707 /* XXX: integer and FLOAT don't match. */
2708 cn = build_integer_constant(FLOAT, (int64_t)1);
2709 break;
2710 default:
2711 /* __%s__ is illegal for type %s */
2712 error(276, op == REAL ? "real" : "imag",
2713 type_name(ln->tn_type));
2714 return NULL;
2715 }
2716 ntn = new_tnode(op, cn->tn_type, ln, cn);
2717 ntn->tn_lvalue = true;
2718
2719 return ntn;
2720 }
2721 /*
2722 * Create a tree node for the unary & operator
2723 */
2724 static tnode_t *
2725 build_address(tnode_t *tn, bool noign)
2726 {
2727 tspec_t t;
2728
2729 if (!noign && ((t = tn->tn_type->t_tspec) == ARRAY || t == FUNC)) {
2730 if (tflag)
2731 /* '&' before array or function: ignored */
2732 warning(127);
2733 return tn;
2734 }
2735
2736 /* eliminate &* */
2737 if (tn->tn_op == INDIR &&
2738 tn->tn_left->tn_type->t_tspec == PTR &&
2739 tn->tn_left->tn_type->t_subt == tn->tn_type) {
2740 return tn->tn_left;
2741 }
2742
2743 return new_tnode(ADDR, expr_derive_type(tn->tn_type, PTR), tn, NULL);
2744 }
2745
2746 /*
2747 * Create a node for operators PLUS and MINUS.
2748 */
2749 static tnode_t *
2750 build_plus_minus(op_t op, tnode_t *ln, tnode_t *rn)
2751 {
2752 tnode_t *ntn, *ctn;
2753 type_t *tp;
2754
2755 /* If pointer and integer, then pointer to the lhs. */
2756 if (rn->tn_type->t_tspec == PTR && is_integer(ln->tn_type->t_tspec)) {
2757 ntn = ln;
2758 ln = rn;
2759 rn = ntn;
2760 }
2761
2762 if (ln->tn_type->t_tspec == PTR && rn->tn_type->t_tspec != PTR) {
2763
2764 /* XXX: this assertion should be easy to trigger */
2765 lint_assert(is_integer(rn->tn_type->t_tspec));
2766
2767 check_ctype_macro_invocation(ln, rn);
2768
2769 ctn = plength(ln->tn_type);
2770 if (rn->tn_type->t_tspec != ctn->tn_type->t_tspec)
2771 rn = convert(NOOP, 0, ctn->tn_type, rn);
2772 rn = new_tnode(MULT, rn->tn_type, rn, ctn);
2773 if (rn->tn_left->tn_op == CON)
2774 rn = fold(rn);
2775 ntn = new_tnode(op, ln->tn_type, ln, rn);
2776
2777 } else if (rn->tn_type->t_tspec == PTR) {
2778
2779 lint_assert(ln->tn_type->t_tspec == PTR);
2780 lint_assert(op == MINUS);
2781 tp = gettyp(PTRDIFF_TSPEC);
2782 ntn = new_tnode(op, tp, ln, rn);
2783 if (ln->tn_op == CON && rn->tn_op == CON)
2784 ntn = fold(ntn);
2785 ctn = plength(ln->tn_type);
2786 balance(NOOP, &ntn, &ctn);
2787 ntn = new_tnode(DIV, tp, ntn, ctn);
2788
2789 } else {
2790
2791 ntn = new_tnode(op, ln->tn_type, ln, rn);
2792
2793 }
2794 return ntn;
2795 }
2796
2797 /*
2798 * Create a node for operators SHL and SHR.
2799 */
2800 static tnode_t *
2801 build_bit_shift(op_t op, tnode_t *ln, tnode_t *rn)
2802 {
2803 tspec_t t;
2804 tnode_t *ntn;
2805
2806 if ((t = rn->tn_type->t_tspec) != INT && t != UINT)
2807 rn = convert(CVT, 0, gettyp(INT), rn);
2808 ntn = new_tnode(op, ln->tn_type, ln, rn);
2809 return ntn;
2810 }
2811
2812 /*
2813 * Create a node for COLON.
2814 */
2815 static tnode_t *
2816 build_colon(tnode_t *ln, tnode_t *rn)
2817 {
2818 tspec_t lt, rt, pdt;
2819 type_t *tp;
2820 tnode_t *ntn;
2821
2822 lt = ln->tn_type->t_tspec;
2823 rt = rn->tn_type->t_tspec;
2824 pdt = PTRDIFF_TSPEC;
2825
2826 /*
2827 * Arithmetic types are balanced, all other type combinations
2828 * still need to be handled.
2829 */
2830 if (is_arithmetic(lt) && is_arithmetic(rt)) {
2831 tp = ln->tn_type;
2832 } else if (lt == BOOL && rt == BOOL) {
2833 tp = ln->tn_type;
2834 } else if (lt == VOID || rt == VOID) {
2835 tp = gettyp(VOID);
2836 } else if (lt == STRUCT || lt == UNION) {
2837 /* Both types must be identical. */
2838 lint_assert(rt == STRUCT || rt == UNION);
2839 lint_assert(ln->tn_type->t_str == rn->tn_type->t_str);
2840 if (is_incomplete(ln->tn_type)) {
2841 /* unknown operand size, op %s */
2842 error(138, op_name(COLON));
2843 return NULL;
2844 }
2845 tp = ln->tn_type;
2846 } else if (lt == PTR && is_integer(rt)) {
2847 if (rt != pdt) {
2848 rn = convert(NOOP, 0, gettyp(pdt), rn);
2849 rt = pdt;
2850 }
2851 tp = ln->tn_type;
2852 } else if (rt == PTR && is_integer(lt)) {
2853 if (lt != pdt) {
2854 ln = convert(NOOP, 0, gettyp(pdt), ln);
2855 lt = pdt;
2856 }
2857 tp = rn->tn_type;
2858 } else if (lt == PTR && ln->tn_type->t_subt->t_tspec == VOID) {
2859 tp = merge_qualifiers(rn->tn_type, ln->tn_type);
2860 } else if (rt == PTR && rn->tn_type->t_subt->t_tspec == VOID) {
2861 tp = merge_qualifiers(ln->tn_type, rn->tn_type);
2862 } else {
2863 /*
2864 * XXX For now we simply take the left type. This is
2865 * probably wrong, if one type contains a function prototype
2866 * and the other one, at the same place, only an old style
2867 * declaration.
2868 */
2869 tp = merge_qualifiers(ln->tn_type, rn->tn_type);
2870 }
2871
2872 ntn = new_tnode(COLON, tp, ln, rn);
2873
2874 return ntn;
2875 }
2876
2877 /*
2878 * Create a node for an assignment operator (both = and op= ).
2879 */
2880 static tnode_t *
2881 build_assignment(op_t op, tnode_t *ln, tnode_t *rn)
2882 {
2883 tspec_t lt, rt;
2884 tnode_t *ntn, *ctn;
2885
2886 lint_assert(ln != NULL);
2887 lint_assert(rn != NULL);
2888
2889 lt = ln->tn_type->t_tspec;
2890 rt = rn->tn_type->t_tspec;
2891
2892 if ((op == ADDASS || op == SUBASS) && lt == PTR) {
2893 lint_assert(is_integer(rt));
2894 ctn = plength(ln->tn_type);
2895 if (rn->tn_type->t_tspec != ctn->tn_type->t_tspec)
2896 rn = convert(NOOP, 0, ctn->tn_type, rn);
2897 rn = new_tnode(MULT, rn->tn_type, rn, ctn);
2898 if (rn->tn_left->tn_op == CON)
2899 rn = fold(rn);
2900 }
2901
2902 if ((op == ASSIGN || op == RETURN || op == INIT) &&
2903 (lt == STRUCT || rt == STRUCT)) {
2904 lint_assert(lt == rt);
2905 lint_assert(ln->tn_type->t_str == rn->tn_type->t_str);
2906 if (is_incomplete(ln->tn_type)) {
2907 if (op == RETURN) {
2908 /* cannot return incomplete type */
2909 error(212);
2910 } else {
2911 /* unknown operand size, op %s */
2912 error(138, op_name(op));
2913 }
2914 return NULL;
2915 }
2916 }
2917
2918 if (op == SHLASS) {
2919 if (portable_size_in_bits(lt) < portable_size_in_bits(rt)) {
2920 if (hflag)
2921 /* semantics of '%s' change in ANSI C; ... */
2922 warning(118, "<<=");
2923 }
2924 } else if (op != SHRASS) {
2925 if (op == ASSIGN || lt != PTR) {
2926 if (lt != rt ||
2927 (ln->tn_type->t_bitfield && rn->tn_op == CON)) {
2928 rn = convert(op, 0, ln->tn_type, rn);
2929 rt = lt;
2930 }
2931 }
2932 }
2933
2934 ntn = new_tnode(op, ln->tn_type, ln, rn);
2935
2936 return ntn;
2937 }
2938
2939 /*
2940 * Get length of type tp->t_subt.
2941 */
2942 static tnode_t *
2943 plength(type_t *tp)
2944 {
2945 int elem, elsz;
2946
2947 lint_assert(tp->t_tspec == PTR);
2948 tp = tp->t_subt;
2949
2950 elem = 1;
2951 elsz = 0;
2952
2953 while (tp->t_tspec == ARRAY) {
2954 elem *= tp->t_dim;
2955 tp = tp->t_subt;
2956 }
2957
2958 switch (tp->t_tspec) {
2959 case FUNC:
2960 /* pointer to function is not allowed here */
2961 error(110);
2962 break;
2963 case VOID:
2964 /* cannot do pointer arithmetic on operand of unknown size */
2965 gnuism(136);
2966 break;
2967 case STRUCT:
2968 case UNION:
2969 if ((elsz = tp->t_str->sou_size_in_bits) == 0)
2970 /* cannot do pointer arithmetic on operand of ... */
2971 error(136);
2972 break;
2973 case ENUM:
2974 if (is_incomplete(tp)) {
2975 /* cannot do pointer arithmetic on operand of ... */
2976 warning(136);
2977 }
2978 /* FALLTHROUGH */
2979 default:
2980 if ((elsz = size_in_bits(tp->t_tspec)) == 0) {
2981 /* cannot do pointer arithmetic on operand of ... */
2982 error(136);
2983 } else {
2984 lint_assert(elsz != -1);
2985 }
2986 break;
2987 }
2988
2989 if (elem == 0 && elsz != 0) {
2990 /* cannot do pointer arithmetic on operand of unknown size */
2991 error(136);
2992 }
2993
2994 if (elsz == 0)
2995 elsz = CHAR_SIZE;
2996
2997 return build_integer_constant(PTRDIFF_TSPEC,
2998 (int64_t)(elem * elsz / CHAR_SIZE));
2999 }
3000
3001 /*
3002 * XXX
3003 * Note: There appear to be a number of bugs in detecting overflow in
3004 * this function. An audit and a set of proper regression tests are needed.
3005 * --Perry Metzger, Nov. 16, 2001
3006 */
3007 /*
3008 * Do only as much as necessary to compute constant expressions.
3009 * Called only if the operator allows folding and all operands are constants.
3010 */
3011 static tnode_t *
3012 fold(tnode_t *tn)
3013 {
3014 val_t *v;
3015 tspec_t t;
3016 bool utyp, ovfl;
3017 int64_t sl, sr = 0, q = 0, mask;
3018 uint64_t ul, ur = 0;
3019 tnode_t *cn;
3020
3021 v = xcalloc(1, sizeof(*v));
3022 v->v_tspec = t = tn->tn_type->t_tspec;
3023
3024 utyp = t == PTR || is_uinteger(t);
3025 ul = sl = tn->tn_left->tn_val->v_quad;
3026 if (modtab[tn->tn_op].m_binary)
3027 ur = sr = tn->tn_right->tn_val->v_quad;
3028
3029 mask = value_bits(size_in_bits(t));
3030 ovfl = false;
3031
3032 switch (tn->tn_op) {
3033 case UPLUS:
3034 q = sl;
3035 break;
3036 case UMINUS:
3037 q = -sl;
3038 if (sl != 0 && msb(q, t, -1) == msb(sl, t, -1))
3039 ovfl = true;
3040 break;
3041 case COMPL:
3042 q = ~sl;
3043 break;
3044 case MULT:
3045 if (utyp) {
3046 q = ul * ur;
3047 if (q != (q & mask))
3048 ovfl = true;
3049 else if ((ul != 0) && ((q / ul) != ur))
3050 ovfl = true;
3051 } else {
3052 q = sl * sr;
3053 if (msb(q, t, -1) != (msb(sl, t, -1) ^ msb(sr, t, -1)))
3054 ovfl = true;
3055 }
3056 break;
3057 case DIV:
3058 if (sr == 0) {
3059 /* division by 0 */
3060 error(139);
3061 q = utyp ? UQUAD_MAX : QUAD_MAX;
3062 } else {
3063 q = utyp ? (int64_t)(ul / ur) : sl / sr;
3064 }
3065 break;
3066 case MOD:
3067 if (sr == 0) {
3068 /* modulus by 0 */
3069 error(140);
3070 q = 0;
3071 } else {
3072 q = utyp ? (int64_t)(ul % ur) : sl % sr;
3073 }
3074 break;
3075 case PLUS:
3076 q = utyp ? (int64_t)(ul + ur) : sl + sr;
3077 if (msb(sl, t, -1) != 0 && msb(sr, t, -1) != 0) {
3078 if (msb(q, t, -1) == 0)
3079 ovfl = true;
3080 } else if (msb(sl, t, -1) == 0 && msb(sr, t, -1) == 0) {
3081 if (msb(q, t, -1) != 0)
3082 ovfl = true;
3083 }
3084 break;
3085 case MINUS:
3086 q = utyp ? (int64_t)(ul - ur) : sl - sr;
3087 if (msb(sl, t, -1) != 0 && msb(sr, t, -1) == 0) {
3088 if (msb(q, t, -1) == 0)
3089 ovfl = true;
3090 } else if (msb(sl, t, -1) == 0 && msb(sr, t, -1) != 0) {
3091 if (msb(q, t, -1) != 0)
3092 ovfl = true;
3093 }
3094 break;
3095 case SHL:
3096 q = utyp ? (int64_t)(ul << sr) : sl << sr;
3097 break;
3098 case SHR:
3099 /*
3100 * The sign must be explicitly extended because
3101 * shifts of signed values are implementation dependent.
3102 */
3103 q = ul >> sr;
3104 q = convert_integer(q, t, size_in_bits(t) - (int)sr);
3105 break;
3106 case LT:
3107 q = (utyp ? ul < ur : sl < sr) ? 1 : 0;
3108 break;
3109 case LE:
3110 q = (utyp ? ul <= ur : sl <= sr) ? 1 : 0;
3111 break;
3112 case GE:
3113 q = (utyp ? ul >= ur : sl >= sr) ? 1 : 0;
3114 break;
3115 case GT:
3116 q = (utyp ? ul > ur : sl > sr) ? 1 : 0;
3117 break;
3118 case EQ:
3119 q = (utyp ? ul == ur : sl == sr) ? 1 : 0;
3120 break;
3121 case NE:
3122 q = (utyp ? ul != ur : sl != sr) ? 1 : 0;
3123 break;
3124 case BITAND:
3125 q = utyp ? (int64_t)(ul & ur) : sl & sr;
3126 break;
3127 case BITXOR:
3128 q = utyp ? (int64_t)(ul ^ ur) : sl ^ sr;
3129 break;
3130 case BITOR:
3131 q = utyp ? (int64_t)(ul | ur) : sl | sr;
3132 break;
3133 default:
3134 lint_assert(/*CONSTCOND*/false);
3135 }
3136
3137 /* XXX does not work for quads. */
3138 if (ovfl || ((uint64_t)(q | mask) != ~(uint64_t)0 &&
3139 (q & ~mask) != 0)) {
3140 if (hflag)
3141 /* integer overflow detected, op %s */
3142 warning(141, op_name(tn->tn_op));
3143 }
3144
3145 v->v_quad = convert_integer(q, t, -1);
3146
3147 cn = build_constant(tn->tn_type, v);
3148 if (tn->tn_left->tn_system_dependent)
3149 cn->tn_system_dependent = true;
3150 if (modtab[tn->tn_op].m_binary && tn->tn_right->tn_system_dependent)
3151 cn->tn_system_dependent = true;
3152
3153 return cn;
3154 }
3155
3156 /*
3157 * Fold constant nodes, as much as is needed for comparing the value with 0
3158 * (test context, for controlling expressions).
3159 */
3160 static tnode_t *
3161 fold_test(tnode_t *tn)
3162 {
3163 bool l, r;
3164 val_t *v;
3165
3166 v = xcalloc(1, sizeof(*v));
3167 v->v_tspec = tn->tn_type->t_tspec;
3168 lint_assert(v->v_tspec == INT || (Tflag && v->v_tspec == BOOL));
3169
3170 l = constant_is_nonzero(tn->tn_left);
3171 r = modtab[tn->tn_op].m_binary && constant_is_nonzero(tn->tn_right);
3172
3173 switch (tn->tn_op) {
3174 case NOT:
3175 if (hflag && !constcond_flag)
3176 /* constant argument to '!' */
3177 warning(239);
3178 v->v_quad = !l ? 1 : 0;
3179 break;
3180 case LOGAND:
3181 v->v_quad = l && r ? 1 : 0;
3182 break;
3183 case LOGOR:
3184 v->v_quad = l || r ? 1 : 0;
3185 break;
3186 default:
3187 lint_assert(/*CONSTCOND*/false);
3188 }
3189
3190 return build_constant(tn->tn_type, v);
3191 }
3192
3193 /*
3194 * Fold constant nodes having operands with floating point type.
3195 */
3196 static tnode_t *
3197 fold_float(tnode_t *tn)
3198 {
3199 val_t *v;
3200 tspec_t t;
3201 ldbl_t l, r = 0;
3202
3203 fpe = 0;
3204 v = xcalloc(1, sizeof(*v));
3205 v->v_tspec = t = tn->tn_type->t_tspec;
3206
3207 lint_assert(is_floating(t));
3208 lint_assert(t == tn->tn_left->tn_type->t_tspec);
3209 lint_assert(!modtab[tn->tn_op].m_binary ||
3210 t == tn->tn_right->tn_type->t_tspec);
3211
3212 l = tn->tn_left->tn_val->v_ldbl;
3213 if (modtab[tn->tn_op].m_binary)
3214 r = tn->tn_right->tn_val->v_ldbl;
3215
3216 switch (tn->tn_op) {
3217 case UPLUS:
3218 v->v_ldbl = l;
3219 break;
3220 case UMINUS:
3221 v->v_ldbl = -l;
3222 break;
3223 case MULT:
3224 v->v_ldbl = l * r;
3225 break;
3226 case DIV:
3227 if (r == 0.0) {
3228 /* division by 0 */
3229 error(139);
3230 if (t == FLOAT) {
3231 v->v_ldbl = l < 0 ? -FLT_MAX : FLT_MAX;
3232 } else if (t == DOUBLE) {
3233 v->v_ldbl = l < 0 ? -DBL_MAX : DBL_MAX;
3234 } else {
3235 v->v_ldbl = l < 0 ? -LDBL_MAX : LDBL_MAX;
3236 }
3237 } else {
3238 v->v_ldbl = l / r;
3239 }
3240 break;
3241 case PLUS:
3242 v->v_ldbl = l + r;
3243 break;
3244 case MINUS:
3245 v->v_ldbl = l - r;
3246 break;
3247 case LT:
3248 v->v_quad = l < r ? 1 : 0;
3249 break;
3250 case LE:
3251 v->v_quad = l <= r ? 1 : 0;
3252 break;
3253 case GE:
3254 v->v_quad = l >= r ? 1 : 0;
3255 break;
3256 case GT:
3257 v->v_quad = l > r ? 1 : 0;
3258 break;
3259 case EQ:
3260 v->v_quad = l == r ? 1 : 0;
3261 break;
3262 case NE:
3263 v->v_quad = l != r ? 1 : 0;
3264 break;
3265 default:
3266 lint_assert(/*CONSTCOND*/false);
3267 }
3268
3269 lint_assert(fpe != 0 || isnan((double)v->v_ldbl) == 0);
3270 if (fpe != 0 || finite((double)v->v_ldbl) == 0 ||
3271 (t == FLOAT &&
3272 (v->v_ldbl > FLT_MAX || v->v_ldbl < -FLT_MAX)) ||
3273 (t == DOUBLE &&
3274 (v->v_ldbl > DBL_MAX || v->v_ldbl < -DBL_MAX))) {
3275 /* floating point overflow detected, op %s */
3276 warning(142, op_name(tn->tn_op));
3277 if (t == FLOAT) {
3278 v->v_ldbl = v->v_ldbl < 0 ? -FLT_MAX : FLT_MAX;
3279 } else if (t == DOUBLE) {
3280 v->v_ldbl = v->v_ldbl < 0 ? -DBL_MAX : DBL_MAX;
3281 } else {
3282 v->v_ldbl = v->v_ldbl < 0 ? -LDBL_MAX: LDBL_MAX;
3283 }
3284 fpe = 0;
3285 }
3286
3287 return build_constant(tn->tn_type, v);
3288 }
3289
3290
3291 /*
3292 * Create a constant node for sizeof.
3293 */
3294 tnode_t *
3295 build_sizeof(const type_t *tp)
3296 {
3297 int64_t size_in_bytes = type_size_in_bits(tp) / CHAR_SIZE;
3298 tnode_t *tn = build_integer_constant(SIZEOF_TSPEC, size_in_bytes);
3299 tn->tn_system_dependent = true;
3300 return tn;
3301 }
3302
3303 /*
3304 * Create a constant node for offsetof.
3305 */
3306 tnode_t *
3307 build_offsetof(const type_t *tp, const sym_t *sym)
3308 {
3309 tspec_t t = tp->t_tspec;
3310 if (t != STRUCT && t != UNION)
3311 /* unacceptable operand of '%s' */
3312 error(111, "offsetof");
3313
3314 // XXX: wrong size, no checking for sym fixme
3315 int64_t offset_in_bytes = type_size_in_bits(tp) / CHAR_SIZE;
3316 tnode_t *tn = build_integer_constant(SIZEOF_TSPEC, offset_in_bytes);
3317 tn->tn_system_dependent = true;
3318 return tn;
3319 }
3320
3321 int64_t
3322 type_size_in_bits(const type_t *tp)
3323 {
3324 int elem, elsz;
3325 bool flex;
3326
3327 elem = 1;
3328 flex = false;
3329 while (tp->t_tspec == ARRAY) {
3330 flex = true; /* allow c99 flex arrays [] [0] */
3331 elem *= tp->t_dim;
3332 tp = tp->t_subt;
3333 }
3334 if (elem == 0) {
3335 if (!flex) {
3336 /* cannot take size/alignment of incomplete type */
3337 error(143);
3338 elem = 1;
3339 }
3340 }
3341 switch (tp->t_tspec) {
3342 case FUNC:
3343 /* cannot take size/alignment of function */
3344 error(144);
3345 elsz = 1;
3346 break;
3347 case STRUCT:
3348 case UNION:
3349 if (is_incomplete(tp)) {
3350 /* cannot take size/alignment of incomplete type */
3351 error(143);
3352 elsz = 1;
3353 } else {
3354 elsz = tp->t_str->sou_size_in_bits;
3355 }
3356 break;
3357 case ENUM:
3358 if (is_incomplete(tp)) {
3359 /* cannot take size/alignment of incomplete type */
3360 warning(143);
3361 }
3362 /* FALLTHROUGH */
3363 default:
3364 if (tp->t_bitfield) {
3365 /* cannot take size/alignment of bit-field */
3366 error(145);
3367 }
3368 if (tp->t_tspec == VOID) {
3369 /* cannot take size/alignment of void */
3370 error(146);
3371 elsz = 1;
3372 } else {
3373 elsz = size_in_bits(tp->t_tspec);
3374 lint_assert(elsz > 0);
3375 }
3376 break;
3377 }
3378
3379 return (int64_t)elem * elsz;
3380 }
3381
3382 tnode_t *
3383 build_alignof(const type_t *tp)
3384 {
3385 switch (tp->t_tspec) {
3386 case ARRAY:
3387 break;
3388
3389 case FUNC:
3390 /* cannot take size/alignment of function */
3391 error(144);
3392 return 0;
3393
3394 case STRUCT:
3395 case UNION:
3396 if (is_incomplete(tp)) {
3397 /* cannot take size/alignment of incomplete type */
3398 error(143);
3399 return 0;
3400 }
3401 break;
3402 case ENUM:
3403 break;
3404 default:
3405 if (tp->t_bitfield) {
3406 /* cannot take size/alignment of bit-field */
3407 error(145);
3408 return 0;
3409 }
3410 if (tp->t_tspec == VOID) {
3411 /* cannot take size/alignment of void */
3412 error(146);
3413 return 0;
3414 }
3415 break;
3416 }
3417
3418 return build_integer_constant(SIZEOF_TSPEC,
3419 (int64_t)alignment_in_bits(tp) / CHAR_SIZE);
3420 }
3421
3422 /*
3423 * Type casts.
3424 */
3425 tnode_t *
3426 cast(tnode_t *tn, type_t *tp)
3427 {
3428 tspec_t nt, ot;
3429
3430 if (tn == NULL)
3431 return NULL;
3432
3433 /*
3434 * XXX: checking for tp == NULL is only a quick fix for PR 22119.
3435 * The proper fix needs to be investigated properly.
3436 * See d_pr_22119.c for how to get here.
3437 */
3438 if (tp == NULL)
3439 return NULL;
3440
3441 tn = cconv(tn);
3442
3443 nt = tp->t_tspec;
3444 ot = tn->tn_type->t_tspec;
3445
3446 if (nt == VOID) {
3447 /*
3448 * XXX ANSI C requires scalar types or void (Plauger & Brodie).
3449 * But this seems really questionable.
3450 */
3451 } else if (nt == UNION) {
3452 sym_t *m;
3453 struct_or_union *str = tp->t_str;
3454 if (!gflag) {
3455 /* union cast is a GCC extension */
3456 error(328);
3457 return NULL;
3458 }
3459 for (m = str->sou_first_member; m != NULL; m = m->s_next) {
3460 if (eqtype(m->s_type, tn->tn_type,
3461 false, false, NULL)) {
3462 tn = expr_zalloc_tnode();
3463 tn->tn_op = CVT;
3464 tn->tn_type = tp;
3465 tn->tn_cast = true;
3466 tn->tn_right = NULL;
3467 return tn;
3468 }
3469 }
3470 /* type '%s' is not a member of '%s' */
3471 error(329, type_name(tn->tn_type), type_name(tp));
3472 return NULL;
3473 } else if (nt == STRUCT || nt == ARRAY || nt == FUNC) {
3474 /* Casting to a struct is an undocumented GCC extension. */
3475 if (!(gflag && nt == STRUCT))
3476 goto invalid_cast;
3477 } else if (ot == STRUCT || ot == UNION) {
3478 goto invalid_cast;
3479 } else if (ot == VOID) {
3480 /* improper cast of void expression */
3481 error(148);
3482 return NULL;
3483 } else if (is_integer(nt) && is_scalar(ot)) {
3484 /* ok */
3485 } else if (is_floating(nt) && is_arithmetic(ot)) {
3486 /* ok */
3487 } else if (nt == PTR && is_integer(ot)) {
3488 /* ok */
3489 } else if (nt == PTR && ot == PTR) {
3490 if (!tp->t_subt->t_const && tn->tn_type->t_subt->t_const) {
3491 if (hflag)
3492 /* cast discards 'const' from type '%s' */
3493 warning(275, type_name(tn->tn_type));
3494 }
3495 } else
3496 goto invalid_cast;
3497
3498 tn = convert(CVT, 0, tp, tn);
3499 tn->tn_cast = true;
3500
3501 return tn;
3502
3503 invalid_cast:
3504 /* invalid cast from '%s' to '%s' */
3505 error(147, type_name(tn->tn_type), type_name(tp));
3506 return NULL;
3507 }
3508
3509 /*
3510 * Create the node for a function argument.
3511 * All necessary conversions and type checks are done in
3512 * build_function_call because build_function_argument has no
3513 * information about expected argument types.
3514 */
3515 tnode_t *
3516 build_function_argument(tnode_t *args, tnode_t *arg)
3517 {
3518 tnode_t *ntn;
3519
3520 /*
3521 * If there was a serious error in the expression for the argument,
3522 * create a dummy argument so the positions of the remaining arguments
3523 * will not change.
3524 */
3525 if (arg == NULL)
3526 arg = build_integer_constant(INT, 0);
3527
3528 ntn = new_tnode(PUSH, arg->tn_type, arg, args);
3529
3530 return ntn;
3531 }
3532
3533 /*
3534 * Create the node for a function call. Also check types of
3535 * function arguments and insert conversions, if necessary.
3536 */
3537 tnode_t *
3538 build_function_call(tnode_t *func, tnode_t *args)
3539 {
3540 tnode_t *ntn;
3541 op_t fcop;
3542
3543 if (func == NULL)
3544 return NULL;
3545
3546 if (func->tn_op == NAME && func->tn_type->t_tspec == FUNC) {
3547 fcop = CALL;
3548 } else {
3549 fcop = ICALL;
3550 }
3551
3552 check_ctype_function_call(func, args);
3553
3554 /*
3555 * after cconv() func will always be a pointer to a function
3556 * if it is a valid function designator.
3557 */
3558 func = cconv(func);
3559
3560 if (func->tn_type->t_tspec != PTR ||
3561 func->tn_type->t_subt->t_tspec != FUNC) {
3562 /* illegal function (type %s) */
3563 error(149, type_name(func->tn_type));
3564 return NULL;
3565 }
3566
3567 args = check_function_arguments(func->tn_type->t_subt, args);
3568
3569 ntn = new_tnode(fcop, func->tn_type->t_subt->t_subt, func, args);
3570
3571 return ntn;
3572 }
3573
3574 /*
3575 * Check types of all function arguments and insert conversions,
3576 * if necessary.
3577 */
3578 static tnode_t *
3579 check_function_arguments(type_t *ftp, tnode_t *args)
3580 {
3581 tnode_t *arg;
3582 sym_t *asym;
3583 tspec_t at;
3584 int narg, npar, n, i;
3585
3586 /* get # of args in the prototype */
3587 npar = 0;
3588 for (asym = ftp->t_args; asym != NULL; asym = asym->s_next)
3589 npar++;
3590
3591 /* get # of args in function call */
3592 narg = 0;
3593 for (arg = args; arg != NULL; arg = arg->tn_right)
3594 narg++;
3595
3596 asym = ftp->t_args;
3597 if (ftp->t_proto && npar != narg && !(ftp->t_vararg && npar < narg)) {
3598 /* argument mismatch: %d arg%s passed, %d expected */
3599 error(150, narg, narg > 1 ? "s" : "", npar);
3600 asym = NULL;
3601 }
3602
3603 for (n = 1; n <= narg; n++) {
3604
3605 /*
3606 * The rightmost argument is at the top of the argument
3607 * subtree.
3608 */
3609 for (i = narg, arg = args; i > n; i--, arg = arg->tn_right)
3610 continue;
3611
3612 /* some things which are always not allowed */
3613 if ((at = arg->tn_left->tn_type->t_tspec) == VOID) {
3614 /* void expressions may not be arguments, arg #%d */
3615 error(151, n);
3616 return NULL;
3617 } else if ((at == STRUCT || at == UNION) &&
3618 is_incomplete(arg->tn_left->tn_type)) {
3619 /* argument cannot have unknown size, arg #%d */
3620 error(152, n);
3621 return NULL;
3622 } else if (is_integer(at) &&
3623 arg->tn_left->tn_type->t_is_enum &&
3624 is_incomplete(arg->tn_left->tn_type)) {
3625 /* argument cannot have unknown size, arg #%d */
3626 warning(152, n);
3627 }
3628
3629 /* class conversions (arg in value context) */
3630 arg->tn_left = cconv(arg->tn_left);
3631
3632 if (asym != NULL) {
3633 arg->tn_left = check_prototype_argument(
3634 n, asym->s_type, arg->tn_left);
3635 } else {
3636 arg->tn_left = promote(NOOP, true, arg->tn_left);
3637 }
3638 arg->tn_type = arg->tn_left->tn_type;
3639
3640 if (asym != NULL)
3641 asym = asym->s_next;
3642 }
3643
3644 return args;
3645 }
3646
3647 /*
3648 * Compare the type of an argument with the corresponding type of a
3649 * prototype parameter. If it is a valid combination, but both types
3650 * are not the same, insert a conversion to convert the argument into
3651 * the type of the parameter.
3652 */
3653 static tnode_t *
3654 check_prototype_argument(
3655 int n, /* pos of arg */
3656 type_t *tp, /* expected type (from prototype) */
3657 tnode_t *tn) /* argument */
3658 {
3659 tnode_t *ln;
3660 bool dowarn;
3661
3662 ln = xcalloc(1, sizeof(*ln));
3663 ln->tn_type = expr_unqualified_type(tp);
3664 ln->tn_lvalue = true;
3665 if (typeok(FARG, n, ln, tn)) {
3666 if (!eqtype(tp, tn->tn_type,
3667 true, false, (dowarn = false, &dowarn)) || dowarn)
3668 tn = convert(FARG, n, tp, tn);
3669 }
3670 free(ln);
3671 return tn;
3672 }
3673
3674 /*
3675 * Return the value of an integral constant expression.
3676 * If the expression is not constant or its type is not an integer
3677 * type, an error message is printed.
3678 */
3679 val_t *
3680 constant(tnode_t *tn, bool required)
3681 {
3682 val_t *v;
3683
3684 if (tn != NULL)
3685 tn = cconv(tn);
3686 if (tn != NULL)
3687 tn = promote(NOOP, false, tn);
3688
3689 v = xcalloc(1, sizeof(*v));
3690
3691 if (tn == NULL) {
3692 lint_assert(nerr != 0);
3693 debug_step("constant node is null; returning 1 instead");
3694 v->v_tspec = INT;
3695 v->v_quad = 1;
3696 return v;
3697 }
3698
3699 v->v_tspec = tn->tn_type->t_tspec;
3700
3701 if (tn->tn_op == CON) {
3702 lint_assert(tn->tn_type->t_tspec == tn->tn_val->v_tspec);
3703 if (is_integer(tn->tn_val->v_tspec)) {
3704 v->v_unsigned_since_c90 =
3705 tn->tn_val->v_unsigned_since_c90;
3706 v->v_quad = tn->tn_val->v_quad;
3707 return v;
3708 }
3709 v->v_quad = tn->tn_val->v_ldbl;
3710 } else {
3711 v->v_quad = 1;
3712 }
3713
3714 if (required)
3715 /* integral constant expression expected */
3716 error(55);
3717 else
3718 /* variable array dimension is a C99/GCC extension */
3719 c99ism(318);
3720
3721 if (!is_integer(v->v_tspec))
3722 v->v_tspec = INT;
3723
3724 return v;
3725 }
3726
3727 static bool
3728 is_constcond_false(const tnode_t *tn, tspec_t t)
3729 {
3730 return (t == BOOL || t == INT) &&
3731 tn->tn_op == CON && tn->tn_val->v_quad == 0;
3732 }
3733
3734 /*
3735 * Perform some tests on expressions which can't be done in build_binary()
3736 * and functions called by build_binary(). These tests must be done here
3737 * because we need some information about the context in which the operations
3738 * are performed.
3739 * After all tests are performed and dofreeblk is true, expr() frees the
3740 * memory which is used for the expression.
3741 */
3742 void
3743 expr(tnode_t *tn, bool vctx, bool tctx, bool dofreeblk, bool is_do_while)
3744 {
3745
3746 if (tn == NULL) { /* in case of errors */
3747 expr_free_all();
3748 return;
3749 }
3750
3751 /* expr() is also called in global initializations */
3752 if (dcs->d_ctx != EXTERN && !is_do_while)
3753 check_statement_reachable();
3754
3755 check_expr_misc(tn, vctx, tctx, !tctx, false, false, false);
3756 if (tn->tn_op == ASSIGN) {
3757 if (hflag && tctx)
3758 /* assignment in conditional context */
3759 warning(159);
3760 } else if (tn->tn_op == CON) {
3761 if (hflag && tctx && !constcond_flag &&
3762 !tn->tn_system_dependent &&
3763 !(is_do_while &&
3764 is_constcond_false(tn, tn->tn_type->t_tspec)))
3765 /* constant in conditional context */
3766 warning(161);
3767 }
3768 if (!modtab[tn->tn_op].m_has_side_effect) {
3769 /*
3770 * for left operands of COMMA this warning is already
3771 * printed
3772 */
3773 if (tn->tn_op != COMMA && !vctx && !tctx)
3774 check_null_effect(tn);
3775 }
3776 debug_node(tn);
3777
3778 /* free the tree memory */
3779 if (dofreeblk)
3780 expr_free_all();
3781 }
3782
3783 static bool
3784 has_side_effect(const tnode_t *tn) // NOLINT(misc-no-recursion)
3785 {
3786 op_t op = tn->tn_op;
3787
3788 if (modtab[op].m_has_side_effect)
3789 return true;
3790
3791 if (op == CVT && tn->tn_type->t_tspec == VOID)
3792 return has_side_effect(tn->tn_left);
3793
3794 /* XXX: Why not has_side_effect(tn->tn_left) as well? */
3795 if (op == LOGAND || op == LOGOR)
3796 return has_side_effect(tn->tn_right);
3797
3798 /* XXX: Why not has_side_effect(tn->tn_left) as well? */
3799 if (op == QUEST)
3800 return has_side_effect(tn->tn_right);
3801
3802 if (op == COLON || op == COMMA) {
3803 return has_side_effect(tn->tn_left) ||
3804 has_side_effect(tn->tn_right);
3805 }
3806
3807 return false;
3808 }
3809
3810 static void
3811 check_null_effect(const tnode_t *tn)
3812 {
3813
3814 if (hflag && !has_side_effect(tn)) {
3815 /* expression has null effect */
3816 warning(129);
3817 }
3818 }
3819
3820 /* ARGSUSED */
3821 void
3822 check_expr_misc(const tnode_t *tn, bool vctx, bool tctx,
3823 bool eqwarn, bool fcall, bool rvdisc, bool szof)
3824 {
3825 tnode_t *ln, *rn;
3826 const mod_t *mp;
3827 op_t op;
3828 scl_t sc;
3829 dinfo_t *di;
3830
3831 if (tn == NULL)
3832 return;
3833
3834 ln = tn->tn_left;
3835 rn = tn->tn_right;
3836 mp = &modtab[op = tn->tn_op];
3837
3838 switch (op) {
3839 case ADDR:
3840 /* XXX: Taking warn_about_unreachable into account here feels wrong. */
3841 if (ln->tn_op == NAME && (reached || !warn_about_unreachable)) {
3842 if (!szof)
3843 mark_as_set(ln->tn_sym);
3844 mark_as_used(ln->tn_sym, fcall, szof);
3845 }
3846 if (ln->tn_op == INDIR && ln->tn_left->tn_op == PLUS)
3847 /* check the range of array indices */
3848 check_array_index(ln->tn_left, true);
3849 break;
3850 case LOAD:
3851 if (ln->tn_op == INDIR && ln->tn_left->tn_op == PLUS)
3852 /* check the range of array indices */
3853 check_array_index(ln->tn_left, false);
3854 /* FALLTHROUGH */
3855 case PUSH:
3856 case INCBEF:
3857 case DECBEF:
3858 case INCAFT:
3859 case DECAFT:
3860 case ADDASS:
3861 case SUBASS:
3862 case MULASS:
3863 case DIVASS:
3864 case MODASS:
3865 case ANDASS:
3866 case ORASS:
3867 case XORASS:
3868 case SHLASS:
3869 case SHRASS:
3870 case REAL:
3871 case IMAG:
3872 /* XXX: Taking warn_about_unreachable into account here feels wrong. */
3873 if (ln->tn_op == NAME && (reached || !warn_about_unreachable)) {
3874 sc = ln->tn_sym->s_scl;
3875 /*
3876 * Look if there was a asm statement in one of the
3877 * compound statements we are in. If not, we don't
3878 * print a warning.
3879 */
3880 for (di = dcs; di != NULL; di = di->d_next) {
3881 if (di->d_asm)
3882 break;
3883 }
3884 if (sc != EXTERN && sc != STATIC &&
3885 !ln->tn_sym->s_set && !szof && di == NULL) {
3886 /* %s may be used before set */
3887 warning(158, ln->tn_sym->s_name);
3888 mark_as_set(ln->tn_sym);
3889 }
3890 mark_as_used(ln->tn_sym, false, false);
3891 }
3892 break;
3893 case ASSIGN:
3894 /* XXX: Taking warn_about_unreachable into account here feels wrong. */
3895 if (ln->tn_op == NAME && !szof && (reached || !warn_about_unreachable)) {
3896 mark_as_set(ln->tn_sym);
3897 if (ln->tn_sym->s_scl == EXTERN)
3898 outusg(ln->tn_sym);
3899 }
3900 if (ln->tn_op == INDIR && ln->tn_left->tn_op == PLUS)
3901 /* check the range of array indices */
3902 check_array_index(ln->tn_left, false);
3903 break;
3904 case CALL:
3905 lint_assert(ln->tn_op == ADDR);
3906 lint_assert(ln->tn_left->tn_op == NAME);
3907 if (!szof)
3908 outcall(tn, vctx || tctx, rvdisc);
3909 break;
3910 case EQ:
3911 if (hflag && eqwarn)
3912 /* operator '==' found where '=' was expected */
3913 warning(160);
3914 break;
3915 case CON:
3916 case NAME:
3917 case STRING:
3918 return;
3919 /* LINTED206: (enumeration values not handled in switch) */
3920 case BITOR:
3921 case BITXOR:
3922 case NE:
3923 case GE:
3924 case GT:
3925 case LE:
3926 case LT:
3927 case SHR:
3928 case SHL:
3929 case MINUS:
3930 case PLUS:
3931 case MOD:
3932 case DIV:
3933 case MULT:
3934 case INDIR:
3935 case UMINUS:
3936 case UPLUS:
3937 case DEC:
3938 case INC:
3939 case COMPL:
3940 case NOT:
3941 case POINT:
3942 case ARROW:
3943 case NOOP:
3944 case BITAND:
3945 case FARG:
3946 case CASE:
3947 case INIT:
3948 case RETURN:
3949 case ICALL:
3950 case CVT:
3951 case COMMA:
3952 case FSEL:
3953 case COLON:
3954 case QUEST:
3955 case LOGOR:
3956 case LOGAND:
3957 break;
3958 }
3959
3960 bool cvctx = mp->m_left_value_context;
3961 bool ctctx = mp->m_left_test_context;
3962 bool eq = mp->m_warn_if_operand_eq &&
3963 !ln->tn_parenthesized &&
3964 rn != NULL && !rn->tn_parenthesized;
3965
3966 /*
3967 * values of operands of ':' are not used if the type of at least
3968 * one of the operands (for gcc compatibility) is void
3969 * XXX test/value context of QUEST should probably be used as
3970 * context for both operands of COLON
3971 */
3972 if (op == COLON && tn->tn_type->t_tspec == VOID)
3973 cvctx = ctctx = false;
3974 bool discard = op == CVT && tn->tn_type->t_tspec == VOID;
3975 check_expr_misc(ln, cvctx, ctctx, eq, op == CALL, discard, szof);
3976
3977 switch (op) {
3978 case PUSH:
3979 if (rn != NULL)
3980 check_expr_misc(rn, false, false, eq, false, false,
3981 szof);
3982 break;
3983 case LOGAND:
3984 case LOGOR:
3985 check_expr_misc(rn, false, true, eq, false, false, szof);
3986 break;
3987 case COLON:
3988 check_expr_misc(rn, cvctx, ctctx, eq, false, false, szof);
3989 break;
3990 case COMMA:
3991 check_expr_misc(rn, vctx, tctx, eq, false, false, szof);
3992 break;
3993 default:
3994 if (mp->m_binary)
3995 check_expr_misc(rn, true, false, eq, false, false,
3996 szof);
3997 break;
3998 }
3999 }
4000
4001 /*
4002 * Checks the range of array indices, if possible.
4003 * amper is set if only the address of the element is used. This
4004 * means that the index is allowed to refer to the first element
4005 * after the array.
4006 */
4007 static void
4008 check_array_index(tnode_t *tn, bool amper)
4009 {
4010 int dim;
4011 tnode_t *ln, *rn;
4012 int elsz;
4013 int64_t con;
4014
4015 ln = tn->tn_left;
4016 rn = tn->tn_right;
4017
4018 /* We can only check constant indices. */
4019 if (rn->tn_op != CON)
4020 return;
4021
4022 /* Return if the left node does not stem from an array. */
4023 if (ln->tn_op != ADDR)
4024 return;
4025 if (ln->tn_left->tn_op != STRING && ln->tn_left->tn_op != NAME)
4026 return;
4027 if (ln->tn_left->tn_type->t_tspec != ARRAY)
4028 return;
4029
4030 /*
4031 * For incomplete array types, we can print a warning only if
4032 * the index is negative.
4033 */
4034 if (is_incomplete(ln->tn_left->tn_type) && rn->tn_val->v_quad >= 0)
4035 return;
4036
4037 /* Get the size of one array element */
4038 if ((elsz = length(ln->tn_type->t_subt, NULL)) == 0)
4039 return;
4040 elsz /= CHAR_SIZE;
4041
4042 /* Change the unit of the index from bytes to element size. */
4043 if (is_uinteger(rn->tn_type->t_tspec)) {
4044 con = (uint64_t)rn->tn_val->v_quad / elsz;
4045 } else {
4046 con = rn->tn_val->v_quad / elsz;
4047 }
4048
4049 dim = ln->tn_left->tn_type->t_dim + (amper ? 1 : 0);
4050
4051 if (!is_uinteger(rn->tn_type->t_tspec) && con < 0) {
4052 /* array subscript cannot be negative: %ld */
4053 warning(167, (long)con);
4054 } else if (dim > 0 && (uint64_t)con >= (uint64_t)dim) {
4055 /* array subscript cannot be > %d: %ld */
4056 warning(168, dim - 1, (long)con);
4057 }
4058 }
4059
4060 /*
4061 * Check for ordered comparisons of unsigned values with 0.
4062 */
4063 static void
4064 check_integer_comparison(op_t op, tnode_t *ln, tnode_t *rn)
4065 {
4066 tspec_t lt, rt;
4067
4068 lt = ln->tn_type->t_tspec;
4069 rt = rn->tn_type->t_tspec;
4070
4071 if (ln->tn_op != CON && rn->tn_op != CON)
4072 return;
4073
4074 if (!is_integer(lt) || !is_integer(rt))
4075 return;
4076
4077 if ((hflag || pflag) && lt == CHAR && rn->tn_op == CON &&
4078 (rn->tn_val->v_quad < 0 ||
4079 rn->tn_val->v_quad > (int)~(~0U << (CHAR_SIZE - 1)))) {
4080 /* nonportable character comparison, op %s */
4081 warning(230, op_name(op));
4082 return;
4083 }
4084 if ((hflag || pflag) && rt == CHAR && ln->tn_op == CON &&
4085 (ln->tn_val->v_quad < 0 ||
4086 ln->tn_val->v_quad > (int)~(~0U << (CHAR_SIZE - 1)))) {
4087 /* nonportable character comparison, op %s */
4088 warning(230, op_name(op));
4089 return;
4090 }
4091 if (is_uinteger(lt) && !is_uinteger(rt) &&
4092 rn->tn_op == CON && rn->tn_val->v_quad <= 0) {
4093 if (rn->tn_val->v_quad < 0) {
4094 /* comparison of %s with %s, op %s */
4095 warning(162, type_name(ln->tn_type),
4096 "negative constant", op_name(op));
4097 } else if (op == LT || op == GE || (hflag && op == LE)) {
4098 /* comparison of %s with %s, op %s */
4099 warning(162, type_name(ln->tn_type), "0", op_name(op));
4100 }
4101 return;
4102 }
4103 if (is_uinteger(rt) && !is_uinteger(lt) &&
4104 ln->tn_op == CON && ln->tn_val->v_quad <= 0) {
4105 if (ln->tn_val->v_quad < 0) {
4106 /* comparison of %s with %s, op %s */
4107 warning(162, "negative constant",
4108 type_name(rn->tn_type), op_name(op));
4109 } else if (op == GT || op == LE || (hflag && op == GE)) {
4110 /* comparison of %s with %s, op %s */
4111 warning(162, "0", type_name(rn->tn_type), op_name(op));
4112 }
4113 return;
4114 }
4115 }
4116
4117 /*
4118 * Return whether the expression can be used for static initialization.
4119 *
4120 * Constant initialization expressions must be constant or an address
4121 * of a static object with an optional offset. In the first case,
4122 * the result is returned in *offsp. In the second case, the static
4123 * object is returned in *symp and the offset in *offsp.
4124 *
4125 * The expression can consist of PLUS, MINUS, ADDR, NAME, STRING and
4126 * CON. Type conversions are allowed if they do not change binary
4127 * representation (including width).
4128 *
4129 * C99 6.6 "Constant expressions"
4130 * C99 6.7.8p4 restricts initializers for static storage duration
4131 */
4132 bool
4133 constant_addr(const tnode_t *tn, const sym_t **symp, ptrdiff_t *offsp)
4134 {
4135 const sym_t *sym;
4136 ptrdiff_t offs1, offs2;
4137 tspec_t t, ot;
4138
4139 switch (tn->tn_op) {
4140 case MINUS:
4141 if (tn->tn_right->tn_op == CVT)
4142 return constant_addr(tn->tn_right, symp, offsp);
4143 else if (tn->tn_right->tn_op != CON)
4144 return false;
4145 /* FALLTHROUGH */
4146 case PLUS:
4147 offs1 = offs2 = 0;
4148 if (tn->tn_left->tn_op == CON) {
4149 offs1 = (ptrdiff_t)tn->tn_left->tn_val->v_quad;
4150 if (!constant_addr(tn->tn_right, &sym, &offs2))
4151 return false;
4152 } else if (tn->tn_right->tn_op == CON) {
4153 offs2 = (ptrdiff_t)tn->tn_right->tn_val->v_quad;
4154 if (tn->tn_op == MINUS)
4155 offs2 = -offs2;
4156 if (!constant_addr(tn->tn_left, &sym, &offs1))
4157 return false;
4158 } else {
4159 return false;
4160 }
4161 *symp = sym;
4162 *offsp = offs1 + offs2;
4163 return true;
4164 case ADDR:
4165 if (tn->tn_left->tn_op == NAME) {
4166 *symp = tn->tn_left->tn_sym;
4167 *offsp = 0;
4168 return true;
4169 } else {
4170 /*
4171 * If this would be the front end of a compiler we
4172 * would return a label instead of 0, at least if
4173 * 'tn->tn_left->tn_op == STRING'.
4174 */
4175 *symp = NULL;
4176 *offsp = 0;
4177 return true;
4178 }
4179 case CVT:
4180 t = tn->tn_type->t_tspec;
4181 ot = tn->tn_left->tn_type->t_tspec;
4182 if ((!is_integer(t) && t != PTR) ||
4183 (!is_integer(ot) && ot != PTR)) {
4184 return false;
4185 }
4186 #ifdef notdef
4187 /*
4188 * consider:
4189 * struct foo {
4190 * unsigned char a;
4191 * } f = {
4192 * (u_char)(u_long)(&(((struct foo *)0)->a))
4193 * };
4194 * since psize(u_long) != psize(u_char) this fails.
4195 */
4196 else if (psize(t) != psize(ot))
4197 return -1;
4198 #endif
4199 return constant_addr(tn->tn_left, symp, offsp);
4200 default:
4201 return false;
4202 }
4203 }
4204
4205 /*
4206 * Concatenate two string constants.
4207 */
4208 strg_t *
4209 cat_strings(strg_t *strg1, strg_t *strg2)
4210 {
4211 size_t len1, len2, len;
4212
4213 if (strg1->st_tspec != strg2->st_tspec) {
4214 /* cannot concatenate wide and regular string literals */
4215 error(292);
4216 return strg1;
4217 }
4218
4219 len1 = strg1->st_len;
4220 len2 = strg2->st_len + 1; /* + NUL */
4221 len = len1 + len2;
4222
4223 #define COPY(F) \
4224 do { \
4225 strg1->F = xrealloc(strg1->F, len * sizeof(*strg1->F)); \
4226 (void)memcpy(strg1->F + len1, strg2->F, len2 * sizeof(*strg1->F)); \
4227 free(strg2->F); \
4228 } while (false)
4229
4230 if (strg1->st_tspec == CHAR)
4231 COPY(st_cp);
4232 else
4233 COPY(st_wcp);
4234
4235 strg1->st_len = len - 1; /* - NUL */
4236 free(strg2);
4237
4238 return strg1;
4239 }
4240
4241 static bool
4242 is_confusing_precedence(op_t op, op_t lop, bool lparen, op_t rop, bool rparen)
4243 {
4244
4245 if (op == SHL || op == SHR) {
4246 if (!lparen && (lop == PLUS || lop == MINUS))
4247 return true;
4248 if (!rparen && (rop == PLUS || rop == MINUS))
4249 return true;
4250 return false;
4251 }
4252
4253 if (op == LOGOR) {
4254 if (!lparen && lop == LOGAND)
4255 return true;
4256 if (!rparen && rop == LOGAND)
4257 return true;
4258 return false;
4259 }
4260
4261 lint_assert(op == BITAND || op == BITXOR || op == BITOR);
4262 if (!lparen && lop != op) {
4263 if (lop == PLUS || lop == MINUS)
4264 return true;
4265 if (lop == BITAND || lop == BITXOR)
4266 return true;
4267 }
4268 if (!rparen && rop != op) {
4269 if (rop == PLUS || rop == MINUS)
4270 return true;
4271 if (rop == BITAND || rop == BITXOR)
4272 return true;
4273 }
4274 return false;
4275 }
4276
4277 /*
4278 * Print a warning if the given node has operands which should be
4279 * parenthesized.
4280 *
4281 * XXX Does not work if an operand is a constant expression. Constant
4282 * expressions are already folded.
4283 */
4284 static void
4285 check_precedence_confusion(tnode_t *tn)
4286 {
4287 tnode_t *ln, *rn;
4288
4289 if (!hflag)
4290 return;
4291
4292 debug_node(tn);
4293
4294 lint_assert(modtab[tn->tn_op].m_binary);
4295 for (ln = tn->tn_left; ln->tn_op == CVT; ln = ln->tn_left)
4296 continue;
4297 for (rn = tn->tn_right; rn->tn_op == CVT; rn = rn->tn_left)
4298 continue;
4299
4300 if (is_confusing_precedence(tn->tn_op,
4301 ln->tn_op, ln->tn_parenthesized,
4302 rn->tn_op, rn->tn_parenthesized)) {
4303 /* precedence confusion possible: parenthesize! */
4304 warning(169);
4305 }
4306 }
4307