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>
4 
5 This file is part of GCC.
6 
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.
11 
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.
16 
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/>.  */
20 
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"
27 
28 /* Special routine to get the alias set for C++.  */
29 
30 alias_set_type
cxx_get_alias_set(tree t)31 cxx_get_alias_set (tree t)
32 {
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));
37 
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;
43 
44   return c_common_get_alias_set (t);
45 }
46 
47 /* Called from check_global_declaration.  */
48 
49 bool
cxx_warn_unused_global_decl(const_tree decl)50 cxx_warn_unused_global_decl (const_tree decl)
51 {
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;
56 
57   return true;
58 }
59 
60 /* Langhook for tree_size: determine size of our 'x' and 'c' nodes.  */
61 size_t
cp_tree_size(enum tree_code code)62 cp_tree_size (enum tree_code code)
63 {
64   gcc_checking_assert (code >= NUM_TREE_CODES);
65   switch (code)
66     {
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);
85     default:
86       switch (TREE_CODE_CLASS (code))
87 	{
88 	case tcc_declaration:	return sizeof (tree_decl_non_common);
89 	case tcc_type:		return sizeof (tree_type_non_common);
90 	default: gcc_unreachable ();
91 	}
92     }
93   /* NOTREACHED */
94 }
95 
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.  */
100 
101 bool
cp_var_mod_type_p(tree type,tree fn)102 cp_var_mod_type_p (tree type, tree fn)
103 {
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),
109 					 fn));
110 
111   /* All other types are not variably modified.  */
112   return false;
113 }
114 
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.  */
118 
119 int
cxx_types_compatible_p(tree x,tree y)120 cxx_types_compatible_p (tree x, tree y)
121 {
122   return same_type_ignoring_top_level_qualifiers_p (x, y);
123 }
124 
125 static GTY((cache)) tree_cache_map *debug_type_map;
126 
127 /* Return a type to use in the debug info instead of TYPE, or NULL_TREE to
128    keep TYPE.  */
129 
130 tree
cp_get_debug_type(const_tree type)131 cp_get_debug_type (const_tree type)
132 {
133   tree dtype = NULL_TREE;
134 
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)));
138 
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.  */
145   if (dtype)
146     {
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))
151 	return *slot;
152       debug_type_map->put (ktype, dtype);
153     }
154 
155   return dtype;
156 }
157 
158 /* Return -1 if dwarf ATTR shouldn't be added for DECL, or the attribute
159    value otherwise.  */
160 int
cp_decl_dwarf_attribute(const_tree decl,int attr)161 cp_decl_dwarf_attribute (const_tree decl, int attr)
162 {
163   if (decl == NULL_TREE)
164     return -1;
165 
166   switch (attr)
167     {
168     case DW_AT_explicit:
169       if (TREE_CODE (decl) == FUNCTION_DECL
170 	  && DECL_LANG_SPECIFIC (STRIP_TEMPLATE (decl))
171 	  && DECL_NONCONVERTING_P (decl))
172 	return 1;
173       break;
174 
175     case DW_AT_deleted:
176       if (TREE_CODE (decl) == FUNCTION_DECL
177 	  && DECL_LANG_SPECIFIC (STRIP_TEMPLATE (decl))
178 	  && DECL_DELETED_FN (decl))
179 	return 1;
180       break;
181 
182     case DW_AT_defaulted:
183       if (TREE_CODE (decl) == FUNCTION_DECL
184 	  && DECL_LANG_SPECIFIC (STRIP_TEMPLATE (decl))
185 	  && DECL_DEFAULTED_FN (decl))
186 	{
187 	  if (DECL_DEFAULTED_IN_CLASS_P (decl))
188 	    return DW_DEFAULTED_in_class;
189 
190 	  if (DECL_DEFAULTED_OUTSIDE_CLASS_P (decl))
191 	    return DW_DEFAULTED_out_of_class;
192 	}
193       break;
194 
195     case DW_AT_const_expr:
196       if (VAR_OR_FUNCTION_DECL_P (decl) && DECL_DECLARED_CONSTEXPR_P (decl))
197 	return 1;
198       break;
199 
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)))
205 	return 1;
206       break;
207 
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)))
213 	return 1;
214       break;
215 
216     case DW_AT_inline:
217       if (VAR_P (decl) && DECL_INLINE_VAR_P (decl))
218 	{
219 	  if (DECL_VAR_DECLARED_INLINE_P (decl))
220 	    return DW_INL_declared_inlined;
221 	  else
222 	    return DW_INL_inlined;
223 	}
224       break;
225 
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)))
230 	return 1;
231       break;
232 
233     default:
234       break;
235     }
236 
237   return -1;
238 }
239 
240 /* Return -1 if dwarf ATTR shouldn't be added for TYPE, or the attribute
241    value otherwise.  */
242 int
cp_type_dwarf_attribute(const_tree type,int attr)243 cp_type_dwarf_attribute (const_tree type, int attr)
244 {
245   if (type == NULL_TREE)
246     return -1;
247 
248   switch (attr)
249     {
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))
255 	return 1;
256       break;
257 
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))
263 	return 1;
264       break;
265 
266     default:
267       break;
268     }
269 
270   return -1;
271 }
272 
273 /* Return the unit size of TYPE without reusable tail padding.  */
274 
275 tree
cp_unit_size_without_reusable_padding(tree type)276 cp_unit_size_without_reusable_padding (tree type)
277 {
278   if (CLASS_TYPE_P (type))
279     return CLASSTYPE_SIZE_UNIT (type);
280   return TYPE_SIZE_UNIT (type);
281 }
282 
283 /* Stubs to keep c-opts.c happy.  */
284 void
push_file_scope(void)285 push_file_scope (void)
286 {
287 }
288 
289 void
pop_file_scope(void)290 pop_file_scope (void)
291 {
292 }
293 
294 /* c-pragma.c needs to query whether a decl has extern "C" linkage.  */
295 bool
has_c_linkage(const_tree decl)296 has_c_linkage (const_tree decl)
297 {
298   return DECL_EXTERN_C_P (decl);
299 }
300 
301 static GTY ((cache))
302      hash_table<tree_decl_map_cache_hasher> *shadowed_var_for_decl;
303 
304 /* Lookup a shadowed var for FROM, and return it if we find one.  */
305 
306 tree
decl_shadowed_for_var_lookup(tree from)307 decl_shadowed_for_var_lookup (tree from)
308 {
309   struct tree_decl_map *h, in;
310   in.base.from = from;
311 
312   h = shadowed_var_for_decl->find_with_hash (&in, DECL_UID (from));
313   if (h)
314     return h->to;
315   return NULL_TREE;
316 }
317 
318 /* Insert a mapping FROM->TO in the shadowed var hashtable.  */
319 
320 void
decl_shadowed_for_var_insert(tree from,tree to)321 decl_shadowed_for_var_insert (tree from, tree to)
322 {
323   struct tree_decl_map *h;
324 
325   h = ggc_alloc<tree_decl_map> ();
326   h->base.from = from;
327   h->to = to;
328   *shadowed_var_for_decl->find_slot_with_hash (h, DECL_UID (from), INSERT) = h;
329 }
330 
331 void
init_shadowed_var_for_decl(void)332 init_shadowed_var_for_decl (void)
333 {
334   shadowed_var_for_decl
335     = hash_table<tree_decl_map_cache_hasher>::create_ggc (512);
336 }
337 
338 /* Return true if stmt can fall through.  Used by block_may_fallthru
339    default case.  */
340 
341 bool
cxx_block_may_fallthru(const_tree stmt)342 cxx_block_may_fallthru (const_tree stmt)
343 {
344   switch (TREE_CODE (stmt))
345     {
346     case EXPR_STMT:
347       return block_may_fallthru (EXPR_STMT_EXPR (stmt));
348 
349     case THROW_EXPR:
350       return false;
351 
352     case IF_STMT:
353       if (block_may_fallthru (THEN_CLAUSE (stmt)))
354 	return true;
355       return block_may_fallthru (ELSE_CLAUSE (stmt));
356 
357     case SWITCH_STMT:
358       return (!SWITCH_STMT_ALL_CASES_P (stmt)
359 	      || !SWITCH_STMT_NO_BREAK_P (stmt)
360 	      || block_may_fallthru (SWITCH_STMT_BODY (stmt)));
361 
362     default:
363       return true;
364     }
365 }
366 
367 /* Return the list of decls in the global namespace.  */
368 
369 tree
cp_get_global_decls()370 cp_get_global_decls ()
371 {
372   return NAMESPACE_LEVEL (global_namespace)->names;
373 }
374 
375 /* Push DECL into the current scope.  */
376 
377 tree
cp_pushdecl(tree decl)378 cp_pushdecl (tree decl)
379 {
380   return pushdecl (decl);
381 }
382 
383 /* Get the global value binding of NAME.  Called directly from
384    c-common.c, not via a hook. */
385 
386 tree
identifier_global_value(tree name)387 identifier_global_value (tree name)
388 {
389   return get_global_binding (name);
390 }
391 
392 /* Register c++-specific dumps.  */
393 
394 void
cp_register_dumps(gcc::dump_manager * dumps)395 cp_register_dumps (gcc::dump_manager *dumps)
396 {
397   class_dump_id = dumps->dump_register
398     (".class", "lang-class", "lang-class", DK_lang, OPTGROUP_NONE, false);
399 
400   raw_dump_id = dumps->dump_register
401     (".raw", "lang-raw", "lang-raw", DK_lang, OPTGROUP_NONE, false);
402 }
403 
404 void
cp_common_init_ts(void)405 cp_common_init_ts (void)
406 {
407   MARK_TS_DECL_NON_COMMON (USING_DECL);
408   MARK_TS_DECL_COMMON (TEMPLATE_DECL);
409   MARK_TS_DECL_COMMON (WILDCARD_DECL);
410 
411   MARK_TS_COMMON (TEMPLATE_TEMPLATE_PARM);
412   MARK_TS_COMMON (TEMPLATE_TYPE_PARM);
413   MARK_TS_COMMON (TEMPLATE_PARM_INDEX);
414   MARK_TS_COMMON (OVERLOAD);
415   MARK_TS_COMMON (TEMPLATE_INFO);
416   MARK_TS_COMMON (TYPENAME_TYPE);
417   MARK_TS_COMMON (TYPEOF_TYPE);
418   MARK_TS_COMMON (UNDERLYING_TYPE);
419   MARK_TS_COMMON (BASELINK);
420   MARK_TS_COMMON (TYPE_PACK_EXPANSION);
421   MARK_TS_COMMON (TYPE_ARGUMENT_PACK);
422   MARK_TS_COMMON (DECLTYPE_TYPE);
423   MARK_TS_COMMON (BOUND_TEMPLATE_TEMPLATE_PARM);
424   MARK_TS_COMMON (UNBOUND_CLASS_TEMPLATE);
425 
426   MARK_TS_TYPED (EXPR_PACK_EXPANSION);
427   MARK_TS_TYPED (SWITCH_STMT);
428   MARK_TS_TYPED (IF_STMT);
429   MARK_TS_TYPED (FOR_STMT);
430   MARK_TS_TYPED (RANGE_FOR_STMT);
431   MARK_TS_TYPED (AGGR_INIT_EXPR);
432   MARK_TS_TYPED (EXPR_STMT);
433   MARK_TS_TYPED (EH_SPEC_BLOCK);
434   MARK_TS_TYPED (CLEANUP_STMT);
435   MARK_TS_TYPED (SCOPE_REF);
436   MARK_TS_TYPED (CAST_EXPR);
437   MARK_TS_TYPED (NON_DEPENDENT_EXPR);
438   MARK_TS_TYPED (MODOP_EXPR);
439   MARK_TS_TYPED (TRY_BLOCK);
440   MARK_TS_TYPED (THROW_EXPR);
441   MARK_TS_TYPED (HANDLER);
442   MARK_TS_TYPED (REINTERPRET_CAST_EXPR);
443   MARK_TS_TYPED (CONST_CAST_EXPR);
444   MARK_TS_TYPED (STATIC_CAST_EXPR);
445   MARK_TS_TYPED (DYNAMIC_CAST_EXPR);
446   MARK_TS_TYPED (IMPLICIT_CONV_EXPR);
447   MARK_TS_TYPED (TEMPLATE_ID_EXPR);
448   MARK_TS_TYPED (ARROW_EXPR);
449   MARK_TS_TYPED (SIZEOF_EXPR);
450   MARK_TS_TYPED (ALIGNOF_EXPR);
451   MARK_TS_TYPED (AT_ENCODE_EXPR);
452   MARK_TS_TYPED (UNARY_PLUS_EXPR);
453   MARK_TS_TYPED (TRAIT_EXPR);
454   MARK_TS_TYPED (TYPE_ARGUMENT_PACK);
455   MARK_TS_TYPED (NOEXCEPT_EXPR);
456   MARK_TS_TYPED (NONTYPE_ARGUMENT_PACK);
457   MARK_TS_TYPED (WHILE_STMT);
458   MARK_TS_TYPED (NEW_EXPR);
459   MARK_TS_TYPED (VEC_NEW_EXPR);
460   MARK_TS_TYPED (BREAK_STMT);
461   MARK_TS_TYPED (MEMBER_REF);
462   MARK_TS_TYPED (DOTSTAR_EXPR);
463   MARK_TS_TYPED (DO_STMT);
464   MARK_TS_TYPED (DELETE_EXPR);
465   MARK_TS_TYPED (VEC_DELETE_EXPR);
466   MARK_TS_TYPED (CONTINUE_STMT);
467   MARK_TS_TYPED (TAG_DEFN);
468   MARK_TS_TYPED (PSEUDO_DTOR_EXPR);
469   MARK_TS_TYPED (TYPEID_EXPR);
470   MARK_TS_TYPED (MUST_NOT_THROW_EXPR);
471   MARK_TS_TYPED (STMT_EXPR);
472   MARK_TS_TYPED (OFFSET_REF);
473   MARK_TS_TYPED (OFFSETOF_EXPR);
474   MARK_TS_TYPED (ADDRESSOF_EXPR);
475   MARK_TS_TYPED (PTRMEM_CST);
476   MARK_TS_TYPED (EMPTY_CLASS_EXPR);
477   MARK_TS_TYPED (VEC_INIT_EXPR);
478   MARK_TS_TYPED (USING_STMT);
479   MARK_TS_TYPED (LAMBDA_EXPR);
480   MARK_TS_TYPED (CTOR_INITIALIZER);
481   MARK_TS_TYPED (REQUIRES_EXPR);
482   MARK_TS_TYPED (UNARY_LEFT_FOLD_EXPR);
483   MARK_TS_TYPED (UNARY_RIGHT_FOLD_EXPR);
484   MARK_TS_TYPED (BINARY_LEFT_FOLD_EXPR);
485   MARK_TS_TYPED (BINARY_RIGHT_FOLD_EXPR);
486 }
487 
488 #include "gt-cp-cp-objcp-common.h"
489