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