diff options
author | Sergei Barannikov <barannikov88@gmail.com> | 2023-08-29 01:12:37 +0300 |
---|---|---|
committer | Sergei Barannikov <barannikov88@gmail.com> | 2023-08-30 11:46:54 +0300 |
commit | a7eaaba69906d3305752cb738332b9365e666def (patch) | |
tree | bc49f5de61a6d5bd055a6ba43b207d58b90aa039 /clang/lib/Parse/ParseDecl.cpp | |
parent | 9b352540184e181d2a38423d352c5d5e2142839e (diff) | |
download | llvm-a7eaaba69906d3305752cb738332b9365e666def.zip llvm-a7eaaba69906d3305752cb738332b9365e666def.tar.gz llvm-a7eaaba69906d3305752cb738332b9365e666def.tar.bz2 |
[Parser] Parse string literal arguments of 'availability', 'external_source_symbol' and 'uuid' attributes as unevaluated
This is a complementary to D156237.
These attributes have custom parsing logic.
Reviewed By: cor3ntin
Differential Revision: https://reviews.llvm.org/D159024
Diffstat (limited to 'clang/lib/Parse/ParseDecl.cpp')
-rw-r--r-- | clang/lib/Parse/ParseDecl.cpp | 38 |
1 files changed, 13 insertions, 25 deletions
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index 8daa33a..7c27a02 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -1316,31 +1316,19 @@ void Parser::ParseAvailabilityAttribute( } ConsumeToken(); if (Keyword == Ident_message || Keyword == Ident_replacement) { - if (Tok.isNot(tok::string_literal)) { + if (!isTokenStringLiteral()) { Diag(Tok, diag::err_expected_string_literal) << /*Source='availability attribute'*/2; SkipUntil(tok::r_paren, StopAtSemi); return; } - if (Keyword == Ident_message) - MessageExpr = ParseStringLiteralExpression(); - else - ReplacementExpr = ParseStringLiteralExpression(); - // Also reject wide string literals. - if (StringLiteral *MessageStringLiteral = - cast_or_null<StringLiteral>(MessageExpr.get())) { - if (!MessageStringLiteral->isOrdinary()) { - Diag(MessageStringLiteral->getSourceRange().getBegin(), - diag::err_expected_string_literal) - << /*Source='availability attribute'*/ 2; - SkipUntil(tok::r_paren, StopAtSemi); - return; - } - } - if (Keyword == Ident_message) + if (Keyword == Ident_message) { + MessageExpr = ParseUnevaluatedStringLiteralExpression(); break; - else + } else { + ReplacementExpr = ParseUnevaluatedStringLiteralExpression(); continue; + } } // Special handling of 'NA' only when applied to introduced or @@ -1508,7 +1496,7 @@ void Parser::ParseExternalSourceSymbolAttribute( else HasDefinedIn = true; - if (Tok.isNot(tok::string_literal)) { + if (!isTokenStringLiteral()) { Diag(Tok, diag::err_expected_string_literal) << /*Source='external_source_symbol attribute'*/ 3 << /*language | source container | USR*/ ( @@ -1522,27 +1510,27 @@ void Parser::ParseExternalSourceSymbolAttribute( if (HadLanguage) { Diag(KeywordLoc, diag::err_external_source_symbol_duplicate_clause) << Keyword; - ParseStringLiteralExpression(); + ParseUnevaluatedStringLiteralExpression(); continue; } - Language = ParseStringLiteralExpression(); + Language = ParseUnevaluatedStringLiteralExpression(); } else if (Keyword == Ident_USR) { if (HadUSR) { Diag(KeywordLoc, diag::err_external_source_symbol_duplicate_clause) << Keyword; - ParseStringLiteralExpression(); + ParseUnevaluatedStringLiteralExpression(); continue; } - USR = ParseStringLiteralExpression(); + USR = ParseUnevaluatedStringLiteralExpression(); } else { assert(Keyword == Ident_defined_in && "Invalid clause keyword!"); if (HadDefinedIn) { Diag(KeywordLoc, diag::err_external_source_symbol_duplicate_clause) << Keyword; - ParseStringLiteralExpression(); + ParseUnevaluatedStringLiteralExpression(); continue; } - DefinedInExpr = ParseStringLiteralExpression(); + DefinedInExpr = ParseUnevaluatedStringLiteralExpression(); } } while (TryConsumeToken(tok::comma)); |