From patchwork Thu Nov 8 09:26:12 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Carlini X-Patchwork-Id: 994709 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-489322-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=oracle.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="YkN5ukTr"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=oracle.com header.i=@oracle.com header.b="be/nY7za"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 42rJ474JWVz9s8r for ; Thu, 8 Nov 2018 20:33:09 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:to:cc :from:subject:message-id:date:mime-version:content-type; q=dns; s=default; b=CZGxRuD9KBgwdb+QdfSsOePibe5tvhdySGnMDeX1T7+P3ciUXc 9/HMH/LmhnM8t46wV7MoTQj5IR3VoioOxJeQbZg99yMOAQM3SmWqewoVEiGns11d 4TFXML2rpA5DRQD1VtgiRBj/OyLfxppFFp8NuY+1/S6ULMkGRTbpEmFDc= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:to:cc :from:subject:message-id:date:mime-version:content-type; s= default; bh=V8wkCgYgJt60D3ogBiYuFz60HnQ=; b=YkN5ukTrbeEkJysEb5u/ mQzBsbO1ynOlgPFvrsn5mScdrO3H7SaFNx+shInzRLLSG42MlQrEuZu9XYuheQYv +UY16joQaVbDd8ZOleQBXACJQJ+Dp6jxnyZOe9xLufuhCgJHu8QbLGP+4fdgw0Fj VISKHAccp9Rybsq/FStK73U= Received: (qmail 83369 invoked by alias); 8 Nov 2018 09:33:02 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 83306 invoked by uid 89); 8 Nov 2018 09:33:01 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-11.1 required=5.0 tests=BAYES_00, GIT_PATCH_2, GIT_PATCH_3, KAM_ASCII_DIVIDERS, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=D*oracle.com, sft X-HELO: userp2130.oracle.com Received: from userp2130.oracle.com (HELO userp2130.oracle.com) (156.151.31.86) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 08 Nov 2018 09:32:59 +0000 Received: from pps.filterd (userp2130.oracle.com [127.0.0.1]) by userp2130.oracle.com (8.16.0.22/8.16.0.22) with SMTP id wA89TUNq194054; Thu, 8 Nov 2018 09:32:57 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=to : cc : from : subject : message-id : date : mime-version : content-type; s=corp-2018-07-02; bh=5u+0MHSZJDHiJemv69eUjAcDVVKS7K17JrUvMkySaWE=; b=be/nY7zalCQOYAk1zuycbKEj9b85o980JqFoE2z3ck/HBkOkj2JetrsjU6uNYP2FzTFZ FS6HrgLV6f92eNRv7/47MoGCT01ghOkD6I1mrJfFePp2I26aWpXil6S9+96p/EdEe43n zSa58YdtghpgrFgot/Je4Xf8VxrRmg0BBVbIo4IMjmVH3jZOTl2jjb1znf5DcXgEF+4s KFusQyiDQB/gK02+VbSEbOSKtM3pcxU1yoz78Y7LVhbOLKij1mmuKTigmaeSZxP4OblI Ia7BP8HdMj1jsd4/hkF0QzBIv0X84X0GvKIxPuqEXYCKzkr+9+v1axLtgm+/qv4Uvi/x MQ== Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp2130.oracle.com with ESMTP id 2nh33u89k3-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 08 Nov 2018 09:32:57 +0000 Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id wA89WuUW023404 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 8 Nov 2018 09:32:56 GMT Received: from abhmp0020.oracle.com (abhmp0020.oracle.com [141.146.116.26]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id wA89Wthw025686; Thu, 8 Nov 2018 09:32:55 GMT Received: from [192.168.1.4] (/87.10.221.76) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 08 Nov 2018 01:26:14 -0800 To: "gcc-patches@gcc.gnu.org" Cc: Jason Merrill From: Paolo Carlini Subject: [C++ Patch] Fix two grokdeclarator locations Message-ID: <4f8f3e21-9b13-76af-eed0-341687a86e2d@oracle.com> Date: Thu, 8 Nov 2018 10:26:12 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.3.0 MIME-Version: 1.0 X-IsSubscribed: yes Hi, two additional grokdeclarator locations that we can easily fix by using declarator->id_loc. Slightly more interesting, testing revealed a latent issue in the make_id_declarator uses: cp_parser_member_declaration wasn't setting declarator->id_loc, thus I decided to add a location_t parameter to make_id_declarator itself and adjust all the callers. Tested x86_64-linux. Thanks, Paolo. ////////////// /cp 2018-11-08 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-08 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. Index: cp/decl.c =================================================================== --- cp/decl.c (revision 265869) +++ cp/decl.c (working copy) @@ -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; Index: cp/parser.c =================================================================== --- cp/parser.c (revision 265869) +++ cp/parser.c (working copy) @@ -1452,7 +1452,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; @@ -1477,7 +1477,8 @@ make_id_declarator (tree qualifying_scope, tree un 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; } @@ -10666,7 +10667,8 @@ cp_parser_lambda_declarator_opt (cp_parser* parser 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); @@ -10677,7 +10679,6 @@ cp_parser_lambda_declarator_opt (cp_parser* parser 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, @@ -13443,10 +13444,13 @@ cp_parser_decomposition_declaration (cp_parser *pa 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); @@ -19264,8 +19268,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) @@ -20669,9 +20672,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) @@ -23963,6 +23965,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); @@ -24031,7 +24035,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, @@ -30585,7 +30590,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, UNKNOWN_LOCATION); eat_colon: cp_lexer_consume_token (parser->lexer); /* Eat ':'. */ Index: testsuite/g++.dg/cpp0x/nsdmi-union6.C =================================================================== --- testsuite/g++.dg/cpp0x/nsdmi-union6.C (revision 265869) +++ testsuite/g++.dg/cpp0x/nsdmi-union6.C (working copy) @@ -5,7 +5,7 @@ struct F; // { dg-message "forward declar 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,13 +18,13 @@ 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; @@ -31,7 +31,7 @@ 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; Index: testsuite/g++.dg/cpp0x/nsdmi6.C =================================================================== --- testsuite/g++.dg/cpp0x/nsdmi6.C (revision 265869) +++ testsuite/g++.dg/cpp0x/nsdmi6.C (working copy) @@ -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 } }; Index: testsuite/g++.dg/ext/flexary4.C =================================================================== --- testsuite/g++.dg/ext/flexary4.C (revision 265869) +++ testsuite/g++.dg/ext/flexary4.C (working copy) @@ -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 { Index: testsuite/g++.dg/ext/flexary9.C =================================================================== --- testsuite/g++.dg/ext/flexary9.C (revision 265869) +++ testsuite/g++.dg/ext/flexary9.C (working copy) @@ -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 { Index: testsuite/g++.dg/other/incomplete2.C =================================================================== --- testsuite/g++.dg/other/incomplete2.C (revision 265869) +++ testsuite/g++.dg/other/incomplete2.C (working copy) @@ -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 Index: testsuite/g++.dg/parse/friend12.C =================================================================== --- testsuite/g++.dg/parse/friend12.C (revision 265869) +++ testsuite/g++.dg/parse/friend12.C (working copy) @@ -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" } };