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
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
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/>. */
24 #include "coretypes.h"
28 #include "c-family/c-common.h"
29 #include "langhooks.h"
30 #include "langhooks-def.h"
31 #include "diagnostic.h"
33 #include "cxx-pretty-print.h"
34 #include "cp-objcp-common.h"
36 /* Special routine to get the alias set for C++. */
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
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
))))
52 return c_common_get_alias_set (t
);
55 /* Called from check_global_declarations. */
58 cxx_warn_unused_global_decl (const_tree decl
)
60 if (TREE_CODE (decl
) == FUNCTION_DECL
&& DECL_DECLARED_INLINE_P (decl
))
62 if (DECL_IN_SYSTEM_HEADER (decl
))
65 /* Const variables take the place of #defines in C++. */
66 if (TREE_CODE (decl
) == VAR_DECL
&& TREE_READONLY (decl
))
72 /* Langhook for tree_size: determine size of our 'x' and 'c' nodes. */
74 cp_tree_size (enum tree_code 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
);
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
);
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. */
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
),
125 /* All other types are not variably modified. */
129 /* Construct a C++-aware pretty-printer for CONTEXT. It is assumed
130 that CONTEXT->printer is an already constructed basic pretty_printer. */
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. */
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. */
162 cp_function_decl_explicit_p (tree 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. */
172 push_file_scope (void)
177 pop_file_scope (void)
181 /* c-pragma.c needs to query whether a decl has extern "C" linkage. */
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. */
194 decl_shadowed_for_var_lookup (tree from
)
196 struct tree_decl_map
*h
, in
;
199 h
= (struct tree_decl_map
*)
200 htab_find_with_hash (shadowed_var_for_decl
, &in
, DECL_UID (from
));
206 /* Insert a mapping FROM->TO in the shadowed var hashtable. */
209 decl_shadowed_for_var_insert (tree from
, tree to
)
211 struct tree_decl_map
*h
;
214 h
= ggc_alloc_tree_decl_map ();
217 loc
= htab_find_slot_with_hash (shadowed_var_for_decl
, h
, DECL_UID (from
),
219 *(struct tree_decl_map
**) loc
= h
;
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);
230 cp_common_init_ts (void)
234 for (i
= LAST_AND_UNUSED_TREE_CODE
; i
< MAX_TREE_CODES
; i
++)
236 enum tree_node_structure_enum ts_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
);
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"