From: Chris Lattner Date: Sat, 26 Mar 2011 18:11:38 +0000 (+0000) Subject: fix the second part of rdar://8366474 - clang fails to parse ObjC selectors with... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3b3e1a9e79703da067d23756e5624a4f487d6278;p=clang fix the second part of rdar://8366474 - clang fails to parse ObjC selectors with '::', when :: isn't the first part of the selector. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@128344 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Parse/ParseObjc.cpp b/lib/Parse/ParseObjc.cpp index d17e517b1f..b42cf9f0ae 100644 --- a/lib/Parse/ParseObjc.cpp +++ b/lib/Parse/ParseObjc.cpp @@ -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; } } diff --git a/test/Parser/selector-1.m b/test/Parser/selector-1.m index 0f35ce79b2..5ba2da9931 100644 --- a/test/Parser/selector-1.m +++ b/test/Parser/selector-1.m @@ -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::::); }