OSDN Git Service

351e685a68702279d902e4d512ae069cec507d50
[pf3gnuchains/gcc-fork.git] / gcc / cp / except.c
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.
8
9 This file is part of GCC.
10
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.
15
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.
20
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/>.  */
24
25
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"
39
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);
52
53 /* Sets up all the global eh stuff that needs to be initialized at the
54    start of compilation.  */
55
56 void
57 init_exception_processing (void)
58 {
59   tree tmp;
60
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 ();
68
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);
73 }
74
75 /* Returns an expression to be executed if an unhandled exception is
76    propagated out of a cleanup region.  */
77
78 tree
79 cp_protect_cleanup_actions (void)
80 {
81   /* [except.terminate]
82
83      When the destruction of an object during stack unwinding exits
84      using an exception ... void terminate(); is called.  */
85   return terminate_node;
86 }
87
88 static tree
89 prepare_eh_type (tree type)
90 {
91   if (type == NULL_TREE)
92     return type;
93   if (type == error_mark_node)
94     return error_mark_node;
95
96   /* peel back references, so they match.  */
97   type = non_reference (type);
98
99   /* Peel off cv qualifiers.  */
100   type = TYPE_MAIN_VARIANT (type);
101
102   /* Functions and arrays decay to pointers.  */
103   type = type_decays_to (type);
104
105   return type;
106 }
107
108 /* Return the type info for TYPE as used by EH machinery.  */
109 tree
110 eh_type_info (tree type)
111 {
112   tree exp;
113
114   if (type == NULL_TREE || type == error_mark_node)
115     return type;
116
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);
121
122   return exp;
123 }
124
125 /* Build the address of a typeinfo decl for use in the runtime
126    matching field of the exception model.  */
127
128 tree
129 build_eh_type_type (tree type)
130 {
131   tree exp = eh_type_info (type);
132
133   if (!exp)
134     return NULL;
135
136   mark_used (exp);
137
138   return convert (ptr_type_node, build_address (exp));
139 }
140
141 tree
142 build_exc_ptr (void)
143 {
144   return build_call_n (built_in_decls [BUILT_IN_EH_POINTER],
145                        1, integer_zero_node);
146 }
147
148 /* Declare a function NAME, returning RETURN_TYPE, taking a single
149    parameter PARM_TYPE, with an empty exception specification.
150
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++.  */
154
155 static tree
156 declare_nothrow_library_fn (tree name, tree return_type, tree parm_type)
157 {
158   return push_library_fn (name, build_function_type_list (return_type,
159                                                           parm_type,
160                                                           NULL_TREE),
161                           empty_except_spec);
162 }
163
164 /* Build up a call to __cxa_get_exception_ptr so that we can build a
165    copy constructor for the thrown object.  */
166
167 static tree
168 do_get_exception_ptr (void)
169 {
170   tree fn;
171
172   fn = get_identifier ("__cxa_get_exception_ptr");
173   if (!get_global_value_if_present (fn, &fn))
174     {
175       /* Declare void* __cxa_get_exception_ptr (void *) throw().  */
176       fn = declare_nothrow_library_fn (fn, ptr_type_node, ptr_type_node);
177     }
178
179   return cp_build_function_call_nary (fn, tf_warning_or_error,
180                                       build_exc_ptr (), NULL_TREE);
181 }
182
183 /* Build up a call to __cxa_begin_catch, to tell the runtime that the
184    exception has been handled.  */
185
186 static tree
187 do_begin_catch (void)
188 {
189   tree fn;
190
191   fn = get_identifier ("__cxa_begin_catch");
192   if (!get_global_value_if_present (fn, &fn))
193     {
194       /* Declare void* __cxa_begin_catch (void *) throw().  */
195       fn = declare_nothrow_library_fn (fn, ptr_type_node, ptr_type_node);
196     }
197
198   return cp_build_function_call_nary (fn, tf_warning_or_error,
199                                       build_exc_ptr (), NULL_TREE);
200 }
201
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.  */
204
205 static int
206 dtor_nothrow (tree type)
207 {
208   if (type == NULL_TREE || type == error_mark_node)
209     return 0;
210
211   if (TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
212     return 1;
213
214   if (CLASSTYPE_LAZY_DESTRUCTOR (type))
215     lazily_declare_fn (sfk_destructor, type);
216
217   return TREE_NOTHROW (CLASSTYPE_DESTRUCTORS (type));
218 }
219
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.  */
222
223 static tree
224 do_end_catch (tree type)
225 {
226   tree fn, cleanup;
227
228   fn = get_identifier ("__cxa_end_catch");
229   if (!get_global_value_if_present (fn, &fn))
230     {
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;
235     }
236
237   cleanup = cp_build_function_call_vec (fn, NULL, tf_warning_or_error);
238   TREE_NOTHROW (cleanup) = dtor_nothrow (type);
239
240   return cleanup;
241 }
242
243 /* This routine creates the cleanup for the current exception.  */
244
245 static void
246 push_eh_cleanup (tree type)
247 {
248   finish_decl_cleanup (NULL_TREE, do_end_catch (type));
249 }
250
251 /* Return nonzero value if DECL is a Java type suitable for catch or
252    throw.  */
253
254 static bool
255 decl_is_java_type (tree decl, int err)
256 {
257   bool r = (TREE_CODE (decl) == POINTER_TYPE
258             && TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE
259             && TYPE_FOR_JAVA (TREE_TYPE (decl)));
260
261   if (err)
262     {
263       if (TREE_CODE (decl) == REFERENCE_TYPE
264           && TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE
265           && TYPE_FOR_JAVA (TREE_TYPE (decl)))
266         {
267           /* Can't throw a reference.  */
268           error ("type %qT is disallowed in Java %<throw%> or %<catch%>",
269                  decl);
270         }
271
272       if (r)
273         {
274           tree jthrow_node
275             = IDENTIFIER_GLOBAL_VALUE (get_identifier ("jthrowable"));
276
277           if (jthrow_node == NULL_TREE)
278             fatal_error
279               ("call to Java %<catch%> or %<throw%> with %<jthrowable%> undefined");
280
281           jthrow_node = TREE_TYPE (TREE_TYPE (jthrow_node));
282
283           if (! DERIVED_FROM_P (jthrow_node, TREE_TYPE (decl)))
284             {
285               /* Thrown object must be a Throwable.  */
286               error ("type %qT is not derived from %<java::lang::Throwable%>",
287                      TREE_TYPE (decl));
288             }
289         }
290     }
291
292   return r;
293 }
294
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)
303 {
304   static enum {
305     chose_none,
306     chose_cpp,
307     chose_java,
308     gave_error
309   } state;
310
311   switch (state)
312     {
313     case gave_error:
314       return;
315
316     case chose_cpp:
317       if (lang != lang_cplusplus)
318         goto give_error;
319       return;
320
321     case chose_java:
322       if (lang != lang_java)
323         goto give_error;
324       return;
325
326     case chose_none:
327       ; /* Proceed to language selection.  */
328     }
329
330   switch (lang)
331     {
332     case lang_cplusplus:
333       state = chose_cpp;
334       break;
335
336     case lang_java:
337       state = chose_java;
338       terminate_node = built_in_decls [BUILT_IN_ABORT];
339       pragma_java_exceptions = true;
340       break;
341
342     default:
343       gcc_unreachable ();
344     }
345   return;
346
347  give_error:
348   error ("mixing C++ and Java catches in a single translation unit");
349   state = gave_error;
350 }
351
352 /* Initialize the catch parameter DECL.  */
353
354 static void
355 initialize_handler_parm (tree decl, tree exp)
356 {
357   tree init;
358   tree init_type;
359
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;
364
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);
371
372   choose_personality_routine (decl_is_java_type (init_type, 0)
373                               ? lang_java : lang_cplusplus);
374
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);
380
381   exp = ocp_convert (init_type, exp, CONV_IMPLICIT|CONV_FORCE_TEMP, 0);
382
383   init = convert_from_reference (exp);
384
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)))
388     {
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);
397     }
398
399   decl = pushdecl (decl);
400
401   start_decl_1 (decl, true);
402   cp_finish_decl (decl, init, /*init_const_expr_p=*/false, NULL_TREE,
403                   LOOKUP_ONLYCONVERTING|DIRECT_BIND);
404 }
405
406 \f
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.
410
411    This is used to ensure that -fexceptions has been specified if the
412    compiler tries to use any exception-specific functions.  */
413
414 static inline int
415 doing_eh (void)
416 {
417   if (! flag_exceptions)
418     {
419       static int warned = 0;
420       if (! warned)
421         {
422           error ("exception handling disabled, use -fexceptions to enable");
423           warned = 1;
424         }
425       return 0;
426     }
427   return 1;
428 }
429
430 /* Call this to start a catch block.  DECL is the catch parameter.  */
431
432 tree
433 expand_start_catch_block (tree decl)
434 {
435   tree exp;
436   tree type, init;
437
438   if (! doing_eh ())
439     return NULL_TREE;
440
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;
444
445   if (decl)
446     type = prepare_eh_type (TREE_TYPE (decl));
447   else
448     type = NULL_TREE;
449
450   if (decl && decl_is_java_type (type, 1))
451     {
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;
464     }
465
466   /* Call __cxa_end_catch at the end of processing the exception.  */
467   push_eh_cleanup (type);
468
469   init = do_begin_catch ();
470
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);
475
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)))
481     {
482       exp = do_get_exception_ptr ();
483       initialize_handler_parm (decl, exp);
484       finish_expr_stmt (init);
485     }
486
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
491     {
492       tree init_type = type;
493
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);
504     }
505
506   return type;
507 }
508
509
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.  */
513
514 void
515 expand_end_catch_block (void)
516 {
517   if (! doing_eh ())
518     return;
519
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));
526 }
527
528 tree
529 begin_eh_spec_block (void)
530 {
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)))
535     {
536       r = build_stmt (input_location, MUST_NOT_THROW_EXPR, NULL_TREE);
537       TREE_SIDE_EFFECTS (r) = 1;
538     }
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;
544 }
545
546 void
547 finish_eh_spec_block (tree raw_raises, tree eh_spec_block)
548 {
549   tree raises;
550
551   TREE_OPERAND (eh_spec_block, 0)
552     = pop_stmt_list (TREE_OPERAND (eh_spec_block, 0));
553
554   if (TREE_CODE (eh_spec_block) == MUST_NOT_THROW_EXPR)
555     return;
556
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))
561     {
562       tree type = prepare_eh_type (TREE_VALUE (raw_raises));
563       tree tinfo = eh_type_info (type);
564
565       mark_used (tinfo);
566       raises = tree_cons (NULL_TREE, type, raises);
567     }
568
569   EH_SPEC_RAISES (eh_spec_block) = raises;
570 }
571
572 /* Return a pointer to a buffer for an exception object of type TYPE.  */
573
574 static tree
575 do_allocate_exception (tree type)
576 {
577   tree fn;
578
579   fn = get_identifier ("__cxa_allocate_exception");
580   if (!get_global_value_if_present (fn, &fn))
581     {
582       /* Declare void *__cxa_allocate_exception(size_t) throw().  */
583       fn = declare_nothrow_library_fn (fn, ptr_type_node, size_type_node);
584     }
585
586   return cp_build_function_call_nary (fn, tf_warning_or_error,
587                                       size_in_bytes (type), NULL_TREE);
588 }
589
590 /* Call __cxa_free_exception from a cleanup.  This is never invoked
591    directly, but see the comment for stabilize_throw_expr.  */
592
593 static tree
594 do_free_exception (tree ptr)
595 {
596   tree fn;
597
598   fn = get_identifier ("__cxa_free_exception");
599   if (!get_global_value_if_present (fn, &fn))
600     {
601       /* Declare void __cxa_free_exception (void *) throw().  */
602       fn = declare_nothrow_library_fn (fn, void_type_node, ptr_type_node);
603     }
604
605   return cp_build_function_call_nary (fn, tf_warning_or_error, ptr, NULL_TREE);
606 }
607
608 /* Wrap all cleanups for TARGET_EXPRs in MUST_NOT_THROW_EXPR.
609    Called from build_throw via walk_tree_without_duplicates.  */
610
611 static tree
612 wrap_cleanups_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
613                  void *data ATTRIBUTE_UNUSED)
614 {
615   tree exp = *tp;
616   tree cleanup;
617
618   /* Don't walk into types.  */
619   if (TYPE_P (exp))
620     {
621       *walk_subtrees = 0;
622       return NULL_TREE;
623     }
624   if (TREE_CODE (exp) != TARGET_EXPR)
625     return NULL_TREE;
626
627   cleanup = TARGET_EXPR_CLEANUP (exp);
628   if (cleanup)
629     {
630       cleanup = build1 (MUST_NOT_THROW_EXPR, void_type_node, cleanup);
631       TARGET_EXPR_CLEANUP (exp) = cleanup;
632     }
633
634   /* Keep iterating.  */
635   return NULL_TREE;
636 }
637
638 /* Build a throw expression.  */
639
640 tree
641 build_throw (tree exp)
642 {
643   tree fn;
644
645   if (exp == error_mark_node)
646     return exp;
647
648   if (processing_template_decl)
649     {
650       if (cfun)
651         current_function_returns_abnormally = 1;
652       return build_min (THROW_EXPR, void_type_node, exp);
653     }
654
655   if (exp == null_node)
656     warning (0, "throwing NULL, which has integral, not pointer type");
657
658   if (exp != NULL_TREE)
659     {
660       if (!is_admissible_throw_operand (exp))
661         return error_mark_node;
662     }
663
664   if (! doing_eh ())
665     return error_mark_node;
666
667   if (exp && decl_is_java_type (TREE_TYPE (exp), 1))
668     {
669       tree fn = get_identifier ("_Jv_Throw");
670       if (!get_global_value_if_present (fn, &fn))
671         {
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);
677         }
678       else if (really_overloaded_fn (fn))
679         {
680           error ("%qD should never be overloaded", fn);
681           return error_mark_node;
682         }
683       fn = OVL_CURRENT (fn);
684       exp = cp_build_function_call_nary (fn, tf_warning_or_error,
685                                          exp, NULL_TREE);
686     }
687   else if (exp)
688     {
689       tree throw_type;
690       tree temp_type;
691       tree cleanup;
692       tree object, ptr;
693       tree tmp;
694       tree allocate_expr;
695
696       /* The CLEANUP_TYPE is the internal type of a destructor.  */
697       if (!cleanup_type)
698         {
699           tmp = build_function_type_list (void_type_node,
700                                           ptr_type_node, NULL_TREE);
701           cleanup_type = build_pointer_type (tmp);
702         }
703
704       fn = get_identifier ("__cxa_throw");
705       if (!get_global_value_if_present (fn, &fn))
706         {
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);
713         }
714
715       /* [except.throw]
716
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));
726
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.
732
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).  */
739
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;
746
747       object = build_nop (build_pointer_type (temp_type), ptr);
748       object = cp_build_indirect_ref (object, RO_NULL, tf_warning_or_error);
749
750       /* And initialize the exception object.  */
751       if (CLASS_TYPE_P (temp_type))
752         {
753           int flags = LOOKUP_NORMAL | LOOKUP_ONLYCONVERTING;
754           VEC(tree,gc) *exp_vec;
755
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;
766
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)
774             {
775               error ("  in thrown expression");
776               return error_mark_node;
777             }
778         }
779       else
780         {
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);
785         }
786
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);
790
791       /* Prepend the allocation.  */
792       exp = build2 (COMPOUND_EXPR, TREE_TYPE (exp), allocate_expr, exp);
793
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);
797
798       throw_type = build_eh_type_type (prepare_eh_type (TREE_TYPE (object)));
799
800       if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (object)))
801         {
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);
809         }
810       else
811         cleanup = build_int_cst (cleanup_type, 0);
812
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);
816
817       /* Tack on the initialization stuff.  */
818       exp = build2 (COMPOUND_EXPR, TREE_TYPE (tmp), exp, tmp);
819     }
820   else
821     {
822       /* Rethrow current exception.  */
823
824       tree fn = get_identifier ("__cxa_rethrow");
825       if (!get_global_value_if_present (fn, &fn))
826         {
827           /* Declare void __cxa_rethrow (void).  */
828           fn = push_throw_library_fn
829             (fn, build_function_type_list (void_type_node, NULL_TREE));
830         }
831
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);
835     }
836
837   exp = build1 (THROW_EXPR, void_type_node, exp);
838
839   return exp;
840 }
841
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.  */
846
847 static int
848 complete_ptr_ref_or_void_ptr_p (tree type, tree from)
849 {
850   int is_ptr;
851
852   /* Check complete.  */
853   type = complete_type_or_else (type, from);
854   if (!type)
855     return 0;
856
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)
860     {
861       tree core = TREE_TYPE (type);
862
863       if (is_ptr && VOID_TYPE_P (core))
864         /* OK */;
865       else if (!complete_type_or_else (core, from))
866         return 0;
867     }
868   return 1;
869 }
870
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.  */
874
875 static bool
876 is_admissible_throw_operand (tree expr)
877 {
878   tree type = TREE_TYPE (expr);
879
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;
889
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))
894     {
895       error ("expression %qE of abstract class type %qT cannot "
896              "be used in throw-expression", expr, type);
897       return false;
898     }
899
900   return true;
901 }
902
903 /* Returns nonzero if FN is a declaration of a standard C library
904    function which is known not to throw.
905
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.  */
910
911 #include "cfns.h"
912
913 int
914 nothrow_libfn_p (const_tree fn)
915 {
916   tree id;
917
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;
926
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));
932 }
933
934 /* Returns nonzero if an exception of type FROM will be caught by a
935    handler for type TO, as per [except.handle].  */
936
937 static int
938 can_convert_eh (tree to, tree from)
939 {
940   to = non_reference (to);
941   from = non_reference (from);
942
943   if (TREE_CODE (to) == POINTER_TYPE && TREE_CODE (from) == POINTER_TYPE)
944     {
945       to = TREE_TYPE (to);
946       from = TREE_TYPE (from);
947
948       if (! at_least_as_qualified_p (to, from))
949         return 0;
950
951       if (TREE_CODE (to) == VOID_TYPE)
952         return 1;
953
954       /* Else fall through.  */
955     }
956
957   if (CLASS_TYPE_P (to) && CLASS_TYPE_P (from)
958       && PUBLICLY_UNIQUELY_DERIVED_P (to, from))
959     return 1;
960
961   return 0;
962 }
963
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.  */
969
970 static void
971 check_handlers_1 (tree master, tree_stmt_iterator i)
972 {
973   tree type = TREE_TYPE (master);
974
975   for (; !tsi_end_p (i); tsi_next (&i))
976     {
977       tree handler = tsi_stmt (i);
978       if (TREE_TYPE (handler) && can_convert_eh (type, TREE_TYPE (handler)))
979         {
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;
986         }
987     }
988 }
989
990 /* Given a STATEMENT_LIST of HANDLERs, make sure that they're OK.  */
991
992 void
993 check_handlers (tree handlers)
994 {
995   tree_stmt_iterator i;
996
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;
1001
1002   i = tsi_start (handlers);
1003   if (!tsi_end_p (i))
1004     while (1)
1005       {
1006         tree handler = tsi_stmt (i);
1007         tsi_next (&i);
1008
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);
1017       }
1018 }
1019
1020 /* walk_tree helper for finish_noexcept_expr.  Returns non-null if the
1021    expression *TP causes the noexcept operator to evaluate to false.
1022
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).  */
1033
1034 static tree
1035 check_noexcept_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
1036                   void *data ATTRIBUTE_UNUSED)
1037 {
1038   tree t = *tp;
1039   enum tree_code code = TREE_CODE (t);
1040   if (code == CALL_EXPR
1041       || code == AGGR_INIT_EXPR)
1042     {
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.
1047
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));
1052
1053       STRIP_NOPS (fn);
1054       if (TREE_CODE (fn) == ADDR_EXPR)
1055         {
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;
1064         }
1065       if (!TYPE_NOTHROW_P (type))
1066         return fn;
1067     }
1068
1069   return NULL_TREE;
1070 }
1071
1072 /* If a function that causes a noexcept-expression to be false isn't
1073    defined yet, remember it and check it for TREE_NOTHROW again at EOF.  */
1074
1075 typedef struct GTY(()) pending_noexcept {
1076   tree fn;
1077   location_t loc;
1078 } pending_noexcept;
1079 DEF_VEC_O(pending_noexcept);
1080 DEF_VEC_ALLOC_O(pending_noexcept,gc);
1081 static GTY(()) VEC(pending_noexcept,gc) *pending_noexcept_checks;
1082
1083 /* FN is a FUNCTION_DECL that caused a noexcept-expr to be false.  Warn if
1084    it can't throw.  */
1085
1086 static void
1087 maybe_noexcept_warning (tree fn)
1088 {
1089   if (TREE_NOTHROW (fn))
1090     {
1091       warning (OPT_Wnoexcept, "noexcept-expression evaluates to %<false%> "
1092                "because of a call to %qD", fn);
1093       warning (OPT_Wnoexcept, "but %q+D does not throw; perhaps "
1094                "it should be declared %<noexcept%>", fn);
1095     }
1096 }
1097
1098 /* Check any functions that weren't defined earlier when they caused a
1099    noexcept expression to evaluate to false.  */
1100
1101 void
1102 perform_deferred_noexcept_checks (void)
1103 {
1104   int i;
1105   pending_noexcept *p;
1106   location_t saved_loc = input_location;
1107   FOR_EACH_VEC_ELT (pending_noexcept, pending_noexcept_checks, i, p)
1108     {
1109       input_location = p->loc;
1110       maybe_noexcept_warning (p->fn);
1111     }
1112   input_location = saved_loc;
1113 }
1114
1115 /* Evaluate noexcept ( EXPR ).  */
1116
1117 tree
1118 finish_noexcept_expr (tree expr, tsubst_flags_t complain)
1119 {
1120   tree fn;
1121
1122   if (processing_template_decl)
1123     return build_min (NOEXCEPT_EXPR, boolean_type_node, expr);
1124
1125   fn = cp_walk_tree_without_duplicates (&expr, check_noexcept_r, 0);
1126   if (fn)
1127     {
1128       if ((complain & tf_warning) && warn_noexcept
1129           && TREE_CODE (fn) == FUNCTION_DECL)
1130         {
1131           if (!DECL_INITIAL (fn))
1132             {
1133               /* Not defined yet; check again at EOF.  */
1134               pending_noexcept *p
1135                 = VEC_safe_push (pending_noexcept, gc,
1136                                  pending_noexcept_checks, NULL);
1137               p->fn = fn;
1138               p->loc = input_location;
1139             }
1140           else
1141             maybe_noexcept_warning (fn);
1142         }
1143       return boolean_false_node;
1144     }
1145   else
1146     return boolean_true_node;
1147 }
1148
1149 /* Return true iff SPEC is throw() or noexcept(true).  */
1150
1151 bool
1152 nothrow_spec_p (const_tree spec)
1153 {
1154   if (spec == NULL_TREE
1155       || TREE_VALUE (spec) != NULL_TREE
1156       || spec == noexcept_false_spec)
1157     return false;
1158   if (TREE_PURPOSE (spec) == NULL_TREE
1159       || spec == noexcept_true_spec)
1160     return true;
1161   gcc_assert (processing_template_decl
1162               || TREE_PURPOSE (spec) == error_mark_node);
1163   return false;
1164 }
1165
1166 /* For FUNCTION_TYPE or METHOD_TYPE, true if NODE is noexcept.  This is the
1167    case for things declared noexcept(true) and, with -fnothrow-opt, for
1168    throw() functions.  */
1169
1170 bool
1171 type_noexcept_p (const_tree type)
1172 {
1173   tree spec = TYPE_RAISES_EXCEPTIONS (type);
1174   if (flag_nothrow_opt)
1175     return nothrow_spec_p (spec);
1176   else
1177     return spec == noexcept_true_spec;
1178 }
1179
1180 /* For FUNCTION_TYPE or METHOD_TYPE, true if NODE can throw any type,
1181    i.e. no exception-specification or noexcept(false).  */
1182
1183 bool
1184 type_throw_all_p (const_tree type)
1185 {
1186   tree spec = TYPE_RAISES_EXCEPTIONS (type);
1187   return spec == NULL_TREE || spec == noexcept_false_spec;
1188 }
1189
1190 /* Create a representation of the noexcept-specification with
1191    constant-expression of EXPR.  COMPLAIN is as for tsubst.  */
1192
1193 tree
1194 build_noexcept_spec (tree expr, int complain)
1195 {
1196   expr = perform_implicit_conversion_flags (boolean_type_node, expr,
1197                                             complain,
1198                                             LOOKUP_NORMAL);
1199   if (expr == boolean_true_node)
1200     return noexcept_true_spec;
1201   else if (expr == boolean_false_node)
1202     return noexcept_false_spec;
1203   else
1204     {
1205       gcc_assert (processing_template_decl || expr == error_mark_node);
1206       return build_tree_list (expr, NULL_TREE);
1207     }
1208 }