Oranize the PPH tree switch into tcc_* chunks, in each of four sections:
[official-gcc.git] / gcc / cp / cp-objcp-common.c
blob28256dc25dae31165fb1446f884283899251586b
1 /* Some code common to C++ and ObjC++ front ends.
2 Copyright (C) 2004, 2007, 2008, 2009, 2010, 2011
3 Free Software Foundation, Inc.
4 Contributed by Ziemowit Laski <zlaski@apple.com>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "cp-tree.h"
28 #include "c-family/c-common.h"
29 #include "langhooks.h"
30 #include "langhooks-def.h"
31 #include "diagnostic.h"
32 #include "debug.h"
33 #include "cxx-pretty-print.h"
34 #include "cp-objcp-common.h"
36 /* Special routine to get the alias set for C++. */
38 alias_set_type
39 cxx_get_alias_set (tree t)
41 if (IS_FAKE_BASE_TYPE (t))
42 /* The base variant of a type must be in the same alias set as the
43 complete type. */
44 return get_alias_set (TYPE_CONTEXT (t));
46 /* Punt on PMFs until we canonicalize functions properly. */
47 if (TYPE_PTRMEMFUNC_P (t)
48 || (POINTER_TYPE_P (t)
49 && TYPE_PTRMEMFUNC_P (TREE_TYPE (t))))
50 return 0;
52 return c_common_get_alias_set (t);
55 /* Called from check_global_declarations. */
57 bool
58 cxx_warn_unused_global_decl (const_tree decl)
60 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl))
61 return false;
62 if (DECL_IN_SYSTEM_HEADER (decl))
63 return false;
65 /* Const variables take the place of #defines in C++. */
66 if (TREE_CODE (decl) == VAR_DECL && TREE_READONLY (decl))
67 return false;
69 return true;
72 /* Langhook for tree_size: determine size of our 'x' and 'c' nodes. */
73 size_t
74 cp_tree_size (enum tree_code code)
76 switch (code)
78 case PTRMEM_CST: return sizeof (struct ptrmem_cst);
79 case BASELINK: return sizeof (struct tree_baselink);
80 case TEMPLATE_PARM_INDEX: return sizeof (template_parm_index);
81 case DEFAULT_ARG: return sizeof (struct tree_default_arg);
82 case OVERLOAD: return sizeof (struct tree_overload);
83 case STATIC_ASSERT: return sizeof (struct tree_static_assert);
84 case TYPE_ARGUMENT_PACK:
85 case TYPE_PACK_EXPANSION:
86 return sizeof (struct tree_common);
88 case NONTYPE_ARGUMENT_PACK:
89 case EXPR_PACK_EXPANSION:
90 return sizeof (struct tree_exp);
92 case ARGUMENT_PACK_SELECT:
93 return sizeof (struct tree_argument_pack_select);
95 case TRAIT_EXPR:
96 return sizeof (struct tree_trait_expr);
98 case LAMBDA_EXPR: return sizeof (struct tree_lambda_expr);
100 case TEMPLATE_INFO: return sizeof (struct tree_template_info);
102 case TREE_BINFO: return sizeof (struct tree_binfo);
104 default:
105 gcc_unreachable ();
107 /* NOTREACHED */
110 /* Returns true if T is a variably modified type, in the sense of C99.
111 FN is as passed to variably_modified_p.
112 This routine needs only check cases that cannot be handled by the
113 language-independent logic in tree.c. */
115 bool
116 cp_var_mod_type_p (tree type, tree fn)
118 /* If TYPE is a pointer-to-member, it is variably modified if either
119 the class or the member are variably modified. */
120 if (TYPE_PTR_TO_MEMBER_P (type))
121 return (variably_modified_type_p (TYPE_PTRMEM_CLASS_TYPE (type), fn)
122 || variably_modified_type_p (TYPE_PTRMEM_POINTED_TO_TYPE (type),
123 fn));
125 /* All other types are not variably modified. */
126 return false;
129 /* Construct a C++-aware pretty-printer for CONTEXT. It is assumed
130 that CONTEXT->printer is an already constructed basic pretty_printer. */
131 void
132 cxx_initialize_diagnostics (diagnostic_context *context)
134 pretty_printer *base;
135 cxx_pretty_printer *pp;
137 c_common_initialize_diagnostics (context);
139 base = context->printer;
140 pp = XNEW (cxx_pretty_printer);
141 memcpy (pp_base (pp), base, sizeof (pretty_printer));
142 pp_cxx_pretty_printer_init (pp);
143 context->printer = (pretty_printer *) pp;
145 /* It is safe to free this object because it was previously malloc()'d. */
146 free (base);
149 /* This compares two types for equivalence ("compatible" in C-based languages).
150 This routine should only return 1 if it is sure. It should not be used
151 in contexts where erroneously returning 0 causes problems. */
154 cxx_types_compatible_p (tree x, tree y)
156 return same_type_ignoring_top_level_qualifiers_p (x, y);
159 /* Return true if DECL is explicit member function. */
161 bool
162 cp_function_decl_explicit_p (tree decl)
164 return (decl
165 && FUNCTION_FIRST_USER_PARMTYPE (decl) != void_list_node
166 && DECL_LANG_SPECIFIC (STRIP_TEMPLATE (decl))
167 && DECL_NONCONVERTING_P (decl));
170 /* Stubs to keep c-opts.c happy. */
171 void
172 push_file_scope (void)
176 void
177 pop_file_scope (void)
181 /* c-pragma.c needs to query whether a decl has extern "C" linkage. */
182 bool
183 has_c_linkage (const_tree decl)
185 return DECL_EXTERN_C_P (decl);
188 static GTY ((if_marked ("tree_decl_map_marked_p"), param_is (struct tree_decl_map)))
189 htab_t shadowed_var_for_decl;
191 /* Lookup a shadowed var for FROM, and return it if we find one. */
193 tree
194 decl_shadowed_for_var_lookup (tree from)
196 struct tree_decl_map *h, in;
197 in.base.from = from;
199 h = (struct tree_decl_map *)
200 htab_find_with_hash (shadowed_var_for_decl, &in, DECL_UID (from));
201 if (h)
202 return h->to;
203 return NULL_TREE;
206 /* Insert a mapping FROM->TO in the shadowed var hashtable. */
208 void
209 decl_shadowed_for_var_insert (tree from, tree to)
211 struct tree_decl_map *h;
212 void **loc;
214 h = ggc_alloc_tree_decl_map ();
215 h->base.from = from;
216 h->to = to;
217 loc = htab_find_slot_with_hash (shadowed_var_for_decl, h, DECL_UID (from),
218 INSERT);
219 *(struct tree_decl_map **) loc = h;
222 void
223 init_shadowed_var_for_decl (void)
225 shadowed_var_for_decl = htab_create_ggc (512, tree_decl_map_hash,
226 tree_decl_map_eq, 0);
229 void
230 cp_common_init_ts (void)
232 unsigned i;
234 for (i = LAST_AND_UNUSED_TREE_CODE; i < MAX_TREE_CODES; i++)
236 enum tree_node_structure_enum ts_code;
237 enum tree_code code;
239 code = (enum tree_code) i;
240 ts_code = tree_node_structure_for_code (code);
241 if (ts_code != LAST_TS_ENUM)
243 /* All expressions in C++ are typed. */
244 if (ts_code == TS_EXP)
245 MARK_TS_TYPED (code);
246 mark_ts_structures_for (code, ts_code);
248 else
250 /* tree_node_structure_for_code does not recognize language
251 specific nodes (unless they use standard code classes). */
252 MARK_TS_COMMON (code);
256 /* Consistency checks for codes used in the front end. */
257 gcc_assert (tree_contains_struct[NAMESPACE_DECL][TS_DECL_NON_COMMON]);
258 gcc_assert (tree_contains_struct[USING_DECL][TS_DECL_NON_COMMON]);
259 gcc_assert (tree_contains_struct[TEMPLATE_DECL][TS_DECL_NON_COMMON]);
261 gcc_assert (tree_contains_struct[TEMPLATE_TEMPLATE_PARM][TS_COMMON]);
262 gcc_assert (tree_contains_struct[TEMPLATE_TYPE_PARM][TS_COMMON]);
263 gcc_assert (tree_contains_struct[TEMPLATE_PARM_INDEX][TS_COMMON]);
264 gcc_assert (tree_contains_struct[OVERLOAD][TS_COMMON]);
265 gcc_assert (tree_contains_struct[TEMPLATE_INFO][TS_COMMON]);
266 gcc_assert (tree_contains_struct[TYPENAME_TYPE][TS_COMMON]);
267 gcc_assert (tree_contains_struct[TYPEOF_TYPE][TS_COMMON]);
268 gcc_assert (tree_contains_struct[BASELINK][TS_COMMON]);
269 gcc_assert (tree_contains_struct[TYPE_PACK_EXPANSION][TS_COMMON]);
270 gcc_assert (tree_contains_struct[EXPR_PACK_EXPANSION][TS_COMMON]);
271 gcc_assert (tree_contains_struct[DECLTYPE_TYPE][TS_COMMON]);
272 gcc_assert (tree_contains_struct[BOUND_TEMPLATE_TEMPLATE_PARM][TS_COMMON]);
273 gcc_assert (tree_contains_struct[UNBOUND_CLASS_TEMPLATE][TS_COMMON]);
275 gcc_assert (tree_contains_struct[SWITCH_STMT][TS_TYPED]);
276 gcc_assert (tree_contains_struct[IF_STMT][TS_TYPED]);
277 gcc_assert (tree_contains_struct[FOR_STMT][TS_TYPED]);
278 gcc_assert (tree_contains_struct[RANGE_FOR_STMT][TS_TYPED]);
279 gcc_assert (tree_contains_struct[AGGR_INIT_EXPR][TS_TYPED]);
280 gcc_assert (tree_contains_struct[EXPR_STMT][TS_TYPED]);
281 gcc_assert (tree_contains_struct[EH_SPEC_BLOCK][TS_TYPED]);
282 gcc_assert (tree_contains_struct[CLEANUP_STMT][TS_TYPED]);
283 gcc_assert (tree_contains_struct[SCOPE_REF][TS_TYPED]);
284 gcc_assert (tree_contains_struct[CAST_EXPR][TS_TYPED]);
285 gcc_assert (tree_contains_struct[NON_DEPENDENT_EXPR][TS_TYPED]);
286 gcc_assert (tree_contains_struct[MODOP_EXPR][TS_TYPED]);
287 gcc_assert (tree_contains_struct[TRY_BLOCK][TS_TYPED]);
288 gcc_assert (tree_contains_struct[THROW_EXPR][TS_TYPED]);
289 gcc_assert (tree_contains_struct[HANDLER][TS_TYPED]);
290 gcc_assert (tree_contains_struct[REINTERPRET_CAST_EXPR][TS_TYPED]);
291 gcc_assert (tree_contains_struct[CONST_CAST_EXPR][TS_TYPED]);
292 gcc_assert (tree_contains_struct[STATIC_CAST_EXPR][TS_TYPED]);
293 gcc_assert (tree_contains_struct[DYNAMIC_CAST_EXPR][TS_TYPED]);
294 gcc_assert (tree_contains_struct[TEMPLATE_ID_EXPR][TS_TYPED]);
295 gcc_assert (tree_contains_struct[ARROW_EXPR][TS_TYPED]);
296 gcc_assert (tree_contains_struct[SIZEOF_EXPR][TS_TYPED]);
297 gcc_assert (tree_contains_struct[ALIGNOF_EXPR][TS_TYPED]);
298 gcc_assert (tree_contains_struct[AT_ENCODE_EXPR][TS_TYPED]);
299 gcc_assert (tree_contains_struct[UNARY_PLUS_EXPR][TS_TYPED]);
300 gcc_assert (tree_contains_struct[TRAIT_EXPR][TS_TYPED]);
301 gcc_assert (tree_contains_struct[TYPE_ARGUMENT_PACK][TS_TYPED]);
302 gcc_assert (tree_contains_struct[NOEXCEPT_EXPR][TS_TYPED]);
303 gcc_assert (tree_contains_struct[NONTYPE_ARGUMENT_PACK][TS_TYPED]);
304 gcc_assert (tree_contains_struct[WHILE_STMT][TS_TYPED]);
305 gcc_assert (tree_contains_struct[NEW_EXPR][TS_TYPED]);
306 gcc_assert (tree_contains_struct[VEC_NEW_EXPR][TS_TYPED]);
307 gcc_assert (tree_contains_struct[BREAK_STMT][TS_TYPED]);
308 gcc_assert (tree_contains_struct[MEMBER_REF][TS_TYPED]);
309 gcc_assert (tree_contains_struct[DOTSTAR_EXPR][TS_TYPED]);
310 gcc_assert (tree_contains_struct[DO_STMT][TS_TYPED]);
311 gcc_assert (tree_contains_struct[DELETE_EXPR][TS_TYPED]);
312 gcc_assert (tree_contains_struct[VEC_DELETE_EXPR][TS_TYPED]);
313 gcc_assert (tree_contains_struct[CONTINUE_STMT][TS_TYPED]);
314 gcc_assert (tree_contains_struct[TAG_DEFN][TS_TYPED]);
315 gcc_assert (tree_contains_struct[PSEUDO_DTOR_EXPR][TS_TYPED]);
316 gcc_assert (tree_contains_struct[TYPEID_EXPR][TS_TYPED]);
317 gcc_assert (tree_contains_struct[MUST_NOT_THROW_EXPR][TS_TYPED]);
318 gcc_assert (tree_contains_struct[STMT_EXPR][TS_TYPED]);
319 gcc_assert (tree_contains_struct[OFFSET_REF][TS_TYPED]);
320 gcc_assert (tree_contains_struct[OFFSETOF_EXPR][TS_TYPED]);
321 gcc_assert (tree_contains_struct[PTRMEM_CST][TS_TYPED]);
322 gcc_assert (tree_contains_struct[EMPTY_CLASS_EXPR][TS_TYPED]);
323 gcc_assert (tree_contains_struct[VEC_INIT_EXPR][TS_TYPED]);
324 gcc_assert (tree_contains_struct[USING_STMT][TS_TYPED]);
325 gcc_assert (tree_contains_struct[LAMBDA_EXPR][TS_TYPED]);
328 #include "gt-cp-cp-objcp-common.h"