diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 48ac7822f973eb30c6350498e0698b3fc9efb661..f7b0f3261b57e60cbf5f19f9b17a51e61181e96c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2002-06-20  Neil Booth  <neil@daikokuya.co.uk>
+
+	* cppexp.c (cpp_interpret_integer): Don't force traditional
+	numbers to be unsigned.
+	* cpplib.c (prepare_directive_trad): Set line number for
+	diagnostics.
+	* cpptrad.c (scan_out_logical_line): Continue scanning out
+	at start of buffer.
+	* gcc.c (trad_capable_cpp): Use cc1 always.
+
 2002-06-20  Jeffrey Law  <law@redhat.com>
 
 	* i386.h (TARGET_DEFAULT): Do not turn on frame pointer
diff --git a/gcc/cppexp.c b/gcc/cppexp.c
index 4fc833c23e4e4d3e690a126e090e6728fedaaa96..b3a7ce60966f2501c4ea6130f6ca42417e979ae9 100644
--- a/gcc/cppexp.c
+++ b/gcc/cppexp.c
@@ -375,10 +375,13 @@ cpp_interpret_integer (pfile, token, type)
       if (overflow)
 	cpp_error (pfile, DL_PEDWARN,
 		   "integer constant is too large for its type");
-      else if (!result.unsignedp && !num_positive (result, precision))
+      /* If too big to be signed, consider it unsigned.  Only warn for
+	 decimal numbers.  Traditional numbers were always signed (but
+	 we still honour an explicit U suffix).  */
+      else if (!result.unsignedp
+	       && !CPP_OPTION (pfile, traditional)
+	       && !num_positive (result, precision))
 	{
-	  /* If too big to be signed, consider it unsigned.  Only warn
-	     for decimal numbers.  */
 	  if (base == 10)
 	    cpp_error (pfile, DL_WARNING,
 		       "integer constant is so large that it is unsigned");
diff --git a/gcc/cpplib.c b/gcc/cpplib.c
index 4ee97e81a05ea502759d968882f116f5a5ea85d1..d3c95e75c864fdc3e87f30f2051764c161b08608 100644
--- a/gcc/cpplib.c
+++ b/gcc/cpplib.c
@@ -303,6 +303,8 @@ prepare_directive_trad (pfile)
       pfile->state.skipping = was_skipping;
       _cpp_overlay_buffer (pfile, pfile->out.base,
 			   pfile->out.cur - pfile->out.base);
+      /* Report diagnostics on the line of the directive.  */
+      pfile->line = pfile->directive_line;
     }
 
   /* Stop ISO C from expanding anything.  */
diff --git a/gcc/cpptrad.c b/gcc/cpptrad.c
index 82eeee52026c06dd7a815a58850bbd7a856e8dce..74976dbe2310ecf70eeb17f33b43d9a148821b0e 100644
--- a/gcc/cpptrad.c
+++ b/gcc/cpptrad.c
@@ -38,7 +38,7 @@ struct block
 };
 
 #define BLOCK_HEADER_LEN offsetof (struct block, text)
-#define BLOCK_LEN(TEXT_LEN) CPP_ALIGN (BLOCK_HEADER_LEN + TEXT_LEN)
+#define BLOCK_LEN(TEXT_LEN) CPP_ALIGN (BLOCK_HEADER_LEN + (TEXT_LEN))
 
 /* Structure holding information about a function-like macro
    invocation.  */
@@ -602,8 +602,9 @@ scan_out_logical_line (pfile, macro)
 		{
 		  /* Found a parameter in the replacement text of a
 		     #define.  Remove its name from the output.  */
-		  out = pfile->out.cur = out_start;
+		  pfile->out.cur = out_start;
 		  save_replacement_text (pfile, macro, node->arg_index);
+		  out = pfile->out.base;
 		}
 	      else if (lex_state == ls_hash)
 		{
diff --git a/gcc/f/ChangeLog b/gcc/f/ChangeLog
index 581fbe1e67848888007303442a1d9b23404377f8..fa3128ca8735ea7356cd96f76154bc63ad1960a4 100644
--- a/gcc/f/ChangeLog
+++ b/gcc/f/ChangeLog
@@ -1,3 +1,7 @@
+Thu Jun 20 21:56:34 2002  Neil Booth  <neil@daikokuya.co.uk>
+
+	* lang-specs.h: Use cc1 for traditional preprocessing.
+
 2002-06-20  Andreas Jaeger  <aj@suse.de>
 
 	* com.c (ffecom_prepare_expr_,ffecom_expr_power_integer_):
diff --git a/gcc/f/lang-specs.h b/gcc/f/lang-specs.h
index c22837a7b938d87a28ced1f7136013d7944b2348..5536f78cab060588cd8b8c147b2398e8484a8bcd 100644
--- a/gcc/f/lang-specs.h
+++ b/gcc/f/lang-specs.h
@@ -28,7 +28,7 @@ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   {".fpp", "@f77-cpp-input", 0},
   {".FPP", "@f77-cpp-input", 0},
   {"@f77-cpp-input",
-   "tradcpp0 -lang-fortran %(cpp_options) \
+   "cc1 -E -traditional-cpp -D_LANGUAGE_FORTRAN %(cpp_options) \
         %{E|M|MM:%(cpp_debug_options)}\
         %{!M:%{!MM:%{!E:%{!pipe:%g.f} |\n\
     f771 %{!pipe:%g.f} %(cc1_options) %{I*} %{!fsyntax-only:%(invoke_as)}}}}", 0},
diff --git a/gcc/gcc.c b/gcc/gcc.c
index 292b061ef364469bf0cb3f73cce77b868224b318..fc0f3592c9798ee33e09b5e6219b9a05cd822644 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -675,8 +675,7 @@ static const char *startfile_prefix_spec = STARTFILE_PREFIX_SPEC;
    call cc1 (or cc1obj in objc/lang-specs.h) from the main specs so
    that we default the front end language better.  */
 static const char *trad_capable_cpp =
-"%{traditional|ftraditional|traditional-cpp:tradcpp0}\
- %{!traditional:%{!ftraditional:%{!traditional-cpp:cc1 -E}}}";
+"cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp}";
 
 static const char *cpp_unique_options =
 "%{C:%{!E:%eGNU C does not support -C without using -E}}\
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 653cab34af708ee0c092a2775812975495f6f2ff..498e67171a509b8c4a119b2c4633d3f703d8626f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2002-06-20  Neil Booth  <neil@daikokuya.co.uk>
+
+	* gcc.dg/cpp/assert_trad1.c, gcc.dg/cpp/assert_trad2.c,
+	gcc.dg/cpp/assert_trad3.c, gcc.dg/cpp/defined_trad.c,
+	gcc.dg/cpp/hash2.c, gcc.dg/cpp/tr-define.c, gcc.dg/cpp/tr-direct.c,
+	gcc.dg/cpp/tr-sign.c, gcc.dg/cpp/tr-str.c, gcc.dg/cpp/uchar-2.c:
+	Remove.
+
 2002-06-20  Richard Sandiford  <rsandifo@redhat.com>
 
 	* gcc.dg/20020620-1.c: New test.
diff --git a/gcc/testsuite/gcc.dg/cpp/assert_trad1.c b/gcc/testsuite/gcc.dg/cpp/assert_trad1.c
deleted file mode 100644
index 6d3c04e1a0db9c0993d42ceb98c85513e7cb51a4..0000000000000000000000000000000000000000
--- a/gcc/testsuite/gcc.dg/cpp/assert_trad1.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Basic tests of the #assert preprocessor extension. */
-/* { dg-do compile } */
-/* { dg-options "-traditional-cpp" } */
-
-/* #define def unused expansion */ /* tradcpp can't handle macros in answers.  */
-#define fail int failit
-
-#assert abc (def)
-#assert abc (ghi)
-#assert abc (jkl)
-#assert space ( s p a c e )
-
-/* Basic: */
-#if !#abc (def) || !#abc (ghi) || !#abc (jkl)
-fail
-#endif
-
-/* any answer for #abc */
-#if !#abc
-fail
-#endif
-
-/* internal whitespace is collapsed,
-   external whitespace is deleted  */
-#if !#space (s p  a  c e) || !#space (  s p a c e  ) || #space (space)
-fail
-#endif
-
-/* removing assertions */
-#unassert abc (jkl)
-#if !#abc || !#abc (def) || !#abc (ghi) || #abc (jkl)
-fail
-#endif
-
-#unassert abc
-#if #abc || #abc (def) || #abc (ghi) || #abc (jkl)
-fail
-#endif
-
-int gobble
-
-/* make sure it can succeed too.
-   also check space before open paren isn't significant */
-#if #space(s p a c e)
-;
-#endif
diff --git a/gcc/testsuite/gcc.dg/cpp/assert_trad2.c b/gcc/testsuite/gcc.dg/cpp/assert_trad2.c
deleted file mode 100644
index 2f6963ec9c0789756b505029f5b3b1276cb3ebb6..0000000000000000000000000000000000000000
--- a/gcc/testsuite/gcc.dg/cpp/assert_trad2.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Malformed assertion tests.  */
-/* { dg-do preprocess } */
-/* { dg-options "-traditional" } */
-
-#assert		/* { dg-error "without predicate" "assert w/o predicate" } */
-#assert %	/* { dg-error "an identifier" "assert punctuation" } */
-#assert 12	/* { dg-error "an identifier" "assert number" } */
-#assert abc	/* { dg-error "missing" "assert w/o answer" } */
-
-#if #		/* { dg-error "without predicate" "test w/o predicate" } */
-#endif
-
-#if #%		/* { dg-error "an identifier" "test punctuation" } */
-#endif		/* { dg-error "parse error" "" { target *-*-* } 13 } */
-
-#if #12		/* { dg-error "an identifier" "test number" } */
-#endif		/* { dg-error "parse error" "" { target *-*-* } 16 } */
-
-#if #abc
-#error		/* { dg-bogus "error" "test w/o answer" } */
-#endif
-
-#if #abc[def]	/* { dg-error "parse error" "bad syntax" } */
-#endif
diff --git a/gcc/testsuite/gcc.dg/cpp/assert_trad3.c b/gcc/testsuite/gcc.dg/cpp/assert_trad3.c
deleted file mode 100644
index 641ba5c042948a399753eb75424248dded5b04b2..0000000000000000000000000000000000000000
--- a/gcc/testsuite/gcc.dg/cpp/assert_trad3.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Copyright (C) 2000 Free Software Foundation, Inc.  */
-
-/* { dg-do preprocess } */
-/* { dg-options "-A abc=def -A abc\(ghi\) \"-Aabc = jkl\" -A abc=mno -A -abc=mno -traditional" } */
-
-/* Test -A command line syntax.  Source Neil Booth.  31 Oct 2000.  */
-
-#if !#abc (def) || !#abc (ghi) || !#abc (jkl) || #abc(mno)
-#error Command line -A assertions
-#endif
diff --git a/gcc/testsuite/gcc.dg/cpp/defined_trad.c b/gcc/testsuite/gcc.dg/cpp/defined_trad.c
deleted file mode 100644
index 666fd712f5adf71c4a1a1936e57cfb54fc6f8184..0000000000000000000000000000000000000000
--- a/gcc/testsuite/gcc.dg/cpp/defined_trad.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/* Copyright (C) 2000 Free Software Foundation, Inc.  */
-
-/* { dg-do preprocess } */
-/* { dg-options "-traditional" } */
-
-/* Tests tradcpp0 with defined.  The defined operator in traditional C
-   works just the same as the defined operator in Standard C.  */
-
-/* Source: Zack Weinberg, glibc, Neil Booth 11 Dec 2000.  */
-
-#if defined REGPARMS
-#error REGPARMS should not be defined
-#endif
-
-#define REGPARMS 1
-#if !defined REGPARMS
-#error REGPARMS should be defined
-#endif
-
-#define defined			/* { dg-error "defined" } */
-
-/* No diagnostics, though you could argue there should be.  */
-#if defined defined
-#error defined is defined!
-#endif
-
-#define is_Z_defined defined Z
-
-#if defined Z
-#error Z is not defined
-#endif
-
-/* The behaviour of "defined" when it comes from a macro expansion is
-   now documented.  */
-#if is_Z_defined
-#error Macro expanding into defined operator test 1
-#endif
-
-#define Z
-
-#if !defined Z
-#error Z is defined
-#endif
-
-#if !is_Z_defined
-#error Macro expanding into defined operator test 2
-#endif
-
-#undef is_Z_defined
-#undef Z
-
-/* Do all the tests over again with the () form of defined.  */
-
-/* No diagnostics, though you could argue there should be.  */
-#if defined(defined)
-#error defined is defined!
-#endif
-
-#define is_Z_defined defined ( Z )
-
-#if defined(Z)
-#error Z is not defined
-#endif
-
-/* The behaviour of "defined" when it comes from a macro expansion is
-   now documented.  */
-#if is_Z_defined
-#error Macro expanding into defined operator test 1
-#endif
-
-#define Z
-
-#if !defined(Z)
-#error Z is defined
-#endif
-
-#if !is_Z_defined
-#error Macro expanding into defined operator test 2
-#endif
diff --git a/gcc/testsuite/gcc.dg/cpp/hash2.c b/gcc/testsuite/gcc.dg/cpp/hash2.c
deleted file mode 100644
index 4e177f4e0142e186dd589a81500028e69a526623..0000000000000000000000000000000000000000
--- a/gcc/testsuite/gcc.dg/cpp/hash2.c
+++ /dev/null
@@ -1,15 +0,0 @@
-/* Test for erroneously thinking comments are token-pastes.
-   From XFree86 4.0.  */
-/* { dg-do preprocess } */
-/* { dg-options "-traditional" } */
-
-#ifndef foo
-#define foo	/**/
-#endif
-
-#ifndef foo
-#define foo	/* as nothing */
-#endif
-
-/* { dg-bogus "(start|end) of macro" "paste at end" { target *-*-* } 7 } */
-/* { dg-bogus "(start|end) of macro" "comment at end" { target *-*-* } 11 } */
diff --git a/gcc/testsuite/gcc.dg/cpp/tr-define.c b/gcc/testsuite/gcc.dg/cpp/tr-define.c
deleted file mode 100644
index 54bd7a73b3b5a549eaf7c748310daaf93d51d46d..0000000000000000000000000000000000000000
--- a/gcc/testsuite/gcc.dg/cpp/tr-define.c
+++ /dev/null
@@ -1,2 +0,0 @@
-/* { dg-do preprocess } */
-/* { dg-options "-traditional -DDEFINE1DEFINE -DDEFINE2DEFIN=" } */
diff --git a/gcc/testsuite/gcc.dg/cpp/tr-direct.c b/gcc/testsuite/gcc.dg/cpp/tr-direct.c
deleted file mode 100644
index 56a52ba1b3b0780070da821842702e834541ada3..0000000000000000000000000000000000000000
--- a/gcc/testsuite/gcc.dg/cpp/tr-direct.c
+++ /dev/null
@@ -1,11 +0,0 @@
-/* Test for some basic aspects of -traditional directive processing.  */
-
-/* { dg-do preprocess } */
-/* { dg-options -traditional } */
-
-/* There is a #error directive.  */
-
-#error bad	/* { dg-error "bad" } */
-
-/* Directives with their #s indented are not recognized.  */
- #if 0	/* { dg-bogus "unterminated" } */
diff --git a/gcc/testsuite/gcc.dg/cpp/tr-sign.c b/gcc/testsuite/gcc.dg/cpp/tr-sign.c
deleted file mode 100644
index e48e8ccadd86e25024920c442921d10819774aa6..0000000000000000000000000000000000000000
--- a/gcc/testsuite/gcc.dg/cpp/tr-sign.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Copyright (C) 2001 Free Software Foundation, Inc.  */
-
-/* { dg-do preprocess { target i?86-*-* } } */
-
-/* { dg-options "-traditional" } */
-
-/* Tests that traditional numbers are signed, unless otherwise
-   specified.  This test assumes a 32 bit target.
-
-   Neil Booth, 5 Aug 2001.  Inspired by PR 3824.  */
-
-#if 0xffffffff >= 0
-# error	0xffffffff	/* { dg-bogus "0xffffffff" "0xffffffff positive" } */
-#endif
-
-#if 0xffffffffU <= 0
-# error	0xffffffffU	/* { dg-bogus "0xffffffffU" "0xffffffffU negative" } */
-#endif
diff --git a/gcc/testsuite/gcc.dg/cpp/tr-str.c b/gcc/testsuite/gcc.dg/cpp/tr-str.c
deleted file mode 100644
index 342347381d04d4152160f1c1d6a5c7ea2b298ff3..0000000000000000000000000000000000000000
--- a/gcc/testsuite/gcc.dg/cpp/tr-str.c
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Test whether traditional stringify works.  */
-/* { dg-do run } */
-/* { dg-options "-traditional-cpp" } */
-#define foo(a, b) c="a"; d="b";
-
-extern void abort ();
-
-int main ()
-{
-  char *c, *d;
-
-  foo (p, q);
-  if (c[0] != 'p' || d[0] != 'q')
-    abort ();
-
-  exit (0);
-}
diff --git a/gcc/testsuite/gcc.dg/cpp/uchar-2.c b/gcc/testsuite/gcc.dg/cpp/uchar-2.c
deleted file mode 100644
index 739573c1098cfcabf08dfef7f44e61a16eb8e2fd..0000000000000000000000000000000000000000
--- a/gcc/testsuite/gcc.dg/cpp/uchar-2.c
+++ /dev/null
@@ -1,8 +0,0 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.  */
-
-/* { dg-do preprocess } */
-/* { dg-options "-funsigned-char -fsigned-char -traditional" } */
-
-#if defined (__CHAR_UNSIGNED__)
-# error __CHAR_UNSIGNED__ defined
-#endif