diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2018-11-14 17:50:25 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2018-11-14 17:50:25 +0000 |
commit | 03f3f0f21a76f2009d7b553fd80afae0bfe79c82 (patch) | |
tree | 8a0c5a30a61b4d439890fa9db7c18a9808de5d86 | |
parent | 357044d275a1f2d50ecd9bade9b8eb18a73cb4c6 (diff) | |
download | gcc-03f3f0f21a76f2009d7b553fd80afae0bfe79c82.zip gcc-03f3f0f21a76f2009d7b553fd80afae0bfe79c82.tar.gz gcc-03f3f0f21a76f2009d7b553fd80afae0bfe79c82.tar.bz2 |
parser.c (make_id_declarator): Add location_t parameter.
/cp
2018-11-14 Paolo Carlini <paolo.carlini@oracle.com>
* 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 <paolo.carlini@oracle.com>
* 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
-rw-r--r-- | gcc/cp/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/cp/decl.c | 10 | ||||
-rw-r--r-- | gcc/cp/parser.c | 31 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/nsdmi-union6.C | 12 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/nsdmi6.C | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/flexary4.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/flexary9.C | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/other/incomplete2.C | 2 | ||||
-rw-r--r-- | 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 ee5c2ce..7e6ba17 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,15 @@ +2018-11-14 Paolo Carlini <paolo.carlini@oracle.com> + + * 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 <jakub@redhat.com> P1236R1 - Signed integers are two's complement diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 89a1823..7d63bbe 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 e9e49b1..8833e3d 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 a94cb78..524db26 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2018-11-14 Paolo Carlini <paolo.carlini@oracle.com> + + * 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 <jakub@redhat.com> 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 764fe21..beb6c38 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<typename T> @@ -18,20 +18,20 @@ template union UT<int>; union UF { - F u[1] = { 0 }; // { dg-error "incomplete type" } + F u[1] = { 0 }; // { dg-error "5:field .u. has incomplete type" } }; template<typename T> 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<int>; 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<typename T> @@ -44,13 +44,13 @@ template class ST<int>; struct SF { - F s[1] = { 0 }; // { dg-error "incomplete type" } + F s[1] = { 0 }; // { dg-error "5:field .s. has incomplete type" } }; template<typename T> 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<int>; diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi6.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi6.C index f88a347..1988319 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 29d6bdd..bd28cf5 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 07eb966..5ebcdf5 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 127bf58..8ea583e 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 d4e0cee..606122e 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" } }; |