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
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
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/>. */
22 #include "coretypes.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"
34 static bool c_tree_printer (pretty_printer
*, text_info
*, const char *,
35 int, bool, bool, bool, bool *, const char **);
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
)))
45 || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (decl
))) == integer_type_node
;
48 /* Called from check_global_declaration. */
51 c_warn_unused_global_decl (const_tree decl
)
53 if (TREE_CODE (decl
) == FUNCTION_DECL
&& DECL_DECLARED_INLINE_P (decl
))
55 if (DECL_IN_SYSTEM_HEADER (decl
))
61 /* Initialization common to C and Objective-C front ends. */
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. */
74 get_aka_type (tree type
)
76 if (type
== error_mark_node
)
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
))
94 if (!user_facing_original_type_p (type
))
97 result
= get_aka_type (orig_type
);
101 tree canonical
= TYPE_CANONICAL (type
);
102 if (canonical
&& TREE_CODE (type
) != TREE_CODE (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
))
114 tree target_type
= get_aka_type (TREE_TYPE (type
));
116 if (target_type
== TREE_TYPE (type
))
119 if (canonical
&& target_type
== TREE_TYPE (canonical
))
122 result
= (TREE_CODE (type
) == POINTER_TYPE
123 ? build_pointer_type (target_type
)
124 : build_reference_type (target_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
))
135 if (element_type
== TREE_TYPE (type
)
136 && index_type
== TYPE_DOMAIN (type
))
140 && element_type
== TREE_TYPE (canonical
)
141 && index_type
== TYPE_DOMAIN (canonical
))
144 result
= build_array_type (element_type
, index_type
,
145 TYPE_TYPELESS_STORAGE (type
));
151 tree return_type
= get_aka_type (TREE_TYPE (type
));
153 tree args
= TYPE_ARG_TYPES (type
);
154 if (args
== error_mark_node
)
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
))
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
);
179 return canonical
? canonical
: type
;
182 return build_type_attribute_qual_variant (result
, TYPE_ATTRIBUTES (type
),
186 /* Print T to CPP. */
189 print_type (c_pretty_printer
*cpp
, tree t
, bool *quoted
)
191 if (t
== error_mark_node
)
193 pp_string (cpp
, _("{erroneous}"));
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));
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
);
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)
229 /* They're not, print the stripped version now. */
231 pp_end_quote (cpp
, pp_show_color (cpp
));
232 pp_c_whitespace (cpp
);
234 pp_c_ws_string (cpp
, _("aka"));
235 pp_c_whitespace (cpp
);
237 pp_begin_quote (cpp
, pp_show_color (cpp
));
238 cpp
->type_id (aka_type
);
240 pp_end_quote (cpp
, pp_show_color (cpp
));
241 pp_right_brace (cpp
);
242 /* No further closing quotes are needed. */
247 /* Called during diagnostic message formatting process to print a
248 source-level entity onto BUFFER. The meaning of the format specifiers
251 %E: an identifier or expression,
252 %F: a function declaration,
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. */
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 **)
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
)
275 t
= va_arg (*text
->args_ptr
, tree
);
277 text
->set_location (0, DECL_SOURCE_LOCATION (t
),
278 SHOW_RANGE_WITH_CARET
);
284 if (VAR_P (t
) && DECL_HAS_DEBUG_EXPR_P (t
))
286 t
= DECL_DEBUG_EXPR (t
);
298 pp_identifier (cpp
, lang_hooks
.decl_printable_name (t
, 2));
304 print_type (cpp
, t
, quoted
);
308 if (TREE_CODE (t
) == IDENTIFIER_NODE
)
309 pp_identifier (cpp
, IDENTIFIER_POINTER (t
));
315 pp_c_type_qualifier_list (cpp
, t
);
319 pp_c_cv_qualifiers (cpp
, va_arg (*text
->args_ptr
, int), hash
);
326 pp_string (cpp
, _("({anonymous})"));
330 /* C-specific implementation of range_label::get_text () vfunc for
331 range_label_for_type_mismatch. */
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
;
341 print_type (&cpp
, m_labelled_type
, "ed
);
342 return label_text::take (xstrdup (pp_formatted_text (&cpp
)));
346 /* In C and ObjC, all decls have "C" linkage. */
348 has_c_linkage (const_tree decl ATTRIBUTE_UNUSED
)
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 ();
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. */
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. */
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,
399 maybe_adjust_arg_pos_for_attribute (const_tree
)
404 /* In C, no expression is dependent. */
407 instantiation_dependent_expression_p (tree
)