https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86243
Bug ID: 86243 Summary: unknown attributes causing hard error Product: gcc Version: 7.3.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: h2+bugs at fsfe dot org Target Milestone: --- The following code (based on http://open-std.org/JTC1/SC22/WG21/docs/papers/2017/p0479r1.html) int main() { if (1 == 2) [[unlikely]] throw int{}; return 2; } produces an error: % g++7 -std=c++17 test.cpp test.cpp: In function 'int main()': test.cpp:3:18: error: expected identifier before '[' token if (1 == 2) [[unlikely]] ^ test.cpp: In lambda function: test.cpp:4:9: error: expected '{' before 'throw' throw int{}; ^~~~~ test.cpp: In function 'int main()': test.cpp:4:9: error: expected ';' before 'throw' This strongly looks like a bug. If one encloses the if-block in braces, I instead get a warning: int main() { if (1 == 2) [[unlikely]] { throw int{}; } return 2; } results in: % g++7 -std=c++17 test.cpp test.cpp: In function 'int main()': test.cpp:3:17: warning: attributes at the beginning of statement are ignored [-Wattributes] if (1 == 2) [[unlikely]] ^ Note that I am not even setting -Wall or -Wextra. Even then I would think that unknown attributes should just be silently ignored as suggested by the standard, or not? Thanks for your help! Tested versions: g++7 (FreeBSD Ports Collection) 7.3.1 20180531 g++8 (FreeBSD Ports Collection) 8.1.1 20180608 g++9 (FreeBSD Ports Collection) 9.0.0 20180603 (experimental)