diff options
-rw-r--r-- | clang/lib/Parse/ParseObjc.cpp | 4 | ||||
-rw-r--r-- | clang/test/Parser/selector-1.m | 26 |
2 files changed, 18 insertions, 12 deletions
diff --git a/clang/lib/Parse/ParseObjc.cpp b/clang/lib/Parse/ParseObjc.cpp index d17e517b1f0..b42cf9f0ae1 100644 --- a/clang/lib/Parse/ParseObjc.cpp +++ b/clang/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/clang/test/Parser/selector-1.m b/clang/test/Parser/selector-1.m index 0f35ce79b20..5ba2da9931c 100644 --- a/clang/test/Parser/selector-1.m +++ b/clang/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::::); } |