From patchwork Tue Jun 7 22:50:21 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Carlini X-Patchwork-Id: 631841 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org 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 3rPRcG3VfFz9sC4 for ; Wed, 8 Jun 2016 08:50:37 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=LUMFrL5D; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :subject:to:references:from:message-id:date:mime-version :in-reply-to:content-type; q=dns; s=default; b=jeVKRI524luAa4jSv LAvR3I5Eip+CIZt/a9nTJmdgvQgL/QMn8+0Z/PSBItsfLKzTszp3vDA8eD/AqGPE 2bzZdAn+q7Z2giBjDdCdA2TAuJC5QEmmHUFJ7QGvK+15Q5rV8VT6lrTwaiQTX11S gAcS7SZauzGwrgKyx4LNwehm2s= 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 :subject:to:references:from:message-id:date:mime-version :in-reply-to:content-type; s=default; bh=reDEAEIHz4+XvjVC1ySFlZ1 Q/b0=; b=LUMFrL5DVHr12KKDLmExM8AjUFeMOF1H+mDw1KTxfI2UGOTmaNetOWt lRldeVtKS3E/JC1Bj666ytK3fXmzDHzcL4oRNtpNtFtPgjFJxXpqBbiUZEdMiYPz /T32O/HBQRZUJIKq61dVwtxf+KxV2012uoPIbNOGMvb0NgtT30yA= Received: (qmail 31928 invoked by alias); 7 Jun 2016 22:50:30 -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 31919 invoked by uid 89); 7 Jun 2016 22:50:29 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.5 required=5.0 tests=BAYES_00, KAM_ASCII_DIVIDERS, RP_MATCHES_RCVD, SPF_PASS autolearn=ham version=3.3.2 spammy=5960, 8, 59608, tre, talk X-HELO: userp1040.oracle.com Received: from userp1040.oracle.com (HELO userp1040.oracle.com) (156.151.31.81) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Tue, 07 Jun 2016 22:50:27 +0000 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u57MoPqo008320 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 7 Jun 2016 22:50:25 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u57MoOte021716 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 7 Jun 2016 22:50:25 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u57MoN8E010940; Tue, 7 Jun 2016 22:50:24 GMT Received: from [192.168.1.4] (/79.12.211.42) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 07 Jun 2016 15:50:23 -0700 Subject: Re: [C++ Patch] Fix some simple location issues To: Jason Merrill , "gcc-patches@gcc.gnu.org" References: <5756F060.3020609@oracle.com> From: Paolo Carlini Message-ID: <57574FAD.5010108@oracle.com> Date: Wed, 8 Jun 2016 00:50:21 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.7.0 MIME-Version: 1.0 In-Reply-To: X-IsSubscribed: yes Hi, On 07/06/2016 21:40, Jason Merrill wrote: > For diagnostics about an initializer, I think it would be better to > give the location of the initializer rather than the declaration. > Maybe use > > location_t loc = EXPR_LOC_OR_LOC (init, DECL_SOURCE_LOCATION (decl)); Now that you are telling me this, I think we already briefly discussed it in the past... Anyway, I investigated it a little bit a couple of days ago and noticed that, in fact, other front-ends differ about many of those details, even when normally they have accurate locations. In some cases, for example, clang outputs the primary caret under the declaration and only the secondary wiggly line under the initializer, but only in some cases (see, for example, g++.dg/init/brace6.C, both in c++98 and c++11). Anyway, in practice, for this first round of changes, I tried your suggestion above in 4 places, in maybe_deduce_size_from_array_init and in check_initializer, but in practice doesn't currently make a difference, at least for the testcases, for lack of usable locations. Certainly could in the future! The below still passes testing... Thanks, Paolo. ///////////////////////////// Index: cp/decl.c =================================================================== --- cp/decl.c (revision 237171) +++ cp/decl.c (working copy) @@ -1393,7 +1393,7 @@ duplicate_decls (tree newdecl, tree olddecl, bool { if (DECL_INITIAL (olddecl)) inform (DECL_SOURCE_LOCATION (olddecl), - "previous definition of %q+D was here", olddecl); + "previous definition of %qD was here", olddecl); else inform (DECL_SOURCE_LOCATION (olddecl), "previous declaration of %qD was here", olddecl); @@ -5266,13 +5266,16 @@ maybe_deduce_size_from_array_init (tree decl, tree do_default); if (failure == 1) { - error ("initializer fails to determine size of %qD", decl); + error_at (EXPR_LOC_OR_LOC (initializer, + DECL_SOURCE_LOCATION (decl)), + "initializer fails to determine size of %qD", decl); } else if (failure == 2) { if (do_default) { - error ("array size missing in %qD", decl); + error_at (DECL_SOURCE_LOCATION (decl), + "array size missing in %qD", decl); } /* If a `static' var's size isn't known, make it extern as well as static, so it does not get allocated. If it's not @@ -5283,7 +5286,8 @@ maybe_deduce_size_from_array_init (tree decl, tree } else if (failure == 3) { - error ("zero-size array %qD", decl); + error_at (DECL_SOURCE_LOCATION (decl), + "zero-size array %qD", decl); } } @@ -5322,7 +5326,8 @@ layout_var_decl (tree decl) /* An automatic variable with an incomplete type: that is an error. Don't talk about array types here, since we took care of that message in grokdeclarator. */ - error ("storage size of %qD isn%'t known", decl); + error_at (DECL_SOURCE_LOCATION (decl), + "storage size of %qD isn%'t known", decl); TREE_TYPE (decl) = error_mark_node; } #if 0 @@ -5345,7 +5350,8 @@ layout_var_decl (tree decl) constant_expression_warning (DECL_SIZE (decl)); else { - error ("storage size of %qD isn%'t constant", decl); + error_at (DECL_SOURCE_LOCATION (decl), + "storage size of %qD isn%'t constant", decl); TREE_TYPE (decl) = error_mark_node; } } @@ -5954,7 +5960,8 @@ check_array_initializer (tree decl, tree type, tre if (!COMPLETE_TYPE_P (complete_type (element_type))) { if (decl) - error ("elements of array %q#D have incomplete type", decl); + error_at (DECL_SOURCE_LOCATION (decl), + "elements of array %q#D have incomplete type", decl); else error ("elements of array %q#T have incomplete type", type); return true; @@ -6018,7 +6025,8 @@ check_initializer (tree decl, tree init, int flags } else if (!COMPLETE_TYPE_P (type)) { - error ("%q#D has incomplete type", decl); + error_at (DECL_SOURCE_LOCATION (decl), + "%q#D has incomplete type", decl); TREE_TYPE (decl) = error_mark_node; return NULL_TREE; } @@ -6038,8 +6046,9 @@ check_initializer (tree decl, tree init, int flags } else if (init_len != 1 && TREE_CODE (type) != COMPLEX_TYPE) { - error ("scalar object %qD requires one element in initializer", - decl); + error_at (EXPR_LOC_OR_LOC (init, DECL_SOURCE_LOCATION (decl)), + "scalar object %qD requires one element in " + "initializer", decl); TREE_TYPE (decl) = error_mark_node; return NULL_TREE; } @@ -6081,9 +6090,10 @@ check_initializer (tree decl, tree init, int flags { /* Don't reshape if the class has constructors. */ if (cxx_dialect == cxx98) - error ("in C++98 %qD must be initialized by constructor, " - "not by %<{...}%>", - decl); + error_at (EXPR_LOC_OR_LOC (init, DECL_SOURCE_LOCATION (decl)), + "in C++98 %qD must be initialized by " + "constructor, not by %<{...}%>", + decl); } else if (VECTOR_TYPE_P (type) && TYPE_VECTOR_OPAQUE (type)) { @@ -6175,8 +6185,11 @@ check_initializer (tree decl, tree init, int flags && DECL_INITIAL (decl) && TREE_CODE (DECL_INITIAL (decl)) == STRING_CST && PAREN_STRING_LITERAL_P (DECL_INITIAL (decl))) - warning (0, "array %qD initialized by parenthesized string literal %qE", - decl, DECL_INITIAL (decl)); + warning_at (EXPR_LOC_OR_LOC (DECL_INITIAL (decl), + DECL_SOURCE_LOCATION (decl)), + 0, "array %qD initialized by parenthesized " + "string literal %qE", + decl, DECL_INITIAL (decl)); init = NULL; } } @@ -12528,7 +12541,7 @@ check_elaborated_type_specifier (enum tag_types ta && tag_code != typename_type) { error ("%qT referred to as %qs", type, tag_name (tag_code)); - inform (input_location, "%q+T has a previous declaration here", type); + inform (location_of (type), "%qT has a previous declaration here", type); return error_mark_node; } else if (TREE_CODE (type) != ENUMERAL_TYPE @@ -12535,7 +12548,7 @@ check_elaborated_type_specifier (enum tag_types ta && tag_code == enum_type) { error ("%qT referred to as enum", type); - inform (input_location, "%q+T has a previous declaration here", type); + inform (location_of (type), "%qT has a previous declaration here", type); return error_mark_node; } else if (!allow_template_p Index: testsuite/g++.dg/cpp0x/constexpr-ice10.C =================================================================== --- testsuite/g++.dg/cpp0x/constexpr-ice10.C (revision 237171) +++ testsuite/g++.dg/cpp0x/constexpr-ice10.C (working copy) @@ -4,5 +4,5 @@ struct A { constexpr A() {} - static constexpr A a[2] = {}; // { dg-error "incomplete" } + static constexpr A a[2] = {}; // { dg-error "22:elements of array 'constexpr const A A::a \\\[2\\\]' have incomplete type" } }; Index: testsuite/g++.dg/cpp0x/constexpr-incomplete1.C =================================================================== --- testsuite/g++.dg/cpp0x/constexpr-incomplete1.C (revision 237171) +++ testsuite/g++.dg/cpp0x/constexpr-incomplete1.C (working copy) @@ -2,6 +2,6 @@ struct A { - static constexpr A a = 1; // { dg-error "incomplete" } + static constexpr A a = 1; // { dg-error "22:'constexpr const A A::a' has incomplete type" } constexpr A(int i) { } }; Index: testsuite/g++.dg/cpp1y/auto-fn27.C =================================================================== --- testsuite/g++.dg/cpp1y/auto-fn27.C (revision 237171) +++ testsuite/g++.dg/cpp1y/auto-fn27.C (working copy) @@ -31,7 +31,7 @@ F::bar (const G &) { auto s = I; typedef decltype (s) L; - auto u =[&](L) { auto t = foo (J::K (), 0); }; // { dg-error "" } + auto u =[&](L) { auto t = foo (J::K (), 0); }; // { dg-error "25:'void t' has incomplete type" } } struct B { typedef int G; Index: testsuite/g++.dg/gomp/pr35751.C =================================================================== --- testsuite/g++.dg/gomp/pr35751.C (revision 237171) +++ testsuite/g++.dg/gomp/pr35751.C (working copy) @@ -5,8 +5,8 @@ void foo (int i) { - extern int a[i]; // { dg-error "storage size of" } - static int b[i]; // { dg-error "storage size of" } + extern int a[i]; // { dg-error "14:storage size of" } + static int b[i]; // { dg-error "14:storage size of" } #pragma omp parallel { Index: testsuite/g++.dg/init/array23.C =================================================================== --- testsuite/g++.dg/init/array23.C (revision 237171) +++ testsuite/g++.dg/init/array23.C (working copy) @@ -3,4 +3,4 @@ // array struct A {A();int A::* t;}; -A x[]; // { dg-error "size" } +A x[]; // { dg-error "3:array size missing" } Index: testsuite/g++.dg/init/array42.C =================================================================== --- testsuite/g++.dg/init/array42.C (revision 0) +++ testsuite/g++.dg/init/array42.C (working copy) @@ -0,0 +1 @@ +char a[] = ("abc"); // { dg-warning "6:array 'a' initialized by parenthesized string literal" } Index: testsuite/g++.dg/init/array43.C =================================================================== --- testsuite/g++.dg/init/array43.C (revision 0) +++ testsuite/g++.dg/init/array43.C (working copy) @@ -0,0 +1,2 @@ +int a[] = 0; // { dg-error "5:initializer fails to determine size" } +// { dg-error "11:array must be initialized" "" { target *-*-* } 1 } Index: testsuite/g++.dg/init/array44.C =================================================================== --- testsuite/g++.dg/init/array44.C (revision 0) +++ testsuite/g++.dg/init/array44.C (working copy) @@ -0,0 +1 @@ +int a[] = { }; // { dg-error "5:zero-size array" } Index: testsuite/g++.dg/init/array45.C =================================================================== --- testsuite/g++.dg/init/array45.C (revision 0) +++ testsuite/g++.dg/init/array45.C (working copy) @@ -0,0 +1 @@ +int a[]; // { dg-error "5:storage size" } Index: testsuite/g++.dg/init/brace2.C =================================================================== --- testsuite/g++.dg/init/brace2.C (revision 237171) +++ testsuite/g++.dg/init/brace2.C (working copy) @@ -3,6 +3,6 @@ int x = { 2 }; const char * y = { "hello" }; int a = 2; -int b = { 2,3 }; // { dg-error "requires one element in initializer" } +int b = { 2,3 }; // { dg-error "5:scalar object 'b' requires one element in initializer" } int c = { { 2 } } ; // { dg-error "braces around scalar initializer" } int d = {}; // { dg-error "initializer" "" { target { ! c++11 } } } Index: testsuite/g++.dg/init/brace6.C =================================================================== --- testsuite/g++.dg/init/brace6.C (revision 237171) +++ testsuite/g++.dg/init/brace6.C (working copy) @@ -17,8 +17,8 @@ struct D { int c; }; int main() { int i = { 1 }; - int j = { 1, 2 }; /* { dg-error "requires one element" } */ - A a = { 6 }; /* { dg-error "initialize" "" { target { ! c++11 } } } */ + int j = { 1, 2 }; /* { dg-error "8:scalar object 'j' requires one element" } */ + A a = { 6 }; /* { dg-error "6:in C\\+\\+98 'a' must be initialized" "" { target { ! c++11 } } } */ B b = { 6 }; /* { dg-error "" } */ C c = { 6 }; /* { dg-error "too many initializers" } */ D d = { 6 };