[clang] 27ea7d0 - Fix inconsistent availability attribute message string literal check.

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Tue Dec 8 09:34:55 PST 2020


Author: Nigel Perks
Date: 2020-12-08T12:33:59-05:00
New Revision: 27ea7d0a6e0dc51e0214707bcc265fa6f9dc9bc6

URL: https://github.com/llvm/llvm-project/commit/27ea7d0a6e0dc51e0214707bcc265fa6f9dc9bc6
DIFF: https://github.com/llvm/llvm-project/commit/27ea7d0a6e0dc51e0214707bcc265fa6f9dc9bc6.diff

LOG: Fix inconsistent availability attribute message string literal check.

Function Parser::ParseAvailabilityAttribute checks that the message string of
an availability attribute is not a wide string literal. Test case
clang/test/Parser/attr-availability.c specifies that a string literal is
expected.

The code checked that the first token in a string concatenation is a string
literal, and then that the concatenated string consists of 1-byte characters.
On a target where wide character is 1 byte, a string concatenation "a" L"b"
passes both those checks, but L"b" alone is rejected. More generally, "a" u8"b"
passes the checks, but u8"b" alone is rejected.

So check isAscii() instead of character size.

Added: 
    

Modified: 
    clang/lib/Parse/ParseDecl.cpp
    clang/test/Parser/attr-availability.c

Removed: 
    


################################################################################
diff  --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index 7ebf06a04fa7..780d48958cb9 100644
--- a/clang/lib/Parse/ParseDecl.cpp
+++ b/clang/lib/Parse/ParseDecl.cpp
@@ -1119,7 +1119,7 @@ void Parser::ParseAvailabilityAttribute(IdentifierInfo &Availability,
       // Also reject wide string literals.
       if (StringLiteral *MessageStringLiteral =
               cast_or_null<StringLiteral>(MessageExpr.get())) {
-        if (MessageStringLiteral->getCharByteWidth() != 1) {
+        if (!MessageStringLiteral->isAscii()) {
           Diag(MessageStringLiteral->getSourceRange().getBegin(),
                diag::err_expected_string_literal)
             << /*Source='availability attribute'*/ 2;

diff  --git a/clang/test/Parser/attr-availability.c b/clang/test/Parser/attr-availability.c
index d812296d9354..d3b640a2feea 100644
--- a/clang/test/Parser/attr-availability.c
+++ b/clang/test/Parser/attr-availability.c
@@ -22,6 +22,14 @@ void f7() __attribute__((availability(macosx,message=L"wide"))); // expected-err
 
 void f8() __attribute__((availability(macosx,message="a" L"b"))); // expected-error {{expected string literal for optional message in 'availability' attribute}}
 
+void f9() __attribute__((availability(macosx,message=u8"b"))); // expected-error {{expected string literal for optional message in 'availability' attribute}}
+
+void f10() __attribute__((availability(macosx,message="a" u8"b"))); // expected-error {{expected string literal for optional message in 'availability' attribute}}
+
+void f11() __attribute__((availability(macosx,message=u"b"))); // expected-error {{expected string literal for optional message in 'availability' attribute}}
+
+void f12() __attribute__((availability(macosx,message="a" u"b"))); // expected-error {{expected string literal for optional message in 'availability' attribute}}
+
 // rdar://10095131
 enum E{
     gorf __attribute__((availability(macosx,introduced=8.5, message = 10.0))), // expected-error {{expected string literal for optional message in 'availability' attribute}}


        


More information about the cfe-commits mailing list