From 03f3f0f21a76f2009d7b553fd80afae0bfe79c82 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Wed, 14 Nov 2018 17:50:25 +0000 Subject: [PATCH] parser.c (make_id_declarator): Add location_t parameter. /cp 2018-11-14 Paolo Carlini * parser.c (make_id_declarator): Add location_t parameter. (cp_parser_lambda_declarator_opt): Adjust call. (cp_parser_decomposition_declaration): Likewise. (cp_parser_alias_declaration): Likewise. (cp_parser_direct_declarator): Likewise. (cp_parser_member_declaration): Likewise. (cp_parser_objc_class_ivars): Likewise. * decl.c (grokdeclarator): Use declarator->id_loc in two error messages. /testsuite 2018-11-14 Paolo Carlini * g++.dg/cpp0x/nsdmi-union6.C: Test locations too. * g++.dg/cpp0x/nsdmi6.C: Likewise. * g++.dg/ext/flexary4.C: Likewise. * g++.dg/ext/flexary9.C: Likewise. * g++.dg/other/incomplete2.C: Likewise. * g++.dg/parse/friend12.C: Likewise. From-SVN: r266155 --- gcc/cp/ChangeLog | 12 +++++++++ gcc/cp/decl.c | 10 +++++--- gcc/cp/parser.c | 31 +++++++++++++---------- gcc/testsuite/ChangeLog | 9 +++++++ gcc/testsuite/g++.dg/cpp0x/nsdmi-union6.C | 12 ++++----- gcc/testsuite/g++.dg/cpp0x/nsdmi6.C | 3 ++- gcc/testsuite/g++.dg/ext/flexary4.C | 2 +- gcc/testsuite/g++.dg/ext/flexary9.C | 3 ++- gcc/testsuite/g++.dg/other/incomplete2.C | 2 +- gcc/testsuite/g++.dg/parse/friend12.C | 2 +- 10 files changed, 58 insertions(+), 28 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ee5c2ce8446..7e6ba17669d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,15 @@ +2018-11-14 Paolo Carlini + + * parser.c (make_id_declarator): Add location_t parameter. + (cp_parser_lambda_declarator_opt): Adjust call. + (cp_parser_decomposition_declaration): Likewise. + (cp_parser_alias_declaration): Likewise. + (cp_parser_direct_declarator): Likewise. + (cp_parser_member_declaration): Likewise. + (cp_parser_objc_class_ivars): Likewise. + * decl.c (grokdeclarator): Use declarator->id_loc in two error + messages. + 2018-11-14 Jakub Jelinek P1236R1 - Signed integers are two's complement diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 89a18231626..7d63bbe7f1b 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -12408,8 +12408,9 @@ grokdeclarator (const cp_declarator *declarator, { if (unqualified_id) { - error ("field %qD has incomplete type %qT", - unqualified_id, type); + error_at (declarator->id_loc, + "field %qD has incomplete type %qT", + unqualified_id, type); cxx_incomplete_type_inform (strip_array_types (type)); } else @@ -12423,8 +12424,9 @@ grokdeclarator (const cp_declarator *declarator, { if (friendp) { - error ("%qE is neither function nor member function; " - "cannot be declared friend", unqualified_id); + error_at (declarator->id_loc, + "%qE is neither function nor member function; " + "cannot be declared friend", unqualified_id); return error_mark_node; } decl = NULL_TREE; diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index e9e49b15702..8833e3db746 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -1453,7 +1453,7 @@ make_declarator (cp_declarator_kind kind) static cp_declarator * make_id_declarator (tree qualifying_scope, tree unqualified_name, - special_function_kind sfk) + special_function_kind sfk, location_t id_location) { cp_declarator *declarator; @@ -1478,7 +1478,8 @@ make_id_declarator (tree qualifying_scope, tree unqualified_name, declarator->u.id.qualifying_scope = qualifying_scope; declarator->u.id.unqualified_name = unqualified_name; declarator->u.id.sfk = sfk; - + declarator->id_loc = id_location; + return declarator; } @@ -10686,7 +10687,8 @@ cp_parser_lambda_declarator_opt (cp_parser* parser, tree lambda_expr) p = obstack_alloc (&declarator_obstack, 0); - declarator = make_id_declarator (NULL_TREE, call_op_identifier, sfk_none); + declarator = make_id_declarator (NULL_TREE, call_op_identifier, sfk_none, + LAMBDA_EXPR_LOCATION (lambda_expr)); quals = (LAMBDA_EXPR_MUTABLE_P (lambda_expr) ? TYPE_UNQUALIFIED : TYPE_QUAL_CONST); @@ -10697,7 +10699,6 @@ cp_parser_lambda_declarator_opt (cp_parser* parser, tree lambda_expr) exception_spec, return_type, /*requires_clause*/NULL_TREE); - declarator->id_loc = LAMBDA_EXPR_LOCATION (lambda_expr); declarator->std_attributes = attributes; fco = grokmethod (&return_type_specs, @@ -13473,10 +13474,13 @@ cp_parser_decomposition_declaration (cp_parser *parser, FOR_EACH_VEC_ELT (v, i, e) { if (i == 0) - declarator = make_id_declarator (NULL_TREE, e.get_value (), sfk_none); + declarator = make_id_declarator (NULL_TREE, e.get_value (), + sfk_none, e.get_location ()); else - declarator->u.id.unqualified_name = e.get_value (); - declarator->id_loc = e.get_location (); + { + declarator->u.id.unqualified_name = e.get_value (); + declarator->id_loc = e.get_location (); + } tree elt_pushed_scope; tree decl2 = start_decl (declarator, &decl_specs, SD_INITIALIZED, NULL_TREE, NULL_TREE, &elt_pushed_scope); @@ -19294,8 +19298,7 @@ cp_parser_alias_declaration (cp_parser* parser) /*declarator=*/NULL)) return error_mark_node; - declarator = make_id_declarator (NULL_TREE, id, sfk_none); - declarator->id_loc = id_location; + declarator = make_id_declarator (NULL_TREE, id, sfk_none, id_location); member_p = at_class_scope_p (); if (member_p) @@ -20699,9 +20702,8 @@ cp_parser_direct_declarator (cp_parser* parser, } declarator = make_id_declarator (qualifying_scope, unqualified_name, - sfk); + sfk, token->location); declarator->std_attributes = attrs; - declarator->id_loc = token->location; declarator->parameter_pack_p = pack_expansion_p; if (pack_expansion_p) @@ -23993,6 +23995,8 @@ cp_parser_member_declaration (cp_parser* parser) tree identifier; tree width; tree late_attributes = NULL_TREE; + location_t id_location + = cp_lexer_peek_token (parser->lexer)->location; if (named_bitfld) identifier = cp_parser_identifier (parser); @@ -24061,7 +24065,8 @@ cp_parser_member_declaration (cp_parser* parser) decl = grokbitfield (identifier ? make_id_declarator (NULL_TREE, identifier, - sfk_none) + sfk_none, + id_location) : NULL, &decl_specifiers, width, initializer, @@ -30608,7 +30613,7 @@ cp_parser_objc_class_ivars (cp_parser* parser) /* Get the name of the bitfield. */ declarator = make_id_declarator (NULL_TREE, cp_parser_identifier (parser), - sfk_none); + sfk_none, token->location); eat_colon: cp_lexer_consume_token (parser->lexer); /* Eat ':'. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a94cb786840..524db268617 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2018-11-14 Paolo Carlini + + * g++.dg/cpp0x/nsdmi-union6.C: Test locations too. + * g++.dg/cpp0x/nsdmi6.C: Likewise. + * g++.dg/ext/flexary4.C: Likewise. + * g++.dg/ext/flexary9.C: Likewise. + * g++.dg/other/incomplete2.C: Likewise. + * g++.dg/parse/friend12.C: Likewise. + 2018-11-14 Jakub Jelinek P1236R1 - Signed integers are two's complement diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-union6.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-union6.C index 764fe21d610..beb6c3864ec 100644 --- a/gcc/testsuite/g++.dg/cpp0x/nsdmi-union6.C +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-union6.C @@ -5,7 +5,7 @@ struct F; // { dg-message "forward declaration" } union U // { dg-message "not complete" } { - U u[1] = { 0 }; // { dg-error "incomplete type" } + U u[1] = { 0 }; // { dg-error "5:field .u. has incomplete type" } }; template @@ -18,20 +18,20 @@ template union UT; union UF { - F u[1] = { 0 }; // { dg-error "incomplete type" } + F u[1] = { 0 }; // { dg-error "5:field .u. has incomplete type" } }; template union UFT { - F u[1] = { 0 }; // { dg-error "incomplete type" } + F u[1] = { 0 }; // { dg-error "5:field .u. has incomplete type" } }; template union UFT; struct S // { dg-message "not complete" } { - S s[1] = { 0 }; // { dg-error "incomplete type" } + S s[1] = { 0 }; // { dg-error "5:field .s. has incomplete type" } }; template @@ -44,13 +44,13 @@ template class ST; struct SF { - F s[1] = { 0 }; // { dg-error "incomplete type" } + F s[1] = { 0 }; // { dg-error "5:field .s. has incomplete type" } }; template struct SFT { - F s[1] = { 0 }; // { dg-error "incomplete type" } + F s[1] = { 0 }; // { dg-error "5:field .s. has incomplete type" } }; template class SFT; diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi6.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi6.C index f88a347426a..1988319cf37 100644 --- a/gcc/testsuite/g++.dg/cpp0x/nsdmi6.C +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi6.C @@ -4,5 +4,6 @@ struct A { typedef int int T; // { dg-error "two or more data types in declaration" } - struct T x[1] = { 0 }; // { dg-error "incomplete type|forward" } + struct T x[1] = { 0 }; // { dg-error "14:field .x. has incomplete type" } +// { dg-message "forward declaration" "" { target c++11 } .-1 } }; diff --git a/gcc/testsuite/g++.dg/ext/flexary4.C b/gcc/testsuite/g++.dg/ext/flexary4.C index 29d6bddf336..bd28cf55de2 100644 --- a/gcc/testsuite/g++.dg/ext/flexary4.C +++ b/gcc/testsuite/g++.dg/ext/flexary4.C @@ -143,7 +143,7 @@ struct Sx23 { struct Sx24 { struct S; - S a_x []; // { dg-error "incomplete type" } + S a_x []; // { dg-error "5:field .a_x. has incomplete type" } }; struct Sx25 { diff --git a/gcc/testsuite/g++.dg/ext/flexary9.C b/gcc/testsuite/g++.dg/ext/flexary9.C index 07eb966ae47..5ebcdf50757 100644 --- a/gcc/testsuite/g++.dg/ext/flexary9.C +++ b/gcc/testsuite/g++.dg/ext/flexary9.C @@ -136,7 +136,8 @@ struct Sx23 { // array warning. struct Sx24 { struct S; - S a_x [0]; // { dg-message "incomplete type|zero-size array" } + S a_x [0]; // { dg-error "5:field .a_x. has incomplete type" } +// { dg-warning "zero-size array" "" { target *-*-* } .-1 } }; struct Sx25 { diff --git a/gcc/testsuite/g++.dg/other/incomplete2.C b/gcc/testsuite/g++.dg/other/incomplete2.C index 127bf588e93..8ea583e52fd 100644 --- a/gcc/testsuite/g++.dg/other/incomplete2.C +++ b/gcc/testsuite/g++.dg/other/incomplete2.C @@ -5,7 +5,7 @@ struct A; struct B { - A a : 1; // { dg-error "incomplete" } + A a : 1; // { dg-error "5:field .a. has incomplete type .A" } }; struct S diff --git a/gcc/testsuite/g++.dg/parse/friend12.C b/gcc/testsuite/g++.dg/parse/friend12.C index d4e0ceea9ac..606122e9840 100644 --- a/gcc/testsuite/g++.dg/parse/friend12.C +++ b/gcc/testsuite/g++.dg/parse/friend12.C @@ -2,5 +2,5 @@ struct A { - friend int i = 0; // { dg-error "cannot be declared friend" } + friend int i = 0; // { dg-error "14:.i. is neither function nor member function; cannot be declared friend" } }; -- 2.30.2