--- gcc/cp/parser.c	(revision 163636)
+++ gcc/cp/parser.c	(working copy)
@@ -1068,6 +1068,7 @@ make_pointer_declarator (cp_cv_quals cv_
   declarator->u.pointer.class_type = NULL_TREE;
   if (target)
     {
+      declarator->id_loc = target->id_loc;
       declarator->parameter_pack_p = target->parameter_pack_p;
       target->parameter_pack_p = false;
     }
@@ -1091,6 +1092,7 @@ make_reference_declarator (cp_cv_quals c
   declarator->u.reference.rvalue_ref = rvalue_ref;
   if (target)
     {
+      declarator->id_loc = target->id_loc;
       declarator->parameter_pack_p = target->parameter_pack_p;
       target->parameter_pack_p = false;
     }
@@ -1147,6 +1149,7 @@ make_call_declarator (cp_declarator *tar
   declarator->u.function.late_return_type = late_return_type;
   if (target)
     {
+      declarator->id_loc = target->id_loc;
       declarator->parameter_pack_p = target->parameter_pack_p;
       target->parameter_pack_p = false;
     }
@@ -1169,6 +1172,7 @@ make_array_declarator (cp_declarator *el
   declarator->u.array.bounds = bounds;
   if (element)
     {
+      declarator->id_loc = element->id_loc;
       declarator->parameter_pack_p = element->parameter_pack_p;
       element->parameter_pack_p = false;
     }
@@ -14010,6 +14014,13 @@ cp_parser_init_declarator (cp_parser* pa
       decl = start_decl (declarator, decl_specifiers,
 			 is_initialized, attributes, prefix_attributes,
 			 &pushed_scope);
+      /* Adjust location of decl if declarator->id_loc is more appropriate:
+	 set, and decl wasn't merged with another decl, in which case its
+	 location would be different from input_location, and more accurate.  */
+      if (DECL_P (decl)
+	  && declarator->id_loc != UNKNOWN_LOCATION
+	  && DECL_SOURCE_LOCATION (decl) == input_location)
+	DECL_SOURCE_LOCATION (decl) = declarator->id_loc;
     }
   else if (scope)
     /* Enter the SCOPE.  That way unqualified names appearing in the

--- testsuite/g++.dg/parse/redef2.C	(revision 0)
+++ testsuite/g++.dg/parse/redef2.C	(revision 0)
@@ -0,0 +1,7 @@
+// { dg-do assemble }
+
+char * d [10];  // { dg-error "8: 'd' has a previous declaration as" }
+char e [15][10];
+int (*f)();
+
+int d;  // { dg-error "" }
