From: Ehsan Akhgari Date: Tue, 24 Mar 2015 13:25:23 +0000 (+0000) Subject: Revert "Diagnose ref-qualifiers occuring after virt-specifier-seq and generate fixit... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6694b30bcc8834e884985fd8ded7bc32b013904c;p=clang Revert "Diagnose ref-qualifiers occuring after virt-specifier-seq and generate fixit hints" This reverts commit 49079d45966a3f57cd82edb35bde2e8e88fccf40. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@233073 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Parse/Parser.h b/include/clang/Parse/Parser.h index 179bc038d5..ba3fd133cc 100644 --- a/include/clang/Parse/Parser.h +++ b/include/clang/Parse/Parser.h @@ -2214,8 +2214,6 @@ private: BalancedDelimiterTracker &Tracker, bool IsAmbiguous, bool RequiresArg = false); - bool ParseRefQualifier(bool &RefQualifierIsLValueRef, - SourceLocation &RefQualifierLoc); bool isFunctionDeclaratorIdentifierList(); void ParseFunctionDeclaratorIdentifierList( Declarator &D, diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index 5726fb622c..c19759e596 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -5342,8 +5342,15 @@ void Parser::ParseFunctionDeclarator(Declarator &D, } // Parse ref-qualifier[opt]. - if (ParseRefQualifier(RefQualifierIsLValueRef, RefQualifierLoc)) + if (Tok.is(tok::amp) || Tok.is(tok::ampamp)) { + Diag(Tok, getLangOpts().CPlusPlus11 ? + diag::warn_cxx98_compat_ref_qualifier : + diag::ext_ref_qualifier); + + RefQualifierIsLValueRef = Tok.is(tok::amp); + RefQualifierLoc = ConsumeToken(); EndLoc = RefQualifierLoc; + } // C++11 [expr.prim.general]p3: // If a declaration declares a member function or member function @@ -5439,22 +5446,6 @@ void Parser::ParseFunctionDeclarator(Declarator &D, FnAttrs, EndLoc); } -/// ParseRefQualifier - Parses a member function ref-qualifier. Returns -/// true if a ref-qualifier is found. -bool Parser::ParseRefQualifier(bool &RefQualifierIsLValueRef, - SourceLocation &RefQualifierLoc) { - if (Tok.is(tok::amp) || Tok.is(tok::ampamp)) { - Diag(Tok, getLangOpts().CPlusPlus11 ? - diag::warn_cxx98_compat_ref_qualifier : - diag::ext_ref_qualifier); - - RefQualifierIsLValueRef = Tok.is(tok::amp); - RefQualifierLoc = ConsumeToken(); - return true; - } - return false; -} - /// isFunctionDeclaratorIdentifierList - This parameter list may have an /// identifier list form for a K&R-style function: void foo(a,b,c) /// diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp index 89da9fbf3c..c92d5f30f9 100644 --- a/lib/Parse/ParseDeclCXX.cpp +++ b/lib/Parse/ParseDeclCXX.cpp @@ -2100,13 +2100,13 @@ void Parser::MaybeParseAndDiagnoseDeclSpecAfterCXX11VirtSpecifierSeq( ParseTypeQualifierListOpt(DS, AR_NoAttributesParsed, false); D.ExtendWithDeclSpec(DS); - auto &Function = D.getFunctionTypeInfo(); if (DS.getTypeQualifiers() != DeclSpec::TQ_unspecified) { auto DeclSpecCheck = [&] (DeclSpec::TQ TypeQual, const char *FixItName, SourceLocation SpecLoc, unsigned* QualifierLoc) { FixItHint Insertion; + auto &Function = D.getFunctionTypeInfo(); if (DS.getTypeQualifiers() & TypeQual) { if (!(Function.TypeQuals & TypeQual)) { std::string Name(FixItName); @@ -2122,6 +2122,7 @@ void Parser::MaybeParseAndDiagnoseDeclSpecAfterCXX11VirtSpecifierSeq( << Insertion; } }; + auto &Function = D.getFunctionTypeInfo(); DeclSpecCheck(DeclSpec::TQ_const, "const", DS.getConstSpecLoc(), &Function.ConstQualifierLoc); DeclSpecCheck(DeclSpec::TQ_volatile, "volatile", DS.getVolatileSpecLoc(), @@ -2129,23 +2130,6 @@ void Parser::MaybeParseAndDiagnoseDeclSpecAfterCXX11VirtSpecifierSeq( DeclSpecCheck(DeclSpec::TQ_restrict, "restrict", DS.getRestrictSpecLoc(), &Function.RestrictQualifierLoc); } - - // Parse ref-qualifiers. - bool RefQualifierIsLValueRef = true; - SourceLocation RefQualifierLoc; - if (ParseRefQualifier(RefQualifierIsLValueRef, RefQualifierLoc)) { - const char *Name = (RefQualifierIsLValueRef ? "& " : "&& "); - FixItHint Insertion = FixItHint::CreateInsertion(VS.getFirstLocation(), Name); - Function.RefQualifierIsLValueRef = RefQualifierIsLValueRef; - Function.RefQualifierLoc = RefQualifierLoc.getRawEncoding(); - - Diag(RefQualifierLoc, diag::err_declspec_after_virtspec) - << (RefQualifierIsLValueRef ? "&" : "&&") - << VirtSpecifiers::getSpecifierName(VS.getLastSpecifier()) - << FixItHint::CreateRemoval(RefQualifierLoc) - << Insertion; - D.SetRangeEnd(RefQualifierLoc); - } } /// ParseCXXClassMemberDeclaration - Parse a C++ class member declaration. diff --git a/test/FixIt/fixit-cxx0x.cpp b/test/FixIt/fixit-cxx0x.cpp index 5aebcb3def..6e096e5e78 100644 --- a/test/FixIt/fixit-cxx0x.cpp +++ b/test/FixIt/fixit-cxx0x.cpp @@ -159,7 +159,7 @@ namespace MisplacedParameterPack { void redundantEllipsisInNonTypeTemplateParameter(); } -namespace MisplacedDeclAndRefSpecAfterVirtSpec { +namespace MisplacedDeclSpecAfterVirtSpec { struct B { virtual void f(); virtual void f() volatile const; @@ -168,12 +168,4 @@ namespace MisplacedDeclAndRefSpecAfterVirtSpec { virtual void f() override; virtual void f() override final const volatile; // expected-error {{'const' qualifier may not appear after the virtual specifier 'final'}} expected-error {{'volatile' qualifier may not appear after the virtual specifier 'final'}} }; - struct B2 { - virtual void f() &; - virtual void f() volatile const &&; - }; - struct D2 : B2 { - virtual void f() override &; // expected-error {{'&' qualifier may not appear after the virtual specifier 'override'}} - virtual void f() override final const volatile &&; // expected-error {{'const' qualifier may not appear after the virtual specifier 'final'}} expected-error {{'volatile' qualifier may not appear after the virtual specifier 'final'}} expected-error {{'&&' qualifier may not appear after the virtual specifier 'final'}} - }; }