On Thu, Aug 7, 2014 at 2:33 PM, Zamyatin, Igor <igor.zamya...@intel.com> wrote: >> > >> > Changelog: >> > >> > gcc/c-family: >> > >> > 2014-07-31 Igor Zamyatin <igor.zamya...@intel.com> >> > >> > PR other/61962 >> > * array-notation-common.c (find_rank): Added handling for other >> > types of references. >> > >> > >> > gcc/testsuite: >> > >> > 2014-07-31 Igor Zamyatin <igor.zamya...@intel.com> >> > >> > PR other/61962 >> > * c-c++-common/cilk-plus/AN/pr61962.c: New test. >> > >> > >> > >> > diff --git a/gcc/c-family/array-notation-common.c >> > b/gcc/c-family/array-notation-common.c >> > index c010039..5db14c6 100644 >> > --- a/gcc/c-family/array-notation-common.c >> > +++ b/gcc/c-family/array-notation-common.c >> > @@ -221,7 +221,9 @@ find_rank (location_t loc, tree orig_expr, tree expr, >> bool ignore_builtin_fn, >> > current_rank++; >> > ii_tree = ARRAY_NOTATION_ARRAY (ii_tree); >> > } >> > - else if (TREE_CODE (ii_tree) == ARRAY_REF) >> > + else if (TREE_CODE (ii_tree) == ARRAY_REF >> > + || TREE_CODE (ii_tree) == INDIRECT_REF >> > + || TREE_CODE (ii_tree) == COMPONENT_REF) >> >> Maybe you want handled_component_p (ii_tree)? The above misses >> REALPART_EXPR, IMAGPART_EXRP, VIEW_CONVERT_EXPR and >> BIT_FIELD_REF. >> >> And I'm missing a >> >> else >> gcc_unreachable (); >> >> Richard. > > Like this (Changelog is the same, regtested on x86_64)?
Yes. Thanks, Richard. > diff --git a/gcc/c-family/array-notation-common.c > b/gcc/c-family/array-notation-common.c > index c010039..af3c3d5 100644 > --- a/gcc/c-family/array-notation-common.c > +++ b/gcc/c-family/array-notation-common.c > @@ -221,11 +221,15 @@ find_rank (location_t loc, tree orig_expr, tree expr, > bool ignore_builtin_fn, > current_rank++; > ii_tree = ARRAY_NOTATION_ARRAY (ii_tree); > } > - else if (TREE_CODE (ii_tree) == ARRAY_REF) > + else if (handled_component_p (ii_tree) > + || TREE_CODE (ii_tree) == INDIRECT_REF) > ii_tree = TREE_OPERAND (ii_tree, 0); > else if (TREE_CODE (ii_tree) == PARM_DECL > || TREE_CODE (ii_tree) == VAR_DECL) > break; > + else > + gcc_unreachable (); > + > } > if (*rank == 0) > /* In this case, all the expressions this function has encountered > thus > diff --git a/gcc/testsuite/c-c++-common/cilk-plus/AN/pr61962.c > b/gcc/testsuite/c-c++-common/cilk-plus/AN/pr61962.c > new file mode 100644 > index 0000000..08d4fe2 > --- /dev/null > +++ b/gcc/testsuite/c-c++-common/cilk-plus/AN/pr61962.c > @@ -0,0 +1,14 @@ > +/* PR other/61962 */ > +/* { dg-do compile } */ > +/* { dg-options "-fcilkplus" } */ > + > +struct FloatStruct > +{ > + float *f; > +}; > + > +/* Either SRC or DST must be a struct, otherwise the bug does not occur. */ > +void f (struct FloatStruct* dst, float *src, unsigned int length) > +{ > + dst->f[0:length] = src[0:length]; > +} > >> >> > ii_tree = TREE_OPERAND (ii_tree, 0); >> > else if (TREE_CODE (ii_tree) == PARM_DECL >> > || TREE_CODE (ii_tree) == VAR_DECL) diff --git >> > a/gcc/testsuite/c-c++-common/cilk-plus/AN/pr61962.c b/gcc/testsuite/c- >> c++-common/cilk-plus/AN/pr61962. >> > new file mode 100644 >> > index 0000000..08d4fe2 >> > --- /dev/null >> > +++ b/gcc/testsuite/c-c++-common/cilk-plus/AN/pr61962.c >> > @@ -0,0 +1,14 @@ >> > +/* PR other/61962 */ >> > +/* { dg-do compile } */ >> > +/* { dg-options "-fcilkplus" } */ >> > + >> > +struct FloatStruct >> > +{ >> > + float *f; >> > +}; >> > + >> > +/* Either SRC or DST must be a struct, otherwise the bug does not >> > +occur. */ void f (struct FloatStruct* dst, float *src, unsigned int >> > +length) { >> > + dst->f[0:length] = src[0:length]; }