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