Parser.cpp revision 5e02c47a7085831586344a9728763cb50540c7f7
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.
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(),
361                                           move_convert(Result));
362    return 0;
363  }
364  case tok::at:
365    // @ is not a legal token unless objc is enabled, no need to check.
366    return ParseObjCAtDirectives();
367  case tok::minus:
368  case tok::plus:
369    if (getLang().ObjC1)
370      return ParseObjCMethodDefinition();
371    else {
372      Diag(Tok, diag::err_expected_external_declaration);
373      ConsumeToken();
374    }
375    return 0;
376  case tok::kw_using:
377  case tok::kw_namespace:
378  case tok::kw_typedef:
379  case tok::kw_template:
380  case tok::kw_export:    // As in 'export template'
381    // A function definition cannot start with a these keywords.
382    return ParseDeclaration(Declarator::FileContext);
383
384  default:
385    // We can't tell whether this is a function-definition or declaration yet.
386    return ParseDeclarationOrFunctionDefinition();
387  }
388}
389
390/// ParseDeclarationOrFunctionDefinition - Parse either a function-definition or
391/// a declaration.  We can't tell which we have until we read up to the
392/// compound-statement in function-definition. TemplateParams, if
393/// non-NULL, provides the template parameters when we're parsing a
394/// C++ template-declaration.
395///
396///       function-definition: [C99 6.9.1]
397///         decl-specs      declarator declaration-list[opt] compound-statement
398/// [C90] function-definition: [C99 6.7.1] - implicit int result
399/// [C90]   decl-specs[opt] declarator declaration-list[opt] compound-statement
400///
401///       declaration: [C99 6.7]
402///         declaration-specifiers init-declarator-list[opt] ';'
403/// [!C99]  init-declarator-list ';'                   [TODO: warn in c99 mode]
404/// [OMP]   threadprivate-directive                              [TODO]
405///
406Parser::DeclTy *
407Parser::ParseDeclarationOrFunctionDefinition(
408                                  TemplateParameterLists *TemplateParams) {
409  // Parse the common declaration-specifiers piece.
410  DeclSpec DS;
411  ParseDeclarationSpecifiers(DS, TemplateParams);
412
413  // C99 6.7.2.3p6: Handle "struct-or-union identifier;", "enum { X };"
414  // declaration-specifiers init-declarator-list[opt] ';'
415  if (Tok.is(tok::semi)) {
416    ConsumeToken();
417    return Actions.ParsedFreeStandingDeclSpec(CurScope, DS);
418  }
419
420  // ObjC2 allows prefix attributes on class interfaces and protocols.
421  // FIXME: This still needs better diagnostics. We should only accept
422  // attributes here, no types, etc.
423  if (getLang().ObjC2 && Tok.is(tok::at)) {
424    SourceLocation AtLoc = ConsumeToken(); // the "@"
425    if (!Tok.isObjCAtKeyword(tok::objc_interface) &&
426        !Tok.isObjCAtKeyword(tok::objc_protocol)) {
427      Diag(Tok, diag::err_objc_unexpected_attr);
428      SkipUntil(tok::semi); // FIXME: better skip?
429      return 0;
430    }
431    const char *PrevSpec = 0;
432    if (DS.SetTypeSpecType(DeclSpec::TST_unspecified, AtLoc, PrevSpec))
433      Diag(AtLoc, diag::err_invalid_decl_spec_combination) << PrevSpec;
434    if (Tok.isObjCAtKeyword(tok::objc_protocol))
435      return ParseObjCAtProtocolDeclaration(AtLoc, DS.getAttributes());
436    return ParseObjCAtInterfaceDeclaration(AtLoc, DS.getAttributes());
437  }
438
439  // If the declspec consisted only of 'extern' and we have a string
440  // literal following it, this must be a C++ linkage specifier like
441  // 'extern "C"'.
442  if (Tok.is(tok::string_literal) && getLang().CPlusPlus &&
443      DS.getStorageClassSpec() == DeclSpec::SCS_extern &&
444      DS.getParsedSpecifiers() == DeclSpec::PQ_StorageClassSpecifier)
445    return ParseLinkage(Declarator::FileContext);
446
447  // Parse the first declarator.
448  Declarator DeclaratorInfo(DS, Declarator::FileContext);
449  ParseDeclarator(DeclaratorInfo);
450  // Error parsing the declarator?
451  if (!DeclaratorInfo.hasName()) {
452    // If so, skip until the semi-colon or a }.
453    SkipUntil(tok::r_brace, true, true);
454    if (Tok.is(tok::semi))
455      ConsumeToken();
456    return 0;
457  }
458
459  // If the declarator is the start of a function definition, handle it.
460  if (Tok.is(tok::equal) ||           // int X()=  -> not a function def
461      Tok.is(tok::comma) ||           // int X(),  -> not a function def
462      Tok.is(tok::semi)  ||           // int X();  -> not a function def
463      Tok.is(tok::kw_asm) ||          // int X() __asm__ -> not a function def
464      Tok.is(tok::kw___attribute) ||  // int X() __attr__ -> not a function def
465      (getLang().CPlusPlus &&
466       Tok.is(tok::l_paren)) ) {      // int X(0) -> not a function def [C++]
467    // FALL THROUGH.
468  } else if (DeclaratorInfo.isFunctionDeclarator() &&
469             (Tok.is(tok::l_brace) ||             // int X() {}
470              ( !getLang().CPlusPlus &&
471                isDeclarationSpecifier() ))) {    // int X(f) int f; {}
472    if (DS.getStorageClassSpec() == DeclSpec::SCS_typedef) {
473      Diag(Tok, diag::err_function_declared_typedef);
474
475      if (Tok.is(tok::l_brace)) {
476        // This recovery skips the entire function body. It would be nice
477        // to simply call ParseFunctionDefinition() below, however Sema
478        // assumes the declarator represents a function, not a typedef.
479        ConsumeBrace();
480        SkipUntil(tok::r_brace, true);
481      } else {
482        SkipUntil(tok::semi);
483      }
484      return 0;
485    }
486    return ParseFunctionDefinition(DeclaratorInfo);
487  } else {
488    if (DeclaratorInfo.isFunctionDeclarator())
489      Diag(Tok, diag::err_expected_fn_body);
490    else
491      Diag(Tok, diag::err_expected_after_declarator);
492    SkipUntil(tok::semi);
493    return 0;
494  }
495
496  // Parse the init-declarator-list for a normal declaration.
497  return ParseInitDeclaratorListAfterFirstDeclarator(DeclaratorInfo);
498}
499
500/// ParseFunctionDefinition - We parsed and verified that the specified
501/// Declarator is well formed.  If this is a K&R-style function, read the
502/// parameters declaration-list, then start the compound-statement.
503///
504///       function-definition: [C99 6.9.1]
505///         decl-specs      declarator declaration-list[opt] compound-statement
506/// [C90] function-definition: [C99 6.7.1] - implicit int result
507/// [C90]   decl-specs[opt] declarator declaration-list[opt] compound-statement
508/// [C++] function-definition: [C++ 8.4]
509///         decl-specifier-seq[opt] declarator ctor-initializer[opt] function-body
510/// [C++] function-definition: [C++ 8.4]
511///         decl-specifier-seq[opt] declarator function-try-block [TODO]
512///
513Parser::DeclTy *Parser::ParseFunctionDefinition(Declarator &D) {
514  const DeclaratorChunk &FnTypeInfo = D.getTypeObject(0);
515  assert(FnTypeInfo.Kind == DeclaratorChunk::Function &&
516         "This isn't a function declarator!");
517  const DeclaratorChunk::FunctionTypeInfo &FTI = FnTypeInfo.Fun;
518
519  // If this is C90 and the declspecs were completely missing, fudge in an
520  // implicit int.  We do this here because this is the only place where
521  // declaration-specifiers are completely optional in the grammar.
522  if (getLang().ImplicitInt && D.getDeclSpec().getParsedSpecifiers() == 0) {
523    const char *PrevSpec;
524    D.getMutableDeclSpec().SetTypeSpecType(DeclSpec::TST_int,
525                                           D.getIdentifierLoc(),
526                                           PrevSpec);
527  }
528
529  // If this declaration was formed with a K&R-style identifier list for the
530  // arguments, parse declarations for all of the args next.
531  // int foo(a,b) int a; float b; {}
532  if (!FTI.hasPrototype && FTI.NumArgs != 0)
533    ParseKNRParamDeclarations(D);
534
535  // We should have either an opening brace or, in a C++ constructor,
536  // we may have a colon.
537  // FIXME: In C++, we might also find the 'try' keyword.
538  if (Tok.isNot(tok::l_brace) && Tok.isNot(tok::colon)) {
539    Diag(Tok, diag::err_expected_fn_body);
540
541    // Skip over garbage, until we get to '{'.  Don't eat the '{'.
542    SkipUntil(tok::l_brace, true, true);
543
544    // If we didn't find the '{', bail out.
545    if (Tok.isNot(tok::l_brace))
546      return 0;
547  }
548
549  // Enter a scope for the function body.
550  ParseScope BodyScope(this, Scope::FnScope|Scope::DeclScope);
551
552  // Tell the actions module that we have entered a function definition with the
553  // specified Declarator for the function.
554  DeclTy *Res = Actions.ActOnStartOfFunctionDef(CurScope, D);
555
556  // If we have a colon, then we're probably parsing a C++
557  // ctor-initializer.
558  if (Tok.is(tok::colon))
559    ParseConstructorInitializer(Res);
560
561  SourceLocation BraceLoc = Tok.getLocation();
562  return ParseFunctionStatementBody(Res, BraceLoc, BraceLoc);
563}
564
565/// ParseKNRParamDeclarations - Parse 'declaration-list[opt]' which provides
566/// types for a function with a K&R-style identifier list for arguments.
567void Parser::ParseKNRParamDeclarations(Declarator &D) {
568  // We know that the top-level of this declarator is a function.
569  DeclaratorChunk::FunctionTypeInfo &FTI = D.getTypeObject(0).Fun;
570
571  // Enter function-declaration scope, limiting any declarators to the
572  // function prototype scope, including parameter declarators.
573  ParseScope PrototypeScope(this, Scope::FnScope|Scope::DeclScope);
574
575  // Read all the argument declarations.
576  while (isDeclarationSpecifier()) {
577    SourceLocation DSStart = Tok.getLocation();
578
579    // Parse the common declaration-specifiers piece.
580    DeclSpec DS;
581    ParseDeclarationSpecifiers(DS);
582
583    // C99 6.9.1p6: 'each declaration in the declaration list shall have at
584    // least one declarator'.
585    // NOTE: GCC just makes this an ext-warn.  It's not clear what it does with
586    // the declarations though.  It's trivial to ignore them, really hard to do
587    // anything else with them.
588    if (Tok.is(tok::semi)) {
589      Diag(DSStart, diag::err_declaration_does_not_declare_param);
590      ConsumeToken();
591      continue;
592    }
593
594    // C99 6.9.1p6: Declarations shall contain no storage-class specifiers other
595    // than register.
596    if (DS.getStorageClassSpec() != DeclSpec::SCS_unspecified &&
597        DS.getStorageClassSpec() != DeclSpec::SCS_register) {
598      Diag(DS.getStorageClassSpecLoc(),
599           diag::err_invalid_storage_class_in_func_decl);
600      DS.ClearStorageClassSpecs();
601    }
602    if (DS.isThreadSpecified()) {
603      Diag(DS.getThreadSpecLoc(),
604           diag::err_invalid_storage_class_in_func_decl);
605      DS.ClearStorageClassSpecs();
606    }
607
608    // Parse the first declarator attached to this declspec.
609    Declarator ParmDeclarator(DS, Declarator::KNRTypeListContext);
610    ParseDeclarator(ParmDeclarator);
611
612    // Handle the full declarator list.
613    while (1) {
614      DeclTy *AttrList;
615      // If attributes are present, parse them.
616      if (Tok.is(tok::kw___attribute))
617        // FIXME: attach attributes too.
618        AttrList = ParseAttributes();
619
620      // Ask the actions module to compute the type for this declarator.
621      Action::DeclTy *Param =
622        Actions.ActOnParamDeclarator(CurScope, ParmDeclarator);
623
624      if (Param &&
625          // A missing identifier has already been diagnosed.
626          ParmDeclarator.getIdentifier()) {
627
628        // Scan the argument list looking for the correct param to apply this
629        // type.
630        for (unsigned i = 0; ; ++i) {
631          // C99 6.9.1p6: those declarators shall declare only identifiers from
632          // the identifier list.
633          if (i == FTI.NumArgs) {
634            Diag(ParmDeclarator.getIdentifierLoc(), diag::err_no_matching_param)
635              << ParmDeclarator.getIdentifier();
636            break;
637          }
638
639          if (FTI.ArgInfo[i].Ident == ParmDeclarator.getIdentifier()) {
640            // Reject redefinitions of parameters.
641            if (FTI.ArgInfo[i].Param) {
642              Diag(ParmDeclarator.getIdentifierLoc(),
643                   diag::err_param_redefinition)
644                 << ParmDeclarator.getIdentifier();
645            } else {
646              FTI.ArgInfo[i].Param = Param;
647            }
648            break;
649          }
650        }
651      }
652
653      // If we don't have a comma, it is either the end of the list (a ';') or
654      // an error, bail out.
655      if (Tok.isNot(tok::comma))
656        break;
657
658      // Consume the comma.
659      ConsumeToken();
660
661      // Parse the next declarator.
662      ParmDeclarator.clear();
663      ParseDeclarator(ParmDeclarator);
664    }
665
666    if (Tok.is(tok::semi)) {
667      ConsumeToken();
668    } else {
669      Diag(Tok, diag::err_parse_error);
670      // Skip to end of block or statement
671      SkipUntil(tok::semi, true);
672      if (Tok.is(tok::semi))
673        ConsumeToken();
674    }
675  }
676
677  // The actions module must verify that all arguments were declared.
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() {
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  ConsumeParen();
716
717  OwningExprResult Result(ParseAsmStringLiteral());
718
719  if (Result.isInvalid())
720    SkipUntil(tok::r_paren);
721  else
722    MatchRHSPunctuation(tok::r_paren, Loc);
723
724  return move(Result);
725}
726
727/// TryAnnotateTypeOrScopeToken - If the current token position is on a
728/// typename (possibly qualified in C++) or a C++ scope specifier not followed
729/// by a typename, TryAnnotateTypeOrScopeToken will replace one or more tokens
730/// with a single annotation token representing the typename or C++ scope
731/// respectively.
732/// This simplifies handling of C++ scope specifiers and allows efficient
733/// backtracking without the need to re-parse and resolve nested-names and
734/// typenames.
735/// It will mainly be called when we expect to treat identifiers as typenames
736/// (if they are typenames). For example, in C we do not expect identifiers
737/// inside expressions to be treated as typenames so it will not be called
738/// for expressions in C.
739/// The benefit for C/ObjC is that a typename will be annotated and
740/// Actions.isTypeName will not be needed to be called again (e.g. isTypeName
741/// will not be called twice, once to check whether we have a declaration
742/// specifier, and another one to get the actual type inside
743/// ParseDeclarationSpecifiers).
744///
745/// This returns true if the token was annotated.
746bool Parser::TryAnnotateTypeOrScopeToken(const Token *GlobalQualifier) {
747  // FIXME: what about template-ids?
748  if (Tok.is(tok::annot_qualtypename) || Tok.is(tok::annot_cxxscope))
749    return false;
750
751  CXXScopeSpec SS;
752  if (getLang().CPlusPlus)
753    MaybeParseCXXScopeSpecifier(SS, GlobalQualifier);
754
755  if (Tok.is(tok::identifier)) {
756    DeclTy *Template = 0;
757    // If this is a template-id, annotate the template-id token.
758    if (getLang().CPlusPlus && NextToken().is(tok::less) &&
759        (Template = Actions.isTemplateName(*Tok.getIdentifierInfo(), CurScope,
760                                           &SS)))
761      AnnotateTemplateIdToken(Template, &SS);
762    else {
763      // Determine whether the identifier is a type name.
764      TypeTy *Ty = Actions.isTypeName(*Tok.getIdentifierInfo(), CurScope, &SS);
765      if (Ty) {
766        // This is a typename. Replace the current token in-place with an
767        // annotation type token.
768        Tok.setKind(tok::annot_qualtypename);
769        Tok.setAnnotationValue(Ty);
770        Tok.setAnnotationEndLoc(Tok.getLocation());
771        if (SS.isNotEmpty()) // it was a C++ qualified type name.
772          Tok.setLocation(SS.getBeginLoc());
773
774        // In case the tokens were cached, have Preprocessor replace
775        // them with the annotation token.
776        PP.AnnotateCachedTokens(Tok);
777        return true;
778      }
779    }
780
781    // We either have an identifier that is not a type name or we have
782    // just created a template-id that might be a type name. Both
783    // cases will be handled below.
784  }
785
786  // FIXME: check for a template-id token here, and look it up if it
787  // names a type.
788
789  if (SS.isEmpty())
790    return false;
791
792  // A C++ scope specifier that isn't followed by a typename.
793  // Push the current token back into the token stream (or revert it if it is
794  // cached) and use an annotation scope token for current token.
795  if (PP.isBacktrackEnabled())
796    PP.RevertCachedTokens(1);
797  else
798    PP.EnterToken(Tok);
799  Tok.setKind(tok::annot_cxxscope);
800  Tok.setAnnotationValue(SS.getScopeRep());
801  Tok.setAnnotationRange(SS.getRange());
802
803  // In case the tokens were cached, have Preprocessor replace them with the
804  // annotation token.
805  PP.AnnotateCachedTokens(Tok);
806  return true;
807}
808
809/// TryAnnotateScopeToken - Like TryAnnotateTypeOrScopeToken but only
810/// annotates C++ scope specifiers.  This returns true if the token was
811/// annotated.
812bool Parser::TryAnnotateCXXScopeToken() {
813  assert(getLang().CPlusPlus &&
814         "Call sites of this function should be guarded by checking for C++");
815
816  if (Tok.is(tok::annot_cxxscope))
817    return false;
818
819  CXXScopeSpec SS;
820  if (!MaybeParseCXXScopeSpecifier(SS))
821    return false;
822
823  // Push the current token back into the token stream (or revert it if it is
824  // cached) and use an annotation scope token for current token.
825  if (PP.isBacktrackEnabled())
826    PP.RevertCachedTokens(1);
827  else
828    PP.EnterToken(Tok);
829  Tok.setKind(tok::annot_cxxscope);
830  Tok.setAnnotationValue(SS.getScopeRep());
831  Tok.setAnnotationRange(SS.getRange());
832
833  // In case the tokens were cached, have Preprocessor replace them with the
834  // annotation token.
835  PP.AnnotateCachedTokens(Tok);
836  return true;
837}
838