if (!t1 || !t2)
return false;
- for (code1 = TREE_CODE (t1);
- CONVERT_EXPR_CODE_P (code1)
- || code1 == NON_LVALUE_EXPR;
+ for (code1 = TREE_CODE (t1); code1 == NON_LVALUE_EXPR;
code1 = TREE_CODE (t1))
t1 = TREE_OPERAND (t1, 0);
- for (code2 = TREE_CODE (t2);
- CONVERT_EXPR_CODE_P (code2)
- || code2 == NON_LVALUE_EXPR;
+ for (code2 = TREE_CODE (t2); code2 == NON_LVALUE_EXPR;
code2 = TREE_CODE (t2))
t2 = TREE_OPERAND (t2, 0);
if (code1 != code2)
return false;
+ if (CONSTANT_CLASS_P (t1) && !comptypes (TREE_TYPE (t1), TREE_TYPE (t2)))
+ return false;
+
switch (code1)
{
case INTEGER_CST:
return true;
}
+ CASE_CONVERT:
+ if (!comptypes (TREE_TYPE (t1), TREE_TYPE (t2)))
+ return false;
+ break;
+
default:
break;
}
--- /dev/null
+/* PR c/106981 */
+/* { dg-do compile } */
+
+void
+foo (int a, double *b, double *c, double *d, long long e)
+{
+#pragma omp atomic capture
+ c[a] = d[((int) (e / 10 + 1))] = b[a] + d[((int) e / 10 + 1)]; /* { dg-error "invalid form" } */
+}
--- /dev/null
+/* PR c/106981 */
+
+int
+main ()
+{
+ int a[0x101];
+ unsigned int b = 0x100;
+ if ((unsigned char) b || (unsigned short) b != 0x100)
+ return 0;
+ a[0] = 0;
+ a[0x100] = 42;
+ #pragma omp atomic update
+ a[(unsigned char) b] = a[(unsigned short) b] + a[(unsigned char) b];
+ #pragma omp atomic update
+ a[(unsigned char) b] = a[(unsigned char) b] + a[(unsigned short) b];
+ if (a[0] != 84 || a[0x100] != 42)
+ __builtin_abort ();
+ return 0;
+}