summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/include/clang/Parse/Parser.h2
-rw-r--r--clang/lib/Parse/ParseDecl.cpp25
-rw-r--r--clang/lib/Parse/ParseDeclCXX.cpp20
-rw-r--r--clang/test/FixIt/fixit-cxx0x.cpp10
4 files changed, 11 insertions, 46 deletions
diff --git a/clang/include/clang/Parse/Parser.h b/clang/include/clang/Parse/Parser.h
index 179bc038d5e..ba3fd133cc6 100644
--- a/clang/include/clang/Parse/Parser.h
+++ b/clang/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/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index 5726fb622c6..c19759e596c 100644
--- a/clang/lib/Parse/ParseDecl.cpp
+++ b/clang/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/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp
index 89da9fbf3c9..c92d5f30f95 100644
--- a/clang/lib/Parse/ParseDeclCXX.cpp
+++ b/clang/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/clang/test/FixIt/fixit-cxx0x.cpp b/clang/test/FixIt/fixit-cxx0x.cpp
index 5aebcb3defa..6e096e5e78e 100644
--- a/clang/test/FixIt/fixit-cxx0x.cpp
+++ b/clang/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'}}
- };
}
OpenPOWER on IntegriCloud