OSDN Git Service

* exception.cc (__check_null_eh_spec): New fn.
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 11 Mar 2000 09:00:13 +0000 (09:00 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 11 Mar 2000 09:00:13 +0000 (09:00 +0000)
        * except.c (expand_end_eh_spec): Call it if the spec is throw().

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@32480 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/except.c
gcc/cp/exception.cc

index 052f293..f495735 100644 (file)
@@ -1,3 +1,8 @@
+2000-03-11  Jason Merrill  <jason@casey.cygnus.com>
+
+       * exception.cc (__check_null_eh_spec): New fn.
+       * except.c (expand_end_eh_spec): Call it if the spec is throw().
+
 2000-03-10  Jason Merrill  <jason@casey.cygnus.com>
 
        * decl.c (push_throw_library_fn): Take the FUNCTION_TYPE.
index c6cdaa2..d069b2c 100644 (file)
@@ -690,42 +690,61 @@ expand_end_eh_spec (raises, try_block)
   handler = begin_handler ();
   blocks = finish_handler_parms (NULL_TREE, handler);
 
-  /* Build up an array of type_infos.  */
-  for (; raises && TREE_VALUE (raises); raises = TREE_CHAIN (raises))
+  if (TREE_VALUE (raises) == NULL_TREE)
     {
-      types = tree_cons
-       (NULL_TREE, build_eh_type_type (TREE_VALUE (raises)), types);
-      ++count;
+      fn = get_identifier ("__check_null_eh_spec");
+      if (IDENTIFIER_GLOBAL_VALUE (fn))
+       fn = IDENTIFIER_GLOBAL_VALUE (fn);
+      else
+       {
+         tmp = build_function_type (void_type_node, void_list_node);
+         fn = push_throw_library_fn (fn, tmp);
+         /* Since the spec doesn't allow any exceptions, this call
+            will never throw.  */
+         TREE_NOTHROW (fn) = 1;
+       }
+      tmp = NULL_TREE;
     }
+  else
+    {
+      /* Build up an array of type_infos.  */
+      for (; raises && TREE_VALUE (raises); raises = TREE_CHAIN (raises))
+       {
+         types = tree_cons
+           (NULL_TREE, build_eh_type_type (TREE_VALUE (raises)), types);
+         ++count;
+       }
 
-  types = build_nt (CONSTRUCTOR, NULL_TREE, types);
-  TREE_HAS_CONSTRUCTOR (types) = 1;
+      types = build_nt (CONSTRUCTOR, NULL_TREE, types);
+      TREE_HAS_CONSTRUCTOR (types) = 1;
 
-  /* We can't pass the CONSTRUCTOR directly, so stick it in a variable.  */
-  tmp = build_cplus_array_type (const_ptr_type_node, NULL_TREE);
-  decl = build_decl (VAR_DECL, NULL_TREE, tmp);
-  DECL_ARTIFICIAL (decl) = 1;
-  DECL_INITIAL (decl) = types;
-  DECL_CONTEXT (decl) = current_function_decl;
-  cp_finish_decl (decl, types, NULL_TREE, 0);
+      /* We can't pass the CONSTRUCTOR directly, so stick it in a variable.  */
+      tmp = build_cplus_array_type (const_ptr_type_node, NULL_TREE);
+      decl = build_decl (VAR_DECL, NULL_TREE, tmp);
+      DECL_ARTIFICIAL (decl) = 1;
+      DECL_INITIAL (decl) = types;
+      DECL_CONTEXT (decl) = current_function_decl;
+      cp_finish_decl (decl, types, NULL_TREE, 0);
 
-  decl = decay_conversion (decl);
+      decl = decay_conversion (decl);
 
-  fn = get_identifier ("__check_eh_spec");
-  if (IDENTIFIER_GLOBAL_VALUE (fn))
-    fn = IDENTIFIER_GLOBAL_VALUE (fn);
-  else
-    {
-      tmp = tree_cons
-       (NULL_TREE, integer_type_node, tree_cons
-        (NULL_TREE, TREE_TYPE (decl), void_list_node));
-      tmp = build_function_type (void_type_node, tmp);
+      fn = get_identifier ("__check_eh_spec");
+      if (IDENTIFIER_GLOBAL_VALUE (fn))
+       fn = IDENTIFIER_GLOBAL_VALUE (fn);
+      else
+       {
+         tmp = tree_cons
+           (NULL_TREE, integer_type_node, tree_cons
+            (NULL_TREE, TREE_TYPE (decl), void_list_node));
+         tmp = build_function_type (void_type_node, tmp);
+
+         fn = push_throw_library_fn (fn, tmp);
+       }
 
-      fn = push_throw_library_fn (fn, tmp);
+      tmp = tree_cons (NULL_TREE, build_int_2 (count, 0), 
+                      tree_cons (NULL_TREE, decl, NULL_TREE));
     }
 
-  tmp = tree_cons (NULL_TREE, build_int_2 (count, 0), 
-                  tree_cons (NULL_TREE, decl, NULL_TREE));
   tmp = build_call (fn, tmp);
   finish_expr_stmt (tmp);
 
index d6b47d9..b7d6a64 100644 (file)
@@ -1,5 +1,5 @@
 // Functions for Exception Support for -*- C++ -*-
-// Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999 Free Software Foundation
+// Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000 Free Software Foundation
 
 // This file is part of GNU CC.
 
@@ -321,6 +321,14 @@ __check_eh_spec (int n, const void **spec)
     }
 }
 
+/* Special case of the above for throw() specs.  */
+
+extern "C" void
+__check_null_eh_spec (void)
+{
+  __check_eh_spec (0, 0);
+}
+
 // Helpers for rtti. Although these don't return, we give them return types so
 // that the type system is not broken.