PR bootstrap/81926
[official-gcc.git] / gcc / cp / cp-objcp-common.c
blob267fcca7319e6c253574538552f21d203752eb53
1 /* Some code common to C++ and ObjC++ front ends.
2 Copyright (C) 2004-2017 Free Software Foundation, Inc.
3 Contributed by Ziemowit Laski <zlaski@apple.com>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "cp-tree.h"
25 #include "cp-objcp-common.h"
26 #include "dwarf2.h"
28 /* Special routine to get the alias set for C++. */
30 alias_set_type
31 cxx_get_alias_set (tree t)
33 if (IS_FAKE_BASE_TYPE (t))
34 /* The base variant of a type must be in the same alias set as the
35 complete type. */
36 return get_alias_set (TYPE_CONTEXT (t));
38 /* Punt on PMFs until we canonicalize functions properly. */
39 if (TYPE_PTRMEMFUNC_P (t)
40 || (POINTER_TYPE_P (t)
41 && TYPE_PTRMEMFUNC_P (TREE_TYPE (t))))
42 return 0;
44 return c_common_get_alias_set (t);
47 /* Called from check_global_declaration. */
49 bool
50 cxx_warn_unused_global_decl (const_tree decl)
52 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl))
53 return false;
54 if (DECL_IN_SYSTEM_HEADER (decl))
55 return false;
57 return true;
60 /* Langhook for tree_size: determine size of our 'x' and 'c' nodes. */
61 size_t
62 cp_tree_size (enum tree_code code)
64 switch (code)
66 case PTRMEM_CST: return sizeof (struct ptrmem_cst);
67 case BASELINK: return sizeof (struct tree_baselink);
68 case TEMPLATE_PARM_INDEX: return sizeof (template_parm_index);
69 case DEFAULT_ARG: return sizeof (struct tree_default_arg);
70 case DEFERRED_NOEXCEPT: return sizeof (struct tree_deferred_noexcept);
71 case OVERLOAD: return sizeof (struct tree_overload);
72 case STATIC_ASSERT: return sizeof (struct tree_static_assert);
73 case TYPE_ARGUMENT_PACK:
74 case TYPE_PACK_EXPANSION:
75 return sizeof (struct tree_common);
77 case NONTYPE_ARGUMENT_PACK:
78 case EXPR_PACK_EXPANSION:
79 return sizeof (struct tree_exp);
81 case ARGUMENT_PACK_SELECT:
82 return sizeof (struct tree_argument_pack_select);
84 case TRAIT_EXPR:
85 return sizeof (struct tree_trait_expr);
87 case LAMBDA_EXPR: return sizeof (struct tree_lambda_expr);
89 case TEMPLATE_INFO: return sizeof (struct tree_template_info);
91 case CONSTRAINT_INFO: return sizeof (struct tree_constraint_info);
93 case USERDEF_LITERAL: return sizeof (struct tree_userdef_literal);
95 case TEMPLATE_DECL: return sizeof (struct tree_template_decl);
97 default:
98 if (TREE_CODE_CLASS (code) == tcc_declaration)
99 return sizeof (struct tree_decl_non_common);
100 gcc_unreachable ();
102 /* NOTREACHED */
105 /* Returns true if T is a variably modified type, in the sense of C99.
106 FN is as passed to variably_modified_p.
107 This routine needs only check cases that cannot be handled by the
108 language-independent logic in tree.c. */
110 bool
111 cp_var_mod_type_p (tree type, tree fn)
113 /* If TYPE is a pointer-to-member, it is variably modified if either
114 the class or the member are variably modified. */
115 if (TYPE_PTRMEM_P (type))
116 return (variably_modified_type_p (TYPE_PTRMEM_CLASS_TYPE (type), fn)
117 || variably_modified_type_p (TYPE_PTRMEM_POINTED_TO_TYPE (type),
118 fn));
120 /* All other types are not variably modified. */
121 return false;
124 /* This compares two types for equivalence ("compatible" in C-based languages).
125 This routine should only return 1 if it is sure. It should not be used
126 in contexts where erroneously returning 0 causes problems. */
129 cxx_types_compatible_p (tree x, tree y)
131 return same_type_ignoring_top_level_qualifiers_p (x, y);
134 struct debug_type_hasher : ggc_cache_ptr_hash<tree_map>
136 static hashval_t hash (tree_map *m) { return tree_map_hash (m); }
137 static bool equal (tree_map *a, tree_map *b) { return tree_map_eq (a, b); }
139 static int
140 keep_cache_entry (tree_map *&e)
142 return ggc_marked_p (e->base.from);
146 static GTY((cache)) hash_table<debug_type_hasher> *debug_type_hash;
148 /* Return a type to use in the debug info instead of TYPE, or NULL_TREE to
149 keep TYPE. */
151 tree
152 cp_get_debug_type (const_tree type)
154 if (TYPE_PTRMEMFUNC_P (type) && !typedef_variant_p (type))
156 if (debug_type_hash == NULL)
157 debug_type_hash = hash_table<debug_type_hasher>::create_ggc (512);
159 /* We cannot simply use build_offset_type here because the function uses
160 the type canonicalization hashtable, which is GC-ed, so its behavior
161 depends on the actual collection points. Since we are building these
162 types on the fly for the debug info only, they would not be attached
163 to any GC root and always be swept, so we would make the contents of
164 the debug info depend on the collection points. */
165 struct tree_map in, *h, **slot;
167 in.base.from = CONST_CAST_TREE (type);
168 in.hash = htab_hash_pointer (type);
169 slot = debug_type_hash->find_slot_with_hash (&in, in.hash, INSERT);
170 if (*slot)
171 return (*slot)->to;
173 tree t = build_offset_type (TYPE_PTRMEMFUNC_OBJECT_TYPE (type),
174 TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (type)));
176 h = ggc_alloc<tree_map> ();
177 h->base.from = CONST_CAST_TREE (type);
178 h->hash = htab_hash_pointer (type);
179 h->to = t;
180 *slot = h;
182 return t;
185 return NULL_TREE;
188 /* Return -1 if dwarf ATTR shouldn't be added for DECL, or the attribute
189 value otherwise. */
191 cp_decl_dwarf_attribute (const_tree decl, int attr)
193 if (decl == NULL_TREE)
194 return -1;
196 switch (attr)
198 case DW_AT_explicit:
199 if (TREE_CODE (decl) == FUNCTION_DECL
200 && DECL_LANG_SPECIFIC (STRIP_TEMPLATE (decl))
201 && DECL_NONCONVERTING_P (decl))
202 return 1;
203 break;
205 case DW_AT_deleted:
206 if (TREE_CODE (decl) == FUNCTION_DECL
207 && DECL_LANG_SPECIFIC (STRIP_TEMPLATE (decl))
208 && DECL_DELETED_FN (decl))
209 return 1;
210 break;
212 case DW_AT_defaulted:
213 if (TREE_CODE (decl) == FUNCTION_DECL
214 && DECL_LANG_SPECIFIC (STRIP_TEMPLATE (decl))
215 && DECL_DEFAULTED_FN (decl))
217 if (DECL_DEFAULTED_IN_CLASS_P (decl))
218 return DW_DEFAULTED_in_class;
220 if (DECL_DEFAULTED_OUTSIDE_CLASS_P (decl))
221 return DW_DEFAULTED_out_of_class;
223 break;
225 case DW_AT_const_expr:
226 if (VAR_OR_FUNCTION_DECL_P (decl) && DECL_DECLARED_CONSTEXPR_P (decl))
227 return 1;
228 break;
230 case DW_AT_reference:
231 if (TREE_CODE (decl) == FUNCTION_DECL
232 && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl)
233 && FUNCTION_REF_QUALIFIED (TREE_TYPE (decl))
234 && !FUNCTION_RVALUE_QUALIFIED (TREE_TYPE (decl)))
235 return 1;
236 break;
238 case DW_AT_rvalue_reference:
239 if (TREE_CODE (decl) == FUNCTION_DECL
240 && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl)
241 && FUNCTION_REF_QUALIFIED (TREE_TYPE (decl))
242 && FUNCTION_RVALUE_QUALIFIED (TREE_TYPE (decl)))
243 return 1;
244 break;
246 case DW_AT_inline:
247 if (VAR_P (decl) && DECL_INLINE_VAR_P (decl))
249 if (DECL_VAR_DECLARED_INLINE_P (decl))
250 return DW_INL_declared_inlined;
251 else
252 return DW_INL_inlined;
254 break;
256 case DW_AT_export_symbols:
257 if (TREE_CODE (decl) == NAMESPACE_DECL
258 && (DECL_NAMESPACE_INLINE_P (decl)
259 || (DECL_NAME (decl) == NULL_TREE && dwarf_version >= 5)))
260 return 1;
261 break;
263 default:
264 break;
267 return -1;
270 /* Return -1 if dwarf ATTR shouldn't be added for TYPE, or the attribute
271 value otherwise. */
273 cp_type_dwarf_attribute (const_tree type, int attr)
275 if (type == NULL_TREE)
276 return -1;
278 switch (attr)
280 case DW_AT_reference:
281 if ((TREE_CODE (type) == FUNCTION_TYPE
282 || TREE_CODE (type) == METHOD_TYPE)
283 && FUNCTION_REF_QUALIFIED (type)
284 && !FUNCTION_RVALUE_QUALIFIED (type))
285 return 1;
286 break;
288 case DW_AT_rvalue_reference:
289 if ((TREE_CODE (type) == FUNCTION_TYPE
290 || TREE_CODE (type) == METHOD_TYPE)
291 && FUNCTION_REF_QUALIFIED (type)
292 && FUNCTION_RVALUE_QUALIFIED (type))
293 return 1;
294 break;
296 default:
297 break;
300 return -1;
303 /* Return the unit size of TYPE without reusable tail padding. */
305 tree
306 cp_unit_size_without_reusable_padding (tree type)
308 if (CLASS_TYPE_P (type))
309 return CLASSTYPE_SIZE_UNIT (type);
310 return TYPE_SIZE_UNIT (type);
313 /* Stubs to keep c-opts.c happy. */
314 void
315 push_file_scope (void)
319 void
320 pop_file_scope (void)
324 /* c-pragma.c needs to query whether a decl has extern "C" linkage. */
325 bool
326 has_c_linkage (const_tree decl)
328 return DECL_EXTERN_C_P (decl);
331 static GTY ((cache))
332 hash_table<tree_decl_map_cache_hasher> *shadowed_var_for_decl;
334 /* Lookup a shadowed var for FROM, and return it if we find one. */
336 tree
337 decl_shadowed_for_var_lookup (tree from)
339 struct tree_decl_map *h, in;
340 in.base.from = from;
342 h = shadowed_var_for_decl->find_with_hash (&in, DECL_UID (from));
343 if (h)
344 return h->to;
345 return NULL_TREE;
348 /* Insert a mapping FROM->TO in the shadowed var hashtable. */
350 void
351 decl_shadowed_for_var_insert (tree from, tree to)
353 struct tree_decl_map *h;
355 h = ggc_alloc<tree_decl_map> ();
356 h->base.from = from;
357 h->to = to;
358 *shadowed_var_for_decl->find_slot_with_hash (h, DECL_UID (from), INSERT) = h;
361 void
362 init_shadowed_var_for_decl (void)
364 shadowed_var_for_decl
365 = hash_table<tree_decl_map_cache_hasher>::create_ggc (512);
368 /* Return true if stmt can fall through. Used by block_may_fallthru
369 default case. */
371 bool
372 cxx_block_may_fallthru (const_tree stmt)
374 switch (TREE_CODE (stmt))
376 case EXPR_STMT:
377 return block_may_fallthru (EXPR_STMT_EXPR (stmt));
379 case THROW_EXPR:
380 return false;
382 default:
383 return true;
387 /* Return the list of decls in the global namespace. */
389 tree
390 cp_get_global_decls ()
392 return NAMESPACE_LEVEL (global_namespace)->names;
395 /* Push DECL into the current scope. */
397 tree
398 cp_pushdecl (tree decl)
400 return pushdecl (decl);
403 /* Register c++-specific dumps. */
405 void
406 cp_register_dumps (gcc::dump_manager *dumps)
408 class_dump_id = dumps->dump_register
409 (".class", "lang-class", "lang-class", DK_lang, OPTGROUP_NONE, false);
411 raw_dump_id = dumps->dump_register
412 (".raw", "lang-raw", "lang-raw", DK_lang, OPTGROUP_NONE, false);
415 void
416 cp_common_init_ts (void)
418 MARK_TS_DECL_NON_COMMON (USING_DECL);
419 MARK_TS_DECL_COMMON (TEMPLATE_DECL);
420 MARK_TS_DECL_COMMON (WILDCARD_DECL);
422 MARK_TS_COMMON (TEMPLATE_TEMPLATE_PARM);
423 MARK_TS_COMMON (TEMPLATE_TYPE_PARM);
424 MARK_TS_COMMON (TEMPLATE_PARM_INDEX);
425 MARK_TS_COMMON (OVERLOAD);
426 MARK_TS_COMMON (TEMPLATE_INFO);
427 MARK_TS_COMMON (TYPENAME_TYPE);
428 MARK_TS_COMMON (TYPEOF_TYPE);
429 MARK_TS_COMMON (UNDERLYING_TYPE);
430 MARK_TS_COMMON (BASELINK);
431 MARK_TS_COMMON (TYPE_PACK_EXPANSION);
432 MARK_TS_COMMON (TYPE_ARGUMENT_PACK);
433 MARK_TS_COMMON (DECLTYPE_TYPE);
434 MARK_TS_COMMON (BOUND_TEMPLATE_TEMPLATE_PARM);
435 MARK_TS_COMMON (UNBOUND_CLASS_TEMPLATE);
437 MARK_TS_TYPED (EXPR_PACK_EXPANSION);
438 MARK_TS_TYPED (SWITCH_STMT);
439 MARK_TS_TYPED (IF_STMT);
440 MARK_TS_TYPED (FOR_STMT);
441 MARK_TS_TYPED (RANGE_FOR_STMT);
442 MARK_TS_TYPED (AGGR_INIT_EXPR);
443 MARK_TS_TYPED (EXPR_STMT);
444 MARK_TS_TYPED (EH_SPEC_BLOCK);
445 MARK_TS_TYPED (CLEANUP_STMT);
446 MARK_TS_TYPED (SCOPE_REF);
447 MARK_TS_TYPED (CAST_EXPR);
448 MARK_TS_TYPED (NON_DEPENDENT_EXPR);
449 MARK_TS_TYPED (MODOP_EXPR);
450 MARK_TS_TYPED (TRY_BLOCK);
451 MARK_TS_TYPED (THROW_EXPR);
452 MARK_TS_TYPED (HANDLER);
453 MARK_TS_TYPED (REINTERPRET_CAST_EXPR);
454 MARK_TS_TYPED (CONST_CAST_EXPR);
455 MARK_TS_TYPED (STATIC_CAST_EXPR);
456 MARK_TS_TYPED (DYNAMIC_CAST_EXPR);
457 MARK_TS_TYPED (IMPLICIT_CONV_EXPR);
458 MARK_TS_TYPED (TEMPLATE_ID_EXPR);
459 MARK_TS_TYPED (ARROW_EXPR);
460 MARK_TS_TYPED (SIZEOF_EXPR);
461 MARK_TS_TYPED (ALIGNOF_EXPR);
462 MARK_TS_TYPED (AT_ENCODE_EXPR);
463 MARK_TS_TYPED (UNARY_PLUS_EXPR);
464 MARK_TS_TYPED (TRAIT_EXPR);
465 MARK_TS_TYPED (TYPE_ARGUMENT_PACK);
466 MARK_TS_TYPED (NOEXCEPT_EXPR);
467 MARK_TS_TYPED (NONTYPE_ARGUMENT_PACK);
468 MARK_TS_TYPED (WHILE_STMT);
469 MARK_TS_TYPED (NEW_EXPR);
470 MARK_TS_TYPED (VEC_NEW_EXPR);
471 MARK_TS_TYPED (BREAK_STMT);
472 MARK_TS_TYPED (MEMBER_REF);
473 MARK_TS_TYPED (DOTSTAR_EXPR);
474 MARK_TS_TYPED (DO_STMT);
475 MARK_TS_TYPED (DELETE_EXPR);
476 MARK_TS_TYPED (VEC_DELETE_EXPR);
477 MARK_TS_TYPED (CONTINUE_STMT);
478 MARK_TS_TYPED (TAG_DEFN);
479 MARK_TS_TYPED (PSEUDO_DTOR_EXPR);
480 MARK_TS_TYPED (TYPEID_EXPR);
481 MARK_TS_TYPED (MUST_NOT_THROW_EXPR);
482 MARK_TS_TYPED (STMT_EXPR);
483 MARK_TS_TYPED (OFFSET_REF);
484 MARK_TS_TYPED (OFFSETOF_EXPR);
485 MARK_TS_TYPED (ADDRESSOF_EXPR);
486 MARK_TS_TYPED (PTRMEM_CST);
487 MARK_TS_TYPED (EMPTY_CLASS_EXPR);
488 MARK_TS_TYPED (VEC_INIT_EXPR);
489 MARK_TS_TYPED (USING_STMT);
490 MARK_TS_TYPED (LAMBDA_EXPR);
491 MARK_TS_TYPED (CTOR_INITIALIZER);
492 MARK_TS_TYPED (ARRAY_NOTATION_REF);
493 MARK_TS_TYPED (REQUIRES_EXPR);
494 MARK_TS_TYPED (UNARY_LEFT_FOLD_EXPR);
495 MARK_TS_TYPED (UNARY_RIGHT_FOLD_EXPR);
496 MARK_TS_TYPED (BINARY_LEFT_FOLD_EXPR);
497 MARK_TS_TYPED (BINARY_RIGHT_FOLD_EXPR);
500 #include "gt-cp-cp-objcp-common.h"