From: Marc Glisse Date: Mon, 30 Apr 2012 17:23:28 +0000 (+0200) Subject: re PR c++/51033 (generic vector subscript and shuffle support was not added to C++) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7edaa4d2a502c6c8e01a5c1a213834607538a30b;p=gcc.git re PR c++/51033 (generic vector subscript and shuffle support was not added to C++) PR c++/51033 gcc/ * c-typeck.c (build_array_ref): Call convert_vector_to_pointer_for_subscript. gcc/c-family * c-common.c (convert_vector_to_pointer_for_subscript): New function. * c-common.h (convert_vector_to_pointer_for_subscript): Declare it. gcc/cp/ * typeck.c (cp_build_array_ref): Handle VECTOR_TYPE. * decl2.c (grok_array_decl): Likewise. From-SVN: r186994 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5e7dadfbfc4..461f16208e6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2012-04-30 Marc Glisse + + PR c++/51033 + * c-typeck.c (build_array_ref): Call + convert_vector_to_pointer_for_subscript. + * doc/extend.texi (Vector Extensions): Subscripting not just for C. + 2012-04-30 Uros Bizjak * config/i386/i386.md (and3): Change runtime operand mode checks diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 9f62db21b6d..7bd6ad7afa6 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,9 @@ +2012-04-30 Marc Glisse + + PR c++/51033 + * c-common.c (convert_vector_to_pointer_for_subscript): New function. + * c-common.h (convert_vector_to_pointer_for_subscript): Declare it. + 2012-04-30 Dodji Seketeli Add -Wvarargs option diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 089c7576ddf..dce390260cd 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -10833,4 +10833,30 @@ build_userdef_literal (tree suffix_id, tree value, tree num_string) return literal; } +/* For vector[index], convert the vector to a + pointer of the underlying type. */ +void +convert_vector_to_pointer_for_subscript (location_t loc, + tree* vecp, tree index) +{ + if (TREE_CODE (TREE_TYPE (*vecp)) == VECTOR_TYPE) + { + tree type = TREE_TYPE (*vecp); + tree type1; + + if (TREE_CODE (index) == INTEGER_CST) + if (!host_integerp (index, 1) + || ((unsigned HOST_WIDE_INT) tree_low_cst (index, 1) + >= TYPE_VECTOR_SUBPARTS (type))) + warning_at (loc, OPT_Warray_bounds, "index value is out of bound"); + + c_common_mark_addressable_vec (*vecp); + type = build_qualified_type (TREE_TYPE (type), TYPE_QUALS (type)); + type = build_pointer_type (type); + type1 = build_pointer_type (TREE_TYPE (*vecp)); + *vecp = build1 (ADDR_EXPR, type1, *vecp); + *vecp = convert (type, *vecp); + } +} + #include "gt-c-family-c-common.h" diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h index dd411032272..c3d679adcbc 100644 --- a/gcc/c-family/c-common.h +++ b/gcc/c-family/c-common.h @@ -1119,4 +1119,6 @@ struct GTY(()) tree_userdef_literal { extern tree build_userdef_literal (tree suffix_id, tree value, tree num_string); +extern void convert_vector_to_pointer_for_subscript (location_t, tree*, tree); + #endif /* ! GCC_C_COMMON_H */ diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 5e18a98d942..f45d1dcc342 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -2340,26 +2340,7 @@ build_array_ref (location_t loc, tree array, tree index) gcc_assert (TREE_CODE (TREE_TYPE (index)) == INTEGER_TYPE); - /* For vector[index], convert the vector to a - pointer of the underlying type. */ - if (TREE_CODE (TREE_TYPE (array)) == VECTOR_TYPE) - { - tree type = TREE_TYPE (array); - tree type1; - - if (TREE_CODE (index) == INTEGER_CST) - if (!host_integerp (index, 1) - || ((unsigned HOST_WIDE_INT) tree_low_cst (index, 1) - >= TYPE_VECTOR_SUBPARTS (TREE_TYPE (array)))) - warning_at (loc, OPT_Warray_bounds, "index value is out of bound"); - - c_common_mark_addressable_vec (array); - type = build_qualified_type (TREE_TYPE (type), TYPE_QUALS (type)); - type = build_pointer_type (type); - type1 = build_pointer_type (TREE_TYPE (array)); - array = build1 (ADDR_EXPR, type1, array); - array = convert (type, array); - } + convert_vector_to_pointer_for_subscript (loc, &array, index); if (TREE_CODE (TREE_TYPE (array)) == ARRAY_TYPE) { diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 282912a6a6b..e52149f023d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2012-04-30 Marc Glisse + PR c++/51033 + * typeck.c (cp_build_array_ref): Handle VECTOR_TYPE. + * decl2.c (grok_array_decl): Likewise. + PR c++/51314 * parser.c (cp_parser_sizeof_operand): Require parentheses for sizeof... diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 34c969c31fc..7088c675914 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -373,7 +373,7 @@ grok_array_decl (tree array_expr, tree index_exp) It is a little-known fact that, if `a' is an array and `i' is an int, you can write `i[a]', which means the same thing as `a[i]'. */ - if (TREE_CODE (type) == ARRAY_TYPE) + if (TREE_CODE (type) == ARRAY_TYPE || TREE_CODE (type) == VECTOR_TYPE) p1 = array_expr; else p1 = build_expr_type_conversion (WANT_POINTER, array_expr, false); diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 4f1e965c65a..b59741c6471 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -2915,6 +2915,8 @@ cp_build_array_ref (location_t loc, tree array, tree idx, break; } + convert_vector_to_pointer_for_subscript (loc, &array, idx); + if (TREE_CODE (TREE_TYPE (array)) == ARRAY_TYPE) { tree rval, type; diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index 473339ec736..95cea834407 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -6823,7 +6823,7 @@ a = 2 * b; /* a = @{2,2,2,2@} * b; */ a = l + a; /* Error, cannot convert long to int. */ @end smallexample -In C vectors can be subscripted as if the vector were an array with +Vectors can be subscripted as if the vector were an array with the same number of elements and base type. Out of bound accesses invoke undefined behavior at runtime. Warnings for out of bound accesses for vector subscription can be enabled with diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6613970d23c..0a22ae4f05f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,25 @@ 2012-04-30 Marc Glisse + PR c++/51033 + * gcc.dg/vector-1.c: Move to ... + * c-c++-common/vector-1.c: ... here. + * gcc.dg/vector-2.c: Move to ... + * c-c++-common/vector-2.c: ... here. + * gcc.dg/vector-3.c: Move to ... + * c-c++-common/vector-3.c: ... here. Adapt to C++. + * gcc.dg/vector-4.c: Move to ... + * c-c++-common/vector-4.c: ... here. + * gcc.dg/vector-init-1.c: Move to ... + * c-c++-common/vector-init-1.c: ... here. + * gcc.dg/vector-init-2.c: Move to ... + * c-c++-common/vector-init-2.c: ... here. + * gcc.dg/vector-subscript-1.c: Move to ... Adapt to C++. + * c-c++-common/vector-subscript-1.c: ... here. + * gcc.dg/vector-subscript-2.c: Move to ... + * c-c++-common/vector-subscript-2.c: ... here. + * gcc.dg/vector-subscript-3.c: Move to ... + * c-c++-common/vector-subscript-3.c: ... here. + PR c++/51314 * g++.dg/cpp0x/vt-51314.C: New test. * g++.dg/cpp0x/variadic76.C: Fix. diff --git a/gcc/testsuite/c-c++-common/vector-1.c b/gcc/testsuite/c-c++-common/vector-1.c new file mode 100644 index 00000000000..288dd1e924c --- /dev/null +++ b/gcc/testsuite/c-c++-common/vector-1.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "" } */ + +/* Check for application of ~ on vector types. */ + +#define vector __attribute__((vector_size(16) )) + +vector float a; +vector int a1; + +int f(void) +{ + a = ~a; /* { dg-error "" } */ + a1 = ~a1; +} diff --git a/gcc/testsuite/c-c++-common/vector-2.c b/gcc/testsuite/c-c++-common/vector-2.c new file mode 100644 index 00000000000..e9f40a35892 --- /dev/null +++ b/gcc/testsuite/c-c++-common/vector-2.c @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "" } */ + +/* Check for application of |, ^, and & on vector types. */ +#define vector __attribute__((vector_size(16) )) + +vector float a; +vector int a1; +vector float b; +vector int b1; + +int f(void) +{ + a = a | b; /* { dg-error "" } */ + a = a & b; /* { dg-error "" } */ + a = a ^ b; /* { dg-error "" } */ + a1 = a1 | b1; + a1 = a1 & b1; + a1 = a1 ^ b1; +} diff --git a/gcc/testsuite/c-c++-common/vector-3.c b/gcc/testsuite/c-c++-common/vector-3.c new file mode 100644 index 00000000000..0f5d3c41157 --- /dev/null +++ b/gcc/testsuite/c-c++-common/vector-3.c @@ -0,0 +1,8 @@ +/* { dg-do compile } */ + +/* Check that we error out when using vector_size on the bool type. */ + +#ifdef __cplusplus +#define _Bool bool +#endif +__attribute__((vector_size(16) )) _Bool a; /* { dg-error "" } */ diff --git a/gcc/testsuite/c-c++-common/vector-4.c b/gcc/testsuite/c-c++-common/vector-4.c new file mode 100644 index 00000000000..cc4d5041f63 --- /dev/null +++ b/gcc/testsuite/c-c++-common/vector-4.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-fno-common" { target { { hppa*-*-hpux* } && { ! lp64 } } } } */ +#define vector __attribute__((vector_size(4*sizeof(int)) )) + +vector int a, b, c; + + +/* Test that remainder works for vectors. */ +void f(void) +{ + a = b % c; +} diff --git a/gcc/testsuite/c-c++-common/vector-init-1.c b/gcc/testsuite/c-c++-common/vector-init-1.c new file mode 100644 index 00000000000..5baf9568840 --- /dev/null +++ b/gcc/testsuite/c-c++-common/vector-init-1.c @@ -0,0 +1,6 @@ +/* { dg-do compile } */ + +/* PR C/31499, test that the C front-end treats vectors like an array. */ + +#define vector __attribute__((__vector_size__(4*sizeof(int)) )) +vector signed int v1[]={0,1,2,3,4,5,6,7}; diff --git a/gcc/testsuite/c-c++-common/vector-init-2.c b/gcc/testsuite/c-c++-common/vector-init-2.c new file mode 100644 index 00000000000..6527f495d81 --- /dev/null +++ b/gcc/testsuite/c-c++-common/vector-init-2.c @@ -0,0 +1,25 @@ +/* { dg-do run } */ + +/* PR C/31499, test that the C front-end treats vectors like an array + and that it works at runtime. */ + +#define vector __attribute__((__vector_size__(4*sizeof(int)) )) +vector signed int v1[]={0,1,2,3,4,5,6,7}; + + +int main(void) +{ + int i; + for (i = 0; i < sizeof(v1)/sizeof(v1[0]); i++) + { + vector int t = v1[i]; + int *d = (int*)&t; + int j; + for (j = 0; j < 4; j++) + { + if (d[j] != i * 4 + j) + __builtin_abort (); + } + } + return 0; +} \ No newline at end of file diff --git a/gcc/testsuite/c-c++-common/vector-subscript-1.c b/gcc/testsuite/c-c++-common/vector-subscript-1.c new file mode 100644 index 00000000000..c18b7b674ab --- /dev/null +++ b/gcc/testsuite/c-c++-common/vector-subscript-1.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-w" } */ + +#define vector __attribute__((vector_size(16) )) +/* Check that vector[index] works and index[vector] is rejected. */ + +float vf(vector float a) +{ + return 0[a]; /* { dg-error "subscripted value is neither array nor pointer nor vector|invalid types .* for array subscript" } */ +} + + +float fv(vector float a) +{ + return a[0]; +} diff --git a/gcc/testsuite/c-c++-common/vector-subscript-2.c b/gcc/testsuite/c-c++-common/vector-subscript-2.c new file mode 100644 index 00000000000..84d55b91d20 --- /dev/null +++ b/gcc/testsuite/c-c++-common/vector-subscript-2.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ + +/* Check that subscripting of vectors work with register storage class decls. */ + +#define vector __attribute__((vector_size(16) )) + + +float vf(int i) +{ + register vector float a; + return a[0]; +} diff --git a/gcc/testsuite/c-c++-common/vector-subscript-3.c b/gcc/testsuite/c-c++-common/vector-subscript-3.c new file mode 100644 index 00000000000..22cd089adee --- /dev/null +++ b/gcc/testsuite/c-c++-common/vector-subscript-3.c @@ -0,0 +1,18 @@ +/* Check the case when index is out of bound */ +/* { dg-do compile } */ +/* { dg-options "-Warray-bounds" } */ + +#define vector __attribute__((vector_size(16) )) + + +int test0(void) +{ + vector int a; + return a[10]; /* { dg-warning "index value is out of bound" } */ +} + +int test1(void) +{ + vector int a; + return a[-1]; /* { dg-warning "index value is out of bound" } */ +} diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-51314.C b/gcc/testsuite/g++.dg/cpp0x/vt-51314.C new file mode 100644 index 00000000000..9f8c646336e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-51314.C @@ -0,0 +1,14 @@ +// { dg-options "-std=c++11 -pedantic-errors" } +// { dg-prune-output "invalid" } + +templatestruct A{}; +templatevoid f(U...){ + A x; // { dg-error "surrounded by parentheses" } +} + + +template struct Indices; +template struct Next_increasing_indices; +template struct Next_increasing_indices > { + typedef Indices type; // { dg-error "surrounded by parentheses" } +}; diff --git a/gcc/testsuite/gcc.dg/vector-1.c b/gcc/testsuite/gcc.dg/vector-1.c deleted file mode 100644 index 288dd1e924c..00000000000 --- a/gcc/testsuite/gcc.dg/vector-1.c +++ /dev/null @@ -1,15 +0,0 @@ -/* { dg-do compile } */ -/* { dg-options "" } */ - -/* Check for application of ~ on vector types. */ - -#define vector __attribute__((vector_size(16) )) - -vector float a; -vector int a1; - -int f(void) -{ - a = ~a; /* { dg-error "" } */ - a1 = ~a1; -} diff --git a/gcc/testsuite/gcc.dg/vector-2.c b/gcc/testsuite/gcc.dg/vector-2.c deleted file mode 100644 index 5f9f9561d7f..00000000000 --- a/gcc/testsuite/gcc.dg/vector-2.c +++ /dev/null @@ -1,21 +0,0 @@ -/* { dg-do compile } */ -/* { dg-options "" } */ - -/* Check for application of |, ^, and & on vector types. */ -#define vector __attribute__((vector_size(16) )) - -vector float a; -vector int a1; -vector float b; -vector int b1; - -int f(void) -{ - a = a | b; /* { dg-error "" } */ - a = a & b; /* { dg-error "" } */ - a = a ^ b; /* { dg-error "" } */ - a1 = a1 | b1; - a1 = a1 & b1; - a1 = a1 ^ b1; -} - diff --git a/gcc/testsuite/gcc.dg/vector-3.c b/gcc/testsuite/gcc.dg/vector-3.c deleted file mode 100644 index 3f86698b83f..00000000000 --- a/gcc/testsuite/gcc.dg/vector-3.c +++ /dev/null @@ -1,5 +0,0 @@ -/* { dg-do compile } */ - -/* Check that we error out when using vector_size on the bool type. */ - -__attribute__((vector_size(16) )) _Bool a; /* { dg-error "" } */ diff --git a/gcc/testsuite/gcc.dg/vector-4.c b/gcc/testsuite/gcc.dg/vector-4.c deleted file mode 100644 index cc4d5041f63..00000000000 --- a/gcc/testsuite/gcc.dg/vector-4.c +++ /dev/null @@ -1,12 +0,0 @@ -/* { dg-do compile } */ -/* { dg-options "-fno-common" { target { { hppa*-*-hpux* } && { ! lp64 } } } } */ -#define vector __attribute__((vector_size(4*sizeof(int)) )) - -vector int a, b, c; - - -/* Test that remainder works for vectors. */ -void f(void) -{ - a = b % c; -} diff --git a/gcc/testsuite/gcc.dg/vector-init-1.c b/gcc/testsuite/gcc.dg/vector-init-1.c deleted file mode 100644 index 5baf9568840..00000000000 --- a/gcc/testsuite/gcc.dg/vector-init-1.c +++ /dev/null @@ -1,6 +0,0 @@ -/* { dg-do compile } */ - -/* PR C/31499, test that the C front-end treats vectors like an array. */ - -#define vector __attribute__((__vector_size__(4*sizeof(int)) )) -vector signed int v1[]={0,1,2,3,4,5,6,7}; diff --git a/gcc/testsuite/gcc.dg/vector-init-2.c b/gcc/testsuite/gcc.dg/vector-init-2.c deleted file mode 100644 index 6527f495d81..00000000000 --- a/gcc/testsuite/gcc.dg/vector-init-2.c +++ /dev/null @@ -1,25 +0,0 @@ -/* { dg-do run } */ - -/* PR C/31499, test that the C front-end treats vectors like an array - and that it works at runtime. */ - -#define vector __attribute__((__vector_size__(4*sizeof(int)) )) -vector signed int v1[]={0,1,2,3,4,5,6,7}; - - -int main(void) -{ - int i; - for (i = 0; i < sizeof(v1)/sizeof(v1[0]); i++) - { - vector int t = v1[i]; - int *d = (int*)&t; - int j; - for (j = 0; j < 4; j++) - { - if (d[j] != i * 4 + j) - __builtin_abort (); - } - } - return 0; -} \ No newline at end of file diff --git a/gcc/testsuite/gcc.dg/vector-subscript-1.c b/gcc/testsuite/gcc.dg/vector-subscript-1.c deleted file mode 100644 index 7cc50af999b..00000000000 --- a/gcc/testsuite/gcc.dg/vector-subscript-1.c +++ /dev/null @@ -1,17 +0,0 @@ -/* { dg-do compile } */ -/* { dg-options "-w" } */ - -#define vector __attribute__((vector_size(16) )) -/* Check that vector[index] works and index[vector] is rejected. */ - -float vf(vector float a) -{ - return 0[a]; /* { dg-error "subscripted value is neither array nor pointer nor vector" } */ -} - - -float fv(vector float a) -{ - return a[0]; -} - diff --git a/gcc/testsuite/gcc.dg/vector-subscript-2.c b/gcc/testsuite/gcc.dg/vector-subscript-2.c deleted file mode 100644 index 3a8d522ad42..00000000000 --- a/gcc/testsuite/gcc.dg/vector-subscript-2.c +++ /dev/null @@ -1,13 +0,0 @@ -/* { dg-do compile } */ - -/* Check that subscripting of vectors work with register storage class decls. */ - -#define vector __attribute__((vector_size(16) )) - - -float vf(int i) -{ - register vector float a; - return a[0]; -} - diff --git a/gcc/testsuite/gcc.dg/vector-subscript-3.c b/gcc/testsuite/gcc.dg/vector-subscript-3.c deleted file mode 100644 index 55ed2b37025..00000000000 --- a/gcc/testsuite/gcc.dg/vector-subscript-3.c +++ /dev/null @@ -1,19 +0,0 @@ -/* Check the case when index is out of bound */ -/* { dg-do compile } */ -/* { dg-options "-Warray-bounds" } */ - -#define vector __attribute__((vector_size(16) )) - - -int test0(void) -{ - vector int a; - return a[10]; /* { dg-warning "index value is out of bound" } */ -} - -int test1(void) -{ - vector int a; - return a[-1]; /* { dg-warning "index value is out of bound" } */ -} -