diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog
index fe871fff5dbf833af223bb1b2c19bc961b5b683c..c81fb841d8a464490c83025d34d76c7944bba483 100644
--- a/libiberty/ChangeLog
+++ b/libiberty/ChangeLog
@@ -1,3 +1,8 @@
+2003-11-19  Mark Mitchell  <mark@codesourcery.com>
+
+	* cp-demangle.c (demangle_type): Correct thinko in substitution
+	processing.
+
 2003-11-18  Ian Lance Taylor  <ian@wasabisystems.com>
 
 	* cp-demangle.c (demangle_operator_name): Remove space before
diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c
index a707a833402c56d526d302771bd964c68e411b9f..8caa733c91f54fade968021e82ab9fe74d95877d 100644
--- a/libiberty/cp-demangle.c
+++ b/libiberty/cp-demangle.c
@@ -2557,10 +2557,12 @@ demangle_type (dm)
       case 'S':
 	/* First check if this is a special substitution.  If it is,
 	   this is a <class-enum-type>.  Special substitutions have a
-	   letter following the `S'; other substitutions have a digit
-	   or underscore.  */
+	   lower-case letter following the `S'; other substitutions
+	   have a digit, upper-case letter, or underscore.  */
 	peek_next = peek_char_next (dm);
-	if (IS_DIGIT (peek_next) || peek_next == '_')
+	if (IS_DIGIT (peek_next) 
+	    || (peek_next >= 'A' && peek_next <= 'Z')
+	    || peek_next == '_')
 	  {
 	    RETURN_IF_ERROR (demangle_substitution (dm, &encode_return_type));