1 /* Subroutines shared by all languages that are variants of C.
2    Copyright (C) 1992-2020 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10 
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19 
20 #define GCC_C_COMMON_C
21 
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "target.h"
26 #include "function.h"
27 #include "tree.h"
28 #include "memmodel.h"
29 #include "c-common.h"
30 #include "gimple-expr.h"
31 #include "tm_p.h"
32 #include "stringpool.h"
33 #include "cgraph.h"
34 #include "diagnostic.h"
35 #include "intl.h"
36 #include "stor-layout.h"
37 #include "calls.h"
38 #include "attribs.h"
39 #include "varasm.h"
40 #include "trans-mem.h"
41 #include "c-objc.h"
42 #include "common/common-target.h"
43 #include "langhooks.h"
44 #include "tree-inline.h"
45 #include "toplev.h"
46 #include "tree-iterator.h"
47 #include "opts.h"
48 #include "gimplify.h"
49 #include "substring-locations.h"
50 #include "spellcheck.h"
51 #include "c-spellcheck.h"
52 #include "selftest.h"
53 
54 cpp_reader *parse_in;		/* Declared in c-pragma.h.  */
55 
56 /* Mode used to build pointers (VOIDmode means ptr_mode).  */
57 
58 machine_mode c_default_pointer_mode = VOIDmode;
59 
60 /* The following symbols are subsumed in the c_global_trees array, and
61    listed here individually for documentation purposes.
62 
63    INTEGER_TYPE and REAL_TYPE nodes for the standard data types.
64 
65 	tree short_integer_type_node;
66 	tree long_integer_type_node;
67 	tree long_long_integer_type_node;
68 
69 	tree short_unsigned_type_node;
70 	tree long_unsigned_type_node;
71 	tree long_long_unsigned_type_node;
72 
73 	tree truthvalue_type_node;
74 	tree truthvalue_false_node;
75 	tree truthvalue_true_node;
76 
77 	tree ptrdiff_type_node;
78 
79 	tree unsigned_char_type_node;
80 	tree signed_char_type_node;
81 	tree wchar_type_node;
82 
83 	tree char8_type_node;
84 	tree char16_type_node;
85 	tree char32_type_node;
86 
87 	tree float_type_node;
88 	tree double_type_node;
89 	tree long_double_type_node;
90 
91 	tree complex_integer_type_node;
92 	tree complex_float_type_node;
93 	tree complex_double_type_node;
94 	tree complex_long_double_type_node;
95 
96 	tree dfloat32_type_node;
97 	tree dfloat64_type_node;
98 	tree_dfloat128_type_node;
99 
100 	tree intQI_type_node;
101 	tree intHI_type_node;
102 	tree intSI_type_node;
103 	tree intDI_type_node;
104 	tree intTI_type_node;
105 
106 	tree unsigned_intQI_type_node;
107 	tree unsigned_intHI_type_node;
108 	tree unsigned_intSI_type_node;
109 	tree unsigned_intDI_type_node;
110 	tree unsigned_intTI_type_node;
111 
112 	tree widest_integer_literal_type_node;
113 	tree widest_unsigned_literal_type_node;
114 
115    Nodes for types `void *' and `const void *'.
116 
117 	tree ptr_type_node, const_ptr_type_node;
118 
119    Nodes for types `char *' and `const char *'.
120 
121 	tree string_type_node, const_string_type_node;
122 
123    Type `char[SOMENUMBER]'.
124    Used when an array of char is needed and the size is irrelevant.
125 
126 	tree char_array_type_node;
127 
128    Type `wchar_t[SOMENUMBER]' or something like it.
129    Used when a wide string literal is created.
130 
131 	tree wchar_array_type_node;
132 
133    Type `char8_t[SOMENUMBER]' or something like it.
134    Used when a UTF-8 string literal is created.
135 
136 	tree char8_array_type_node;
137 
138    Type `char16_t[SOMENUMBER]' or something like it.
139    Used when a UTF-16 string literal is created.
140 
141 	tree char16_array_type_node;
142 
143    Type `char32_t[SOMENUMBER]' or something like it.
144    Used when a UTF-32 string literal is created.
145 
146 	tree char32_array_type_node;
147 
148    Type `int ()' -- used for implicit declaration of functions.
149 
150 	tree default_function_type;
151 
152    A VOID_TYPE node, packaged in a TREE_LIST.
153 
154 	tree void_list_node;
155 
156   The lazily created VAR_DECLs for __FUNCTION__, __PRETTY_FUNCTION__,
157   and __func__. (C doesn't generate __FUNCTION__ and__PRETTY_FUNCTION__
158   VAR_DECLS, but C++ does.)
159 
160 	tree function_name_decl_node;
161 	tree pretty_function_name_decl_node;
162 	tree c99_function_name_decl_node;
163 
164   Stack of nested function name VAR_DECLs.
165 
166 	tree saved_function_name_decls;
167 
168 */
169 
170 tree c_global_trees[CTI_MAX];
171 
172 /* Switches common to the C front ends.  */
173 
174 /* Nonzero means don't output line number information.  */
175 
176 char flag_no_line_commands;
177 
178 /* Nonzero causes -E output not to be done, but directives such as
179    #define that have side effects are still obeyed.  */
180 
181 char flag_no_output;
182 
183 /* Nonzero means dump macros in some fashion.  */
184 
185 char flag_dump_macros;
186 
187 /* Nonzero means pass #include lines through to the output.  */
188 
189 char flag_dump_includes;
190 
191 /* Nonzero means process PCH files while preprocessing.  */
192 
193 bool flag_pch_preprocess;
194 
195 /* The file name to which we should write a precompiled header, or
196    NULL if no header will be written in this compile.  */
197 
198 const char *pch_file;
199 
200 /* Nonzero if an ISO standard was selected.  It rejects macros in the
201    user's namespace.  */
202 int flag_iso;
203 
204 /* C/ObjC language option variables.  */
205 
206 
207 /* Nonzero means allow type mismatches in conditional expressions;
208    just make their values `void'.  */
209 
210 int flag_cond_mismatch;
211 
212 /* Nonzero means enable C89 Amendment 1 features.  */
213 
214 int flag_isoc94;
215 
216 /* Nonzero means use the ISO C99 (or C11) dialect of C.  */
217 
218 int flag_isoc99;
219 
220 /* Nonzero means use the ISO C11 dialect of C.  */
221 
222 int flag_isoc11;
223 
224 /* Nonzero means use the ISO C2X dialect of C.  */
225 
226 int flag_isoc2x;
227 
228 /* Nonzero means that we have builtin functions, and main is an int.  */
229 
230 int flag_hosted = 1;
231 
232 
233 /* ObjC language option variables.  */
234 
235 
236 /* Tells the compiler that this is a special run.  Do not perform any
237    compiling, instead we are to test some platform dependent features
238    and output a C header file with appropriate definitions.  */
239 
240 int print_struct_values;
241 
242 /* Tells the compiler what is the constant string class for ObjC.  */
243 
244 const char *constant_string_class_name;
245 
246 
247 /* C++ language option variables.  */
248 
249 /* The reference version of the ABI for -Wabi.  */
250 
251 int warn_abi_version = -1;
252 
253 /* The C++ dialect being used.  Default set in c_common_post_options.  */
254 
255 enum cxx_dialect cxx_dialect = cxx_unset;
256 
257 /* Maximum template instantiation depth.  This limit exists to limit the
258    time it takes to notice excessively recursive template instantiations.
259 
260    The default is lower than the 1024 recommended by the C++0x standard
261    because G++ runs out of stack before 1024 with highly recursive template
262    argument deduction substitution (g++.dg/cpp0x/enum11.C).  */
263 
264 int max_tinst_depth = 900;
265 
266 /* The elements of `ridpointers' are identifier nodes for the reserved
267    type names and storage classes.  It is indexed by a RID_... value.  */
268 tree *ridpointers;
269 
270 tree (*make_fname_decl) (location_t, tree, int);
271 
272 /* Nonzero means don't warn about problems that occur when the code is
273    executed.  */
274 int c_inhibit_evaluation_warnings;
275 
276 /* Whether we are building a boolean conversion inside
277    convert_for_assignment, or some other late binary operation.  If
278    build_binary_op is called for C (from code shared by C and C++) in
279    this case, then the operands have already been folded and the
280    result will not be folded again, so C_MAYBE_CONST_EXPR should not
281    be generated.  */
282 bool in_late_binary_op;
283 
284 /* Whether lexing has been completed, so subsequent preprocessor
285    errors should use the compiler's input_location.  */
286 bool done_lexing = false;
287 
288 /* Information about how a function name is generated.  */
289 struct fname_var_t
290 {
291   tree *const decl;	/* pointer to the VAR_DECL.  */
292   const unsigned rid;	/* RID number for the identifier.  */
293   const int pretty;	/* How pretty is it? */
294 };
295 
296 /* The three ways of getting then name of the current function.  */
297 
298 const struct fname_var_t fname_vars[] =
299 {
300   /* C99 compliant __func__, must be first.  */
301   {&c99_function_name_decl_node, RID_C99_FUNCTION_NAME, 0},
302   /* GCC __FUNCTION__ compliant.  */
303   {&function_name_decl_node, RID_FUNCTION_NAME, 0},
304   /* GCC __PRETTY_FUNCTION__ compliant.  */
305   {&pretty_function_name_decl_node, RID_PRETTY_FUNCTION_NAME, 1},
306   {NULL, 0, 0},
307 };
308 
309 /* Global visibility options.  */
310 struct visibility_flags visibility_options;
311 
312 static tree check_case_value (location_t, tree);
313 
314 
315 static void check_nonnull_arg (void *, tree, unsigned HOST_WIDE_INT);
316 static bool nonnull_check_p (tree, unsigned HOST_WIDE_INT);
317 
318 /* Reserved words.  The third field is a mask: keywords are disabled
319    if they match the mask.
320 
321    Masks for languages:
322    C --std=c89: D_C99 | D_CXXONLY | D_OBJC | D_CXX_OBJC
323    C --std=c99: D_CXXONLY | D_OBJC
324    ObjC is like C except that D_OBJC and D_CXX_OBJC are not set
325    C++ --std=c++98: D_CONLY | D_CXX11 | D_CXX20 | D_OBJC
326    C++ --std=c++11: D_CONLY | D_CXX20 | D_OBJC
327    C++ --std=c++2a: D_CONLY | D_OBJC
328    ObjC++ is like C++ except that D_OBJC is not set
329 
330    If -fno-asm is used, D_ASM is added to the mask.  If
331    -fno-gnu-keywords is used, D_EXT is added.  If -fno-asm and C in
332    C89 mode, D_EXT89 is added for both -fno-asm and -fno-gnu-keywords.
333    In C with -Wc++-compat, we warn if D_CXXWARN is set.
334 
335    Note the complication of the D_CXX_OBJC keywords.  These are
336    reserved words such as 'class'.  In C++, 'class' is a reserved
337    word.  In Objective-C++ it is too.  In Objective-C, it is a
338    reserved word too, but only if it follows an '@' sign.
339 */
340 const struct c_common_resword c_common_reswords[] =
341 {
342   { "_Alignas",		RID_ALIGNAS,   D_CONLY },
343   { "_Alignof",		RID_ALIGNOF,   D_CONLY },
344   { "_Atomic",		RID_ATOMIC,    D_CONLY },
345   { "_Bool",		RID_BOOL,      D_CONLY },
346   { "_Complex",		RID_COMPLEX,	0 },
347   { "_Imaginary",	RID_IMAGINARY, D_CONLY },
348   { "_Float16",         RID_FLOAT16,   D_CONLY },
349   { "_Float32",         RID_FLOAT32,   D_CONLY },
350   { "_Float64",         RID_FLOAT64,   D_CONLY },
351   { "_Float128",        RID_FLOAT128,  D_CONLY },
352   { "_Float32x",        RID_FLOAT32X,  D_CONLY },
353   { "_Float64x",        RID_FLOAT64X,  D_CONLY },
354   { "_Float128x",       RID_FLOAT128X, D_CONLY },
355   { "_Decimal32",       RID_DFLOAT32,  D_CONLY },
356   { "_Decimal64",       RID_DFLOAT64,  D_CONLY },
357   { "_Decimal128",      RID_DFLOAT128, D_CONLY },
358   { "_Fract",           RID_FRACT,     D_CONLY | D_EXT },
359   { "_Accum",           RID_ACCUM,     D_CONLY | D_EXT },
360   { "_Sat",             RID_SAT,       D_CONLY | D_EXT },
361   { "_Static_assert",   RID_STATIC_ASSERT, D_CONLY },
362   { "_Noreturn",        RID_NORETURN,  D_CONLY },
363   { "_Generic",         RID_GENERIC,   D_CONLY },
364   { "_Thread_local",    RID_THREAD,    D_CONLY },
365   { "__FUNCTION__",	RID_FUNCTION_NAME, 0 },
366   { "__PRETTY_FUNCTION__", RID_PRETTY_FUNCTION_NAME, 0 },
367   { "__alignof",	RID_ALIGNOF,	0 },
368   { "__alignof__",	RID_ALIGNOF,	0 },
369   { "__asm",		RID_ASM,	0 },
370   { "__asm__",		RID_ASM,	0 },
371   { "__attribute",	RID_ATTRIBUTE,	0 },
372   { "__attribute__",	RID_ATTRIBUTE,	0 },
373   { "__auto_type",	RID_AUTO_TYPE,	D_CONLY },
374   { "__bases",          RID_BASES, D_CXXONLY },
375   { "__builtin_addressof", RID_ADDRESSOF, D_CXXONLY },
376   { "__builtin_call_with_static_chain",
377     RID_BUILTIN_CALL_WITH_STATIC_CHAIN, D_CONLY },
378   { "__builtin_choose_expr", RID_CHOOSE_EXPR, D_CONLY },
379   { "__builtin_complex", RID_BUILTIN_COMPLEX, D_CONLY },
380   { "__builtin_convertvector", RID_BUILTIN_CONVERTVECTOR, 0 },
381   { "__builtin_has_attribute", RID_BUILTIN_HAS_ATTRIBUTE, 0 },
382   { "__builtin_launder", RID_BUILTIN_LAUNDER, D_CXXONLY },
383   { "__builtin_shuffle", RID_BUILTIN_SHUFFLE, 0 },
384   { "__builtin_tgmath", RID_BUILTIN_TGMATH, D_CONLY },
385   { "__builtin_offsetof", RID_OFFSETOF, 0 },
386   { "__builtin_types_compatible_p", RID_TYPES_COMPATIBLE_P, D_CONLY },
387   { "__builtin_va_arg",	RID_VA_ARG,	0 },
388   { "__complex",	RID_COMPLEX,	0 },
389   { "__complex__",	RID_COMPLEX,	0 },
390   { "__const",		RID_CONST,	0 },
391   { "__const__",	RID_CONST,	0 },
392   { "__constinit",	RID_CONSTINIT,	D_CXXONLY },
393   { "__decltype",       RID_DECLTYPE,   D_CXXONLY },
394   { "__direct_bases",   RID_DIRECT_BASES, D_CXXONLY },
395   { "__extension__",	RID_EXTENSION,	0 },
396   { "__func__",		RID_C99_FUNCTION_NAME, 0 },
397   { "__has_nothrow_assign", RID_HAS_NOTHROW_ASSIGN, D_CXXONLY },
398   { "__has_nothrow_constructor", RID_HAS_NOTHROW_CONSTRUCTOR, D_CXXONLY },
399   { "__has_nothrow_copy", RID_HAS_NOTHROW_COPY, D_CXXONLY },
400   { "__has_trivial_assign", RID_HAS_TRIVIAL_ASSIGN, D_CXXONLY },
401   { "__has_trivial_constructor", RID_HAS_TRIVIAL_CONSTRUCTOR, D_CXXONLY },
402   { "__has_trivial_copy", RID_HAS_TRIVIAL_COPY, D_CXXONLY },
403   { "__has_trivial_destructor", RID_HAS_TRIVIAL_DESTRUCTOR, D_CXXONLY },
404   { "__has_unique_object_representations", RID_HAS_UNIQUE_OBJ_REPRESENTATIONS,
405 					D_CXXONLY },
406   { "__has_virtual_destructor", RID_HAS_VIRTUAL_DESTRUCTOR, D_CXXONLY },
407   { "__imag",		RID_IMAGPART,	0 },
408   { "__imag__",		RID_IMAGPART,	0 },
409   { "__inline",		RID_INLINE,	0 },
410   { "__inline__",	RID_INLINE,	0 },
411   { "__is_abstract",	RID_IS_ABSTRACT, D_CXXONLY },
412   { "__is_aggregate",	RID_IS_AGGREGATE, D_CXXONLY },
413   { "__is_base_of",	RID_IS_BASE_OF, D_CXXONLY },
414   { "__is_class",	RID_IS_CLASS,	D_CXXONLY },
415   { "__is_empty",	RID_IS_EMPTY,	D_CXXONLY },
416   { "__is_enum",	RID_IS_ENUM,	D_CXXONLY },
417   { "__is_final",	RID_IS_FINAL,	D_CXXONLY },
418   { "__is_literal_type", RID_IS_LITERAL_TYPE, D_CXXONLY },
419   { "__is_pod",		RID_IS_POD,	D_CXXONLY },
420   { "__is_polymorphic",	RID_IS_POLYMORPHIC, D_CXXONLY },
421   { "__is_same",     RID_IS_SAME_AS, D_CXXONLY },
422   { "__is_same_as",     RID_IS_SAME_AS, D_CXXONLY },
423   { "__is_standard_layout", RID_IS_STD_LAYOUT, D_CXXONLY },
424   { "__is_trivial",     RID_IS_TRIVIAL, D_CXXONLY },
425   { "__is_trivially_assignable", RID_IS_TRIVIALLY_ASSIGNABLE, D_CXXONLY },
426   { "__is_trivially_constructible", RID_IS_TRIVIALLY_CONSTRUCTIBLE, D_CXXONLY },
427   { "__is_trivially_copyable", RID_IS_TRIVIALLY_COPYABLE, D_CXXONLY },
428   { "__is_union",	RID_IS_UNION,	D_CXXONLY },
429   { "__label__",	RID_LABEL,	0 },
430   { "__null",		RID_NULL,	0 },
431   { "__real",		RID_REALPART,	0 },
432   { "__real__",		RID_REALPART,	0 },
433   { "__restrict",	RID_RESTRICT,	0 },
434   { "__restrict__",	RID_RESTRICT,	0 },
435   { "__signed",		RID_SIGNED,	0 },
436   { "__signed__",	RID_SIGNED,	0 },
437   { "__thread",		RID_THREAD,	0 },
438   { "__transaction_atomic", RID_TRANSACTION_ATOMIC, 0 },
439   { "__transaction_relaxed", RID_TRANSACTION_RELAXED, 0 },
440   { "__transaction_cancel", RID_TRANSACTION_CANCEL, 0 },
441   { "__typeof",		RID_TYPEOF,	0 },
442   { "__typeof__",	RID_TYPEOF,	0 },
443   { "__underlying_type", RID_UNDERLYING_TYPE, D_CXXONLY },
444   { "__volatile",	RID_VOLATILE,	0 },
445   { "__volatile__",	RID_VOLATILE,	0 },
446   { "__GIMPLE",		RID_GIMPLE,	D_CONLY },
447   { "__PHI",		RID_PHI,	D_CONLY },
448   { "__RTL",		RID_RTL,	D_CONLY },
449   { "alignas",		RID_ALIGNAS,	D_CXXONLY | D_CXX11 | D_CXXWARN },
450   { "alignof",		RID_ALIGNOF,	D_CXXONLY | D_CXX11 | D_CXXWARN },
451   { "asm",		RID_ASM,	D_ASM },
452   { "auto",		RID_AUTO,	0 },
453   { "bool",		RID_BOOL,	D_CXXONLY | D_CXXWARN },
454   { "break",		RID_BREAK,	0 },
455   { "case",		RID_CASE,	0 },
456   { "catch",		RID_CATCH,	D_CXX_OBJC | D_CXXWARN },
457   { "char",		RID_CHAR,	0 },
458   { "char8_t",		RID_CHAR8,	D_CXX_CHAR8_T_FLAGS | D_CXXWARN },
459   { "char16_t",		RID_CHAR16,	D_CXXONLY | D_CXX11 | D_CXXWARN },
460   { "char32_t",		RID_CHAR32,	D_CXXONLY | D_CXX11 | D_CXXWARN },
461   { "class",		RID_CLASS,	D_CXX_OBJC | D_CXXWARN },
462   { "const",		RID_CONST,	0 },
463   { "consteval",	RID_CONSTEVAL,	D_CXXONLY | D_CXX20 | D_CXXWARN },
464   { "constexpr",	RID_CONSTEXPR,	D_CXXONLY | D_CXX11 | D_CXXWARN },
465   { "constinit",	RID_CONSTINIT,	D_CXXONLY | D_CXX20 | D_CXXWARN },
466   { "const_cast",	RID_CONSTCAST,	D_CXXONLY | D_CXXWARN },
467   { "continue",		RID_CONTINUE,	0 },
468   { "decltype",         RID_DECLTYPE,   D_CXXONLY | D_CXX11 | D_CXXWARN },
469   { "default",		RID_DEFAULT,	0 },
470   { "delete",		RID_DELETE,	D_CXXONLY | D_CXXWARN },
471   { "do",		RID_DO,		0 },
472   { "double",		RID_DOUBLE,	0 },
473   { "dynamic_cast",	RID_DYNCAST,	D_CXXONLY | D_CXXWARN },
474   { "else",		RID_ELSE,	0 },
475   { "enum",		RID_ENUM,	0 },
476   { "explicit",		RID_EXPLICIT,	D_CXXONLY | D_CXXWARN },
477   { "export",		RID_EXPORT,	D_CXXONLY | D_CXXWARN },
478   { "extern",		RID_EXTERN,	0 },
479   { "false",		RID_FALSE,	D_CXXONLY | D_CXXWARN },
480   { "float",		RID_FLOAT,	0 },
481   { "for",		RID_FOR,	0 },
482   { "friend",		RID_FRIEND,	D_CXXONLY | D_CXXWARN },
483   { "goto",		RID_GOTO,	0 },
484   { "if",		RID_IF,		0 },
485   { "inline",		RID_INLINE,	D_EXT89 },
486   { "int",		RID_INT,	0 },
487   { "long",		RID_LONG,	0 },
488   { "mutable",		RID_MUTABLE,	D_CXXONLY | D_CXXWARN },
489   { "namespace",	RID_NAMESPACE,	D_CXXONLY | D_CXXWARN },
490   { "new",		RID_NEW,	D_CXXONLY | D_CXXWARN },
491   { "noexcept",		RID_NOEXCEPT,	D_CXXONLY | D_CXX11 | D_CXXWARN },
492   { "nullptr",		RID_NULLPTR,	D_CXXONLY | D_CXX11 | D_CXXWARN },
493   { "operator",		RID_OPERATOR,	D_CXXONLY | D_CXXWARN },
494   { "private",		RID_PRIVATE,	D_CXX_OBJC | D_CXXWARN },
495   { "protected",	RID_PROTECTED,	D_CXX_OBJC | D_CXXWARN },
496   { "public",		RID_PUBLIC,	D_CXX_OBJC | D_CXXWARN },
497   { "register",		RID_REGISTER,	0 },
498   { "reinterpret_cast",	RID_REINTCAST,	D_CXXONLY | D_CXXWARN },
499   { "restrict",		RID_RESTRICT,	D_CONLY | D_C99 },
500   { "return",		RID_RETURN,	0 },
501   { "short",		RID_SHORT,	0 },
502   { "signed",		RID_SIGNED,	0 },
503   { "sizeof",		RID_SIZEOF,	0 },
504   { "static",		RID_STATIC,	0 },
505   { "static_assert",    RID_STATIC_ASSERT, D_CXXONLY | D_CXX11 | D_CXXWARN },
506   { "static_cast",	RID_STATCAST,	D_CXXONLY | D_CXXWARN },
507   { "struct",		RID_STRUCT,	0 },
508   { "switch",		RID_SWITCH,	0 },
509   { "template",		RID_TEMPLATE,	D_CXXONLY | D_CXXWARN },
510   { "this",		RID_THIS,	D_CXXONLY | D_CXXWARN },
511   { "thread_local",	RID_THREAD,	D_CXXONLY | D_CXX11 | D_CXXWARN },
512   { "throw",		RID_THROW,	D_CXX_OBJC | D_CXXWARN },
513   { "true",		RID_TRUE,	D_CXXONLY | D_CXXWARN },
514   { "try",		RID_TRY,	D_CXX_OBJC | D_CXXWARN },
515   { "typedef",		RID_TYPEDEF,	0 },
516   { "typename",		RID_TYPENAME,	D_CXXONLY | D_CXXWARN },
517   { "typeid",		RID_TYPEID,	D_CXXONLY | D_CXXWARN },
518   { "typeof",		RID_TYPEOF,	D_ASM | D_EXT },
519   { "union",		RID_UNION,	0 },
520   { "unsigned",		RID_UNSIGNED,	0 },
521   { "using",		RID_USING,	D_CXXONLY | D_CXXWARN },
522   { "virtual",		RID_VIRTUAL,	D_CXXONLY | D_CXXWARN },
523   { "void",		RID_VOID,	0 },
524   { "volatile",		RID_VOLATILE,	0 },
525   { "wchar_t",		RID_WCHAR,	D_CXXONLY },
526   { "while",		RID_WHILE,	0 },
527   { "__is_assignable", RID_IS_ASSIGNABLE, D_CXXONLY },
528   { "__is_constructible", RID_IS_CONSTRUCTIBLE, D_CXXONLY },
529 
530   /* C++ transactional memory.  */
531   { "synchronized",	RID_SYNCHRONIZED, D_CXX_OBJC | D_TRANSMEM },
532   { "atomic_noexcept",	RID_ATOMIC_NOEXCEPT, D_CXXONLY | D_TRANSMEM },
533   { "atomic_cancel",	RID_ATOMIC_CANCEL, D_CXXONLY | D_TRANSMEM },
534   { "atomic_commit",	RID_TRANSACTION_ATOMIC, D_CXXONLY | D_TRANSMEM },
535 
536   /* Concepts-related keywords */
537   { "concept",		RID_CONCEPT,	D_CXX_CONCEPTS_FLAGS | D_CXXWARN },
538   { "requires", 	RID_REQUIRES,	D_CXX_CONCEPTS_FLAGS | D_CXXWARN },
539 
540   /* Coroutines-related keywords */
541   { "co_await",		RID_CO_AWAIT,	D_CXX_COROUTINES_FLAGS | D_CXXWARN },
542   { "co_yield",		RID_CO_YIELD,	D_CXX_COROUTINES_FLAGS | D_CXXWARN },
543   { "co_return", 	RID_CO_RETURN,	D_CXX_COROUTINES_FLAGS | D_CXXWARN },
544 
545   /* These Objective-C keywords are recognized only immediately after
546      an '@'.  */
547   { "compatibility_alias", RID_AT_ALIAS,	D_OBJC },
548   { "defs",		RID_AT_DEFS,		D_OBJC },
549   { "encode",		RID_AT_ENCODE,		D_OBJC },
550   { "end",		RID_AT_END,		D_OBJC },
551   { "implementation",	RID_AT_IMPLEMENTATION,	D_OBJC },
552   { "interface",	RID_AT_INTERFACE,	D_OBJC },
553   { "protocol",		RID_AT_PROTOCOL,	D_OBJC },
554   { "selector",		RID_AT_SELECTOR,	D_OBJC },
555   { "finally",		RID_AT_FINALLY,		D_OBJC },
556   { "optional",		RID_AT_OPTIONAL,	D_OBJC },
557   { "required",		RID_AT_REQUIRED,	D_OBJC },
558   { "property",		RID_AT_PROPERTY,	D_OBJC },
559   { "package",		RID_AT_PACKAGE,		D_OBJC },
560   { "synthesize",	RID_AT_SYNTHESIZE,	D_OBJC },
561   { "dynamic",		RID_AT_DYNAMIC,		D_OBJC },
562   /* These are recognized only in protocol-qualifier context
563      (see above) */
564   { "bycopy",		RID_BYCOPY,		D_OBJC },
565   { "byref",		RID_BYREF,		D_OBJC },
566   { "in",		RID_IN,			D_OBJC },
567   { "inout",		RID_INOUT,		D_OBJC },
568   { "oneway",		RID_ONEWAY,		D_OBJC },
569   { "out",		RID_OUT,		D_OBJC },
570   /* These are recognized inside a property attribute list */
571   { "assign",		RID_ASSIGN,		D_OBJC },
572   { "atomic",		RID_PROPATOMIC,		D_OBJC },
573   { "copy",		RID_COPY,		D_OBJC },
574   { "getter",		RID_GETTER,		D_OBJC },
575   { "nonatomic",	RID_NONATOMIC,		D_OBJC },
576   { "readonly",		RID_READONLY,		D_OBJC },
577   { "readwrite",	RID_READWRITE,		D_OBJC },
578   { "retain",		RID_RETAIN,		D_OBJC },
579   { "setter",		RID_SETTER,		D_OBJC },
580 };
581 
582 const unsigned int num_c_common_reswords =
583   sizeof c_common_reswords / sizeof (struct c_common_resword);
584 
585 /* Return identifier for address space AS.  */
586 
587 const char *
c_addr_space_name(addr_space_t as)588 c_addr_space_name (addr_space_t as)
589 {
590   int rid = RID_FIRST_ADDR_SPACE + as;
591   gcc_assert (ridpointers [rid]);
592   return IDENTIFIER_POINTER (ridpointers [rid]);
593 }
594 
595 /* Push current bindings for the function name VAR_DECLS.  */
596 
597 void
start_fname_decls(void)598 start_fname_decls (void)
599 {
600   unsigned ix;
601   tree saved = NULL_TREE;
602 
603   for (ix = 0; fname_vars[ix].decl; ix++)
604     {
605       tree decl = *fname_vars[ix].decl;
606 
607       if (decl)
608 	{
609 	  saved = tree_cons (decl, build_int_cst (integer_type_node, ix),
610 			     saved);
611 	  *fname_vars[ix].decl = NULL_TREE;
612 	}
613     }
614   if (saved || saved_function_name_decls)
615     /* Normally they'll have been NULL, so only push if we've got a
616        stack, or they are non-NULL.  */
617     saved_function_name_decls = tree_cons (saved, NULL_TREE,
618 					   saved_function_name_decls);
619 }
620 
621 /* Finish up the current bindings, adding them into the current function's
622    statement tree.  This must be done _before_ finish_stmt_tree is called.
623    If there is no current function, we must be at file scope and no statements
624    are involved. Pop the previous bindings.  */
625 
626 void
finish_fname_decls(void)627 finish_fname_decls (void)
628 {
629   unsigned ix;
630   tree stmts = NULL_TREE;
631   tree stack = saved_function_name_decls;
632 
633   for (; stack && TREE_VALUE (stack); stack = TREE_CHAIN (stack))
634     append_to_statement_list (TREE_VALUE (stack), &stmts);
635 
636   if (stmts)
637     {
638       tree *bodyp = &DECL_SAVED_TREE (current_function_decl);
639 
640       if (TREE_CODE (*bodyp) == BIND_EXPR)
641 	bodyp = &BIND_EXPR_BODY (*bodyp);
642 
643       append_to_statement_list_force (*bodyp, &stmts);
644       *bodyp = stmts;
645     }
646 
647   for (ix = 0; fname_vars[ix].decl; ix++)
648     *fname_vars[ix].decl = NULL_TREE;
649 
650   if (stack)
651     {
652       /* We had saved values, restore them.  */
653       tree saved;
654 
655       for (saved = TREE_PURPOSE (stack); saved; saved = TREE_CHAIN (saved))
656 	{
657 	  tree decl = TREE_PURPOSE (saved);
658 	  unsigned ix = TREE_INT_CST_LOW (TREE_VALUE (saved));
659 
660 	  *fname_vars[ix].decl = decl;
661 	}
662       stack = TREE_CHAIN (stack);
663     }
664   saved_function_name_decls = stack;
665 }
666 
667 /* Return the text name of the current function, suitably prettified
668    by PRETTY_P.  Return string must be freed by caller.  */
669 
670 const char *
fname_as_string(int pretty_p)671 fname_as_string (int pretty_p)
672 {
673   const char *name = "top level";
674   char *namep;
675   int vrb = 2, len;
676   cpp_string cstr = { 0, 0 }, strname;
677 
678   if (!pretty_p)
679     {
680       name = "";
681       vrb = 0;
682     }
683 
684   if (current_function_decl)
685     name = lang_hooks.decl_printable_name (current_function_decl, vrb);
686 
687   len = strlen (name) + 3; /* Two for '"'s.  One for NULL.  */
688 
689   namep = XNEWVEC (char, len);
690   snprintf (namep, len, "\"%s\"", name);
691   strname.text = (unsigned char *) namep;
692   strname.len = len - 1;
693 
694   if (cpp_interpret_string (parse_in, &strname, 1, &cstr, CPP_STRING))
695     {
696       XDELETEVEC (namep);
697       return (const char *) cstr.text;
698     }
699 
700   return namep;
701 }
702 
703 /* Return the VAR_DECL for a const char array naming the current
704    function. If the VAR_DECL has not yet been created, create it
705    now. RID indicates how it should be formatted and IDENTIFIER_NODE
706    ID is its name (unfortunately C and C++ hold the RID values of
707    keywords in different places, so we can't derive RID from ID in
708    this language independent code. LOC is the location of the
709    function.  */
710 
711 tree
fname_decl(location_t loc,unsigned int rid,tree id)712 fname_decl (location_t loc, unsigned int rid, tree id)
713 {
714   unsigned ix;
715   tree decl = NULL_TREE;
716 
717   for (ix = 0; fname_vars[ix].decl; ix++)
718     if (fname_vars[ix].rid == rid)
719       break;
720 
721   decl = *fname_vars[ix].decl;
722   if (!decl)
723     {
724       /* If a tree is built here, it would normally have the lineno of
725 	 the current statement.  Later this tree will be moved to the
726 	 beginning of the function and this line number will be wrong.
727 	 To avoid this problem set the lineno to 0 here; that prevents
728 	 it from appearing in the RTL.  */
729       tree stmts;
730       location_t saved_location = input_location;
731       input_location = UNKNOWN_LOCATION;
732 
733       stmts = push_stmt_list ();
734       decl = (*make_fname_decl) (loc, id, fname_vars[ix].pretty);
735       stmts = pop_stmt_list (stmts);
736       if (!IS_EMPTY_STMT (stmts))
737 	saved_function_name_decls
738 	  = tree_cons (decl, stmts, saved_function_name_decls);
739       *fname_vars[ix].decl = decl;
740       input_location = saved_location;
741     }
742   if (!ix && !current_function_decl)
743     pedwarn (loc, 0, "%qD is not defined outside of function scope", decl);
744 
745   return decl;
746 }
747 
748 /* Given a STRING_CST, give it a suitable array-of-chars data type.  */
749 
750 tree
fix_string_type(tree value)751 fix_string_type (tree value)
752 {
753   int length = TREE_STRING_LENGTH (value);
754   int nchars, charsz;
755   tree e_type, i_type, a_type;
756 
757   /* Compute the number of elements, for the array type.  */
758   if (TREE_TYPE (value) == char_array_type_node || !TREE_TYPE (value))
759     {
760       charsz = 1;
761       e_type = char_type_node;
762     }
763   else if (flag_char8_t && TREE_TYPE (value) == char8_array_type_node)
764     {
765       charsz = TYPE_PRECISION (char8_type_node) / BITS_PER_UNIT;
766       e_type = char8_type_node;
767     }
768   else if (TREE_TYPE (value) == char16_array_type_node)
769     {
770       charsz = TYPE_PRECISION (char16_type_node) / BITS_PER_UNIT;
771       e_type = char16_type_node;
772     }
773   else if (TREE_TYPE (value) == char32_array_type_node)
774     {
775       charsz = TYPE_PRECISION (char32_type_node) / BITS_PER_UNIT;
776       e_type = char32_type_node;
777     }
778   else
779     {
780       charsz = TYPE_PRECISION (wchar_type_node) / BITS_PER_UNIT;
781       e_type = wchar_type_node;
782     }
783 
784   /* This matters only for targets where ssizetype has smaller precision
785      than 32 bits.  */
786   if (wi::lts_p (wi::to_wide (TYPE_MAX_VALUE (ssizetype)), length))
787     {
788       error ("size of string literal is too large");
789       length = tree_to_shwi (TYPE_MAX_VALUE (ssizetype)) / charsz * charsz;
790       char *str = CONST_CAST (char *, TREE_STRING_POINTER (value));
791       memset (str + length, '\0',
792 	      MIN (TREE_STRING_LENGTH (value) - length, charsz));
793       TREE_STRING_LENGTH (value) = length;
794     }
795   nchars = length / charsz;
796 
797   /* C89 2.2.4.1, C99 5.2.4.1 (Translation limits).  The analogous
798      limit in C++98 Annex B is very large (65536) and is not normative,
799      so we do not diagnose it (warn_overlength_strings is forced off
800      in c_common_post_options).  */
801   if (warn_overlength_strings)
802     {
803       const int nchars_max = flag_isoc99 ? 4095 : 509;
804       const int relevant_std = flag_isoc99 ? 99 : 90;
805       if (nchars - 1 > nchars_max)
806 	/* Translators: The %d after 'ISO C' will be 90 or 99.  Do not
807 	   separate the %d from the 'C'.  'ISO' should not be
808 	   translated, but it may be moved after 'C%d' in languages
809 	   where modifiers follow nouns.  */
810 	pedwarn (input_location, OPT_Woverlength_strings,
811 		 "string length %qd is greater than the length %qd "
812 		 "ISO C%d compilers are required to support",
813 		 nchars - 1, nchars_max, relevant_std);
814     }
815 
816   /* Create the array type for the string constant.  The ISO C++
817      standard says that a string literal has type `const char[N]' or
818      `const wchar_t[N]'.  We use the same logic when invoked as a C
819      front-end with -Wwrite-strings.
820      ??? We should change the type of an expression depending on the
821      state of a warning flag.  We should just be warning -- see how
822      this is handled in the C++ front-end for the deprecated implicit
823      conversion from string literals to `char*' or `wchar_t*'.
824 
825      The C++ front end relies on TYPE_MAIN_VARIANT of a cv-qualified
826      array type being the unqualified version of that type.
827      Therefore, if we are constructing an array of const char, we must
828      construct the matching unqualified array type first.  The C front
829      end does not require this, but it does no harm, so we do it
830      unconditionally.  */
831   i_type = build_index_type (size_int (nchars - 1));
832   a_type = build_array_type (e_type, i_type);
833   if (c_dialect_cxx() || warn_write_strings)
834     a_type = c_build_qualified_type (a_type, TYPE_QUAL_CONST);
835 
836   TREE_TYPE (value) = a_type;
837   TREE_CONSTANT (value) = 1;
838   TREE_READONLY (value) = 1;
839   TREE_STATIC (value) = 1;
840   return value;
841 }
842 
843 /* Given a string of type STRING_TYPE, determine what kind of string
844    token would give an equivalent execution encoding: CPP_STRING,
845    CPP_STRING16, or CPP_STRING32.  Return CPP_OTHER in case of error.
846    This may not be exactly the string token type that initially created
847    the string, since CPP_WSTRING is indistinguishable from the 16/32 bit
848    string type, and CPP_UTF8STRING is indistinguishable from CPP_STRING
849    at this point.
850 
851    This effectively reverses part of the logic in lex_string and
852    fix_string_type.  */
853 
854 static enum cpp_ttype
get_cpp_ttype_from_string_type(tree string_type)855 get_cpp_ttype_from_string_type (tree string_type)
856 {
857   gcc_assert (string_type);
858   if (TREE_CODE (string_type) == POINTER_TYPE)
859     string_type = TREE_TYPE (string_type);
860 
861   if (TREE_CODE (string_type) != ARRAY_TYPE)
862     return CPP_OTHER;
863 
864   tree element_type = TREE_TYPE (string_type);
865   if (TREE_CODE (element_type) != INTEGER_TYPE)
866     return CPP_OTHER;
867 
868   int bits_per_character = TYPE_PRECISION (element_type);
869   switch (bits_per_character)
870     {
871     case 8:
872       return CPP_STRING;  /* It could have also been CPP_UTF8STRING.  */
873     case 16:
874       return CPP_STRING16;
875     case 32:
876       return CPP_STRING32;
877     }
878 
879   return CPP_OTHER;
880 }
881 
882 /* The global record of string concatentations, for use in
883    extracting locations within string literals.  */
884 
885 GTY(()) string_concat_db *g_string_concat_db;
886 
887 /* Implementation of LANG_HOOKS_GET_SUBSTRING_LOCATION.  */
888 
889 const char *
c_get_substring_location(const substring_loc & substr_loc,location_t * out_loc)890 c_get_substring_location (const substring_loc &substr_loc,
891 			  location_t *out_loc)
892 {
893   enum cpp_ttype tok_type
894     = get_cpp_ttype_from_string_type (substr_loc.get_string_type ());
895   if (tok_type == CPP_OTHER)
896     return "unrecognized string type";
897 
898   return get_location_within_string (parse_in, g_string_concat_db,
899 				     substr_loc.get_fmt_string_loc (),
900 				     tok_type,
901 				     substr_loc.get_caret_idx (),
902 				     substr_loc.get_start_idx (),
903 				     substr_loc.get_end_idx (),
904 				     out_loc);
905 }
906 
907 
908 /* Return true iff T is a boolean promoted to int.  */
909 
910 bool
bool_promoted_to_int_p(tree t)911 bool_promoted_to_int_p (tree t)
912 {
913   return (CONVERT_EXPR_P (t)
914 	  && TREE_TYPE (t) == integer_type_node
915 	  && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == BOOLEAN_TYPE);
916 }
917 
918 /* vector_targets_convertible_p is used for vector pointer types.  The
919    callers perform various checks that the qualifiers are satisfactory,
920    while OTOH vector_targets_convertible_p ignores the number of elements
921    in the vectors.  That's fine with vector pointers as we can consider,
922    say, a vector of 8 elements as two consecutive vectors of 4 elements,
923    and that does not require and conversion of the pointer values.
924    In contrast, vector_types_convertible_p and
925    vector_types_compatible_elements_p are used for vector value types.  */
926 /* True if pointers to distinct types T1 and T2 can be converted to
927    each other without an explicit cast.  Only returns true for opaque
928    vector types.  */
929 bool
vector_targets_convertible_p(const_tree t1,const_tree t2)930 vector_targets_convertible_p (const_tree t1, const_tree t2)
931 {
932   if (VECTOR_TYPE_P (t1) && VECTOR_TYPE_P (t2)
933       && (TYPE_VECTOR_OPAQUE (t1) || TYPE_VECTOR_OPAQUE (t2))
934       && tree_int_cst_equal (TYPE_SIZE (t1), TYPE_SIZE (t2)))
935     return true;
936 
937   return false;
938 }
939 
940 /* vector_types_convertible_p is used for vector value types.
941    It could in principle call vector_targets_convertible_p as a subroutine,
942    but then the check for vector type would be duplicated with its callers,
943    and also the purpose of vector_targets_convertible_p would become
944    muddled.
945    Where vector_types_convertible_p returns true, a conversion might still be
946    needed to make the types match.
947    In contrast, vector_targets_convertible_p is used for vector pointer
948    values, and vector_types_compatible_elements_p is used specifically
949    in the context for binary operators, as a check if use is possible without
950    conversion.  */
951 /* True if vector types T1 and T2 can be converted to each other
952    without an explicit cast.  If EMIT_LAX_NOTE is true, and T1 and T2
953    can only be converted with -flax-vector-conversions yet that is not
954    in effect, emit a note telling the user about that option if such
955    a note has not previously been emitted.  */
956 bool
vector_types_convertible_p(const_tree t1,const_tree t2,bool emit_lax_note)957 vector_types_convertible_p (const_tree t1, const_tree t2, bool emit_lax_note)
958 {
959   static bool emitted_lax_note = false;
960   bool convertible_lax;
961 
962   if ((TYPE_VECTOR_OPAQUE (t1) || TYPE_VECTOR_OPAQUE (t2))
963       && tree_int_cst_equal (TYPE_SIZE (t1), TYPE_SIZE (t2)))
964     return true;
965 
966   convertible_lax =
967     (tree_int_cst_equal (TYPE_SIZE (t1), TYPE_SIZE (t2))
968      && (TREE_CODE (TREE_TYPE (t1)) != REAL_TYPE
969 	 || known_eq (TYPE_VECTOR_SUBPARTS (t1),
970 		      TYPE_VECTOR_SUBPARTS (t2)))
971      && (INTEGRAL_TYPE_P (TREE_TYPE (t1))
972 	 == INTEGRAL_TYPE_P (TREE_TYPE (t2))));
973 
974   if (!convertible_lax || flag_lax_vector_conversions)
975     return convertible_lax;
976 
977   if (known_eq (TYPE_VECTOR_SUBPARTS (t1), TYPE_VECTOR_SUBPARTS (t2))
978       && lang_hooks.types_compatible_p (TREE_TYPE (t1), TREE_TYPE (t2)))
979     return true;
980 
981   if (emit_lax_note && !emitted_lax_note)
982     {
983       emitted_lax_note = true;
984       inform (input_location, "use %<-flax-vector-conversions%> to permit "
985               "conversions between vectors with differing "
986               "element types or numbers of subparts");
987     }
988 
989   return false;
990 }
991 
992 /* Build a VEC_PERM_EXPR if V0, V1 and MASK are not error_mark_nodes
993    and have vector types, V0 has the same type as V1, and the number of
994    elements of V0, V1, MASK is the same.
995 
996    In case V1 is a NULL_TREE it is assumed that __builtin_shuffle was
997    called with two arguments.  In this case implementation passes the
998    first argument twice in order to share the same tree code.  This fact
999    could enable the mask-values being twice the vector length.  This is
1000    an implementation accident and this semantics is not guaranteed to
1001    the user.  */
1002 tree
c_build_vec_perm_expr(location_t loc,tree v0,tree v1,tree mask,bool complain)1003 c_build_vec_perm_expr (location_t loc, tree v0, tree v1, tree mask,
1004 		       bool complain)
1005 {
1006   tree ret;
1007   bool wrap = true;
1008   bool maybe_const = false;
1009   bool two_arguments = false;
1010 
1011   if (v1 == NULL_TREE)
1012     {
1013       two_arguments = true;
1014       v1 = v0;
1015     }
1016 
1017   if (v0 == error_mark_node || v1 == error_mark_node
1018       || mask == error_mark_node)
1019     return error_mark_node;
1020 
1021   if (!gnu_vector_type_p (TREE_TYPE (mask))
1022       || !VECTOR_INTEGER_TYPE_P (TREE_TYPE (mask)))
1023     {
1024       if (complain)
1025 	error_at (loc, "%<__builtin_shuffle%> last argument must "
1026 		       "be an integer vector");
1027       return error_mark_node;
1028     }
1029 
1030   if (!gnu_vector_type_p (TREE_TYPE (v0))
1031       || !gnu_vector_type_p (TREE_TYPE (v1)))
1032     {
1033       if (complain)
1034 	error_at (loc, "%<__builtin_shuffle%> arguments must be vectors");
1035       return error_mark_node;
1036     }
1037 
1038   if (TYPE_MAIN_VARIANT (TREE_TYPE (v0)) != TYPE_MAIN_VARIANT (TREE_TYPE (v1)))
1039     {
1040       if (complain)
1041 	error_at (loc, "%<__builtin_shuffle%> argument vectors must be of "
1042 		       "the same type");
1043       return error_mark_node;
1044     }
1045 
1046   if (maybe_ne (TYPE_VECTOR_SUBPARTS (TREE_TYPE (v0)),
1047 		TYPE_VECTOR_SUBPARTS (TREE_TYPE (mask)))
1048       && maybe_ne (TYPE_VECTOR_SUBPARTS (TREE_TYPE (v1)),
1049 		   TYPE_VECTOR_SUBPARTS (TREE_TYPE (mask))))
1050     {
1051       if (complain)
1052 	error_at (loc, "%<__builtin_shuffle%> number of elements of the "
1053 		       "argument vector(s) and the mask vector should "
1054 		       "be the same");
1055       return error_mark_node;
1056     }
1057 
1058   if (GET_MODE_BITSIZE (SCALAR_TYPE_MODE (TREE_TYPE (TREE_TYPE (v0))))
1059       != GET_MODE_BITSIZE (SCALAR_TYPE_MODE (TREE_TYPE (TREE_TYPE (mask)))))
1060     {
1061       if (complain)
1062 	error_at (loc, "%<__builtin_shuffle%> argument vector(s) inner type "
1063 		       "must have the same size as inner type of the mask");
1064       return error_mark_node;
1065     }
1066 
1067   if (!c_dialect_cxx ())
1068     {
1069       /* Avoid C_MAYBE_CONST_EXPRs inside VEC_PERM_EXPR.  */
1070       v0 = c_fully_fold (v0, false, &maybe_const);
1071       wrap &= maybe_const;
1072 
1073       if (two_arguments)
1074         v1 = v0 = save_expr (v0);
1075       else
1076         {
1077           v1 = c_fully_fold (v1, false, &maybe_const);
1078           wrap &= maybe_const;
1079         }
1080 
1081       mask = c_fully_fold (mask, false, &maybe_const);
1082       wrap &= maybe_const;
1083     }
1084   else if (two_arguments)
1085     v1 = v0 = save_expr (v0);
1086 
1087   ret = build3_loc (loc, VEC_PERM_EXPR, TREE_TYPE (v0), v0, v1, mask);
1088 
1089   if (!c_dialect_cxx () && !wrap)
1090     ret = c_wrap_maybe_const (ret, true);
1091 
1092   return ret;
1093 }
1094 
1095 /* Build a VEC_CONVERT ifn for __builtin_convertvector builtin.  */
1096 
1097 tree
c_build_vec_convert(location_t loc1,tree expr,location_t loc2,tree type,bool complain)1098 c_build_vec_convert (location_t loc1, tree expr, location_t loc2, tree type,
1099 		     bool complain)
1100 {
1101   if (error_operand_p (type))
1102     return error_mark_node;
1103   if (error_operand_p (expr))
1104     return error_mark_node;
1105 
1106   if (!gnu_vector_type_p (TREE_TYPE (expr))
1107       || (!VECTOR_INTEGER_TYPE_P (TREE_TYPE (expr))
1108 	  && !VECTOR_FLOAT_TYPE_P (TREE_TYPE (expr))))
1109     {
1110       if (complain)
1111 	error_at (loc1, "%<__builtin_convertvector%> first argument must "
1112 			"be an integer or floating vector");
1113       return error_mark_node;
1114     }
1115 
1116   if (!gnu_vector_type_p (type)
1117       || (!VECTOR_INTEGER_TYPE_P (type) && !VECTOR_FLOAT_TYPE_P (type)))
1118     {
1119       if (complain)
1120 	error_at (loc2, "%<__builtin_convertvector%> second argument must "
1121 			"be an integer or floating vector type");
1122       return error_mark_node;
1123     }
1124 
1125   if (maybe_ne (TYPE_VECTOR_SUBPARTS (TREE_TYPE (expr)),
1126 		TYPE_VECTOR_SUBPARTS (type)))
1127     {
1128       if (complain)
1129 	error_at (loc1, "%<__builtin_convertvector%> number of elements "
1130 			"of the first argument vector and the second argument "
1131 			"vector type should be the same");
1132       return error_mark_node;
1133     }
1134 
1135   if ((TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (expr)))
1136        == TYPE_MAIN_VARIANT (TREE_TYPE (type)))
1137       || (VECTOR_INTEGER_TYPE_P (TREE_TYPE (expr))
1138 	  && VECTOR_INTEGER_TYPE_P (type)
1139 	  && (TYPE_PRECISION (TREE_TYPE (TREE_TYPE (expr)))
1140 	      == TYPE_PRECISION (TREE_TYPE (type)))))
1141     return build1_loc (loc1, VIEW_CONVERT_EXPR, type, expr);
1142 
1143   bool wrap = true;
1144   bool maybe_const = false;
1145   tree ret;
1146   if (!c_dialect_cxx ())
1147     {
1148       /* Avoid C_MAYBE_CONST_EXPRs inside of VEC_CONVERT argument.  */
1149       expr = c_fully_fold (expr, false, &maybe_const);
1150       wrap &= maybe_const;
1151     }
1152 
1153   ret = build_call_expr_internal_loc (loc1, IFN_VEC_CONVERT, type, 1, expr);
1154 
1155   if (!wrap)
1156     ret = c_wrap_maybe_const (ret, true);
1157 
1158   return ret;
1159 }
1160 
1161 /* Like tree.c:get_narrower, but retain conversion from C++0x scoped enum
1162    to integral type.  */
1163 
1164 tree
c_common_get_narrower(tree op,int * unsignedp_ptr)1165 c_common_get_narrower (tree op, int *unsignedp_ptr)
1166 {
1167   op = get_narrower (op, unsignedp_ptr);
1168 
1169   if (TREE_CODE (TREE_TYPE (op)) == ENUMERAL_TYPE
1170       && ENUM_IS_SCOPED (TREE_TYPE (op)))
1171     {
1172       /* C++0x scoped enumerations don't implicitly convert to integral
1173 	 type; if we stripped an explicit conversion to a larger type we
1174 	 need to replace it so common_type will still work.  */
1175       tree type = c_common_type_for_size (TYPE_PRECISION (TREE_TYPE (op)),
1176 					  TYPE_UNSIGNED (TREE_TYPE (op)));
1177       op = fold_convert (type, op);
1178     }
1179   return op;
1180 }
1181 
1182 /* This is a helper function of build_binary_op.
1183 
1184    For certain operations if both args were extended from the same
1185    smaller type, do the arithmetic in that type and then extend.
1186 
1187    BITWISE indicates a bitwise operation.
1188    For them, this optimization is safe only if
1189    both args are zero-extended or both are sign-extended.
1190    Otherwise, we might change the result.
1191    Eg, (short)-1 | (unsigned short)-1 is (int)-1
1192    but calculated in (unsigned short) it would be (unsigned short)-1.
1193 */
1194 tree
shorten_binary_op(tree result_type,tree op0,tree op1,bool bitwise)1195 shorten_binary_op (tree result_type, tree op0, tree op1, bool bitwise)
1196 {
1197   int unsigned0, unsigned1;
1198   tree arg0, arg1;
1199   int uns;
1200   tree type;
1201 
1202   /* Cast OP0 and OP1 to RESULT_TYPE.  Doing so prevents
1203      excessive narrowing when we call get_narrower below.  For
1204      example, suppose that OP0 is of unsigned int extended
1205      from signed char and that RESULT_TYPE is long long int.
1206      If we explicitly cast OP0 to RESULT_TYPE, OP0 would look
1207      like
1208 
1209      (long long int) (unsigned int) signed_char
1210 
1211      which get_narrower would narrow down to
1212 
1213      (unsigned int) signed char
1214 
1215      If we do not cast OP0 first, get_narrower would return
1216      signed_char, which is inconsistent with the case of the
1217      explicit cast.  */
1218   op0 = convert (result_type, op0);
1219   op1 = convert (result_type, op1);
1220 
1221   arg0 = c_common_get_narrower (op0, &unsigned0);
1222   arg1 = c_common_get_narrower (op1, &unsigned1);
1223 
1224   /* UNS is 1 if the operation to be done is an unsigned one.  */
1225   uns = TYPE_UNSIGNED (result_type);
1226 
1227   /* Handle the case that OP0 (or OP1) does not *contain* a conversion
1228      but it *requires* conversion to FINAL_TYPE.  */
1229 
1230   if ((TYPE_PRECISION (TREE_TYPE (op0))
1231        == TYPE_PRECISION (TREE_TYPE (arg0)))
1232       && TREE_TYPE (op0) != result_type)
1233     unsigned0 = TYPE_UNSIGNED (TREE_TYPE (op0));
1234   if ((TYPE_PRECISION (TREE_TYPE (op1))
1235        == TYPE_PRECISION (TREE_TYPE (arg1)))
1236       && TREE_TYPE (op1) != result_type)
1237     unsigned1 = TYPE_UNSIGNED (TREE_TYPE (op1));
1238 
1239   /* Now UNSIGNED0 is 1 if ARG0 zero-extends to FINAL_TYPE.  */
1240 
1241   /* For bitwise operations, signedness of nominal type
1242      does not matter.  Consider only how operands were extended.  */
1243   if (bitwise)
1244     uns = unsigned0;
1245 
1246   /* Note that in all three cases below we refrain from optimizing
1247      an unsigned operation on sign-extended args.
1248      That would not be valid.  */
1249 
1250   /* Both args variable: if both extended in same way
1251      from same width, do it in that width.
1252      Do it unsigned if args were zero-extended.  */
1253   if ((TYPE_PRECISION (TREE_TYPE (arg0))
1254        < TYPE_PRECISION (result_type))
1255       && (TYPE_PRECISION (TREE_TYPE (arg1))
1256 	  == TYPE_PRECISION (TREE_TYPE (arg0)))
1257       && unsigned0 == unsigned1
1258       && (unsigned0 || !uns))
1259     return c_common_signed_or_unsigned_type
1260       (unsigned0, common_type (TREE_TYPE (arg0), TREE_TYPE (arg1)));
1261 
1262   else if (TREE_CODE (arg0) == INTEGER_CST
1263 	   && (unsigned1 || !uns)
1264 	   && (TYPE_PRECISION (TREE_TYPE (arg1))
1265 	       < TYPE_PRECISION (result_type))
1266 	   && (type
1267 	       = c_common_signed_or_unsigned_type (unsigned1,
1268 						   TREE_TYPE (arg1)))
1269 	   && !POINTER_TYPE_P (type)
1270 	   && int_fits_type_p (arg0, type))
1271     return type;
1272 
1273   else if (TREE_CODE (arg1) == INTEGER_CST
1274 	   && (unsigned0 || !uns)
1275 	   && (TYPE_PRECISION (TREE_TYPE (arg0))
1276 	       < TYPE_PRECISION (result_type))
1277 	   && (type
1278 	       = c_common_signed_or_unsigned_type (unsigned0,
1279 						   TREE_TYPE (arg0)))
1280 	   && !POINTER_TYPE_P (type)
1281 	   && int_fits_type_p (arg1, type))
1282     return type;
1283 
1284   return result_type;
1285 }
1286 
1287 /* Returns true iff any integer value of type FROM_TYPE can be represented as
1288    real of type TO_TYPE.  This is a helper function for unsafe_conversion_p.  */
1289 
1290 static bool
int_safely_convertible_to_real_p(const_tree from_type,const_tree to_type)1291 int_safely_convertible_to_real_p (const_tree from_type, const_tree to_type)
1292 {
1293   tree type_low_bound = TYPE_MIN_VALUE (from_type);
1294   tree type_high_bound = TYPE_MAX_VALUE (from_type);
1295   REAL_VALUE_TYPE real_low_bound =
1296 	  real_value_from_int_cst (0, type_low_bound);
1297   REAL_VALUE_TYPE real_high_bound =
1298 	  real_value_from_int_cst (0, type_high_bound);
1299 
1300   return exact_real_truncate (TYPE_MODE (to_type), &real_low_bound)
1301 	 && exact_real_truncate (TYPE_MODE (to_type), &real_high_bound);
1302 }
1303 
1304 /* Checks if expression EXPR of complex/real/integer type cannot be converted
1305    to the complex/real/integer type TYPE.  Function returns non-zero when:
1306 	* EXPR is a constant which cannot be exactly converted to TYPE.
1307 	* EXPR is not a constant and size of EXPR's type > than size of TYPE,
1308 	  for EXPR type and TYPE being both integers or both real, or both
1309 	  complex.
1310 	* EXPR is not a constant of complex type and TYPE is a real or
1311 	  an integer.
1312 	* EXPR is not a constant of real type and TYPE is an integer.
1313 	* EXPR is not a constant of integer type which cannot be
1314 	  exactly converted to real type.
1315 
1316    Function allows conversions between types of different signedness if
1317    CHECK_SIGN is false and can return SAFE_CONVERSION (zero) in that
1318    case.  Function can return UNSAFE_SIGN if CHECK_SIGN is true.
1319 
1320    RESULT, when non-null is the result of the conversion.  When constant
1321    it is included in the text of diagnostics.
1322 
1323    Function allows conversions from complex constants to non-complex types,
1324    provided that imaginary part is zero and real part can be safely converted
1325    to TYPE.  */
1326 
1327 enum conversion_safety
unsafe_conversion_p(tree type,tree expr,tree result,bool check_sign)1328 unsafe_conversion_p (tree type, tree expr, tree result, bool check_sign)
1329 {
1330   enum conversion_safety give_warning = SAFE_CONVERSION; /* is 0 or false */
1331   tree expr_type = TREE_TYPE (expr);
1332 
1333   expr = fold_for_warn (expr);
1334 
1335   if (TREE_CODE (expr) == REAL_CST || TREE_CODE (expr) == INTEGER_CST)
1336     {
1337       /* If type is complex, we are interested in compatibility with
1338 	 underlying type.  */
1339       if (TREE_CODE (type) == COMPLEX_TYPE)
1340 	  type = TREE_TYPE (type);
1341 
1342       /* Warn for real constant that is not an exact integer converted
1343 	 to integer type.  */
1344       if (TREE_CODE (expr_type) == REAL_TYPE
1345 	  && TREE_CODE (type) == INTEGER_TYPE)
1346 	{
1347 	  if (!real_isinteger (TREE_REAL_CST_PTR (expr), TYPE_MODE (expr_type)))
1348 	    give_warning = UNSAFE_REAL;
1349 	}
1350       /* Warn for an integer constant that does not fit into integer type.  */
1351       else if (TREE_CODE (expr_type) == INTEGER_TYPE
1352 	       && TREE_CODE (type) == INTEGER_TYPE
1353 	       && !int_fits_type_p (expr, type))
1354 	{
1355 	  if (TYPE_UNSIGNED (type) && !TYPE_UNSIGNED (expr_type)
1356 	      && tree_int_cst_sgn (expr) < 0)
1357 	    {
1358 	      if (check_sign)
1359 		give_warning = UNSAFE_SIGN;
1360 	    }
1361 	  else if (!TYPE_UNSIGNED (type) && TYPE_UNSIGNED (expr_type))
1362 	    {
1363 	      if (check_sign)
1364 		give_warning = UNSAFE_SIGN;
1365 	    }
1366 	  else
1367 	    give_warning = UNSAFE_OTHER;
1368 	}
1369       else if (TREE_CODE (type) == REAL_TYPE)
1370 	{
1371 	  /* Warn for an integer constant that does not fit into real type.  */
1372 	  if (TREE_CODE (expr_type) == INTEGER_TYPE)
1373 	    {
1374 	      REAL_VALUE_TYPE a = real_value_from_int_cst (0, expr);
1375 	      if (!exact_real_truncate (TYPE_MODE (type), &a))
1376 		give_warning = UNSAFE_REAL;
1377 	    }
1378 	  /* Warn for a real constant that does not fit into a smaller
1379 	     real type.  */
1380 	  else if (TREE_CODE (expr_type) == REAL_TYPE
1381 		   && TYPE_PRECISION (type) < TYPE_PRECISION (expr_type))
1382 	    {
1383 	      REAL_VALUE_TYPE a = TREE_REAL_CST (expr);
1384 	      if (!exact_real_truncate (TYPE_MODE (type), &a))
1385 		give_warning = UNSAFE_REAL;
1386 	    }
1387 	}
1388     }
1389 
1390   else if (TREE_CODE (expr) == COMPLEX_CST)
1391     {
1392       tree imag_part = TREE_IMAGPART (expr);
1393       /* Conversion from complex constant with zero imaginary part,
1394 	 perform check for conversion of real part.  */
1395       if ((TREE_CODE (imag_part) == REAL_CST
1396 	   && real_zerop (imag_part))
1397 	  || (TREE_CODE (imag_part) == INTEGER_CST
1398 	      && integer_zerop (imag_part)))
1399 	/* Note: in this branch we use recursive call to unsafe_conversion_p
1400 	   with different type of EXPR, but it is still safe, because when EXPR
1401 	   is a constant, it's type is not used in text of generated warnings
1402 	   (otherwise they could sound misleading).  */
1403 	return unsafe_conversion_p (type, TREE_REALPART (expr), result,
1404 				    check_sign);
1405       /* Conversion from complex constant with non-zero imaginary part.  */
1406       else
1407 	{
1408 	  /* Conversion to complex type.
1409 	     Perform checks for both real and imaginary parts.  */
1410 	  if (TREE_CODE (type) == COMPLEX_TYPE)
1411 	    {
1412 	      enum conversion_safety re_safety =
1413 		unsafe_conversion_p (type, TREE_REALPART (expr),
1414 				     result, check_sign);
1415 	      enum conversion_safety im_safety =
1416 		unsafe_conversion_p (type, imag_part, result, check_sign);
1417 
1418 	      /* Merge the results into appropriate single warning.  */
1419 
1420 	      /* Note: this case includes SAFE_CONVERSION, i.e. success.  */
1421 	      if (re_safety == im_safety)
1422 		give_warning = re_safety;
1423 	      else if (!re_safety && im_safety)
1424 		give_warning = im_safety;
1425 	      else if (re_safety && !im_safety)
1426 		give_warning = re_safety;
1427 	      else
1428 		give_warning = UNSAFE_OTHER;
1429 	    }
1430 	  /* Warn about conversion from complex to real or integer type.  */
1431 	  else
1432 	    give_warning = UNSAFE_IMAGINARY;
1433 	}
1434     }
1435 
1436   /* Checks for remaining case: EXPR is not constant.  */
1437   else
1438     {
1439       /* Warn for real types converted to integer types.  */
1440       if (TREE_CODE (expr_type) == REAL_TYPE
1441 	  && TREE_CODE (type) == INTEGER_TYPE)
1442 	give_warning = UNSAFE_REAL;
1443 
1444       else if (TREE_CODE (expr_type) == INTEGER_TYPE
1445 	       && TREE_CODE (type) == INTEGER_TYPE)
1446 	{
1447 	  /* Don't warn about unsigned char y = 0xff, x = (int) y;  */
1448 	  expr = get_unwidened (expr, 0);
1449 	  expr_type = TREE_TYPE (expr);
1450 
1451 	  /* Don't warn for short y; short x = ((int)y & 0xff);  */
1452 	  if (TREE_CODE (expr) == BIT_AND_EXPR
1453 	      || TREE_CODE (expr) == BIT_IOR_EXPR
1454 	      || TREE_CODE (expr) == BIT_XOR_EXPR)
1455 	    {
1456 	      /* If both args were extended from a shortest type,
1457 		 use that type if that is safe.  */
1458 	      expr_type = shorten_binary_op (expr_type,
1459 					     TREE_OPERAND (expr, 0),
1460 					     TREE_OPERAND (expr, 1),
1461 					     /* bitwise */1);
1462 
1463 	      if (TREE_CODE (expr) == BIT_AND_EXPR)
1464 		{
1465 		  tree op0 = TREE_OPERAND (expr, 0);
1466 		  tree op1 = TREE_OPERAND (expr, 1);
1467 		  bool unsigned0 = TYPE_UNSIGNED (TREE_TYPE (op0));
1468 		  bool unsigned1 = TYPE_UNSIGNED (TREE_TYPE (op1));
1469 
1470 		  /* If one of the operands is a non-negative constant
1471 		     that fits in the target type, then the type of the
1472 		     other operand does not matter. */
1473 		  if ((TREE_CODE (op0) == INTEGER_CST
1474 		       && int_fits_type_p (op0, c_common_signed_type (type))
1475 		       && int_fits_type_p (op0, c_common_unsigned_type (type)))
1476 		      || (TREE_CODE (op1) == INTEGER_CST
1477 			  && int_fits_type_p (op1, c_common_signed_type (type))
1478 			  && int_fits_type_p (op1,
1479 					      c_common_unsigned_type (type))))
1480 		    return SAFE_CONVERSION;
1481 		  /* If constant is unsigned and fits in the target
1482 		     type, then the result will also fit.  */
1483 		  else if ((TREE_CODE (op0) == INTEGER_CST
1484 			    && unsigned0
1485 			    && int_fits_type_p (op0, type))
1486 			   || (TREE_CODE (op1) == INTEGER_CST
1487 			       && unsigned1
1488 			       && int_fits_type_p (op1, type)))
1489 		    return SAFE_CONVERSION;
1490 		}
1491 	    }
1492 	  /* Warn for integer types converted to smaller integer types.  */
1493 	  if (TYPE_PRECISION (type) < TYPE_PRECISION (expr_type))
1494 	    give_warning = UNSAFE_OTHER;
1495 
1496 	  /* When they are the same width but different signedness,
1497 	     then the value may change.  */
1498 	  else if (((TYPE_PRECISION (type) == TYPE_PRECISION (expr_type)
1499 		     && TYPE_UNSIGNED (expr_type) != TYPE_UNSIGNED (type))
1500 		    /* Even when converted to a bigger type, if the type is
1501 		       unsigned but expr is signed, then negative values
1502 		       will be changed.  */
1503 		    || (TYPE_UNSIGNED (type) && !TYPE_UNSIGNED (expr_type)))
1504 		   && check_sign)
1505 	    give_warning = UNSAFE_SIGN;
1506 	}
1507 
1508       /* Warn for integer types converted to real types if and only if
1509 	 all the range of values of the integer type cannot be
1510 	 represented by the real type.  */
1511       else if (TREE_CODE (expr_type) == INTEGER_TYPE
1512 	       && TREE_CODE (type) == REAL_TYPE)
1513 	{
1514 	  /* Don't warn about char y = 0xff; float x = (int) y;  */
1515 	  expr = get_unwidened (expr, 0);
1516 	  expr_type = TREE_TYPE (expr);
1517 
1518 	  if (!int_safely_convertible_to_real_p (expr_type, type))
1519 	    give_warning = UNSAFE_OTHER;
1520 	}
1521 
1522       /* Warn for real types converted to smaller real types.  */
1523       else if (TREE_CODE (expr_type) == REAL_TYPE
1524 	       && TREE_CODE (type) == REAL_TYPE
1525 	       && TYPE_PRECISION (type) < TYPE_PRECISION (expr_type))
1526 	give_warning = UNSAFE_REAL;
1527 
1528       /* Check conversion between two complex types.  */
1529       else if (TREE_CODE (expr_type) == COMPLEX_TYPE
1530 	       && TREE_CODE (type) == COMPLEX_TYPE)
1531 	{
1532 	  /* Extract underlying types (i.e., type of real and imaginary
1533 	     parts) of expr_type and type.  */
1534 	  tree from_type = TREE_TYPE (expr_type);
1535 	  tree to_type = TREE_TYPE (type);
1536 
1537 	  /* Warn for real types converted to integer types.  */
1538 	  if (TREE_CODE (from_type) == REAL_TYPE
1539 	      && TREE_CODE (to_type) == INTEGER_TYPE)
1540 	    give_warning = UNSAFE_REAL;
1541 
1542 	  /* Warn for real types converted to smaller real types.  */
1543 	  else if (TREE_CODE (from_type) == REAL_TYPE
1544 		   && TREE_CODE (to_type) == REAL_TYPE
1545 		   && TYPE_PRECISION (to_type) < TYPE_PRECISION (from_type))
1546 	    give_warning = UNSAFE_REAL;
1547 
1548 	  /* Check conversion for complex integer types.  Here implementation
1549 	     is simpler than for real-domain integers because it does not
1550 	     involve sophisticated cases, such as bitmasks, casts, etc.  */
1551 	  else if (TREE_CODE (from_type) == INTEGER_TYPE
1552 		   && TREE_CODE (to_type) == INTEGER_TYPE)
1553 	    {
1554 	      /* Warn for integer types converted to smaller integer types.  */
1555 	      if (TYPE_PRECISION (to_type) < TYPE_PRECISION (from_type))
1556 		give_warning = UNSAFE_OTHER;
1557 
1558 	      /* Check for different signedness, see case for real-domain
1559 		 integers (above) for a more detailed comment.  */
1560 	      else if (((TYPE_PRECISION (to_type) == TYPE_PRECISION (from_type)
1561 			 && TYPE_UNSIGNED (to_type) != TYPE_UNSIGNED (from_type))
1562 			|| (TYPE_UNSIGNED (to_type) && !TYPE_UNSIGNED (from_type)))
1563 		       && check_sign)
1564 		give_warning = UNSAFE_SIGN;
1565 	    }
1566 	  else if (TREE_CODE (from_type) == INTEGER_TYPE
1567 		   && TREE_CODE (to_type) == REAL_TYPE
1568 		   && !int_safely_convertible_to_real_p (from_type, to_type))
1569 	    give_warning = UNSAFE_OTHER;
1570 	}
1571 
1572       /* Warn for complex types converted to real or integer types.  */
1573       else if (TREE_CODE (expr_type) == COMPLEX_TYPE
1574 	       && TREE_CODE (type) != COMPLEX_TYPE)
1575 	give_warning = UNSAFE_IMAGINARY;
1576     }
1577 
1578   return give_warning;
1579 }
1580 
1581 
1582 /* Convert EXPR to TYPE, warning about conversion problems with constants.
1583    Invoke this function on every expression that is converted implicitly,
1584    i.e. because of language rules and not because of an explicit cast.  */
1585 
1586 tree
convert_and_check(location_t loc,tree type,tree expr)1587 convert_and_check (location_t loc, tree type, tree expr)
1588 {
1589   tree result;
1590   tree expr_for_warning;
1591 
1592   /* Convert from a value with possible excess precision rather than
1593      via the semantic type, but do not warn about values not fitting
1594      exactly in the semantic type.  */
1595   if (TREE_CODE (expr) == EXCESS_PRECISION_EXPR)
1596     {
1597       tree orig_type = TREE_TYPE (expr);
1598       expr = TREE_OPERAND (expr, 0);
1599       expr_for_warning = convert (orig_type, expr);
1600       if (orig_type == type)
1601 	return expr_for_warning;
1602     }
1603   else
1604     expr_for_warning = expr;
1605 
1606   if (TREE_TYPE (expr) == type)
1607     return expr;
1608 
1609   result = convert (type, expr);
1610 
1611   if (c_inhibit_evaluation_warnings == 0
1612       && !TREE_OVERFLOW_P (expr)
1613       && result != error_mark_node)
1614     warnings_for_convert_and_check (loc, type, expr_for_warning, result);
1615 
1616   return result;
1617 }
1618 
1619 /* A node in a list that describes references to variables (EXPR), which are
1620    either read accesses if WRITER is zero, or write accesses, in which case
1621    WRITER is the parent of EXPR.  */
1622 struct tlist
1623 {
1624   struct tlist *next;
1625   tree expr, writer;
1626 };
1627 
1628 /* Used to implement a cache the results of a call to verify_tree.  We only
1629    use this for SAVE_EXPRs.  */
1630 struct tlist_cache
1631 {
1632   struct tlist_cache *next;
1633   struct tlist *cache_before_sp;
1634   struct tlist *cache_after_sp;
1635   tree expr;
1636 };
1637 
1638 /* Obstack to use when allocating tlist structures, and corresponding
1639    firstobj.  */
1640 static struct obstack tlist_obstack;
1641 static char *tlist_firstobj = 0;
1642 
1643 /* Keep track of the identifiers we've warned about, so we can avoid duplicate
1644    warnings.  */
1645 static struct tlist *warned_ids;
1646 /* SAVE_EXPRs need special treatment.  We process them only once and then
1647    cache the results.  */
1648 static struct tlist_cache *save_expr_cache;
1649 
1650 static void add_tlist (struct tlist **, struct tlist *, tree, int);
1651 static void merge_tlist (struct tlist **, struct tlist *, int);
1652 static void verify_tree (tree, struct tlist **, struct tlist **, tree);
1653 static bool warning_candidate_p (tree);
1654 static bool candidate_equal_p (const_tree, const_tree);
1655 static void warn_for_collisions (struct tlist *);
1656 static void warn_for_collisions_1 (tree, tree, struct tlist *, int);
1657 static struct tlist *new_tlist (struct tlist *, tree, tree);
1658 
1659 /* Create a new struct tlist and fill in its fields.  */
1660 static struct tlist *
new_tlist(struct tlist * next,tree t,tree writer)1661 new_tlist (struct tlist *next, tree t, tree writer)
1662 {
1663   struct tlist *l;
1664   l = XOBNEW (&tlist_obstack, struct tlist);
1665   l->next = next;
1666   l->expr = t;
1667   l->writer = writer;
1668   return l;
1669 }
1670 
1671 /* Add duplicates of the nodes found in ADD to the list *TO.  If EXCLUDE_WRITER
1672    is nonnull, we ignore any node we find which has a writer equal to it.  */
1673 
1674 static void
add_tlist(struct tlist ** to,struct tlist * add,tree exclude_writer,int copy)1675 add_tlist (struct tlist **to, struct tlist *add, tree exclude_writer, int copy)
1676 {
1677   while (add)
1678     {
1679       struct tlist *next = add->next;
1680       if (!copy)
1681 	add->next = *to;
1682       if (!exclude_writer || !candidate_equal_p (add->writer, exclude_writer))
1683 	*to = copy ? new_tlist (*to, add->expr, add->writer) : add;
1684       add = next;
1685     }
1686 }
1687 
1688 /* Merge the nodes of ADD into TO.  This merging process is done so that for
1689    each variable that already exists in TO, no new node is added; however if
1690    there is a write access recorded in ADD, and an occurrence on TO is only
1691    a read access, then the occurrence in TO will be modified to record the
1692    write.  */
1693 
1694 static void
merge_tlist(struct tlist ** to,struct tlist * add,int copy)1695 merge_tlist (struct tlist **to, struct tlist *add, int copy)
1696 {
1697   struct tlist **end = to;
1698 
1699   while (*end)
1700     end = &(*end)->next;
1701 
1702   while (add)
1703     {
1704       int found = 0;
1705       struct tlist *tmp2;
1706       struct tlist *next = add->next;
1707 
1708       for (tmp2 = *to; tmp2; tmp2 = tmp2->next)
1709 	if (candidate_equal_p (tmp2->expr, add->expr))
1710 	  {
1711 	    found = 1;
1712 	    if (!tmp2->writer)
1713 	      tmp2->writer = add->writer;
1714 	  }
1715       if (!found)
1716 	{
1717 	  *end = copy ? new_tlist (NULL, add->expr, add->writer) : add;
1718 	  end = &(*end)->next;
1719 	  *end = 0;
1720 	}
1721       add = next;
1722     }
1723 }
1724 
1725 /* WRITTEN is a variable, WRITER is its parent.  Warn if any of the variable
1726    references in list LIST conflict with it, excluding reads if ONLY writers
1727    is nonzero.  */
1728 
1729 static void
warn_for_collisions_1(tree written,tree writer,struct tlist * list,int only_writes)1730 warn_for_collisions_1 (tree written, tree writer, struct tlist *list,
1731 		       int only_writes)
1732 {
1733   struct tlist *tmp;
1734 
1735   /* Avoid duplicate warnings.  */
1736   for (tmp = warned_ids; tmp; tmp = tmp->next)
1737     if (candidate_equal_p (tmp->expr, written))
1738       return;
1739 
1740   while (list)
1741     {
1742       if (candidate_equal_p (list->expr, written)
1743 	  && !candidate_equal_p (list->writer, writer)
1744 	  && (!only_writes || list->writer))
1745 	{
1746 	  warned_ids = new_tlist (warned_ids, written, NULL_TREE);
1747 	  warning_at (EXPR_LOC_OR_LOC (writer, input_location),
1748 		      OPT_Wsequence_point, "operation on %qE may be undefined",
1749 		      list->expr);
1750 	}
1751       list = list->next;
1752     }
1753 }
1754 
1755 /* Given a list LIST of references to variables, find whether any of these
1756    can cause conflicts due to missing sequence points.  */
1757 
1758 static void
warn_for_collisions(struct tlist * list)1759 warn_for_collisions (struct tlist *list)
1760 {
1761   struct tlist *tmp;
1762 
1763   for (tmp = list; tmp; tmp = tmp->next)
1764     {
1765       if (tmp->writer)
1766 	warn_for_collisions_1 (tmp->expr, tmp->writer, list, 0);
1767     }
1768 }
1769 
1770 /* Return nonzero if X is a tree that can be verified by the sequence point
1771    warnings.  */
1772 
1773 static bool
warning_candidate_p(tree x)1774 warning_candidate_p (tree x)
1775 {
1776   if (DECL_P (x) && DECL_ARTIFICIAL (x))
1777     return false;
1778 
1779   if (TREE_CODE (x) == BLOCK)
1780     return false;
1781 
1782   /* VOID_TYPE_P (TREE_TYPE (x)) is workaround for cp/tree.c
1783      (lvalue_p) crash on TRY/CATCH. */
1784   if (TREE_TYPE (x) == NULL_TREE || VOID_TYPE_P (TREE_TYPE (x)))
1785     return false;
1786 
1787   if (!lvalue_p (x))
1788     return false;
1789 
1790   /* No point to track non-const calls, they will never satisfy
1791      operand_equal_p.  */
1792   if (TREE_CODE (x) == CALL_EXPR && (call_expr_flags (x) & ECF_CONST) == 0)
1793     return false;
1794 
1795   if (TREE_CODE (x) == STRING_CST)
1796     return false;
1797 
1798   return true;
1799 }
1800 
1801 /* Return nonzero if X and Y appear to be the same candidate (or NULL) */
1802 static bool
candidate_equal_p(const_tree x,const_tree y)1803 candidate_equal_p (const_tree x, const_tree y)
1804 {
1805   return (x == y) || (x && y && operand_equal_p (x, y, 0));
1806 }
1807 
1808 /* Walk the tree X, and record accesses to variables.  If X is written by the
1809    parent tree, WRITER is the parent.
1810    We store accesses in one of the two lists: PBEFORE_SP, and PNO_SP.  If this
1811    expression or its only operand forces a sequence point, then everything up
1812    to the sequence point is stored in PBEFORE_SP.  Everything else gets stored
1813    in PNO_SP.
1814    Once we return, we will have emitted warnings if any subexpression before
1815    such a sequence point could be undefined.  On a higher level, however, the
1816    sequence point may not be relevant, and we'll merge the two lists.
1817 
1818    Example: (b++, a) + b;
1819    The call that processes the COMPOUND_EXPR will store the increment of B
1820    in PBEFORE_SP, and the use of A in PNO_SP.  The higher-level call that
1821    processes the PLUS_EXPR will need to merge the two lists so that
1822    eventually, all accesses end up on the same list (and we'll warn about the
1823    unordered subexpressions b++ and b.
1824 
1825    A note on merging.  If we modify the former example so that our expression
1826    becomes
1827      (b++, b) + a
1828    care must be taken not simply to add all three expressions into the final
1829    PNO_SP list.  The function merge_tlist takes care of that by merging the
1830    before-SP list of the COMPOUND_EXPR into its after-SP list in a special
1831    way, so that no more than one access to B is recorded.  */
1832 
1833 static void
verify_tree(tree x,struct tlist ** pbefore_sp,struct tlist ** pno_sp,tree writer)1834 verify_tree (tree x, struct tlist **pbefore_sp, struct tlist **pno_sp,
1835 	     tree writer)
1836 {
1837   struct tlist *tmp_before, *tmp_nosp, *tmp_list2, *tmp_list3;
1838   enum tree_code code;
1839   enum tree_code_class cl;
1840 
1841   /* X may be NULL if it is the operand of an empty statement expression
1842      ({ }).  */
1843   if (x == NULL)
1844     return;
1845 
1846  restart:
1847   code = TREE_CODE (x);
1848   cl = TREE_CODE_CLASS (code);
1849 
1850   if (warning_candidate_p (x))
1851     *pno_sp = new_tlist (*pno_sp, x, writer);
1852 
1853   switch (code)
1854     {
1855     case CONSTRUCTOR:
1856     case SIZEOF_EXPR:
1857       return;
1858 
1859     case COMPOUND_EXPR:
1860     case TRUTH_ANDIF_EXPR:
1861     case TRUTH_ORIF_EXPR:
1862     sequenced_binary:
1863       tmp_before = tmp_nosp = tmp_list2 = tmp_list3 = 0;
1864       verify_tree (TREE_OPERAND (x, 0), &tmp_before, &tmp_nosp, NULL_TREE);
1865       warn_for_collisions (tmp_nosp);
1866       merge_tlist (pbefore_sp, tmp_before, 0);
1867       merge_tlist (pbefore_sp, tmp_nosp, 0);
1868       verify_tree (TREE_OPERAND (x, 1), &tmp_list3, &tmp_list2, NULL_TREE);
1869       warn_for_collisions (tmp_list2);
1870       merge_tlist (pbefore_sp, tmp_list3, 0);
1871       merge_tlist (pno_sp, tmp_list2, 0);
1872       return;
1873 
1874     case COND_EXPR:
1875       tmp_before = tmp_list2 = 0;
1876       verify_tree (TREE_OPERAND (x, 0), &tmp_before, &tmp_list2, NULL_TREE);
1877       warn_for_collisions (tmp_list2);
1878       merge_tlist (pbefore_sp, tmp_before, 0);
1879       merge_tlist (pbefore_sp, tmp_list2, 0);
1880 
1881       tmp_list3 = tmp_nosp = 0;
1882       verify_tree (TREE_OPERAND (x, 1), &tmp_list3, &tmp_nosp, NULL_TREE);
1883       warn_for_collisions (tmp_nosp);
1884       merge_tlist (pbefore_sp, tmp_list3, 0);
1885 
1886       tmp_list3 = tmp_list2 = 0;
1887       verify_tree (TREE_OPERAND (x, 2), &tmp_list3, &tmp_list2, NULL_TREE);
1888       warn_for_collisions (tmp_list2);
1889       merge_tlist (pbefore_sp, tmp_list3, 0);
1890       /* Rather than add both tmp_nosp and tmp_list2, we have to merge the
1891 	 two first, to avoid warning for (a ? b++ : b++).  */
1892       merge_tlist (&tmp_nosp, tmp_list2, 0);
1893       add_tlist (pno_sp, tmp_nosp, NULL_TREE, 0);
1894       return;
1895 
1896     case PREDECREMENT_EXPR:
1897     case PREINCREMENT_EXPR:
1898     case POSTDECREMENT_EXPR:
1899     case POSTINCREMENT_EXPR:
1900       verify_tree (TREE_OPERAND (x, 0), pno_sp, pno_sp, x);
1901       return;
1902 
1903     case MODIFY_EXPR:
1904       tmp_before = tmp_nosp = tmp_list3 = 0;
1905       verify_tree (TREE_OPERAND (x, 1), &tmp_before, &tmp_nosp, NULL_TREE);
1906       verify_tree (TREE_OPERAND (x, 0), &tmp_list3, &tmp_list3, x);
1907       /* Expressions inside the LHS are not ordered wrt. the sequence points
1908 	 in the RHS.  Example:
1909 	   *a = (a++, 2)
1910 	 Despite the fact that the modification of "a" is in the before_sp
1911 	 list (tmp_before), it conflicts with the use of "a" in the LHS.
1912 	 We can handle this by adding the contents of tmp_list3
1913 	 to those of tmp_before, and redoing the collision warnings for that
1914 	 list.  */
1915       add_tlist (&tmp_before, tmp_list3, x, 1);
1916       warn_for_collisions (tmp_before);
1917       /* Exclude the LHS itself here; we first have to merge it into the
1918 	 tmp_nosp list.  This is done to avoid warning for "a = a"; if we
1919 	 didn't exclude the LHS, we'd get it twice, once as a read and once
1920 	 as a write.  */
1921       add_tlist (pno_sp, tmp_list3, x, 0);
1922       warn_for_collisions_1 (TREE_OPERAND (x, 0), x, tmp_nosp, 1);
1923 
1924       merge_tlist (pbefore_sp, tmp_before, 0);
1925       if (warning_candidate_p (TREE_OPERAND (x, 0)))
1926 	merge_tlist (&tmp_nosp, new_tlist (NULL, TREE_OPERAND (x, 0), x), 0);
1927       add_tlist (pno_sp, tmp_nosp, NULL_TREE, 1);
1928       return;
1929 
1930     case CALL_EXPR:
1931       /* We need to warn about conflicts among arguments and conflicts between
1932 	 args and the function address.  Side effects of the function address,
1933 	 however, are not ordered by the sequence point of the call.  */
1934       {
1935 	call_expr_arg_iterator iter;
1936 	tree arg;
1937 	tmp_before = tmp_nosp = 0;
1938 	verify_tree (CALL_EXPR_FN (x), &tmp_before, &tmp_nosp, NULL_TREE);
1939 	FOR_EACH_CALL_EXPR_ARG (arg, iter, x)
1940 	  {
1941 	    tmp_list2 = tmp_list3 = 0;
1942 	    verify_tree (arg, &tmp_list2, &tmp_list3, NULL_TREE);
1943 	    merge_tlist (&tmp_list3, tmp_list2, 0);
1944 	    add_tlist (&tmp_before, tmp_list3, NULL_TREE, 0);
1945 	  }
1946 	add_tlist (&tmp_before, tmp_nosp, NULL_TREE, 0);
1947 	warn_for_collisions (tmp_before);
1948 	add_tlist (pbefore_sp, tmp_before, NULL_TREE, 0);
1949 	return;
1950       }
1951 
1952     case TREE_LIST:
1953       /* Scan all the list, e.g. indices of multi dimensional array.  */
1954       while (x)
1955 	{
1956 	  tmp_before = tmp_nosp = 0;
1957 	  verify_tree (TREE_VALUE (x), &tmp_before, &tmp_nosp, NULL_TREE);
1958 	  merge_tlist (&tmp_nosp, tmp_before, 0);
1959 	  add_tlist (pno_sp, tmp_nosp, NULL_TREE, 0);
1960 	  x = TREE_CHAIN (x);
1961 	}
1962       return;
1963 
1964     case SAVE_EXPR:
1965       {
1966 	struct tlist_cache *t;
1967 	for (t = save_expr_cache; t; t = t->next)
1968 	  if (candidate_equal_p (t->expr, x))
1969 	    break;
1970 
1971 	if (!t)
1972 	  {
1973 	    t = XOBNEW (&tlist_obstack, struct tlist_cache);
1974 	    t->next = save_expr_cache;
1975 	    t->expr = x;
1976 	    save_expr_cache = t;
1977 
1978 	    tmp_before = tmp_nosp = 0;
1979 	    verify_tree (TREE_OPERAND (x, 0), &tmp_before, &tmp_nosp, NULL_TREE);
1980 	    warn_for_collisions (tmp_nosp);
1981 
1982 	    tmp_list3 = 0;
1983 	    merge_tlist (&tmp_list3, tmp_nosp, 0);
1984 	    t->cache_before_sp = tmp_before;
1985 	    t->cache_after_sp = tmp_list3;
1986 	  }
1987 	merge_tlist (pbefore_sp, t->cache_before_sp, 1);
1988 	add_tlist (pno_sp, t->cache_after_sp, NULL_TREE, 1);
1989 	return;
1990       }
1991 
1992     case ADDR_EXPR:
1993       x = TREE_OPERAND (x, 0);
1994       if (DECL_P (x))
1995 	return;
1996       writer = 0;
1997       goto restart;
1998 
1999     case VIEW_CONVERT_EXPR:
2000       if (location_wrapper_p (x))
2001 	{
2002 	  x = TREE_OPERAND (x, 0);
2003 	  goto restart;
2004 	}
2005       goto do_default;
2006 
2007     case LSHIFT_EXPR:
2008     case RSHIFT_EXPR:
2009     case COMPONENT_REF:
2010     case ARRAY_REF:
2011       if (cxx_dialect >= cxx17)
2012 	goto sequenced_binary;
2013       goto do_default;
2014 
2015     default:
2016     do_default:
2017       /* For other expressions, simply recurse on their operands.
2018 	 Manual tail recursion for unary expressions.
2019 	 Other non-expressions need not be processed.  */
2020       if (cl == tcc_unary)
2021 	{
2022 	  x = TREE_OPERAND (x, 0);
2023 	  writer = 0;
2024 	  goto restart;
2025 	}
2026       else if (IS_EXPR_CODE_CLASS (cl))
2027 	{
2028 	  int lp;
2029 	  int max = TREE_OPERAND_LENGTH (x);
2030 	  for (lp = 0; lp < max; lp++)
2031 	    {
2032 	      tmp_before = tmp_nosp = 0;
2033 	      verify_tree (TREE_OPERAND (x, lp), &tmp_before, &tmp_nosp, 0);
2034 	      merge_tlist (&tmp_nosp, tmp_before, 0);
2035 	      add_tlist (pno_sp, tmp_nosp, NULL_TREE, 0);
2036 	    }
2037 	}
2038       return;
2039     }
2040 }
2041 
2042 /* Try to warn for undefined behavior in EXPR due to missing sequence
2043    points.  */
2044 
2045 void
verify_sequence_points(tree expr)2046 verify_sequence_points (tree expr)
2047 {
2048   struct tlist *before_sp = 0, *after_sp = 0;
2049 
2050   warned_ids = 0;
2051   save_expr_cache = 0;
2052   if (tlist_firstobj == 0)
2053     {
2054       gcc_obstack_init (&tlist_obstack);
2055       tlist_firstobj = (char *) obstack_alloc (&tlist_obstack, 0);
2056     }
2057 
2058   verify_tree (expr, &before_sp, &after_sp, 0);
2059   warn_for_collisions (after_sp);
2060   obstack_free (&tlist_obstack, tlist_firstobj);
2061 }
2062 
2063 /* Validate the expression after `case' and apply default promotions.  */
2064 
2065 static tree
check_case_value(location_t loc,tree value)2066 check_case_value (location_t loc, tree value)
2067 {
2068   if (value == NULL_TREE)
2069     return value;
2070 
2071   if (TREE_CODE (value) == INTEGER_CST)
2072     /* Promote char or short to int.  */
2073     value = perform_integral_promotions (value);
2074   else if (value != error_mark_node)
2075     {
2076       error_at (loc, "case label does not reduce to an integer constant");
2077       value = error_mark_node;
2078     }
2079 
2080   constant_expression_warning (value);
2081 
2082   return value;
2083 }
2084 
2085 /* Return an integer type with BITS bits of precision,
2086    that is unsigned if UNSIGNEDP is nonzero, otherwise signed.  */
2087 
2088 tree
c_common_type_for_size(unsigned int bits,int unsignedp)2089 c_common_type_for_size (unsigned int bits, int unsignedp)
2090 {
2091   int i;
2092 
2093   if (bits == TYPE_PRECISION (integer_type_node))
2094     return unsignedp ? unsigned_type_node : integer_type_node;
2095 
2096   if (bits == TYPE_PRECISION (signed_char_type_node))
2097     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
2098 
2099   if (bits == TYPE_PRECISION (short_integer_type_node))
2100     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
2101 
2102   if (bits == TYPE_PRECISION (long_integer_type_node))
2103     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
2104 
2105   if (bits == TYPE_PRECISION (long_long_integer_type_node))
2106     return (unsignedp ? long_long_unsigned_type_node
2107 	    : long_long_integer_type_node);
2108 
2109   for (i = 0; i < NUM_INT_N_ENTS; i ++)
2110     if (int_n_enabled_p[i]
2111 	&& bits == int_n_data[i].bitsize)
2112       return (unsignedp ? int_n_trees[i].unsigned_type
2113 	      : int_n_trees[i].signed_type);
2114 
2115   if (bits == TYPE_PRECISION (widest_integer_literal_type_node))
2116     return (unsignedp ? widest_unsigned_literal_type_node
2117 	    : widest_integer_literal_type_node);
2118 
2119   if (bits <= TYPE_PRECISION (intQI_type_node))
2120     return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
2121 
2122   if (bits <= TYPE_PRECISION (intHI_type_node))
2123     return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
2124 
2125   if (bits <= TYPE_PRECISION (intSI_type_node))
2126     return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
2127 
2128   if (bits <= TYPE_PRECISION (intDI_type_node))
2129     return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
2130 
2131   return NULL_TREE;
2132 }
2133 
2134 /* Return a fixed-point type that has at least IBIT ibits and FBIT fbits
2135    that is unsigned if UNSIGNEDP is nonzero, otherwise signed;
2136    and saturating if SATP is nonzero, otherwise not saturating.  */
2137 
2138 tree
c_common_fixed_point_type_for_size(unsigned int ibit,unsigned int fbit,int unsignedp,int satp)2139 c_common_fixed_point_type_for_size (unsigned int ibit, unsigned int fbit,
2140 				    int unsignedp, int satp)
2141 {
2142   enum mode_class mclass;
2143   if (ibit == 0)
2144     mclass = unsignedp ? MODE_UFRACT : MODE_FRACT;
2145   else
2146     mclass = unsignedp ? MODE_UACCUM : MODE_ACCUM;
2147 
2148   opt_scalar_mode opt_mode;
2149   scalar_mode mode;
2150   FOR_EACH_MODE_IN_CLASS (opt_mode, mclass)
2151     {
2152       mode = opt_mode.require ();
2153       if (GET_MODE_IBIT (mode) >= ibit && GET_MODE_FBIT (mode) >= fbit)
2154 	break;
2155     }
2156 
2157   if (!opt_mode.exists (&mode) || !targetm.scalar_mode_supported_p (mode))
2158     {
2159       sorry ("GCC cannot support operators with integer types and "
2160 	     "fixed-point types that have too many integral and "
2161 	     "fractional bits together");
2162       return NULL_TREE;
2163     }
2164 
2165   return c_common_type_for_mode (mode, satp);
2166 }
2167 
2168 /* Used for communication between c_common_type_for_mode and
2169    c_register_builtin_type.  */
2170 tree registered_builtin_types;
2171 
2172 /* Return a data type that has machine mode MODE.
2173    If the mode is an integer,
2174    then UNSIGNEDP selects between signed and unsigned types.
2175    If the mode is a fixed-point mode,
2176    then UNSIGNEDP selects between saturating and nonsaturating types.  */
2177 
2178 tree
c_common_type_for_mode(machine_mode mode,int unsignedp)2179 c_common_type_for_mode (machine_mode mode, int unsignedp)
2180 {
2181   tree t;
2182   int i;
2183 
2184   if (mode == TYPE_MODE (integer_type_node))
2185     return unsignedp ? unsigned_type_node : integer_type_node;
2186 
2187   if (mode == TYPE_MODE (signed_char_type_node))
2188     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
2189 
2190   if (mode == TYPE_MODE (short_integer_type_node))
2191     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
2192 
2193   if (mode == TYPE_MODE (long_integer_type_node))
2194     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
2195 
2196   if (mode == TYPE_MODE (long_long_integer_type_node))
2197     return unsignedp ? long_long_unsigned_type_node : long_long_integer_type_node;
2198 
2199   for (i = 0; i < NUM_INT_N_ENTS; i ++)
2200     if (int_n_enabled_p[i]
2201 	&& mode == int_n_data[i].m)
2202       return (unsignedp ? int_n_trees[i].unsigned_type
2203 	      : int_n_trees[i].signed_type);
2204 
2205   if (mode == QImode)
2206     return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
2207 
2208   if (mode == HImode)
2209     return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
2210 
2211   if (mode == SImode)
2212     return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
2213 
2214   if (mode == DImode)
2215     return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
2216 
2217 #if HOST_BITS_PER_WIDE_INT >= 64
2218   if (mode == TYPE_MODE (intTI_type_node))
2219     return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
2220 #endif
2221 
2222   if (mode == TYPE_MODE (float_type_node))
2223     return float_type_node;
2224 
2225   if (mode == TYPE_MODE (double_type_node))
2226     return double_type_node;
2227 
2228   if (mode == TYPE_MODE (long_double_type_node))
2229     return long_double_type_node;
2230 
2231   for (i = 0; i < NUM_FLOATN_NX_TYPES; i++)
2232     if (FLOATN_NX_TYPE_NODE (i) != NULL_TREE
2233 	&& mode == TYPE_MODE (FLOATN_NX_TYPE_NODE (i)))
2234       return FLOATN_NX_TYPE_NODE (i);
2235 
2236   if (mode == TYPE_MODE (void_type_node))
2237     return void_type_node;
2238 
2239   if (mode == TYPE_MODE (build_pointer_type (char_type_node))
2240       || mode == TYPE_MODE (build_pointer_type (integer_type_node)))
2241     {
2242       unsigned int precision
2243 	= GET_MODE_PRECISION (as_a <scalar_int_mode> (mode));
2244       return (unsignedp
2245 	      ? make_unsigned_type (precision)
2246 	      : make_signed_type (precision));
2247     }
2248 
2249   if (COMPLEX_MODE_P (mode))
2250     {
2251       machine_mode inner_mode;
2252       tree inner_type;
2253 
2254       if (mode == TYPE_MODE (complex_float_type_node))
2255 	return complex_float_type_node;
2256       if (mode == TYPE_MODE (complex_double_type_node))
2257 	return complex_double_type_node;
2258       if (mode == TYPE_MODE (complex_long_double_type_node))
2259 	return complex_long_double_type_node;
2260 
2261       for (i = 0; i < NUM_FLOATN_NX_TYPES; i++)
2262 	if (COMPLEX_FLOATN_NX_TYPE_NODE (i) != NULL_TREE
2263 	    && mode == TYPE_MODE (COMPLEX_FLOATN_NX_TYPE_NODE (i)))
2264 	  return COMPLEX_FLOATN_NX_TYPE_NODE (i);
2265 
2266       if (mode == TYPE_MODE (complex_integer_type_node) && !unsignedp)
2267 	return complex_integer_type_node;
2268 
2269       inner_mode = GET_MODE_INNER (mode);
2270       inner_type = c_common_type_for_mode (inner_mode, unsignedp);
2271       if (inner_type != NULL_TREE)
2272 	return build_complex_type (inner_type);
2273     }
2274   else if (GET_MODE_CLASS (mode) == MODE_VECTOR_BOOL
2275 	   && valid_vector_subparts_p (GET_MODE_NUNITS (mode)))
2276     {
2277       unsigned int elem_bits = vector_element_size (GET_MODE_BITSIZE (mode),
2278 						    GET_MODE_NUNITS (mode));
2279       tree bool_type = build_nonstandard_boolean_type (elem_bits);
2280       return build_vector_type_for_mode (bool_type, mode);
2281     }
2282   else if (VECTOR_MODE_P (mode)
2283 	   && valid_vector_subparts_p (GET_MODE_NUNITS (mode)))
2284     {
2285       machine_mode inner_mode = GET_MODE_INNER (mode);
2286       tree inner_type = c_common_type_for_mode (inner_mode, unsignedp);
2287       if (inner_type != NULL_TREE)
2288 	return build_vector_type_for_mode (inner_type, mode);
2289     }
2290 
2291   if (dfloat32_type_node != NULL_TREE
2292       && mode == TYPE_MODE (dfloat32_type_node))
2293     return dfloat32_type_node;
2294   if (dfloat64_type_node != NULL_TREE
2295       && mode == TYPE_MODE (dfloat64_type_node))
2296     return dfloat64_type_node;
2297   if (dfloat128_type_node != NULL_TREE
2298       && mode == TYPE_MODE (dfloat128_type_node))
2299     return dfloat128_type_node;
2300 
2301   if (ALL_SCALAR_FIXED_POINT_MODE_P (mode))
2302     {
2303       if (mode == TYPE_MODE (short_fract_type_node))
2304 	return unsignedp ? sat_short_fract_type_node : short_fract_type_node;
2305       if (mode == TYPE_MODE (fract_type_node))
2306 	return unsignedp ? sat_fract_type_node : fract_type_node;
2307       if (mode == TYPE_MODE (long_fract_type_node))
2308 	return unsignedp ? sat_long_fract_type_node : long_fract_type_node;
2309       if (mode == TYPE_MODE (long_long_fract_type_node))
2310 	return unsignedp ? sat_long_long_fract_type_node
2311 			 : long_long_fract_type_node;
2312 
2313       if (mode == TYPE_MODE (unsigned_short_fract_type_node))
2314 	return unsignedp ? sat_unsigned_short_fract_type_node
2315 			 : unsigned_short_fract_type_node;
2316       if (mode == TYPE_MODE (unsigned_fract_type_node))
2317 	return unsignedp ? sat_unsigned_fract_type_node
2318 			 : unsigned_fract_type_node;
2319       if (mode == TYPE_MODE (unsigned_long_fract_type_node))
2320 	return unsignedp ? sat_unsigned_long_fract_type_node
2321 			 : unsigned_long_fract_type_node;
2322       if (mode == TYPE_MODE (unsigned_long_long_fract_type_node))
2323 	return unsignedp ? sat_unsigned_long_long_fract_type_node
2324 			 : unsigned_long_long_fract_type_node;
2325 
2326       if (mode == TYPE_MODE (short_accum_type_node))
2327 	return unsignedp ? sat_short_accum_type_node : short_accum_type_node;
2328       if (mode == TYPE_MODE (accum_type_node))
2329 	return unsignedp ? sat_accum_type_node : accum_type_node;
2330       if (mode == TYPE_MODE (long_accum_type_node))
2331 	return unsignedp ? sat_long_accum_type_node : long_accum_type_node;
2332       if (mode == TYPE_MODE (long_long_accum_type_node))
2333 	return unsignedp ? sat_long_long_accum_type_node
2334 			 : long_long_accum_type_node;
2335 
2336       if (mode == TYPE_MODE (unsigned_short_accum_type_node))
2337 	return unsignedp ? sat_unsigned_short_accum_type_node
2338 			 : unsigned_short_accum_type_node;
2339       if (mode == TYPE_MODE (unsigned_accum_type_node))
2340 	return unsignedp ? sat_unsigned_accum_type_node
2341 			 : unsigned_accum_type_node;
2342       if (mode == TYPE_MODE (unsigned_long_accum_type_node))
2343 	return unsignedp ? sat_unsigned_long_accum_type_node
2344 			 : unsigned_long_accum_type_node;
2345       if (mode == TYPE_MODE (unsigned_long_long_accum_type_node))
2346 	return unsignedp ? sat_unsigned_long_long_accum_type_node
2347 			 : unsigned_long_long_accum_type_node;
2348 
2349       if (mode == QQmode)
2350 	return unsignedp ? sat_qq_type_node : qq_type_node;
2351       if (mode == HQmode)
2352 	return unsignedp ? sat_hq_type_node : hq_type_node;
2353       if (mode == SQmode)
2354 	return unsignedp ? sat_sq_type_node : sq_type_node;
2355       if (mode == DQmode)
2356 	return unsignedp ? sat_dq_type_node : dq_type_node;
2357       if (mode == TQmode)
2358 	return unsignedp ? sat_tq_type_node : tq_type_node;
2359 
2360       if (mode == UQQmode)
2361 	return unsignedp ? sat_uqq_type_node : uqq_type_node;
2362       if (mode == UHQmode)
2363 	return unsignedp ? sat_uhq_type_node : uhq_type_node;
2364       if (mode == USQmode)
2365 	return unsignedp ? sat_usq_type_node : usq_type_node;
2366       if (mode == UDQmode)
2367 	return unsignedp ? sat_udq_type_node : udq_type_node;
2368       if (mode == UTQmode)
2369 	return unsignedp ? sat_utq_type_node : utq_type_node;
2370 
2371       if (mode == HAmode)
2372 	return unsignedp ? sat_ha_type_node : ha_type_node;
2373       if (mode == SAmode)
2374 	return unsignedp ? sat_sa_type_node : sa_type_node;
2375       if (mode == DAmode)
2376 	return unsignedp ? sat_da_type_node : da_type_node;
2377       if (mode == TAmode)
2378 	return unsignedp ? sat_ta_type_node : ta_type_node;
2379 
2380       if (mode == UHAmode)
2381 	return unsignedp ? sat_uha_type_node : uha_type_node;
2382       if (mode == USAmode)
2383 	return unsignedp ? sat_usa_type_node : usa_type_node;
2384       if (mode == UDAmode)
2385 	return unsignedp ? sat_uda_type_node : uda_type_node;
2386       if (mode == UTAmode)
2387 	return unsignedp ? sat_uta_type_node : uta_type_node;
2388     }
2389 
2390   for (t = registered_builtin_types; t; t = TREE_CHAIN (t))
2391     {
2392       tree type = TREE_VALUE (t);
2393       if (TYPE_MODE (type) == mode
2394 	  && VECTOR_TYPE_P (type) == VECTOR_MODE_P (mode)
2395 	  && !!unsignedp == !!TYPE_UNSIGNED (type))
2396 	return type;
2397     }
2398   return NULL_TREE;
2399 }
2400 
2401 tree
c_common_unsigned_type(tree type)2402 c_common_unsigned_type (tree type)
2403 {
2404   return c_common_signed_or_unsigned_type (1, type);
2405 }
2406 
2407 /* Return a signed type the same as TYPE in other respects.  */
2408 
2409 tree
c_common_signed_type(tree type)2410 c_common_signed_type (tree type)
2411 {
2412   return c_common_signed_or_unsigned_type (0, type);
2413 }
2414 
2415 /* Return a type the same as TYPE except unsigned or
2416    signed according to UNSIGNEDP.  */
2417 
2418 tree
c_common_signed_or_unsigned_type(int unsignedp,tree type)2419 c_common_signed_or_unsigned_type (int unsignedp, tree type)
2420 {
2421   tree type1;
2422   int i;
2423 
2424   /* This block of code emulates the behavior of the old
2425      c_common_unsigned_type. In particular, it returns
2426      long_unsigned_type_node if passed a long, even when a int would
2427      have the same size. This is necessary for warnings to work
2428      correctly in archs where sizeof(int) == sizeof(long) */
2429 
2430   type1 = TYPE_MAIN_VARIANT (type);
2431   if (type1 == signed_char_type_node || type1 == char_type_node || type1 == unsigned_char_type_node)
2432     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
2433   if (type1 == integer_type_node || type1 == unsigned_type_node)
2434     return unsignedp ? unsigned_type_node : integer_type_node;
2435   if (type1 == short_integer_type_node || type1 == short_unsigned_type_node)
2436     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
2437   if (type1 == long_integer_type_node || type1 == long_unsigned_type_node)
2438     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
2439   if (type1 == long_long_integer_type_node || type1 == long_long_unsigned_type_node)
2440     return unsignedp ? long_long_unsigned_type_node : long_long_integer_type_node;
2441 
2442   for (i = 0; i < NUM_INT_N_ENTS; i ++)
2443     if (int_n_enabled_p[i]
2444 	&& (type1 == int_n_trees[i].unsigned_type
2445 	    || type1 == int_n_trees[i].signed_type))
2446       return (unsignedp ? int_n_trees[i].unsigned_type
2447 	      : int_n_trees[i].signed_type);
2448 
2449 #if HOST_BITS_PER_WIDE_INT >= 64
2450   if (type1 == intTI_type_node || type1 == unsigned_intTI_type_node)
2451     return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
2452 #endif
2453   if (type1 == intDI_type_node || type1 == unsigned_intDI_type_node)
2454     return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
2455   if (type1 == intSI_type_node || type1 == unsigned_intSI_type_node)
2456     return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
2457   if (type1 == intHI_type_node || type1 == unsigned_intHI_type_node)
2458     return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
2459   if (type1 == intQI_type_node || type1 == unsigned_intQI_type_node)
2460     return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
2461 
2462 #define C_COMMON_FIXED_TYPES(NAME)	    \
2463   if (type1 == short_ ## NAME ## _type_node \
2464       || type1 == unsigned_short_ ## NAME ## _type_node) \
2465     return unsignedp ? unsigned_short_ ## NAME ## _type_node \
2466 		     : short_ ## NAME ## _type_node; \
2467   if (type1 == NAME ## _type_node \
2468       || type1 == unsigned_ ## NAME ## _type_node) \
2469     return unsignedp ? unsigned_ ## NAME ## _type_node \
2470 		     : NAME ## _type_node; \
2471   if (type1 == long_ ## NAME ## _type_node \
2472       || type1 == unsigned_long_ ## NAME ## _type_node) \
2473     return unsignedp ? unsigned_long_ ## NAME ## _type_node \
2474 		     : long_ ## NAME ## _type_node; \
2475   if (type1 == long_long_ ## NAME ## _type_node \
2476       || type1 == unsigned_long_long_ ## NAME ## _type_node) \
2477     return unsignedp ? unsigned_long_long_ ## NAME ## _type_node \
2478 		     : long_long_ ## NAME ## _type_node;
2479 
2480 #define C_COMMON_FIXED_MODE_TYPES(NAME) \
2481   if (type1 == NAME ## _type_node \
2482       || type1 == u ## NAME ## _type_node) \
2483     return unsignedp ? u ## NAME ## _type_node \
2484 		     : NAME ## _type_node;
2485 
2486 #define C_COMMON_FIXED_TYPES_SAT(NAME) \
2487   if (type1 == sat_ ## short_ ## NAME ## _type_node \
2488       || type1 == sat_ ## unsigned_short_ ## NAME ## _type_node) \
2489     return unsignedp ? sat_ ## unsigned_short_ ## NAME ## _type_node \
2490 		     : sat_ ## short_ ## NAME ## _type_node; \
2491   if (type1 == sat_ ## NAME ## _type_node \
2492       || type1 == sat_ ## unsigned_ ## NAME ## _type_node) \
2493     return unsignedp ? sat_ ## unsigned_ ## NAME ## _type_node \
2494 		     : sat_ ## NAME ## _type_node; \
2495   if (type1 == sat_ ## long_ ## NAME ## _type_node \
2496       || type1 == sat_ ## unsigned_long_ ## NAME ## _type_node) \
2497     return unsignedp ? sat_ ## unsigned_long_ ## NAME ## _type_node \
2498 		     : sat_ ## long_ ## NAME ## _type_node; \
2499   if (type1 == sat_ ## long_long_ ## NAME ## _type_node \
2500       || type1 == sat_ ## unsigned_long_long_ ## NAME ## _type_node) \
2501     return unsignedp ? sat_ ## unsigned_long_long_ ## NAME ## _type_node \
2502 		     : sat_ ## long_long_ ## NAME ## _type_node;
2503 
2504 #define C_COMMON_FIXED_MODE_TYPES_SAT(NAME)	\
2505   if (type1 == sat_ ## NAME ## _type_node \
2506       || type1 == sat_ ## u ## NAME ## _type_node) \
2507     return unsignedp ? sat_ ## u ## NAME ## _type_node \
2508 		     : sat_ ## NAME ## _type_node;
2509 
2510   C_COMMON_FIXED_TYPES (fract);
2511   C_COMMON_FIXED_TYPES_SAT (fract);
2512   C_COMMON_FIXED_TYPES (accum);
2513   C_COMMON_FIXED_TYPES_SAT (accum);
2514 
2515   C_COMMON_FIXED_MODE_TYPES (qq);
2516   C_COMMON_FIXED_MODE_TYPES (hq);
2517   C_COMMON_FIXED_MODE_TYPES (sq);
2518   C_COMMON_FIXED_MODE_TYPES (dq);
2519   C_COMMON_FIXED_MODE_TYPES (tq);
2520   C_COMMON_FIXED_MODE_TYPES_SAT (qq);
2521   C_COMMON_FIXED_MODE_TYPES_SAT (hq);
2522   C_COMMON_FIXED_MODE_TYPES_SAT (sq);
2523   C_COMMON_FIXED_MODE_TYPES_SAT (dq);
2524   C_COMMON_FIXED_MODE_TYPES_SAT (tq);
2525   C_COMMON_FIXED_MODE_TYPES (ha);
2526   C_COMMON_FIXED_MODE_TYPES (sa);
2527   C_COMMON_FIXED_MODE_TYPES (da);
2528   C_COMMON_FIXED_MODE_TYPES (ta);
2529   C_COMMON_FIXED_MODE_TYPES_SAT (ha);
2530   C_COMMON_FIXED_MODE_TYPES_SAT (sa);
2531   C_COMMON_FIXED_MODE_TYPES_SAT (da);
2532   C_COMMON_FIXED_MODE_TYPES_SAT (ta);
2533 
2534   /* For ENUMERAL_TYPEs in C++, must check the mode of the types, not
2535      the precision; they have precision set to match their range, but
2536      may use a wider mode to match an ABI.  If we change modes, we may
2537      wind up with bad conversions.  For INTEGER_TYPEs in C, must check
2538      the precision as well, so as to yield correct results for
2539      bit-field types.  C++ does not have these separate bit-field
2540      types, and producing a signed or unsigned variant of an
2541      ENUMERAL_TYPE may cause other problems as well.  */
2542 
2543   if (!INTEGRAL_TYPE_P (type)
2544       || TYPE_UNSIGNED (type) == unsignedp)
2545     return type;
2546 
2547 #define TYPE_OK(node)							    \
2548   (TYPE_MODE (type) == TYPE_MODE (node)					    \
2549    && TYPE_PRECISION (type) == TYPE_PRECISION (node))
2550   if (TYPE_OK (signed_char_type_node))
2551     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
2552   if (TYPE_OK (integer_type_node))
2553     return unsignedp ? unsigned_type_node : integer_type_node;
2554   if (TYPE_OK (short_integer_type_node))
2555     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
2556   if (TYPE_OK (long_integer_type_node))
2557     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
2558   if (TYPE_OK (long_long_integer_type_node))
2559     return (unsignedp ? long_long_unsigned_type_node
2560 	    : long_long_integer_type_node);
2561 
2562   for (i = 0; i < NUM_INT_N_ENTS; i ++)
2563     if (int_n_enabled_p[i]
2564 	&& TYPE_MODE (type) == int_n_data[i].m
2565 	&& TYPE_PRECISION (type) == int_n_data[i].bitsize)
2566       return (unsignedp ? int_n_trees[i].unsigned_type
2567 	      : int_n_trees[i].signed_type);
2568 
2569 #if HOST_BITS_PER_WIDE_INT >= 64
2570   if (TYPE_OK (intTI_type_node))
2571     return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
2572 #endif
2573   if (TYPE_OK (intDI_type_node))
2574     return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
2575   if (TYPE_OK (intSI_type_node))
2576     return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
2577   if (TYPE_OK (intHI_type_node))
2578     return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
2579   if (TYPE_OK (intQI_type_node))
2580     return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
2581 #undef TYPE_OK
2582 
2583   return build_nonstandard_integer_type (TYPE_PRECISION (type), unsignedp);
2584 }
2585 
2586 /* Build a bit-field integer type for the given WIDTH and UNSIGNEDP.  */
2587 
2588 tree
c_build_bitfield_integer_type(unsigned HOST_WIDE_INT width,int unsignedp)2589 c_build_bitfield_integer_type (unsigned HOST_WIDE_INT width, int unsignedp)
2590 {
2591   int i;
2592 
2593   /* Extended integer types of the same width as a standard type have
2594      lesser rank, so those of the same width as int promote to int or
2595      unsigned int and are valid for printf formats expecting int or
2596      unsigned int.  To avoid such special cases, avoid creating
2597      extended integer types for bit-fields if a standard integer type
2598      is available.  */
2599   if (width == TYPE_PRECISION (integer_type_node))
2600     return unsignedp ? unsigned_type_node : integer_type_node;
2601   if (width == TYPE_PRECISION (signed_char_type_node))
2602     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
2603   if (width == TYPE_PRECISION (short_integer_type_node))
2604     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
2605   if (width == TYPE_PRECISION (long_integer_type_node))
2606     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
2607   if (width == TYPE_PRECISION (long_long_integer_type_node))
2608     return (unsignedp ? long_long_unsigned_type_node
2609 	    : long_long_integer_type_node);
2610   for (i = 0; i < NUM_INT_N_ENTS; i ++)
2611     if (int_n_enabled_p[i]
2612 	&& width == int_n_data[i].bitsize)
2613       return (unsignedp ? int_n_trees[i].unsigned_type
2614 	      : int_n_trees[i].signed_type);
2615   return build_nonstandard_integer_type (width, unsignedp);
2616 }
2617 
2618 /* The C version of the register_builtin_type langhook.  */
2619 
2620 void
c_register_builtin_type(tree type,const char * name)2621 c_register_builtin_type (tree type, const char* name)
2622 {
2623   tree decl;
2624 
2625   decl = build_decl (UNKNOWN_LOCATION,
2626 		     TYPE_DECL, get_identifier (name), type);
2627   DECL_ARTIFICIAL (decl) = 1;
2628   if (!TYPE_NAME (type))
2629     TYPE_NAME (type) = decl;
2630   lang_hooks.decls.pushdecl (decl);
2631 
2632   registered_builtin_types = tree_cons (0, type, registered_builtin_types);
2633 }
2634 
2635 /* Print an error message for invalid operands to arith operation
2636    CODE with TYPE0 for operand 0, and TYPE1 for operand 1.
2637    RICHLOC is a rich location for the message, containing either
2638    three separate locations for each of the operator and operands
2639 
2640       lhs op rhs
2641       ~~~ ^~ ~~~
2642 
2643    (C FE), or one location ranging over all over them
2644 
2645       lhs op rhs
2646       ~~~~^~~~~~
2647 
2648    (C++ FE).  */
2649 
2650 void
binary_op_error(rich_location * richloc,enum tree_code code,tree type0,tree type1)2651 binary_op_error (rich_location *richloc, enum tree_code code,
2652 		 tree type0, tree type1)
2653 {
2654   const char *opname;
2655 
2656   switch (code)
2657     {
2658     case PLUS_EXPR:
2659       opname = "+"; break;
2660     case MINUS_EXPR:
2661       opname = "-"; break;
2662     case MULT_EXPR:
2663       opname = "*"; break;
2664     case MAX_EXPR:
2665       opname = "max"; break;
2666     case MIN_EXPR:
2667       opname = "min"; break;
2668     case EQ_EXPR:
2669       opname = "=="; break;
2670     case NE_EXPR:
2671       opname = "!="; break;
2672     case LE_EXPR:
2673       opname = "<="; break;
2674     case GE_EXPR:
2675       opname = ">="; break;
2676     case LT_EXPR:
2677       opname = "<"; break;
2678     case GT_EXPR:
2679       opname = ">"; break;
2680     case LSHIFT_EXPR:
2681       opname = "<<"; break;
2682     case RSHIFT_EXPR:
2683       opname = ">>"; break;
2684     case TRUNC_MOD_EXPR:
2685     case FLOOR_MOD_EXPR:
2686       opname = "%"; break;
2687     case TRUNC_DIV_EXPR:
2688     case FLOOR_DIV_EXPR:
2689       opname = "/"; break;
2690     case BIT_AND_EXPR:
2691       opname = "&"; break;
2692     case BIT_IOR_EXPR:
2693       opname = "|"; break;
2694     case TRUTH_ANDIF_EXPR:
2695       opname = "&&"; break;
2696     case TRUTH_ORIF_EXPR:
2697       opname = "||"; break;
2698     case BIT_XOR_EXPR:
2699       opname = "^"; break;
2700     default:
2701       gcc_unreachable ();
2702     }
2703   error_at (richloc,
2704 	    "invalid operands to binary %s (have %qT and %qT)",
2705 	    opname, type0, type1);
2706 }
2707 
2708 /* Given an expression as a tree, return its original type.  Do this
2709    by stripping any conversion that preserves the sign and precision.  */
2710 static tree
expr_original_type(tree expr)2711 expr_original_type (tree expr)
2712 {
2713   STRIP_SIGN_NOPS (expr);
2714   return TREE_TYPE (expr);
2715 }
2716 
2717 /* Subroutine of build_binary_op, used for comparison operations.
2718    See if the operands have both been converted from subword integer types
2719    and, if so, perhaps change them both back to their original type.
2720    This function is also responsible for converting the two operands
2721    to the proper common type for comparison.
2722 
2723    The arguments of this function are all pointers to local variables
2724    of build_binary_op: OP0_PTR is &OP0, OP1_PTR is &OP1,
2725    RESTYPE_PTR is &RESULT_TYPE and RESCODE_PTR is &RESULTCODE.
2726 
2727    LOC is the location of the comparison.
2728 
2729    If this function returns non-NULL_TREE, it means that the comparison has
2730    a constant value.  What this function returns is an expression for
2731    that value.  */
2732 
2733 tree
shorten_compare(location_t loc,tree * op0_ptr,tree * op1_ptr,tree * restype_ptr,enum tree_code * rescode_ptr)2734 shorten_compare (location_t loc, tree *op0_ptr, tree *op1_ptr,
2735 		 tree *restype_ptr, enum tree_code *rescode_ptr)
2736 {
2737   tree type;
2738   tree op0 = *op0_ptr;
2739   tree op1 = *op1_ptr;
2740   int unsignedp0, unsignedp1;
2741   int real1, real2;
2742   tree primop0, primop1;
2743   enum tree_code code = *rescode_ptr;
2744 
2745   /* Throw away any conversions to wider types
2746      already present in the operands.  */
2747 
2748   primop0 = c_common_get_narrower (op0, &unsignedp0);
2749   primop1 = c_common_get_narrower (op1, &unsignedp1);
2750 
2751   /* If primopN is first sign-extended from primopN's precision to opN's
2752      precision, then zero-extended from opN's precision to
2753      *restype_ptr precision, shortenings might be invalid.  */
2754   if (TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (TREE_TYPE (op0))
2755       && TYPE_PRECISION (TREE_TYPE (op0)) < TYPE_PRECISION (*restype_ptr)
2756       && !unsignedp0
2757       && TYPE_UNSIGNED (TREE_TYPE (op0)))
2758     primop0 = op0;
2759   if (TYPE_PRECISION (TREE_TYPE (primop1)) < TYPE_PRECISION (TREE_TYPE (op1))
2760       && TYPE_PRECISION (TREE_TYPE (op1)) < TYPE_PRECISION (*restype_ptr)
2761       && !unsignedp1
2762       && TYPE_UNSIGNED (TREE_TYPE (op1)))
2763     primop1 = op1;
2764 
2765   /* Handle the case that OP0 does not *contain* a conversion
2766      but it *requires* conversion to FINAL_TYPE.  */
2767 
2768   if (op0 == primop0 && TREE_TYPE (op0) != *restype_ptr)
2769     unsignedp0 = TYPE_UNSIGNED (TREE_TYPE (op0));
2770   if (op1 == primop1 && TREE_TYPE (op1) != *restype_ptr)
2771     unsignedp1 = TYPE_UNSIGNED (TREE_TYPE (op1));
2772 
2773   /* If one of the operands must be floated, we cannot optimize.  */
2774   real1 = TREE_CODE (TREE_TYPE (primop0)) == REAL_TYPE;
2775   real2 = TREE_CODE (TREE_TYPE (primop1)) == REAL_TYPE;
2776 
2777   /* If first arg is constant, swap the args (changing operation
2778      so value is preserved), for canonicalization.  Don't do this if
2779      the second arg is 0.  */
2780 
2781   if (TREE_CONSTANT (primop0)
2782       && !integer_zerop (primop1) && !real_zerop (primop1)
2783       && !fixed_zerop (primop1))
2784     {
2785       std::swap (primop0, primop1);
2786       std::swap (op0, op1);
2787       *op0_ptr = op0;
2788       *op1_ptr = op1;
2789       std::swap (unsignedp0, unsignedp1);
2790       std::swap (real1, real2);
2791 
2792       switch (code)
2793 	{
2794 	case LT_EXPR:
2795 	  code = GT_EXPR;
2796 	  break;
2797 	case GT_EXPR:
2798 	  code = LT_EXPR;
2799 	  break;
2800 	case LE_EXPR:
2801 	  code = GE_EXPR;
2802 	  break;
2803 	case GE_EXPR:
2804 	  code = LE_EXPR;
2805 	  break;
2806 	default:
2807 	  break;
2808 	}
2809       *rescode_ptr = code;
2810     }
2811 
2812   /* If comparing an integer against a constant more bits wide,
2813      maybe we can deduce a value of 1 or 0 independent of the data.
2814      Or else truncate the constant now
2815      rather than extend the variable at run time.
2816 
2817      This is only interesting if the constant is the wider arg.
2818      Also, it is not safe if the constant is unsigned and the
2819      variable arg is signed, since in this case the variable
2820      would be sign-extended and then regarded as unsigned.
2821      Our technique fails in this case because the lowest/highest
2822      possible unsigned results don't follow naturally from the
2823      lowest/highest possible values of the variable operand.
2824      For just EQ_EXPR and NE_EXPR there is another technique that
2825      could be used: see if the constant can be faithfully represented
2826      in the other operand's type, by truncating it and reextending it
2827      and see if that preserves the constant's value.  */
2828 
2829   if (!real1 && !real2
2830       && TREE_CODE (TREE_TYPE (primop0)) != FIXED_POINT_TYPE
2831       && TREE_CODE (primop1) == INTEGER_CST
2832       && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr))
2833     {
2834       int min_gt, max_gt, min_lt, max_lt;
2835       tree maxval, minval;
2836       /* 1 if comparison is nominally unsigned.  */
2837       int unsignedp = TYPE_UNSIGNED (*restype_ptr);
2838       tree val;
2839 
2840       type = c_common_signed_or_unsigned_type (unsignedp0,
2841 					       TREE_TYPE (primop0));
2842 
2843       maxval = TYPE_MAX_VALUE (type);
2844       minval = TYPE_MIN_VALUE (type);
2845 
2846       if (unsignedp && !unsignedp0)
2847 	*restype_ptr = c_common_signed_type (*restype_ptr);
2848 
2849       if (TREE_TYPE (primop1) != *restype_ptr)
2850 	{
2851 	  /* Convert primop1 to target type, but do not introduce
2852 	     additional overflow.  We know primop1 is an int_cst.  */
2853 	  primop1 = force_fit_type (*restype_ptr,
2854 				    wi::to_wide
2855 				     (primop1,
2856 				      TYPE_PRECISION (*restype_ptr)),
2857 				    0, TREE_OVERFLOW (primop1));
2858 	}
2859       if (type != *restype_ptr)
2860 	{
2861 	  minval = convert (*restype_ptr, minval);
2862 	  maxval = convert (*restype_ptr, maxval);
2863 	}
2864 
2865       min_gt = tree_int_cst_lt (primop1, minval);
2866       max_gt = tree_int_cst_lt (primop1, maxval);
2867       min_lt = tree_int_cst_lt (minval, primop1);
2868       max_lt = tree_int_cst_lt (maxval, primop1);
2869 
2870       val = 0;
2871       /* This used to be a switch, but Genix compiler can't handle that.  */
2872       if (code == NE_EXPR)
2873 	{
2874 	  if (max_lt || min_gt)
2875 	    val = truthvalue_true_node;
2876 	}
2877       else if (code == EQ_EXPR)
2878 	{
2879 	  if (max_lt || min_gt)
2880 	    val = truthvalue_false_node;
2881 	}
2882       else if (code == LT_EXPR)
2883 	{
2884 	  if (max_lt)
2885 	    val = truthvalue_true_node;
2886 	  if (!min_lt)
2887 	    val = truthvalue_false_node;
2888 	}
2889       else if (code == GT_EXPR)
2890 	{
2891 	  if (min_gt)
2892 	    val = truthvalue_true_node;
2893 	  if (!max_gt)
2894 	    val = truthvalue_false_node;
2895 	}
2896       else if (code == LE_EXPR)
2897 	{
2898 	  if (!max_gt)
2899 	    val = truthvalue_true_node;
2900 	  if (min_gt)
2901 	    val = truthvalue_false_node;
2902 	}
2903       else if (code == GE_EXPR)
2904 	{
2905 	  if (!min_lt)
2906 	    val = truthvalue_true_node;
2907 	  if (max_lt)
2908 	    val = truthvalue_false_node;
2909 	}
2910 
2911       /* If primop0 was sign-extended and unsigned comparison specd,
2912 	 we did a signed comparison above using the signed type bounds.
2913 	 But the comparison we output must be unsigned.
2914 
2915 	 Also, for inequalities, VAL is no good; but if the signed
2916 	 comparison had *any* fixed result, it follows that the
2917 	 unsigned comparison just tests the sign in reverse
2918 	 (positive values are LE, negative ones GE).
2919 	 So we can generate an unsigned comparison
2920 	 against an extreme value of the signed type.  */
2921 
2922       if (unsignedp && !unsignedp0)
2923 	{
2924 	  if (val != 0)
2925 	    switch (code)
2926 	      {
2927 	      case LT_EXPR:
2928 	      case GE_EXPR:
2929 		primop1 = TYPE_MIN_VALUE (type);
2930 		val = 0;
2931 		break;
2932 
2933 	      case LE_EXPR:
2934 	      case GT_EXPR:
2935 		primop1 = TYPE_MAX_VALUE (type);
2936 		val = 0;
2937 		break;
2938 
2939 	      default:
2940 		break;
2941 	      }
2942 	  type = c_common_unsigned_type (type);
2943 	}
2944 
2945       if (TREE_CODE (primop0) != INTEGER_CST
2946 	  /* Don't warn if it's from a (non-system) macro.  */
2947 	  && !(from_macro_expansion_at
2948 	       (expansion_point_location_if_in_system_header
2949 		(EXPR_LOCATION (primop0)))))
2950 	{
2951 	  if (val == truthvalue_false_node)
2952 	    warning_at (loc, OPT_Wtype_limits,
2953 			"comparison is always false due to limited range of data type");
2954 	  if (val == truthvalue_true_node)
2955 	    warning_at (loc, OPT_Wtype_limits,
2956 			"comparison is always true due to limited range of data type");
2957 	}
2958 
2959       if (val != 0)
2960 	{
2961 	  /* Don't forget to evaluate PRIMOP0 if it has side effects.  */
2962 	  if (TREE_SIDE_EFFECTS (primop0))
2963 	    return build2 (COMPOUND_EXPR, TREE_TYPE (val), primop0, val);
2964 	  return val;
2965 	}
2966 
2967       /* Value is not predetermined, but do the comparison
2968 	 in the type of the operand that is not constant.
2969 	 TYPE is already properly set.  */
2970     }
2971 
2972   /* If either arg is decimal float and the other is float, find the
2973      proper common type to use for comparison.  */
2974   else if (real1 && real2
2975 	   && DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (primop0)))
2976 	   && DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (primop1))))
2977     type = common_type (TREE_TYPE (primop0), TREE_TYPE (primop1));
2978 
2979   /* If either arg is decimal float and the other is float, fail.  */
2980   else if (real1 && real2
2981 	   && (DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (primop0)))
2982 	       || DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (primop1)))))
2983     return NULL_TREE;
2984 
2985   else if (real1 && real2
2986 	   && (TYPE_PRECISION (TREE_TYPE (primop0))
2987 	       == TYPE_PRECISION (TREE_TYPE (primop1))))
2988     type = TREE_TYPE (primop0);
2989 
2990   /* If args' natural types are both narrower than nominal type
2991      and both extend in the same manner, compare them
2992      in the type of the wider arg.
2993      Otherwise must actually extend both to the nominal
2994      common type lest different ways of extending
2995      alter the result.
2996      (eg, (short)-1 == (unsigned short)-1  should be 0.)  */
2997 
2998   else if (unsignedp0 == unsignedp1 && real1 == real2
2999 	   && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr)
3000 	   && TYPE_PRECISION (TREE_TYPE (primop1)) < TYPE_PRECISION (*restype_ptr))
3001     {
3002       type = common_type (TREE_TYPE (primop0), TREE_TYPE (primop1));
3003       type = c_common_signed_or_unsigned_type (unsignedp0
3004 					       || TYPE_UNSIGNED (*restype_ptr),
3005 					       type);
3006       /* Make sure shorter operand is extended the right way
3007 	 to match the longer operand.  */
3008       primop0
3009 	= convert (c_common_signed_or_unsigned_type (unsignedp0,
3010 						     TREE_TYPE (primop0)),
3011 		   primop0);
3012       primop1
3013 	= convert (c_common_signed_or_unsigned_type (unsignedp1,
3014 						     TREE_TYPE (primop1)),
3015 		   primop1);
3016     }
3017   else
3018     {
3019       /* Here we must do the comparison on the nominal type
3020 	 using the args exactly as we received them.  */
3021       type = *restype_ptr;
3022       primop0 = op0;
3023       primop1 = op1;
3024 
3025       /* We want to fold unsigned comparisons of >= and < against zero.
3026 	 For these, we may also issue a warning if we have a non-constant
3027 	 compared against zero, where the zero was spelled as "0" (rather
3028 	 than merely folding to it).
3029 	 If we have at least one constant, then op1 is constant
3030 	 and we may have a non-constant expression as op0.  */
3031       if (!real1 && !real2 && integer_zerop (primop1)
3032 	  && TYPE_UNSIGNED (*restype_ptr))
3033 	{
3034 	  tree value = NULL_TREE;
3035 	  /* All unsigned values are >= 0, so we warn.  However,
3036 	     if OP0 is a constant that is >= 0, the signedness of
3037 	     the comparison isn't an issue, so suppress the
3038 	     warning.  */
3039 	  tree folded_op0 = fold_for_warn (op0);
3040 	  bool warn =
3041 	    warn_type_limits && !in_system_header_at (loc)
3042 	    && !(TREE_CODE (folded_op0) == INTEGER_CST
3043 		 && !TREE_OVERFLOW (convert (c_common_signed_type (type),
3044 					     folded_op0)))
3045 	    /* Do not warn for enumeration types.  */
3046 	    && (TREE_CODE (expr_original_type (folded_op0)) != ENUMERAL_TYPE);
3047 
3048 	  switch (code)
3049 	    {
3050 	    case GE_EXPR:
3051 	      if (warn)
3052 		warning_at (loc, OPT_Wtype_limits,
3053 			    "comparison of unsigned expression in %<>= 0%> "
3054 			    "is always true");
3055 	      value = truthvalue_true_node;
3056 	      break;
3057 
3058 	    case LT_EXPR:
3059 	      if (warn)
3060 		warning_at (loc, OPT_Wtype_limits,
3061 			    "comparison of unsigned expression in %<< 0%> "
3062 			    "is always false");
3063 	      value = truthvalue_false_node;
3064 	      break;
3065 
3066 	    default:
3067 	      break;
3068 	    }
3069 
3070 	  if (value != NULL_TREE)
3071 	    {
3072 	      /* Don't forget to evaluate PRIMOP0 if it has side effects.  */
3073 	      if (TREE_SIDE_EFFECTS (primop0))
3074 		return build2 (COMPOUND_EXPR, TREE_TYPE (value),
3075 			       primop0, value);
3076 	      return value;
3077 	    }
3078 	}
3079     }
3080 
3081   *op0_ptr = convert (type, primop0);
3082   *op1_ptr = convert (type, primop1);
3083 
3084   *restype_ptr = truthvalue_type_node;
3085 
3086   return NULL_TREE;
3087 }
3088 
3089 /* Return a tree for the sum or difference (RESULTCODE says which)
3090    of pointer PTROP and integer INTOP.  */
3091 
3092 tree
pointer_int_sum(location_t loc,enum tree_code resultcode,tree ptrop,tree intop,bool complain)3093 pointer_int_sum (location_t loc, enum tree_code resultcode,
3094 		 tree ptrop, tree intop, bool complain)
3095 {
3096   tree size_exp, ret;
3097 
3098   /* The result is a pointer of the same type that is being added.  */
3099   tree result_type = TREE_TYPE (ptrop);
3100 
3101   if (TREE_CODE (TREE_TYPE (result_type)) == VOID_TYPE)
3102     {
3103       if (complain && warn_pointer_arith)
3104 	pedwarn (loc, OPT_Wpointer_arith,
3105 		 "pointer of type %<void *%> used in arithmetic");
3106       else if (!complain)
3107 	return error_mark_node;
3108       size_exp = integer_one_node;
3109     }
3110   else if (TREE_CODE (TREE_TYPE (result_type)) == FUNCTION_TYPE)
3111     {
3112       if (complain && warn_pointer_arith)
3113 	pedwarn (loc, OPT_Wpointer_arith,
3114 		 "pointer to a function used in arithmetic");
3115       else if (!complain)
3116 	return error_mark_node;
3117       size_exp = integer_one_node;
3118     }
3119   else if (!verify_type_context (loc, TCTX_POINTER_ARITH,
3120 				 TREE_TYPE (result_type)))
3121     size_exp = integer_one_node;
3122   else
3123     size_exp = size_in_bytes_loc (loc, TREE_TYPE (result_type));
3124 
3125   /* We are manipulating pointer values, so we don't need to warn
3126      about relying on undefined signed overflow.  We disable the
3127      warning here because we use integer types so fold won't know that
3128      they are really pointers.  */
3129   fold_defer_overflow_warnings ();
3130 
3131   /* If what we are about to multiply by the size of the elements
3132      contains a constant term, apply distributive law
3133      and multiply that constant term separately.
3134      This helps produce common subexpressions.  */
3135   if ((TREE_CODE (intop) == PLUS_EXPR || TREE_CODE (intop) == MINUS_EXPR)
3136       && !TREE_CONSTANT (intop)
3137       && TREE_CONSTANT (TREE_OPERAND (intop, 1))
3138       && TREE_CONSTANT (size_exp)
3139       /* If the constant comes from pointer subtraction,
3140 	 skip this optimization--it would cause an error.  */
3141       && TREE_CODE (TREE_TYPE (TREE_OPERAND (intop, 0))) == INTEGER_TYPE
3142       /* If the constant is unsigned, and smaller than the pointer size,
3143 	 then we must skip this optimization.  This is because it could cause
3144 	 an overflow error if the constant is negative but INTOP is not.  */
3145       && (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (intop))
3146 	  || (TYPE_PRECISION (TREE_TYPE (intop))
3147 	      == TYPE_PRECISION (TREE_TYPE (ptrop)))))
3148     {
3149       enum tree_code subcode = resultcode;
3150       tree int_type = TREE_TYPE (intop);
3151       if (TREE_CODE (intop) == MINUS_EXPR)
3152 	subcode = (subcode == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR);
3153       /* Convert both subexpression types to the type of intop,
3154 	 because weird cases involving pointer arithmetic
3155 	 can result in a sum or difference with different type args.  */
3156       ptrop = build_binary_op (EXPR_LOCATION (TREE_OPERAND (intop, 1)),
3157 			       subcode, ptrop,
3158 			       convert (int_type, TREE_OPERAND (intop, 1)),
3159 			       true);
3160       intop = convert (int_type, TREE_OPERAND (intop, 0));
3161     }
3162 
3163   /* Convert the integer argument to a type the same size as sizetype
3164      so the multiply won't overflow spuriously.  */
3165   if (TYPE_PRECISION (TREE_TYPE (intop)) != TYPE_PRECISION (sizetype)
3166       || TYPE_UNSIGNED (TREE_TYPE (intop)) != TYPE_UNSIGNED (sizetype))
3167     intop = convert (c_common_type_for_size (TYPE_PRECISION (sizetype),
3168 					     TYPE_UNSIGNED (sizetype)), intop);
3169 
3170   /* Replace the integer argument with a suitable product by the object size.
3171      Do this multiplication as signed, then convert to the appropriate type
3172      for the pointer operation and disregard an overflow that occurred only
3173      because of the sign-extension change in the latter conversion.  */
3174   {
3175     tree t = fold_build2_loc (loc, MULT_EXPR, TREE_TYPE (intop), intop,
3176 			      convert (TREE_TYPE (intop), size_exp));
3177     intop = convert (sizetype, t);
3178     if (TREE_OVERFLOW_P (intop) && !TREE_OVERFLOW (t))
3179       intop = wide_int_to_tree (TREE_TYPE (intop), wi::to_wide (intop));
3180   }
3181 
3182   /* Create the sum or difference.  */
3183   if (resultcode == MINUS_EXPR)
3184     intop = fold_build1_loc (loc, NEGATE_EXPR, sizetype, intop);
3185 
3186   ret = fold_build_pointer_plus_loc (loc, ptrop, intop);
3187 
3188   fold_undefer_and_ignore_overflow_warnings ();
3189 
3190   return ret;
3191 }
3192 
3193 /* Wrap a C_MAYBE_CONST_EXPR around an expression that is fully folded
3194    and if NON_CONST is known not to be permitted in an evaluated part
3195    of a constant expression.  */
3196 
3197 tree
c_wrap_maybe_const(tree expr,bool non_const)3198 c_wrap_maybe_const (tree expr, bool non_const)
3199 {
3200   bool nowarning = TREE_NO_WARNING (expr);
3201   location_t loc = EXPR_LOCATION (expr);
3202 
3203   /* This should never be called for C++.  */
3204   if (c_dialect_cxx ())
3205     gcc_unreachable ();
3206 
3207   /* The result of folding may have a NOP_EXPR to set TREE_NO_WARNING.  */
3208   STRIP_TYPE_NOPS (expr);
3209   expr = build2 (C_MAYBE_CONST_EXPR, TREE_TYPE (expr), NULL, expr);
3210   C_MAYBE_CONST_EXPR_NON_CONST (expr) = non_const;
3211   if (nowarning)
3212     TREE_NO_WARNING (expr) = 1;
3213   protected_set_expr_location (expr, loc);
3214 
3215   return expr;
3216 }
3217 
3218 /* Return whether EXPR is a declaration whose address can never be
3219    NULL.  */
3220 
3221 bool
decl_with_nonnull_addr_p(const_tree expr)3222 decl_with_nonnull_addr_p (const_tree expr)
3223 {
3224   return (DECL_P (expr)
3225 	  && (TREE_CODE (expr) == PARM_DECL
3226 	      || TREE_CODE (expr) == LABEL_DECL
3227 	      || !DECL_WEAK (expr)));
3228 }
3229 
3230 /* Prepare expr to be an argument of a TRUTH_NOT_EXPR,
3231    or for an `if' or `while' statement or ?..: exp.  It should already
3232    have been validated to be of suitable type; otherwise, a bad
3233    diagnostic may result.
3234 
3235    The EXPR is located at LOCATION.
3236 
3237    This preparation consists of taking the ordinary
3238    representation of an expression expr and producing a valid tree
3239    boolean expression describing whether expr is nonzero.  We could
3240    simply always do build_binary_op (NE_EXPR, expr, truthvalue_false_node, 1),
3241    but we optimize comparisons, &&, ||, and !.
3242 
3243    The resulting type should always be `truthvalue_type_node'.  */
3244 
3245 tree
c_common_truthvalue_conversion(location_t location,tree expr)3246 c_common_truthvalue_conversion (location_t location, tree expr)
3247 {
3248   STRIP_ANY_LOCATION_WRAPPER (expr);
3249   switch (TREE_CODE (expr))
3250     {
3251     case EQ_EXPR:   case NE_EXPR:   case UNEQ_EXPR: case LTGT_EXPR:
3252     case LE_EXPR:   case GE_EXPR:   case LT_EXPR:   case GT_EXPR:
3253     case UNLE_EXPR: case UNGE_EXPR: case UNLT_EXPR: case UNGT_EXPR:
3254     case ORDERED_EXPR: case UNORDERED_EXPR:
3255       if (TREE_TYPE (expr) == truthvalue_type_node)
3256 	return expr;
3257       expr = build2 (TREE_CODE (expr), truthvalue_type_node,
3258 		     TREE_OPERAND (expr, 0), TREE_OPERAND (expr, 1));
3259       goto ret;
3260 
3261     case TRUTH_ANDIF_EXPR:
3262     case TRUTH_ORIF_EXPR:
3263     case TRUTH_AND_EXPR:
3264     case TRUTH_OR_EXPR:
3265     case TRUTH_XOR_EXPR:
3266       if (TREE_TYPE (expr) == truthvalue_type_node)
3267 	return expr;
3268       expr = build2 (TREE_CODE (expr), truthvalue_type_node,
3269 		     c_common_truthvalue_conversion (location,
3270 						     TREE_OPERAND (expr, 0)),
3271 		     c_common_truthvalue_conversion (location,
3272 						     TREE_OPERAND (expr, 1)));
3273       goto ret;
3274 
3275     case TRUTH_NOT_EXPR:
3276       if (TREE_TYPE (expr) == truthvalue_type_node)
3277 	return expr;
3278       expr = build1 (TREE_CODE (expr), truthvalue_type_node,
3279 		     c_common_truthvalue_conversion (location,
3280 						     TREE_OPERAND (expr, 0)));
3281       goto ret;
3282 
3283     case ERROR_MARK:
3284       return expr;
3285 
3286     case INTEGER_CST:
3287       if (TREE_CODE (TREE_TYPE (expr)) == ENUMERAL_TYPE
3288 	  && !integer_zerop (expr)
3289 	  && !integer_onep (expr))
3290 	warning_at (location, OPT_Wint_in_bool_context,
3291 		    "enum constant in boolean context");
3292       return integer_zerop (expr) ? truthvalue_false_node
3293 				  : truthvalue_true_node;
3294 
3295     case REAL_CST:
3296       return real_compare (NE_EXPR, &TREE_REAL_CST (expr), &dconst0)
3297 	     ? truthvalue_true_node
3298 	     : truthvalue_false_node;
3299 
3300     case FIXED_CST:
3301       return fixed_compare (NE_EXPR, &TREE_FIXED_CST (expr),
3302 			    &FCONST0 (TYPE_MODE (TREE_TYPE (expr))))
3303 	     ? truthvalue_true_node
3304 	     : truthvalue_false_node;
3305 
3306     case FUNCTION_DECL:
3307       expr = build_unary_op (location, ADDR_EXPR, expr, false);
3308       /* Fall through.  */
3309 
3310     case ADDR_EXPR:
3311       {
3312  	tree inner = TREE_OPERAND (expr, 0);
3313 	if (decl_with_nonnull_addr_p (inner))
3314 	  {
3315 	    /* Common Ada programmer's mistake.  */
3316 	    warning_at (location,
3317 			OPT_Waddress,
3318 			"the address of %qD will always evaluate as %<true%>",
3319 			inner);
3320 	    return truthvalue_true_node;
3321 	  }
3322 	break;
3323       }
3324 
3325     case COMPLEX_EXPR:
3326       expr = build_binary_op (EXPR_LOCATION (expr),
3327 			      (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1))
3328 			       ? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR),
3329 		c_common_truthvalue_conversion (location,
3330 						TREE_OPERAND (expr, 0)),
3331 		c_common_truthvalue_conversion (location,
3332 						TREE_OPERAND (expr, 1)),
3333 			      false);
3334       goto ret;
3335 
3336     case NEGATE_EXPR:
3337     case ABS_EXPR:
3338     case ABSU_EXPR:
3339     case FLOAT_EXPR:
3340     case EXCESS_PRECISION_EXPR:
3341       /* These don't change whether an object is nonzero or zero.  */
3342       return c_common_truthvalue_conversion (location, TREE_OPERAND (expr, 0));
3343 
3344     case LROTATE_EXPR:
3345     case RROTATE_EXPR:
3346       /* These don't change whether an object is zero or nonzero, but
3347 	 we can't ignore them if their second arg has side-effects.  */
3348       if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1)))
3349 	{
3350 	  expr = build2 (COMPOUND_EXPR, truthvalue_type_node,
3351 			 TREE_OPERAND (expr, 1),
3352 			 c_common_truthvalue_conversion
3353 			 (location, TREE_OPERAND (expr, 0)));
3354 	  goto ret;
3355 	}
3356       else
3357 	return c_common_truthvalue_conversion (location,
3358 					       TREE_OPERAND (expr, 0));
3359 
3360     case MULT_EXPR:
3361       warning_at (EXPR_LOCATION (expr), OPT_Wint_in_bool_context,
3362 		  "%<*%> in boolean context, suggest %<&&%> instead");
3363       break;
3364 
3365     case LSHIFT_EXPR:
3366       /* We will only warn on signed shifts here, because the majority of
3367 	 false positive warnings happen in code where unsigned arithmetic
3368 	 was used in anticipation of a possible overflow.
3369 	 Furthermore, if we see an unsigned type here we know that the
3370 	 result of the shift is not subject to integer promotion rules.  */
3371       if (TREE_CODE (TREE_TYPE (expr)) == INTEGER_TYPE
3372 	  && !TYPE_UNSIGNED (TREE_TYPE (expr)))
3373 	warning_at (EXPR_LOCATION (expr), OPT_Wint_in_bool_context,
3374 		    "%<<<%> in boolean context, did you mean %<<%>?");
3375       break;
3376 
3377     case COND_EXPR:
3378       if (warn_int_in_bool_context
3379 	  && !from_macro_definition_at (EXPR_LOCATION (expr)))
3380 	{
3381 	  tree val1 = fold_for_warn (TREE_OPERAND (expr, 1));
3382 	  tree val2 = fold_for_warn (TREE_OPERAND (expr, 2));
3383 	  if (TREE_CODE (val1) == INTEGER_CST
3384 	      && TREE_CODE (val2) == INTEGER_CST
3385 	      && !integer_zerop (val1)
3386 	      && !integer_zerop (val2)
3387 	      && (!integer_onep (val1)
3388 		  || !integer_onep (val2)))
3389 	    warning_at (EXPR_LOCATION (expr), OPT_Wint_in_bool_context,
3390 			"%<?:%> using integer constants in boolean context, "
3391 			"the expression will always evaluate to %<true%>");
3392 	  else if ((TREE_CODE (val1) == INTEGER_CST
3393 		    && !integer_zerop (val1)
3394 		    && !integer_onep (val1))
3395 		   || (TREE_CODE (val2) == INTEGER_CST
3396 		       && !integer_zerop (val2)
3397 		       && !integer_onep (val2)))
3398 	    warning_at (EXPR_LOCATION (expr), OPT_Wint_in_bool_context,
3399 			"%<?:%> using integer constants in boolean context");
3400 	}
3401       /* Distribute the conversion into the arms of a COND_EXPR.  */
3402       if (c_dialect_cxx ())
3403 	/* Avoid premature folding.  */
3404 	break;
3405       else
3406 	{
3407 	  int w = warn_int_in_bool_context;
3408 	  warn_int_in_bool_context = 0;
3409 	  /* Folding will happen later for C.  */
3410 	  expr = build3 (COND_EXPR, truthvalue_type_node,
3411 			 TREE_OPERAND (expr, 0),
3412 			 c_common_truthvalue_conversion (location,
3413 							 TREE_OPERAND (expr, 1)),
3414 			 c_common_truthvalue_conversion (location,
3415 							 TREE_OPERAND (expr, 2)));
3416 	  warn_int_in_bool_context = w;
3417 	  goto ret;
3418 	}
3419 
3420     CASE_CONVERT:
3421       {
3422 	tree totype = TREE_TYPE (expr);
3423 	tree fromtype = TREE_TYPE (TREE_OPERAND (expr, 0));
3424 
3425 	if (POINTER_TYPE_P (totype)
3426 	    && !c_inhibit_evaluation_warnings
3427 	    && TREE_CODE (fromtype) == REFERENCE_TYPE)
3428 	  {
3429 	    tree inner = expr;
3430 	    STRIP_NOPS (inner);
3431 
3432 	    if (DECL_P (inner))
3433 	      warning_at (location,
3434 			  OPT_Waddress,
3435 			  "the compiler can assume that the address of "
3436 			  "%qD will always evaluate to %<true%>",
3437 			  inner);
3438 	  }
3439 
3440 	/* Don't cancel the effect of a CONVERT_EXPR from a REFERENCE_TYPE,
3441 	   since that affects how `default_conversion' will behave.  */
3442 	if (TREE_CODE (totype) == REFERENCE_TYPE
3443 	    || TREE_CODE (fromtype) == REFERENCE_TYPE)
3444 	  break;
3445 	/* Don't strip a conversion from C++0x scoped enum, since they
3446 	   don't implicitly convert to other types.  */
3447 	if (TREE_CODE (fromtype) == ENUMERAL_TYPE
3448 	    && ENUM_IS_SCOPED (fromtype))
3449 	  break;
3450 	/* If this isn't narrowing the argument, we can ignore it.  */
3451 	if (TYPE_PRECISION (totype) >= TYPE_PRECISION (fromtype))
3452 	  return c_common_truthvalue_conversion (location,
3453 						 TREE_OPERAND (expr, 0));
3454       }
3455       break;
3456 
3457     case MODIFY_EXPR:
3458       if (!TREE_NO_WARNING (expr)
3459 	  && warn_parentheses
3460 	  && warning_at (location, OPT_Wparentheses,
3461 			 "suggest parentheses around assignment used as "
3462 			 "truth value"))
3463 	TREE_NO_WARNING (expr) = 1;
3464       break;
3465 
3466     case CONST_DECL:
3467       {
3468 	tree folded_expr = fold_for_warn (expr);
3469 	if (folded_expr != expr)
3470 	  return c_common_truthvalue_conversion (location, folded_expr);
3471       }
3472       break;
3473 
3474     default:
3475       break;
3476     }
3477 
3478   if (TREE_CODE (TREE_TYPE (expr)) == COMPLEX_TYPE)
3479     {
3480       tree t = save_expr (expr);
3481       expr = (build_binary_op
3482 	      (EXPR_LOCATION (expr),
3483 	       (TREE_SIDE_EFFECTS (expr)
3484 		? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR),
3485 	c_common_truthvalue_conversion
3486 	       (location,
3487 		build_unary_op (location, REALPART_EXPR, t, false)),
3488 	c_common_truthvalue_conversion
3489 	       (location,
3490 		build_unary_op (location, IMAGPART_EXPR, t, false)),
3491 	       false));
3492       goto ret;
3493     }
3494 
3495   if (TREE_CODE (TREE_TYPE (expr)) == FIXED_POINT_TYPE)
3496     {
3497       tree fixed_zero_node = build_fixed (TREE_TYPE (expr),
3498 					  FCONST0 (TYPE_MODE
3499 						   (TREE_TYPE (expr))));
3500       return build_binary_op (location, NE_EXPR, expr, fixed_zero_node, true);
3501     }
3502   else
3503     return build_binary_op (location, NE_EXPR, expr, integer_zero_node, true);
3504 
3505  ret:
3506   protected_set_expr_location (expr, location);
3507   return expr;
3508 }
3509 
3510 static void def_builtin_1  (enum built_in_function fncode,
3511 			    const char *name,
3512 			    enum built_in_class fnclass,
3513 			    tree fntype, tree libtype,
3514 			    bool both_p, bool fallback_p, bool nonansi_p,
3515 			    tree fnattrs, bool implicit_p);
3516 
3517 
3518 /* Apply the TYPE_QUALS to the new DECL.  */
3519 
3520 void
c_apply_type_quals_to_decl(int type_quals,tree decl)3521 c_apply_type_quals_to_decl (int type_quals, tree decl)
3522 {
3523   tree type = TREE_TYPE (decl);
3524 
3525   if (type == error_mark_node)
3526     return;
3527 
3528   if ((type_quals & TYPE_QUAL_CONST)
3529       || (type && TREE_CODE (type) == REFERENCE_TYPE))
3530     /* We used to check TYPE_NEEDS_CONSTRUCTING here, but now a constexpr
3531        constructor can produce constant init, so rely on cp_finish_decl to
3532        clear TREE_READONLY if the variable has non-constant init.  */
3533     TREE_READONLY (decl) = 1;
3534   if (type_quals & TYPE_QUAL_VOLATILE)
3535     {
3536       TREE_SIDE_EFFECTS (decl) = 1;
3537       TREE_THIS_VOLATILE (decl) = 1;
3538     }
3539   if (type_quals & TYPE_QUAL_RESTRICT)
3540     {
3541       while (type && TREE_CODE (type) == ARRAY_TYPE)
3542 	/* Allow 'restrict' on arrays of pointers.
3543 	   FIXME currently we just ignore it.  */
3544 	type = TREE_TYPE (type);
3545       if (!type
3546 	  || !POINTER_TYPE_P (type)
3547 	  || !C_TYPE_OBJECT_OR_INCOMPLETE_P (TREE_TYPE (type)))
3548 	error ("invalid use of %<restrict%>");
3549     }
3550 }
3551 
3552 /* Return the typed-based alias set for T, which may be an expression
3553    or a type.  Return -1 if we don't do anything special.  */
3554 
3555 alias_set_type
c_common_get_alias_set(tree t)3556 c_common_get_alias_set (tree t)
3557 {
3558   /* For VLAs, use the alias set of the element type rather than the
3559      default of alias set 0 for types compared structurally.  */
3560   if (TYPE_P (t) && TYPE_STRUCTURAL_EQUALITY_P (t))
3561     {
3562       if (TREE_CODE (t) == ARRAY_TYPE)
3563 	return get_alias_set (TREE_TYPE (t));
3564       return -1;
3565     }
3566 
3567   /* That's all the expressions we handle specially.  */
3568   if (!TYPE_P (t))
3569     return -1;
3570 
3571   /* Unlike char, char8_t doesn't alias. */
3572   if (flag_char8_t && t == char8_type_node)
3573     return -1;
3574 
3575   /* The C standard guarantees that any object may be accessed via an
3576      lvalue that has narrow character type (except char8_t).  */
3577   if (t == char_type_node
3578       || t == signed_char_type_node
3579       || t == unsigned_char_type_node)
3580     return 0;
3581 
3582   /* The C standard specifically allows aliasing between signed and
3583      unsigned variants of the same type.  We treat the signed
3584      variant as canonical.  */
3585   if (TREE_CODE (t) == INTEGER_TYPE && TYPE_UNSIGNED (t))
3586     {
3587       tree t1 = c_common_signed_type (t);
3588 
3589       /* t1 == t can happen for boolean nodes which are always unsigned.  */
3590       if (t1 != t)
3591 	return get_alias_set (t1);
3592     }
3593 
3594   return -1;
3595 }
3596 
3597 /* Compute the value of 'sizeof (TYPE)' or '__alignof__ (TYPE)', where
3598    the IS_SIZEOF parameter indicates which operator is being applied.
3599    The COMPLAIN flag controls whether we should diagnose possibly
3600    ill-formed constructs or not.  LOC is the location of the SIZEOF or
3601    TYPEOF operator.  If MIN_ALIGNOF, the least alignment required for
3602    a type in any context should be returned, rather than the normal
3603    alignment for that type.  */
3604 
3605 tree
c_sizeof_or_alignof_type(location_t loc,tree type,bool is_sizeof,bool min_alignof,int complain)3606 c_sizeof_or_alignof_type (location_t loc,
3607 			  tree type, bool is_sizeof, bool min_alignof,
3608 			  int complain)
3609 {
3610   const char *op_name;
3611   tree value = NULL;
3612   enum tree_code type_code = TREE_CODE (type);
3613 
3614   op_name = is_sizeof ? "sizeof" : "__alignof__";
3615 
3616   if (type_code == FUNCTION_TYPE)
3617     {
3618       if (is_sizeof)
3619 	{
3620 	  if (complain && warn_pointer_arith)
3621 	    pedwarn (loc, OPT_Wpointer_arith,
3622 		     "invalid application of %<sizeof%> to a function type");
3623           else if (!complain)
3624             return error_mark_node;
3625 	  value = size_one_node;
3626 	}
3627       else
3628 	{
3629 	  if (complain)
3630 	    {
3631 	      if (c_dialect_cxx ())
3632 		pedwarn (loc, OPT_Wpedantic, "ISO C++ does not permit "
3633 			 "%<alignof%> applied to a function type");
3634 	      else
3635 		pedwarn (loc, OPT_Wpedantic, "ISO C does not permit "
3636 			 "%<_Alignof%> applied to a function type");
3637 	    }
3638 	  value = size_int (FUNCTION_BOUNDARY / BITS_PER_UNIT);
3639 	}
3640     }
3641   else if (type_code == VOID_TYPE || type_code == ERROR_MARK)
3642     {
3643       if (type_code == VOID_TYPE
3644 	  && complain && warn_pointer_arith)
3645 	pedwarn (loc, OPT_Wpointer_arith,
3646 		 "invalid application of %qs to a void type", op_name);
3647       else if (!complain)
3648         return error_mark_node;
3649       value = size_one_node;
3650     }
3651   else if (!COMPLETE_TYPE_P (type)
3652 	   && (!c_dialect_cxx () || is_sizeof || type_code != ARRAY_TYPE))
3653     {
3654       if (complain)
3655 	error_at (loc, "invalid application of %qs to incomplete type %qT",
3656 		  op_name, type);
3657       return error_mark_node;
3658     }
3659   else if (c_dialect_cxx () && type_code == ARRAY_TYPE
3660 	   && !COMPLETE_TYPE_P (TREE_TYPE (type)))
3661     {
3662       if (complain)
3663 	error_at (loc, "invalid application of %qs to array type %qT of "
3664 		  "incomplete element type", op_name, type);
3665       return error_mark_node;
3666     }
3667   else if (!verify_type_context (loc, is_sizeof ? TCTX_SIZEOF : TCTX_ALIGNOF,
3668 				 type, !complain))
3669     {
3670       if (!complain)
3671 	return error_mark_node;
3672       value = size_one_node;
3673     }
3674   else
3675     {
3676       if (is_sizeof)
3677 	/* Convert in case a char is more than one unit.  */
3678 	value = size_binop_loc (loc, CEIL_DIV_EXPR, TYPE_SIZE_UNIT (type),
3679 				size_int (TYPE_PRECISION (char_type_node)
3680 					  / BITS_PER_UNIT));
3681       else if (min_alignof)
3682 	value = size_int (min_align_of_type (type));
3683       else
3684 	value = size_int (TYPE_ALIGN_UNIT (type));
3685     }
3686 
3687   /* VALUE will have the middle-end integer type sizetype.
3688      However, we should really return a value of type `size_t',
3689      which is just a typedef for an ordinary integer type.  */
3690   value = fold_convert_loc (loc, size_type_node, value);
3691 
3692   return value;
3693 }
3694 
3695 /* Implement the __alignof keyword: Return the minimum required
3696    alignment of EXPR, measured in bytes.  For VAR_DECLs,
3697    FUNCTION_DECLs and FIELD_DECLs return DECL_ALIGN (which can be set
3698    from an "aligned" __attribute__ specification).  LOC is the
3699    location of the ALIGNOF operator.  */
3700 
3701 tree
c_alignof_expr(location_t loc,tree expr)3702 c_alignof_expr (location_t loc, tree expr)
3703 {
3704   tree t;
3705 
3706   if (!verify_type_context (loc, TCTX_ALIGNOF, TREE_TYPE (expr)))
3707     t = size_one_node;
3708 
3709   else if (VAR_OR_FUNCTION_DECL_P (expr))
3710     t = size_int (DECL_ALIGN_UNIT (expr));
3711 
3712   else if (TREE_CODE (expr) == COMPONENT_REF
3713 	   && DECL_C_BIT_FIELD (TREE_OPERAND (expr, 1)))
3714     {
3715       error_at (loc, "%<__alignof%> applied to a bit-field");
3716       t = size_one_node;
3717     }
3718   else if (TREE_CODE (expr) == COMPONENT_REF
3719 	   && TREE_CODE (TREE_OPERAND (expr, 1)) == FIELD_DECL)
3720     t = size_int (DECL_ALIGN_UNIT (TREE_OPERAND (expr, 1)));
3721 
3722   else if (INDIRECT_REF_P (expr))
3723     {
3724       tree t = TREE_OPERAND (expr, 0);
3725       tree best = t;
3726       int bestalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t)));
3727 
3728       while (CONVERT_EXPR_P (t)
3729 	     && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == POINTER_TYPE)
3730 	{
3731 	  int thisalign;
3732 
3733 	  t = TREE_OPERAND (t, 0);
3734 	  thisalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t)));
3735 	  if (thisalign > bestalign)
3736 	    best = t, bestalign = thisalign;
3737 	}
3738       return c_alignof (loc, TREE_TYPE (TREE_TYPE (best)));
3739     }
3740   else
3741     return c_alignof (loc, TREE_TYPE (expr));
3742 
3743   return fold_convert_loc (loc, size_type_node, t);
3744 }
3745 
3746 /* Handle C and C++ default attributes.  */
3747 
3748 enum built_in_attribute
3749 {
3750 #define DEF_ATTR_NULL_TREE(ENUM) ENUM,
3751 #define DEF_ATTR_INT(ENUM, VALUE) ENUM,
3752 #define DEF_ATTR_STRING(ENUM, VALUE) ENUM,
3753 #define DEF_ATTR_IDENT(ENUM, STRING) ENUM,
3754 #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) ENUM,
3755 #include "builtin-attrs.def"
3756 #undef DEF_ATTR_NULL_TREE
3757 #undef DEF_ATTR_INT
3758 #undef DEF_ATTR_STRING
3759 #undef DEF_ATTR_IDENT
3760 #undef DEF_ATTR_TREE_LIST
3761   ATTR_LAST
3762 };
3763 
3764 static GTY(()) tree built_in_attributes[(int) ATTR_LAST];
3765 
3766 static void c_init_attributes (void);
3767 
3768 enum c_builtin_type
3769 {
3770 #define DEF_PRIMITIVE_TYPE(NAME, VALUE) NAME,
3771 #define DEF_FUNCTION_TYPE_0(NAME, RETURN) NAME,
3772 #define DEF_FUNCTION_TYPE_1(NAME, RETURN, ARG1) NAME,
3773 #define DEF_FUNCTION_TYPE_2(NAME, RETURN, ARG1, ARG2) NAME,
3774 #define DEF_FUNCTION_TYPE_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME,
3775 #define DEF_FUNCTION_TYPE_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME,
3776 #define DEF_FUNCTION_TYPE_5(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) NAME,
3777 #define DEF_FUNCTION_TYPE_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
3778 			    ARG6) NAME,
3779 #define DEF_FUNCTION_TYPE_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
3780 			    ARG6, ARG7) NAME,
3781 #define DEF_FUNCTION_TYPE_8(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
3782 			    ARG6, ARG7, ARG8) NAME,
3783 #define DEF_FUNCTION_TYPE_9(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
3784 			    ARG6, ARG7, ARG8, ARG9) NAME,
3785 #define DEF_FUNCTION_TYPE_10(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
3786 			     ARG6, ARG7, ARG8, ARG9, ARG10) NAME,
3787 #define DEF_FUNCTION_TYPE_11(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
3788 			     ARG6, ARG7, ARG8, ARG9, ARG10, ARG11) NAME,
3789 #define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME,
3790 #define DEF_FUNCTION_TYPE_VAR_1(NAME, RETURN, ARG1) NAME,
3791 #define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME,
3792 #define DEF_FUNCTION_TYPE_VAR_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME,
3793 #define DEF_FUNCTION_TYPE_VAR_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME,
3794 #define DEF_FUNCTION_TYPE_VAR_5(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) \
3795 				NAME,
3796 #define DEF_FUNCTION_TYPE_VAR_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
3797 				ARG6) NAME,
3798 #define DEF_FUNCTION_TYPE_VAR_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
3799 				ARG6, ARG7) NAME,
3800 #define DEF_POINTER_TYPE(NAME, TYPE) NAME,
3801 #include "builtin-types.def"
3802 #undef DEF_PRIMITIVE_TYPE
3803 #undef DEF_FUNCTION_TYPE_0
3804 #undef DEF_FUNCTION_TYPE_1
3805 #undef DEF_FUNCTION_TYPE_2
3806 #undef DEF_FUNCTION_TYPE_3
3807 #undef DEF_FUNCTION_TYPE_4
3808 #undef DEF_FUNCTION_TYPE_5
3809 #undef DEF_FUNCTION_TYPE_6
3810 #undef DEF_FUNCTION_TYPE_7
3811 #undef DEF_FUNCTION_TYPE_8
3812 #undef DEF_FUNCTION_TYPE_9
3813 #undef DEF_FUNCTION_TYPE_10
3814 #undef DEF_FUNCTION_TYPE_11
3815 #undef DEF_FUNCTION_TYPE_VAR_0
3816 #undef DEF_FUNCTION_TYPE_VAR_1
3817 #undef DEF_FUNCTION_TYPE_VAR_2
3818 #undef DEF_FUNCTION_TYPE_VAR_3
3819 #undef DEF_FUNCTION_TYPE_VAR_4
3820 #undef DEF_FUNCTION_TYPE_VAR_5
3821 #undef DEF_FUNCTION_TYPE_VAR_6
3822 #undef DEF_FUNCTION_TYPE_VAR_7
3823 #undef DEF_POINTER_TYPE
3824   BT_LAST
3825 };
3826 
3827 typedef enum c_builtin_type builtin_type;
3828 
3829 /* A temporary array for c_common_nodes_and_builtins.  Used in
3830    communication with def_fn_type.  */
3831 static tree builtin_types[(int) BT_LAST + 1];
3832 
3833 /* A helper function for c_common_nodes_and_builtins.  Build function type
3834    for DEF with return type RET and N arguments.  If VAR is true, then the
3835    function should be variadic after those N arguments.
3836 
3837    Takes special care not to ICE if any of the types involved are
3838    error_mark_node, which indicates that said type is not in fact available
3839    (see builtin_type_for_size).  In which case the function type as a whole
3840    should be error_mark_node.  */
3841 
3842 static void
def_fn_type(builtin_type def,builtin_type ret,bool var,int n,...)3843 def_fn_type (builtin_type def, builtin_type ret, bool var, int n, ...)
3844 {
3845   tree t;
3846   tree *args = XALLOCAVEC (tree, n);
3847   va_list list;
3848   int i;
3849 
3850   va_start (list, n);
3851   for (i = 0; i < n; ++i)
3852     {
3853       builtin_type a = (builtin_type) va_arg (list, int);
3854       t = builtin_types[a];
3855       if (t == error_mark_node)
3856 	goto egress;
3857       args[i] = t;
3858     }
3859 
3860   t = builtin_types[ret];
3861   if (t == error_mark_node)
3862     goto egress;
3863   if (var)
3864     t = build_varargs_function_type_array (t, n, args);
3865   else
3866     t = build_function_type_array (t, n, args);
3867 
3868  egress:
3869   builtin_types[def] = t;
3870   va_end (list);
3871 }
3872 
3873 /* Build builtin functions common to both C and C++ language
3874    frontends.  */
3875 
3876 static void
c_define_builtins(tree va_list_ref_type_node,tree va_list_arg_type_node)3877 c_define_builtins (tree va_list_ref_type_node, tree va_list_arg_type_node)
3878 {
3879 #define DEF_PRIMITIVE_TYPE(ENUM, VALUE) \
3880   builtin_types[ENUM] = VALUE;
3881 #define DEF_FUNCTION_TYPE_0(ENUM, RETURN) \
3882   def_fn_type (ENUM, RETURN, 0, 0);
3883 #define DEF_FUNCTION_TYPE_1(ENUM, RETURN, ARG1) \
3884   def_fn_type (ENUM, RETURN, 0, 1, ARG1);
3885 #define DEF_FUNCTION_TYPE_2(ENUM, RETURN, ARG1, ARG2) \
3886   def_fn_type (ENUM, RETURN, 0, 2, ARG1, ARG2);
3887 #define DEF_FUNCTION_TYPE_3(ENUM, RETURN, ARG1, ARG2, ARG3) \
3888   def_fn_type (ENUM, RETURN, 0, 3, ARG1, ARG2, ARG3);
3889 #define DEF_FUNCTION_TYPE_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4) \
3890   def_fn_type (ENUM, RETURN, 0, 4, ARG1, ARG2, ARG3, ARG4);
3891 #define DEF_FUNCTION_TYPE_5(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5)	\
3892   def_fn_type (ENUM, RETURN, 0, 5, ARG1, ARG2, ARG3, ARG4, ARG5);
3893 #define DEF_FUNCTION_TYPE_6(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
3894 			    ARG6)					\
3895   def_fn_type (ENUM, RETURN, 0, 6, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
3896 #define DEF_FUNCTION_TYPE_7(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
3897 			    ARG6, ARG7)					\
3898   def_fn_type (ENUM, RETURN, 0, 7, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7);
3899 #define DEF_FUNCTION_TYPE_8(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
3900 			    ARG6, ARG7, ARG8)				\
3901   def_fn_type (ENUM, RETURN, 0, 8, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6,	\
3902 	       ARG7, ARG8);
3903 #define DEF_FUNCTION_TYPE_9(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
3904 			    ARG6, ARG7, ARG8, ARG9)			\
3905   def_fn_type (ENUM, RETURN, 0, 9, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6,	\
3906 	       ARG7, ARG8, ARG9);
3907 #define DEF_FUNCTION_TYPE_10(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
3908 			     ARG6, ARG7, ARG8, ARG9, ARG10)		 \
3909   def_fn_type (ENUM, RETURN, 0, 10, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6,	 \
3910 	       ARG7, ARG8, ARG9, ARG10);
3911 #define DEF_FUNCTION_TYPE_11(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
3912 			     ARG6, ARG7, ARG8, ARG9, ARG10, ARG11)	 \
3913   def_fn_type (ENUM, RETURN, 0, 11, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6,	 \
3914 	       ARG7, ARG8, ARG9, ARG10, ARG11);
3915 #define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN) \
3916   def_fn_type (ENUM, RETURN, 1, 0);
3917 #define DEF_FUNCTION_TYPE_VAR_1(ENUM, RETURN, ARG1) \
3918   def_fn_type (ENUM, RETURN, 1, 1, ARG1);
3919 #define DEF_FUNCTION_TYPE_VAR_2(ENUM, RETURN, ARG1, ARG2) \
3920   def_fn_type (ENUM, RETURN, 1, 2, ARG1, ARG2);
3921 #define DEF_FUNCTION_TYPE_VAR_3(ENUM, RETURN, ARG1, ARG2, ARG3) \
3922   def_fn_type (ENUM, RETURN, 1, 3, ARG1, ARG2, ARG3);
3923 #define DEF_FUNCTION_TYPE_VAR_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4) \
3924   def_fn_type (ENUM, RETURN, 1, 4, ARG1, ARG2, ARG3, ARG4);
3925 #define DEF_FUNCTION_TYPE_VAR_5(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) \
3926   def_fn_type (ENUM, RETURN, 1, 5, ARG1, ARG2, ARG3, ARG4, ARG5);
3927 #define DEF_FUNCTION_TYPE_VAR_6(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
3928 				ARG6) \
3929   def_fn_type (ENUM, RETURN, 1, 6, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
3930 #define DEF_FUNCTION_TYPE_VAR_7(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
3931 				ARG6, ARG7)				\
3932   def_fn_type (ENUM, RETURN, 1, 7, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7);
3933 #define DEF_POINTER_TYPE(ENUM, TYPE) \
3934   builtin_types[(int) ENUM] = build_pointer_type (builtin_types[(int) TYPE]);
3935 
3936 #include "builtin-types.def"
3937 
3938 #undef DEF_PRIMITIVE_TYPE
3939 #undef DEF_FUNCTION_TYPE_0
3940 #undef DEF_FUNCTION_TYPE_1
3941 #undef DEF_FUNCTION_TYPE_2
3942 #undef DEF_FUNCTION_TYPE_3
3943 #undef DEF_FUNCTION_TYPE_4
3944 #undef DEF_FUNCTION_TYPE_5
3945 #undef DEF_FUNCTION_TYPE_6
3946 #undef DEF_FUNCTION_TYPE_7
3947 #undef DEF_FUNCTION_TYPE_8
3948 #undef DEF_FUNCTION_TYPE_9
3949 #undef DEF_FUNCTION_TYPE_10
3950 #undef DEF_FUNCTION_TYPE_11
3951 #undef DEF_FUNCTION_TYPE_VAR_0
3952 #undef DEF_FUNCTION_TYPE_VAR_1
3953 #undef DEF_FUNCTION_TYPE_VAR_2
3954 #undef DEF_FUNCTION_TYPE_VAR_3
3955 #undef DEF_FUNCTION_TYPE_VAR_4
3956 #undef DEF_FUNCTION_TYPE_VAR_5
3957 #undef DEF_FUNCTION_TYPE_VAR_6
3958 #undef DEF_FUNCTION_TYPE_VAR_7
3959 #undef DEF_POINTER_TYPE
3960   builtin_types[(int) BT_LAST] = NULL_TREE;
3961 
3962   c_init_attributes ();
3963 
3964 #define DEF_BUILTIN(ENUM, NAME, CLASS, TYPE, LIBTYPE, BOTH_P, FALLBACK_P, \
3965 		    NONANSI_P, ATTRS, IMPLICIT, COND)			\
3966   if (NAME && COND)							\
3967     def_builtin_1 (ENUM, NAME, CLASS,                                   \
3968 		   builtin_types[(int) TYPE],                           \
3969 		   builtin_types[(int) LIBTYPE],                        \
3970 		   BOTH_P, FALLBACK_P, NONANSI_P,                       \
3971 		   built_in_attributes[(int) ATTRS], IMPLICIT);
3972 #include "builtins.def"
3973 
3974   targetm.init_builtins ();
3975 
3976   build_common_builtin_nodes ();
3977 }
3978 
3979 /* Like get_identifier, but avoid warnings about null arguments when
3980    the argument may be NULL for targets where GCC lacks stdint.h type
3981    information.  */
3982 
3983 static inline tree
c_get_ident(const char * id)3984 c_get_ident (const char *id)
3985 {
3986   return get_identifier (id);
3987 }
3988 
3989 /* Build tree nodes and builtin functions common to both C and C++ language
3990    frontends.  */
3991 
3992 void
c_common_nodes_and_builtins(void)3993 c_common_nodes_and_builtins (void)
3994 {
3995   int char8_type_size;
3996   int char16_type_size;
3997   int char32_type_size;
3998   int wchar_type_size;
3999   tree array_domain_type;
4000   tree va_list_ref_type_node;
4001   tree va_list_arg_type_node;
4002   int i;
4003 
4004   build_common_tree_nodes (flag_signed_char);
4005 
4006   /* Define `int' and `char' first so that dbx will output them first.  */
4007   record_builtin_type (RID_INT, NULL, integer_type_node);
4008   record_builtin_type (RID_CHAR, "char", char_type_node);
4009 
4010   /* `signed' is the same as `int'.  FIXME: the declarations of "signed",
4011      "unsigned long", "long long unsigned" and "unsigned short" were in C++
4012      but not C.  Are the conditionals here needed?  */
4013   if (c_dialect_cxx ())
4014     record_builtin_type (RID_SIGNED, NULL, integer_type_node);
4015   record_builtin_type (RID_LONG, "long int", long_integer_type_node);
4016   record_builtin_type (RID_UNSIGNED, "unsigned int", unsigned_type_node);
4017   record_builtin_type (RID_MAX, "long unsigned int",
4018 		       long_unsigned_type_node);
4019 
4020   for (i = 0; i < NUM_INT_N_ENTS; i ++)
4021     {
4022       char name[25];
4023 
4024       sprintf (name, "__int%d", int_n_data[i].bitsize);
4025       record_builtin_type ((enum rid)(RID_FIRST_INT_N + i), name,
4026 			   int_n_trees[i].signed_type);
4027       sprintf (name, "__int%d__", int_n_data[i].bitsize);
4028       record_builtin_type ((enum rid)(RID_FIRST_INT_N + i), name,
4029 			   int_n_trees[i].signed_type);
4030 
4031       sprintf (name, "__int%d unsigned", int_n_data[i].bitsize);
4032       record_builtin_type (RID_MAX, name, int_n_trees[i].unsigned_type);
4033       sprintf (name, "__int%d__ unsigned", int_n_data[i].bitsize);
4034       record_builtin_type (RID_MAX, name, int_n_trees[i].unsigned_type);
4035     }
4036 
4037   if (c_dialect_cxx ())
4038     record_builtin_type (RID_MAX, "unsigned long", long_unsigned_type_node);
4039   record_builtin_type (RID_MAX, "long long int",
4040 		       long_long_integer_type_node);
4041   record_builtin_type (RID_MAX, "long long unsigned int",
4042 		       long_long_unsigned_type_node);
4043   if (c_dialect_cxx ())
4044     record_builtin_type (RID_MAX, "long long unsigned",
4045 			 long_long_unsigned_type_node);
4046   record_builtin_type (RID_SHORT, "short int", short_integer_type_node);
4047   record_builtin_type (RID_MAX, "short unsigned int",
4048 		       short_unsigned_type_node);
4049   if (c_dialect_cxx ())
4050     record_builtin_type (RID_MAX, "unsigned short",
4051 			 short_unsigned_type_node);
4052 
4053   /* Define both `signed char' and `unsigned char'.  */
4054   record_builtin_type (RID_MAX, "signed char", signed_char_type_node);
4055   record_builtin_type (RID_MAX, "unsigned char", unsigned_char_type_node);
4056 
4057   /* These are types that c_common_type_for_size and
4058      c_common_type_for_mode use.  */
4059   lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4060 					 TYPE_DECL, NULL_TREE,
4061 					 intQI_type_node));
4062   lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4063 					 TYPE_DECL, NULL_TREE,
4064 					 intHI_type_node));
4065   lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4066 					 TYPE_DECL, NULL_TREE,
4067 					 intSI_type_node));
4068   lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4069 					 TYPE_DECL, NULL_TREE,
4070 					 intDI_type_node));
4071 #if HOST_BITS_PER_WIDE_INT >= 64
4072   /* Note that this is different than the __int128 type that's part of
4073      the generic __intN support.  */
4074   if (targetm.scalar_mode_supported_p (TImode))
4075     lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4076 					   TYPE_DECL,
4077 					   get_identifier ("__int128_t"),
4078 					   intTI_type_node));
4079 #endif
4080   lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4081 					 TYPE_DECL, NULL_TREE,
4082 					 unsigned_intQI_type_node));
4083   lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4084 					 TYPE_DECL, NULL_TREE,
4085 					 unsigned_intHI_type_node));
4086   lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4087 					 TYPE_DECL, NULL_TREE,
4088 					 unsigned_intSI_type_node));
4089   lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4090 					 TYPE_DECL, NULL_TREE,
4091 					 unsigned_intDI_type_node));
4092 #if HOST_BITS_PER_WIDE_INT >= 64
4093   if (targetm.scalar_mode_supported_p (TImode))
4094     lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4095 					   TYPE_DECL,
4096 					   get_identifier ("__uint128_t"),
4097 					   unsigned_intTI_type_node));
4098 #endif
4099 
4100   /* Create the widest literal types.  */
4101   if (targetm.scalar_mode_supported_p (TImode))
4102     {
4103       widest_integer_literal_type_node = intTI_type_node;
4104       widest_unsigned_literal_type_node = unsigned_intTI_type_node;
4105     }
4106   else
4107     {
4108       widest_integer_literal_type_node = intDI_type_node;
4109       widest_unsigned_literal_type_node = unsigned_intDI_type_node;
4110     }
4111 
4112   signed_size_type_node = c_common_signed_type (size_type_node);
4113 
4114   pid_type_node =
4115     TREE_TYPE (identifier_global_value (get_identifier (PID_TYPE)));
4116 
4117   record_builtin_type (RID_FLOAT, NULL, float_type_node);
4118   record_builtin_type (RID_DOUBLE, NULL, double_type_node);
4119   record_builtin_type (RID_MAX, "long double", long_double_type_node);
4120 
4121   if (!c_dialect_cxx ())
4122     for (i = 0; i < NUM_FLOATN_NX_TYPES; i++)
4123       if (FLOATN_NX_TYPE_NODE (i) != NULL_TREE)
4124 	record_builtin_type ((enum rid) (RID_FLOATN_NX_FIRST + i), NULL,
4125 			     FLOATN_NX_TYPE_NODE (i));
4126 
4127   /* Only supported decimal floating point extension if the target
4128      actually supports underlying modes. */
4129   if (targetm.scalar_mode_supported_p (SDmode)
4130       && targetm.scalar_mode_supported_p (DDmode)
4131       && targetm.scalar_mode_supported_p (TDmode))
4132     {
4133       record_builtin_type (RID_DFLOAT32, NULL, dfloat32_type_node);
4134       record_builtin_type (RID_DFLOAT64, NULL, dfloat64_type_node);
4135       record_builtin_type (RID_DFLOAT128, NULL, dfloat128_type_node);
4136     }
4137 
4138   if (targetm.fixed_point_supported_p ())
4139     {
4140       record_builtin_type (RID_MAX, "short _Fract", short_fract_type_node);
4141       record_builtin_type (RID_FRACT, NULL, fract_type_node);
4142       record_builtin_type (RID_MAX, "long _Fract", long_fract_type_node);
4143       record_builtin_type (RID_MAX, "long long _Fract",
4144 			   long_long_fract_type_node);
4145       record_builtin_type (RID_MAX, "unsigned short _Fract",
4146 			   unsigned_short_fract_type_node);
4147       record_builtin_type (RID_MAX, "unsigned _Fract",
4148 			   unsigned_fract_type_node);
4149       record_builtin_type (RID_MAX, "unsigned long _Fract",
4150 			   unsigned_long_fract_type_node);
4151       record_builtin_type (RID_MAX, "unsigned long long _Fract",
4152 			   unsigned_long_long_fract_type_node);
4153       record_builtin_type (RID_MAX, "_Sat short _Fract",
4154 			   sat_short_fract_type_node);
4155       record_builtin_type (RID_MAX, "_Sat _Fract", sat_fract_type_node);
4156       record_builtin_type (RID_MAX, "_Sat long _Fract",
4157 			   sat_long_fract_type_node);
4158       record_builtin_type (RID_MAX, "_Sat long long _Fract",
4159 			   sat_long_long_fract_type_node);
4160       record_builtin_type (RID_MAX, "_Sat unsigned short _Fract",
4161 			   sat_unsigned_short_fract_type_node);
4162       record_builtin_type (RID_MAX, "_Sat unsigned _Fract",
4163 			   sat_unsigned_fract_type_node);
4164       record_builtin_type (RID_MAX, "_Sat unsigned long _Fract",
4165 			   sat_unsigned_long_fract_type_node);
4166       record_builtin_type (RID_MAX, "_Sat unsigned long long _Fract",
4167 			   sat_unsigned_long_long_fract_type_node);
4168       record_builtin_type (RID_MAX, "short _Accum", short_accum_type_node);
4169       record_builtin_type (RID_ACCUM, NULL, accum_type_node);
4170       record_builtin_type (RID_MAX, "long _Accum", long_accum_type_node);
4171       record_builtin_type (RID_MAX, "long long _Accum",
4172 			   long_long_accum_type_node);
4173       record_builtin_type (RID_MAX, "unsigned short _Accum",
4174 			   unsigned_short_accum_type_node);
4175       record_builtin_type (RID_MAX, "unsigned _Accum",
4176 			   unsigned_accum_type_node);
4177       record_builtin_type (RID_MAX, "unsigned long _Accum",
4178 			   unsigned_long_accum_type_node);
4179       record_builtin_type (RID_MAX, "unsigned long long _Accum",
4180 			   unsigned_long_long_accum_type_node);
4181       record_builtin_type (RID_MAX, "_Sat short _Accum",
4182 			   sat_short_accum_type_node);
4183       record_builtin_type (RID_MAX, "_Sat _Accum", sat_accum_type_node);
4184       record_builtin_type (RID_MAX, "_Sat long _Accum",
4185 			   sat_long_accum_type_node);
4186       record_builtin_type (RID_MAX, "_Sat long long _Accum",
4187 			  sat_long_long_accum_type_node);
4188       record_builtin_type (RID_MAX, "_Sat unsigned short _Accum",
4189 			   sat_unsigned_short_accum_type_node);
4190       record_builtin_type (RID_MAX, "_Sat unsigned _Accum",
4191 			   sat_unsigned_accum_type_node);
4192       record_builtin_type (RID_MAX, "_Sat unsigned long _Accum",
4193 			   sat_unsigned_long_accum_type_node);
4194       record_builtin_type (RID_MAX, "_Sat unsigned long long _Accum",
4195 			   sat_unsigned_long_long_accum_type_node);
4196 
4197     }
4198 
4199   lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4200 					 TYPE_DECL,
4201 					 get_identifier ("complex int"),
4202 					 complex_integer_type_node));
4203   lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4204 					 TYPE_DECL,
4205 					 get_identifier ("complex float"),
4206 					 complex_float_type_node));
4207   lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4208 					 TYPE_DECL,
4209 					 get_identifier ("complex double"),
4210 					 complex_double_type_node));
4211   lang_hooks.decls.pushdecl
4212     (build_decl (UNKNOWN_LOCATION,
4213 		 TYPE_DECL, get_identifier ("complex long double"),
4214 		 complex_long_double_type_node));
4215 
4216   if (!c_dialect_cxx ())
4217     for (i = 0; i < NUM_FLOATN_NX_TYPES; i++)
4218       if (COMPLEX_FLOATN_NX_TYPE_NODE (i) != NULL_TREE)
4219 	{
4220 	  char buf[30];
4221 	  sprintf (buf, "complex _Float%d%s", floatn_nx_types[i].n,
4222 		   floatn_nx_types[i].extended ? "x" : "");
4223 	  lang_hooks.decls.pushdecl
4224 	    (build_decl (UNKNOWN_LOCATION,
4225 			 TYPE_DECL,
4226 			 get_identifier (buf),
4227 			 COMPLEX_FLOATN_NX_TYPE_NODE (i)));
4228 	}
4229 
4230   /* Make fileptr_type_node a distinct void * type until
4231      FILE type is defined.  Likewise for const struct tm*.  */
4232   for (unsigned i = 0;
4233        i < sizeof (builtin_structptr_types) / sizeof (builtin_structptr_type);
4234        ++i)
4235     builtin_structptr_types[i].node
4236       = build_variant_type_copy (builtin_structptr_types[i].base);
4237 
4238   record_builtin_type (RID_VOID, NULL, void_type_node);
4239 
4240   /* Set the TYPE_NAME for any variants that were built before
4241      record_builtin_type gave names to the built-in types. */
4242   {
4243     tree void_name = TYPE_NAME (void_type_node);
4244     TYPE_NAME (void_type_node) = NULL_TREE;
4245     TYPE_NAME (build_qualified_type (void_type_node, TYPE_QUAL_CONST))
4246       = void_name;
4247     TYPE_NAME (void_type_node) = void_name;
4248   }
4249 
4250   void_list_node = build_void_list_node ();
4251 
4252   /* Make a type to be the domain of a few array types
4253      whose domains don't really matter.
4254      200 is small enough that it always fits in size_t
4255      and large enough that it can hold most function names for the
4256      initializations of __FUNCTION__ and __PRETTY_FUNCTION__.  */
4257   array_domain_type = build_index_type (size_int (200));
4258 
4259   /* Make a type for arrays of characters.
4260      With luck nothing will ever really depend on the length of this
4261      array type.  */
4262   char_array_type_node
4263     = build_array_type (char_type_node, array_domain_type);
4264 
4265   string_type_node = build_pointer_type (char_type_node);
4266   const_string_type_node
4267     = build_pointer_type (build_qualified_type
4268 			  (char_type_node, TYPE_QUAL_CONST));
4269 
4270   /* This is special for C++ so functions can be overloaded.  */
4271   wchar_type_node = get_identifier (MODIFIED_WCHAR_TYPE);
4272   wchar_type_node = TREE_TYPE (identifier_global_value (wchar_type_node));
4273   wchar_type_size = TYPE_PRECISION (wchar_type_node);
4274   underlying_wchar_type_node = wchar_type_node;
4275   if (c_dialect_cxx ())
4276     {
4277       if (TYPE_UNSIGNED (wchar_type_node))
4278 	wchar_type_node = make_unsigned_type (wchar_type_size);
4279       else
4280 	wchar_type_node = make_signed_type (wchar_type_size);
4281       record_builtin_type (RID_WCHAR, "wchar_t", wchar_type_node);
4282     }
4283 
4284   /* This is for wide string constants.  */
4285   wchar_array_type_node
4286     = build_array_type (wchar_type_node, array_domain_type);
4287 
4288   /* Define 'char8_t'.  */
4289   char8_type_node = get_identifier (CHAR8_TYPE);
4290   char8_type_node = TREE_TYPE (identifier_global_value (char8_type_node));
4291   char8_type_size = TYPE_PRECISION (char8_type_node);
4292   if (c_dialect_cxx ())
4293     {
4294       char8_type_node = make_unsigned_type (char8_type_size);
4295 
4296       if (flag_char8_t)
4297         record_builtin_type (RID_CHAR8, "char8_t", char8_type_node);
4298     }
4299 
4300   /* This is for UTF-8 string constants.  */
4301   char8_array_type_node
4302     = build_array_type (char8_type_node, array_domain_type);
4303 
4304   /* Define 'char16_t'.  */
4305   char16_type_node = get_identifier (CHAR16_TYPE);
4306   char16_type_node = TREE_TYPE (identifier_global_value (char16_type_node));
4307   char16_type_size = TYPE_PRECISION (char16_type_node);
4308   if (c_dialect_cxx ())
4309     {
4310       char16_type_node = make_unsigned_type (char16_type_size);
4311 
4312       if (cxx_dialect >= cxx11)
4313 	record_builtin_type (RID_CHAR16, "char16_t", char16_type_node);
4314     }
4315 
4316   /* This is for UTF-16 string constants.  */
4317   char16_array_type_node
4318     = build_array_type (char16_type_node, array_domain_type);
4319 
4320   /* Define 'char32_t'.  */
4321   char32_type_node = get_identifier (CHAR32_TYPE);
4322   char32_type_node = TREE_TYPE (identifier_global_value (char32_type_node));
4323   char32_type_size = TYPE_PRECISION (char32_type_node);
4324   if (c_dialect_cxx ())
4325     {
4326       char32_type_node = make_unsigned_type (char32_type_size);
4327 
4328       if (cxx_dialect >= cxx11)
4329 	record_builtin_type (RID_CHAR32, "char32_t", char32_type_node);
4330     }
4331 
4332   /* This is for UTF-32 string constants.  */
4333   char32_array_type_node
4334     = build_array_type (char32_type_node, array_domain_type);
4335 
4336   wint_type_node =
4337     TREE_TYPE (identifier_global_value (get_identifier (WINT_TYPE)));
4338 
4339   intmax_type_node =
4340     TREE_TYPE (identifier_global_value (get_identifier (INTMAX_TYPE)));
4341   uintmax_type_node =
4342     TREE_TYPE (identifier_global_value (get_identifier (UINTMAX_TYPE)));
4343 
4344   if (SIG_ATOMIC_TYPE)
4345     sig_atomic_type_node =
4346       TREE_TYPE (identifier_global_value (c_get_ident (SIG_ATOMIC_TYPE)));
4347   if (INT8_TYPE)
4348     int8_type_node =
4349       TREE_TYPE (identifier_global_value (c_get_ident (INT8_TYPE)));
4350   if (INT16_TYPE)
4351     int16_type_node =
4352       TREE_TYPE (identifier_global_value (c_get_ident (INT16_TYPE)));
4353   if (INT32_TYPE)
4354     int32_type_node =
4355       TREE_TYPE (identifier_global_value (c_get_ident (INT32_TYPE)));
4356   if (INT64_TYPE)
4357     int64_type_node =
4358       TREE_TYPE (identifier_global_value (c_get_ident (INT64_TYPE)));
4359   if (UINT8_TYPE)
4360     uint8_type_node =
4361       TREE_TYPE (identifier_global_value (c_get_ident (UINT8_TYPE)));
4362   if (UINT16_TYPE)
4363     c_uint16_type_node = uint16_type_node =
4364       TREE_TYPE (identifier_global_value (c_get_ident (UINT16_TYPE)));
4365   if (UINT32_TYPE)
4366     c_uint32_type_node = uint32_type_node =
4367       TREE_TYPE (identifier_global_value (c_get_ident (UINT32_TYPE)));
4368   if (UINT64_TYPE)
4369     c_uint64_type_node = uint64_type_node =
4370       TREE_TYPE (identifier_global_value (c_get_ident (UINT64_TYPE)));
4371   if (INT_LEAST8_TYPE)
4372     int_least8_type_node =
4373       TREE_TYPE (identifier_global_value (c_get_ident (INT_LEAST8_TYPE)));
4374   if (INT_LEAST16_TYPE)
4375     int_least16_type_node =
4376       TREE_TYPE (identifier_global_value (c_get_ident (INT_LEAST16_TYPE)));
4377   if (INT_LEAST32_TYPE)
4378     int_least32_type_node =
4379       TREE_TYPE (identifier_global_value (c_get_ident (INT_LEAST32_TYPE)));
4380   if (INT_LEAST64_TYPE)
4381     int_least64_type_node =
4382       TREE_TYPE (identifier_global_value (c_get_ident (INT_LEAST64_TYPE)));
4383   if (UINT_LEAST8_TYPE)
4384     uint_least8_type_node =
4385       TREE_TYPE (identifier_global_value (c_get_ident (UINT_LEAST8_TYPE)));
4386   if (UINT_LEAST16_TYPE)
4387     uint_least16_type_node =
4388       TREE_TYPE (identifier_global_value (c_get_ident (UINT_LEAST16_TYPE)));
4389   if (UINT_LEAST32_TYPE)
4390     uint_least32_type_node =
4391       TREE_TYPE (identifier_global_value (c_get_ident (UINT_LEAST32_TYPE)));
4392   if (UINT_LEAST64_TYPE)
4393     uint_least64_type_node =
4394       TREE_TYPE (identifier_global_value (c_get_ident (UINT_LEAST64_TYPE)));
4395   if (INT_FAST8_TYPE)
4396     int_fast8_type_node =
4397       TREE_TYPE (identifier_global_value (c_get_ident (INT_FAST8_TYPE)));
4398   if (INT_FAST16_TYPE)
4399     int_fast16_type_node =
4400       TREE_TYPE (identifier_global_value (c_get_ident (INT_FAST16_TYPE)));
4401   if (INT_FAST32_TYPE)
4402     int_fast32_type_node =
4403       TREE_TYPE (identifier_global_value (c_get_ident (INT_FAST32_TYPE)));
4404   if (INT_FAST64_TYPE)
4405     int_fast64_type_node =
4406       TREE_TYPE (identifier_global_value (c_get_ident (INT_FAST64_TYPE)));
4407   if (UINT_FAST8_TYPE)
4408     uint_fast8_type_node =
4409       TREE_TYPE (identifier_global_value (c_get_ident (UINT_FAST8_TYPE)));
4410   if (UINT_FAST16_TYPE)
4411     uint_fast16_type_node =
4412       TREE_TYPE (identifier_global_value (c_get_ident (UINT_FAST16_TYPE)));
4413   if (UINT_FAST32_TYPE)
4414     uint_fast32_type_node =
4415       TREE_TYPE (identifier_global_value (c_get_ident (UINT_FAST32_TYPE)));
4416   if (UINT_FAST64_TYPE)
4417     uint_fast64_type_node =
4418       TREE_TYPE (identifier_global_value (c_get_ident (UINT_FAST64_TYPE)));
4419   if (INTPTR_TYPE)
4420     intptr_type_node =
4421       TREE_TYPE (identifier_global_value (c_get_ident (INTPTR_TYPE)));
4422   if (UINTPTR_TYPE)
4423     uintptr_type_node =
4424       TREE_TYPE (identifier_global_value (c_get_ident (UINTPTR_TYPE)));
4425 
4426   default_function_type
4427     = build_varargs_function_type_list (integer_type_node, NULL_TREE);
4428   unsigned_ptrdiff_type_node = c_common_unsigned_type (ptrdiff_type_node);
4429 
4430   lang_hooks.decls.pushdecl
4431     (build_decl (UNKNOWN_LOCATION,
4432 		 TYPE_DECL, get_identifier ("__builtin_va_list"),
4433 		 va_list_type_node));
4434   if (targetm.enum_va_list_p)
4435     {
4436       int l;
4437       const char *pname;
4438       tree ptype;
4439 
4440       for (l = 0; targetm.enum_va_list_p (l, &pname, &ptype); ++l)
4441 	{
4442 	  lang_hooks.decls.pushdecl
4443 	    (build_decl (UNKNOWN_LOCATION,
4444 		         TYPE_DECL, get_identifier (pname),
4445 	  	         ptype));
4446 
4447 	}
4448     }
4449 
4450   if (TREE_CODE (va_list_type_node) == ARRAY_TYPE)
4451     {
4452       va_list_arg_type_node = va_list_ref_type_node =
4453 	build_pointer_type (TREE_TYPE (va_list_type_node));
4454     }
4455   else
4456     {
4457       va_list_arg_type_node = va_list_type_node;
4458       va_list_ref_type_node = build_reference_type (va_list_type_node);
4459     }
4460 
4461   c_define_builtins (va_list_ref_type_node, va_list_arg_type_node);
4462 
4463   main_identifier_node = get_identifier ("main");
4464 
4465   /* Create the built-in __null node.  It is important that this is
4466      not shared.  */
4467   null_node = make_int_cst (1, 1);
4468   TREE_TYPE (null_node) = c_common_type_for_size (POINTER_SIZE, 0);
4469 
4470   /* Since builtin_types isn't gc'ed, don't export these nodes.  */
4471   memset (builtin_types, 0, sizeof (builtin_types));
4472 }
4473 
4474 /* The number of named compound-literals generated thus far.  */
4475 static GTY(()) int compound_literal_number;
4476 
4477 /* Set DECL_NAME for DECL, a VAR_DECL for a compound-literal.  */
4478 
4479 void
set_compound_literal_name(tree decl)4480 set_compound_literal_name (tree decl)
4481 {
4482   char *name;
4483   ASM_FORMAT_PRIVATE_NAME (name, "__compound_literal",
4484 			   compound_literal_number);
4485   compound_literal_number++;
4486   DECL_NAME (decl) = get_identifier (name);
4487 }
4488 
4489 /* build_va_arg helper function.  Return a VA_ARG_EXPR with location LOC, type
4490    TYPE and operand OP.  */
4491 
4492 static tree
build_va_arg_1(location_t loc,tree type,tree op)4493 build_va_arg_1 (location_t loc, tree type, tree op)
4494 {
4495   tree expr = build1 (VA_ARG_EXPR, type, op);
4496   SET_EXPR_LOCATION (expr, loc);
4497   return expr;
4498 }
4499 
4500 /* Return a VA_ARG_EXPR corresponding to a source-level expression
4501    va_arg (EXPR, TYPE) at source location LOC.  */
4502 
4503 tree
build_va_arg(location_t loc,tree expr,tree type)4504 build_va_arg (location_t loc, tree expr, tree type)
4505 {
4506   tree va_type = TREE_TYPE (expr);
4507   tree canon_va_type = (va_type == error_mark_node
4508 			? error_mark_node
4509 			: targetm.canonical_va_list_type (va_type));
4510 
4511   if (va_type == error_mark_node
4512       || canon_va_type == NULL_TREE)
4513     {
4514       if (canon_va_type == NULL_TREE)
4515 	error_at (loc, "first argument to %<va_arg%> not of type %<va_list%>");
4516 
4517       /* Let's handle things neutrally, if expr:
4518 	 - has undeclared type, or
4519 	 - is not an va_list type.  */
4520       return build_va_arg_1 (loc, type, error_mark_node);
4521     }
4522 
4523   if (TREE_CODE (canon_va_type) != ARRAY_TYPE)
4524     {
4525       /* Case 1: Not an array type.  */
4526 
4527       /* Take the address, to get '&ap'.  Note that &ap is not a va_list
4528 	 type.  */
4529       c_common_mark_addressable_vec (expr);
4530       expr = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (expr)), expr);
4531 
4532       return build_va_arg_1 (loc, type, expr);
4533     }
4534 
4535   /* Case 2: Array type.
4536 
4537      Background:
4538 
4539      For contrast, let's start with the simple case (case 1).  If
4540      canon_va_type is not an array type, but say a char *, then when
4541      passing-by-value a va_list, the type of the va_list param decl is
4542      the same as for another va_list decl (all ap's are char *):
4543 
4544      f2_1 (char * ap)
4545        D.1815 = VA_ARG (&ap, 0B, 1);
4546        return D.1815;
4547 
4548      f2 (int i)
4549        char * ap.0;
4550        char * ap;
4551        __builtin_va_start (&ap, 0);
4552        ap.0 = ap;
4553        res = f2_1 (ap.0);
4554        __builtin_va_end (&ap);
4555        D.1812 = res;
4556        return D.1812;
4557 
4558      However, if canon_va_type is ARRAY_TYPE, then when passing-by-value a
4559      va_list the type of the va_list param decl (case 2b, struct * ap) is not
4560      the same as for another va_list decl (case 2a, struct ap[1]).
4561 
4562      f2_1 (struct  * ap)
4563        D.1844 = VA_ARG (ap, 0B, 0);
4564        return D.1844;
4565 
4566      f2 (int i)
4567        struct  ap[1];
4568        __builtin_va_start (&ap, 0);
4569        res = f2_1 (&ap);
4570        __builtin_va_end (&ap);
4571        D.1841 = res;
4572        return D.1841;
4573 
4574      Case 2b is different because:
4575      - on the callee side, the parm decl has declared type va_list, but
4576        grokdeclarator changes the type of the parm decl to a pointer to the
4577        array elem type.
4578      - on the caller side, the pass-by-value uses &ap.
4579 
4580      We unify these two cases (case 2a: va_list is array type,
4581      case 2b: va_list is pointer to array elem type), by adding '&' for the
4582      array type case, such that we have a pointer to array elem in both
4583      cases.  */
4584 
4585   if (TREE_CODE (va_type) == ARRAY_TYPE)
4586     {
4587       /* Case 2a: va_list is array type.  */
4588 
4589       /* Take the address, to get '&ap'.  Make sure it's a pointer to array
4590 	 elem type.  */
4591       c_common_mark_addressable_vec (expr);
4592       expr = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (canon_va_type)),
4593 		     expr);
4594 
4595       /* Verify that &ap is still recognized as having va_list type.  */
4596       tree canon_expr_type
4597 	= targetm.canonical_va_list_type (TREE_TYPE (expr));
4598       gcc_assert (canon_expr_type != NULL_TREE);
4599     }
4600   else
4601     {
4602       /* Case 2b: va_list is pointer to array elem type.  */
4603       gcc_assert (POINTER_TYPE_P (va_type));
4604 
4605       /* Comparison as in std_canonical_va_list_type.  */
4606       gcc_assert (TYPE_MAIN_VARIANT (TREE_TYPE (va_type))
4607 		  == TYPE_MAIN_VARIANT (TREE_TYPE (canon_va_type)));
4608 
4609       /* Don't take the address.  We've already got '&ap'.  */
4610       ;
4611     }
4612 
4613   return build_va_arg_1 (loc, type, expr);
4614 }
4615 
4616 
4617 /* Linked list of disabled built-in functions.  */
4618 
4619 struct disabled_builtin
4620 {
4621   const char *name;
4622   struct disabled_builtin *next;
4623 };
4624 static disabled_builtin *disabled_builtins = NULL;
4625 
4626 static bool builtin_function_disabled_p (const char *);
4627 
4628 /* Disable a built-in function specified by -fno-builtin-NAME.  If NAME
4629    begins with "__builtin_", give an error.  */
4630 
4631 void
disable_builtin_function(const char * name)4632 disable_builtin_function (const char *name)
4633 {
4634   if (strncmp (name, "__builtin_", strlen ("__builtin_")) == 0)
4635     error ("cannot disable built-in function %qs", name);
4636   else
4637     {
4638       disabled_builtin *new_disabled_builtin = XNEW (disabled_builtin);
4639       new_disabled_builtin->name = name;
4640       new_disabled_builtin->next = disabled_builtins;
4641       disabled_builtins = new_disabled_builtin;
4642     }
4643 }
4644 
4645 
4646 /* Return true if the built-in function NAME has been disabled, false
4647    otherwise.  */
4648 
4649 static bool
builtin_function_disabled_p(const char * name)4650 builtin_function_disabled_p (const char *name)
4651 {
4652   disabled_builtin *p;
4653   for (p = disabled_builtins; p != NULL; p = p->next)
4654     {
4655       if (strcmp (name, p->name) == 0)
4656 	return true;
4657     }
4658   return false;
4659 }
4660 
4661 
4662 /* Worker for DEF_BUILTIN.
4663    Possibly define a builtin function with one or two names.
4664    Does not declare a non-__builtin_ function if flag_no_builtin, or if
4665    nonansi_p and flag_no_nonansi_builtin.  */
4666 
4667 static void
def_builtin_1(enum built_in_function fncode,const char * name,enum built_in_class fnclass,tree fntype,tree libtype,bool both_p,bool fallback_p,bool nonansi_p,tree fnattrs,bool implicit_p)4668 def_builtin_1 (enum built_in_function fncode,
4669 	       const char *name,
4670 	       enum built_in_class fnclass,
4671 	       tree fntype, tree libtype,
4672 	       bool both_p, bool fallback_p, bool nonansi_p,
4673 	       tree fnattrs, bool implicit_p)
4674 {
4675   tree decl;
4676   const char *libname;
4677 
4678   if (fntype == error_mark_node)
4679     return;
4680 
4681   gcc_assert ((!both_p && !fallback_p)
4682 	      || !strncmp (name, "__builtin_",
4683 			   strlen ("__builtin_")));
4684 
4685   libname = name + strlen ("__builtin_");
4686   decl = add_builtin_function (name, fntype, fncode, fnclass,
4687 			       (fallback_p ? libname : NULL),
4688 			       fnattrs);
4689 
4690   set_builtin_decl (fncode, decl, implicit_p);
4691 
4692   if (both_p
4693       && !flag_no_builtin && !builtin_function_disabled_p (libname)
4694       && !(nonansi_p && flag_no_nonansi_builtin))
4695     add_builtin_function (libname, libtype, fncode, fnclass,
4696 			  NULL, fnattrs);
4697 }
4698 
4699 /* Nonzero if the type T promotes to int.  This is (nearly) the
4700    integral promotions defined in ISO C99 6.3.1.1/2.  */
4701 
4702 bool
c_promoting_integer_type_p(const_tree t)4703 c_promoting_integer_type_p (const_tree t)
4704 {
4705   switch (TREE_CODE (t))
4706     {
4707     case INTEGER_TYPE:
4708       return (TYPE_MAIN_VARIANT (t) == char_type_node
4709 	      || TYPE_MAIN_VARIANT (t) == signed_char_type_node
4710 	      || TYPE_MAIN_VARIANT (t) == unsigned_char_type_node
4711 	      || TYPE_MAIN_VARIANT (t) == short_integer_type_node
4712 	      || TYPE_MAIN_VARIANT (t) == short_unsigned_type_node
4713 	      || TYPE_PRECISION (t) < TYPE_PRECISION (integer_type_node));
4714 
4715     case ENUMERAL_TYPE:
4716       /* ??? Technically all enumerations not larger than an int
4717 	 promote to an int.  But this is used along code paths
4718 	 that only want to notice a size change.  */
4719       return TYPE_PRECISION (t) < TYPE_PRECISION (integer_type_node);
4720 
4721     case BOOLEAN_TYPE:
4722       return true;
4723 
4724     default:
4725       return false;
4726     }
4727 }
4728 
4729 /* Return 1 if PARMS specifies a fixed number of parameters
4730    and none of their types is affected by default promotions.  */
4731 
4732 bool
self_promoting_args_p(const_tree parms)4733 self_promoting_args_p (const_tree parms)
4734 {
4735   const_tree t;
4736   for (t = parms; t; t = TREE_CHAIN (t))
4737     {
4738       tree type = TREE_VALUE (t);
4739 
4740       if (type == error_mark_node)
4741 	continue;
4742 
4743       if (TREE_CHAIN (t) == NULL_TREE && type != void_type_node)
4744 	return false;
4745 
4746       if (type == NULL_TREE)
4747 	return false;
4748 
4749       if (TYPE_MAIN_VARIANT (type) == float_type_node)
4750 	return false;
4751 
4752       if (c_promoting_integer_type_p (type))
4753 	return false;
4754     }
4755   return true;
4756 }
4757 
4758 /* Recursively remove any '*' or '&' operator from TYPE.  */
4759 tree
strip_pointer_operator(tree t)4760 strip_pointer_operator (tree t)
4761 {
4762   while (POINTER_TYPE_P (t))
4763     t = TREE_TYPE (t);
4764   return t;
4765 }
4766 
4767 /* Recursively remove pointer or array type from TYPE. */
4768 tree
strip_pointer_or_array_types(tree t)4769 strip_pointer_or_array_types (tree t)
4770 {
4771   while (TREE_CODE (t) == ARRAY_TYPE || POINTER_TYPE_P (t))
4772     t = TREE_TYPE (t);
4773   return t;
4774 }
4775 
4776 /* Used to compare case labels.  K1 and K2 are actually tree nodes
4777    representing case labels, or NULL_TREE for a `default' label.
4778    Returns -1 if K1 is ordered before K2, -1 if K1 is ordered after
4779    K2, and 0 if K1 and K2 are equal.  */
4780 
4781 int
case_compare(splay_tree_key k1,splay_tree_key k2)4782 case_compare (splay_tree_key k1, splay_tree_key k2)
4783 {
4784   /* Consider a NULL key (such as arises with a `default' label) to be
4785      smaller than anything else.  */
4786   if (!k1)
4787     return k2 ? -1 : 0;
4788   else if (!k2)
4789     return k1 ? 1 : 0;
4790 
4791   return tree_int_cst_compare ((tree) k1, (tree) k2);
4792 }
4793 
4794 /* Process a case label, located at LOC, for the range LOW_VALUE
4795    ... HIGH_VALUE.  If LOW_VALUE and HIGH_VALUE are both NULL_TREE
4796    then this case label is actually a `default' label.  If only
4797    HIGH_VALUE is NULL_TREE, then case label was declared using the
4798    usual C/C++ syntax, rather than the GNU case range extension.
4799    CASES is a tree containing all the case ranges processed so far;
4800    COND is the condition for the switch-statement itself.
4801    Returns the CASE_LABEL_EXPR created, or ERROR_MARK_NODE if no
4802    CASE_LABEL_EXPR is created.  */
4803 
4804 tree
c_add_case_label(location_t loc,splay_tree cases,tree cond,tree low_value,tree high_value)4805 c_add_case_label (location_t loc, splay_tree cases, tree cond,
4806 		  tree low_value, tree high_value)
4807 {
4808   tree type;
4809   tree label;
4810   tree case_label;
4811   splay_tree_node node;
4812 
4813   /* Create the LABEL_DECL itself.  */
4814   label = create_artificial_label (loc);
4815 
4816   /* If there was an error processing the switch condition, bail now
4817      before we get more confused.  */
4818   if (!cond || cond == error_mark_node)
4819     goto error_out;
4820 
4821   if ((low_value && TREE_TYPE (low_value)
4822        && POINTER_TYPE_P (TREE_TYPE (low_value)))
4823       || (high_value && TREE_TYPE (high_value)
4824 	  && POINTER_TYPE_P (TREE_TYPE (high_value))))
4825     {
4826       error_at (loc, "pointers are not permitted as case values");
4827       goto error_out;
4828     }
4829 
4830   /* Case ranges are a GNU extension.  */
4831   if (high_value)
4832     pedwarn (loc, OPT_Wpedantic,
4833 	     "range expressions in switch statements are non-standard");
4834 
4835   type = TREE_TYPE (cond);
4836   if (low_value)
4837     {
4838       low_value = check_case_value (loc, low_value);
4839       low_value = convert_and_check (loc, type, low_value);
4840       low_value = fold (low_value);
4841       if (low_value == error_mark_node)
4842 	goto error_out;
4843     }
4844   if (high_value)
4845     {
4846       high_value = check_case_value (loc, high_value);
4847       high_value = convert_and_check (loc, type, high_value);
4848       high_value = fold (high_value);
4849       if (high_value == error_mark_node)
4850 	goto error_out;
4851     }
4852 
4853   if (low_value && high_value)
4854     {
4855       /* If the LOW_VALUE and HIGH_VALUE are the same, then this isn't
4856 	 really a case range, even though it was written that way.
4857 	 Remove the HIGH_VALUE to simplify later processing.  */
4858       if (tree_int_cst_equal (low_value, high_value))
4859 	high_value = NULL_TREE;
4860       else if (!tree_int_cst_lt (low_value, high_value))
4861 	warning_at (loc, 0, "empty range specified");
4862     }
4863 
4864   /* Look up the LOW_VALUE in the table of case labels we already
4865      have.  */
4866   node = splay_tree_lookup (cases, (splay_tree_key) low_value);
4867   /* If there was not an exact match, check for overlapping ranges.
4868      There's no need to do this if there's no LOW_VALUE or HIGH_VALUE;
4869      that's a `default' label and the only overlap is an exact match.  */
4870   if (!node && (low_value || high_value))
4871     {
4872       splay_tree_node low_bound;
4873       splay_tree_node high_bound;
4874 
4875       /* Even though there wasn't an exact match, there might be an
4876 	 overlap between this case range and another case range.
4877 	 Since we've (inductively) not allowed any overlapping case
4878 	 ranges, we simply need to find the greatest low case label
4879 	 that is smaller that LOW_VALUE, and the smallest low case
4880 	 label that is greater than LOW_VALUE.  If there is an overlap
4881 	 it will occur in one of these two ranges.  */
4882       low_bound = splay_tree_predecessor (cases,
4883 					  (splay_tree_key) low_value);
4884       high_bound = splay_tree_successor (cases,
4885 					 (splay_tree_key) low_value);
4886 
4887       /* Check to see if the LOW_BOUND overlaps.  It is smaller than
4888 	 the LOW_VALUE, so there is no need to check unless the
4889 	 LOW_BOUND is in fact itself a case range.  */
4890       if (low_bound
4891 	  && CASE_HIGH ((tree) low_bound->value)
4892 	  && tree_int_cst_compare (CASE_HIGH ((tree) low_bound->value),
4893 				    low_value) >= 0)
4894 	node = low_bound;
4895       /* Check to see if the HIGH_BOUND overlaps.  The low end of that
4896 	 range is bigger than the low end of the current range, so we
4897 	 are only interested if the current range is a real range, and
4898 	 not an ordinary case label.  */
4899       else if (high_bound
4900 	       && high_value
4901 	       && (tree_int_cst_compare ((tree) high_bound->key,
4902 					 high_value)
4903 		   <= 0))
4904 	node = high_bound;
4905     }
4906   /* If there was an overlap, issue an error.  */
4907   if (node)
4908     {
4909       tree duplicate = CASE_LABEL ((tree) node->value);
4910 
4911       if (high_value)
4912 	{
4913 	  error_at (loc, "duplicate (or overlapping) case value");
4914 	  inform (DECL_SOURCE_LOCATION (duplicate),
4915 		  "this is the first entry overlapping that value");
4916 	}
4917       else if (low_value)
4918 	{
4919 	  error_at (loc, "duplicate case value") ;
4920 	  inform (DECL_SOURCE_LOCATION (duplicate), "previously used here");
4921 	}
4922       else
4923 	{
4924 	  error_at (loc, "multiple default labels in one switch");
4925 	  inform (DECL_SOURCE_LOCATION (duplicate),
4926 		  "this is the first default label");
4927 	}
4928       goto error_out;
4929     }
4930 
4931   /* Add a CASE_LABEL to the statement-tree.  */
4932   case_label = add_stmt (build_case_label (low_value, high_value, label));
4933   /* Register this case label in the splay tree.  */
4934   splay_tree_insert (cases,
4935 		     (splay_tree_key) low_value,
4936 		     (splay_tree_value) case_label);
4937 
4938   return case_label;
4939 
4940  error_out:
4941   /* Add a label so that the back-end doesn't think that the beginning of
4942      the switch is unreachable.  Note that we do not add a case label, as
4943      that just leads to duplicates and thence to failure later on.  */
4944   if (!cases->root)
4945     {
4946       tree t = create_artificial_label (loc);
4947       add_stmt (build_stmt (loc, LABEL_EXPR, t));
4948     }
4949   return error_mark_node;
4950 }
4951 
4952 /* Subroutine of c_switch_covers_all_cases_p, called via
4953    splay_tree_foreach.  Return 1 if it doesn't cover all the cases.
4954    ARGS[0] is initially NULL and after the first iteration is the
4955    so far highest case label.  ARGS[1] is the minimum of SWITCH_COND's
4956    type.  */
4957 
4958 static int
c_switch_covers_all_cases_p_1(splay_tree_node node,void * data)4959 c_switch_covers_all_cases_p_1 (splay_tree_node node, void *data)
4960 {
4961   tree label = (tree) node->value;
4962   tree *args = (tree *) data;
4963 
4964   /* If there is a default case, we shouldn't have called this.  */
4965   gcc_assert (CASE_LOW (label));
4966 
4967   if (args[0] == NULL_TREE)
4968     {
4969       if (wi::to_widest (args[1]) < wi::to_widest (CASE_LOW (label)))
4970 	return 1;
4971     }
4972   else if (wi::add (wi::to_widest (args[0]), 1)
4973 	   != wi::to_widest (CASE_LOW (label)))
4974     return 1;
4975   if (CASE_HIGH (label))
4976     args[0] = CASE_HIGH (label);
4977   else
4978     args[0] = CASE_LOW (label);
4979   return 0;
4980 }
4981 
4982 /* Return true if switch with CASES and switch condition with type
4983    covers all possible values in the case labels.  */
4984 
4985 bool
c_switch_covers_all_cases_p(splay_tree cases,tree type)4986 c_switch_covers_all_cases_p (splay_tree cases, tree type)
4987 {
4988   /* If there is default:, this is always the case.  */
4989   splay_tree_node default_node
4990     = splay_tree_lookup (cases, (splay_tree_key) NULL);
4991   if (default_node)
4992     return true;
4993 
4994   if (!INTEGRAL_TYPE_P (type))
4995     return false;
4996 
4997   tree args[2] = { NULL_TREE, TYPE_MIN_VALUE (type) };
4998   if (splay_tree_foreach (cases, c_switch_covers_all_cases_p_1, args))
4999     return false;
5000 
5001   /* If there are no cases at all, or if the highest case label
5002      is smaller than TYPE_MAX_VALUE, return false.  */
5003   if (args[0] == NULL_TREE
5004       || wi::to_widest (args[0]) < wi::to_widest (TYPE_MAX_VALUE (type)))
5005     return false;
5006 
5007   return true;
5008 }
5009 
5010 /* Finish an expression taking the address of LABEL (an
5011    IDENTIFIER_NODE).  Returns an expression for the address.
5012 
5013    LOC is the location for the expression returned.  */
5014 
5015 tree
finish_label_address_expr(tree label,location_t loc)5016 finish_label_address_expr (tree label, location_t loc)
5017 {
5018   tree result;
5019 
5020   pedwarn (input_location, OPT_Wpedantic, "taking the address of a label is non-standard");
5021 
5022   if (label == error_mark_node)
5023     return error_mark_node;
5024 
5025   label = lookup_label (label);
5026   if (label == NULL_TREE)
5027     result = null_pointer_node;
5028   else
5029     {
5030       TREE_USED (label) = 1;
5031       result = build1 (ADDR_EXPR, ptr_type_node, label);
5032       /* The current function is not necessarily uninlinable.
5033 	 Computed gotos are incompatible with inlining, but the value
5034 	 here could be used only in a diagnostic, for example.  */
5035       protected_set_expr_location (result, loc);
5036     }
5037 
5038   return result;
5039 }
5040 
5041 
5042 /* Given a boolean expression ARG, return a tree representing an increment
5043    or decrement (as indicated by CODE) of ARG.  The front end must check for
5044    invalid cases (e.g., decrement in C++).  */
5045 tree
boolean_increment(enum tree_code code,tree arg)5046 boolean_increment (enum tree_code code, tree arg)
5047 {
5048   tree val;
5049   tree true_res = build_int_cst (TREE_TYPE (arg), 1);
5050 
5051   arg = stabilize_reference (arg);
5052   switch (code)
5053     {
5054     case PREINCREMENT_EXPR:
5055       val = build2 (MODIFY_EXPR, TREE_TYPE (arg), arg, true_res);
5056       break;
5057     case POSTINCREMENT_EXPR:
5058       val = build2 (MODIFY_EXPR, TREE_TYPE (arg), arg, true_res);
5059       arg = save_expr (arg);
5060       val = build2 (COMPOUND_EXPR, TREE_TYPE (arg), val, arg);
5061       val = build2 (COMPOUND_EXPR, TREE_TYPE (arg), arg, val);
5062       break;
5063     case PREDECREMENT_EXPR:
5064       val = build2 (MODIFY_EXPR, TREE_TYPE (arg), arg,
5065 		    invert_truthvalue_loc (input_location, arg));
5066       break;
5067     case POSTDECREMENT_EXPR:
5068       val = build2 (MODIFY_EXPR, TREE_TYPE (arg), arg,
5069 		    invert_truthvalue_loc (input_location, arg));
5070       arg = save_expr (arg);
5071       val = build2 (COMPOUND_EXPR, TREE_TYPE (arg), val, arg);
5072       val = build2 (COMPOUND_EXPR, TREE_TYPE (arg), arg, val);
5073       break;
5074     default:
5075       gcc_unreachable ();
5076     }
5077   TREE_SIDE_EFFECTS (val) = 1;
5078   return val;
5079 }
5080 
5081 /* Built-in macros for stddef.h and stdint.h, that require macros
5082    defined in this file.  */
5083 void
c_stddef_cpp_builtins(void)5084 c_stddef_cpp_builtins(void)
5085 {
5086   builtin_define_with_value ("__SIZE_TYPE__", SIZE_TYPE, 0);
5087   builtin_define_with_value ("__PTRDIFF_TYPE__", PTRDIFF_TYPE, 0);
5088   builtin_define_with_value ("__WCHAR_TYPE__", MODIFIED_WCHAR_TYPE, 0);
5089   builtin_define_with_value ("__WINT_TYPE__", WINT_TYPE, 0);
5090   builtin_define_with_value ("__INTMAX_TYPE__", INTMAX_TYPE, 0);
5091   builtin_define_with_value ("__UINTMAX_TYPE__", UINTMAX_TYPE, 0);
5092   if (flag_char8_t)
5093     builtin_define_with_value ("__CHAR8_TYPE__", CHAR8_TYPE, 0);
5094   builtin_define_with_value ("__CHAR16_TYPE__", CHAR16_TYPE, 0);
5095   builtin_define_with_value ("__CHAR32_TYPE__", CHAR32_TYPE, 0);
5096   if (SIG_ATOMIC_TYPE)
5097     builtin_define_with_value ("__SIG_ATOMIC_TYPE__", SIG_ATOMIC_TYPE, 0);
5098   if (INT8_TYPE)
5099     builtin_define_with_value ("__INT8_TYPE__", INT8_TYPE, 0);
5100   if (INT16_TYPE)
5101     builtin_define_with_value ("__INT16_TYPE__", INT16_TYPE, 0);
5102   if (INT32_TYPE)
5103     builtin_define_with_value ("__INT32_TYPE__", INT32_TYPE, 0);
5104   if (INT64_TYPE)
5105     builtin_define_with_value ("__INT64_TYPE__", INT64_TYPE, 0);
5106   if (UINT8_TYPE)
5107     builtin_define_with_value ("__UINT8_TYPE__", UINT8_TYPE, 0);
5108   if (UINT16_TYPE)
5109     builtin_define_with_value ("__UINT16_TYPE__", UINT16_TYPE, 0);
5110   if (UINT32_TYPE)
5111     builtin_define_with_value ("__UINT32_TYPE__", UINT32_TYPE, 0);
5112   if (UINT64_TYPE)
5113     builtin_define_with_value ("__UINT64_TYPE__", UINT64_TYPE, 0);
5114   if (INT_LEAST8_TYPE)
5115     builtin_define_with_value ("__INT_LEAST8_TYPE__", INT_LEAST8_TYPE, 0);
5116   if (INT_LEAST16_TYPE)
5117     builtin_define_with_value ("__INT_LEAST16_TYPE__", INT_LEAST16_TYPE, 0);
5118   if (INT_LEAST32_TYPE)
5119     builtin_define_with_value ("__INT_LEAST32_TYPE__", INT_LEAST32_TYPE, 0);
5120   if (INT_LEAST64_TYPE)
5121     builtin_define_with_value ("__INT_LEAST64_TYPE__", INT_LEAST64_TYPE, 0);
5122   if (UINT_LEAST8_TYPE)
5123     builtin_define_with_value ("__UINT_LEAST8_TYPE__", UINT_LEAST8_TYPE, 0);
5124   if (UINT_LEAST16_TYPE)
5125     builtin_define_with_value ("__UINT_LEAST16_TYPE__", UINT_LEAST16_TYPE, 0);
5126   if (UINT_LEAST32_TYPE)
5127     builtin_define_with_value ("__UINT_LEAST32_TYPE__", UINT_LEAST32_TYPE, 0);
5128   if (UINT_LEAST64_TYPE)
5129     builtin_define_with_value ("__UINT_LEAST64_TYPE__", UINT_LEAST64_TYPE, 0);
5130   if (INT_FAST8_TYPE)
5131     builtin_define_with_value ("__INT_FAST8_TYPE__", INT_FAST8_TYPE, 0);
5132   if (INT_FAST16_TYPE)
5133     builtin_define_with_value ("__INT_FAST16_TYPE__", INT_FAST16_TYPE, 0);
5134   if (INT_FAST32_TYPE)
5135     builtin_define_with_value ("__INT_FAST32_TYPE__", INT_FAST32_TYPE, 0);
5136   if (INT_FAST64_TYPE)
5137     builtin_define_with_value ("__INT_FAST64_TYPE__", INT_FAST64_TYPE, 0);
5138   if (UINT_FAST8_TYPE)
5139     builtin_define_with_value ("__UINT_FAST8_TYPE__", UINT_FAST8_TYPE, 0);
5140   if (UINT_FAST16_TYPE)
5141     builtin_define_with_value ("__UINT_FAST16_TYPE__", UINT_FAST16_TYPE, 0);
5142   if (UINT_FAST32_TYPE)
5143     builtin_define_with_value ("__UINT_FAST32_TYPE__", UINT_FAST32_TYPE, 0);
5144   if (UINT_FAST64_TYPE)
5145     builtin_define_with_value ("__UINT_FAST64_TYPE__", UINT_FAST64_TYPE, 0);
5146   if (INTPTR_TYPE)
5147     builtin_define_with_value ("__INTPTR_TYPE__", INTPTR_TYPE, 0);
5148   if (UINTPTR_TYPE)
5149     builtin_define_with_value ("__UINTPTR_TYPE__", UINTPTR_TYPE, 0);
5150   /* GIMPLE FE testcases need access to the GCC internal 'sizetype'.
5151      Expose it as __SIZETYPE__.  */
5152   if (flag_gimple)
5153     builtin_define_with_value ("__SIZETYPE__", SIZETYPE, 0);
5154 }
5155 
5156 static void
c_init_attributes(void)5157 c_init_attributes (void)
5158 {
5159   /* Fill in the built_in_attributes array.  */
5160 #define DEF_ATTR_NULL_TREE(ENUM)				\
5161   built_in_attributes[(int) ENUM] = NULL_TREE;
5162 #define DEF_ATTR_INT(ENUM, VALUE)				\
5163   built_in_attributes[(int) ENUM] = build_int_cst (integer_type_node, VALUE);
5164 #define DEF_ATTR_STRING(ENUM, VALUE)				\
5165   built_in_attributes[(int) ENUM] = build_string (strlen (VALUE), VALUE);
5166 #define DEF_ATTR_IDENT(ENUM, STRING)				\
5167   built_in_attributes[(int) ENUM] = get_identifier (STRING);
5168 #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN)	\
5169   built_in_attributes[(int) ENUM]			\
5170     = tree_cons (built_in_attributes[(int) PURPOSE],	\
5171 		 built_in_attributes[(int) VALUE],	\
5172 		 built_in_attributes[(int) CHAIN]);
5173 #include "builtin-attrs.def"
5174 #undef DEF_ATTR_NULL_TREE
5175 #undef DEF_ATTR_INT
5176 #undef DEF_ATTR_IDENT
5177 #undef DEF_ATTR_TREE_LIST
5178 }
5179 
5180 /* Check whether the byte alignment ALIGN is a valid user-specified
5181    alignment less than the supported maximum.  If so, return ALIGN's
5182    base-2 log; if not, output an error and return -1.  If OBJFILE
5183    then reject alignments greater than MAX_OFILE_ALIGNMENT when
5184    converted to bits.  Otherwise, consider valid only alignments
5185    that are less than HOST_BITS_PER_INT - LOG2_BITS_PER_UNIT.
5186    Zero is not considered a valid argument (and results in -1 on
5187    return) but it only triggers a warning when WARN_ZERO is set.  */
5188 
5189 int
check_user_alignment(const_tree align,bool objfile,bool warn_zero)5190 check_user_alignment (const_tree align, bool objfile, bool warn_zero)
5191 {
5192   if (error_operand_p (align))
5193     return -1;
5194 
5195   if (TREE_CODE (align) != INTEGER_CST
5196       || !INTEGRAL_TYPE_P (TREE_TYPE (align)))
5197     {
5198       error ("requested alignment is not an integer constant");
5199       return -1;
5200     }
5201 
5202   if (integer_zerop (align))
5203     {
5204       if (warn_zero)
5205 	warning (OPT_Wattributes,
5206 		 "requested alignment %qE is not a positive power of 2",
5207 		 align);
5208       return -1;
5209     }
5210 
5211   /* Log2 of the byte alignment ALIGN.  */
5212   int log2align;
5213   if (tree_int_cst_sgn (align) == -1
5214       || (log2align = tree_log2 (align)) == -1)
5215     {
5216       error ("requested alignment %qE is not a positive power of 2",
5217 	     align);
5218       return -1;
5219     }
5220 
5221   if (objfile)
5222     {
5223       unsigned maxalign = MAX_OFILE_ALIGNMENT / BITS_PER_UNIT;
5224       if (!tree_fits_uhwi_p (align) || tree_to_uhwi (align) > maxalign)
5225 	{
5226 	  error ("requested alignment %qE exceeds object file maximum %u",
5227 		 align, maxalign);
5228 	  return -1;
5229 	}
5230     }
5231 
5232   if (log2align >= HOST_BITS_PER_INT - LOG2_BITS_PER_UNIT)
5233     {
5234       error ("requested alignment %qE exceeds maximum %u",
5235 	     align, 1U << (HOST_BITS_PER_INT - LOG2_BITS_PER_UNIT - 1));
5236       return -1;
5237     }
5238 
5239   return log2align;
5240 }
5241 
5242 /* Determine the ELF symbol visibility for DECL, which is either a
5243    variable or a function.  It is an error to use this function if a
5244    definition of DECL is not available in this translation unit.
5245    Returns true if the final visibility has been determined by this
5246    function; false if the caller is free to make additional
5247    modifications.  */
5248 
5249 bool
c_determine_visibility(tree decl)5250 c_determine_visibility (tree decl)
5251 {
5252   gcc_assert (VAR_OR_FUNCTION_DECL_P (decl));
5253 
5254   /* If the user explicitly specified the visibility with an
5255      attribute, honor that.  DECL_VISIBILITY will have been set during
5256      the processing of the attribute.  We check for an explicit
5257      attribute, rather than just checking DECL_VISIBILITY_SPECIFIED,
5258      to distinguish the use of an attribute from the use of a "#pragma
5259      GCC visibility push(...)"; in the latter case we still want other
5260      considerations to be able to overrule the #pragma.  */
5261   if (lookup_attribute ("visibility", DECL_ATTRIBUTES (decl))
5262       || (TARGET_DLLIMPORT_DECL_ATTRIBUTES
5263 	  && (lookup_attribute ("dllimport", DECL_ATTRIBUTES (decl))
5264 	      || lookup_attribute ("dllexport", DECL_ATTRIBUTES (decl)))))
5265     return true;
5266 
5267   /* Set default visibility to whatever the user supplied with
5268      visibility_specified depending on #pragma GCC visibility.  */
5269   if (!DECL_VISIBILITY_SPECIFIED (decl))
5270     {
5271       if (visibility_options.inpragma
5272 	  || DECL_VISIBILITY (decl) != default_visibility)
5273 	{
5274 	  DECL_VISIBILITY (decl) = default_visibility;
5275 	  DECL_VISIBILITY_SPECIFIED (decl) = visibility_options.inpragma;
5276 	  /* If visibility changed and DECL already has DECL_RTL, ensure
5277 	     symbol flags are updated.  */
5278 	  if (((VAR_P (decl) && TREE_STATIC (decl))
5279 	       || TREE_CODE (decl) == FUNCTION_DECL)
5280 	      && DECL_RTL_SET_P (decl))
5281 	    make_decl_rtl (decl);
5282 	}
5283     }
5284   return false;
5285 }
5286 
5287 /* Data to communicate through check_function_arguments_recurse between
5288    check_function_nonnull and check_nonnull_arg.  */
5289 
5290 struct nonnull_arg_ctx
5291 {
5292   location_t loc;
5293   bool warned_p;
5294 };
5295 
5296 /* Check the argument list of a function call for null in argument slots
5297    that are marked as requiring a non-null pointer argument.  The NARGS
5298    arguments are passed in the array ARGARRAY.  Return true if we have
5299    warned.  */
5300 
5301 static bool
check_function_nonnull(location_t loc,tree attrs,int nargs,tree * argarray)5302 check_function_nonnull (location_t loc, tree attrs, int nargs, tree *argarray)
5303 {
5304   tree a;
5305   int i;
5306 
5307   attrs = lookup_attribute ("nonnull", attrs);
5308   if (attrs == NULL_TREE)
5309     return false;
5310 
5311   a = attrs;
5312   /* See if any of the nonnull attributes has no arguments.  If so,
5313      then every pointer argument is checked (in which case the check
5314      for pointer type is done in check_nonnull_arg).  */
5315   if (TREE_VALUE (a) != NULL_TREE)
5316     do
5317       a = lookup_attribute ("nonnull", TREE_CHAIN (a));
5318     while (a != NULL_TREE && TREE_VALUE (a) != NULL_TREE);
5319 
5320   struct nonnull_arg_ctx ctx = { loc, false };
5321   if (a != NULL_TREE)
5322     for (i = 0; i < nargs; i++)
5323       check_function_arguments_recurse (check_nonnull_arg, &ctx, argarray[i],
5324 					i + 1);
5325   else
5326     {
5327       /* Walk the argument list.  If we encounter an argument number we
5328 	 should check for non-null, do it.  */
5329       for (i = 0; i < nargs; i++)
5330 	{
5331 	  for (a = attrs; ; a = TREE_CHAIN (a))
5332 	    {
5333 	      a = lookup_attribute ("nonnull", a);
5334 	      if (a == NULL_TREE || nonnull_check_p (TREE_VALUE (a), i + 1))
5335 		break;
5336 	    }
5337 
5338 	  if (a != NULL_TREE)
5339 	    check_function_arguments_recurse (check_nonnull_arg, &ctx,
5340 					      argarray[i], i + 1);
5341 	}
5342     }
5343   return ctx.warned_p;
5344 }
5345 
5346 /* Check that the Nth argument of a function call (counting backwards
5347    from the end) is a (pointer)0.  The NARGS arguments are passed in the
5348    array ARGARRAY.  */
5349 
5350 static void
check_function_sentinel(const_tree fntype,int nargs,tree * argarray)5351 check_function_sentinel (const_tree fntype, int nargs, tree *argarray)
5352 {
5353   tree attr = lookup_attribute ("sentinel", TYPE_ATTRIBUTES (fntype));
5354 
5355   if (attr)
5356     {
5357       int len = 0;
5358       int pos = 0;
5359       tree sentinel;
5360       function_args_iterator iter;
5361       tree t;
5362 
5363       /* Skip over the named arguments.  */
5364       FOREACH_FUNCTION_ARGS (fntype, t, iter)
5365 	{
5366 	  if (len == nargs)
5367 	    break;
5368 	  len++;
5369 	}
5370 
5371       if (TREE_VALUE (attr))
5372 	{
5373 	  tree p = TREE_VALUE (TREE_VALUE (attr));
5374 	  pos = TREE_INT_CST_LOW (p);
5375 	}
5376 
5377       /* The sentinel must be one of the varargs, i.e.
5378 	 in position >= the number of fixed arguments.  */
5379       if ((nargs - 1 - pos) < len)
5380 	{
5381 	  warning (OPT_Wformat_,
5382 		   "not enough variable arguments to fit a sentinel");
5383 	  return;
5384 	}
5385 
5386       /* Validate the sentinel.  */
5387       sentinel = fold_for_warn (argarray[nargs - 1 - pos]);
5388       if ((!POINTER_TYPE_P (TREE_TYPE (sentinel))
5389 	   || !integer_zerop (sentinel))
5390 	  /* Although __null (in C++) is only an integer we allow it
5391 	     nevertheless, as we are guaranteed that it's exactly
5392 	     as wide as a pointer, and we don't want to force
5393 	     users to cast the NULL they have written there.
5394 	     We warn with -Wstrict-null-sentinel, though.  */
5395 	  && (warn_strict_null_sentinel || null_node != sentinel))
5396 	warning (OPT_Wformat_, "missing sentinel in function call");
5397     }
5398 }
5399 
5400 /* Check that the same argument isn't passed to two or more
5401    restrict-qualified formal and issue a -Wrestrict warning
5402    if it is.  Return true if a warning has been issued.  */
5403 
5404 static bool
check_function_restrict(const_tree fndecl,const_tree fntype,int nargs,tree * unfolded_argarray)5405 check_function_restrict (const_tree fndecl, const_tree fntype,
5406 			 int nargs, tree *unfolded_argarray)
5407 {
5408   int i;
5409   tree parms = TYPE_ARG_TYPES (fntype);
5410 
5411   /* Call fold_for_warn on all of the arguments.  */
5412   auto_vec<tree> argarray (nargs);
5413   for (i = 0; i < nargs; i++)
5414     argarray.quick_push (fold_for_warn (unfolded_argarray[i]));
5415 
5416   if (fndecl
5417       && TREE_CODE (fndecl) == FUNCTION_DECL)
5418     {
5419       /* Avoid diagnosing calls built-ins with a zero size/bound
5420 	 here.  They are checked in more detail elsewhere.  */
5421       if (fndecl_built_in_p (fndecl, BUILT_IN_NORMAL)
5422 	  && nargs == 3
5423 	  && TREE_CODE (argarray[2]) == INTEGER_CST
5424 	  && integer_zerop (argarray[2]))
5425 	return false;
5426 
5427       if (DECL_ARGUMENTS (fndecl))
5428 	parms = DECL_ARGUMENTS (fndecl);
5429     }
5430 
5431   for (i = 0; i < nargs; i++)
5432     TREE_VISITED (argarray[i]) = 0;
5433 
5434   bool warned = false;
5435 
5436   for (i = 0; i < nargs && parms && parms != void_list_node; i++)
5437     {
5438       tree type;
5439       if (TREE_CODE (parms) == PARM_DECL)
5440 	{
5441 	  type = TREE_TYPE (parms);
5442 	  parms = DECL_CHAIN (parms);
5443 	}
5444       else
5445 	{
5446 	  type = TREE_VALUE (parms);
5447 	  parms = TREE_CHAIN (parms);
5448 	}
5449       if (POINTER_TYPE_P (type)
5450 	  && TYPE_RESTRICT (type)
5451 	  && !TYPE_READONLY (TREE_TYPE (type)))
5452 	warned |= warn_for_restrict (i, argarray.address (), nargs);
5453     }
5454 
5455   for (i = 0; i < nargs; i++)
5456     TREE_VISITED (argarray[i]) = 0;
5457 
5458   return warned;
5459 }
5460 
5461 /* Helper for check_function_nonnull; given a list of operands which
5462    must be non-null in ARGS, determine if operand PARAM_NUM should be
5463    checked.  */
5464 
5465 static bool
nonnull_check_p(tree args,unsigned HOST_WIDE_INT param_num)5466 nonnull_check_p (tree args, unsigned HOST_WIDE_INT param_num)
5467 {
5468   unsigned HOST_WIDE_INT arg_num = 0;
5469 
5470   for (; args; args = TREE_CHAIN (args))
5471     {
5472       bool found = get_attribute_operand (TREE_VALUE (args), &arg_num);
5473 
5474       gcc_assert (found);
5475 
5476       if (arg_num == param_num)
5477 	return true;
5478     }
5479   return false;
5480 }
5481 
5482 /* Check that the function argument PARAM (which is operand number
5483    PARAM_NUM) is non-null.  This is called by check_function_nonnull
5484    via check_function_arguments_recurse.  */
5485 
5486 static void
check_nonnull_arg(void * ctx,tree param,unsigned HOST_WIDE_INT param_num)5487 check_nonnull_arg (void *ctx, tree param, unsigned HOST_WIDE_INT param_num)
5488 {
5489   struct nonnull_arg_ctx *pctx = (struct nonnull_arg_ctx *) ctx;
5490 
5491   /* Just skip checking the argument if it's not a pointer.  This can
5492      happen if the "nonnull" attribute was given without an operand
5493      list (which means to check every pointer argument).  */
5494 
5495   if (TREE_CODE (TREE_TYPE (param)) != POINTER_TYPE)
5496     return;
5497 
5498   /* Diagnose the simple cases of null arguments.  */
5499   if (integer_zerop (fold_for_warn (param)))
5500     {
5501       warning_at (pctx->loc, OPT_Wnonnull, "null argument where non-null "
5502 		  "required (argument %lu)", (unsigned long) param_num);
5503       pctx->warned_p = true;
5504     }
5505 }
5506 
5507 /* Helper for attribute handling; fetch the operand number from
5508    the attribute argument list.  */
5509 
5510 bool
get_attribute_operand(tree arg_num_expr,unsigned HOST_WIDE_INT * valp)5511 get_attribute_operand (tree arg_num_expr, unsigned HOST_WIDE_INT *valp)
5512 {
5513   /* Verify the arg number is a small constant.  */
5514   if (tree_fits_uhwi_p (arg_num_expr))
5515     {
5516       *valp = tree_to_uhwi (arg_num_expr);
5517       return true;
5518     }
5519   else
5520     return false;
5521 }
5522 
5523 /* Arguments being collected for optimization.  */
5524 typedef const char *const_char_p;		/* For DEF_VEC_P.  */
5525 static GTY(()) vec<const_char_p, va_gc> *optimize_args;
5526 
5527 
5528 /* Inner function to convert a TREE_LIST to argv string to parse the optimize
5529    options in ARGS.  ATTR_P is true if this is for attribute(optimize), and
5530    false for #pragma GCC optimize.  */
5531 
5532 bool
parse_optimize_options(tree args,bool attr_p)5533 parse_optimize_options (tree args, bool attr_p)
5534 {
5535   bool ret = true;
5536   unsigned opt_argc;
5537   unsigned i;
5538   const char **opt_argv;
5539   struct cl_decoded_option *decoded_options;
5540   unsigned int decoded_options_count;
5541   tree ap;
5542 
5543   /* Build up argv vector.  Just in case the string is stored away, use garbage
5544      collected strings.  */
5545   vec_safe_truncate (optimize_args, 0);
5546   vec_safe_push (optimize_args, (const char *) NULL);
5547 
5548   for (ap = args; ap != NULL_TREE; ap = TREE_CHAIN (ap))
5549     {
5550       tree value = TREE_VALUE (ap);
5551 
5552       if (TREE_CODE (value) == INTEGER_CST)
5553 	{
5554 	  char buffer[20];
5555 	  sprintf (buffer, "-O%ld", (long) TREE_INT_CST_LOW (value));
5556 	  vec_safe_push (optimize_args, ggc_strdup (buffer));
5557 	}
5558 
5559       else if (TREE_CODE (value) == STRING_CST)
5560 	{
5561 	  /* Split string into multiple substrings.  */
5562 	  size_t len = TREE_STRING_LENGTH (value);
5563 	  char *p = ASTRDUP (TREE_STRING_POINTER (value));
5564 	  char *end = p + len;
5565 	  char *comma;
5566 	  char *next_p = p;
5567 
5568 	  while (next_p != NULL)
5569 	    {
5570 	      size_t len2;
5571 	      char *q, *r;
5572 
5573 	      p = next_p;
5574 	      comma = strchr (p, ',');
5575 	      if (comma)
5576 		{
5577 		  len2 = comma - p;
5578 		  *comma = '\0';
5579 		  next_p = comma+1;
5580 		}
5581 	      else
5582 		{
5583 		  len2 = end - p;
5584 		  next_p = NULL;
5585 		}
5586 
5587 	      /* If the user supplied -Oxxx or -fxxx, only allow -Oxxx or -fxxx
5588 		 options.  */
5589 	      if (*p == '-' && p[1] != 'O' && p[1] != 'f')
5590 		{
5591 		  ret = false;
5592 		  if (attr_p)
5593 		    warning (OPT_Wattributes,
5594 			     "bad option %qs to attribute %<optimize%>", p);
5595 		  else
5596 		    warning (OPT_Wpragmas,
5597 			     "bad option %qs to pragma %<optimize%>", p);
5598 		  continue;
5599 		}
5600 
5601 	      /* Can't use GC memory here, see PR88007.  */
5602 	      r = q = XOBNEWVEC (&opts_obstack, char, len2 + 3);
5603 
5604 	      if (*p != '-')
5605 		{
5606 		  *r++ = '-';
5607 
5608 		  /* Assume that Ox is -Ox, a numeric value is -Ox, a s by
5609 		     itself is -Os, and any other switch begins with a -f.  */
5610 		  if ((*p >= '0' && *p <= '9')
5611 		      || (p[0] == 's' && p[1] == '\0'))
5612 		    *r++ = 'O';
5613 		  else if (*p != 'O')
5614 		    *r++ = 'f';
5615 		}
5616 
5617 	      memcpy (r, p, len2);
5618 	      r[len2] = '\0';
5619 	      vec_safe_push (optimize_args, (const char *) q);
5620 	    }
5621 
5622 	}
5623     }
5624 
5625   opt_argc = optimize_args->length ();
5626   opt_argv = (const char **) alloca (sizeof (char *) * (opt_argc + 1));
5627 
5628   for (i = 1; i < opt_argc; i++)
5629     opt_argv[i] = (*optimize_args)[i];
5630 
5631   /* Now parse the options.  */
5632   decode_cmdline_options_to_array_default_mask (opt_argc, opt_argv,
5633 						&decoded_options,
5634 						&decoded_options_count);
5635   /* Drop non-Optimization options.  */
5636   unsigned j = 1;
5637   for (i = 1; i < decoded_options_count; ++i)
5638     {
5639       if (! (cl_options[decoded_options[i].opt_index].flags & CL_OPTIMIZATION))
5640 	{
5641 	  ret = false;
5642 	  if (attr_p)
5643 	    warning (OPT_Wattributes,
5644 		     "bad option %qs to attribute %<optimize%>",
5645 		     decoded_options[i].orig_option_with_args_text);
5646 	  else
5647 	    warning (OPT_Wpragmas,
5648 		     "bad option %qs to pragma %<optimize%>",
5649 		     decoded_options[i].orig_option_with_args_text);
5650 	  continue;
5651 	}
5652       if (i != j)
5653 	decoded_options[j] = decoded_options[i];
5654       j++;
5655     }
5656   decoded_options_count = j;
5657   /* And apply them.  */
5658   decode_options (&global_options, &global_options_set,
5659 		  decoded_options, decoded_options_count,
5660 		  input_location, global_dc, NULL);
5661 
5662   targetm.override_options_after_change();
5663 
5664   optimize_args->truncate (0);
5665   return ret;
5666 }
5667 
5668 /* Check whether ATTR is a valid attribute fallthrough.  */
5669 
5670 bool
attribute_fallthrough_p(tree attr)5671 attribute_fallthrough_p (tree attr)
5672 {
5673   if (attr == error_mark_node)
5674    return false;
5675   tree t = lookup_attribute ("fallthrough", attr);
5676   if (t == NULL_TREE)
5677     return false;
5678   /* This attribute shall appear at most once in each attribute-list.  */
5679   if (lookup_attribute ("fallthrough", TREE_CHAIN (t)))
5680     warning (OPT_Wattributes, "%<fallthrough%> attribute specified multiple "
5681 	     "times");
5682   /* No attribute-argument-clause shall be present.  */
5683   else if (TREE_VALUE (t) != NULL_TREE)
5684     warning (OPT_Wattributes, "%<fallthrough%> attribute specified with "
5685 	     "a parameter");
5686   /* Warn if other attributes are found.  */
5687   for (t = attr; t != NULL_TREE; t = TREE_CHAIN (t))
5688     {
5689       tree name = get_attribute_name (t);
5690       if (!is_attribute_p ("fallthrough", name))
5691 	{
5692 	  if (!c_dialect_cxx () && get_attribute_namespace (t) == NULL_TREE)
5693 	    /* The specifications of standard attributes in C mean
5694 	       this is a constraint violation.  */
5695 	    pedwarn (input_location, OPT_Wattributes, "%qE attribute ignored",
5696 		     get_attribute_name (t));
5697 	  else
5698 	    warning (OPT_Wattributes, "%qE attribute ignored", name);
5699 	}
5700     }
5701   return true;
5702 }
5703 
5704 
5705 /* Check for valid arguments being passed to a function with FNTYPE.
5706    There are NARGS arguments in the array ARGARRAY.  LOC should be used
5707    for diagnostics.  Return true if either -Wnonnull or -Wrestrict has
5708    been issued.
5709 
5710    The arguments in ARGARRAY may not have been folded yet (e.g. for C++,
5711    to preserve location wrappers); checks that require folded arguments
5712    should call fold_for_warn on them.  */
5713 
5714 bool
check_function_arguments(location_t loc,const_tree fndecl,const_tree fntype,int nargs,tree * argarray,vec<location_t> * arglocs)5715 check_function_arguments (location_t loc, const_tree fndecl, const_tree fntype,
5716 			  int nargs, tree *argarray, vec<location_t> *arglocs)
5717 {
5718   bool warned_p = false;
5719 
5720   /* Check for null being passed in a pointer argument that must be
5721      non-null.  We also need to do this if format checking is enabled.  */
5722 
5723   if (warn_nonnull)
5724     warned_p = check_function_nonnull (loc, TYPE_ATTRIBUTES (fntype),
5725 				       nargs, argarray);
5726 
5727   /* Check for errors in format strings.  */
5728 
5729   if (warn_format || warn_suggest_attribute_format)
5730     check_function_format (fntype, TYPE_ATTRIBUTES (fntype), nargs, argarray,
5731 			   arglocs);
5732 
5733   if (warn_format)
5734     check_function_sentinel (fntype, nargs, argarray);
5735 
5736   if (fndecl && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL))
5737     {
5738       switch (DECL_FUNCTION_CODE (fndecl))
5739 	{
5740 	case BUILT_IN_SPRINTF:
5741 	case BUILT_IN_SPRINTF_CHK:
5742 	case BUILT_IN_SNPRINTF:
5743 	case BUILT_IN_SNPRINTF_CHK:
5744 	  /* Let the sprintf pass handle these.  */
5745 	  return warned_p;
5746 
5747 	default:
5748 	  break;
5749 	}
5750     }
5751 
5752   /* check_function_restrict sets the DECL_READ_P for arguments
5753      so it must be called unconditionally.  */
5754   warned_p |= check_function_restrict (fndecl, fntype, nargs, argarray);
5755 
5756   return warned_p;
5757 }
5758 
5759 /* Generic argument checking recursion routine.  PARAM is the argument to
5760    be checked.  PARAM_NUM is the number of the argument.  CALLBACK is invoked
5761    once the argument is resolved.  CTX is context for the callback.  */
5762 void
check_function_arguments_recurse(void (* callback)(void *,tree,unsigned HOST_WIDE_INT),void * ctx,tree param,unsigned HOST_WIDE_INT param_num)5763 check_function_arguments_recurse (void (*callback)
5764 				  (void *, tree, unsigned HOST_WIDE_INT),
5765 				  void *ctx, tree param,
5766 				  unsigned HOST_WIDE_INT param_num)
5767 {
5768   if (CONVERT_EXPR_P (param)
5769       && (TYPE_PRECISION (TREE_TYPE (param))
5770 	  == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (param, 0)))))
5771     {
5772       /* Strip coercion.  */
5773       check_function_arguments_recurse (callback, ctx,
5774 					TREE_OPERAND (param, 0), param_num);
5775       return;
5776     }
5777 
5778   if (TREE_CODE (param) == CALL_EXPR)
5779     {
5780       tree type = TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (param)));
5781       tree attrs;
5782       bool found_format_arg = false;
5783 
5784       /* See if this is a call to a known internationalization function
5785 	 that modifies a format arg.  Such a function may have multiple
5786 	 format_arg attributes (for example, ngettext).  */
5787 
5788       for (attrs = TYPE_ATTRIBUTES (type);
5789 	   attrs;
5790 	   attrs = TREE_CHAIN (attrs))
5791 	if (is_attribute_p ("format_arg", get_attribute_name (attrs)))
5792 	  {
5793 	    tree inner_arg;
5794 	    tree format_num_expr;
5795 	    int format_num;
5796 	    int i;
5797 	    call_expr_arg_iterator iter;
5798 
5799 	    /* Extract the argument number, which was previously checked
5800 	       to be valid.  */
5801 	    format_num_expr = TREE_VALUE (TREE_VALUE (attrs));
5802 
5803 	    format_num = tree_to_uhwi (format_num_expr);
5804 
5805 	    for (inner_arg = first_call_expr_arg (param, &iter), i = 1;
5806 		 inner_arg != NULL_TREE;
5807 		 inner_arg = next_call_expr_arg (&iter), i++)
5808 	      if (i == format_num)
5809 		{
5810 		  check_function_arguments_recurse (callback, ctx,
5811 						    inner_arg, param_num);
5812 		  found_format_arg = true;
5813 		  break;
5814 		}
5815 	  }
5816 
5817       /* If we found a format_arg attribute and did a recursive check,
5818 	 we are done with checking this argument.  Otherwise, we continue
5819 	 and this will be considered a non-literal.  */
5820       if (found_format_arg)
5821 	return;
5822     }
5823 
5824   if (TREE_CODE (param) == COND_EXPR)
5825     {
5826       /* Simplify to avoid warning for an impossible case.  */
5827       param = fold_for_warn (param);
5828       if (TREE_CODE (param) == COND_EXPR)
5829 	{
5830 	  /* Check both halves of the conditional expression.  */
5831 	  check_function_arguments_recurse (callback, ctx,
5832 					    TREE_OPERAND (param, 1),
5833 					    param_num);
5834 	  check_function_arguments_recurse (callback, ctx,
5835 					    TREE_OPERAND (param, 2),
5836 					    param_num);
5837 	  return;
5838 	}
5839     }
5840 
5841   (*callback) (ctx, param, param_num);
5842 }
5843 
5844 /* Checks for a builtin function FNDECL that the number of arguments
5845    NARGS against the required number REQUIRED and issues an error if
5846    there is a mismatch.  Returns true if the number of arguments is
5847    correct, otherwise false.  LOC is the location of FNDECL.  */
5848 
5849 static bool
builtin_function_validate_nargs(location_t loc,tree fndecl,int nargs,int required)5850 builtin_function_validate_nargs (location_t loc, tree fndecl, int nargs,
5851 				 int required)
5852 {
5853   if (nargs < required)
5854     {
5855       error_at (loc, "too few arguments to function %qE", fndecl);
5856       return false;
5857     }
5858   else if (nargs > required)
5859     {
5860       error_at (loc, "too many arguments to function %qE", fndecl);
5861       return false;
5862     }
5863   return true;
5864 }
5865 
5866 /* Helper macro for check_builtin_function_arguments.  */
5867 #define ARG_LOCATION(N)					\
5868   (arg_loc.is_empty ()					\
5869    ? EXPR_LOC_OR_LOC (args[(N)], input_location)	\
5870    : expansion_point_location (arg_loc[(N)]))
5871 
5872 /* Verifies the NARGS arguments ARGS to the builtin function FNDECL.
5873    Returns false if there was an error, otherwise true.  LOC is the
5874    location of the function; ARG_LOC is a vector of locations of the
5875    arguments.  If FNDECL is the result of resolving an overloaded
5876    target built-in, ORIG_FNDECL is the original function decl,
5877    otherwise it is null.  */
5878 
5879 bool
check_builtin_function_arguments(location_t loc,vec<location_t> arg_loc,tree fndecl,tree orig_fndecl,int nargs,tree * args)5880 check_builtin_function_arguments (location_t loc, vec<location_t> arg_loc,
5881 				  tree fndecl, tree orig_fndecl,
5882 				  int nargs, tree *args)
5883 {
5884   if (!fndecl_built_in_p (fndecl))
5885     return true;
5886 
5887   if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
5888     return (!targetm.check_builtin_call
5889 	    || targetm.check_builtin_call (loc, arg_loc, fndecl,
5890 					   orig_fndecl, nargs, args));
5891 
5892   if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_FRONTEND)
5893     return true;
5894 
5895   gcc_assert (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL);
5896   switch (DECL_FUNCTION_CODE (fndecl))
5897     {
5898     case BUILT_IN_ALLOCA_WITH_ALIGN_AND_MAX:
5899       if (!tree_fits_uhwi_p (args[2]))
5900 	{
5901 	  error_at (ARG_LOCATION (2),
5902 		    "third argument to function %qE must be a constant integer",
5903 		    fndecl);
5904 	  return false;
5905 	}
5906       /* fall through */
5907 
5908     case BUILT_IN_ALLOCA_WITH_ALIGN:
5909       {
5910 	/* Get the requested alignment (in bits) if it's a constant
5911 	   integer expression.  */
5912 	unsigned HOST_WIDE_INT align
5913 	  = tree_fits_uhwi_p (args[1]) ? tree_to_uhwi (args[1]) : 0;
5914 
5915 	/* Determine if the requested alignment is a power of 2.  */
5916 	if ((align & (align - 1)))
5917 	  align = 0;
5918 
5919 	/* The maximum alignment in bits corresponding to the same
5920 	   maximum in bytes enforced in check_user_alignment().  */
5921 	unsigned maxalign = (UINT_MAX >> 1) + 1;
5922 
5923 	/* Reject invalid alignments.  */
5924 	if (align < BITS_PER_UNIT || maxalign < align)
5925 	  {
5926 	    error_at (ARG_LOCATION (1),
5927 		      "second argument to function %qE must be a constant "
5928 		      "integer power of 2 between %qi and %qu bits",
5929 		      fndecl, BITS_PER_UNIT, maxalign);
5930 	    return false;
5931 	  }
5932 	return true;
5933       }
5934 
5935     case BUILT_IN_CONSTANT_P:
5936       return builtin_function_validate_nargs (loc, fndecl, nargs, 1);
5937 
5938     case BUILT_IN_ISFINITE:
5939     case BUILT_IN_ISINF:
5940     case BUILT_IN_ISINF_SIGN:
5941     case BUILT_IN_ISNAN:
5942     case BUILT_IN_ISNORMAL:
5943     case BUILT_IN_SIGNBIT:
5944       if (builtin_function_validate_nargs (loc, fndecl, nargs, 1))
5945 	{
5946 	  if (TREE_CODE (TREE_TYPE (args[0])) != REAL_TYPE)
5947 	    {
5948 	      error_at (ARG_LOCATION (0), "non-floating-point argument in "
5949 			"call to function %qE", fndecl);
5950 	      return false;
5951 	    }
5952 	  return true;
5953 	}
5954       return false;
5955 
5956     case BUILT_IN_ISGREATER:
5957     case BUILT_IN_ISGREATEREQUAL:
5958     case BUILT_IN_ISLESS:
5959     case BUILT_IN_ISLESSEQUAL:
5960     case BUILT_IN_ISLESSGREATER:
5961     case BUILT_IN_ISUNORDERED:
5962       if (builtin_function_validate_nargs (loc, fndecl, nargs, 2))
5963 	{
5964 	  enum tree_code code0, code1;
5965 	  code0 = TREE_CODE (TREE_TYPE (args[0]));
5966 	  code1 = TREE_CODE (TREE_TYPE (args[1]));
5967 	  if (!((code0 == REAL_TYPE && code1 == REAL_TYPE)
5968 		|| (code0 == REAL_TYPE && code1 == INTEGER_TYPE)
5969 		|| (code0 == INTEGER_TYPE && code1 == REAL_TYPE)))
5970 	    {
5971 	      error_at (loc, "non-floating-point arguments in call to "
5972 			"function %qE", fndecl);
5973 	      return false;
5974 	    }
5975 	  return true;
5976 	}
5977       return false;
5978 
5979     case BUILT_IN_FPCLASSIFY:
5980       if (builtin_function_validate_nargs (loc, fndecl, nargs, 6))
5981 	{
5982 	  for (unsigned int i = 0; i < 5; i++)
5983 	    if (TREE_CODE (args[i]) != INTEGER_CST)
5984 	      {
5985 		error_at (ARG_LOCATION (i), "non-const integer argument %u in "
5986 			  "call to function %qE", i + 1, fndecl);
5987 		return false;
5988 	      }
5989 
5990 	  if (TREE_CODE (TREE_TYPE (args[5])) != REAL_TYPE)
5991 	    {
5992 	      error_at (ARG_LOCATION (5), "non-floating-point argument in "
5993 			"call to function %qE", fndecl);
5994 	      return false;
5995 	    }
5996 	  return true;
5997 	}
5998       return false;
5999 
6000     case BUILT_IN_ASSUME_ALIGNED:
6001       if (builtin_function_validate_nargs (loc, fndecl, nargs, 2 + (nargs > 2)))
6002 	{
6003 	  if (nargs >= 3 && TREE_CODE (TREE_TYPE (args[2])) != INTEGER_TYPE)
6004 	    {
6005 	      error_at (ARG_LOCATION (2), "non-integer argument 3 in call to "
6006 			"function %qE", fndecl);
6007 	      return false;
6008 	    }
6009 	  return true;
6010 	}
6011       return false;
6012 
6013     case BUILT_IN_ADD_OVERFLOW:
6014     case BUILT_IN_SUB_OVERFLOW:
6015     case BUILT_IN_MUL_OVERFLOW:
6016       if (builtin_function_validate_nargs (loc, fndecl, nargs, 3))
6017 	{
6018 	  unsigned i;
6019 	  for (i = 0; i < 2; i++)
6020 	    if (!INTEGRAL_TYPE_P (TREE_TYPE (args[i])))
6021 	      {
6022 		error_at (ARG_LOCATION (i), "argument %u in call to function "
6023 			  "%qE does not have integral type", i + 1, fndecl);
6024 		return false;
6025 	      }
6026 	  if (TREE_CODE (TREE_TYPE (args[2])) != POINTER_TYPE
6027 	      || !INTEGRAL_TYPE_P (TREE_TYPE (TREE_TYPE (args[2]))))
6028 	    {
6029 	      error_at (ARG_LOCATION (2), "argument 3 in call to function %qE "
6030 			"does not have pointer to integral type", fndecl);
6031 	      return false;
6032 	    }
6033 	  else if (TREE_CODE (TREE_TYPE (TREE_TYPE (args[2]))) == ENUMERAL_TYPE)
6034 	    {
6035 	      error_at (ARG_LOCATION (2), "argument 3 in call to function %qE "
6036 			"has pointer to enumerated type", fndecl);
6037 	      return false;
6038 	    }
6039 	  else if (TREE_CODE (TREE_TYPE (TREE_TYPE (args[2]))) == BOOLEAN_TYPE)
6040 	    {
6041 	      error_at (ARG_LOCATION (2), "argument 3 in call to function %qE "
6042 			"has pointer to boolean type", fndecl);
6043 	      return false;
6044 	    }
6045 	  else if (TYPE_READONLY (TREE_TYPE (TREE_TYPE (args[2]))))
6046 	    {
6047 	      error_at (ARG_LOCATION (2), "argument 3 in call to function %qE "
6048 			"has pointer to %<const%> type (%qT)", fndecl,
6049 			TREE_TYPE (args[2]));
6050 	      return false;
6051 	    }
6052 	  return true;
6053 	}
6054       return false;
6055 
6056     case BUILT_IN_ADD_OVERFLOW_P:
6057     case BUILT_IN_SUB_OVERFLOW_P:
6058     case BUILT_IN_MUL_OVERFLOW_P:
6059       if (builtin_function_validate_nargs (loc, fndecl, nargs, 3))
6060 	{
6061 	  unsigned i;
6062 	  for (i = 0; i < 3; i++)
6063 	    if (!INTEGRAL_TYPE_P (TREE_TYPE (args[i])))
6064 	      {
6065 		error_at (ARG_LOCATION (i), "argument %u in call to function "
6066 			  "%qE does not have integral type", i + 1, fndecl);
6067 		return false;
6068 	      }
6069 	  if (TREE_CODE (TREE_TYPE (args[2])) == ENUMERAL_TYPE)
6070 	    {
6071 	      error_at (ARG_LOCATION (2), "argument 3 in call to function "
6072 			"%qE has enumerated type", fndecl);
6073 	      return false;
6074 	    }
6075 	  else if (TREE_CODE (TREE_TYPE (args[2])) == BOOLEAN_TYPE)
6076 	    {
6077 	      error_at (ARG_LOCATION (2), "argument 3 in call to function "
6078 			"%qE has boolean type", fndecl);
6079 	      return false;
6080 	    }
6081 	  return true;
6082 	}
6083       return false;
6084 
6085     default:
6086       return true;
6087     }
6088 }
6089 
6090 /* Subroutine of c_parse_error.
6091    Return the result of concatenating LHS and RHS. RHS is really
6092    a string literal, its first character is indicated by RHS_START and
6093    RHS_SIZE is its length (including the terminating NUL character).
6094 
6095    The caller is responsible for deleting the returned pointer.  */
6096 
6097 static char *
catenate_strings(const char * lhs,const char * rhs_start,int rhs_size)6098 catenate_strings (const char *lhs, const char *rhs_start, int rhs_size)
6099 {
6100   const size_t lhs_size = strlen (lhs);
6101   char *result = XNEWVEC (char, lhs_size + rhs_size);
6102   memcpy (result, lhs, lhs_size);
6103   memcpy (result + lhs_size, rhs_start, rhs_size);
6104   return result;
6105 }
6106 
6107 /* Issue the error given by GMSGID at RICHLOC, indicating that it occurred
6108    before TOKEN, which had the associated VALUE.  */
6109 
6110 void
c_parse_error(const char * gmsgid,enum cpp_ttype token_type,tree value,unsigned char token_flags,rich_location * richloc)6111 c_parse_error (const char *gmsgid, enum cpp_ttype token_type,
6112 	       tree value, unsigned char token_flags,
6113 	       rich_location *richloc)
6114 {
6115 #define catenate_messages(M1, M2) catenate_strings ((M1), (M2), sizeof (M2))
6116 
6117   char *message = NULL;
6118 
6119   if (token_type == CPP_EOF)
6120     message = catenate_messages (gmsgid, " at end of input");
6121   else if (token_type == CPP_CHAR
6122 	   || token_type == CPP_WCHAR
6123 	   || token_type == CPP_CHAR16
6124 	   || token_type == CPP_CHAR32
6125 	   || token_type == CPP_UTF8CHAR)
6126     {
6127       unsigned int val = TREE_INT_CST_LOW (value);
6128       const char *prefix;
6129 
6130       switch (token_type)
6131 	{
6132 	default:
6133 	  prefix = "";
6134 	  break;
6135 	case CPP_WCHAR:
6136 	  prefix = "L";
6137 	  break;
6138 	case CPP_CHAR16:
6139 	  prefix = "u";
6140 	  break;
6141 	case CPP_CHAR32:
6142 	  prefix = "U";
6143 	  break;
6144 	case CPP_UTF8CHAR:
6145 	  prefix = "u8";
6146 	  break;
6147         }
6148 
6149       if (val <= UCHAR_MAX && ISGRAPH (val))
6150 	message = catenate_messages (gmsgid, " before %s'%c'");
6151       else
6152 	message = catenate_messages (gmsgid, " before %s'\\x%x'");
6153 
6154       error_at (richloc, message, prefix, val);
6155       free (message);
6156       message = NULL;
6157     }
6158   else if (token_type == CPP_CHAR_USERDEF
6159 	   || token_type == CPP_WCHAR_USERDEF
6160 	   || token_type == CPP_CHAR16_USERDEF
6161 	   || token_type == CPP_CHAR32_USERDEF
6162 	   || token_type == CPP_UTF8CHAR_USERDEF)
6163     message = catenate_messages (gmsgid,
6164 				 " before user-defined character literal");
6165   else if (token_type == CPP_STRING_USERDEF
6166 	   || token_type == CPP_WSTRING_USERDEF
6167 	   || token_type == CPP_STRING16_USERDEF
6168 	   || token_type == CPP_STRING32_USERDEF
6169 	   || token_type == CPP_UTF8STRING_USERDEF)
6170     message = catenate_messages (gmsgid, " before user-defined string literal");
6171   else if (token_type == CPP_STRING
6172 	   || token_type == CPP_WSTRING
6173 	   || token_type == CPP_STRING16
6174 	   || token_type == CPP_STRING32
6175 	   || token_type == CPP_UTF8STRING)
6176     message = catenate_messages (gmsgid, " before string constant");
6177   else if (token_type == CPP_NUMBER)
6178     message = catenate_messages (gmsgid, " before numeric constant");
6179   else if (token_type == CPP_NAME)
6180     {
6181       message = catenate_messages (gmsgid, " before %qE");
6182       error_at (richloc, message, value);
6183       free (message);
6184       message = NULL;
6185     }
6186   else if (token_type == CPP_PRAGMA)
6187     message = catenate_messages (gmsgid, " before %<#pragma%>");
6188   else if (token_type == CPP_PRAGMA_EOL)
6189     message = catenate_messages (gmsgid, " before end of line");
6190   else if (token_type == CPP_DECLTYPE)
6191     message = catenate_messages (gmsgid, " before %<decltype%>");
6192   else if (token_type < N_TTYPES)
6193     {
6194       message = catenate_messages (gmsgid, " before %qs token");
6195       error_at (richloc, message, cpp_type2name (token_type, token_flags));
6196       free (message);
6197       message = NULL;
6198     }
6199   else
6200     error_at (richloc, gmsgid);
6201 
6202   if (message)
6203     {
6204       error_at (richloc, message);
6205       free (message);
6206     }
6207 #undef catenate_messages
6208 }
6209 
6210 /* Return the gcc option code associated with the reason for a cpp
6211    message, or 0 if none.  */
6212 
6213 static int
c_option_controlling_cpp_diagnostic(enum cpp_warning_reason reason)6214 c_option_controlling_cpp_diagnostic (enum cpp_warning_reason reason)
6215 {
6216   const struct cpp_reason_option_codes_t *entry;
6217 
6218   for (entry = cpp_reason_option_codes; entry->reason != CPP_W_NONE; entry++)
6219     {
6220       if (entry->reason == reason)
6221 	return entry->option_code;
6222     }
6223   return 0;
6224 }
6225 
6226 /* Callback from cpp_diagnostic for PFILE to print diagnostics from the
6227    preprocessor.  The diagnostic is of type LEVEL, with REASON set
6228    to the reason code if LEVEL is represents a warning, at location
6229    RICHLOC unless this is after lexing and the compiler's location
6230    should be used instead; MSG is the translated message and AP
6231    the arguments.  Returns true if a diagnostic was emitted, false
6232    otherwise.  */
6233 
6234 bool
c_cpp_diagnostic(cpp_reader * pfile ATTRIBUTE_UNUSED,enum cpp_diagnostic_level level,enum cpp_warning_reason reason,rich_location * richloc,const char * msg,va_list * ap)6235 c_cpp_diagnostic (cpp_reader *pfile ATTRIBUTE_UNUSED,
6236 		  enum cpp_diagnostic_level level,
6237 		  enum cpp_warning_reason reason,
6238 		  rich_location *richloc,
6239 		  const char *msg, va_list *ap)
6240 {
6241   diagnostic_info diagnostic;
6242   diagnostic_t dlevel;
6243   bool save_warn_system_headers = global_dc->dc_warn_system_headers;
6244   bool ret;
6245 
6246   switch (level)
6247     {
6248     case CPP_DL_WARNING_SYSHDR:
6249       if (flag_no_output)
6250 	return false;
6251       global_dc->dc_warn_system_headers = 1;
6252       /* Fall through.  */
6253     case CPP_DL_WARNING:
6254       if (flag_no_output)
6255 	return false;
6256       dlevel = DK_WARNING;
6257       break;
6258     case CPP_DL_PEDWARN:
6259       if (flag_no_output && !flag_pedantic_errors)
6260 	return false;
6261       dlevel = DK_PEDWARN;
6262       break;
6263     case CPP_DL_ERROR:
6264       dlevel = DK_ERROR;
6265       break;
6266     case CPP_DL_ICE:
6267       dlevel = DK_ICE;
6268       break;
6269     case CPP_DL_NOTE:
6270       dlevel = DK_NOTE;
6271       break;
6272     case CPP_DL_FATAL:
6273       dlevel = DK_FATAL;
6274       break;
6275     default:
6276       gcc_unreachable ();
6277     }
6278   if (done_lexing)
6279     richloc->set_range (0, input_location, SHOW_RANGE_WITH_CARET);
6280   diagnostic_set_info_translated (&diagnostic, msg, ap,
6281 				  richloc, dlevel);
6282   diagnostic_override_option_index
6283     (&diagnostic,
6284      c_option_controlling_cpp_diagnostic (reason));
6285   ret = diagnostic_report_diagnostic (global_dc, &diagnostic);
6286   if (level == CPP_DL_WARNING_SYSHDR)
6287     global_dc->dc_warn_system_headers = save_warn_system_headers;
6288   return ret;
6289 }
6290 
6291 /* Convert a character from the host to the target execution character
6292    set.  cpplib handles this, mostly.  */
6293 
6294 HOST_WIDE_INT
c_common_to_target_charset(HOST_WIDE_INT c)6295 c_common_to_target_charset (HOST_WIDE_INT c)
6296 {
6297   /* Character constants in GCC proper are sign-extended under -fsigned-char,
6298      zero-extended under -fno-signed-char.  cpplib insists that characters
6299      and character constants are always unsigned.  Hence we must convert
6300      back and forth.  */
6301   cppchar_t uc = ((cppchar_t)c) & ((((cppchar_t)1) << CHAR_BIT)-1);
6302 
6303   uc = cpp_host_to_exec_charset (parse_in, uc);
6304 
6305   if (flag_signed_char)
6306     return ((HOST_WIDE_INT)uc) << (HOST_BITS_PER_WIDE_INT - CHAR_TYPE_SIZE)
6307 			       >> (HOST_BITS_PER_WIDE_INT - CHAR_TYPE_SIZE);
6308   else
6309     return uc;
6310 }
6311 
6312 /* Fold an offsetof-like expression.  EXPR is a nested sequence of component
6313    references with an INDIRECT_REF of a constant at the bottom; much like the
6314    traditional rendering of offsetof as a macro.  TYPE is the desired type of
6315    the whole expression.  Return the folded result.  */
6316 
6317 tree
fold_offsetof(tree expr,tree type,enum tree_code ctx)6318 fold_offsetof (tree expr, tree type, enum tree_code ctx)
6319 {
6320   tree base, off, t;
6321   tree_code code = TREE_CODE (expr);
6322   switch (code)
6323     {
6324     case ERROR_MARK:
6325       return expr;
6326 
6327     case VAR_DECL:
6328       error ("cannot apply %<offsetof%> to static data member %qD", expr);
6329       return error_mark_node;
6330 
6331     case CALL_EXPR:
6332     case TARGET_EXPR:
6333       error ("cannot apply %<offsetof%> when %<operator[]%> is overloaded");
6334       return error_mark_node;
6335 
6336     case NOP_EXPR:
6337     case INDIRECT_REF:
6338       if (!TREE_CONSTANT (TREE_OPERAND (expr, 0)))
6339 	{
6340 	  error ("cannot apply %<offsetof%> to a non constant address");
6341 	  return error_mark_node;
6342 	}
6343       return convert (type, TREE_OPERAND (expr, 0));
6344 
6345     case COMPONENT_REF:
6346       base = fold_offsetof (TREE_OPERAND (expr, 0), type, code);
6347       if (base == error_mark_node)
6348 	return base;
6349 
6350       t = TREE_OPERAND (expr, 1);
6351       if (DECL_C_BIT_FIELD (t))
6352 	{
6353 	  error ("attempt to take address of bit-field structure "
6354 		 "member %qD", t);
6355 	  return error_mark_node;
6356 	}
6357       off = size_binop_loc (input_location, PLUS_EXPR, DECL_FIELD_OFFSET (t),
6358 			    size_int (tree_to_uhwi (DECL_FIELD_BIT_OFFSET (t))
6359 				      / BITS_PER_UNIT));
6360       break;
6361 
6362     case ARRAY_REF:
6363       base = fold_offsetof (TREE_OPERAND (expr, 0), type, code);
6364       if (base == error_mark_node)
6365 	return base;
6366 
6367       t = TREE_OPERAND (expr, 1);
6368       STRIP_ANY_LOCATION_WRAPPER (t);
6369 
6370       /* Check if the offset goes beyond the upper bound of the array.  */
6371       if (TREE_CODE (t) == INTEGER_CST && tree_int_cst_sgn (t) >= 0)
6372 	{
6373 	  tree upbound = array_ref_up_bound (expr);
6374 	  if (upbound != NULL_TREE
6375 	      && TREE_CODE (upbound) == INTEGER_CST
6376 	      && !tree_int_cst_equal (upbound,
6377 				      TYPE_MAX_VALUE (TREE_TYPE (upbound))))
6378 	    {
6379 	      if (ctx != ARRAY_REF && ctx != COMPONENT_REF)
6380 	        upbound = size_binop (PLUS_EXPR, upbound,
6381 				      build_int_cst (TREE_TYPE (upbound), 1));
6382 	      if (tree_int_cst_lt (upbound, t))
6383 		{
6384 		  tree v;
6385 
6386 		  for (v = TREE_OPERAND (expr, 0);
6387 		       TREE_CODE (v) == COMPONENT_REF;
6388 		       v = TREE_OPERAND (v, 0))
6389 		    if (TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0)))
6390 			== RECORD_TYPE)
6391 		      {
6392 			tree fld_chain = DECL_CHAIN (TREE_OPERAND (v, 1));
6393 			for (; fld_chain; fld_chain = DECL_CHAIN (fld_chain))
6394 			  if (TREE_CODE (fld_chain) == FIELD_DECL)
6395 			    break;
6396 
6397 			if (fld_chain)
6398 			  break;
6399 		      }
6400 		  /* Don't warn if the array might be considered a poor
6401 		     man's flexible array member with a very permissive
6402 		     definition thereof.  */
6403 		  if (TREE_CODE (v) == ARRAY_REF
6404 		      || TREE_CODE (v) == COMPONENT_REF)
6405 		    warning (OPT_Warray_bounds,
6406 			     "index %E denotes an offset "
6407 			     "greater than size of %qT",
6408 			     t, TREE_TYPE (TREE_OPERAND (expr, 0)));
6409 		}
6410 	    }
6411 	}
6412 
6413       t = convert (sizetype, t);
6414       off = size_binop (MULT_EXPR, TYPE_SIZE_UNIT (TREE_TYPE (expr)), t);
6415       break;
6416 
6417     case COMPOUND_EXPR:
6418       /* Handle static members of volatile structs.  */
6419       t = TREE_OPERAND (expr, 1);
6420       gcc_checking_assert (VAR_P (get_base_address (t)));
6421       return fold_offsetof (t, type);
6422 
6423     default:
6424       gcc_unreachable ();
6425     }
6426 
6427   if (!POINTER_TYPE_P (type))
6428     return size_binop (PLUS_EXPR, base, convert (type, off));
6429   return fold_build_pointer_plus (base, off);
6430 }
6431 
6432 /* *PTYPE is an incomplete array.  Complete it with a domain based on
6433    INITIAL_VALUE.  If INITIAL_VALUE is not present, use 1 if DO_DEFAULT
6434    is true.  Return 0 if successful, 1 if INITIAL_VALUE can't be deciphered,
6435    2 if INITIAL_VALUE was NULL, and 3 if INITIAL_VALUE was empty.  */
6436 
6437 int
complete_array_type(tree * ptype,tree initial_value,bool do_default)6438 complete_array_type (tree *ptype, tree initial_value, bool do_default)
6439 {
6440   tree maxindex, type, main_type, elt, unqual_elt;
6441   int failure = 0, quals;
6442   bool overflow_p = false;
6443 
6444   maxindex = size_zero_node;
6445   if (initial_value)
6446     {
6447       STRIP_ANY_LOCATION_WRAPPER (initial_value);
6448 
6449       if (TREE_CODE (initial_value) == STRING_CST)
6450 	{
6451 	  int eltsize
6452 	    = int_size_in_bytes (TREE_TYPE (TREE_TYPE (initial_value)));
6453 	  maxindex = size_int (TREE_STRING_LENGTH (initial_value)/eltsize - 1);
6454 	}
6455       else if (TREE_CODE (initial_value) == CONSTRUCTOR)
6456 	{
6457 	  vec<constructor_elt, va_gc> *v = CONSTRUCTOR_ELTS (initial_value);
6458 
6459 	  if (vec_safe_is_empty (v))
6460 	    {
6461 	      if (pedantic)
6462 		failure = 3;
6463 	      maxindex = ssize_int (-1);
6464 	    }
6465 	  else
6466 	    {
6467 	      tree curindex;
6468 	      unsigned HOST_WIDE_INT cnt;
6469 	      constructor_elt *ce;
6470 	      bool fold_p = false;
6471 
6472 	      if ((*v)[0].index)
6473 		maxindex = (*v)[0].index, fold_p = true;
6474 
6475 	      curindex = maxindex;
6476 
6477 	      for (cnt = 1; vec_safe_iterate (v, cnt, &ce); cnt++)
6478 		{
6479 		  bool curfold_p = false;
6480 		  if (ce->index)
6481 		    curindex = ce->index, curfold_p = true;
6482 		  else
6483 		    {
6484 		      if (fold_p)
6485 			{
6486 			  /* Since we treat size types now as ordinary
6487 			     unsigned types, we need an explicit overflow
6488 			     check.  */
6489 			  tree orig = curindex;
6490 		          curindex = fold_convert (sizetype, curindex);
6491 			  overflow_p |= tree_int_cst_lt (curindex, orig);
6492 			}
6493 		      curindex = size_binop (PLUS_EXPR, curindex,
6494 					     size_one_node);
6495 		    }
6496 		  if (tree_int_cst_lt (maxindex, curindex))
6497 		    maxindex = curindex, fold_p = curfold_p;
6498 		}
6499 	      if (fold_p)
6500 		{
6501 		  tree orig = maxindex;
6502 	          maxindex = fold_convert (sizetype, maxindex);
6503 		  overflow_p |= tree_int_cst_lt (maxindex, orig);
6504 		}
6505 	    }
6506 	}
6507       else
6508 	{
6509 	  /* Make an error message unless that happened already.  */
6510 	  if (initial_value != error_mark_node)
6511 	    failure = 1;
6512 	}
6513     }
6514   else
6515     {
6516       failure = 2;
6517       if (!do_default)
6518 	return failure;
6519     }
6520 
6521   type = *ptype;
6522   elt = TREE_TYPE (type);
6523   quals = TYPE_QUALS (strip_array_types (elt));
6524   if (quals == 0)
6525     unqual_elt = elt;
6526   else
6527     unqual_elt = c_build_qualified_type (elt, KEEP_QUAL_ADDR_SPACE (quals));
6528 
6529   /* Using build_distinct_type_copy and modifying things afterward instead
6530      of using build_array_type to create a new type preserves all of the
6531      TYPE_LANG_FLAG_? bits that the front end may have set.  */
6532   main_type = build_distinct_type_copy (TYPE_MAIN_VARIANT (type));
6533   TREE_TYPE (main_type) = unqual_elt;
6534   TYPE_DOMAIN (main_type)
6535     = build_range_type (TREE_TYPE (maxindex),
6536 			build_int_cst (TREE_TYPE (maxindex), 0), maxindex);
6537   TYPE_TYPELESS_STORAGE (main_type) = TYPE_TYPELESS_STORAGE (type);
6538   layout_type (main_type);
6539 
6540   /* Make sure we have the canonical MAIN_TYPE. */
6541   hashval_t hashcode = type_hash_canon_hash (main_type);
6542   main_type = type_hash_canon (hashcode, main_type);
6543 
6544   /* Fix the canonical type.  */
6545   if (TYPE_STRUCTURAL_EQUALITY_P (TREE_TYPE (main_type))
6546       || TYPE_STRUCTURAL_EQUALITY_P (TYPE_DOMAIN (main_type)))
6547     SET_TYPE_STRUCTURAL_EQUALITY (main_type);
6548   else if (TYPE_CANONICAL (TREE_TYPE (main_type)) != TREE_TYPE (main_type)
6549 	   || (TYPE_CANONICAL (TYPE_DOMAIN (main_type))
6550 	       != TYPE_DOMAIN (main_type)))
6551     TYPE_CANONICAL (main_type)
6552       = build_array_type (TYPE_CANONICAL (TREE_TYPE (main_type)),
6553 			  TYPE_CANONICAL (TYPE_DOMAIN (main_type)),
6554 			  TYPE_TYPELESS_STORAGE (main_type));
6555   else
6556     TYPE_CANONICAL (main_type) = main_type;
6557 
6558   if (quals == 0)
6559     type = main_type;
6560   else
6561     type = c_build_qualified_type (main_type, quals);
6562 
6563   if (COMPLETE_TYPE_P (type)
6564       && TREE_CODE (TYPE_SIZE_UNIT (type)) == INTEGER_CST
6565       && (overflow_p || TREE_OVERFLOW (TYPE_SIZE_UNIT (type))))
6566     {
6567       error ("size of array is too large");
6568       /* If we proceed with the array type as it is, we'll eventually
6569 	 crash in tree_to_[su]hwi().  */
6570       type = error_mark_node;
6571     }
6572 
6573   *ptype = type;
6574   return failure;
6575 }
6576 
6577 /* INIT is an constructor of a structure with a flexible array member.
6578    Complete the flexible array member with a domain based on it's value.  */
6579 void
complete_flexible_array_elts(tree init)6580 complete_flexible_array_elts (tree init)
6581 {
6582   tree elt, type;
6583 
6584   if (init == NULL_TREE || TREE_CODE (init) != CONSTRUCTOR)
6585     return;
6586 
6587   if (vec_safe_is_empty (CONSTRUCTOR_ELTS (init)))
6588     return;
6589 
6590   elt = CONSTRUCTOR_ELTS (init)->last ().value;
6591   type = TREE_TYPE (elt);
6592   if (TREE_CODE (type) == ARRAY_TYPE
6593       && TYPE_SIZE (type) == NULL_TREE)
6594     complete_array_type (&TREE_TYPE (elt), elt, false);
6595   else
6596     complete_flexible_array_elts (elt);
6597 }
6598 
6599 /* Like c_mark_addressable but don't check register qualifier.  */
6600 void
c_common_mark_addressable_vec(tree t)6601 c_common_mark_addressable_vec (tree t)
6602 {
6603   if (TREE_CODE (t) == C_MAYBE_CONST_EXPR)
6604     t = C_MAYBE_CONST_EXPR_EXPR (t);
6605   while (handled_component_p (t))
6606     t = TREE_OPERAND (t, 0);
6607   if (!VAR_P (t)
6608       && TREE_CODE (t) != PARM_DECL
6609       && TREE_CODE (t) != COMPOUND_LITERAL_EXPR)
6610     return;
6611   if (!VAR_P (t) || !DECL_HARD_REGISTER (t))
6612     TREE_ADDRESSABLE (t) = 1;
6613   if (TREE_CODE (t) == COMPOUND_LITERAL_EXPR)
6614     TREE_ADDRESSABLE (COMPOUND_LITERAL_EXPR_DECL (t)) = 1;
6615 }
6616 
6617 
6618 
6619 /* Used to help initialize the builtin-types.def table.  When a type of
6620    the correct size doesn't exist, use error_mark_node instead of NULL.
6621    The later results in segfaults even when a decl using the type doesn't
6622    get invoked.  */
6623 
6624 tree
builtin_type_for_size(int size,bool unsignedp)6625 builtin_type_for_size (int size, bool unsignedp)
6626 {
6627   tree type = c_common_type_for_size (size, unsignedp);
6628   return type ? type : error_mark_node;
6629 }
6630 
6631 /* Work out the size of the first argument of a call to
6632    __builtin_speculation_safe_value.  Only pointers and integral types
6633    are permitted.  Return -1 if the argument type is not supported or
6634    the size is too large; 0 if the argument type is a pointer or the
6635    size if it is integral.  */
6636 static enum built_in_function
speculation_safe_value_resolve_call(tree function,vec<tree,va_gc> * params)6637 speculation_safe_value_resolve_call (tree function, vec<tree, va_gc> *params)
6638 {
6639   /* Type of the argument.  */
6640   tree type;
6641   int size;
6642 
6643   if (vec_safe_is_empty (params))
6644     {
6645       error ("too few arguments to function %qE", function);
6646       return BUILT_IN_NONE;
6647     }
6648 
6649   type = TREE_TYPE ((*params)[0]);
6650   if (TREE_CODE (type) == ARRAY_TYPE && c_dialect_cxx ())
6651     {
6652       /* Force array-to-pointer decay for C++.   */
6653       (*params)[0] = default_conversion ((*params)[0]);
6654       type = TREE_TYPE ((*params)[0]);
6655     }
6656 
6657   if (POINTER_TYPE_P (type))
6658     return BUILT_IN_SPECULATION_SAFE_VALUE_PTR;
6659 
6660   if (!INTEGRAL_TYPE_P (type))
6661     goto incompatible;
6662 
6663   if (!COMPLETE_TYPE_P (type))
6664     goto incompatible;
6665 
6666   size = tree_to_uhwi (TYPE_SIZE_UNIT (type));
6667   if (size == 1 || size == 2 || size == 4 || size == 8 || size == 16)
6668     return ((enum built_in_function)
6669 	    ((int) BUILT_IN_SPECULATION_SAFE_VALUE_1 + exact_log2 (size)));
6670 
6671  incompatible:
6672   /* Issue the diagnostic only if the argument is valid, otherwise
6673      it would be redundant at best and could be misleading.  */
6674   if (type != error_mark_node)
6675     error ("operand type %qT is incompatible with argument %d of %qE",
6676 	   type, 1, function);
6677 
6678   return BUILT_IN_NONE;
6679 }
6680 
6681 /* Validate and coerce PARAMS, the arguments to ORIG_FUNCTION to fit
6682    the prototype for FUNCTION.  The first argument is mandatory, a second
6683    argument, if present, must be type compatible with the first.  */
6684 static bool
speculation_safe_value_resolve_params(location_t loc,tree orig_function,vec<tree,va_gc> * params)6685 speculation_safe_value_resolve_params (location_t loc, tree orig_function,
6686 				       vec<tree, va_gc> *params)
6687 {
6688   tree val;
6689 
6690   if (params->length () == 0)
6691     {
6692       error_at (loc, "too few arguments to function %qE", orig_function);
6693       return false;
6694     }
6695 
6696   else if (params->length () > 2)
6697     {
6698       error_at (loc, "too many arguments to function %qE", orig_function);
6699       return false;
6700     }
6701 
6702   val = (*params)[0];
6703   if (TREE_CODE (TREE_TYPE (val)) == ARRAY_TYPE)
6704     val = default_conversion (val);
6705   if (!(TREE_CODE (TREE_TYPE (val)) == POINTER_TYPE
6706 	|| TREE_CODE (TREE_TYPE (val)) == INTEGER_TYPE))
6707     {
6708       error_at (loc,
6709 		"expecting argument of type pointer or of type integer "
6710 		"for argument 1");
6711       return false;
6712     }
6713   (*params)[0] = val;
6714 
6715   if (params->length () == 2)
6716     {
6717       tree val2 = (*params)[1];
6718       if (TREE_CODE (TREE_TYPE (val2)) == ARRAY_TYPE)
6719 	val2 = default_conversion (val2);
6720       if (error_operand_p (val2))
6721 	return false;
6722       if (!(TREE_TYPE (val) == TREE_TYPE (val2)
6723 	    || useless_type_conversion_p (TREE_TYPE (val), TREE_TYPE (val2))))
6724 	{
6725 	  error_at (loc, "both arguments must be compatible");
6726 	  return false;
6727 	}
6728       (*params)[1] = val2;
6729     }
6730 
6731   return true;
6732 }
6733 
6734 /* Cast the result of the builtin back to the type of the first argument,
6735    preserving any qualifiers that it might have.  */
6736 static tree
speculation_safe_value_resolve_return(tree first_param,tree result)6737 speculation_safe_value_resolve_return (tree first_param, tree result)
6738 {
6739   tree ptype = TREE_TYPE (first_param);
6740   tree rtype = TREE_TYPE (result);
6741   ptype = TYPE_MAIN_VARIANT (ptype);
6742 
6743   if (tree_int_cst_equal (TYPE_SIZE (ptype), TYPE_SIZE (rtype)))
6744     return convert (ptype, result);
6745 
6746   return result;
6747 }
6748 
6749 /* A helper function for resolve_overloaded_builtin in resolving the
6750    overloaded __sync_ builtins.  Returns a positive power of 2 if the
6751    first operand of PARAMS is a pointer to a supported data type.
6752    Returns 0 if an error is encountered.
6753    FETCH is true when FUNCTION is one of the _FETCH_OP_ or _OP_FETCH_
6754    built-ins.  */
6755 
6756 static int
sync_resolve_size(tree function,vec<tree,va_gc> * params,bool fetch)6757 sync_resolve_size (tree function, vec<tree, va_gc> *params, bool fetch)
6758 {
6759   /* Type of the argument.  */
6760   tree argtype;
6761   /* Type the argument points to.  */
6762   tree type;
6763   int size;
6764 
6765   if (vec_safe_is_empty (params))
6766     {
6767       error ("too few arguments to function %qE", function);
6768       return 0;
6769     }
6770 
6771   argtype = type = TREE_TYPE ((*params)[0]);
6772   if (TREE_CODE (type) == ARRAY_TYPE && c_dialect_cxx ())
6773     {
6774       /* Force array-to-pointer decay for C++.  */
6775       (*params)[0] = default_conversion ((*params)[0]);
6776       type = TREE_TYPE ((*params)[0]);
6777     }
6778   if (TREE_CODE (type) != POINTER_TYPE)
6779     goto incompatible;
6780 
6781   type = TREE_TYPE (type);
6782   if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type))
6783     goto incompatible;
6784 
6785   if (!COMPLETE_TYPE_P (type))
6786     goto incompatible;
6787 
6788   if (fetch && TREE_CODE (type) == BOOLEAN_TYPE)
6789     goto incompatible;
6790 
6791   size = tree_to_uhwi (TYPE_SIZE_UNIT (type));
6792   if (size == 1 || size == 2 || size == 4 || size == 8 || size == 16)
6793     return size;
6794 
6795  incompatible:
6796   /* Issue the diagnostic only if the argument is valid, otherwise
6797      it would be redundant at best and could be misleading.  */
6798   if (argtype != error_mark_node)
6799     error ("operand type %qT is incompatible with argument %d of %qE",
6800 	   argtype, 1, function);
6801   return 0;
6802 }
6803 
6804 /* A helper function for resolve_overloaded_builtin.  Adds casts to
6805    PARAMS to make arguments match up with those of FUNCTION.  Drops
6806    the variadic arguments at the end.  Returns false if some error
6807    was encountered; true on success.  */
6808 
6809 static bool
sync_resolve_params(location_t loc,tree orig_function,tree function,vec<tree,va_gc> * params,bool orig_format)6810 sync_resolve_params (location_t loc, tree orig_function, tree function,
6811 		     vec<tree, va_gc> *params, bool orig_format)
6812 {
6813   function_args_iterator iter;
6814   tree ptype;
6815   unsigned int parmnum;
6816 
6817   function_args_iter_init (&iter, TREE_TYPE (function));
6818   /* We've declared the implementation functions to use "volatile void *"
6819      as the pointer parameter, so we shouldn't get any complaints from the
6820      call to check_function_arguments what ever type the user used.  */
6821   function_args_iter_next (&iter);
6822   ptype = TREE_TYPE (TREE_TYPE ((*params)[0]));
6823   ptype = TYPE_MAIN_VARIANT (ptype);
6824 
6825   /* For the rest of the values, we need to cast these to FTYPE, so that we
6826      don't get warnings for passing pointer types, etc.  */
6827   parmnum = 0;
6828   while (1)
6829     {
6830       tree val, arg_type;
6831 
6832       arg_type = function_args_iter_cond (&iter);
6833       /* XXX void_type_node belies the abstraction.  */
6834       if (arg_type == void_type_node)
6835 	break;
6836 
6837       ++parmnum;
6838       if (params->length () <= parmnum)
6839 	{
6840 	  error_at (loc, "too few arguments to function %qE", orig_function);
6841 	  return false;
6842 	}
6843 
6844       /* Only convert parameters if arg_type is unsigned integer type with
6845 	 new format sync routines, i.e. don't attempt to convert pointer
6846 	 arguments (e.g. EXPECTED argument of __atomic_compare_exchange_n),
6847 	 bool arguments (e.g. WEAK argument) or signed int arguments (memmodel
6848 	 kinds).  */
6849       if (TREE_CODE (arg_type) == INTEGER_TYPE && TYPE_UNSIGNED (arg_type))
6850 	{
6851 	  /* Ideally for the first conversion we'd use convert_for_assignment
6852 	     so that we get warnings for anything that doesn't match the pointer
6853 	     type.  This isn't portable across the C and C++ front ends atm.  */
6854 	  val = (*params)[parmnum];
6855 	  val = convert (ptype, val);
6856 	  val = convert (arg_type, val);
6857 	  (*params)[parmnum] = val;
6858 	}
6859 
6860       function_args_iter_next (&iter);
6861     }
6862 
6863   /* __atomic routines are not variadic.  */
6864   if (!orig_format && params->length () != parmnum + 1)
6865     {
6866       error_at (loc, "too many arguments to function %qE", orig_function);
6867       return false;
6868     }
6869 
6870   /* The definition of these primitives is variadic, with the remaining
6871      being "an optional list of variables protected by the memory barrier".
6872      No clue what that's supposed to mean, precisely, but we consider all
6873      call-clobbered variables to be protected so we're safe.  */
6874   params->truncate (parmnum + 1);
6875 
6876   return true;
6877 }
6878 
6879 /* A helper function for resolve_overloaded_builtin.  Adds a cast to
6880    RESULT to make it match the type of the first pointer argument in
6881    PARAMS.  */
6882 
6883 static tree
sync_resolve_return(tree first_param,tree result,bool orig_format)6884 sync_resolve_return (tree first_param, tree result, bool orig_format)
6885 {
6886   tree ptype = TREE_TYPE (TREE_TYPE (first_param));
6887   tree rtype = TREE_TYPE (result);
6888   ptype = TYPE_MAIN_VARIANT (ptype);
6889 
6890   /* New format doesn't require casting unless the types are the same size.  */
6891   if (orig_format || tree_int_cst_equal (TYPE_SIZE (ptype), TYPE_SIZE (rtype)))
6892     return convert (ptype, result);
6893   else
6894     return result;
6895 }
6896 
6897 /* This function verifies the PARAMS to generic atomic FUNCTION.
6898    It returns the size if all the parameters are the same size, otherwise
6899    0 is returned if the parameters are invalid.  */
6900 
6901 static int
get_atomic_generic_size(location_t loc,tree function,vec<tree,va_gc> * params)6902 get_atomic_generic_size (location_t loc, tree function,
6903 			 vec<tree, va_gc> *params)
6904 {
6905   unsigned int n_param;
6906   unsigned int n_model;
6907   unsigned int x;
6908   int size_0;
6909   tree type_0;
6910 
6911   /* Determine the parameter makeup.  */
6912   switch (DECL_FUNCTION_CODE (function))
6913     {
6914     case BUILT_IN_ATOMIC_EXCHANGE:
6915       n_param = 4;
6916       n_model = 1;
6917       break;
6918     case BUILT_IN_ATOMIC_LOAD:
6919     case BUILT_IN_ATOMIC_STORE:
6920       n_param = 3;
6921       n_model = 1;
6922       break;
6923     case BUILT_IN_ATOMIC_COMPARE_EXCHANGE:
6924       n_param = 6;
6925       n_model = 2;
6926       break;
6927     default:
6928       gcc_unreachable ();
6929     }
6930 
6931   if (vec_safe_length (params) != n_param)
6932     {
6933       error_at (loc, "incorrect number of arguments to function %qE", function);
6934       return 0;
6935     }
6936 
6937   /* Get type of first parameter, and determine its size.  */
6938   type_0 = TREE_TYPE ((*params)[0]);
6939   if (TREE_CODE (type_0) == ARRAY_TYPE && c_dialect_cxx ())
6940     {
6941       /* Force array-to-pointer decay for C++.  */
6942       (*params)[0] = default_conversion ((*params)[0]);
6943       type_0 = TREE_TYPE ((*params)[0]);
6944     }
6945   if (TREE_CODE (type_0) != POINTER_TYPE || VOID_TYPE_P (TREE_TYPE (type_0)))
6946     {
6947       error_at (loc, "argument 1 of %qE must be a non-void pointer type",
6948 		function);
6949       return 0;
6950     }
6951 
6952   if (!COMPLETE_TYPE_P (TREE_TYPE (type_0)))
6953     {
6954       error_at (loc, "argument 1 of %qE must be a pointer to a complete type",
6955 		function);
6956       return 0;
6957     }
6958 
6959   /* Types must be compile time constant sizes. */
6960   if (!tree_fits_uhwi_p ((TYPE_SIZE_UNIT (TREE_TYPE (type_0)))))
6961     {
6962       error_at (loc,
6963 		"argument 1 of %qE must be a pointer to a constant size type",
6964 		function);
6965       return 0;
6966     }
6967 
6968   size_0 = tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (type_0)));
6969 
6970   /* Zero size objects are not allowed.  */
6971   if (size_0 == 0)
6972     {
6973       error_at (loc,
6974 		"argument 1 of %qE must be a pointer to a nonzero size object",
6975 		function);
6976       return 0;
6977     }
6978 
6979   /* Check each other parameter is a pointer and the same size.  */
6980   for (x = 0; x < n_param - n_model; x++)
6981     {
6982       int size;
6983       tree type = TREE_TYPE ((*params)[x]);
6984       /* __atomic_compare_exchange has a bool in the 4th position, skip it.  */
6985       if (n_param == 6 && x == 3)
6986         continue;
6987       if (TREE_CODE (type) == ARRAY_TYPE && c_dialect_cxx ())
6988 	{
6989 	  /* Force array-to-pointer decay for C++.  */
6990 	  (*params)[x] = default_conversion ((*params)[x]);
6991 	  type = TREE_TYPE ((*params)[x]);
6992 	}
6993       if (!POINTER_TYPE_P (type))
6994 	{
6995 	  error_at (loc, "argument %d of %qE must be a pointer type", x + 1,
6996 		    function);
6997 	  return 0;
6998 	}
6999       else if (TYPE_SIZE_UNIT (TREE_TYPE (type))
7000 	       && TREE_CODE ((TYPE_SIZE_UNIT (TREE_TYPE (type))))
7001 		  != INTEGER_CST)
7002 	{
7003 	  error_at (loc, "argument %d of %qE must be a pointer to a constant "
7004 		    "size type", x + 1, function);
7005 	  return 0;
7006 	}
7007       else if (FUNCTION_POINTER_TYPE_P (type))
7008 	{
7009 	  error_at (loc, "argument %d of %qE must not be a pointer to a "
7010 		    "function", x + 1, function);
7011 	  return 0;
7012 	}
7013       tree type_size = TYPE_SIZE_UNIT (TREE_TYPE (type));
7014       size = type_size ? tree_to_uhwi (type_size) : 0;
7015       if (size != size_0)
7016 	{
7017 	  error_at (loc, "size mismatch in argument %d of %qE", x + 1,
7018 		    function);
7019 	  return 0;
7020 	}
7021     }
7022 
7023   /* Check memory model parameters for validity.  */
7024   for (x = n_param - n_model ; x < n_param; x++)
7025     {
7026       tree p = (*params)[x];
7027       if (!INTEGRAL_TYPE_P (TREE_TYPE (p)))
7028 	{
7029 	  error_at (loc, "non-integer memory model argument %d of %qE", x + 1,
7030 		    function);
7031 	  return 0;
7032 	}
7033       p = fold_for_warn (p);
7034       if (TREE_CODE (p) == INTEGER_CST)
7035 	{
7036 	  /* memmodel_base masks the low 16 bits, thus ignore any bits above
7037 	     it by using TREE_INT_CST_LOW instead of tree_to_*hwi.  Those high
7038 	     bits will be checked later during expansion in target specific
7039 	     way.  */
7040 	  if (memmodel_base (TREE_INT_CST_LOW (p)) >= MEMMODEL_LAST)
7041 	    warning_at (loc, OPT_Winvalid_memory_model,
7042 			"invalid memory model argument %d of %qE", x + 1,
7043 			function);
7044 	}
7045     }
7046 
7047   return size_0;
7048 }
7049 
7050 
7051 /* This will take an __atomic_ generic FUNCTION call, and add a size parameter N
7052    at the beginning of the parameter list PARAMS representing the size of the
7053    objects.  This is to match the library ABI requirement.  LOC is the location
7054    of the function call.
7055    The new function is returned if it needed rebuilding, otherwise NULL_TREE is
7056    returned to allow the external call to be constructed.  */
7057 
7058 static tree
add_atomic_size_parameter(unsigned n,location_t loc,tree function,vec<tree,va_gc> * params)7059 add_atomic_size_parameter (unsigned n, location_t loc, tree function,
7060 			   vec<tree, va_gc> *params)
7061 {
7062   tree size_node;
7063 
7064   /* Insert a SIZE_T parameter as the first param.  If there isn't
7065      enough space, allocate a new vector and recursively re-build with that.  */
7066   if (!params->space (1))
7067     {
7068       unsigned int z, len;
7069       vec<tree, va_gc> *v;
7070       tree f;
7071 
7072       len = params->length ();
7073       vec_alloc (v, len + 1);
7074       v->quick_push (build_int_cst (size_type_node, n));
7075       for (z = 0; z < len; z++)
7076 	v->quick_push ((*params)[z]);
7077       f = build_function_call_vec (loc, vNULL, function, v, NULL);
7078       vec_free (v);
7079       return f;
7080     }
7081 
7082   /* Add the size parameter and leave as a function call for processing.  */
7083   size_node = build_int_cst (size_type_node, n);
7084   params->quick_insert (0, size_node);
7085   return NULL_TREE;
7086 }
7087 
7088 
7089 /* Return whether atomic operations for naturally aligned N-byte
7090    arguments are supported, whether inline or through libatomic.  */
7091 static bool
atomic_size_supported_p(int n)7092 atomic_size_supported_p (int n)
7093 {
7094   switch (n)
7095     {
7096     case 1:
7097     case 2:
7098     case 4:
7099     case 8:
7100       return true;
7101 
7102     case 16:
7103       return targetm.scalar_mode_supported_p (TImode);
7104 
7105     default:
7106       return false;
7107     }
7108 }
7109 
7110 /* This will process an __atomic_exchange function call, determine whether it
7111    needs to be mapped to the _N variation, or turned into a library call.
7112    LOC is the location of the builtin call.
7113    FUNCTION is the DECL that has been invoked;
7114    PARAMS is the argument list for the call.  The return value is non-null
7115    TRUE is returned if it is translated into the proper format for a call to the
7116    external library, and NEW_RETURN is set the tree for that function.
7117    FALSE is returned if processing for the _N variation is required, and
7118    NEW_RETURN is set to the return value the result is copied into.  */
7119 static bool
resolve_overloaded_atomic_exchange(location_t loc,tree function,vec<tree,va_gc> * params,tree * new_return)7120 resolve_overloaded_atomic_exchange (location_t loc, tree function,
7121 				    vec<tree, va_gc> *params, tree *new_return)
7122 {
7123   tree p0, p1, p2, p3;
7124   tree I_type, I_type_ptr;
7125   int n = get_atomic_generic_size (loc, function, params);
7126 
7127   /* Size of 0 is an error condition.  */
7128   if (n == 0)
7129     {
7130       *new_return = error_mark_node;
7131       return true;
7132     }
7133 
7134   /* If not a lock-free size, change to the library generic format.  */
7135   if (!atomic_size_supported_p (n))
7136     {
7137       *new_return = add_atomic_size_parameter (n, loc, function, params);
7138       return true;
7139     }
7140 
7141   /* Otherwise there is a lockfree match, transform the call from:
7142        void fn(T* mem, T* desired, T* return, model)
7143      into
7144        *return = (T) (fn (In* mem, (In) *desired, model))  */
7145 
7146   p0 = (*params)[0];
7147   p1 = (*params)[1];
7148   p2 = (*params)[2];
7149   p3 = (*params)[3];
7150 
7151   /* Create pointer to appropriate size.  */
7152   I_type = builtin_type_for_size (BITS_PER_UNIT * n, 1);
7153   I_type_ptr = build_pointer_type (I_type);
7154 
7155   /* Convert object pointer to required type.  */
7156   p0 = build1 (VIEW_CONVERT_EXPR, I_type_ptr, p0);
7157   (*params)[0] = p0;
7158   /* Convert new value to required type, and dereference it.  */
7159   p1 = build_indirect_ref (loc, p1, RO_UNARY_STAR);
7160   p1 = build1 (VIEW_CONVERT_EXPR, I_type, p1);
7161   (*params)[1] = p1;
7162 
7163   /* Move memory model to the 3rd position, and end param list.  */
7164   (*params)[2] = p3;
7165   params->truncate (3);
7166 
7167   /* Convert return pointer and dereference it for later assignment.  */
7168   *new_return = build_indirect_ref (loc, p2, RO_UNARY_STAR);
7169 
7170   return false;
7171 }
7172 
7173 
7174 /* This will process an __atomic_compare_exchange function call, determine
7175    whether it needs to be mapped to the _N variation, or turned into a lib call.
7176    LOC is the location of the builtin call.
7177    FUNCTION is the DECL that has been invoked;
7178    PARAMS is the argument list for the call.  The return value is non-null
7179    TRUE is returned if it is translated into the proper format for a call to the
7180    external library, and NEW_RETURN is set the tree for that function.
7181    FALSE is returned if processing for the _N variation is required.  */
7182 
7183 static bool
resolve_overloaded_atomic_compare_exchange(location_t loc,tree function,vec<tree,va_gc> * params,tree * new_return)7184 resolve_overloaded_atomic_compare_exchange (location_t loc, tree function,
7185 					    vec<tree, va_gc> *params,
7186 					    tree *new_return)
7187 {
7188   tree p0, p1, p2;
7189   tree I_type, I_type_ptr;
7190   int n = get_atomic_generic_size (loc, function, params);
7191 
7192   /* Size of 0 is an error condition.  */
7193   if (n == 0)
7194     {
7195       *new_return = error_mark_node;
7196       return true;
7197     }
7198 
7199   /* If not a lock-free size, change to the library generic format.  */
7200   if (!atomic_size_supported_p (n))
7201     {
7202       /* The library generic format does not have the weak parameter, so
7203 	 remove it from the param list.  Since a parameter has been removed,
7204 	 we can be sure that there is room for the SIZE_T parameter, meaning
7205 	 there will not be a recursive rebuilding of the parameter list, so
7206 	 there is no danger this will be done twice.  */
7207       if (n > 0)
7208         {
7209 	  (*params)[3] = (*params)[4];
7210 	  (*params)[4] = (*params)[5];
7211 	  params->truncate (5);
7212 	}
7213       *new_return = add_atomic_size_parameter (n, loc, function, params);
7214       return true;
7215     }
7216 
7217   /* Otherwise, there is a match, so the call needs to be transformed from:
7218        bool fn(T* mem, T* desired, T* return, weak, success, failure)
7219      into
7220        bool fn ((In *)mem, (In *)expected, (In) *desired, weak, succ, fail)  */
7221 
7222   p0 = (*params)[0];
7223   p1 = (*params)[1];
7224   p2 = (*params)[2];
7225 
7226   /* Create pointer to appropriate size.  */
7227   I_type = builtin_type_for_size (BITS_PER_UNIT * n, 1);
7228   I_type_ptr = build_pointer_type (I_type);
7229 
7230   /* Convert object pointer to required type.  */
7231   p0 = build1 (VIEW_CONVERT_EXPR, I_type_ptr, p0);
7232   (*params)[0] = p0;
7233 
7234   /* Convert expected pointer to required type.  */
7235   p1 = build1 (VIEW_CONVERT_EXPR, I_type_ptr, p1);
7236   (*params)[1] = p1;
7237 
7238   /* Convert desired value to required type, and dereference it.  */
7239   p2 = build_indirect_ref (loc, p2, RO_UNARY_STAR);
7240   p2 = build1 (VIEW_CONVERT_EXPR, I_type, p2);
7241   (*params)[2] = p2;
7242 
7243   /* The rest of the parameters are fine. NULL means no special return value
7244      processing.*/
7245   *new_return = NULL;
7246   return false;
7247 }
7248 
7249 
7250 /* This will process an __atomic_load function call, determine whether it
7251    needs to be mapped to the _N variation, or turned into a library call.
7252    LOC is the location of the builtin call.
7253    FUNCTION is the DECL that has been invoked;
7254    PARAMS is the argument list for the call.  The return value is non-null
7255    TRUE is returned if it is translated into the proper format for a call to the
7256    external library, and NEW_RETURN is set the tree for that function.
7257    FALSE is returned if processing for the _N variation is required, and
7258    NEW_RETURN is set to the return value the result is copied into.  */
7259 
7260 static bool
resolve_overloaded_atomic_load(location_t loc,tree function,vec<tree,va_gc> * params,tree * new_return)7261 resolve_overloaded_atomic_load (location_t loc, tree function,
7262 				vec<tree, va_gc> *params, tree *new_return)
7263 {
7264   tree p0, p1, p2;
7265   tree I_type, I_type_ptr;
7266   int n = get_atomic_generic_size (loc, function, params);
7267 
7268   /* Size of 0 is an error condition.  */
7269   if (n == 0)
7270     {
7271       *new_return = error_mark_node;
7272       return true;
7273     }
7274 
7275   /* If not a lock-free size, change to the library generic format.  */
7276   if (!atomic_size_supported_p (n))
7277     {
7278       *new_return = add_atomic_size_parameter (n, loc, function, params);
7279       return true;
7280     }
7281 
7282   /* Otherwise, there is a match, so the call needs to be transformed from:
7283        void fn(T* mem, T* return, model)
7284      into
7285        *return = (T) (fn ((In *) mem, model))  */
7286 
7287   p0 = (*params)[0];
7288   p1 = (*params)[1];
7289   p2 = (*params)[2];
7290 
7291   /* Create pointer to appropriate size.  */
7292   I_type = builtin_type_for_size (BITS_PER_UNIT * n, 1);
7293   I_type_ptr = build_pointer_type (I_type);
7294 
7295   /* Convert object pointer to required type.  */
7296   p0 = build1 (VIEW_CONVERT_EXPR, I_type_ptr, p0);
7297   (*params)[0] = p0;
7298 
7299   /* Move memory model to the 2nd position, and end param list.  */
7300   (*params)[1] = p2;
7301   params->truncate (2);
7302 
7303   /* Convert return pointer and dereference it for later assignment.  */
7304   *new_return = build_indirect_ref (loc, p1, RO_UNARY_STAR);
7305 
7306   return false;
7307 }
7308 
7309 
7310 /* This will process an __atomic_store function call, determine whether it
7311    needs to be mapped to the _N variation, or turned into a library call.
7312    LOC is the location of the builtin call.
7313    FUNCTION is the DECL that has been invoked;
7314    PARAMS is the argument list for the call.  The return value is non-null
7315    TRUE is returned if it is translated into the proper format for a call to the
7316    external library, and NEW_RETURN is set the tree for that function.
7317    FALSE is returned if processing for the _N variation is required, and
7318    NEW_RETURN is set to the return value the result is copied into.  */
7319 
7320 static bool
resolve_overloaded_atomic_store(location_t loc,tree function,vec<tree,va_gc> * params,tree * new_return)7321 resolve_overloaded_atomic_store (location_t loc, tree function,
7322 				 vec<tree, va_gc> *params, tree *new_return)
7323 {
7324   tree p0, p1;
7325   tree I_type, I_type_ptr;
7326   int n = get_atomic_generic_size (loc, function, params);
7327 
7328   /* Size of 0 is an error condition.  */
7329   if (n == 0)
7330     {
7331       *new_return = error_mark_node;
7332       return true;
7333     }
7334 
7335   /* If not a lock-free size, change to the library generic format.  */
7336   if (!atomic_size_supported_p (n))
7337     {
7338       *new_return = add_atomic_size_parameter (n, loc, function, params);
7339       return true;
7340     }
7341 
7342   /* Otherwise, there is a match, so the call needs to be transformed from:
7343        void fn(T* mem, T* value, model)
7344      into
7345        fn ((In *) mem, (In) *value, model)  */
7346 
7347   p0 = (*params)[0];
7348   p1 = (*params)[1];
7349 
7350   /* Create pointer to appropriate size.  */
7351   I_type = builtin_type_for_size (BITS_PER_UNIT * n, 1);
7352   I_type_ptr = build_pointer_type (I_type);
7353 
7354   /* Convert object pointer to required type.  */
7355   p0 = build1 (VIEW_CONVERT_EXPR, I_type_ptr, p0);
7356   (*params)[0] = p0;
7357 
7358   /* Convert new value to required type, and dereference it.  */
7359   p1 = build_indirect_ref (loc, p1, RO_UNARY_STAR);
7360   p1 = build1 (VIEW_CONVERT_EXPR, I_type, p1);
7361   (*params)[1] = p1;
7362 
7363   /* The memory model is in the right spot already. Return is void.  */
7364   *new_return = NULL_TREE;
7365 
7366   return false;
7367 }
7368 
7369 
7370 /* Some builtin functions are placeholders for other expressions.  This
7371    function should be called immediately after parsing the call expression
7372    before surrounding code has committed to the type of the expression.
7373 
7374    LOC is the location of the builtin call.
7375 
7376    FUNCTION is the DECL that has been invoked; it is known to be a builtin.
7377    PARAMS is the argument list for the call.  The return value is non-null
7378    when expansion is complete, and null if normal processing should
7379    continue.  */
7380 
7381 tree
resolve_overloaded_builtin(location_t loc,tree function,vec<tree,va_gc> * params)7382 resolve_overloaded_builtin (location_t loc, tree function,
7383 			    vec<tree, va_gc> *params)
7384 {
7385   /* Is function one of the _FETCH_OP_ or _OP_FETCH_ built-ins?
7386      Those are not valid to call with a pointer to _Bool (or C++ bool)
7387      and so must be rejected.  */
7388   bool fetch_op = true;
7389   bool orig_format = true;
7390   tree new_return = NULL_TREE;
7391 
7392   switch (DECL_BUILT_IN_CLASS (function))
7393     {
7394     case BUILT_IN_NORMAL:
7395       break;
7396     case BUILT_IN_MD:
7397       if (targetm.resolve_overloaded_builtin)
7398 	return targetm.resolve_overloaded_builtin (loc, function, params);
7399       else
7400 	return NULL_TREE;
7401     default:
7402       return NULL_TREE;
7403     }
7404 
7405   /* Handle BUILT_IN_NORMAL here.  */
7406   enum built_in_function orig_code = DECL_FUNCTION_CODE (function);
7407   switch (orig_code)
7408     {
7409     case BUILT_IN_SPECULATION_SAFE_VALUE_N:
7410       {
7411 	tree new_function, first_param, result;
7412 	enum built_in_function fncode
7413 	  = speculation_safe_value_resolve_call (function, params);
7414 
7415 	if (fncode == BUILT_IN_NONE)
7416 	  return error_mark_node;
7417 
7418 	first_param = (*params)[0];
7419 	if (!speculation_safe_value_resolve_params (loc, function, params))
7420 	  return error_mark_node;
7421 
7422 	if (targetm.have_speculation_safe_value (true))
7423 	  {
7424 	    new_function = builtin_decl_explicit (fncode);
7425 	    result = build_function_call_vec (loc, vNULL, new_function, params,
7426 					      NULL);
7427 
7428 	    if (result == error_mark_node)
7429 	      return result;
7430 
7431 	    return speculation_safe_value_resolve_return (first_param, result);
7432 	  }
7433 	else
7434 	  {
7435 	    /* This target doesn't have, or doesn't need, active mitigation
7436 	       against incorrect speculative execution.  Simply return the
7437 	       first parameter to the builtin.  */
7438 	    if (!targetm.have_speculation_safe_value (false))
7439 	      /* The user has invoked __builtin_speculation_safe_value
7440 		 even though __HAVE_SPECULATION_SAFE_VALUE is not
7441 		 defined: emit a warning.  */
7442 	      warning_at (input_location, 0,
7443 			  "this target does not define a speculation barrier; "
7444 			  "your program will still execute correctly, "
7445 			  "but incorrect speculation may not be "
7446 			  "restricted");
7447 
7448 	    /* If the optional second argument is present, handle any side
7449 	       effects now.  */
7450 	    if (params->length () == 2
7451 		&& TREE_SIDE_EFFECTS ((*params)[1]))
7452 	      return build2 (COMPOUND_EXPR, TREE_TYPE (first_param),
7453 			     (*params)[1], first_param);
7454 
7455 	    return first_param;
7456 	  }
7457       }
7458 
7459     case BUILT_IN_ATOMIC_EXCHANGE:
7460     case BUILT_IN_ATOMIC_COMPARE_EXCHANGE:
7461     case BUILT_IN_ATOMIC_LOAD:
7462     case BUILT_IN_ATOMIC_STORE:
7463       {
7464 	/* Handle these 4 together so that they can fall through to the next
7465 	   case if the call is transformed to an _N variant.  */
7466         switch (orig_code)
7467 	  {
7468 	  case BUILT_IN_ATOMIC_EXCHANGE:
7469 	    {
7470 	      if (resolve_overloaded_atomic_exchange (loc, function, params,
7471 						      &new_return))
7472 		return new_return;
7473 	      /* Change to the _N variant.  */
7474 	      orig_code = BUILT_IN_ATOMIC_EXCHANGE_N;
7475 	      break;
7476 	    }
7477 
7478 	  case BUILT_IN_ATOMIC_COMPARE_EXCHANGE:
7479 	    {
7480 	      if (resolve_overloaded_atomic_compare_exchange (loc, function,
7481 							      params,
7482 							      &new_return))
7483 		return new_return;
7484 	      /* Change to the _N variant.  */
7485 	      orig_code = BUILT_IN_ATOMIC_COMPARE_EXCHANGE_N;
7486 	      break;
7487 	    }
7488 	  case BUILT_IN_ATOMIC_LOAD:
7489 	    {
7490 	      if (resolve_overloaded_atomic_load (loc, function, params,
7491 						  &new_return))
7492 		return new_return;
7493 	      /* Change to the _N variant.  */
7494 	      orig_code = BUILT_IN_ATOMIC_LOAD_N;
7495 	      break;
7496 	    }
7497 	  case BUILT_IN_ATOMIC_STORE:
7498 	    {
7499 	      if (resolve_overloaded_atomic_store (loc, function, params,
7500 						   &new_return))
7501 		return new_return;
7502 	      /* Change to the _N variant.  */
7503 	      orig_code = BUILT_IN_ATOMIC_STORE_N;
7504 	      break;
7505 	    }
7506 	  default:
7507 	    gcc_unreachable ();
7508 	  }
7509       }
7510       /* FALLTHRU */
7511     case BUILT_IN_ATOMIC_EXCHANGE_N:
7512     case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_N:
7513     case BUILT_IN_ATOMIC_LOAD_N:
7514     case BUILT_IN_ATOMIC_STORE_N:
7515       fetch_op = false;
7516       /* FALLTHRU */
7517     case BUILT_IN_ATOMIC_ADD_FETCH_N:
7518     case BUILT_IN_ATOMIC_SUB_FETCH_N:
7519     case BUILT_IN_ATOMIC_AND_FETCH_N:
7520     case BUILT_IN_ATOMIC_NAND_FETCH_N:
7521     case BUILT_IN_ATOMIC_XOR_FETCH_N:
7522     case BUILT_IN_ATOMIC_OR_FETCH_N:
7523     case BUILT_IN_ATOMIC_FETCH_ADD_N:
7524     case BUILT_IN_ATOMIC_FETCH_SUB_N:
7525     case BUILT_IN_ATOMIC_FETCH_AND_N:
7526     case BUILT_IN_ATOMIC_FETCH_NAND_N:
7527     case BUILT_IN_ATOMIC_FETCH_XOR_N:
7528     case BUILT_IN_ATOMIC_FETCH_OR_N:
7529       orig_format = false;
7530       /* FALLTHRU */
7531     case BUILT_IN_SYNC_FETCH_AND_ADD_N:
7532     case BUILT_IN_SYNC_FETCH_AND_SUB_N:
7533     case BUILT_IN_SYNC_FETCH_AND_OR_N:
7534     case BUILT_IN_SYNC_FETCH_AND_AND_N:
7535     case BUILT_IN_SYNC_FETCH_AND_XOR_N:
7536     case BUILT_IN_SYNC_FETCH_AND_NAND_N:
7537     case BUILT_IN_SYNC_ADD_AND_FETCH_N:
7538     case BUILT_IN_SYNC_SUB_AND_FETCH_N:
7539     case BUILT_IN_SYNC_OR_AND_FETCH_N:
7540     case BUILT_IN_SYNC_AND_AND_FETCH_N:
7541     case BUILT_IN_SYNC_XOR_AND_FETCH_N:
7542     case BUILT_IN_SYNC_NAND_AND_FETCH_N:
7543     case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_N:
7544     case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_N:
7545     case BUILT_IN_SYNC_LOCK_TEST_AND_SET_N:
7546     case BUILT_IN_SYNC_LOCK_RELEASE_N:
7547       {
7548 	/* The following are not _FETCH_OPs and must be accepted with
7549 	   pointers to _Bool (or C++ bool).  */
7550 	if (fetch_op)
7551 	  fetch_op =
7552 	    (orig_code != BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_N
7553 	     && orig_code != BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_N
7554 	     && orig_code != BUILT_IN_SYNC_LOCK_TEST_AND_SET_N
7555 	     && orig_code != BUILT_IN_SYNC_LOCK_RELEASE_N);
7556 
7557 	int n = sync_resolve_size (function, params, fetch_op);
7558 	tree new_function, first_param, result;
7559 	enum built_in_function fncode;
7560 
7561 	if (n == 0)
7562 	  return error_mark_node;
7563 
7564 	fncode = (enum built_in_function)((int)orig_code + exact_log2 (n) + 1);
7565 	new_function = builtin_decl_explicit (fncode);
7566 	if (!sync_resolve_params (loc, function, new_function, params,
7567 				  orig_format))
7568 	  return error_mark_node;
7569 
7570 	first_param = (*params)[0];
7571 	result = build_function_call_vec (loc, vNULL, new_function, params,
7572 					  NULL);
7573 	if (result == error_mark_node)
7574 	  return result;
7575 	if (orig_code != BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_N
7576 	    && orig_code != BUILT_IN_SYNC_LOCK_RELEASE_N
7577 	    && orig_code != BUILT_IN_ATOMIC_STORE_N
7578 	    && orig_code != BUILT_IN_ATOMIC_COMPARE_EXCHANGE_N)
7579 	  result = sync_resolve_return (first_param, result, orig_format);
7580 
7581 	if (fetch_op)
7582 	  /* Prevent -Wunused-value warning.  */
7583 	  TREE_USED (result) = true;
7584 
7585 	/* If new_return is set, assign function to that expr and cast the
7586 	   result to void since the generic interface returned void.  */
7587 	if (new_return)
7588 	  {
7589 	    /* Cast function result from I{1,2,4,8,16} to the required type.  */
7590 	    result = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (new_return), result);
7591 	    result = build2 (MODIFY_EXPR, TREE_TYPE (new_return), new_return,
7592 			     result);
7593 	    TREE_SIDE_EFFECTS (result) = 1;
7594 	    protected_set_expr_location (result, loc);
7595 	    result = convert (void_type_node, result);
7596 	  }
7597 	return result;
7598       }
7599 
7600     default:
7601       return NULL_TREE;
7602     }
7603 }
7604 
7605 /* vector_types_compatible_elements_p is used in type checks of vectors
7606    values used as operands of binary operators.  Where it returns true, and
7607    the other checks of the caller succeed (being vector types in he first
7608    place, and matching number of elements), we can just treat the types
7609    as essentially the same.
7610    Contrast with vector_targets_convertible_p, which is used for vector
7611    pointer types,  and vector_types_convertible_p, which will allow
7612    language-specific matches under the control of flag_lax_vector_conversions,
7613    and might still require a conversion.  */
7614 /* True if vector types T1 and T2 can be inputs to the same binary
7615    operator without conversion.
7616    We don't check the overall vector size here because some of our callers
7617    want to give different error messages when the vectors are compatible
7618    except for the element count.  */
7619 
7620 bool
vector_types_compatible_elements_p(tree t1,tree t2)7621 vector_types_compatible_elements_p (tree t1, tree t2)
7622 {
7623   bool opaque = TYPE_VECTOR_OPAQUE (t1) || TYPE_VECTOR_OPAQUE (t2);
7624   t1 = TREE_TYPE (t1);
7625   t2 = TREE_TYPE (t2);
7626 
7627   enum tree_code c1 = TREE_CODE (t1), c2 = TREE_CODE (t2);
7628 
7629   gcc_assert ((INTEGRAL_TYPE_P (t1)
7630 	       || c1 == REAL_TYPE
7631 	       || c1 == FIXED_POINT_TYPE)
7632 	      && (INTEGRAL_TYPE_P (t2)
7633 		  || c2 == REAL_TYPE
7634 		  || c2 == FIXED_POINT_TYPE));
7635 
7636   t1 = c_common_signed_type (t1);
7637   t2 = c_common_signed_type (t2);
7638   /* Equality works here because c_common_signed_type uses
7639      TYPE_MAIN_VARIANT.  */
7640   if (t1 == t2)
7641     return true;
7642   if (opaque && c1 == c2
7643       && (INTEGRAL_TYPE_P (t1) || c1 == REAL_TYPE)
7644       && TYPE_PRECISION (t1) == TYPE_PRECISION (t2))
7645     return true;
7646   return false;
7647 }
7648 
7649 /* Check for missing format attributes on function pointers.  LTYPE is
7650    the new type or left-hand side type.  RTYPE is the old type or
7651    right-hand side type.  Returns TRUE if LTYPE is missing the desired
7652    attribute.  */
7653 
7654 bool
check_missing_format_attribute(tree ltype,tree rtype)7655 check_missing_format_attribute (tree ltype, tree rtype)
7656 {
7657   tree const ttr = TREE_TYPE (rtype), ttl = TREE_TYPE (ltype);
7658   tree ra;
7659 
7660   for (ra = TYPE_ATTRIBUTES (ttr); ra; ra = TREE_CHAIN (ra))
7661     if (is_attribute_p ("format", get_attribute_name (ra)))
7662       break;
7663   if (ra)
7664     {
7665       tree la;
7666       for (la = TYPE_ATTRIBUTES (ttl); la; la = TREE_CHAIN (la))
7667 	if (is_attribute_p ("format", get_attribute_name (la)))
7668 	  break;
7669       return !la;
7670     }
7671   else
7672     return false;
7673 }
7674 
7675 /* Setup a TYPE_DECL node as a typedef representation.
7676 
7677    X is a TYPE_DECL for a typedef statement.  Create a brand new
7678    ..._TYPE node (which will be just a variant of the existing
7679    ..._TYPE node with identical properties) and then install X
7680    as the TYPE_NAME of this brand new (duplicate) ..._TYPE node.
7681 
7682    The whole point here is to end up with a situation where each
7683    and every ..._TYPE node the compiler creates will be uniquely
7684    associated with AT MOST one node representing a typedef name.
7685    This way, even though the compiler substitutes corresponding
7686    ..._TYPE nodes for TYPE_DECL (i.e. "typedef name") nodes very
7687    early on, later parts of the compiler can always do the reverse
7688    translation and get back the corresponding typedef name.  For
7689    example, given:
7690 
7691 	typedef struct S MY_TYPE;
7692 	MY_TYPE object;
7693 
7694    Later parts of the compiler might only know that `object' was of
7695    type `struct S' if it were not for code just below.  With this
7696    code however, later parts of the compiler see something like:
7697 
7698 	struct S' == struct S
7699 	typedef struct S' MY_TYPE;
7700 	struct S' object;
7701 
7702     And they can then deduce (from the node for type struct S') that
7703     the original object declaration was:
7704 
7705 		MY_TYPE object;
7706 
7707     Being able to do this is important for proper support of protoize,
7708     and also for generating precise symbolic debugging information
7709     which takes full account of the programmer's (typedef) vocabulary.
7710 
7711     Obviously, we don't want to generate a duplicate ..._TYPE node if
7712     the TYPE_DECL node that we are now processing really represents a
7713     standard built-in type.  */
7714 
7715 void
set_underlying_type(tree x)7716 set_underlying_type (tree x)
7717 {
7718   if (x == error_mark_node)
7719     return;
7720   if (DECL_IS_BUILTIN (x) && TREE_CODE (TREE_TYPE (x)) != ARRAY_TYPE)
7721     {
7722       if (TYPE_NAME (TREE_TYPE (x)) == 0)
7723 	TYPE_NAME (TREE_TYPE (x)) = x;
7724     }
7725   else if (TREE_TYPE (x) != error_mark_node
7726 	   && DECL_ORIGINAL_TYPE (x) == NULL_TREE)
7727     {
7728       tree tt = TREE_TYPE (x);
7729       DECL_ORIGINAL_TYPE (x) = tt;
7730       tt = build_variant_type_copy (tt);
7731       TYPE_STUB_DECL (tt) = TYPE_STUB_DECL (DECL_ORIGINAL_TYPE (x));
7732       TYPE_NAME (tt) = x;
7733 
7734       /* Mark the type as used only when its type decl is decorated
7735 	 with attribute unused.  */
7736       if (lookup_attribute ("unused", DECL_ATTRIBUTES (x)))
7737 	TREE_USED (tt) = 1;
7738 
7739       TREE_TYPE (x) = tt;
7740     }
7741 }
7742 
7743 /* Return true if it is worth exposing the DECL_ORIGINAL_TYPE of TYPE to
7744    the user in diagnostics, false if it would be better to use TYPE itself.
7745    TYPE is known to satisfy typedef_variant_p.  */
7746 
7747 bool
user_facing_original_type_p(const_tree type)7748 user_facing_original_type_p (const_tree type)
7749 {
7750   gcc_assert (typedef_variant_p (type));
7751   tree decl = TYPE_NAME (type);
7752 
7753   /* Look through any typedef in "user" code.  */
7754   if (!DECL_IN_SYSTEM_HEADER (decl) && !DECL_IS_BUILTIN (decl))
7755     return true;
7756 
7757   /* If the original type is also named and is in the user namespace,
7758      assume it too is a user-facing type.  */
7759   tree orig_type = DECL_ORIGINAL_TYPE (decl);
7760   if (tree orig_id = TYPE_IDENTIFIER (orig_type))
7761     if (!name_reserved_for_implementation_p (IDENTIFIER_POINTER (orig_id)))
7762       return true;
7763 
7764   switch (TREE_CODE (orig_type))
7765     {
7766     /* Don't look through to an anonymous vector type, since the syntax
7767        we use for them in diagnostics isn't real C or C++ syntax.
7768        And if ORIG_TYPE is named but in the implementation namespace,
7769        TYPE is likely to be more meaningful to the user.  */
7770     case VECTOR_TYPE:
7771       return false;
7772 
7773     /* Don't expose anonymous tag types that are presumably meant to be
7774        known by their typedef name.  Also don't expose tags that are in
7775        the implementation namespace, such as:
7776 
7777          typedef struct __foo foo;  */
7778     case RECORD_TYPE:
7779     case UNION_TYPE:
7780     case ENUMERAL_TYPE:
7781       return false;
7782 
7783     /* Look through to anything else.  */
7784     default:
7785       return true;
7786     }
7787 }
7788 
7789 /* Record the types used by the current global variable declaration
7790    being parsed, so that we can decide later to emit their debug info.
7791    Those types are in types_used_by_cur_var_decl, and we are going to
7792    store them in the types_used_by_vars_hash hash table.
7793    DECL is the declaration of the global variable that has been parsed.  */
7794 
7795 void
record_types_used_by_current_var_decl(tree decl)7796 record_types_used_by_current_var_decl (tree decl)
7797 {
7798   gcc_assert (decl && DECL_P (decl) && TREE_STATIC (decl));
7799 
7800   while (types_used_by_cur_var_decl && !types_used_by_cur_var_decl->is_empty ())
7801     {
7802       tree type = types_used_by_cur_var_decl->pop ();
7803       types_used_by_var_decl_insert (type, decl);
7804     }
7805 }
7806 
7807 /* The C and C++ parsers both use vectors to hold function arguments.
7808    For efficiency, we keep a cache of unused vectors.  This is the
7809    cache.  */
7810 
7811 typedef vec<tree, va_gc> *tree_gc_vec;
7812 static GTY((deletable)) vec<tree_gc_vec, va_gc> *tree_vector_cache;
7813 
7814 /* Return a new vector from the cache.  If the cache is empty,
7815    allocate a new vector.  These vectors are GC'ed, so it is OK if the
7816    pointer is not released..  */
7817 
7818 vec<tree, va_gc> *
make_tree_vector(void)7819 make_tree_vector (void)
7820 {
7821   if (tree_vector_cache && !tree_vector_cache->is_empty ())
7822     return tree_vector_cache->pop ();
7823   else
7824     {
7825       /* Passing 0 to vec::alloc returns NULL, and our callers require
7826 	 that we always return a non-NULL value.  The vector code uses
7827 	 4 when growing a NULL vector, so we do too.  */
7828       vec<tree, va_gc> *v;
7829       vec_alloc (v, 4);
7830       return v;
7831     }
7832 }
7833 
7834 /* Release a vector of trees back to the cache.  */
7835 
7836 void
release_tree_vector(vec<tree,va_gc> * vec)7837 release_tree_vector (vec<tree, va_gc> *vec)
7838 {
7839   if (vec != NULL)
7840     {
7841       vec->truncate (0);
7842       vec_safe_push (tree_vector_cache, vec);
7843     }
7844 }
7845 
7846 /* Get a new tree vector holding a single tree.  */
7847 
7848 vec<tree, va_gc> *
make_tree_vector_single(tree t)7849 make_tree_vector_single (tree t)
7850 {
7851   vec<tree, va_gc> *ret = make_tree_vector ();
7852   ret->quick_push (t);
7853   return ret;
7854 }
7855 
7856 /* Get a new tree vector of the TREE_VALUEs of a TREE_LIST chain.  */
7857 
7858 vec<tree, va_gc> *
make_tree_vector_from_list(tree list)7859 make_tree_vector_from_list (tree list)
7860 {
7861   vec<tree, va_gc> *ret = make_tree_vector ();
7862   for (; list; list = TREE_CHAIN (list))
7863     vec_safe_push (ret, TREE_VALUE (list));
7864   return ret;
7865 }
7866 
7867 /* Get a new tree vector of the values of a CONSTRUCTOR.  */
7868 
7869 vec<tree, va_gc> *
make_tree_vector_from_ctor(tree ctor)7870 make_tree_vector_from_ctor (tree ctor)
7871 {
7872   vec<tree,va_gc> *ret = make_tree_vector ();
7873   vec_safe_reserve (ret, CONSTRUCTOR_NELTS (ctor));
7874   for (unsigned i = 0; i < CONSTRUCTOR_NELTS (ctor); ++i)
7875     ret->quick_push (CONSTRUCTOR_ELT (ctor, i)->value);
7876   return ret;
7877 }
7878 
7879 /* Get a new tree vector which is a copy of an existing one.  */
7880 
7881 vec<tree, va_gc> *
make_tree_vector_copy(const vec<tree,va_gc> * orig)7882 make_tree_vector_copy (const vec<tree, va_gc> *orig)
7883 {
7884   vec<tree, va_gc> *ret;
7885   unsigned int ix;
7886   tree t;
7887 
7888   ret = make_tree_vector ();
7889   vec_safe_reserve (ret, vec_safe_length (orig));
7890   FOR_EACH_VEC_SAFE_ELT (orig, ix, t)
7891     ret->quick_push (t);
7892   return ret;
7893 }
7894 
7895 /* Return true if KEYWORD starts a type specifier.  */
7896 
7897 bool
keyword_begins_type_specifier(enum rid keyword)7898 keyword_begins_type_specifier (enum rid keyword)
7899 {
7900   switch (keyword)
7901     {
7902     case RID_AUTO_TYPE:
7903     case RID_INT:
7904     case RID_CHAR:
7905     case RID_FLOAT:
7906     case RID_DOUBLE:
7907     case RID_VOID:
7908     case RID_UNSIGNED:
7909     case RID_LONG:
7910     case RID_SHORT:
7911     case RID_SIGNED:
7912     CASE_RID_FLOATN_NX:
7913     case RID_DFLOAT32:
7914     case RID_DFLOAT64:
7915     case RID_DFLOAT128:
7916     case RID_FRACT:
7917     case RID_ACCUM:
7918     case RID_BOOL:
7919     case RID_WCHAR:
7920     case RID_CHAR8:
7921     case RID_CHAR16:
7922     case RID_CHAR32:
7923     case RID_SAT:
7924     case RID_COMPLEX:
7925     case RID_TYPEOF:
7926     case RID_STRUCT:
7927     case RID_CLASS:
7928     case RID_UNION:
7929     case RID_ENUM:
7930       return true;
7931     default:
7932       if (keyword >= RID_FIRST_INT_N
7933 	  && keyword < RID_FIRST_INT_N + NUM_INT_N_ENTS
7934 	  && int_n_enabled_p[keyword-RID_FIRST_INT_N])
7935 	return true;
7936       return false;
7937     }
7938 }
7939 
7940 /* Return true if KEYWORD names a type qualifier.  */
7941 
7942 bool
keyword_is_type_qualifier(enum rid keyword)7943 keyword_is_type_qualifier (enum rid keyword)
7944 {
7945   switch (keyword)
7946     {
7947     case RID_CONST:
7948     case RID_VOLATILE:
7949     case RID_RESTRICT:
7950     case RID_ATOMIC:
7951       return true;
7952     default:
7953       return false;
7954     }
7955 }
7956 
7957 /* Return true if KEYWORD names a storage class specifier.
7958 
7959    RID_TYPEDEF is not included in this list despite `typedef' being
7960    listed in C99 6.7.1.1.  6.7.1.3 indicates that `typedef' is listed as
7961    such for syntactic convenience only.  */
7962 
7963 bool
keyword_is_storage_class_specifier(enum rid keyword)7964 keyword_is_storage_class_specifier (enum rid keyword)
7965 {
7966   switch (keyword)
7967     {
7968     case RID_STATIC:
7969     case RID_EXTERN:
7970     case RID_REGISTER:
7971     case RID_AUTO:
7972     case RID_MUTABLE:
7973     case RID_THREAD:
7974       return true;
7975     default:
7976       return false;
7977     }
7978 }
7979 
7980 /* Return true if KEYWORD names a function-specifier [dcl.fct.spec].  */
7981 
7982 static bool
keyword_is_function_specifier(enum rid keyword)7983 keyword_is_function_specifier (enum rid keyword)
7984 {
7985   switch (keyword)
7986     {
7987     case RID_INLINE:
7988     case RID_NORETURN:
7989     case RID_VIRTUAL:
7990     case RID_EXPLICIT:
7991       return true;
7992     default:
7993       return false;
7994     }
7995 }
7996 
7997 /* Return true if KEYWORD names a decl-specifier [dcl.spec] or a
7998    declaration-specifier (C99 6.7).  */
7999 
8000 bool
keyword_is_decl_specifier(enum rid keyword)8001 keyword_is_decl_specifier (enum rid keyword)
8002 {
8003   if (keyword_is_storage_class_specifier (keyword)
8004       || keyword_is_type_qualifier (keyword)
8005       || keyword_is_function_specifier (keyword))
8006     return true;
8007 
8008   switch (keyword)
8009     {
8010     case RID_TYPEDEF:
8011     case RID_FRIEND:
8012     case RID_CONSTEXPR:
8013     case RID_CONSTINIT:
8014       return true;
8015     default:
8016       return false;
8017     }
8018 }
8019 
8020 /* Initialize language-specific-bits of tree_contains_struct.  */
8021 
8022 void
c_common_init_ts(void)8023 c_common_init_ts (void)
8024 {
8025   MARK_TS_EXP (SIZEOF_EXPR);
8026   MARK_TS_EXP (C_MAYBE_CONST_EXPR);
8027   MARK_TS_EXP (EXCESS_PRECISION_EXPR);
8028 }
8029 
8030 /* Build a user-defined numeric literal out of an integer constant type VALUE
8031    with identifier SUFFIX.  */
8032 
8033 tree
build_userdef_literal(tree suffix_id,tree value,enum overflow_type overflow,tree num_string)8034 build_userdef_literal (tree suffix_id, tree value,
8035 		       enum overflow_type overflow, tree num_string)
8036 {
8037   tree literal = make_node (USERDEF_LITERAL);
8038   USERDEF_LITERAL_SUFFIX_ID (literal) = suffix_id;
8039   USERDEF_LITERAL_VALUE (literal) = value;
8040   USERDEF_LITERAL_OVERFLOW (literal) = overflow;
8041   USERDEF_LITERAL_NUM_STRING (literal) = num_string;
8042   return literal;
8043 }
8044 
8045 /* For vector[index], convert the vector to an array of the underlying type.
8046    Return true if the resulting ARRAY_REF should not be an lvalue.  */
8047 
8048 bool
convert_vector_to_array_for_subscript(location_t loc,tree * vecp,tree index)8049 convert_vector_to_array_for_subscript (location_t loc,
8050 				       tree *vecp, tree index)
8051 {
8052   bool ret = false;
8053   if (gnu_vector_type_p (TREE_TYPE (*vecp)))
8054     {
8055       tree type = TREE_TYPE (*vecp);
8056 
8057       ret = !lvalue_p (*vecp);
8058 
8059       index = fold_for_warn (index);
8060       if (TREE_CODE (index) == INTEGER_CST)
8061         if (!tree_fits_uhwi_p (index)
8062 	    || maybe_ge (tree_to_uhwi (index), TYPE_VECTOR_SUBPARTS (type)))
8063           warning_at (loc, OPT_Warray_bounds, "index value is out of bound");
8064 
8065       /* We are building an ARRAY_REF so mark the vector as addressable
8066          to not run into the gimplifiers premature setting of DECL_GIMPLE_REG_P
8067 	 for function parameters.  */
8068       c_common_mark_addressable_vec (*vecp);
8069 
8070       *vecp = build1 (VIEW_CONVERT_EXPR,
8071 		      build_array_type_nelts (TREE_TYPE (type),
8072 					      TYPE_VECTOR_SUBPARTS (type)),
8073 		      *vecp);
8074     }
8075   return ret;
8076 }
8077 
8078 /* Determine which of the operands, if any, is a scalar that needs to be
8079    converted to a vector, for the range of operations.  */
8080 enum stv_conv
scalar_to_vector(location_t loc,enum tree_code code,tree op0,tree op1,bool complain)8081 scalar_to_vector (location_t loc, enum tree_code code, tree op0, tree op1,
8082 		  bool complain)
8083 {
8084   tree type0 = TREE_TYPE (op0);
8085   tree type1 = TREE_TYPE (op1);
8086   bool integer_only_op = false;
8087   enum stv_conv ret = stv_firstarg;
8088 
8089   gcc_assert (gnu_vector_type_p (type0) || gnu_vector_type_p (type1));
8090   switch (code)
8091     {
8092       /* Most GENERIC binary expressions require homogeneous arguments.
8093 	 LSHIFT_EXPR and RSHIFT_EXPR are exceptions and accept a first
8094 	 argument that is a vector and a second one that is a scalar, so
8095 	 we never return stv_secondarg for them.  */
8096       case RSHIFT_EXPR:
8097       case LSHIFT_EXPR:
8098 	if (TREE_CODE (type0) == INTEGER_TYPE
8099 	    && TREE_CODE (TREE_TYPE (type1)) == INTEGER_TYPE)
8100 	  {
8101 	    if (unsafe_conversion_p (TREE_TYPE (type1), op0,
8102 				     NULL_TREE, false))
8103 	      {
8104 		if (complain)
8105 		  error_at (loc, "conversion of scalar %qT to vector %qT "
8106 			    "involves truncation", type0, type1);
8107 		return stv_error;
8108 	      }
8109 	    else
8110 	      return stv_firstarg;
8111 	  }
8112 	break;
8113 
8114       case BIT_IOR_EXPR:
8115       case BIT_XOR_EXPR:
8116       case BIT_AND_EXPR:
8117 	integer_only_op = true;
8118 	/* fall through */
8119 
8120       case VEC_COND_EXPR:
8121 
8122       case PLUS_EXPR:
8123       case MINUS_EXPR:
8124       case MULT_EXPR:
8125       case TRUNC_DIV_EXPR:
8126       case CEIL_DIV_EXPR:
8127       case FLOOR_DIV_EXPR:
8128       case ROUND_DIV_EXPR:
8129       case EXACT_DIV_EXPR:
8130       case TRUNC_MOD_EXPR:
8131       case FLOOR_MOD_EXPR:
8132       case RDIV_EXPR:
8133       case EQ_EXPR:
8134       case NE_EXPR:
8135       case LE_EXPR:
8136       case GE_EXPR:
8137       case LT_EXPR:
8138       case GT_EXPR:
8139       /* What about UNLT_EXPR?  */
8140 	if (gnu_vector_type_p (type0))
8141 	  {
8142 	    ret = stv_secondarg;
8143 	    std::swap (type0, type1);
8144 	    std::swap (op0, op1);
8145 	  }
8146 
8147 	if (TREE_CODE (type0) == INTEGER_TYPE
8148 	    && TREE_CODE (TREE_TYPE (type1)) == INTEGER_TYPE)
8149 	  {
8150 	    if (unsafe_conversion_p (TREE_TYPE (type1), op0,
8151 				     NULL_TREE, false))
8152 	      {
8153 		if (complain)
8154 		  error_at (loc, "conversion of scalar %qT to vector %qT "
8155 			    "involves truncation", type0, type1);
8156 		return stv_error;
8157 	      }
8158 	    return ret;
8159 	  }
8160 	else if (!integer_only_op
8161 		    /* Allow integer --> real conversion if safe.  */
8162 		 && (TREE_CODE (type0) == REAL_TYPE
8163 		     || TREE_CODE (type0) == INTEGER_TYPE)
8164 		 && SCALAR_FLOAT_TYPE_P (TREE_TYPE (type1)))
8165 	  {
8166 	    if (unsafe_conversion_p (TREE_TYPE (type1), op0,
8167 				     NULL_TREE, false))
8168 	      {
8169 		if (complain)
8170 		  error_at (loc, "conversion of scalar %qT to vector %qT "
8171 			    "involves truncation", type0, type1);
8172 		return stv_error;
8173 	      }
8174 	    return ret;
8175 	  }
8176       default:
8177 	break;
8178     }
8179 
8180   return stv_nothing;
8181 }
8182 
8183 /* Return the alignment of std::max_align_t.
8184 
8185    [support.types.layout] The type max_align_t is a POD type whose alignment
8186    requirement is at least as great as that of every scalar type, and whose
8187    alignment requirement is supported in every context.  */
8188 
8189 unsigned
max_align_t_align()8190 max_align_t_align ()
8191 {
8192   unsigned int max_align = MAX (TYPE_ALIGN (long_long_integer_type_node),
8193 				TYPE_ALIGN (long_double_type_node));
8194   if (float128_type_node != NULL_TREE)
8195     max_align = MAX (max_align, TYPE_ALIGN (float128_type_node));
8196   return max_align;
8197 }
8198 
8199 /* Return true iff ALIGN is an integral constant that is a fundamental
8200    alignment, as defined by [basic.align] in the c++-11
8201    specifications.
8202 
8203    That is:
8204 
8205        [A fundamental alignment is represented by an alignment less than or
8206         equal to the greatest alignment supported by the implementation
8207         in all contexts, which is equal to alignof(max_align_t)].  */
8208 
8209 bool
cxx_fundamental_alignment_p(unsigned align)8210 cxx_fundamental_alignment_p (unsigned align)
8211 {
8212   return (align <= max_align_t_align ());
8213 }
8214 
8215 /* Return true if T is a pointer to a zero-sized aggregate.  */
8216 
8217 bool
pointer_to_zero_sized_aggr_p(tree t)8218 pointer_to_zero_sized_aggr_p (tree t)
8219 {
8220   if (!POINTER_TYPE_P (t))
8221     return false;
8222   t = TREE_TYPE (t);
8223   return (TYPE_SIZE (t) && integer_zerop (TYPE_SIZE (t)));
8224 }
8225 
8226 /* For an EXPR of a FUNCTION_TYPE that references a GCC built-in function
8227    with no library fallback or for an ADDR_EXPR whose operand is such type
8228    issues an error pointing to the location LOC.
8229    Returns true when the expression has been diagnosed and false
8230    otherwise.  */
8231 
8232 bool
reject_gcc_builtin(const_tree expr,location_t loc)8233 reject_gcc_builtin (const_tree expr, location_t loc /* = UNKNOWN_LOCATION */)
8234 {
8235   if (TREE_CODE (expr) == ADDR_EXPR)
8236     expr = TREE_OPERAND (expr, 0);
8237 
8238   STRIP_ANY_LOCATION_WRAPPER (expr);
8239 
8240   if (TREE_TYPE (expr)
8241       && TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE
8242       && TREE_CODE (expr) == FUNCTION_DECL
8243       /* The intersection of DECL_BUILT_IN and DECL_IS_BUILTIN avoids
8244 	 false positives for user-declared built-ins such as abs or
8245 	 strlen, and for C++ operators new and delete.
8246 	 The c_decl_implicit() test avoids false positives for implicitly
8247 	 declared built-ins with library fallbacks (such as abs).  */
8248       && fndecl_built_in_p (expr)
8249       && DECL_IS_BUILTIN (expr)
8250       && !c_decl_implicit (expr)
8251       && !DECL_ASSEMBLER_NAME_SET_P (expr))
8252     {
8253       if (loc == UNKNOWN_LOCATION)
8254 	loc = EXPR_LOC_OR_LOC (expr, input_location);
8255 
8256       /* Reject arguments that are built-in functions with
8257 	 no library fallback.  */
8258       error_at (loc, "built-in function %qE must be directly called", expr);
8259 
8260       return true;
8261     }
8262 
8263   return false;
8264 }
8265 
8266 /* Issue an ERROR for an invalid SIZE of array NAME which is null
8267    for unnamed arrays.  */
8268 
8269 void
invalid_array_size_error(location_t loc,cst_size_error error,const_tree size,const_tree name)8270 invalid_array_size_error (location_t loc, cst_size_error error,
8271 			  const_tree size, const_tree name)
8272 {
8273   tree maxsize = max_object_size ();
8274   switch (error)
8275     {
8276     case cst_size_not_constant:
8277       if (name)
8278 	error_at (loc, "size of array %qE is not a constant expression",
8279 		  name);
8280       else
8281 	error_at (loc, "size of array is not a constant expression");
8282       break;
8283     case cst_size_negative:
8284       if (name)
8285 	error_at (loc, "size %qE of array %qE is negative",
8286 		  size, name);
8287       else
8288 	error_at (loc, "size %qE of array is negative",
8289 		  size);
8290       break;
8291     case cst_size_too_big:
8292       if (name)
8293 	error_at (loc, "size %qE of array %qE exceeds maximum "
8294 		  "object size %qE", size, name, maxsize);
8295       else
8296 	error_at (loc, "size %qE of array exceeds maximum "
8297 		  "object size %qE", size, maxsize);
8298       break;
8299     case cst_size_overflow:
8300       if (name)
8301 	error_at (loc, "size of array %qE exceeds maximum "
8302 		  "object size %qE", name, maxsize);
8303       else
8304 	error_at (loc, "size of array exceeds maximum "
8305 		  "object size %qE", maxsize);
8306       break;
8307     default:
8308       gcc_unreachable ();
8309     }
8310 }
8311 
8312 /* Check if array size calculations overflow or if the array covers more
8313    than half of the address space.  Return true if the size of the array
8314    is valid, false otherwise.  T is either the type of the array or its
8315    size, and NAME is the name of the array, or null for unnamed arrays.  */
8316 
8317 bool
valid_array_size_p(location_t loc,const_tree t,tree name,bool complain)8318 valid_array_size_p (location_t loc, const_tree t, tree name, bool complain)
8319 {
8320   if (t == error_mark_node)
8321     return true;
8322 
8323   const_tree size;
8324   if (TYPE_P (t))
8325     {
8326       if (!COMPLETE_TYPE_P (t))
8327 	return true;
8328       size = TYPE_SIZE_UNIT (t);
8329     }
8330   else
8331     size = t;
8332 
8333   if (TREE_CODE (size) != INTEGER_CST)
8334     return true;
8335 
8336   cst_size_error error;
8337   if (valid_constant_size_p (size, &error))
8338     return true;
8339 
8340   if (!complain)
8341     return false;
8342 
8343   if (TREE_CODE (TREE_TYPE (size)) == ENUMERAL_TYPE)
8344     /* Show the value of the enumerator rather than its name.  */
8345     size = convert (ssizetype, const_cast<tree> (size));
8346 
8347   invalid_array_size_error (loc, error, size, name);
8348   return false;
8349 }
8350 
8351 /* Read SOURCE_DATE_EPOCH from environment to have a deterministic
8352    timestamp to replace embedded current dates to get reproducible
8353    results.  Returns -1 if SOURCE_DATE_EPOCH is not defined.  */
8354 
8355 time_t
cb_get_source_date_epoch(cpp_reader * pfile ATTRIBUTE_UNUSED)8356 cb_get_source_date_epoch (cpp_reader *pfile ATTRIBUTE_UNUSED)
8357 {
8358   char *source_date_epoch;
8359   int64_t epoch;
8360   char *endptr;
8361 
8362   source_date_epoch = getenv ("SOURCE_DATE_EPOCH");
8363   if (!source_date_epoch)
8364     return (time_t) -1;
8365 
8366   errno = 0;
8367 #if defined(INT64_T_IS_LONG)
8368   epoch = strtol (source_date_epoch, &endptr, 10);
8369 #else
8370   epoch = strtoll (source_date_epoch, &endptr, 10);
8371 #endif
8372   if (errno != 0 || endptr == source_date_epoch || *endptr != '\0'
8373       || epoch < 0 || epoch > MAX_SOURCE_DATE_EPOCH)
8374     {
8375       error_at (input_location, "environment variable %qs must "
8376 	        "expand to a non-negative integer less than or equal to %wd",
8377 		"SOURCE_DATE_EPOCH", MAX_SOURCE_DATE_EPOCH);
8378       return (time_t) -1;
8379     }
8380 
8381   return (time_t) epoch;
8382 }
8383 
8384 /* Callback for libcpp for offering spelling suggestions for misspelled
8385    directives.  GOAL is an unrecognized string; CANDIDATES is a
8386    NULL-terminated array of candidate strings.  Return the closest
8387    match to GOAL within CANDIDATES, or NULL if none are good
8388    suggestions.  */
8389 
8390 const char *
cb_get_suggestion(cpp_reader *,const char * goal,const char * const * candidates)8391 cb_get_suggestion (cpp_reader *, const char *goal,
8392 		   const char *const *candidates)
8393 {
8394   best_match<const char *, const char *> bm (goal);
8395   while (*candidates)
8396     bm.consider (*candidates++);
8397   return bm.get_best_meaningful_candidate ();
8398 }
8399 
8400 /* Return the latice point which is the wider of the two FLT_EVAL_METHOD
8401    modes X, Y.  This isn't just  >, as the FLT_EVAL_METHOD values added
8402    by C TS 18661-3 for interchange  types that are computed in their
8403    native precision are larger than the C11 values for evaluating in the
8404    precision of float/double/long double.  If either mode is
8405    FLT_EVAL_METHOD_UNPREDICTABLE, return that.  */
8406 
8407 enum flt_eval_method
excess_precision_mode_join(enum flt_eval_method x,enum flt_eval_method y)8408 excess_precision_mode_join (enum flt_eval_method x,
8409 			    enum flt_eval_method y)
8410 {
8411   if (x == FLT_EVAL_METHOD_UNPREDICTABLE
8412       || y == FLT_EVAL_METHOD_UNPREDICTABLE)
8413     return FLT_EVAL_METHOD_UNPREDICTABLE;
8414 
8415   /* GCC only supports one interchange type right now, _Float16.  If
8416      we're evaluating _Float16 in 16-bit precision, then flt_eval_method
8417      will be FLT_EVAL_METHOD_PROMOTE_TO_FLOAT16.  */
8418   if (x == FLT_EVAL_METHOD_PROMOTE_TO_FLOAT16)
8419     return y;
8420   if (y == FLT_EVAL_METHOD_PROMOTE_TO_FLOAT16)
8421     return x;
8422 
8423   /* Other values for flt_eval_method are directly comparable, and we want
8424      the maximum.  */
8425   return MAX (x, y);
8426 }
8427 
8428 /* Return the value that should be set for FLT_EVAL_METHOD in the
8429    context of ISO/IEC TS 18861-3.
8430 
8431    This relates to the effective excess precision seen by the user,
8432    which is the join point of the precision the target requests for
8433    -fexcess-precision={standard,fast} and the implicit excess precision
8434    the target uses.  */
8435 
8436 static enum flt_eval_method
c_ts18661_flt_eval_method(void)8437 c_ts18661_flt_eval_method (void)
8438 {
8439   enum flt_eval_method implicit
8440     = targetm.c.excess_precision (EXCESS_PRECISION_TYPE_IMPLICIT);
8441 
8442   enum excess_precision_type flag_type
8443     = (flag_excess_precision == EXCESS_PRECISION_STANDARD
8444        ? EXCESS_PRECISION_TYPE_STANDARD
8445        : EXCESS_PRECISION_TYPE_FAST);
8446 
8447   enum flt_eval_method requested
8448     = targetm.c.excess_precision (flag_type);
8449 
8450   return excess_precision_mode_join (implicit, requested);
8451 }
8452 
8453 /* As c_cpp_ts18661_flt_eval_method, but clamps the expected values to
8454    those that were permitted by C11.  That is to say, eliminates
8455    FLT_EVAL_METHOD_PROMOTE_TO_FLOAT16.  */
8456 
8457 static enum flt_eval_method
c_c11_flt_eval_method(void)8458 c_c11_flt_eval_method (void)
8459 {
8460   return excess_precision_mode_join (c_ts18661_flt_eval_method (),
8461 				     FLT_EVAL_METHOD_PROMOTE_TO_FLOAT);
8462 }
8463 
8464 /* Return the value that should be set for FLT_EVAL_METHOD.
8465    MAYBE_C11_ONLY_P is TRUE if we should check
8466    FLAG_PERMITTED_EVAL_METHODS as to whether we should limit the possible
8467    values we can return to those from C99/C11, and FALSE otherwise.
8468    See the comments on c_ts18661_flt_eval_method for what value we choose
8469    to set here.  */
8470 
8471 int
c_flt_eval_method(bool maybe_c11_only_p)8472 c_flt_eval_method (bool maybe_c11_only_p)
8473 {
8474   if (maybe_c11_only_p
8475       && flag_permitted_flt_eval_methods
8476 	  == PERMITTED_FLT_EVAL_METHODS_C11)
8477     return c_c11_flt_eval_method ();
8478   else
8479     return c_ts18661_flt_eval_method ();
8480 }
8481 
8482 /* An enum for get_missing_token_insertion_kind for describing the best
8483    place to insert a missing token, if there is one.  */
8484 
8485 enum missing_token_insertion_kind
8486 {
8487   MTIK_IMPOSSIBLE,
8488   MTIK_INSERT_BEFORE_NEXT,
8489   MTIK_INSERT_AFTER_PREV
8490 };
8491 
8492 /* Given a missing token of TYPE, determine if it is reasonable to
8493    emit a fix-it hint suggesting the insertion of the token, and,
8494    if so, where the token should be inserted relative to other tokens.
8495 
8496    It only makes sense to do this for values of TYPE that are symbols.
8497 
8498    Some symbols should go before the next token, e.g. in:
8499      if flag)
8500    we want to insert the missing '(' immediately before "flag",
8501    giving:
8502      if (flag)
8503    rather than:
8504      if( flag)
8505    These use MTIK_INSERT_BEFORE_NEXT.
8506 
8507    Other symbols should go after the previous token, e.g. in:
8508      if (flag
8509        do_something ();
8510    we want to insert the missing ')' immediately after the "flag",
8511    giving:
8512      if (flag)
8513        do_something ();
8514    rather than:
8515      if (flag
8516        )do_something ();
8517    These use MTIK_INSERT_AFTER_PREV.  */
8518 
8519 static enum missing_token_insertion_kind
get_missing_token_insertion_kind(enum cpp_ttype type)8520 get_missing_token_insertion_kind (enum cpp_ttype type)
8521 {
8522   switch (type)
8523     {
8524       /* Insert missing "opening" brackets immediately
8525 	 before the next token.  */
8526     case CPP_OPEN_SQUARE:
8527     case CPP_OPEN_PAREN:
8528       return MTIK_INSERT_BEFORE_NEXT;
8529 
8530       /* Insert other missing symbols immediately after
8531 	 the previous token.  */
8532     case CPP_CLOSE_PAREN:
8533     case CPP_CLOSE_SQUARE:
8534     case CPP_SEMICOLON:
8535     case CPP_COMMA:
8536     case CPP_COLON:
8537       return MTIK_INSERT_AFTER_PREV;
8538 
8539       /* Other kinds of token don't get fix-it hints.  */
8540     default:
8541       return MTIK_IMPOSSIBLE;
8542     }
8543 }
8544 
8545 /* Given RICHLOC, a location for a diagnostic describing a missing token
8546    of kind TOKEN_TYPE, potentially add a fix-it hint suggesting the
8547    insertion of the token.
8548 
8549    The location of the attempted fix-it hint depends on TOKEN_TYPE:
8550    it will either be:
8551      (a) immediately after PREV_TOKEN_LOC, or
8552 
8553      (b) immediately before the primary location within RICHLOC (taken to
8554 	 be that of the token following where the token was expected).
8555 
8556    If we manage to add a fix-it hint, then the location of the
8557    fix-it hint is likely to be more useful as the primary location
8558    of the diagnostic than that of the following token, so we swap
8559    these locations.
8560 
8561    For example, given this bogus code:
8562        123456789012345678901234567890
8563    1 | int missing_semicolon (void)
8564    2 | {
8565    3 |   return 42
8566    4 | }
8567 
8568    we will emit:
8569 
8570      "expected ';' before '}'"
8571 
8572    RICHLOC's primary location is at the closing brace, so before "swapping"
8573    we would emit the error at line 4 column 1:
8574 
8575        123456789012345678901234567890
8576    3 |   return 42  |< fix-it hint emitted for this line
8577      |            ; |
8578    4 | }            |< "expected ';' before '}'" emitted at this line
8579      | ^            |
8580 
8581    It's more useful for the location of the diagnostic to be at the
8582    fix-it hint, so we swap the locations, so the primary location
8583    is at the fix-it hint, with the old primary location inserted
8584    as a secondary location, giving this, with the error at line 3
8585    column 12:
8586 
8587        123456789012345678901234567890
8588    3 |   return 42   |< "expected ';' before '}'" emitted at this line,
8589      |            ^  |   with fix-it hint
8590    4 |            ;  |
8591      | }             |< secondary range emitted here
8592      | ~             |.  */
8593 
8594 void
maybe_suggest_missing_token_insertion(rich_location * richloc,enum cpp_ttype token_type,location_t prev_token_loc)8595 maybe_suggest_missing_token_insertion (rich_location *richloc,
8596 				       enum cpp_ttype token_type,
8597 				       location_t prev_token_loc)
8598 {
8599   gcc_assert (richloc);
8600 
8601   enum missing_token_insertion_kind mtik
8602     = get_missing_token_insertion_kind (token_type);
8603 
8604   switch (mtik)
8605     {
8606     default:
8607       gcc_unreachable ();
8608       break;
8609 
8610     case MTIK_IMPOSSIBLE:
8611       return;
8612 
8613     case MTIK_INSERT_BEFORE_NEXT:
8614       /* Attempt to add the fix-it hint before the primary location
8615 	 of RICHLOC.  */
8616       richloc->add_fixit_insert_before (cpp_type2name (token_type, 0));
8617       break;
8618 
8619     case MTIK_INSERT_AFTER_PREV:
8620       /* Attempt to add the fix-it hint after PREV_TOKEN_LOC.  */
8621       richloc->add_fixit_insert_after (prev_token_loc,
8622 				       cpp_type2name (token_type, 0));
8623       break;
8624     }
8625 
8626   /* If we were successful, use the fix-it hint's location as the
8627      primary location within RICHLOC, adding the old primary location
8628      back as a secondary location.  */
8629   if (!richloc->seen_impossible_fixit_p ())
8630     {
8631       fixit_hint *hint = richloc->get_last_fixit_hint ();
8632       location_t hint_loc = hint->get_start_loc ();
8633       location_t old_loc = richloc->get_loc ();
8634 
8635       richloc->set_range (0, hint_loc, SHOW_RANGE_WITH_CARET);
8636       richloc->add_range (old_loc);
8637     }
8638 }
8639 
8640 #if CHECKING_P
8641 
8642 namespace selftest {
8643 
8644 /* Verify that fold_for_warn on error_mark_node is safe.  */
8645 
8646 static void
test_fold_for_warn()8647 test_fold_for_warn ()
8648 {
8649   ASSERT_EQ (error_mark_node, fold_for_warn (error_mark_node));
8650 }
8651 
8652 /* Run all of the selftests within this file.  */
8653 
8654 static void
c_common_c_tests()8655 c_common_c_tests ()
8656 {
8657   test_fold_for_warn ();
8658 }
8659 
8660 /* Run all of the tests within c-family.  */
8661 
8662 void
c_family_tests(void)8663 c_family_tests (void)
8664 {
8665   c_common_c_tests ();
8666   c_format_c_tests ();
8667   c_indentation_c_tests ();
8668   c_pretty_print_c_tests ();
8669   c_spellcheck_cc_tests ();
8670 }
8671 
8672 } // namespace selftest
8673 
8674 #endif /* #if CHECKING_P */
8675 
8676 /* Attempt to locate a suitable location within FILE for a
8677    #include directive to be inserted before.  FILE should
8678    be a string from libcpp (pointer equality is used).
8679    LOC is the location of the relevant diagnostic.
8680 
8681    Attempt to return the location within FILE immediately
8682    after the last #include within that file, or the start of
8683    that file if it has no #include directives.
8684 
8685    Return UNKNOWN_LOCATION if no suitable location is found,
8686    or if an error occurs.  */
8687 
8688 static location_t
try_to_locate_new_include_insertion_point(const char * file,location_t loc)8689 try_to_locate_new_include_insertion_point (const char *file, location_t loc)
8690 {
8691   /* Locate the last ordinary map within FILE that ended with a #include.  */
8692   const line_map_ordinary *last_include_ord_map = NULL;
8693 
8694   /* ...and the next ordinary map within FILE after that one.  */
8695   const line_map_ordinary *last_ord_map_after_include = NULL;
8696 
8697   /* ...and the first ordinary map within FILE.  */
8698   const line_map_ordinary *first_ord_map_in_file = NULL;
8699 
8700   /*  Get ordinary map containing LOC (or its expansion).  */
8701   const line_map_ordinary *ord_map_for_loc = NULL;
8702   linemap_resolve_location (line_table, loc, LRK_MACRO_EXPANSION_POINT,
8703 			    &ord_map_for_loc);
8704   gcc_assert (ord_map_for_loc);
8705 
8706   for (unsigned int i = 0; i < LINEMAPS_ORDINARY_USED (line_table); i++)
8707     {
8708       const line_map_ordinary *ord_map
8709 	= LINEMAPS_ORDINARY_MAP_AT (line_table, i);
8710 
8711       if (const line_map_ordinary *from
8712 	  = linemap_included_from_linemap (line_table, ord_map))
8713 	if (from->to_file == file)
8714 	  {
8715 	    last_include_ord_map = from;
8716 	    last_ord_map_after_include = NULL;
8717 	  }
8718 
8719       if (ord_map->to_file == file)
8720 	{
8721 	  if (!first_ord_map_in_file)
8722 	    first_ord_map_in_file = ord_map;
8723 	  if (last_include_ord_map && !last_ord_map_after_include)
8724 	    last_ord_map_after_include = ord_map;
8725 	}
8726 
8727       /* Stop searching when reaching the ord_map containing LOC,
8728 	 as it makes no sense to provide fix-it hints that appear
8729 	 after the diagnostic in question.  */
8730       if (ord_map == ord_map_for_loc)
8731 	break;
8732     }
8733 
8734   /* Determine where to insert the #include.  */
8735   const line_map_ordinary *ord_map_for_insertion;
8736 
8737   /* We want the next ordmap in the file after the last one that's a
8738      #include, but failing that, the start of the file.  */
8739   if (last_ord_map_after_include)
8740     ord_map_for_insertion = last_ord_map_after_include;
8741   else
8742     ord_map_for_insertion = first_ord_map_in_file;
8743 
8744   if (!ord_map_for_insertion)
8745     return UNKNOWN_LOCATION;
8746 
8747   /* The "start_location" is column 0, meaning "the whole line".
8748      rich_location and edit_context can't cope with this, so use
8749      column 1 instead.  */
8750   location_t col_0 = ord_map_for_insertion->start_location;
8751   return linemap_position_for_loc_and_offset (line_table, col_0, 1);
8752 }
8753 
8754 /* A map from filenames to sets of headers added to them, for
8755    ensuring idempotency within maybe_add_include_fixit.  */
8756 
8757 /* The values within the map.  We need string comparison as there's
8758    no guarantee that two different diagnostics that are recommending
8759    adding e.g. "<stdio.h>" are using the same buffer.  */
8760 
8761 typedef hash_set <const char *, false, nofree_string_hash> per_file_includes_t;
8762 
8763 /* The map itself.  We don't need string comparison for the filename keys,
8764    as they come from libcpp.  */
8765 
8766 typedef hash_map <const char *, per_file_includes_t *> added_includes_t;
8767 static added_includes_t *added_includes;
8768 
8769 /* Attempt to add a fix-it hint to RICHLOC, adding "#include HEADER\n"
8770    in a suitable location within the file of RICHLOC's primary
8771    location.
8772 
8773    This function is idempotent: a header will be added at most once to
8774    any given file.
8775 
8776    If OVERRIDE_LOCATION is true, then if a fix-it is added and will be
8777    printed, then RICHLOC's primary location will be replaced by that of
8778    the fix-it hint (for use by "inform" notes where the location of the
8779    issue has already been reported).  */
8780 
8781 void
maybe_add_include_fixit(rich_location * richloc,const char * header,bool override_location)8782 maybe_add_include_fixit (rich_location *richloc, const char *header,
8783 			 bool override_location)
8784 {
8785   location_t loc = richloc->get_loc ();
8786   const char *file = LOCATION_FILE (loc);
8787   if (!file)
8788     return;
8789 
8790   /* Idempotency: don't add the same header more than once to a given file.  */
8791   if (!added_includes)
8792     added_includes = new added_includes_t ();
8793   per_file_includes_t *&set = added_includes->get_or_insert (file);
8794   if (set)
8795     if (set->contains (header))
8796       /* ...then we've already added HEADER to that file.  */
8797       return;
8798   if (!set)
8799     set = new per_file_includes_t ();
8800   set->add (header);
8801 
8802   /* Attempt to locate a suitable place for the new directive.  */
8803   location_t include_insert_loc
8804     = try_to_locate_new_include_insertion_point (file, loc);
8805   if (include_insert_loc == UNKNOWN_LOCATION)
8806     return;
8807 
8808   char *text = xasprintf ("#include %s\n", header);
8809   richloc->add_fixit_insert_before (include_insert_loc, text);
8810   free (text);
8811 
8812   if (override_location && global_dc->show_caret)
8813     {
8814       /* Replace the primary location with that of the insertion point for the
8815 	 fix-it hint.
8816 
8817 	 We use SHOW_LINES_WITHOUT_RANGE so that we don't meaningless print a
8818 	 caret for the insertion point (or colorize it).
8819 
8820 	 Hence we print e.g.:
8821 
8822 	 ../x86_64-pc-linux-gnu/libstdc++-v3/include/vector:74:1: note: msg 2
8823 	  73 | # include <debug/vector>
8824 	 +++ |+#include <vector>
8825 	  74 | #endif
8826 
8827 	 rather than:
8828 
8829 	 ../x86_64-pc-linux-gnu/libstdc++-v3/include/vector:74:1: note: msg 2
8830 	  73 | # include <debug/vector>
8831 	 +++ |+#include <vector>
8832 	  74 | #endif
8833 	     | ^
8834 
8835 	 avoiding the caret on the first column of line 74.  */
8836       richloc->set_range (0, include_insert_loc, SHOW_LINES_WITHOUT_RANGE);
8837     }
8838 }
8839 
8840 /* Attempt to convert a braced array initializer list CTOR for array
8841    TYPE into a STRING_CST for convenience and efficiency.  Return
8842    the converted string on success or the original ctor on failure.  */
8843 
8844 static tree
braced_list_to_string(tree type,tree ctor,bool member)8845 braced_list_to_string (tree type, tree ctor, bool member)
8846 {
8847   /* Ignore non-members with unknown size like arrays with unspecified
8848      bound.  */
8849   tree typesize = TYPE_SIZE_UNIT (type);
8850   if (!member && !tree_fits_uhwi_p (typesize))
8851     return ctor;
8852 
8853   /* If the array has an explicit bound, use it to constrain the size
8854      of the string.  If it doesn't, be sure to create a string that's
8855      as long as implied by the index of the last zero specified via
8856      a designator, as in:
8857        const char a[] = { [7] = 0 };  */
8858   unsigned HOST_WIDE_INT maxelts;
8859   if (typesize)
8860     {
8861       maxelts = tree_to_uhwi (typesize);
8862       maxelts /= tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (type)));
8863     }
8864   else
8865     maxelts = HOST_WIDE_INT_M1U;
8866 
8867   /* Avoid converting initializers for zero-length arrays (but do
8868      create them for flexible array members).  */
8869   if (!maxelts)
8870     return ctor;
8871 
8872   unsigned HOST_WIDE_INT nelts = CONSTRUCTOR_NELTS (ctor);
8873 
8874   auto_vec<char> str;
8875   str.reserve (nelts + 1);
8876 
8877   unsigned HOST_WIDE_INT i;
8878   tree index, value;
8879 
8880   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), i, index, value)
8881     {
8882       unsigned HOST_WIDE_INT idx = i;
8883       if (index)
8884 	{
8885 	  if (!tree_fits_uhwi_p (index))
8886 	    return ctor;
8887 	  idx = tree_to_uhwi (index);
8888 	}
8889 
8890       /* auto_vec is limited to UINT_MAX elements.  */
8891       if (idx > UINT_MAX)
8892 	return ctor;
8893 
8894      /* Avoid non-constant initializers.  */
8895      if (!tree_fits_shwi_p (value))
8896 	return ctor;
8897 
8898       /* Skip over embedded nuls except the last one (initializer
8899 	 elements are in ascending order of indices).  */
8900       HOST_WIDE_INT val = tree_to_shwi (value);
8901       if (!val && i + 1 < nelts)
8902 	continue;
8903 
8904       if (idx < str.length())
8905 	return ctor;
8906 
8907       /* Bail if the CTOR has a block of more than 256 embedded nuls
8908 	 due to implicitly initialized elements.  */
8909       unsigned nchars = (idx - str.length ()) + 1;
8910       if (nchars > 256)
8911 	return ctor;
8912 
8913       if (nchars > 1)
8914 	{
8915 	  str.reserve (idx);
8916 	  str.quick_grow_cleared (idx);
8917 	}
8918 
8919       if (idx >= maxelts)
8920 	return ctor;
8921 
8922       str.safe_insert (idx, val);
8923     }
8924 
8925   /* Append a nul string termination.  */
8926   if (maxelts != HOST_WIDE_INT_M1U && str.length () < maxelts)
8927     str.safe_push (0);
8928 
8929   /* Build a STRING_CST with the same type as the array.  */
8930   tree res = build_string (str.length (), str.begin ());
8931   TREE_TYPE (res) = type;
8932   return res;
8933 }
8934 
8935 /* Implementation of the two-argument braced_lists_to_string withe
8936    the same arguments plus MEMBER which is set for struct members
8937    to allow initializers for flexible member arrays.  */
8938 
8939 static tree
braced_lists_to_strings(tree type,tree ctor,bool member)8940 braced_lists_to_strings (tree type, tree ctor, bool member)
8941 {
8942   if (TREE_CODE (ctor) != CONSTRUCTOR)
8943     return ctor;
8944 
8945   tree_code code = TREE_CODE (type);
8946 
8947   tree ttp;
8948   if (code == ARRAY_TYPE)
8949     ttp = TREE_TYPE (type);
8950   else if (code == RECORD_TYPE)
8951     {
8952       ttp = TREE_TYPE (ctor);
8953       if (TREE_CODE (ttp) == ARRAY_TYPE)
8954 	{
8955 	  type = ttp;
8956 	  ttp = TREE_TYPE (ttp);
8957 	}
8958     }
8959   else
8960     return ctor;
8961 
8962   if ((TREE_CODE (ttp) == ARRAY_TYPE || TREE_CODE (ttp) == INTEGER_TYPE)
8963       && TYPE_STRING_FLAG (ttp))
8964     return braced_list_to_string (type, ctor, member);
8965 
8966   code = TREE_CODE (ttp);
8967   if (code == ARRAY_TYPE || RECORD_OR_UNION_TYPE_P (ttp))
8968     {
8969       bool rec = RECORD_OR_UNION_TYPE_P (ttp);
8970 
8971       /* Handle array of arrays or struct member initializers.  */
8972       tree val;
8973       unsigned HOST_WIDE_INT idx;
8974       FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (ctor), idx, val)
8975 	{
8976 	  val = braced_lists_to_strings (ttp, val, rec);
8977 	  CONSTRUCTOR_ELT (ctor, idx)->value = val;
8978 	}
8979     }
8980 
8981   return ctor;
8982 }
8983 
8984 /* Attempt to convert a CTOR containing braced array initializer lists
8985    for array TYPE into one containing STRING_CSTs, for convenience and
8986    efficiency.  Recurse for arrays of arrays and member initializers.
8987    Return the converted CTOR or STRING_CST on success or the original
8988    CTOR otherwise.  */
8989 
8990 tree
braced_lists_to_strings(tree type,tree ctor)8991 braced_lists_to_strings (tree type, tree ctor)
8992 {
8993   return braced_lists_to_strings (type, ctor, false);
8994 }
8995 
8996 #include "gt-c-family-c-common.h"
8997