OSDN Git Service

contrib/
[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
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 "rtl.h"
32 #include "expr.h"
33 #include "libfuncs.h"
34 #include "cp-tree.h"
35 #include "flags.h"
36 #include "output.h"
37 #include "except.h"
38 #include "toplev.h"
39 #include "tree-inline.h"
40 #include "tree-iterator.h"
41 #include "target.h"
42 #include "gimple.h"
43
44 static void push_eh_cleanup (tree);
45 static tree prepare_eh_type (tree);
46 static tree build_eh_type_type (tree);
47 static tree do_begin_catch (void);
48 static int dtor_nothrow (tree);
49 static tree do_end_catch (tree);
50 static bool decl_is_java_type (tree decl, int err);
51 static void initialize_handler_parm (tree, tree);
52 static tree do_allocate_exception (tree);
53 static tree wrap_cleanups_r (tree *, int *, void *);
54 static int complete_ptr_ref_or_void_ptr_p (tree, tree);
55 static bool is_admissible_throw_operand (tree);
56 static int can_convert_eh (tree, tree);
57 static gimple cp_protect_cleanup_actions (void);
58
59 /* Sets up all the global eh stuff that needs to be initialized at the
60    start of compilation.  */
61
62 void
63 init_exception_processing (void)
64 {
65   tree tmp;
66
67   /* void std::terminate (); */
68   push_namespace (std_identifier);
69   tmp = build_function_type (void_type_node, void_list_node);
70   terminate_node = build_cp_library_fn_ptr ("terminate", tmp);
71   TREE_THIS_VOLATILE (terminate_node) = 1;
72   TREE_NOTHROW (terminate_node) = 1;
73   pop_namespace ();
74
75   /* void __cxa_call_unexpected(void *); */
76   tmp = tree_cons (NULL_TREE, ptr_type_node, void_list_node);
77   tmp = build_function_type (void_type_node, tmp);
78   call_unexpected_node
79     = push_throw_library_fn (get_identifier ("__cxa_call_unexpected"), tmp);
80
81   eh_personality_libfunc = init_one_libfunc (USING_SJLJ_EXCEPTIONS
82                                              ? "__gxx_personality_sj0"
83                                              : "__gxx_personality_v0");
84   if (targetm.arm_eabi_unwinder)
85     unwind_resume_libfunc = init_one_libfunc ("__cxa_end_cleanup");
86   else
87     default_init_unwind_resume_libfunc ();
88
89   lang_eh_runtime_type = build_eh_type_type;
90   lang_protect_cleanup_actions = &cp_protect_cleanup_actions;
91 }
92
93 /* Returns an expression to be executed if an unhandled exception is
94    propagated out of a cleanup region.  */
95
96 static gimple
97 cp_protect_cleanup_actions (void)
98 {
99   /* [except.terminate]
100
101      When the destruction of an object during stack unwinding exits
102      using an exception ... void terminate(); is called.  */
103   return gimple_build_call (terminate_node, 0);
104 }
105
106 static tree
107 prepare_eh_type (tree type)
108 {
109   if (type == NULL_TREE)
110     return type;
111   if (type == error_mark_node)
112     return error_mark_node;
113
114   /* peel back references, so they match.  */
115   type = non_reference (type);
116
117   /* Peel off cv qualifiers.  */
118   type = TYPE_MAIN_VARIANT (type);
119
120   /* Functions and arrays decay to pointers.  */
121   type = type_decays_to (type);
122
123   return type;
124 }
125
126 /* Return the type info for TYPE as used by EH machinery.  */
127 tree
128 eh_type_info (tree type)
129 {
130   tree exp;
131
132   if (type == NULL_TREE || type == error_mark_node)
133     return type;
134
135   if (decl_is_java_type (type, 0))
136     exp = build_java_class_ref (TREE_TYPE (type));
137   else
138     exp = get_tinfo_decl (type);
139
140   return exp;
141 }
142
143 /* Build the address of a typeinfo decl for use in the runtime
144    matching field of the exception model.  */
145
146 static tree
147 build_eh_type_type (tree type)
148 {
149   tree exp = eh_type_info (type);
150
151   if (!exp)
152     return NULL;
153
154   mark_used (exp);
155
156   return convert (ptr_type_node, build_address (exp));
157 }
158
159 tree
160 build_exc_ptr (void)
161 {
162   return build0 (EXC_PTR_EXPR, ptr_type_node);
163 }
164
165 /* Declare a function NAME, returning RETURN_TYPE, taking a single
166    parameter PARM_TYPE, with an empty exception specification.
167
168    Note that the C++ ABI document does not have a throw-specifier on
169    the routines declared below via this function.  The declarations
170    are consistent with the actual implementations in libsupc++.  */
171
172 static tree
173 declare_nothrow_library_fn (tree name, tree return_type, tree parm_type)
174 {
175   tree tmp = tree_cons (NULL_TREE, parm_type, void_list_node);
176   return push_library_fn (name, build_function_type (return_type, tmp),
177                           empty_except_spec);
178 }
179
180 /* Build up a call to __cxa_get_exception_ptr so that we can build a
181    copy constructor for the thrown object.  */
182
183 static tree
184 do_get_exception_ptr (void)
185 {
186   tree fn;
187
188   fn = get_identifier ("__cxa_get_exception_ptr");
189   if (!get_global_value_if_present (fn, &fn))
190     {
191       /* Declare void* __cxa_get_exception_ptr (void *) throw().  */
192       fn = declare_nothrow_library_fn (fn, ptr_type_node, ptr_type_node);
193     }
194
195   return cp_build_function_call (fn, tree_cons (NULL_TREE, build_exc_ptr (),
196                                                 NULL_TREE),
197                                  tf_warning_or_error);
198 }
199
200 /* Build up a call to __cxa_begin_catch, to tell the runtime that the
201    exception has been handled.  */
202
203 static tree
204 do_begin_catch (void)
205 {
206   tree fn;
207
208   fn = get_identifier ("__cxa_begin_catch");
209   if (!get_global_value_if_present (fn, &fn))
210     {
211       /* Declare void* __cxa_begin_catch (void *) throw().  */
212       fn = declare_nothrow_library_fn (fn, ptr_type_node, ptr_type_node);
213     }
214
215   return cp_build_function_call (fn, tree_cons (NULL_TREE, build_exc_ptr (),
216                                                 NULL_TREE),
217                                  tf_warning_or_error);
218 }
219
220 /* Returns nonzero if cleaning up an exception of type TYPE (which can be
221    NULL_TREE for a ... handler) will not throw an exception.  */
222
223 static int
224 dtor_nothrow (tree type)
225 {
226   if (type == NULL_TREE)
227     return 0;
228
229   if (!CLASS_TYPE_P (type))
230     return 1;
231
232   if (CLASSTYPE_LAZY_DESTRUCTOR (type))
233     lazily_declare_fn (sfk_destructor, type);
234
235   return TREE_NOTHROW (CLASSTYPE_DESTRUCTORS (type));
236 }
237
238 /* Build up a call to __cxa_end_catch, to destroy the exception object
239    for the current catch block if no others are currently using it.  */
240
241 static tree
242 do_end_catch (tree type)
243 {
244   tree fn, cleanup;
245
246   fn = get_identifier ("__cxa_end_catch");
247   if (!get_global_value_if_present (fn, &fn))
248     {
249       /* Declare void __cxa_end_catch ().  */
250       fn = push_void_library_fn (fn, void_list_node);
251       /* This can throw if the destructor for the exception throws.  */
252       TREE_NOTHROW (fn) = 0;
253     }
254
255   cleanup = cp_build_function_call (fn, NULL_TREE, tf_warning_or_error);
256   TREE_NOTHROW (cleanup) = dtor_nothrow (type);
257
258   return cleanup;
259 }
260
261 /* This routine creates the cleanup for the current exception.  */
262
263 static void
264 push_eh_cleanup (tree type)
265 {
266   finish_decl_cleanup (NULL_TREE, do_end_catch (type));
267 }
268
269 /* Return nonzero value if DECL is a Java type suitable for catch or
270    throw.  */
271
272 static bool
273 decl_is_java_type (tree decl, int err)
274 {
275   bool r = (TREE_CODE (decl) == POINTER_TYPE
276             && TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE
277             && TYPE_FOR_JAVA (TREE_TYPE (decl)));
278
279   if (err)
280     {
281       if (TREE_CODE (decl) == REFERENCE_TYPE
282           && TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE
283           && TYPE_FOR_JAVA (TREE_TYPE (decl)))
284         {
285           /* Can't throw a reference.  */
286           error ("type %qT is disallowed in Java %<throw%> or %<catch%>",
287                  decl);
288         }
289
290       if (r)
291         {
292           tree jthrow_node
293             = IDENTIFIER_GLOBAL_VALUE (get_identifier ("jthrowable"));
294
295           if (jthrow_node == NULL_TREE)
296             fatal_error
297               ("call to Java %<catch%> or %<throw%> with %<jthrowable%> undefined");
298
299           jthrow_node = TREE_TYPE (TREE_TYPE (jthrow_node));
300
301           if (! DERIVED_FROM_P (jthrow_node, TREE_TYPE (decl)))
302             {
303               /* Thrown object must be a Throwable.  */
304               error ("type %qT is not derived from %<java::lang::Throwable%>",
305                      TREE_TYPE (decl));
306             }
307         }
308     }
309
310   return r;
311 }
312
313 /* Select the personality routine to be used for exception handling,
314    or issue an error if we need two different ones in the same
315    translation unit.
316    ??? At present eh_personality_libfunc is set to
317    __gxx_personality_(sj|v)0 in init_exception_processing - should it
318    be done here instead?  */
319 void
320 choose_personality_routine (enum languages lang)
321 {
322   static enum {
323     chose_none,
324     chose_cpp,
325     chose_java,
326     gave_error
327   } state;
328
329   switch (state)
330     {
331     case gave_error:
332       return;
333
334     case chose_cpp:
335       if (lang != lang_cplusplus)
336         goto give_error;
337       return;
338
339     case chose_java:
340       if (lang != lang_java)
341         goto give_error;
342       return;
343
344     case chose_none:
345       ; /* Proceed to language selection.  */
346     }
347
348   switch (lang)
349     {
350     case lang_cplusplus:
351       state = chose_cpp;
352       break;
353
354     case lang_java:
355       state = chose_java;
356       eh_personality_libfunc = init_one_libfunc (USING_SJLJ_EXCEPTIONS
357                                                  ? "__gcj_personality_sj0"
358                                                  : "__gcj_personality_v0");
359       break;
360
361     default:
362       gcc_unreachable ();
363     }
364   return;
365
366  give_error:
367   error ("mixing C++ and Java catches in a single translation unit");
368   state = gave_error;
369 }
370
371 /* Initialize the catch parameter DECL.  */
372
373 static void
374 initialize_handler_parm (tree decl, tree exp)
375 {
376   tree init;
377   tree init_type;
378
379   /* Make sure we mark the catch param as used, otherwise we'll get a
380      warning about an unused ((anonymous)).  */
381   TREE_USED (decl) = 1;
382
383   /* Figure out the type that the initializer is.  Pointers are returned
384      adjusted by value from __cxa_begin_catch.  Others are returned by
385      reference.  */
386   init_type = TREE_TYPE (decl);
387   if (!POINTER_TYPE_P (init_type))
388     init_type = build_reference_type (init_type);
389
390   choose_personality_routine (decl_is_java_type (init_type, 0)
391                               ? lang_java : lang_cplusplus);
392
393   /* Since pointers are passed by value, initialize a reference to
394      pointer catch parm with the address of the temporary.  */
395   if (TREE_CODE (init_type) == REFERENCE_TYPE
396       && TYPE_PTR_P (TREE_TYPE (init_type)))
397     exp = cp_build_unary_op (ADDR_EXPR, exp, 1, tf_warning_or_error);
398
399   exp = ocp_convert (init_type, exp, CONV_IMPLICIT|CONV_FORCE_TEMP, 0);
400
401   init = convert_from_reference (exp);
402
403   /* If the constructor for the catch parm exits via an exception, we
404      must call terminate.  See eh23.C.  */
405   if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
406     {
407       /* Generate the copy constructor call directly so we can wrap it.
408          See also expand_default_init.  */
409       init = ocp_convert (TREE_TYPE (decl), init,
410                           CONV_IMPLICIT|CONV_FORCE_TEMP, 0);
411       /* Force cleanups now to avoid nesting problems with the
412          MUST_NOT_THROW_EXPR.  */
413       init = fold_build_cleanup_point_expr (TREE_TYPE (init), init);
414       init = build1 (MUST_NOT_THROW_EXPR, TREE_TYPE (init), init);
415     }
416
417   decl = pushdecl (decl);
418
419   start_decl_1 (decl, true);
420   cp_finish_decl (decl, init, /*init_const_expr_p=*/false, NULL_TREE,
421                   LOOKUP_ONLYCONVERTING|DIRECT_BIND);
422 }
423
424 /* Call this to start a catch block.  DECL is the catch parameter.  */
425
426 tree
427 expand_start_catch_block (tree decl)
428 {
429   tree exp;
430   tree type;
431
432   if (! doing_eh (1))
433     return NULL_TREE;
434
435   /* Make sure this declaration is reasonable.  */
436   if (decl && !complete_ptr_ref_or_void_ptr_p (TREE_TYPE (decl), NULL_TREE))
437     decl = error_mark_node;
438
439   if (decl)
440     type = prepare_eh_type (TREE_TYPE (decl));
441   else
442     type = NULL_TREE;
443
444   if (decl && decl_is_java_type (type, 1))
445     {
446       /* Java only passes object via pointer and doesn't require
447          adjusting.  The java object is immediately before the
448          generic exception header.  */
449       exp = build_exc_ptr ();
450       exp = build1 (NOP_EXPR, build_pointer_type (type), exp);
451       exp = build2 (POINTER_PLUS_EXPR, TREE_TYPE (exp), exp,
452                     fold_build1 (NEGATE_EXPR, sizetype,
453                                  TYPE_SIZE_UNIT (TREE_TYPE (exp))));
454       exp = cp_build_indirect_ref (exp, NULL, tf_warning_or_error);
455       initialize_handler_parm (decl, exp);
456       return type;
457     }
458
459   /* Call __cxa_end_catch at the end of processing the exception.  */
460   push_eh_cleanup (type);
461
462   /* If there's no decl at all, then all we need to do is make sure
463      to tell the runtime that we've begun handling the exception.  */
464   if (decl == NULL || decl == error_mark_node)
465     finish_expr_stmt (do_begin_catch ());
466
467   /* If the C++ object needs constructing, we need to do that before
468      calling __cxa_begin_catch, so that std::uncaught_exception gets
469      the right value during the copy constructor.  */
470   else if (flag_use_cxa_get_exception_ptr
471            && TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
472     {
473       exp = do_get_exception_ptr ();
474       initialize_handler_parm (decl, exp);
475       finish_expr_stmt (do_begin_catch ());
476     }
477
478   /* Otherwise the type uses a bitwise copy, and we don't have to worry
479      about the value of std::uncaught_exception and therefore can do the
480      copy with the return value of __cxa_end_catch instead.  */
481   else
482     {
483       tree init = do_begin_catch ();
484       tree init_type = type;
485
486       /* Pointers are passed by values, everything else by reference.  */
487       if (!TYPE_PTR_P (type))
488         init_type = build_pointer_type (type);
489       if (init_type != TREE_TYPE (init))
490         init = build1 (NOP_EXPR, init_type, init);
491       exp = create_temporary_var (init_type);
492       DECL_REGISTER (exp) = 1;
493       cp_finish_decl (exp, init, /*init_const_expr=*/false,
494                       NULL_TREE, LOOKUP_ONLYCONVERTING);
495       initialize_handler_parm (decl, exp);
496     }
497
498   return type;
499 }
500
501
502 /* Call this to end a catch block.  Its responsible for emitting the
503    code to handle jumping back to the correct place, and for emitting
504    the label to jump to if this catch block didn't match.  */
505
506 void
507 expand_end_catch_block (void)
508 {
509   if (! doing_eh (1))
510     return;
511
512   /* The exception being handled is rethrown if control reaches the end of
513      a handler of the function-try-block of a constructor or destructor.  */
514   if (in_function_try_handler
515       && (DECL_CONSTRUCTOR_P (current_function_decl)
516           || DECL_DESTRUCTOR_P (current_function_decl)))
517     finish_expr_stmt (build_throw (NULL_TREE));
518 }
519
520 tree
521 begin_eh_spec_block (void)
522 {
523   tree r = build_stmt (EH_SPEC_BLOCK, NULL_TREE, NULL_TREE);
524   add_stmt (r);
525   EH_SPEC_STMTS (r) = push_stmt_list ();
526   return r;
527 }
528
529 void
530 finish_eh_spec_block (tree raw_raises, tree eh_spec_block)
531 {
532   tree raises;
533
534   EH_SPEC_STMTS (eh_spec_block) = pop_stmt_list (EH_SPEC_STMTS (eh_spec_block));
535
536   /* Strip cv quals, etc, from the specification types.  */
537   for (raises = NULL_TREE;
538        raw_raises && TREE_VALUE (raw_raises);
539        raw_raises = TREE_CHAIN (raw_raises))
540     {
541       tree type = prepare_eh_type (TREE_VALUE (raw_raises));
542       tree tinfo = eh_type_info (type);
543
544       mark_used (tinfo);
545       raises = tree_cons (NULL_TREE, type, raises);
546     }
547
548   EH_SPEC_RAISES (eh_spec_block) = raises;
549 }
550
551 /* Return a pointer to a buffer for an exception object of type TYPE.  */
552
553 static tree
554 do_allocate_exception (tree type)
555 {
556   tree fn;
557
558   fn = get_identifier ("__cxa_allocate_exception");
559   if (!get_global_value_if_present (fn, &fn))
560     {
561       /* Declare void *__cxa_allocate_exception(size_t) throw().  */
562       fn = declare_nothrow_library_fn (fn, ptr_type_node, size_type_node);
563     }
564
565   return cp_build_function_call (fn, 
566                                  tree_cons (NULL_TREE, size_in_bytes (type),
567                                             NULL_TREE),
568                                  tf_warning_or_error);
569 }
570
571 /* Call __cxa_free_exception from a cleanup.  This is never invoked
572    directly, but see the comment for stabilize_throw_expr.  */
573
574 static tree
575 do_free_exception (tree ptr)
576 {
577   tree fn;
578
579   fn = get_identifier ("__cxa_free_exception");
580   if (!get_global_value_if_present (fn, &fn))
581     {
582       /* Declare void __cxa_free_exception (void *) throw().  */
583       fn = declare_nothrow_library_fn (fn, void_type_node, ptr_type_node);
584     }
585
586   return cp_build_function_call (fn, tree_cons (NULL_TREE, ptr, NULL_TREE),
587                                  tf_warning_or_error);
588 }
589
590 /* Wrap all cleanups for TARGET_EXPRs in MUST_NOT_THROW_EXPR.
591    Called from build_throw via walk_tree_without_duplicates.  */
592
593 static tree
594 wrap_cleanups_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
595                  void *data ATTRIBUTE_UNUSED)
596 {
597   tree exp = *tp;
598   tree cleanup;
599
600   /* Don't walk into types.  */
601   if (TYPE_P (exp))
602     {
603       *walk_subtrees = 0;
604       return NULL_TREE;
605     }
606   if (TREE_CODE (exp) != TARGET_EXPR)
607     return NULL_TREE;
608
609   cleanup = TARGET_EXPR_CLEANUP (exp);
610   if (cleanup)
611     {
612       cleanup = build1 (MUST_NOT_THROW_EXPR, void_type_node, cleanup);
613       TARGET_EXPR_CLEANUP (exp) = cleanup;
614     }
615
616   /* Keep iterating.  */
617   return NULL_TREE;
618 }
619
620 /* Build a throw expression.  */
621
622 tree
623 build_throw (tree exp)
624 {
625   tree fn;
626
627   if (exp == error_mark_node)
628     return exp;
629
630   if (processing_template_decl)
631     {
632       if (cfun)
633         current_function_returns_abnormally = 1;
634       return build_min (THROW_EXPR, void_type_node, exp);
635     }
636
637   if (exp == null_node)
638     warning (0, "throwing NULL, which has integral, not pointer type");
639
640   if (exp != NULL_TREE)
641     {
642       if (!is_admissible_throw_operand (exp))
643         return error_mark_node;
644     }
645
646   if (! doing_eh (1))
647     return error_mark_node;
648
649   if (exp && decl_is_java_type (TREE_TYPE (exp), 1))
650     {
651       tree fn = get_identifier ("_Jv_Throw");
652       if (!get_global_value_if_present (fn, &fn))
653         {
654           /* Declare void _Jv_Throw (void *).  */
655           tree tmp = tree_cons (NULL_TREE, ptr_type_node, void_list_node);
656           tmp = build_function_type (ptr_type_node, tmp);
657           fn = push_throw_library_fn (fn, tmp);
658         }
659       else if (really_overloaded_fn (fn))
660         {
661           error ("%qD should never be overloaded", fn);
662           return error_mark_node;
663         }
664       fn = OVL_CURRENT (fn);
665       exp = cp_build_function_call (fn, tree_cons (NULL_TREE, exp, NULL_TREE),
666                                     tf_warning_or_error);
667     }
668   else if (exp)
669     {
670       tree throw_type;
671       tree temp_type;
672       tree cleanup;
673       tree object, ptr;
674       tree tmp;
675       tree temp_expr, allocate_expr;
676       bool elided;
677
678       /* The CLEANUP_TYPE is the internal type of a destructor.  */
679       if (!cleanup_type)
680         {
681           tmp = void_list_node;
682           tmp = tree_cons (NULL_TREE, ptr_type_node, tmp);
683           tmp = build_function_type (void_type_node, tmp);
684           cleanup_type = build_pointer_type (tmp);
685         }
686
687       fn = get_identifier ("__cxa_throw");
688       if (!get_global_value_if_present (fn, &fn))
689         {
690           /* Declare void __cxa_throw (void*, void*, void (*)(void*)).  */
691           /* ??? Second argument is supposed to be "std::type_info*".  */
692           tmp = void_list_node;
693           tmp = tree_cons (NULL_TREE, cleanup_type, tmp);
694           tmp = tree_cons (NULL_TREE, ptr_type_node, tmp);
695           tmp = tree_cons (NULL_TREE, ptr_type_node, tmp);
696           tmp = build_function_type (void_type_node, tmp);
697           fn = push_throw_library_fn (fn, tmp);
698         }
699
700       /* [except.throw]
701
702          A throw-expression initializes a temporary object, the type
703          of which is determined by removing any top-level
704          cv-qualifiers from the static type of the operand of throw
705          and adjusting the type from "array of T" or "function return
706          T" to "pointer to T" or "pointer to function returning T"
707          respectively.  */
708       temp_type = is_bitfield_expr_with_lowered_type (exp);
709       if (!temp_type)
710         temp_type = type_decays_to (TREE_TYPE (exp));
711
712       /* OK, this is kind of wacky.  The standard says that we call
713          terminate when the exception handling mechanism, after
714          completing evaluation of the expression to be thrown but
715          before the exception is caught (_except.throw_), calls a
716          user function that exits via an uncaught exception.
717
718          So we have to protect the actual initialization of the
719          exception object with terminate(), but evaluate the
720          expression first.  Since there could be temps in the
721          expression, we need to handle that, too.  We also expand
722          the call to __cxa_allocate_exception first (which doesn't
723          matter, since it can't throw).  */
724
725       /* Allocate the space for the exception.  */
726       allocate_expr = do_allocate_exception (temp_type);
727       allocate_expr = get_target_expr (allocate_expr);
728       ptr = TARGET_EXPR_SLOT (allocate_expr);
729       object = build_nop (build_pointer_type (temp_type), ptr);
730       object = cp_build_indirect_ref (object, NULL, tf_warning_or_error);
731
732       elided = (TREE_CODE (exp) == TARGET_EXPR);
733
734       /* And initialize the exception object.  */
735       if (CLASS_TYPE_P (temp_type))
736         {
737           int flags = LOOKUP_NORMAL | LOOKUP_ONLYCONVERTING;
738
739           /* Under C++0x [12.8/16 class.copy], a thrown lvalue is sometimes
740              treated as an rvalue for the purposes of overload resolution
741              to favor move constructors over copy constructors.  */
742           if (/* Must be a local, automatic variable.  */
743               TREE_CODE (exp) == VAR_DECL
744               && DECL_CONTEXT (exp) == current_function_decl
745               && ! TREE_STATIC (exp)
746               /* The variable must not have the `volatile' qualifier.  */
747               && !(cp_type_quals (TREE_TYPE (exp)) & TYPE_QUAL_VOLATILE))
748             flags = flags | LOOKUP_PREFER_RVALUE;
749
750           /* Call the copy constructor.  */
751           exp = (build_special_member_call
752                  (object, complete_ctor_identifier,
753                   build_tree_list (NULL_TREE, exp),
754                   TREE_TYPE (object),
755                   flags, tf_warning_or_error));
756           if (exp == error_mark_node)
757             {
758               error ("  in thrown expression");
759               return error_mark_node;
760             }
761         }
762       else
763         exp = build2 (INIT_EXPR, temp_type, object,
764                       decay_conversion (exp));
765
766       /* Pre-evaluate the thrown expression first, since if we allocated
767          the space first we would have to deal with cleaning it up if
768          evaluating this expression throws.
769
770          The case where EXP the initializer is a cast or a function
771          returning a class is a bit of a grey area in the standard; it's
772          unclear whether or not it should be allowed to throw.  We used to
773          say no, as that allowed us to optimize this case without worrying
774          about deallocating the exception object if it does.  But that
775          conflicted with expectations (PR 13944) and the EDG compiler; now
776          we wrap the initialization in a TRY_CATCH_EXPR to call
777          do_free_exception rather than in a MUST_NOT_THROW_EXPR, for this
778          case only.
779
780          BUT: Issue 475 may do away with this inconsistency by removing the
781          terminate() in this situation.
782
783          Note that we don't check the return value from stabilize_init
784          because it will only return false in cases where elided is true,
785          and therefore we don't need to work around the failure to
786          preevaluate.  */
787       temp_expr = NULL_TREE;
788       stabilize_init (exp, &temp_expr);
789
790       /* Wrap the initialization in a CLEANUP_POINT_EXPR so that cleanups
791          for temporaries within the initialization are run before the one
792          for the exception object, preserving LIFO order.  */
793       exp = build1 (CLEANUP_POINT_EXPR, void_type_node, exp);
794
795       if (elided)
796         exp = build2 (TRY_CATCH_EXPR, void_type_node, exp,
797                       do_free_exception (ptr));
798       else
799         exp = build1 (MUST_NOT_THROW_EXPR, void_type_node, exp);
800
801       /* Prepend the allocation.  */
802       exp = build2 (COMPOUND_EXPR, TREE_TYPE (exp), allocate_expr, exp);
803       if (temp_expr)
804         {
805           /* Prepend the calculation of the throw expression.  Also, force
806              any cleanups from the expression to be evaluated here so that
807              we don't have to do them during unwinding.  But first wrap
808              them in MUST_NOT_THROW_EXPR, since they are run after the
809              exception object is initialized.  */
810           cp_walk_tree_without_duplicates (&temp_expr, wrap_cleanups_r, 0);
811           exp = build2 (COMPOUND_EXPR, TREE_TYPE (exp), temp_expr, exp);
812           exp = build1 (CLEANUP_POINT_EXPR, TREE_TYPE (exp), exp);
813         }
814
815       throw_type = build_eh_type_type (prepare_eh_type (TREE_TYPE (object)));
816
817       if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (object)))
818         {
819           cleanup = lookup_fnfields (TYPE_BINFO (TREE_TYPE (object)),
820                                      complete_dtor_identifier, 0);
821           cleanup = BASELINK_FUNCTIONS (cleanup);
822           mark_used (cleanup);
823           cxx_mark_addressable (cleanup);
824           /* Pretend it's a normal function.  */
825           cleanup = build1 (ADDR_EXPR, cleanup_type, cleanup);
826         }
827       else
828         cleanup = build_int_cst (cleanup_type, 0);
829
830       tmp = tree_cons (NULL_TREE, cleanup, NULL_TREE);
831       tmp = tree_cons (NULL_TREE, throw_type, tmp);
832       tmp = tree_cons (NULL_TREE, ptr, tmp);
833       /* ??? Indicate that this function call throws throw_type.  */
834       tmp = cp_build_function_call (fn, tmp, tf_warning_or_error);
835
836       /* Tack on the initialization stuff.  */
837       exp = build2 (COMPOUND_EXPR, TREE_TYPE (tmp), exp, tmp);
838     }
839   else
840     {
841       /* Rethrow current exception.  */
842
843       tree fn = get_identifier ("__cxa_rethrow");
844       if (!get_global_value_if_present (fn, &fn))
845         {
846           /* Declare void __cxa_rethrow (void).  */
847           fn = push_throw_library_fn
848             (fn, build_function_type (void_type_node, void_list_node));
849         }
850
851       /* ??? Indicate that this function call allows exceptions of the type
852          of the enclosing catch block (if known).  */
853       exp = cp_build_function_call (fn, NULL_TREE, tf_warning_or_error);
854     }
855
856   exp = build1 (THROW_EXPR, void_type_node, exp);
857
858   return exp;
859 }
860
861 /* Make sure TYPE is complete, pointer to complete, reference to
862    complete, or pointer to cv void. Issue diagnostic on failure.
863    Return the zero on failure and nonzero on success. FROM can be
864    the expr or decl from whence TYPE came, if available.  */
865
866 static int
867 complete_ptr_ref_or_void_ptr_p (tree type, tree from)
868 {
869   int is_ptr;
870
871   /* Check complete.  */
872   type = complete_type_or_else (type, from);
873   if (!type)
874     return 0;
875
876   /* Or a pointer or ref to one, or cv void *.  */
877   is_ptr = TREE_CODE (type) == POINTER_TYPE;
878   if (is_ptr || TREE_CODE (type) == REFERENCE_TYPE)
879     {
880       tree core = TREE_TYPE (type);
881
882       if (is_ptr && VOID_TYPE_P (core))
883         /* OK */;
884       else if (!complete_type_or_else (core, from))
885         return 0;
886     }
887   return 1;
888 }
889
890 /* Return truth-value if EXPRESSION is admissible in throw-expression,
891    i.e. if it is not of incomplete type or a pointer/reference to such
892    a type or of an abstract class type.  */
893
894 static bool
895 is_admissible_throw_operand (tree expr)
896 {
897   tree type = TREE_TYPE (expr);
898
899   /* 15.1/4 [...] The type of the throw-expression shall not be an
900             incomplete type, or a pointer or a reference to an incomplete
901             type, other than void*, const void*, volatile void*, or
902             const volatile void*.  Except for these restriction and the
903             restrictions on type matching mentioned in 15.3, the operand
904             of throw is treated exactly as a function argument in a call
905             (5.2.2) or the operand of a return statement.  */
906   if (!complete_ptr_ref_or_void_ptr_p (type, expr))
907     return false;
908
909   /* 10.4/3 An abstract class shall not be used as a parameter type,
910             as a function return type or as type of an explicit
911             conversion.  */
912   else if (CLASS_TYPE_P (type) && CLASSTYPE_PURE_VIRTUALS (type))
913     {
914       error ("expression %qE of abstract class type %qT cannot "
915              "be used in throw-expression", expr, type);
916       return false;
917     }
918
919   return true;
920 }
921
922 /* Returns nonzero if FN is a declaration of a standard C library
923    function which is known not to throw.
924
925    [lib.res.on.exception.handling]: None of the functions from the
926    Standard C library shall report an error by throwing an
927    exception, unless it calls a program-supplied function that
928    throws an exception.  */
929
930 #include "cfns.h"
931
932 int
933 nothrow_libfn_p (const_tree fn)
934 {
935   tree id;
936
937   if (TREE_PUBLIC (fn)
938       && DECL_EXTERNAL (fn)
939       && DECL_NAMESPACE_SCOPE_P (fn)
940       && DECL_EXTERN_C_P (fn))
941     /* OK */;
942   else
943     /* Can't be a C library function.  */
944     return 0;
945
946   /* Being a C library function, DECL_ASSEMBLER_NAME == DECL_NAME
947      unless the system headers are playing rename tricks, and if
948      they are, we don't want to be confused by them.  */
949   id = DECL_NAME (fn);
950   return !!libc_name_p (IDENTIFIER_POINTER (id), IDENTIFIER_LENGTH (id));
951 }
952
953 /* Returns nonzero if an exception of type FROM will be caught by a
954    handler for type TO, as per [except.handle].  */
955
956 static int
957 can_convert_eh (tree to, tree from)
958 {
959   to = non_reference (to);
960   from = non_reference (from);
961
962   if (TREE_CODE (to) == POINTER_TYPE && TREE_CODE (from) == POINTER_TYPE)
963     {
964       to = TREE_TYPE (to);
965       from = TREE_TYPE (from);
966
967       if (! at_least_as_qualified_p (to, from))
968         return 0;
969
970       if (TREE_CODE (to) == VOID_TYPE)
971         return 1;
972
973       /* Else fall through.  */
974     }
975
976   if (CLASS_TYPE_P (to) && CLASS_TYPE_P (from)
977       && PUBLICLY_UNIQUELY_DERIVED_P (to, from))
978     return 1;
979
980   return 0;
981 }
982
983 /* Check whether any of the handlers in I are shadowed by another handler
984    accepting TYPE.  Note that the shadowing may not be complete; even if
985    an exception of type B would be caught by a handler for A, there could
986    be a derived class C for which A is an ambiguous base but B is not, so
987    the handler for B would catch an exception of type C.  */
988
989 static void
990 check_handlers_1 (tree master, tree_stmt_iterator i)
991 {
992   tree type = TREE_TYPE (master);
993
994   for (; !tsi_end_p (i); tsi_next (&i))
995     {
996       tree handler = tsi_stmt (i);
997       if (TREE_TYPE (handler) && can_convert_eh (type, TREE_TYPE (handler)))
998         {
999           warning (0, "%Hexception of type %qT will be caught",
1000                    EXPR_LOCUS (handler), TREE_TYPE (handler));
1001           warning (0, "%H   by earlier handler for %qT",
1002                    EXPR_LOCUS (master), type);
1003           break;
1004         }
1005     }
1006 }
1007
1008 /* Given a STATEMENT_LIST of HANDLERs, make sure that they're OK.  */
1009
1010 void
1011 check_handlers (tree handlers)
1012 {
1013   tree_stmt_iterator i;
1014
1015   /* If we don't have a STATEMENT_LIST, then we've just got one
1016      handler, and thus nothing to warn about.  */
1017   if (TREE_CODE (handlers) != STATEMENT_LIST)
1018     return;
1019
1020   i = tsi_start (handlers);
1021   if (!tsi_end_p (i))
1022     while (1)
1023       {
1024         tree handler = tsi_stmt (i);
1025         tsi_next (&i);
1026
1027         /* No more handlers; nothing to shadow.  */
1028         if (tsi_end_p (i))
1029           break;
1030         if (TREE_TYPE (handler) == NULL_TREE)
1031           permerror (input_location, "%H%<...%> handler must be the last handler for"
1032                      " its try block", EXPR_LOCUS (handler));
1033         else
1034           check_handlers_1 (handler, i);
1035       }
1036 }