1 /* { dg-do compile } */
2 /* { dg-options "-O2 -fcompare-debug -w" } */
3 
4 typedef union tree_node *tree;
5 typedef unsigned int source_location;
6 enum tree_code
7 {
8   MINUS_EXPR,
9   MULT_EXPR,
10 };
11 struct tree_omp_clause
12 {
13   union omp_clause_subcode
14   {
15     enum tree_code reduction_code;
16   } subcode;
17 };
18 union tree_node
19 {
20   struct tree_omp_clause omp_clause;
21 };
22 enum tree_index
23 {
24   TI_ERROR_MARK,
25 };
26 typedef struct
27 {
28   unsigned allocatable:1;
29   unsigned dimension:1;
30   unsigned codimension:1;
31   unsigned external:1;
32   unsigned optional:1;
33   unsigned pointer:1;
34   unsigned contiguous:1;
35   unsigned referenced:1;
36 } symbol_attribute;
37 typedef unsigned int gfc_char_t;
38 typedef struct gfc_linebuf
39 {
40   source_location location;
41 } gfc_linebuf;
42 typedef struct
43 {
44   gfc_char_t *nextc;
45   gfc_linebuf *lb;
46 } locus;
47 typedef struct
48 {
49   struct gfc_symbol *sym;
50   struct gfc_namelist *next;
51 } gfc_namelist;
52 enum
53 {
54   OMP_LIST_PLUS,
55   OMP_LIST_REDUCTION_FIRST = OMP_LIST_PLUS,
56   OMP_LIST_MULT,
57   OMP_LIST_SUB,
58   OMP_LIST_NUM
59 };
60 typedef struct gfc_omp_clauses
61 {
62   gfc_namelist *lists[OMP_LIST_NUM];
63 } gfc_omp_clauses;
64 typedef struct gfc_symbol
65 {
66   symbol_attribute attr;
67 } gfc_symbol;
68 typedef struct gfc_code
69 {
70   locus loc;
71   union
72   {
73     gfc_omp_clauses *omp_clauses;
74   } ext;
75 } gfc_code;
76 typedef struct
77 {
78 } stmtblock_t;
79 
80 static tree
gfc_trans_omp_reduction_list(gfc_namelist * namelist,tree list,enum tree_code reduction_code,locus where)81 gfc_trans_omp_reduction_list (gfc_namelist * namelist, tree list,
82 			      enum tree_code reduction_code, locus where)
83 {
84   for (; namelist != ((void *) 0); namelist = namelist->next)
85     if (namelist->sym->attr.referenced)
86       {
87 	tree node = build_omp_clause (where.lb->location);
88 	node->omp_clause.subcode.reduction_code = reduction_code;
89 	gfc_trans_omp_array_reduction (namelist->sym, where);
90       }
91 }
92 
93 static tree
gfc_trans_omp_clauses(stmtblock_t * block,gfc_omp_clauses * clauses,locus where)94 gfc_trans_omp_clauses (stmtblock_t * block, gfc_omp_clauses * clauses,
95 		       locus where)
96 {
97   tree omp_clauses = (tree) ((void *) 0);
98   int list;
99   for (list = 0; list < OMP_LIST_NUM; list++)
100     {
101       gfc_namelist *n = clauses->lists[list];
102       enum tree_code reduction_code;
103       if (n == ((void *) 0))
104 	continue;
105       switch (list)
106 	{
107 	case OMP_LIST_MULT:
108 	  reduction_code = MULT_EXPR;
109 	  break;
110 	case OMP_LIST_SUB:
111 	  reduction_code = MINUS_EXPR;
112 	}
113       gfc_trans_omp_reduction_list (n, omp_clauses, reduction_code, where);
114     }
115 }
116 
117 void
gfc_trans_omp_parallel_workshare(gfc_code * code)118 gfc_trans_omp_parallel_workshare (gfc_code * code)
119 {
120   stmtblock_t block;
121   gfc_trans_omp_clauses (&block, code->ext.omp_clauses, code->loc);
122 }
123