2015-09-25 Vladimir Makarov <vmakarov@redhat.com>
[official-gcc.git] / gcc / cp / except.c
blobd2d1531e4c2ce6e5831e15325a2098e9a175c026
1 /* Handle exceptional things in C++.
2 Copyright (C) 1989-2015 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 "alias.h"
29 #include "tree.h"
30 #include "stringpool.h"
31 #include "trans-mem.h"
32 #include "attribs.h"
33 #include "cp-tree.h"
34 #include "flags.h"
35 #include "tree-inline.h"
36 #include "tree-iterator.h"
37 #include "target.h"
39 static void push_eh_cleanup (tree);
40 static tree prepare_eh_type (tree);
41 static tree do_begin_catch (void);
42 static int dtor_nothrow (tree);
43 static tree do_end_catch (tree);
44 static bool decl_is_java_type (tree decl, int err);
45 static void initialize_handler_parm (tree, tree);
46 static tree do_allocate_exception (tree);
47 static tree wrap_cleanups_r (tree *, int *, void *);
48 static int complete_ptr_ref_or_void_ptr_p (tree, tree);
49 static bool is_admissible_throw_operand_or_catch_parameter (tree, bool);
50 static int can_convert_eh (tree, tree);
52 /* Sets up all the global eh stuff that needs to be initialized at the
53 start of compilation. */
55 void
56 init_exception_processing (void)
58 tree tmp;
60 /* void std::terminate (); */
61 push_namespace (std_identifier);
62 tmp = build_function_type_list (void_type_node, NULL_TREE);
63 terminate_node = build_cp_library_fn_ptr ("terminate", tmp,
64 ECF_NOTHROW | ECF_NORETURN);
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 (builtin_decl_explicit (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_library_fn (tree name, tree return_type, tree parm_type, int ecf_flags)
158 return push_library_fn (name, build_function_type_list (return_type,
159 parm_type,
160 NULL_TREE),
161 empty_except_spec,
162 ecf_flags);
165 /* Build up a call to __cxa_get_exception_ptr so that we can build a
166 copy constructor for the thrown object. */
168 static tree
169 do_get_exception_ptr (void)
171 tree fn;
173 fn = get_identifier ("__cxa_get_exception_ptr");
174 if (!get_global_value_if_present (fn, &fn))
176 /* Declare void* __cxa_get_exception_ptr (void *) throw(). */
177 fn = declare_library_fn (fn, ptr_type_node, ptr_type_node,
178 ECF_NOTHROW | ECF_PURE | ECF_LEAF | ECF_TM_PURE);
181 return cp_build_function_call_nary (fn, tf_warning_or_error,
182 build_exc_ptr (), NULL_TREE);
185 /* Build up a call to __cxa_begin_catch, to tell the runtime that the
186 exception has been handled. */
188 static tree
189 do_begin_catch (void)
191 tree fn;
193 fn = get_identifier ("__cxa_begin_catch");
194 if (!get_global_value_if_present (fn, &fn))
196 /* Declare void* __cxa_begin_catch (void *) throw(). */
197 fn = declare_library_fn (fn, ptr_type_node, ptr_type_node, ECF_NOTHROW);
199 /* Create its transactional-memory equivalent. */
200 if (flag_tm)
202 tree fn2 = get_identifier ("_ITM_cxa_begin_catch");
203 if (!get_global_value_if_present (fn2, &fn2))
204 fn2 = declare_library_fn (fn2, ptr_type_node,
205 ptr_type_node, ECF_NOTHROW | ECF_TM_PURE);
206 record_tm_replacement (fn, fn2);
210 return cp_build_function_call_nary (fn, tf_warning_or_error,
211 build_exc_ptr (), NULL_TREE);
214 /* Returns nonzero if cleaning up an exception of type TYPE (which can be
215 NULL_TREE for a ... handler) will not throw an exception. */
217 static int
218 dtor_nothrow (tree type)
220 if (type == NULL_TREE || type == error_mark_node)
221 return 0;
223 if (TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
224 return 1;
226 if (CLASSTYPE_LAZY_DESTRUCTOR (type))
227 lazily_declare_fn (sfk_destructor, type);
229 return TREE_NOTHROW (CLASSTYPE_DESTRUCTORS (type));
232 /* Build up a call to __cxa_end_catch, to destroy the exception object
233 for the current catch block if no others are currently using it. */
235 static tree
236 do_end_catch (tree type)
238 tree fn, cleanup;
240 fn = get_identifier ("__cxa_end_catch");
241 if (!get_global_value_if_present (fn, &fn))
243 /* Declare void __cxa_end_catch ().
244 This can throw if the destructor for the exception throws. */
245 fn = push_void_library_fn (fn, void_list_node, 0);
247 /* Create its transactional-memory equivalent. */
248 if (flag_tm)
250 tree fn2 = get_identifier ("_ITM_cxa_end_catch");
251 if (!get_global_value_if_present (fn2, &fn2))
252 fn2 = push_void_library_fn (fn2, void_list_node, ECF_TM_PURE);
253 record_tm_replacement (fn, fn2);
257 cleanup = cp_build_function_call_vec (fn, NULL, tf_warning_or_error);
258 TREE_NOTHROW (cleanup) = dtor_nothrow (type);
260 return cleanup;
263 /* This routine creates the cleanup for the current exception. */
265 static void
266 push_eh_cleanup (tree type)
268 finish_decl_cleanup (NULL_TREE, do_end_catch (type));
271 /* Return nonzero value if DECL is a Java type suitable for catch or
272 throw. */
274 static bool
275 decl_is_java_type (tree decl, int err)
277 bool r = (TYPE_PTR_P (decl)
278 && TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE
279 && TYPE_FOR_JAVA (TREE_TYPE (decl)));
281 if (err)
283 if (TREE_CODE (decl) == REFERENCE_TYPE
284 && TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE
285 && TYPE_FOR_JAVA (TREE_TYPE (decl)))
287 /* Can't throw a reference. */
288 error ("type %qT is disallowed in Java %<throw%> or %<catch%>",
289 decl);
292 if (r)
294 tree jthrow_node
295 = IDENTIFIER_GLOBAL_VALUE (get_identifier ("jthrowable"));
297 if (jthrow_node == NULL_TREE)
298 fatal_error
299 (input_location,
300 "call to Java %<catch%> or %<throw%> with %<jthrowable%> undefined");
302 jthrow_node = TREE_TYPE (TREE_TYPE (jthrow_node));
304 if (! DERIVED_FROM_P (jthrow_node, TREE_TYPE (decl)))
306 /* Thrown object must be a Throwable. */
307 error ("type %qT is not derived from %<java::lang::Throwable%>",
308 TREE_TYPE (decl));
313 return r;
316 /* Select the personality routine to be used for exception handling,
317 or issue an error if we need two different ones in the same
318 translation unit.
319 ??? At present DECL_FUNCTION_PERSONALITY is set via
320 LANG_HOOKS_EH_PERSONALITY. Should it be done here instead? */
321 void
322 choose_personality_routine (enum languages lang)
324 static enum {
325 chose_none,
326 chose_cpp,
327 chose_java,
328 gave_error
329 } state;
331 switch (state)
333 case gave_error:
334 return;
336 case chose_cpp:
337 if (lang != lang_cplusplus)
338 goto give_error;
339 return;
341 case chose_java:
342 if (lang != lang_java)
343 goto give_error;
344 return;
346 case chose_none:
347 ; /* Proceed to language selection. */
350 switch (lang)
352 case lang_cplusplus:
353 state = chose_cpp;
354 break;
356 case lang_java:
357 state = chose_java;
358 terminate_node = builtin_decl_explicit (BUILT_IN_ABORT);
359 pragma_java_exceptions = true;
360 break;
362 default:
363 gcc_unreachable ();
365 return;
367 give_error:
368 error ("mixing C++ and Java catches in a single translation unit");
369 state = gave_error;
372 /* Wrap EXPR in a MUST_NOT_THROW_EXPR expressing that EXPR must
373 not throw any exceptions if COND is true. A condition of
374 NULL_TREE is treated as 'true'. */
376 tree
377 build_must_not_throw_expr (tree body, tree cond)
379 tree type = body ? TREE_TYPE (body) : void_type_node;
381 if (!flag_exceptions)
382 return body;
384 if (cond && !value_dependent_expression_p (cond))
386 cond = cxx_constant_value (cond);
387 if (integer_zerop (cond))
388 return body;
389 else if (integer_onep (cond))
390 cond = NULL_TREE;
393 return build2 (MUST_NOT_THROW_EXPR, type, body, cond);
397 /* Initialize the catch parameter DECL. */
399 static void
400 initialize_handler_parm (tree decl, tree exp)
402 tree init;
403 tree init_type;
405 /* Make sure we mark the catch param as used, otherwise we'll get a
406 warning about an unused ((anonymous)). */
407 TREE_USED (decl) = 1;
408 DECL_READ_P (decl) = 1;
410 /* Figure out the type that the initializer is. Pointers are returned
411 adjusted by value from __cxa_begin_catch. Others are returned by
412 reference. */
413 init_type = TREE_TYPE (decl);
414 if (!POINTER_TYPE_P (init_type))
415 init_type = build_reference_type (init_type);
417 choose_personality_routine (decl_is_java_type (init_type, 0)
418 ? lang_java : lang_cplusplus);
420 /* Since pointers are passed by value, initialize a reference to
421 pointer catch parm with the address of the temporary. */
422 if (TREE_CODE (init_type) == REFERENCE_TYPE
423 && TYPE_PTR_P (TREE_TYPE (init_type)))
424 exp = cp_build_addr_expr (exp, tf_warning_or_error);
426 exp = ocp_convert (init_type, exp, CONV_IMPLICIT|CONV_FORCE_TEMP, 0,
427 tf_warning_or_error);
429 init = convert_from_reference (exp);
431 /* If the constructor for the catch parm exits via an exception, we
432 must call terminate. See eh23.C. */
433 if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
435 /* Generate the copy constructor call directly so we can wrap it.
436 See also expand_default_init. */
437 init = ocp_convert (TREE_TYPE (decl), init,
438 CONV_IMPLICIT|CONV_FORCE_TEMP, 0,
439 tf_warning_or_error);
440 /* Force cleanups now to avoid nesting problems with the
441 MUST_NOT_THROW_EXPR. */
442 init = fold_build_cleanup_point_expr (TREE_TYPE (init), init);
443 init = build_must_not_throw_expr (init, NULL_TREE);
446 decl = pushdecl (decl);
448 start_decl_1 (decl, true);
449 cp_finish_decl (decl, init, /*init_const_expr_p=*/false, NULL_TREE,
450 LOOKUP_ONLYCONVERTING|DIRECT_BIND);
454 /* Routine to see if exception handling is turned on.
455 DO_WARN is nonzero if we want to inform the user that exception
456 handling is turned off.
458 This is used to ensure that -fexceptions has been specified if the
459 compiler tries to use any exception-specific functions. */
461 static inline int
462 doing_eh (void)
464 if (! flag_exceptions)
466 static int warned = 0;
467 if (! warned)
469 error ("exception handling disabled, use -fexceptions to enable");
470 warned = 1;
472 return 0;
474 return 1;
477 /* Call this to start a catch block. DECL is the catch parameter. */
479 tree
480 expand_start_catch_block (tree decl)
482 tree exp;
483 tree type, init;
485 if (! doing_eh ())
486 return NULL_TREE;
488 if (decl)
490 if (!is_admissible_throw_operand_or_catch_parameter (decl, false))
491 decl = error_mark_node;
493 type = prepare_eh_type (TREE_TYPE (decl));
494 mark_used (eh_type_info (type));
496 else
497 type = NULL_TREE;
499 if (decl && decl_is_java_type (type, 1))
501 /* Java only passes object via pointer and doesn't require
502 adjusting. The java object is immediately before the
503 generic exception header. */
504 exp = build_exc_ptr ();
505 exp = build1 (NOP_EXPR, build_pointer_type (type), exp);
506 exp = fold_build_pointer_plus (exp,
507 fold_build1_loc (input_location,
508 NEGATE_EXPR, sizetype,
509 TYPE_SIZE_UNIT (TREE_TYPE (exp))));
510 exp = cp_build_indirect_ref (exp, RO_NULL, tf_warning_or_error);
511 initialize_handler_parm (decl, exp);
512 return type;
515 /* Call __cxa_end_catch at the end of processing the exception. */
516 push_eh_cleanup (type);
518 init = do_begin_catch ();
520 /* If there's no decl at all, then all we need to do is make sure
521 to tell the runtime that we've begun handling the exception. */
522 if (decl == NULL || decl == error_mark_node || init == error_mark_node)
523 finish_expr_stmt (init);
525 /* If the C++ object needs constructing, we need to do that before
526 calling __cxa_begin_catch, so that std::uncaught_exception gets
527 the right value during the copy constructor. */
528 else if (flag_use_cxa_get_exception_ptr
529 && TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
531 exp = do_get_exception_ptr ();
532 initialize_handler_parm (decl, exp);
533 finish_expr_stmt (init);
536 /* Otherwise the type uses a bitwise copy, and we don't have to worry
537 about the value of std::uncaught_exception and therefore can do the
538 copy with the return value of __cxa_end_catch instead. */
539 else
541 tree init_type = type;
543 /* Pointers are passed by values, everything else by reference. */
544 if (!TYPE_PTR_P (type))
545 init_type = build_pointer_type (type);
546 if (init_type != TREE_TYPE (init))
547 init = build1 (NOP_EXPR, init_type, init);
548 exp = create_temporary_var (init_type);
549 DECL_REGISTER (exp) = 1;
550 cp_finish_decl (exp, init, /*init_const_expr=*/false,
551 NULL_TREE, LOOKUP_ONLYCONVERTING);
552 initialize_handler_parm (decl, exp);
555 return type;
559 /* Call this to end a catch block. Its responsible for emitting the
560 code to handle jumping back to the correct place, and for emitting
561 the label to jump to if this catch block didn't match. */
563 void
564 expand_end_catch_block (void)
566 if (! doing_eh ())
567 return;
569 /* The exception being handled is rethrown if control reaches the end of
570 a handler of the function-try-block of a constructor or destructor. */
571 if (in_function_try_handler
572 && (DECL_CONSTRUCTOR_P (current_function_decl)
573 || DECL_DESTRUCTOR_P (current_function_decl)))
575 tree rethrow = build_throw (NULL_TREE);
576 TREE_NO_WARNING (rethrow) = true;
577 finish_expr_stmt (rethrow);
581 tree
582 begin_eh_spec_block (void)
584 tree r;
585 location_t spec_location = DECL_SOURCE_LOCATION (current_function_decl);
587 /* A noexcept specification (or throw() with -fnothrow-opt) is a
588 MUST_NOT_THROW_EXPR. */
589 if (TYPE_NOEXCEPT_P (TREE_TYPE (current_function_decl)))
591 r = build_stmt (spec_location, MUST_NOT_THROW_EXPR,
592 NULL_TREE, NULL_TREE);
593 TREE_SIDE_EFFECTS (r) = 1;
595 else
596 r = build_stmt (spec_location, EH_SPEC_BLOCK, NULL_TREE, NULL_TREE);
597 add_stmt (r);
598 TREE_OPERAND (r, 0) = push_stmt_list ();
599 return r;
602 void
603 finish_eh_spec_block (tree raw_raises, tree eh_spec_block)
605 tree raises;
607 TREE_OPERAND (eh_spec_block, 0)
608 = pop_stmt_list (TREE_OPERAND (eh_spec_block, 0));
610 if (TREE_CODE (eh_spec_block) == MUST_NOT_THROW_EXPR)
611 return;
613 /* Strip cv quals, etc, from the specification types. */
614 for (raises = NULL_TREE;
615 raw_raises && TREE_VALUE (raw_raises);
616 raw_raises = TREE_CHAIN (raw_raises))
618 tree type = prepare_eh_type (TREE_VALUE (raw_raises));
619 tree tinfo = eh_type_info (type);
621 mark_used (tinfo);
622 raises = tree_cons (NULL_TREE, type, raises);
625 EH_SPEC_RAISES (eh_spec_block) = raises;
628 /* Return a pointer to a buffer for an exception object of type TYPE. */
630 static tree
631 do_allocate_exception (tree type)
633 tree fn;
635 fn = get_identifier ("__cxa_allocate_exception");
636 if (!get_global_value_if_present (fn, &fn))
638 /* Declare void *__cxa_allocate_exception(size_t) throw(). */
639 fn = declare_library_fn (fn, ptr_type_node, size_type_node,
640 ECF_NOTHROW | ECF_MALLOC);
642 if (flag_tm)
644 tree fn2 = get_identifier ("_ITM_cxa_allocate_exception");
645 if (!get_global_value_if_present (fn2, &fn2))
646 fn2 = declare_library_fn (fn2, ptr_type_node,
647 size_type_node,
648 ECF_NOTHROW | ECF_MALLOC | ECF_TM_PURE);
649 record_tm_replacement (fn, fn2);
653 return cp_build_function_call_nary (fn, tf_warning_or_error,
654 size_in_bytes (type), NULL_TREE);
657 /* Call __cxa_free_exception from a cleanup. This is never invoked
658 directly, but see the comment for stabilize_throw_expr. */
660 static tree
661 do_free_exception (tree ptr)
663 tree fn;
665 fn = get_identifier ("__cxa_free_exception");
666 if (!get_global_value_if_present (fn, &fn))
668 /* Declare void __cxa_free_exception (void *) throw(). */
669 fn = declare_library_fn (fn, void_type_node, ptr_type_node,
670 ECF_NOTHROW | ECF_LEAF);
673 return cp_build_function_call_nary (fn, tf_warning_or_error, ptr, NULL_TREE);
676 /* Wrap all cleanups for TARGET_EXPRs in MUST_NOT_THROW_EXPR.
677 Called from build_throw via walk_tree_without_duplicates. */
679 static tree
680 wrap_cleanups_r (tree *tp, int *walk_subtrees, void * /*data*/)
682 tree exp = *tp;
683 tree cleanup;
685 /* Don't walk into types. */
686 if (TYPE_P (exp))
688 *walk_subtrees = 0;
689 return NULL_TREE;
691 if (TREE_CODE (exp) != TARGET_EXPR)
692 return NULL_TREE;
694 cleanup = TARGET_EXPR_CLEANUP (exp);
695 if (cleanup)
697 cleanup = build2 (MUST_NOT_THROW_EXPR, void_type_node, cleanup,
698 NULL_TREE);
699 TARGET_EXPR_CLEANUP (exp) = cleanup;
702 /* Keep iterating. */
703 return NULL_TREE;
706 /* Build a throw expression. */
708 tree
709 build_throw (tree exp)
711 tree fn;
713 if (exp == error_mark_node)
714 return exp;
716 if (processing_template_decl)
718 if (cfun)
719 current_function_returns_abnormally = 1;
720 exp = build_min (THROW_EXPR, void_type_node, exp);
721 SET_EXPR_LOCATION (exp, input_location);
722 return exp;
725 if (exp == null_node)
726 warning (0, "throwing NULL, which has integral, not pointer type");
728 if (exp != NULL_TREE)
730 if (!is_admissible_throw_operand_or_catch_parameter (exp, true))
731 return error_mark_node;
734 if (! doing_eh ())
735 return error_mark_node;
737 if (exp && decl_is_java_type (TREE_TYPE (exp), 1))
739 tree fn = get_identifier ("_Jv_Throw");
740 if (!get_global_value_if_present (fn, &fn))
742 /* Declare void _Jv_Throw (void *). */
743 tree tmp;
744 tmp = build_function_type_list (ptr_type_node,
745 ptr_type_node, NULL_TREE);
746 fn = push_throw_library_fn (fn, tmp);
748 else if (really_overloaded_fn (fn))
750 error ("%qD should never be overloaded", fn);
751 return error_mark_node;
753 fn = OVL_CURRENT (fn);
754 exp = cp_build_function_call_nary (fn, tf_warning_or_error,
755 exp, NULL_TREE);
757 else if (exp)
759 tree throw_type;
760 tree temp_type;
761 tree cleanup;
762 tree object, ptr;
763 tree tmp;
764 tree allocate_expr;
766 /* The CLEANUP_TYPE is the internal type of a destructor. */
767 if (!cleanup_type)
769 tmp = build_function_type_list (void_type_node,
770 ptr_type_node, NULL_TREE);
771 cleanup_type = build_pointer_type (tmp);
774 fn = get_identifier ("__cxa_throw");
775 if (!get_global_value_if_present (fn, &fn))
777 /* Declare void __cxa_throw (void*, void*, void (*)(void*)). */
778 /* ??? Second argument is supposed to be "std::type_info*". */
779 tmp = build_function_type_list (void_type_node,
780 ptr_type_node, ptr_type_node,
781 cleanup_type, NULL_TREE);
782 fn = push_throw_library_fn (fn, tmp);
784 if (flag_tm)
786 tree fn2 = get_identifier ("_ITM_cxa_throw");
787 if (!get_global_value_if_present (fn2, &fn2))
788 fn2 = push_throw_library_fn (fn2, tmp);
789 apply_tm_attr (fn2, get_identifier ("transaction_pure"));
790 record_tm_replacement (fn, fn2);
794 /* [except.throw]
796 A throw-expression initializes a temporary object, the type
797 of which is determined by removing any top-level
798 cv-qualifiers from the static type of the operand of throw
799 and adjusting the type from "array of T" or "function return
800 T" to "pointer to T" or "pointer to function returning T"
801 respectively. */
802 temp_type = is_bitfield_expr_with_lowered_type (exp);
803 if (!temp_type)
804 temp_type = cv_unqualified (type_decays_to (TREE_TYPE (exp)));
806 /* OK, this is kind of wacky. The standard says that we call
807 terminate when the exception handling mechanism, after
808 completing evaluation of the expression to be thrown but
809 before the exception is caught (_except.throw_), calls a
810 user function that exits via an uncaught exception.
812 So we have to protect the actual initialization of the
813 exception object with terminate(), but evaluate the
814 expression first. Since there could be temps in the
815 expression, we need to handle that, too. We also expand
816 the call to __cxa_allocate_exception first (which doesn't
817 matter, since it can't throw). */
819 /* Allocate the space for the exception. */
820 allocate_expr = do_allocate_exception (temp_type);
821 allocate_expr = get_target_expr (allocate_expr);
822 ptr = TARGET_EXPR_SLOT (allocate_expr);
823 TARGET_EXPR_CLEANUP (allocate_expr) = do_free_exception (ptr);
824 CLEANUP_EH_ONLY (allocate_expr) = 1;
826 object = build_nop (build_pointer_type (temp_type), ptr);
827 object = cp_build_indirect_ref (object, RO_NULL, tf_warning_or_error);
829 /* And initialize the exception object. */
830 if (CLASS_TYPE_P (temp_type))
832 int flags = LOOKUP_NORMAL | LOOKUP_ONLYCONVERTING;
833 vec<tree, va_gc> *exp_vec;
835 /* Under C++0x [12.8/16 class.copy], a thrown lvalue is sometimes
836 treated as an rvalue for the purposes of overload resolution
837 to favor move constructors over copy constructors. */
838 if (/* Must be a local, automatic variable. */
839 VAR_P (exp)
840 && DECL_CONTEXT (exp) == current_function_decl
841 && ! TREE_STATIC (exp)
842 /* The variable must not have the `volatile' qualifier. */
843 && !(cp_type_quals (TREE_TYPE (exp)) & TYPE_QUAL_VOLATILE))
844 flags = flags | LOOKUP_PREFER_RVALUE;
846 /* Call the copy constructor. */
847 exp_vec = make_tree_vector_single (exp);
848 exp = (build_special_member_call
849 (object, complete_ctor_identifier, &exp_vec,
850 TREE_TYPE (object), flags, tf_warning_or_error));
851 release_tree_vector (exp_vec);
852 if (exp == error_mark_node)
854 error (" in thrown expression");
855 return error_mark_node;
858 else
860 tmp = decay_conversion (exp, tf_warning_or_error);
861 if (tmp == error_mark_node)
862 return error_mark_node;
863 exp = build2 (INIT_EXPR, temp_type, object, tmp);
866 /* Mark any cleanups from the initialization as MUST_NOT_THROW, since
867 they are run after the exception object is initialized. */
868 cp_walk_tree_without_duplicates (&exp, wrap_cleanups_r, 0);
870 /* Prepend the allocation. */
871 exp = build2 (COMPOUND_EXPR, TREE_TYPE (exp), allocate_expr, exp);
873 /* Force all the cleanups to be evaluated here so that we don't have
874 to do them during unwinding. */
875 exp = build1 (CLEANUP_POINT_EXPR, void_type_node, exp);
877 throw_type = build_eh_type_type (prepare_eh_type (TREE_TYPE (object)));
879 cleanup = NULL_TREE;
880 if (type_build_dtor_call (TREE_TYPE (object)))
882 tree fn = lookup_fnfields (TYPE_BINFO (TREE_TYPE (object)),
883 complete_dtor_identifier, 0);
884 fn = BASELINK_FUNCTIONS (fn);
885 mark_used (fn);
886 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (object)))
888 cxx_mark_addressable (fn);
889 /* Pretend it's a normal function. */
890 cleanup = build1 (ADDR_EXPR, cleanup_type, fn);
893 if (cleanup == NULL_TREE)
894 cleanup = build_int_cst (cleanup_type, 0);
896 /* ??? Indicate that this function call throws throw_type. */
897 tmp = cp_build_function_call_nary (fn, tf_warning_or_error,
898 ptr, throw_type, cleanup, NULL_TREE);
900 /* Tack on the initialization stuff. */
901 exp = build2 (COMPOUND_EXPR, TREE_TYPE (tmp), exp, tmp);
903 else
905 /* Rethrow current exception. */
907 tree fn = get_identifier ("__cxa_rethrow");
908 if (!get_global_value_if_present (fn, &fn))
910 /* Declare void __cxa_rethrow (void). */
911 fn = push_throw_library_fn
912 (fn, build_function_type_list (void_type_node, NULL_TREE));
915 if (flag_tm)
916 apply_tm_attr (fn, get_identifier ("transaction_pure"));
918 /* ??? Indicate that this function call allows exceptions of the type
919 of the enclosing catch block (if known). */
920 exp = cp_build_function_call_vec (fn, NULL, tf_warning_or_error);
923 exp = build1 (THROW_EXPR, void_type_node, exp);
924 SET_EXPR_LOCATION (exp, input_location);
926 return exp;
929 /* Make sure TYPE is complete, pointer to complete, reference to
930 complete, or pointer to cv void. Issue diagnostic on failure.
931 Return the zero on failure and nonzero on success. FROM can be
932 the expr or decl from whence TYPE came, if available. */
934 static int
935 complete_ptr_ref_or_void_ptr_p (tree type, tree from)
937 int is_ptr;
939 /* Check complete. */
940 type = complete_type_or_else (type, from);
941 if (!type)
942 return 0;
944 /* Or a pointer or ref to one, or cv void *. */
945 is_ptr = TYPE_PTR_P (type);
946 if (is_ptr || TREE_CODE (type) == REFERENCE_TYPE)
948 tree core = TREE_TYPE (type);
950 if (is_ptr && VOID_TYPE_P (core))
951 /* OK */;
952 else if (!complete_type_or_else (core, from))
953 return 0;
955 return 1;
958 /* If IS_THROW is true return truth-value if T is an expression admissible
959 in throw-expression, i.e. if it is not of incomplete type or a pointer/
960 reference to such a type or of an abstract class type.
961 If IS_THROW is false, likewise for a catch parameter, same requirements
962 for its type plus rvalue reference type is also not admissible. */
964 static bool
965 is_admissible_throw_operand_or_catch_parameter (tree t, bool is_throw)
967 tree expr = is_throw ? t : NULL_TREE;
968 tree type = TREE_TYPE (t);
970 /* C++11 [except.handle] The exception-declaration shall not denote
971 an incomplete type, an abstract class type, or an rvalue reference
972 type. */
974 /* 15.1/4 [...] The type of the throw-expression shall not be an
975 incomplete type, or a pointer or a reference to an incomplete
976 type, other than void*, const void*, volatile void*, or
977 const volatile void*. Except for these restriction and the
978 restrictions on type matching mentioned in 15.3, the operand
979 of throw is treated exactly as a function argument in a call
980 (5.2.2) or the operand of a return statement. */
981 if (!complete_ptr_ref_or_void_ptr_p (type, expr))
982 return false;
984 /* 10.4/3 An abstract class shall not be used as a parameter type,
985 as a function return type or as type of an explicit
986 conversion. */
987 else if (abstract_virtuals_error (is_throw ? ACU_THROW : ACU_CATCH, type))
988 return false;
989 else if (!is_throw
990 && TREE_CODE (type) == REFERENCE_TYPE
991 && TYPE_REF_IS_RVALUE (type))
993 error ("cannot declare catch parameter to be of rvalue "
994 "reference type %qT", type);
995 return false;
997 else if (variably_modified_type_p (type, NULL_TREE))
999 if (is_throw)
1000 error ("cannot throw expression of type %qT because it involves "
1001 "types of variable size", type);
1002 else
1003 error ("cannot catch type %qT because it involves types of "
1004 "variable size", type);
1005 return false;
1008 return true;
1011 /* Returns nonzero if FN is a declaration of a standard C library
1012 function which is known not to throw.
1014 [lib.res.on.exception.handling]: None of the functions from the
1015 Standard C library shall report an error by throwing an
1016 exception, unless it calls a program-supplied function that
1017 throws an exception. */
1019 #include "cfns.h"
1022 nothrow_libfn_p (const_tree fn)
1024 tree id;
1026 if (TREE_PUBLIC (fn)
1027 && DECL_EXTERNAL (fn)
1028 && DECL_NAMESPACE_SCOPE_P (fn)
1029 && DECL_EXTERN_C_P (fn))
1030 /* OK */;
1031 else
1032 /* Can't be a C library function. */
1033 return 0;
1035 /* Being a C library function, DECL_ASSEMBLER_NAME == DECL_NAME
1036 unless the system headers are playing rename tricks, and if
1037 they are, we don't want to be confused by them. */
1038 id = DECL_NAME (fn);
1039 return !!libc_name_p (IDENTIFIER_POINTER (id), IDENTIFIER_LENGTH (id));
1042 /* Returns nonzero if an exception of type FROM will be caught by a
1043 handler for type TO, as per [except.handle]. */
1045 static int
1046 can_convert_eh (tree to, tree from)
1048 to = non_reference (to);
1049 from = non_reference (from);
1051 if (TYPE_PTR_P (to) && TYPE_PTR_P (from))
1053 to = TREE_TYPE (to);
1054 from = TREE_TYPE (from);
1056 if (! at_least_as_qualified_p (to, from))
1057 return 0;
1059 if (VOID_TYPE_P (to))
1060 return 1;
1062 /* Else fall through. */
1065 if (CLASS_TYPE_P (to) && CLASS_TYPE_P (from)
1066 && publicly_uniquely_derived_p (to, from))
1067 return 1;
1069 return 0;
1072 /* Check whether any of the handlers in I are shadowed by another handler
1073 accepting TYPE. Note that the shadowing may not be complete; even if
1074 an exception of type B would be caught by a handler for A, there could
1075 be a derived class C for which A is an ambiguous base but B is not, so
1076 the handler for B would catch an exception of type C. */
1078 static void
1079 check_handlers_1 (tree master, tree_stmt_iterator i)
1081 tree type = TREE_TYPE (master);
1083 for (; !tsi_end_p (i); tsi_next (&i))
1085 tree handler = tsi_stmt (i);
1086 if (TREE_TYPE (handler) && can_convert_eh (type, TREE_TYPE (handler)))
1088 warning_at (EXPR_LOCATION (handler), 0,
1089 "exception of type %qT will be caught",
1090 TREE_TYPE (handler));
1091 warning_at (EXPR_LOCATION (master), 0,
1092 " by earlier handler for %qT", type);
1093 break;
1098 /* Given a STATEMENT_LIST of HANDLERs, make sure that they're OK. */
1100 void
1101 check_handlers (tree handlers)
1103 tree_stmt_iterator i;
1105 /* If we don't have a STATEMENT_LIST, then we've just got one
1106 handler, and thus nothing to warn about. */
1107 if (TREE_CODE (handlers) != STATEMENT_LIST)
1108 return;
1110 i = tsi_start (handlers);
1111 if (!tsi_end_p (i))
1112 while (1)
1114 tree handler = tsi_stmt (i);
1115 tsi_next (&i);
1117 /* No more handlers; nothing to shadow. */
1118 if (tsi_end_p (i))
1119 break;
1120 if (TREE_TYPE (handler) == NULL_TREE)
1121 permerror (EXPR_LOCATION (handler), "%<...%>"
1122 " handler must be the last handler for its try block");
1123 else
1124 check_handlers_1 (handler, i);
1128 /* walk_tree helper for finish_noexcept_expr. Returns non-null if the
1129 expression *TP causes the noexcept operator to evaluate to false.
1131 5.3.7 [expr.noexcept]: The result of the noexcept operator is false if
1132 in a potentially-evaluated context the expression would contain
1133 * a potentially evaluated call to a function, member function,
1134 function pointer, or member function pointer that does not have a
1135 non-throwing exception-specification (15.4),
1136 * a potentially evaluated throw-expression (15.1),
1137 * a potentially evaluated dynamic_cast expression dynamic_cast<T>(v),
1138 where T is a reference type, that requires a run-time check (5.2.7), or
1139 * a potentially evaluated typeid expression (5.2.8) applied to a glvalue
1140 expression whose type is a polymorphic class type (10.3). */
1142 static tree
1143 check_noexcept_r (tree *tp, int * /*walk_subtrees*/, void * /*data*/)
1145 tree t = *tp;
1146 enum tree_code code = TREE_CODE (t);
1147 if ((code == CALL_EXPR && CALL_EXPR_FN (t))
1148 || code == AGGR_INIT_EXPR)
1150 /* We can only use the exception specification of the called function
1151 for determining the value of a noexcept expression; we can't use
1152 TREE_NOTHROW, as it might have a different value in another
1153 translation unit, creating ODR problems.
1155 We could use TREE_NOTHROW (t) for !TREE_PUBLIC fns, though... */
1156 tree fn = (code == AGGR_INIT_EXPR
1157 ? AGGR_INIT_EXPR_FN (t) : CALL_EXPR_FN (t));
1158 tree type = TREE_TYPE (fn);
1159 gcc_assert (POINTER_TYPE_P (type));
1160 type = TREE_TYPE (type);
1162 STRIP_NOPS (fn);
1163 if (TREE_CODE (fn) == ADDR_EXPR)
1164 fn = TREE_OPERAND (fn, 0);
1165 if (TREE_CODE (fn) == FUNCTION_DECL)
1167 /* We do use TREE_NOTHROW for ABI internals like __dynamic_cast,
1168 and for C library functions known not to throw. */
1169 if (DECL_EXTERN_C_P (fn)
1170 && (DECL_ARTIFICIAL (fn)
1171 || nothrow_libfn_p (fn)))
1172 return TREE_NOTHROW (fn) ? NULL_TREE : fn;
1173 /* A call to a constexpr function is noexcept if the call
1174 is a constant expression. */
1175 if (DECL_DECLARED_CONSTEXPR_P (fn)
1176 && is_sub_constant_expr (t))
1177 return NULL_TREE;
1179 if (!TYPE_NOTHROW_P (type))
1180 return fn;
1183 return NULL_TREE;
1186 /* If a function that causes a noexcept-expression to be false isn't
1187 defined yet, remember it and check it for TREE_NOTHROW again at EOF. */
1189 struct GTY(()) pending_noexcept {
1190 tree fn;
1191 location_t loc;
1193 static GTY(()) vec<pending_noexcept, va_gc> *pending_noexcept_checks;
1195 /* FN is a FUNCTION_DECL that caused a noexcept-expr to be false. Warn if
1196 it can't throw. */
1198 static void
1199 maybe_noexcept_warning (tree fn)
1201 if (TREE_NOTHROW (fn))
1203 warning (OPT_Wnoexcept, "noexcept-expression evaluates to %<false%> "
1204 "because of a call to %qD", fn);
1205 warning_at (DECL_SOURCE_LOCATION (fn), OPT_Wnoexcept,
1206 "but %qD does not throw; perhaps "
1207 "it should be declared %<noexcept%>", fn);
1211 /* Check any functions that weren't defined earlier when they caused a
1212 noexcept expression to evaluate to false. */
1214 void
1215 perform_deferred_noexcept_checks (void)
1217 int i;
1218 pending_noexcept *p;
1219 location_t saved_loc = input_location;
1220 FOR_EACH_VEC_SAFE_ELT (pending_noexcept_checks, i, p)
1222 input_location = p->loc;
1223 maybe_noexcept_warning (p->fn);
1225 input_location = saved_loc;
1228 /* Evaluate noexcept ( EXPR ). */
1230 tree
1231 finish_noexcept_expr (tree expr, tsubst_flags_t complain)
1233 if (expr == error_mark_node)
1234 return error_mark_node;
1236 if (processing_template_decl)
1237 return build_min (NOEXCEPT_EXPR, boolean_type_node, expr);
1239 return (expr_noexcept_p (expr, complain)
1240 ? boolean_true_node : boolean_false_node);
1243 /* Returns whether EXPR is noexcept, possibly warning if allowed by
1244 COMPLAIN. */
1246 bool
1247 expr_noexcept_p (tree expr, tsubst_flags_t complain)
1249 tree fn;
1251 if (expr == error_mark_node)
1252 return false;
1254 fn = cp_walk_tree_without_duplicates (&expr, check_noexcept_r, 0);
1255 if (fn)
1257 if ((complain & tf_warning) && warn_noexcept
1258 && TREE_CODE (fn) == FUNCTION_DECL)
1260 if (!DECL_INITIAL (fn))
1262 /* Not defined yet; check again at EOF. */
1263 pending_noexcept p = {fn, input_location};
1264 vec_safe_push (pending_noexcept_checks, p);
1266 else
1267 maybe_noexcept_warning (fn);
1269 return false;
1271 else
1272 return true;
1275 /* Return true iff SPEC is throw() or noexcept(true). */
1277 bool
1278 nothrow_spec_p (const_tree spec)
1280 gcc_assert (!DEFERRED_NOEXCEPT_SPEC_P (spec));
1281 if (spec == NULL_TREE
1282 || TREE_VALUE (spec) != NULL_TREE
1283 || spec == noexcept_false_spec)
1284 return false;
1285 if (TREE_PURPOSE (spec) == NULL_TREE
1286 || spec == noexcept_true_spec)
1287 return true;
1288 gcc_assert (processing_template_decl
1289 || TREE_PURPOSE (spec) == error_mark_node);
1290 return false;
1293 /* For FUNCTION_TYPE or METHOD_TYPE, true if NODE is noexcept. This is the
1294 case for things declared noexcept(true) and, with -fnothrow-opt, for
1295 throw() functions. */
1297 bool
1298 type_noexcept_p (const_tree type)
1300 tree spec = TYPE_RAISES_EXCEPTIONS (type);
1301 gcc_assert (!DEFERRED_NOEXCEPT_SPEC_P (spec));
1302 if (flag_nothrow_opt)
1303 return nothrow_spec_p (spec);
1304 else
1305 return spec == noexcept_true_spec;
1308 /* For FUNCTION_TYPE or METHOD_TYPE, true if NODE can throw any type,
1309 i.e. no exception-specification or noexcept(false). */
1311 bool
1312 type_throw_all_p (const_tree type)
1314 tree spec = TYPE_RAISES_EXCEPTIONS (type);
1315 gcc_assert (!DEFERRED_NOEXCEPT_SPEC_P (spec));
1316 return spec == NULL_TREE || spec == noexcept_false_spec;
1319 /* Create a representation of the noexcept-specification with
1320 constant-expression of EXPR. COMPLAIN is as for tsubst. */
1322 tree
1323 build_noexcept_spec (tree expr, int complain)
1325 /* This isn't part of the signature, so don't bother trying to evaluate
1326 it until instantiation. */
1327 if (!processing_template_decl && TREE_CODE (expr) != DEFERRED_NOEXCEPT)
1329 expr = perform_implicit_conversion_flags (boolean_type_node, expr,
1330 complain,
1331 LOOKUP_NORMAL);
1332 expr = cxx_constant_value (expr);
1334 if (TREE_CODE (expr) == INTEGER_CST)
1336 if (operand_equal_p (expr, boolean_true_node, 0))
1337 return noexcept_true_spec;
1338 else
1340 gcc_checking_assert (operand_equal_p (expr, boolean_false_node, 0));
1341 return noexcept_false_spec;
1344 else if (expr == error_mark_node)
1345 return error_mark_node;
1346 else
1348 gcc_assert (processing_template_decl
1349 || TREE_CODE (expr) == DEFERRED_NOEXCEPT);
1350 return build_tree_list (expr, NULL_TREE);
1354 /* Returns a noexcept-specifier to be evaluated later, for an
1355 implicitly-declared or explicitly defaulted special member function. */
1357 tree
1358 unevaluated_noexcept_spec (void)
1360 static tree spec;
1361 if (spec == NULL_TREE)
1362 spec = build_noexcept_spec (make_node (DEFERRED_NOEXCEPT), tf_none);
1363 return spec;
1366 /* Returns a TRY_CATCH_EXPR that will put TRY_LIST and CATCH_LIST in the
1367 TRY and CATCH locations. CATCH_LIST must be a STATEMENT_LIST */
1369 tree
1370 create_try_catch_expr (tree try_expr, tree catch_list)
1372 location_t loc = EXPR_LOCATION (try_expr);
1374 append_to_statement_list (do_begin_catch (), &catch_list);
1375 append_to_statement_list (build_throw (NULL_TREE), &catch_list);
1376 tree catch_tf_expr = build_stmt (loc, TRY_FINALLY_EXPR, catch_list,
1377 do_end_catch (NULL_TREE));
1378 catch_list = build2 (CATCH_EXPR, void_type_node, NULL_TREE,
1379 catch_tf_expr);
1380 tree try_catch_expr = build_stmt (loc, TRY_CATCH_EXPR, try_expr, catch_list);
1381 return try_catch_expr;
1384 #include "gt-cp-except.h"