From eedb990a499c893797d85d99b892cd8452d4ada4 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Thu, 29 Nov 2018 21:34:38 +0000 Subject: [PATCH] decl.c (compute_array_index_type_loc): New, like the current compute_array_index_type but takes a location_t too. /cp 2018-11-29 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-29 Paolo Carlini * g++.dg/cpp0x/constexpr-base6b.C: New. * 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. From-SVN: r266645 --- gcc/cp/ChangeLog | 7 +++ gcc/cp/decl.c | 58 +++++++++++++------ gcc/testsuite/ChangeLog | 22 +++++++ gcc/testsuite/g++.dg/cpp0x/constexpr-47969.C | 3 +- gcc/testsuite/g++.dg/cpp0x/constexpr-48324.C | 2 +- gcc/testsuite/g++.dg/cpp0x/constexpr-base6b.C | 13 +++++ gcc/testsuite/g++.dg/cpp0x/constexpr-ex2.C | 4 +- gcc/testsuite/g++.dg/cpp0x/scoped_enum2.C | 3 +- gcc/testsuite/g++.dg/cpp1y/pr63996.C | 2 +- gcc/testsuite/g++.dg/ext/constexpr-vla5.C | 2 +- gcc/testsuite/g++.dg/ext/stmtexpr15.C | 3 +- gcc/testsuite/g++.dg/ext/vla1.C | 5 +- gcc/testsuite/g++.dg/other/fold1.C | 2 +- gcc/testsuite/g++.dg/parse/array-size2.C | 4 +- gcc/testsuite/g++.dg/parse/crash36.C | 2 +- gcc/testsuite/g++.dg/ubsan/pr81530.C | 2 +- gcc/testsuite/g++.dg/warn/Wvla-1.C | 2 +- gcc/testsuite/g++.dg/warn/Wvla-2.C | 2 +- .../g++.old-deja/g++.brendan/array1.C | 2 +- .../g++.old-deja/g++.bugs/900402_02.C | 8 +-- gcc/testsuite/g++.old-deja/g++.law/init3.C | 2 +- gcc/testsuite/g++.old-deja/g++.mike/p6149.C | 2 +- 22 files changed, 110 insertions(+), 42 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/constexpr-base6b.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 853e139773b..98a2528783a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2018-11-29 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. + 2018-11-29 David Malcolm PR c++/88121 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 3734bfe39ac..7d2c599a557 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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 name_loc, tree name, tree size, + tsubst_flags_t complain) { tree itype; tree osize = size; @@ -9630,6 +9631,8 @@ compute_array_index_type (tree name, tree size, tsubst_flags_t complain) if (error_operand_p (size)) return error_mark_node; + location_t loc = cp_expr_loc_or_loc (size, name ? name_loc : input_location); + if (!type_dependent_expression_p (size)) { osize = size = mark_rvalue_use (size); @@ -9658,9 +9661,10 @@ compute_array_index_type (tree name, tree size, tsubst_flags_t complain) 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); + error_at (loc, "size of array has non-integral type %qT", type); size = integer_one_node; } } @@ -9689,8 +9693,14 @@ compute_array_index_type (tree name, tree size, tsubst_flags_t complain) { 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 (loc, 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,9 +9716,9 @@ compute_array_index_type (tree name, tree size, tsubst_flags_t complain) 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"); + error_at (loc, "size of array is negative"); size = integer_one_node; } /* As an extension we allow zero-sized arrays. */ @@ -9722,9 +9732,11 @@ compute_array_index_type (tree name, tree size, tsubst_flags_t complain) 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 (loc, OPT_Wpedantic, + "ISO C++ forbids zero-size array"); } } else if (TREE_CONSTANT (size) @@ -9737,24 +9749,27 @@ compute_array_index_type (tree name, tree size, tsubst_flags_t complain) 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"); + error_at (loc, "size of array is not an integral constant-expression"); size = integer_one_node; } else if (pedantic && warn_vla != 0) { if (name) - pedwarn (input_location, OPT_Wvla, "ISO C++ forbids variable length array %qD", name); + pedwarn (name_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 (name_loc, OPT_Wvla, + "variable length array %qD is used", name); else warning (OPT_Wvla, "variable length array is used"); @@ -9821,6 +9836,12 @@ compute_array_index_type (tree name, tree size, tsubst_flags_t complain) 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 +9943,8 @@ create_array_type_for_decl (tree name, tree type, tree size, location_t loc) /* 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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7c760daf189..937e0adca47 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,25 @@ +2018-11-29 Paolo Carlini + + * g++.dg/cpp0x/constexpr-base6b.C: New. + * 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. + 2018-11-29 David Malcolm PR c++/88121 diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-47969.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-47969.C index 201ee17b41b..bfd9d8fe526 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-47969.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-47969.C @@ -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 } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-48324.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-48324.C index cef464cf9b8..37ed0e1d163 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-48324.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-48324.C @@ -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 "25:size of array .ary. is not an integral" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-base6b.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-base6b.C new file mode 100644 index 00000000000..13fa889f4cb --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-base6b.C @@ -0,0 +1,13 @@ +// CWG issue 2310 +// { dg-do compile { target c++11 } } + +template struct check_derived_from { + static A a; + static constexpr B *p = &a; // { dg-error "cannot convert" } + int ar[p-p+1]; // { dg-error "13:size of array is not an integral constant-expression" } +}; +struct W { int i; }; +struct Z : W +{ + check_derived_from cdf; +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ex2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex2.C index ceae9cb75d3..e726a348fc8 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-ex2.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex2.C @@ -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 } diff --git a/gcc/testsuite/g++.dg/cpp0x/scoped_enum2.C b/gcc/testsuite/g++.dg/cpp0x/scoped_enum2.C index 456b0daedd1..0313c01abb0 100644 --- a/gcc/testsuite/g++.dg/cpp0x/scoped_enum2.C +++ b/gcc/testsuite/g++.dg/cpp0x/scoped_enum2.C @@ -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 diff --git a/gcc/testsuite/g++.dg/cpp1y/pr63996.C b/gcc/testsuite/g++.dg/cpp1y/pr63996.C index 2e8cab58a7a..fe47544a3c8 100644 --- a/gcc/testsuite/g++.dg/cpp1y/pr63996.C +++ b/gcc/testsuite/g++.dg/cpp1y/pr63996.C @@ -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" } diff --git a/gcc/testsuite/g++.dg/ext/constexpr-vla5.C b/gcc/testsuite/g++.dg/ext/constexpr-vla5.C index 5f19d3c4fd7..7cedc94948b 100644 --- a/gcc/testsuite/g++.dg/ext/constexpr-vla5.C +++ b/gcc/testsuite/g++.dg/ext/constexpr-vla5.C @@ -4,5 +4,5 @@ void foo(int i) { constexpr char x[i] = ""; // { dg-error "18:.constexpr. variable .x. has variably-modified type" } -// { dg-error "ISO C\\+\\+ forbids variable length array .x" "" { target c++11 } .-1 } +// { dg-error "18:ISO C\\+\\+ forbids variable length array .x" "" { target c++11 } .-1 } } diff --git a/gcc/testsuite/g++.dg/ext/stmtexpr15.C b/gcc/testsuite/g++.dg/ext/stmtexpr15.C index 1a60a0d3cad..10c4886c10c 100644 --- a/gcc/testsuite/g++.dg/ext/stmtexpr15.C +++ b/gcc/testsuite/g++.dg/ext/stmtexpr15.C @@ -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 "12:size of array .x. has non-integral" "" { target *-*-* } .-1 } } diff --git a/gcc/testsuite/g++.dg/ext/vla1.C b/gcc/testsuite/g++.dg/ext/vla1.C index 55ae5c8af0a..d6df686cb69 100644 --- a/gcc/testsuite/g++.dg/ext/vla1.C +++ b/gcc/testsuite/g++.dg/ext/vla1.C @@ -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" } diff --git a/gcc/testsuite/g++.dg/other/fold1.C b/gcc/testsuite/g++.dg/other/fold1.C index bf074038b04..25f9accc41d 100644 --- a/gcc/testsuite/g++.dg/other/fold1.C +++ b/gcc/testsuite/g++.dg/other/fold1.C @@ -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" } }; diff --git a/gcc/testsuite/g++.dg/parse/array-size2.C b/gcc/testsuite/g++.dg/parse/array-size2.C index 997b95eed1a..e58fe266e77 100644 --- a/gcc/testsuite/g++.dg/parse/array-size2.C +++ b/gcc/testsuite/g++.dg/parse/array-size2.C @@ -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 "40:size of array .g. is not an integral constant-expression" } + char h[(__SIZE_TYPE__) &((struct S *) 8)->b]; // { dg-error "10:size of array .h. is not an integral constant-expression" } bar (g, h); } diff --git a/gcc/testsuite/g++.dg/parse/crash36.C b/gcc/testsuite/g++.dg/parse/crash36.C index 4b2384cb9f2..14fcdd833f7 100644 --- a/gcc/testsuite/g++.dg/parse/crash36.C +++ b/gcc/testsuite/g++.dg/parse/crash36.C @@ -9,4 +9,4 @@ template struct A // { dg-warning "variadic templates" } 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" } diff --git a/gcc/testsuite/g++.dg/ubsan/pr81530.C b/gcc/testsuite/g++.dg/ubsan/pr81530.C index 1fbbaa9d1e2..310ea8e3032 100644 --- a/gcc/testsuite/g++.dg/ubsan/pr81530.C +++ b/gcc/testsuite/g++.dg/ubsan/pr81530.C @@ -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 "7:size of array .a. is (too large|negative)" } */ diff --git a/gcc/testsuite/g++.dg/warn/Wvla-1.C b/gcc/testsuite/g++.dg/warn/Wvla-1.C index 5d261fcf813..95e452dfc70 100644 --- a/gcc/testsuite/g++.dg/warn/Wvla-1.C +++ b/gcc/testsuite/g++.dg/warn/Wvla-1.C @@ -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" } */ } diff --git a/gcc/testsuite/g++.dg/warn/Wvla-2.C b/gcc/testsuite/g++.dg/warn/Wvla-2.C index eacd2123754..02092b809cb 100644 --- a/gcc/testsuite/g++.dg/warn/Wvla-2.C +++ b/gcc/testsuite/g++.dg/warn/Wvla-2.C @@ -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'" } */ } diff --git a/gcc/testsuite/g++.old-deja/g++.brendan/array1.C b/gcc/testsuite/g++.old-deja/g++.brendan/array1.C index d2084f634c4..d6957cd95ae 100644 --- a/gcc/testsuite/g++.old-deja/g++.brendan/array1.C +++ b/gcc/testsuite/g++.old-deja/g++.brendan/array1.C @@ -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 "39:size of array .array. is negative" } overflow in array dimension.* int main () { printf ("PASS\n"); return 0; } diff --git a/gcc/testsuite/g++.old-deja/g++.bugs/900402_02.C b/gcc/testsuite/g++.old-deja/g++.bugs/900402_02.C index d3cf5ad9abe..46a3ec3c276 100644 --- a/gcc/testsuite/g++.old-deja/g++.bugs/900402_02.C +++ b/gcc/testsuite/g++.old-deja/g++.bugs/900402_02.C @@ -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; } diff --git a/gcc/testsuite/g++.old-deja/g++.law/init3.C b/gcc/testsuite/g++.old-deja/g++.law/init3.C index 92f4ed79ddb..197d37ff8fb 100644 --- a/gcc/testsuite/g++.old-deja/g++.law/init3.C +++ b/gcc/testsuite/g++.old-deja/g++.law/init3.C @@ -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 } diff --git a/gcc/testsuite/g++.old-deja/g++.mike/p6149.C b/gcc/testsuite/g++.old-deja/g++.mike/p6149.C index d7b819637f8..4cb18948d88 100644 --- a/gcc/testsuite/g++.old-deja/g++.mike/p6149.C +++ b/gcc/testsuite/g++.old-deja/g++.mike/p6149.C @@ -1,4 +1,4 @@ // { dg-do assemble } // prms-id: 6149 -int a[3 - sizeof(double)]; // { dg-error "" } +int a[3 - sizeof(double)]; // { dg-error "9:size of array .a. is negative" } -- 2.30.2