diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f4e81ebb4da93586b70d7c081ca1e420fad5d3d9..d5773b08da3edaf49a8b65d17f1e06fb3737d052 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2003-04-20  Neil Booth  <neil@daikokuya.co.uk>
+
+	* cpphash.h (NOTE_ESC_NL, NOTE_ESC_SPACE_NL, NOTE_TRIGRAPH,
+	NOTE_NEWLINE): Remove.
+	* cpplex.c (_cpp_clean_line, _cpp_process_line_notes): Update
+	to handle new form of line note type.
+
 2003-04-20  Zack Weinberg  <zack@codesourcery.com>
 
 	* target.h (encode_section_info): Add new argument carrying
diff --git a/gcc/cpphash.h b/gcc/cpphash.h
index 4eee9426a760e7fae8c69e90514a36e23e4c5b0e..6e17226def9f956ac643ed5bff40a1c1525ef40f 100644
--- a/gcc/cpphash.h
+++ b/gcc/cpphash.h
@@ -243,11 +243,10 @@ struct _cpp_line_note
   /* Location in the clean line the note refers to.  */
   const uchar *pos;
 
-  /* Type of note.  */
-  enum { NOTE_ESC_NL = 0,
-	 NOTE_ESC_SPACE_NL,
-	 NOTE_TRIGRAPH,
-	 NOTE_NEWLINE } type;
+  /* Type of note.  The 9 'from' trigraph characters represent those
+     trigraphs, '\\' an escaped newline, ' ' an escaped newline with
+     intervening space, and anything else is invalid.  */
+  unsigned int type;
 };
 
 /* Represents the contents of a file cpplib has read in.  */
diff --git a/gcc/cpplex.c b/gcc/cpplex.c
index efb5c06f9a9ae6e85fe4f83d5eec31c4ec8c49d0..c148dad079200d5655842f71e5f66000dd12ff96 100644
--- a/gcc/cpplex.c
+++ b/gcc/cpplex.c
@@ -148,15 +148,14 @@ _cpp_clean_line (pfile)
 	      if (p == buffer->next_line || p[-1] != '\\')
 		break;
 
-	      add_line_note (buffer, p - 1,
-			     p != d ? NOTE_ESC_SPACE_NL: NOTE_ESC_NL);
+	      add_line_note (buffer, p - 1, p != d ? ' ': '\\');
 	      d = p - 2;
 	      buffer->next_line = p - 1;
 	    }
 	  else if (c == '?' && s[1] == '?' && _cpp_trigraph_map[s[2]])
 	    {
 	      /* Add a note regardless, for the benefit of -Wtrigraphs.  */
-	      add_line_note (buffer, d, NOTE_TRIGRAPH);
+	      add_line_note (buffer, d, s[2]);
 	      if (CPP_OPTION (pfile, trigraphs))
 		{
 		  *d = _cpp_trigraph_map[s[2]];
@@ -178,7 +177,8 @@ _cpp_clean_line (pfile)
     }
 
   *d = '\n';
-  add_line_note (buffer, d + 1, NOTE_NEWLINE);
+  /* A sentinel note that should never be processed.  */
+  add_line_note (buffer, d + 1, '\n');
   buffer->next_line = s + 1;
 }
 
@@ -202,32 +202,12 @@ _cpp_process_line_notes (pfile, in_comment)
       buffer->cur_note++;
       col = CPP_BUF_COLUMN (buffer, note->pos + 1);
 
-      switch (note->type)
+      if (note->type == '\\' || note->type == ' ')
 	{
-	case NOTE_NEWLINE:
-	  /* This note is a kind of sentinel we should never reach.  */
-	  abort ();
-
-	case NOTE_TRIGRAPH:
-	  if (!in_comment && CPP_OPTION (pfile, warn_trigraphs))
-	    {
-	      if (CPP_OPTION (pfile, trigraphs))
-		cpp_error_with_line (pfile, DL_WARNING, pfile->line, col,
-				     "trigraph converted to %c",
-				     (int) note->pos[0]);
-	      else
-		cpp_error_with_line (pfile, DL_WARNING, pfile->line, col,
-				     "trigraph ??%c ignored",
-				     (int) note->pos[2]);
-	    }
-	  break;
-
-	case NOTE_ESC_SPACE_NL:
-	  if (!in_comment)
+	  if (note->type == ' ' && !in_comment)
 	    cpp_error_with_line (pfile, DL_WARNING, pfile->line, col,
 				 "backslash and newline separated by space");
-	  /* Fall through... */
-	case NOTE_ESC_NL:
+
 	  if (buffer->next_line > buffer->rlimit)
 	    {
 	      cpp_error_with_line (pfile, DL_PEDWARN, pfile->line, col,
@@ -239,6 +219,23 @@ _cpp_process_line_notes (pfile, in_comment)
 	  buffer->line_base = note->pos;
 	  pfile->line++;
 	}
+      else if (_cpp_trigraph_map[note->type])
+	{
+	  if (!in_comment && CPP_OPTION (pfile, warn_trigraphs))
+	    {
+	      if (CPP_OPTION (pfile, trigraphs))
+		cpp_error_with_line (pfile, DL_WARNING, pfile->line, col,
+				     "trigraph ??%c converted to %c",
+				     note->type,
+				     (int) _cpp_trigraph_map[note->type]);
+	      else
+		cpp_error_with_line (pfile, DL_WARNING, pfile->line, col,
+				     "trigraph ??%c ignored",
+				     note->type);
+	    }
+	}
+      else
+	abort ();
     }
 }