Hi Julian!

On Fri, 28 Sep 2018 14:17:42 +0100, Julian Brown <jul...@codesourcery.com> 
wrote:
> On Wed, 26 Sep 2018 14:08:37 -0700
> Cesar Philippidis <ce...@codesourcery.com> wrote:
> 
> > On 09/26/2018 12:50 PM, Joseph Myers wrote:
> > > On Wed, 26 Sep 2018, Cesar Philippidis wrote:
> > >   
> > >> Attached is an old patch which updated the C and C++ FEs to use
> > >> %<)%> for the right ')' symbol. It's mostly a cosmetic change. All
> > >> of the changes are self-contained to the OpenACC code path.  
> > > 
> > > Why is the "before ')'" included in the call to c_parser_error at
> > > all? c_parser_error calls c_parse_error which adds its own " before
> > > " and token description or expansion, so I'd expect the current
> > > error to result in a message ending in something of the form
> > > "before X before Y".  
> 
> > Julian, I need to start working on deep copy in OpenACC. Can you take
> > over this patch? The error handling code in the C FE needs to be
> > removed because it's dead.
> 
> I agree that the error-handling path in question in the C FE is dead.
> The difference is that in C, c_parser_oacc_wait_list parses the open
> parenthesis, the list and then the close parenthesis separately, and so
> a token sequence like:
> 
>    (1
> 
> will return an expression list of length 1. In the C++ FE rather, a
> cp_parser_parenthesized_expression_list is parsed all in one go, and if
> the input is not that well-formed sequence then NULL is returned (or a
> zero-length vector for an empty list).
> 
> But for C, it does not appear that c_parser_expr_list has a code path
> that can return a zero-length list at all.

In addition to your "(1" token sequence (and similar ones), I suppose
what these code paths in C and C++ are supposed to catch the "wait ()"
case (see line 149 of gcc/testsuite/c-c++-common/goacc/asyncwait-1.c).

I suppose in C, we do diagnose an "error: expected expression before ')'
token" in "c_parser_expr_list"/"c_parser_expr_no_commas", and then return
a list with an "error_mark_node", right?  (I have not verified that.)

> So, we can elide the
> diagnostic with no change to compiler behaviour.

In that case, yes.

> This patch does that,
> and also changes the C++ diagnostic, leading to errors being reported
> like:
> 
> diag.c: In function 'int main(int, char*)':
> diag.c:6:59: error: expected ')' before end of line
> 6 | #pragma acc parallel copyin (a[0:N]) copy (b[0:N]) wait (1
>   |                                                         ~ ^
>   |                                                           )
> diag.c:6:59: error: expected integer expression list before end of line 
> 
> Actually I'm not too sure how useful the second error line is. Maybe we
> should just remove it to improve consistency between C & C++?

Right, one single error diagnostic is enough.

But please make sure that the "wait ()" case continues to be diagnosed
correctly -- similarly to C, I suggest "expected expression before ')'
token" (or whatever is natural to the C++ parser), and then accordingly
tidy up that "dg-error" regular expression on line 149 of
gcc/testsuite/c-c++-common/goacc/asyncwait-1.c.

In C++, this is the case that: "args != NULL && args->length () == 0", I
suppose?  (I have not verified that.)


Oh, and next to "wait ()" please also add test coverage for "wait (".


Grüße
 Thomas


> The attached has been tested with offloading to nvptx and bootstrapped.
> OK?
> 
> Thanks,
> 
> Julian
> 
> 2018-XX-YY  James Norris  <jnor...@codesourcery.com>
>           Cesar Philippidis  <ce...@codesourcery.com>
>             Julian Brown  <jul...@codesourcery.com>
> 
>       gcc/c/
>       * c-parser.c (c_parser_oacc_wait_list): Remove dead diagnostic
>       code.
> 
>         gcc/cp/
>         * parser.c (cp_parser_oacc_wait_list): Change error message.
> 
>       gcc/testsuite/
>         * c-c++-common/goacc/asyncwait-1: Update expected errors.
> commit 3a59bdbccc3c2383c0056c74797d698c7d81dce2
> Author: Julian Brown <jul...@codesourcery.com>
> Date:   Fri Sep 28 05:52:55 2018 -0700
> 
>     OpenACC wait list diagnostic change
> 
> diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c
> index 1f173fc..92a8089 100644
> --- a/gcc/c/c-parser.c
> +++ b/gcc/c/c-parser.c
> @@ -11597,14 +11597,6 @@ c_parser_oacc_wait_list (c_parser *parser, 
> location_t clause_loc, tree list)
>      return list;
>  
>    args = c_parser_expr_list (parser, false, true, NULL, NULL, NULL, NULL);
> -
> -  if (args->length () == 0)
> -    {
> -      c_parser_error (parser, "expected integer expression before ')'");
> -      release_tree_vector (args);
> -      return list;
> -    }
> -
>    args_tree = build_tree_list_vec (args);
>  
>    for (t = args_tree; t; t = TREE_CHAIN (t))
> diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
> index 6696f17..43128e0 100644
> --- a/gcc/cp/parser.c
> +++ b/gcc/cp/parser.c
> @@ -32086,7 +32086,7 @@ cp_parser_oacc_wait_list (cp_parser *parser, 
> location_t clause_loc, tree list)
>  
>    if (args == NULL || args->length () == 0)
>      {
> -      cp_parser_error (parser, "expected integer expression before ')'");
> +      cp_parser_error (parser, "expected integer expression list");
>        if (args != NULL)
>       release_tree_vector (args);
>        return list;
> diff --git a/gcc/testsuite/c-c++-common/goacc/asyncwait-1.c 
> b/gcc/testsuite/c-c++-common/goacc/asyncwait-1.c
> index e1840af..2fc8948 100644
> --- a/gcc/testsuite/c-c++-common/goacc/asyncwait-1.c
> +++ b/gcc/testsuite/c-c++-common/goacc/asyncwait-1.c
> @@ -116,7 +116,7 @@ f (int N, float *a, float *b)
>      }
>  
>  #pragma acc parallel copyin (a[0:N]) copy (b[0:N]) wait (1 /* { dg-error 
> "expected '\\\)' before end of line" } */
> -    /* { dg-error "expected integer expression before '\\\)'" "" { target 
> c++ } .-1 } */
> +    /* { dg-error "expected integer expression list before" "" { target c++ 
> } .-1 } */
>      {
>          for (ii = 0; ii < N; ii++)
>              b[ii] = a[ii];
> @@ -171,7 +171,7 @@ f (int N, float *a, float *b)
>  #pragma acc wait (1,2,,) /* { dg-error "expected (primary-|)expression 
> before" } */
>  
>  #pragma acc wait (1 /* { dg-error "expected '\\\)' before end of line" } */
> -    /* { dg-error "expected integer expression before '\\\)'" "" { target 
> c++ } .-1 } */
> +    /* { dg-error "expected integer expression list before" "" { target c++ 
> } .-1 } */
>  
>  #pragma acc wait (1,*) /* { dg-error "expected (primary-|)expression before" 
> } */
>  

Reply via email to