xref: /llvm-project/clang/lib/Parse/ParseObjc.cpp (revision 7a30dc53c5e1a6f929d1ddda5f38f66565a63b0c)
1 //===--- ParseObjC.cpp - Objective C Parsing ------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 //  This file implements the Objective-C portions of the Parser interface.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "clang/Parse/Parser.h"
15 #include "RAIIObjectsForParser.h"
16 #include "clang/Basic/CharInfo.h"
17 #include "clang/Parse/ParseDiagnostic.h"
18 #include "clang/Sema/DeclSpec.h"
19 #include "clang/Sema/PrettyDeclStackTrace.h"
20 #include "clang/Sema/Scope.h"
21 #include "llvm/ADT/SmallVector.h"
22 #include "llvm/ADT/StringExtras.h"
23 using namespace clang;
24 
25 
26 /// ParseObjCAtDirectives - Handle parts of the external-declaration production:
27 ///       external-declaration: [C99 6.9]
28 /// [OBJC]  objc-class-definition
29 /// [OBJC]  objc-class-declaration
30 /// [OBJC]  objc-alias-declaration
31 /// [OBJC]  objc-protocol-definition
32 /// [OBJC]  objc-method-definition
33 /// [OBJC]  '@' 'end'
34 Parser::DeclGroupPtrTy Parser::ParseObjCAtDirectives() {
35   SourceLocation AtLoc = ConsumeToken(); // the "@"
36 
37   if (Tok.is(tok::code_completion)) {
38     Actions.CodeCompleteObjCAtDirective(getCurScope());
39     cutOffParsing();
40     return DeclGroupPtrTy();
41   }
42 
43   Decl *SingleDecl = 0;
44   switch (Tok.getObjCKeywordID()) {
45   case tok::objc_class:
46     return ParseObjCAtClassDeclaration(AtLoc);
47   case tok::objc_interface: {
48     ParsedAttributes attrs(AttrFactory);
49     SingleDecl = ParseObjCAtInterfaceDeclaration(AtLoc, attrs);
50     break;
51   }
52   case tok::objc_protocol: {
53     ParsedAttributes attrs(AttrFactory);
54     return ParseObjCAtProtocolDeclaration(AtLoc, attrs);
55   }
56   case tok::objc_implementation:
57     return ParseObjCAtImplementationDeclaration(AtLoc);
58   case tok::objc_end:
59     return ParseObjCAtEndDeclaration(AtLoc);
60   case tok::objc_compatibility_alias:
61     SingleDecl = ParseObjCAtAliasDeclaration(AtLoc);
62     break;
63   case tok::objc_synthesize:
64     SingleDecl = ParseObjCPropertySynthesize(AtLoc);
65     break;
66   case tok::objc_dynamic:
67     SingleDecl = ParseObjCPropertyDynamic(AtLoc);
68     break;
69   case tok::objc_import:
70     if (getLangOpts().Modules)
71       return ParseModuleImport(AtLoc);
72 
73     // Fall through
74 
75   default:
76     Diag(AtLoc, diag::err_unexpected_at);
77     SkipUntil(tok::semi);
78     SingleDecl = 0;
79     break;
80   }
81   return Actions.ConvertDeclToDeclGroup(SingleDecl);
82 }
83 
84 ///
85 /// objc-class-declaration:
86 ///    '@' 'class' identifier-list ';'
87 ///
88 Parser::DeclGroupPtrTy
89 Parser::ParseObjCAtClassDeclaration(SourceLocation atLoc) {
90   ConsumeToken(); // the identifier "class"
91   SmallVector<IdentifierInfo *, 8> ClassNames;
92   SmallVector<SourceLocation, 8> ClassLocs;
93 
94 
95   while (1) {
96     if (Tok.isNot(tok::identifier)) {
97       Diag(Tok, diag::err_expected_ident);
98       SkipUntil(tok::semi);
99       return Actions.ConvertDeclToDeclGroup(0);
100     }
101     ClassNames.push_back(Tok.getIdentifierInfo());
102     ClassLocs.push_back(Tok.getLocation());
103     ConsumeToken();
104 
105     if (Tok.isNot(tok::comma))
106       break;
107 
108     ConsumeToken();
109   }
110 
111   // Consume the ';'.
112   if (ExpectAndConsume(tok::semi, diag::err_expected_semi_after, "@class"))
113     return Actions.ConvertDeclToDeclGroup(0);
114 
115   return Actions.ActOnForwardClassDeclaration(atLoc, ClassNames.data(),
116                                               ClassLocs.data(),
117                                               ClassNames.size());
118 }
119 
120 void Parser::CheckNestedObjCContexts(SourceLocation AtLoc)
121 {
122   Sema::ObjCContainerKind ock = Actions.getObjCContainerKind();
123   if (ock == Sema::OCK_None)
124     return;
125 
126   Decl *Decl = Actions.getObjCDeclContext();
127   if (CurParsedObjCImpl) {
128     CurParsedObjCImpl->finish(AtLoc);
129   } else {
130     Actions.ActOnAtEnd(getCurScope(), AtLoc);
131   }
132   Diag(AtLoc, diag::err_objc_missing_end)
133       << FixItHint::CreateInsertion(AtLoc, "@end\n");
134   if (Decl)
135     Diag(Decl->getLocStart(), diag::note_objc_container_start)
136         << (int) ock;
137 }
138 
139 ///
140 ///   objc-interface:
141 ///     objc-class-interface-attributes[opt] objc-class-interface
142 ///     objc-category-interface
143 ///
144 ///   objc-class-interface:
145 ///     '@' 'interface' identifier objc-superclass[opt]
146 ///       objc-protocol-refs[opt]
147 ///       objc-class-instance-variables[opt]
148 ///       objc-interface-decl-list
149 ///     @end
150 ///
151 ///   objc-category-interface:
152 ///     '@' 'interface' identifier '(' identifier[opt] ')'
153 ///       objc-protocol-refs[opt]
154 ///       objc-interface-decl-list
155 ///     @end
156 ///
157 ///   objc-superclass:
158 ///     ':' identifier
159 ///
160 ///   objc-class-interface-attributes:
161 ///     __attribute__((visibility("default")))
162 ///     __attribute__((visibility("hidden")))
163 ///     __attribute__((deprecated))
164 ///     __attribute__((unavailable))
165 ///     __attribute__((objc_exception)) - used by NSException on 64-bit
166 ///     __attribute__((objc_root_class))
167 ///
168 Decl *Parser::ParseObjCAtInterfaceDeclaration(SourceLocation AtLoc,
169                                               ParsedAttributes &attrs) {
170   assert(Tok.isObjCAtKeyword(tok::objc_interface) &&
171          "ParseObjCAtInterfaceDeclaration(): Expected @interface");
172   CheckNestedObjCContexts(AtLoc);
173   ConsumeToken(); // the "interface" identifier
174 
175   // Code completion after '@interface'.
176   if (Tok.is(tok::code_completion)) {
177     Actions.CodeCompleteObjCInterfaceDecl(getCurScope());
178     cutOffParsing();
179     return 0;
180   }
181 
182   if (Tok.isNot(tok::identifier)) {
183     Diag(Tok, diag::err_expected_ident); // missing class or category name.
184     return 0;
185   }
186 
187   // We have a class or category name - consume it.
188   IdentifierInfo *nameId = Tok.getIdentifierInfo();
189   SourceLocation nameLoc = ConsumeToken();
190   if (Tok.is(tok::l_paren) &&
191       !isKnownToBeTypeSpecifier(GetLookAheadToken(1))) { // we have a category.
192 
193     BalancedDelimiterTracker T(*this, tok::l_paren);
194     T.consumeOpen();
195 
196     SourceLocation categoryLoc;
197     IdentifierInfo *categoryId = 0;
198     if (Tok.is(tok::code_completion)) {
199       Actions.CodeCompleteObjCInterfaceCategory(getCurScope(), nameId, nameLoc);
200       cutOffParsing();
201       return 0;
202     }
203 
204     // For ObjC2, the category name is optional (not an error).
205     if (Tok.is(tok::identifier)) {
206       categoryId = Tok.getIdentifierInfo();
207       categoryLoc = ConsumeToken();
208     }
209     else if (!getLangOpts().ObjC2) {
210       Diag(Tok, diag::err_expected_ident); // missing category name.
211       return 0;
212     }
213 
214     T.consumeClose();
215     if (T.getCloseLocation().isInvalid())
216       return 0;
217 
218     if (!attrs.empty()) { // categories don't support attributes.
219       Diag(nameLoc, diag::err_objc_no_attributes_on_category);
220       attrs.clear();
221     }
222 
223     // Next, we need to check for any protocol references.
224     SourceLocation LAngleLoc, EndProtoLoc;
225     SmallVector<Decl *, 8> ProtocolRefs;
226     SmallVector<SourceLocation, 8> ProtocolLocs;
227     if (Tok.is(tok::less) &&
228         ParseObjCProtocolReferences(ProtocolRefs, ProtocolLocs, true,
229                                     LAngleLoc, EndProtoLoc))
230       return 0;
231 
232     Decl *CategoryType =
233     Actions.ActOnStartCategoryInterface(AtLoc,
234                                         nameId, nameLoc,
235                                         categoryId, categoryLoc,
236                                         ProtocolRefs.data(),
237                                         ProtocolRefs.size(),
238                                         ProtocolLocs.data(),
239                                         EndProtoLoc);
240 
241     if (Tok.is(tok::l_brace))
242       ParseObjCClassInstanceVariables(CategoryType, tok::objc_private, AtLoc);
243 
244     ParseObjCInterfaceDeclList(tok::objc_not_keyword, CategoryType);
245     return CategoryType;
246   }
247   // Parse a class interface.
248   IdentifierInfo *superClassId = 0;
249   SourceLocation superClassLoc;
250 
251   if (Tok.is(tok::colon)) { // a super class is specified.
252     ConsumeToken();
253 
254     // Code completion of superclass names.
255     if (Tok.is(tok::code_completion)) {
256       Actions.CodeCompleteObjCSuperclass(getCurScope(), nameId, nameLoc);
257       cutOffParsing();
258       return 0;
259     }
260 
261     if (Tok.isNot(tok::identifier)) {
262       Diag(Tok, diag::err_expected_ident); // missing super class name.
263       return 0;
264     }
265     superClassId = Tok.getIdentifierInfo();
266     superClassLoc = ConsumeToken();
267   }
268   // Next, we need to check for any protocol references.
269   SmallVector<Decl *, 8> ProtocolRefs;
270   SmallVector<SourceLocation, 8> ProtocolLocs;
271   SourceLocation LAngleLoc, EndProtoLoc;
272   if (Tok.is(tok::less) &&
273       ParseObjCProtocolReferences(ProtocolRefs, ProtocolLocs, true,
274                                   LAngleLoc, EndProtoLoc))
275     return 0;
276 
277   Decl *ClsType =
278     Actions.ActOnStartClassInterface(AtLoc, nameId, nameLoc,
279                                      superClassId, superClassLoc,
280                                      ProtocolRefs.data(), ProtocolRefs.size(),
281                                      ProtocolLocs.data(),
282                                      EndProtoLoc, attrs.getList());
283 
284   if (Tok.is(tok::l_brace))
285     ParseObjCClassInstanceVariables(ClsType, tok::objc_protected, AtLoc);
286 
287   ParseObjCInterfaceDeclList(tok::objc_interface, ClsType);
288   return ClsType;
289 }
290 
291 /// The Objective-C property callback.  This should be defined where
292 /// it's used, but instead it's been lifted to here to support VS2005.
293 struct Parser::ObjCPropertyCallback : FieldCallback {
294 private:
295   virtual void anchor();
296 public:
297   Parser &P;
298   SmallVectorImpl<Decl *> &Props;
299   ObjCDeclSpec &OCDS;
300   SourceLocation AtLoc;
301   SourceLocation LParenLoc;
302   tok::ObjCKeywordKind MethodImplKind;
303 
304   ObjCPropertyCallback(Parser &P,
305                        SmallVectorImpl<Decl *> &Props,
306                        ObjCDeclSpec &OCDS, SourceLocation AtLoc,
307                        SourceLocation LParenLoc,
308                        tok::ObjCKeywordKind MethodImplKind) :
309     P(P), Props(Props), OCDS(OCDS), AtLoc(AtLoc), LParenLoc(LParenLoc),
310     MethodImplKind(MethodImplKind) {
311   }
312 
313   void invoke(ParsingFieldDeclarator &FD) {
314     if (FD.D.getIdentifier() == 0) {
315       P.Diag(AtLoc, diag::err_objc_property_requires_field_name)
316         << FD.D.getSourceRange();
317       return;
318     }
319     if (FD.BitfieldSize) {
320       P.Diag(AtLoc, diag::err_objc_property_bitfield)
321         << FD.D.getSourceRange();
322       return;
323     }
324 
325     // Install the property declarator into interfaceDecl.
326     IdentifierInfo *SelName =
327       OCDS.getGetterName() ? OCDS.getGetterName() : FD.D.getIdentifier();
328 
329     Selector GetterSel =
330       P.PP.getSelectorTable().getNullarySelector(SelName);
331     IdentifierInfo *SetterName = OCDS.getSetterName();
332     Selector SetterSel;
333     if (SetterName)
334       SetterSel = P.PP.getSelectorTable().getSelector(1, &SetterName);
335     else
336       SetterSel = SelectorTable::constructSetterName(P.PP.getIdentifierTable(),
337                                                      P.PP.getSelectorTable(),
338                                                      FD.D.getIdentifier());
339     bool isOverridingProperty = false;
340     Decl *Property =
341       P.Actions.ActOnProperty(P.getCurScope(), AtLoc, LParenLoc,
342                               FD, OCDS,
343                               GetterSel, SetterSel,
344                               &isOverridingProperty,
345                               MethodImplKind);
346     if (!isOverridingProperty)
347       Props.push_back(Property);
348 
349     FD.complete(Property);
350   }
351 };
352 
353 void Parser::ObjCPropertyCallback::anchor() {
354 }
355 
356 ///   objc-interface-decl-list:
357 ///     empty
358 ///     objc-interface-decl-list objc-property-decl [OBJC2]
359 ///     objc-interface-decl-list objc-method-requirement [OBJC2]
360 ///     objc-interface-decl-list objc-method-proto ';'
361 ///     objc-interface-decl-list declaration
362 ///     objc-interface-decl-list ';'
363 ///
364 ///   objc-method-requirement: [OBJC2]
365 ///     @required
366 ///     @optional
367 ///
368 void Parser::ParseObjCInterfaceDeclList(tok::ObjCKeywordKind contextKey,
369                                         Decl *CDecl) {
370   SmallVector<Decl *, 32> allMethods;
371   SmallVector<Decl *, 16> allProperties;
372   SmallVector<DeclGroupPtrTy, 8> allTUVariables;
373   tok::ObjCKeywordKind MethodImplKind = tok::objc_not_keyword;
374 
375   SourceRange AtEnd;
376 
377   while (1) {
378     // If this is a method prototype, parse it.
379     if (Tok.is(tok::minus) || Tok.is(tok::plus)) {
380       if (Decl *methodPrototype =
381           ParseObjCMethodPrototype(MethodImplKind, false))
382         allMethods.push_back(methodPrototype);
383       // Consume the ';' here, since ParseObjCMethodPrototype() is re-used for
384       // method definitions.
385       if (ExpectAndConsumeSemi(diag::err_expected_semi_after_method_proto)) {
386         // We didn't find a semi and we error'ed out. Skip until a ';' or '@'.
387         SkipUntil(tok::at, /*StopAtSemi=*/true, /*DontConsume=*/true);
388         if (Tok.is(tok::semi))
389           ConsumeToken();
390       }
391       continue;
392     }
393     if (Tok.is(tok::l_paren)) {
394       Diag(Tok, diag::err_expected_minus_or_plus);
395       ParseObjCMethodDecl(Tok.getLocation(),
396                           tok::minus,
397                           MethodImplKind, false);
398       continue;
399     }
400     // Ignore excess semicolons.
401     if (Tok.is(tok::semi)) {
402       ConsumeToken();
403       continue;
404     }
405 
406     // If we got to the end of the file, exit the loop.
407     if (Tok.is(tok::eof))
408       break;
409 
410     // Code completion within an Objective-C interface.
411     if (Tok.is(tok::code_completion)) {
412       Actions.CodeCompleteOrdinaryName(getCurScope(),
413                             CurParsedObjCImpl? Sema::PCC_ObjCImplementation
414                                              : Sema::PCC_ObjCInterface);
415       return cutOffParsing();
416     }
417 
418     // If we don't have an @ directive, parse it as a function definition.
419     if (Tok.isNot(tok::at)) {
420       // The code below does not consume '}'s because it is afraid of eating the
421       // end of a namespace.  Because of the way this code is structured, an
422       // erroneous r_brace would cause an infinite loop if not handled here.
423       if (Tok.is(tok::r_brace))
424         break;
425       ParsedAttributesWithRange attrs(AttrFactory);
426       allTUVariables.push_back(ParseDeclarationOrFunctionDefinition(attrs));
427       continue;
428     }
429 
430     // Otherwise, we have an @ directive, eat the @.
431     SourceLocation AtLoc = ConsumeToken(); // the "@"
432     if (Tok.is(tok::code_completion)) {
433       Actions.CodeCompleteObjCAtDirective(getCurScope());
434       return cutOffParsing();
435     }
436 
437     tok::ObjCKeywordKind DirectiveKind = Tok.getObjCKeywordID();
438 
439     if (DirectiveKind == tok::objc_end) { // @end -> terminate list
440       AtEnd.setBegin(AtLoc);
441       AtEnd.setEnd(Tok.getLocation());
442       break;
443     } else if (DirectiveKind == tok::objc_not_keyword) {
444       Diag(Tok, diag::err_objc_unknown_at);
445       SkipUntil(tok::semi);
446       continue;
447     }
448 
449     // Eat the identifier.
450     ConsumeToken();
451 
452     switch (DirectiveKind) {
453     default:
454       // FIXME: If someone forgets an @end on a protocol, this loop will
455       // continue to eat up tons of stuff and spew lots of nonsense errors.  It
456       // would probably be better to bail out if we saw an @class or @interface
457       // or something like that.
458       Diag(AtLoc, diag::err_objc_illegal_interface_qual);
459       // Skip until we see an '@' or '}' or ';'.
460       SkipUntil(tok::r_brace, tok::at);
461       break;
462 
463     case tok::objc_implementation:
464     case tok::objc_interface:
465       Diag(AtLoc, diag::err_objc_missing_end)
466           << FixItHint::CreateInsertion(AtLoc, "@end\n");
467       Diag(CDecl->getLocStart(), diag::note_objc_container_start)
468           << (int) Actions.getObjCContainerKind();
469       ConsumeToken();
470       break;
471 
472     case tok::objc_required:
473     case tok::objc_optional:
474       // This is only valid on protocols.
475       // FIXME: Should this check for ObjC2 being enabled?
476       if (contextKey != tok::objc_protocol)
477         Diag(AtLoc, diag::err_objc_directive_only_in_protocol);
478       else
479         MethodImplKind = DirectiveKind;
480       break;
481 
482     case tok::objc_property:
483       if (!getLangOpts().ObjC2)
484         Diag(AtLoc, diag::err_objc_properties_require_objc2);
485 
486       ObjCDeclSpec OCDS;
487       SourceLocation LParenLoc;
488       // Parse property attribute list, if any.
489       if (Tok.is(tok::l_paren)) {
490         LParenLoc = Tok.getLocation();
491         ParseObjCPropertyAttribute(OCDS);
492       }
493 
494       ObjCPropertyCallback Callback(*this, allProperties,
495                                     OCDS, AtLoc, LParenLoc, MethodImplKind);
496 
497       // Parse all the comma separated declarators.
498       ParsingDeclSpec DS(*this);
499       ParseStructDeclaration(DS, Callback);
500 
501       ExpectAndConsume(tok::semi, diag::err_expected_semi_decl_list);
502       break;
503     }
504   }
505 
506   // We break out of the big loop in two cases: when we see @end or when we see
507   // EOF.  In the former case, eat the @end.  In the later case, emit an error.
508   if (Tok.is(tok::code_completion)) {
509     Actions.CodeCompleteObjCAtDirective(getCurScope());
510     return cutOffParsing();
511   } else if (Tok.isObjCAtKeyword(tok::objc_end)) {
512     ConsumeToken(); // the "end" identifier
513   } else {
514     Diag(Tok, diag::err_objc_missing_end)
515         << FixItHint::CreateInsertion(Tok.getLocation(), "\n@end\n");
516     Diag(CDecl->getLocStart(), diag::note_objc_container_start)
517         << (int) Actions.getObjCContainerKind();
518     AtEnd.setBegin(Tok.getLocation());
519     AtEnd.setEnd(Tok.getLocation());
520   }
521 
522   // Insert collected methods declarations into the @interface object.
523   // This passes in an invalid SourceLocation for AtEndLoc when EOF is hit.
524   Actions.ActOnAtEnd(getCurScope(), AtEnd,
525                      allMethods.data(), allMethods.size(),
526                      allProperties.data(), allProperties.size(),
527                      allTUVariables.data(), allTUVariables.size());
528 }
529 
530 ///   Parse property attribute declarations.
531 ///
532 ///   property-attr-decl: '(' property-attrlist ')'
533 ///   property-attrlist:
534 ///     property-attribute
535 ///     property-attrlist ',' property-attribute
536 ///   property-attribute:
537 ///     getter '=' identifier
538 ///     setter '=' identifier ':'
539 ///     readonly
540 ///     readwrite
541 ///     assign
542 ///     retain
543 ///     copy
544 ///     nonatomic
545 ///     atomic
546 ///     strong
547 ///     weak
548 ///     unsafe_unretained
549 ///
550 void Parser::ParseObjCPropertyAttribute(ObjCDeclSpec &DS) {
551   assert(Tok.getKind() == tok::l_paren);
552   BalancedDelimiterTracker T(*this, tok::l_paren);
553   T.consumeOpen();
554 
555   while (1) {
556     if (Tok.is(tok::code_completion)) {
557       Actions.CodeCompleteObjCPropertyFlags(getCurScope(), DS);
558       return cutOffParsing();
559     }
560     const IdentifierInfo *II = Tok.getIdentifierInfo();
561 
562     // If this is not an identifier at all, bail out early.
563     if (II == 0) {
564       T.consumeClose();
565       return;
566     }
567 
568     SourceLocation AttrName = ConsumeToken(); // consume last attribute name
569 
570     if (II->isStr("readonly"))
571       DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_readonly);
572     else if (II->isStr("assign"))
573       DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_assign);
574     else if (II->isStr("unsafe_unretained"))
575       DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_unsafe_unretained);
576     else if (II->isStr("readwrite"))
577       DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_readwrite);
578     else if (II->isStr("retain"))
579       DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_retain);
580     else if (II->isStr("strong"))
581       DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_strong);
582     else if (II->isStr("copy"))
583       DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_copy);
584     else if (II->isStr("nonatomic"))
585       DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_nonatomic);
586     else if (II->isStr("atomic"))
587       DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_atomic);
588     else if (II->isStr("weak"))
589       DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_weak);
590     else if (II->isStr("getter") || II->isStr("setter")) {
591       bool IsSetter = II->getNameStart()[0] == 's';
592 
593       // getter/setter require extra treatment.
594       unsigned DiagID = IsSetter ? diag::err_objc_expected_equal_for_setter :
595         diag::err_objc_expected_equal_for_getter;
596 
597       if (ExpectAndConsume(tok::equal, DiagID, "", tok::r_paren))
598         return;
599 
600       if (Tok.is(tok::code_completion)) {
601         if (IsSetter)
602           Actions.CodeCompleteObjCPropertySetter(getCurScope());
603         else
604           Actions.CodeCompleteObjCPropertyGetter(getCurScope());
605         return cutOffParsing();
606       }
607 
608 
609       SourceLocation SelLoc;
610       IdentifierInfo *SelIdent = ParseObjCSelectorPiece(SelLoc);
611 
612       if (!SelIdent) {
613         Diag(Tok, diag::err_objc_expected_selector_for_getter_setter)
614           << IsSetter;
615         SkipUntil(tok::r_paren);
616         return;
617       }
618 
619       if (IsSetter) {
620         DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_setter);
621         DS.setSetterName(SelIdent);
622 
623         if (ExpectAndConsume(tok::colon,
624                              diag::err_expected_colon_after_setter_name, "",
625                              tok::r_paren))
626           return;
627       } else {
628         DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_getter);
629         DS.setGetterName(SelIdent);
630       }
631     } else {
632       Diag(AttrName, diag::err_objc_expected_property_attr) << II;
633       SkipUntil(tok::r_paren);
634       return;
635     }
636 
637     if (Tok.isNot(tok::comma))
638       break;
639 
640     ConsumeToken();
641   }
642 
643   T.consumeClose();
644 }
645 
646 ///   objc-method-proto:
647 ///     objc-instance-method objc-method-decl objc-method-attributes[opt]
648 ///     objc-class-method objc-method-decl objc-method-attributes[opt]
649 ///
650 ///   objc-instance-method: '-'
651 ///   objc-class-method: '+'
652 ///
653 ///   objc-method-attributes:         [OBJC2]
654 ///     __attribute__((deprecated))
655 ///
656 Decl *Parser::ParseObjCMethodPrototype(tok::ObjCKeywordKind MethodImplKind,
657                                        bool MethodDefinition) {
658   assert((Tok.is(tok::minus) || Tok.is(tok::plus)) && "expected +/-");
659 
660   tok::TokenKind methodType = Tok.getKind();
661   SourceLocation mLoc = ConsumeToken();
662   Decl *MDecl = ParseObjCMethodDecl(mLoc, methodType, MethodImplKind,
663                                     MethodDefinition);
664   // Since this rule is used for both method declarations and definitions,
665   // the caller is (optionally) responsible for consuming the ';'.
666   return MDecl;
667 }
668 
669 ///   objc-selector:
670 ///     identifier
671 ///     one of
672 ///       enum struct union if else while do for switch case default
673 ///       break continue return goto asm sizeof typeof __alignof
674 ///       unsigned long const short volatile signed restrict _Complex
675 ///       in out inout bycopy byref oneway int char float double void _Bool
676 ///
677 IdentifierInfo *Parser::ParseObjCSelectorPiece(SourceLocation &SelectorLoc) {
678 
679   switch (Tok.getKind()) {
680   default:
681     return 0;
682   case tok::ampamp:
683   case tok::ampequal:
684   case tok::amp:
685   case tok::pipe:
686   case tok::tilde:
687   case tok::exclaim:
688   case tok::exclaimequal:
689   case tok::pipepipe:
690   case tok::pipeequal:
691   case tok::caret:
692   case tok::caretequal: {
693     std::string ThisTok(PP.getSpelling(Tok));
694     if (isLetter(ThisTok[0])) {
695       IdentifierInfo *II = &PP.getIdentifierTable().get(ThisTok.data());
696       Tok.setKind(tok::identifier);
697       SelectorLoc = ConsumeToken();
698       return II;
699     }
700     return 0;
701   }
702 
703   case tok::identifier:
704   case tok::kw_asm:
705   case tok::kw_auto:
706   case tok::kw_bool:
707   case tok::kw_break:
708   case tok::kw_case:
709   case tok::kw_catch:
710   case tok::kw_char:
711   case tok::kw_class:
712   case tok::kw_const:
713   case tok::kw_const_cast:
714   case tok::kw_continue:
715   case tok::kw_default:
716   case tok::kw_delete:
717   case tok::kw_do:
718   case tok::kw_double:
719   case tok::kw_dynamic_cast:
720   case tok::kw_else:
721   case tok::kw_enum:
722   case tok::kw_explicit:
723   case tok::kw_export:
724   case tok::kw_extern:
725   case tok::kw_false:
726   case tok::kw_float:
727   case tok::kw_for:
728   case tok::kw_friend:
729   case tok::kw_goto:
730   case tok::kw_if:
731   case tok::kw_inline:
732   case tok::kw_int:
733   case tok::kw_long:
734   case tok::kw_mutable:
735   case tok::kw_namespace:
736   case tok::kw_new:
737   case tok::kw_operator:
738   case tok::kw_private:
739   case tok::kw_protected:
740   case tok::kw_public:
741   case tok::kw_register:
742   case tok::kw_reinterpret_cast:
743   case tok::kw_restrict:
744   case tok::kw_return:
745   case tok::kw_short:
746   case tok::kw_signed:
747   case tok::kw_sizeof:
748   case tok::kw_static:
749   case tok::kw_static_cast:
750   case tok::kw_struct:
751   case tok::kw_switch:
752   case tok::kw_template:
753   case tok::kw_this:
754   case tok::kw_throw:
755   case tok::kw_true:
756   case tok::kw_try:
757   case tok::kw_typedef:
758   case tok::kw_typeid:
759   case tok::kw_typename:
760   case tok::kw_typeof:
761   case tok::kw_union:
762   case tok::kw_unsigned:
763   case tok::kw_using:
764   case tok::kw_virtual:
765   case tok::kw_void:
766   case tok::kw_volatile:
767   case tok::kw_wchar_t:
768   case tok::kw_while:
769   case tok::kw__Bool:
770   case tok::kw__Complex:
771   case tok::kw___alignof:
772     IdentifierInfo *II = Tok.getIdentifierInfo();
773     SelectorLoc = ConsumeToken();
774     return II;
775   }
776 }
777 
778 ///  objc-for-collection-in: 'in'
779 ///
780 bool Parser::isTokIdentifier_in() const {
781   // FIXME: May have to do additional look-ahead to only allow for
782   // valid tokens following an 'in'; such as an identifier, unary operators,
783   // '[' etc.
784   return (getLangOpts().ObjC2 && Tok.is(tok::identifier) &&
785           Tok.getIdentifierInfo() == ObjCTypeQuals[objc_in]);
786 }
787 
788 /// ParseObjCTypeQualifierList - This routine parses the objective-c's type
789 /// qualifier list and builds their bitmask representation in the input
790 /// argument.
791 ///
792 ///   objc-type-qualifiers:
793 ///     objc-type-qualifier
794 ///     objc-type-qualifiers objc-type-qualifier
795 ///
796 void Parser::ParseObjCTypeQualifierList(ObjCDeclSpec &DS,
797                                         Declarator::TheContext Context) {
798   assert(Context == Declarator::ObjCParameterContext ||
799          Context == Declarator::ObjCResultContext);
800 
801   while (1) {
802     if (Tok.is(tok::code_completion)) {
803       Actions.CodeCompleteObjCPassingType(getCurScope(), DS,
804                           Context == Declarator::ObjCParameterContext);
805       return cutOffParsing();
806     }
807 
808     if (Tok.isNot(tok::identifier))
809       return;
810 
811     const IdentifierInfo *II = Tok.getIdentifierInfo();
812     for (unsigned i = 0; i != objc_NumQuals; ++i) {
813       if (II != ObjCTypeQuals[i])
814         continue;
815 
816       ObjCDeclSpec::ObjCDeclQualifier Qual;
817       switch (i) {
818       default: llvm_unreachable("Unknown decl qualifier");
819       case objc_in:     Qual = ObjCDeclSpec::DQ_In; break;
820       case objc_out:    Qual = ObjCDeclSpec::DQ_Out; break;
821       case objc_inout:  Qual = ObjCDeclSpec::DQ_Inout; break;
822       case objc_oneway: Qual = ObjCDeclSpec::DQ_Oneway; break;
823       case objc_bycopy: Qual = ObjCDeclSpec::DQ_Bycopy; break;
824       case objc_byref:  Qual = ObjCDeclSpec::DQ_Byref; break;
825       }
826       DS.setObjCDeclQualifier(Qual);
827       ConsumeToken();
828       II = 0;
829       break;
830     }
831 
832     // If this wasn't a recognized qualifier, bail out.
833     if (II) return;
834   }
835 }
836 
837 /// Take all the decl attributes out of the given list and add
838 /// them to the given attribute set.
839 static void takeDeclAttributes(ParsedAttributes &attrs,
840                                AttributeList *list) {
841   while (list) {
842     AttributeList *cur = list;
843     list = cur->getNext();
844 
845     if (!cur->isUsedAsTypeAttr()) {
846       // Clear out the next pointer.  We're really completely
847       // destroying the internal invariants of the declarator here,
848       // but it doesn't matter because we're done with it.
849       cur->setNext(0);
850       attrs.add(cur);
851     }
852   }
853 }
854 
855 /// takeDeclAttributes - Take all the decl attributes from the given
856 /// declarator and add them to the given list.
857 static void takeDeclAttributes(ParsedAttributes &attrs,
858                                Declarator &D) {
859   // First, take ownership of all attributes.
860   attrs.getPool().takeAllFrom(D.getAttributePool());
861   attrs.getPool().takeAllFrom(D.getDeclSpec().getAttributePool());
862 
863   // Now actually move the attributes over.
864   takeDeclAttributes(attrs, D.getDeclSpec().getAttributes().getList());
865   takeDeclAttributes(attrs, D.getAttributes());
866   for (unsigned i = 0, e = D.getNumTypeObjects(); i != e; ++i)
867     takeDeclAttributes(attrs,
868                   const_cast<AttributeList*>(D.getTypeObject(i).getAttrs()));
869 }
870 
871 ///   objc-type-name:
872 ///     '(' objc-type-qualifiers[opt] type-name ')'
873 ///     '(' objc-type-qualifiers[opt] ')'
874 ///
875 ParsedType Parser::ParseObjCTypeName(ObjCDeclSpec &DS,
876                                      Declarator::TheContext context,
877                                      ParsedAttributes *paramAttrs) {
878   assert(context == Declarator::ObjCParameterContext ||
879          context == Declarator::ObjCResultContext);
880   assert((paramAttrs != 0) == (context == Declarator::ObjCParameterContext));
881 
882   assert(Tok.is(tok::l_paren) && "expected (");
883 
884   BalancedDelimiterTracker T(*this, tok::l_paren);
885   T.consumeOpen();
886 
887   SourceLocation TypeStartLoc = Tok.getLocation();
888   ObjCDeclContextSwitch ObjCDC(*this);
889 
890   // Parse type qualifiers, in, inout, etc.
891   ParseObjCTypeQualifierList(DS, context);
892 
893   ParsedType Ty;
894   if (isTypeSpecifierQualifier()) {
895     // Parse an abstract declarator.
896     DeclSpec declSpec(AttrFactory);
897     declSpec.setObjCQualifiers(&DS);
898     ParseSpecifierQualifierList(declSpec);
899     declSpec.SetRangeEnd(Tok.getLocation());
900     Declarator declarator(declSpec, context);
901     ParseDeclarator(declarator);
902 
903     // If that's not invalid, extract a type.
904     if (!declarator.isInvalidType()) {
905       TypeResult type = Actions.ActOnTypeName(getCurScope(), declarator);
906       if (!type.isInvalid())
907         Ty = type.get();
908 
909       // If we're parsing a parameter, steal all the decl attributes
910       // and add them to the decl spec.
911       if (context == Declarator::ObjCParameterContext)
912         takeDeclAttributes(*paramAttrs, declarator);
913     }
914   } else if (context == Declarator::ObjCResultContext &&
915              Tok.is(tok::identifier)) {
916     if (!Ident_instancetype)
917       Ident_instancetype = PP.getIdentifierInfo("instancetype");
918 
919     if (Tok.getIdentifierInfo() == Ident_instancetype) {
920       Ty = Actions.ActOnObjCInstanceType(Tok.getLocation());
921       ConsumeToken();
922     }
923   }
924 
925   if (Tok.is(tok::r_paren))
926     T.consumeClose();
927   else if (Tok.getLocation() == TypeStartLoc) {
928     // If we didn't eat any tokens, then this isn't a type.
929     Diag(Tok, diag::err_expected_type);
930     SkipUntil(tok::r_paren);
931   } else {
932     // Otherwise, we found *something*, but didn't get a ')' in the right
933     // place.  Emit an error then return what we have as the type.
934     T.consumeClose();
935   }
936   return Ty;
937 }
938 
939 ///   objc-method-decl:
940 ///     objc-selector
941 ///     objc-keyword-selector objc-parmlist[opt]
942 ///     objc-type-name objc-selector
943 ///     objc-type-name objc-keyword-selector objc-parmlist[opt]
944 ///
945 ///   objc-keyword-selector:
946 ///     objc-keyword-decl
947 ///     objc-keyword-selector objc-keyword-decl
948 ///
949 ///   objc-keyword-decl:
950 ///     objc-selector ':' objc-type-name objc-keyword-attributes[opt] identifier
951 ///     objc-selector ':' objc-keyword-attributes[opt] identifier
952 ///     ':' objc-type-name objc-keyword-attributes[opt] identifier
953 ///     ':' objc-keyword-attributes[opt] identifier
954 ///
955 ///   objc-parmlist:
956 ///     objc-parms objc-ellipsis[opt]
957 ///
958 ///   objc-parms:
959 ///     objc-parms , parameter-declaration
960 ///
961 ///   objc-ellipsis:
962 ///     , ...
963 ///
964 ///   objc-keyword-attributes:         [OBJC2]
965 ///     __attribute__((unused))
966 ///
967 Decl *Parser::ParseObjCMethodDecl(SourceLocation mLoc,
968                                   tok::TokenKind mType,
969                                   tok::ObjCKeywordKind MethodImplKind,
970                                   bool MethodDefinition) {
971   ParsingDeclRAIIObject PD(*this, ParsingDeclRAIIObject::NoParent);
972 
973   if (Tok.is(tok::code_completion)) {
974     Actions.CodeCompleteObjCMethodDecl(getCurScope(), mType == tok::minus,
975                                        /*ReturnType=*/ ParsedType());
976     cutOffParsing();
977     return 0;
978   }
979 
980   // Parse the return type if present.
981   ParsedType ReturnType;
982   ObjCDeclSpec DSRet;
983   if (Tok.is(tok::l_paren))
984     ReturnType = ParseObjCTypeName(DSRet, Declarator::ObjCResultContext, 0);
985 
986   // If attributes exist before the method, parse them.
987   ParsedAttributes methodAttrs(AttrFactory);
988   if (getLangOpts().ObjC2)
989     MaybeParseGNUAttributes(methodAttrs);
990 
991   if (Tok.is(tok::code_completion)) {
992     Actions.CodeCompleteObjCMethodDecl(getCurScope(), mType == tok::minus,
993                                        ReturnType);
994     cutOffParsing();
995     return 0;
996   }
997 
998   // Now parse the selector.
999   SourceLocation selLoc;
1000   IdentifierInfo *SelIdent = ParseObjCSelectorPiece(selLoc);
1001 
1002   // An unnamed colon is valid.
1003   if (!SelIdent && Tok.isNot(tok::colon)) { // missing selector name.
1004     Diag(Tok, diag::err_expected_selector_for_method)
1005       << SourceRange(mLoc, Tok.getLocation());
1006     // Skip until we get a ; or @.
1007     SkipUntil(tok::at, true /*StopAtSemi*/, true /*don't consume*/);
1008     return 0;
1009   }
1010 
1011   SmallVector<DeclaratorChunk::ParamInfo, 8> CParamInfo;
1012   if (Tok.isNot(tok::colon)) {
1013     // If attributes exist after the method, parse them.
1014     if (getLangOpts().ObjC2)
1015       MaybeParseGNUAttributes(methodAttrs);
1016 
1017     Selector Sel = PP.getSelectorTable().getNullarySelector(SelIdent);
1018     Decl *Result
1019          = Actions.ActOnMethodDeclaration(getCurScope(), mLoc, Tok.getLocation(),
1020                                           mType, DSRet, ReturnType,
1021                                           selLoc, Sel, 0,
1022                                           CParamInfo.data(), CParamInfo.size(),
1023                                           methodAttrs.getList(), MethodImplKind,
1024                                           false, MethodDefinition);
1025     PD.complete(Result);
1026     return Result;
1027   }
1028 
1029   SmallVector<IdentifierInfo *, 12> KeyIdents;
1030   SmallVector<SourceLocation, 12> KeyLocs;
1031   SmallVector<Sema::ObjCArgInfo, 12> ArgInfos;
1032   ParseScope PrototypeScope(this, Scope::FunctionPrototypeScope |
1033                             Scope::FunctionDeclarationScope | Scope::DeclScope);
1034 
1035   AttributePool allParamAttrs(AttrFactory);
1036   while (1) {
1037     ParsedAttributes paramAttrs(AttrFactory);
1038     Sema::ObjCArgInfo ArgInfo;
1039 
1040     // Each iteration parses a single keyword argument.
1041     if (Tok.isNot(tok::colon)) {
1042       Diag(Tok, diag::err_expected_colon);
1043       break;
1044     }
1045     ConsumeToken(); // Eat the ':'.
1046 
1047     ArgInfo.Type = ParsedType();
1048     if (Tok.is(tok::l_paren)) // Parse the argument type if present.
1049       ArgInfo.Type = ParseObjCTypeName(ArgInfo.DeclSpec,
1050                                        Declarator::ObjCParameterContext,
1051                                        &paramAttrs);
1052 
1053     // If attributes exist before the argument name, parse them.
1054     // Regardless, collect all the attributes we've parsed so far.
1055     ArgInfo.ArgAttrs = 0;
1056     if (getLangOpts().ObjC2) {
1057       MaybeParseGNUAttributes(paramAttrs);
1058       ArgInfo.ArgAttrs = paramAttrs.getList();
1059     }
1060 
1061     // Code completion for the next piece of the selector.
1062     if (Tok.is(tok::code_completion)) {
1063       KeyIdents.push_back(SelIdent);
1064       Actions.CodeCompleteObjCMethodDeclSelector(getCurScope(),
1065                                                  mType == tok::minus,
1066                                                  /*AtParameterName=*/true,
1067                                                  ReturnType,
1068                                                  KeyIdents.data(),
1069                                                  KeyIdents.size());
1070       cutOffParsing();
1071       return 0;
1072     }
1073 
1074     if (Tok.isNot(tok::identifier)) {
1075       Diag(Tok, diag::err_expected_ident); // missing argument name.
1076       break;
1077     }
1078 
1079     ArgInfo.Name = Tok.getIdentifierInfo();
1080     ArgInfo.NameLoc = Tok.getLocation();
1081     ConsumeToken(); // Eat the identifier.
1082 
1083     ArgInfos.push_back(ArgInfo);
1084     KeyIdents.push_back(SelIdent);
1085     KeyLocs.push_back(selLoc);
1086 
1087     // Make sure the attributes persist.
1088     allParamAttrs.takeAllFrom(paramAttrs.getPool());
1089 
1090     // Code completion for the next piece of the selector.
1091     if (Tok.is(tok::code_completion)) {
1092       Actions.CodeCompleteObjCMethodDeclSelector(getCurScope(),
1093                                                  mType == tok::minus,
1094                                                  /*AtParameterName=*/false,
1095                                                  ReturnType,
1096                                                  KeyIdents.data(),
1097                                                  KeyIdents.size());
1098       cutOffParsing();
1099       return 0;
1100     }
1101 
1102     // Check for another keyword selector.
1103     SelIdent = ParseObjCSelectorPiece(selLoc);
1104     if (!SelIdent && Tok.isNot(tok::colon))
1105       break;
1106     if (!SelIdent) {
1107       SourceLocation ColonLoc = Tok.getLocation();
1108       if (PP.getLocForEndOfToken(ArgInfo.NameLoc) == ColonLoc) {
1109         Diag(ArgInfo.NameLoc, diag::warn_missing_selector_name) << ArgInfo.Name;
1110         Diag(ArgInfo.NameLoc, diag::note_missing_selector_name) << ArgInfo.Name;
1111         Diag(ColonLoc, diag::note_force_empty_selector_name) << ArgInfo.Name;
1112       }
1113     }
1114     // We have a selector or a colon, continue parsing.
1115   }
1116 
1117   bool isVariadic = false;
1118   bool cStyleParamWarned = false;
1119   // Parse the (optional) parameter list.
1120   while (Tok.is(tok::comma)) {
1121     ConsumeToken();
1122     if (Tok.is(tok::ellipsis)) {
1123       isVariadic = true;
1124       ConsumeToken();
1125       break;
1126     }
1127     if (!cStyleParamWarned) {
1128       Diag(Tok, diag::warn_cstyle_param);
1129       cStyleParamWarned = true;
1130     }
1131     DeclSpec DS(AttrFactory);
1132     ParseDeclarationSpecifiers(DS);
1133     // Parse the declarator.
1134     Declarator ParmDecl(DS, Declarator::PrototypeContext);
1135     ParseDeclarator(ParmDecl);
1136     IdentifierInfo *ParmII = ParmDecl.getIdentifier();
1137     Decl *Param = Actions.ActOnParamDeclarator(getCurScope(), ParmDecl);
1138     CParamInfo.push_back(DeclaratorChunk::ParamInfo(ParmII,
1139                                                     ParmDecl.getIdentifierLoc(),
1140                                                     Param,
1141                                                    0));
1142   }
1143 
1144   // FIXME: Add support for optional parameter list...
1145   // If attributes exist after the method, parse them.
1146   if (getLangOpts().ObjC2)
1147     MaybeParseGNUAttributes(methodAttrs);
1148 
1149   if (KeyIdents.size() == 0)
1150     return 0;
1151 
1152   Selector Sel = PP.getSelectorTable().getSelector(KeyIdents.size(),
1153                                                    &KeyIdents[0]);
1154   Decl *Result
1155        = Actions.ActOnMethodDeclaration(getCurScope(), mLoc, Tok.getLocation(),
1156                                         mType, DSRet, ReturnType,
1157                                         KeyLocs, Sel, &ArgInfos[0],
1158                                         CParamInfo.data(), CParamInfo.size(),
1159                                         methodAttrs.getList(),
1160                                         MethodImplKind, isVariadic, MethodDefinition);
1161 
1162   PD.complete(Result);
1163   return Result;
1164 }
1165 
1166 ///   objc-protocol-refs:
1167 ///     '<' identifier-list '>'
1168 ///
1169 bool Parser::
1170 ParseObjCProtocolReferences(SmallVectorImpl<Decl *> &Protocols,
1171                             SmallVectorImpl<SourceLocation> &ProtocolLocs,
1172                             bool WarnOnDeclarations,
1173                             SourceLocation &LAngleLoc, SourceLocation &EndLoc) {
1174   assert(Tok.is(tok::less) && "expected <");
1175 
1176   LAngleLoc = ConsumeToken(); // the "<"
1177 
1178   SmallVector<IdentifierLocPair, 8> ProtocolIdents;
1179 
1180   while (1) {
1181     if (Tok.is(tok::code_completion)) {
1182       Actions.CodeCompleteObjCProtocolReferences(ProtocolIdents.data(),
1183                                                  ProtocolIdents.size());
1184       cutOffParsing();
1185       return true;
1186     }
1187 
1188     if (Tok.isNot(tok::identifier)) {
1189       Diag(Tok, diag::err_expected_ident);
1190       SkipUntil(tok::greater);
1191       return true;
1192     }
1193     ProtocolIdents.push_back(std::make_pair(Tok.getIdentifierInfo(),
1194                                        Tok.getLocation()));
1195     ProtocolLocs.push_back(Tok.getLocation());
1196     ConsumeToken();
1197 
1198     if (Tok.isNot(tok::comma))
1199       break;
1200     ConsumeToken();
1201   }
1202 
1203   // Consume the '>'.
1204   if (ParseGreaterThanInTemplateList(EndLoc, /*ConsumeLastToken=*/true))
1205     return true;
1206 
1207   // Convert the list of protocols identifiers into a list of protocol decls.
1208   Actions.FindProtocolDeclaration(WarnOnDeclarations,
1209                                   &ProtocolIdents[0], ProtocolIdents.size(),
1210                                   Protocols);
1211   return false;
1212 }
1213 
1214 /// \brief Parse the Objective-C protocol qualifiers that follow a typename
1215 /// in a decl-specifier-seq, starting at the '<'.
1216 bool Parser::ParseObjCProtocolQualifiers(DeclSpec &DS) {
1217   assert(Tok.is(tok::less) && "Protocol qualifiers start with '<'");
1218   assert(getLangOpts().ObjC1 && "Protocol qualifiers only exist in Objective-C");
1219   SourceLocation LAngleLoc, EndProtoLoc;
1220   SmallVector<Decl *, 8> ProtocolDecl;
1221   SmallVector<SourceLocation, 8> ProtocolLocs;
1222   bool Result = ParseObjCProtocolReferences(ProtocolDecl, ProtocolLocs, false,
1223                                             LAngleLoc, EndProtoLoc);
1224   DS.setProtocolQualifiers(ProtocolDecl.data(), ProtocolDecl.size(),
1225                            ProtocolLocs.data(), LAngleLoc);
1226   if (EndProtoLoc.isValid())
1227     DS.SetRangeEnd(EndProtoLoc);
1228   return Result;
1229 }
1230 
1231 
1232 ///   objc-class-instance-variables:
1233 ///     '{' objc-instance-variable-decl-list[opt] '}'
1234 ///
1235 ///   objc-instance-variable-decl-list:
1236 ///     objc-visibility-spec
1237 ///     objc-instance-variable-decl ';'
1238 ///     ';'
1239 ///     objc-instance-variable-decl-list objc-visibility-spec
1240 ///     objc-instance-variable-decl-list objc-instance-variable-decl ';'
1241 ///     objc-instance-variable-decl-list ';'
1242 ///
1243 ///   objc-visibility-spec:
1244 ///     @private
1245 ///     @protected
1246 ///     @public
1247 ///     @package [OBJC2]
1248 ///
1249 ///   objc-instance-variable-decl:
1250 ///     struct-declaration
1251 ///
1252 void Parser::ParseObjCClassInstanceVariables(Decl *interfaceDecl,
1253                                              tok::ObjCKeywordKind visibility,
1254                                              SourceLocation atLoc) {
1255   assert(Tok.is(tok::l_brace) && "expected {");
1256   SmallVector<Decl *, 32> AllIvarDecls;
1257 
1258   ParseScope ClassScope(this, Scope::DeclScope|Scope::ClassScope);
1259   ObjCDeclContextSwitch ObjCDC(*this);
1260 
1261   BalancedDelimiterTracker T(*this, tok::l_brace);
1262   T.consumeOpen();
1263 
1264   // While we still have something to read, read the instance variables.
1265   while (Tok.isNot(tok::r_brace) && Tok.isNot(tok::eof)) {
1266     // Each iteration of this loop reads one objc-instance-variable-decl.
1267 
1268     // Check for extraneous top-level semicolon.
1269     if (Tok.is(tok::semi)) {
1270       ConsumeExtraSemi(InstanceVariableList);
1271       continue;
1272     }
1273 
1274     // Set the default visibility to private.
1275     if (Tok.is(tok::at)) { // parse objc-visibility-spec
1276       ConsumeToken(); // eat the @ sign
1277 
1278       if (Tok.is(tok::code_completion)) {
1279         Actions.CodeCompleteObjCAtVisibility(getCurScope());
1280         return cutOffParsing();
1281       }
1282 
1283       switch (Tok.getObjCKeywordID()) {
1284       case tok::objc_private:
1285       case tok::objc_public:
1286       case tok::objc_protected:
1287       case tok::objc_package:
1288         visibility = Tok.getObjCKeywordID();
1289         ConsumeToken();
1290         continue;
1291       default:
1292         Diag(Tok, diag::err_objc_illegal_visibility_spec);
1293         continue;
1294       }
1295     }
1296 
1297     if (Tok.is(tok::code_completion)) {
1298       Actions.CodeCompleteOrdinaryName(getCurScope(),
1299                                        Sema::PCC_ObjCInstanceVariableList);
1300       return cutOffParsing();
1301     }
1302 
1303     struct ObjCIvarCallback : FieldCallback {
1304       Parser &P;
1305       Decl *IDecl;
1306       tok::ObjCKeywordKind visibility;
1307       SmallVectorImpl<Decl *> &AllIvarDecls;
1308 
1309       ObjCIvarCallback(Parser &P, Decl *IDecl, tok::ObjCKeywordKind V,
1310                        SmallVectorImpl<Decl *> &AllIvarDecls) :
1311         P(P), IDecl(IDecl), visibility(V), AllIvarDecls(AllIvarDecls) {
1312       }
1313 
1314       void invoke(ParsingFieldDeclarator &FD) {
1315         P.Actions.ActOnObjCContainerStartDefinition(IDecl);
1316         // Install the declarator into the interface decl.
1317         Decl *Field
1318           = P.Actions.ActOnIvar(P.getCurScope(),
1319                                 FD.D.getDeclSpec().getSourceRange().getBegin(),
1320                                 FD.D, FD.BitfieldSize, visibility);
1321         P.Actions.ActOnObjCContainerFinishDefinition();
1322         if (Field)
1323           AllIvarDecls.push_back(Field);
1324         FD.complete(Field);
1325       }
1326     } Callback(*this, interfaceDecl, visibility, AllIvarDecls);
1327 
1328     // Parse all the comma separated declarators.
1329     ParsingDeclSpec DS(*this);
1330     ParseStructDeclaration(DS, Callback);
1331 
1332     if (Tok.is(tok::semi)) {
1333       ConsumeToken();
1334     } else {
1335       Diag(Tok, diag::err_expected_semi_decl_list);
1336       // Skip to end of block or statement
1337       SkipUntil(tok::r_brace, true, true);
1338     }
1339   }
1340   T.consumeClose();
1341 
1342   Actions.ActOnObjCContainerStartDefinition(interfaceDecl);
1343   Actions.ActOnLastBitfield(T.getCloseLocation(), AllIvarDecls);
1344   Actions.ActOnObjCContainerFinishDefinition();
1345   // Call ActOnFields() even if we don't have any decls. This is useful
1346   // for code rewriting tools that need to be aware of the empty list.
1347   Actions.ActOnFields(getCurScope(), atLoc, interfaceDecl,
1348                       AllIvarDecls,
1349                       T.getOpenLocation(), T.getCloseLocation(), 0);
1350   return;
1351 }
1352 
1353 ///   objc-protocol-declaration:
1354 ///     objc-protocol-definition
1355 ///     objc-protocol-forward-reference
1356 ///
1357 ///   objc-protocol-definition:
1358 ///     \@protocol identifier
1359 ///       objc-protocol-refs[opt]
1360 ///       objc-interface-decl-list
1361 ///     \@end
1362 ///
1363 ///   objc-protocol-forward-reference:
1364 ///     \@protocol identifier-list ';'
1365 ///
1366 ///   "\@protocol identifier ;" should be resolved as "\@protocol
1367 ///   identifier-list ;": objc-interface-decl-list may not start with a
1368 ///   semicolon in the first alternative if objc-protocol-refs are omitted.
1369 Parser::DeclGroupPtrTy
1370 Parser::ParseObjCAtProtocolDeclaration(SourceLocation AtLoc,
1371                                        ParsedAttributes &attrs) {
1372   assert(Tok.isObjCAtKeyword(tok::objc_protocol) &&
1373          "ParseObjCAtProtocolDeclaration(): Expected @protocol");
1374   ConsumeToken(); // the "protocol" identifier
1375 
1376   if (Tok.is(tok::code_completion)) {
1377     Actions.CodeCompleteObjCProtocolDecl(getCurScope());
1378     cutOffParsing();
1379     return DeclGroupPtrTy();
1380   }
1381 
1382   if (Tok.isNot(tok::identifier)) {
1383     Diag(Tok, diag::err_expected_ident); // missing protocol name.
1384     return DeclGroupPtrTy();
1385   }
1386   // Save the protocol name, then consume it.
1387   IdentifierInfo *protocolName = Tok.getIdentifierInfo();
1388   SourceLocation nameLoc = ConsumeToken();
1389 
1390   if (Tok.is(tok::semi)) { // forward declaration of one protocol.
1391     IdentifierLocPair ProtoInfo(protocolName, nameLoc);
1392     ConsumeToken();
1393     return Actions.ActOnForwardProtocolDeclaration(AtLoc, &ProtoInfo, 1,
1394                                                    attrs.getList());
1395   }
1396 
1397   CheckNestedObjCContexts(AtLoc);
1398 
1399   if (Tok.is(tok::comma)) { // list of forward declarations.
1400     SmallVector<IdentifierLocPair, 8> ProtocolRefs;
1401     ProtocolRefs.push_back(std::make_pair(protocolName, nameLoc));
1402 
1403     // Parse the list of forward declarations.
1404     while (1) {
1405       ConsumeToken(); // the ','
1406       if (Tok.isNot(tok::identifier)) {
1407         Diag(Tok, diag::err_expected_ident);
1408         SkipUntil(tok::semi);
1409         return DeclGroupPtrTy();
1410       }
1411       ProtocolRefs.push_back(IdentifierLocPair(Tok.getIdentifierInfo(),
1412                                                Tok.getLocation()));
1413       ConsumeToken(); // the identifier
1414 
1415       if (Tok.isNot(tok::comma))
1416         break;
1417     }
1418     // Consume the ';'.
1419     if (ExpectAndConsume(tok::semi, diag::err_expected_semi_after, "@protocol"))
1420       return DeclGroupPtrTy();
1421 
1422     return Actions.ActOnForwardProtocolDeclaration(AtLoc,
1423                                                    &ProtocolRefs[0],
1424                                                    ProtocolRefs.size(),
1425                                                    attrs.getList());
1426   }
1427 
1428   // Last, and definitely not least, parse a protocol declaration.
1429   SourceLocation LAngleLoc, EndProtoLoc;
1430 
1431   SmallVector<Decl *, 8> ProtocolRefs;
1432   SmallVector<SourceLocation, 8> ProtocolLocs;
1433   if (Tok.is(tok::less) &&
1434       ParseObjCProtocolReferences(ProtocolRefs, ProtocolLocs, false,
1435                                   LAngleLoc, EndProtoLoc))
1436     return DeclGroupPtrTy();
1437 
1438   Decl *ProtoType =
1439     Actions.ActOnStartProtocolInterface(AtLoc, protocolName, nameLoc,
1440                                         ProtocolRefs.data(),
1441                                         ProtocolRefs.size(),
1442                                         ProtocolLocs.data(),
1443                                         EndProtoLoc, attrs.getList());
1444 
1445   ParseObjCInterfaceDeclList(tok::objc_protocol, ProtoType);
1446   return Actions.ConvertDeclToDeclGroup(ProtoType);
1447 }
1448 
1449 ///   objc-implementation:
1450 ///     objc-class-implementation-prologue
1451 ///     objc-category-implementation-prologue
1452 ///
1453 ///   objc-class-implementation-prologue:
1454 ///     @implementation identifier objc-superclass[opt]
1455 ///       objc-class-instance-variables[opt]
1456 ///
1457 ///   objc-category-implementation-prologue:
1458 ///     @implementation identifier ( identifier )
1459 Parser::DeclGroupPtrTy
1460 Parser::ParseObjCAtImplementationDeclaration(SourceLocation AtLoc) {
1461   assert(Tok.isObjCAtKeyword(tok::objc_implementation) &&
1462          "ParseObjCAtImplementationDeclaration(): Expected @implementation");
1463   CheckNestedObjCContexts(AtLoc);
1464   ConsumeToken(); // the "implementation" identifier
1465 
1466   // Code completion after '@implementation'.
1467   if (Tok.is(tok::code_completion)) {
1468     Actions.CodeCompleteObjCImplementationDecl(getCurScope());
1469     cutOffParsing();
1470     return DeclGroupPtrTy();
1471   }
1472 
1473   if (Tok.isNot(tok::identifier)) {
1474     Diag(Tok, diag::err_expected_ident); // missing class or category name.
1475     return DeclGroupPtrTy();
1476   }
1477   // We have a class or category name - consume it.
1478   IdentifierInfo *nameId = Tok.getIdentifierInfo();
1479   SourceLocation nameLoc = ConsumeToken(); // consume class or category name
1480   Decl *ObjCImpDecl = 0;
1481 
1482   if (Tok.is(tok::l_paren)) {
1483     // we have a category implementation.
1484     ConsumeParen();
1485     SourceLocation categoryLoc, rparenLoc;
1486     IdentifierInfo *categoryId = 0;
1487 
1488     if (Tok.is(tok::code_completion)) {
1489       Actions.CodeCompleteObjCImplementationCategory(getCurScope(), nameId, nameLoc);
1490       cutOffParsing();
1491       return DeclGroupPtrTy();
1492     }
1493 
1494     if (Tok.is(tok::identifier)) {
1495       categoryId = Tok.getIdentifierInfo();
1496       categoryLoc = ConsumeToken();
1497     } else {
1498       Diag(Tok, diag::err_expected_ident); // missing category name.
1499       return DeclGroupPtrTy();
1500     }
1501     if (Tok.isNot(tok::r_paren)) {
1502       Diag(Tok, diag::err_expected_rparen);
1503       SkipUntil(tok::r_paren, false); // don't stop at ';'
1504       return DeclGroupPtrTy();
1505     }
1506     rparenLoc = ConsumeParen();
1507     ObjCImpDecl = Actions.ActOnStartCategoryImplementation(
1508                                     AtLoc, nameId, nameLoc, categoryId,
1509                                     categoryLoc);
1510 
1511   } else {
1512     // We have a class implementation
1513     SourceLocation superClassLoc;
1514     IdentifierInfo *superClassId = 0;
1515     if (Tok.is(tok::colon)) {
1516       // We have a super class
1517       ConsumeToken();
1518       if (Tok.isNot(tok::identifier)) {
1519         Diag(Tok, diag::err_expected_ident); // missing super class name.
1520         return DeclGroupPtrTy();
1521       }
1522       superClassId = Tok.getIdentifierInfo();
1523       superClassLoc = ConsumeToken(); // Consume super class name
1524     }
1525     ObjCImpDecl = Actions.ActOnStartClassImplementation(
1526                                     AtLoc, nameId, nameLoc,
1527                                     superClassId, superClassLoc);
1528 
1529     if (Tok.is(tok::l_brace)) // we have ivars
1530       ParseObjCClassInstanceVariables(ObjCImpDecl, tok::objc_private, AtLoc);
1531   }
1532   assert(ObjCImpDecl);
1533 
1534   SmallVector<Decl *, 8> DeclsInGroup;
1535 
1536   {
1537     ObjCImplParsingDataRAII ObjCImplParsing(*this, ObjCImpDecl);
1538     while (!ObjCImplParsing.isFinished() && Tok.isNot(tok::eof)) {
1539       ParsedAttributesWithRange attrs(AttrFactory);
1540       MaybeParseCXX11Attributes(attrs);
1541       MaybeParseMicrosoftAttributes(attrs);
1542       if (DeclGroupPtrTy DGP = ParseExternalDeclaration(attrs)) {
1543         DeclGroupRef DG = DGP.get();
1544         DeclsInGroup.append(DG.begin(), DG.end());
1545       }
1546     }
1547   }
1548 
1549   return Actions.ActOnFinishObjCImplementation(ObjCImpDecl, DeclsInGroup);
1550 }
1551 
1552 Parser::DeclGroupPtrTy
1553 Parser::ParseObjCAtEndDeclaration(SourceRange atEnd) {
1554   assert(Tok.isObjCAtKeyword(tok::objc_end) &&
1555          "ParseObjCAtEndDeclaration(): Expected @end");
1556   ConsumeToken(); // the "end" identifier
1557   if (CurParsedObjCImpl)
1558     CurParsedObjCImpl->finish(atEnd);
1559   else
1560     // missing @implementation
1561     Diag(atEnd.getBegin(), diag::err_expected_objc_container);
1562   return DeclGroupPtrTy();
1563 }
1564 
1565 Parser::ObjCImplParsingDataRAII::~ObjCImplParsingDataRAII() {
1566   if (!Finished) {
1567     finish(P.Tok.getLocation());
1568     if (P.Tok.is(tok::eof)) {
1569       P.Diag(P.Tok, diag::err_objc_missing_end)
1570           << FixItHint::CreateInsertion(P.Tok.getLocation(), "\n@end\n");
1571       P.Diag(Dcl->getLocStart(), diag::note_objc_container_start)
1572           << Sema::OCK_Implementation;
1573     }
1574   }
1575   P.CurParsedObjCImpl = 0;
1576   assert(LateParsedObjCMethods.empty());
1577 }
1578 
1579 void Parser::ObjCImplParsingDataRAII::finish(SourceRange AtEnd) {
1580   assert(!Finished);
1581   P.Actions.DefaultSynthesizeProperties(P.getCurScope(), Dcl);
1582   for (size_t i = 0; i < LateParsedObjCMethods.size(); ++i)
1583     P.ParseLexedObjCMethodDefs(*LateParsedObjCMethods[i],
1584                                true/*Methods*/);
1585 
1586   P.Actions.ActOnAtEnd(P.getCurScope(), AtEnd);
1587 
1588   if (HasCFunction)
1589     for (size_t i = 0; i < LateParsedObjCMethods.size(); ++i)
1590       P.ParseLexedObjCMethodDefs(*LateParsedObjCMethods[i],
1591                                  false/*c-functions*/);
1592 
1593   /// \brief Clear and free the cached objc methods.
1594   for (LateParsedObjCMethodContainer::iterator
1595          I = LateParsedObjCMethods.begin(),
1596          E = LateParsedObjCMethods.end(); I != E; ++I)
1597     delete *I;
1598   LateParsedObjCMethods.clear();
1599 
1600   Finished = true;
1601 }
1602 
1603 ///   compatibility-alias-decl:
1604 ///     @compatibility_alias alias-name  class-name ';'
1605 ///
1606 Decl *Parser::ParseObjCAtAliasDeclaration(SourceLocation atLoc) {
1607   assert(Tok.isObjCAtKeyword(tok::objc_compatibility_alias) &&
1608          "ParseObjCAtAliasDeclaration(): Expected @compatibility_alias");
1609   ConsumeToken(); // consume compatibility_alias
1610   if (Tok.isNot(tok::identifier)) {
1611     Diag(Tok, diag::err_expected_ident);
1612     return 0;
1613   }
1614   IdentifierInfo *aliasId = Tok.getIdentifierInfo();
1615   SourceLocation aliasLoc = ConsumeToken(); // consume alias-name
1616   if (Tok.isNot(tok::identifier)) {
1617     Diag(Tok, diag::err_expected_ident);
1618     return 0;
1619   }
1620   IdentifierInfo *classId = Tok.getIdentifierInfo();
1621   SourceLocation classLoc = ConsumeToken(); // consume class-name;
1622   ExpectAndConsume(tok::semi, diag::err_expected_semi_after,
1623                    "@compatibility_alias");
1624   return Actions.ActOnCompatibilityAlias(atLoc, aliasId, aliasLoc,
1625                                          classId, classLoc);
1626 }
1627 
1628 ///   property-synthesis:
1629 ///     @synthesize property-ivar-list ';'
1630 ///
1631 ///   property-ivar-list:
1632 ///     property-ivar
1633 ///     property-ivar-list ',' property-ivar
1634 ///
1635 ///   property-ivar:
1636 ///     identifier
1637 ///     identifier '=' identifier
1638 ///
1639 Decl *Parser::ParseObjCPropertySynthesize(SourceLocation atLoc) {
1640   assert(Tok.isObjCAtKeyword(tok::objc_synthesize) &&
1641          "ParseObjCPropertyDynamic(): Expected '@synthesize'");
1642   ConsumeToken(); // consume synthesize
1643 
1644   while (true) {
1645     if (Tok.is(tok::code_completion)) {
1646       Actions.CodeCompleteObjCPropertyDefinition(getCurScope());
1647       cutOffParsing();
1648       return 0;
1649     }
1650 
1651     if (Tok.isNot(tok::identifier)) {
1652       Diag(Tok, diag::err_synthesized_property_name);
1653       SkipUntil(tok::semi);
1654       return 0;
1655     }
1656 
1657     IdentifierInfo *propertyIvar = 0;
1658     IdentifierInfo *propertyId = Tok.getIdentifierInfo();
1659     SourceLocation propertyLoc = ConsumeToken(); // consume property name
1660     SourceLocation propertyIvarLoc;
1661     if (Tok.is(tok::equal)) {
1662       // property '=' ivar-name
1663       ConsumeToken(); // consume '='
1664 
1665       if (Tok.is(tok::code_completion)) {
1666         Actions.CodeCompleteObjCPropertySynthesizeIvar(getCurScope(), propertyId);
1667         cutOffParsing();
1668         return 0;
1669       }
1670 
1671       if (Tok.isNot(tok::identifier)) {
1672         Diag(Tok, diag::err_expected_ident);
1673         break;
1674       }
1675       propertyIvar = Tok.getIdentifierInfo();
1676       propertyIvarLoc = ConsumeToken(); // consume ivar-name
1677     }
1678     Actions.ActOnPropertyImplDecl(getCurScope(), atLoc, propertyLoc, true,
1679                                   propertyId, propertyIvar, propertyIvarLoc);
1680     if (Tok.isNot(tok::comma))
1681       break;
1682     ConsumeToken(); // consume ','
1683   }
1684   ExpectAndConsume(tok::semi, diag::err_expected_semi_after, "@synthesize");
1685   return 0;
1686 }
1687 
1688 ///   property-dynamic:
1689 ///     @dynamic  property-list
1690 ///
1691 ///   property-list:
1692 ///     identifier
1693 ///     property-list ',' identifier
1694 ///
1695 Decl *Parser::ParseObjCPropertyDynamic(SourceLocation atLoc) {
1696   assert(Tok.isObjCAtKeyword(tok::objc_dynamic) &&
1697          "ParseObjCPropertyDynamic(): Expected '@dynamic'");
1698   ConsumeToken(); // consume dynamic
1699   while (true) {
1700     if (Tok.is(tok::code_completion)) {
1701       Actions.CodeCompleteObjCPropertyDefinition(getCurScope());
1702       cutOffParsing();
1703       return 0;
1704     }
1705 
1706     if (Tok.isNot(tok::identifier)) {
1707       Diag(Tok, diag::err_expected_ident);
1708       SkipUntil(tok::semi);
1709       return 0;
1710     }
1711 
1712     IdentifierInfo *propertyId = Tok.getIdentifierInfo();
1713     SourceLocation propertyLoc = ConsumeToken(); // consume property name
1714     Actions.ActOnPropertyImplDecl(getCurScope(), atLoc, propertyLoc, false,
1715                                   propertyId, 0, SourceLocation());
1716 
1717     if (Tok.isNot(tok::comma))
1718       break;
1719     ConsumeToken(); // consume ','
1720   }
1721   ExpectAndConsume(tok::semi, diag::err_expected_semi_after, "@dynamic");
1722   return 0;
1723 }
1724 
1725 ///  objc-throw-statement:
1726 ///    throw expression[opt];
1727 ///
1728 StmtResult Parser::ParseObjCThrowStmt(SourceLocation atLoc) {
1729   ExprResult Res;
1730   ConsumeToken(); // consume throw
1731   if (Tok.isNot(tok::semi)) {
1732     Res = ParseExpression();
1733     if (Res.isInvalid()) {
1734       SkipUntil(tok::semi);
1735       return StmtError();
1736     }
1737   }
1738   // consume ';'
1739   ExpectAndConsume(tok::semi, diag::err_expected_semi_after, "@throw");
1740   return Actions.ActOnObjCAtThrowStmt(atLoc, Res.take(), getCurScope());
1741 }
1742 
1743 /// objc-synchronized-statement:
1744 ///   @synchronized '(' expression ')' compound-statement
1745 ///
1746 StmtResult
1747 Parser::ParseObjCSynchronizedStmt(SourceLocation atLoc) {
1748   ConsumeToken(); // consume synchronized
1749   if (Tok.isNot(tok::l_paren)) {
1750     Diag(Tok, diag::err_expected_lparen_after) << "@synchronized";
1751     return StmtError();
1752   }
1753 
1754   // The operand is surrounded with parentheses.
1755   ConsumeParen();  // '('
1756   ExprResult operand(ParseExpression());
1757 
1758   if (Tok.is(tok::r_paren)) {
1759     ConsumeParen();  // ')'
1760   } else {
1761     if (!operand.isInvalid())
1762       Diag(Tok, diag::err_expected_rparen);
1763 
1764     // Skip forward until we see a left brace, but don't consume it.
1765     SkipUntil(tok::l_brace, true, true);
1766   }
1767 
1768   // Require a compound statement.
1769   if (Tok.isNot(tok::l_brace)) {
1770     if (!operand.isInvalid())
1771       Diag(Tok, diag::err_expected_lbrace);
1772     return StmtError();
1773   }
1774 
1775   // Check the @synchronized operand now.
1776   if (!operand.isInvalid())
1777     operand = Actions.ActOnObjCAtSynchronizedOperand(atLoc, operand.take());
1778 
1779   // Parse the compound statement within a new scope.
1780   ParseScope bodyScope(this, Scope::DeclScope);
1781   StmtResult body(ParseCompoundStatementBody());
1782   bodyScope.Exit();
1783 
1784   // If there was a semantic or parse error earlier with the
1785   // operand, fail now.
1786   if (operand.isInvalid())
1787     return StmtError();
1788 
1789   if (body.isInvalid())
1790     body = Actions.ActOnNullStmt(Tok.getLocation());
1791 
1792   return Actions.ActOnObjCAtSynchronizedStmt(atLoc, operand.get(), body.get());
1793 }
1794 
1795 ///  objc-try-catch-statement:
1796 ///    @try compound-statement objc-catch-list[opt]
1797 ///    @try compound-statement objc-catch-list[opt] @finally compound-statement
1798 ///
1799 ///  objc-catch-list:
1800 ///    @catch ( parameter-declaration ) compound-statement
1801 ///    objc-catch-list @catch ( catch-parameter-declaration ) compound-statement
1802 ///  catch-parameter-declaration:
1803 ///     parameter-declaration
1804 ///     '...' [OBJC2]
1805 ///
1806 StmtResult Parser::ParseObjCTryStmt(SourceLocation atLoc) {
1807   bool catch_or_finally_seen = false;
1808 
1809   ConsumeToken(); // consume try
1810   if (Tok.isNot(tok::l_brace)) {
1811     Diag(Tok, diag::err_expected_lbrace);
1812     return StmtError();
1813   }
1814   StmtVector CatchStmts;
1815   StmtResult FinallyStmt;
1816   ParseScope TryScope(this, Scope::DeclScope);
1817   StmtResult TryBody(ParseCompoundStatementBody());
1818   TryScope.Exit();
1819   if (TryBody.isInvalid())
1820     TryBody = Actions.ActOnNullStmt(Tok.getLocation());
1821 
1822   while (Tok.is(tok::at)) {
1823     // At this point, we need to lookahead to determine if this @ is the start
1824     // of an @catch or @finally.  We don't want to consume the @ token if this
1825     // is an @try or @encode or something else.
1826     Token AfterAt = GetLookAheadToken(1);
1827     if (!AfterAt.isObjCAtKeyword(tok::objc_catch) &&
1828         !AfterAt.isObjCAtKeyword(tok::objc_finally))
1829       break;
1830 
1831     SourceLocation AtCatchFinallyLoc = ConsumeToken();
1832     if (Tok.isObjCAtKeyword(tok::objc_catch)) {
1833       Decl *FirstPart = 0;
1834       ConsumeToken(); // consume catch
1835       if (Tok.is(tok::l_paren)) {
1836         ConsumeParen();
1837         ParseScope CatchScope(this, Scope::DeclScope|Scope::AtCatchScope);
1838         if (Tok.isNot(tok::ellipsis)) {
1839           DeclSpec DS(AttrFactory);
1840           ParseDeclarationSpecifiers(DS);
1841           Declarator ParmDecl(DS, Declarator::ObjCCatchContext);
1842           ParseDeclarator(ParmDecl);
1843 
1844           // Inform the actions module about the declarator, so it
1845           // gets added to the current scope.
1846           FirstPart = Actions.ActOnObjCExceptionDecl(getCurScope(), ParmDecl);
1847         } else
1848           ConsumeToken(); // consume '...'
1849 
1850         SourceLocation RParenLoc;
1851 
1852         if (Tok.is(tok::r_paren))
1853           RParenLoc = ConsumeParen();
1854         else // Skip over garbage, until we get to ')'.  Eat the ')'.
1855           SkipUntil(tok::r_paren, true, false);
1856 
1857         StmtResult CatchBody(true);
1858         if (Tok.is(tok::l_brace))
1859           CatchBody = ParseCompoundStatementBody();
1860         else
1861           Diag(Tok, diag::err_expected_lbrace);
1862         if (CatchBody.isInvalid())
1863           CatchBody = Actions.ActOnNullStmt(Tok.getLocation());
1864 
1865         StmtResult Catch = Actions.ActOnObjCAtCatchStmt(AtCatchFinallyLoc,
1866                                                               RParenLoc,
1867                                                               FirstPart,
1868                                                               CatchBody.take());
1869         if (!Catch.isInvalid())
1870           CatchStmts.push_back(Catch.release());
1871 
1872       } else {
1873         Diag(AtCatchFinallyLoc, diag::err_expected_lparen_after)
1874           << "@catch clause";
1875         return StmtError();
1876       }
1877       catch_or_finally_seen = true;
1878     } else {
1879       assert(Tok.isObjCAtKeyword(tok::objc_finally) && "Lookahead confused?");
1880       ConsumeToken(); // consume finally
1881       ParseScope FinallyScope(this, Scope::DeclScope);
1882 
1883       StmtResult FinallyBody(true);
1884       if (Tok.is(tok::l_brace))
1885         FinallyBody = ParseCompoundStatementBody();
1886       else
1887         Diag(Tok, diag::err_expected_lbrace);
1888       if (FinallyBody.isInvalid())
1889         FinallyBody = Actions.ActOnNullStmt(Tok.getLocation());
1890       FinallyStmt = Actions.ActOnObjCAtFinallyStmt(AtCatchFinallyLoc,
1891                                                    FinallyBody.take());
1892       catch_or_finally_seen = true;
1893       break;
1894     }
1895   }
1896   if (!catch_or_finally_seen) {
1897     Diag(atLoc, diag::err_missing_catch_finally);
1898     return StmtError();
1899   }
1900 
1901   return Actions.ActOnObjCAtTryStmt(atLoc, TryBody.take(),
1902                                     CatchStmts,
1903                                     FinallyStmt.take());
1904 }
1905 
1906 /// objc-autoreleasepool-statement:
1907 ///   @autoreleasepool compound-statement
1908 ///
1909 StmtResult
1910 Parser::ParseObjCAutoreleasePoolStmt(SourceLocation atLoc) {
1911   ConsumeToken(); // consume autoreleasepool
1912   if (Tok.isNot(tok::l_brace)) {
1913     Diag(Tok, diag::err_expected_lbrace);
1914     return StmtError();
1915   }
1916   // Enter a scope to hold everything within the compound stmt.  Compound
1917   // statements can always hold declarations.
1918   ParseScope BodyScope(this, Scope::DeclScope);
1919 
1920   StmtResult AutoreleasePoolBody(ParseCompoundStatementBody());
1921 
1922   BodyScope.Exit();
1923   if (AutoreleasePoolBody.isInvalid())
1924     AutoreleasePoolBody = Actions.ActOnNullStmt(Tok.getLocation());
1925   return Actions.ActOnObjCAutoreleasePoolStmt(atLoc,
1926                                                 AutoreleasePoolBody.take());
1927 }
1928 
1929 /// StashAwayMethodOrFunctionBodyTokens -  Consume the tokens and store them
1930 /// for later parsing.
1931 void Parser::StashAwayMethodOrFunctionBodyTokens(Decl *MDecl) {
1932   LexedMethod* LM = new LexedMethod(this, MDecl);
1933   CurParsedObjCImpl->LateParsedObjCMethods.push_back(LM);
1934   CachedTokens &Toks = LM->Toks;
1935   // Begin by storing the '{' or 'try' or ':' token.
1936   Toks.push_back(Tok);
1937   if (Tok.is(tok::kw_try)) {
1938     ConsumeToken();
1939     if (Tok.is(tok::colon)) {
1940       Toks.push_back(Tok);
1941       ConsumeToken();
1942       while (Tok.isNot(tok::l_brace)) {
1943         ConsumeAndStoreUntil(tok::l_paren, Toks, /*StopAtSemi=*/false);
1944         ConsumeAndStoreUntil(tok::r_paren, Toks, /*StopAtSemi=*/false);
1945       }
1946     }
1947     Toks.push_back(Tok); // also store '{'
1948   }
1949   else if (Tok.is(tok::colon)) {
1950     ConsumeToken();
1951     while (Tok.isNot(tok::l_brace)) {
1952       ConsumeAndStoreUntil(tok::l_paren, Toks, /*StopAtSemi=*/false);
1953       ConsumeAndStoreUntil(tok::r_paren, Toks, /*StopAtSemi=*/false);
1954     }
1955     Toks.push_back(Tok); // also store '{'
1956   }
1957   ConsumeBrace();
1958   // Consume everything up to (and including) the matching right brace.
1959   ConsumeAndStoreUntil(tok::r_brace, Toks, /*StopAtSemi=*/false);
1960   while (Tok.is(tok::kw_catch)) {
1961     ConsumeAndStoreUntil(tok::l_brace, Toks, /*StopAtSemi=*/false);
1962     ConsumeAndStoreUntil(tok::r_brace, Toks, /*StopAtSemi=*/false);
1963   }
1964 }
1965 
1966 ///   objc-method-def: objc-method-proto ';'[opt] '{' body '}'
1967 ///
1968 Decl *Parser::ParseObjCMethodDefinition() {
1969   Decl *MDecl = ParseObjCMethodPrototype();
1970 
1971   PrettyDeclStackTraceEntry CrashInfo(Actions, MDecl, Tok.getLocation(),
1972                                       "parsing Objective-C method");
1973 
1974   // parse optional ';'
1975   if (Tok.is(tok::semi)) {
1976     if (CurParsedObjCImpl) {
1977       Diag(Tok, diag::warn_semicolon_before_method_body)
1978         << FixItHint::CreateRemoval(Tok.getLocation());
1979     }
1980     ConsumeToken();
1981   }
1982 
1983   // We should have an opening brace now.
1984   if (Tok.isNot(tok::l_brace)) {
1985     Diag(Tok, diag::err_expected_method_body);
1986 
1987     // Skip over garbage, until we get to '{'.  Don't eat the '{'.
1988     SkipUntil(tok::l_brace, true, true);
1989 
1990     // If we didn't find the '{', bail out.
1991     if (Tok.isNot(tok::l_brace))
1992       return 0;
1993   }
1994 
1995   if (!MDecl) {
1996     ConsumeBrace();
1997     SkipUntil(tok::r_brace, /*StopAtSemi=*/false);
1998     return 0;
1999   }
2000 
2001   // Allow the rest of sema to find private method decl implementations.
2002   Actions.AddAnyMethodToGlobalPool(MDecl);
2003   assert (CurParsedObjCImpl
2004           && "ParseObjCMethodDefinition - Method out of @implementation");
2005   // Consume the tokens and store them for later parsing.
2006   StashAwayMethodOrFunctionBodyTokens(MDecl);
2007   return MDecl;
2008 }
2009 
2010 StmtResult Parser::ParseObjCAtStatement(SourceLocation AtLoc) {
2011   if (Tok.is(tok::code_completion)) {
2012     Actions.CodeCompleteObjCAtStatement(getCurScope());
2013     cutOffParsing();
2014     return StmtError();
2015   }
2016 
2017   if (Tok.isObjCAtKeyword(tok::objc_try))
2018     return ParseObjCTryStmt(AtLoc);
2019 
2020   if (Tok.isObjCAtKeyword(tok::objc_throw))
2021     return ParseObjCThrowStmt(AtLoc);
2022 
2023   if (Tok.isObjCAtKeyword(tok::objc_synchronized))
2024     return ParseObjCSynchronizedStmt(AtLoc);
2025 
2026   if (Tok.isObjCAtKeyword(tok::objc_autoreleasepool))
2027     return ParseObjCAutoreleasePoolStmt(AtLoc);
2028 
2029   ExprResult Res(ParseExpressionWithLeadingAt(AtLoc));
2030   if (Res.isInvalid()) {
2031     // If the expression is invalid, skip ahead to the next semicolon. Not
2032     // doing this opens us up to the possibility of infinite loops if
2033     // ParseExpression does not consume any tokens.
2034     SkipUntil(tok::semi);
2035     return StmtError();
2036   }
2037 
2038   // Otherwise, eat the semicolon.
2039   ExpectAndConsumeSemi(diag::err_expected_semi_after_expr);
2040   return Actions.ActOnExprStmt(Res);
2041 }
2042 
2043 ExprResult Parser::ParseObjCAtExpression(SourceLocation AtLoc) {
2044   switch (Tok.getKind()) {
2045   case tok::code_completion:
2046     Actions.CodeCompleteObjCAtExpression(getCurScope());
2047     cutOffParsing();
2048     return ExprError();
2049 
2050   case tok::minus:
2051   case tok::plus: {
2052     tok::TokenKind Kind = Tok.getKind();
2053     SourceLocation OpLoc = ConsumeToken();
2054 
2055     if (!Tok.is(tok::numeric_constant)) {
2056       const char *Symbol = 0;
2057       switch (Kind) {
2058       case tok::minus: Symbol = "-"; break;
2059       case tok::plus: Symbol = "+"; break;
2060       default: llvm_unreachable("missing unary operator case");
2061       }
2062       Diag(Tok, diag::err_nsnumber_nonliteral_unary)
2063         << Symbol;
2064       return ExprError();
2065     }
2066 
2067     ExprResult Lit(Actions.ActOnNumericConstant(Tok));
2068     if (Lit.isInvalid()) {
2069       return Lit;
2070     }
2071     ConsumeToken(); // Consume the literal token.
2072 
2073     Lit = Actions.ActOnUnaryOp(getCurScope(), OpLoc, Kind, Lit.take());
2074     if (Lit.isInvalid())
2075       return Lit;
2076 
2077     return ParsePostfixExpressionSuffix(
2078              Actions.BuildObjCNumericLiteral(AtLoc, Lit.take()));
2079   }
2080 
2081   case tok::string_literal:    // primary-expression: string-literal
2082   case tok::wide_string_literal:
2083     return ParsePostfixExpressionSuffix(ParseObjCStringLiteral(AtLoc));
2084 
2085   case tok::char_constant:
2086     return ParsePostfixExpressionSuffix(ParseObjCCharacterLiteral(AtLoc));
2087 
2088   case tok::numeric_constant:
2089     return ParsePostfixExpressionSuffix(ParseObjCNumericLiteral(AtLoc));
2090 
2091   case tok::kw_true:  // Objective-C++, etc.
2092   case tok::kw___objc_yes: // c/c++/objc/objc++ __objc_yes
2093     return ParsePostfixExpressionSuffix(ParseObjCBooleanLiteral(AtLoc, true));
2094   case tok::kw_false: // Objective-C++, etc.
2095   case tok::kw___objc_no: // c/c++/objc/objc++ __objc_no
2096     return ParsePostfixExpressionSuffix(ParseObjCBooleanLiteral(AtLoc, false));
2097 
2098   case tok::l_square:
2099     // Objective-C array literal
2100     return ParsePostfixExpressionSuffix(ParseObjCArrayLiteral(AtLoc));
2101 
2102   case tok::l_brace:
2103     // Objective-C dictionary literal
2104     return ParsePostfixExpressionSuffix(ParseObjCDictionaryLiteral(AtLoc));
2105 
2106   case tok::l_paren:
2107     // Objective-C boxed expression
2108     return ParsePostfixExpressionSuffix(ParseObjCBoxedExpr(AtLoc));
2109 
2110   default:
2111     if (Tok.getIdentifierInfo() == 0)
2112       return ExprError(Diag(AtLoc, diag::err_unexpected_at));
2113 
2114     switch (Tok.getIdentifierInfo()->getObjCKeywordID()) {
2115     case tok::objc_encode:
2116       return ParsePostfixExpressionSuffix(ParseObjCEncodeExpression(AtLoc));
2117     case tok::objc_protocol:
2118       return ParsePostfixExpressionSuffix(ParseObjCProtocolExpression(AtLoc));
2119     case tok::objc_selector:
2120       return ParsePostfixExpressionSuffix(ParseObjCSelectorExpression(AtLoc));
2121       default: {
2122         const char *str = 0;
2123         if (GetLookAheadToken(1).is(tok::l_brace)) {
2124           char ch = Tok.getIdentifierInfo()->getNameStart()[0];
2125           str =
2126             ch == 't' ? "try"
2127                       : (ch == 'f' ? "finally"
2128                                    : (ch == 'a' ? "autoreleasepool" : 0));
2129         }
2130         if (str) {
2131           SourceLocation kwLoc = Tok.getLocation();
2132           return ExprError(Diag(AtLoc, diag::err_unexpected_at) <<
2133                              FixItHint::CreateReplacement(kwLoc, str));
2134         }
2135         else
2136           return ExprError(Diag(AtLoc, diag::err_unexpected_at));
2137       }
2138     }
2139   }
2140 }
2141 
2142 /// \brief Parse the receiver of an Objective-C++ message send.
2143 ///
2144 /// This routine parses the receiver of a message send in
2145 /// Objective-C++ either as a type or as an expression. Note that this
2146 /// routine must not be called to parse a send to 'super', since it
2147 /// has no way to return such a result.
2148 ///
2149 /// \param IsExpr Whether the receiver was parsed as an expression.
2150 ///
2151 /// \param TypeOrExpr If the receiver was parsed as an expression (\c
2152 /// IsExpr is true), the parsed expression. If the receiver was parsed
2153 /// as a type (\c IsExpr is false), the parsed type.
2154 ///
2155 /// \returns True if an error occurred during parsing or semantic
2156 /// analysis, in which case the arguments do not have valid
2157 /// values. Otherwise, returns false for a successful parse.
2158 ///
2159 ///   objc-receiver: [C++]
2160 ///     'super' [not parsed here]
2161 ///     expression
2162 ///     simple-type-specifier
2163 ///     typename-specifier
2164 bool Parser::ParseObjCXXMessageReceiver(bool &IsExpr, void *&TypeOrExpr) {
2165   InMessageExpressionRAIIObject InMessage(*this, true);
2166 
2167   if (Tok.is(tok::identifier) || Tok.is(tok::coloncolon) ||
2168       Tok.is(tok::kw_typename) || Tok.is(tok::annot_cxxscope))
2169     TryAnnotateTypeOrScopeToken();
2170 
2171   if (!Actions.isSimpleTypeSpecifier(Tok.getKind())) {
2172     //   objc-receiver:
2173     //     expression
2174     ExprResult Receiver = ParseExpression();
2175     if (Receiver.isInvalid())
2176       return true;
2177 
2178     IsExpr = true;
2179     TypeOrExpr = Receiver.take();
2180     return false;
2181   }
2182 
2183   // objc-receiver:
2184   //   typename-specifier
2185   //   simple-type-specifier
2186   //   expression (that starts with one of the above)
2187   DeclSpec DS(AttrFactory);
2188   ParseCXXSimpleTypeSpecifier(DS);
2189 
2190   if (Tok.is(tok::l_paren)) {
2191     // If we see an opening parentheses at this point, we are
2192     // actually parsing an expression that starts with a
2193     // function-style cast, e.g.,
2194     //
2195     //   postfix-expression:
2196     //     simple-type-specifier ( expression-list [opt] )
2197     //     typename-specifier ( expression-list [opt] )
2198     //
2199     // Parse the remainder of this case, then the (optional)
2200     // postfix-expression suffix, followed by the (optional)
2201     // right-hand side of the binary expression. We have an
2202     // instance method.
2203     ExprResult Receiver = ParseCXXTypeConstructExpression(DS);
2204     if (!Receiver.isInvalid())
2205       Receiver = ParsePostfixExpressionSuffix(Receiver.take());
2206     if (!Receiver.isInvalid())
2207       Receiver = ParseRHSOfBinaryExpression(Receiver.take(), prec::Comma);
2208     if (Receiver.isInvalid())
2209       return true;
2210 
2211     IsExpr = true;
2212     TypeOrExpr = Receiver.take();
2213     return false;
2214   }
2215 
2216   // We have a class message. Turn the simple-type-specifier or
2217   // typename-specifier we parsed into a type and parse the
2218   // remainder of the class message.
2219   Declarator DeclaratorInfo(DS, Declarator::TypeNameContext);
2220   TypeResult Type = Actions.ActOnTypeName(getCurScope(), DeclaratorInfo);
2221   if (Type.isInvalid())
2222     return true;
2223 
2224   IsExpr = false;
2225   TypeOrExpr = Type.get().getAsOpaquePtr();
2226   return false;
2227 }
2228 
2229 /// \brief Determine whether the parser is currently referring to a an
2230 /// Objective-C message send, using a simplified heuristic to avoid overhead.
2231 ///
2232 /// This routine will only return true for a subset of valid message-send
2233 /// expressions.
2234 bool Parser::isSimpleObjCMessageExpression() {
2235   assert(Tok.is(tok::l_square) && getLangOpts().ObjC1 &&
2236          "Incorrect start for isSimpleObjCMessageExpression");
2237   return GetLookAheadToken(1).is(tok::identifier) &&
2238          GetLookAheadToken(2).is(tok::identifier);
2239 }
2240 
2241 bool Parser::isStartOfObjCClassMessageMissingOpenBracket() {
2242   if (!getLangOpts().ObjC1 || !NextToken().is(tok::identifier) ||
2243       InMessageExpression)
2244     return false;
2245 
2246 
2247   ParsedType Type;
2248 
2249   if (Tok.is(tok::annot_typename))
2250     Type = getTypeAnnotation(Tok);
2251   else if (Tok.is(tok::identifier))
2252     Type = Actions.getTypeName(*Tok.getIdentifierInfo(), Tok.getLocation(),
2253                                getCurScope());
2254   else
2255     return false;
2256 
2257   if (!Type.get().isNull() && Type.get()->isObjCObjectOrInterfaceType()) {
2258     const Token &AfterNext = GetLookAheadToken(2);
2259     if (AfterNext.is(tok::colon) || AfterNext.is(tok::r_square)) {
2260       if (Tok.is(tok::identifier))
2261         TryAnnotateTypeOrScopeToken();
2262 
2263       return Tok.is(tok::annot_typename);
2264     }
2265   }
2266 
2267   return false;
2268 }
2269 
2270 ///   objc-message-expr:
2271 ///     '[' objc-receiver objc-message-args ']'
2272 ///
2273 ///   objc-receiver: [C]
2274 ///     'super'
2275 ///     expression
2276 ///     class-name
2277 ///     type-name
2278 ///
2279 ExprResult Parser::ParseObjCMessageExpression() {
2280   assert(Tok.is(tok::l_square) && "'[' expected");
2281   SourceLocation LBracLoc = ConsumeBracket(); // consume '['
2282 
2283   if (Tok.is(tok::code_completion)) {
2284     Actions.CodeCompleteObjCMessageReceiver(getCurScope());
2285     cutOffParsing();
2286     return ExprError();
2287   }
2288 
2289   InMessageExpressionRAIIObject InMessage(*this, true);
2290 
2291   if (getLangOpts().CPlusPlus) {
2292     // We completely separate the C and C++ cases because C++ requires
2293     // more complicated (read: slower) parsing.
2294 
2295     // Handle send to super.
2296     // FIXME: This doesn't benefit from the same typo-correction we
2297     // get in Objective-C.
2298     if (Tok.is(tok::identifier) && Tok.getIdentifierInfo() == Ident_super &&
2299         NextToken().isNot(tok::period) && getCurScope()->isInObjcMethodScope())
2300       return ParseObjCMessageExpressionBody(LBracLoc, ConsumeToken(),
2301                                             ParsedType(), 0);
2302 
2303     // Parse the receiver, which is either a type or an expression.
2304     bool IsExpr;
2305     void *TypeOrExpr = NULL;
2306     if (ParseObjCXXMessageReceiver(IsExpr, TypeOrExpr)) {
2307       SkipUntil(tok::r_square);
2308       return ExprError();
2309     }
2310 
2311     if (IsExpr)
2312       return ParseObjCMessageExpressionBody(LBracLoc, SourceLocation(),
2313                                             ParsedType(),
2314                                             static_cast<Expr*>(TypeOrExpr));
2315 
2316     return ParseObjCMessageExpressionBody(LBracLoc, SourceLocation(),
2317                               ParsedType::getFromOpaquePtr(TypeOrExpr),
2318                                           0);
2319   }
2320 
2321   if (Tok.is(tok::identifier)) {
2322     IdentifierInfo *Name = Tok.getIdentifierInfo();
2323     SourceLocation NameLoc = Tok.getLocation();
2324     ParsedType ReceiverType;
2325     switch (Actions.getObjCMessageKind(getCurScope(), Name, NameLoc,
2326                                        Name == Ident_super,
2327                                        NextToken().is(tok::period),
2328                                        ReceiverType)) {
2329     case Sema::ObjCSuperMessage:
2330       return ParseObjCMessageExpressionBody(LBracLoc, ConsumeToken(),
2331                                             ParsedType(), 0);
2332 
2333     case Sema::ObjCClassMessage:
2334       if (!ReceiverType) {
2335         SkipUntil(tok::r_square);
2336         return ExprError();
2337       }
2338 
2339       ConsumeToken(); // the type name
2340 
2341       return ParseObjCMessageExpressionBody(LBracLoc, SourceLocation(),
2342                                             ReceiverType, 0);
2343 
2344     case Sema::ObjCInstanceMessage:
2345       // Fall through to parse an expression.
2346       break;
2347     }
2348   }
2349 
2350   // Otherwise, an arbitrary expression can be the receiver of a send.
2351   ExprResult Res(ParseExpression());
2352   if (Res.isInvalid()) {
2353     SkipUntil(tok::r_square);
2354     return Res;
2355   }
2356 
2357   return ParseObjCMessageExpressionBody(LBracLoc, SourceLocation(),
2358                                         ParsedType(), Res.take());
2359 }
2360 
2361 /// \brief Parse the remainder of an Objective-C message following the
2362 /// '[' objc-receiver.
2363 ///
2364 /// This routine handles sends to super, class messages (sent to a
2365 /// class name), and instance messages (sent to an object), and the
2366 /// target is represented by \p SuperLoc, \p ReceiverType, or \p
2367 /// ReceiverExpr, respectively. Only one of these parameters may have
2368 /// a valid value.
2369 ///
2370 /// \param LBracLoc The location of the opening '['.
2371 ///
2372 /// \param SuperLoc If this is a send to 'super', the location of the
2373 /// 'super' keyword that indicates a send to the superclass.
2374 ///
2375 /// \param ReceiverType If this is a class message, the type of the
2376 /// class we are sending a message to.
2377 ///
2378 /// \param ReceiverExpr If this is an instance message, the expression
2379 /// used to compute the receiver object.
2380 ///
2381 ///   objc-message-args:
2382 ///     objc-selector
2383 ///     objc-keywordarg-list
2384 ///
2385 ///   objc-keywordarg-list:
2386 ///     objc-keywordarg
2387 ///     objc-keywordarg-list objc-keywordarg
2388 ///
2389 ///   objc-keywordarg:
2390 ///     selector-name[opt] ':' objc-keywordexpr
2391 ///
2392 ///   objc-keywordexpr:
2393 ///     nonempty-expr-list
2394 ///
2395 ///   nonempty-expr-list:
2396 ///     assignment-expression
2397 ///     nonempty-expr-list , assignment-expression
2398 ///
2399 ExprResult
2400 Parser::ParseObjCMessageExpressionBody(SourceLocation LBracLoc,
2401                                        SourceLocation SuperLoc,
2402                                        ParsedType ReceiverType,
2403                                        ExprArg ReceiverExpr) {
2404   InMessageExpressionRAIIObject InMessage(*this, true);
2405 
2406   if (Tok.is(tok::code_completion)) {
2407     if (SuperLoc.isValid())
2408       Actions.CodeCompleteObjCSuperMessage(getCurScope(), SuperLoc, 0, 0,
2409                                            false);
2410     else if (ReceiverType)
2411       Actions.CodeCompleteObjCClassMessage(getCurScope(), ReceiverType, 0, 0,
2412                                            false);
2413     else
2414       Actions.CodeCompleteObjCInstanceMessage(getCurScope(), ReceiverExpr,
2415                                               0, 0, false);
2416     cutOffParsing();
2417     return ExprError();
2418   }
2419 
2420   // Parse objc-selector
2421   SourceLocation Loc;
2422   IdentifierInfo *selIdent = ParseObjCSelectorPiece(Loc);
2423 
2424   SmallVector<IdentifierInfo *, 12> KeyIdents;
2425   SmallVector<SourceLocation, 12> KeyLocs;
2426   ExprVector KeyExprs;
2427 
2428   if (Tok.is(tok::colon)) {
2429     while (1) {
2430       // Each iteration parses a single keyword argument.
2431       KeyIdents.push_back(selIdent);
2432       KeyLocs.push_back(Loc);
2433 
2434       if (Tok.isNot(tok::colon)) {
2435         Diag(Tok, diag::err_expected_colon);
2436         // We must manually skip to a ']', otherwise the expression skipper will
2437         // stop at the ']' when it skips to the ';'.  We want it to skip beyond
2438         // the enclosing expression.
2439         SkipUntil(tok::r_square);
2440         return ExprError();
2441       }
2442 
2443       ConsumeToken(); // Eat the ':'.
2444       ///  Parse the expression after ':'
2445 
2446       if (Tok.is(tok::code_completion)) {
2447         if (SuperLoc.isValid())
2448           Actions.CodeCompleteObjCSuperMessage(getCurScope(), SuperLoc,
2449                                                KeyIdents.data(),
2450                                                KeyIdents.size(),
2451                                                /*AtArgumentEpression=*/true);
2452         else if (ReceiverType)
2453           Actions.CodeCompleteObjCClassMessage(getCurScope(), ReceiverType,
2454                                                KeyIdents.data(),
2455                                                KeyIdents.size(),
2456                                                /*AtArgumentEpression=*/true);
2457         else
2458           Actions.CodeCompleteObjCInstanceMessage(getCurScope(), ReceiverExpr,
2459                                                   KeyIdents.data(),
2460                                                   KeyIdents.size(),
2461                                                   /*AtArgumentEpression=*/true);
2462 
2463         cutOffParsing();
2464         return ExprError();
2465       }
2466 
2467       ExprResult Res(ParseAssignmentExpression());
2468       if (Res.isInvalid()) {
2469         // We must manually skip to a ']', otherwise the expression skipper will
2470         // stop at the ']' when it skips to the ';'.  We want it to skip beyond
2471         // the enclosing expression.
2472         SkipUntil(tok::r_square);
2473         return Res;
2474       }
2475 
2476       // We have a valid expression.
2477       KeyExprs.push_back(Res.release());
2478 
2479       // Code completion after each argument.
2480       if (Tok.is(tok::code_completion)) {
2481         if (SuperLoc.isValid())
2482           Actions.CodeCompleteObjCSuperMessage(getCurScope(), SuperLoc,
2483                                                KeyIdents.data(),
2484                                                KeyIdents.size(),
2485                                                /*AtArgumentEpression=*/false);
2486         else if (ReceiverType)
2487           Actions.CodeCompleteObjCClassMessage(getCurScope(), ReceiverType,
2488                                                KeyIdents.data(),
2489                                                KeyIdents.size(),
2490                                                /*AtArgumentEpression=*/false);
2491         else
2492           Actions.CodeCompleteObjCInstanceMessage(getCurScope(), ReceiverExpr,
2493                                                   KeyIdents.data(),
2494                                                   KeyIdents.size(),
2495                                                 /*AtArgumentEpression=*/false);
2496         cutOffParsing();
2497         return ExprError();
2498       }
2499 
2500       // Check for another keyword selector.
2501       selIdent = ParseObjCSelectorPiece(Loc);
2502       if (!selIdent && Tok.isNot(tok::colon))
2503         break;
2504       // We have a selector or a colon, continue parsing.
2505     }
2506     // Parse the, optional, argument list, comma separated.
2507     while (Tok.is(tok::comma)) {
2508       SourceLocation commaLoc = ConsumeToken(); // Eat the ','.
2509       ///  Parse the expression after ','
2510       ExprResult Res(ParseAssignmentExpression());
2511       if (Res.isInvalid()) {
2512         if (Tok.is(tok::colon)) {
2513           Diag(commaLoc, diag::note_extra_comma_message_arg) <<
2514             FixItHint::CreateRemoval(commaLoc);
2515         }
2516         // We must manually skip to a ']', otherwise the expression skipper will
2517         // stop at the ']' when it skips to the ';'.  We want it to skip beyond
2518         // the enclosing expression.
2519         SkipUntil(tok::r_square);
2520         return Res;
2521       }
2522 
2523       // We have a valid expression.
2524       KeyExprs.push_back(Res.release());
2525     }
2526   } else if (!selIdent) {
2527     Diag(Tok, diag::err_expected_ident); // missing selector name.
2528 
2529     // We must manually skip to a ']', otherwise the expression skipper will
2530     // stop at the ']' when it skips to the ';'.  We want it to skip beyond
2531     // the enclosing expression.
2532     SkipUntil(tok::r_square);
2533     return ExprError();
2534   }
2535 
2536   if (Tok.isNot(tok::r_square)) {
2537     if (Tok.is(tok::identifier))
2538       Diag(Tok, diag::err_expected_colon);
2539     else
2540       Diag(Tok, diag::err_expected_rsquare);
2541     // We must manually skip to a ']', otherwise the expression skipper will
2542     // stop at the ']' when it skips to the ';'.  We want it to skip beyond
2543     // the enclosing expression.
2544     SkipUntil(tok::r_square);
2545     return ExprError();
2546   }
2547 
2548   SourceLocation RBracLoc = ConsumeBracket(); // consume ']'
2549 
2550   unsigned nKeys = KeyIdents.size();
2551   if (nKeys == 0) {
2552     KeyIdents.push_back(selIdent);
2553     KeyLocs.push_back(Loc);
2554   }
2555   Selector Sel = PP.getSelectorTable().getSelector(nKeys, &KeyIdents[0]);
2556 
2557   if (SuperLoc.isValid())
2558     return Actions.ActOnSuperMessage(getCurScope(), SuperLoc, Sel,
2559                                      LBracLoc, KeyLocs, RBracLoc, KeyExprs);
2560   else if (ReceiverType)
2561     return Actions.ActOnClassMessage(getCurScope(), ReceiverType, Sel,
2562                                      LBracLoc, KeyLocs, RBracLoc, KeyExprs);
2563   return Actions.ActOnInstanceMessage(getCurScope(), ReceiverExpr, Sel,
2564                                       LBracLoc, KeyLocs, RBracLoc, KeyExprs);
2565 }
2566 
2567 ExprResult Parser::ParseObjCStringLiteral(SourceLocation AtLoc) {
2568   ExprResult Res(ParseStringLiteralExpression());
2569   if (Res.isInvalid()) return Res;
2570 
2571   // @"foo" @"bar" is a valid concatenated string.  Eat any subsequent string
2572   // expressions.  At this point, we know that the only valid thing that starts
2573   // with '@' is an @"".
2574   SmallVector<SourceLocation, 4> AtLocs;
2575   ExprVector AtStrings;
2576   AtLocs.push_back(AtLoc);
2577   AtStrings.push_back(Res.release());
2578 
2579   while (Tok.is(tok::at)) {
2580     AtLocs.push_back(ConsumeToken()); // eat the @.
2581 
2582     // Invalid unless there is a string literal.
2583     if (!isTokenStringLiteral())
2584       return ExprError(Diag(Tok, diag::err_objc_concat_string));
2585 
2586     ExprResult Lit(ParseStringLiteralExpression());
2587     if (Lit.isInvalid())
2588       return Lit;
2589 
2590     AtStrings.push_back(Lit.release());
2591   }
2592 
2593   return Actions.ParseObjCStringLiteral(&AtLocs[0], AtStrings.data(),
2594                                         AtStrings.size());
2595 }
2596 
2597 /// ParseObjCBooleanLiteral -
2598 /// objc-scalar-literal : '@' boolean-keyword
2599 ///                        ;
2600 /// boolean-keyword: 'true' | 'false' | '__objc_yes' | '__objc_no'
2601 ///                        ;
2602 ExprResult Parser::ParseObjCBooleanLiteral(SourceLocation AtLoc,
2603                                            bool ArgValue) {
2604   SourceLocation EndLoc = ConsumeToken();             // consume the keyword.
2605   return Actions.ActOnObjCBoolLiteral(AtLoc, EndLoc, ArgValue);
2606 }
2607 
2608 /// ParseObjCCharacterLiteral -
2609 /// objc-scalar-literal : '@' character-literal
2610 ///                        ;
2611 ExprResult Parser::ParseObjCCharacterLiteral(SourceLocation AtLoc) {
2612   ExprResult Lit(Actions.ActOnCharacterConstant(Tok));
2613   if (Lit.isInvalid()) {
2614     return Lit;
2615   }
2616   ConsumeToken(); // Consume the literal token.
2617   return Actions.BuildObjCNumericLiteral(AtLoc, Lit.take());
2618 }
2619 
2620 /// ParseObjCNumericLiteral -
2621 /// objc-scalar-literal : '@' scalar-literal
2622 ///                        ;
2623 /// scalar-literal : | numeric-constant			/* any numeric constant. */
2624 ///                    ;
2625 ExprResult Parser::ParseObjCNumericLiteral(SourceLocation AtLoc) {
2626   ExprResult Lit(Actions.ActOnNumericConstant(Tok));
2627   if (Lit.isInvalid()) {
2628     return Lit;
2629   }
2630   ConsumeToken(); // Consume the literal token.
2631   return Actions.BuildObjCNumericLiteral(AtLoc, Lit.take());
2632 }
2633 
2634 /// ParseObjCBoxedExpr -
2635 /// objc-box-expression:
2636 ///       @( assignment-expression )
2637 ExprResult
2638 Parser::ParseObjCBoxedExpr(SourceLocation AtLoc) {
2639   if (Tok.isNot(tok::l_paren))
2640     return ExprError(Diag(Tok, diag::err_expected_lparen_after) << "@");
2641 
2642   BalancedDelimiterTracker T(*this, tok::l_paren);
2643   T.consumeOpen();
2644   ExprResult ValueExpr(ParseAssignmentExpression());
2645   if (T.consumeClose())
2646     return ExprError();
2647 
2648   if (ValueExpr.isInvalid())
2649     return ExprError();
2650 
2651   // Wrap the sub-expression in a parenthesized expression, to distinguish
2652   // a boxed expression from a literal.
2653   SourceLocation LPLoc = T.getOpenLocation(), RPLoc = T.getCloseLocation();
2654   ValueExpr = Actions.ActOnParenExpr(LPLoc, RPLoc, ValueExpr.take());
2655   return Actions.BuildObjCBoxedExpr(SourceRange(AtLoc, RPLoc),
2656                                     ValueExpr.take());
2657 }
2658 
2659 ExprResult Parser::ParseObjCArrayLiteral(SourceLocation AtLoc) {
2660   ExprVector ElementExprs;                   // array elements.
2661   ConsumeBracket(); // consume the l_square.
2662 
2663   while (Tok.isNot(tok::r_square)) {
2664     // Parse list of array element expressions (all must be id types).
2665     ExprResult Res(ParseAssignmentExpression());
2666     if (Res.isInvalid()) {
2667       // We must manually skip to a ']', otherwise the expression skipper will
2668       // stop at the ']' when it skips to the ';'.  We want it to skip beyond
2669       // the enclosing expression.
2670       SkipUntil(tok::r_square);
2671       return Res;
2672     }
2673 
2674     // Parse the ellipsis that indicates a pack expansion.
2675     if (Tok.is(tok::ellipsis))
2676       Res = Actions.ActOnPackExpansion(Res.get(), ConsumeToken());
2677     if (Res.isInvalid())
2678       return true;
2679 
2680     ElementExprs.push_back(Res.release());
2681 
2682     if (Tok.is(tok::comma))
2683       ConsumeToken(); // Eat the ','.
2684     else if (Tok.isNot(tok::r_square))
2685      return ExprError(Diag(Tok, diag::err_expected_rsquare_or_comma));
2686   }
2687   SourceLocation EndLoc = ConsumeBracket(); // location of ']'
2688   MultiExprArg Args(ElementExprs);
2689   return Actions.BuildObjCArrayLiteral(SourceRange(AtLoc, EndLoc), Args);
2690 }
2691 
2692 ExprResult Parser::ParseObjCDictionaryLiteral(SourceLocation AtLoc) {
2693   SmallVector<ObjCDictionaryElement, 4> Elements; // dictionary elements.
2694   ConsumeBrace(); // consume the l_square.
2695   while (Tok.isNot(tok::r_brace)) {
2696     // Parse the comma separated key : value expressions.
2697     ExprResult KeyExpr;
2698     {
2699       ColonProtectionRAIIObject X(*this);
2700       KeyExpr = ParseAssignmentExpression();
2701       if (KeyExpr.isInvalid()) {
2702         // We must manually skip to a '}', otherwise the expression skipper will
2703         // stop at the '}' when it skips to the ';'.  We want it to skip beyond
2704         // the enclosing expression.
2705         SkipUntil(tok::r_brace);
2706         return KeyExpr;
2707       }
2708     }
2709 
2710     if (Tok.is(tok::colon)) {
2711       ConsumeToken();
2712     } else {
2713       return ExprError(Diag(Tok, diag::err_expected_colon));
2714     }
2715 
2716     ExprResult ValueExpr(ParseAssignmentExpression());
2717     if (ValueExpr.isInvalid()) {
2718       // We must manually skip to a '}', otherwise the expression skipper will
2719       // stop at the '}' when it skips to the ';'.  We want it to skip beyond
2720       // the enclosing expression.
2721       SkipUntil(tok::r_brace);
2722       return ValueExpr;
2723     }
2724 
2725     // Parse the ellipsis that designates this as a pack expansion.
2726     SourceLocation EllipsisLoc;
2727     if (Tok.is(tok::ellipsis) && getLangOpts().CPlusPlus)
2728       EllipsisLoc = ConsumeToken();
2729 
2730     // We have a valid expression. Collect it in a vector so we can
2731     // build the argument list.
2732     ObjCDictionaryElement Element = {
2733       KeyExpr.get(), ValueExpr.get(), EllipsisLoc, None
2734     };
2735     Elements.push_back(Element);
2736 
2737     if (Tok.is(tok::comma))
2738       ConsumeToken(); // Eat the ','.
2739     else if (Tok.isNot(tok::r_brace))
2740       return ExprError(Diag(Tok, diag::err_expected_rbrace_or_comma));
2741   }
2742   SourceLocation EndLoc = ConsumeBrace();
2743 
2744   // Create the ObjCDictionaryLiteral.
2745   return Actions.BuildObjCDictionaryLiteral(SourceRange(AtLoc, EndLoc),
2746                                             Elements.data(), Elements.size());
2747 }
2748 
2749 ///    objc-encode-expression:
2750 ///      \@encode ( type-name )
2751 ExprResult
2752 Parser::ParseObjCEncodeExpression(SourceLocation AtLoc) {
2753   assert(Tok.isObjCAtKeyword(tok::objc_encode) && "Not an @encode expression!");
2754 
2755   SourceLocation EncLoc = ConsumeToken();
2756 
2757   if (Tok.isNot(tok::l_paren))
2758     return ExprError(Diag(Tok, diag::err_expected_lparen_after) << "@encode");
2759 
2760   BalancedDelimiterTracker T(*this, tok::l_paren);
2761   T.consumeOpen();
2762 
2763   TypeResult Ty = ParseTypeName();
2764 
2765   T.consumeClose();
2766 
2767   if (Ty.isInvalid())
2768     return ExprError();
2769 
2770   return Actions.ParseObjCEncodeExpression(AtLoc, EncLoc, T.getOpenLocation(),
2771                                            Ty.get(), T.getCloseLocation());
2772 }
2773 
2774 ///     objc-protocol-expression
2775 ///       \@protocol ( protocol-name )
2776 ExprResult
2777 Parser::ParseObjCProtocolExpression(SourceLocation AtLoc) {
2778   SourceLocation ProtoLoc = ConsumeToken();
2779 
2780   if (Tok.isNot(tok::l_paren))
2781     return ExprError(Diag(Tok, diag::err_expected_lparen_after) << "@protocol");
2782 
2783   BalancedDelimiterTracker T(*this, tok::l_paren);
2784   T.consumeOpen();
2785 
2786   if (Tok.isNot(tok::identifier))
2787     return ExprError(Diag(Tok, diag::err_expected_ident));
2788 
2789   IdentifierInfo *protocolId = Tok.getIdentifierInfo();
2790   SourceLocation ProtoIdLoc = ConsumeToken();
2791 
2792   T.consumeClose();
2793 
2794   return Actions.ParseObjCProtocolExpression(protocolId, AtLoc, ProtoLoc,
2795                                              T.getOpenLocation(), ProtoIdLoc,
2796                                              T.getCloseLocation());
2797 }
2798 
2799 ///     objc-selector-expression
2800 ///       @selector '(' objc-keyword-selector ')'
2801 ExprResult Parser::ParseObjCSelectorExpression(SourceLocation AtLoc) {
2802   SourceLocation SelectorLoc = ConsumeToken();
2803 
2804   if (Tok.isNot(tok::l_paren))
2805     return ExprError(Diag(Tok, diag::err_expected_lparen_after) << "@selector");
2806 
2807   SmallVector<IdentifierInfo *, 12> KeyIdents;
2808   SourceLocation sLoc;
2809 
2810   BalancedDelimiterTracker T(*this, tok::l_paren);
2811   T.consumeOpen();
2812 
2813   if (Tok.is(tok::code_completion)) {
2814     Actions.CodeCompleteObjCSelector(getCurScope(), KeyIdents.data(),
2815                                      KeyIdents.size());
2816     cutOffParsing();
2817     return ExprError();
2818   }
2819 
2820   IdentifierInfo *SelIdent = ParseObjCSelectorPiece(sLoc);
2821   if (!SelIdent &&  // missing selector name.
2822       Tok.isNot(tok::colon) && Tok.isNot(tok::coloncolon))
2823     return ExprError(Diag(Tok, diag::err_expected_ident));
2824 
2825   KeyIdents.push_back(SelIdent);
2826   unsigned nColons = 0;
2827   if (Tok.isNot(tok::r_paren)) {
2828     while (1) {
2829       if (Tok.is(tok::coloncolon)) { // Handle :: in C++.
2830         ++nColons;
2831         KeyIdents.push_back(0);
2832       } else if (Tok.isNot(tok::colon))
2833         return ExprError(Diag(Tok, diag::err_expected_colon));
2834 
2835       ++nColons;
2836       ConsumeToken(); // Eat the ':' or '::'.
2837       if (Tok.is(tok::r_paren))
2838         break;
2839 
2840       if (Tok.is(tok::code_completion)) {
2841         Actions.CodeCompleteObjCSelector(getCurScope(), KeyIdents.data(),
2842                                          KeyIdents.size());
2843         cutOffParsing();
2844         return ExprError();
2845       }
2846 
2847       // Check for another keyword selector.
2848       SourceLocation Loc;
2849       SelIdent = ParseObjCSelectorPiece(Loc);
2850       KeyIdents.push_back(SelIdent);
2851       if (!SelIdent && Tok.isNot(tok::colon) && Tok.isNot(tok::coloncolon))
2852         break;
2853     }
2854   }
2855   T.consumeClose();
2856   Selector Sel = PP.getSelectorTable().getSelector(nColons, &KeyIdents[0]);
2857   return Actions.ParseObjCSelectorExpression(Sel, AtLoc, SelectorLoc,
2858                                              T.getOpenLocation(),
2859                                              T.getCloseLocation());
2860  }
2861 
2862 void Parser::ParseLexedObjCMethodDefs(LexedMethod &LM, bool parseMethod) {
2863   // MCDecl might be null due to error in method or c-function  prototype, etc.
2864   Decl *MCDecl = LM.D;
2865   bool skip = MCDecl &&
2866               ((parseMethod && !Actions.isObjCMethodDecl(MCDecl)) ||
2867               (!parseMethod && Actions.isObjCMethodDecl(MCDecl)));
2868   if (skip)
2869     return;
2870 
2871   // Save the current token position.
2872   SourceLocation OrigLoc = Tok.getLocation();
2873 
2874   assert(!LM.Toks.empty() && "ParseLexedObjCMethodDef - Empty body!");
2875   // Append the current token at the end of the new token stream so that it
2876   // doesn't get lost.
2877   LM.Toks.push_back(Tok);
2878   PP.EnterTokenStream(LM.Toks.data(), LM.Toks.size(), true, false);
2879 
2880   // Consume the previously pushed token.
2881   ConsumeAnyToken();
2882 
2883   assert((Tok.is(tok::l_brace) || Tok.is(tok::kw_try) ||
2884           Tok.is(tok::colon)) &&
2885           "Inline objective-c method not starting with '{' or 'try' or ':'");
2886   // Enter a scope for the method or c-fucntion body.
2887   ParseScope BodyScope(this,
2888                        parseMethod
2889                        ? Scope::ObjCMethodScope|Scope::FnScope|Scope::DeclScope
2890                        : Scope::FnScope|Scope::DeclScope);
2891 
2892   // Tell the actions module that we have entered a method or c-function definition
2893   // with the specified Declarator for the method/function.
2894   if (parseMethod)
2895     Actions.ActOnStartOfObjCMethodDef(getCurScope(), MCDecl);
2896   else
2897     Actions.ActOnStartOfFunctionDef(getCurScope(), MCDecl);
2898   if (Tok.is(tok::kw_try))
2899     MCDecl = ParseFunctionTryBlock(MCDecl, BodyScope);
2900   else {
2901     if (Tok.is(tok::colon))
2902       ParseConstructorInitializer(MCDecl);
2903     MCDecl = ParseFunctionStatementBody(MCDecl, BodyScope);
2904   }
2905 
2906   if (Tok.getLocation() != OrigLoc) {
2907     // Due to parsing error, we either went over the cached tokens or
2908     // there are still cached tokens left. If it's the latter case skip the
2909     // leftover tokens.
2910     // Since this is an uncommon situation that should be avoided, use the
2911     // expensive isBeforeInTranslationUnit call.
2912     if (PP.getSourceManager().isBeforeInTranslationUnit(Tok.getLocation(),
2913                                                      OrigLoc))
2914       while (Tok.getLocation() != OrigLoc && Tok.isNot(tok::eof))
2915         ConsumeAnyToken();
2916   }
2917 
2918   return;
2919 }
2920