diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b047dbff0f2..720c3ee0e73 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2019-12-23 Richard Sandiford + + * cvt.c (ocp_convert): Apply rvalue to the source of vector + conversions. + * typeck.c (build_reinterpret_cast_1): Likewise. + 2019-12-19 Marek Polacek PR c++/92745 - bogus error when initializing array of vectors. diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c index e922e4d9b89..9e29225cfbb 100644 --- a/gcc/cp/cvt.c +++ b/gcc/cp/cvt.c @@ -744,7 +744,7 @@ ocp_convert (tree type, tree expr, int convtype, int flags, else if (TREE_CODE (type) == COMPLEX_TYPE) return convert_to_complex_maybe_fold (type, e, dofold); else if (VECTOR_TYPE_P (type)) - return convert_to_vector (type, e); + return convert_to_vector (type, rvalue (e)); else if (TREE_CODE (e) == TARGET_EXPR) { /* Don't build a NOP_EXPR of class type. Instead, change the @@ -881,7 +881,7 @@ ocp_convert (tree type, tree expr, int convtype, int flags, in_vtype, type); return error_mark_node; } - return convert_to_vector (type, e); + return convert_to_vector (type, rvalue (e)); } if (code == REAL_TYPE || code == COMPLEX_TYPE) { diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 41ef8966f49..d2f4a001e50 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -7858,7 +7858,7 @@ build_reinterpret_cast_1 (location_t loc, tree type, tree expr, return build_nop_reinterpret (type, expr); } else if (gnu_vector_type_p (type)) - return convert_to_vector (type, expr); + return convert_to_vector (type, rvalue (expr)); else if (gnu_vector_type_p (intype) && INTEGRAL_OR_ENUMERATION_TYPE_P (type)) return convert_to_integer_nofold (type, expr); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e7cdf80e546..321d54b47fc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2019-12-23 Richard Sandiford + + * g++.dg/ext/vector39.C: New test. + 2019-12-21 Andrew Pinski PR testsuite/92998 diff --git a/gcc/testsuite/g++.dg/ext/vector39.C b/gcc/testsuite/g++.dg/ext/vector39.C new file mode 100644 index 00000000000..140784dfa52 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector39.C @@ -0,0 +1,96 @@ +// { dg-options "-flax-vector-conversions" } + +typedef unsigned char v16qi __attribute__((vector_size(16))); +typedef unsigned int v4si __attribute__((vector_size(16))); + +extern v4si normal_v4si; +extern const v4si const_v4si; +extern v4si *normal_v4si_ptr; +extern const v4si *const_v4si_ptr; +extern v4si &normal_v4si_ref; +extern const v4si &const_v4si_ref; + +extern v16qi normal_v16qi; +extern const v16qi const_v16qi; +extern v16qi *normal_v16qi_ptr; +extern const v16qi *const_v16qi_ptr; +extern v16qi &normal_v16qi_ref; +extern const v16qi &const_v16qi_ref; + +namespace nonconst_refs { + v16qi &ref_normal_v4si = normal_v4si; // { dg-error {cannot bind non-const lvalue} } + v16qi &ref_const_v4si = const_v4si; // { dg-error {cannot bind non-const lvalue} } + v16qi &ref_normal_v4si_ptr = *normal_v4si_ptr; // { dg-error {cannot bind non-const lvalue} } + v16qi &ref_const_v4si_ptr = *const_v4si_ptr; // { dg-error {cannot bind non-const lvalue} } + v16qi &ref_normal_v4si_ref = normal_v4si_ref; // { dg-error {cannot bind non-const lvalue} } + v16qi &ref_const_v4si_ref = const_v4si_ref; // { dg-error {cannot bind non-const lvalue} } + + v16qi &ref_normal_v16qi = normal_v16qi; + v16qi &ref_const_v16qi = const_v16qi; // { dg-error {discards qualifiers} } + v16qi &ref_normal_v16qi_ptr = *normal_v16qi_ptr; + v16qi &ref_const_v16qi_ptr = *const_v16qi_ptr; // { dg-error {discards qualifiers} } + v16qi &ref_normal_v16qi_ref = normal_v16qi_ref; + v16qi &ref_const_v16qi_ref = const_v16qi_ref; // { dg-error {discards qualifiers} } +} + +#if __cplusplus >= 201103L +namespace nonconst_rvalue_refs { + v16qi &&ref_normal_v4si = normal_v4si; + v16qi &&ref_const_v4si = const_v4si; + v16qi &&ref_normal_v4si_ptr = *normal_v4si_ptr; + v16qi &&ref_const_v4si_ptr = *const_v4si_ptr; + v16qi &&ref_normal_v4si_ref = normal_v4si_ref; + v16qi &&ref_const_v4si_ref = const_v4si_ref; + + v16qi &&ref_normal_v16qi = normal_v16qi; // { dg-error {cannot bind rvalue reference} "" { target c++11 } } + v16qi &&ref_const_v16qi = const_v16qi; // { dg-error {cannot bind rvalue reference} "" { target c++11 } } + v16qi &&ref_normal_v16qi_ptr = *normal_v16qi_ptr; // { dg-error {cannot bind rvalue reference} "" { target c++11 } } + v16qi &&ref_const_v16qi_ptr = *const_v16qi_ptr; // { dg-error {cannot bind rvalue reference} "" { target c++11 } } + v16qi &&ref_normal_v16qi_ref = normal_v16qi_ref; // { dg-error {cannot bind rvalue reference} "" { target c++11 } } + v16qi &&ref_const_v16qi_ref = const_v16qi_ref; // { dg-error {cannot bind rvalue reference} "" { target c++11 } } +} +#endif + +namespace const_refs { + const v16qi &ref_normal_v4si = normal_v4si; + const v16qi &ref_const_v4si = const_v4si; + const v16qi &ref_normal_v4si_ptr = *normal_v4si_ptr; + const v16qi &ref_const_v4si_ptr = *const_v4si_ptr; + const v16qi &ref_normal_v4si_ref = normal_v4si_ref; + const v16qi &ref_const_v4si_ref = const_v4si_ref; + + const v16qi &ref_normal_v16qi = normal_v16qi; + const v16qi &ref_const_v16qi = const_v16qi; + const v16qi &ref_normal_v16qi_ptr = *normal_v16qi_ptr; + const v16qi &ref_const_v16qi_ptr = *const_v16qi_ptr; + const v16qi &ref_normal_v16qi_ref = normal_v16qi_ref; + const v16qi &ref_const_v16qi_ref = const_v16qi_ref; +} + +#if __cplusplus >= 201103L +namespace const_rvalue_refs { + const v16qi &&ref_normal_v4si = normal_v4si; + const v16qi &&ref_const_v4si = const_v4si; + const v16qi &&ref_normal_v4si_ptr = *normal_v4si_ptr; + const v16qi &&ref_const_v4si_ptr = *const_v4si_ptr; + const v16qi &&ref_normal_v4si_ref = normal_v4si_ref; + const v16qi &&ref_const_v4si_ref = const_v4si_ref; + + const v16qi &&ref_normal_v16qi = normal_v16qi; // { dg-error {cannot bind rvalue reference} "" { target c++11 } } + const v16qi &&ref_const_v16qi = const_v16qi; // { dg-error {cannot bind rvalue reference} "" { target c++11 } } + const v16qi &&ref_normal_v16qi_ptr = *normal_v16qi_ptr; // { dg-error {cannot bind rvalue reference} "" { target c++11 } } + const v16qi &&ref_const_v16qi_ptr = *const_v16qi_ptr; // { dg-error {cannot bind rvalue reference} "" { target c++11 } } + const v16qi &&ref_normal_v16qi_ref = normal_v16qi_ref; // { dg-error {cannot bind rvalue reference} "" { target c++11 } } + const v16qi &&ref_const_v16qi_ref = const_v16qi_ref; // { dg-error {cannot bind rvalue reference} "" { target c++11 } } +} +#endif + +namespace rvalue_reinterpret_refs { + v16qi &ref_normal_v4si = reinterpret_cast(normal_v4si); // { dg-error {cannot bind non-const lvalue} } + v16qi &ref_const_v4si = reinterpret_cast(const_v4si); // { dg-error {cannot bind non-const lvalue} } +} + +namespace ref_reinterpret_refs { + v16qi &ref_normal_v4si = reinterpret_cast(normal_v4si); + v16qi &ref_const_v4si = reinterpret_cast(const_cast(const_v4si)); +}