On Tue, Sep 24, 2013 at 2:23 PM, Gao, Yunzhong < [email protected]> wrote:
> Hi Richard, > I am seeing warnings like this: > Lexer.cpp: In member function 'const char* > clang::Lexer::LexUDSuffix(clang::Token&, const char*, bool)': > Lexer.cpp:1662:22: warning: comparison between signed and unsigned > integer expressions [-Wsign-compare] > I wonder if an explicit cast is needed? > No, just a better type. Or a better compiler (this warning was trivially a false positive because the signed value was a positive constant expression). But fixed in r191336, thanks. > - Gao. > > > > -----Original Message----- > > From: [email protected] [mailto:cfe-commits- > > [email protected]] On Behalf Of Richard Smith > > Sent: Monday, September 23, 2013 9:06 PM > > To: [email protected] > > Subject: r191274 - Handle standard libraries that miss out the space when > > defining the standard > > > > Author: rsmith > > Date: Mon Sep 23 23:06:10 2013 > > New Revision: 191274 > > > > URL: http://llvm.org/viewvc/llvm-project?rev=191274&view=rev > > Log: > > Handle standard libraries that miss out the space when defining the > standard > > literal operators. Also, for now, allow the proposed C++1y "il", "i", > and "if" > > suffixes too. (Will revert the latter if LWG decides not to go ahead > with that > > change after all.) > > > > Modified: > > cfe/trunk/lib/Lex/Lexer.cpp > > cfe/trunk/lib/Lex/LiteralSupport.cpp > > cfe/trunk/test/SemaCXX/cxx1y-user-defined-literals.cpp > > > > Modified: cfe/trunk/lib/Lex/Lexer.cpp > > URL: http://llvm.org/viewvc/llvm- > > project/cfe/trunk/lib/Lex/Lexer.cpp?rev=191274&r1=191273&r2=191274&vie > > w=diff > > ========================================================== > > ==================== > > --- cfe/trunk/lib/Lex/Lexer.cpp (original) > > +++ cfe/trunk/lib/Lex/Lexer.cpp Mon Sep 23 23:06:10 2013 > > @@ -29,6 +29,7 @@ > > #include "clang/Basic/SourceManager.h" > > #include "clang/Lex/CodeCompletionHandler.h" > > #include "clang/Lex/LexDiagnostic.h" > > +#include "clang/Lex/LiteralSupport.h" > > #include "clang/Lex/Preprocessor.h" > > #include "llvm/ADT/STLExtras.h" > > #include "llvm/ADT/StringExtras.h" > > @@ -1638,12 +1639,33 @@ const char *Lexer::LexUDSuffix(Token &Re > > bool IsUDSuffix = false; > > if (C == '_') > > IsUDSuffix = true; > > - else if (IsStringLiteral && C == 's' && getLangOpts().CPlusPlus1y) { > > - // In C++1y, "s" is a valid ud-suffix for a string literal. > > - unsigned NextSize; > > - if (!isIdentifierBody(getCharAndSizeNoWarn(CurPtr + Size, > NextSize, > > - getLangOpts()))) > > - IsUDSuffix = true; > > + else if (IsStringLiteral && getLangOpts().CPlusPlus1y) { > > + // In C++1y, we need to look ahead a few characters to see if > this is a > > + // valid suffix for a string literal or a numeric literal (this > could be > > + // the 'operator""if' defining a numeric literal operator). > > + const int MaxStandardSuffixLength = 3; > > + char Buffer[MaxStandardSuffixLength] = { C }; > > + unsigned Consumed = Size; > > + unsigned Chars = 1; > > + while (true) { > > + unsigned NextSize; > > + char Next = getCharAndSizeNoWarn(CurPtr + Consumed, NextSize, > > + 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)); > > + break; > > + } > > + > > + if (Chars == MaxStandardSuffixLength) > > + // Too long: can't be a standard suffix. > > + break; > > + > > + Buffer[Chars++] = Next; > > + Consumed += NextSize; > > + } > > } > > > > if (!IsUDSuffix) { > > > > Modified: cfe/trunk/lib/Lex/LiteralSupport.cpp > > URL: http://llvm.org/viewvc/llvm- > > project/cfe/trunk/lib/Lex/LiteralSupport.cpp?rev=191274&r1=191273&r2=19 > > 1274&view=diff > > ========================================================== > > ==================== > > --- cfe/trunk/lib/Lex/LiteralSupport.cpp (original) > > +++ cfe/trunk/lib/Lex/LiteralSupport.cpp Mon Sep 23 23:06:10 2013 > > @@ -604,6 +604,9 @@ NumericLiteralParser::NumericLiteralPars > > break; > > } > > } > > + // "i", "if", and "il" are user-defined suffixes in C++1y. > > + if (PP.getLangOpts().CPlusPlus1y && *s == 'i') > > + break; > > // fall through. > > case 'j': > > case 'J': > > @@ -665,9 +668,11 @@ bool NumericLiteralParser::isValidUDSuff > > return false; > > > > // In C++1y, "s", "h", "min", "ms", "us", and "ns" are used in the > library. > > + // Per tweaked N3660, "il", "i", and "if" are also used in the > library. > > return llvm::StringSwitch<bool>(Suffix) > > .Cases("h", "min", "s", true) > > .Cases("ms", "us", "ns", true) > > + .Cases("il", "i", "if", true) > > .Default(false); > > } > > > > > > Modified: cfe/trunk/test/SemaCXX/cxx1y-user-defined-literals.cpp > > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx1y- > > user-defined-literals.cpp?rev=191274&r1=191273&r2=191274&view=diff > > ========================================================== > > ==================== > > --- cfe/trunk/test/SemaCXX/cxx1y-user-defined-literals.cpp (original) > > +++ cfe/trunk/test/SemaCXX/cxx1y-user-defined-literals.cpp Mon Sep 23 > > +++ 23:06:10 2013 > > @@ -8,15 +8,23 @@ namespace std { > > using size_t = decltype(sizeof(0)); > > > > struct duration {}; > > - duration operator"" ns(unsigned long long); > > - duration operator"" us(unsigned long long); > > - duration operator"" ms(unsigned long long); > > - duration operator"" s(unsigned long long); > > - duration operator"" min(unsigned long long); > > - duration operator"" h(unsigned long long); > > + duration operator""ns(unsigned long long); duration > > + operator""us(unsigned long long); duration operator""ms(unsigned long > > + long); duration operator""s(unsigned long long); duration > > + operator""min(unsigned long long); duration operator""h(unsigned long > > + long); > > > > struct string {}; > > - string operator"" s(const char*, size_t); > > + string operator""s(const char*, size_t); > > + > > + template<typename T> struct complex {}; complex<float> > > + operator""if(long double); complex<float> operator""if(unsigned long > > + long); complex<double> operator""i(long double); complex<double> > > + operator""i(unsigned long long); complex<long double> > > + operator""il(long double); complex<long double> operator""il(unsigned > > + long long); > > } > > > > #else > > @@ -29,4 +37,8 @@ char error = 'x's; // expected-error {{i int _1z = > 1z; // > > expected-error {{invalid suffix}} int _1b = 1b; // expected-error > {{invalid > > digit}} > > > > +complex<float> cf1 = 1if, cf2 = 2.if, cf3 = 0x3if; complex<double> cd1 > > += 1i, cd2 = 2.i, cd3 = 0b0110101i; complex<long double> cld1 = 1il, > > +cld2 = 2.il, cld3 = 0047il; > > + > > #endif > > > > > > _______________________________________________ > > cfe-commits mailing list > > [email protected] > > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
