xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/cp/except.c (revision bdc22b2e01993381dcefeff2bc9b56ca75a4235c)
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.
6 
7 This file is part of GCC.
8 
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.
13 
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.
18 
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/>.  */
22 
23 
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "tm.h"
28 #include "hash-set.h"
29 #include "machmode.h"
30 #include "vec.h"
31 #include "double-int.h"
32 #include "input.h"
33 #include "alias.h"
34 #include "symtab.h"
35 #include "wide-int.h"
36 #include "inchash.h"
37 #include "tree.h"
38 #include "stringpool.h"
39 #include "trans-mem.h"
40 #include "attribs.h"
41 #include "cp-tree.h"
42 #include "flags.h"
43 #include "tree-inline.h"
44 #include "tree-iterator.h"
45 #include "target.h"
46 
47 static void push_eh_cleanup (tree);
48 static tree prepare_eh_type (tree);
49 static tree do_begin_catch (void);
50 static int dtor_nothrow (tree);
51 static tree do_end_catch (tree);
52 static bool decl_is_java_type (tree decl, int err);
53 static void initialize_handler_parm (tree, tree);
54 static tree do_allocate_exception (tree);
55 static tree wrap_cleanups_r (tree *, int *, void *);
56 static int complete_ptr_ref_or_void_ptr_p (tree, tree);
57 static bool is_admissible_throw_operand_or_catch_parameter (tree, bool);
58 static int can_convert_eh (tree, tree);
59 
60 /* Sets up all the global eh stuff that needs to be initialized at the
61    start of compilation.  */
62 
63 void
64 init_exception_processing (void)
65 {
66   tree tmp;
67 
68   /* void std::terminate (); */
69   push_namespace (std_identifier);
70   tmp = build_function_type_list (void_type_node, NULL_TREE);
71   terminate_node = build_cp_library_fn_ptr ("terminate", tmp,
72 					   ECF_NOTHROW | ECF_NORETURN);
73   TREE_THIS_VOLATILE (terminate_node) = 1;
74   TREE_NOTHROW (terminate_node) = 1;
75   pop_namespace ();
76 
77   /* void __cxa_call_unexpected(void *); */
78   tmp = build_function_type_list (void_type_node, ptr_type_node, NULL_TREE);
79   call_unexpected_node
80     = push_throw_library_fn (get_identifier ("__cxa_call_unexpected"), tmp);
81 }
82 
83 /* Returns an expression to be executed if an unhandled exception is
84    propagated out of a cleanup region.  */
85 
86 tree
87 cp_protect_cleanup_actions (void)
88 {
89   /* [except.terminate]
90 
91      When the destruction of an object during stack unwinding exits
92      using an exception ... void terminate(); is called.  */
93   return terminate_node;
94 }
95 
96 static tree
97 prepare_eh_type (tree type)
98 {
99   if (type == NULL_TREE)
100     return type;
101   if (type == error_mark_node)
102     return error_mark_node;
103 
104   /* peel back references, so they match.  */
105   type = non_reference (type);
106 
107   /* Peel off cv qualifiers.  */
108   type = TYPE_MAIN_VARIANT (type);
109 
110   /* Functions and arrays decay to pointers.  */
111   type = type_decays_to (type);
112 
113   return type;
114 }
115 
116 /* Return the type info for TYPE as used by EH machinery.  */
117 tree
118 eh_type_info (tree type)
119 {
120   tree exp;
121 
122   if (type == NULL_TREE || type == error_mark_node)
123     return type;
124 
125   if (decl_is_java_type (type, 0))
126     exp = build_java_class_ref (TREE_TYPE (type));
127   else
128     exp = get_tinfo_decl (type);
129 
130   return exp;
131 }
132 
133 /* Build the address of a typeinfo decl for use in the runtime
134    matching field of the exception model.  */
135 
136 tree
137 build_eh_type_type (tree type)
138 {
139   tree exp = eh_type_info (type);
140 
141   if (!exp)
142     return NULL;
143 
144   mark_used (exp);
145 
146   return convert (ptr_type_node, build_address (exp));
147 }
148 
149 tree
150 build_exc_ptr (void)
151 {
152   return build_call_n (builtin_decl_explicit (BUILT_IN_EH_POINTER),
153 		       1, integer_zero_node);
154 }
155 
156 /* Declare a function NAME, returning RETURN_TYPE, taking a single
157    parameter PARM_TYPE, with an empty exception specification.
158 
159    Note that the C++ ABI document does not have a throw-specifier on
160    the routines declared below via this function.  The declarations
161    are consistent with the actual implementations in libsupc++.  */
162 
163 static tree
164 declare_library_fn (tree name, tree return_type, tree parm_type, int ecf_flags)
165 {
166   return push_library_fn (name, build_function_type_list (return_type,
167 							  parm_type,
168 							  NULL_TREE),
169 			  empty_except_spec,
170 			  ecf_flags);
171 }
172 
173 /* Build up a call to __cxa_get_exception_ptr so that we can build a
174    copy constructor for the thrown object.  */
175 
176 static tree
177 do_get_exception_ptr (void)
178 {
179   tree fn;
180 
181   fn = get_identifier ("__cxa_get_exception_ptr");
182   if (!get_global_value_if_present (fn, &fn))
183     {
184       /* Declare void* __cxa_get_exception_ptr (void *) throw().  */
185       fn = declare_library_fn (fn, ptr_type_node, ptr_type_node,
186 			       ECF_NOTHROW | ECF_PURE | ECF_LEAF | ECF_TM_PURE);
187     }
188 
189   return cp_build_function_call_nary (fn, tf_warning_or_error,
190 				      build_exc_ptr (), NULL_TREE);
191 }
192 
193 /* Build up a call to __cxa_begin_catch, to tell the runtime that the
194    exception has been handled.  */
195 
196 static tree
197 do_begin_catch (void)
198 {
199   tree fn;
200 
201   fn = get_identifier ("__cxa_begin_catch");
202   if (!get_global_value_if_present (fn, &fn))
203     {
204       /* Declare void* __cxa_begin_catch (void *) throw().  */
205       fn = declare_library_fn (fn, ptr_type_node, ptr_type_node, ECF_NOTHROW);
206 
207       /* Create its transactional-memory equivalent.  */
208       if (flag_tm)
209 	{
210 	  tree fn2 = get_identifier ("_ITM_cxa_begin_catch");
211 	  if (!get_global_value_if_present (fn2, &fn2))
212 	    fn2 = declare_library_fn (fn2, ptr_type_node,
213 				      ptr_type_node, ECF_NOTHROW | ECF_TM_PURE);
214 	  record_tm_replacement (fn, fn2);
215 	}
216     }
217 
218   return cp_build_function_call_nary (fn, tf_warning_or_error,
219 				      build_exc_ptr (), NULL_TREE);
220 }
221 
222 /* Returns nonzero if cleaning up an exception of type TYPE (which can be
223    NULL_TREE for a ... handler) will not throw an exception.  */
224 
225 static int
226 dtor_nothrow (tree type)
227 {
228   if (type == NULL_TREE || type == error_mark_node)
229     return 0;
230 
231   if (TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
232     return 1;
233 
234   if (CLASSTYPE_LAZY_DESTRUCTOR (type))
235     lazily_declare_fn (sfk_destructor, type);
236 
237   return TREE_NOTHROW (CLASSTYPE_DESTRUCTORS (type));
238 }
239 
240 /* Build up a call to __cxa_end_catch, to destroy the exception object
241    for the current catch block if no others are currently using it.  */
242 
243 static tree
244 do_end_catch (tree type)
245 {
246   tree fn, cleanup;
247 
248   fn = get_identifier ("__cxa_end_catch");
249   if (!get_global_value_if_present (fn, &fn))
250     {
251       /* Declare void __cxa_end_catch ().
252          This can throw if the destructor for the exception throws.  */
253       fn = push_void_library_fn (fn, void_list_node, 0);
254 
255       /* Create its transactional-memory equivalent.  */
256       if (flag_tm)
257 	{
258 	  tree fn2 = get_identifier ("_ITM_cxa_end_catch");
259 	  if (!get_global_value_if_present (fn2, &fn2))
260 	    fn2 = push_void_library_fn (fn2, void_list_node, ECF_TM_PURE);
261 	  record_tm_replacement (fn, fn2);
262 	}
263     }
264 
265   cleanup = cp_build_function_call_vec (fn, NULL, tf_warning_or_error);
266   TREE_NOTHROW (cleanup) = dtor_nothrow (type);
267 
268   return cleanup;
269 }
270 
271 /* This routine creates the cleanup for the current exception.  */
272 
273 static void
274 push_eh_cleanup (tree type)
275 {
276   finish_decl_cleanup (NULL_TREE, do_end_catch (type));
277 }
278 
279 /* Return nonzero value if DECL is a Java type suitable for catch or
280    throw.  */
281 
282 static bool
283 decl_is_java_type (tree decl, int err)
284 {
285   bool r = (TYPE_PTR_P (decl)
286 	    && TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE
287 	    && TYPE_FOR_JAVA (TREE_TYPE (decl)));
288 
289   if (err)
290     {
291       if (TREE_CODE (decl) == REFERENCE_TYPE
292 	  && TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE
293 	  && TYPE_FOR_JAVA (TREE_TYPE (decl)))
294 	{
295 	  /* Can't throw a reference.  */
296 	  error ("type %qT is disallowed in Java %<throw%> or %<catch%>",
297 		 decl);
298 	}
299 
300       if (r)
301 	{
302 	  tree jthrow_node
303 	    = IDENTIFIER_GLOBAL_VALUE (get_identifier ("jthrowable"));
304 
305 	  if (jthrow_node == NULL_TREE)
306 	    fatal_error
307 	      (input_location,
308 	       "call to Java %<catch%> or %<throw%> with %<jthrowable%> undefined");
309 
310 	  jthrow_node = TREE_TYPE (TREE_TYPE (jthrow_node));
311 
312 	  if (! DERIVED_FROM_P (jthrow_node, TREE_TYPE (decl)))
313 	    {
314 	      /* Thrown object must be a Throwable.  */
315 	      error ("type %qT is not derived from %<java::lang::Throwable%>",
316 		     TREE_TYPE (decl));
317 	    }
318 	}
319     }
320 
321   return r;
322 }
323 
324 /* Select the personality routine to be used for exception handling,
325    or issue an error if we need two different ones in the same
326    translation unit.
327    ??? At present DECL_FUNCTION_PERSONALITY is set via
328    LANG_HOOKS_EH_PERSONALITY.  Should it be done here instead?  */
329 void
330 choose_personality_routine (enum languages lang)
331 {
332   static enum {
333     chose_none,
334     chose_cpp,
335     chose_java,
336     gave_error
337   } state;
338 
339   switch (state)
340     {
341     case gave_error:
342       return;
343 
344     case chose_cpp:
345       if (lang != lang_cplusplus)
346 	goto give_error;
347       return;
348 
349     case chose_java:
350       if (lang != lang_java)
351 	goto give_error;
352       return;
353 
354     case chose_none:
355       ; /* Proceed to language selection.  */
356     }
357 
358   switch (lang)
359     {
360     case lang_cplusplus:
361       state = chose_cpp;
362       break;
363 
364     case lang_java:
365       state = chose_java;
366       terminate_node = builtin_decl_explicit (BUILT_IN_ABORT);
367       pragma_java_exceptions = true;
368       break;
369 
370     default:
371       gcc_unreachable ();
372     }
373   return;
374 
375  give_error:
376   error ("mixing C++ and Java catches in a single translation unit");
377   state = gave_error;
378 }
379 
380 /* Wrap EXPR in a MUST_NOT_THROW_EXPR expressing that EXPR must
381    not throw any exceptions if COND is true.  A condition of
382    NULL_TREE is treated as 'true'.  */
383 
384 tree
385 build_must_not_throw_expr (tree body, tree cond)
386 {
387   tree type = body ? TREE_TYPE (body) : void_type_node;
388 
389   if (!flag_exceptions)
390     return body;
391 
392   if (cond && !value_dependent_expression_p (cond))
393     {
394       cond = cxx_constant_value (cond);
395       if (integer_zerop (cond))
396 	return body;
397       else if (integer_onep (cond))
398 	cond = NULL_TREE;
399     }
400 
401   return build2 (MUST_NOT_THROW_EXPR, type, body, cond);
402 }
403 
404 
405 /* Initialize the catch parameter DECL.  */
406 
407 static void
408 initialize_handler_parm (tree decl, tree exp)
409 {
410   tree init;
411   tree init_type;
412 
413   /* Make sure we mark the catch param as used, otherwise we'll get a
414      warning about an unused ((anonymous)).  */
415   TREE_USED (decl) = 1;
416   DECL_READ_P (decl) = 1;
417 
418   /* Figure out the type that the initializer is.  Pointers are returned
419      adjusted by value from __cxa_begin_catch.  Others are returned by
420      reference.  */
421   init_type = TREE_TYPE (decl);
422   if (!POINTER_TYPE_P (init_type))
423     init_type = build_reference_type (init_type);
424 
425   choose_personality_routine (decl_is_java_type (init_type, 0)
426 			      ? lang_java : lang_cplusplus);
427 
428   /* Since pointers are passed by value, initialize a reference to
429      pointer catch parm with the address of the temporary.  */
430   if (TREE_CODE (init_type) == REFERENCE_TYPE
431       && TYPE_PTR_P (TREE_TYPE (init_type)))
432     exp = cp_build_addr_expr (exp, tf_warning_or_error);
433 
434   exp = ocp_convert (init_type, exp, CONV_IMPLICIT|CONV_FORCE_TEMP, 0,
435 		     tf_warning_or_error);
436 
437   init = convert_from_reference (exp);
438 
439   /* If the constructor for the catch parm exits via an exception, we
440      must call terminate.  See eh23.C.  */
441   if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
442     {
443       /* Generate the copy constructor call directly so we can wrap it.
444 	 See also expand_default_init.  */
445       init = ocp_convert (TREE_TYPE (decl), init,
446 			  CONV_IMPLICIT|CONV_FORCE_TEMP, 0,
447 			  tf_warning_or_error);
448       /* Force cleanups now to avoid nesting problems with the
449 	 MUST_NOT_THROW_EXPR.  */
450       init = fold_build_cleanup_point_expr (TREE_TYPE (init), init);
451       init = build_must_not_throw_expr (init, NULL_TREE);
452     }
453 
454   decl = pushdecl (decl);
455 
456   start_decl_1 (decl, true);
457   cp_finish_decl (decl, init, /*init_const_expr_p=*/false, NULL_TREE,
458 		  LOOKUP_ONLYCONVERTING|DIRECT_BIND);
459 }
460 
461 
462 /* Routine to see if exception handling is turned on.
463    DO_WARN is nonzero if we want to inform the user that exception
464    handling is turned off.
465 
466    This is used to ensure that -fexceptions has been specified if the
467    compiler tries to use any exception-specific functions.  */
468 
469 static inline int
470 doing_eh (void)
471 {
472   if (! flag_exceptions)
473     {
474       static int warned = 0;
475       if (! warned)
476 	{
477 	  error ("exception handling disabled, use -fexceptions to enable");
478 	  warned = 1;
479 	}
480       return 0;
481     }
482   return 1;
483 }
484 
485 /* Call this to start a catch block.  DECL is the catch parameter.  */
486 
487 tree
488 expand_start_catch_block (tree decl)
489 {
490   tree exp;
491   tree type, init;
492 
493   if (! doing_eh ())
494     return NULL_TREE;
495 
496   if (decl)
497     {
498       if (!is_admissible_throw_operand_or_catch_parameter (decl, false))
499 	decl = error_mark_node;
500 
501       type = prepare_eh_type (TREE_TYPE (decl));
502       mark_used (eh_type_info (type));
503     }
504   else
505     type = NULL_TREE;
506 
507   if (decl && decl_is_java_type (type, 1))
508     {
509       /* Java only passes object via pointer and doesn't require
510 	 adjusting.  The java object is immediately before the
511 	 generic exception header.  */
512       exp = build_exc_ptr ();
513       exp = build1 (NOP_EXPR, build_pointer_type (type), exp);
514       exp = fold_build_pointer_plus (exp,
515 		    fold_build1_loc (input_location,
516 				     NEGATE_EXPR, sizetype,
517 				     TYPE_SIZE_UNIT (TREE_TYPE (exp))));
518       exp = cp_build_indirect_ref (exp, RO_NULL, tf_warning_or_error);
519       initialize_handler_parm (decl, exp);
520       return type;
521     }
522 
523   /* Call __cxa_end_catch at the end of processing the exception.  */
524   push_eh_cleanup (type);
525 
526   init = do_begin_catch ();
527 
528   /* If there's no decl at all, then all we need to do is make sure
529      to tell the runtime that we've begun handling the exception.  */
530   if (decl == NULL || decl == error_mark_node || init == error_mark_node)
531     finish_expr_stmt (init);
532 
533   /* If the C++ object needs constructing, we need to do that before
534      calling __cxa_begin_catch, so that std::uncaught_exception gets
535      the right value during the copy constructor.  */
536   else if (flag_use_cxa_get_exception_ptr
537 	   && TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
538     {
539       exp = do_get_exception_ptr ();
540       initialize_handler_parm (decl, exp);
541       finish_expr_stmt (init);
542     }
543 
544   /* Otherwise the type uses a bitwise copy, and we don't have to worry
545      about the value of std::uncaught_exception and therefore can do the
546      copy with the return value of __cxa_end_catch instead.  */
547   else
548     {
549       tree init_type = type;
550 
551       /* Pointers are passed by values, everything else by reference.  */
552       if (!TYPE_PTR_P (type))
553 	init_type = build_pointer_type (type);
554       if (init_type != TREE_TYPE (init))
555 	init = build1 (NOP_EXPR, init_type, init);
556       exp = create_temporary_var (init_type);
557       DECL_REGISTER (exp) = 1;
558       cp_finish_decl (exp, init, /*init_const_expr=*/false,
559 		      NULL_TREE, LOOKUP_ONLYCONVERTING);
560       initialize_handler_parm (decl, exp);
561     }
562 
563   return type;
564 }
565 
566 
567 /* Call this to end a catch block.  Its responsible for emitting the
568    code to handle jumping back to the correct place, and for emitting
569    the label to jump to if this catch block didn't match.  */
570 
571 void
572 expand_end_catch_block (void)
573 {
574   if (! doing_eh ())
575     return;
576 
577   /* The exception being handled is rethrown if control reaches the end of
578      a handler of the function-try-block of a constructor or destructor.  */
579   if (in_function_try_handler
580       && (DECL_CONSTRUCTOR_P (current_function_decl)
581 	  || DECL_DESTRUCTOR_P (current_function_decl)))
582     finish_expr_stmt (build_throw (NULL_TREE));
583 }
584 
585 tree
586 begin_eh_spec_block (void)
587 {
588   tree r;
589   location_t spec_location = DECL_SOURCE_LOCATION (current_function_decl);
590 
591   /* A noexcept specification (or throw() with -fnothrow-opt) is a
592      MUST_NOT_THROW_EXPR.  */
593   if (TYPE_NOEXCEPT_P (TREE_TYPE (current_function_decl)))
594     {
595       r = build_stmt (spec_location, MUST_NOT_THROW_EXPR,
596 		      NULL_TREE, NULL_TREE);
597       TREE_SIDE_EFFECTS (r) = 1;
598     }
599   else
600     r = build_stmt (spec_location, EH_SPEC_BLOCK, NULL_TREE, NULL_TREE);
601   add_stmt (r);
602   TREE_OPERAND (r, 0) = push_stmt_list ();
603   return r;
604 }
605 
606 void
607 finish_eh_spec_block (tree raw_raises, tree eh_spec_block)
608 {
609   tree raises;
610 
611   TREE_OPERAND (eh_spec_block, 0)
612     = pop_stmt_list (TREE_OPERAND (eh_spec_block, 0));
613 
614   if (TREE_CODE (eh_spec_block) == MUST_NOT_THROW_EXPR)
615     return;
616 
617   /* Strip cv quals, etc, from the specification types.  */
618   for (raises = NULL_TREE;
619        raw_raises && TREE_VALUE (raw_raises);
620        raw_raises = TREE_CHAIN (raw_raises))
621     {
622       tree type = prepare_eh_type (TREE_VALUE (raw_raises));
623       tree tinfo = eh_type_info (type);
624 
625       mark_used (tinfo);
626       raises = tree_cons (NULL_TREE, type, raises);
627     }
628 
629   EH_SPEC_RAISES (eh_spec_block) = raises;
630 }
631 
632 /* Return a pointer to a buffer for an exception object of type TYPE.  */
633 
634 static tree
635 do_allocate_exception (tree type)
636 {
637   tree fn;
638 
639   fn = get_identifier ("__cxa_allocate_exception");
640   if (!get_global_value_if_present (fn, &fn))
641     {
642       /* Declare void *__cxa_allocate_exception(size_t) throw().  */
643       fn = declare_library_fn (fn, ptr_type_node, size_type_node,
644 			        ECF_NOTHROW | ECF_MALLOC);
645 
646       if (flag_tm)
647 	{
648 	  tree fn2 = get_identifier ("_ITM_cxa_allocate_exception");
649 	  if (!get_global_value_if_present (fn2, &fn2))
650 	    fn2 = declare_library_fn (fn2, ptr_type_node,
651 				      size_type_node,
652 				      ECF_NOTHROW | ECF_MALLOC | ECF_TM_PURE);
653 	  record_tm_replacement (fn, fn2);
654 	}
655     }
656 
657   return cp_build_function_call_nary (fn, tf_warning_or_error,
658 				      size_in_bytes (type), NULL_TREE);
659 }
660 
661 /* Call __cxa_free_exception from a cleanup.  This is never invoked
662    directly, but see the comment for stabilize_throw_expr.  */
663 
664 static tree
665 do_free_exception (tree ptr)
666 {
667   tree fn;
668 
669   fn = get_identifier ("__cxa_free_exception");
670   if (!get_global_value_if_present (fn, &fn))
671     {
672       /* Declare void __cxa_free_exception (void *) throw().  */
673       fn = declare_library_fn (fn, void_type_node, ptr_type_node,
674 			       ECF_NOTHROW | ECF_LEAF);
675     }
676 
677   return cp_build_function_call_nary (fn, tf_warning_or_error, ptr, NULL_TREE);
678 }
679 
680 /* Wrap all cleanups for TARGET_EXPRs in MUST_NOT_THROW_EXPR.
681    Called from build_throw via walk_tree_without_duplicates.  */
682 
683 static tree
684 wrap_cleanups_r (tree *tp, int *walk_subtrees, void * /*data*/)
685 {
686   tree exp = *tp;
687   tree cleanup;
688 
689   /* Don't walk into types.  */
690   if (TYPE_P (exp))
691     {
692       *walk_subtrees = 0;
693       return NULL_TREE;
694     }
695   if (TREE_CODE (exp) != TARGET_EXPR)
696     return NULL_TREE;
697 
698   cleanup = TARGET_EXPR_CLEANUP (exp);
699   if (cleanup)
700     {
701       cleanup = build2 (MUST_NOT_THROW_EXPR, void_type_node, cleanup,
702 			NULL_TREE);
703       TARGET_EXPR_CLEANUP (exp) = cleanup;
704     }
705 
706   /* Keep iterating.  */
707   return NULL_TREE;
708 }
709 
710 /* Build a throw expression.  */
711 
712 tree
713 build_throw (tree exp)
714 {
715   tree fn;
716 
717   if (exp == error_mark_node)
718     return exp;
719 
720   if (processing_template_decl)
721     {
722       if (cfun)
723 	current_function_returns_abnormally = 1;
724       exp = build_min (THROW_EXPR, void_type_node, exp);
725       SET_EXPR_LOCATION (exp, input_location);
726       return exp;
727     }
728 
729   if (exp == null_node)
730     warning (0, "throwing NULL, which has integral, not pointer type");
731 
732   if (exp != NULL_TREE)
733     {
734       if (!is_admissible_throw_operand_or_catch_parameter (exp, true))
735 	return error_mark_node;
736     }
737 
738   if (! doing_eh ())
739     return error_mark_node;
740 
741   if (exp && decl_is_java_type (TREE_TYPE (exp), 1))
742     {
743       tree fn = get_identifier ("_Jv_Throw");
744       if (!get_global_value_if_present (fn, &fn))
745 	{
746 	  /* Declare void _Jv_Throw (void *).  */
747 	  tree tmp;
748 	  tmp = build_function_type_list (ptr_type_node,
749 					  ptr_type_node, NULL_TREE);
750 	  fn = push_throw_library_fn (fn, tmp);
751 	}
752       else if (really_overloaded_fn (fn))
753 	{
754 	  error ("%qD should never be overloaded", fn);
755 	  return error_mark_node;
756 	}
757       fn = OVL_CURRENT (fn);
758       exp = cp_build_function_call_nary (fn, tf_warning_or_error,
759 					 exp, NULL_TREE);
760     }
761   else if (exp)
762     {
763       tree throw_type;
764       tree temp_type;
765       tree cleanup;
766       tree object, ptr;
767       tree tmp;
768       tree allocate_expr;
769 
770       /* The CLEANUP_TYPE is the internal type of a destructor.  */
771       if (!cleanup_type)
772 	{
773 	  tmp = build_function_type_list (void_type_node,
774 					  ptr_type_node, NULL_TREE);
775 	  cleanup_type = build_pointer_type (tmp);
776 	}
777 
778       fn = get_identifier ("__cxa_throw");
779       if (!get_global_value_if_present (fn, &fn))
780 	{
781 	  /* Declare void __cxa_throw (void*, void*, void (*)(void*)).  */
782 	  /* ??? Second argument is supposed to be "std::type_info*".  */
783 	  tmp = build_function_type_list (void_type_node,
784 					  ptr_type_node, ptr_type_node,
785 					  cleanup_type, NULL_TREE);
786 	  fn = push_throw_library_fn (fn, tmp);
787 
788 	  if (flag_tm)
789 	    {
790 	      tree fn2 = get_identifier ("_ITM_cxa_throw");
791 	      if (!get_global_value_if_present (fn2, &fn2))
792 		fn2 = push_throw_library_fn (fn2, tmp);
793 	      apply_tm_attr (fn2, get_identifier ("transaction_pure"));
794 	      record_tm_replacement (fn, fn2);
795 	    }
796 	}
797 
798       /* [except.throw]
799 
800 	 A throw-expression initializes a temporary object, the type
801 	 of which is determined by removing any top-level
802 	 cv-qualifiers from the static type of the operand of throw
803 	 and adjusting the type from "array of T" or "function return
804 	 T" to "pointer to T" or "pointer to function returning T"
805 	 respectively.  */
806       temp_type = is_bitfield_expr_with_lowered_type (exp);
807       if (!temp_type)
808 	temp_type = cv_unqualified (type_decays_to (TREE_TYPE (exp)));
809 
810       /* OK, this is kind of wacky.  The standard says that we call
811 	 terminate when the exception handling mechanism, after
812 	 completing evaluation of the expression to be thrown but
813 	 before the exception is caught (_except.throw_), calls a
814 	 user function that exits via an uncaught exception.
815 
816 	 So we have to protect the actual initialization of the
817 	 exception object with terminate(), but evaluate the
818 	 expression first.  Since there could be temps in the
819 	 expression, we need to handle that, too.  We also expand
820 	 the call to __cxa_allocate_exception first (which doesn't
821 	 matter, since it can't throw).  */
822 
823       /* Allocate the space for the exception.  */
824       allocate_expr = do_allocate_exception (temp_type);
825       allocate_expr = get_target_expr (allocate_expr);
826       ptr = TARGET_EXPR_SLOT (allocate_expr);
827       TARGET_EXPR_CLEANUP (allocate_expr) = do_free_exception (ptr);
828       CLEANUP_EH_ONLY (allocate_expr) = 1;
829 
830       object = build_nop (build_pointer_type (temp_type), ptr);
831       object = cp_build_indirect_ref (object, RO_NULL, tf_warning_or_error);
832 
833       /* And initialize the exception object.  */
834       if (CLASS_TYPE_P (temp_type))
835 	{
836 	  int flags = LOOKUP_NORMAL | LOOKUP_ONLYCONVERTING;
837 	  vec<tree, va_gc> *exp_vec;
838 
839 	  /* Under C++0x [12.8/16 class.copy], a thrown lvalue is sometimes
840 	     treated as an rvalue for the purposes of overload resolution
841 	     to favor move constructors over copy constructors.  */
842 	  if (/* Must be a local, automatic variable.  */
843 	      VAR_P (exp)
844 	      && DECL_CONTEXT (exp) == current_function_decl
845 	      && ! TREE_STATIC (exp)
846 	      /* The variable must not have the `volatile' qualifier.  */
847 	      && !(cp_type_quals (TREE_TYPE (exp)) & TYPE_QUAL_VOLATILE))
848 	    flags = flags | LOOKUP_PREFER_RVALUE;
849 
850 	  /* Call the copy constructor.  */
851 	  exp_vec = make_tree_vector_single (exp);
852 	  exp = (build_special_member_call
853 		 (object, complete_ctor_identifier, &exp_vec,
854 		  TREE_TYPE (object), flags, tf_warning_or_error));
855 	  release_tree_vector (exp_vec);
856 	  if (exp == error_mark_node)
857 	    {
858 	      error ("  in thrown expression");
859 	      return error_mark_node;
860 	    }
861 	}
862       else
863 	{
864 	  tmp = decay_conversion (exp, tf_warning_or_error);
865 	  if (tmp == error_mark_node)
866 	    return error_mark_node;
867 	  exp = build2 (INIT_EXPR, temp_type, object, tmp);
868 	}
869 
870       /* Mark any cleanups from the initialization as MUST_NOT_THROW, since
871 	 they are run after the exception object is initialized.  */
872       cp_walk_tree_without_duplicates (&exp, wrap_cleanups_r, 0);
873 
874       /* Prepend the allocation.  */
875       exp = build2 (COMPOUND_EXPR, TREE_TYPE (exp), allocate_expr, exp);
876 
877       /* Force all the cleanups to be evaluated here so that we don't have
878 	 to do them during unwinding.  */
879       exp = build1 (CLEANUP_POINT_EXPR, void_type_node, exp);
880 
881       throw_type = build_eh_type_type (prepare_eh_type (TREE_TYPE (object)));
882 
883       cleanup = NULL_TREE;
884       if (type_build_dtor_call (TREE_TYPE (object)))
885 	{
886 	  tree fn = lookup_fnfields (TYPE_BINFO (TREE_TYPE (object)),
887 				     complete_dtor_identifier, 0);
888 	  fn = BASELINK_FUNCTIONS (fn);
889 	  mark_used (fn);
890 	  if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (object)))
891 	    {
892 	      cxx_mark_addressable (fn);
893 	      /* Pretend it's a normal function.  */
894 	      cleanup = build1 (ADDR_EXPR, cleanup_type, fn);
895 	    }
896 	}
897       if (cleanup == NULL_TREE)
898 	cleanup = build_int_cst (cleanup_type, 0);
899 
900       /* ??? Indicate that this function call throws throw_type.  */
901       tmp = cp_build_function_call_nary (fn, tf_warning_or_error,
902 					 ptr, throw_type, cleanup, NULL_TREE);
903 
904       /* Tack on the initialization stuff.  */
905       exp = build2 (COMPOUND_EXPR, TREE_TYPE (tmp), exp, tmp);
906     }
907   else
908     {
909       /* Rethrow current exception.  */
910 
911       tree fn = get_identifier ("__cxa_rethrow");
912       if (!get_global_value_if_present (fn, &fn))
913 	{
914 	  /* Declare void __cxa_rethrow (void).  */
915 	  fn = push_throw_library_fn
916 	    (fn, build_function_type_list (void_type_node, NULL_TREE));
917 	}
918 
919       if (flag_tm)
920 	apply_tm_attr (fn, get_identifier ("transaction_pure"));
921 
922       /* ??? Indicate that this function call allows exceptions of the type
923 	 of the enclosing catch block (if known).  */
924       exp = cp_build_function_call_vec (fn, NULL, tf_warning_or_error);
925     }
926 
927   exp = build1 (THROW_EXPR, void_type_node, exp);
928   SET_EXPR_LOCATION (exp, input_location);
929 
930   return exp;
931 }
932 
933 /* Make sure TYPE is complete, pointer to complete, reference to
934    complete, or pointer to cv void. Issue diagnostic on failure.
935    Return the zero on failure and nonzero on success. FROM can be
936    the expr or decl from whence TYPE came, if available.  */
937 
938 static int
939 complete_ptr_ref_or_void_ptr_p (tree type, tree from)
940 {
941   int is_ptr;
942 
943   /* Check complete.  */
944   type = complete_type_or_else (type, from);
945   if (!type)
946     return 0;
947 
948   /* Or a pointer or ref to one, or cv void *.  */
949   is_ptr = TYPE_PTR_P (type);
950   if (is_ptr || TREE_CODE (type) == REFERENCE_TYPE)
951     {
952       tree core = TREE_TYPE (type);
953 
954       if (is_ptr && VOID_TYPE_P (core))
955 	/* OK */;
956       else if (!complete_type_or_else (core, from))
957 	return 0;
958     }
959   return 1;
960 }
961 
962 /* If IS_THROW is true return truth-value if T is an expression admissible
963    in throw-expression, i.e. if it is not of incomplete type or a pointer/
964    reference to such a type or of an abstract class type.
965    If IS_THROW is false, likewise for a catch parameter, same requirements
966    for its type plus rvalue reference type is also not admissible.  */
967 
968 static bool
969 is_admissible_throw_operand_or_catch_parameter (tree t, bool is_throw)
970 {
971   tree expr = is_throw ? t : NULL_TREE;
972   tree type = TREE_TYPE (t);
973 
974   /* C++11 [except.handle] The exception-declaration shall not denote
975      an incomplete type, an abstract class type, or an rvalue reference
976      type.  */
977 
978   /* 15.1/4 [...] The type of the throw-expression shall not be an
979 	    incomplete type, or a pointer or a reference to an incomplete
980 	    type, other than void*, const void*, volatile void*, or
981 	    const volatile void*.  Except for these restriction and the
982 	    restrictions on type matching mentioned in 15.3, the operand
983 	    of throw is treated exactly as a function argument in a call
984 	    (5.2.2) or the operand of a return statement.  */
985   if (!complete_ptr_ref_or_void_ptr_p (type, expr))
986     return false;
987 
988   /* 10.4/3 An abstract class shall not be used as a parameter type,
989 	    as a function return type or as type of an explicit
990 	    conversion.  */
991   else if (abstract_virtuals_error (is_throw ? ACU_THROW : ACU_CATCH, type))
992     return false;
993   else if (!is_throw
994 	   && TREE_CODE (type) == REFERENCE_TYPE
995 	   && TYPE_REF_IS_RVALUE (type))
996     {
997       error ("cannot declare catch parameter to be of rvalue "
998 	     "reference type %qT", type);
999       return false;
1000     }
1001   else if (variably_modified_type_p (type, NULL_TREE))
1002     {
1003       if (is_throw)
1004 	error ("cannot throw expression of type %qT because it involves "
1005 	       "types of variable size", type);
1006       else
1007 	error ("cannot catch type %qT because it involves types of "
1008 	       "variable size", type);
1009       return false;
1010     }
1011 
1012   return true;
1013 }
1014 
1015 /* Returns nonzero if FN is a declaration of a standard C library
1016    function which is known not to throw.
1017 
1018    [lib.res.on.exception.handling]: None of the functions from the
1019    Standard C library shall report an error by throwing an
1020    exception, unless it calls a program-supplied function that
1021    throws an exception.  */
1022 
1023 #include "cfns.h"
1024 
1025 int
1026 nothrow_libfn_p (const_tree fn)
1027 {
1028   tree id;
1029 
1030   if (TREE_PUBLIC (fn)
1031       && DECL_EXTERNAL (fn)
1032       && DECL_NAMESPACE_SCOPE_P (fn)
1033       && DECL_EXTERN_C_P (fn))
1034     /* OK */;
1035   else
1036     /* Can't be a C library function.  */
1037     return 0;
1038 
1039   /* Being a C library function, DECL_ASSEMBLER_NAME == DECL_NAME
1040      unless the system headers are playing rename tricks, and if
1041      they are, we don't want to be confused by them.  */
1042   id = DECL_NAME (fn);
1043   return !!libc_name::libc_name_p (IDENTIFIER_POINTER (id),
1044 				   IDENTIFIER_LENGTH (id));
1045 }
1046 
1047 /* Returns nonzero if an exception of type FROM will be caught by a
1048    handler for type TO, as per [except.handle].  */
1049 
1050 static int
1051 can_convert_eh (tree to, tree from)
1052 {
1053   to = non_reference (to);
1054   from = non_reference (from);
1055 
1056   if (TYPE_PTR_P (to) && TYPE_PTR_P (from))
1057     {
1058       to = TREE_TYPE (to);
1059       from = TREE_TYPE (from);
1060 
1061       if (! at_least_as_qualified_p (to, from))
1062 	return 0;
1063 
1064       if (VOID_TYPE_P (to))
1065 	return 1;
1066 
1067       /* Else fall through.  */
1068     }
1069 
1070   if (CLASS_TYPE_P (to) && CLASS_TYPE_P (from)
1071       && publicly_uniquely_derived_p (to, from))
1072     return 1;
1073 
1074   return 0;
1075 }
1076 
1077 /* Check whether any of the handlers in I are shadowed by another handler
1078    accepting TYPE.  Note that the shadowing may not be complete; even if
1079    an exception of type B would be caught by a handler for A, there could
1080    be a derived class C for which A is an ambiguous base but B is not, so
1081    the handler for B would catch an exception of type C.  */
1082 
1083 static void
1084 check_handlers_1 (tree master, tree_stmt_iterator i)
1085 {
1086   tree type = TREE_TYPE (master);
1087 
1088   for (; !tsi_end_p (i); tsi_next (&i))
1089     {
1090       tree handler = tsi_stmt (i);
1091       if (TREE_TYPE (handler) && can_convert_eh (type, TREE_TYPE (handler)))
1092 	{
1093 	  warning_at (EXPR_LOCATION (handler), 0,
1094 		      "exception of type %qT will be caught",
1095 		      TREE_TYPE (handler));
1096 	  warning_at (EXPR_LOCATION (master), 0,
1097 		      "   by earlier handler for %qT", type);
1098 	  break;
1099 	}
1100     }
1101 }
1102 
1103 /* Given a STATEMENT_LIST of HANDLERs, make sure that they're OK.  */
1104 
1105 void
1106 check_handlers (tree handlers)
1107 {
1108   tree_stmt_iterator i;
1109 
1110   /* If we don't have a STATEMENT_LIST, then we've just got one
1111      handler, and thus nothing to warn about.  */
1112   if (TREE_CODE (handlers) != STATEMENT_LIST)
1113     return;
1114 
1115   i = tsi_start (handlers);
1116   if (!tsi_end_p (i))
1117     while (1)
1118       {
1119 	tree handler = tsi_stmt (i);
1120 	tsi_next (&i);
1121 
1122 	/* No more handlers; nothing to shadow.  */
1123 	if (tsi_end_p (i))
1124 	  break;
1125 	if (TREE_TYPE (handler) == NULL_TREE)
1126 	  permerror (EXPR_LOCATION (handler), "%<...%>"
1127 		     " handler must be the last handler for its try block");
1128 	else
1129 	  check_handlers_1 (handler, i);
1130       }
1131 }
1132 
1133 /* walk_tree helper for finish_noexcept_expr.  Returns non-null if the
1134    expression *TP causes the noexcept operator to evaluate to false.
1135 
1136    5.3.7 [expr.noexcept]: The result of the noexcept operator is false if
1137    in a potentially-evaluated context the expression would contain
1138    * a potentially evaluated call to a function, member function,
1139      function pointer, or member function pointer that does not have a
1140      non-throwing exception-specification (15.4),
1141    * a potentially evaluated throw-expression (15.1),
1142    * a potentially evaluated dynamic_cast expression dynamic_cast<T>(v),
1143      where T is a reference type, that requires a run-time check (5.2.7), or
1144    * a potentially evaluated typeid expression (5.2.8) applied to a glvalue
1145      expression whose type is a polymorphic class type (10.3).  */
1146 
1147 static tree
1148 check_noexcept_r (tree *tp, int * /*walk_subtrees*/, void * /*data*/)
1149 {
1150   tree t = *tp;
1151   enum tree_code code = TREE_CODE (t);
1152   if ((code == CALL_EXPR && CALL_EXPR_FN (t))
1153       || code == AGGR_INIT_EXPR)
1154     {
1155       /* We can only use the exception specification of the called function
1156 	 for determining the value of a noexcept expression; we can't use
1157 	 TREE_NOTHROW, as it might have a different value in another
1158 	 translation unit, creating ODR problems.
1159 
1160          We could use TREE_NOTHROW (t) for !TREE_PUBLIC fns, though... */
1161       tree fn = (code == AGGR_INIT_EXPR
1162 		 ? AGGR_INIT_EXPR_FN (t) : CALL_EXPR_FN (t));
1163       tree type = TREE_TYPE (TREE_TYPE (fn));
1164 
1165       STRIP_NOPS (fn);
1166       if (TREE_CODE (fn) == ADDR_EXPR)
1167 	fn = TREE_OPERAND (fn, 0);
1168       if (TREE_CODE (fn) == FUNCTION_DECL)
1169 	{
1170 	  /* We do use TREE_NOTHROW for ABI internals like __dynamic_cast,
1171 	     and for C library functions known not to throw.  */
1172 	  if (DECL_EXTERN_C_P (fn)
1173 	      && (DECL_ARTIFICIAL (fn)
1174 		  || nothrow_libfn_p (fn)))
1175 	    return TREE_NOTHROW (fn) ? NULL_TREE : fn;
1176 	  /* A call to a constexpr function is noexcept if the call
1177 	     is a constant expression.  */
1178 	  if (DECL_DECLARED_CONSTEXPR_P (fn)
1179 	      && is_sub_constant_expr (t))
1180 	    return NULL_TREE;
1181 	}
1182       if (!TYPE_NOTHROW_P (type))
1183 	return fn;
1184     }
1185 
1186   return NULL_TREE;
1187 }
1188 
1189 /* If a function that causes a noexcept-expression to be false isn't
1190    defined yet, remember it and check it for TREE_NOTHROW again at EOF.  */
1191 
1192 typedef struct GTY(()) pending_noexcept {
1193   tree fn;
1194   location_t loc;
1195 } pending_noexcept;
1196 static GTY(()) vec<pending_noexcept, va_gc> *pending_noexcept_checks;
1197 
1198 /* FN is a FUNCTION_DECL that caused a noexcept-expr to be false.  Warn if
1199    it can't throw.  */
1200 
1201 static void
1202 maybe_noexcept_warning (tree fn)
1203 {
1204   if (TREE_NOTHROW (fn))
1205     {
1206       warning (OPT_Wnoexcept, "noexcept-expression evaluates to %<false%> "
1207 	       "because of a call to %qD", fn);
1208       warning (OPT_Wnoexcept, "but %q+D does not throw; perhaps "
1209 	       "it should be declared %<noexcept%>", fn);
1210     }
1211 }
1212 
1213 /* Check any functions that weren't defined earlier when they caused a
1214    noexcept expression to evaluate to false.  */
1215 
1216 void
1217 perform_deferred_noexcept_checks (void)
1218 {
1219   int i;
1220   pending_noexcept *p;
1221   location_t saved_loc = input_location;
1222   FOR_EACH_VEC_SAFE_ELT (pending_noexcept_checks, i, p)
1223     {
1224       input_location = p->loc;
1225       maybe_noexcept_warning (p->fn);
1226     }
1227   input_location = saved_loc;
1228 }
1229 
1230 /* Evaluate noexcept ( EXPR ).  */
1231 
1232 tree
1233 finish_noexcept_expr (tree expr, tsubst_flags_t complain)
1234 {
1235   if (expr == error_mark_node)
1236     return error_mark_node;
1237 
1238   if (processing_template_decl)
1239     return build_min (NOEXCEPT_EXPR, boolean_type_node, expr);
1240 
1241   return (expr_noexcept_p (expr, complain)
1242 	  ? boolean_true_node : boolean_false_node);
1243 }
1244 
1245 /* Returns whether EXPR is noexcept, possibly warning if allowed by
1246    COMPLAIN.  */
1247 
1248 bool
1249 expr_noexcept_p (tree expr, tsubst_flags_t complain)
1250 {
1251   tree fn;
1252 
1253   if (expr == error_mark_node)
1254     return false;
1255 
1256   fn = cp_walk_tree_without_duplicates (&expr, check_noexcept_r, 0);
1257   if (fn)
1258     {
1259       if ((complain & tf_warning) && warn_noexcept
1260 	  && TREE_CODE (fn) == FUNCTION_DECL)
1261 	{
1262 	  if (!DECL_INITIAL (fn))
1263 	    {
1264 	      /* Not defined yet; check again at EOF.  */
1265 	      pending_noexcept p = {fn, input_location};
1266 	      vec_safe_push (pending_noexcept_checks, p);
1267 	    }
1268 	  else
1269 	    maybe_noexcept_warning (fn);
1270 	}
1271       return false;
1272     }
1273   else
1274     return true;
1275 }
1276 
1277 /* Return true iff SPEC is throw() or noexcept(true).  */
1278 
1279 bool
1280 nothrow_spec_p (const_tree spec)
1281 {
1282   gcc_assert (!DEFERRED_NOEXCEPT_SPEC_P (spec));
1283   if (spec == NULL_TREE
1284       || TREE_VALUE (spec) != NULL_TREE
1285       || spec == noexcept_false_spec)
1286     return false;
1287   if (TREE_PURPOSE (spec) == NULL_TREE
1288       || spec == noexcept_true_spec)
1289     return true;
1290   gcc_assert (processing_template_decl
1291 	      || TREE_PURPOSE (spec) == error_mark_node);
1292   return false;
1293 }
1294 
1295 /* For FUNCTION_TYPE or METHOD_TYPE, true if NODE is noexcept.  This is the
1296    case for things declared noexcept(true) and, with -fnothrow-opt, for
1297    throw() functions.  */
1298 
1299 bool
1300 type_noexcept_p (const_tree type)
1301 {
1302   tree spec = TYPE_RAISES_EXCEPTIONS (type);
1303   gcc_assert (!DEFERRED_NOEXCEPT_SPEC_P (spec));
1304   if (flag_nothrow_opt)
1305     return nothrow_spec_p (spec);
1306   else
1307     return spec == noexcept_true_spec;
1308 }
1309 
1310 /* For FUNCTION_TYPE or METHOD_TYPE, true if NODE can throw any type,
1311    i.e. no exception-specification or noexcept(false).  */
1312 
1313 bool
1314 type_throw_all_p (const_tree type)
1315 {
1316   tree spec = TYPE_RAISES_EXCEPTIONS (type);
1317   gcc_assert (!DEFERRED_NOEXCEPT_SPEC_P (spec));
1318   return spec == NULL_TREE || spec == noexcept_false_spec;
1319 }
1320 
1321 /* Create a representation of the noexcept-specification with
1322    constant-expression of EXPR.  COMPLAIN is as for tsubst.  */
1323 
1324 tree
1325 build_noexcept_spec (tree expr, int complain)
1326 {
1327   /* This isn't part of the signature, so don't bother trying to evaluate
1328      it until instantiation.  */
1329   if (!processing_template_decl && TREE_CODE (expr) != DEFERRED_NOEXCEPT)
1330     {
1331       expr = perform_implicit_conversion_flags (boolean_type_node, expr,
1332 						complain,
1333 						LOOKUP_NORMAL);
1334       expr = cxx_constant_value (expr);
1335     }
1336   if (TREE_CODE (expr) == INTEGER_CST)
1337     {
1338       if (operand_equal_p (expr, boolean_true_node, 0))
1339 	return noexcept_true_spec;
1340       else
1341 	{
1342 	  gcc_checking_assert (operand_equal_p (expr, boolean_false_node, 0));
1343 	  return noexcept_false_spec;
1344 	}
1345     }
1346   else if (expr == error_mark_node)
1347     return error_mark_node;
1348   else
1349     {
1350       gcc_assert (processing_template_decl
1351 		  || TREE_CODE (expr) == DEFERRED_NOEXCEPT);
1352       return build_tree_list (expr, NULL_TREE);
1353     }
1354 }
1355 
1356 /* Returns a noexcept-specifier to be evaluated later, for an
1357    implicitly-declared or explicitly defaulted special member function.  */
1358 
1359 tree
1360 unevaluated_noexcept_spec (void)
1361 {
1362   static tree spec;
1363   if (spec == NULL_TREE)
1364     spec = build_noexcept_spec (make_node (DEFERRED_NOEXCEPT), tf_none);
1365   return spec;
1366 }
1367 
1368 /* Returns a TRY_CATCH_EXPR that will put TRY_LIST and CATCH_LIST in the
1369    TRY and CATCH locations.  CATCH_LIST must be a STATEMENT_LIST */
1370 
1371 tree
1372 create_try_catch_expr (tree try_expr, tree catch_list)
1373 {
1374   location_t loc = EXPR_LOCATION (try_expr);
1375 
1376   append_to_statement_list (do_begin_catch (), &catch_list);
1377   append_to_statement_list (build_throw (NULL_TREE), &catch_list);
1378   tree catch_tf_expr = build_stmt (loc, TRY_FINALLY_EXPR, catch_list,
1379 				   do_end_catch (NULL_TREE));
1380   catch_list = build2 (CATCH_EXPR, void_type_node, NULL_TREE,
1381 		       catch_tf_expr);
1382   tree try_catch_expr = build_stmt (loc, TRY_CATCH_EXPR, try_expr, catch_list);
1383   return try_catch_expr;
1384 }
1385 
1386 #include "gt-cp-except.h"
1387