1 /* Some code common to C++ and ObjC++ front ends.
2 Copyright (C) 2004-2018 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
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
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/>. */
23 #include "coretypes.h"
25 #include "cp-objcp-common.h"
28 /* Special routine to get the alias set for C++. */
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
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
))))
44 return c_common_get_alias_set (t
);
47 /* Called from check_global_declaration. */
50 cxx_warn_unused_global_decl (const_tree decl
)
52 if (TREE_CODE (decl
) == FUNCTION_DECL
&& DECL_DECLARED_INLINE_P (decl
))
54 if (DECL_IN_SYSTEM_HEADER (decl
))
60 /* Langhook for tree_size: determine size of our 'x' and 'c' nodes. */
62 cp_tree_size (enum tree_code code
)
64 gcc_checking_assert (code
>= NUM_TREE_CODES
);
67 case PTRMEM_CST
: return sizeof (ptrmem_cst
);
68 case BASELINK
: return sizeof (tree_baselink
);
69 case TEMPLATE_PARM_INDEX
: return sizeof (template_parm_index
);
70 case DEFAULT_ARG
: return sizeof (tree_default_arg
);
71 case DEFERRED_NOEXCEPT
: return sizeof (tree_deferred_noexcept
);
72 case OVERLOAD
: return sizeof (tree_overload
);
73 case STATIC_ASSERT
: return sizeof (tree_static_assert
);
74 case TYPE_ARGUMENT_PACK
:
75 case TYPE_PACK_EXPANSION
: return sizeof (tree_type_non_common
);
76 case NONTYPE_ARGUMENT_PACK
:
77 case EXPR_PACK_EXPANSION
: return sizeof (tree_exp
);
78 case ARGUMENT_PACK_SELECT
: return sizeof (tree_argument_pack_select
);
79 case TRAIT_EXPR
: return sizeof (tree_trait_expr
);
80 case LAMBDA_EXPR
: return sizeof (tree_lambda_expr
);
81 case TEMPLATE_INFO
: return sizeof (tree_template_info
);
82 case CONSTRAINT_INFO
: return sizeof (tree_constraint_info
);
83 case USERDEF_LITERAL
: return sizeof (tree_userdef_literal
);
84 case TEMPLATE_DECL
: return sizeof (tree_template_decl
);
86 switch (TREE_CODE_CLASS (code
))
88 case tcc_declaration
: return sizeof (tree_decl_non_common
);
89 case tcc_type
: return sizeof (tree_type_non_common
);
90 default: gcc_unreachable ();
96 /* Returns true if T is a variably modified type, in the sense of C99.
97 FN is as passed to variably_modified_p.
98 This routine needs only check cases that cannot be handled by the
99 language-independent logic in tree.c. */
102 cp_var_mod_type_p (tree type
, tree fn
)
104 /* If TYPE is a pointer-to-member, it is variably modified if either
105 the class or the member are variably modified. */
106 if (TYPE_PTRMEM_P (type
))
107 return (variably_modified_type_p (TYPE_PTRMEM_CLASS_TYPE (type
), fn
)
108 || variably_modified_type_p (TYPE_PTRMEM_POINTED_TO_TYPE (type
),
111 /* All other types are not variably modified. */
115 /* This compares two types for equivalence ("compatible" in C-based languages).
116 This routine should only return 1 if it is sure. It should not be used
117 in contexts where erroneously returning 0 causes problems. */
120 cxx_types_compatible_p (tree x
, tree y
)
122 return same_type_ignoring_top_level_qualifiers_p (x
, y
);
125 static GTY((cache
)) tree_cache_map
*debug_type_map
;
127 /* Return a type to use in the debug info instead of TYPE, or NULL_TREE to
131 cp_get_debug_type (const_tree type
)
133 tree dtype
= NULL_TREE
;
135 if (TYPE_PTRMEMFUNC_P (type
) && !typedef_variant_p (type
))
136 dtype
= build_offset_type (TYPE_PTRMEMFUNC_OBJECT_TYPE (type
),
137 TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (type
)));
139 /* We cannot simply return the debug type here because the function uses
140 the type canonicalization hashtable, which is GC-ed, so its behavior
141 depends on the actual collection points. Since we are building these
142 types on the fly for the debug info only, they would not be attached
143 to any GC root and always be swept, so we would make the contents of
144 the debug info depend on the collection points. */
147 tree ktype
= CONST_CAST_TREE (type
);
148 if (debug_type_map
== NULL
)
149 debug_type_map
= tree_cache_map::create_ggc (512);
150 else if (tree
*slot
= debug_type_map
->get (ktype
))
152 debug_type_map
->put (ktype
, dtype
);
158 /* Return -1 if dwarf ATTR shouldn't be added for DECL, or the attribute
161 cp_decl_dwarf_attribute (const_tree decl
, int attr
)
163 if (decl
== NULL_TREE
)
169 if (TREE_CODE (decl
) == FUNCTION_DECL
170 && DECL_LANG_SPECIFIC (STRIP_TEMPLATE (decl
))
171 && DECL_NONCONVERTING_P (decl
))
176 if (TREE_CODE (decl
) == FUNCTION_DECL
177 && DECL_LANG_SPECIFIC (STRIP_TEMPLATE (decl
))
178 && DECL_DELETED_FN (decl
))
182 case DW_AT_defaulted
:
183 if (TREE_CODE (decl
) == FUNCTION_DECL
184 && DECL_LANG_SPECIFIC (STRIP_TEMPLATE (decl
))
185 && DECL_DEFAULTED_FN (decl
))
187 if (DECL_DEFAULTED_IN_CLASS_P (decl
))
188 return DW_DEFAULTED_in_class
;
190 if (DECL_DEFAULTED_OUTSIDE_CLASS_P (decl
))
191 return DW_DEFAULTED_out_of_class
;
195 case DW_AT_const_expr
:
196 if (VAR_OR_FUNCTION_DECL_P (decl
) && DECL_DECLARED_CONSTEXPR_P (decl
))
200 case DW_AT_reference
:
201 if (TREE_CODE (decl
) == FUNCTION_DECL
202 && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl
)
203 && FUNCTION_REF_QUALIFIED (TREE_TYPE (decl
))
204 && !FUNCTION_RVALUE_QUALIFIED (TREE_TYPE (decl
)))
208 case DW_AT_rvalue_reference
:
209 if (TREE_CODE (decl
) == FUNCTION_DECL
210 && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl
)
211 && FUNCTION_REF_QUALIFIED (TREE_TYPE (decl
))
212 && FUNCTION_RVALUE_QUALIFIED (TREE_TYPE (decl
)))
217 if (VAR_P (decl
) && DECL_INLINE_VAR_P (decl
))
219 if (DECL_VAR_DECLARED_INLINE_P (decl
))
220 return DW_INL_declared_inlined
;
222 return DW_INL_inlined
;
226 case DW_AT_export_symbols
:
227 if (TREE_CODE (decl
) == NAMESPACE_DECL
228 && (DECL_NAMESPACE_INLINE_P (decl
)
229 || (DECL_NAME (decl
) == NULL_TREE
&& dwarf_version
>= 5)))
240 /* Return -1 if dwarf ATTR shouldn't be added for TYPE, or the attribute
243 cp_type_dwarf_attribute (const_tree type
, int attr
)
245 if (type
== NULL_TREE
)
250 case DW_AT_reference
:
251 if ((TREE_CODE (type
) == FUNCTION_TYPE
252 || TREE_CODE (type
) == METHOD_TYPE
)
253 && FUNCTION_REF_QUALIFIED (type
)
254 && !FUNCTION_RVALUE_QUALIFIED (type
))
258 case DW_AT_rvalue_reference
:
259 if ((TREE_CODE (type
) == FUNCTION_TYPE
260 || TREE_CODE (type
) == METHOD_TYPE
)
261 && FUNCTION_REF_QUALIFIED (type
)
262 && FUNCTION_RVALUE_QUALIFIED (type
))
273 /* Return the unit size of TYPE without reusable tail padding. */
276 cp_unit_size_without_reusable_padding (tree type
)
278 if (CLASS_TYPE_P (type
))
279 return CLASSTYPE_SIZE_UNIT (type
);
280 return TYPE_SIZE_UNIT (type
);
283 /* Stubs to keep c-opts.c happy. */
285 push_file_scope (void)
290 pop_file_scope (void)
294 /* c-pragma.c needs to query whether a decl has extern "C" linkage. */
296 has_c_linkage (const_tree decl
)
298 return DECL_EXTERN_C_P (decl
);
301 /* Return true if stmt can fall through. Used by block_may_fallthru
305 cxx_block_may_fallthru (const_tree stmt
)
307 switch (TREE_CODE (stmt
))
310 return block_may_fallthru (EXPR_STMT_EXPR (stmt
));
316 if (block_may_fallthru (THEN_CLAUSE (stmt
)))
318 return block_may_fallthru (ELSE_CLAUSE (stmt
));
321 return (!SWITCH_STMT_ALL_CASES_P (stmt
)
322 || !SWITCH_STMT_NO_BREAK_P (stmt
)
323 || block_may_fallthru (SWITCH_STMT_BODY (stmt
)));
330 /* Return the list of decls in the global namespace. */
333 cp_get_global_decls ()
335 return NAMESPACE_LEVEL (global_namespace
)->names
;
338 /* Push DECL into the current scope. */
341 cp_pushdecl (tree decl
)
343 return pushdecl (decl
);
346 /* Get the global value binding of NAME. Called directly from
347 c-common.c, not via a hook. */
350 identifier_global_value (tree name
)
352 return get_global_binding (name
);
355 /* Register c++-specific dumps. */
358 cp_register_dumps (gcc::dump_manager
*dumps
)
360 class_dump_id
= dumps
->dump_register
361 (".class", "lang-class", "lang-class", DK_lang
, OPTGROUP_NONE
, false);
363 raw_dump_id
= dumps
->dump_register
364 (".raw", "lang-raw", "lang-raw", DK_lang
, OPTGROUP_NONE
, false);
368 cp_common_init_ts (void)
370 MARK_TS_DECL_NON_COMMON (USING_DECL
);
371 MARK_TS_DECL_COMMON (TEMPLATE_DECL
);
372 MARK_TS_DECL_COMMON (WILDCARD_DECL
);
374 MARK_TS_COMMON (TEMPLATE_TEMPLATE_PARM
);
375 MARK_TS_COMMON (TEMPLATE_TYPE_PARM
);
376 MARK_TS_COMMON (TEMPLATE_PARM_INDEX
);
377 MARK_TS_COMMON (OVERLOAD
);
378 MARK_TS_COMMON (TEMPLATE_INFO
);
379 MARK_TS_COMMON (TYPENAME_TYPE
);
380 MARK_TS_COMMON (TYPEOF_TYPE
);
381 MARK_TS_COMMON (UNDERLYING_TYPE
);
382 MARK_TS_COMMON (BASELINK
);
383 MARK_TS_COMMON (TYPE_PACK_EXPANSION
);
384 MARK_TS_COMMON (TYPE_ARGUMENT_PACK
);
385 MARK_TS_COMMON (DECLTYPE_TYPE
);
386 MARK_TS_COMMON (BOUND_TEMPLATE_TEMPLATE_PARM
);
387 MARK_TS_COMMON (UNBOUND_CLASS_TEMPLATE
);
389 MARK_TS_TYPED (EXPR_PACK_EXPANSION
);
390 MARK_TS_TYPED (SWITCH_STMT
);
391 MARK_TS_TYPED (IF_STMT
);
392 MARK_TS_TYPED (FOR_STMT
);
393 MARK_TS_TYPED (RANGE_FOR_STMT
);
394 MARK_TS_TYPED (AGGR_INIT_EXPR
);
395 MARK_TS_TYPED (EXPR_STMT
);
396 MARK_TS_TYPED (EH_SPEC_BLOCK
);
397 MARK_TS_TYPED (CLEANUP_STMT
);
398 MARK_TS_TYPED (SCOPE_REF
);
399 MARK_TS_TYPED (CAST_EXPR
);
400 MARK_TS_TYPED (NON_DEPENDENT_EXPR
);
401 MARK_TS_TYPED (MODOP_EXPR
);
402 MARK_TS_TYPED (TRY_BLOCK
);
403 MARK_TS_TYPED (THROW_EXPR
);
404 MARK_TS_TYPED (HANDLER
);
405 MARK_TS_TYPED (REINTERPRET_CAST_EXPR
);
406 MARK_TS_TYPED (CONST_CAST_EXPR
);
407 MARK_TS_TYPED (STATIC_CAST_EXPR
);
408 MARK_TS_TYPED (DYNAMIC_CAST_EXPR
);
409 MARK_TS_TYPED (IMPLICIT_CONV_EXPR
);
410 MARK_TS_TYPED (TEMPLATE_ID_EXPR
);
411 MARK_TS_TYPED (ARROW_EXPR
);
412 MARK_TS_TYPED (SIZEOF_EXPR
);
413 MARK_TS_TYPED (ALIGNOF_EXPR
);
414 MARK_TS_TYPED (AT_ENCODE_EXPR
);
415 MARK_TS_TYPED (UNARY_PLUS_EXPR
);
416 MARK_TS_TYPED (TRAIT_EXPR
);
417 MARK_TS_TYPED (TYPE_ARGUMENT_PACK
);
418 MARK_TS_TYPED (NOEXCEPT_EXPR
);
419 MARK_TS_TYPED (NONTYPE_ARGUMENT_PACK
);
420 MARK_TS_TYPED (WHILE_STMT
);
421 MARK_TS_TYPED (NEW_EXPR
);
422 MARK_TS_TYPED (VEC_NEW_EXPR
);
423 MARK_TS_TYPED (BREAK_STMT
);
424 MARK_TS_TYPED (MEMBER_REF
);
425 MARK_TS_TYPED (DOTSTAR_EXPR
);
426 MARK_TS_TYPED (DO_STMT
);
427 MARK_TS_TYPED (DELETE_EXPR
);
428 MARK_TS_TYPED (VEC_DELETE_EXPR
);
429 MARK_TS_TYPED (CONTINUE_STMT
);
430 MARK_TS_TYPED (TAG_DEFN
);
431 MARK_TS_TYPED (PSEUDO_DTOR_EXPR
);
432 MARK_TS_TYPED (TYPEID_EXPR
);
433 MARK_TS_TYPED (MUST_NOT_THROW_EXPR
);
434 MARK_TS_TYPED (STMT_EXPR
);
435 MARK_TS_TYPED (OFFSET_REF
);
436 MARK_TS_TYPED (OFFSETOF_EXPR
);
437 MARK_TS_TYPED (ADDRESSOF_EXPR
);
438 MARK_TS_TYPED (PTRMEM_CST
);
439 MARK_TS_TYPED (EMPTY_CLASS_EXPR
);
440 MARK_TS_TYPED (VEC_INIT_EXPR
);
441 MARK_TS_TYPED (USING_STMT
);
442 MARK_TS_TYPED (LAMBDA_EXPR
);
443 MARK_TS_TYPED (CTOR_INITIALIZER
);
444 MARK_TS_TYPED (REQUIRES_EXPR
);
445 MARK_TS_TYPED (UNARY_LEFT_FOLD_EXPR
);
446 MARK_TS_TYPED (UNARY_RIGHT_FOLD_EXPR
);
447 MARK_TS_TYPED (BINARY_LEFT_FOLD_EXPR
);
448 MARK_TS_TYPED (BINARY_RIGHT_FOLD_EXPR
);
451 #include "gt-cp-cp-objcp-common.h"