From: Benjamin Kramer Date: Fri, 13 Sep 2013 17:31:48 +0000 (+0000) Subject: As Aaron pointed out it's simpler to reject wide string availability attr messages... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c561714647f16b028f2c098ae810bd553138d17b;p=clang As Aaron pointed out it's simpler to reject wide string availability attr messages in the parser. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@190706 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index 74982a3894..915fb607a6 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -885,7 +885,7 @@ void Parser::ParseAvailabilityAttribute(IdentifierInfo &Availability, } ConsumeToken(); if (Keyword == Ident_message) { - if (!isTokenStringLiteral()) { + if (Tok.isNot(tok::string_literal)) { // Also reject wide string literals. Diag(Tok, diag::err_expected_string_literal) << /*Source='availability attribute'*/2; SkipUntil(tok::r_paren); diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index 8d01d638d3..8530c8bd15 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp @@ -2267,16 +2267,9 @@ static void handleAvailabilityAttr(Sema &S, Decl *D, AvailabilityChange Obsoleted = Attr.getAvailabilityObsoleted(); bool IsUnavailable = Attr.getUnavailableLoc().isValid(); StringRef Str; - if (Attr.getMessageExpr()) { - const StringLiteral *SE = dyn_cast(Attr.getMessageExpr()); - if (!SE || !SE->isAscii()) { - S.Diag(Attr.getMessageExpr()->getLocStart(), - diag::err_attribute_argument_type) - << Attr.getName() << AANT_ArgumentString; - return; - } + if (const StringLiteral *SE = + dyn_cast_or_null(Attr.getMessageExpr())) Str = SE->getString(); - } AvailabilityAttr *NewAttr = S.mergeAvailabilityAttr(ND, Attr.getRange(), II, Introduced.Version, diff --git a/test/Parser/attr-availability.c b/test/Parser/attr-availability.c index 0ed8391775..06bebbad5c 100644 --- a/test/Parser/attr-availability.c +++ b/test/Parser/attr-availability.c @@ -18,6 +18,8 @@ void f5() __attribute__((availability(macosx,introduced=10.5), availability(ios, void f6() __attribute__((availability(macosx,unavailable,introduced=10.5))); // expected-warning{{'unavailable' availability overrides all other availability information}} +void f7() __attribute__((availability(macosx,message=L"wide"))); // 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}} diff --git a/test/Sema/attr-availability.c b/test/Sema/attr-availability.c index f7bd74d8d3..ac6a187591 100644 --- a/test/Sema/attr-availability.c +++ b/test/Sema/attr-availability.c @@ -54,5 +54,3 @@ void f8() { extern int x2 __attribute__((availability(macosx,introduced=10.2))); // expected-note {{previous attribute is here}} extern int x2 __attribute__((availability(macosx,introduced=10.5))); // expected-warning {{availability does not match previous declaration}} - -extern int x3 __attribute__((availability(macosx,message=L"wide"))); // expected-error {{'availability' attribute requires a string}}