1 /* Library interface to C++ front end.
2 Copyright (C) 2014-2022 Free Software Foundation, Inc.
4 This file is part of GCC. As it interacts with GDB through libcc1,
5 they all become a single program as regards the GNU GPL's requirements.
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
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
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/>. */
21 #include <cc1plugin-config.h>
25 #undef PACKAGE_TARNAME
26 #undef PACKAGE_VERSION
28 #include "../gcc/config.h"
32 #undef PACKAGE_TARNAME
33 #undef PACKAGE_VERSION
35 #define INCLUDE_MEMORY
36 #include "gcc-plugin.h"
38 #include "coretypes.h"
39 #include "stringpool.h"
41 #include "gcc-interface.h"
44 #include "double-int.h"
52 #include "fold-const.h"
53 #include "stor-layout.h"
57 #include "hash-table.h"
59 #include "c-family/c-pragma.h"
60 // #include "c-lang.h"
61 #include "diagnostic.h"
62 #include "langhooks.h"
63 #include "langhooks-def.h"
66 #undef cfun // we want to assign to it, and function.h won't let us
68 #include "callbacks.hh"
69 #include "connection.hh"
70 #include "marshall-cp.hh"
76 using namespace cc1_plugin
;
80 static_assert (GCC_CP_SYMBOL_MASK
>= GCC_CP_SYMBOL_END
,
81 "GCC_CP_SYMBOL_MASK >= GCC_CP_SYMBOL_END");
86 plugin_binding_oracle (enum cp_oracle_request kind
, tree identifier
)
88 enum gcc_cp_oracle_request request
;
90 gcc_assert (current_context
!= NULL
);
94 case CP_ORACLE_IDENTIFIER
:
95 request
= GCC_CP_ORACLE_IDENTIFIER
;
102 cc1_plugin::call (current_context
, "binding_oracle", &ignore
,
103 request
, IDENTIFIER_POINTER (identifier
));
106 static int push_count
;
108 /* at_function_scope_p () tests cfun, indicating we're actually
109 compiling the function, but we don't even set it when pretending to
110 enter a function scope. We use this distinction to tell these two
111 cases apart: we don't want to define e.g. class names in the user
112 expression function's scope, when they're local to the original
113 function, because they'd get the wrong linkage name. */
116 at_fake_function_scope_p ()
118 return (!cfun
|| cfun
->decl
!= current_function_decl
)
119 && current_scope () == current_function_decl
;
123 push_fake_function (tree fndecl
, scope_kind kind
= sk_function_parms
)
125 current_function_decl
= fndecl
;
126 begin_scope (kind
, fndecl
);
128 begin_scope (sk_block
, NULL
);
134 if (toplevel_bindings_p () && current_namespace
== global_namespace
)
135 pop_from_top_level ();
136 else if (at_namespace_scope_p ())
138 else if (at_class_scope_p ())
142 gcc_assert (at_fake_function_scope_p ());
143 gcc_assert (!at_function_scope_p ());
144 gcc_assert (current_binding_level
->kind
== sk_block
145 && current_binding_level
->this_entity
== NULL
);
148 gcc_assert (current_binding_level
->this_entity
149 == current_function_decl
);
151 current_function_decl
= NULL
;
152 for (cp_binding_level
*scope
= current_binding_level
;
153 scope
; scope
= scope
->level_chain
)
154 if (scope
->kind
== sk_function_parms
)
156 current_function_decl
= scope
->this_entity
;
163 supplement_binding (cxx_binding
*binding
, tree decl
)
165 /* FIXME: this is pretty much a copy of supplement_binding_1 in
166 ../gcc/cp/name-lookup.c; the few replaced/removed bits are marked
168 tree bval
= binding
->value
;
170 tree target_bval
= strip_using_decl (bval
);
171 tree target_decl
= strip_using_decl (decl
);
173 if (TREE_CODE (target_decl
) == TYPE_DECL
&& DECL_ARTIFICIAL (target_decl
)
174 && target_decl
!= target_bval
175 && (TREE_CODE (target_bval
) != TYPE_DECL
176 /* We allow pushing an enum multiple times in a class
177 template in order to handle late matching of underlying
178 type on an opaque-enum-declaration followed by an
180 || (processing_template_decl
181 && TREE_CODE (TREE_TYPE (target_decl
)) == ENUMERAL_TYPE
182 && TREE_CODE (TREE_TYPE (target_bval
)) == ENUMERAL_TYPE
183 && (dependent_type_p (ENUM_UNDERLYING_TYPE
184 (TREE_TYPE (target_decl
)))
185 || dependent_type_p (ENUM_UNDERLYING_TYPE
186 (TREE_TYPE (target_bval
)))))))
187 /* The new name is the type name. */
188 binding
->type
= decl
;
189 else if (/* TARGET_BVAL is null when push_class_level_binding moves
190 an inherited type-binding out of the way to make room
191 for a new value binding. */
193 /* TARGET_BVAL is error_mark_node when TARGET_DECL's name
194 has been used in a non-class scope prior declaration.
195 In that case, we should have already issued a
196 diagnostic; for graceful error recovery purpose, pretend
197 this was the intended declaration for that name. */
198 || target_bval
== error_mark_node
199 /* If TARGET_BVAL is anticipated but has not yet been
200 declared, pretend it is not there at all. */
201 || (TREE_CODE (target_bval
) == FUNCTION_DECL
202 && DECL_IS_UNDECLARED_BUILTIN (target_bval
)))
203 binding
->value
= decl
;
204 else if (TREE_CODE (target_bval
) == TYPE_DECL
205 && DECL_ARTIFICIAL (target_bval
)
206 && target_decl
!= target_bval
207 && (TREE_CODE (target_decl
) != TYPE_DECL
208 || same_type_p (TREE_TYPE (target_decl
),
209 TREE_TYPE (target_bval
))))
211 /* The old binding was a type name. It was placed in
212 VALUE field because it was thought, at the point it was
213 declared, to be the only entity with such a name. Move the
214 type name into the type slot; it is now hidden by the new
216 binding
->type
= bval
;
217 binding
->value
= decl
;
218 binding
->value_is_inherited
= false;
220 else if (TREE_CODE (target_bval
) == TYPE_DECL
221 && TREE_CODE (target_decl
) == TYPE_DECL
222 && DECL_NAME (target_decl
) == DECL_NAME (target_bval
)
223 && binding
->scope
->kind
!= sk_class
224 && (same_type_p (TREE_TYPE (target_decl
), TREE_TYPE (target_bval
))
225 /* If either type involves template parameters, we must
226 wait until instantiation. */
227 || uses_template_parms (TREE_TYPE (target_decl
))
228 || uses_template_parms (TREE_TYPE (target_bval
))))
229 /* We have two typedef-names, both naming the same type to have
230 the same name. In general, this is OK because of:
234 In a given scope, a typedef specifier can be used to redefine
235 the name of any type declared in that scope to refer to the
236 type to which it already refers.
238 However, in class scopes, this rule does not apply due to the
239 stricter language in [class.mem] prohibiting redeclarations of
242 /* There can be two block-scope declarations of the same variable,
243 so long as they are `extern' declarations. However, there cannot
244 be two declarations of the same static data member:
248 A member shall not be declared twice in the
249 member-specification. */
250 else if (VAR_P (target_decl
)
251 && VAR_P (target_bval
)
252 && DECL_EXTERNAL (target_decl
) && DECL_EXTERNAL (target_bval
)
253 && !DECL_CLASS_SCOPE_P (target_decl
))
255 duplicate_decls (decl
, binding
->value
);
258 else if (TREE_CODE (decl
) == NAMESPACE_DECL
259 && TREE_CODE (bval
) == NAMESPACE_DECL
260 && DECL_NAMESPACE_ALIAS (decl
)
261 && DECL_NAMESPACE_ALIAS (bval
)
262 && ORIGINAL_NAMESPACE (bval
) == ORIGINAL_NAMESPACE (decl
))
265 In a declarative region, a namespace-alias-definition can be
266 used to redefine a namespace-alias declared in that declarative
267 region to refer only to the namespace to which it already
272 // _1: diagnose_name_conflict (decl, bval);
276 gcc_assert (ok
); // _1: return ok;
280 reactivate_decl (tree decl
, cp_binding_level
*b
)
282 bool in_function_p
= TREE_CODE (b
->this_entity
) == FUNCTION_DECL
;
283 gcc_assert (in_function_p
284 || (b
== current_binding_level
285 && !at_class_scope_p ()));
287 tree id
= DECL_NAME (decl
);
288 tree type
= NULL_TREE
;
289 if (TREE_CODE (decl
) == TYPE_DECL
)
290 type
= TREE_TYPE (decl
);
292 if (type
&& TYPE_NAME (type
) == decl
293 && (RECORD_OR_UNION_CODE_P (TREE_CODE (type
))
294 || TREE_CODE (type
) == ENUMERAL_TYPE
))
296 gcc_assert (in_function_p
&& DECL_CONTEXT (decl
) == b
->this_entity
);
297 type
= TREE_TYPE (decl
);
301 gcc_assert (DECL_CONTEXT (decl
) == b
->this_entity
302 || DECL_CONTEXT (decl
) == global_namespace
303 || TREE_CODE (DECL_CONTEXT (decl
)) == FUNCTION_DECL
);
307 /* Adjust IDENTIFIER_BINDING to what it would have been if we were
308 at binding level B. Save the binding chain up to that point in
309 [binding, *chainp), and take note of the outermost bindings found
311 cxx_binding
*binding
= IDENTIFIER_BINDING (id
), **chainp
= NULL
;
312 tree
*shadowing_type_p
= NULL
;
315 cp_binding_level
*bc
= current_binding_level
;
316 for (cxx_binding
*prev_binding
= binding
;
317 prev_binding
; prev_binding
= prev_binding
->previous
)
319 while (bc
!= b
&& bc
!= prev_binding
->scope
)
320 bc
= bc
->level_chain
;
327 chainp
= &prev_binding
->previous
;
329 for (tree tshadow
= prev_binding
->scope
->type_shadowed
;
330 tshadow
; tshadow
= TREE_CHAIN (tshadow
))
331 if (TREE_PURPOSE (tshadow
) == id
)
333 shadowing_type_p
= &TREE_VALUE (tshadow
);
340 IDENTIFIER_BINDING (id
) = *chainp
;
344 /* Like push_local_binding, supplement or add a binding to the
346 if (IDENTIFIER_BINDING (id
) && IDENTIFIER_BINDING (id
)->scope
== b
)
347 supplement_binding (IDENTIFIER_BINDING (id
), decl
);
349 push_binding (id
, decl
, b
);
351 /* Now restore the binding chain we'd temporarily removed. */
354 *chainp
= IDENTIFIER_BINDING (id
);
355 IDENTIFIER_BINDING (id
) = binding
;
359 /* Insert the new type binding in the shadowing_type_p
361 tree shadowed_type
= NULL_TREE
;
362 if (shadowing_type_p
)
364 shadowed_type
= *shadowing_type_p
;
365 *shadowing_type_p
= type
;
368 b
->type_shadowed
= tree_cons (id
, shadowed_type
, b
->type_shadowed
);
369 TREE_TYPE (b
->type_shadowed
) = type
;
374 /* Our new binding is the active one, so shadow the earlier
376 b
->type_shadowed
= tree_cons (id
, REAL_IDENTIFIER_TYPE_VALUE (id
),
378 TREE_TYPE (b
->type_shadowed
) = type
;
379 SET_IDENTIFIER_TYPE_VALUE (id
, type
);
382 /* Record that we have a binding for ID, like add_decl_to_level. */
383 tree node
= build_tree_list (NULL_TREE
, decl
);
384 TREE_CHAIN (node
) = b
->names
;
389 plugin_pragma_push_user_expression (cpp_reader
*)
394 gcc_assert (!current_class_ptr
);
395 gcc_assert (!current_class_ref
);
397 gcc_assert (!cp_binding_oracle
);
398 cp_binding_oracle
= plugin_binding_oracle
;
400 /* Make the function containing the user expression a global
401 friend, so as to bypass access controls in it. */
402 if (at_function_scope_p ())
403 set_global_friend (current_function_decl
);
405 gcc_assert (at_function_scope_p ());
406 function
*save_cfun
= cfun
;
407 cp_binding_level
*orig_binding_level
= current_binding_level
;
410 cc1_plugin::call (current_context
, "enter_scope", &success
);
412 gcc_assert (at_fake_function_scope_p () || at_function_scope_p ());
414 function
*unchanged_cfun
= cfun
;
415 tree changed_func_decl
= current_function_decl
;
417 gcc_assert (current_class_type
== DECL_CONTEXT (current_function_decl
)
418 || !(RECORD_OR_UNION_CODE_P
419 (TREE_CODE (DECL_CONTEXT (current_function_decl
)))));
420 push_fake_function (save_cfun
->decl
, sk_block
);
421 current_class_type
= NULL_TREE
;
424 /* If we get here, GDB did NOT change the context. */
425 gcc_assert (cfun
== save_cfun
);
426 gcc_assert (at_function_scope_p ());
427 gcc_assert (orig_binding_level
428 == current_binding_level
->level_chain
->level_chain
);
433 gcc_assert (at_function_scope_p ());
435 cp_binding_level
*b
= current_binding_level
->level_chain
;
436 gcc_assert (b
->this_entity
== cfun
->decl
);
438 /* Reactivate local names from the previous context. Use
439 IDENTIFIER_MARKED to avoid reactivating shadowed names. */
440 for (cp_binding_level
*level
= orig_binding_level
;;)
442 for (tree name
= level
->names
;
443 name
; name
= TREE_CHAIN (name
))
446 if (TREE_CODE (decl
) == TREE_LIST
)
447 decl
= TREE_VALUE (decl
);
448 if (IDENTIFIER_MARKED (DECL_NAME (decl
)))
450 IDENTIFIER_MARKED (DECL_NAME (decl
)) = 1;
451 reactivate_decl (decl
, b
);
453 if (level
->kind
== sk_function_parms
454 && level
->this_entity
== cfun
->decl
)
456 gcc_assert (!level
->this_entity
);
457 level
= level
->level_chain
;
460 /* Now, clear the markers. */
461 for (tree name
= b
->names
; name
; name
= TREE_CHAIN (name
))
464 if (TREE_CODE (decl
) == TREE_LIST
)
465 decl
= TREE_VALUE (decl
);
466 gcc_assert (IDENTIFIER_MARKED (DECL_NAME (decl
)));
467 IDENTIFIER_MARKED (DECL_NAME (decl
)) = 0;
471 if (unchanged_cfun
|| DECL_NONSTATIC_MEMBER_FUNCTION_P (changed_func_decl
))
473 /* Check whether the oracle supplies us with a "this", and if
474 so, arrange for data members and this itself to be
476 tree this_val
= lookup_name (get_identifier ("this"));
477 current_class_ref
= !this_val
? NULL_TREE
478 : cp_build_indirect_ref (input_location
, this_val
, RO_NULL
,
479 tf_warning_or_error
);
480 current_class_ptr
= this_val
;
485 plugin_pragma_pop_user_expression (cpp_reader
*)
490 gcc_assert (cp_binding_oracle
);
492 gcc_assert (at_function_scope_p ());
493 function
*save_cfun
= cfun
;
494 current_class_ptr
= NULL_TREE
;
495 current_class_ref
= NULL_TREE
;
499 if (RECORD_OR_UNION_CODE_P (TREE_CODE (DECL_CONTEXT (current_function_decl
))))
500 current_class_type
= DECL_CONTEXT (current_function_decl
);
503 cc1_plugin::call (current_context
, "leave_scope", &success
);
508 gcc_assert (cfun
== save_cfun
);
510 cp_binding_oracle
= NULL
;
511 gcc_assert (at_function_scope_p ());
515 plugin_init_extra_pragmas (void *, void *)
517 c_register_pragma ("GCC", "push_user_expression", plugin_pragma_push_user_expression
);
518 c_register_pragma ("GCC", "pop_user_expression", plugin_pragma_pop_user_expression
);
519 /* FIXME: this one should go once we get GDB to use push and pop. */
520 c_register_pragma ("GCC", "user_expression", plugin_pragma_push_user_expression
);
525 static decl_addr_value
526 build_decl_addr_value (tree decl
, gcc_address address
)
528 decl_addr_value value
= {
530 build_int_cst_type (ptr_type_node
, address
)
535 static decl_addr_value
*
536 record_decl_address (plugin_context
*ctx
, decl_addr_value value
)
538 decl_addr_value
**slot
= ctx
->address_map
.find_slot (&value
, INSERT
);
539 gcc_assert (*slot
== NULL
);
541 = static_cast<decl_addr_value
*> (xmalloc (sizeof (decl_addr_value
)));
543 /* We don't want GCC to warn about e.g. static functions
544 without a code definition. */
545 suppress_warning (value
.decl
);
549 // Maybe rewrite a decl to its address.
551 address_rewriter (tree
*in
, int *walk_subtrees
, void *arg
)
553 plugin_context
*ctx
= (plugin_context
*) arg
;
556 || TREE_CODE (*in
) == NAMESPACE_DECL
557 || DECL_NAME (*in
) == NULL_TREE
)
560 decl_addr_value value
;
562 decl_addr_value
*found_value
= ctx
->address_map
.find (&value
);
563 if (found_value
!= NULL
)
565 else if (HAS_DECL_ASSEMBLER_NAME_P (*in
))
569 if (!cc1_plugin::call (ctx
, "address_oracle", &address
,
570 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (*in
))))
575 // Insert the decl into the address map in case it is referenced
577 value
= build_decl_addr_value (value
.decl
, address
);
578 found_value
= record_decl_address (ctx
, value
);
583 if (found_value
->address
!= error_mark_node
)
585 // We have an address for the decl, so rewrite the tree.
586 tree ptr_type
= build_pointer_type (TREE_TYPE (*in
));
587 *in
= fold_build1 (INDIRECT_REF
, TREE_TYPE (*in
),
588 fold_build1 (CONVERT_EXPR
, ptr_type
,
589 found_value
->address
));
597 // When generating code for gdb, we want to be able to use absolute
598 // addresses to refer to otherwise external objects that gdb knows
599 // about. gdb passes in these addresses when building decls, and then
600 // before gimplification we go through the trees, rewriting uses to
601 // the equivalent of "*(TYPE *) ADDR".
603 rewrite_decls_to_addresses (void *function_in
, void *)
605 tree function
= (tree
) function_in
;
607 // Do nothing if we're not in gdb.
608 if (current_context
== NULL
)
611 walk_tree (&DECL_SAVED_TREE (function
), address_rewriter
, current_context
,
618 safe_push_template_decl (tree decl
)
620 void (*save_oracle
) (enum cp_oracle_request
, tree identifier
);
622 save_oracle
= cp_binding_oracle
;
623 cp_binding_oracle
= NULL
;
625 tree ret
= push_template_decl (decl
);
627 cp_binding_oracle
= save_oracle
;
633 safe_pushtag (tree name
, tree type
)
635 void (*save_oracle
) (enum cp_oracle_request
, tree identifier
);
637 save_oracle
= cp_binding_oracle
;
638 cp_binding_oracle
= NULL
;
640 tree ret
= pushtag (name
, type
);
642 cp_binding_oracle
= save_oracle
;
648 safe_pushdecl (tree decl
)
650 void (*save_oracle
) (enum cp_oracle_request
, tree identifier
);
652 save_oracle
= cp_binding_oracle
;
653 cp_binding_oracle
= NULL
;
655 tree ret
= pushdecl (decl
);
657 cp_binding_oracle
= save_oracle
;
665 plugin_push_namespace (cc1_plugin::connection
*,
669 push_to_top_level ();
671 push_namespace (name
? get_identifier (name
) : NULL
);
677 plugin_push_class (cc1_plugin::connection
*,
680 tree type
= convert_in (type_in
);
681 gcc_assert (RECORD_OR_UNION_CODE_P (TREE_CODE (type
)));
682 gcc_assert (TYPE_CONTEXT (type
) == FROB_CONTEXT (current_scope ()));
690 plugin_push_function (cc1_plugin::connection
*,
691 gcc_decl function_decl_in
)
693 tree fndecl
= convert_in (function_decl_in
);
694 gcc_assert (TREE_CODE (fndecl
) == FUNCTION_DECL
);
695 gcc_assert (DECL_CONTEXT (fndecl
) == FROB_CONTEXT (current_scope ()));
697 push_fake_function (fndecl
);
703 plugin_pop_binding_level (cc1_plugin::connection
*)
710 plugin_reactivate_decl (cc1_plugin::connection
*,
714 tree decl
= convert_in (decl_in
);
715 tree scope
= convert_in (scope_in
);
716 gcc_assert (TREE_CODE (decl
) == VAR_DECL
717 || TREE_CODE (decl
) == FUNCTION_DECL
718 || TREE_CODE (decl
) == TYPE_DECL
);
722 gcc_assert (TREE_CODE (scope
) == FUNCTION_DECL
);
723 for (b
= current_binding_level
;
724 b
->this_entity
!= scope
;
726 gcc_assert (b
->this_entity
!= global_namespace
);
730 gcc_assert (!at_class_scope_p ());
731 b
= current_binding_level
;
734 reactivate_decl (decl
, b
);
743 if (at_namespace_scope_p ())
744 decl
= current_namespace
;
745 else if (at_class_scope_p ())
746 decl
= TYPE_NAME (current_class_type
);
747 else if (at_fake_function_scope_p () || at_function_scope_p ())
748 decl
= current_function_decl
;
756 plugin_get_current_binding_level_decl (cc1_plugin::connection
*)
758 tree decl
= get_current_scope ();
760 return convert_out (decl
);
764 plugin_make_namespace_inline (cc1_plugin::connection
*)
766 tree inline_ns
= current_namespace
;
768 gcc_assert (toplevel_bindings_p ());
769 gcc_assert (inline_ns
!= global_namespace
);
771 tree parent_ns
= CP_DECL_CONTEXT (inline_ns
);
773 if (DECL_NAMESPACE_INLINE_P (inline_ns
))
776 DECL_NAMESPACE_INLINE_P (inline_ns
) = true;
777 vec_safe_push (DECL_NAMESPACE_INLINEES (parent_ns
), inline_ns
);
783 plugin_add_using_namespace (cc1_plugin::connection
*,
786 tree used_ns
= convert_in (used_ns_in
);
788 gcc_assert (TREE_CODE (used_ns
) == NAMESPACE_DECL
);
790 finish_using_directive (used_ns
, NULL_TREE
);
796 plugin_add_namespace_alias (cc1_plugin::connection
*,
800 tree name
= get_identifier (id
);
801 tree target
= convert_in (target_in
);
803 do_namespace_alias (name
, target
);
809 set_access_flags (tree decl
, enum gcc_cp_symbol_kind flags
)
811 gcc_assert (!(flags
& GCC_CP_ACCESS_MASK
) == !DECL_CLASS_SCOPE_P (decl
));
813 switch (flags
& GCC_CP_ACCESS_MASK
)
815 case GCC_CP_ACCESS_PRIVATE
:
816 TREE_PRIVATE (decl
) = true;
817 current_access_specifier
= access_private_node
;
820 case GCC_CP_ACCESS_PROTECTED
:
821 TREE_PROTECTED (decl
) = true;
822 current_access_specifier
= access_protected_node
;
825 case GCC_CP_ACCESS_PUBLIC
:
826 current_access_specifier
= access_public_node
;
835 plugin_add_using_decl (cc1_plugin::connection
*,
836 enum gcc_cp_symbol_kind flags
,
839 tree target
= convert_in (target_in
);
840 gcc_assert ((flags
& GCC_CP_SYMBOL_MASK
) == GCC_CP_SYMBOL_USING
);
841 gcc_assert (!(flags
& GCC_CP_FLAG_MASK
));
842 enum gcc_cp_symbol_kind acc_flags
;
843 acc_flags
= (enum gcc_cp_symbol_kind
) (flags
& GCC_CP_ACCESS_MASK
);
845 gcc_assert (!template_parm_scope_p ());
847 bool class_member_p
= at_class_scope_p ();
848 gcc_assert (!(acc_flags
& GCC_CP_ACCESS_MASK
) == !class_member_p
);
850 tree identifier
= DECL_NAME (target
);
851 tree tcontext
= DECL_CONTEXT (target
);
853 if (UNSCOPED_ENUM_P (tcontext
))
854 tcontext
= CP_TYPE_CONTEXT (tcontext
);
858 tree decl
= do_class_using_decl (tcontext
, identifier
);
860 set_access_flags (decl
, flags
);
862 finish_member_declaration (decl
);
866 /* We can't be at local scope. */
867 gcc_assert (at_namespace_scope_p ());
868 finish_nonmember_using_decl (tcontext
, identifier
);
875 build_named_class_type (enum tree_code code
,
879 /* See at_fake_function_scope_p. */
880 gcc_assert (!at_function_scope_p ());
881 tree type
= make_class_type (code
);
882 tree type_decl
= build_decl (loc
, TYPE_DECL
, id
, type
);
883 TYPE_NAME (type
) = type_decl
;
884 TYPE_STUB_DECL (type
) = type_decl
;
885 DECL_CONTEXT (type_decl
) = TYPE_CONTEXT (type
);
890 /* Abuse an unused field of the dummy template parms entry to hold the
892 #define TP_PARM_LIST TREE_TYPE (current_template_parms)
895 plugin_build_decl (cc1_plugin::connection
*self
,
897 enum gcc_cp_symbol_kind sym_kind
,
898 gcc_type sym_type_in
,
899 const char *substitution_name
,
901 const char *filename
,
902 unsigned int line_number
)
904 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
905 gcc_assert (!name
|| !strchr (name
, ':')); // FIXME: this can go eventually.
909 tree sym_type
= convert_in (sym_type_in
);
910 enum gcc_cp_symbol_kind sym_flags
;
911 sym_flags
= (enum gcc_cp_symbol_kind
) (sym_kind
& GCC_CP_FLAG_MASK
);
912 enum gcc_cp_symbol_kind acc_flags
;
913 acc_flags
= (enum gcc_cp_symbol_kind
) (sym_kind
& GCC_CP_ACCESS_MASK
);
914 sym_kind
= (enum gcc_cp_symbol_kind
) (sym_kind
& GCC_CP_SYMBOL_MASK
);
918 case GCC_CP_SYMBOL_FUNCTION
:
919 code
= FUNCTION_DECL
;
920 gcc_assert (!(sym_flags
& ~GCC_CP_FLAG_MASK_FUNCTION
));
923 case GCC_CP_SYMBOL_VARIABLE
:
925 gcc_assert (!(sym_flags
& ~GCC_CP_FLAG_MASK_VARIABLE
));
928 case GCC_CP_SYMBOL_TYPEDEF
:
930 gcc_assert (!sym_flags
);
933 case GCC_CP_SYMBOL_CLASS
:
935 gcc_assert (!(sym_flags
& ~GCC_CP_FLAG_MASK_CLASS
));
936 gcc_assert (!sym_type
);
939 case GCC_CP_SYMBOL_UNION
:
941 gcc_assert (!sym_flags
);
942 gcc_assert (!sym_type
);
949 bool template_decl_p
= template_parm_scope_p ();
953 gcc_assert (code
== FUNCTION_DECL
|| code
== RECORD_TYPE
954 || code
== TYPE_DECL
);
956 /* Finish the template parm list that started this template parm. */
957 end_template_parm_list (TP_PARM_LIST
);
959 gcc_assert (!address
);
960 gcc_assert (!substitution_name
);
963 location_t loc
= ctx
->get_location_t (filename
, line_number
);
964 bool class_member_p
= at_class_scope_p ();
965 bool ctor
= false, dtor
= false, assop
= false;
966 tree_code opcode
= ERROR_MARK
;
968 gcc_assert (!(acc_flags
& GCC_CP_ACCESS_MASK
) == !class_member_p
);
971 if (code
!= FUNCTION_DECL
972 || !(sym_flags
& GCC_CP_FLAG_SPECIAL_FUNCTION
))
975 identifier
= get_identifier (name
);
978 gcc_assert (RECORD_OR_UNION_CODE_P (code
));
979 identifier
= make_anon_name ();
983 if (code
== FUNCTION_DECL
)
985 if (sym_flags
& GCC_CP_FLAG_SPECIAL_FUNCTION
)
987 #define CHARS2(f,s) (((unsigned char)f << CHAR_BIT) | (unsigned char)s)
988 switch (CHARS2 (name
[0], name
[1]))
990 case CHARS2 ('C', 0x0): // ctor base declaration
991 case CHARS2 ('C', ' '):
992 case CHARS2 ('C', '1'):
993 case CHARS2 ('C', '2'):
994 case CHARS2 ('C', '4'):
997 gcc_assert (!address
);
998 gcc_assert (!substitution_name
);
999 identifier
= DECL_NAME (TYPE_NAME (current_class_type
));
1001 case CHARS2 ('D', 0x0): // dtor base declaration
1002 case CHARS2 ('D', ' '):
1003 case CHARS2 ('D', '0'):
1004 case CHARS2 ('D', '1'):
1005 case CHARS2 ('D', '2'):
1006 case CHARS2 ('D', '4'):
1007 gcc_assert (!template_decl_p
);
1010 case CHARS2 ('n', 'w'): // operator new
1013 case CHARS2 ('n', 'a'): // operator new[]
1014 opcode
= VEC_NEW_EXPR
;
1016 case CHARS2 ('d', 'l'): // operator delete
1017 opcode
= DELETE_EXPR
;
1019 case CHARS2 ('d', 'a'): // operator delete[]
1020 opcode
= VEC_DELETE_EXPR
;
1022 case CHARS2 ('p', 's'): // operator + (unary)
1025 case CHARS2 ('n', 'g'): // operator - (unary)
1026 opcode
= MINUS_EXPR
;
1028 case CHARS2 ('a', 'd'): // operator & (unary)
1029 opcode
= BIT_AND_EXPR
;
1031 case CHARS2 ('d', 'e'): // operator * (unary)
1034 case CHARS2 ('c', 'o'): // operator ~
1035 opcode
= BIT_NOT_EXPR
;
1037 case CHARS2 ('p', 'l'): // operator +
1040 case CHARS2 ('m', 'i'): // operator -
1041 opcode
= MINUS_EXPR
;
1043 case CHARS2 ('m', 'l'): // operator *
1046 case CHARS2 ('d', 'v'): // operator /
1047 opcode
= TRUNC_DIV_EXPR
;
1049 case CHARS2 ('r', 'm'): // operator %
1050 opcode
= TRUNC_MOD_EXPR
;
1052 case CHARS2 ('a', 'n'): // operator &
1053 opcode
= BIT_AND_EXPR
;
1055 case CHARS2 ('o', 'r'): // operator |
1056 opcode
= BIT_IOR_EXPR
;
1058 case CHARS2 ('e', 'o'): // operator ^
1059 opcode
= BIT_XOR_EXPR
;
1061 case CHARS2 ('a', 'S'): // operator =
1065 case CHARS2 ('p', 'L'): // operator +=
1069 case CHARS2 ('m', 'I'): // operator -=
1070 opcode
= MINUS_EXPR
;
1073 case CHARS2 ('m', 'L'): // operator *=
1077 case CHARS2 ('d', 'V'): // operator /=
1078 opcode
= TRUNC_DIV_EXPR
;
1081 case CHARS2 ('r', 'M'): // operator %=
1082 opcode
= TRUNC_MOD_EXPR
;
1085 case CHARS2 ('a', 'N'): // operator &=
1086 opcode
= BIT_AND_EXPR
;
1089 case CHARS2 ('o', 'R'): // operator |=
1090 opcode
= BIT_IOR_EXPR
;
1093 case CHARS2 ('e', 'O'): // operator ^=
1094 opcode
= BIT_XOR_EXPR
;
1097 case CHARS2 ('l', 's'): // operator <<
1098 opcode
= LSHIFT_EXPR
;
1100 case CHARS2 ('r', 's'): // operator >>
1101 opcode
= RSHIFT_EXPR
;
1103 case CHARS2 ('l', 'S'): // operator <<=
1104 opcode
= LSHIFT_EXPR
;
1107 case CHARS2 ('r', 'S'): // operator >>=
1108 opcode
= RSHIFT_EXPR
;
1111 case CHARS2 ('e', 'q'): // operator ==
1114 case CHARS2 ('n', 'e'): // operator !=
1117 case CHARS2 ('l', 't'): // operator <
1120 case CHARS2 ('g', 't'): // operator >
1123 case CHARS2 ('l', 'e'): // operator <=
1126 case CHARS2 ('g', 'e'): // operator >=
1129 case CHARS2 ('n', 't'): // operator !
1130 opcode
= TRUTH_NOT_EXPR
;
1132 case CHARS2 ('a', 'a'): // operator &&
1133 opcode
= TRUTH_ANDIF_EXPR
;
1135 case CHARS2 ('o', 'o'): // operator ||
1136 opcode
= TRUTH_ORIF_EXPR
;
1138 case CHARS2 ('p', 'p'): // operator ++
1139 opcode
= POSTINCREMENT_EXPR
;
1141 case CHARS2 ('m', 'm'): // operator --
1142 /* This stands for either one as an operator name, and
1143 "pp" and "mm" stand for POST??CREMENT, but for some
1144 reason the parser uses this opcode name for
1145 operator--; let's follow their practice. */
1146 opcode
= PREDECREMENT_EXPR
;
1148 case CHARS2 ('c', 'm'): // operator ,
1149 opcode
= COMPOUND_EXPR
;
1151 case CHARS2 ('p', 'm'): // operator ->*
1152 opcode
= MEMBER_REF
;
1154 case CHARS2 ('p', 't'): // operator ->
1155 opcode
= COMPONENT_REF
;
1157 case CHARS2 ('c', 'l'): // operator ()
1160 case CHARS2 ('i', 'x'): // operator []
1163 case CHARS2 ('c', 'v'): // operator <T> (conversion operator)
1164 identifier
= make_conv_op_name (TREE_TYPE (sym_type
));
1167 case CHARS2 ('l', 'i'): // operator "" <id>
1169 char *id
= (char *)name
+ 2;
1170 bool freeid
= false;
1171 if (*id
>= '0' && *id
<= '9')
1180 while (*id
&& *id
>= '0' && *id
<= '9');
1181 id
= xstrndup (id
, len
);
1184 identifier
= cp_literal_operator_id (id
);
1189 case CHARS2 ('q', 'u'): // ternary operator, not overloadable.
1194 if (opcode
!= ERROR_MARK
)
1195 identifier
= ovl_op_identifier (assop
, opcode
);
1197 decl
= build_lang_decl_loc (loc
, code
, identifier
, sym_type
);
1198 /* FIXME: current_lang_name is lang_name_c while compiling an
1199 extern "C" function, and we haven't switched to a global
1200 context at this point, and this breaks function
1202 SET_DECL_LANGUAGE (decl
, lang_cplusplus
);
1203 if (TREE_CODE (sym_type
) == METHOD_TYPE
)
1204 DECL_ARGUMENTS (decl
) = build_this_parm (decl
, current_class_type
,
1205 cp_type_quals (sym_type
));
1206 for (tree arg
= TREE_CODE (sym_type
) == METHOD_TYPE
1207 ? TREE_CHAIN (TYPE_ARG_TYPES (sym_type
))
1208 : TYPE_ARG_TYPES (sym_type
);
1209 arg
&& arg
!= void_list_node
;
1210 arg
= TREE_CHAIN (arg
))
1212 tree parm
= cp_build_parm_decl (decl
, NULL_TREE
, TREE_VALUE (arg
));
1213 DECL_CHAIN (parm
) = DECL_ARGUMENTS (decl
);
1214 DECL_ARGUMENTS (decl
) = parm
;
1216 DECL_ARGUMENTS (decl
) = nreverse (DECL_ARGUMENTS (decl
));
1219 if (TREE_CODE (sym_type
) == FUNCTION_TYPE
)
1220 DECL_STATIC_FUNCTION_P (decl
) = 1;
1221 if (sym_flags
& GCC_CP_FLAG_VIRTUAL_FUNCTION
)
1223 DECL_VIRTUAL_P (decl
) = 1;
1224 if (sym_flags
& GCC_CP_FLAG_PURE_VIRTUAL_FUNCTION
)
1225 DECL_PURE_VIRTUAL_P (decl
) = 1;
1226 if (sym_flags
& GCC_CP_FLAG_FINAL_VIRTUAL_FUNCTION
)
1227 DECL_FINAL_P (decl
) = 1;
1230 gcc_assert (!(sym_flags
& (GCC_CP_FLAG_PURE_VIRTUAL_FUNCTION
1231 | GCC_CP_FLAG_FINAL_VIRTUAL_FUNCTION
)));
1235 gcc_assert (!(sym_flags
& (GCC_CP_FLAG_VIRTUAL_FUNCTION
1236 | GCC_CP_FLAG_PURE_VIRTUAL_FUNCTION
1237 | GCC_CP_FLAG_FINAL_VIRTUAL_FUNCTION
)));
1238 gcc_assert (!ctor
&& !dtor
&& !assop
);
1240 if (sym_flags
& GCC_CP_FLAG_EXPLICIT_FUNCTION
)
1241 DECL_NONCONVERTING_P (decl
) = 1;
1242 if (sym_flags
& GCC_CP_FLAG_DEFAULTED_FUNCTION
)
1244 DECL_INITIAL (decl
) = ridpointers
[(int)RID_DEFAULT
];
1245 DECL_DEFAULTED_FN (decl
) = 1;
1247 if (sym_flags
& GCC_CP_FLAG_DELETED_FUNCTION
)
1249 // DECL_INITIAL (decl) = ridpointers[(int)RID_DELETE];
1250 DECL_DELETED_FN (decl
) = 1;
1251 DECL_DECLARED_INLINE_P (decl
) = 1;
1252 DECL_INITIAL (decl
) = error_mark_node
;
1256 DECL_CXX_CONSTRUCTOR_P (decl
) = 1;
1258 DECL_CXX_DESTRUCTOR_P (decl
) = 1;
1259 else if ((sym_flags
& GCC_CP_FLAG_SPECIAL_FUNCTION
)
1260 && opcode
!= ERROR_MARK
)
1261 DECL_OVERLOADED_OPERATOR_CODE_RAW (decl
) = ovl_op_mapping
[opcode
];
1263 else if (RECORD_OR_UNION_CODE_P (code
))
1265 decl
= build_named_class_type (code
, identifier
, loc
);
1266 tree type
= TREE_TYPE (decl
);
1268 if (code
== RECORD_TYPE
1269 && !(sym_flags
& GCC_CP_FLAG_CLASS_IS_STRUCT
))
1270 CLASSTYPE_DECLARED_CLASS (type
) = true;
1272 else if (class_member_p
)
1274 decl
= build_lang_decl_loc (loc
, code
, identifier
, sym_type
);
1276 if (TREE_CODE (decl
) == VAR_DECL
)
1278 DECL_THIS_STATIC (decl
) = 1;
1279 // The remainder of this block does the same as:
1280 // set_linkage_for_static_data_member (decl);
1281 TREE_PUBLIC (decl
) = 1;
1282 TREE_STATIC (decl
) = 1;
1283 DECL_INTERFACE_KNOWN (decl
) = 1;
1285 // FIXME: sym_flags & GCC_CP_FLAG_THREAD_LOCAL_VARIABLE
1286 gcc_assert (!(sym_flags
& GCC_CP_FLAG_THREAD_LOCAL_VARIABLE
));
1288 if (sym_flags
& GCC_CP_FLAG_CONSTEXPR_VARIABLE
)
1289 DECL_DECLARED_CONSTEXPR_P (decl
) = true;
1294 decl
= build_decl (loc
, code
, identifier
, sym_type
);
1296 if (TREE_CODE (decl
) == VAR_DECL
)
1298 // FIXME: sym_flags & GCC_CP_FLAG_THREAD_LOCAL_VARIABLE
1299 gcc_assert (!(sym_flags
& GCC_CP_FLAG_THREAD_LOCAL_VARIABLE
));
1301 if (sym_flags
& GCC_CP_FLAG_CONSTEXPR_VARIABLE
)
1302 DECL_DECLARED_CONSTEXPR_P (decl
) = true;
1305 TREE_USED (decl
) = 1;
1306 TREE_ADDRESSABLE (decl
) = 1;
1309 DECL_CONTEXT (decl
) = FROB_CONTEXT (current_class_type
);
1310 else if (at_namespace_scope_p ())
1311 DECL_CONTEXT (decl
) = FROB_CONTEXT (current_decl_namespace ());
1313 set_access_flags (decl
, acc_flags
);
1315 /* If this is the typedef that names an otherwise anonymous type,
1316 propagate the typedef name to the type. In normal compilation,
1317 this is done in grokdeclarator. */
1318 if (sym_kind
== GCC_CP_SYMBOL_TYPEDEF
1320 && DECL_CONTEXT (decl
) == TYPE_CONTEXT (sym_type
)
1321 && TYPE_UNNAMED_P (sym_type
))
1322 name_unnamed_type (sym_type
, decl
);
1324 if (sym_kind
!= GCC_CP_SYMBOL_TYPEDEF
1325 && sym_kind
!= GCC_CP_SYMBOL_CLASS
1326 && sym_kind
!= GCC_CP_SYMBOL_UNION
1327 && !template_decl_p
&& !ctor
&& !dtor
)
1329 decl_addr_value value
;
1331 DECL_EXTERNAL (decl
) = 1;
1333 if (substitution_name
!= NULL
)
1335 // If the translator gave us a name without a binding,
1336 // we can just substitute error_mark_node, since we know the
1337 // translator will be reporting an error anyhow.
1339 = lookup_name (get_identifier (substitution_name
));
1340 if (value
.address
== NULL_TREE
)
1341 value
.address
= error_mark_node
;
1344 value
.address
= build_int_cst_type (ptr_type_node
, address
);
1346 value
.address
= NULL
;
1348 record_decl_address (ctx
, value
);
1351 if (class_member_p
&& code
== FUNCTION_DECL
)
1354 maybe_retrofit_in_chrg (decl
);
1356 grok_special_member_properties (decl
);
1359 if (template_decl_p
)
1361 if (RECORD_OR_UNION_CODE_P (code
))
1362 safe_pushtag (identifier
, TREE_TYPE (decl
));
1364 decl
= safe_push_template_decl (decl
);
1366 tree tdecl
= NULL_TREE
;
1368 tdecl
= finish_member_template_decl (decl
);
1370 end_template_decl ();
1372 /* We only support one level of templates, because we only
1373 support declaring generics; actual definitions are only of
1375 gcc_assert (!template_parm_scope_p ());
1378 finish_member_declaration (tdecl
);
1380 else if (RECORD_OR_UNION_CODE_P (code
))
1381 safe_pushtag (identifier
, TREE_TYPE (decl
));
1382 else if (class_member_p
)
1383 finish_member_declaration (decl
);
1385 decl
= safe_pushdecl (decl
);
1388 /* Don't crash after a duplicate declaration of a cdtor. */
1389 && TYPE_FIELDS (current_class_type
) == decl
)
1391 /* ctors and dtors clones are chained after DECL.
1392 However, we create the clones before TYPE_METHODS is
1393 reversed. We test for cloned methods after reversal,
1394 however, and the test requires the clones to follow
1395 DECL. So, we reverse the chain of clones now, so
1396 that it will come out in the right order after
1398 tree save
= DECL_CHAIN (decl
);
1399 DECL_CHAIN (decl
) = NULL_TREE
;
1400 clone_cdtor (decl
, /*update_methods=*/true);
1401 gcc_assert (TYPE_FIELDS (current_class_type
) == decl
);
1402 TYPE_FIELDS (current_class_type
)
1403 = nreverse (TYPE_FIELDS (current_class_type
));
1404 DECL_CHAIN (decl
) = save
;
1407 rest_of_decl_compilation (decl
, toplevel_bindings_p (), 0);
1409 return convert_out (ctx
->preserve (decl
));
1413 plugin_define_cdtor_clone (cc1_plugin::connection
*self
,
1416 gcc_address address
)
1418 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
1419 tree decl
= convert_in (cdtor_in
);
1424 switch (CHARS2 (name
[0], name
[1]))
1426 case CHARS2 ('C', '1'): // in-charge constructor
1427 identifier
= complete_ctor_identifier
;
1430 case CHARS2 ('C', '2'): // not-in-charge constructor
1431 identifier
= base_ctor_identifier
;
1434 case CHARS2 ('C', '4'):
1435 identifier
= ctor_identifier
; // unified constructor
1438 case CHARS2 ('D', '0'): // deleting destructor
1439 identifier
= deleting_dtor_identifier
;
1442 case CHARS2 ('D', '1'): // in-charge destructor
1443 identifier
= complete_dtor_identifier
;
1446 case CHARS2 ('D', '2'): // not-in-charge destructor
1447 identifier
= base_dtor_identifier
;
1450 case CHARS2 ('D', '4'):
1451 identifier
= dtor_identifier
; // unified destructor
1459 gcc_assert (!ctor
!= !dtor
);
1461 ? (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (decl
)
1462 && DECL_NAME (decl
) == ctor_identifier
)
1463 : (DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (decl
)
1464 && DECL_NAME (decl
) == dtor_identifier
));
1466 while (decl
&& DECL_NAME (decl
) != identifier
)
1468 decl
= DECL_CHAIN (decl
);
1469 if (decl
&& !DECL_CLONED_FUNCTION_P (decl
))
1474 record_decl_address (ctx
, build_decl_addr_value (decl
, address
));
1476 return convert_out (decl
);
1480 plugin_add_friend (cc1_plugin::connection
* /* self */,
1484 tree decl
= convert_in (decl_in
);
1485 tree type
= convert_in (type_in
);
1487 gcc_assert (type
|| at_class_scope_p ());
1490 type
= current_class_type
;
1492 gcc_assert (TREE_CODE (type
) == RECORD_TYPE
);
1495 make_friend_class (type
, TREE_TYPE (decl
), true);
1498 DECL_UNIQUE_FRIEND_P (decl
) = true;
1499 add_friend (type
, decl
, true);
1506 plugin_build_pointer_type (cc1_plugin::connection
*,
1509 // No need to preserve a pointer type as the base type is preserved.
1510 return convert_out (build_pointer_type (convert_in (base_type
)));
1514 plugin_build_reference_type (cc1_plugin::connection
*,
1515 gcc_type base_type_in
,
1516 enum gcc_cp_ref_qualifiers rquals
)
1522 case GCC_CP_REF_QUAL_LVALUE
:
1525 case GCC_CP_REF_QUAL_RVALUE
:
1528 case GCC_CP_REF_QUAL_NONE
:
1533 tree rtype
= cp_build_reference_type (convert_in (base_type_in
), rval
);
1535 return convert_out (rtype
);
1539 start_class_def (tree type
,
1540 const gcc_vbase_array
*base_classes
)
1545 for (int i
= 0; i
< base_classes
->n_elements
; i
++)
1549 gcc_assert ((base_classes
->flags
[i
] & GCC_CP_SYMBOL_MASK
)
1550 == GCC_CP_SYMBOL_BASECLASS
);
1552 switch (base_classes
->flags
[i
] & GCC_CP_ACCESS_MASK
)
1554 case GCC_CP_ACCESS_PRIVATE
:
1555 access
= ridpointers
[(int)RID_PRIVATE
];
1558 case GCC_CP_ACCESS_PROTECTED
:
1559 access
= ridpointers
[(int)RID_PROTECTED
];
1562 case GCC_CP_ACCESS_PUBLIC
:
1563 access
= ridpointers
[(int)RID_PUBLIC
];
1570 tree base
= finish_base_specifier
1571 (convert_in (base_classes
->elements
[i
]), access
,
1572 (base_classes
->flags
[i
] & GCC_CP_FLAG_BASECLASS_VIRTUAL
) != 0);
1573 TREE_CHAIN (base
) = bases
;
1576 bases
= nreverse (bases
);
1578 xref_basetypes (type
, bases
);
1579 begin_class_definition (type
);
1584 plugin_start_class_type (cc1_plugin::connection
*self
,
1585 gcc_decl typedecl_in
,
1586 const gcc_vbase_array
*base_classes
,
1587 const char *filename
,
1588 unsigned int line_number
)
1590 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
1591 location_t loc
= ctx
->get_location_t (filename
, line_number
);
1592 tree typedecl
= convert_in (typedecl_in
);
1593 tree type
= TREE_TYPE (typedecl
);
1595 gcc_assert (RECORD_OR_UNION_CODE_P (TREE_CODE (type
)));
1596 gcc_assert (!COMPLETE_TYPE_P (type
));
1598 DECL_SOURCE_LOCATION (typedecl
) = loc
;
1600 tree result
= start_class_def (type
, base_classes
);
1602 return convert_out (ctx
->preserve (result
));
1606 plugin_start_closure_class_type (cc1_plugin::connection
*self
,
1608 gcc_decl extra_scope_in
,
1609 enum gcc_cp_symbol_kind flags
,
1610 const char *filename
,
1611 unsigned int line_number
)
1613 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
1614 tree extra_scope
= convert_in (extra_scope_in
);
1616 gcc_assert ((flags
& GCC_CP_SYMBOL_MASK
) == GCC_CP_SYMBOL_LAMBDA_CLOSURE
);
1617 gcc_assert ((flags
& (~(GCC_CP_SYMBOL_MASK
| GCC_CP_ACCESS_MASK
))) == 0);
1619 gcc_assert (!(flags
& GCC_CP_ACCESS_MASK
) == !at_class_scope_p ());
1621 /* See at_fake_function_scope_p. */
1622 gcc_assert (!at_function_scope_p ());
1626 if (TREE_CODE (extra_scope
) == PARM_DECL
)
1628 gcc_assert (at_fake_function_scope_p ());
1629 /* Check that the given extra_scope is one of the parameters of
1630 the current function. */
1631 for (tree parm
= DECL_ARGUMENTS (current_function_decl
);
1632 ; parm
= DECL_CHAIN (parm
))
1635 if (parm
== extra_scope
)
1639 else if (TREE_CODE (extra_scope
) == FIELD_DECL
)
1641 gcc_assert (at_class_scope_p ());
1642 gcc_assert (DECL_CONTEXT (extra_scope
) == current_class_type
);
1645 /* FIXME: does this ever really occur? */
1646 gcc_assert (TREE_CODE (extra_scope
) == VAR_DECL
);
1649 tree lambda_expr
= build_lambda_expr ();
1651 LAMBDA_EXPR_LOCATION (lambda_expr
) = ctx
->get_location_t (filename
,
1654 tree type
= begin_lambda_type (lambda_expr
);
1656 /* Instead of calling record_lambda_scope, do this: */
1657 LAMBDA_EXPR_EXTRA_SCOPE (lambda_expr
) = extra_scope
;
1658 LAMBDA_EXPR_DISCRIMINATOR (lambda_expr
) = discriminator
;
1660 tree decl
= TYPE_NAME (type
);
1661 determine_visibility (decl
);
1662 set_access_flags (decl
, flags
);
1664 return convert_out (ctx
->preserve (type
));
1668 plugin_build_lambda_expr (cc1_plugin::connection
*self
,
1669 gcc_type closure_type_in
)
1671 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
1672 tree closure_type
= convert_in (closure_type_in
);
1674 gcc_assert (LAMBDA_TYPE_P (closure_type
));
1676 tree lambda_expr
= CLASSTYPE_LAMBDA_EXPR (closure_type
);
1678 tree lambda_object
= build_lambda_object (lambda_expr
);
1680 return convert_out (ctx
->preserve (lambda_object
));
1684 plugin_build_field (cc1_plugin::connection
*,
1685 const char *field_name
,
1686 gcc_type field_type_in
,
1687 enum gcc_cp_symbol_kind flags
,
1688 unsigned long bitsize
,
1689 unsigned long bitpos
)
1691 tree record_or_union_type
= current_class_type
;
1692 tree field_type
= convert_in (field_type_in
);
1694 gcc_assert (at_class_scope_p ());
1695 gcc_assert (RECORD_OR_UNION_CODE_P (TREE_CODE (record_or_union_type
)));
1696 gcc_assert ((flags
& GCC_CP_SYMBOL_MASK
) == GCC_CP_SYMBOL_FIELD
);
1697 gcc_assert ((flags
& (~(GCC_CP_SYMBOL_MASK
| GCC_CP_ACCESS_MASK
1698 | GCC_CP_FLAG_MASK_FIELD
))) == 0);
1699 gcc_assert ((flags
& GCC_CP_ACCESS_MASK
));
1701 /* Note that gdb does not preserve the location of field decls, so
1702 we can't provide a decent location here. */
1703 tree decl
= build_decl (BUILTINS_LOCATION
, FIELD_DECL
,
1704 get_identifier (field_name
), field_type
);
1705 DECL_FIELD_CONTEXT (decl
) = record_or_union_type
;
1707 set_access_flags (decl
, flags
);
1709 if ((flags
& GCC_CP_FLAG_FIELD_MUTABLE
) != 0)
1710 DECL_MUTABLE_P (decl
) = 1;
1712 if (TREE_CODE (field_type
) == INTEGER_TYPE
1713 && TYPE_PRECISION (field_type
) != bitsize
)
1715 DECL_BIT_FIELD_TYPE (decl
) = field_type
;
1717 = c_build_bitfield_integer_type (bitsize
, TYPE_UNSIGNED (field_type
));
1720 SET_DECL_MODE (decl
, TYPE_MODE (TREE_TYPE (decl
)));
1722 // There's no way to recover this from DWARF.
1723 SET_DECL_OFFSET_ALIGN (decl
, TYPE_PRECISION (pointer_sized_int_node
));
1725 tree pos
= bitsize_int (bitpos
);
1726 pos_from_bit (&DECL_FIELD_OFFSET (decl
), &DECL_FIELD_BIT_OFFSET (decl
),
1727 DECL_OFFSET_ALIGN (decl
), pos
);
1729 DECL_SIZE (decl
) = bitsize_int (bitsize
);
1730 DECL_SIZE_UNIT (decl
) = size_int ((bitsize
+ BITS_PER_UNIT
- 1)
1733 DECL_CHAIN (decl
) = TYPE_FIELDS (record_or_union_type
);
1734 TYPE_FIELDS (record_or_union_type
) = decl
;
1736 return convert_out (decl
);
1740 plugin_finish_class_type (cc1_plugin::connection
*,
1741 unsigned long size_in_bytes
)
1743 tree record_or_union_type
= current_class_type
;
1745 gcc_assert (RECORD_OR_UNION_CODE_P (TREE_CODE (record_or_union_type
)));
1747 finish_struct (record_or_union_type
, NULL
);
1749 gcc_assert (compare_tree_int (TYPE_SIZE_UNIT (record_or_union_type
),
1750 size_in_bytes
) == 0);
1756 plugin_start_enum_type (cc1_plugin::connection
*self
,
1758 gcc_type underlying_int_type_in
,
1759 enum gcc_cp_symbol_kind flags
,
1760 const char *filename
,
1761 unsigned int line_number
)
1763 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
1764 tree underlying_int_type
= convert_in (underlying_int_type_in
);
1766 gcc_assert ((flags
& GCC_CP_SYMBOL_MASK
) == GCC_CP_SYMBOL_ENUM
);
1767 gcc_assert ((flags
& (~(GCC_CP_SYMBOL_MASK
| GCC_CP_ACCESS_MASK
1768 | GCC_CP_FLAG_MASK_ENUM
))) == 0);
1769 gcc_assert (!(flags
& GCC_CP_ACCESS_MASK
) == !at_class_scope_p ());
1771 if (underlying_int_type
== error_mark_node
)
1772 return convert_out (error_mark_node
);
1774 bool is_new_type
= false;
1776 tree id
= name
? get_identifier (name
) : make_anon_name ();
1778 tree type
= start_enum (id
, NULL_TREE
,
1779 underlying_int_type
,
1780 /* attributes = */ NULL_TREE
,
1781 !!(flags
& GCC_CP_FLAG_ENUM_SCOPED
), &is_new_type
);
1783 gcc_assert (is_new_type
);
1785 location_t loc
= ctx
->get_location_t (filename
, line_number
);
1786 tree type_decl
= TYPE_NAME (type
);
1787 DECL_SOURCE_LOCATION (type_decl
) = loc
;
1788 SET_OPAQUE_ENUM_P (type
, false);
1790 set_access_flags (type_decl
, flags
);
1792 return convert_out (ctx
->preserve (type
));
1796 plugin_build_enum_constant (cc1_plugin::connection
*,
1797 gcc_type enum_type_in
,
1799 unsigned long value
)
1801 tree enum_type
= convert_in (enum_type_in
);
1803 gcc_assert (TREE_CODE (enum_type
) == ENUMERAL_TYPE
);
1805 build_enumerator (get_identifier (name
), build_int_cst (enum_type
, value
),
1806 enum_type
, NULL_TREE
, BUILTINS_LOCATION
);
1808 return convert_out (TREE_VALUE (TYPE_VALUES (enum_type
)));
1812 plugin_finish_enum_type (cc1_plugin::connection
*,
1813 gcc_type enum_type_in
)
1815 tree enum_type
= convert_in (enum_type_in
);
1817 finish_enum_value_list (enum_type
);
1818 finish_enum (enum_type
);
1824 plugin_build_function_type (cc1_plugin::connection
*self
,
1825 gcc_type return_type_in
,
1826 const struct gcc_type_array
*argument_types_in
,
1829 tree return_type
= convert_in (return_type_in
);
1832 std::vector
<tree
> argument_types (argument_types_in
->n_elements
);
1833 for (int i
= 0; i
< argument_types_in
->n_elements
; ++i
)
1834 argument_types
[i
] = convert_in (argument_types_in
->elements
[i
]);
1837 result
= build_varargs_function_type_array (return_type
,
1838 argument_types_in
->n_elements
,
1839 argument_types
.data ());
1841 result
= build_function_type_array (return_type
,
1842 argument_types_in
->n_elements
,
1843 argument_types
.data ());
1845 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
1846 return convert_out (ctx
->preserve (result
));
1852 plugin_add_function_default_args (cc1_plugin::connection
*self
,
1853 gcc_type function_type_in
,
1854 const struct gcc_cp_function_args
*defaults
)
1856 tree function_type
= convert_in (function_type_in
);
1858 gcc_assert (TREE_CODE (function_type
) == FUNCTION_TYPE
);
1860 if (!defaults
|| !defaults
->n_elements
)
1861 return function_type_in
;
1863 tree pargs
= TYPE_ARG_TYPES (function_type
);
1864 tree nargs
= NULL_TREE
;
1866 /* Build a reversed copy of the list of default-less arguments in
1867 NARGS. At the end of the loop, PARGS will point to the end of
1868 the argument list, or to the first argument that had a default
1870 while (pargs
&& TREE_VALUE (pargs
) != void_list_node
1871 && !TREE_PURPOSE (pargs
))
1873 nargs
= tree_cons (NULL_TREE
, TREE_VALUE (pargs
), nargs
);
1874 pargs
= TREE_CHAIN (pargs
);
1877 /* Set the defaults in the now-leading NARGS, taking into account
1878 that NARGS is reversed but DEFAULTS->elements isn't. */
1879 tree ndargs
= nargs
;
1880 int i
= defaults
->n_elements
;
1883 gcc_assert (ndargs
);
1884 tree deflt
= convert_in (defaults
->elements
[i
]);
1886 deflt
= error_mark_node
;
1887 TREE_PURPOSE (ndargs
) = deflt
;
1888 ndargs
= TREE_CHAIN (ndargs
);
1891 /* Finally, reverse NARGS, and append the remaining PARGS that
1892 already had defaults. */
1893 nargs
= nreverse (nargs
);
1894 nargs
= chainon (nargs
, pargs
);
1896 tree result
= build_function_type (TREE_TYPE (function_type
), nargs
);
1898 /* Copy exceptions, attributes and whatnot. */
1899 result
= build_exception_variant (result
,
1900 TYPE_RAISES_EXCEPTIONS (function_type
));
1901 result
= cp_build_type_attribute_variant (result
,
1902 TYPE_ATTRIBUTES (function_type
));
1904 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
1905 return convert_out (ctx
->preserve (result
));
1909 plugin_set_deferred_function_default_args (cc1_plugin::connection
*,
1910 gcc_decl function_in
,
1911 const struct gcc_cp_function_args
1914 tree function
= convert_in (function_in
);
1916 gcc_assert (TREE_CODE (function
) == FUNCTION_DECL
);
1918 if (!defaults
|| !defaults
->n_elements
)
1921 tree arg
= FUNCTION_FIRST_USER_PARMTYPE (function
);
1923 for (int i
= 0; i
< defaults
->n_elements
; i
++)
1925 while (arg
&& TREE_PURPOSE (arg
) != error_mark_node
)
1926 arg
= TREE_CHAIN (arg
);
1931 TREE_PURPOSE (arg
) = convert_in (defaults
->elements
[i
]);
1932 arg
= TREE_CHAIN (arg
);
1941 plugin_get_function_parameter_decl (cc1_plugin::connection
*,
1942 gcc_decl function_in
,
1945 tree function
= convert_in (function_in
);
1947 gcc_assert (TREE_CODE (function
) == FUNCTION_DECL
);
1951 gcc_assert (TREE_CODE (TREE_TYPE (function
)) == METHOD_TYPE
);
1953 return convert_out (DECL_ARGUMENTS (function
));
1956 gcc_assert (index
>= 0);
1958 tree args
= FUNCTION_FIRST_USER_PARM (function
);
1960 for (int i
= 0; args
&& i
< index
; i
++)
1961 args
= DECL_CHAIN (args
);
1963 return convert_out (args
);
1967 plugin_build_exception_spec_variant (cc1_plugin::connection
*self
,
1968 gcc_type function_type_in
,
1969 const struct gcc_type_array
*except_types_in
)
1971 tree function_type
= convert_in (function_type_in
);
1972 tree except_types
= NULL_TREE
;
1974 if (!except_types_in
)
1975 except_types
= noexcept_false_spec
;
1976 else if (!except_types_in
->n_elements
)
1977 except_types
= empty_except_spec
;
1979 for (int i
= 0; i
< except_types_in
->n_elements
; i
++)
1980 except_types
= add_exception_specifier (except_types
,
1982 (except_types_in
->elements
[i
]),
1985 function_type
= build_exception_variant (function_type
,
1988 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
1989 return convert_out (ctx
->preserve (function_type
));
1993 plugin_build_method_type (cc1_plugin::connection
*self
,
1994 gcc_type class_type_in
,
1995 gcc_type func_type_in
,
1996 enum gcc_cp_qualifiers quals_in
,
1997 enum gcc_cp_ref_qualifiers rquals_in
)
1999 tree class_type
= convert_in (class_type_in
);
2000 tree func_type
= convert_in (func_type_in
);
2001 cp_cv_quals quals
= 0;
2002 cp_ref_qualifier rquals
;
2004 if ((quals_in
& GCC_CP_QUALIFIER_CONST
) != 0)
2005 quals
|= TYPE_QUAL_CONST
;
2006 if ((quals_in
& GCC_CP_QUALIFIER_VOLATILE
) != 0)
2007 quals
|= TYPE_QUAL_VOLATILE
;
2008 gcc_assert ((quals_in
& GCC_CP_QUALIFIER_RESTRICT
) == 0);
2012 case GCC_CP_REF_QUAL_NONE
:
2013 rquals
= REF_QUAL_NONE
;
2015 case GCC_CP_REF_QUAL_LVALUE
:
2016 rquals
= REF_QUAL_LVALUE
;
2018 case GCC_CP_REF_QUAL_RVALUE
:
2019 rquals
= REF_QUAL_RVALUE
;
2025 tree method_type
= class_type
2026 ? build_memfn_type (func_type
, class_type
, quals
, rquals
)
2027 : apply_memfn_quals (func_type
, quals
, rquals
);
2029 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
2030 return convert_out (ctx
->preserve (method_type
));
2034 plugin_build_pointer_to_member_type (cc1_plugin::connection
*self
,
2035 gcc_type class_type_in
,
2036 gcc_type member_type_in
)
2038 tree class_type
= convert_in (class_type_in
);
2039 tree member_type
= convert_in (member_type_in
);
2041 tree memptr_type
= build_ptrmem_type (class_type
, member_type
);
2043 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
2044 return convert_out (ctx
->preserve (memptr_type
));
2048 plugin_start_template_decl (cc1_plugin::connection
*)
2050 begin_template_parm_list ();
2052 TP_PARM_LIST
= NULL_TREE
;
2058 plugin_get_type_decl (cc1_plugin::connection
*,
2061 tree type
= convert_in (type_in
);
2063 tree name
= TYPE_NAME (type
);
2066 return convert_out (name
);
2070 plugin_get_decl_type (cc1_plugin::connection
*,
2073 tree decl
= convert_in (decl_in
);
2075 tree type
= TREE_TYPE (decl
);
2078 return convert_out (type
);
2082 plugin_build_type_template_parameter (cc1_plugin::connection
*self
,
2084 int /* bool */ pack_p
,
2085 gcc_type default_type
,
2086 const char *filename
,
2087 unsigned int line_number
)
2089 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
2090 location_t loc
= ctx
->get_location_t (filename
, line_number
);
2092 gcc_assert (template_parm_scope_p ());
2094 tree parm
= finish_template_type_parm (class_type_node
, get_identifier (id
));
2095 parm
= build_tree_list (convert_in (default_type
), parm
);
2097 gcc_assert (!(pack_p
&& default_type
));
2099 /* Create a type and a decl for the type parm, and add the decl to
2101 TP_PARM_LIST
= process_template_parm (TP_PARM_LIST
, loc
, parm
,
2102 /* is_non_type = */ false, pack_p
);
2104 /* Locate the decl of the newly-added, processed template parm. */
2105 parm
= TREE_VALUE (tree_last (TP_PARM_LIST
));
2107 /* Return its type. */
2108 return convert_out (ctx
->preserve (TREE_TYPE (parm
)));
2112 plugin_build_template_template_parameter (cc1_plugin::connection
*self
,
2114 int /* bool */ pack_p
,
2115 gcc_utempl default_templ
,
2116 const char *filename
,
2117 unsigned int line_number
)
2119 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
2120 location_t loc
= ctx
->get_location_t (filename
, line_number
);
2122 gcc_assert (template_parm_scope_p ());
2124 /* Finish the template parm list that started this template parm. */
2125 end_template_parm_list (TP_PARM_LIST
);
2127 gcc_assert (template_parm_scope_p ());
2129 tree parm
= finish_template_template_parm (class_type_node
,
2130 get_identifier (id
));
2131 parm
= build_tree_list (convert_in (default_templ
), parm
);
2133 gcc_assert (!(pack_p
&& default_templ
));
2135 /* Create a type and a decl for the template parm, and add the decl
2137 TP_PARM_LIST
= process_template_parm (TP_PARM_LIST
, loc
, parm
,
2138 /* is_non_type = */ false, pack_p
);
2140 /* Locate the decl of the newly-added, processed template parm. */
2141 parm
= TREE_VALUE (tree_last (TP_PARM_LIST
));
2143 return convert_out (ctx
->preserve (parm
));
2147 plugin_build_value_template_parameter (cc1_plugin::connection
*self
,
2150 gcc_expr default_value
,
2151 const char *filename
,
2152 unsigned int line_number
)
2154 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
2155 location_t loc
= ctx
->get_location_t (filename
, line_number
);
2157 gcc_assert (template_parm_scope_p ());
2159 cp_declarator declarator
;
2160 memset (&declarator
, 0, sizeof (declarator
));
2161 // &declarator = make_id_declarator (NULL, get_identifier (id), sfk_none):
2162 declarator
.kind
= cdk_id
;
2163 declarator
.u
.id
.qualifying_scope
= NULL
;
2164 declarator
.u
.id
.unqualified_name
= get_identifier (id
);
2165 declarator
.u
.id
.sfk
= sfk_none
;
2167 cp_decl_specifier_seq declspec
;
2168 memset (&declspec
, 0, sizeof (declspec
));
2169 // cp_parser_set_decl_spec_type (&declspec, convert_in (type), -token-, false):
2170 declspec
.any_specifiers_p
= declspec
.any_type_specifiers_p
= true;
2171 declspec
.type
= convert_in (type
);
2172 declspec
.locations
[ds_type_spec
] = loc
;
2174 tree parm
= grokdeclarator (&declarator
, &declspec
, TPARM
, 0, 0);
2175 parm
= build_tree_list (convert_in (default_value
), parm
);
2177 /* Create a type and a decl for the template parm, and add the decl
2179 TP_PARM_LIST
= process_template_parm (TP_PARM_LIST
, loc
, parm
,
2180 /* is_non_type = */ true, false);
2182 /* Locate the decl of the newly-added, processed template parm. */
2183 parm
= TREE_VALUE (tree_last (TP_PARM_LIST
));
2185 return convert_out (ctx
->preserve (parm
));
2189 targlist (const gcc_cp_template_args
*targs
)
2191 int n
= targs
->n_elements
;
2192 tree vec
= make_tree_vec (n
);
2195 switch (targs
->kinds
[n
])
2197 case GCC_CP_TPARG_VALUE
:
2198 TREE_VEC_ELT (vec
, n
) = convert_in (targs
->elements
[n
].value
);
2200 case GCC_CP_TPARG_CLASS
:
2201 TREE_VEC_ELT (vec
, n
) = convert_in (targs
->elements
[n
].type
);
2203 case GCC_CP_TPARG_TEMPL
:
2204 TREE_VEC_ELT (vec
, n
) = convert_in (targs
->elements
[n
].templ
);
2206 case GCC_CP_TPARG_PACK
:
2207 TREE_VEC_ELT (vec
, n
) = convert_in (targs
->elements
[n
].pack
);
2217 plugin_build_dependent_typename (cc1_plugin::connection
*self
,
2218 gcc_type enclosing_type
,
2220 const gcc_cp_template_args
*targs
)
2222 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
2223 tree type
= convert_in (enclosing_type
);
2224 tree name
= get_identifier (id
);
2226 name
= build_min_nt_loc (/*loc=*/0, TEMPLATE_ID_EXPR
,
2227 name
, targlist (targs
));
2228 tree res
= make_typename_type (type
, name
, typename_type
,
2229 /*complain=*/tf_error
);
2230 return convert_out (ctx
->preserve (res
));
2234 plugin_build_dependent_class_template (cc1_plugin::connection
*self
,
2235 gcc_type enclosing_type
,
2238 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
2239 tree type
= convert_in (enclosing_type
);
2240 tree name
= get_identifier (id
);
2241 tree res
= make_unbound_class_template (type
, name
, NULL_TREE
,
2242 /*complain=*/tf_error
);
2243 return convert_out (ctx
->preserve (res
));
2247 plugin_build_dependent_type_template_id (cc1_plugin::connection
*self
,
2248 gcc_utempl template_decl
,
2249 const gcc_cp_template_args
*targs
)
2251 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
2252 tree type
= convert_in (template_decl
);
2253 tree decl
= finish_template_type (type
, targlist (targs
),
2254 /*entering_scope=*/false);
2255 return convert_out (ctx
->preserve (TREE_TYPE (decl
)));
2259 plugin_build_dependent_expr (cc1_plugin::connection
*self
,
2260 gcc_decl enclosing_scope
,
2261 enum gcc_cp_symbol_kind flags
,
2263 gcc_type conv_type_in
,
2264 const gcc_cp_template_args
*targs
)
2266 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
2267 tree scope
= convert_in (enclosing_scope
);
2268 tree conv_type
= convert_in (conv_type_in
);
2271 if (TREE_CODE (scope
) != NAMESPACE_DECL
)
2273 tree type
= TREE_TYPE (scope
);
2274 gcc_assert (TYPE_NAME (type
) == scope
);
2278 if (flags
== (GCC_CP_SYMBOL_FUNCTION
| GCC_CP_FLAG_SPECIAL_FUNCTION
))
2280 bool assop
= false, convop
= false;
2281 tree_code opcode
= ERROR_MARK
;
2283 switch (CHARS2 (name
[0], name
[1]))
2285 case CHARS2 ('C', 0x0): // ctor base declaration
2286 case CHARS2 ('C', ' '):
2287 case CHARS2 ('C', '1'):
2288 case CHARS2 ('C', '2'):
2289 case CHARS2 ('C', '4'):
2290 identifier
= ctor_identifier
;
2292 case CHARS2 ('D', 0x0): // dtor base declaration
2293 case CHARS2 ('D', ' '):
2294 case CHARS2 ('D', '0'):
2295 case CHARS2 ('D', '1'):
2296 case CHARS2 ('D', '2'):
2297 case CHARS2 ('D', '4'):
2298 gcc_assert (!targs
);
2299 identifier
= dtor_identifier
;
2301 case CHARS2 ('n', 'w'): // operator new
2304 case CHARS2 ('n', 'a'): // operator new[]
2305 opcode
= VEC_NEW_EXPR
;
2307 case CHARS2 ('d', 'l'): // operator delete
2308 opcode
= DELETE_EXPR
;
2310 case CHARS2 ('d', 'a'): // operator delete[]
2311 opcode
= VEC_DELETE_EXPR
;
2313 case CHARS2 ('p', 's'): // operator + (unary)
2316 case CHARS2 ('n', 'g'): // operator - (unary)
2317 opcode
= MINUS_EXPR
;
2319 case CHARS2 ('a', 'd'): // operator & (unary)
2320 opcode
= BIT_AND_EXPR
;
2322 case CHARS2 ('d', 'e'): // operator * (unary)
2325 case CHARS2 ('c', 'o'): // operator ~
2326 opcode
= BIT_NOT_EXPR
;
2328 case CHARS2 ('p', 'l'): // operator +
2331 case CHARS2 ('m', 'i'): // operator -
2332 opcode
= MINUS_EXPR
;
2334 case CHARS2 ('m', 'l'): // operator *
2337 case CHARS2 ('d', 'v'): // operator /
2338 opcode
= TRUNC_DIV_EXPR
;
2340 case CHARS2 ('r', 'm'): // operator %
2341 opcode
= TRUNC_MOD_EXPR
;
2343 case CHARS2 ('a', 'n'): // operator &
2344 opcode
= BIT_AND_EXPR
;
2346 case CHARS2 ('o', 'r'): // operator |
2347 opcode
= BIT_IOR_EXPR
;
2349 case CHARS2 ('e', 'o'): // operator ^
2350 opcode
= BIT_XOR_EXPR
;
2352 case CHARS2 ('a', 'S'): // operator =
2356 case CHARS2 ('p', 'L'): // operator +=
2360 case CHARS2 ('m', 'I'): // operator -=
2361 opcode
= MINUS_EXPR
;
2364 case CHARS2 ('m', 'L'): // operator *=
2368 case CHARS2 ('d', 'V'): // operator /=
2369 opcode
= TRUNC_DIV_EXPR
;
2372 case CHARS2 ('r', 'M'): // operator %=
2373 opcode
= TRUNC_MOD_EXPR
;
2376 case CHARS2 ('a', 'N'): // operator &=
2377 opcode
= BIT_AND_EXPR
;
2380 case CHARS2 ('o', 'R'): // operator |=
2381 opcode
= BIT_IOR_EXPR
;
2384 case CHARS2 ('e', 'O'): // operator ^=
2385 opcode
= BIT_XOR_EXPR
;
2388 case CHARS2 ('l', 's'): // operator <<
2389 opcode
= LSHIFT_EXPR
;
2391 case CHARS2 ('r', 's'): // operator >>
2392 opcode
= RSHIFT_EXPR
;
2394 case CHARS2 ('l', 'S'): // operator <<=
2395 opcode
= LSHIFT_EXPR
;
2398 case CHARS2 ('r', 'S'): // operator >>=
2399 opcode
= RSHIFT_EXPR
;
2402 case CHARS2 ('e', 'q'): // operator ==
2405 case CHARS2 ('n', 'e'): // operator !=
2408 case CHARS2 ('l', 't'): // operator <
2411 case CHARS2 ('g', 't'): // operator >
2414 case CHARS2 ('l', 'e'): // operator <=
2417 case CHARS2 ('g', 'e'): // operator >=
2420 case CHARS2 ('n', 't'): // operator !
2421 opcode
= TRUTH_NOT_EXPR
;
2423 case CHARS2 ('a', 'a'): // operator &&
2424 opcode
= TRUTH_ANDIF_EXPR
;
2426 case CHARS2 ('o', 'o'): // operator ||
2427 opcode
= TRUTH_ORIF_EXPR
;
2429 case CHARS2 ('p', 'p'): // operator ++
2430 opcode
= POSTINCREMENT_EXPR
;
2432 case CHARS2 ('m', 'm'): // operator --
2433 opcode
= PREDECREMENT_EXPR
;
2435 case CHARS2 ('c', 'm'): // operator ,
2436 opcode
= COMPOUND_EXPR
;
2438 case CHARS2 ('p', 'm'): // operator ->*
2439 opcode
= MEMBER_REF
;
2441 case CHARS2 ('p', 't'): // operator ->
2442 opcode
= COMPONENT_REF
;
2444 case CHARS2 ('c', 'l'): // operator ()
2447 case CHARS2 ('i', 'x'): // operator []
2450 case CHARS2 ('c', 'v'): // operator <T> (conversion operator)
2452 identifier
= make_conv_op_name (conv_type
);
2455 case CHARS2 ('l', 'i'): // operator "" <id>
2457 char *id
= (char *)name
+ 2;
2458 bool freeid
= false;
2459 if (*id
>= '0' && *id
<= '9')
2468 while (*id
&& *id
>= '0' && *id
<= '9');
2469 id
= xstrndup (id
, len
);
2472 identifier
= cp_literal_operator_id (id
);
2477 case CHARS2 ('q', 'u'): // ternary operator, not overloadable.
2482 gcc_assert (convop
|| !conv_type
);
2484 if (opcode
!= ERROR_MARK
)
2485 identifier
= ovl_op_identifier (assop
, opcode
);
2487 gcc_assert (identifier
);
2491 gcc_assert (flags
== GCC_CP_SYMBOL_MASK
);
2492 gcc_assert (!conv_type
);
2493 identifier
= get_identifier (name
);
2495 tree res
= identifier
;
2497 res
= lookup_name (res
, LOOK_where::BLOCK_NAMESPACE
);
2498 else if (!TYPE_P (scope
) || !dependent_scope_p (scope
))
2500 res
= lookup_qualified_name (scope
, res
, LOOK_want::NORMAL
, true);
2501 /* We've already resolved the name in the scope, so skip the
2502 build_qualified_name call below. */
2506 res
= lookup_template_function (res
, targlist (targs
));
2508 res
= build_qualified_name (NULL_TREE
, scope
, res
, !!targs
);
2509 return convert_out (ctx
->preserve (res
));
2513 plugin_build_literal_expr (cc1_plugin::connection
*self
,
2514 gcc_type type
, unsigned long value
)
2516 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
2517 tree t
= convert_in (type
);
2518 tree val
= build_int_cst_type (t
, (unsigned HOST_WIDE_INT
) value
);
2519 return convert_out (ctx
->preserve (val
));
2523 plugin_build_decl_expr (cc1_plugin::connection
*self
,
2527 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
2528 tree decl
= convert_in (decl_in
);
2529 gcc_assert (DECL_P (decl
));
2533 gcc_assert (DECL_CLASS_SCOPE_P (decl
));
2534 result
= build_offset_ref (DECL_CONTEXT (decl
), decl
,
2535 /*address_p=*/true, tf_error
);
2537 return convert_out (ctx
->preserve (result
));
2541 plugin_build_unary_expr (cc1_plugin::connection
*self
,
2542 const char *unary_op
,
2545 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
2546 tree op0
= convert_in (operand
);
2547 tree_code opcode
= ERROR_MARK
;
2548 bool global_scope_p
= false;
2551 switch (CHARS2 (unary_op
[0], unary_op
[1]))
2553 case CHARS2 ('p', 's'): // operator + (unary)
2554 opcode
= UNARY_PLUS_EXPR
;
2556 case CHARS2 ('n', 'g'): // operator - (unary)
2557 opcode
= NEGATE_EXPR
;
2559 case CHARS2 ('a', 'd'): // operator & (unary)
2562 case CHARS2 ('d', 'e'): // operator * (unary)
2563 opcode
= INDIRECT_REF
;
2565 case CHARS2 ('c', 'o'): // operator ~
2566 opcode
= BIT_NOT_EXPR
;
2568 case CHARS2 ('n', 't'): // operator !
2569 opcode
= TRUTH_NOT_EXPR
;
2571 case CHARS2 ('p', 'p'): // operator ++
2572 opcode
= unary_op
[2] == '_' ? PREINCREMENT_EXPR
: POSTINCREMENT_EXPR
;
2574 case CHARS2 ('m', 'm'): // operator --
2575 opcode
= unary_op
[2] == '_' ? PREDECREMENT_EXPR
: POSTDECREMENT_EXPR
;
2577 case CHARS2 ('n', 'x'): // noexcept
2578 opcode
= NOEXCEPT_EXPR
;
2580 case CHARS2 ('t', 'w'): // throw
2582 opcode
= THROW_EXPR
;
2584 case CHARS2 ('t', 'r'): // rethrow
2586 opcode
= THROW_EXPR
;
2588 case CHARS2 ('t', 'e'): // typeid (value)
2589 opcode
= TYPEID_EXPR
;
2591 case CHARS2 ('s', 'z'): // sizeof (value)
2592 opcode
= SIZEOF_EXPR
;
2594 case CHARS2 ('a', 'z'): // alignof (value)
2595 opcode
= ALIGNOF_EXPR
;
2597 case CHARS2 ('g', 's'): // global scope (for delete, delete[])
2598 gcc_assert (!global_scope_p
);
2599 global_scope_p
= true;
2602 case CHARS2 ('d', 'l'): // delete
2603 opcode
= DELETE_EXPR
;
2605 case CHARS2 ('d', 'a'): // delete[]
2606 opcode
= VEC_DELETE_EXPR
;
2608 case CHARS2 ('s', 'p'): // pack...
2609 opcode
= EXPR_PACK_EXPANSION
;
2611 case CHARS2 ('s', 'Z'): // sizeof...(pack)
2612 opcode
= TYPE_PACK_EXPANSION
; // Not really, but let's use its code.
2615 /* FIXME: __real__, __imag__? */
2621 gcc_assert (!global_scope_p
2622 || opcode
== DELETE_EXPR
|| opcode
== VEC_DELETE_EXPR
);
2624 processing_template_decl
++;
2625 bool template_dependent_p
= op0
2626 && (type_dependent_expression_p (op0
)
2627 || value_dependent_expression_p (op0
));
2628 if (!template_dependent_p
)
2629 processing_template_decl
--;
2633 gcc_assert (op0
|| opcode
== THROW_EXPR
);
2638 result
= finish_noexcept_expr (op0
, tf_error
);
2642 result
= build_throw (input_location
, op0
);
2646 result
= build_typeid (op0
, tf_error
);
2651 result
= cxx_sizeof_or_alignof_expr (input_location
,
2652 op0
, opcode
, true, true);
2656 case VEC_DELETE_EXPR
:
2657 result
= delete_sanity (input_location
, op0
, NULL_TREE
,
2658 opcode
== VEC_DELETE_EXPR
,
2659 global_scope_p
, tf_error
);
2662 case EXPR_PACK_EXPANSION
:
2663 result
= make_pack_expansion (op0
);
2666 // We're using this for sizeof...(pack). */
2667 case TYPE_PACK_EXPANSION
:
2668 result
= make_pack_expansion (op0
);
2669 PACK_EXPANSION_SIZEOF_P (result
) = true;
2673 result
= build_x_unary_op (/*loc=*/0, opcode
, op0
, NULL_TREE
, tf_error
);
2677 if (template_dependent_p
)
2678 processing_template_decl
--;
2680 return convert_out (ctx
->preserve (result
));
2684 plugin_build_binary_expr (cc1_plugin::connection
*self
,
2685 const char *binary_op
,
2689 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
2690 tree op0
= convert_in (operand1
);
2691 tree op1
= convert_in (operand2
);
2692 tree_code opcode
= ERROR_MARK
;
2694 switch (CHARS2 (binary_op
[0], binary_op
[1]))
2696 case CHARS2 ('p', 'l'): // operator +
2699 case CHARS2 ('m', 'i'): // operator -
2700 opcode
= MINUS_EXPR
;
2702 case CHARS2 ('m', 'l'): // operator *
2705 case CHARS2 ('d', 'v'): // operator /
2706 opcode
= TRUNC_DIV_EXPR
;
2708 case CHARS2 ('r', 'm'): // operator %
2709 opcode
= TRUNC_MOD_EXPR
;
2711 case CHARS2 ('a', 'n'): // operator &
2712 opcode
= BIT_AND_EXPR
;
2714 case CHARS2 ('o', 'r'): // operator |
2715 opcode
= BIT_IOR_EXPR
;
2717 case CHARS2 ('e', 'o'): // operator ^
2718 opcode
= BIT_XOR_EXPR
;
2720 case CHARS2 ('l', 's'): // operator <<
2721 opcode
= LSHIFT_EXPR
;
2723 case CHARS2 ('r', 's'): // operator >>
2724 opcode
= RSHIFT_EXPR
;
2726 case CHARS2 ('e', 'q'): // operator ==
2729 case CHARS2 ('n', 'e'): // operator !=
2732 case CHARS2 ('l', 't'): // operator <
2735 case CHARS2 ('g', 't'): // operator >
2738 case CHARS2 ('l', 'e'): // operator <=
2741 case CHARS2 ('g', 'e'): // operator >=
2744 case CHARS2 ('a', 'a'): // operator &&
2745 opcode
= TRUTH_ANDIF_EXPR
;
2747 case CHARS2 ('o', 'o'): // operator ||
2748 opcode
= TRUTH_ORIF_EXPR
;
2750 case CHARS2 ('c', 'm'): // operator ,
2751 opcode
= COMPOUND_EXPR
;
2753 case CHARS2 ('p', 'm'): // operator ->*
2754 opcode
= MEMBER_REF
;
2756 case CHARS2 ('p', 't'): // operator ->
2757 opcode
= INDIRECT_REF
; // Not really! This will stand for
2758 // INDIRECT_REF followed by COMPONENT_REF
2761 case CHARS2 ('i', 'x'): // operator []
2764 case CHARS2 ('d', 's'): // operator .*
2765 opcode
= DOTSTAR_EXPR
;
2767 case CHARS2 ('d', 't'): // operator .
2768 opcode
= COMPONENT_REF
;
2775 processing_template_decl
++;
2776 bool template_dependent_p
= type_dependent_expression_p (op0
)
2777 || value_dependent_expression_p (op0
)
2778 || type_dependent_expression_p (op1
)
2779 || value_dependent_expression_p (op1
);
2780 if (!template_dependent_p
)
2781 processing_template_decl
--;
2787 case INDIRECT_REF
: // This is actually a "->".
2788 op0
= build_x_arrow (/*loc=*/0, op0
, tf_error
);
2791 result
= finish_class_member_access_expr (op0
, op1
,
2792 /*template_p=*/false,
2797 result
= build_x_binary_op (/*loc=*/0, opcode
, op0
, ERROR_MARK
,
2798 op1
, ERROR_MARK
, NULL_TREE
, NULL
, tf_error
);
2802 if (template_dependent_p
)
2803 processing_template_decl
--;
2805 return convert_out (ctx
->preserve (result
));
2809 plugin_build_ternary_expr (cc1_plugin::connection
*self
,
2810 const char *ternary_op
,
2815 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
2816 tree op0
= convert_in (operand1
);
2817 tree op1
= convert_in (operand2
);
2818 tree op2
= convert_in (operand3
);
2819 gcc_assert (CHARS2 (ternary_op
[0], ternary_op
[1])
2820 == CHARS2 ('q', 'u')); // ternary operator
2822 processing_template_decl
++;
2823 bool template_dependent_p
= type_dependent_expression_p (op0
)
2824 || value_dependent_expression_p (op0
)
2825 || type_dependent_expression_p (op1
)
2826 || value_dependent_expression_p (op1
)
2827 || type_dependent_expression_p (op2
)
2828 || value_dependent_expression_p (op2
);
2829 if (!template_dependent_p
)
2830 processing_template_decl
--;
2832 tree val
= build_x_conditional_expr (/*loc=*/0, op0
, op1
, op2
, tf_error
);
2834 if (template_dependent_p
)
2835 processing_template_decl
--;
2837 return convert_out (ctx
->preserve (val
));
2841 plugin_build_unary_type_expr (cc1_plugin::connection
*self
,
2842 const char *unary_op
,
2845 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
2846 tree type
= convert_in (operand
);
2847 tree_code opcode
= ERROR_MARK
;
2849 switch (CHARS2 (unary_op
[0], unary_op
[1]))
2851 case CHARS2 ('t', 'i'): // typeid (type)
2852 opcode
= TYPEID_EXPR
;
2855 case CHARS2 ('s', 't'): // sizeof (type)
2856 opcode
= SIZEOF_EXPR
;
2858 case CHARS2 ('a', 't'): // alignof (type)
2859 opcode
= ALIGNOF_EXPR
;
2862 case CHARS2 ('s', 'Z'): // sizeof...(pack)
2863 opcode
= TYPE_PACK_EXPANSION
; // Not really, but let's use its code.
2866 // FIXME: do we have to handle "sp", for the size of a captured
2867 // template parameter pack from an alias template, taking
2868 // multiple template arguments?
2874 processing_template_decl
++;
2875 bool template_dependent_p
= dependent_type_p (type
);
2876 if (!template_dependent_p
)
2877 processing_template_decl
--;
2884 result
= get_typeid (type
, tf_error
);
2887 // We're using this for sizeof...(pack). */
2888 case TYPE_PACK_EXPANSION
:
2889 result
= make_pack_expansion (type
);
2890 PACK_EXPANSION_SIZEOF_P (result
) = true;
2894 /* Use the C++11 alignof semantics. */
2895 result
= cxx_sizeof_or_alignof_type (input_location
, type
,
2896 opcode
, true, true);
2899 if (template_dependent_p
)
2900 processing_template_decl
--;
2902 return convert_out (ctx
->preserve (result
));
2906 plugin_build_cast_expr (cc1_plugin::connection
*self
,
2907 const char *binary_op
,
2911 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
2912 tree (*build_cast
)(location_t loc
, tree type
, tree expr
,
2913 tsubst_flags_t complain
) = NULL
;
2914 tree type
= convert_in (operand1
);
2915 tree expr
= convert_in (operand2
);
2917 switch (CHARS2 (binary_op
[0], binary_op
[1]))
2919 case CHARS2 ('d', 'c'): // dynamic_cast
2920 build_cast
= build_dynamic_cast
;
2923 case CHARS2 ('s', 'c'): // static_cast
2924 build_cast
= build_static_cast
;
2927 case CHARS2 ('c', 'c'): // const_cast
2928 build_cast
= build_const_cast
;
2931 case CHARS2 ('r', 'c'): // reinterpret_cast
2932 build_cast
= build_reinterpret_cast
;
2935 case CHARS2 ('c', 'v'): // C cast, conversion with one argument
2936 build_cast
= cp_build_c_cast
;
2943 processing_template_decl
++;
2944 bool template_dependent_p
= dependent_type_p (type
)
2945 || type_dependent_expression_p (expr
)
2946 || value_dependent_expression_p (expr
);
2947 if (!template_dependent_p
)
2948 processing_template_decl
--;
2950 tree val
= build_cast (input_location
, type
, expr
, tf_error
);
2952 if (template_dependent_p
)
2953 processing_template_decl
--;
2955 return convert_out (ctx
->preserve (val
));
2958 static inline vec
<tree
, va_gc
> *
2959 args_to_tree_vec (const struct gcc_cp_function_args
*args_in
)
2961 vec
<tree
, va_gc
> *args
= make_tree_vector ();
2962 for (int i
= 0; i
< args_in
->n_elements
; i
++)
2963 vec_safe_push (args
, convert_in (args_in
->elements
[i
]));
2968 args_to_tree_list (const struct gcc_cp_function_args
*args_in
)
2970 tree args
, *tail
= &args
;
2971 for (int i
= 0; i
< args_in
->n_elements
; i
++)
2973 *tail
= build_tree_list (NULL
, convert_in (args_in
->elements
[i
]));
2974 tail
= &TREE_CHAIN (*tail
);
2979 static inline vec
<constructor_elt
, va_gc
> *
2980 args_to_ctor_elts (const struct gcc_cp_function_args
*args_in
)
2982 vec
<constructor_elt
, va_gc
> *args
= NULL
;
2983 for (int i
= 0; i
< args_in
->n_elements
; i
++)
2984 CONSTRUCTOR_APPEND_ELT (args
, NULL_TREE
, convert_in (args_in
->elements
[i
]));
2989 plugin_build_expression_list_expr (cc1_plugin::connection
*self
,
2990 const char *conv_op
,
2992 const struct gcc_cp_function_args
*values_in
)
2994 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
2995 tree type
= convert_in (type_in
);
2999 switch (CHARS2 (conv_op
[0], conv_op
[1]))
3001 case CHARS2 ('c', 'v'): // conversion with parenthesized expression list
3002 gcc_assert (TYPE_P (type
));
3003 args
= args_to_tree_list (values_in
);
3004 result
= build_functional_cast (input_location
, type
, args
, tf_error
);
3007 case CHARS2 ('t', 'l'): // conversion with braced expression list
3009 gcc_assert (TYPE_P (type
));
3010 args
= make_node (CONSTRUCTOR
);
3011 CONSTRUCTOR_ELTS (args
) = args_to_ctor_elts (values_in
);
3012 CONSTRUCTOR_IS_DIRECT_INIT (args
) = 1;
3013 result
= finish_compound_literal (type
, args
, tf_error
);
3016 case CHARS2 ('i', 'l'): // untyped braced expression list
3018 result
= make_node (CONSTRUCTOR
);
3019 CONSTRUCTOR_ELTS (result
) = args_to_ctor_elts (values_in
);
3026 return convert_out (ctx
->preserve (result
));
3030 plugin_build_new_expr (cc1_plugin::connection
*self
,
3032 const struct gcc_cp_function_args
*placement_in
,
3034 const struct gcc_cp_function_args
*initializer_in
)
3036 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
3037 tree type
= convert_in (type_in
);
3038 vec
<tree
, va_gc
> *placement
= NULL
, *initializer
= NULL
;
3039 bool global_scope_p
= false;
3043 placement
= args_to_tree_vec (placement_in
);
3045 initializer
= args_to_tree_vec (initializer_in
);
3047 gcc_assert (TYPE_P (type
));
3050 switch (CHARS2 (new_op
[0], new_op
[1]))
3052 case CHARS2 ('g', 's'):
3053 gcc_assert (!global_scope_p
);
3054 global_scope_p
= true;
3058 case CHARS2 ('n', 'w'): // non-array new
3059 gcc_assert (TREE_CODE (type
) != ARRAY_TYPE
);
3062 case CHARS2 ('n', 'a'): // array new
3063 gcc_assert (TREE_CODE (type
) == ARRAY_TYPE
);
3064 gcc_assert (TYPE_DOMAIN (type
));
3066 // Compute the length of the outermost array type, then discard it.
3067 tree maxelt
= TYPE_MAX_VALUE (TYPE_DOMAIN (type
));
3068 tree eltype
= TREE_TYPE (maxelt
);
3069 tree onecst
= integer_one_node
;
3071 processing_template_decl
++;
3072 bool template_dependent_p
= value_dependent_expression_p (maxelt
)
3073 || type_dependent_expression_p (maxelt
);
3074 if (!template_dependent_p
)
3076 processing_template_decl
--;
3077 onecst
= fold_convert (eltype
, onecst
);
3080 nelts
= fold_build2 (PLUS_EXPR
, eltype
, nelts
, onecst
);
3082 if (template_dependent_p
)
3083 processing_template_decl
--;
3085 type
= TREE_TYPE (type
);
3093 processing_template_decl
++;
3094 bool template_dependent_p
= dependent_type_p (type
)
3095 || value_dependent_expression_p (nelts
)
3097 && any_type_dependent_arguments_p (placement
))
3099 && any_type_dependent_arguments_p (initializer
));
3100 if (!template_dependent_p
)
3101 processing_template_decl
--;
3103 tree result
= build_new (input_location
, &placement
, type
, nelts
,
3104 &initializer
, global_scope_p
, tf_error
);
3106 if (template_dependent_p
)
3107 processing_template_decl
--;
3109 if (placement
!= NULL
)
3110 release_tree_vector (placement
);
3111 if (initializer
!= NULL
)
3112 release_tree_vector (initializer
);
3114 return convert_out (ctx
->preserve (result
));
3118 plugin_build_call_expr (cc1_plugin::connection
*self
,
3119 gcc_expr callable_in
, int qualified_p
,
3120 const struct gcc_cp_function_args
*args_in
)
3122 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
3123 tree callable
= convert_in (callable_in
);
3126 vec
<tree
, va_gc
> *args
= args_to_tree_vec (args_in
);
3128 bool koenig_p
= false;
3129 if (!qualified_p
&& !args
->is_empty ())
3131 if (identifier_p (callable
))
3133 else if (is_overloaded_fn (callable
))
3135 tree fn
= get_first_fn (callable
);
3136 fn
= STRIP_TEMPLATE (fn
);
3138 if (!DECL_FUNCTION_MEMBER_P (fn
)
3139 && !DECL_LOCAL_DECL_P (fn
))
3144 if (koenig_p
&& !any_type_dependent_arguments_p (args
))
3145 callable
= perform_koenig_lookup (callable
, args
, tf_none
);
3147 if (TREE_CODE (callable
) == COMPONENT_REF
)
3149 tree object
= TREE_OPERAND (callable
, 0);
3150 tree memfn
= TREE_OPERAND (callable
, 1);
3152 if (type_dependent_expression_p (object
)
3153 || (!BASELINK_P (memfn
) && TREE_CODE (memfn
) != FIELD_DECL
)
3154 || type_dependent_expression_p (memfn
)
3155 || any_type_dependent_arguments_p (args
))
3156 call_expr
= build_nt_call_vec (callable
, args
);
3157 else if (BASELINK_P (memfn
))
3158 call_expr
= build_new_method_call (object
, memfn
, &args
, NULL_TREE
,
3160 ? LOOKUP_NORMAL
|LOOKUP_NONVIRTUAL
3164 call_expr
= finish_call_expr (callable
, &args
, false, false, tf_none
);
3166 else if (TREE_CODE (callable
) == OFFSET_REF
3167 || TREE_CODE (callable
) == MEMBER_REF
3168 || TREE_CODE (callable
) == DOTSTAR_EXPR
)
3169 call_expr
= build_offset_ref_call_from_tree (callable
, &args
, tf_none
);
3171 call_expr
= finish_call_expr (callable
, &args
,
3172 !!qualified_p
, koenig_p
, tf_none
);
3174 release_tree_vector (args
);
3175 return convert_out (ctx
->preserve (call_expr
));
3179 plugin_get_expr_type (cc1_plugin::connection
*self
,
3182 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
3183 tree op0
= convert_in (operand
);
3186 type
= TREE_TYPE (op0
);
3188 type
= make_decltype_auto ();
3189 return convert_out (ctx
->preserve (type
));
3193 plugin_build_function_template_specialization (cc1_plugin::connection
*self
,
3194 gcc_decl template_decl
,
3195 const gcc_cp_template_args
*targs
,
3196 gcc_address address
,
3197 const char *filename
,
3198 unsigned int line_number
)
3200 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
3201 location_t loc
= ctx
->get_location_t (filename
, line_number
);
3202 tree name
= convert_in (template_decl
);
3203 tree targsl
= targlist (targs
);
3205 tree decl
= tsubst (name
, targsl
, tf_error
, NULL_TREE
);
3206 DECL_SOURCE_LOCATION (decl
) = loc
;
3208 record_decl_address (ctx
, build_decl_addr_value (decl
, address
));
3210 return convert_out (ctx
->preserve (decl
));
3214 plugin_build_class_template_specialization (cc1_plugin::connection
*self
,
3215 gcc_decl template_decl
,
3216 const gcc_cp_template_args
*args
,
3217 const char *filename
,
3218 unsigned int line_number
)
3220 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
3221 location_t loc
= ctx
->get_location_t (filename
, line_number
);
3222 tree name
= convert_in (template_decl
);
3224 tree tdecl
= finish_template_type (name
, targlist (args
), false);;
3225 DECL_SOURCE_LOCATION (tdecl
) = loc
;
3227 return convert_out (ctx
->preserve (tdecl
));
3230 /* Return a builtin type associated with BUILTIN_NAME. */
3233 safe_lookup_builtin_type (const char *builtin_name
)
3235 tree result
= NULL_TREE
;
3240 result
= identifier_global_value (get_identifier (builtin_name
));
3245 gcc_assert (TREE_CODE (result
) == TYPE_DECL
);
3246 result
= TREE_TYPE (result
);
3251 plugin_get_int_type (cc1_plugin::connection
*self
,
3252 int is_unsigned
, unsigned long size_in_bytes
,
3253 const char *builtin_name
)
3259 result
= safe_lookup_builtin_type (builtin_name
);
3260 gcc_assert (!result
|| TREE_CODE (result
) == INTEGER_TYPE
);
3263 result
= c_common_type_for_size (BITS_PER_UNIT
* size_in_bytes
,
3266 if (result
== NULL_TREE
)
3267 result
= error_mark_node
;
3270 gcc_assert (!TYPE_UNSIGNED (result
) == !is_unsigned
);
3271 gcc_assert (TREE_CODE (TYPE_SIZE (result
)) == INTEGER_CST
);
3272 gcc_assert (TYPE_PRECISION (result
) == BITS_PER_UNIT
* size_in_bytes
);
3274 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
3275 ctx
->preserve (result
);
3277 return convert_out (result
);
3281 plugin_get_char_type (cc1_plugin::connection
*)
3283 return convert_out (char_type_node
);
3287 plugin_get_float_type (cc1_plugin::connection
*,
3288 unsigned long size_in_bytes
,
3289 const char *builtin_name
)
3293 tree result
= safe_lookup_builtin_type (builtin_name
);
3296 return convert_out (error_mark_node
);
3298 gcc_assert (TREE_CODE (result
) == REAL_TYPE
);
3299 gcc_assert (BITS_PER_UNIT
* size_in_bytes
== TYPE_PRECISION (result
));
3301 return convert_out (result
);
3304 if (BITS_PER_UNIT
* size_in_bytes
== TYPE_PRECISION (float_type_node
))
3305 return convert_out (float_type_node
);
3306 if (BITS_PER_UNIT
* size_in_bytes
== TYPE_PRECISION (double_type_node
))
3307 return convert_out (double_type_node
);
3308 if (BITS_PER_UNIT
* size_in_bytes
== TYPE_PRECISION (long_double_type_node
))
3309 return convert_out (long_double_type_node
);
3310 return convert_out (error_mark_node
);
3314 plugin_get_void_type (cc1_plugin::connection
*)
3316 return convert_out (void_type_node
);
3320 plugin_get_bool_type (cc1_plugin::connection
*)
3322 return convert_out (boolean_type_node
);
3326 plugin_get_nullptr_type (cc1_plugin::connection
*)
3328 return convert_out (nullptr_type_node
);
3332 plugin_get_nullptr_constant (cc1_plugin::connection
*)
3334 return convert_out (nullptr_node
);
3338 plugin_build_array_type (cc1_plugin::connection
*self
,
3339 gcc_type element_type_in
, int num_elements
)
3341 tree element_type
= convert_in (element_type_in
);
3344 if (num_elements
== -1)
3345 result
= build_array_type (element_type
, NULL_TREE
);
3347 result
= build_array_type_nelts (element_type
, num_elements
);
3349 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
3350 return convert_out (ctx
->preserve (result
));
3354 plugin_build_dependent_array_type (cc1_plugin::connection
*self
,
3355 gcc_type element_type_in
,
3356 gcc_expr num_elements_in
)
3358 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
3359 tree element_type
= convert_in (element_type_in
);
3360 tree size
= convert_in (num_elements_in
);
3361 tree name
= get_identifier ("dependent array type");
3363 processing_template_decl
++;
3364 bool template_dependent_p
= dependent_type_p (element_type
)
3365 || type_dependent_expression_p (size
)
3366 || value_dependent_expression_p (size
);
3367 if (!template_dependent_p
)
3368 processing_template_decl
--;
3370 tree itype
= compute_array_index_type (name
, size
, tf_error
);
3371 tree type
= build_cplus_array_type (element_type
, itype
);
3373 if (template_dependent_p
)
3374 processing_template_decl
--;
3376 return convert_out (ctx
->preserve (type
));
3380 plugin_build_vla_array_type (cc1_plugin::connection
*self
,
3381 gcc_type element_type_in
,
3382 const char *upper_bound_name
)
3384 tree element_type
= convert_in (element_type_in
);
3385 tree upper_bound
= lookup_name (get_identifier (upper_bound_name
));
3386 tree size
= fold_build2 (PLUS_EXPR
, TREE_TYPE (upper_bound
), upper_bound
,
3387 build_one_cst (TREE_TYPE (upper_bound
)));
3388 tree range
= compute_array_index_type (NULL_TREE
, size
,
3391 tree result
= build_cplus_array_type (element_type
, range
);
3393 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
3394 return convert_out (ctx
->preserve (result
));
3398 plugin_build_qualified_type (cc1_plugin::connection
*,
3399 gcc_type unqualified_type_in
,
3400 enum gcc_cp_qualifiers qualifiers
)
3402 tree unqualified_type
= convert_in (unqualified_type_in
);
3403 cp_cv_quals quals
= 0;
3405 if ((qualifiers
& GCC_CP_QUALIFIER_CONST
) != 0)
3406 quals
|= TYPE_QUAL_CONST
;
3407 if ((qualifiers
& GCC_CP_QUALIFIER_VOLATILE
) != 0)
3408 quals
|= TYPE_QUAL_VOLATILE
;
3409 if ((qualifiers
& GCC_CP_QUALIFIER_RESTRICT
) != 0)
3410 quals
|= TYPE_QUAL_RESTRICT
;
3412 gcc_assert ((TREE_CODE (unqualified_type
) != METHOD_TYPE
3413 && TREE_CODE (unqualified_type
) != REFERENCE_TYPE
)
3416 return convert_out (build_qualified_type (unqualified_type
, quals
));
3420 plugin_build_complex_type (cc1_plugin::connection
*self
,
3423 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
3424 return convert_out (ctx
->preserve (build_complex_type (convert_in (base_type
))));
3428 plugin_build_vector_type (cc1_plugin::connection
*self
,
3429 gcc_type base_type
, int nunits
)
3431 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
3432 return convert_out (ctx
->preserve (build_vector_type (convert_in (base_type
),
3437 plugin_build_constant (cc1_plugin::connection
*self
, gcc_type type_in
,
3438 const char *name
, unsigned long value
,
3439 const char *filename
, unsigned int line_number
)
3441 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
3443 tree type
= convert_in (type_in
);
3445 cst
= build_int_cst (type
, value
);
3446 if (!TYPE_READONLY (type
))
3447 type
= build_qualified_type (type
, TYPE_QUAL_CONST
);
3448 decl
= build_decl (ctx
->get_location_t (filename
, line_number
),
3449 VAR_DECL
, get_identifier (name
), type
);
3450 TREE_STATIC (decl
) = 1;
3451 TREE_READONLY (decl
) = 1;
3452 cp_finish_decl (decl
, cst
, true, NULL
, LOOKUP_ONLYCONVERTING
);
3453 safe_pushdecl (decl
);
3459 plugin_error (cc1_plugin::connection
*,
3460 const char *message
)
3462 error ("%s", message
);
3463 return convert_out (error_mark_node
);
3467 plugin_add_static_assert (cc1_plugin::connection
*self
,
3468 gcc_expr condition_in
,
3469 const char *errormsg
,
3470 const char *filename
,
3471 unsigned int line_number
)
3473 plugin_context
*ctx
= static_cast<plugin_context
*> (self
);
3474 tree condition
= convert_in (condition_in
);
3479 tree message
= build_string (strlen (errormsg
) + 1, errormsg
);
3481 TREE_TYPE (message
) = char_array_type_node
;
3482 fix_string_type (message
);
3484 location_t loc
= ctx
->get_location_t (filename
, line_number
);
3486 bool member_p
= at_class_scope_p ();
3488 finish_static_assert (condition
, message
, loc
, member_p
, false);
3496 #pragma GCC visibility push(default)
3500 plugin_init (struct plugin_name_args
*plugin_info
,
3501 struct plugin_gcc_version
*)
3503 generic_plugin_init (plugin_info
, GCC_CP_FE_VERSION_0
);
3505 register_callback (plugin_info
->base_name
, PLUGIN_PRAGMAS
,
3506 plugin_init_extra_pragmas
, NULL
);
3507 register_callback (plugin_info
->base_name
, PLUGIN_PRE_GENERICIZE
,
3508 rewrite_decls_to_addresses
, NULL
);
3510 #define GCC_METHOD0(R, N) \
3512 cc1_plugin::callback_ftype *fun \
3513 = cc1_plugin::invoker<R>::invoke<plugin_ ## N>; \
3514 current_context->add_callback (# N, fun); \
3516 #define GCC_METHOD1(R, N, A) \
3518 cc1_plugin::callback_ftype *fun \
3519 = cc1_plugin::invoker<R, A>::invoke<plugin_ ## N>; \
3520 current_context->add_callback (# N, fun); \
3522 #define GCC_METHOD2(R, N, A, B) \
3524 cc1_plugin::callback_ftype *fun \
3525 = cc1_plugin::invoker<R, A, B>::invoke<plugin_ ## N>; \
3526 current_context->add_callback (# N, fun); \
3528 #define GCC_METHOD3(R, N, A, B, C) \
3530 cc1_plugin::callback_ftype *fun \
3531 = cc1_plugin::invoker<R, A, B, C>::invoke<plugin_ ## N>; \
3532 current_context->add_callback (# N, fun); \
3534 #define GCC_METHOD4(R, N, A, B, C, D) \
3536 cc1_plugin::callback_ftype *fun \
3537 = cc1_plugin::invoker<R, A, B, C, \
3538 D>::invoke<plugin_ ## N>; \
3539 current_context->add_callback (# N, fun); \
3541 #define GCC_METHOD5(R, N, A, B, C, D, E) \
3543 cc1_plugin::callback_ftype *fun \
3544 = cc1_plugin::invoker<R, A, B, C, \
3545 D, E>::invoke<plugin_ ## N>; \
3546 current_context->add_callback (# N, fun); \
3548 #define GCC_METHOD7(R, N, A, B, C, D, E, F, G) \
3550 cc1_plugin::callback_ftype *fun \
3551 = cc1_plugin::invoker<R, A, B, C, \
3552 D, E, F, G>::invoke<plugin_ ## N>; \
3553 current_context->add_callback (# N, fun); \
3556 #include "gcc-cp-fe.def"