[cfe-dev] [PATCH] C++0x unicode string and character literals now with test cases

Douglas Gregor dgregor at apple.com
Tue Jul 26 22:41:25 PDT 2011


On Jul 26, 2011, at 8:39 AM, Craig Topper wrote:

> Here's a new patch addressing Chris' suggestions.

Great! I've committed this as r136210, thanks so much!

	- Doug

> 
> On Mon, Jul 25, 2011 at 11:14 PM, Chris Lattner <clattner at apple.com> wrote:
>> 
>> On Jul 25, 2011, at 10:52 PM, Craig Topper wrote:
>> 
>>> Doh! I accidentally warned on UCNs larger than 0xffff in UTF-32
>>> character literals. This patch fixes that.
>> 
>> Hi Craig,
>> 
>> Doug is definitely the best one to review the semantics of this.  Some minor comments:
>> 
>>   IdentifierInfo &get(StringRef Name, tok::TokenKind TokenCode) {
>>     IdentifierInfo &II = get(Name);
>> +    assert(TokenCode < 512 && "TokenCode too large");
>>     II.TokenID = TokenCode;
>>     return II;
>> 
>> I would suggest instead:
>> 
>>   IdentifierInfo &get(StringRef Name, tok::TokenKind TokenCode) {
>>     IdentifierInfo &II = get(Name);
>>     II.TokenID = TokenCode;
>> +    assert(II.TokenID == TokenCode && "TokenCode too large");
>>     return II;
>> 
>> to avoid tying the '9' bit bitfield size to the magic 512 constant.
>> 
>> 
>>  class StringLiteral : public Expr {
>> ...
>>   unsigned ByteLength;
>> -  bool IsWide;
>> +  StringKind Kind;
>>   bool IsPascal;
>>   unsigned NumConcatenated;
>> 
>> sizeof(StringKind) is likely to be 4, wasting space.  I'd suggest making it an 8 bit bitfield or something.
>> 
>> 
>> In SemaDeclAttr etc:
>> 
>> -    if (Str == 0 || Str->isWide()) {
>> +    if (Str == 0 || Str->getKind() != StringLiteral::Ascii) {
>>       S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string)
>>           << "weakref" << 1;
>> 
>> I'd suggest introducing the proper helper methods and using:
>> 
>> -    if (Str == 0 || Str->isWide()) {
>> +    if (Str == 0 || !Str->isAscii()) {
>>       S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string)
>>           << "weakref" << 1;
>> 
>> In Lexer.cpp:
>> 
>> +    // treat U like the start of an identifier.
>> +    goto StartIdentifier;
>> 
>> Instead of doing this, I'd replace the gotos with just "return LexIdentifier(Result, CurPtr);" since "MIOpt.ReadToken" has already been done.
>> 
>> I would suggest fusing IsIdentifierL and IsIdentifierUTFStringPrefix into one function.
>> 
>> Otherwise, LGTM!
>> 
>> -Chris
>> 
>> 
>> 
> <unicode_strings.patch>




More information about the cfe-dev mailing list