VS_Sealed = 4
};
- VirtSpecifiers() : Specifiers(0), LastSpecifier(VS_None) { }
+ VirtSpecifiers() : Specifiers(0) { }
bool SetSpecifier(Specifier VS, SourceLocation Loc,
const char *&PrevSpec);
static const char *getSpecifierName(Specifier VS);
- SourceLocation getFirstLocation() const { return FirstLocation; }
SourceLocation getLastLocation() const { return LastLocation; }
- Specifier getLastSpecifier() const { return LastSpecifier; }
private:
unsigned Specifiers;
- Specifier LastSpecifier;
SourceLocation VS_overrideLoc, VS_finalLoc;
- SourceLocation FirstLocation;
SourceLocation LastLocation;
};
BitfieldSize = ParseConstantExpression();
if (BitfieldSize.isInvalid())
SkipUntil(tok::comma, StopAtSemi | StopBeforeMatch);
- } else {
+ } else
ParseOptionalCXX11VirtSpecifierSeq(
VS, getCurrentClass().IsInterface,
DeclaratorInfo.getDeclSpec().getFriendSpecLoc());
- if (!VS.isUnset())
- MaybeParseAndDiagnoseDeclSpecAfterCXX11VirtSpecifierSeq(DeclaratorInfo, VS);
- }
// If a simple-asm-expr is present, parse it.
if (Tok.is(tok::kw_asm)) {
Diag(Attr->getLoc(), diag::warn_gcc_attribute_location);
Attr = Attr->getNext();
}
- MaybeParseAndDiagnoseDeclSpecAfterCXX11VirtSpecifierSeq(DeclaratorInfo, VS);
}
}
return false;
}
-/// \brief Look for declaration specifiers possibly occurring after C++11
-/// virt-specifier-seq and diagnose them.
-void Parser::MaybeParseAndDiagnoseDeclSpecAfterCXX11VirtSpecifierSeq(
- Declarator &D,
- VirtSpecifiers &VS) {
- DeclSpec DS(AttrFactory);
-
- // GNU-style and C++11 attributes are not allowed here, but they will be
- // handled by the caller. Diagnose everything else.
- ParseTypeQualifierListOpt(DS, AR_NoAttributesParsed, false);
- D.ExtendWithDeclSpec(DS);
-
- 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);
- Name += " ";
- Insertion = FixItHint::CreateInsertion(VS.getFirstLocation(), Name.c_str());
- Function.TypeQuals |= TypeQual;
- *QualifierLoc = SpecLoc.getRawEncoding();
- }
- Diag(SpecLoc, diag::err_declspec_after_virtspec)
- << FixItName
- << VirtSpecifiers::getSpecifierName(VS.getLastSpecifier())
- << FixItHint::CreateRemoval(SpecLoc)
- << Insertion;
- }
- };
- auto &Function = D.getFunctionTypeInfo();
- DeclSpecCheck(DeclSpec::TQ_const, "const", DS.getConstSpecLoc(),
- &Function.ConstQualifierLoc);
- DeclSpecCheck(DeclSpec::TQ_volatile, "volatile", DS.getVolatileSpecLoc(),
- &Function.VolatileQualifierLoc);
- DeclSpecCheck(DeclSpec::TQ_restrict, "restrict", DS.getRestrictSpecLoc(),
- &Function.RestrictQualifierLoc);
- }
-}
-
/// ParseCXXClassMemberDeclaration - Parse a C++ class member declaration.
///
/// member-declaration: