Author: ericwf Date: Thu Dec 29 22:51:10 2016 New Revision: 290744 URL: http://llvm.org/viewvc/llvm-project?rev=290744&view=rev Log: Allow lexer to handle string_view literals. Patch from Anton Bikineev.
This implements the compiler side of p0403r0. This patch was reviewed as https://reviews.llvm.org/D26829. Added: cfe/trunk/test/SemaCXX/cxx1z-user-defined-literals.cpp Modified: cfe/trunk/include/clang/Lex/LiteralSupport.h cfe/trunk/lib/Lex/Lexer.cpp cfe/trunk/lib/Lex/LiteralSupport.cpp cfe/trunk/lib/Sema/SemaDeclCXX.cpp Modified: cfe/trunk/include/clang/Lex/LiteralSupport.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/LiteralSupport.h?rev=290744&r1=290743&r2=290744&view=diff ============================================================================== --- cfe/trunk/include/clang/Lex/LiteralSupport.h (original) +++ cfe/trunk/include/clang/Lex/LiteralSupport.h Thu Dec 29 22:51:10 2016 @@ -259,6 +259,8 @@ public: return UDSuffixOffset; } + static bool isValidUDSuffix(const LangOptions &LangOpts, StringRef Suffix); + private: void init(ArrayRef<Token> StringToks); bool CopyStringFragment(const Token &Tok, const char *TokBegin, Modified: cfe/trunk/lib/Lex/Lexer.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/Lexer.cpp?rev=290744&r1=290743&r2=290744&view=diff ============================================================================== --- cfe/trunk/lib/Lex/Lexer.cpp (original) +++ cfe/trunk/lib/Lex/Lexer.cpp Thu Dec 29 22:51:10 2016 @@ -1713,9 +1713,9 @@ const char *Lexer::LexUDSuffix(Token &Re getLangOpts()); if (!isIdentifierBody(Next)) { // End of suffix. Check whether this is on the whitelist. - IsUDSuffix = (Chars == 1 && Buffer[0] == 's') || - NumericLiteralParser::isValidUDSuffix( - getLangOpts(), StringRef(Buffer, Chars)); + const StringRef CompleteSuffix(Buffer, Chars); + IsUDSuffix = StringLiteralParser::isValidUDSuffix(getLangOpts(), + CompleteSuffix); break; } Modified: cfe/trunk/lib/Lex/LiteralSupport.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/LiteralSupport.cpp?rev=290744&r1=290743&r2=290744&view=diff ============================================================================== --- cfe/trunk/lib/Lex/LiteralSupport.cpp (original) +++ cfe/trunk/lib/Lex/LiteralSupport.cpp Thu Dec 29 22:51:10 2016 @@ -1708,3 +1708,12 @@ unsigned StringLiteralParser::getOffsetO return SpellingPtr-SpellingStart; } + +/// Determine whether a suffix is a valid ud-suffix. We avoid treating reserved +/// suffixes as ud-suffixes, because the diagnostic experience is better if we +/// treat it as an invalid suffix. +bool StringLiteralParser::isValidUDSuffix(const LangOptions &LangOpts, + StringRef Suffix) { + return NumericLiteralParser::isValidUDSuffix(LangOpts, Suffix) || + Suffix == "sv"; +} Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=290744&r1=290743&r2=290744&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original) +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Thu Dec 29 22:51:10 2016 @@ -12913,7 +12913,7 @@ bool Sema::CheckLiteralOperatorDeclarati // Literal suffix identifiers that do not start with an underscore // are reserved for future standardization. Diag(FnDecl->getLocation(), diag::warn_user_literal_reserved) - << NumericLiteralParser::isValidUDSuffix(getLangOpts(), LiteralName); + << StringLiteralParser::isValidUDSuffix(getLangOpts(), LiteralName); } return false; Added: cfe/trunk/test/SemaCXX/cxx1z-user-defined-literals.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx1z-user-defined-literals.cpp?rev=290744&view=auto ============================================================================== --- cfe/trunk/test/SemaCXX/cxx1z-user-defined-literals.cpp (added) +++ cfe/trunk/test/SemaCXX/cxx1z-user-defined-literals.cpp Thu Dec 29 22:51:10 2016 @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 -std=c++1z %s -include %s -verify + +#ifndef INCLUDED +#define INCLUDED + +#pragma clang system_header +namespace std { + using size_t = decltype(sizeof(0)); + + struct string_view {}; + string_view operator""sv(const char*, size_t); +} + +#else + +using namespace std; +string_view s = "foo"sv; +const char* p = "bar"sv; // expected-error {{no viable conversion}} +char error = 'x'sv; // expected-error {{invalid suffix}} expected-error {{expected ';'}} + +#endif _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits