diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 77796d5674e8a2c6db39abfc73c345be46e55399..73b478e65583249f4231fac883a6984bb16fed35 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2008-08-14  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>
+
+        PR c/28152
+	* c-parser.c (c_lex_one_token): Do not store the canonical spelling
+	for keywords.
+	
 2008-08-14  Dorit Nuzman  <dorit@il.ibm.com>
 
 	* tree-vect-transform.c (vect_create_epilog_for_reduction): Takes an
diff --git a/gcc/c-parser.c b/gcc/c-parser.c
index 6617145a6cbc4625f7603359130bfd2a7ced52d2..1ea9d07fcdf65d98780a654f17789a099880e8ec 100644
--- a/gcc/c-parser.c
+++ b/gcc/c-parser.c
@@ -241,8 +241,6 @@ c_lex_one_token (c_parser *parser, c_token *token)
 	      }
 	    else
 	      {
-		/* Return the canonical spelling for this keyword.  */
-		token->value = ridpointers[(int) rid_code];
 		token->type = CPP_KEYWORD;
 		token->keyword = rid_code;
 		break;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 095d0a6450e1bc1529590d2800ea4f243dc32845..bdbc3542e9ea079fc24c568d0c309efc552c784c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2008-08-14  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>
+
+        PR c/28152
+	* gcc.dg/parser-pr28152.c: New.
+	* gcc.dg/parser-pr28152-2.c: New.
+
 2008-08-14  Dorit Nuzman  <dorit@il.ibm.com>
 
 	* gcc.dg/vect/vect-outer-4g.c: Change loop bound.
diff --git a/gcc/testsuite/gcc.dg/parser-pr28152-2.c b/gcc/testsuite/gcc.dg/parser-pr28152-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..18dc1e63dec915adfb88a5c44b9d1f46b8e7e6ba
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/parser-pr28152-2.c
@@ -0,0 +1,11 @@
+/* PR 28152: error messages should mention __complex__ */
+/* { dg-do compile } */
+/* { dg-options "" } */
+int
+main (void)
+{
+  __complex__ float z;
+
+  z = __complex__ (1.90000007326203904e+19, 0.0);   /* { dg-error "__complex__" } */
+  z = __complex__ (1.0e+0, 0.0) / z;   /* { dg-error "__complex__" } */
+  /* { dg-error "at end of input" "" { target *-*-* } 10 } */
diff --git a/gcc/testsuite/gcc.dg/parser-pr28152.c b/gcc/testsuite/gcc.dg/parser-pr28152.c
new file mode 100644
index 0000000000000000000000000000000000000000..99534c10bfe50a6ba82faa0e295c42711b82c8a7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/parser-pr28152.c
@@ -0,0 +1,11 @@
+/* PR 28152: error messages should mention _Complex */
+/* { dg-do compile } */
+/* { dg-options "" } */
+int
+main (void)
+{
+  _Complex float z;
+
+  z = _Complex (1.90000007326203904e+19, 0.0);   /* { dg-error "_Complex" } */
+  z = _Complex (1.0e+0, 0.0) / z;   /* { dg-error "_Complex" } */
+  /* { dg-error "at end of input" "" { target *-*-* } 10 } */