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

            Bug ID: 101682
           Summary: gcc incorrectly rejects C2x attributes after
                    declaration-specifiers
           Product: gcc
           Version: 11.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: eggert at gnu dot org
  Target Milestone: ---

The grammar at the start of section 6.7 of the current C2x draft (N2596) says
that attribute specifiers may appear either before or after declaration
specifiers. Unfortunately, GCC rejects attribution specifiers after declaration
specifiers. For example, for this this source code:

extern [[nodiscard]] int f (void);
extern int [[nodiscard]] g (void);
int [[nodiscard]] h (void);
[[nodiscard]] extern int i (void);
[[nodiscard]] int j (void);

the command 'gcc -S t.c' rejects the first three lines even though they conform
to the draft standard. It allows only the last two lines. The incorrect GCC
output is:

t.c:1:1: warning: ‘nodiscard’ attribute ignored [-Wattributes]
    1 | extern [[nodiscard]] int f (void);
      | ^~~~~~
t.c:1:22: error: expected identifier or ‘(’ before ‘int’
    1 | extern [[nodiscard]] int f (void);
      |                      ^~~
t.c:2:1: warning: ‘nodiscard’ attribute ignored [-Wattributes]
    2 | extern int [[nodiscard]] g (void);
      | ^~~~~~
t.c:3:1: warning: ‘nodiscard’ attribute ignored [-Wattributes]
    3 | int [[nodiscard]] h (void);
      | ^~~

This is with GCC 11.2.0, which I built myself on an RHEL 8.4 x86-64 platform.

Reply via email to