Reverting merge from trunk
[official-gcc.git] / gcc / cp / except.c
blobac2128d13b0711752ff347ce1983d7d71832fcbf
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)
12 any later version.
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/>. */
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "tm.h"
28 #include "tree.h"
29 #include "cp-tree.h"
30 #include "flags.h"
31 #include "tree-inline.h"
32 #include "tree-iterator.h"
33 #include "target.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. */
51 void
52 init_exception_processing (void)
54 tree tmp;
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;
63 pop_namespace ();
65 /* void __cxa_call_unexpected(void *); */
66 tmp = build_function_type_list (void_type_node, ptr_type_node, NULL_TREE);
67 call_unexpected_node
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. */
74 tree
75 cp_protect_cleanup_actions (void)
77 /* [except.terminate]
79 When the destruction of an object during stack unwinding exits
80 using an exception ... void terminate(); is called. */
81 return terminate_node;
84 static tree
85 prepare_eh_type (tree type)
87 if (type == NULL_TREE)
88 return type;
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);
101 return type;
104 /* Return the type info for TYPE as used by EH machinery. */
105 tree
106 eh_type_info (tree type)
108 tree exp;
110 if (type == NULL_TREE || type == error_mark_node)
111 return type;
113 if (decl_is_java_type (type, 0))
114 exp = build_java_class_ref (TREE_TYPE (type));
115 else
116 exp = get_tinfo_decl (type);
118 return exp;
121 /* Build the address of a typeinfo decl for use in the runtime
122 matching field of the exception model. */
124 tree
125 build_eh_type_type (tree type)
127 tree exp = eh_type_info (type);
129 if (!exp)
130 return NULL;
132 mark_used (exp);
134 return convert (ptr_type_node, build_address (exp));
137 tree
138 build_exc_ptr (void)
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++. */
151 static tree
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,
155 parm_type,
156 NULL_TREE),
157 empty_except_spec,
158 ecf_flags);
161 /* Build up a call to __cxa_get_exception_ptr so that we can build a
162 copy constructor for the thrown object. */
164 static tree
165 do_get_exception_ptr (void)
167 tree fn;
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. */
184 static tree
185 do_begin_catch (void)
187 tree fn;
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. */
196 if (flag_tm)
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. */
213 static int
214 dtor_nothrow (tree type)
216 if (type == NULL_TREE || type == error_mark_node)
217 return 0;
219 if (TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
220 return 1;
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. */
231 static tree
232 do_end_catch (tree type)
234 tree fn, cleanup;
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. */
244 if (flag_tm)
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);
256 return cleanup;
259 /* This routine creates the cleanup for the current exception. */
261 static void
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
268 throw. */
270 static bool
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)));
277 if (err)
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%>",
285 decl);
288 if (r)
290 tree jthrow_node
291 = IDENTIFIER_GLOBAL_VALUE (get_identifier ("jthrowable"));
293 if (jthrow_node == NULL_TREE)
294 fatal_error
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%>",
303 TREE_TYPE (decl));
308 return r;
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
313 translation unit.
314 ??? At present DECL_FUNCTION_PERSONALITY is set via
315 LANG_HOOKS_EH_PERSONALITY. Should it be done here instead? */
316 void
317 choose_personality_routine (enum languages lang)
319 static enum {
320 chose_none,
321 chose_cpp,
322 chose_java,
323 gave_error
324 } state;
326 switch (state)
328 case gave_error:
329 return;
331 case chose_cpp:
332 if (lang != lang_cplusplus)
333 goto give_error;
334 return;
336 case chose_java:
337 if (lang != lang_java)
338 goto give_error;
339 return;
341 case chose_none:
342 ; /* Proceed to language selection. */
345 switch (lang)
347 case lang_cplusplus:
348 state = chose_cpp;
349 break;
351 case lang_java:
352 state = chose_java;
353 terminate_node = builtin_decl_explicit (BUILT_IN_ABORT);
354 pragma_java_exceptions = true;
355 break;
357 default:
358 gcc_unreachable ();
360 return;
362 give_error:
363 error ("mixing C++ and Java catches in a single translation unit");
364 state = gave_error;
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'. */
371 tree
372 build_must_not_throw_expr (tree body, tree cond)
374 tree type = body ? TREE_TYPE (body) : void_type_node;
376 if (!flag_exceptions)
377 return body;
379 if (cond && !value_dependent_expression_p (cond))
381 cond = cxx_constant_value (cond);
382 if (integer_zerop (cond))
383 return body;
384 else if (integer_onep (cond))
385 cond = NULL_TREE;
388 return build2 (MUST_NOT_THROW_EXPR, type, body, cond);
392 /* Initialize the catch parameter DECL. */
394 static void
395 initialize_handler_parm (tree decl, tree exp)
397 tree init;
398 tree init_type;
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
407 reference. */
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. */
456 static inline int
457 doing_eh (void)
459 if (! flag_exceptions)
461 static int warned = 0;
462 if (! warned)
464 error ("exception handling disabled, use -fexceptions to enable");
465 warned = 1;
467 return 0;
469 return 1;
472 /* Call this to start a catch block. DECL is the catch parameter. */
474 tree
475 expand_start_catch_block (tree decl)
477 tree exp;
478 tree type, init;
480 if (! doing_eh ())
481 return NULL_TREE;
483 if (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));
491 else
492 type = NULL_TREE;
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);
507 return type;
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. */
534 else
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);
550 return type;
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. */
558 void
559 expand_end_catch_block (void)
561 if (! doing_eh ())
562 return;
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));
572 tree
573 begin_eh_spec_block (void)
575 tree r;
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;
586 else
587 r = build_stmt (spec_location, EH_SPEC_BLOCK, NULL_TREE, NULL_TREE);
588 add_stmt (r);
589 TREE_OPERAND (r, 0) = push_stmt_list ();
590 return r;
593 void
594 finish_eh_spec_block (tree raw_raises, tree eh_spec_block)
596 tree raises;
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)
602 return;
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);
612 mark_used (tinfo);
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. */
621 static tree
622 do_allocate_exception (tree type)
624 tree fn;
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);
633 if (flag_tm)
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,
638 size_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. */
651 static tree
652 do_free_exception (tree ptr)
654 tree fn;
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. */
670 static tree
671 wrap_cleanups_r (tree *tp, int *walk_subtrees, void * /*data*/)
673 tree exp = *tp;
674 tree cleanup;
676 /* Don't walk into types. */
677 if (TYPE_P (exp))
679 *walk_subtrees = 0;
680 return NULL_TREE;
682 if (TREE_CODE (exp) != TARGET_EXPR)
683 return NULL_TREE;
685 cleanup = TARGET_EXPR_CLEANUP (exp);
686 if (cleanup)
688 cleanup = build2 (MUST_NOT_THROW_EXPR, void_type_node, cleanup,
689 NULL_TREE);
690 TARGET_EXPR_CLEANUP (exp) = cleanup;
693 /* Keep iterating. */
694 return NULL_TREE;
697 /* Build a throw expression. */
699 tree
700 build_throw (tree exp)
702 tree fn;
704 if (exp == error_mark_node)
705 return exp;
707 if (processing_template_decl)
709 if (cfun)
710 current_function_returns_abnormally = 1;
711 exp = build_min (THROW_EXPR, void_type_node, exp);
712 SET_EXPR_LOCATION (exp, input_location);
713 return exp;
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;
725 if (! doing_eh ())
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 *). */
734 tree tmp;
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,
746 exp, NULL_TREE);
748 else if (exp)
750 tree throw_type;
751 tree temp_type;
752 tree cleanup;
753 tree object, ptr;
754 tree tmp;
755 tree allocate_expr;
757 /* The CLEANUP_TYPE is the internal type of a destructor. */
758 if (!cleanup_type)
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);
775 if (flag_tm)
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);
785 /* [except.throw]
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"
792 respectively. */
793 temp_type = is_bitfield_expr_with_lowered_type (exp);
794 if (!temp_type)
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. */
830 VAR_P (exp)
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;
849 else
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)));
870 cleanup = NULL_TREE;
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);
876 mark_used (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);
894 else
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));
906 if (flag_tm)
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);
917 return exp;
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. */
925 static int
926 complete_ptr_ref_or_void_ptr_p (tree type, tree from)
928 int is_ptr;
930 /* Check complete. */
931 type = complete_type_or_else (type, from);
932 if (!type)
933 return 0;
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))
942 /* OK */;
943 else if (!complete_type_or_else (core, from))
944 return 0;
946 return 1;
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. */
955 static bool
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
963 type. */
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))
973 return false;
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
977 conversion. */
978 else if (abstract_virtuals_error (is_throw ? ACU_THROW : ACU_CATCH, type))
979 return false;
980 else if (!is_throw
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);
986 return false;
988 else if (variably_modified_type_p (type, NULL_TREE))
990 if (is_throw)
991 error ("cannot throw expression of type %qT because it involves "
992 "types of variable size", type);
993 else
994 error ("cannot catch type %qT because it involves types of "
995 "variable size", type);
996 return false;
999 return true;
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. */
1010 #include "cfns.h"
1013 nothrow_libfn_p (const_tree fn)
1015 tree id;
1017 if (TREE_PUBLIC (fn)
1018 && DECL_EXTERNAL (fn)
1019 && DECL_NAMESPACE_SCOPE_P (fn)
1020 && DECL_EXTERN_C_P (fn))
1021 /* OK */;
1022 else
1023 /* Can't be a C library function. */
1024 return 0;
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]. */
1036 static int
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))
1048 return 0;
1050 if (VOID_TYPE_P (to))
1051 return 1;
1053 /* Else fall through. */
1056 if (CLASS_TYPE_P (to) && CLASS_TYPE_P (from)
1057 && publicly_uniquely_derived_p (to, from))
1058 return 1;
1060 return 0;
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. */
1069 static void
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);
1084 break;
1089 /* Given a STATEMENT_LIST of HANDLERs, make sure that they're OK. */
1091 void
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)
1099 return;
1101 i = tsi_start (handlers);
1102 if (!tsi_end_p (i))
1103 while (1)
1105 tree handler = tsi_stmt (i);
1106 tsi_next (&i);
1108 /* No more handlers; nothing to shadow. */
1109 if (tsi_end_p (i))
1110 break;
1111 if (TREE_TYPE (handler) == NULL_TREE)
1112 permerror (EXPR_LOCATION (handler), "%<...%>"
1113 " handler must be the last handler for its try block");
1114 else
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). */
1133 static tree
1134 check_noexcept_r (tree *tp, int * /*walk_subtrees*/, void * /*data*/)
1136 tree t = *tp;
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));
1151 STRIP_NOPS (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))
1166 return NULL_TREE;
1168 if (!TYPE_NOTHROW_P (type))
1169 return fn;
1172 return NULL_TREE;
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 {
1179 tree fn;
1180 location_t loc;
1181 } 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
1185 it can't throw. */
1187 static void
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. */
1202 void
1203 perform_deferred_noexcept_checks (void)
1205 int i;
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 ). */
1218 tree
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
1232 COMPLAIN. */
1234 bool
1235 expr_noexcept_p (tree expr, tsubst_flags_t complain)
1237 tree fn;
1239 if (expr == error_mark_node)
1240 return false;
1242 fn = cp_walk_tree_without_duplicates (&expr, check_noexcept_r, 0);
1243 if (fn)
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);
1254 else
1255 maybe_noexcept_warning (fn);
1257 return false;
1259 else
1260 return true;
1263 /* Return true iff SPEC is throw() or noexcept(true). */
1265 bool
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)
1272 return false;
1273 if (TREE_PURPOSE (spec) == NULL_TREE
1274 || spec == noexcept_true_spec)
1275 return true;
1276 gcc_assert (processing_template_decl
1277 || TREE_PURPOSE (spec) == error_mark_node);
1278 return false;
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. */
1285 bool
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);
1292 else
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). */
1299 bool
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. */
1310 tree
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,
1318 complain,
1319 LOOKUP_NORMAL);
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;
1326 else
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;
1334 else
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"