diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 45b7679556c829c444bc0459b7cd629e6d73faca..740bc212ea23aec95c6e8f3b1791ac5a945960df 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,23 @@
+2004-02-02  Eric Christopher  <echristo@redhat.com>
+            Zack Weinberg  <zack@codesourcery.com>
+
+	* c-opts.c (c_common_handle_option): Add -finput-charset.
+        * c.opt: Ditto.
+        * cppcharset.c (one_iso88591_to_utf8): Remove.
+        (convert_iso88591_utf8): Ditto.
+        (conversion_tab): Remove 8859-1 converter.
+        (_cpp_input_to_utf8): Remove.
+        (_cpp_init_iconv_buffer): Ditto.
+        (_cpp_close_iconv_buffer): Ditto.
+        (_cpp_convert_input): New function.
+        (_cpp_default_encoding): Ditto.
+        * cpphash.h: Add/remove prototypes for above.
+        * cppfiles.c (read_file_guts): Use _cpp_convert_input.
+        * cppinit.c (cpp_create_reader): Use _cpp_default_encoding
+        for narrow execution and input character sets.
+        * cpplib.c (cpp_push_buffer): Delete uses of removed functions.
+        * doc/cppopts.texi: Document -finput-charset.
+
 2004-02-02  David Edelsohn  <edelsohn@gnu.org>
 
 	* rtlanal.c (refers_to_regno_p): Test regno, not inner_regno,
@@ -86,7 +106,7 @@
 	* postreload.c (reload_combine, reload_combine_note_store,
 	reload_combine_note_use, reload_cse_move2add, move2add_note_store): Likewise.
 	* ra-colorize.c (combine, color_usable_p, get_free_reg,
-	calculate_dont_begin, calculate_dont_begin, colorize_one_web, 
+	calculate_dont_begin, calculate_dont_begin, colorize_one_web,
 	try_recolor_web, insert_coalesced_conflicts, check_colors,
 	break_precolored_alias): Likewise.
 	* ra-debug.c: Include regs.h
@@ -210,7 +230,7 @@
 	constant.
 	(write_node): Simplify comparisons against small constants
 	before printing tests.
-	
+
 2004-01-31  Kazu Hirata  <kazu@cs.umass.edu>
 
 	* config/m32r/m32r.c (m32r_load_pic_register): Use GEN_INT
@@ -435,8 +455,8 @@
 	(mark_constant_pool): Use new pool datastructures.
 
 2004-01-30  Fariborz Jahanian <fjahanian@apple.com>
-        
-        * config/rs6000/rs6000.c (rs6000_emit_move): Remove #if 0. 
+
+        * config/rs6000/rs6000.c (rs6000_emit_move): Remove #if 0.
 	Copy operands[1] to pseudo for simplify_gen_subreg.
 
 2004-01-30  Kazu Hirata  <kazu@cs.umass.edu>
@@ -447,7 +467,7 @@
 2004-01-30  Andrew Pinski <pinskia@physics.uc.edu>
 
 	* toplev.c: Include alloc-pool.h.
-	* Makefile.in (toplev.c): Update dependencies. 
+	* Makefile.in (toplev.c): Update dependencies.
 
 2004-01-30  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
 
@@ -533,7 +553,7 @@
 2004-01-29  Devang Patel  <dpatel@apple.com>
 
 	* dwarf2out.c (gen_field_die): Do not equate decl number to die.
-	
+
 2004-01-28  Ian Lance Taylor  <ian@wasabisystems.com>
 
 	PR inline-asm/6162
@@ -682,7 +702,7 @@
 	target macros.
 
 2004-01-28  Daniel Berlin  <dberlin@dberlin.org>
-	
+
 	* timevar.c (timevar_print): Mention when checking is enabled.
 
 2004-01-28  Giovanni Bajo  <giovannibajo@gcc.gnu.org>
@@ -3984,4 +4004,3 @@
 	* invoke.texi (-O1): Document change.
 
 See ChangeLog.10 for earlier changes.
-
diff --git a/gcc/c-opts.c b/gcc/c-opts.c
index 2df0a7ea5a7e09f4afbd4963f3653e6b86658139..c89ba0040e68bdc6f0be8b0f74c5fdc30c0f9801 100644
--- a/gcc/c-opts.c
+++ b/gcc/c-opts.c
@@ -904,6 +904,10 @@ c_common_handle_option (size_t scode, const char *arg, int value)
       cpp_opts->wide_charset = arg;
       break;
 
+    case OPT_finput_charset_:
+      cpp_opts->input_charset = arg;
+      break;
+
     case OPT_ftemplate_depth_:
       max_tinst_depth = value;
       break;
diff --git a/gcc/c.opt b/gcc/c.opt
index 4f9859f6a7a7fe352f0cd92c36e221d38ab8029a..4856fc5aea18a9d21d1137d11932c275c278f594 100644
--- a/gcc/c.opt
+++ b/gcc/c.opt
@@ -482,6 +482,11 @@ fexec-charset=
 C ObjC C++ ObjC++ Joined RejectNegative
 -fexec-charset=<cset>	Convert all strings and character constants to character set <cset>
 
+finput-charset=
+C ObjC C++ ObjC++ Joined RejectNegative
+-finput-charset=<cset>      Specify the default character set for source files.
+
+
 fexternal-templates
 C++ ObjC++
 
diff --git a/gcc/cppcharset.c b/gcc/cppcharset.c
index 9fc180aba638eb08a40baa135bbd6e0facecd9e4..b73128d60e9b293d3fbe7102080cc039b1fb8280 100644
--- a/gcc/cppcharset.c
+++ b/gcc/cppcharset.c
@@ -446,31 +446,6 @@ one_utf16_to_utf8 (iconv_t bigend, const uchar **inbufp, size_t *inbytesleftp,
   return 0;
 }
 
-/* The first 256 code points of ISO 8859.1 have the same numeric
-   values as the first 256 code points of Unicode, therefore the
-   incoming ISO 8859.1 character can be passed directly to
-   one_cppchar_to_utf8 (which expects a Unicode value).  */
-
-static int
-one_iso88591_to_utf8 (iconv_t bigend ATTRIBUTE_UNUSED, const uchar **inbufp,
-		      size_t *inbytesleftp, uchar **outbufp, size_t *outbytesleftp)
-{
-  const uchar *inbuf = *inbufp;
-  int rval;
-
-  if (*inbytesleftp > 1)
-    return EINVAL;
-
-  rval = one_cppchar_to_utf8 ((cppchar_t)*inbuf, outbufp, outbytesleftp);
-  if (rval)
-    return rval;
-
-  *inbufp += 1;
-  *inbytesleftp -= 1;
-
-  return 0;
-}
-
 /* Helper routine for the next few functions.  The 'const' on
    one_conversion means that we promise not to modify what function is
    pointed to, which lets the inliner see through it.  */
@@ -554,14 +529,6 @@ convert_utf32_utf8 (iconv_t cd, const uchar *from, size_t flen,
   return conversion_loop (one_utf32_to_utf8, cd, from, flen, to);
 }
 
-static bool
-convert_iso88591_utf8 (iconv_t cd, const uchar *from, size_t flen,
-                       struct _cpp_strbuf *to)
-{
-  return conversion_loop (one_iso88591_to_utf8, cd, from, flen, to);
-}
-
-
 /* Identity conversion, used when we have no alternative.  */
 static bool
 convert_no_conversion (iconv_t cd ATTRIBUTE_UNUSED,
@@ -639,7 +606,6 @@ static const struct conversion conversion_tab[] = {
   { "UTF-32BE/UTF-8", convert_utf32_utf8, (iconv_t)1 },
   { "UTF-16LE/UTF-8", convert_utf16_utf8, (iconv_t)0 },
   { "UTF-16BE/UTF-8", convert_utf16_utf8, (iconv_t)1 },
-  { "ISO-8859-1/UTF-8", convert_iso88591_utf8, (iconv_t)0 },
 };
 
 /* Subroutine of cpp_init_iconv: initialize and return a
@@ -1388,44 +1354,58 @@ cpp_interpret_charconst (cpp_reader *pfile, const cpp_token *token,
 }
 
 uchar *
-_cpp_input_to_utf8 (cpp_reader *pfile, const uchar *input, cppchar_t length)
+_cpp_convert_input (cpp_reader *pfile, const char *input_charset,
+		    uchar *input, size_t size, size_t len, off_t *st_size)
 {
-  struct _cpp_strbuf tbuf;
-  struct cset_converter cvt = pfile->buffer->input_cset_desc;
+  struct cset_converter input_cset;
+  struct _cpp_strbuf to;
 
-  tbuf.asize = MAX (OUTBUF_BLOCK_SIZE, length);
-  tbuf.text = xmalloc (tbuf.asize);
-  tbuf.len = 0;
+  input_cset = init_iconv_desc (pfile, SOURCE_CHARSET, input_charset);
+  if (input_cset.func == convert_no_conversion)
+    {
+      to.text = input;
+      to.asize = size;
+      to.len = len;
+    }
+  else
+    {
+      to.asize = MAX (65536, len);
+      to.text = xmalloc (to.asize);
+      to.len = 0;
 
-  if (!APPLY_CONVERSION (cvt, input, length, &tbuf))
-   {
-      cpp_error (pfile, CPP_DL_ERROR, "converting input to source character set.");
-      return NULL;
-   }
+      if (!APPLY_CONVERSION (input_cset, input, len, &to))
+	cpp_error (pfile, CPP_DL_ERROR,
+		   "failure to convert %s to %s",
+		   CPP_OPTION (pfile, input_charset), SOURCE_CHARSET);
 
-  if (length)
-    tbuf.text[tbuf.len] = '\n';
-  else
-    tbuf.text[0] = '\n';
+      free (input);
+    }
 
-  return tbuf.text;
-}
+  /* Clean up the mess.  */
+  if (input_cset.func == convert_using_iconv)
+    iconv_close (input_cset.cd);
 
-  /* Check the input file format. At present assuming the input file
-     is in iso-8859-1 format. Convert this input character set to
-     source character set format (UTF-8). */
+  /* Resize buffer if we allocated substantially too much, or if we
+     haven't enough space for the \n-terminator.  */
+  if (to.len + 4096 < to.asize || to.len >= to.asize)
+    to.text = xrealloc (to.text, to.len + 1);
 
-void
-_cpp_init_iconv_buffer (cpp_reader *pfile, const char *from)
-{
-  pfile->buffer->input_cset_desc = init_iconv_desc (pfile, SOURCE_CHARSET,
-						    from);
+  to.text[to.len] = '\n';
+  *st_size = to.len;
+  return to.text;
 }
 
-void
-_cpp_close_iconv_buffer (cpp_reader *pfile)
+const char *
+_cpp_default_encoding (void)
 {
-  if (HAVE_ICONV
-      && pfile->buffer->input_cset_desc.func == convert_using_iconv)
-    iconv_close (pfile->buffer->input_cset_desc.cd);
+  const char *current_encoding = NULL;
+
+#if defined (HAVE_LOCALE_H) && defined (HAVE_LANGINFO_CODESET)
+  setlocale (LC_CTYPE, "");
+  current_encoding = nl_langinfo (CODESET);
+#endif
+  if (current_encoding == NULL || *current_encoding == '\0')
+    current_encoding = SOURCE_CHARSET;
+
+  return current_encoding;
 }
diff --git a/gcc/cppfiles.c b/gcc/cppfiles.c
index cd735f598340f8d95571b8b83f1933df9bc2bba0..c886c891681f3e3d23ee46ddd00b593f4b830187 100644
--- a/gcc/cppfiles.c
+++ b/gcc/cppfiles.c
@@ -312,7 +312,7 @@ pch_open_file (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch)
 
 /* Try to open the path FILE->name appended to FILE->dir.  This is
    where remap and PCH intercept the file lookup process.  Return true
-   if the file was found, whether or not the open was successful.  
+   if the file was found, whether or not the open was successful.
    Set *INVALID_PCH to true if a PCH file is found but wasn't valid.  */
 
 static bool
@@ -398,10 +398,10 @@ _cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir, bool f
 	  open_file_failed (pfile, file);
 	  if (invalid_pch)
 	    {
-	      cpp_error (pfile, CPP_DL_ERROR, 
+	      cpp_error (pfile, CPP_DL_ERROR,
 	       "one or more PCH files were found, but they were invalid");
 	      if (!cpp_get_options (pfile)->warn_invalid_pch)
-		cpp_error (pfile, CPP_DL_ERROR, 
+		cpp_error (pfile, CPP_DL_ERROR,
 			   "use -Winvalid-pch for more information");
 	    }
 	  break;
@@ -457,7 +457,7 @@ read_file_guts (cpp_reader *pfile, _cpp_file *file)
   ssize_t size, total, count;
   uchar *buf;
   bool regular;
-  
+
   if (S_ISBLK (file->st.st_mode))
     {
       cpp_error (pfile, CPP_DL_ERROR, "%s is a block device", file->path);
@@ -514,15 +514,8 @@ read_file_guts (cpp_reader *pfile, _cpp_file *file)
     cpp_error (pfile, CPP_DL_WARNING,
 	       "%s is shorter than expected", file->path);
 
-  /* Shrink buffer if we allocated substantially too much.  */
-  if (total + 4096 < size)
-    buf = xrealloc (buf, total + 1);
-
-  /* The lexer requires that the buffer be \n-terminated.  */
-  buf[total] = '\n';
-
-  file->buffer = buf;
-  file->st.st_size = total;
+  file->buffer = _cpp_convert_input (pfile, CPP_OPTION (pfile, input_charset),
+				     buf, size, total, &file->st.st_size);
   file->buffer_valid = true;
 
   return true;
@@ -566,7 +559,7 @@ should_stack_file (cpp_reader *pfile, _cpp_file *file, bool import)
   if (file->once_only)
     return false;
 
-  /* We must mark the file once-only if #import now, before header 
+  /* We must mark the file once-only if #import now, before header
      guard checks.  Otherwise, undefining the header guard might
      cause the file to be re-stacked.  */
   if (import)
@@ -1283,7 +1276,7 @@ struct pchf_data {
      This is used as an optimisation, it means we don't have to search
      the structure if we're processing a regular #include.  */
   bool have_once_only;
-  
+
   struct pchf_entry {
     /* The size of this file.  This is used to save running a MD5 checksum
        if the sizes don't match.  */
@@ -1298,7 +1291,7 @@ struct pchf_data {
 static struct pchf_data *pchf;
 
 /* Data for pchf_addr.  */
-struct pchf_adder_info 
+struct pchf_adder_info
 {
   cpp_reader *pfile;
   struct pchf_data *d;
@@ -1322,11 +1315,11 @@ pchf_adder (void **slot, void *data)
 	 the PCH file shouldn't be written...  */
       if (f->dont_read || f->err_no)
 	return 1;
-      
+
       d->entries[count].once_only = f->once_only;
       d->have_once_only |= f->once_only;
       if (f->buffer_valid)
-	  md5_buffer ((const char *)f->buffer, 
+	  md5_buffer ((const char *)f->buffer,
 		      f->st.st_size, d->entries[count].sum);
       else
 	{
@@ -1365,22 +1358,22 @@ _cpp_save_file_entries (cpp_reader *pfile, FILE *f)
   struct pchf_data *result;
   size_t result_size;
   struct pchf_adder_info pai;
-  
+
   count = htab_elements (pfile->file_hash);
-  result_size = (sizeof (struct pchf_data) 
+  result_size = (sizeof (struct pchf_data)
 		 + sizeof (struct pchf_entry) * (count - 1));
   result = xcalloc (result_size, 1);
-  
+
   result->count = 0;
   result->have_once_only = false;
-  
+
   pai.pfile = pfile;
   pai.d = result;
   htab_traverse (pfile->file_hash, pchf_adder, &pai);
 
   result_size = (sizeof (struct pchf_data)
                  + sizeof (struct pchf_entry) * (result->count - 1));
-  
+
   qsort (result->entries, result->count, sizeof (struct pchf_entry),
 	 pchf_save_compare);
 
@@ -1393,11 +1386,11 @@ bool
 _cpp_read_file_entries (cpp_reader *pfile ATTRIBUTE_UNUSED, FILE *f)
 {
   struct pchf_data d;
-  
+
   if (fread (&d, sizeof (struct pchf_data) - sizeof (struct pchf_entry), 1, f)
        != 1)
     return false;
-  
+
   pchf = xmalloc (sizeof (struct pchf_data)
 		  + sizeof (struct pchf_entry) * (d.count - 1));
   memcpy (pchf, &d, sizeof (struct pchf_data) - sizeof (struct pchf_entry));
@@ -1422,7 +1415,7 @@ struct pchf_compare_data
 
   /* Do we need to worry about entries that don't have ONCE_ONLY set?  */
   bool check_included;
-  
+
   /* The file that we're searching for.  */
   _cpp_file *f;
 };
@@ -1435,15 +1428,15 @@ pchf_compare (const void *d_p, const void *e_p)
   const struct pchf_entry *e = (const struct pchf_entry *)e_p;
   struct pchf_compare_data *d = (struct pchf_compare_data *)d_p;
   int result;
-  
+
   result = memcmp (&d->size, &e->size, sizeof (off_t));
   if (result != 0)
     return result;
-  
+
   if (! d->sum_computed)
     {
       _cpp_file *const f = d->f;
-      
+
       md5_buffer ((const char *)f->buffer, f->st.st_size, d->sum);
       d->sum_computed = true;
     }
@@ -1458,7 +1451,7 @@ pchf_compare (const void *d_p, const void *e_p)
     return 1;
 }
 
-/* Check that F is not in a list read from a PCH file (if any).  
+/* Check that F is not in a list read from a PCH file (if any).
    Assumes that f->buffer_valid is true.  Return TRUE if the file
    should not be read.  */
 
@@ -1468,7 +1461,7 @@ check_file_against_entries (cpp_reader *pfile ATTRIBUTE_UNUSED,
 			    bool check_included)
 {
   struct pchf_compare_data d;
-  
+
   if (pchf == NULL
       || (! check_included && ! pchf->have_once_only))
     return false;
diff --git a/gcc/cpphash.h b/gcc/cpphash.h
index 4c044c1ad45376b1db7c97f123544d292285b01b..660674671582b65d4d4d1bd139a6f1829545c413 100644
--- a/gcc/cpphash.h
+++ b/gcc/cpphash.h
@@ -563,9 +563,6 @@ extern void _cpp_init_internal_pragmas (cpp_reader *);
 extern void _cpp_do_file_change (cpp_reader *, enum lc_reason, const char *,
 				 unsigned int, unsigned int);
 extern void _cpp_pop_buffer (cpp_reader *);
-extern uchar *_cpp_input_to_utf8 (cpp_reader *, const unsigned char *, cppchar_t);
-extern void _cpp_init_iconv_buffer (cpp_reader *, const char *);
-extern void _cpp_close_iconv_buffer (cpp_reader *);
 
 /* In cpptrad.c.  */
 extern bool _cpp_scan_out_logical_line (cpp_reader *, cpp_macro *);
@@ -582,8 +579,12 @@ extern size_t _cpp_replacement_text_len (const cpp_macro *);
 extern cppchar_t _cpp_valid_ucn (cpp_reader *, const uchar **,
 				 const uchar *, int);
 extern void _cpp_destroy_iconv (cpp_reader *);
-extern bool _cpp_interpret_string_notranslate (cpp_reader *, const cpp_string *,
+extern bool _cpp_interpret_string_notranslate (cpp_reader *,
+					       const cpp_string *,
 					       cpp_string *);
+extern uchar *_cpp_convert_input (cpp_reader *, const char *, uchar *,
+				  size_t, size_t, off_t *);
+extern const char *_cpp_default_encoding (void);
 
 /* Utility routines and macros.  */
 #define DSC(str) (const uchar *)str, sizeof str - 1
diff --git a/gcc/cppinit.c b/gcc/cppinit.c
index ab2331daa7f0f986cc56118b617a073a4adf085c..d6509fd6a3f04255ff93b24173c871d383d08aed 100644
--- a/gcc/cppinit.c
+++ b/gcc/cppinit.c
@@ -159,11 +159,11 @@ cpp_create_reader (enum c_lang lang, hash_table *table,
   CPP_OPTION (pfile, bytes_big_endian) = 1;  /* does not matter */
 
   /* Default to no charset conversion.  */
-  CPP_OPTION (pfile, narrow_charset) = 0;
+  CPP_OPTION (pfile, narrow_charset) = _cpp_default_encoding ();
   CPP_OPTION (pfile, wide_charset) = 0;
 
-  /* Default the input character set to iso-8859-1 for now. */
-  CPP_OPTION (pfile, input_charset) = "ISO-8859-1";
+  /* Default the input character set to UTF-8.  */
+  CPP_OPTION (pfile, input_charset) = _cpp_default_encoding ();
 
   /* A fake empty "directory" used as the starting point for files
      looked up without a search path.  Name cannot be '/' because we
@@ -579,7 +579,7 @@ read_original_directory (cpp_reader *pfile)
       debugdir[token->val.str.len - 4] = '\0';
 
       pfile->cb.dir_change (pfile, debugdir);
-    }      
+    }
 
   /* We want to process the fake line changes as regular changes, to
      get them output.  */
@@ -591,7 +591,7 @@ read_original_directory (cpp_reader *pfile)
 /* This is called at the end of preprocessing.  It pops the last
    buffer and writes dependency output, and returns the number of
    errors.
- 
+
    Maybe it should also reset state, such that you could call
    cpp_start_read with a new filename to restart processing.  */
 int
diff --git a/gcc/cpplib.c b/gcc/cpplib.c
index 33b2de62646853a1d3f8e413f6f71a2acc6dd3c7..fa168594651aa0fe456a27297b24c655fff0c3c6 100644
--- a/gcc/cpplib.c
+++ b/gcc/cpplib.c
@@ -1925,7 +1925,6 @@ cpp_push_buffer (cpp_reader *pfile, const uchar *buffer, size_t len,
 		 int from_stage3)
 {
   cpp_buffer *new = xobnew (&pfile->buffer_ob, cpp_buffer);
-  const char *input = CPP_OPTION (pfile, input_charset);
 
   /* Clears, amongst other things, if_stack and mi_cmacro.  */
   memset (new, 0, sizeof (cpp_buffer));
@@ -1937,7 +1936,6 @@ cpp_push_buffer (cpp_reader *pfile, const uchar *buffer, size_t len,
   new->need_line = true;
 
   pfile->buffer = new;
-  _cpp_init_iconv_buffer (pfile, input);
 
   return new;
 }
@@ -1960,8 +1958,6 @@ _cpp_pop_buffer (cpp_reader *pfile)
   /* In case of a missing #endif.  */
   pfile->state.skipping = 0;
 
-  _cpp_close_iconv_buffer (pfile);
-
   /* _cpp_do_file_change expects pfile->buffer to be the new one.  */
   pfile->buffer = buffer->prev;
 
diff --git a/gcc/doc/cppopts.texi b/gcc/doc/cppopts.texi
index 653e2e7de2955e2dbd2c8969f2e5eac869712ee7..4649e6ec8f22f23db70b628cf950b3c1daead1c7 100644
--- a/gcc/doc/cppopts.texi
+++ b/gcc/doc/cppopts.texi
@@ -511,6 +511,16 @@ corresponds to the width of @code{wchar_t}.  As with
 by the system's @code{iconv} library routine; however, you will have
 problems with encodings that do not fit exactly in @code{wchar_t}.
 
+@item -finput-charset=@var{charset}
+@opindex finput-charset
+Set the input character set, used for translation from the character
+set of the input file to the source character set used by GCC. If the
+locale does not specify, or GCC cannot get this information from the
+locale, the default is UTF-8. This can be overriden by either the locale
+or this command line option. Currently the command line option takes
+precedence if there's a conflict. @var{charset} can be any encoding
+supported by the system's @code{iconv} library routine.
+
 @item -fworking-directory
 @opindex fworking-directory
 @opindex fno-working-directory
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 56a7c0c6cde288a28a9831c3a5620b16850725f8..84a9692c28647e37f724af3a386f7798e4cb1d9a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2004-02-02 Eric Christopher  <echristo@redhat.com>
+           Zack Weinberg  <zack@codesourcery.com>
+
+	* gcc.c-torture/execute/wchar_t-1.c: Add -finput-charset.
+
 2004-02-02  Zack Weinberg  <zack@codesourcery.com>
 
 	* g++.dg/eh/forced1.C, g++.dg/eh/forced2.C, g++.dg/eh/forced3.C
@@ -20556,5 +20561,3 @@ rlsruhe.de>
 	correspond to c-torture	1.11.
 
 	* New file.
-
-
diff --git a/gcc/testsuite/gcc.c-torture/execute/wchar_t-1.c b/gcc/testsuite/gcc.c-torture/execute/wchar_t-1.c
index 3efdcf5a038388c64aa1010fb2cb1a05b92dbce2..7e90cc08f5ea5361d42a8f639fd284eb5c5916ea 100644
--- a/gcc/testsuite/gcc.c-torture/execute/wchar_t-1.c
+++ b/gcc/testsuite/gcc.c-torture/execute/wchar_t-1.c
@@ -1,3 +1,4 @@
+/* { dg-options "-finput-charset=utf-8" } */
 typedef __WCHAR_TYPE__ wchar_t;
 wchar_t x[] = L"Ä";
 wchar_t y = L'Ä';
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 76a709401448d713f1fa2746a0d2d9c9feea7579..c1759b61be9643d558b6f5fba46a6c9f1a9357aa 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,18 @@
+2004-01-29  Eric Christopher  <echristo@redhat.com>
+            Zack Weinberg  <zack@codesourcery.com>
+
+	* testsuite/22_locale/collate/compare/wchar_t/2.cc: Remove xfail. Use
+        -finput-charset.
+        * testsuite/22_locale/collate/compare/wchar_t/wrapped_env.cc: Ditto.
+        * testsuite/22_locale/collate/compare/wchar_t/wrapped_locale.cc: Ditto
+	* testsuite/22_locale/collate/hash/wchar_t/2.cc: Ditto.
+        * testsuite/22_locale/collate/hash/wchar_t/wrapped_env.cc: Ditto.
+        * testsuite/22_locale/collate/hash/wchar_t/wrapped_locale.cc: Ditto.
+        * testsuite/22_locale/collate/transform/wchar_t/2.cc: Ditto.
+        * testsuite/22_locale/collate/transform/wchar_t/wrapped_env.cc: Ditto.
+        * testsuite/22_locale/collate/transform/wchar_t/wrapped_locale.cc:
+	Ditto.
+
 2004-02-02  Paolo Carlini  <pcarlini@suse.de>
 
 	* include/bits/stl_function.h: Additional minor tweaks.
@@ -97,7 +112,7 @@
 	* testsuite/21_strings/basic_string/cons/char/6.cc: New.
 	* testsuite/21_strings/basic_string/cons/wchar_t/6.cc: New.
 	* testsuite/performance/21_strings/string_cons_input_iterator.cc: New.
-	
+
 2004-01-30  Felix Yen  <fwy@alumni.brown.edu>
 
 	* testsuite/performance/20_util/allocator_thread.cc (do_loop):
@@ -108,7 +123,7 @@
 	* src/demangle.cc: Add instantiations.
 	* src/Makefile.am: Remove special rules for demangle.lo, demangle.o.
 	* src/Makefile.in: Regenerate.
-	
+
 2004-01-30  David Edelsohn  <edelsohn@gnu.org>
 
 	* src/allocator.cc: Protect _S_get_thread_id() and
@@ -196,7 +211,7 @@
 
 	* include/bits/allocator.h: Temporary switch to new_allocator as
 	the default to unjam bootstraps.
-	
+
 2004-01-28  Benjamin Kosnik  <bkoz@redhat.com>
 
 	* include/Makefile.am (bits_headers): Remove allocator_traits.h.
@@ -212,7 +227,7 @@
 	* src/Makefile.am (sources): Add allocator.cc.
 	* src/Makefile.in: Regenerate.
 	* testsuite/20_util/allocator/1.cc: Split second test into...
-	* testsuite/20_util/allocator/8230.cc: ...this. 
+	* testsuite/20_util/allocator/8230.cc: ...this.
 	* include/bits/stl_bvector.h (__gnu_norm): Change bit_vector
 	typedef to use std::allocatore. Format.
 	* include/ext/pool_allocator.h: Remove allocator_traits.h include,
@@ -228,14 +243,14 @@
 	implementation details.
 
 	* include/ext/mt_allocator.h: Replace free with delete.
-	
+
 2004-01-28  Benjamin Kosnik  <bkoz@redhat.com>
 
 	* src/globals_io.cc: Change to __gnu_internal namespace.
 	* src/globals_locale.cc: Same.
 	* src/locale_init.cc: Same.
 	* src/ios_init.cc: Same.
-	
+
 2004-01-28  Stefan Olsson  <stefan@snon.net>
 
 	* include/ext/mt_allocator.h: Replaced all malloc() calls with
@@ -264,7 +279,7 @@
 	* include/bits/basic_string.h (_Rep::operator[]): Tweak
 	signature to take a size_type, consistently with the other
 	members.
-	
+
 2004-01-27  Benjamin Kosnik  <bkoz@redhat.com>
 
 	* testsuite/27_io/ios_base/storage/11584.cc: Correct new and
@@ -304,7 +319,7 @@
 
 	PR libstdc++/13884
 	* include/bits/sstream.tcc: Guard use of extern template.
-	
+
 2004-01-27  Paolo Carlini  <pcarlini@suse.de>
 
 	* include/bits/basic_string.tcc
@@ -616,7 +631,7 @@
 	_CharT, const _Alloc&)): Remove redundant try/catch.
 	(_M_mutate(size_type, size_type, size_type)): Ditto.
 	(_M_clone(const _Alloc&, size_type)): Ditto.
-	
+
 2004-01-18  Paolo Carlini  <pcarlini@suse.de>
 
 	* include/bits/basic_string.h (c_str()): Simplify, due to
@@ -652,7 +667,7 @@
 2004-01-16  Benjamin Kosnik  <bkoz@redhat.com>
 
 	* testsuite/ext/enc_filebuf/char/13189.cc: Fix guards.
-	* testsuite/ext/enc_filebuf/wchar_t/13189.cc: Same.	
+	* testsuite/ext/enc_filebuf/wchar_t/13189.cc: Same.
 
 2004-01-16  Danny Smith  <dannysmith@users.sourceforge.net>
 
@@ -675,15 +690,15 @@
 	... here, change signature to take a const char* and a size_t
 	for the grouping; not a template anymore.
 	(__add_grouping, num_put::_M_group_int, num_put::_M_group_float):
-	Likewise change signature and tweak consistently. 
+	Likewise change signature and tweak consistently.
 	(num_get::_M_extract_float, num_get::_M_extract_int,
 	num_put::_M_insert_int, num_put::_M_insert_float,
 	money_get::do_get(string_type&), money_get::do_put(string_type)):
-	Update callers. 
+	Update callers.
 	* config/locale/generic/numeric_members.cc
-	(numpunct<>::_M_initialize_numpunct): Assign the new member.	
+	(numpunct<>::_M_initialize_numpunct): Assign the new member.
 	* config/locale/gnu/numeric_members.cc
-	(numpunct<>::_M_initialize_numpunct): Likewise.	
+	(numpunct<>::_M_initialize_numpunct): Likewise.
 	* src/locale-inst.cc (__add_grouping): Tweak signature.
 	(__verify_grouping): Don't instantiate, not a template anymore.
 
@@ -698,13 +713,13 @@
 	* include/ext/mt_allocator.h: Fixups.
 	* testsuite/performance/allocator.cc: Enable __mt_alloc tests.
 	* testsuite/performance/allocator_thread.cc: Same.
-	
+
 2004-01-13  Benjamin Kosnik  <bkoz@redhat.com>
 
 	* testsuite/performance/ifstream_extract_float.cc: Add higher
 	precision tests.
 	* testsuite/performance/ofstream_insert_float.cc: Same.
-	
+
 2004-01-13  Paolo Carlini  <pcarlini@suse.de>
 
 	* src/locale-misc-inst.cc (__convert_from_v(long),
@@ -830,7 +845,7 @@
 	* testsuite/27_io/basic_filebuf/imbue/wchar_t/13582-3.cc: Ditto.
 	* testsuite/27_io/objects/wchar_t/13582-1_xin.cc: Ditto.
 	* testsuite/27_io/objects/wchar_t/13582-1_xin.in: Ditto.
-	
+
 2004-01-10  Paolo Carlini  <pcarlini@suse.de>
 
 	* docs/html/ext/lwg-active.html, docs/html/ext/lwg-defects.html:
@@ -860,7 +875,7 @@
 	* config.h.in: Regenerate.
 	* aclocal.m4: Same.
 	* configure: Same.
-	
+
 2004-01-07  Gawain Bolton  <gp.bolton@computer.org>
 
 	* include/bits/stl_list.h:
@@ -874,7 +889,7 @@
         Remove inheritance from iterator class and create separate
         classes for non-constant and constant iterators.
 	* include/bits/stl_tree.h (_Rb_tree class):
-	* src/tree.cc: 
+	* src/tree.cc:
         Only erase contents in destructor.
         Eliminate unnecessary initialization in assignment operator.
         Optimize for the nominal case by not checking whether
@@ -886,9 +901,9 @@
         Use  _M_leftmost() and _M_end() to improve readability where
         appropriate.
         Create separate classes for non-constant and constant
-        iterators to clarify code, avoid extra template parameters and 
-        casting away constness.		
-	
+        iterators to clarify code, avoid extra template parameters and
+        casting away constness.
+
 2004-01-07  Benjamin Kosnik  <bkoz@redhat.com>
 
 	* src/Makefile.am (sources): Add list.cc, tree.cc.
@@ -900,7 +915,7 @@
 	* testsuite/23_containers/set/operators/1_neg.cc: Add excess errors.
 
 	* bits/stl_vector.h: Column wrap comments.
-	
+
 2004-01-07  Loren J. Rittle  <ljrittle@acm.org>
 
 	(re-open) PR libstdc++/12658
diff --git a/libstdc++-v3/testsuite/22_locale/collate/compare/wchar_t/2.cc b/libstdc++-v3/testsuite/22_locale/collate/compare/wchar_t/2.cc
index fd4aee7a01614e9af8c76ec3be50f5899dbe31e7..97ce326f810cbe28da657c16b1bd47a881088de8 100644
--- a/libstdc++-v3/testsuite/22_locale/collate/compare/wchar_t/2.cc
+++ b/libstdc++-v3/testsuite/22_locale/collate/compare/wchar_t/2.cc
@@ -18,9 +18,8 @@
 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
 // USA.
 
-// Doesn't work due to use of literal ISO8859.1 characters.  PR 11439
-// { dg-do compile { xfail *-*-* } } should be run
-// { dg-excess-errors "" }
+// { dg-do run }
+// { dg-options "-finput-charset=iso-8859-1" }
 
 // 22.2.4.1.1 collate members
 
diff --git a/libstdc++-v3/testsuite/22_locale/collate/compare/wchar_t/wrapped_env.cc b/libstdc++-v3/testsuite/22_locale/collate/compare/wchar_t/wrapped_env.cc
index 50c697d0f1423bb2a7e99a3c6cfeff23ab2a1dc3..dd4ef2aeff533c4c69861e9f2a31e3687886ac25 100644
--- a/libstdc++-v3/testsuite/22_locale/collate/compare/wchar_t/wrapped_env.cc
+++ b/libstdc++-v3/testsuite/22_locale/collate/compare/wchar_t/wrapped_env.cc
@@ -20,9 +20,8 @@
 
 // 22.2.4.1.1 collate members
 
-// Doesn't work due to use of literal ISO8859.1 characters.  PR 11439
-// { dg-do compile { xfail *-*-* } } should be run
-// { dg-excess-errors "" }
+// { dg-do run }
+// { dg-options "-finput-charset=iso-8859-1" }
 
 #include <testsuite_hooks.h>
 
diff --git a/libstdc++-v3/testsuite/22_locale/collate/compare/wchar_t/wrapped_locale.cc b/libstdc++-v3/testsuite/22_locale/collate/compare/wchar_t/wrapped_locale.cc
index 8dc885ac53359a742b3e02c831c3d4a6c4955655..f8af6497cedf03a79a6c2404d25cede333586db8 100644
--- a/libstdc++-v3/testsuite/22_locale/collate/compare/wchar_t/wrapped_locale.cc
+++ b/libstdc++-v3/testsuite/22_locale/collate/compare/wchar_t/wrapped_locale.cc
@@ -20,9 +20,8 @@
 
 // 22.2.4.1.1 collate members
 
-// Doesn't work due to use of literal ISO8859.1 characters.  PR 11439
-// { dg-do compile { xfail *-*-* } } should be run
-// { dg-excess-errors "" }
+// { dg-do run }
+// { dg-options "-finput-charset=iso-8859-1" }
 
 #include <testsuite_hooks.h>
 
diff --git a/libstdc++-v3/testsuite/22_locale/collate/hash/wchar_t/2.cc b/libstdc++-v3/testsuite/22_locale/collate/hash/wchar_t/2.cc
index 280180322278e39d3a51b68c30b5241b13b73b5e..c10c50786fc9a1d4bc7c423b74ce9c880da04ec2 100644
--- a/libstdc++-v3/testsuite/22_locale/collate/hash/wchar_t/2.cc
+++ b/libstdc++-v3/testsuite/22_locale/collate/hash/wchar_t/2.cc
@@ -20,9 +20,8 @@
 
 // 22.2.4.1.1 collate members
 
-// Doesn't work due to use of literal ISO8859.1 characters.  PR 11439
-// { dg-do compile { xfail *-*-* } } should be run
-// { dg-excess-errors "" }
+// { dg-do run }
+// { dg-options "-finput-charset=iso-8859-1" }
 
 #include <locale>
 #include <testsuite_hooks.h>
diff --git a/libstdc++-v3/testsuite/22_locale/collate/hash/wchar_t/wrapped_env.cc b/libstdc++-v3/testsuite/22_locale/collate/hash/wchar_t/wrapped_env.cc
index 50c697d0f1423bb2a7e99a3c6cfeff23ab2a1dc3..dd4ef2aeff533c4c69861e9f2a31e3687886ac25 100644
--- a/libstdc++-v3/testsuite/22_locale/collate/hash/wchar_t/wrapped_env.cc
+++ b/libstdc++-v3/testsuite/22_locale/collate/hash/wchar_t/wrapped_env.cc
@@ -20,9 +20,8 @@
 
 // 22.2.4.1.1 collate members
 
-// Doesn't work due to use of literal ISO8859.1 characters.  PR 11439
-// { dg-do compile { xfail *-*-* } } should be run
-// { dg-excess-errors "" }
+// { dg-do run }
+// { dg-options "-finput-charset=iso-8859-1" }
 
 #include <testsuite_hooks.h>
 
diff --git a/libstdc++-v3/testsuite/22_locale/collate/hash/wchar_t/wrapped_locale.cc b/libstdc++-v3/testsuite/22_locale/collate/hash/wchar_t/wrapped_locale.cc
index 8dc885ac53359a742b3e02c831c3d4a6c4955655..f8af6497cedf03a79a6c2404d25cede333586db8 100644
--- a/libstdc++-v3/testsuite/22_locale/collate/hash/wchar_t/wrapped_locale.cc
+++ b/libstdc++-v3/testsuite/22_locale/collate/hash/wchar_t/wrapped_locale.cc
@@ -20,9 +20,8 @@
 
 // 22.2.4.1.1 collate members
 
-// Doesn't work due to use of literal ISO8859.1 characters.  PR 11439
-// { dg-do compile { xfail *-*-* } } should be run
-// { dg-excess-errors "" }
+// { dg-do run }
+// { dg-options "-finput-charset=iso-8859-1" }
 
 #include <testsuite_hooks.h>
 
diff --git a/libstdc++-v3/testsuite/22_locale/collate/transform/wchar_t/2.cc b/libstdc++-v3/testsuite/22_locale/collate/transform/wchar_t/2.cc
index d21d39964920b0161682ee424262b8315f9e7795..41044fd52edfbf4f02aa3e0ca9dab211bb86c5d9 100644
--- a/libstdc++-v3/testsuite/22_locale/collate/transform/wchar_t/2.cc
+++ b/libstdc++-v3/testsuite/22_locale/collate/transform/wchar_t/2.cc
@@ -20,9 +20,8 @@
 
 // 22.2.4.1.1 collate members
 
-// Doesn't work due to use of literal ISO8859.1 characters.  PR 11439
-// { dg-do compile { xfail *-*-* } } should be run
-// { dg-excess-errors "" }
+// { dg-do run }
+// { dg-options "-finput-charset=iso-8859-1" }
 
 #include <locale>
 #include <testsuite_hooks.h>
diff --git a/libstdc++-v3/testsuite/22_locale/collate/transform/wchar_t/wrapped_env.cc b/libstdc++-v3/testsuite/22_locale/collate/transform/wchar_t/wrapped_env.cc
index fe7ed8dbfac6a3045424e1d86b8a6f956f0a3227..7c251724a5bc18321942aed874299740d8469e74 100644
--- a/libstdc++-v3/testsuite/22_locale/collate/transform/wchar_t/wrapped_env.cc
+++ b/libstdc++-v3/testsuite/22_locale/collate/transform/wchar_t/wrapped_env.cc
@@ -20,9 +20,8 @@
 
 // 22.2.4.1.1 collate members
 
-// Doesn't work due to use of literal ISO8859.1 characters.  PR 11439
-// { dg-do compile { xfail *-*-* } } should be run
-// { dg-excess-errors "" }
+// { dg-do run }
+// { dg-options "-finput-charset=iso-8859-1" }
 
 #include <testsuite_hooks.h>
 
diff --git a/libstdc++-v3/testsuite/22_locale/collate/transform/wchar_t/wrapped_locale.cc b/libstdc++-v3/testsuite/22_locale/collate/transform/wchar_t/wrapped_locale.cc
index fdbf3035a78164c5621baf171c37b4d218d16c95..cffa25df532ee0f80106a96d45f36fca3c4c9679 100644
--- a/libstdc++-v3/testsuite/22_locale/collate/transform/wchar_t/wrapped_locale.cc
+++ b/libstdc++-v3/testsuite/22_locale/collate/transform/wchar_t/wrapped_locale.cc
@@ -20,9 +20,8 @@
 
 // 22.2.4.1.1 collate members
 
-// Doesn't work due to use of literal ISO8859.1 characters.  PR 11439
-// { dg-do compile { xfail *-*-* } } should be run
-// { dg-excess-errors "" }
+// { dg-do run }
+// { dg-options "-finput-charset=iso-8859-1" }
 
 #include <testsuite_hooks.h>