On Sep 2, 2010, at 6:26 PM, Fariborz Jahanian wrote: > Author: fjahanian > Date: Thu Sep 2 20:26:16 2010 > New Revision: 112935 > > URL: http://llvm.org/viewvc/llvm-project?rev=112935&view=rev > Log: > Patch to allow alternative representation of c++ > operators (and, or, etc.) to be used as selectors > to match g++'s behavior.
Hi Fariborz, Instead of adding this to Token, can you just use SomeToken.getIdentifier()->isCPlusPlusOperatorKeyword() wherever you'd check Tok.isCPlusPlusOpKeyword()? -Chris > > > Added: > cfe/trunk/test/SemaObjCXX/cxxoperator-selector.mm > Modified: > cfe/trunk/include/clang/Lex/Token.h > cfe/trunk/lib/Lex/Preprocessor.cpp > cfe/trunk/lib/Parse/ParseObjc.cpp > > Modified: cfe/trunk/include/clang/Lex/Token.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/Token.h?rev=112935&r1=112934&r2=112935&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Lex/Token.h (original) > +++ cfe/trunk/include/clang/Lex/Token.h Thu Sep 2 20:26:16 2010 > @@ -76,7 +76,9 @@ > StartOfLine = 0x01, // At start of line or only after whitespace. > LeadingSpace = 0x02, // Whitespace exists before this token. > DisableExpand = 0x04, // This identifier may never be macro expanded. > - NeedsCleaning = 0x08 // Contained an escaped newline or trigraph. > + NeedsCleaning = 0x08, // Contained an escaped newline or trigraph. > + CPlusPlusOpKeyword = 0x10 // alternative representation of > + // a C++ operator in objc selectors. > }; > > tok::TokenKind getKind() const { return (tok::TokenKind)Kind; } > @@ -231,6 +233,12 @@ > /// newlines in it. > /// > bool needsCleaning() const { return (Flags & NeedsCleaning) ? true : false; > } > + > + /// isCPlusPlusOpKeyword - Return true if this token is an operator > + /// for C++ operator keywords. > + bool isCPlusPlusOpKeyword() const > + { return (Flags & CPlusPlusOpKeyword) ? true : false; } > + > }; > > /// PPConditionalInfo - Information about the conditional stack (#if > directives) > > Modified: cfe/trunk/lib/Lex/Preprocessor.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/Preprocessor.cpp?rev=112935&r1=112934&r2=112935&view=diff > ============================================================================== > --- cfe/trunk/lib/Lex/Preprocessor.cpp (original) > +++ cfe/trunk/lib/Lex/Preprocessor.cpp Thu Sep 2 20:26:16 2010 > @@ -613,8 +613,10 @@ > // C++ 2.11p2: If this is an alternative representation of a C++ operator, > // then we act as if it is the actual operator and not the textual > // representation of it. > - if (II.isCPlusPlusOperatorKeyword()) > + if (II.isCPlusPlusOperatorKeyword()) { > Identifier.setIdentifierInfo(0); > + Identifier.setFlag(Token::CPlusPlusOpKeyword); > + } > > // If this is an extension token, diagnose its use. > // We avoid diagnosing tokens that originate from macro definitions. > > Modified: cfe/trunk/lib/Parse/ParseObjc.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseObjc.cpp?rev=112935&r1=112934&r2=112935&view=diff > ============================================================================== > --- cfe/trunk/lib/Parse/ParseObjc.cpp (original) > +++ cfe/trunk/lib/Parse/ParseObjc.cpp Thu Sep 2 20:26:16 2010 > @@ -553,6 +553,60 @@ > MatchRHSPunctuation(tok::r_paren, LHSLoc); > } > > +static void ConvertCPlusPlusOperatorToken(Preprocessor &PP, Token &Tok) { > + if (!Tok.isCPlusPlusOpKeyword()) > + return; > + > + switch (Tok.getKind()) { > + case tok::ampamp: > + Tok.setIdentifierInfo(&PP.getIdentifierTable().get("and")); > + Tok.setKind(tok::identifier); > + return; > + case tok::ampequal: > + Tok.setIdentifierInfo(&PP.getIdentifierTable().get("and_eq")); > + Tok.setKind(tok::identifier); > + return; > + case tok::amp: > + Tok.setIdentifierInfo(&PP.getIdentifierTable().get("bitand")); > + Tok.setKind(tok::identifier); > + return; > + case tok::pipe: > + Tok.setIdentifierInfo(&PP.getIdentifierTable().get("pipe")); > + Tok.setKind(tok::identifier); > + return; > + case tok::tilde: > + Tok.setIdentifierInfo(&PP.getIdentifierTable().get("compl")); > + Tok.setKind(tok::identifier); > + return; > + case tok::exclaim: > + Tok.setIdentifierInfo(&PP.getIdentifierTable().get("not")); > + Tok.setKind(tok::identifier); > + return; > + case tok::exclaimequal: > + Tok.setIdentifierInfo(&PP.getIdentifierTable().get("not_eq")); > + Tok.setKind(tok::identifier); > + return; > + case tok::pipepipe: > + Tok.setIdentifierInfo(&PP.getIdentifierTable().get("or")); > + Tok.setKind(tok::identifier); > + return; > + case tok::pipeequal: > + Tok.setIdentifierInfo(&PP.getIdentifierTable().get("or_eq")); > + Tok.setKind(tok::identifier); > + return; > + case tok::caret: > + Tok.setIdentifierInfo(&PP.getIdentifierTable().get("xor")); > + Tok.setKind(tok::identifier); > + return; > + case tok::caretequal: > + Tok.setIdentifierInfo(&PP.getIdentifierTable().get("xor_eq")); > + Tok.setKind(tok::identifier); > + return; > + default: > + return; > + } > +} > + > /// objc-method-proto: > /// objc-instance-method objc-method-decl objc-method-attributes[opt] > /// objc-class-method objc-method-decl objc-method-attributes[opt] > @@ -569,7 +623,6 @@ > > tok::TokenKind methodType = Tok.getKind(); > SourceLocation mLoc = ConsumeToken(); > - > Decl *MDecl = ParseObjCMethodDecl(mLoc, methodType, IDecl,MethodImplKind); > // Since this rule is used for both method declarations and definitions, > // the caller is (optionally) responsible for consuming the ';'. > @@ -585,6 +638,8 @@ > /// in out inout bycopy byref oneway int char float double void _Bool > /// > IdentifierInfo *Parser::ParseObjCSelectorPiece(SourceLocation &SelectorLoc) { > + ConvertCPlusPlusOperatorToken(PP, Tok); > + > switch (Tok.getKind()) { > default: > return 0; > > Added: cfe/trunk/test/SemaObjCXX/cxxoperator-selector.mm > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjCXX/cxxoperator-selector.mm?rev=112935&view=auto > ============================================================================== > --- cfe/trunk/test/SemaObjCXX/cxxoperator-selector.mm (added) > +++ cfe/trunk/test/SemaObjCXX/cxxoperator-selector.mm Thu Sep 2 20:26:16 2010 > @@ -0,0 +1,24 @@ > +// RUN: %clang_cc1 -fsyntax-only -verify %s > +// rdar:// 8328250 > + > +...@class NSDate; > + > +...@interface XSGraphDataSet > +- and; > +- xor; > +- or; > + > +- ||; // expected-error {{expected selector for Objective-C method}} > + > +- &&; // expected-error {{expected selector for Objective-C method}} > + > +- (void)dataSetForValuesBetween:(NSDate *)startDate and:(NSDate *)endDate; > +...@end > + > +...@implementation XSGraphDataSet > +- (id) and{return 0; }; > +- (id) xor{return 0; }; > +- (id) or{return 0; }; > + > +- (void)dataSetForValuesBetween:(NSDate *)startDate and:(NSDate *)endDate { > return; } > +...@end > > > _______________________________________________ > 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
