This is an archive of the discontinued LLVM Phabricator instance.

Fix an accepts-invalid issue with [[]] attributes in the type position in C
ClosedPublic

Authored by aaron.ballman on Jul 1 2021, 7:54 AM.

Details

Reviewers
erichkeane
rsmith
Summary

A user reported an issue to me via email that Clang was accepting some code that GCC was rejecting. After investigation, it turned out to be a general problem of us failing to properly reject attributes written in the type position in C when they don't apply to types. The root cause was a terminology issue -- we sometimes use "CXX11Attr" to mean [[]] in C++11 mode and sometimes [[]] in general -- and this came back to bite us because in this particular case, it really meant [[]] in C++ mode.

I fixed the issue by introducing a new function AttributeCommonInfo::isStandardAttributeSyntax() to represent [[]] in either C or C++ mode. I toyed with isDoubleSquareBracketAttributeSyntax() instead, but because of attributes like alignas, it didn't feel like a particularly good match.

This fix pointed out that we've had the issue in some of our existing tests, which have all been corrected. This resolves https://bugs.llvm.org/show_bug.cgi?id=50954.

Diff Detail

Event Timeline

aaron.ballman requested review of this revision.Jul 1 2021, 7:54 AM
aaron.ballman created this revision.
Herald added a project: Restricted Project. · View Herald TranscriptJul 1 2021, 7:54 AM

I guess I don't see how this patch 'works' here. I don't see anything preventing the type-location in C, but not C++?

clang/test/Sema/attr-c2x.c
14–15

Do we have a test to validate that the previous syntax isn't allowed? I don't see any being added, but I might be missing it.

I guess I don't see how this patch 'works' here. I don't see anything preventing the type-location in C, but not C++?

See comments in the code, I left one where the interesting bit is.

clang/lib/Sema/SemaType.cpp
8091

This bit right here is the important bit for diagnosing in the type position (similar changes are fixing similar issues). isCXX11Attribute() tests that the attribute syntax is AS_CXX11 exclusively and ignores that there's a AS_C2x -- the fix is to check for either parsed syntax.

clang/test/Sema/attr-c2x.c
14–15

It looks like we don't have any coverage that you can't apply overloadable to a type, I can add it.

Added a test that overloadable should fail when in the type position.

erichkeane accepted this revision.Jul 1 2021, 8:34 AM
This revision is now accepted and ready to land.Jul 1 2021, 8:34 AM
aaron.ballman closed this revision.Jul 1 2021, 9:42 AM

Thanks for the review, Erich! I've committed in bc7cc2074b7b7043e05cb46346f1368eb4ae9949