diff options
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/parser.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/redef2.C | 7 |
4 files changed, 28 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 389842dd90b..4a28aabb087 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2010-09-06 Arnaud Charlet <charlet@adacore.com> + + * parser.c (make_pointer_declarator, make_reference_declarator, + make_call_declarator, make_array_declarator): Set declarator->id_loc. + (cp_parser_init_declarator): Adjust location of decl if appropriate. + 2010-09-06 Jason Merrill <jason@redhat.com> * call.c (implicit_conversion): Fix value-init of enums. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 769d7dcacad..db2073ba03f 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -1068,6 +1068,7 @@ make_pointer_declarator (cp_cv_quals cv_qualifiers, cp_declarator *target) 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 cv_qualifiers, cp_declarator *target, 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 *target, 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 *element, tree bounds) 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* parser, 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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 17ddd50214a..de49e29b931 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2010-09-06 Arnaud Charlet <charlet@adacore.com> + + * g++.dg/parse/redef2.C: New. + 2010-09-06 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> * gcc.dg/20100906-1.c: New testcase. diff --git a/gcc/testsuite/g++.dg/parse/redef2.C b/gcc/testsuite/g++.dg/parse/redef2.C new file mode 100644 index 00000000000..b0acaa5e7fc --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/redef2.C @@ -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 "" } |