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

            Bug ID: 92648
           Summary: Handling of unknown attributes
           Product: gcc
           Version: 10.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: ---

It is still unclear how exactly OpenMP attributes will look like (at least most
of them), but it seems the C++ FE (unlike the C FE) attempts to parse the
arguments as expression list instead of skipping it.
Consider:
void
foo (int x, int y, int z, int u)
{
  [[omp::for (linear(x, y: 2), private(z), reduction(+:u))]];
}
ud.C:4:26: error: expected ‘)’ before ‘:’ token
    4 |   [[omp::for (linear(x, y: 2), private(z), reduction(+:u))]];
      |                     ~    ^
      |                          )
ud.C:4:15: error: ‘linear’ was not declared in this scope
    4 |   [[omp::for (linear(x, y: 2), private(z), reduction(+:u))]];
      |               ^~~~~~
ud.C:4:32: error: expected primary-expression before ‘private’
    4 |   [[omp::for (linear(x, y: 2), private(z), reduction(+:u))]];
      |                                ^~~~~~~
ud.C:4:55: error: expected primary-expression before ‘:’ token
    4 |   [[omp::for (linear(x, y: 2), private(z), reduction(+:u))]];
      |                                                       ^
ud.C:4:44: error: ‘reduction’ was not declared in this scope
    4 |   [[omp::for (linear(x, y: 2), private(z), reduction(+:u))]];
      |                                            ^~~~~~~~~
ud.C:4:3: warning: attributes at the beginning of statement are ignored
[-Wattributes]
    4 |   [[omp::for (linear(x, y: 2), private(z), reduction(+:u))]];
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Compare that to C:
ud.C: In function ‘foo’:
ud.C:4:3: warning: ‘for’ attribute ignored [-Wattributes]
    4 |   [[omp::for (linear(x, y: 2), private(z), reduction(+:u))]];
      |   ^
or clang++:
ud.C:4:5: warning: unknown attribute 'for' ignored [-Wunknown-attributes]
  [[omp::for (linear(x, y: 2), private(z), reduction(+:u))]];
    ^
1 warning generated.

I think the syntax just says that the arguments are balanced token sequences,
but if the compiler doesn't know the attribute, it can't assume anything
further.

Reply via email to