]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cp/cp-lang.c
Update copyright years.
[thirdparty/gcc.git] / gcc / cp / cp-lang.c
CommitLineData
19551f29 1/* Language-dependent hooks for C++.
a5544970 2 Copyright (C) 2001-2019 Free Software Foundation, Inc.
19551f29
AO
3 Contributed by Alexandre Oliva <aoliva@redhat.com>
4
f5adbb8d 5This file is part of GCC.
19551f29 6
f5adbb8d 7GCC is free software; you can redistribute it and/or modify
19551f29 8it under the terms of the GNU General Public License as published by
e77f031d 9the Free Software Foundation; either version 3, or (at your option)
19551f29
AO
10any later version.
11
f5adbb8d 12GCC is distributed in the hope that it will be useful,
19551f29
AO
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
e77f031d
NC
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
19551f29
AO
20
21#include "config.h"
22#include "system.h"
4977bab6 23#include "coretypes.h"
19551f29 24#include "cp-tree.h"
2adfab87 25#include "stor-layout.h"
19551f29 26#include "langhooks.h"
d23c55c2 27#include "langhooks-def.h"
11bb4b27 28#include "cp-objcp-common.h"
19551f29 29
37fa72e9 30enum c_language_kind c_language = clk_cxx;
a0ad3539 31static const char * cxx_dwarf_name (tree t, int verbosity);
394d9fe7 32static enum classify_record cp_classify_record (tree type);
f9417da1 33static tree cp_eh_personality (void);
f8fb7295
DS
34static tree get_template_innermost_arguments_folded (const_tree);
35static tree get_template_argument_pack_elems_folded (const_tree);
7315daa6 36static tree cxx_enum_underlying_base_type (const_tree);
37fa72e9 37
11bb4b27
ZL
38/* Lang hooks common to C++ and ObjC++ are declared in cp/cp-objcp-common.h;
39 consequently, there should be very few hooks below. */
40
3ac88239
NB
41#undef LANG_HOOKS_NAME
42#define LANG_HOOKS_NAME "GNU C++"
19551f29
AO
43#undef LANG_HOOKS_INIT
44#define LANG_HOOKS_INIT cxx_init
394d9fe7
AO
45#undef LANG_HOOKS_CLASSIFY_RECORD
46#define LANG_HOOKS_CLASSIFY_RECORD cp_classify_record
39ef6592
LC
47#undef LANG_HOOKS_GENERIC_TYPE_P
48#define LANG_HOOKS_GENERIC_TYPE_P class_tmpl_impl_spec_p
f9329c35
DS
49
50#undef LANG_HOOKS_GET_INNERMOST_GENERIC_PARMS
51#define LANG_HOOKS_GET_INNERMOST_GENERIC_PARMS \
52 get_primary_template_innermost_parameters
53#undef LANG_HOOKS_GET_INNERMOST_GENERIC_ARGS
54#define LANG_HOOKS_GET_INNERMOST_GENERIC_ARGS \
f8fb7295 55 get_template_innermost_arguments_folded
d40a19da
DS
56#undef LANG_HOOKS_FUNCTION_PARAMETER_PACK_P
57#define LANG_HOOKS_FUNCTION_PARAMETER_PACK_P \
58 function_parameter_pack_p
f9329c35
DS
59#undef LANG_HOOKS_GET_ARGUMENT_PACK_ELEMS
60#define LANG_HOOKS_GET_ARGUMENT_PACK_ELEMS \
f8fb7295 61 get_template_argument_pack_elems_folded
f9329c35
DS
62#undef LANG_HOOKS_GENERIC_GENERIC_PARAMETER_DECL_P
63#define LANG_HOOKS_GENERIC_GENERIC_PARAMETER_DECL_P \
64 template_template_parameter_p
d40a19da
DS
65#undef LANG_HOOKS_FUNCTION_PARM_EXPANDED_FROM_PACK_P
66#define LANG_HOOKS_FUNCTION_PARM_EXPANDED_FROM_PACK_P \
67 function_parameter_expanded_from_pack_p
68#undef LANG_HOOKS_GET_GENERIC_FUNCTION_DECL
69#define LANG_HOOKS_GET_GENERIC_FUNCTION_DECL get_function_template_decl
a0ad3539
MM
70#undef LANG_HOOKS_DWARF_NAME
71#define LANG_HOOKS_DWARF_NAME cxx_dwarf_name
820cc88f 72#undef LANG_HOOKS_INIT_TS
ee336e84 73#define LANG_HOOKS_INIT_TS cp_common_init_ts
f9417da1
RG
74#undef LANG_HOOKS_EH_PERSONALITY
75#define LANG_HOOKS_EH_PERSONALITY cp_eh_personality
76#undef LANG_HOOKS_EH_RUNTIME_TYPE
77#define LANG_HOOKS_EH_RUNTIME_TYPE build_eh_type_type
7315daa6
MW
78#undef LANG_HOOKS_ENUM_UNDERLYING_BASE_TYPE
79#define LANG_HOOKS_ENUM_UNDERLYING_BASE_TYPE cxx_enum_underlying_base_type
f1e639b1 80
b6f43128
DM
81#if CHECKING_P
82#undef LANG_HOOKS_RUN_LANG_SELFTESTS
83#define LANG_HOOKS_RUN_LANG_SELFTESTS selftest::run_cp_tests
84#endif /* #if CHECKING_P */
85
0d48e877
DM
86#undef LANG_HOOKS_GET_SUBSTRING_LOCATION
87#define LANG_HOOKS_GET_SUBSTRING_LOCATION c_get_substring_location
88
11bb4b27 89/* Each front end provides its own lang hook initializer. */
4537ec0c 90struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
8ac61af7 91
11bb4b27
ZL
92/* Lang hook routines common to C++ and ObjC++ appear in cp/cp-objcp-common.c;
93 there should be very few routines below. */
8bcefb43 94
11bb4b27 95/* The following function does something real, but only in Objective-C++. */
e1a4dd13 96
11bb4b27 97tree
12308bc6
PC
98objcp_tsubst_copy_and_build (tree /*t*/,
99 tree /*args*/,
100 tsubst_flags_t /*complain*/,
101 tree /*in_decl*/,
102 bool /*function_p*/)
f75fbaf7 103{
11bb4b27 104 return NULL_TREE;
f75fbaf7
ZW
105}
106
a0ad3539
MM
107static const char *
108cxx_dwarf_name (tree t, int verbosity)
109{
110 gcc_assert (DECL_P (t));
111
bde2d108 112 if (DECL_NAME (t)
ee47f74e 113 && (anon_aggrname_p (DECL_NAME (t)) || LAMBDA_TYPE_P (t)))
bde2d108 114 return NULL;
a0ad3539 115 if (verbosity >= 2)
7496cd5b
SA
116 return decl_as_dwarf_string (t,
117 TFF_DECL_SPECIFIERS | TFF_UNQUALIFIED_NAME
118 | TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS);
a0ad3539 119
7496cd5b 120 return lang_decl_dwarf_name (t, verbosity, false);
a0ad3539
MM
121}
122
394d9fe7
AO
123static enum classify_record
124cp_classify_record (tree type)
125{
cc059bdd
JM
126 if (TYPE_LANG_SPECIFIC (type)
127 && CLASSTYPE_DECLARED_CLASS (type))
394d9fe7
AO
128 return RECORD_IS_CLASS;
129
130 return RECORD_IS_STRUCT;
131}
132
f9417da1
RG
133static GTY(()) tree cp_eh_personality_decl;
134
135static tree
136cp_eh_personality (void)
137{
138 if (!cp_eh_personality_decl)
bfecd57c 139 cp_eh_personality_decl = build_personality_function ("gxx");
f9417da1
RG
140
141 return cp_eh_personality_decl;
142}
143
f8fb7295
DS
144/* This is a subroutine of fold_cplus_constants. It returns TRUE if T
145 is a C++ specific constant that needs to be folded further before
146 being passed to the debug info emitter. */
147
148static bool
149template_arg_needs_folding (const_tree t)
150{
151 /* For now only PTRMEM_CST nodes are to be folded further. */
152 if (TREE_CODE (t) == PTRMEM_CST)
153 return true;
154 return false;
155}
156
157/* Fold the elements of the TREE_VEC C which are C++ specific nodes
158 that would need folding so that they can be processed by the debug
159 info emitter. This is a subroutine of
160 get_template_innermost_arguments_folded and
161 get_template_argument_pack_elems_folded. */
162
163static tree
164fold_cplus_constants (const_tree c)
165{
166 tree folded_elems, elems = CONST_CAST_TREE (c);
167 int vec_len, i;
168
169 if (elems == NULL_TREE || elems == error_mark_node)
170 return elems;
171
172 vec_len = TREE_VEC_LENGTH (elems);
173
174 /* First check if there is at least one element that needs
175 folding. If there is none, we just return ELEMS. Otherwise create
176 and return a new tree vector that contains the folded versions of
177 ELEMS. This is to avoid allocating memory if we don't need
178 to. */
179 for (i = 0; i < vec_len; ++i)
180 {
181 if (template_arg_needs_folding (TREE_VEC_ELT (elems, i)))
182 break;
183 }
184 if (i == vec_len)
185 return elems;
186
187 folded_elems = make_tree_vec (vec_len);
188 for (i = 0; i < vec_len; ++i)
189 {
190 tree elem = TREE_VEC_ELT (elems, i);
191 TREE_VEC_ELT (folded_elems, i) =
192 (elem && !TYPE_P (elem)) ? cplus_expand_constant (elem) : elem;
193
194 }
195 return folded_elems;
196}
197
198/* The C++ implementation of the LANG_HOOKS_GET_INNERMOST_GENERIC_ARGS
199 hook. It returns the innermost template arguments of type T, and
200 makes sure those arguments are folded enough for the debug info
201 emitter. */
202
203static tree
204get_template_innermost_arguments_folded (const_tree t)
205{
206 return fold_cplus_constants (get_template_innermost_arguments (t));
207}
208
209static tree
210get_template_argument_pack_elems_folded (const_tree t)
211{
212 return fold_cplus_constants (get_template_argument_pack_elems (t));
213}
214
7315daa6
MW
215/* The C++ version of the enum_underlying_base_type langhook.
216 See also cp/semantics.c (finish_underlying_type). */
217
218static
219tree cxx_enum_underlying_base_type (const_tree type)
220{
221 tree underlying_type = ENUM_UNDERLYING_TYPE (type);
222
223 if (! ENUM_FIXED_UNDERLYING_TYPE_P (type))
224 underlying_type
225 = c_common_type_for_mode (TYPE_MODE (underlying_type),
226 TYPE_UNSIGNED (underlying_type));
227
228 return underlying_type;
229}
230
b6f43128
DM
231#if CHECKING_P
232
233namespace selftest {
234
235/* Implementation of LANG_HOOKS_RUN_LANG_SELFTESTS for the C++ frontend. */
236
237void
238run_cp_tests (void)
239{
240 /* Run selftests shared within the C family. */
241 c_family_tests ();
242
243 /* Additional C++-specific tests. */
9a004410
DM
244 cp_pt_c_tests ();
245 cp_tree_c_tests ();
b6f43128
DM
246}
247
248} // namespace selftest
249
250#endif /* #if CHECKING_P */
251
641da50a 252
6561cdf6 253#include "gt-cp-cp-lang.h"
11bb4b27 254#include "gtype-cp.h"