diff options
author | Manman Ren <manman.ren@gmail.com> | 2016-01-29 19:05:57 +0000 |
---|---|---|
committer | Manman Ren <manman.ren@gmail.com> | 2016-01-29 19:05:57 +0000 |
commit | 0fe61f868865c4c643cc5576e5ee63f94f382d8a (patch) | |
tree | a3552fd5cf72f7493c6f5cbd17a810a8dcdf1d42 /clang/lib/Parse/ParseObjc.cpp | |
parent | d91a12ec116e1a86f79316cae4cc3ace17e53d0a (diff) | |
download | bcm5719-llvm-0fe61f868865c4c643cc5576e5ee63f94f382d8a.tar.gz bcm5719-llvm-0fe61f868865c4c643cc5576e5ee63f94f382d8a.zip |
Class Property: parse @dynamic (class).
rdar://23891898
llvm-svn: 259224
Diffstat (limited to 'clang/lib/Parse/ParseObjc.cpp')
-rw-r--r-- | clang/lib/Parse/ParseObjc.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/clang/lib/Parse/ParseObjc.cpp b/clang/lib/Parse/ParseObjc.cpp index 0f2c3a43672..5cd7e7ab7e8 100644 --- a/clang/lib/Parse/ParseObjc.cpp +++ b/clang/lib/Parse/ParseObjc.cpp @@ -2353,6 +2353,31 @@ Decl *Parser::ParseObjCPropertyDynamic(SourceLocation atLoc) { assert(Tok.isObjCAtKeyword(tok::objc_dynamic) && "ParseObjCPropertyDynamic(): Expected '@dynamic'"); ConsumeToken(); // consume dynamic + + bool isClassProperty = false; + if (Tok.is(tok::l_paren)) { + ConsumeParen(); + const IdentifierInfo *II = Tok.getIdentifierInfo(); + + if (!II) { + Diag(Tok, diag::err_objc_expected_property_attr) << II; + SkipUntil(tok::r_paren, StopAtSemi); + } else { + SourceLocation AttrName = ConsumeToken(); // consume attribute name + if (II->isStr("class")) { + isClassProperty = true; + if (Tok.isNot(tok::r_paren)) { + Diag(Tok, diag::err_expected) << tok::r_paren; + SkipUntil(tok::r_paren, StopAtSemi); + } else + ConsumeParen(); + } else { + Diag(AttrName, diag::err_objc_expected_property_attr) << II; + SkipUntil(tok::r_paren, StopAtSemi); + } + } + } + while (true) { if (Tok.is(tok::code_completion)) { Actions.CodeCompleteObjCPropertyDefinition(getCurScope()); @@ -2371,6 +2396,7 @@ Decl *Parser::ParseObjCPropertyDynamic(SourceLocation atLoc) { Actions.ActOnPropertyImplDecl( getCurScope(), atLoc, propertyLoc, false, propertyId, nullptr, SourceLocation(), + isClassProperty ? ObjCPropertyQueryKind::OBJC_PR_query_class : ObjCPropertyQueryKind::OBJC_PR_query_unknown); if (Tok.isNot(tok::comma)) |