Commit ebdb73c0 by Paolo Carlini Committed by Paolo Carlini

decl.c (create_array_type_for_decl): Add location_t parameter and use it.

/cp
2018-10-29  Paolo Carlini  <paolo.carlini@oracle.com>

	* decl.c (create_array_type_for_decl): Add location_t parameter
	and use it.
	(grokdeclarator): Adjust call.

/testsuite
2018-10-29  Paolo Carlini  <paolo.carlini@oracle.com>

	* g++.dg/cpp0x/auto24.C: Test location too.
	* g++.dg/cpp0x/auto3.C: Likewise.
	* g++.dg/cpp0x/auto42.C: Likewise.
	* g++.dg/cpp0x/initlist57.C: Likewise.
	* g++.dg/cpp0x/initlist75.C: Likewise.
	* g++.dg/cpp0x/initlist80.C: Likewise.
	* g++.dg/cpp0x/lambda/lambda-ice13.C: Likewise.
	* g++.old-deja/g++.brendan/array-refs.C: Likewise.
	* g++.old-deja/g++.bugs/900322_01.C: Likewise.
	* g++.old-deja/g++.bugs/900519_07.C: Likewise.
	* g++.old-deja/g++.other/typeck1.C: Likewise.

From-SVN: r265608
parent 64ac3c33
2018-10-29 Paolo Carlini <paolo.carlini@oracle.com>
* decl.c (create_array_type_for_decl): Add location_t parameter
and use it.
(grokdeclarator): Adjust call.
2018-10-29 Marek Polacek <polacek@redhat.com> 2018-10-29 Marek Polacek <polacek@redhat.com>
PR c++/87594 - constexpr rejects-valid with range-based for. PR c++/87594 - constexpr rejects-valid with range-based for.
......
...@@ -88,7 +88,7 @@ static void finish_constructor_body (void); ...@@ -88,7 +88,7 @@ static void finish_constructor_body (void);
static void begin_destructor_body (void); static void begin_destructor_body (void);
static void finish_destructor_body (void); static void finish_destructor_body (void);
static void record_key_method_defined (tree); static void record_key_method_defined (tree);
static tree create_array_type_for_decl (tree, tree, tree); static tree create_array_type_for_decl (tree, tree, tree, location_t);
static tree get_atexit_node (void); static tree get_atexit_node (void);
static tree get_dso_handle_node (void); static tree get_dso_handle_node (void);
static tree start_cleanup_fn (void); static tree start_cleanup_fn (void);
...@@ -9835,7 +9835,7 @@ get_scope_of_declarator (const cp_declarator *declarator) ...@@ -9835,7 +9835,7 @@ get_scope_of_declarator (const cp_declarator *declarator)
with this type. */ with this type. */
static tree static tree
create_array_type_for_decl (tree name, tree type, tree size) create_array_type_for_decl (tree name, tree type, tree size, location_t loc)
{ {
tree itype = NULL_TREE; tree itype = NULL_TREE;
...@@ -9848,9 +9848,9 @@ create_array_type_for_decl (tree name, tree type, tree size) ...@@ -9848,9 +9848,9 @@ create_array_type_for_decl (tree name, tree type, tree size)
if (type_uses_auto (type)) if (type_uses_auto (type))
{ {
if (name) if (name)
error ("%qD declared as array of %qT", name, type); error_at (loc, "%qD declared as array of %qT", name, type);
else else
error ("creating array of %qT", type); error ("creating array of %qT", type);
return error_mark_node; return error_mark_node;
} }
...@@ -9860,28 +9860,29 @@ create_array_type_for_decl (tree name, tree type, tree size) ...@@ -9860,28 +9860,29 @@ create_array_type_for_decl (tree name, tree type, tree size)
{ {
case VOID_TYPE: case VOID_TYPE:
if (name) if (name)
error ("declaration of %qD as array of void", name); error_at (loc, "declaration of %qD as array of void", name);
else else
error ("creating array of void"); error ("creating array of void");
return error_mark_node; return error_mark_node;
case FUNCTION_TYPE: case FUNCTION_TYPE:
if (name) if (name)
error ("declaration of %qD as array of functions", name); error_at (loc, "declaration of %qD as array of functions", name);
else else
error ("creating array of functions"); error ("creating array of functions");
return error_mark_node; return error_mark_node;
case REFERENCE_TYPE: case REFERENCE_TYPE:
if (name) if (name)
error ("declaration of %qD as array of references", name); error_at (loc, "declaration of %qD as array of references", name);
else else
error ("creating array of references"); error ("creating array of references");
return error_mark_node; return error_mark_node;
case METHOD_TYPE: case METHOD_TYPE:
if (name) if (name)
error ("declaration of %qD as array of function members", name); error_at (loc, "declaration of %qD as array of function members",
name);
else else
error ("creating array of function members"); error ("creating array of function members");
return error_mark_node; return error_mark_node;
...@@ -9897,9 +9898,9 @@ create_array_type_for_decl (tree name, tree type, tree size) ...@@ -9897,9 +9898,9 @@ create_array_type_for_decl (tree name, tree type, tree size)
if (TREE_CODE (type) == ARRAY_TYPE && !TYPE_DOMAIN (type)) if (TREE_CODE (type) == ARRAY_TYPE && !TYPE_DOMAIN (type))
{ {
if (name) if (name)
error ("declaration of %qD as multidimensional array must " error_at (loc, "declaration of %qD as multidimensional array must "
"have bounds for all dimensions except the first", "have bounds for all dimensions except the first",
name); name);
else else
error ("multidimensional array must have bounds for all " error ("multidimensional array must have bounds for all "
"dimensions except the first"); "dimensions except the first");
...@@ -11164,7 +11165,8 @@ grokdeclarator (const cp_declarator *declarator, ...@@ -11164,7 +11165,8 @@ grokdeclarator (const cp_declarator *declarator,
{ {
case cdk_array: case cdk_array:
type = create_array_type_for_decl (dname, type, type = create_array_type_for_decl (dname, type,
declarator->u.array.bounds); declarator->u.array.bounds,
declarator->id_loc);
if (!valid_array_size_p (input_location, type, dname)) if (!valid_array_size_p (input_location, type, dname))
type = error_mark_node; type = error_mark_node;
......
2018-10-29 Paolo Carlini <paolo.carlini@oracle.com>
* g++.dg/cpp0x/auto24.C: Test location too.
* g++.dg/cpp0x/auto3.C: Likewise.
* g++.dg/cpp0x/auto42.C: Likewise.
* g++.dg/cpp0x/initlist57.C: Likewise.
* g++.dg/cpp0x/initlist75.C: Likewise.
* g++.dg/cpp0x/initlist80.C: Likewise.
* g++.dg/cpp0x/lambda/lambda-ice13.C: Likewise.
* g++.old-deja/g++.brendan/array-refs.C: Likewise.
* g++.old-deja/g++.bugs/900322_01.C: Likewise.
* g++.old-deja/g++.bugs/900519_07.C: Likewise.
* g++.old-deja/g++.other/typeck1.C: Likewise.
2018-10-29 Kugan Vivekanandarajah <kuganv@linaro.org> 2018-10-29 Kugan Vivekanandarajah <kuganv@linaro.org>
PR middle-end/87469 PR middle-end/87469
......
...@@ -2,4 +2,4 @@ ...@@ -2,4 +2,4 @@
// { dg-do compile { target c++11 } } // { dg-do compile { target c++11 } }
int v[1]; int v[1];
auto (*p)[1] = &v; // { dg-error "array of .auto" } auto (*p)[1] = &v; // { dg-error "8:.p. declared as array of .auto" }
...@@ -10,7 +10,7 @@ auto x; // { dg-error "auto" } ...@@ -10,7 +10,7 @@ auto x; // { dg-error "auto" }
auto i = 42, j = 42.0; // { dg-error "auto" } auto i = 42, j = 42.0; // { dg-error "auto" }
// New CWG issue // New CWG issue
auto a[2] = { 1, 2 }; // { dg-error "auto|initializer_list" } auto a[2] = { 1, 2 }; // { dg-error "6:.a. declared as array of .auto" }
template<class T> template<class T>
struct A { }; struct A { };
......
...@@ -5,5 +5,5 @@ ...@@ -5,5 +5,5 @@
void foo(int i) void foo(int i)
{ {
auto x[1] = { 0 }; // { dg-error "array of .auto" } auto x[1] = { 0 }; // { dg-error "8:.x. declared as array of .auto" }
} }
// PR c++/50054 // PR c++/50054
// { dg-do compile { target c++11 } } // { dg-do compile { target c++11 } }
void g( const int& (a)[1] ) {} // { dg-error "array of references" } void g( const int& (a)[1] ) {} // { dg-error "21:declaration of .a. as array of references" }
int main () { int main () {
g( { 1, 2 } ); // { dg-error "initializer list" } g( { 1, 2 } ); // { dg-error "initializer list" }
......
...@@ -3,4 +3,4 @@ ...@@ -3,4 +3,4 @@
#include <initializer_list> #include <initializer_list>
auto foo[] = {}; // { dg-error "auto|unable to deduce" } auto foo[] = {}; // { dg-error "6:.foo. declared as array of .auto" }
...@@ -3,4 +3,4 @@ ...@@ -3,4 +3,4 @@
#include <initializer_list> #include <initializer_list>
auto x[2] = {}; // { dg-error "" } auto x[2] = {}; // { dg-error "6:.x. declared as array of .auto" }
...@@ -10,5 +10,6 @@ void f() ...@@ -10,5 +10,6 @@ void f()
void g() void g()
{ {
typedef void (X) (); typedef void (X) ();
X x[] = { [x](){} }; // { dg-error "array of functions|not declared" } X x[] = { [x](){} }; // { dg-error "5:declaration of .x. as array of functions" }
// { dg-error "not declared" "" { target *-*-* } .-1 }
} }
...@@ -3,4 +3,4 @@ ...@@ -3,4 +3,4 @@
int a, b; int a, b;
// declaring an array of references should be illegal // declaring an array of references should be illegal
int & v[ 2] = { a, b};// { dg-error "" } .* int & v[ 2] = { a, b}; // { dg-error "7:declaration of .v. as array of references" }
...@@ -33,24 +33,25 @@ ...@@ -33,24 +33,25 @@
// keywords: incomplete types, arrays, element types // keywords: incomplete types, arrays, element types
extern int extern_two_d [] []; // { dg-error "" } invalid declaration extern int extern_two_d [] []; // { dg-error "12:declaration of .extern_two_d. as multidimensional" } invalid declaration
int tenative_two_d [] []; // { dg-error "" } caught by g++ int tenative_two_d [] []; // { dg-error "5:declaration of .tenative_two_d. as multidimensional" } caught by g++
static int static_two_d [] []; // { dg-error "" } caught by g++ static int static_two_d [] []; // { dg-error "12:declaration of .static_two_d. as multidimensional" } caught by g++
int (*pointer_to_two_d)[][]; // { dg-error "" } invalid declaration int (*pointer_to_two_d)[][]; // { dg-error "7:declaration of .pointer_to_two_d. as multidimensional" } invalid declaration
void function_0 (int arg [] []) { // { dg-error "" } invalid declaration void function_0 (int arg [] []) { // { dg-error "22:declaration of .arg. as multidimensional" } invalid declaration
} }
typedef int int_one_d_type []; typedef int int_one_d_type [];
typedef int_one_d_type int_two_d_type[];// { dg-error "" } invalid declaration typedef int_one_d_type int_two_d_type[];// { dg-error "24:declaration of .int_two_d_type. as multidimensional" } invalid declaration
struct s; struct s;
extern struct s extern_s_array [10]; // OK extern struct s extern_s_array [10]; // OK
struct s tenative_s_array [10]; // { dg-error "" } object with incomplete type struct s tenative_s_array [10]; // { dg-error "10:elements of array .s tenative_s_array \\\[10\\\]. have incomplete type" } object with incomplete type
static struct s static_s_array [10]; // { dg-error "" } object with incomplete type // { dg-error "10:storage size" "" { target *-*-* } .-1 }
static struct s static_s_array [10]; // { dg-error "17:elements of array .s static_s_array \\\[10\\\]. have incomplete type" } object with incomplete type
// { dg-error "17:storage size" "" { target *-*-* } .-1 }
struct s (*pointer_to_s_array) []; // OK struct s (*pointer_to_s_array) []; // OK
void function_1 (struct s arg []) { // OK void function_1 (struct s arg []) { // OK
......
...@@ -11,7 +11,7 @@ int i; ...@@ -11,7 +11,7 @@ int i;
int j; int j;
typedef int& int_ref; typedef int& int_ref;
typedef int_ref int_ref_array_type[2]; // { dg-error "" } missed typedef int_ref int_ref_array_type[2]; // { dg-error "17:declaration of .int_ref_array_type. as array of references" } missed
int& int_ref_array_obj0[2] = { i, j }; // { dg-error "" } missed int& int_ref_array_obj0[2] = { i, j }; // { dg-error "6:declaration of .int_ref_array_obj0. as array of references" } missed
int_ref int_ref_array_obj1[2] = { i, j }; // { dg-error "" } missed int_ref int_ref_array_obj1[2] = { i, j }; // { dg-error "9:declaration of .int_ref_array_obj1. as array of references" } missed
// { dg-do assemble } // { dg-do assemble }
extern int a[][]; // { dg-error "" } invalid multidimensional array extern int a[][]; // { dg-error "12:declaration of .a. as multidimensional array" } invalid multidimensional array
extern int b[7][]; // { dg-error "" } invalid multidimensional array extern int b[7][]; // { dg-error "12:declaration of .b. as multidimensional array" } invalid multidimensional array
extern int c[][7]; // OK extern int c[][7]; // OK
extern int (*i)[]; // { dg-message "" } previous declaration extern int (*i)[]; // { dg-message "" } previous declaration
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment