diff options
Diffstat (limited to 'lib/Parse')
-rw-r--r-- | lib/Parse/ParseCXXInlineMethods.cpp | 10 | ||||
-rw-r--r-- | lib/Parse/ParseDecl.cpp | 31 | ||||
-rw-r--r-- | lib/Parse/ParseDeclCXX.cpp | 31 | ||||
-rw-r--r-- | lib/Parse/ParseExpr.cpp | 13 | ||||
-rw-r--r-- | lib/Parse/ParseExprCXX.cpp | 5 | ||||
-rw-r--r-- | lib/Parse/ParseStmt.cpp | 10 | ||||
-rw-r--r-- | lib/Parse/ParseTemplate.cpp | 18 | ||||
-rw-r--r-- | lib/Parse/Parser.cpp | 16 |
8 files changed, 85 insertions, 49 deletions
diff --git a/lib/Parse/ParseCXXInlineMethods.cpp b/lib/Parse/ParseCXXInlineMethods.cpp index b387e9e551..c9107b466d 100644 --- a/lib/Parse/ParseCXXInlineMethods.cpp +++ b/lib/Parse/ParseCXXInlineMethods.cpp @@ -67,15 +67,17 @@ Decl *Parser::ParseCXXInlineMethodDef(AccessSpecifier AS, bool Delete = false; SourceLocation KWLoc; if (Tok.is(tok::kw_delete)) { - if (!getLang().CPlusPlus0x) - Diag(Tok, diag::warn_deleted_function_accepted_as_extension); + Diag(Tok, getLang().CPlusPlus0x ? + diag::warn_cxx98_compat_deleted_function : + diag::warn_deleted_function_accepted_as_extension); KWLoc = ConsumeToken(); Actions.SetDeclDeleted(FnD, KWLoc); Delete = true; } else if (Tok.is(tok::kw_default)) { - if (!getLang().CPlusPlus0x) - Diag(Tok, diag::warn_defaulted_function_accepted_as_extension); + Diag(Tok, getLang().CPlusPlus0x ? + diag::warn_cxx98_compat_defaulted_function : + diag::warn_defaulted_function_accepted_as_extension); KWLoc = ConsumeToken(); Actions.SetDeclDefaulted(FnD, KWLoc); diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index 2aa178f5eb..948309a8ec 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -1276,6 +1276,8 @@ Decl *Parser::ParseDeclarationAfterDeclaratorAndAttributes(Declarator &D, } } else if (getLang().CPlusPlus0x && Tok.is(tok::l_brace)) { // Parse C++0x braced-init-list. + Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists); + if (D.getCXXScopeSpec().isSet()) { EnterScope(0); Actions.ActOnCXXEnterDeclInitializer(getCurScope(), ThisDecl); @@ -2778,6 +2780,7 @@ void Parser::ParseEnumSpecifier(SourceLocation StartLoc, DeclSpec &DS, if (getLang().CPlusPlus0x && (Tok.is(tok::kw_class) || Tok.is(tok::kw_struct))) { + Diag(Tok, diag::warn_cxx98_compat_scoped_enum); IsScopedEnum = true; IsScopedUsingClassTag = Tok.is(tok::kw_class); ConsumeToken(); @@ -2894,6 +2897,8 @@ void Parser::ParseEnumSpecifier(SourceLocation StartLoc, DeclSpec &DS, if (!getLang().CPlusPlus0x && !getLang().ObjC2) Diag(StartLoc, diag::ext_ms_enum_fixed_underlying_type) << Range; + if (getLang().CPlusPlus0x) + Diag(StartLoc, diag::warn_cxx98_compat_enum_fixed_underlying_type); } } @@ -3054,11 +3059,15 @@ void Parser::ParseEnumBody(SourceLocation StartLoc, Decl *EnumDecl) { break; SourceLocation CommaLoc = ConsumeToken(); - if (Tok.isNot(tok::identifier) && - !(getLang().C99 || getLang().CPlusPlus0x)) - Diag(CommaLoc, diag::ext_enumerator_list_comma) - << getLang().CPlusPlus - << FixItHint::CreateRemoval(CommaLoc); + if (Tok.isNot(tok::identifier)) { + if (!getLang().C99 && !getLang().CPlusPlus0x) + Diag(CommaLoc, diag::ext_enumerator_list_comma) + << getLang().CPlusPlus + << FixItHint::CreateRemoval(CommaLoc); + else if (getLang().CPlusPlus0x) + Diag(CommaLoc, diag::warn_cxx98_compat_enumerator_list_comma) + << FixItHint::CreateRemoval(CommaLoc); + } } // Eat the }. @@ -3682,8 +3691,10 @@ void Parser::ParseDeclaratorInternal(Declarator &D, // Complain about rvalue references in C++03, but then go on and build // the declarator. - if (Kind == tok::ampamp && !getLang().CPlusPlus0x) - Diag(Loc, diag::ext_rvalue_reference); + if (Kind == tok::ampamp) + Diag(Loc, getLang().CPlusPlus0x ? + diag::warn_cxx98_compat_rvalue_reference : + diag::ext_rvalue_reference); // C++ 8.3.2p1: cv-qualified references are ill-formed except when the // cv-qualifiers are introduced through the use of a typedef or of a @@ -4080,8 +4091,9 @@ void Parser::ParseFunctionDeclarator(Declarator &D, // Parse ref-qualifier[opt]. if (Tok.is(tok::amp) || Tok.is(tok::ampamp)) { - if (!getLang().CPlusPlus0x) - Diag(Tok, diag::ext_ref_qualifier); + Diag(Tok, getLang().CPlusPlus0x ? + diag::warn_cxx98_compat_ref_qualifier : + diag::ext_ref_qualifier); RefQualifierIsLValueRef = Tok.is(tok::amp); RefQualifierLoc = ConsumeToken(); @@ -4098,6 +4110,7 @@ void Parser::ParseFunctionDeclarator(Declarator &D, // Parse trailing-return-type[opt]. if (getLang().CPlusPlus0x && Tok.is(tok::arrow)) { + Diag(Tok, diag::warn_cxx98_compat_trailing_return_type); SourceRange Range; TrailingReturnType = ParseTrailingReturnType(Range).get(); if (Range.getEnd().isValid()) diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp index b9e2e9e701..09f8ab2fc1 100644 --- a/lib/Parse/ParseDeclCXX.cpp +++ b/lib/Parse/ParseDeclCXX.cpp @@ -148,8 +148,9 @@ Decl *Parser::ParseNamespace(unsigned Context, } // If we're still good, complain about inline namespaces in non-C++0x now. - if (!getLang().CPlusPlus0x && InlineLoc.isValid()) - Diag(InlineLoc, diag::ext_inline_namespace); + if (InlineLoc.isValid()) + Diag(InlineLoc, getLang().CPlusPlus0x ? + diag::warn_cxx98_compat_inline_namespace : diag::ext_inline_namespace); // Enter a scope for the namespace. ParseScope NamespaceScope(this, Scope::DeclScope); @@ -481,8 +482,9 @@ Decl *Parser::ParseUsingDeclaration(unsigned Context, // Where can GNU attributes appear? ConsumeToken(); - if (!getLang().CPlusPlus0x) - Diag(Tok.getLocation(), diag::ext_alias_declaration); + Diag(Tok.getLocation(), getLang().CPlusPlus0x ? + diag::warn_cxx98_compat_alias_declaration : + diag::ext_alias_declaration); // Type alias templates cannot be specialized. int SpecKind = -1; @@ -1516,9 +1518,10 @@ void Parser::ParseOptionalCXX0XVirtSpecifierSeq(VirtSpecifiers &VS) { << PrevSpec << FixItHint::CreateRemoval(Tok.getLocation()); - if (!getLang().CPlusPlus0x) - Diag(Tok.getLocation(), diag::ext_override_control_keyword) - << VirtSpecifiers::getSpecifierName(Specifier); + Diag(Tok.getLocation(), getLang().CPlusPlus0x ? + diag::warn_cxx98_compat_override_control_keyword : + diag::ext_override_control_keyword) + << VirtSpecifiers::getSpecifierName(Specifier); ConsumeToken(); } } @@ -1884,9 +1887,10 @@ void Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS, // Handle the initializer. if (HasDeferredInitializer) { // The initializer was deferred; parse it and cache the tokens. - if (!getLang().CPlusPlus0x) - Diag(Tok, diag::ext_nonstatic_member_init); - + Diag(Tok, getLang().CPlusPlus0x ? + diag::warn_cxx98_compat_nonstatic_member_init : + diag::ext_nonstatic_member_init); + if (DeclaratorInfo.isArrayOfUnknownBound()) { // C++0x [dcl.array]p3: An array bound may also be omitted when the // declarator is followed by an initializer. @@ -2075,8 +2079,9 @@ void Parser::ParseCXXMemberSpecification(SourceLocation RecordLoc, assert(isCXX0XFinalKeyword() && "not a class definition"); FinalLoc = ConsumeToken(); - if (!getLang().CPlusPlus0x) - Diag(FinalLoc, diag::ext_override_control_keyword) << "final"; + Diag(FinalLoc, getLang().CPlusPlus0x ? + diag::warn_cxx98_compat_override_control_keyword : + diag::ext_override_control_keyword) << "final"; } if (Tok.is(tok::colon)) { @@ -2318,6 +2323,8 @@ Parser::MemInitResult Parser::ParseMemInitializer(Decl *ConstructorDecl) { // Parse the '('. if (getLang().CPlusPlus0x && Tok.is(tok::l_brace)) { + Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists); + ExprResult InitList = ParseBraceInitializer(); if (InitList.isInvalid()) return true; diff --git a/lib/Parse/ParseExpr.cpp b/lib/Parse/ParseExpr.cpp index bc8bbf5640..aa86bb4d71 100644 --- a/lib/Parse/ParseExpr.cpp +++ b/lib/Parse/ParseExpr.cpp @@ -949,6 +949,9 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression, return ExprError(Diag(Tok, diag::err_expected_lparen_after_type) << DS.getSourceRange()); + if (Tok.is(tok::l_brace)) + Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists); + Res = ParseCXXTypeConstructExpression(DS); break; } @@ -1207,9 +1210,10 @@ Parser::ParsePostfixExpressionSuffix(ExprResult LHS) { T.consumeOpen(); Loc = T.getOpenLocation(); ExprResult Idx; - if (getLang().CPlusPlus0x && Tok.is(tok::l_brace)) + if (getLang().CPlusPlus0x && Tok.is(tok::l_brace)) { + Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists); Idx = ParseBraceInitializer(); - else + } else Idx = ParseExpression(); SourceLocation RLoc = Tok.getLocation(); @@ -2157,9 +2161,10 @@ bool Parser::ParseExpressionList(SmallVectorImpl<Expr*> &Exprs, } ExprResult Expr; - if (getLang().CPlusPlus0x && Tok.is(tok::l_brace)) + if (getLang().CPlusPlus0x && Tok.is(tok::l_brace)) { + Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists); Expr = ParseBraceInitializer(); - else + } else Expr = ParseAssignmentExpression(); if (Tok.is(tok::ellipsis)) diff --git a/lib/Parse/ParseExprCXX.cpp b/lib/Parse/ParseExprCXX.cpp index d079aa1d3d..33348a9aab 100644 --- a/lib/Parse/ParseExprCXX.cpp +++ b/lib/Parse/ParseExprCXX.cpp @@ -679,6 +679,8 @@ bool Parser::TryParseLambdaIntroducer(LambdaIntroducer &Intro) { /// expression. ExprResult Parser::ParseLambdaExpressionAfterIntroducer( LambdaIntroducer &Intro) { + Diag(Intro.Range.getBegin(), diag::warn_cxx98_compat_lambda); + // Parse lambda-declarator[opt]. DeclSpec DS(AttrFactory); Declarator D(DS, Declarator::PrototypeContext); @@ -1743,6 +1745,7 @@ bool Parser::ParseUnqualifiedIdOperator(CXXScopeSpec &SS, bool EnteringContext, // operator "" identifier if (getLang().CPlusPlus0x && Tok.is(tok::string_literal)) { + Diag(Tok.getLocation(), diag::warn_cxx98_compat_literal_operator); if (Tok.getLength() != 2) Diag(Tok.getLocation(), diag::err_operator_string_not_empty); ConsumeStringToken(); @@ -2104,6 +2107,8 @@ Parser::ParseCXXNewExpression(bool UseGlobal, SourceLocation Start) { return ExprError(); } } else if (Tok.is(tok::l_brace) && getLang().CPlusPlus0x) { + Diag(Tok.getLocation(), + diag::warn_cxx98_compat_generalized_initializer_lists); // FIXME: Have to communicate the init-list to ActOnCXXNew. ParseBraceInitializer(); } diff --git a/lib/Parse/ParseStmt.cpp b/lib/Parse/ParseStmt.cpp index a2b7cdd81b..3df761af44 100644 --- a/lib/Parse/ParseStmt.cpp +++ b/lib/Parse/ParseStmt.cpp @@ -1326,8 +1326,8 @@ StmtResult Parser::ParseForStatement(ParsedAttributes &attrs) { FirstPart = Actions.ActOnDeclStmt(DG, DeclStart, Tok.getLocation()); if (ForRangeInit.ParsedForRangeDecl()) { - if (!getLang().CPlusPlus0x) - Diag(ForRangeInit.ColonLoc, diag::ext_for_range); + Diag(ForRangeInit.ColonLoc, getLang().CPlusPlus0x ? + diag::warn_cxx98_compat_for_range : diag::ext_for_range); ForRange = true; } else if (Tok.is(tok::semi)) { // for (int x = 4; @@ -1569,8 +1569,10 @@ StmtResult Parser::ParseReturnStatement(ParsedAttributes &attrs) { // parse libstdc++ 4.5's headers. if (Tok.is(tok::l_brace) && getLang().CPlusPlus) { R = ParseInitializer(); - if (R.isUsable() && !getLang().CPlusPlus0x) - Diag(R.get()->getLocStart(), diag::ext_generalized_initializer_lists) + if (R.isUsable()) + Diag(R.get()->getLocStart(), getLang().CPlusPlus0x ? + diag::warn_cxx98_compat_generalized_initializer_lists : + diag::ext_generalized_initializer_lists) << R.get()->getSourceRange(); } else R = ParseExpression(); diff --git a/lib/Parse/ParseTemplate.cpp b/lib/Parse/ParseTemplate.cpp index 3d68a4ab9d..b485f1e977 100644 --- a/lib/Parse/ParseTemplate.cpp +++ b/lib/Parse/ParseTemplate.cpp @@ -709,15 +709,15 @@ Parser::ParseTemplateIdAfterTemplateName(TemplateTy Template, RAngleLoc = Tok.getLocation(); if (Tok.is(tok::greatergreater)) { - if (!getLang().CPlusPlus0x) { - const char *ReplaceStr = "> >"; - if (NextToken().is(tok::greater) || NextToken().is(tok::greatergreater)) - ReplaceStr = "> > "; - - Diag(Tok.getLocation(), diag::err_two_right_angle_brackets_need_space) - << FixItHint::CreateReplacement( - SourceRange(Tok.getLocation()), ReplaceStr); - } + const char *ReplaceStr = "> >"; + if (NextToken().is(tok::greater) || NextToken().is(tok::greatergreater)) + ReplaceStr = "> > "; + + Diag(Tok.getLocation(), getLang().CPlusPlus0x ? + diag::warn_cxx98_compat_two_right_angle_brackets : + diag::err_two_right_angle_brackets_need_space) + << FixItHint::CreateReplacement(SourceRange(Tok.getLocation()), + ReplaceStr); Tok.setKind(tok::greater); if (!ConsumeLastToken) { diff --git a/lib/Parse/Parser.cpp b/lib/Parse/Parser.cpp index c90964381f..2a1e2a2de8 100644 --- a/lib/Parse/Parser.cpp +++ b/lib/Parse/Parser.cpp @@ -535,9 +535,9 @@ Parser::ParseExternalDeclaration(ParsedAttributesWithRange &attrs, Decl *SingleDecl = 0; switch (Tok.getKind()) { case tok::semi: - if (!getLang().CPlusPlus0x) - Diag(Tok, diag::ext_top_level_semi) - << FixItHint::CreateRemoval(Tok.getLocation()); + Diag(Tok, getLang().CPlusPlus0x ? + diag::warn_cxx98_compat_top_level_semi : diag::ext_top_level_semi) + << FixItHint::CreateRemoval(Tok.getLocation()); ConsumeToken(); // TODO: Invoke action for top-level semicolon. @@ -918,15 +918,17 @@ Decl *Parser::ParseFunctionDefinition(ParsingDeclarator &D, bool Delete = false; SourceLocation KWLoc; if (Tok.is(tok::kw_delete)) { - if (!getLang().CPlusPlus0x) - Diag(Tok, diag::warn_deleted_function_accepted_as_extension); + Diag(Tok, getLang().CPlusPlus0x ? + diag::warn_cxx98_compat_deleted_function : + diag::warn_deleted_function_accepted_as_extension); KWLoc = ConsumeToken(); Actions.SetDeclDeleted(Res, KWLoc); Delete = true; } else if (Tok.is(tok::kw_default)) { - if (!getLang().CPlusPlus0x) - Diag(Tok, diag::warn_defaulted_function_accepted_as_extension); + Diag(Tok, getLang().CPlusPlus0x ? + diag::warn_cxx98_compat_defaulted_function : + diag::warn_defaulted_function_accepted_as_extension); KWLoc = ConsumeToken(); Actions.SetDeclDefaulted(Res, KWLoc); |