Parser.cpp revision ab197baec16bacade82325fb274cf6b992ac5d8a
1//===--- Parser.cpp - C Language Family Parser ----------------------------===//
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 Parser interfaces.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/Parse/Parser.h"
15#include "clang/Parse/ParseDiagnostic.h"
16#include "clang/Parse/DeclSpec.h"
17#include "clang/Parse/Scope.h"
18#include "ExtensionRAIIObject.h"
19#include "ParsePragma.h"
20using namespace clang;
21
22Parser::Parser(Preprocessor &pp, Action &actions)
23  : PP(pp), Actions(actions), Diags(PP.getDiagnostics()) {
24  Tok.setKind(tok::eof);
25  CurScope = 0;
26  NumCachedScopes = 0;
27  ParenCount = BracketCount = BraceCount = 0;
28  ObjCImpDecl = 0;
29
30  // Add #pragma handlers. These are removed and destroyed in the
31  // destructor.
32  PackHandler =
33    new PragmaPackHandler(&PP.getIdentifierTable().get("pack"), actions);
34  PP.AddPragmaHandler(0, PackHandler);
35
36  // Instantiate a LexedMethodsForTopClass for all the non-nested classes.
37  PushTopClassStack();
38}
39
40///  Out-of-line virtual destructor to provide home for Action class.
41ActionBase::~ActionBase() {}
42
43///  Out-of-line virtual destructor to provide home for Action class.
44Action::~Action() {}
45
46// Defined out-of-line here because of dependecy on AttributeList
47Action::DeclTy *Action::ActOnUsingDirective(Scope *CurScope,
48                                            SourceLocation UsingLoc,
49                                            SourceLocation NamespcLoc,
50                                            const CXXScopeSpec &SS,
51                                            SourceLocation IdentLoc,
52                                            IdentifierInfo *NamespcName,
53                                            AttributeList *AttrList) {
54
55  // FIXME: Parser seems to assume that Action::ActOn* takes ownership over
56  // passed AttributeList, however other actions don't free it, is it
57  // temporary state or bug?
58  delete AttrList;
59  return 0;
60}
61
62DiagnosticBuilder Parser::Diag(SourceLocation Loc, unsigned DiagID) {
63  return Diags.Report(FullSourceLoc(Loc,PP.getSourceManager()), DiagID);
64}
65
66DiagnosticBuilder Parser::Diag(const Token &Tok, unsigned DiagID) {
67  return Diag(Tok.getLocation(), DiagID);
68}
69
70/// MatchRHSPunctuation - For punctuation with a LHS and RHS (e.g. '['/']'),
71/// this helper function matches and consumes the specified RHS token if
72/// present.  If not present, it emits the specified diagnostic indicating
73/// that the parser failed to match the RHS of the token at LHSLoc.  LHSName
74/// should be the name of the unmatched LHS token.
75SourceLocation Parser::MatchRHSPunctuation(tok::TokenKind RHSTok,
76                                           SourceLocation LHSLoc) {
77
78  if (Tok.is(RHSTok))
79    return ConsumeAnyToken();
80
81  SourceLocation R = Tok.getLocation();
82  const char *LHSName = "unknown";
83  diag::kind DID = diag::err_parse_error;
84  switch (RHSTok) {
85  default: break;
86  case tok::r_paren : LHSName = "("; DID = diag::err_expected_rparen; break;
87  case tok::r_brace : LHSName = "{"; DID = diag::err_expected_rbrace; break;
88  case tok::r_square: LHSName = "["; DID = diag::err_expected_rsquare; break;
89  case tok::greater:  LHSName = "<"; DID = diag::err_expected_greater; break;
90  }
91  Diag(Tok, DID);
92  Diag(LHSLoc, diag::note_matching) << LHSName;
93  SkipUntil(RHSTok);
94  return R;
95}
96
97/// ExpectAndConsume - The parser expects that 'ExpectedTok' is next in the
98/// input.  If so, it is consumed and false is returned.
99///
100/// If the input is malformed, this emits the specified diagnostic.  Next, if
101/// SkipToTok is specified, it calls SkipUntil(SkipToTok).  Finally, true is
102/// returned.
103bool Parser::ExpectAndConsume(tok::TokenKind ExpectedTok, unsigned DiagID,
104                              const char *Msg, tok::TokenKind SkipToTok) {
105  if (Tok.is(ExpectedTok)) {
106    ConsumeAnyToken();
107    return false;
108  }
109
110  Diag(Tok, DiagID) << Msg;
111  if (SkipToTok != tok::unknown)
112    SkipUntil(SkipToTok);
113  return true;
114}
115
116//===----------------------------------------------------------------------===//
117// Error recovery.
118//===----------------------------------------------------------------------===//
119
120/// SkipUntil - Read tokens until we get to the specified token, then consume
121/// it (unless DontConsume is true).  Because we cannot guarantee that the
122/// token will ever occur, this skips to the next token, or to some likely
123/// good stopping point.  If StopAtSemi is true, skipping will stop at a ';'
124/// character.
125///
126/// If SkipUntil finds the specified token, it returns true, otherwise it
127/// returns false.
128bool Parser::SkipUntil(const tok::TokenKind *Toks, unsigned NumToks,
129                       bool StopAtSemi, bool DontConsume) {
130  // We always want this function to skip at least one token if the first token
131  // isn't T and if not at EOF.
132  bool isFirstTokenSkipped = true;
133  while (1) {
134    // If we found one of the tokens, stop and return true.
135    for (unsigned i = 0; i != NumToks; ++i) {
136      if (Tok.is(Toks[i])) {
137        if (DontConsume) {
138          // Noop, don't consume the token.
139        } else {
140          ConsumeAnyToken();
141        }
142        return true;
143      }
144    }
145
146    switch (Tok.getKind()) {
147    case tok::eof:
148      // Ran out of tokens.
149      return false;
150
151    case tok::l_paren:
152      // Recursively skip properly-nested parens.
153      ConsumeParen();
154      SkipUntil(tok::r_paren, false);
155      break;
156    case tok::l_square:
157      // Recursively skip properly-nested square brackets.
158      ConsumeBracket();
159      SkipUntil(tok::r_square, false);
160      break;
161    case tok::l_brace:
162      // Recursively skip properly-nested braces.
163      ConsumeBrace();
164      SkipUntil(tok::r_brace, false);
165      break;
166
167    // Okay, we found a ']' or '}' or ')', which we think should be balanced.
168    // Since the user wasn't looking for this token (if they were, it would
169    // already be handled), this isn't balanced.  If there is a LHS token at a
170    // higher level, we will assume that this matches the unbalanced token
171    // and return it.  Otherwise, this is a spurious RHS token, which we skip.
172    case tok::r_paren:
173      if (ParenCount && !isFirstTokenSkipped)
174        return false;  // Matches something.
175      ConsumeParen();
176      break;
177    case tok::r_square:
178      if (BracketCount && !isFirstTokenSkipped)
179        return false;  // Matches something.
180      ConsumeBracket();
181      break;
182    case tok::r_brace:
183      if (BraceCount && !isFirstTokenSkipped)
184        return false;  // Matches something.
185      ConsumeBrace();
186      break;
187
188    case tok::string_literal:
189    case tok::wide_string_literal:
190      ConsumeStringToken();
191      break;
192    case tok::semi:
193      if (StopAtSemi)
194        return false;
195      // FALL THROUGH.
196    default:
197      // Skip this token.
198      ConsumeToken();
199      break;
200    }
201    isFirstTokenSkipped = false;
202  }
203}
204
205//===----------------------------------------------------------------------===//
206// Scope manipulation
207//===----------------------------------------------------------------------===//
208
209/// EnterScope - Start a new scope.
210void Parser::EnterScope(unsigned ScopeFlags) {
211  if (NumCachedScopes) {
212    Scope *N = ScopeCache[--NumCachedScopes];
213    N->Init(CurScope, ScopeFlags);
214    CurScope = N;
215  } else {
216    CurScope = new Scope(CurScope, ScopeFlags);
217  }
218}
219
220/// ExitScope - Pop a scope off the scope stack.
221void Parser::ExitScope() {
222  assert(CurScope && "Scope imbalance!");
223
224  // Inform the actions module that this scope is going away if there are any
225  // decls in it.
226  if (!CurScope->decl_empty())
227    Actions.ActOnPopScope(Tok.getLocation(), CurScope);
228
229  Scope *OldScope = CurScope;
230  CurScope = OldScope->getParent();
231
232  if (NumCachedScopes == ScopeCacheSize)
233    delete OldScope;
234  else
235    ScopeCache[NumCachedScopes++] = OldScope;
236}
237
238
239
240
241//===----------------------------------------------------------------------===//
242// C99 6.9: External Definitions.
243//===----------------------------------------------------------------------===//
244
245Parser::~Parser() {
246  // If we still have scopes active, delete the scope tree.
247  delete CurScope;
248
249  // Free the scope cache.
250  for (unsigned i = 0, e = NumCachedScopes; i != e; ++i)
251    delete ScopeCache[i];
252
253  // Remove the pragma handlers we installed.
254  PP.RemovePragmaHandler(0, PackHandler);
255  delete PackHandler;
256}
257
258/// Initialize - Warm up the parser.
259///
260void Parser::Initialize() {
261  // Prime the lexer look-ahead.
262  ConsumeToken();
263
264  // Create the translation unit scope.  Install it as the current scope.
265  assert(CurScope == 0 && "A scope is already active?");
266  EnterScope(Scope::DeclScope);
267  Actions.ActOnTranslationUnitScope(Tok.getLocation(), CurScope);
268
269  if (Tok.is(tok::eof) &&
270      !getLang().CPlusPlus)  // Empty source file is an extension in C
271    Diag(Tok, diag::ext_empty_source_file);
272
273  // Initialization for Objective-C context sensitive keywords recognition.
274  // Referenced in Parser::ParseObjCTypeQualifierList.
275  if (getLang().ObjC1) {
276    ObjCTypeQuals[objc_in] = &PP.getIdentifierTable().get("in");
277    ObjCTypeQuals[objc_out] = &PP.getIdentifierTable().get("out");
278    ObjCTypeQuals[objc_inout] = &PP.getIdentifierTable().get("inout");
279    ObjCTypeQuals[objc_oneway] = &PP.getIdentifierTable().get("oneway");
280    ObjCTypeQuals[objc_bycopy] = &PP.getIdentifierTable().get("bycopy");
281    ObjCTypeQuals[objc_byref] = &PP.getIdentifierTable().get("byref");
282  }
283
284  Ident_super = &PP.getIdentifierTable().get("super");
285}
286
287/// ParseTopLevelDecl - Parse one top-level declaration, return whatever the
288/// action tells us to.  This returns true if the EOF was encountered.
289bool Parser::ParseTopLevelDecl(DeclTy*& Result) {
290  Result = 0;
291  if (Tok.is(tok::eof)) {
292    Actions.ActOnEndOfTranslationUnit();
293    return true;
294  }
295
296  Result = ParseExternalDeclaration();
297  return false;
298}
299
300/// ParseTranslationUnit:
301///       translation-unit: [C99 6.9]
302///         external-declaration
303///         translation-unit external-declaration
304void Parser::ParseTranslationUnit() {
305  Initialize();
306
307  DeclTy *Res;
308  while (!ParseTopLevelDecl(Res))
309    /*parse them all*/;
310
311  ExitScope();
312  assert(CurScope == 0 && "Scope imbalance!");
313}
314
315/// ParseExternalDeclaration:
316///
317///       external-declaration: [C99 6.9], declaration: [C++ dcl.dcl]
318///         function-definition
319///         declaration
320/// [EXT]   ';'
321/// [GNU]   asm-definition
322/// [GNU]   __extension__ external-declaration
323/// [OBJC]  objc-class-definition
324/// [OBJC]  objc-class-declaration
325/// [OBJC]  objc-alias-declaration
326/// [OBJC]  objc-protocol-definition
327/// [OBJC]  objc-method-definition
328/// [OBJC]  @end
329/// [C++]   linkage-specification
330/// [GNU] asm-definition:
331///         simple-asm-expr ';'
332///
333Parser::DeclTy *Parser::ParseExternalDeclaration() {
334  switch (Tok.getKind()) {
335  case tok::semi:
336    Diag(Tok, diag::ext_top_level_semi);
337    ConsumeToken();
338    // TODO: Invoke action for top-level semicolon.
339    return 0;
340  case tok::r_brace:
341    Diag(Tok, diag::err_expected_external_declaration);
342    ConsumeBrace();
343    return 0;
344  case tok::eof:
345    Diag(Tok, diag::err_expected_external_declaration);
346    return 0;
347  case tok::kw___extension__: {
348    // __extension__ silences extension warnings in the subexpression.
349    ExtensionRAIIObject O(Diags);  // Use RAII to do this.
350    ConsumeToken();
351    return ParseExternalDeclaration();
352  }
353  case tok::kw_asm: {
354    OwningExprResult Result(ParseSimpleAsm());
355
356    ExpectAndConsume(tok::semi, diag::err_expected_semi_after,
357                     "top-level asm block");
358
359    if (!Result.isInvalid())
360      return Actions.ActOnFileScopeAsmDecl(Tok.getLocation(), move(Result));
361    return 0;
362  }
363  case tok::at:
364    // @ is not a legal token unless objc is enabled, no need to check.
365    return ParseObjCAtDirectives();
366  case tok::minus:
367  case tok::plus:
368    if (getLang().ObjC1)
369      return ParseObjCMethodDefinition();
370    else {
371      Diag(Tok, diag::err_expected_external_declaration);
372      ConsumeToken();
373    }
374    return 0;
375  case tok::kw_using:
376  case tok::kw_namespace:
377  case tok::kw_typedef:
378  case tok::kw_template:
379  case tok::kw_export:    // As in 'export template'
380    // A function definition cannot start with a these keywords.
381    return ParseDeclaration(Declarator::FileContext);
382  default:
383    // We can't tell whether this is a function-definition or declaration yet.
384    return ParseDeclarationOrFunctionDefinition();
385  }
386}
387
388/// ParseDeclarationOrFunctionDefinition - Parse either a function-definition or
389/// a declaration.  We can't tell which we have until we read up to the
390/// compound-statement in function-definition. TemplateParams, if
391/// non-NULL, provides the template parameters when we're parsing a
392/// C++ template-declaration.
393///
394///       function-definition: [C99 6.9.1]
395///         decl-specs      declarator declaration-list[opt] compound-statement
396/// [C90] function-definition: [C99 6.7.1] - implicit int result
397/// [C90]   decl-specs[opt] declarator declaration-list[opt] compound-statement
398///
399///       declaration: [C99 6.7]
400///         declaration-specifiers init-declarator-list[opt] ';'
401/// [!C99]  init-declarator-list ';'                   [TODO: warn in c99 mode]
402/// [OMP]   threadprivate-directive                              [TODO]
403///
404Parser::DeclTy *
405Parser::ParseDeclarationOrFunctionDefinition(
406                                  TemplateParameterLists *TemplateParams) {
407  // Parse the common declaration-specifiers piece.
408  DeclSpec DS;
409  ParseDeclarationSpecifiers(DS, TemplateParams);
410
411  // C99 6.7.2.3p6: Handle "struct-or-union identifier;", "enum { X };"
412  // declaration-specifiers init-declarator-list[opt] ';'
413  if (Tok.is(tok::semi)) {
414    ConsumeToken();
415    return Actions.ParsedFreeStandingDeclSpec(CurScope, DS);
416  }
417
418  // ObjC2 allows prefix attributes on class interfaces and protocols.
419  // FIXME: This still needs better diagnostics. We should only accept
420  // attributes here, no types, etc.
421  if (getLang().ObjC2 && Tok.is(tok::at)) {
422    SourceLocation AtLoc = ConsumeToken(); // the "@"
423    if (!Tok.isObjCAtKeyword(tok::objc_interface) &&
424        !Tok.isObjCAtKeyword(tok::objc_protocol)) {
425      Diag(Tok, diag::err_objc_unexpected_attr);
426      SkipUntil(tok::semi); // FIXME: better skip?
427      return 0;
428    }
429    const char *PrevSpec = 0;
430    if (DS.SetTypeSpecType(DeclSpec::TST_unspecified, AtLoc, PrevSpec))
431      Diag(AtLoc, diag::err_invalid_decl_spec_combination) << PrevSpec;
432    if (Tok.isObjCAtKeyword(tok::objc_protocol))
433      return ParseObjCAtProtocolDeclaration(AtLoc, DS.getAttributes());
434    return ParseObjCAtInterfaceDeclaration(AtLoc, DS.getAttributes());
435  }
436
437  // If the declspec consisted only of 'extern' and we have a string
438  // literal following it, this must be a C++ linkage specifier like
439  // 'extern "C"'.
440  if (Tok.is(tok::string_literal) && getLang().CPlusPlus &&
441      DS.getStorageClassSpec() == DeclSpec::SCS_extern &&
442      DS.getParsedSpecifiers() == DeclSpec::PQ_StorageClassSpecifier)
443    return ParseLinkage(Declarator::FileContext);
444
445  // Parse the first declarator.
446  Declarator DeclaratorInfo(DS, Declarator::FileContext);
447  ParseDeclarator(DeclaratorInfo);
448  // Error parsing the declarator?
449  if (!DeclaratorInfo.hasName()) {
450    // If so, skip until the semi-colon or a }.
451    SkipUntil(tok::r_brace, true, true);
452    if (Tok.is(tok::semi))
453      ConsumeToken();
454    return 0;
455  }
456
457  // If the declarator is the start of a function definition, handle it.
458  if (Tok.is(tok::equal) ||           // int X()=  -> not a function def
459      Tok.is(tok::comma) ||           // int X(),  -> not a function def
460      Tok.is(tok::semi)  ||           // int X();  -> not a function def
461      Tok.is(tok::kw_asm) ||          // int X() __asm__ -> not a function def
462      Tok.is(tok::kw___attribute) ||  // int X() __attr__ -> not a function def
463      (getLang().CPlusPlus &&
464       Tok.is(tok::l_paren)) ) {      // int X(0) -> not a function def [C++]
465    // FALL THROUGH.
466  } else if (DeclaratorInfo.isFunctionDeclarator() &&
467             (Tok.is(tok::l_brace) ||             // int X() {}
468              ( !getLang().CPlusPlus &&
469                isDeclarationSpecifier() ))) {    // int X(f) int f; {}
470    if (DS.getStorageClassSpec() == DeclSpec::SCS_typedef) {
471      Diag(Tok, diag::err_function_declared_typedef);
472
473      if (Tok.is(tok::l_brace)) {
474        // This recovery skips the entire function body. It would be nice
475        // to simply call ParseFunctionDefinition() below, however Sema
476        // assumes the declarator represents a function, not a typedef.
477        ConsumeBrace();
478        SkipUntil(tok::r_brace, true);
479      } else {
480        SkipUntil(tok::semi);
481      }
482      return 0;
483    }
484    return ParseFunctionDefinition(DeclaratorInfo);
485  } else {
486    if (DeclaratorInfo.isFunctionDeclarator())
487      Diag(Tok, diag::err_expected_fn_body);
488    else
489      Diag(Tok, diag::err_expected_after_declarator);
490    SkipUntil(tok::semi);
491    return 0;
492  }
493
494  // Parse the init-declarator-list for a normal declaration.
495  return ParseInitDeclaratorListAfterFirstDeclarator(DeclaratorInfo);
496}
497
498/// ParseFunctionDefinition - We parsed and verified that the specified
499/// Declarator is well formed.  If this is a K&R-style function, read the
500/// parameters declaration-list, then start the compound-statement.
501///
502///       function-definition: [C99 6.9.1]
503///         decl-specs      declarator declaration-list[opt] compound-statement
504/// [C90] function-definition: [C99 6.7.1] - implicit int result
505/// [C90]   decl-specs[opt] declarator declaration-list[opt] compound-statement
506/// [C++] function-definition: [C++ 8.4]
507///         decl-specifier-seq[opt] declarator ctor-initializer[opt] function-body
508/// [C++] function-definition: [C++ 8.4]
509///         decl-specifier-seq[opt] declarator function-try-block [TODO]
510///
511Parser::DeclTy *Parser::ParseFunctionDefinition(Declarator &D) {
512  const DeclaratorChunk &FnTypeInfo = D.getTypeObject(0);
513  assert(FnTypeInfo.Kind == DeclaratorChunk::Function &&
514         "This isn't a function declarator!");
515  const DeclaratorChunk::FunctionTypeInfo &FTI = FnTypeInfo.Fun;
516
517  // If this is C90 and the declspecs were completely missing, fudge in an
518  // implicit int.  We do this here because this is the only place where
519  // declaration-specifiers are completely optional in the grammar.
520  if (getLang().ImplicitInt && D.getDeclSpec().getParsedSpecifiers() == 0) {
521    const char *PrevSpec;
522    D.getMutableDeclSpec().SetTypeSpecType(DeclSpec::TST_int,
523                                           D.getIdentifierLoc(),
524                                           PrevSpec);
525    D.SetRangeBegin(D.getDeclSpec().getSourceRange().getBegin());
526  }
527
528  // If this declaration was formed with a K&R-style identifier list for the
529  // arguments, parse declarations for all of the args next.
530  // int foo(a,b) int a; float b; {}
531  if (!FTI.hasPrototype && FTI.NumArgs != 0)
532    ParseKNRParamDeclarations(D);
533
534  // We should have either an opening brace or, in a C++ constructor,
535  // we may have a colon.
536  // FIXME: In C++, we might also find the 'try' keyword.
537  if (Tok.isNot(tok::l_brace) && Tok.isNot(tok::colon)) {
538    Diag(Tok, diag::err_expected_fn_body);
539
540    // Skip over garbage, until we get to '{'.  Don't eat the '{'.
541    SkipUntil(tok::l_brace, true, true);
542
543    // If we didn't find the '{', bail out.
544    if (Tok.isNot(tok::l_brace))
545      return 0;
546  }
547
548  // Enter a scope for the function body.
549  ParseScope BodyScope(this, Scope::FnScope|Scope::DeclScope);
550
551  // Tell the actions module that we have entered a function definition with the
552  // specified Declarator for the function.
553  DeclTy *Res = Actions.ActOnStartOfFunctionDef(CurScope, D);
554
555  // If we have a colon, then we're probably parsing a C++
556  // ctor-initializer.
557  if (Tok.is(tok::colon))
558    ParseConstructorInitializer(Res);
559
560  SourceLocation BraceLoc = Tok.getLocation();
561  return ParseFunctionStatementBody(Res, BraceLoc, BraceLoc);
562}
563
564/// ParseKNRParamDeclarations - Parse 'declaration-list[opt]' which provides
565/// types for a function with a K&R-style identifier list for arguments.
566void Parser::ParseKNRParamDeclarations(Declarator &D) {
567  // We know that the top-level of this declarator is a function.
568  DeclaratorChunk::FunctionTypeInfo &FTI = D.getTypeObject(0).Fun;
569
570  // Enter function-declaration scope, limiting any declarators to the
571  // function prototype scope, including parameter declarators.
572  ParseScope PrototypeScope(this, Scope::FunctionPrototypeScope|Scope::DeclScope);
573
574  // Read all the argument declarations.
575  while (isDeclarationSpecifier()) {
576    SourceLocation DSStart = Tok.getLocation();
577
578    // Parse the common declaration-specifiers piece.
579    DeclSpec DS;
580    ParseDeclarationSpecifiers(DS);
581
582    // C99 6.9.1p6: 'each declaration in the declaration list shall have at
583    // least one declarator'.
584    // NOTE: GCC just makes this an ext-warn.  It's not clear what it does with
585    // the declarations though.  It's trivial to ignore them, really hard to do
586    // anything else with them.
587    if (Tok.is(tok::semi)) {
588      Diag(DSStart, diag::err_declaration_does_not_declare_param);
589      ConsumeToken();
590      continue;
591    }
592
593    // C99 6.9.1p6: Declarations shall contain no storage-class specifiers other
594    // than register.
595    if (DS.getStorageClassSpec() != DeclSpec::SCS_unspecified &&
596        DS.getStorageClassSpec() != DeclSpec::SCS_register) {
597      Diag(DS.getStorageClassSpecLoc(),
598           diag::err_invalid_storage_class_in_func_decl);
599      DS.ClearStorageClassSpecs();
600    }
601    if (DS.isThreadSpecified()) {
602      Diag(DS.getThreadSpecLoc(),
603           diag::err_invalid_storage_class_in_func_decl);
604      DS.ClearStorageClassSpecs();
605    }
606
607    // Parse the first declarator attached to this declspec.
608    Declarator ParmDeclarator(DS, Declarator::KNRTypeListContext);
609    ParseDeclarator(ParmDeclarator);
610
611    // Handle the full declarator list.
612    while (1) {
613      DeclTy *AttrList;
614      // If attributes are present, parse them.
615      if (Tok.is(tok::kw___attribute))
616        // FIXME: attach attributes too.
617        AttrList = ParseAttributes();
618
619      // Ask the actions module to compute the type for this declarator.
620      Action::DeclTy *Param =
621        Actions.ActOnParamDeclarator(CurScope, ParmDeclarator);
622
623      if (Param &&
624          // A missing identifier has already been diagnosed.
625          ParmDeclarator.getIdentifier()) {
626
627        // Scan the argument list looking for the correct param to apply this
628        // type.
629        for (unsigned i = 0; ; ++i) {
630          // C99 6.9.1p6: those declarators shall declare only identifiers from
631          // the identifier list.
632          if (i == FTI.NumArgs) {
633            Diag(ParmDeclarator.getIdentifierLoc(), diag::err_no_matching_param)
634              << ParmDeclarator.getIdentifier();
635            break;
636          }
637
638          if (FTI.ArgInfo[i].Ident == ParmDeclarator.getIdentifier()) {
639            // Reject redefinitions of parameters.
640            if (FTI.ArgInfo[i].Param) {
641              Diag(ParmDeclarator.getIdentifierLoc(),
642                   diag::err_param_redefinition)
643                 << ParmDeclarator.getIdentifier();
644            } else {
645              FTI.ArgInfo[i].Param = Param;
646            }
647            break;
648          }
649        }
650      }
651
652      // If we don't have a comma, it is either the end of the list (a ';') or
653      // an error, bail out.
654      if (Tok.isNot(tok::comma))
655        break;
656
657      // Consume the comma.
658      ConsumeToken();
659
660      // Parse the next declarator.
661      ParmDeclarator.clear();
662      ParseDeclarator(ParmDeclarator);
663    }
664
665    if (Tok.is(tok::semi)) {
666      ConsumeToken();
667    } else {
668      Diag(Tok, diag::err_parse_error);
669      // Skip to end of block or statement
670      SkipUntil(tok::semi, true);
671      if (Tok.is(tok::semi))
672        ConsumeToken();
673    }
674  }
675
676  // The actions module must verify that all arguments were declared.
677  Actions.ActOnFinishKNRParamDeclarations(CurScope, D);
678}
679
680
681/// ParseAsmStringLiteral - This is just a normal string-literal, but is not
682/// allowed to be a wide string, and is not subject to character translation.
683///
684/// [GNU] asm-string-literal:
685///         string-literal
686///
687Parser::OwningExprResult Parser::ParseAsmStringLiteral() {
688  if (!isTokenStringLiteral()) {
689    Diag(Tok, diag::err_expected_string_literal);
690    return ExprError();
691  }
692
693  OwningExprResult Res(ParseStringLiteralExpression());
694  if (Res.isInvalid()) return move(Res);
695
696  // TODO: Diagnose: wide string literal in 'asm'
697
698  return move(Res);
699}
700
701/// ParseSimpleAsm
702///
703/// [GNU] simple-asm-expr:
704///         'asm' '(' asm-string-literal ')'
705///
706Parser::OwningExprResult Parser::ParseSimpleAsm(SourceLocation *EndLoc) {
707  assert(Tok.is(tok::kw_asm) && "Not an asm!");
708  SourceLocation Loc = ConsumeToken();
709
710  if (Tok.isNot(tok::l_paren)) {
711    Diag(Tok, diag::err_expected_lparen_after) << "asm";
712    return ExprError();
713  }
714
715  Loc = ConsumeParen();
716
717  OwningExprResult Result(ParseAsmStringLiteral());
718
719  if (Result.isInvalid()) {
720    SkipUntil(tok::r_paren, true, true);
721    if (EndLoc)
722      *EndLoc = Tok.getLocation();
723    ConsumeAnyToken();
724  } else {
725    Loc = MatchRHSPunctuation(tok::r_paren, Loc);
726    if (EndLoc)
727      *EndLoc = Loc;
728  }
729
730  return move(Result);
731}
732
733/// TryAnnotateTypeOrScopeToken - If the current token position is on a
734/// typename (possibly qualified in C++) or a C++ scope specifier not followed
735/// by a typename, TryAnnotateTypeOrScopeToken will replace one or more tokens
736/// with a single annotation token representing the typename or C++ scope
737/// respectively.
738/// This simplifies handling of C++ scope specifiers and allows efficient
739/// backtracking without the need to re-parse and resolve nested-names and
740/// typenames.
741/// It will mainly be called when we expect to treat identifiers as typenames
742/// (if they are typenames). For example, in C we do not expect identifiers
743/// inside expressions to be treated as typenames so it will not be called
744/// for expressions in C.
745/// The benefit for C/ObjC is that a typename will be annotated and
746/// Actions.getTypeName will not be needed to be called again (e.g. getTypeName
747/// will not be called twice, once to check whether we have a declaration
748/// specifier, and another one to get the actual type inside
749/// ParseDeclarationSpecifiers).
750///
751/// This returns true if the token was annotated.
752///
753/// Note that this routine emits an error if you call it with ::new or ::delete
754/// as the current tokens, so only call it in contexts where these are invalid.
755bool Parser::TryAnnotateTypeOrScopeToken() {
756  assert((Tok.is(tok::identifier) || Tok.is(tok::coloncolon)) &&
757         "Cannot be a type or scope token!");
758
759  // FIXME: Implement template-ids
760  CXXScopeSpec SS;
761  if (getLang().CPlusPlus)
762    ParseOptionalCXXScopeSpecifier(SS);
763
764  if (Tok.is(tok::identifier)) {
765    // Determine whether the identifier is a type name.
766    if (TypeTy *Ty = Actions.getTypeName(*Tok.getIdentifierInfo(),
767                                         Tok.getLocation(), CurScope, &SS)) {
768      // This is a typename. Replace the current token in-place with an
769      // annotation type token.
770      Tok.setKind(tok::annot_typename);
771      Tok.setAnnotationValue(Ty);
772      Tok.setAnnotationEndLoc(Tok.getLocation());
773      if (SS.isNotEmpty()) // it was a C++ qualified type name.
774        Tok.setLocation(SS.getBeginLoc());
775
776      // In case the tokens were cached, have Preprocessor replace
777      // them with the annotation token.
778      PP.AnnotateCachedTokens(Tok);
779      return true;
780    } else if (!getLang().CPlusPlus) {
781      // If we're in C, we can't have :: tokens at all (the lexer won't return
782      // them).  If the identifier is not a type, then it can't be scope either,
783      // just early exit.
784      return false;
785    }
786
787    // If this is a template-id, annotate the template-id token.
788    if (NextToken().is(tok::less))
789      if (DeclTy *Template =
790          Actions.isTemplateName(*Tok.getIdentifierInfo(), CurScope, &SS))
791        AnnotateTemplateIdToken(Template, &SS);
792
793    // We either have an identifier that is not a type name or we have
794    // just created a template-id that might be a type name. Both
795    // cases will be handled below.
796  }
797
798  // FIXME: check for a template-id token here, and look it up if it
799  // names a type.
800
801  if (SS.isEmpty())
802    return false;
803
804  // A C++ scope specifier that isn't followed by a typename.
805  // Push the current token back into the token stream (or revert it if it is
806  // cached) and use an annotation scope token for current token.
807  if (PP.isBacktrackEnabled())
808    PP.RevertCachedTokens(1);
809  else
810    PP.EnterToken(Tok);
811  Tok.setKind(tok::annot_cxxscope);
812  Tok.setAnnotationValue(SS.getScopeRep());
813  Tok.setAnnotationRange(SS.getRange());
814
815  // In case the tokens were cached, have Preprocessor replace them with the
816  // annotation token.
817  PP.AnnotateCachedTokens(Tok);
818  return true;
819}
820
821/// TryAnnotateScopeToken - Like TryAnnotateTypeOrScopeToken but only
822/// annotates C++ scope specifiers.  This returns true if the token was
823/// annotated.
824///
825/// Note that this routine emits an error if you call it with ::new or ::delete
826/// as the current tokens, so only call it in contexts where these are invalid.
827bool Parser::TryAnnotateCXXScopeToken() {
828  assert(getLang().CPlusPlus &&
829         "Call sites of this function should be guarded by checking for C++");
830  assert((Tok.is(tok::identifier) || Tok.is(tok::coloncolon)) &&
831         "Cannot be a type or scope token!");
832
833  CXXScopeSpec SS;
834  if (!ParseOptionalCXXScopeSpecifier(SS))
835    return false;
836
837  // Push the current token back into the token stream (or revert it if it is
838  // cached) and use an annotation scope token for current token.
839  if (PP.isBacktrackEnabled())
840    PP.RevertCachedTokens(1);
841  else
842    PP.EnterToken(Tok);
843  Tok.setKind(tok::annot_cxxscope);
844  Tok.setAnnotationValue(SS.getScopeRep());
845  Tok.setAnnotationRange(SS.getRange());
846
847  // In case the tokens were cached, have Preprocessor replace them with the
848  // annotation token.
849  PP.AnnotateCachedTokens(Tok);
850  return true;
851}
852