From e67164f57fed932c62c8d5dba457ddfe3c8a2364 Mon Sep 17 00:00:00 2001
From: mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Mon, 10 Jul 2000 03:47:36 +0000
Subject: [PATCH] 	* cp-tree.h (char_type_p): New function. 	*
 decl.c (init_decl_processing): Don't initialize 	signed_wchar_type_node
 or unsigned_wchar_type_node. 	(complete_array_type): Handle brace-enclosed
 string-constants. 	* rtti.c (emit_support_tinfos): Remove #if 0'd code. 
 * tree.c (char_type_p): New function. 	* typeck2.c (digest_init): Use
 char_type_p.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@34936 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/cp/ChangeLog    | 10 ++++++++++
 gcc/cp/cp-tree.h    |  3 ++-
 gcc/cp/decl.c       | 24 ++++++++++++++++--------
 gcc/cp/inc/cxxabi.h |  8 ++++++++
 gcc/cp/rtti.c       | 11 -----------
 gcc/cp/tree.c       | 12 ++++++++++++
 gcc/cp/typeck2.c    |  6 +-----
 gcc/cp/vec.cc       | 29 +++++++++++++++++++++++++++++
 8 files changed, 78 insertions(+), 25 deletions(-)

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index bce0feaa6cc8..0caff7ff8bbb 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,13 @@
+2000-07-09  Mark Mitchell  <mark@codesourcery.com>
+
+	* cp-tree.h (char_type_p): New function.
+	* decl.c (init_decl_processing): Don't initialize
+	signed_wchar_type_node or unsigned_wchar_type_node.
+	(complete_array_type): Handle brace-enclosed string-constants.
+	* rtti.c (emit_support_tinfos): Remove #if 0'd code.
+	* tree.c (char_type_p): New function.
+	* typeck2.c (digest_init): Use char_type_p.
+
 2000-07-06  Nathan Sidwell  <nathan@codesourcery.com>
 
 	* pt.c (tsubst): Don't layout type, if it's error_mark.
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index a5fea5083aa7..a87a8b777fb4 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -4547,7 +4547,8 @@ extern void remap_save_expr                     PARAMS ((tree *, splay_tree, tre
 extern tree build_shared_int_cst                PARAMS ((int));
 extern special_function_kind special_function_p PARAMS ((tree));
 extern int count_trees                          PARAMS ((tree));
-
+extern int char_type_p                          PARAMS ((tree));
+  
 /* in typeck.c */
 extern int string_conv_p			PARAMS ((tree, tree, int));
 extern tree condition_conversion		PARAMS ((tree));
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 2c1b7ed1563a..ee0d05872401 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -6549,12 +6549,10 @@ init_decl_processing ()
 				    : WCHAR_TYPE);
   wchar_type_node = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (wchar_type_node));
   wchar_type_size = TYPE_PRECISION (wchar_type_node);
-  signed_wchar_type_node = make_signed_type (wchar_type_size);
-  unsigned_wchar_type_node = make_unsigned_type (wchar_type_size);
-  wchar_type_node
-    = TREE_UNSIGNED (wchar_type_node)
-      ? unsigned_wchar_type_node
-      : signed_wchar_type_node;
+  if (TREE_UNSIGNED (wchar_type_node))
+    wchar_type_node = make_signed_type (wchar_type_size);
+  else
+    wchar_type_node = make_unsigned_type (wchar_type_size);
   record_builtin_type (RID_WCHAR, "__wchar_t", wchar_type_node);
 
   /* Artificial declaration of wchar_t -- can be bashed */
@@ -8637,8 +8635,18 @@ complete_array_type (type, initial_value, do_default)
 
   if (initial_value)
     {
-      /* Note MAXINDEX  is really the maximum index,
-	 one less than the size.  */
+      /* An array of character type can be initialized from a
+	 brace-enclosed string constant.  */
+      if (char_type_p (TYPE_MAIN_VARIANT (TREE_TYPE (type)))
+	  && TREE_CODE (initial_value) == CONSTRUCTOR
+	  && CONSTRUCTOR_ELTS (initial_value)
+	  && (TREE_CODE (TREE_VALUE (CONSTRUCTOR_ELTS (initial_value)))
+	      == STRING_CST)
+	  && TREE_CHAIN (CONSTRUCTOR_ELTS (initial_value)) == NULL_TREE)
+	initial_value = TREE_VALUE (CONSTRUCTOR_ELTS (initial_value));
+
+      /* Note MAXINDEX is really the maximum index, one less than the
+	 size.  */
       if (TREE_CODE (initial_value) == STRING_CST)
 	{
 	  int eltsize
diff --git a/gcc/cp/inc/cxxabi.h b/gcc/cp/inc/cxxabi.h
index 8987b6d4196a..b9a19d212746 100644
--- a/gcc/cp/inc/cxxabi.h
+++ b/gcc/cp/inc/cxxabi.h
@@ -445,6 +445,14 @@ void __cxa_vec_ctor (void *__array_address,
                      void (*__constructor) (void *),
                      void (*__destructor) (void *));
 
+extern "C++"
+void __cxa_vec_cctor (void *dest_array,
+		      void *src_array,
+		      __SIZE_TYPE__ element_count,
+		      __SIZE_TYPE__ element_size,
+		      void (*constructor) (void *, void *),
+		      void (*destructor) (void *));
+ 
 /* destruct array */
 extern "C++"
 void __cxa_vec_dtor (void *__array_address,
diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c
index 376d3846e708..63c1e3cc583f 100644
--- a/gcc/cp/rtti.c
+++ b/gcc/cp/rtti.c
@@ -1970,23 +1970,12 @@ emit_support_tinfos ()
     &void_type_node,
     &boolean_type_node,
     &wchar_type_node,
-#if 0
-    &signed_wchar_type_node, &unsigned_wchar_type_node,
-#endif
     &char_type_node, &signed_char_type_node, &unsigned_char_type_node,
     &short_integer_type_node, &short_unsigned_type_node,
     &integer_type_node, &unsigned_type_node,
     &long_integer_type_node, &long_unsigned_type_node,
     &long_long_integer_type_node, &long_long_unsigned_type_node,
     &float_type_node, &double_type_node, &long_double_type_node,
-
-    /* GCC extension types */
-#if 0
-    &complex_integer_type_node,
-    &complex_float_type_node, &complex_double_type_node,
-    &complex_long_double_type_node,
-#endif
-    
     0
   };
   int ix;
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index f0558999815a..b17915fc50de 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -2488,3 +2488,15 @@ special_function_p (decl)
 
   return sfk_none;
 }
+
+/* Returns non-zero if TYPE is a character type, including wchar_t.  */
+
+int
+char_type_p (type)
+     tree type;
+{
+  return (same_type_p (type, char_type_node)
+	  || same_type_p (type, unsigned_char_type_node)
+	  || same_type_p (type, signed_char_type_node)
+	  || same_type_p (type, wchar_type_node));
+}
diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c
index ce962e96eaa4..7b947d246783 100644
--- a/gcc/cp/typeck2.c
+++ b/gcc/cp/typeck2.c
@@ -573,11 +573,7 @@ digest_init (type, init, tail)
 	}
 
       typ1 = TYPE_MAIN_VARIANT (TREE_TYPE (type));
-      if ((typ1 == char_type_node
-	   || typ1 == signed_char_type_node
-	   || typ1 == unsigned_char_type_node
-	   || typ1 == unsigned_wchar_type_node
-	   || typ1 == signed_wchar_type_node)
+      if (char_type_p (typ1)
 	  && ((init && TREE_CODE (init) == STRING_CST)
 	      || (element && TREE_CODE (element) == STRING_CST)))
 	{
diff --git a/gcc/cp/vec.cc b/gcc/cp/vec.cc
index e88e48dbcd20..5e963cad79af 100644
--- a/gcc/cp/vec.cc
+++ b/gcc/cp/vec.cc
@@ -94,6 +94,35 @@ __cxa_vec_ctor (void *array_address,
     }
 }
 
+/* construct an array by copying */
+
+extern "C++" void
+__cxa_vec_cctor (void *dest_array,
+		 void *src_array,
+		 size_t element_count,
+		 size_t element_size,
+		 void (*constructor) (void *, void *),
+		 void (*destructor) (void *))
+{
+  size_t ix = 0;
+  char *dest_ptr = static_cast <char *> (dest_array);
+  char *src_ptr = static_cast <char *> (src_array);
+
+  try
+    {
+      if (constructor)
+	for (; ix != element_count; 
+	     ix++, src_ptr += element_size, dest_ptr += element_size)
+	  constructor (dest_ptr, src_ptr);
+    }
+  catch (...)
+    {
+      __uncatch_exception ();
+      __cxa_vec_dtor (dest_array, ix, element_size, destructor);
+      throw;
+    }
+}
+
 /* destruct array */
 extern "C++" void
 __cxa_vec_dtor (void *array_address,
-- 
GitLab