1 /* Handle exceptional things in C++.
2 Copyright (C) 1989-2013 Free Software Foundation, Inc.
3 Contributed by Michael Tiemann <tiemann@cygnus.com>
4 Rewritten by Mike Stump <mrs@cygnus.com>, based upon an
5 initial re-implementation courtesy Tad Hunt.
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3, or (at your option)
14 GCC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
26 #include "coretypes.h"
31 #include "tree-inline.h"
32 #include "tree-iterator.h"
35 static void push_eh_cleanup (tree
);
36 static tree
prepare_eh_type (tree
);
37 static tree
do_begin_catch (void);
38 static int dtor_nothrow (tree
);
39 static tree
do_end_catch (tree
);
40 static bool decl_is_java_type (tree decl
, int err
);
41 static void initialize_handler_parm (tree
, tree
);
42 static tree
do_allocate_exception (tree
);
43 static tree
wrap_cleanups_r (tree
*, int *, void *);
44 static int complete_ptr_ref_or_void_ptr_p (tree
, tree
);
45 static bool is_admissible_throw_operand_or_catch_parameter (tree
, bool);
46 static int can_convert_eh (tree
, tree
);
48 /* Sets up all the global eh stuff that needs to be initialized at the
49 start of compilation. */
52 init_exception_processing (void)
56 /* void std::terminate (); */
57 push_namespace (std_identifier
);
58 tmp
= build_function_type_list (void_type_node
, NULL_TREE
);
59 terminate_node
= build_cp_library_fn_ptr ("terminate", tmp
,
60 ECF_NOTHROW
| ECF_NORETURN
);
61 TREE_THIS_VOLATILE (terminate_node
) = 1;
62 TREE_NOTHROW (terminate_node
) = 1;
65 /* void __cxa_call_unexpected(void *); */
66 tmp
= build_function_type_list (void_type_node
, ptr_type_node
, NULL_TREE
);
68 = push_throw_library_fn (get_identifier ("__cxa_call_unexpected"), tmp
);
71 /* Returns an expression to be executed if an unhandled exception is
72 propagated out of a cleanup region. */
75 cp_protect_cleanup_actions (void)
79 When the destruction of an object during stack unwinding exits
80 using an exception ... void terminate(); is called. */
81 return terminate_node
;
85 prepare_eh_type (tree type
)
87 if (type
== NULL_TREE
)
89 if (type
== error_mark_node
)
90 return error_mark_node
;
92 /* peel back references, so they match. */
93 type
= non_reference (type
);
95 /* Peel off cv qualifiers. */
96 type
= TYPE_MAIN_VARIANT (type
);
98 /* Functions and arrays decay to pointers. */
99 type
= type_decays_to (type
);
104 /* Return the type info for TYPE as used by EH machinery. */
106 eh_type_info (tree type
)
110 if (type
== NULL_TREE
|| type
== error_mark_node
)
113 if (decl_is_java_type (type
, 0))
114 exp
= build_java_class_ref (TREE_TYPE (type
));
116 exp
= get_tinfo_decl (type
);
121 /* Build the address of a typeinfo decl for use in the runtime
122 matching field of the exception model. */
125 build_eh_type_type (tree type
)
127 tree exp
= eh_type_info (type
);
134 return convert (ptr_type_node
, build_address (exp
));
140 return build_call_n (builtin_decl_explicit (BUILT_IN_EH_POINTER
),
141 1, integer_zero_node
);
144 /* Declare a function NAME, returning RETURN_TYPE, taking a single
145 parameter PARM_TYPE, with an empty exception specification.
147 Note that the C++ ABI document does not have a throw-specifier on
148 the routines declared below via this function. The declarations
149 are consistent with the actual implementations in libsupc++. */
152 declare_library_fn (tree name
, tree return_type
, tree parm_type
, int ecf_flags
)
154 return push_library_fn (name
, build_function_type_list (return_type
,
161 /* Build up a call to __cxa_get_exception_ptr so that we can build a
162 copy constructor for the thrown object. */
165 do_get_exception_ptr (void)
169 fn
= get_identifier ("__cxa_get_exception_ptr");
170 if (!get_global_value_if_present (fn
, &fn
))
172 /* Declare void* __cxa_get_exception_ptr (void *) throw(). */
173 fn
= declare_library_fn (fn
, ptr_type_node
, ptr_type_node
,
174 ECF_NOTHROW
| ECF_PURE
| ECF_LEAF
| ECF_TM_PURE
);
177 return cp_build_function_call_nary (fn
, tf_warning_or_error
,
178 build_exc_ptr (), NULL_TREE
);
181 /* Build up a call to __cxa_begin_catch, to tell the runtime that the
182 exception has been handled. */
185 do_begin_catch (void)
189 fn
= get_identifier ("__cxa_begin_catch");
190 if (!get_global_value_if_present (fn
, &fn
))
192 /* Declare void* __cxa_begin_catch (void *) throw(). */
193 fn
= declare_library_fn (fn
, ptr_type_node
, ptr_type_node
, ECF_NOTHROW
);
195 /* Create its transactional-memory equivalent. */
198 tree fn2
= get_identifier ("_ITM_cxa_begin_catch");
199 if (!get_global_value_if_present (fn2
, &fn2
))
200 fn2
= declare_library_fn (fn2
, ptr_type_node
,
201 ptr_type_node
, ECF_NOTHROW
| ECF_TM_PURE
);
202 record_tm_replacement (fn
, fn2
);
206 return cp_build_function_call_nary (fn
, tf_warning_or_error
,
207 build_exc_ptr (), NULL_TREE
);
210 /* Returns nonzero if cleaning up an exception of type TYPE (which can be
211 NULL_TREE for a ... handler) will not throw an exception. */
214 dtor_nothrow (tree type
)
216 if (type
== NULL_TREE
|| type
== error_mark_node
)
219 if (TYPE_HAS_TRIVIAL_DESTRUCTOR (type
))
222 if (CLASSTYPE_LAZY_DESTRUCTOR (type
))
223 lazily_declare_fn (sfk_destructor
, type
);
225 return TREE_NOTHROW (CLASSTYPE_DESTRUCTORS (type
));
228 /* Build up a call to __cxa_end_catch, to destroy the exception object
229 for the current catch block if no others are currently using it. */
232 do_end_catch (tree type
)
236 fn
= get_identifier ("__cxa_end_catch");
237 if (!get_global_value_if_present (fn
, &fn
))
239 /* Declare void __cxa_end_catch ().
240 This can throw if the destructor for the exception throws. */
241 fn
= push_void_library_fn (fn
, void_list_node
, 0);
243 /* Create its transactional-memory equivalent. */
246 tree fn2
= get_identifier ("_ITM_cxa_end_catch");
247 if (!get_global_value_if_present (fn2
, &fn2
))
248 fn2
= push_void_library_fn (fn2
, void_list_node
, ECF_TM_PURE
);
249 record_tm_replacement (fn
, fn2
);
253 cleanup
= cp_build_function_call_vec (fn
, NULL
, tf_warning_or_error
);
254 TREE_NOTHROW (cleanup
) = dtor_nothrow (type
);
259 /* This routine creates the cleanup for the current exception. */
262 push_eh_cleanup (tree type
)
264 finish_decl_cleanup (NULL_TREE
, do_end_catch (type
));
267 /* Return nonzero value if DECL is a Java type suitable for catch or
271 decl_is_java_type (tree decl
, int err
)
273 bool r
= (TYPE_PTR_P (decl
)
274 && TREE_CODE (TREE_TYPE (decl
)) == RECORD_TYPE
275 && TYPE_FOR_JAVA (TREE_TYPE (decl
)));
279 if (TREE_CODE (decl
) == REFERENCE_TYPE
280 && TREE_CODE (TREE_TYPE (decl
)) == RECORD_TYPE
281 && TYPE_FOR_JAVA (TREE_TYPE (decl
)))
283 /* Can't throw a reference. */
284 error ("type %qT is disallowed in Java %<throw%> or %<catch%>",
291 = IDENTIFIER_GLOBAL_VALUE (get_identifier ("jthrowable"));
293 if (jthrow_node
== NULL_TREE
)
295 ("call to Java %<catch%> or %<throw%> with %<jthrowable%> undefined");
297 jthrow_node
= TREE_TYPE (TREE_TYPE (jthrow_node
));
299 if (! DERIVED_FROM_P (jthrow_node
, TREE_TYPE (decl
)))
301 /* Thrown object must be a Throwable. */
302 error ("type %qT is not derived from %<java::lang::Throwable%>",
311 /* Select the personality routine to be used for exception handling,
312 or issue an error if we need two different ones in the same
314 ??? At present DECL_FUNCTION_PERSONALITY is set via
315 LANG_HOOKS_EH_PERSONALITY. Should it be done here instead? */
317 choose_personality_routine (enum languages lang
)
332 if (lang
!= lang_cplusplus
)
337 if (lang
!= lang_java
)
342 ; /* Proceed to language selection. */
353 terminate_node
= builtin_decl_explicit (BUILT_IN_ABORT
);
354 pragma_java_exceptions
= true;
363 error ("mixing C++ and Java catches in a single translation unit");
367 /* Wrap EXPR in a MUST_NOT_THROW_EXPR expressing that EXPR must
368 not throw any exceptions if COND is true. A condition of
369 NULL_TREE is treated as 'true'. */
372 build_must_not_throw_expr (tree body
, tree cond
)
374 tree type
= body
? TREE_TYPE (body
) : void_type_node
;
376 if (!flag_exceptions
)
379 if (cond
&& !value_dependent_expression_p (cond
))
381 cond
= cxx_constant_value (cond
);
382 if (integer_zerop (cond
))
384 else if (integer_onep (cond
))
388 return build2 (MUST_NOT_THROW_EXPR
, type
, body
, cond
);
392 /* Initialize the catch parameter DECL. */
395 initialize_handler_parm (tree decl
, tree exp
)
400 /* Make sure we mark the catch param as used, otherwise we'll get a
401 warning about an unused ((anonymous)). */
402 TREE_USED (decl
) = 1;
403 DECL_READ_P (decl
) = 1;
405 /* Figure out the type that the initializer is. Pointers are returned
406 adjusted by value from __cxa_begin_catch. Others are returned by
408 init_type
= TREE_TYPE (decl
);
409 if (!POINTER_TYPE_P (init_type
))
410 init_type
= build_reference_type (init_type
);
412 choose_personality_routine (decl_is_java_type (init_type
, 0)
413 ? lang_java
: lang_cplusplus
);
415 /* Since pointers are passed by value, initialize a reference to
416 pointer catch parm with the address of the temporary. */
417 if (TREE_CODE (init_type
) == REFERENCE_TYPE
418 && TYPE_PTR_P (TREE_TYPE (init_type
)))
419 exp
= cp_build_addr_expr (exp
, tf_warning_or_error
);
421 exp
= ocp_convert (init_type
, exp
, CONV_IMPLICIT
|CONV_FORCE_TEMP
, 0,
422 tf_warning_or_error
);
424 init
= convert_from_reference (exp
);
426 /* If the constructor for the catch parm exits via an exception, we
427 must call terminate. See eh23.C. */
428 if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl
)))
430 /* Generate the copy constructor call directly so we can wrap it.
431 See also expand_default_init. */
432 init
= ocp_convert (TREE_TYPE (decl
), init
,
433 CONV_IMPLICIT
|CONV_FORCE_TEMP
, 0,
434 tf_warning_or_error
);
435 /* Force cleanups now to avoid nesting problems with the
436 MUST_NOT_THROW_EXPR. */
437 init
= fold_build_cleanup_point_expr (TREE_TYPE (init
), init
);
438 init
= build_must_not_throw_expr (init
, NULL_TREE
);
441 decl
= pushdecl (decl
);
443 start_decl_1 (decl
, true);
444 cp_finish_decl (decl
, init
, /*init_const_expr_p=*/false, NULL_TREE
,
445 LOOKUP_ONLYCONVERTING
|DIRECT_BIND
);
449 /* Routine to see if exception handling is turned on.
450 DO_WARN is nonzero if we want to inform the user that exception
451 handling is turned off.
453 This is used to ensure that -fexceptions has been specified if the
454 compiler tries to use any exception-specific functions. */
459 if (! flag_exceptions
)
461 static int warned
= 0;
464 error ("exception handling disabled, use -fexceptions to enable");
472 /* Call this to start a catch block. DECL is the catch parameter. */
475 expand_start_catch_block (tree decl
)
485 if (!is_admissible_throw_operand_or_catch_parameter (decl
, false))
486 decl
= error_mark_node
;
488 type
= prepare_eh_type (TREE_TYPE (decl
));
489 mark_used (eh_type_info (type
));
494 if (decl
&& decl_is_java_type (type
, 1))
496 /* Java only passes object via pointer and doesn't require
497 adjusting. The java object is immediately before the
498 generic exception header. */
499 exp
= build_exc_ptr ();
500 exp
= build1 (NOP_EXPR
, build_pointer_type (type
), exp
);
501 exp
= fold_build_pointer_plus (exp
,
502 fold_build1_loc (input_location
,
503 NEGATE_EXPR
, sizetype
,
504 TYPE_SIZE_UNIT (TREE_TYPE (exp
))));
505 exp
= cp_build_indirect_ref (exp
, RO_NULL
, tf_warning_or_error
);
506 initialize_handler_parm (decl
, exp
);
510 /* Call __cxa_end_catch at the end of processing the exception. */
511 push_eh_cleanup (type
);
513 init
= do_begin_catch ();
515 /* If there's no decl at all, then all we need to do is make sure
516 to tell the runtime that we've begun handling the exception. */
517 if (decl
== NULL
|| decl
== error_mark_node
|| init
== error_mark_node
)
518 finish_expr_stmt (init
);
520 /* If the C++ object needs constructing, we need to do that before
521 calling __cxa_begin_catch, so that std::uncaught_exception gets
522 the right value during the copy constructor. */
523 else if (flag_use_cxa_get_exception_ptr
524 && TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl
)))
526 exp
= do_get_exception_ptr ();
527 initialize_handler_parm (decl
, exp
);
528 finish_expr_stmt (init
);
531 /* Otherwise the type uses a bitwise copy, and we don't have to worry
532 about the value of std::uncaught_exception and therefore can do the
533 copy with the return value of __cxa_end_catch instead. */
536 tree init_type
= type
;
538 /* Pointers are passed by values, everything else by reference. */
539 if (!TYPE_PTR_P (type
))
540 init_type
= build_pointer_type (type
);
541 if (init_type
!= TREE_TYPE (init
))
542 init
= build1 (NOP_EXPR
, init_type
, init
);
543 exp
= create_temporary_var (init_type
);
544 DECL_REGISTER (exp
) = 1;
545 cp_finish_decl (exp
, init
, /*init_const_expr=*/false,
546 NULL_TREE
, LOOKUP_ONLYCONVERTING
);
547 initialize_handler_parm (decl
, exp
);
554 /* Call this to end a catch block. Its responsible for emitting the
555 code to handle jumping back to the correct place, and for emitting
556 the label to jump to if this catch block didn't match. */
559 expand_end_catch_block (void)
564 /* The exception being handled is rethrown if control reaches the end of
565 a handler of the function-try-block of a constructor or destructor. */
566 if (in_function_try_handler
567 && (DECL_CONSTRUCTOR_P (current_function_decl
)
568 || DECL_DESTRUCTOR_P (current_function_decl
)))
569 finish_expr_stmt (build_throw (NULL_TREE
));
573 begin_eh_spec_block (void)
576 location_t spec_location
= DECL_SOURCE_LOCATION (current_function_decl
);
578 /* A noexcept specification (or throw() with -fnothrow-opt) is a
579 MUST_NOT_THROW_EXPR. */
580 if (TYPE_NOEXCEPT_P (TREE_TYPE (current_function_decl
)))
582 r
= build_stmt (spec_location
, MUST_NOT_THROW_EXPR
,
583 NULL_TREE
, NULL_TREE
);
584 TREE_SIDE_EFFECTS (r
) = 1;
587 r
= build_stmt (spec_location
, EH_SPEC_BLOCK
, NULL_TREE
, NULL_TREE
);
589 TREE_OPERAND (r
, 0) = push_stmt_list ();
594 finish_eh_spec_block (tree raw_raises
, tree eh_spec_block
)
598 TREE_OPERAND (eh_spec_block
, 0)
599 = pop_stmt_list (TREE_OPERAND (eh_spec_block
, 0));
601 if (TREE_CODE (eh_spec_block
) == MUST_NOT_THROW_EXPR
)
604 /* Strip cv quals, etc, from the specification types. */
605 for (raises
= NULL_TREE
;
606 raw_raises
&& TREE_VALUE (raw_raises
);
607 raw_raises
= TREE_CHAIN (raw_raises
))
609 tree type
= prepare_eh_type (TREE_VALUE (raw_raises
));
610 tree tinfo
= eh_type_info (type
);
613 raises
= tree_cons (NULL_TREE
, type
, raises
);
616 EH_SPEC_RAISES (eh_spec_block
) = raises
;
619 /* Return a pointer to a buffer for an exception object of type TYPE. */
622 do_allocate_exception (tree type
)
626 fn
= get_identifier ("__cxa_allocate_exception");
627 if (!get_global_value_if_present (fn
, &fn
))
629 /* Declare void *__cxa_allocate_exception(size_t) throw(). */
630 fn
= declare_library_fn (fn
, ptr_type_node
, size_type_node
,
631 ECF_NOTHROW
| ECF_MALLOC
);
635 tree fn2
= get_identifier ("_ITM_cxa_allocate_exception");
636 if (!get_global_value_if_present (fn2
, &fn2
))
637 fn2
= declare_library_fn (fn2
, ptr_type_node
,
639 ECF_NOTHROW
| ECF_MALLOC
| ECF_TM_PURE
);
640 record_tm_replacement (fn
, fn2
);
644 return cp_build_function_call_nary (fn
, tf_warning_or_error
,
645 size_in_bytes (type
), NULL_TREE
);
648 /* Call __cxa_free_exception from a cleanup. This is never invoked
649 directly, but see the comment for stabilize_throw_expr. */
652 do_free_exception (tree ptr
)
656 fn
= get_identifier ("__cxa_free_exception");
657 if (!get_global_value_if_present (fn
, &fn
))
659 /* Declare void __cxa_free_exception (void *) throw(). */
660 fn
= declare_library_fn (fn
, void_type_node
, ptr_type_node
,
661 ECF_NOTHROW
| ECF_LEAF
);
664 return cp_build_function_call_nary (fn
, tf_warning_or_error
, ptr
, NULL_TREE
);
667 /* Wrap all cleanups for TARGET_EXPRs in MUST_NOT_THROW_EXPR.
668 Called from build_throw via walk_tree_without_duplicates. */
671 wrap_cleanups_r (tree
*tp
, int *walk_subtrees
, void * /*data*/)
676 /* Don't walk into types. */
682 if (TREE_CODE (exp
) != TARGET_EXPR
)
685 cleanup
= TARGET_EXPR_CLEANUP (exp
);
688 cleanup
= build2 (MUST_NOT_THROW_EXPR
, void_type_node
, cleanup
,
690 TARGET_EXPR_CLEANUP (exp
) = cleanup
;
693 /* Keep iterating. */
697 /* Build a throw expression. */
700 build_throw (tree exp
)
704 if (exp
== error_mark_node
)
707 if (processing_template_decl
)
710 current_function_returns_abnormally
= 1;
711 exp
= build_min (THROW_EXPR
, void_type_node
, exp
);
712 SET_EXPR_LOCATION (exp
, input_location
);
716 if (exp
== null_node
)
717 warning (0, "throwing NULL, which has integral, not pointer type");
719 if (exp
!= NULL_TREE
)
721 if (!is_admissible_throw_operand_or_catch_parameter (exp
, true))
722 return error_mark_node
;
726 return error_mark_node
;
728 if (exp
&& decl_is_java_type (TREE_TYPE (exp
), 1))
730 tree fn
= get_identifier ("_Jv_Throw");
731 if (!get_global_value_if_present (fn
, &fn
))
733 /* Declare void _Jv_Throw (void *). */
735 tmp
= build_function_type_list (ptr_type_node
,
736 ptr_type_node
, NULL_TREE
);
737 fn
= push_throw_library_fn (fn
, tmp
);
739 else if (really_overloaded_fn (fn
))
741 error ("%qD should never be overloaded", fn
);
742 return error_mark_node
;
744 fn
= OVL_CURRENT (fn
);
745 exp
= cp_build_function_call_nary (fn
, tf_warning_or_error
,
757 /* The CLEANUP_TYPE is the internal type of a destructor. */
760 tmp
= build_function_type_list (void_type_node
,
761 ptr_type_node
, NULL_TREE
);
762 cleanup_type
= build_pointer_type (tmp
);
765 fn
= get_identifier ("__cxa_throw");
766 if (!get_global_value_if_present (fn
, &fn
))
768 /* Declare void __cxa_throw (void*, void*, void (*)(void*)). */
769 /* ??? Second argument is supposed to be "std::type_info*". */
770 tmp
= build_function_type_list (void_type_node
,
771 ptr_type_node
, ptr_type_node
,
772 cleanup_type
, NULL_TREE
);
773 fn
= push_throw_library_fn (fn
, tmp
);
777 tree fn2
= get_identifier ("_ITM_cxa_throw");
778 if (!get_global_value_if_present (fn2
, &fn2
))
779 fn2
= push_throw_library_fn (fn2
, tmp
);
780 apply_tm_attr (fn2
, get_identifier ("transaction_pure"));
781 record_tm_replacement (fn
, fn2
);
787 A throw-expression initializes a temporary object, the type
788 of which is determined by removing any top-level
789 cv-qualifiers from the static type of the operand of throw
790 and adjusting the type from "array of T" or "function return
791 T" to "pointer to T" or "pointer to function returning T"
793 temp_type
= is_bitfield_expr_with_lowered_type (exp
);
795 temp_type
= cv_unqualified (type_decays_to (TREE_TYPE (exp
)));
797 /* OK, this is kind of wacky. The standard says that we call
798 terminate when the exception handling mechanism, after
799 completing evaluation of the expression to be thrown but
800 before the exception is caught (_except.throw_), calls a
801 user function that exits via an uncaught exception.
803 So we have to protect the actual initialization of the
804 exception object with terminate(), but evaluate the
805 expression first. Since there could be temps in the
806 expression, we need to handle that, too. We also expand
807 the call to __cxa_allocate_exception first (which doesn't
808 matter, since it can't throw). */
810 /* Allocate the space for the exception. */
811 allocate_expr
= do_allocate_exception (temp_type
);
812 allocate_expr
= get_target_expr (allocate_expr
);
813 ptr
= TARGET_EXPR_SLOT (allocate_expr
);
814 TARGET_EXPR_CLEANUP (allocate_expr
) = do_free_exception (ptr
);
815 CLEANUP_EH_ONLY (allocate_expr
) = 1;
817 object
= build_nop (build_pointer_type (temp_type
), ptr
);
818 object
= cp_build_indirect_ref (object
, RO_NULL
, tf_warning_or_error
);
820 /* And initialize the exception object. */
821 if (CLASS_TYPE_P (temp_type
))
823 int flags
= LOOKUP_NORMAL
| LOOKUP_ONLYCONVERTING
;
824 vec
<tree
, va_gc
> *exp_vec
;
826 /* Under C++0x [12.8/16 class.copy], a thrown lvalue is sometimes
827 treated as an rvalue for the purposes of overload resolution
828 to favor move constructors over copy constructors. */
829 if (/* Must be a local, automatic variable. */
831 && DECL_CONTEXT (exp
) == current_function_decl
832 && ! TREE_STATIC (exp
)
833 /* The variable must not have the `volatile' qualifier. */
834 && !(cp_type_quals (TREE_TYPE (exp
)) & TYPE_QUAL_VOLATILE
))
835 flags
= flags
| LOOKUP_PREFER_RVALUE
;
837 /* Call the copy constructor. */
838 exp_vec
= make_tree_vector_single (exp
);
839 exp
= (build_special_member_call
840 (object
, complete_ctor_identifier
, &exp_vec
,
841 TREE_TYPE (object
), flags
, tf_warning_or_error
));
842 release_tree_vector (exp_vec
);
843 if (exp
== error_mark_node
)
845 error (" in thrown expression");
846 return error_mark_node
;
851 tmp
= decay_conversion (exp
, tf_warning_or_error
);
852 if (tmp
== error_mark_node
)
853 return error_mark_node
;
854 exp
= build2 (INIT_EXPR
, temp_type
, object
, tmp
);
857 /* Mark any cleanups from the initialization as MUST_NOT_THROW, since
858 they are run after the exception object is initialized. */
859 cp_walk_tree_without_duplicates (&exp
, wrap_cleanups_r
, 0);
861 /* Prepend the allocation. */
862 exp
= build2 (COMPOUND_EXPR
, TREE_TYPE (exp
), allocate_expr
, exp
);
864 /* Force all the cleanups to be evaluated here so that we don't have
865 to do them during unwinding. */
866 exp
= build1 (CLEANUP_POINT_EXPR
, void_type_node
, exp
);
868 throw_type
= build_eh_type_type (prepare_eh_type (TREE_TYPE (object
)));
871 if (type_build_dtor_call (TREE_TYPE (object
)))
873 tree fn
= lookup_fnfields (TYPE_BINFO (TREE_TYPE (object
)),
874 complete_dtor_identifier
, 0);
875 fn
= BASELINK_FUNCTIONS (fn
);
877 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (object
)))
879 cxx_mark_addressable (fn
);
880 /* Pretend it's a normal function. */
881 cleanup
= build1 (ADDR_EXPR
, cleanup_type
, fn
);
884 if (cleanup
== NULL_TREE
)
885 cleanup
= build_int_cst (cleanup_type
, 0);
887 /* ??? Indicate that this function call throws throw_type. */
888 tmp
= cp_build_function_call_nary (fn
, tf_warning_or_error
,
889 ptr
, throw_type
, cleanup
, NULL_TREE
);
891 /* Tack on the initialization stuff. */
892 exp
= build2 (COMPOUND_EXPR
, TREE_TYPE (tmp
), exp
, tmp
);
896 /* Rethrow current exception. */
898 tree fn
= get_identifier ("__cxa_rethrow");
899 if (!get_global_value_if_present (fn
, &fn
))
901 /* Declare void __cxa_rethrow (void). */
902 fn
= push_throw_library_fn
903 (fn
, build_function_type_list (void_type_node
, NULL_TREE
));
907 apply_tm_attr (fn
, get_identifier ("transaction_pure"));
909 /* ??? Indicate that this function call allows exceptions of the type
910 of the enclosing catch block (if known). */
911 exp
= cp_build_function_call_vec (fn
, NULL
, tf_warning_or_error
);
914 exp
= build1 (THROW_EXPR
, void_type_node
, exp
);
915 SET_EXPR_LOCATION (exp
, input_location
);
920 /* Make sure TYPE is complete, pointer to complete, reference to
921 complete, or pointer to cv void. Issue diagnostic on failure.
922 Return the zero on failure and nonzero on success. FROM can be
923 the expr or decl from whence TYPE came, if available. */
926 complete_ptr_ref_or_void_ptr_p (tree type
, tree from
)
930 /* Check complete. */
931 type
= complete_type_or_else (type
, from
);
935 /* Or a pointer or ref to one, or cv void *. */
936 is_ptr
= TYPE_PTR_P (type
);
937 if (is_ptr
|| TREE_CODE (type
) == REFERENCE_TYPE
)
939 tree core
= TREE_TYPE (type
);
941 if (is_ptr
&& VOID_TYPE_P (core
))
943 else if (!complete_type_or_else (core
, from
))
949 /* If IS_THROW is true return truth-value if T is an expression admissible
950 in throw-expression, i.e. if it is not of incomplete type or a pointer/
951 reference to such a type or of an abstract class type.
952 If IS_THROW is false, likewise for a catch parameter, same requirements
953 for its type plus rvalue reference type is also not admissible. */
956 is_admissible_throw_operand_or_catch_parameter (tree t
, bool is_throw
)
958 tree expr
= is_throw
? t
: NULL_TREE
;
959 tree type
= TREE_TYPE (t
);
961 /* C++11 [except.handle] The exception-declaration shall not denote
962 an incomplete type, an abstract class type, or an rvalue reference
965 /* 15.1/4 [...] The type of the throw-expression shall not be an
966 incomplete type, or a pointer or a reference to an incomplete
967 type, other than void*, const void*, volatile void*, or
968 const volatile void*. Except for these restriction and the
969 restrictions on type matching mentioned in 15.3, the operand
970 of throw is treated exactly as a function argument in a call
971 (5.2.2) or the operand of a return statement. */
972 if (!complete_ptr_ref_or_void_ptr_p (type
, expr
))
975 /* 10.4/3 An abstract class shall not be used as a parameter type,
976 as a function return type or as type of an explicit
978 else if (abstract_virtuals_error (is_throw
? ACU_THROW
: ACU_CATCH
, type
))
981 && TREE_CODE (type
) == REFERENCE_TYPE
982 && TYPE_REF_IS_RVALUE (type
))
984 error ("cannot declare catch parameter to be of rvalue "
985 "reference type %qT", type
);
988 else if (variably_modified_type_p (type
, NULL_TREE
))
991 error ("cannot throw expression of type %qT because it involves "
992 "types of variable size", type
);
994 error ("cannot catch type %qT because it involves types of "
995 "variable size", type
);
1002 /* Returns nonzero if FN is a declaration of a standard C library
1003 function which is known not to throw.
1005 [lib.res.on.exception.handling]: None of the functions from the
1006 Standard C library shall report an error by throwing an
1007 exception, unless it calls a program-supplied function that
1008 throws an exception. */
1013 nothrow_libfn_p (const_tree fn
)
1017 if (TREE_PUBLIC (fn
)
1018 && DECL_EXTERNAL (fn
)
1019 && DECL_NAMESPACE_SCOPE_P (fn
)
1020 && DECL_EXTERN_C_P (fn
))
1023 /* Can't be a C library function. */
1026 /* Being a C library function, DECL_ASSEMBLER_NAME == DECL_NAME
1027 unless the system headers are playing rename tricks, and if
1028 they are, we don't want to be confused by them. */
1029 id
= DECL_NAME (fn
);
1030 return !!libc_name_p (IDENTIFIER_POINTER (id
), IDENTIFIER_LENGTH (id
));
1033 /* Returns nonzero if an exception of type FROM will be caught by a
1034 handler for type TO, as per [except.handle]. */
1037 can_convert_eh (tree to
, tree from
)
1039 to
= non_reference (to
);
1040 from
= non_reference (from
);
1042 if (TYPE_PTR_P (to
) && TYPE_PTR_P (from
))
1044 to
= TREE_TYPE (to
);
1045 from
= TREE_TYPE (from
);
1047 if (! at_least_as_qualified_p (to
, from
))
1050 if (VOID_TYPE_P (to
))
1053 /* Else fall through. */
1056 if (CLASS_TYPE_P (to
) && CLASS_TYPE_P (from
)
1057 && publicly_uniquely_derived_p (to
, from
))
1063 /* Check whether any of the handlers in I are shadowed by another handler
1064 accepting TYPE. Note that the shadowing may not be complete; even if
1065 an exception of type B would be caught by a handler for A, there could
1066 be a derived class C for which A is an ambiguous base but B is not, so
1067 the handler for B would catch an exception of type C. */
1070 check_handlers_1 (tree master
, tree_stmt_iterator i
)
1072 tree type
= TREE_TYPE (master
);
1074 for (; !tsi_end_p (i
); tsi_next (&i
))
1076 tree handler
= tsi_stmt (i
);
1077 if (TREE_TYPE (handler
) && can_convert_eh (type
, TREE_TYPE (handler
)))
1079 warning_at (EXPR_LOCATION (handler
), 0,
1080 "exception of type %qT will be caught",
1081 TREE_TYPE (handler
));
1082 warning_at (EXPR_LOCATION (master
), 0,
1083 " by earlier handler for %qT", type
);
1089 /* Given a STATEMENT_LIST of HANDLERs, make sure that they're OK. */
1092 check_handlers (tree handlers
)
1094 tree_stmt_iterator i
;
1096 /* If we don't have a STATEMENT_LIST, then we've just got one
1097 handler, and thus nothing to warn about. */
1098 if (TREE_CODE (handlers
) != STATEMENT_LIST
)
1101 i
= tsi_start (handlers
);
1105 tree handler
= tsi_stmt (i
);
1108 /* No more handlers; nothing to shadow. */
1111 if (TREE_TYPE (handler
) == NULL_TREE
)
1112 permerror (EXPR_LOCATION (handler
), "%<...%>"
1113 " handler must be the last handler for its try block");
1115 check_handlers_1 (handler
, i
);
1119 /* walk_tree helper for finish_noexcept_expr. Returns non-null if the
1120 expression *TP causes the noexcept operator to evaluate to false.
1122 5.3.7 [expr.noexcept]: The result of the noexcept operator is false if
1123 in a potentially-evaluated context the expression would contain
1124 * a potentially evaluated call to a function, member function,
1125 function pointer, or member function pointer that does not have a
1126 non-throwing exception-specification (15.4),
1127 * a potentially evaluated throw-expression (15.1),
1128 * a potentially evaluated dynamic_cast expression dynamic_cast<T>(v),
1129 where T is a reference type, that requires a run-time check (5.2.7), or
1130 * a potentially evaluated typeid expression (5.2.8) applied to a glvalue
1131 expression whose type is a polymorphic class type (10.3). */
1134 check_noexcept_r (tree
*tp
, int * /*walk_subtrees*/, void * /*data*/)
1137 enum tree_code code
= TREE_CODE (t
);
1138 if (code
== CALL_EXPR
1139 || code
== AGGR_INIT_EXPR
)
1141 /* We can only use the exception specification of the called function
1142 for determining the value of a noexcept expression; we can't use
1143 TREE_NOTHROW, as it might have a different value in another
1144 translation unit, creating ODR problems.
1146 We could use TREE_NOTHROW (t) for !TREE_PUBLIC fns, though... */
1147 tree fn
= (code
== AGGR_INIT_EXPR
1148 ? AGGR_INIT_EXPR_FN (t
) : CALL_EXPR_FN (t
));
1149 tree type
= TREE_TYPE (TREE_TYPE (fn
));
1152 if (TREE_CODE (fn
) == ADDR_EXPR
)
1153 fn
= TREE_OPERAND (fn
, 0);
1154 if (TREE_CODE (fn
) == FUNCTION_DECL
)
1156 /* We do use TREE_NOTHROW for ABI internals like __dynamic_cast,
1157 and for C library functions known not to throw. */
1158 if (DECL_EXTERN_C_P (fn
)
1159 && (DECL_ARTIFICIAL (fn
)
1160 || nothrow_libfn_p (fn
)))
1161 return TREE_NOTHROW (fn
) ? NULL_TREE
: fn
;
1162 /* A call to a constexpr function is noexcept if the call
1163 is a constant expression. */
1164 if (DECL_DECLARED_CONSTEXPR_P (fn
)
1165 && is_sub_constant_expr (t
))
1168 if (!TYPE_NOTHROW_P (type
))
1175 /* If a function that causes a noexcept-expression to be false isn't
1176 defined yet, remember it and check it for TREE_NOTHROW again at EOF. */
1178 typedef struct GTY(()) pending_noexcept
{
1182 static GTY(()) vec
<pending_noexcept
, va_gc
> *pending_noexcept_checks
;
1184 /* FN is a FUNCTION_DECL that caused a noexcept-expr to be false. Warn if
1188 maybe_noexcept_warning (tree fn
)
1190 if (TREE_NOTHROW (fn
))
1192 warning (OPT_Wnoexcept
, "noexcept-expression evaluates to %<false%> "
1193 "because of a call to %qD", fn
);
1194 warning (OPT_Wnoexcept
, "but %q+D does not throw; perhaps "
1195 "it should be declared %<noexcept%>", fn
);
1199 /* Check any functions that weren't defined earlier when they caused a
1200 noexcept expression to evaluate to false. */
1203 perform_deferred_noexcept_checks (void)
1206 pending_noexcept
*p
;
1207 location_t saved_loc
= input_location
;
1208 FOR_EACH_VEC_SAFE_ELT (pending_noexcept_checks
, i
, p
)
1210 input_location
= p
->loc
;
1211 maybe_noexcept_warning (p
->fn
);
1213 input_location
= saved_loc
;
1216 /* Evaluate noexcept ( EXPR ). */
1219 finish_noexcept_expr (tree expr
, tsubst_flags_t complain
)
1221 if (expr
== error_mark_node
)
1222 return error_mark_node
;
1224 if (processing_template_decl
)
1225 return build_min (NOEXCEPT_EXPR
, boolean_type_node
, expr
);
1227 return (expr_noexcept_p (expr
, complain
)
1228 ? boolean_true_node
: boolean_false_node
);
1231 /* Returns whether EXPR is noexcept, possibly warning if allowed by
1235 expr_noexcept_p (tree expr
, tsubst_flags_t complain
)
1239 if (expr
== error_mark_node
)
1242 fn
= cp_walk_tree_without_duplicates (&expr
, check_noexcept_r
, 0);
1245 if ((complain
& tf_warning
) && warn_noexcept
1246 && TREE_CODE (fn
) == FUNCTION_DECL
)
1248 if (!DECL_INITIAL (fn
))
1250 /* Not defined yet; check again at EOF. */
1251 pending_noexcept p
= {fn
, input_location
};
1252 vec_safe_push (pending_noexcept_checks
, p
);
1255 maybe_noexcept_warning (fn
);
1263 /* Return true iff SPEC is throw() or noexcept(true). */
1266 nothrow_spec_p (const_tree spec
)
1268 gcc_assert (!DEFERRED_NOEXCEPT_SPEC_P (spec
));
1269 if (spec
== NULL_TREE
1270 || TREE_VALUE (spec
) != NULL_TREE
1271 || spec
== noexcept_false_spec
)
1273 if (TREE_PURPOSE (spec
) == NULL_TREE
1274 || spec
== noexcept_true_spec
)
1276 gcc_assert (processing_template_decl
1277 || TREE_PURPOSE (spec
) == error_mark_node
);
1281 /* For FUNCTION_TYPE or METHOD_TYPE, true if NODE is noexcept. This is the
1282 case for things declared noexcept(true) and, with -fnothrow-opt, for
1283 throw() functions. */
1286 type_noexcept_p (const_tree type
)
1288 tree spec
= TYPE_RAISES_EXCEPTIONS (type
);
1289 gcc_assert (!DEFERRED_NOEXCEPT_SPEC_P (spec
));
1290 if (flag_nothrow_opt
)
1291 return nothrow_spec_p (spec
);
1293 return spec
== noexcept_true_spec
;
1296 /* For FUNCTION_TYPE or METHOD_TYPE, true if NODE can throw any type,
1297 i.e. no exception-specification or noexcept(false). */
1300 type_throw_all_p (const_tree type
)
1302 tree spec
= TYPE_RAISES_EXCEPTIONS (type
);
1303 gcc_assert (!DEFERRED_NOEXCEPT_SPEC_P (spec
));
1304 return spec
== NULL_TREE
|| spec
== noexcept_false_spec
;
1307 /* Create a representation of the noexcept-specification with
1308 constant-expression of EXPR. COMPLAIN is as for tsubst. */
1311 build_noexcept_spec (tree expr
, int complain
)
1313 /* This isn't part of the signature, so don't bother trying to evaluate
1314 it until instantiation. */
1315 if (!processing_template_decl
&& TREE_CODE (expr
) != DEFERRED_NOEXCEPT
)
1317 expr
= perform_implicit_conversion_flags (boolean_type_node
, expr
,
1320 expr
= cxx_constant_value (expr
);
1322 if (TREE_CODE (expr
) == INTEGER_CST
)
1324 if (operand_equal_p (expr
, boolean_true_node
, 0))
1325 return noexcept_true_spec
;
1328 gcc_checking_assert (operand_equal_p (expr
, boolean_false_node
, 0));
1329 return noexcept_false_spec
;
1332 else if (expr
== error_mark_node
)
1333 return error_mark_node
;
1336 gcc_assert (processing_template_decl
1337 || TREE_CODE (expr
) == DEFERRED_NOEXCEPT
);
1338 return build_tree_list (expr
, NULL_TREE
);
1342 #include "gt-cp-except.h"