https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68939

            Bug ID: 68939
           Summary: ICE or wrong code with OpenMP privatization of
                    reference to VLAs
           Product: gcc
           Version: 6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jakub at gcc dot gnu.org
  Target Milestone: ---

int main ()
{
  int y = 6;
  int a[y - 2];
  int (&c)[y - 2] = a;
  c[0] = 111;

  #pragma omp target private (c)
  c[0] = 222;

  return 0;
}

results in wrong-code being generated (use of uninitialized variable in the
outlined region for determining the size of the private c size), and in ICE
with say:
int main ()
{
  int y = 6;
  int a[y - 2];
  int (&c)[y - 2] = a;
  c[0] = 111;

  #pragma omp parallel private (c)
  #pragma omp single
    c[0] = 222;
  return 0;
}
Following is also wrong-code.
int main ()
{
  int y = 6;
  int a[y - 2];
  typedef int T[y - 2];
  T &c = a;
  c[0] = 111;

  #pragma omp target private (c)
  c[0] = 222;

  return 0;
}

I believe the problem is because of some Ada mess the gimplifier no longer
recurses in gimplify_type_sizes on REFERENCE_TYPE.  Well, for all we care, it
would be enough to handle the toplevel REFERENCE_TYPE and nothing else.
But, if we can't change gimplify_type_sizes because of Ada, perhaps we should
tweak the C++ FE so that it arranges to emit a DECL_EXPR with a dummy TYPE_DECL
so that the referenced type sizes are gimplified?

Reply via email to