Merged trunk at revision 161680 into branch.
[official-gcc.git] / gcc / cp / except.c
blob79bab76cc5a3a9df1e4767d7cb96b5bb7e31b552
1 /* Handle exceptional things in C++.
2 Copyright (C) 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
4 Free Software Foundation, Inc.
5 Contributed by Michael Tiemann <tiemann@cygnus.com>
6 Rewritten by Mike Stump <mrs@cygnus.com>, based upon an
7 initial re-implementation courtesy Tad Hunt.
9 This file is part of GCC.
11 GCC is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 3, or (at your option)
14 any later version.
16 GCC is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with GCC; see the file COPYING3. If not see
23 <http://www.gnu.org/licenses/>. */
26 #include "config.h"
27 #include "system.h"
28 #include "coretypes.h"
29 #include "tm.h"
30 #include "tree.h"
31 #include "cp-tree.h"
32 #include "flags.h"
33 #include "output.h"
34 #include "toplev.h"
35 #include "tree-inline.h"
36 #include "tree-iterator.h"
37 #include "target.h"
38 #include "gimple.h"
40 static void push_eh_cleanup (tree);
41 static tree prepare_eh_type (tree);
42 static tree do_begin_catch (void);
43 static int dtor_nothrow (tree);
44 static tree do_end_catch (tree);
45 static bool decl_is_java_type (tree decl, int err);
46 static void initialize_handler_parm (tree, tree);
47 static tree do_allocate_exception (tree);
48 static tree wrap_cleanups_r (tree *, int *, void *);
49 static int complete_ptr_ref_or_void_ptr_p (tree, tree);
50 static bool is_admissible_throw_operand (tree);
51 static int can_convert_eh (tree, tree);
53 /* Sets up all the global eh stuff that needs to be initialized at the
54 start of compilation. */
56 void
57 init_exception_processing (void)
59 tree tmp;
61 /* void std::terminate (); */
62 push_namespace (std_identifier);
63 tmp = build_function_type_list (void_type_node, NULL_TREE);
64 terminate_node = build_cp_library_fn_ptr ("terminate", tmp);
65 TREE_THIS_VOLATILE (terminate_node) = 1;
66 TREE_NOTHROW (terminate_node) = 1;
67 pop_namespace ();
69 /* void __cxa_call_unexpected(void *); */
70 tmp = build_function_type_list (void_type_node, ptr_type_node, NULL_TREE);
71 call_unexpected_node
72 = push_throw_library_fn (get_identifier ("__cxa_call_unexpected"), tmp);
75 /* Returns an expression to be executed if an unhandled exception is
76 propagated out of a cleanup region. */
78 tree
79 cp_protect_cleanup_actions (void)
81 /* [except.terminate]
83 When the destruction of an object during stack unwinding exits
84 using an exception ... void terminate(); is called. */
85 return terminate_node;
88 static tree
89 prepare_eh_type (tree type)
91 if (type == NULL_TREE)
92 return type;
93 if (type == error_mark_node)
94 return error_mark_node;
96 /* peel back references, so they match. */
97 type = non_reference (type);
99 /* Peel off cv qualifiers. */
100 type = TYPE_MAIN_VARIANT (type);
102 /* Functions and arrays decay to pointers. */
103 type = type_decays_to (type);
105 return type;
108 /* Return the type info for TYPE as used by EH machinery. */
109 tree
110 eh_type_info (tree type)
112 tree exp;
114 if (type == NULL_TREE || type == error_mark_node)
115 return type;
117 if (decl_is_java_type (type, 0))
118 exp = build_java_class_ref (TREE_TYPE (type));
119 else
120 exp = get_tinfo_decl (type);
122 return exp;
125 /* Build the address of a typeinfo decl for use in the runtime
126 matching field of the exception model. */
128 tree
129 build_eh_type_type (tree type)
131 tree exp = eh_type_info (type);
133 if (!exp)
134 return NULL;
136 mark_used (exp);
138 return convert (ptr_type_node, build_address (exp));
141 tree
142 build_exc_ptr (void)
144 return build_call_n (built_in_decls [BUILT_IN_EH_POINTER],
145 1, integer_zero_node);
148 /* Declare a function NAME, returning RETURN_TYPE, taking a single
149 parameter PARM_TYPE, with an empty exception specification.
151 Note that the C++ ABI document does not have a throw-specifier on
152 the routines declared below via this function. The declarations
153 are consistent with the actual implementations in libsupc++. */
155 static tree
156 declare_nothrow_library_fn (tree name, tree return_type, tree parm_type)
158 return push_library_fn (name, build_function_type_list (return_type,
159 parm_type,
160 NULL_TREE),
161 empty_except_spec);
164 /* Build up a call to __cxa_get_exception_ptr so that we can build a
165 copy constructor for the thrown object. */
167 static tree
168 do_get_exception_ptr (void)
170 tree fn;
172 fn = get_identifier ("__cxa_get_exception_ptr");
173 if (!get_global_value_if_present (fn, &fn))
175 /* Declare void* __cxa_get_exception_ptr (void *) throw(). */
176 fn = declare_nothrow_library_fn (fn, ptr_type_node, ptr_type_node);
179 return cp_build_function_call_nary (fn, tf_warning_or_error,
180 build_exc_ptr (), NULL_TREE);
183 /* Build up a call to __cxa_begin_catch, to tell the runtime that the
184 exception has been handled. */
186 static tree
187 do_begin_catch (void)
189 tree fn;
191 fn = get_identifier ("__cxa_begin_catch");
192 if (!get_global_value_if_present (fn, &fn))
194 /* Declare void* __cxa_begin_catch (void *) throw(). */
195 fn = declare_nothrow_library_fn (fn, ptr_type_node, ptr_type_node);
198 return cp_build_function_call_nary (fn, tf_warning_or_error,
199 build_exc_ptr (), NULL_TREE);
202 /* Returns nonzero if cleaning up an exception of type TYPE (which can be
203 NULL_TREE for a ... handler) will not throw an exception. */
205 static int
206 dtor_nothrow (tree type)
208 if (type == NULL_TREE || type == error_mark_node)
209 return 0;
211 if (TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
212 return 1;
214 if (CLASSTYPE_LAZY_DESTRUCTOR (type))
215 lazily_declare_fn (sfk_destructor, type);
217 return TREE_NOTHROW (CLASSTYPE_DESTRUCTORS (type));
220 /* Build up a call to __cxa_end_catch, to destroy the exception object
221 for the current catch block if no others are currently using it. */
223 static tree
224 do_end_catch (tree type)
226 tree fn, cleanup;
228 fn = get_identifier ("__cxa_end_catch");
229 if (!get_global_value_if_present (fn, &fn))
231 /* Declare void __cxa_end_catch (). */
232 fn = push_void_library_fn (fn, void_list_node);
233 /* This can throw if the destructor for the exception throws. */
234 TREE_NOTHROW (fn) = 0;
237 cleanup = cp_build_function_call_vec (fn, NULL, tf_warning_or_error);
238 TREE_NOTHROW (cleanup) = dtor_nothrow (type);
240 return cleanup;
243 /* This routine creates the cleanup for the current exception. */
245 static void
246 push_eh_cleanup (tree type)
248 finish_decl_cleanup (NULL_TREE, do_end_catch (type));
251 /* Return nonzero value if DECL is a Java type suitable for catch or
252 throw. */
254 static bool
255 decl_is_java_type (tree decl, int err)
257 bool r = (TREE_CODE (decl) == POINTER_TYPE
258 && TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE
259 && TYPE_FOR_JAVA (TREE_TYPE (decl)));
261 if (err)
263 if (TREE_CODE (decl) == REFERENCE_TYPE
264 && TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE
265 && TYPE_FOR_JAVA (TREE_TYPE (decl)))
267 /* Can't throw a reference. */
268 error ("type %qT is disallowed in Java %<throw%> or %<catch%>",
269 decl);
272 if (r)
274 tree jthrow_node
275 = IDENTIFIER_GLOBAL_VALUE (get_identifier ("jthrowable"));
277 if (jthrow_node == NULL_TREE)
278 fatal_error
279 ("call to Java %<catch%> or %<throw%> with %<jthrowable%> undefined");
281 jthrow_node = TREE_TYPE (TREE_TYPE (jthrow_node));
283 if (! DERIVED_FROM_P (jthrow_node, TREE_TYPE (decl)))
285 /* Thrown object must be a Throwable. */
286 error ("type %qT is not derived from %<java::lang::Throwable%>",
287 TREE_TYPE (decl));
292 return r;
295 /* Select the personality routine to be used for exception handling,
296 or issue an error if we need two different ones in the same
297 translation unit.
298 ??? At present eh_personality_decl is set to
299 __gxx_personality_(sj|v)0 in init_exception_processing - should it
300 be done here instead? */
301 void
302 choose_personality_routine (enum languages lang)
304 static enum {
305 chose_none,
306 chose_cpp,
307 chose_java,
308 gave_error
309 } state;
311 switch (state)
313 case gave_error:
314 return;
316 case chose_cpp:
317 if (lang != lang_cplusplus)
318 goto give_error;
319 return;
321 case chose_java:
322 if (lang != lang_java)
323 goto give_error;
324 return;
326 case chose_none:
327 ; /* Proceed to language selection. */
330 switch (lang)
332 case lang_cplusplus:
333 state = chose_cpp;
334 break;
336 case lang_java:
337 state = chose_java;
338 terminate_node = built_in_decls [BUILT_IN_ABORT];
339 pragma_java_exceptions = true;
340 break;
342 default:
343 gcc_unreachable ();
345 return;
347 give_error:
348 error ("mixing C++ and Java catches in a single translation unit");
349 state = gave_error;
352 /* Initialize the catch parameter DECL. */
354 static void
355 initialize_handler_parm (tree decl, tree exp)
357 tree init;
358 tree init_type;
360 /* Make sure we mark the catch param as used, otherwise we'll get a
361 warning about an unused ((anonymous)). */
362 TREE_USED (decl) = 1;
363 DECL_READ_P (decl) = 1;
365 /* Figure out the type that the initializer is. Pointers are returned
366 adjusted by value from __cxa_begin_catch. Others are returned by
367 reference. */
368 init_type = TREE_TYPE (decl);
369 if (!POINTER_TYPE_P (init_type))
370 init_type = build_reference_type (init_type);
372 choose_personality_routine (decl_is_java_type (init_type, 0)
373 ? lang_java : lang_cplusplus);
375 /* Since pointers are passed by value, initialize a reference to
376 pointer catch parm with the address of the temporary. */
377 if (TREE_CODE (init_type) == REFERENCE_TYPE
378 && TYPE_PTR_P (TREE_TYPE (init_type)))
379 exp = cp_build_unary_op (ADDR_EXPR, exp, 1, tf_warning_or_error);
381 exp = ocp_convert (init_type, exp, CONV_IMPLICIT|CONV_FORCE_TEMP, 0);
383 init = convert_from_reference (exp);
385 /* If the constructor for the catch parm exits via an exception, we
386 must call terminate. See eh23.C. */
387 if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
389 /* Generate the copy constructor call directly so we can wrap it.
390 See also expand_default_init. */
391 init = ocp_convert (TREE_TYPE (decl), init,
392 CONV_IMPLICIT|CONV_FORCE_TEMP, 0);
393 /* Force cleanups now to avoid nesting problems with the
394 MUST_NOT_THROW_EXPR. */
395 init = fold_build_cleanup_point_expr (TREE_TYPE (init), init);
396 init = build1 (MUST_NOT_THROW_EXPR, TREE_TYPE (init), init);
399 decl = pushdecl (decl);
401 start_decl_1 (decl, true);
402 cp_finish_decl (decl, init, /*init_const_expr_p=*/false, NULL_TREE,
403 LOOKUP_ONLYCONVERTING|DIRECT_BIND);
407 /* Routine to see if exception handling is turned on.
408 DO_WARN is nonzero if we want to inform the user that exception
409 handling is turned off.
411 This is used to ensure that -fexceptions has been specified if the
412 compiler tries to use any exception-specific functions. */
414 static inline int
415 doing_eh (void)
417 if (! flag_exceptions)
419 static int warned = 0;
420 if (! warned)
422 error ("exception handling disabled, use -fexceptions to enable");
423 warned = 1;
425 return 0;
427 return 1;
430 /* Call this to start a catch block. DECL is the catch parameter. */
432 tree
433 expand_start_catch_block (tree decl)
435 tree exp;
436 tree type, init;
438 if (! doing_eh ())
439 return NULL_TREE;
441 /* Make sure this declaration is reasonable. */
442 if (decl && !complete_ptr_ref_or_void_ptr_p (TREE_TYPE (decl), NULL_TREE))
443 decl = error_mark_node;
445 if (decl)
446 type = prepare_eh_type (TREE_TYPE (decl));
447 else
448 type = NULL_TREE;
450 if (decl && decl_is_java_type (type, 1))
452 /* Java only passes object via pointer and doesn't require
453 adjusting. The java object is immediately before the
454 generic exception header. */
455 exp = build_exc_ptr ();
456 exp = build1 (NOP_EXPR, build_pointer_type (type), exp);
457 exp = build2 (POINTER_PLUS_EXPR, TREE_TYPE (exp), exp,
458 fold_build1_loc (input_location,
459 NEGATE_EXPR, sizetype,
460 TYPE_SIZE_UNIT (TREE_TYPE (exp))));
461 exp = cp_build_indirect_ref (exp, RO_NULL, tf_warning_or_error);
462 initialize_handler_parm (decl, exp);
463 return type;
466 /* Call __cxa_end_catch at the end of processing the exception. */
467 push_eh_cleanup (type);
469 init = do_begin_catch ();
471 /* If there's no decl at all, then all we need to do is make sure
472 to tell the runtime that we've begun handling the exception. */
473 if (decl == NULL || decl == error_mark_node || init == error_mark_node)
474 finish_expr_stmt (init);
476 /* If the C++ object needs constructing, we need to do that before
477 calling __cxa_begin_catch, so that std::uncaught_exception gets
478 the right value during the copy constructor. */
479 else if (flag_use_cxa_get_exception_ptr
480 && TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
482 exp = do_get_exception_ptr ();
483 initialize_handler_parm (decl, exp);
484 finish_expr_stmt (init);
487 /* Otherwise the type uses a bitwise copy, and we don't have to worry
488 about the value of std::uncaught_exception and therefore can do the
489 copy with the return value of __cxa_end_catch instead. */
490 else
492 tree init_type = type;
494 /* Pointers are passed by values, everything else by reference. */
495 if (!TYPE_PTR_P (type))
496 init_type = build_pointer_type (type);
497 if (init_type != TREE_TYPE (init))
498 init = build1 (NOP_EXPR, init_type, init);
499 exp = create_temporary_var (init_type);
500 DECL_REGISTER (exp) = 1;
501 cp_finish_decl (exp, init, /*init_const_expr=*/false,
502 NULL_TREE, LOOKUP_ONLYCONVERTING);
503 initialize_handler_parm (decl, exp);
506 return type;
510 /* Call this to end a catch block. Its responsible for emitting the
511 code to handle jumping back to the correct place, and for emitting
512 the label to jump to if this catch block didn't match. */
514 void
515 expand_end_catch_block (void)
517 if (! doing_eh ())
518 return;
520 /* The exception being handled is rethrown if control reaches the end of
521 a handler of the function-try-block of a constructor or destructor. */
522 if (in_function_try_handler
523 && (DECL_CONSTRUCTOR_P (current_function_decl)
524 || DECL_DESTRUCTOR_P (current_function_decl)))
525 finish_expr_stmt (build_throw (NULL_TREE));
528 tree
529 begin_eh_spec_block (void)
531 tree r;
532 /* A noexcept specification (or throw() with -fnothrow-opt) is a
533 MUST_NOT_THROW_EXPR. */
534 if (TYPE_NOEXCEPT_P (TREE_TYPE (current_function_decl)))
536 r = build_stmt (input_location, MUST_NOT_THROW_EXPR, NULL_TREE);
537 TREE_SIDE_EFFECTS (r) = 1;
539 else
540 r = build_stmt (input_location, EH_SPEC_BLOCK, NULL_TREE, NULL_TREE);
541 add_stmt (r);
542 TREE_OPERAND (r, 0) = push_stmt_list ();
543 return r;
546 void
547 finish_eh_spec_block (tree raw_raises, tree eh_spec_block)
549 tree raises;
551 TREE_OPERAND (eh_spec_block, 0)
552 = pop_stmt_list (TREE_OPERAND (eh_spec_block, 0));
554 if (TREE_CODE (eh_spec_block) == MUST_NOT_THROW_EXPR)
555 return;
557 /* Strip cv quals, etc, from the specification types. */
558 for (raises = NULL_TREE;
559 raw_raises && TREE_VALUE (raw_raises);
560 raw_raises = TREE_CHAIN (raw_raises))
562 tree type = prepare_eh_type (TREE_VALUE (raw_raises));
563 tree tinfo = eh_type_info (type);
565 mark_used (tinfo);
566 raises = tree_cons (NULL_TREE, type, raises);
569 EH_SPEC_RAISES (eh_spec_block) = raises;
572 /* Return a pointer to a buffer for an exception object of type TYPE. */
574 static tree
575 do_allocate_exception (tree type)
577 tree fn;
579 fn = get_identifier ("__cxa_allocate_exception");
580 if (!get_global_value_if_present (fn, &fn))
582 /* Declare void *__cxa_allocate_exception(size_t) throw(). */
583 fn = declare_nothrow_library_fn (fn, ptr_type_node, size_type_node);
586 return cp_build_function_call_nary (fn, tf_warning_or_error,
587 size_in_bytes (type), NULL_TREE);
590 /* Call __cxa_free_exception from a cleanup. This is never invoked
591 directly, but see the comment for stabilize_throw_expr. */
593 static tree
594 do_free_exception (tree ptr)
596 tree fn;
598 fn = get_identifier ("__cxa_free_exception");
599 if (!get_global_value_if_present (fn, &fn))
601 /* Declare void __cxa_free_exception (void *) throw(). */
602 fn = declare_nothrow_library_fn (fn, void_type_node, ptr_type_node);
605 return cp_build_function_call_nary (fn, tf_warning_or_error, ptr, NULL_TREE);
608 /* Wrap all cleanups for TARGET_EXPRs in MUST_NOT_THROW_EXPR.
609 Called from build_throw via walk_tree_without_duplicates. */
611 static tree
612 wrap_cleanups_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
613 void *data ATTRIBUTE_UNUSED)
615 tree exp = *tp;
616 tree cleanup;
618 /* Don't walk into types. */
619 if (TYPE_P (exp))
621 *walk_subtrees = 0;
622 return NULL_TREE;
624 if (TREE_CODE (exp) != TARGET_EXPR)
625 return NULL_TREE;
627 cleanup = TARGET_EXPR_CLEANUP (exp);
628 if (cleanup)
630 cleanup = build1 (MUST_NOT_THROW_EXPR, void_type_node, cleanup);
631 TARGET_EXPR_CLEANUP (exp) = cleanup;
634 /* Keep iterating. */
635 return NULL_TREE;
638 /* Build a throw expression. */
640 tree
641 build_throw (tree exp)
643 tree fn;
645 if (exp == error_mark_node)
646 return exp;
648 if (processing_template_decl)
650 if (cfun)
651 current_function_returns_abnormally = 1;
652 return build_min (THROW_EXPR, void_type_node, exp);
655 if (exp == null_node)
656 warning (0, "throwing NULL, which has integral, not pointer type");
658 if (exp != NULL_TREE)
660 if (!is_admissible_throw_operand (exp))
661 return error_mark_node;
664 if (! doing_eh ())
665 return error_mark_node;
667 if (exp && decl_is_java_type (TREE_TYPE (exp), 1))
669 tree fn = get_identifier ("_Jv_Throw");
670 if (!get_global_value_if_present (fn, &fn))
672 /* Declare void _Jv_Throw (void *). */
673 tree tmp;
674 tmp = build_function_type_list (ptr_type_node,
675 ptr_type_node, NULL_TREE);
676 fn = push_throw_library_fn (fn, tmp);
678 else if (really_overloaded_fn (fn))
680 error ("%qD should never be overloaded", fn);
681 return error_mark_node;
683 fn = OVL_CURRENT (fn);
684 exp = cp_build_function_call_nary (fn, tf_warning_or_error,
685 exp, NULL_TREE);
687 else if (exp)
689 tree throw_type;
690 tree temp_type;
691 tree cleanup;
692 tree object, ptr;
693 tree tmp;
694 tree allocate_expr;
696 /* The CLEANUP_TYPE is the internal type of a destructor. */
697 if (!cleanup_type)
699 tmp = build_function_type_list (void_type_node,
700 ptr_type_node, NULL_TREE);
701 cleanup_type = build_pointer_type (tmp);
704 fn = get_identifier ("__cxa_throw");
705 if (!get_global_value_if_present (fn, &fn))
707 /* Declare void __cxa_throw (void*, void*, void (*)(void*)). */
708 /* ??? Second argument is supposed to be "std::type_info*". */
709 tmp = build_function_type_list (void_type_node,
710 ptr_type_node, ptr_type_node,
711 cleanup_type, NULL_TREE);
712 fn = push_throw_library_fn (fn, tmp);
715 /* [except.throw]
717 A throw-expression initializes a temporary object, the type
718 of which is determined by removing any top-level
719 cv-qualifiers from the static type of the operand of throw
720 and adjusting the type from "array of T" or "function return
721 T" to "pointer to T" or "pointer to function returning T"
722 respectively. */
723 temp_type = is_bitfield_expr_with_lowered_type (exp);
724 if (!temp_type)
725 temp_type = type_decays_to (TREE_TYPE (exp));
727 /* OK, this is kind of wacky. The standard says that we call
728 terminate when the exception handling mechanism, after
729 completing evaluation of the expression to be thrown but
730 before the exception is caught (_except.throw_), calls a
731 user function that exits via an uncaught exception.
733 So we have to protect the actual initialization of the
734 exception object with terminate(), but evaluate the
735 expression first. Since there could be temps in the
736 expression, we need to handle that, too. We also expand
737 the call to __cxa_allocate_exception first (which doesn't
738 matter, since it can't throw). */
740 /* Allocate the space for the exception. */
741 allocate_expr = do_allocate_exception (temp_type);
742 allocate_expr = get_target_expr (allocate_expr);
743 ptr = TARGET_EXPR_SLOT (allocate_expr);
744 TARGET_EXPR_CLEANUP (allocate_expr) = do_free_exception (ptr);
745 CLEANUP_EH_ONLY (allocate_expr) = 1;
747 object = build_nop (build_pointer_type (temp_type), ptr);
748 object = cp_build_indirect_ref (object, RO_NULL, tf_warning_or_error);
750 /* And initialize the exception object. */
751 if (CLASS_TYPE_P (temp_type))
753 int flags = LOOKUP_NORMAL | LOOKUP_ONLYCONVERTING;
754 VEC(tree,gc) *exp_vec;
756 /* Under C++0x [12.8/16 class.copy], a thrown lvalue is sometimes
757 treated as an rvalue for the purposes of overload resolution
758 to favor move constructors over copy constructors. */
759 if (/* Must be a local, automatic variable. */
760 TREE_CODE (exp) == VAR_DECL
761 && DECL_CONTEXT (exp) == current_function_decl
762 && ! TREE_STATIC (exp)
763 /* The variable must not have the `volatile' qualifier. */
764 && !(cp_type_quals (TREE_TYPE (exp)) & TYPE_QUAL_VOLATILE))
765 flags = flags | LOOKUP_PREFER_RVALUE;
767 /* Call the copy constructor. */
768 exp_vec = make_tree_vector_single (exp);
769 exp = (build_special_member_call
770 (object, complete_ctor_identifier, &exp_vec,
771 TREE_TYPE (object), flags, tf_warning_or_error));
772 release_tree_vector (exp_vec);
773 if (exp == error_mark_node)
775 error (" in thrown expression");
776 return error_mark_node;
779 else
781 tmp = decay_conversion (exp);
782 if (tmp == error_mark_node)
783 return error_mark_node;
784 exp = build2 (INIT_EXPR, temp_type, object, tmp);
787 /* Mark any cleanups from the initialization as MUST_NOT_THROW, since
788 they are run after the exception object is initialized. */
789 cp_walk_tree_without_duplicates (&exp, wrap_cleanups_r, 0);
791 /* Prepend the allocation. */
792 exp = build2 (COMPOUND_EXPR, TREE_TYPE (exp), allocate_expr, exp);
794 /* Force all the cleanups to be evaluated here so that we don't have
795 to do them during unwinding. */
796 exp = build1 (CLEANUP_POINT_EXPR, void_type_node, exp);
798 throw_type = build_eh_type_type (prepare_eh_type (TREE_TYPE (object)));
800 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (object)))
802 cleanup = lookup_fnfields (TYPE_BINFO (TREE_TYPE (object)),
803 complete_dtor_identifier, 0);
804 cleanup = BASELINK_FUNCTIONS (cleanup);
805 mark_used (cleanup);
806 cxx_mark_addressable (cleanup);
807 /* Pretend it's a normal function. */
808 cleanup = build1 (ADDR_EXPR, cleanup_type, cleanup);
810 else
811 cleanup = build_int_cst (cleanup_type, 0);
813 /* ??? Indicate that this function call throws throw_type. */
814 tmp = cp_build_function_call_nary (fn, tf_warning_or_error,
815 ptr, throw_type, cleanup, NULL_TREE);
817 /* Tack on the initialization stuff. */
818 exp = build2 (COMPOUND_EXPR, TREE_TYPE (tmp), exp, tmp);
820 else
822 /* Rethrow current exception. */
824 tree fn = get_identifier ("__cxa_rethrow");
825 if (!get_global_value_if_present (fn, &fn))
827 /* Declare void __cxa_rethrow (void). */
828 fn = push_throw_library_fn
829 (fn, build_function_type_list (void_type_node, NULL_TREE));
832 /* ??? Indicate that this function call allows exceptions of the type
833 of the enclosing catch block (if known). */
834 exp = cp_build_function_call_vec (fn, NULL, tf_warning_or_error);
837 exp = build1 (THROW_EXPR, void_type_node, exp);
839 return exp;
842 /* Make sure TYPE is complete, pointer to complete, reference to
843 complete, or pointer to cv void. Issue diagnostic on failure.
844 Return the zero on failure and nonzero on success. FROM can be
845 the expr or decl from whence TYPE came, if available. */
847 static int
848 complete_ptr_ref_or_void_ptr_p (tree type, tree from)
850 int is_ptr;
852 /* Check complete. */
853 type = complete_type_or_else (type, from);
854 if (!type)
855 return 0;
857 /* Or a pointer or ref to one, or cv void *. */
858 is_ptr = TREE_CODE (type) == POINTER_TYPE;
859 if (is_ptr || TREE_CODE (type) == REFERENCE_TYPE)
861 tree core = TREE_TYPE (type);
863 if (is_ptr && VOID_TYPE_P (core))
864 /* OK */;
865 else if (!complete_type_or_else (core, from))
866 return 0;
868 return 1;
871 /* Return truth-value if EXPRESSION is admissible in throw-expression,
872 i.e. if it is not of incomplete type or a pointer/reference to such
873 a type or of an abstract class type. */
875 static bool
876 is_admissible_throw_operand (tree expr)
878 tree type = TREE_TYPE (expr);
880 /* 15.1/4 [...] The type of the throw-expression shall not be an
881 incomplete type, or a pointer or a reference to an incomplete
882 type, other than void*, const void*, volatile void*, or
883 const volatile void*. Except for these restriction and the
884 restrictions on type matching mentioned in 15.3, the operand
885 of throw is treated exactly as a function argument in a call
886 (5.2.2) or the operand of a return statement. */
887 if (!complete_ptr_ref_or_void_ptr_p (type, expr))
888 return false;
890 /* 10.4/3 An abstract class shall not be used as a parameter type,
891 as a function return type or as type of an explicit
892 conversion. */
893 else if (CLASS_TYPE_P (type) && CLASSTYPE_PURE_VIRTUALS (type))
895 error ("expression %qE of abstract class type %qT cannot "
896 "be used in throw-expression", expr, type);
897 return false;
900 return true;
903 /* Returns nonzero if FN is a declaration of a standard C library
904 function which is known not to throw.
906 [lib.res.on.exception.handling]: None of the functions from the
907 Standard C library shall report an error by throwing an
908 exception, unless it calls a program-supplied function that
909 throws an exception. */
911 #include "cfns.h"
914 nothrow_libfn_p (const_tree fn)
916 tree id;
918 if (TREE_PUBLIC (fn)
919 && DECL_EXTERNAL (fn)
920 && DECL_NAMESPACE_SCOPE_P (fn)
921 && DECL_EXTERN_C_P (fn))
922 /* OK */;
923 else
924 /* Can't be a C library function. */
925 return 0;
927 /* Being a C library function, DECL_ASSEMBLER_NAME == DECL_NAME
928 unless the system headers are playing rename tricks, and if
929 they are, we don't want to be confused by them. */
930 id = DECL_NAME (fn);
931 return !!libc_name_p (IDENTIFIER_POINTER (id), IDENTIFIER_LENGTH (id));
934 /* Returns nonzero if an exception of type FROM will be caught by a
935 handler for type TO, as per [except.handle]. */
937 static int
938 can_convert_eh (tree to, tree from)
940 to = non_reference (to);
941 from = non_reference (from);
943 if (TREE_CODE (to) == POINTER_TYPE && TREE_CODE (from) == POINTER_TYPE)
945 to = TREE_TYPE (to);
946 from = TREE_TYPE (from);
948 if (! at_least_as_qualified_p (to, from))
949 return 0;
951 if (TREE_CODE (to) == VOID_TYPE)
952 return 1;
954 /* Else fall through. */
957 if (CLASS_TYPE_P (to) && CLASS_TYPE_P (from)
958 && PUBLICLY_UNIQUELY_DERIVED_P (to, from))
959 return 1;
961 return 0;
964 /* Check whether any of the handlers in I are shadowed by another handler
965 accepting TYPE. Note that the shadowing may not be complete; even if
966 an exception of type B would be caught by a handler for A, there could
967 be a derived class C for which A is an ambiguous base but B is not, so
968 the handler for B would catch an exception of type C. */
970 static void
971 check_handlers_1 (tree master, tree_stmt_iterator i)
973 tree type = TREE_TYPE (master);
975 for (; !tsi_end_p (i); tsi_next (&i))
977 tree handler = tsi_stmt (i);
978 if (TREE_TYPE (handler) && can_convert_eh (type, TREE_TYPE (handler)))
980 warning_at (EXPR_LOCATION (handler), 0,
981 "exception of type %qT will be caught",
982 TREE_TYPE (handler));
983 warning_at (EXPR_LOCATION (master), 0,
984 " by earlier handler for %qT", type);
985 break;
990 /* Given a STATEMENT_LIST of HANDLERs, make sure that they're OK. */
992 void
993 check_handlers (tree handlers)
995 tree_stmt_iterator i;
997 /* If we don't have a STATEMENT_LIST, then we've just got one
998 handler, and thus nothing to warn about. */
999 if (TREE_CODE (handlers) != STATEMENT_LIST)
1000 return;
1002 i = tsi_start (handlers);
1003 if (!tsi_end_p (i))
1004 while (1)
1006 tree handler = tsi_stmt (i);
1007 tsi_next (&i);
1009 /* No more handlers; nothing to shadow. */
1010 if (tsi_end_p (i))
1011 break;
1012 if (TREE_TYPE (handler) == NULL_TREE)
1013 permerror (EXPR_LOCATION (handler), "%<...%>"
1014 " handler must be the last handler for its try block");
1015 else
1016 check_handlers_1 (handler, i);
1020 /* walk_tree helper for finish_noexcept_expr. Returns non-null if the
1021 expression *TP causes the noexcept operator to evaluate to false.
1023 5.3.7 [expr.noexcept]: The result of the noexcept operator is false if
1024 in a potentially-evaluated context the expression would contain
1025 * a potentially evaluated call to a function, member function,
1026 function pointer, or member function pointer that does not have a
1027 non-throwing exception-specification (15.4),
1028 * a potentially evaluated throw-expression (15.1),
1029 * a potentially evaluated dynamic_cast expression dynamic_cast<T>(v),
1030 where T is a reference type, that requires a run-time check (5.2.7), or
1031 * a potentially evaluated typeid expression (5.2.8) applied to a glvalue
1032 expression whose type is a polymorphic class type (10.3). */
1034 static tree
1035 check_noexcept_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
1036 void *data ATTRIBUTE_UNUSED)
1038 tree t = *tp;
1039 enum tree_code code = TREE_CODE (t);
1040 if (code == CALL_EXPR
1041 || code == AGGR_INIT_EXPR)
1043 /* We can only use the exception specification of the called function
1044 for determining the value of a noexcept expression; we can't use
1045 TREE_NOTHROW, as it might have a different value in another
1046 translation unit, creating ODR problems.
1048 We could use TREE_NOTHROW (t) for !TREE_PUBLIC fns, though... */
1049 tree fn = (code == AGGR_INIT_EXPR
1050 ? AGGR_INIT_EXPR_FN (t) : CALL_EXPR_FN (t));
1051 tree type = TREE_TYPE (TREE_TYPE (fn));
1053 STRIP_NOPS (fn);
1054 if (TREE_CODE (fn) == ADDR_EXPR)
1056 /* We do use TREE_NOTHROW for ABI internals like __dynamic_cast,
1057 and for C library functions known not to throw. */
1058 fn = TREE_OPERAND (fn, 0);
1059 if (TREE_CODE (fn) == FUNCTION_DECL
1060 && DECL_EXTERN_C_P (fn)
1061 && (DECL_ARTIFICIAL (fn)
1062 || nothrow_libfn_p (fn)))
1063 return TREE_NOTHROW (fn) ? NULL_TREE : fn;
1065 if (!TYPE_NOTHROW_P (type))
1066 return fn;
1069 return NULL_TREE;
1072 /* Evaluate noexcept ( EXPR ). */
1074 tree
1075 finish_noexcept_expr (tree expr, tsubst_flags_t complain)
1077 tree fn;
1079 if (processing_template_decl)
1080 return build_min (NOEXCEPT_EXPR, boolean_type_node, expr);
1082 fn = cp_walk_tree_without_duplicates (&expr, check_noexcept_r, 0);
1083 if (fn)
1085 if ((complain & tf_warning) && TREE_CODE (fn) == FUNCTION_DECL
1086 && TREE_NOTHROW (fn) && !DECL_ARTIFICIAL (fn))
1088 warning (OPT_Wnoexcept, "noexcept-expression evaluates to %<false%> "
1089 "because of a call to %qD", fn);
1090 warning (OPT_Wnoexcept, "but %q+D does not throw; perhaps "
1091 "it should be declared %<noexcept%>", fn);
1093 return boolean_false_node;
1095 else
1096 return boolean_true_node;
1099 /* Return true iff SPEC is throw() or noexcept(true). */
1101 bool
1102 nothrow_spec_p (const_tree spec)
1104 if (spec == NULL_TREE
1105 || TREE_VALUE (spec) != NULL_TREE
1106 || spec == noexcept_false_spec)
1107 return false;
1108 if (TREE_PURPOSE (spec) == NULL_TREE
1109 || spec == noexcept_true_spec)
1110 return true;
1111 gcc_assert (processing_template_decl
1112 || TREE_PURPOSE (spec) == error_mark_node);
1113 return false;
1116 /* For FUNCTION_TYPE or METHOD_TYPE, true if NODE is noexcept. This is the
1117 case for things declared noexcept(true) and, with -fnothrow-opt, for
1118 throw() functions. */
1120 bool
1121 type_noexcept_p (const_tree type)
1123 tree spec = TYPE_RAISES_EXCEPTIONS (type);
1124 if (flag_nothrow_opt)
1125 return nothrow_spec_p (spec);
1126 else
1127 return spec == noexcept_true_spec;
1130 /* For FUNCTION_TYPE or METHOD_TYPE, true if NODE can throw any type,
1131 i.e. no exception-specification or noexcept(false). */
1133 bool
1134 type_throw_all_p (const_tree type)
1136 tree spec = TYPE_RAISES_EXCEPTIONS (type);
1137 return spec == NULL_TREE || spec == noexcept_false_spec;
1140 /* Create a representation of the noexcept-specification with
1141 constant-expression of EXPR. COMPLAIN is as for tsubst. */
1143 tree
1144 build_noexcept_spec (tree expr, int complain)
1146 expr = perform_implicit_conversion_flags (boolean_type_node, expr,
1147 complain,
1148 LOOKUP_NORMAL);
1149 if (expr == boolean_true_node)
1150 return noexcept_true_spec;
1151 else if (expr == boolean_false_node)
1152 return noexcept_false_spec;
1153 else
1155 gcc_assert (processing_template_decl || expr == error_mark_node);
1156 return build_tree_list (expr, NULL_TREE);