]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cp/cp-lang.c
[C++ PATCH] Kill -fno-for-scope
[thirdparty/gcc.git] / gcc / cp / cp-lang.c
CommitLineData
19551f29 1/* Language-dependent hooks for C++.
85ec4feb 2 Copyright (C) 2001-2018 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
11bb4b27 86/* Each front end provides its own lang hook initializer. */
4537ec0c 87struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
8ac61af7 88
11bb4b27
ZL
89/* Lang hook routines common to C++ and ObjC++ appear in cp/cp-objcp-common.c;
90 there should be very few routines below. */
8bcefb43 91
11bb4b27 92/* The following function does something real, but only in Objective-C++. */
e1a4dd13 93
11bb4b27 94tree
12308bc6
PC
95objcp_tsubst_copy_and_build (tree /*t*/,
96 tree /*args*/,
97 tsubst_flags_t /*complain*/,
98 tree /*in_decl*/,
99 bool /*function_p*/)
f75fbaf7 100{
11bb4b27 101 return NULL_TREE;
f75fbaf7
ZW
102}
103
a0ad3539
MM
104static const char *
105cxx_dwarf_name (tree t, int verbosity)
106{
107 gcc_assert (DECL_P (t));
108
bde2d108 109 if (DECL_NAME (t)
ee47f74e 110 && (anon_aggrname_p (DECL_NAME (t)) || LAMBDA_TYPE_P (t)))
bde2d108 111 return NULL;
a0ad3539 112 if (verbosity >= 2)
7496cd5b
SA
113 return decl_as_dwarf_string (t,
114 TFF_DECL_SPECIFIERS | TFF_UNQUALIFIED_NAME
115 | TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS);
a0ad3539 116
7496cd5b 117 return lang_decl_dwarf_name (t, verbosity, false);
a0ad3539
MM
118}
119
394d9fe7
AO
120static enum classify_record
121cp_classify_record (tree type)
122{
cc059bdd
JM
123 if (TYPE_LANG_SPECIFIC (type)
124 && CLASSTYPE_DECLARED_CLASS (type))
394d9fe7
AO
125 return RECORD_IS_CLASS;
126
127 return RECORD_IS_STRUCT;
128}
129
f9417da1
RG
130static GTY(()) tree cp_eh_personality_decl;
131
132static tree
133cp_eh_personality (void)
134{
135 if (!cp_eh_personality_decl)
bfecd57c 136 cp_eh_personality_decl = build_personality_function ("gxx");
f9417da1
RG
137
138 return cp_eh_personality_decl;
139}
140
f8fb7295
DS
141/* This is a subroutine of fold_cplus_constants. It returns TRUE if T
142 is a C++ specific constant that needs to be folded further before
143 being passed to the debug info emitter. */
144
145static bool
146template_arg_needs_folding (const_tree t)
147{
148 /* For now only PTRMEM_CST nodes are to be folded further. */
149 if (TREE_CODE (t) == PTRMEM_CST)
150 return true;
151 return false;
152}
153
154/* Fold the elements of the TREE_VEC C which are C++ specific nodes
155 that would need folding so that they can be processed by the debug
156 info emitter. This is a subroutine of
157 get_template_innermost_arguments_folded and
158 get_template_argument_pack_elems_folded. */
159
160static tree
161fold_cplus_constants (const_tree c)
162{
163 tree folded_elems, elems = CONST_CAST_TREE (c);
164 int vec_len, i;
165
166 if (elems == NULL_TREE || elems == error_mark_node)
167 return elems;
168
169 vec_len = TREE_VEC_LENGTH (elems);
170
171 /* First check if there is at least one element that needs
172 folding. If there is none, we just return ELEMS. Otherwise create
173 and return a new tree vector that contains the folded versions of
174 ELEMS. This is to avoid allocating memory if we don't need
175 to. */
176 for (i = 0; i < vec_len; ++i)
177 {
178 if (template_arg_needs_folding (TREE_VEC_ELT (elems, i)))
179 break;
180 }
181 if (i == vec_len)
182 return elems;
183
184 folded_elems = make_tree_vec (vec_len);
185 for (i = 0; i < vec_len; ++i)
186 {
187 tree elem = TREE_VEC_ELT (elems, i);
188 TREE_VEC_ELT (folded_elems, i) =
189 (elem && !TYPE_P (elem)) ? cplus_expand_constant (elem) : elem;
190
191 }
192 return folded_elems;
193}
194
195/* The C++ implementation of the LANG_HOOKS_GET_INNERMOST_GENERIC_ARGS
196 hook. It returns the innermost template arguments of type T, and
197 makes sure those arguments are folded enough for the debug info
198 emitter. */
199
200static tree
201get_template_innermost_arguments_folded (const_tree t)
202{
203 return fold_cplus_constants (get_template_innermost_arguments (t));
204}
205
206static tree
207get_template_argument_pack_elems_folded (const_tree t)
208{
209 return fold_cplus_constants (get_template_argument_pack_elems (t));
210}
211
7315daa6
MW
212/* The C++ version of the enum_underlying_base_type langhook.
213 See also cp/semantics.c (finish_underlying_type). */
214
215static
216tree cxx_enum_underlying_base_type (const_tree type)
217{
218 tree underlying_type = ENUM_UNDERLYING_TYPE (type);
219
220 if (! ENUM_FIXED_UNDERLYING_TYPE_P (type))
221 underlying_type
222 = c_common_type_for_mode (TYPE_MODE (underlying_type),
223 TYPE_UNSIGNED (underlying_type));
224
225 return underlying_type;
226}
227
b6f43128
DM
228#if CHECKING_P
229
230namespace selftest {
231
232/* Implementation of LANG_HOOKS_RUN_LANG_SELFTESTS for the C++ frontend. */
233
234void
235run_cp_tests (void)
236{
237 /* Run selftests shared within the C family. */
238 c_family_tests ();
239
240 /* Additional C++-specific tests. */
9a004410
DM
241 cp_pt_c_tests ();
242 cp_tree_c_tests ();
b6f43128
DM
243}
244
245} // namespace selftest
246
247#endif /* #if CHECKING_P */
248
641da50a 249
6561cdf6 250#include "gt-cp-cp-lang.h"
11bb4b27 251#include "gtype-cp.h"