diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2010-09-03 17:33:04 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2010-09-03 17:33:04 +0000 |
commit | afbc68177cc11b8bfa47464b20e15d5f8fb21d4e (patch) | |
tree | 0b4af44715a2e163bbd576f20df96b8dcabbb23d | |
parent | bfebed2a839e12c3e99d635dbd1f4f875ce8b066 (diff) |
Use getSpelling to get original text of the
c++ operator token. (radar 8328250).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@112977 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Lex/Token.h | 11 | ||||
-rw-r--r-- | lib/Lex/Preprocessor.cpp | 4 | ||||
-rw-r--r-- | lib/Parse/ParseObjc.cpp | 76 |
3 files changed, 24 insertions, 67 deletions
diff --git a/include/clang/Lex/Token.h b/include/clang/Lex/Token.h index dc4acd46e2..954b36ec6d 100644 --- a/include/clang/Lex/Token.h +++ b/include/clang/Lex/Token.h @@ -76,9 +76,7 @@ public: 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. - CPlusPlusOpKeyword = 0x10 // alternative representation of - // a C++ operator in objc selectors. + NeedsCleaning = 0x08 // Contained an escaped newline or trigraph. }; tok::TokenKind getKind() const { return (tok::TokenKind)Kind; } @@ -233,12 +231,7 @@ public: /// 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) diff --git a/lib/Lex/Preprocessor.cpp b/lib/Lex/Preprocessor.cpp index 05621d31b3..5160acf19e 100644 --- a/lib/Lex/Preprocessor.cpp +++ b/lib/Lex/Preprocessor.cpp @@ -613,10 +613,8 @@ void Preprocessor::HandleIdentifier(Token &Identifier) { // 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. diff --git a/lib/Parse/ParseObjc.cpp b/lib/Parse/ParseObjc.cpp index 8d7d67ed8d..e0f9e2907b 100644 --- a/lib/Parse/ParseObjc.cpp +++ b/lib/Parse/ParseObjc.cpp @@ -553,60 +553,6 @@ void Parser::ParseObjCPropertyAttribute(ObjCDeclSpec &DS, Decl *ClassDecl, 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] @@ -638,11 +584,31 @@ Decl *Parser::ParseObjCMethodPrototype(Decl *IDecl, /// 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; + case tok::ampamp: + case tok::ampequal: + case tok::amp: + case tok::pipe: + case tok::tilde: + case tok::exclaim: + case tok::exclaimequal: + case tok::pipepipe: + case tok::pipeequal: + case tok::caret: + case tok::caretequal: { + llvm::StringRef ThisTok = PP.getSpelling(Tok); + if (isalpha(ThisTok[0])) { + IdentifierInfo *II = &PP.getIdentifierTable().get(ThisTok.data()); + Tok.setKind(tok::identifier); + SelectorLoc = ConsumeToken(); + return II; + } + return 0; + } + case tok::identifier: case tok::kw_asm: case tok::kw_auto: |