PR27116, Spelling errors found by Debian style checker
[official-gcc.git] / gcc / c / c-objc-common.cc
blobe4aed61ed007ce507009c2f31f437f77398d8c7e
1 /* Some code common to C and ObjC front ends.
2 Copyright (C) 2001-2023 Free Software Foundation, Inc.
4 This file is part of GCC.
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.
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.
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/>. */
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "c-tree.h"
24 #include "intl.h"
25 #include "c-family/c-pretty-print.h"
26 #include "tree-pretty-print.h"
27 #include "gimple-pretty-print.h"
28 #include "langhooks.h"
29 #include "c-objc-common.h"
30 #include "gcc-rich-location.h"
31 #include "stringpool.h"
32 #include "attribs.h"
34 static bool c_tree_printer (pretty_printer *, text_info *, const char *,
35 int, bool, bool, bool, bool *, const char **);
37 bool
38 c_missing_noreturn_ok_p (tree decl)
40 /* A missing noreturn is ok for the `main' function. */
41 if (!MAIN_NAME_P (DECL_ASSEMBLER_NAME (decl)))
42 return false;
44 return flag_hosted
45 || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (decl))) == integer_type_node;
48 /* Called from check_global_declaration. */
50 bool
51 c_warn_unused_global_decl (const_tree decl)
53 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl))
54 return false;
55 if (DECL_IN_SYSTEM_HEADER (decl))
56 return false;
58 return true;
61 /* Initialization common to C and Objective-C front ends. */
62 bool
63 c_objc_common_init (void)
65 c_init_decl_processing ();
67 return c_common_init ();
70 /* Decide whether it's worth saying that TYPE is also known as some other
71 type. Return the other type if so, otherwise return TYPE. */
73 static tree
74 get_aka_type (tree type)
76 if (type == error_mark_node)
77 return type;
79 tree result;
80 if (typedef_variant_p (type))
82 /* Saying that "foo" is also known as "struct foo" or
83 "struct <anonymous>" is unlikely to be useful, since users of
84 structure-like types would already know that they're structures.
85 The same applies to unions and enums; in general, printing the
86 tag is only useful if it has a different name. */
87 tree orig_type = DECL_ORIGINAL_TYPE (TYPE_NAME (type));
88 tree_code code = TREE_CODE (orig_type);
89 tree orig_id = TYPE_IDENTIFIER (orig_type);
90 if ((code == RECORD_TYPE || code == UNION_TYPE || code == ENUMERAL_TYPE)
91 && (!orig_id || TYPE_IDENTIFIER (type) == orig_id))
92 return type;
94 if (!user_facing_original_type_p (type))
95 return type;
97 result = get_aka_type (orig_type);
99 else
101 tree canonical = TYPE_CANONICAL (type);
102 if (canonical && TREE_CODE (type) != TREE_CODE (canonical))
103 return canonical;
105 /* Recursive calls might choose a middle ground between TYPE
106 (which has no typedefs stripped) and CANONICAL (which has
107 all typedefs stripped). So try to reuse TYPE or CANONICAL if
108 convenient, but be prepared to create a new type if necessary. */
109 switch (TREE_CODE (type))
111 case POINTER_TYPE:
112 case REFERENCE_TYPE:
114 tree target_type = get_aka_type (TREE_TYPE (type));
116 if (target_type == TREE_TYPE (type))
117 return type;
119 if (canonical && target_type == TREE_TYPE (canonical))
120 return canonical;
122 result = (TREE_CODE (type) == POINTER_TYPE
123 ? build_pointer_type (target_type)
124 : build_reference_type (target_type));
125 break;
128 case ARRAY_TYPE:
130 tree element_type = get_aka_type (TREE_TYPE (type));
131 tree index_type = (TYPE_DOMAIN (type)
132 ? get_aka_type (TYPE_DOMAIN (type))
133 : NULL_TREE);
135 if (element_type == TREE_TYPE (type)
136 && index_type == TYPE_DOMAIN (type))
137 return type;
139 if (canonical
140 && element_type == TREE_TYPE (canonical)
141 && index_type == TYPE_DOMAIN (canonical))
142 return canonical;
144 result = build_array_type (element_type, index_type,
145 TYPE_TYPELESS_STORAGE (type));
146 break;
149 case FUNCTION_TYPE:
151 tree return_type = get_aka_type (TREE_TYPE (type));
153 tree args = TYPE_ARG_TYPES (type);
154 if (args == error_mark_node)
155 return type;
157 auto_vec<tree, 32> arg_types;
158 bool type_ok_p = true;
159 while (args && args != void_list_node)
161 tree arg_type = get_aka_type (TREE_VALUE (args));
162 arg_types.safe_push (arg_type);
163 type_ok_p &= (arg_type == TREE_VALUE (args));
164 args = TREE_CHAIN (args);
167 if (type_ok_p && return_type == TREE_TYPE (type))
168 return type;
170 unsigned int i;
171 tree arg_type;
172 FOR_EACH_VEC_ELT_REVERSE (arg_types, i, arg_type)
173 args = tree_cons (NULL_TREE, arg_type, args);
174 result = build_function_type (return_type, args);
175 break;
178 default:
179 return canonical ? canonical : type;
182 return build_type_attribute_qual_variant (result, TYPE_ATTRIBUTES (type),
183 TYPE_QUALS (type));
186 /* Print T to CPP. */
188 static void
189 print_type (c_pretty_printer *cpp, tree t, bool *quoted)
191 if (t == error_mark_node)
193 pp_string (cpp, _("{erroneous}"));
194 return;
197 gcc_assert (TYPE_P (t));
198 struct obstack *ob = pp_buffer (cpp)->obstack;
199 char *p = (char *) obstack_base (ob);
200 /* Remember the end of the initial dump. */
201 int len = obstack_object_size (ob);
203 tree name = TYPE_NAME (t);
204 if (name && TREE_CODE (name) == TYPE_DECL && DECL_NAME (name))
205 pp_identifier (cpp, lang_hooks.decl_printable_name (name, 2));
206 else
207 cpp->type_id (t);
209 /* If we're printing a type that involves typedefs, also print the
210 stripped version. But sometimes the stripped version looks
211 exactly the same, so we don't want it after all. To avoid
212 printing it in that case, we play ugly obstack games. */
213 tree aka_type = get_aka_type (t);
214 if (aka_type != t)
216 c_pretty_printer cpp2;
217 /* Print the stripped version into a temporary printer. */
218 cpp2.type_id (aka_type);
219 struct obstack *ob2 = cpp2.buffer->obstack;
220 /* Get the stripped version from the temporary printer. */
221 const char *aka = (char *) obstack_base (ob2);
222 int aka_len = obstack_object_size (ob2);
223 int type1_len = obstack_object_size (ob) - len;
225 /* If they are identical, bail out. */
226 if (aka_len == type1_len && memcmp (p + len, aka, aka_len) == 0)
227 return;
229 /* They're not, print the stripped version now. */
230 if (*quoted)
231 pp_end_quote (cpp, pp_show_color (cpp));
232 pp_c_whitespace (cpp);
233 pp_left_brace (cpp);
234 pp_c_ws_string (cpp, _("aka"));
235 pp_c_whitespace (cpp);
236 if (*quoted)
237 pp_begin_quote (cpp, pp_show_color (cpp));
238 cpp->type_id (aka_type);
239 if (*quoted)
240 pp_end_quote (cpp, pp_show_color (cpp));
241 pp_right_brace (cpp);
242 /* No further closing quotes are needed. */
243 *quoted = false;
247 /* Called during diagnostic message formatting process to print a
248 source-level entity onto BUFFER. The meaning of the format specifiers
249 is as follows:
250 %D: a general decl,
251 %E: an identifier or expression,
252 %F: a function declaration,
253 %T: a type.
254 %V: a list of type qualifiers from a tree.
255 %v: an explicit list of type qualifiers
256 %#v: an explicit list of type qualifiers of a function type.
258 Please notice when called, the `%' part was already skipped by the
259 diagnostic machinery. */
260 static bool
261 c_tree_printer (pretty_printer *pp, text_info *text, const char *spec,
262 int precision, bool wide, bool set_locus, bool hash,
263 bool *quoted, const char **)
265 tree t = NULL_TREE;
266 // FIXME: the next cast should be a dynamic_cast, when it is permitted.
267 c_pretty_printer *cpp = (c_pretty_printer *) pp;
268 pp->padding = pp_none;
270 if (precision != 0 || wide)
271 return false;
273 if (*spec != 'v')
275 t = va_arg (*text->args_ptr, tree);
276 if (set_locus)
277 text->set_location (0, DECL_SOURCE_LOCATION (t),
278 SHOW_RANGE_WITH_CARET);
281 switch (*spec)
283 case 'D':
284 if (VAR_P (t) && DECL_HAS_DEBUG_EXPR_P (t))
286 t = DECL_DEBUG_EXPR (t);
287 if (!DECL_P (t))
289 cpp->expression (t);
290 return true;
293 /* FALLTHRU */
295 case 'F':
296 if (DECL_NAME (t))
298 pp_identifier (cpp, lang_hooks.decl_printable_name (t, 2));
299 return true;
301 break;
303 case 'T':
304 print_type (cpp, t, quoted);
305 return true;
307 case 'E':
308 if (TREE_CODE (t) == IDENTIFIER_NODE)
309 pp_identifier (cpp, IDENTIFIER_POINTER (t));
310 else
311 cpp->expression (t);
312 return true;
314 case 'V':
315 pp_c_type_qualifier_list (cpp, t);
316 return true;
318 case 'v':
319 pp_c_cv_qualifiers (cpp, va_arg (*text->args_ptr, int), hash);
320 return true;
322 default:
323 return false;
326 pp_string (cpp, _("({anonymous})"));
327 return true;
330 /* C-specific implementation of range_label::get_text () vfunc for
331 range_label_for_type_mismatch. */
333 label_text
334 range_label_for_type_mismatch::get_text (unsigned /*range_idx*/) const
336 if (m_labelled_type == NULL_TREE)
337 return label_text::borrow (NULL);
339 c_pretty_printer cpp;
340 bool quoted = false;
341 print_type (&cpp, m_labelled_type, &quoted);
342 return label_text::take (xstrdup (pp_formatted_text (&cpp)));
346 /* In C and ObjC, all decls have "C" linkage. */
347 bool
348 has_c_linkage (const_tree decl ATTRIBUTE_UNUSED)
350 return true;
353 void
354 c_initialize_diagnostics (diagnostic_context *context)
356 pretty_printer *base = context->printer;
357 c_pretty_printer *pp = XNEW (c_pretty_printer);
358 context->printer = new (pp) c_pretty_printer ();
360 /* It is safe to free this object because it was previously XNEW()'d. */
361 base->~pretty_printer ();
362 XDELETE (base);
364 c_common_diagnostics_set_defaults (context);
365 diagnostic_format_decoder (context) = &c_tree_printer;
369 c_types_compatible_p (tree x, tree y)
371 return comptypes (TYPE_MAIN_VARIANT (x), TYPE_MAIN_VARIANT (y));
374 /* Determine if the type is a variably modified type for the backend. */
376 bool
377 c_var_mod_p (tree x, tree fn ATTRIBUTE_UNUSED)
379 return C_TYPE_VARIABLY_MODIFIED (x);
382 /* Special routine to get the alias set of T for C. */
384 alias_set_type
385 c_get_alias_set (tree t)
387 /* Allow aliasing between enumeral types and the underlying
388 integer type. This is required since those are compatible types. */
389 if (TREE_CODE (t) == ENUMERAL_TYPE)
390 return get_alias_set (ENUM_UNDERLYING_TYPE (t));
392 return c_common_get_alias_set (t);
395 /* In C there are no invisible parameters like in C++ (this, in-charge, VTT,
396 etc.). */
399 maybe_adjust_arg_pos_for_attribute (const_tree)
401 return 0;
404 /* In C, no expression is dependent. */
406 bool
407 instantiation_dependent_expression_p (tree)
409 return false;