On Thu, Oct 22, 2015 at 07:47:01AM -0700, Cesar Philippidis wrote:
> > But it is unclear from the parsing what from these is allowed:
>
> int v, w;
> ...
> gang(26) // equivalent to gang(num:26)
> gang(v) // gang(num:v)
> vector(length: 16) // vector(length: 16)
> vector(length: v) // vector(length: v)
> vector(16) // vector(length: 16)
> vector(v) // vector(length: v)
> worker(num: 16) // worker(num: 16)
> worker(num: v) // worker(num: 16)
> worker(16) // worker(num: 16)
> worker(v) // worker(num: 16)
> gang(16, 24) // technically gang(num:16, num:24) is acceptable but it
> // should be an error
> gang(v, w) // likewise
> gang(static: 16, num: 5) // gang(static: 16, num: 5)
> gang(static: v, num: w) // gang(static: v, num: w)
> gang(num: 5, static: 4) // gang(num: 5, static: 4)
> gang(num: v, static: w) // gang(num: v, static: w)
>
> Also note that the static argument can accept '*'.
>
> > and if the length: or num: part is really optional, then
> > int length, num;
> > vector(length)
> > worker(num)
> > gang(num, static: 6)
> > gang(static: 5, num)
> > should be also accepted (or subset thereof?).
>
> Interesting question. The spec is unclear. It defines gang, worker and
> vector as follows in section 2.7 in the OpenACC 2.0a spec:
>
> gang [( gang-arg-list )]
> worker [( [num:] int-expr )]
> vector [( [length:] int-expr )]
>
> where gang-arg is one of:
>
> [num:] int-expr
> static: size-expr
>
> and gang-arg-list may have at most one num and one static argument,
> and where size-expr is one of:
>
> *
> int-expr
>
> So I've interpreted that as a requirement that length and num must be
> followed by an int-expr, whatever that is.
My reading of the above is that
vector(length)
is equivalent to
vector(length: length)
and
worker(num)
is equivalent to
vector(num: num)
etc. Basically, neither length nor num aren't reserved identifiers,
so you can use them for variable names, and if
vector(v) is equivalent to vector(length: v), then
vector(length) should be equivalent to vector(length:length)
or
vector(length + 1) should be equivalent to vector(length: length+1)
static is a keyword that can't start an integral expression, so I guess
it is fine if you issue an expected : diagnostics after it.
In any case, please add a testcase (both C and C++) which covers all these
allowed variants (ideally one testcase) and rejected variants (another
testcase with dg-error).
This is still an easy case, as even the C FE has 2 tokens lookup.
E.g. for OpenMP map clause where
map (always, tofrom: x)
means one thing and
map (always, tofrom, y)
another one (map (tofrom: always, tofrom, y))
I had to do quite ugly things to get around this.
Jakub