On 2/5/20 5:44 AM, Jakub Jelinek wrote:
Hi!
In C++ we weren't calling mark_exp_read on the __builtin_convertvector first
argument. I guess it could misbehave even with lambda implicit captures.
Fixed by calling decay_conversion on the argument, we use the argument as
rvalue so we want the standard lvalue to rvalue conversions, but as the
argument must be a vector type, e.g. integral promotions aren't really
needed.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK.
2020-02-05 Jakub Jelinek <ja...@redhat.com>
PR c++/93557
* semantics.c (cp_build_vec_convert): Call decay_conversion on arg
prior to passing it to c_build_vec_convert.
* c-c++-common/Wunused-var-17.c: New test.
--- gcc/cp/semantics.c.jj 2020-02-01 10:01:36.581701153 +0100
+++ gcc/cp/semantics.c 2020-02-04 14:38:43.618588979 +0100
@@ -10389,7 +10389,8 @@ cp_build_vec_convert (tree arg, location
tree ret = NULL_TREE;
if (!type_dependent_expression_p (arg) && !dependent_type_p (type))
- ret = c_build_vec_convert (cp_expr_loc_or_input_loc (arg), arg,
+ ret = c_build_vec_convert (cp_expr_loc_or_input_loc (arg),
+ decay_conversion (arg, complain),
loc, type, (complain & tf_error) != 0);
if (!processing_template_decl)
--- gcc/testsuite/c-c++-common/Wunused-var-17.c.jj 2020-02-04
14:42:33.648152691 +0100
+++ gcc/testsuite/c-c++-common/Wunused-var-17.c 2020-02-04 14:41:46.092862987
+0100
@@ -0,0 +1,19 @@
+/* PR c++/93557 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wunused-but-set-variable" } */
+
+typedef int VI __attribute__((vector_size (sizeof (int) * 4)));
+typedef float VF __attribute__((vector_size (sizeof (float) * 4)));
+
+void
+foo (VI *p, VF *q)
+{
+ VI a = (VI) { 1, 2, 3, 4 }; /* { dg-bogus "set but not
used" } */
+ q[0] = __builtin_convertvector (a, VF);
+ VI b = p[1]; /* { dg-bogus "set but not
used" } */
+ q[1] = __builtin_convertvector (b, VF);
+ VF c = (VF) { 5.0f, 6.0f, 7.0f, 8.0f }; /* { dg-bogus "set but not
used" } */
+ p[2] = __builtin_convertvector (c, VI);
+ VF d = q[3]; /* { dg-bogus "set but not
used" } */
+ p[3] = __builtin_convertvector (d, VI);
+}
Jakub