зеркало из https://github.com/microsoft/clang-1.git
Factor the member access specifier setting code into its own function. No intended functionality change.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67725 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
5aeccdbb4b
Коммит
0cf8830a45
|
@ -1616,6 +1616,13 @@ public:
|
|||
FunctionDecl::StorageClass& SC);
|
||||
DeclTy *ActOnConversionDeclarator(CXXConversionDecl *Conversion);
|
||||
|
||||
/// SetMemberAccessSpecifier - Set the access specifier of a member.
|
||||
/// Returns true on error (when the previous member decl access specifier
|
||||
/// is different from the new member decl access specifier).
|
||||
bool SetMemberAccessSpecifier(NamedDecl *MemberDecl,
|
||||
NamedDecl *PrevMemberDecl,
|
||||
AccessSpecifier LexicalAS);
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// C++ Derived Classes
|
||||
//
|
||||
|
|
|
@ -3083,21 +3083,6 @@ TypedefDecl *Sema::ParseTypedefDecl(Scope *S, Declarator &D, QualType T,
|
|||
return NewTD;
|
||||
}
|
||||
|
||||
static const char *getAccessName(AccessSpecifier AS) {
|
||||
switch (AS) {
|
||||
default:
|
||||
case AS_none:
|
||||
assert("Invalid access specifier!");
|
||||
return 0;
|
||||
case AS_public:
|
||||
return "public";
|
||||
case AS_private:
|
||||
return "private";
|
||||
case AS_protected:
|
||||
return "protected";
|
||||
}
|
||||
}
|
||||
|
||||
/// ActOnTag - This is invoked when we see 'struct foo' or 'struct {'. In the
|
||||
/// former case, Name will be non-null. In the later case, Name will be null.
|
||||
/// TagSpec indicates what kind of tag this is. TK indicates whether this is a
|
||||
|
@ -3399,18 +3384,8 @@ CreateNewDecl:
|
|||
// lexical context will be different from the semantic context.
|
||||
New->setLexicalDeclContext(CurContext);
|
||||
|
||||
if (PrevDecl) {
|
||||
// C++ [class.access.spec]p3: When a member is redeclared its access
|
||||
// specifier must be same as its initial declaration.
|
||||
if (AS != AS_none && AS != PrevDecl->getAccess()) {
|
||||
Diag(Loc, diag::err_class_redeclared_with_different_access)
|
||||
<< New << getAccessName(AS);
|
||||
Diag(PrevDecl->getLocation(), diag::note_previous_access_declaration)
|
||||
<< PrevDecl << getAccessName(PrevDecl->getAccess());
|
||||
} else
|
||||
New->setAccess(PrevDecl->getAccess());
|
||||
} else
|
||||
New->setAccess(AS);
|
||||
// Set the access specifier.
|
||||
SetMemberAccessSpecifier(New, PrevDecl, AS);
|
||||
|
||||
if (TK == TK_Definition)
|
||||
New->startDefinition();
|
||||
|
|
|
@ -2529,3 +2529,43 @@ void Sema::SetDeclDeleted(DeclTy *dcl, SourceLocation DelLoc) {
|
|||
}
|
||||
Fn->setDeleted();
|
||||
}
|
||||
|
||||
static const char *getAccessName(AccessSpecifier AS) {
|
||||
switch (AS) {
|
||||
default:
|
||||
case AS_none:
|
||||
assert("Invalid access specifier!");
|
||||
return 0;
|
||||
case AS_public:
|
||||
return "public";
|
||||
case AS_private:
|
||||
return "private";
|
||||
case AS_protected:
|
||||
return "protected";
|
||||
}
|
||||
}
|
||||
|
||||
bool Sema::SetMemberAccessSpecifier(NamedDecl *MemberDecl,
|
||||
NamedDecl *PrevMemberDecl,
|
||||
AccessSpecifier LexicalAS) {
|
||||
if (!PrevMemberDecl) {
|
||||
// Use the lexical access specifier.
|
||||
MemberDecl->setAccess(LexicalAS);
|
||||
return false;
|
||||
}
|
||||
|
||||
// C++ [class.access.spec]p3: When a member is redeclared its access
|
||||
// specifier must be same as its initial declaration.
|
||||
if (LexicalAS != AS_none && LexicalAS != PrevMemberDecl->getAccess()) {
|
||||
Diag(MemberDecl->getLocation(),
|
||||
diag::err_class_redeclared_with_different_access)
|
||||
<< MemberDecl << getAccessName(LexicalAS);
|
||||
Diag(PrevMemberDecl->getLocation(), diag::note_previous_access_declaration)
|
||||
<< PrevMemberDecl << getAccessName(PrevMemberDecl->getAccess());
|
||||
return true;
|
||||
}
|
||||
|
||||
MemberDecl->setAccess(PrevMemberDecl->getAccess());
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче