Use getSpelling to get original text of the

c++ operator token. (radar 8328250).

llvm-svn: 112977
This commit is contained in:
Fariborz Jahanian 2010-09-03 17:33:04 +00:00
parent 02ab9a69b9
commit 9e42a952d7
3 changed files with 24 additions and 67 deletions

View File

@ -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)

View File

@ -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.

View File

@ -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: