summaryrefslogtreecommitdiff
path: root/gcc/testsuite/c-c++-common/cilk-plus/PS/for1.c
blob: 04773d127556d10149419bd9079d6e9e6b3e371a (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
133
134
135
136
137
138
139
/* { 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 decl" }
    a[i] = i;

  // Empty condition is not allowed.
#pragma simd
  for (int i=0; ; ++i)		/* { dg-error "missing condition" } */
    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 "initialization variable must be of integral or pointer type" } */
    a[ss.i] = b[ss.i];

  #pragma simd
  for (float f=0.0; f < 15.0; ++f) /* { dg-error "must be of integral" } */
    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];

  // This condition gets folded into "i != 0" by
  // c_parser_cilk_for_statement().  This is allowed as per the "!="
  // allowance above.
#pragma simd
  for (int i=100; i; --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;
}