fix the second part of rdar://8366474 - clang fails to parse ObjC selectors with '::', when :: isn't the first part of the selector.

llvm-svn: 128344
This commit is contained in:
Chris Lattner 2011-03-26 18:11:38 +00:00
parent c85269fb40
commit 85222c6b2f
2 changed files with 18 additions and 12 deletions

View File

@ -2350,7 +2350,7 @@ ExprResult Parser::ParseObjCSelectorExpression(SourceLocation AtLoc) {
return ExprError(Diag(Tok, diag::err_expected_colon));
++nColons;
ConsumeToken(); // Eat the ':'.
ConsumeToken(); // Eat the ':' or '::'.
if (Tok.is(tok::r_paren))
break;
@ -2366,7 +2366,7 @@ ExprResult Parser::ParseObjCSelectorExpression(SourceLocation AtLoc) {
SourceLocation Loc;
SelIdent = ParseObjCSelectorPiece(Loc);
KeyIdents.push_back(SelIdent);
if (!SelIdent && Tok.isNot(tok::colon))
if (!SelIdent && Tok.isNot(tok::colon) && Tok.isNot(tok::coloncolon))
break;
}
}

View File

@ -1,14 +1,20 @@
// RUN: %clang_cc1 -fsyntax-only -verify %s
// RUN: %clang_cc1 -x objective-c++ -fsyntax-only -verify %s
// rdar://8366474
int main() {
SEL s = @selector(retain);
SEL s1 = @selector(meth1:);
SEL s2 = @selector(retainArgument::);
SEL s3 = @selector(retainArgument:::::);
SEL s4 = @selector(retainArgument:with:);
SEL s5 = @selector(meth1:with:with:);
SEL s6 = @selector(getEnum:enum:bool:);
SEL s7 = @selector(char:float:double:unsigned:short:long:);
SEL s9 = @selector(:enum:bool:);
SEL s = @selector(retain);
SEL s1 = @selector(meth1:);
SEL s2 = @selector(retainArgument::);
SEL s3 = @selector(retainArgument:::::);
SEL s4 = @selector(retainArgument:with:);
SEL s5 = @selector(meth1:with:with:);
SEL s6 = @selector(getEnum:enum:bool:);
SEL s7 = @selector(char:float:double:unsigned:short:long:);
SEL s9 = @selector(:enum:bool:);
(void) @selector(foo:);
(void) @selector(foo::);
(void) @selector(foo:::);
(void) @selector(foo::::);
}