diff options
Diffstat (limited to 'lib/Parse/Parser.cpp')
-rw-r--r-- | lib/Parse/Parser.cpp | 105 |
1 files changed, 41 insertions, 64 deletions
diff --git a/lib/Parse/Parser.cpp b/lib/Parse/Parser.cpp index f4cdd619cef4..1ebba3e67a82 100644 --- a/lib/Parse/Parser.cpp +++ b/lib/Parse/Parser.cpp @@ -12,15 +12,15 @@ //===----------------------------------------------------------------------===// #include "clang/Parse/Parser.h" +#include "ParsePragma.h" +#include "RAIIObjectsForParser.h" +#include "clang/AST/ASTConsumer.h" +#include "clang/AST/DeclTemplate.h" #include "clang/Parse/ParseDiagnostic.h" #include "clang/Sema/DeclSpec.h" -#include "clang/Sema/Scope.h" #include "clang/Sema/ParsedTemplate.h" +#include "clang/Sema/Scope.h" #include "llvm/Support/raw_ostream.h" -#include "RAIIObjectsForParser.h" -#include "ParsePragma.h" -#include "clang/AST/DeclTemplate.h" -#include "clang/AST/ASTConsumer.h" using namespace clang; @@ -96,6 +96,11 @@ Parser::Parser(Preprocessor &pp, Sema &actions, bool skipFunctionBodies) PP.AddPragmaHandler("OPENCL", FPContractHandler.get()); } + if (getLangOpts().OpenMP) + OpenMPHandler.reset(new PragmaOpenMPHandler()); + else + OpenMPHandler.reset(new PragmaNoOpenMPHandler()); + PP.AddPragmaHandler(OpenMPHandler.get()); CommentSemaHandler.reset(new ActionCommentHandler(actions)); PP.addCommentHandler(CommentSemaHandler.get()); @@ -103,29 +108,6 @@ Parser::Parser(Preprocessor &pp, Sema &actions, bool skipFunctionBodies) PP.setCodeCompletionHandler(*this); } -/// If a crash happens while the parser is active, print out a line indicating -/// what the current token is. -void PrettyStackTraceParserEntry::print(raw_ostream &OS) const { - const Token &Tok = P.getCurToken(); - if (Tok.is(tok::eof)) { - OS << "<eof> parser at end of file\n"; - return; - } - - if (Tok.getLocation().isInvalid()) { - OS << "<unknown> parser at unknown location\n"; - return; - } - - const Preprocessor &PP = P.getPreprocessor(); - Tok.getLocation().print(OS, PP.getSourceManager()); - if (Tok.isAnnotation()) - OS << ": at annotation token \n"; - else - OS << ": current parser token '" << PP.getSpelling(Tok) << "'\n"; -} - - DiagnosticBuilder Parser::Diag(SourceLocation Loc, unsigned DiagID) { return Diags.Report(Loc, DiagID); } @@ -241,7 +223,7 @@ void Parser::ConsumeExtraSemi(ExtraSemiKind Kind, unsigned TST) { // C++11 allows extra semicolons at namespace scope, but not in any of the // other contexts. if (Kind == OutsideFunction && getLangOpts().CPlusPlus) { - if (getLangOpts().CPlusPlus0x) + if (getLangOpts().CPlusPlus11) Diag(StartLoc, diag::warn_cxx98_compat_top_level_semi) << FixItHint::CreateRemoval(SourceRange(StartLoc, EndLoc)); else @@ -451,6 +433,8 @@ Parser::~Parser() { OpenCLExtensionHandler.reset(); PP.RemovePragmaHandler("OPENCL", FPContractHandler.get()); } + PP.RemovePragmaHandler(OpenMPHandler.get()); + OpenMPHandler.reset(); PP.RemovePragmaHandler("STDC", FPContractHandler.get()); FPContractHandler.reset(); @@ -577,34 +561,18 @@ bool Parser::ParseTopLevelDecl(DeclGroupPtrTy &Result) { } ParsedAttributesWithRange attrs(AttrFactory); - MaybeParseCXX0XAttributes(attrs); + MaybeParseCXX11Attributes(attrs); MaybeParseMicrosoftAttributes(attrs); Result = ParseExternalDeclaration(attrs); return false; } -/// ParseTranslationUnit: -/// translation-unit: [C99 6.9] -/// external-declaration -/// translation-unit external-declaration -void Parser::ParseTranslationUnit() { - Initialize(); - - DeclGroupPtrTy Res; - while (!ParseTopLevelDecl(Res)) - /*parse them all*/; - - ExitScope(); - assert(getCurScope() == 0 && "Scope imbalance!"); -} - /// ParseExternalDeclaration: /// /// external-declaration: [C99 6.9], declaration: [C++ dcl.dcl] /// function-definition /// declaration -/// [C++0x] empty-declaration /// [GNU] asm-definition /// [GNU] __extension__ external-declaration /// [OBJC] objc-class-definition @@ -616,8 +584,10 @@ void Parser::ParseTranslationUnit() { /// [C++] linkage-specification /// [GNU] asm-definition: /// simple-asm-expr ';' +/// [C++11] empty-declaration +/// [C++11] attribute-declaration /// -/// [C++0x] empty-declaration: +/// [C++11] empty-declaration: /// ';' /// /// [C++0x/GNU] 'extern' 'template' declaration @@ -661,10 +631,16 @@ Parser::ParseExternalDeclaration(ParsedAttributesWithRange &attrs, case tok::annot_pragma_opencl_extension: HandlePragmaOpenCLExtension(); return DeclGroupPtrTy(); + case tok::annot_pragma_openmp: + ParseOpenMPDeclarativeDirective(); + return DeclGroupPtrTy(); case tok::semi: + // Either a C++11 empty-declaration or attribute-declaration. + SingleDecl = Actions.ActOnEmptyDeclaration(getCurScope(), + attrs.getList(), + Tok.getLocation()); ConsumeExtraSemi(OutsideFunction); - // TODO: Invoke action for top-level semicolon. - return DeclGroupPtrTy(); + break; case tok::r_brace: Diag(Tok, diag::err_extraneous_closing_brace); ConsumeBrace(); @@ -764,7 +740,7 @@ Parser::ParseExternalDeclaration(ParsedAttributesWithRange &attrs, // Extern templates SourceLocation ExternLoc = ConsumeToken(); SourceLocation TemplateLoc = ConsumeToken(); - Diag(ExternLoc, getLangOpts().CPlusPlus0x ? + Diag(ExternLoc, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_extern_template : diag::ext_extern_template) << SourceRange(ExternLoc, TemplateLoc); SourceLocation DeclEnd; @@ -783,11 +759,7 @@ Parser::ParseExternalDeclaration(ParsedAttributesWithRange &attrs, default: dont_know: // We can't tell whether this is a function-definition or declaration yet. - if (DS) { - return ParseDeclarationOrFunctionDefinition(attrs, DS); - } else { - return ParseDeclarationOrFunctionDefinition(attrs); - } + return ParseDeclarationOrFunctionDefinition(attrs, DS); } // This routine returns a DeclGroup, if the thing we parsed only contains a @@ -986,7 +958,8 @@ Decl *Parser::ParseFunctionDefinition(ParsingDeclarator &D, if (Tok.isNot(tok::equal)) { AttributeList *DtorAttrs = D.getAttributes(); while (DtorAttrs) { - if (!IsThreadSafetyAttribute(DtorAttrs->getName()->getName())) { + if (!IsThreadSafetyAttribute(DtorAttrs->getName()->getName()) && + !DtorAttrs->isCXX11Attribute()) { Diag(DtorAttrs->getLoc(), diag::warn_attribute_on_function_definition) << DtorAttrs->getName()->getName(); } @@ -1076,7 +1049,7 @@ Decl *Parser::ParseFunctionDefinition(ParsingDeclarator &D, bool Delete = false; SourceLocation KWLoc; if (Tok.is(tok::kw_delete)) { - Diag(Tok, getLangOpts().CPlusPlus0x ? + Diag(Tok, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_deleted_function : diag::ext_deleted_function); @@ -1084,7 +1057,7 @@ Decl *Parser::ParseFunctionDefinition(ParsingDeclarator &D, Actions.SetDeclDeleted(Res, KWLoc); Delete = true; } else if (Tok.is(tok::kw_default)) { - Diag(Tok, getLangOpts().CPlusPlus0x ? + Diag(Tok, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_defaulted_function : diag::ext_defaulted_function); @@ -1138,7 +1111,8 @@ void Parser::ParseKNRParamDeclarations(Declarator &D) { // Enter function-declaration scope, limiting any declarators to the // function prototype scope, including parameter declarators. - ParseScope PrototypeScope(this, Scope::FunctionPrototypeScope|Scope::DeclScope); + ParseScope PrototypeScope(this, Scope::FunctionPrototypeScope | + Scope::FunctionDeclarationScope | Scope::DeclScope); // Read all the argument declarations. while (isDeclarationSpecifier()) { @@ -1263,7 +1237,8 @@ Parser::ExprResult Parser::ParseAsmStringLiteral() { return ExprError(); } default: - Diag(Tok, diag::err_expected_string_literal); + Diag(Tok, diag::err_expected_string_literal) + << /*Source='in...'*/0 << "'asm'"; return ExprError(); } @@ -1857,7 +1832,7 @@ void Parser::ParseMicrosoftIfExistsExternalDeclaration() { // Parse the declarations. while (Tok.isNot(tok::r_brace) && Tok.isNot(tok::eof)) { ParsedAttributesWithRange attrs(AttrFactory); - MaybeParseCXX0XAttributes(attrs); + MaybeParseCXX11Attributes(attrs); MaybeParseMicrosoftAttributes(attrs); DeclGroupPtrTy Result = ParseExternalDeclaration(attrs); if (Result && !getCurScope()->getParent()) @@ -1867,11 +1842,11 @@ void Parser::ParseMicrosoftIfExistsExternalDeclaration() { } Parser::DeclGroupPtrTy Parser::ParseModuleImport(SourceLocation AtLoc) { - assert(Tok.isObjCAtKeyword(tok::objc___experimental_modules_import) && + assert(Tok.isObjCAtKeyword(tok::objc_import) && "Improper start to module import"); SourceLocation ImportLoc = ConsumeToken(); - llvm::SmallVector<std::pair<IdentifierInfo *, SourceLocation>, 2> Path; + SmallVector<std::pair<IdentifierInfo *, SourceLocation>, 2> Path; // Parse the module path. do { @@ -1909,7 +1884,9 @@ Parser::DeclGroupPtrTy Parser::ParseModuleImport(SourceLocation AtLoc) { } bool BalancedDelimiterTracker::diagnoseOverflow() { - P.Diag(P.Tok, diag::err_parser_impl_limit_overflow); + P.Diag(P.Tok, diag::err_bracket_depth_exceeded) + << P.getLangOpts().BracketDepth; + P.Diag(P.Tok, diag::note_bracket_depth); P.SkipUntil(tok::eof); return true; } |