[[gnu::nonstring]] should work on pointers too (#150974)

Clang's current implementation only works on array types, but GCC (which
is where we got this attribute) supports it on pointers as well as
arrays.

Fixes #150951

(cherry picked from commit 837b2d464ff16fe0d892dcf2827747c97dd5465e)
This commit is contained in:
Aaron Ballman 2025-07-28 11:53:33 -04:00 committed by Tobias Hieta
parent 7e51c08c82
commit 4ca9a4bb35
3 changed files with 14 additions and 6 deletions

View File

@ -9417,9 +9417,9 @@ def NonStringDocs : Documentation {
let Category = DocCatDecl;
let Content = [{
The ``nonstring`` attribute can be applied to the declaration of a variable or
a field whose type is a character array to specify that the character array is
not intended to behave like a null-terminated string. This will silence
diagnostics with code like:
a field whose type is a character pointer or character array to specify that
the buffer is not intended to behave like a null-terminated string. This will
silence diagnostics with code like:
.. code-block:: c

View File

@ -5011,10 +5011,10 @@ void Sema::AddModeAttr(Decl *D, const AttributeCommonInfo &CI,
static void handleNonStringAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
// This only applies to fields and variable declarations which have an array
// type.
// type or pointer type, with character elements.
QualType QT = cast<ValueDecl>(D)->getType();
if (!QT->isArrayType() ||
!QT->getBaseElementTypeUnsafe()->isAnyCharacterType()) {
if ((!QT->isArrayType() && !QT->isPointerType()) ||
!QT->getPointeeOrArrayElementType()->isAnyCharacterType()) {
S.Diag(D->getBeginLoc(), diag::warn_attribute_non_character_array)
<< AL << AL.isRegularKeywordAttribute() << QT << AL.getRange();
return;

View File

@ -229,3 +229,11 @@ struct Outer o2[] = {
}
}
};
// The attribute also works with a pointer type, not just an array type.
__attribute__((nonstring)) char *ptr1;
__attribute__((nonstring)) const unsigned char *ptr2;
struct GH150951 {
__attribute__((nonstring)) char *ptr1;
__attribute__((nonstring)) const unsigned char *ptr2;
};