From patchwork Tue Nov 6 09:01:04 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Carlini X-Patchwork-Id: 993554 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-489129-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="KNYK+5sr"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=oracle.com header.i=@oracle.com header.b="D2VHTyMR"; 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 42q3Sc1P5Sz9sDN for ; Tue, 6 Nov 2018 20:01:34 +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=jliSD9iA6o4po+xTRGZ9yEMCRhW+QJAnvxFO593V6/7MFHGPDT LW6EXzE5UxqZjVyzXPaTfbuL5f+0G8Cf3YZBlR7pdslF47PMlPerLO6vrpfZP/a7 A2/M4Zk17spGCFOWgglQCRigBrPLuSEeOEV22aj9B30s9DgSku5XulyIQ= 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=JRAtV9riblabwAVuNh3FNGxz/J8=; b=KNYK+5srTQZ7qZl9F+EU lKhlGB9HnpENjfa2TBILjHiW+yt9Bq1FRayQ8jtSQgaq8a98kFuFBQMcb9XIOhJN EMS7YcAfGiiiiajIZ955Txxzzca1GluZch3PrEMgiQ0EA6PMstopD/29hln1bwWQ gfsVWbR69SXD5aC8IkbMRHM= Received: (qmail 30416 invoked by alias); 6 Nov 2018 09:01:26 -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 30368 invoked by uid 89); 6 Nov 2018 09:01:25 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-12.6 required=5.0 tests=BAYES_00, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_ASCII_DIVIDERS, SEM_URI, SEM_URIRED, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 spammy=H*Ad:D*oracle.com, 84, UD:ar, flows 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; Tue, 06 Nov 2018 09:01:22 +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 wA68x9ig042556; Tue, 6 Nov 2018 09:01:20 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=et/s+KGAYxCs5gjTLN67ikwabwfyvEKXRRBj1s2sn2Y=; b=D2VHTyMRs5jJSZu9fyMWVfpZCJw6F3JQKucUFw449NHRY6taJm8WxdywfugrlhCEyy6f ZjxwBuxq144cTKfTG51Sn3VvTnybRzyHni82pnmwZ3xrTKdnTmx3G2BNFWePoBIsGh/6 wO4orVtcwqkMp25prh5NqP49PQr3vEzPc+2a7DWSniA3Ut6tMDSNv9q+EuBnWmKRI3JS b42zd6BRruCBBPGmh5xL3z9DvCXnkOisd1Auhm39ZEIZp1ra4Oy77q9otGDqyy80bpt0 Xr28rS/v+I2Mt++zF71sBOykEoOR+tD0FeGeVY/KqxC4O6RkcoGT3VihBHbitttygYY0 uA== Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp2130.oracle.com with ESMTP id 2nh33tut44-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 06 Nov 2018 09:01:19 +0000 Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.14.4) with ESMTP id wA691D7Z008164 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 6 Nov 2018 09:01:14 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id wA691DW7006229; Tue, 6 Nov 2018 09:01:13 GMT Received: from [192.168.1.4] (/87.10.221.76) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 06 Nov 2018 01:01:12 -0800 To: "gcc-patches@gcc.gnu.org" Cc: Jason Merrill From: Paolo Carlini Subject: [C++ Patch] Improve compute_array_index_type locations Message-ID: <65a6b7c7-1284-76de-61a3-9467f4223f7a@oracle.com> Date: Tue, 6 Nov 2018 10:01:04 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 MIME-Version: 1.0 X-IsSubscribed: yes Hi, when I improved create_array_type_for_decl I didn't notice that it calls compute_array_index_type as helper, which simply needs to have the location information propagated. Tested x86_64-linux. Thanks, Paolo. //////////////// /cp 2018-11-06 Paolo Carlini * decl.c (compute_array_index_type_loc): New, like the current compute_array_index_type but takes a location_t too. (compute_array_index_type): Forward to the latter. (create_array_type_for_decl): Use compute_array_index_type_loc. /testsuite 2018-11-06 Paolo Carlini * g++.dg/cpp0x/constexpr-47969.C: Test locations too. * g++.dg/cpp0x/constexpr-48324.C: Likewise. * g++.dg/cpp0x/constexpr-ex2.C: Likewise. * g++.dg/cpp0x/scoped_enum2.C: Likewise. * g++.dg/cpp1y/pr63996.C: Likewise. * g++.dg/ext/constexpr-vla5.C: Likewise. * g++.dg/ext/stmtexpr15.C: Likewise. * g++.dg/ext/vla1.C: Likewise. * g++.dg/other/fold1.C: Likewise. * g++.dg/parse/array-size2.C: Likewise. * g++.dg/parse/crash36.C: Likewise. * g++.dg/ubsan/pr81530.C: Likewise. * g++.dg/warn/Wvla-1.C: Likewise. * g++.dg/warn/Wvla-2.C: Likewise. * g++.old-deja/g++.brendan/array1.C: Likewise. * g++.old-deja/g++.bugs/900402_02.C: Likewise. * g++.old-deja/g++.law/init3.C: Likewise. * g++.old-deja/g++.mike/p6149.C: Likewise. Index: cp/decl.c =================================================================== --- cp/decl.c (revision 265826) +++ cp/decl.c (working copy) @@ -9621,8 +9621,9 @@ fold_sizeof_expr (tree t) an appropriate index type for the array. If non-NULL, NAME is the name of the entity being declared. */ -tree -compute_array_index_type (tree name, tree size, tsubst_flags_t complain) +static tree +compute_array_index_type_loc (location_t loc, tree name, tree size, + tsubst_flags_t complain) { tree itype; tree osize = size; @@ -9658,7 +9659,8 @@ fold_sizeof_expr (tree t) if (!(complain & tf_error)) return error_mark_node; if (name) - error ("size of array %qD has non-integral type %qT", name, type); + error_at (loc, "size of array %qD has non-integral type %qT", + name, type); else error ("size of array has non-integral type %qT", type); size = integer_one_node; @@ -9689,8 +9691,14 @@ fold_sizeof_expr (tree t) { tree folded = cp_fully_fold (size); if (TREE_CODE (folded) == INTEGER_CST) - pedwarn (input_location, OPT_Wpedantic, - "size of array is not an integral constant-expression"); + { + if (name) + pedwarn (loc, OPT_Wpedantic, "size of array %qD is not an " + "integral constant-expression", name); + else + pedwarn (input_location, OPT_Wpedantic, + "size of array is not an integral constant-expression"); + } /* Use the folded result for VLAs, too; it will have resolved SIZEOF_EXPR. */ size = folded; @@ -9706,7 +9714,7 @@ fold_sizeof_expr (tree t) return error_mark_node; if (name) - error ("size of array %qD is negative", name); + error_at (loc, "size of array %qD is negative", name); else error ("size of array is negative"); size = integer_one_node; @@ -9722,9 +9730,11 @@ fold_sizeof_expr (tree t) else if (in_system_header_at (input_location)) /* Allow them in system headers because glibc uses them. */; else if (name) - pedwarn (input_location, OPT_Wpedantic, "ISO C++ forbids zero-size array %qD", name); + pedwarn (loc, OPT_Wpedantic, + "ISO C++ forbids zero-size array %qD", name); else - pedwarn (input_location, OPT_Wpedantic, "ISO C++ forbids zero-size array"); + pedwarn (input_location, OPT_Wpedantic, + "ISO C++ forbids zero-size array"); } } else if (TREE_CONSTANT (size) @@ -9737,8 +9747,9 @@ fold_sizeof_expr (tree t) return error_mark_node; /* `(int) &fn' is not a valid array bound. */ if (name) - error ("size of array %qD is not an integral constant-expression", - name); + error_at (loc, + "size of array %qD is not an integral constant-expression", + name); else error ("size of array is not an integral constant-expression"); size = integer_one_node; @@ -9746,15 +9757,17 @@ fold_sizeof_expr (tree t) else if (pedantic && warn_vla != 0) { if (name) - pedwarn (input_location, OPT_Wvla, "ISO C++ forbids variable length array %qD", name); + pedwarn (loc, OPT_Wvla, + "ISO C++ forbids variable length array %qD", name); else - pedwarn (input_location, OPT_Wvla, "ISO C++ forbids variable length array"); + pedwarn (input_location, OPT_Wvla, + "ISO C++ forbids variable length array"); } else if (warn_vla > 0) { if (name) - warning (OPT_Wvla, - "variable length array %qD is used", name); + warning_at (loc, OPT_Wvla, + "variable length array %qD is used", name); else warning (OPT_Wvla, "variable length array is used"); @@ -9821,6 +9834,12 @@ fold_sizeof_expr (tree t) return itype; } +tree +compute_array_index_type (tree name, tree size, tsubst_flags_t complain) +{ + return compute_array_index_type_loc (input_location, name, size, complain); +} + /* Returns the scope (if any) in which the entity declared by DECLARATOR will be located. If the entity was declared with an unqualified name, NULL_TREE is returned. */ @@ -9922,7 +9941,8 @@ create_array_type_for_decl (tree name, tree type, /* Figure out the index type for the array. */ if (size) - itype = compute_array_index_type (name, size, tf_warning_or_error); + itype = compute_array_index_type_loc (loc, name, size, + tf_warning_or_error); /* [dcl.array] T is called the array element type; this type shall not be [...] an Index: testsuite/g++.dg/cpp0x/constexpr-47969.C =================================================================== --- testsuite/g++.dg/cpp0x/constexpr-47969.C (revision 265826) +++ testsuite/g++.dg/cpp0x/constexpr-47969.C (working copy) @@ -8,4 +8,5 @@ struct A constexpr A a = A(); -int ar[a]; // { dg-error "could not convert|has non-integral type" } +int ar[a]; // { dg-error "could not convert" } +// { dg-error "5:size of array .ar. has non-integral" "" { target c++11 } .-1 } Index: testsuite/g++.dg/cpp0x/constexpr-48324.C =================================================================== --- testsuite/g++.dg/cpp0x/constexpr-48324.C (revision 265826) +++ testsuite/g++.dg/cpp0x/constexpr-48324.C (working copy) @@ -10,4 +10,4 @@ constexpr const int& to_ref(int i) { return S(i).val; // { dg-warning "reference to temporary" } } -constexpr int ary[to_ref(98)] = { }; // { dg-error "not an integral" } +constexpr int ary[to_ref(98)] = { }; // { dg-error "15:size of array .ary. is not an integral" } Index: testsuite/g++.dg/cpp0x/constexpr-ex2.C =================================================================== --- testsuite/g++.dg/cpp0x/constexpr-ex2.C (revision 265826) +++ testsuite/g++.dg/cpp0x/constexpr-ex2.C (working copy) @@ -18,5 +18,5 @@ constexpr A a = 42; X x; // OK: unique conversion to int int ar[X::i]; // also OK -int ary[a]; // { dg-error "could not convert|ambiguous|conversion|array" } ambiguous conversion - +int ary[a]; // { dg-error "could not convert" } ambiguous conversion +// { dg-error "5:size of array .ary. has non-integral" "" { target c++11 } .-1 } Index: testsuite/g++.dg/cpp0x/scoped_enum2.C =================================================================== --- testsuite/g++.dg/cpp0x/scoped_enum2.C (revision 265826) +++ testsuite/g++.dg/cpp0x/scoped_enum2.C (working copy) @@ -4,7 +4,8 @@ enum class E { e = 10 }; enum E2 { e2 = 10 }; struct C { - int arr[E::e]; // { dg-error "could not convert|non-integral type" } + int arr[E::e]; // { dg-error "could not convert" } +// { dg-error "7:size of array .arr. has non-integral" "" { target c++11 } .-1 } int arr2[E2::e2]; // OK int i: E::e; // { dg-error "could not convert|non-integral type" } int i2: E2::e2; // OK Index: testsuite/g++.dg/cpp1y/pr63996.C =================================================================== --- testsuite/g++.dg/cpp1y/pr63996.C (revision 265826) +++ testsuite/g++.dg/cpp1y/pr63996.C (working copy) @@ -4,7 +4,7 @@ constexpr int foo (int i) { - int a[i] = { }; // { dg-error "forbids variable length" } + int a[i] = { }; // { dg-error "7:ISO C\\+\\+ forbids variable length array .a" } } constexpr int j = foo (1); // { dg-error "flows off the end|in .constexpr. expansion of" } Index: testsuite/g++.dg/ext/constexpr-vla5.C =================================================================== --- testsuite/g++.dg/ext/constexpr-vla5.C (revision 265826) +++ testsuite/g++.dg/ext/constexpr-vla5.C (working copy) @@ -3,5 +3,6 @@ void foo(int i) { - constexpr char x[i] = ""; // { dg-error "" } + constexpr char x[i] = ""; // { dg-error ".constexpr. variable .x" } +// { dg-error "18:ISO C\\+\\+ forbids variable length array .x" "" { target c++11 } .-1 } } Index: testsuite/g++.dg/ext/stmtexpr15.C =================================================================== --- testsuite/g++.dg/ext/stmtexpr15.C (revision 265826) +++ testsuite/g++.dg/ext/stmtexpr15.C (working copy) @@ -3,5 +3,6 @@ void foo() { - int x[({ return; })]; // { dg-error "could not convert|non-integral" } + int x[({ return; })]; // { dg-error "could not convert" } +// { dg-error "7:size of array .x. has non-integral" "" { target *-*-* } .-1 } } Index: testsuite/g++.dg/ext/vla1.C =================================================================== --- testsuite/g++.dg/ext/vla1.C (revision 265826) +++ testsuite/g++.dg/ext/vla1.C (working copy) @@ -9,7 +9,7 @@ class A { A (int); }; A::A (int i) { - int ar[1][i]; // { dg-error "array" } + int ar[1][i]; // { dg-error "7:ISO C\\+\\+ forbids variable length array .ar" } ar[0][0] = 0; } @@ -19,7 +19,8 @@ class B { B (int); }; B::B (int i) { struct S { - int ar[1][i]; // { dg-error "array" } + int ar[1][i]; // { dg-error "9:size of array .ar. is not an integral" "" { target c++11 } } +// { dg-error "array bound" "" { target c++98_only } .-1 } } s; s.ar[0][0] = 0; // { dg-prune-output "no member" } Index: testsuite/g++.dg/other/fold1.C =================================================================== --- testsuite/g++.dg/other/fold1.C (revision 265826) +++ testsuite/g++.dg/other/fold1.C (working copy) @@ -4,5 +4,5 @@ struct A { static const int i = i; // { dg-error "not declared" } - int x[i]; // { dg-error "constant-expression|narrowing conversion" } + int x[i]; // { dg-error "9:size of array .x. is not an integral constant-expression" } }; Index: testsuite/g++.dg/parse/array-size2.C =================================================================== --- testsuite/g++.dg/parse/array-size2.C (revision 265826) +++ testsuite/g++.dg/parse/array-size2.C (working copy) @@ -14,7 +14,7 @@ extern void bar (char *, char *); void foo (void) { - char g[(char *) &((struct S *) 0)->b - (char *) 0]; // { dg-error "constant|narrowing conversion" } - char h[(__SIZE_TYPE__) &((struct S *) 8)->b]; // { dg-error "constant" } + char g[(char *) &((struct S *) 0)->b - (char *) 0]; // { dg-error "8:size of array .g. is not an integral constant-expression" } + char h[(__SIZE_TYPE__) &((struct S *) 8)->b]; // { dg-error "8:size of array .h. is not an integral constant-expression" } bar (g, h); } Index: testsuite/g++.dg/parse/crash36.C =================================================================== --- testsuite/g++.dg/parse/crash36.C (revision 265826) +++ testsuite/g++.dg/parse/crash36.C (working copy) @@ -9,4 +9,4 @@ template struct A // { dg-warning static const int i = sizeof (++t); // { dg-error "was not declared in this scope" } }; -int x[A ::i]; // { dg-error "constant-expression" } +int x[A ::i]; // { dg-error "5:size of array .x. is not an integral constant-expression" } Index: testsuite/g++.dg/ubsan/pr81530.C =================================================================== --- testsuite/g++.dg/ubsan/pr81530.C (revision 265826) +++ testsuite/g++.dg/ubsan/pr81530.C (working copy) @@ -2,4 +2,4 @@ /* { dg-do compile } */ /* { dg-options "-fsanitize=undefined" } */ -int a[(long) 4e20]; /* { dg-error "size of array .a. is (too large|negative)" } */ +int a[(long) 4e20]; /* { dg-error "5:size of array .a. is (too large|negative)" } */ Index: testsuite/g++.dg/warn/Wvla-1.C =================================================================== --- testsuite/g++.dg/warn/Wvla-1.C (revision 265826) +++ testsuite/g++.dg/warn/Wvla-1.C (working copy) @@ -4,5 +4,5 @@ void func (int i) { - int array[i]; /* { dg-warning "variable length array 'array' is used" } */ + int array[i]; /* { dg-warning "7:variable length array 'array' is used" } */ } Index: testsuite/g++.dg/warn/Wvla-2.C =================================================================== --- testsuite/g++.dg/warn/Wvla-2.C (revision 265826) +++ testsuite/g++.dg/warn/Wvla-2.C (working copy) @@ -3,5 +3,5 @@ void func (int i) { - int array[i]; /* { dg-error "ISO C.* forbids variable.* array 'array'" } */ + int array[i]; /* { dg-error "7:ISO C.* forbids variable.* array 'array'" } */ } Index: testsuite/g++.old-deja/g++.brendan/array1.C =================================================================== --- testsuite/g++.old-deja/g++.brendan/array1.C (revision 265826) +++ testsuite/g++.old-deja/g++.brendan/array1.C (working copy) @@ -2,5 +2,5 @@ // GROUPS passed array-bindings extern "C" int printf (const char *, ...); -char array[~(~((__SIZE_TYPE__)0ul)>>1)|~(((__SIZE_TYPE__)0ul)>>3)]; // { dg-error "" } overflow in array dimension.* +char array[~(~((__SIZE_TYPE__)0ul)>>1)|~(((__SIZE_TYPE__)0ul)>>3)]; // { dg-error "6:size of array .array. is negative" } overflow in array dimension.* int main () { printf ("PASS\n"); return 0; } Index: testsuite/g++.old-deja/g++.bugs/900402_02.C =================================================================== --- testsuite/g++.old-deja/g++.bugs/900402_02.C (revision 265826) +++ testsuite/g++.old-deja/g++.bugs/900402_02.C (working copy) @@ -6,17 +6,17 @@ // keywords: arrays, array bound, zero length -typedef int array_type[0]; // { dg-error "zero-size array" } +typedef int array_type[0]; // { dg-error "13:ISO C\\+\\+ forbids zero-size array" } -int array_object_1[0]; // { dg-error "zero-size array" } +int array_object_1[0]; // { dg-error "5:ISO C\\+\\+ forbids zero-size array" } -void function_0 (int formal_array[0]) // { dg-error "zero-size array" } +void function_0 (int formal_array[0]) // { dg-error "22:ISO C\\+\\+ forbids zero-size array" } { } void function_2 () { - int local_object_array_0[0]; // { dg-error "zero-size array" } + int local_object_array_0[0]; // { dg-error "7:ISO C\\+\\+ forbids zero-size array" } } int main () { return 0; } Index: testsuite/g++.old-deja/g++.law/init3.C =================================================================== --- testsuite/g++.old-deja/g++.law/init3.C (revision 265826) +++ testsuite/g++.old-deja/g++.law/init3.C (working copy) @@ -8,5 +8,5 @@ int main() { int offset; -char buf[offset]=""; // { dg-error "" } ansi forbids variable arrays +char buf[offset]=""; // { dg-error "6:ISO C\\+\\+ forbids variable length array .buf" } ansi forbids variable arrays } Index: testsuite/g++.old-deja/g++.mike/p6149.C =================================================================== --- testsuite/g++.old-deja/g++.mike/p6149.C (revision 265826) +++ testsuite/g++.old-deja/g++.mike/p6149.C (working copy) @@ -1,4 +1,4 @@ // { dg-do assemble } // prms-id: 6149 -int a[3 - sizeof(double)]; // { dg-error "" } +int a[3 - sizeof(double)]; // { dg-error "5:size of array .a. is negative" }