On 10/23/2015 01:31 PM, Jakub Jelinek wrote:
> On Fri, Oct 23, 2015 at 01:17:07PM -0700, Cesar Philippidis wrote:
>> Good idea, thanks. This patch also corrects the problems parsing weird
>> combinations of num, static and length arguments that you mentioned
>> elsewhere.
>>
>> Is this OK for trunk?
> 
> I'd strongly prefer to see always patches accompanied by testcases.
> 
>> +      loc = c_parser_peek_token (parser)->location;
>> +      op_to_parse = &op0;
>> +
>> +      if ((c_parser_next_token_is (parser, CPP_NAME)
>> +           || c_parser_next_token_is (parser, CPP_KEYWORD))
>> +          && c_parser_peek_2nd_token (parser)->type == CPP_COLON)
>> +        {
>> +          tree name_kind = c_parser_peek_token (parser)->value;
>> +          const char *p = IDENTIFIER_POINTER (name_kind);
> 
> I think I'd prefer not to peek at this at all if it is RID_STATIC,
> so perhaps just have (and name_kind is weird):
>             else
>               {
>                 tree val = c_parser_peek_token (parser)->value;
>                 if (strcmp (id, IDENTIFIER_POINTER (val)) == 0)
>                   {
>                     c_parser_consume_token (parser);  /* id  */
>                     c_parser_consume_token (parser);  /* ':'  */
>                   }
>                 else
>                   {
> ...
>                   }
>               }
> ?

My plan over here was try and catch any arguments with a colon. But that
fell threw because...

>> +          if (kind == OMP_CLAUSE_GANG
>> +              && c_parser_next_token_is_keyword (parser, RID_STATIC))
>> +            {
>> +              c_parser_consume_token (parser); /* static  */
>> +              c_parser_consume_token (parser); /* ':'  */
>> +
>> +              op_to_parse = &op1;
>> +              if (c_parser_next_token_is (parser, CPP_MULT))
>> +                {
>> +                  c_parser_consume_token (parser);
>> +                  *op_to_parse = integer_minus_one_node;
>> +
>> +                  /* Consume a comma if present.  */
>> +                  if (c_parser_next_token_is (parser, CPP_COMMA))
>> +                    c_parser_consume_token (parser);
> 
> Doesn't this mean that you happily parse
> gang (static: * abc)
> or
> gang (static:*num:1)
> etc.?  I'd say the comma should be non-optional (i.e. either accept
> CPP_COMMA, or CPP_CLOSE_PARENT, but nothing else) in that case (at least,
> when in OpenMP grammar something is *-list it is meant to be comma
> separated).

I'm not handling commas properly. My next patch is going to handle the
static argument separately.

>> +      /* Consume a comma if present.  */
>> +      if (c_parser_next_token_is (parser, CPP_COMMA))
>> +        c_parser_consume_token (parser);
> 
> Similarly this means
> gang (num: 5 static: *)
> is accepted.  If it is valid, then again it should have testsuite coverage.

I'll include a test case for this with the next patch.

Cesar

Reply via email to