aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/c-c++-common/cilk-plus/PS/for1.c
blob: 3b678952c7284ae8e2d73308197aa0c28b9a227a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/* { 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;
}