(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
pr46571.c
       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
      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
      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
     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  }