re PR c++/70430 (Incorrect result for logical "and" operation with mixed vector and...
authorRichard Biener <rguenther@suse.de>
Thu, 31 Mar 2016 08:49:09 +0000 (08:49 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 31 Mar 2016 08:49:09 +0000 (08:49 +0000)
2016-03-31  Richard Biener  <rguenther@suse.de>

PR c++/70430
* typeck.c (cp_build_binary_op): Fix operand order of vector
conditional in truth op handling.

* g++.dg/ext/vector30.C: New testcase.

From-SVN: r234611

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/vector30.C [new file with mode: 0644]

index 91ad5ac341f3c4d8b745f4f5c672852f9b6f1aa9..96f02210aa91c42aaa96dbe6fcb8dc6211eca532 100644 (file)
@@ -1,3 +1,9 @@
+2016-03-31  Richard Biener  <rguenther@suse.de>
+
+       PR c++/70430
+       * typeck.c (cp_build_binary_op): Fix operand order of vector
+       conditional in truth op handling.
+
 2016-03-29  Jason Merrill  <jason@redhat.com>
 
        PR c++/70353
index 447006cb327456b87bdfcb092d131cd85ed2e276..9e61090f57bfa23f80fcddacd026a4efef5f0d4f 100644 (file)
@@ -4364,7 +4364,7 @@ cp_build_binary_op (location_t location,
            {
              tree m1 = build_all_ones_cst (TREE_TYPE (op0));
              tree z = build_zero_cst (TREE_TYPE (op0));
-             op1 = build_conditional_expr (location, op1, z, m1, complain);
+             op1 = build_conditional_expr (location, op1, m1, z, complain);
            }
          else if (!COMPARISON_CLASS_P (op1))
            op1 = cp_build_binary_op (EXPR_LOCATION (op1), NE_EXPR, op1,
index 8e2bd73417688bb83af9f19591b01f564d144b75..7df13570e3dcbc42d8a97cef5facd512b215a1ca 100644 (file)
@@ -1,3 +1,8 @@
+2016-03-31  Richard Biener  <rguenther@suse.de>
+
+       PR c++/70430
+       * g++.dg/ext/vector30.C: New testcase.
+
 2016-03-30  Dominique d'Humieres  <dominiq@lps.ens.fr>
            Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
diff --git a/gcc/testsuite/g++.dg/ext/vector30.C b/gcc/testsuite/g++.dg/ext/vector30.C
new file mode 100644 (file)
index 0000000..68326e3
--- /dev/null
@@ -0,0 +1,15 @@
+// PR c++/70430
+// { dg-do run }
+extern "C" void abort (void);
+typedef int v4si __attribute__ ((vector_size (16)));
+int main()
+{
+  v4si b = {1,0,-1,2}, c;
+  c = b && 1;
+  if (c[0] != -1 || c[1] != 0 || c[2] != -1 || c[3] != -1)
+    abort ();
+  c = b && 0;
+  if (c[0] != 0 || c[1] != 0 || c[2] != 0 || c[3] != 0)
+    abort ();
+  return 0;
+}