OSDN Git Service

i386: Rewrite ix86_expand_vshuffle.
[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 "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 (built_in_decls [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
178   return cp_build_function_call_nary (fn, tf_warning_or_error,
179                                       build_exc_ptr (), NULL_TREE);
180 }
181
182 /* Build up a call to __cxa_begin_catch, to tell the runtime that the
183    exception has been handled.  */
184
185 static tree
186 do_begin_catch (void)
187 {
188   tree fn;
189
190   fn = get_identifier ("__cxa_begin_catch");
191   if (!get_global_value_if_present (fn, &fn))
192     {
193       /* Declare void* __cxa_begin_catch (void *) throw().  */
194       fn = declare_nothrow_library_fn (fn, ptr_type_node, ptr_type_node);
195     }
196
197   return cp_build_function_call_nary (fn, tf_warning_or_error,
198                                       build_exc_ptr (), NULL_TREE);
199 }
200
201 /* Returns nonzero if cleaning up an exception of type TYPE (which can be
202    NULL_TREE for a ... handler) will not throw an exception.  */
203
204 static int
205 dtor_nothrow (tree type)
206 {
207   if (type == NULL_TREE || type == error_mark_node)
208     return 0;
209
210   if (TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
211     return 1;
212
213   if (CLASSTYPE_LAZY_DESTRUCTOR (type))
214     lazily_declare_fn (sfk_destructor, type);
215
216   return TREE_NOTHROW (CLASSTYPE_DESTRUCTORS (type));
217 }
218
219 /* Build up a call to __cxa_end_catch, to destroy the exception object
220    for the current catch block if no others are currently using it.  */
221
222 static tree
223 do_end_catch (tree type)
224 {
225   tree fn, cleanup;
226
227   fn = get_identifier ("__cxa_end_catch");
228   if (!get_global_value_if_present (fn, &fn))
229     {
230       /* Declare void __cxa_end_catch ().  */
231       fn = push_void_library_fn (fn, void_list_node);
232       /* This can throw if the destructor for the exception throws.  */
233       TREE_NOTHROW (fn) = 0;
234     }
235
236   cleanup = cp_build_function_call_vec (fn, NULL, tf_warning_or_error);
237   TREE_NOTHROW (cleanup) = dtor_nothrow (type);
238
239   return cleanup;
240 }
241
242 /* This routine creates the cleanup for the current exception.  */
243
244 static void
245 push_eh_cleanup (tree type)
246 {
247   finish_decl_cleanup (NULL_TREE, do_end_catch (type));
248 }
249
250 /* Return nonzero value if DECL is a Java type suitable for catch or
251    throw.  */
252
253 static bool
254 decl_is_java_type (tree decl, int err)
255 {
256   bool r = (TREE_CODE (decl) == POINTER_TYPE
257             && TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE
258             && TYPE_FOR_JAVA (TREE_TYPE (decl)));
259
260   if (err)
261     {
262       if (TREE_CODE (decl) == REFERENCE_TYPE
263           && TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE
264           && TYPE_FOR_JAVA (TREE_TYPE (decl)))
265         {
266           /* Can't throw a reference.  */
267           error ("type %qT is disallowed in Java %<throw%> or %<catch%>",
268                  decl);
269         }
270
271       if (r)
272         {
273           tree jthrow_node
274             = IDENTIFIER_GLOBAL_VALUE (get_identifier ("jthrowable"));
275
276           if (jthrow_node == NULL_TREE)
277             fatal_error
278               ("call to Java %<catch%> or %<throw%> with %<jthrowable%> undefined");
279
280           jthrow_node = TREE_TYPE (TREE_TYPE (jthrow_node));
281
282           if (! DERIVED_FROM_P (jthrow_node, TREE_TYPE (decl)))
283             {
284               /* Thrown object must be a Throwable.  */
285               error ("type %qT is not derived from %<java::lang::Throwable%>",
286                      TREE_TYPE (decl));
287             }
288         }
289     }
290
291   return r;
292 }
293
294 /* Select the personality routine to be used for exception handling,
295    or issue an error if we need two different ones in the same
296    translation unit.
297    ??? At present DECL_FUNCTION_PERSONALITY is set via
298    LANG_HOOKS_EH_PERSONALITY.  Should it be done here instead?  */
299 void
300 choose_personality_routine (enum languages lang)
301 {
302   static enum {
303     chose_none,
304     chose_cpp,
305     chose_java,
306     gave_error
307   } state;
308
309   switch (state)
310     {
311     case gave_error:
312       return;
313
314     case chose_cpp:
315       if (lang != lang_cplusplus)
316         goto give_error;
317       return;
318
319     case chose_java:
320       if (lang != lang_java)
321         goto give_error;
322       return;
323
324     case chose_none:
325       ; /* Proceed to language selection.  */
326     }
327
328   switch (lang)
329     {
330     case lang_cplusplus:
331       state = chose_cpp;
332       break;
333
334     case lang_java:
335       state = chose_java;
336       terminate_node = built_in_decls [BUILT_IN_ABORT];
337       pragma_java_exceptions = true;
338       break;
339
340     default:
341       gcc_unreachable ();
342     }
343   return;
344
345  give_error:
346   error ("mixing C++ and Java catches in a single translation unit");
347   state = gave_error;
348 }
349
350 /* Initialize the catch parameter DECL.  */
351
352 static void
353 initialize_handler_parm (tree decl, tree exp)
354 {
355   tree init;
356   tree init_type;
357
358   /* Make sure we mark the catch param as used, otherwise we'll get a
359      warning about an unused ((anonymous)).  */
360   TREE_USED (decl) = 1;
361   DECL_READ_P (decl) = 1;
362
363   /* Figure out the type that the initializer is.  Pointers are returned
364      adjusted by value from __cxa_begin_catch.  Others are returned by
365      reference.  */
366   init_type = TREE_TYPE (decl);
367   if (!POINTER_TYPE_P (init_type))
368     init_type = build_reference_type (init_type);
369
370   choose_personality_routine (decl_is_java_type (init_type, 0)
371                               ? lang_java : lang_cplusplus);
372
373   /* Since pointers are passed by value, initialize a reference to
374      pointer catch parm with the address of the temporary.  */
375   if (TREE_CODE (init_type) == REFERENCE_TYPE
376       && TYPE_PTR_P (TREE_TYPE (init_type)))
377     exp = cp_build_addr_expr (exp, tf_warning_or_error);
378
379   exp = ocp_convert (init_type, exp, CONV_IMPLICIT|CONV_FORCE_TEMP, 0);
380
381   init = convert_from_reference (exp);
382
383   /* If the constructor for the catch parm exits via an exception, we
384      must call terminate.  See eh23.C.  */
385   if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
386     {
387       /* Generate the copy constructor call directly so we can wrap it.
388          See also expand_default_init.  */
389       init = ocp_convert (TREE_TYPE (decl), init,
390                           CONV_IMPLICIT|CONV_FORCE_TEMP, 0);
391       /* Force cleanups now to avoid nesting problems with the
392          MUST_NOT_THROW_EXPR.  */
393       init = fold_build_cleanup_point_expr (TREE_TYPE (init), init);
394       init = build1 (MUST_NOT_THROW_EXPR, TREE_TYPE (init), init);
395     }
396
397   decl = pushdecl (decl);
398
399   start_decl_1 (decl, true);
400   cp_finish_decl (decl, init, /*init_const_expr_p=*/false, NULL_TREE,
401                   LOOKUP_ONLYCONVERTING|DIRECT_BIND);
402 }
403
404 \f
405 /* Routine to see if exception handling is turned on.
406    DO_WARN is nonzero if we want to inform the user that exception
407    handling is turned off.
408
409    This is used to ensure that -fexceptions has been specified if the
410    compiler tries to use any exception-specific functions.  */
411
412 static inline int
413 doing_eh (void)
414 {
415   if (! flag_exceptions)
416     {
417       static int warned = 0;
418       if (! warned)
419         {
420           error ("exception handling disabled, use -fexceptions to enable");
421           warned = 1;
422         }
423       return 0;
424     }
425   return 1;
426 }
427
428 /* Call this to start a catch block.  DECL is the catch parameter.  */
429
430 tree
431 expand_start_catch_block (tree decl)
432 {
433   tree exp;
434   tree type, init;
435
436   if (! doing_eh ())
437     return NULL_TREE;
438
439   /* Make sure this declaration is reasonable.  */
440   if (decl && !complete_ptr_ref_or_void_ptr_p (TREE_TYPE (decl), NULL_TREE))
441     decl = error_mark_node;
442
443   if (decl)
444     type = prepare_eh_type (TREE_TYPE (decl));
445   else
446     type = NULL_TREE;
447
448   if (decl && decl_is_java_type (type, 1))
449     {
450       /* Java only passes object via pointer and doesn't require
451          adjusting.  The java object is immediately before the
452          generic exception header.  */
453       exp = build_exc_ptr ();
454       exp = build1 (NOP_EXPR, build_pointer_type (type), exp);
455       exp = fold_build_pointer_plus (exp,
456                     fold_build1_loc (input_location,
457                                      NEGATE_EXPR, sizetype,
458                                      TYPE_SIZE_UNIT (TREE_TYPE (exp))));
459       exp = cp_build_indirect_ref (exp, RO_NULL, tf_warning_or_error);
460       initialize_handler_parm (decl, exp);
461       return type;
462     }
463
464   /* Call __cxa_end_catch at the end of processing the exception.  */
465   push_eh_cleanup (type);
466
467   init = do_begin_catch ();
468
469   /* If there's no decl at all, then all we need to do is make sure
470      to tell the runtime that we've begun handling the exception.  */
471   if (decl == NULL || decl == error_mark_node || init == error_mark_node)
472     finish_expr_stmt (init);
473
474   /* If the C++ object needs constructing, we need to do that before
475      calling __cxa_begin_catch, so that std::uncaught_exception gets
476      the right value during the copy constructor.  */
477   else if (flag_use_cxa_get_exception_ptr
478            && TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
479     {
480       exp = do_get_exception_ptr ();
481       initialize_handler_parm (decl, exp);
482       finish_expr_stmt (init);
483     }
484
485   /* Otherwise the type uses a bitwise copy, and we don't have to worry
486      about the value of std::uncaught_exception and therefore can do the
487      copy with the return value of __cxa_end_catch instead.  */
488   else
489     {
490       tree init_type = type;
491
492       /* Pointers are passed by values, everything else by reference.  */
493       if (!TYPE_PTR_P (type))
494         init_type = build_pointer_type (type);
495       if (init_type != TREE_TYPE (init))
496         init = build1 (NOP_EXPR, init_type, init);
497       exp = create_temporary_var (init_type);
498       DECL_REGISTER (exp) = 1;
499       cp_finish_decl (exp, init, /*init_const_expr=*/false,
500                       NULL_TREE, LOOKUP_ONLYCONVERTING);
501       initialize_handler_parm (decl, exp);
502     }
503
504   return type;
505 }
506
507
508 /* Call this to end a catch block.  Its responsible for emitting the
509    code to handle jumping back to the correct place, and for emitting
510    the label to jump to if this catch block didn't match.  */
511
512 void
513 expand_end_catch_block (void)
514 {
515   if (! doing_eh ())
516     return;
517
518   /* The exception being handled is rethrown if control reaches the end of
519      a handler of the function-try-block of a constructor or destructor.  */
520   if (in_function_try_handler
521       && (DECL_CONSTRUCTOR_P (current_function_decl)
522           || DECL_DESTRUCTOR_P (current_function_decl)))
523     finish_expr_stmt (build_throw (NULL_TREE));
524 }
525
526 tree
527 begin_eh_spec_block (void)
528 {
529   tree r;
530   location_t spec_location = DECL_SOURCE_LOCATION (current_function_decl);
531
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 (spec_location, MUST_NOT_THROW_EXPR, NULL_TREE);
537       TREE_SIDE_EFFECTS (r) = 1;
538     }
539   else
540     r = build_stmt (spec_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       exp = build_min (THROW_EXPR, void_type_node, exp);
653       SET_EXPR_LOCATION (exp, input_location);
654       return exp;
655     }
656
657   if (exp == null_node)
658     warning (0, "throwing NULL, which has integral, not pointer type");
659
660   if (exp != NULL_TREE)
661     {
662       if (!is_admissible_throw_operand (exp))
663         return error_mark_node;
664     }
665
666   if (! doing_eh ())
667     return error_mark_node;
668
669   if (exp && decl_is_java_type (TREE_TYPE (exp), 1))
670     {
671       tree fn = get_identifier ("_Jv_Throw");
672       if (!get_global_value_if_present (fn, &fn))
673         {
674           /* Declare void _Jv_Throw (void *).  */
675           tree tmp;
676           tmp = build_function_type_list (ptr_type_node,
677                                           ptr_type_node, NULL_TREE);
678           fn = push_throw_library_fn (fn, tmp);
679         }
680       else if (really_overloaded_fn (fn))
681         {
682           error ("%qD should never be overloaded", fn);
683           return error_mark_node;
684         }
685       fn = OVL_CURRENT (fn);
686       exp = cp_build_function_call_nary (fn, tf_warning_or_error,
687                                          exp, NULL_TREE);
688     }
689   else if (exp)
690     {
691       tree throw_type;
692       tree temp_type;
693       tree cleanup;
694       tree object, ptr;
695       tree tmp;
696       tree allocate_expr;
697
698       /* The CLEANUP_TYPE is the internal type of a destructor.  */
699       if (!cleanup_type)
700         {
701           tmp = build_function_type_list (void_type_node,
702                                           ptr_type_node, NULL_TREE);
703           cleanup_type = build_pointer_type (tmp);
704         }
705
706       fn = get_identifier ("__cxa_throw");
707       if (!get_global_value_if_present (fn, &fn))
708         {
709           /* Declare void __cxa_throw (void*, void*, void (*)(void*)).  */
710           /* ??? Second argument is supposed to be "std::type_info*".  */
711           tmp = build_function_type_list (void_type_node,
712                                           ptr_type_node, ptr_type_node,
713                                           cleanup_type, NULL_TREE);
714           fn = push_throw_library_fn (fn, tmp);
715         }
716
717       /* [except.throw]
718
719          A throw-expression initializes a temporary object, the type
720          of which is determined by removing any top-level
721          cv-qualifiers from the static type of the operand of throw
722          and adjusting the type from "array of T" or "function return
723          T" to "pointer to T" or "pointer to function returning T"
724          respectively.  */
725       temp_type = is_bitfield_expr_with_lowered_type (exp);
726       if (!temp_type)
727         temp_type = cv_unqualified (type_decays_to (TREE_TYPE (exp)));
728
729       /* OK, this is kind of wacky.  The standard says that we call
730          terminate when the exception handling mechanism, after
731          completing evaluation of the expression to be thrown but
732          before the exception is caught (_except.throw_), calls a
733          user function that exits via an uncaught exception.
734
735          So we have to protect the actual initialization of the
736          exception object with terminate(), but evaluate the
737          expression first.  Since there could be temps in the
738          expression, we need to handle that, too.  We also expand
739          the call to __cxa_allocate_exception first (which doesn't
740          matter, since it can't throw).  */
741
742       /* Allocate the space for the exception.  */
743       allocate_expr = do_allocate_exception (temp_type);
744       allocate_expr = get_target_expr (allocate_expr);
745       ptr = TARGET_EXPR_SLOT (allocate_expr);
746       TARGET_EXPR_CLEANUP (allocate_expr) = do_free_exception (ptr);
747       CLEANUP_EH_ONLY (allocate_expr) = 1;
748
749       object = build_nop (build_pointer_type (temp_type), ptr);
750       object = cp_build_indirect_ref (object, RO_NULL, tf_warning_or_error);
751
752       /* And initialize the exception object.  */
753       if (CLASS_TYPE_P (temp_type))
754         {
755           int flags = LOOKUP_NORMAL | LOOKUP_ONLYCONVERTING;
756           VEC(tree,gc) *exp_vec;
757
758           /* Under C++0x [12.8/16 class.copy], a thrown lvalue is sometimes
759              treated as an rvalue for the purposes of overload resolution
760              to favor move constructors over copy constructors.  */
761           if (/* Must be a local, automatic variable.  */
762               TREE_CODE (exp) == VAR_DECL
763               && DECL_CONTEXT (exp) == current_function_decl
764               && ! TREE_STATIC (exp)
765               /* The variable must not have the `volatile' qualifier.  */
766               && !(cp_type_quals (TREE_TYPE (exp)) & TYPE_QUAL_VOLATILE))
767             flags = flags | LOOKUP_PREFER_RVALUE;
768
769           /* Call the copy constructor.  */
770           exp_vec = make_tree_vector_single (exp);
771           exp = (build_special_member_call
772                  (object, complete_ctor_identifier, &exp_vec,
773                   TREE_TYPE (object), flags, tf_warning_or_error));
774           release_tree_vector (exp_vec);
775           if (exp == error_mark_node)
776             {
777               error ("  in thrown expression");
778               return error_mark_node;
779             }
780         }
781       else
782         {
783           tmp = decay_conversion (exp);
784           if (tmp == error_mark_node)
785             return error_mark_node;
786           exp = build2 (INIT_EXPR, temp_type, object, tmp);
787         }
788
789       /* Mark any cleanups from the initialization as MUST_NOT_THROW, since
790          they are run after the exception object is initialized.  */
791       cp_walk_tree_without_duplicates (&exp, wrap_cleanups_r, 0);
792
793       /* Prepend the allocation.  */
794       exp = build2 (COMPOUND_EXPR, TREE_TYPE (exp), allocate_expr, exp);
795
796       /* Force all the cleanups to be evaluated here so that we don't have
797          to do them during unwinding.  */
798       exp = build1 (CLEANUP_POINT_EXPR, void_type_node, exp);
799
800       throw_type = build_eh_type_type (prepare_eh_type (TREE_TYPE (object)));
801
802       if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (object)))
803         {
804           cleanup = lookup_fnfields (TYPE_BINFO (TREE_TYPE (object)),
805                                      complete_dtor_identifier, 0);
806           cleanup = BASELINK_FUNCTIONS (cleanup);
807           mark_used (cleanup);
808           cxx_mark_addressable (cleanup);
809           /* Pretend it's a normal function.  */
810           cleanup = build1 (ADDR_EXPR, cleanup_type, cleanup);
811         }
812       else
813         cleanup = build_int_cst (cleanup_type, 0);
814
815       /* ??? Indicate that this function call throws throw_type.  */
816       tmp = cp_build_function_call_nary (fn, tf_warning_or_error,
817                                          ptr, throw_type, cleanup, NULL_TREE);
818
819       /* Tack on the initialization stuff.  */
820       exp = build2 (COMPOUND_EXPR, TREE_TYPE (tmp), exp, tmp);
821     }
822   else
823     {
824       /* Rethrow current exception.  */
825
826       tree fn = get_identifier ("__cxa_rethrow");
827       if (!get_global_value_if_present (fn, &fn))
828         {
829           /* Declare void __cxa_rethrow (void).  */
830           fn = push_throw_library_fn
831             (fn, build_function_type_list (void_type_node, NULL_TREE));
832         }
833
834       /* ??? Indicate that this function call allows exceptions of the type
835          of the enclosing catch block (if known).  */
836       exp = cp_build_function_call_vec (fn, NULL, tf_warning_or_error);
837     }
838
839   exp = build1 (THROW_EXPR, void_type_node, exp);
840   SET_EXPR_LOCATION (exp, input_location);
841
842   return exp;
843 }
844
845 /* Make sure TYPE is complete, pointer to complete, reference to
846    complete, or pointer to cv void. Issue diagnostic on failure.
847    Return the zero on failure and nonzero on success. FROM can be
848    the expr or decl from whence TYPE came, if available.  */
849
850 static int
851 complete_ptr_ref_or_void_ptr_p (tree type, tree from)
852 {
853   int is_ptr;
854
855   /* Check complete.  */
856   type = complete_type_or_else (type, from);
857   if (!type)
858     return 0;
859
860   /* Or a pointer or ref to one, or cv void *.  */
861   is_ptr = TREE_CODE (type) == POINTER_TYPE;
862   if (is_ptr || TREE_CODE (type) == REFERENCE_TYPE)
863     {
864       tree core = TREE_TYPE (type);
865
866       if (is_ptr && VOID_TYPE_P (core))
867         /* OK */;
868       else if (!complete_type_or_else (core, from))
869         return 0;
870     }
871   return 1;
872 }
873
874 /* Return truth-value if EXPRESSION is admissible in throw-expression,
875    i.e. if it is not of incomplete type or a pointer/reference to such
876    a type or of an abstract class type.  */
877
878 static bool
879 is_admissible_throw_operand (tree expr)
880 {
881   tree type = TREE_TYPE (expr);
882
883   /* 15.1/4 [...] The type of the throw-expression shall not be an
884             incomplete type, or a pointer or a reference to an incomplete
885             type, other than void*, const void*, volatile void*, or
886             const volatile void*.  Except for these restriction and the
887             restrictions on type matching mentioned in 15.3, the operand
888             of throw is treated exactly as a function argument in a call
889             (5.2.2) or the operand of a return statement.  */
890   if (!complete_ptr_ref_or_void_ptr_p (type, expr))
891     return false;
892
893   /* 10.4/3 An abstract class shall not be used as a parameter type,
894             as a function return type or as type of an explicit
895             conversion.  */
896   else if (CLASS_TYPE_P (type) && CLASSTYPE_PURE_VIRTUALS (type))
897     {
898       error ("expression %qE of abstract class type %qT cannot "
899              "be used in throw-expression", expr, type);
900       return false;
901     }
902
903   return true;
904 }
905
906 /* Returns nonzero if FN is a declaration of a standard C library
907    function which is known not to throw.
908
909    [lib.res.on.exception.handling]: None of the functions from the
910    Standard C library shall report an error by throwing an
911    exception, unless it calls a program-supplied function that
912    throws an exception.  */
913
914 #include "cfns.h"
915
916 int
917 nothrow_libfn_p (const_tree fn)
918 {
919   tree id;
920
921   if (TREE_PUBLIC (fn)
922       && DECL_EXTERNAL (fn)
923       && DECL_NAMESPACE_SCOPE_P (fn)
924       && DECL_EXTERN_C_P (fn))
925     /* OK */;
926   else
927     /* Can't be a C library function.  */
928     return 0;
929
930   /* Being a C library function, DECL_ASSEMBLER_NAME == DECL_NAME
931      unless the system headers are playing rename tricks, and if
932      they are, we don't want to be confused by them.  */
933   id = DECL_NAME (fn);
934   return !!libc_name_p (IDENTIFIER_POINTER (id), IDENTIFIER_LENGTH (id));
935 }
936
937 /* Returns nonzero if an exception of type FROM will be caught by a
938    handler for type TO, as per [except.handle].  */
939
940 static int
941 can_convert_eh (tree to, tree from)
942 {
943   to = non_reference (to);
944   from = non_reference (from);
945
946   if (TREE_CODE (to) == POINTER_TYPE && TREE_CODE (from) == POINTER_TYPE)
947     {
948       to = TREE_TYPE (to);
949       from = TREE_TYPE (from);
950
951       if (! at_least_as_qualified_p (to, from))
952         return 0;
953
954       if (TREE_CODE (to) == VOID_TYPE)
955         return 1;
956
957       /* Else fall through.  */
958     }
959
960   if (CLASS_TYPE_P (to) && CLASS_TYPE_P (from)
961       && PUBLICLY_UNIQUELY_DERIVED_P (to, from))
962     return 1;
963
964   return 0;
965 }
966
967 /* Check whether any of the handlers in I are shadowed by another handler
968    accepting TYPE.  Note that the shadowing may not be complete; even if
969    an exception of type B would be caught by a handler for A, there could
970    be a derived class C for which A is an ambiguous base but B is not, so
971    the handler for B would catch an exception of type C.  */
972
973 static void
974 check_handlers_1 (tree master, tree_stmt_iterator i)
975 {
976   tree type = TREE_TYPE (master);
977
978   for (; !tsi_end_p (i); tsi_next (&i))
979     {
980       tree handler = tsi_stmt (i);
981       if (TREE_TYPE (handler) && can_convert_eh (type, TREE_TYPE (handler)))
982         {
983           warning_at (EXPR_LOCATION (handler), 0,
984                       "exception of type %qT will be caught",
985                       TREE_TYPE (handler));
986           warning_at (EXPR_LOCATION (master), 0,
987                       "   by earlier handler for %qT", type);
988           break;
989         }
990     }
991 }
992
993 /* Given a STATEMENT_LIST of HANDLERs, make sure that they're OK.  */
994
995 void
996 check_handlers (tree handlers)
997 {
998   tree_stmt_iterator i;
999
1000   /* If we don't have a STATEMENT_LIST, then we've just got one
1001      handler, and thus nothing to warn about.  */
1002   if (TREE_CODE (handlers) != STATEMENT_LIST)
1003     return;
1004
1005   i = tsi_start (handlers);
1006   if (!tsi_end_p (i))
1007     while (1)
1008       {
1009         tree handler = tsi_stmt (i);
1010         tsi_next (&i);
1011
1012         /* No more handlers; nothing to shadow.  */
1013         if (tsi_end_p (i))
1014           break;
1015         if (TREE_TYPE (handler) == NULL_TREE)
1016           permerror (EXPR_LOCATION (handler), "%<...%>"
1017                      " handler must be the last handler for its try block");
1018         else
1019           check_handlers_1 (handler, i);
1020       }
1021 }
1022
1023 /* walk_tree helper for finish_noexcept_expr.  Returns non-null if the
1024    expression *TP causes the noexcept operator to evaluate to false.
1025
1026    5.3.7 [expr.noexcept]: The result of the noexcept operator is false if
1027    in a potentially-evaluated context the expression would contain
1028    * a potentially evaluated call to a function, member function,
1029      function pointer, or member function pointer that does not have a
1030      non-throwing exception-specification (15.4),
1031    * a potentially evaluated throw-expression (15.1),
1032    * a potentially evaluated dynamic_cast expression dynamic_cast<T>(v),
1033      where T is a reference type, that requires a run-time check (5.2.7), or
1034    * a potentially evaluated typeid expression (5.2.8) applied to a glvalue
1035      expression whose type is a polymorphic class type (10.3).  */
1036
1037 static tree
1038 check_noexcept_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
1039                   void *data ATTRIBUTE_UNUSED)
1040 {
1041   tree t = *tp;
1042   enum tree_code code = TREE_CODE (t);
1043   if (code == CALL_EXPR
1044       || code == AGGR_INIT_EXPR)
1045     {
1046       /* We can only use the exception specification of the called function
1047          for determining the value of a noexcept expression; we can't use
1048          TREE_NOTHROW, as it might have a different value in another
1049          translation unit, creating ODR problems.
1050
1051          We could use TREE_NOTHROW (t) for !TREE_PUBLIC fns, though... */
1052       tree fn = (code == AGGR_INIT_EXPR
1053                  ? AGGR_INIT_EXPR_FN (t) : CALL_EXPR_FN (t));
1054       tree type = TREE_TYPE (TREE_TYPE (fn));
1055
1056       STRIP_NOPS (fn);
1057       if (TREE_CODE (fn) == ADDR_EXPR)
1058         fn = TREE_OPERAND (fn, 0);
1059       if (TREE_CODE (fn) == FUNCTION_DECL)
1060         {
1061           /* We do use TREE_NOTHROW for ABI internals like __dynamic_cast,
1062              and for C library functions known not to throw.  */
1063           if (DECL_EXTERN_C_P (fn)
1064               && (DECL_ARTIFICIAL (fn)
1065                   || nothrow_libfn_p (fn)))
1066             return TREE_NOTHROW (fn) ? NULL_TREE : fn;
1067           /* A call to a constexpr function is noexcept if the call
1068              is a constant expression.  */
1069           if (DECL_DECLARED_CONSTEXPR_P (fn)
1070               && is_sub_constant_expr (t))
1071             return NULL_TREE;
1072         }
1073       if (!TYPE_NOTHROW_P (type))
1074         return fn;
1075     }
1076
1077   return NULL_TREE;
1078 }
1079
1080 /* If a function that causes a noexcept-expression to be false isn't
1081    defined yet, remember it and check it for TREE_NOTHROW again at EOF.  */
1082
1083 typedef struct GTY(()) pending_noexcept {
1084   tree fn;
1085   location_t loc;
1086 } pending_noexcept;
1087 DEF_VEC_O(pending_noexcept);
1088 DEF_VEC_ALLOC_O(pending_noexcept,gc);
1089 static GTY(()) VEC(pending_noexcept,gc) *pending_noexcept_checks;
1090
1091 /* FN is a FUNCTION_DECL that caused a noexcept-expr to be false.  Warn if
1092    it can't throw.  */
1093
1094 static void
1095 maybe_noexcept_warning (tree fn)
1096 {
1097   if (TREE_NOTHROW (fn))
1098     {
1099       warning (OPT_Wnoexcept, "noexcept-expression evaluates to %<false%> "
1100                "because of a call to %qD", fn);
1101       warning (OPT_Wnoexcept, "but %q+D does not throw; perhaps "
1102                "it should be declared %<noexcept%>", fn);
1103     }
1104 }
1105
1106 /* Check any functions that weren't defined earlier when they caused a
1107    noexcept expression to evaluate to false.  */
1108
1109 void
1110 perform_deferred_noexcept_checks (void)
1111 {
1112   int i;
1113   pending_noexcept *p;
1114   location_t saved_loc = input_location;
1115   FOR_EACH_VEC_ELT (pending_noexcept, pending_noexcept_checks, i, p)
1116     {
1117       input_location = p->loc;
1118       maybe_noexcept_warning (p->fn);
1119     }
1120   input_location = saved_loc;
1121 }
1122
1123 /* Evaluate noexcept ( EXPR ).  */
1124
1125 tree
1126 finish_noexcept_expr (tree expr, tsubst_flags_t complain)
1127 {
1128   if (expr == error_mark_node)
1129     return error_mark_node;
1130
1131   if (processing_template_decl)
1132     return build_min (NOEXCEPT_EXPR, boolean_type_node, expr);
1133
1134   return (expr_noexcept_p (expr, complain)
1135           ? boolean_true_node : boolean_false_node);
1136 }
1137
1138 /* Returns whether EXPR is noexcept, possibly warning if allowed by
1139    COMPLAIN.  */
1140
1141 bool
1142 expr_noexcept_p (tree expr, tsubst_flags_t complain)
1143 {
1144   tree fn;
1145
1146   if (expr == error_mark_node)
1147     return false;
1148
1149   fn = cp_walk_tree_without_duplicates (&expr, check_noexcept_r, 0);
1150   if (fn)
1151     {
1152       if ((complain & tf_warning) && warn_noexcept
1153           && TREE_CODE (fn) == FUNCTION_DECL)
1154         {
1155           if (!DECL_INITIAL (fn))
1156             {
1157               /* Not defined yet; check again at EOF.  */
1158               pending_noexcept *p
1159                 = VEC_safe_push (pending_noexcept, gc,
1160                                  pending_noexcept_checks, NULL);
1161               p->fn = fn;
1162               p->loc = input_location;
1163             }
1164           else
1165             maybe_noexcept_warning (fn);
1166         }
1167       return false;
1168     }
1169   else
1170     return true;
1171 }
1172
1173 /* Return true iff SPEC is throw() or noexcept(true).  */
1174
1175 bool
1176 nothrow_spec_p (const_tree spec)
1177 {
1178   gcc_assert (!DEFERRED_NOEXCEPT_SPEC_P (spec));
1179   if (spec == NULL_TREE
1180       || TREE_VALUE (spec) != NULL_TREE
1181       || spec == noexcept_false_spec)
1182     return false;
1183   if (TREE_PURPOSE (spec) == NULL_TREE
1184       || spec == noexcept_true_spec)
1185     return true;
1186   gcc_assert (processing_template_decl
1187               || TREE_PURPOSE (spec) == error_mark_node);
1188   return false;
1189 }
1190
1191 /* For FUNCTION_TYPE or METHOD_TYPE, true if NODE is noexcept.  This is the
1192    case for things declared noexcept(true) and, with -fnothrow-opt, for
1193    throw() functions.  */
1194
1195 bool
1196 type_noexcept_p (const_tree type)
1197 {
1198   tree spec = TYPE_RAISES_EXCEPTIONS (type);
1199   gcc_assert (!DEFERRED_NOEXCEPT_SPEC_P (spec));
1200   if (flag_nothrow_opt)
1201     return nothrow_spec_p (spec);
1202   else
1203     return spec == noexcept_true_spec;
1204 }
1205
1206 /* For FUNCTION_TYPE or METHOD_TYPE, true if NODE can throw any type,
1207    i.e. no exception-specification or noexcept(false).  */
1208
1209 bool
1210 type_throw_all_p (const_tree type)
1211 {
1212   tree spec = TYPE_RAISES_EXCEPTIONS (type);
1213   gcc_assert (!DEFERRED_NOEXCEPT_SPEC_P (spec));
1214   return spec == NULL_TREE || spec == noexcept_false_spec;
1215 }
1216
1217 /* Create a representation of the noexcept-specification with
1218    constant-expression of EXPR.  COMPLAIN is as for tsubst.  */
1219
1220 tree
1221 build_noexcept_spec (tree expr, int complain)
1222 {
1223   /* This isn't part of the signature, so don't bother trying to evaluate
1224      it until instantiation.  */
1225   if (!processing_template_decl && TREE_CODE (expr) != DEFERRED_NOEXCEPT)
1226     {
1227       expr = perform_implicit_conversion_flags (boolean_type_node, expr,
1228                                                 complain,
1229                                                 LOOKUP_NORMAL);
1230       expr = cxx_constant_value (expr);
1231     }
1232   if (expr == boolean_true_node)
1233     return noexcept_true_spec;
1234   else if (expr == boolean_false_node)
1235     return noexcept_false_spec;
1236   else if (expr == error_mark_node)
1237     return error_mark_node;
1238   else
1239     {
1240       gcc_assert (processing_template_decl || expr == error_mark_node
1241                   || TREE_CODE (expr) == DEFERRED_NOEXCEPT);
1242       return build_tree_list (expr, NULL_TREE);
1243     }
1244 }
1245
1246 #include "gt-cp-except.h"