/* { dg-do compile } */ /* { dg-options "-O3 -fcilkplus" } */ int *a, *b, *c; int something; void foo() { int i, j; // Declaration and initialization is allowed. #pragma simd for (int i=0; i < 1000; i++) a[i] = b[j]; // Empty initialization is not allowed. #pragma simd for (; i < 5; ++i) // { dg-error "expected iteration" } a[i] = i; // Empty condition is not allowed. #pragma simd for (int i=0; ; ++i) /* { dg-error "missing controlling" } */ a[i] = i; // Empty increment is not allowed. #pragma simd for (int i=0; i < 1234; ) /* { dg-error "missing increment" } */ a[i] = i*2; #pragma simd i = 5; /* { dg-error "for statement expected" } */ // Initialization variables must be either integral or pointer types. struct S { int i; }; #pragma simd for (struct S ss = { 0 }; ss.i <= 1000; ++ss.i) /* { dg-error "invalid controlling\|invalid type for iteration\|invalid increment" } */ a[ss.i] = b[ss.i]; #pragma simd for (float f=0.0; f < 15.0; ++f) /* { dg-error "invalid type" } */ a[(int)f] = (int) f; // Pointers are OK. #pragma simd for (int *i=c; i < &c[100]; ++i) *a = '5'; // Condition of '==' is not allowed. #pragma simd for (int i=j; i == 5; ++i) /* { dg-error "invalid controlling predicate" } */ a[i] = b[i]; // The LHS or RHS of the condition must be the initialization variable. #pragma simd for (int i=0; i+j < 1234; ++i) /* { dg-error "invalid controlling predicate" } */ a[i] = b[i]; // Likewise. #pragma simd for (int i=0; 1234 < i + j; ++i) /* { dg-error "invalid controlling predicate" } */ a[i] = b[i]; // Likewise, this is ok. #pragma simd for (int i=0; 1234 + j < i; ++i) a[i] = b[i]; // According to the CilkPlus forum, casts are not allowed, even if // they are no-ops. #pragma simd for (int i=0; (char)i < 1234; ++i) /* { dg-error "invalid controlling predicate" } */ a[i] = b[i]; #pragma simd for (int i=255; i != something; --i) a[i] = b[i]; #pragma simd for (int i=100; i != 5; i += something) a[i] = b[i]; // Increment must be on the induction variable. #pragma simd for (int i=0; i < 100; j++) /* { dg-error "invalid increment expression" } */ a[i] = b[i]; // Likewise. #pragma simd for (int i=0; i < 100; j = i + 1) /* { dg-error "invalid increment expression" } */ a[i] = b[i]; // Likewise. #pragma simd for (int i=0; i < 100; i = j + 1) /* { dg-error "invalid increment expression" } */ a[i] = b[i]; #pragma simd for (int i=0; i < 100; i = i + 5) a[i] = b[i]; // Only PLUS and MINUS increments are allowed. #pragma simd for (int i=0; i < 100; i *= 5) /* { dg-error "invalid increment expression" } */ a[i] = b[i]; #pragma simd for (int i=0; i < 100; i -= j) a[i] = b[i]; #pragma simd for (int i=0; i < 100; i = i + j) a[i] = b[i]; #pragma simd for (int i=0; i < 100; i = j + i) a[i] = b[i]; #pragma simd for (int i=0; i < 100; ++i, ++j) /* { dg-error "invalid increment expression" } */ a[i] = b[i]; #pragma simd for (int *point=0; point < b; ++point) *point = 555; #pragma simd for (int *point=0; point > b; --point) *point = 555; }